/**** This is the Mic-1 linker ****/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define HEADERS 1
#define NO_HEADERS 0
typedef struct nament{
char name[ 26 ] ;
int addr;
struct nament * next;
} SYMTABENTRY;
void add_symbol( char * symbol, int line_number) ;
void generate_code( int ) ;
void print_first_pass( int ) ;
void append_table( void ) ;
void dump_table( void ) ;
SYMTABENTRY * symtab = NULL;
FILE * p1, * p2;
char cstr_12[ 13 ] ;
int main( int argc, char * argv[ ] )
{
int i, start, pc_offset= 0 , pc= 0 ;
int linum= 0 , object_file= 0 , dump_tab= 0 ;
int line_number, new_pc;
char instruction[ 18 ] ;
char symbol[ 26 ] ;
/***
for(i=0; i<argc; i++){
printf("arg %d is %s\n", i, argv[i]);
}
***/
if ( argc
> 1 && ( strcmp ( argv
[ 1 ] , "-s" ) == 0 ) ) dump_tab
= linum
= 1 ; else if ( argc
> 1 && ( strcmp ( argv
[ 1 ] , "-o" ) == 0 ) ) object_file
= 1 ;
if ( dump_tab == 1 | object_file == 1 ) start= 2 ;
else start = 1 ;
p1
= fopen ( "/tmp/passone" , "w+" ) ; unlink( "/tmp/passone" ) ;
for ( i= start; i< argc; ++ i) {
if ( ( p2
= fopen ( argv
[ i
] , "r" ) ) == NULL
) { printf ( "ERROR: cannot open file %s\n " , argv
[ i
] ) ; }
while ( fscanf ( p2
, "%d %s" , & pc
, instruction
) != EOF
) { if ( pc == 4096 ) break ;
new_pc = pc + pc_offset;
symbol[ 0 ] = '\0 ' ;
if ( instruction[ 0 ] == 'U' ) {
}
fprintf ( p1
, " %d %s %s\n " , new_pc
, instruction
, symbol
) ; }
while ( fscanf ( p2
, "%s %d" , symbol
, & line_number
) != EOF
) { add_symbol( symbol, line_number+ pc_offset) ;
}
pc_offset = new_pc + 1 ;
}
LyoqKiogVGhpcyBpcyB0aGUgTWljLTEgbGlua2VyICoqKiovCgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CgojZGVmaW5lIEhFQURFUlMgICAgICAgICAxCiNkZWZpbmUgTk9fSEVBREVSUyAgICAgIDAKCnR5cGVkZWYgc3RydWN0IG5hbWVudHsKICAgICAgICBjaGFyICAgbmFtZVsyNl07CiAgICAgICAgaW50ICAgIGFkZHI7CiAgICAgICAgc3RydWN0IG5hbWVudCAqbmV4dDsKfVNZTVRBQkVOVFJZOwoKCnZvaWQgIGFkZF9zeW1ib2woY2hhciAqIHN5bWJvbCwgaW50IGxpbmVfbnVtYmVyKTsKdm9pZCAgZ2VuZXJhdGVfY29kZShpbnQpOwp2b2lkICBwcmludF9maXJzdF9wYXNzKGludCk7CnZvaWQgIGFwcGVuZF90YWJsZSh2b2lkKTsKdm9pZCAgZHVtcF90YWJsZSh2b2lkKTsKCgpTWU1UQUJFTlRSWSAqc3ltdGFiID0gTlVMTDsKRklMRSAgKnAxLCAqcDI7CmNoYXIgIGNzdHJfMTJbMTNdOwoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKewoJaW50ICBpLCBzdGFydCwgcGNfb2Zmc2V0PTAsIHBjPTA7CglpbnQgIGxpbnVtPTAsIG9iamVjdF9maWxlPTAsIGR1bXBfdGFiPTA7CiAgICAgICAgaW50ICBsaW5lX251bWJlciwgbmV3X3BjOwoJY2hhciBpbnN0cnVjdGlvblsxOF07CgljaGFyIHN5bWJvbFsyNl07CgovKioqCglmb3IoaT0wOyBpPGFyZ2M7IGkrKyl7CgkgIHByaW50ZigiYXJnICVkIGlzICVzXG4iLCBpLCBhcmd2W2ldKTsKCX0KKioqLwoKICAgICAgICBpZihhcmdjID4gMSAmJiAoc3RyY21wKGFyZ3ZbMV0sICItcyIpID09IDApKSBkdW1wX3RhYiA9IGxpbnVtID0gMTsKICAgICAgICBlbHNlIGlmKGFyZ2MgPiAxICYmIChzdHJjbXAoYXJndlsxXSwgIi1vIikgPT0gMCkpIG9iamVjdF9maWxlID0gMTsKCglpZihkdW1wX3RhYiA9PSAxIHwgb2JqZWN0X2ZpbGUgPT0gMSlzdGFydD0yOwoJZWxzZSBzdGFydCA9IDE7IAoKCXAxID0gZm9wZW4oIi90bXAvcGFzc29uZSIsICJ3KyIpOwogICAgICAgIHVubGluaygiL3RtcC9wYXNzb25lIik7CgoJZm9yKGk9c3RhcnQ7IGk8YXJnYzsgKytpKXsKCQlpZigocDIgPSBmb3Blbihhcmd2W2ldLCAiciIpKSA9PSBOVUxMKXsKCQkgIHByaW50ZigiRVJST1I6IGNhbm5vdCBvcGVuIGZpbGUgJXNcbiIsIGFyZ3ZbaV0pOwoJCSAgZXhpdCg2KTsKCQl9CgkJd2hpbGUoZnNjYW5mKHAyLCIlZCAlcyIsICZwYywgaW5zdHJ1Y3Rpb24pICE9IEVPRil7CgkJICBpZihwYyA9PSA0MDk2KWJyZWFrOwoJCSAgbmV3X3BjID0gcGMgKyBwY19vZmZzZXQ7CgkJICBzeW1ib2xbMF0gPSAnXDAnOwoJCSAgaWYoaW5zdHJ1Y3Rpb25bMF0gPT0gJ1UnKXsKICAgICAgICAgICAgCSAgICBmc2NhbmYocDIsICIlcyIsIHN5bWJvbCk7CgkJICB9CgkJICBmcHJpbnRmKHAxLCAiICAlZCAgJXMgICVzXG4iLCBuZXdfcGMsIGluc3RydWN0aW9uLCBzeW1ib2wpOwoJCX0KCQl3aGlsZShmc2NhbmYocDIsIiVzICVkIixzeW1ib2wsICZsaW5lX251bWJlcikgIT0gRU9GKXsKCQkgIGFkZF9zeW1ib2woc3ltYm9sLCBsaW5lX251bWJlcitwY19vZmZzZXQpOwoJCX0KCQlwY19vZmZzZXQgPSBuZXdfcGMgKyAxOwoJCWZjbG9zZShwMik7Cgl9Cg==