/* objectcode.c */ /********************************************* * Object code manager implementation * * Author: Douglas W. Jones, Sept. 13, 2000 * * Revised: Douglas W. Jones, June 26, 2003 * * Revised: Douglas W. Jones, July 12, 2003 * \*MP3*\ *********************************************/ #include #include "boolean.h" #define EXTERN #include "objectcode.h" /********************************************* * Private data structures * *********************************************/ /* the record of object code on one line */ static OBJECT_VALUE location; /* where does the code go in memory */ static BOOLEAN locdef; /* is the location defined */ static OBJECT_VALUE value; /* what value goes in memory */ static int valuesize; /* how many bytes is it */ static FILE * obj; /* the object file */ /*MP3*/ static int objloc; /* current location in object file */ /*MP3*/ /********************************************* \*MP3*\ * Private functions * \*MP3*\ *********************************************/ /*MP3*/ static void putobj16( int v ) /*MP3*/ /* put v to the object file obj as two bytes, high byte first */ /*MP3*/ { /*MP3*/ fputc( (v >> 8) & 0xFF, obj ); /*MP3*/ fputc( v & 0xFF, obj ); /*MP3*/ } /*MP3*/ static void putobj( int loc, int val, int size ) /*MP3*/ /* put val at loc of given size in object file */ /*MP3*/ { /*MP3*/ /* first get location right if it isn't */ /*MP3*/ if (loc != objloc) { /*MP3*/ fputc( 1, obj ); /* tag */ /*MP3*/ putobj16( loc ); /*MP3*/ objloc = loc; /*MP3*/ } /*MP3*/ /*MP3*/ /* second, put out data */ /*MP3*/ if (size == 1) { /*MP3*/ fputc( 2, obj ); /* tag */ /*MP3*/ fputc( val & 0xFF, obj ); /*MP3*/ } else if (size == 2) { /*MP3*/ fputc( 3, obj ); /* tag */ /*MP3*/ putobj16( val ); /*MP3*/ } /*MP3*/ /*MP3*/ /* third, update location */ /*MP3*/ objloc = objloc + size; /*MP3*/ } /*MP3*/ /********************************************* * Interface implementation * *********************************************/ void object_init( FILE * f ) /*MP3*/ /* initializer */ { /* no bytes are stored nowhere */ locdef = FALSE; valuesize = 0; /*MP3*/ /* remember name of object file */ /*MP3*/ obj = f; /*MP3*/ /* set an invalid location in object file */ /*MP3*/ objloc = -1; /* this forces a location counter reset */ /*MP3*/ } void object_put( FILE * s ) /* list the object code given: s, the listing stream */ { if (locdef) { if (location.defined) { fprintf( s, "%4.4X: ", location.value ); } else { fputs( "????: ", s ); } } else { fputs( " ", s ); } if (valuesize == 2) { if (value.defined) { fprintf( s, "%4.4X ", value.value & 0xFFFF ); } else { fputs( "???? ", s ); } } else if (valuesize == 1) { if (value.defined) { fprintf( s, "%2.2X ", value.value & 0xFF ); } else { fputs( "?? ", s ); } } else { fputs( " ", s ); } locdef = FALSE; valuesize = 0; } void object_word( OBJECT_VALUE l, OBJECT_VALUE v ) /* store a word in memory given: l, the location v, the value */ { locdef = TRUE; location = l; valuesize = 2; value = v; if (obj != NULL) putobj( l.value, v.value, 2 ); /*MP3*/ } void object_byte( OBJECT_VALUE l, OBJECT_VALUE v ) /* store a byte in memory given: l, the location v, the value */ { locdef = TRUE; location = l; valuesize = 1; value = v; if (obj != NULL) putobj( l.value, v.value, 1 ); /*MP3*/ }