#include #include #include typedef uint64_t u64; typedef uint32_t u32; typedef uint16_t u16; typedef struct CONS CONS; struct CONS { u64 imem[4*1024]; // 40000 u16 dmem[1024]; // 50000 u32 pdlbuf[1024]; // 52000 // map 1st level 54000 // map 2st level 60000 u32 amem[256]; // 62000 u32 spc[32]; // 62400 u32 mmem[32]; // 62440 }; CONS cons; void uload(CONS *c, FILE *f) { char line[128]; int addr, dat[3]; u64 d; int sect; sect = 0; while(fgets(line, sizeof(line), f)){ if(sscanf(line, "%o\n", &addr) < 1) continue; if(addr < 0) sect = -addr; else switch(sect){ case 0: sscanf(line, "%o %o %o %o\n", &addr, &dat[0], &dat[1], &dat[2]); d = (u64)dat[0]<<32 | (u64)dat[1]<<16 | (u64)dat[2]; // printf("%o %o %o %o\n", addr, dat[0], dat[1], dat[2]); if(addr >= 040000 && addr < 050000) c->imem[addr-040000] = d; if(addr >= 050000 && addr < 052000) c->dmem[addr-050000] = d; if(addr >= 062000 && addr < 062400) c->amem[addr-062000] = d; if(addr >= 062440 && addr < 062500) c->mmem[addr-062440] = d; break; case 3: // dunno break; case 2: // symtab break; case 1: // end return; } } } void dumphex(CONS *c) { FILE *f; int i; f = fopen("imem.hex", "w"); assert(f); for(i = 0; i < 4*1024; i++) fprintf(f, "%llX\n", c->imem[i]); fclose(f); f = fopen("dmem.hex", "w"); assert(f); for(i = 0; i < 1024; i++) fprintf(f, "%X\n", c->dmem[i]); fclose(f); f = fopen("amem.hex", "w"); assert(f); for(i = 0; i < 256; i++) fprintf(f, "%X\n", c->amem[i]); fclose(f); f = fopen("mmem.hex", "w"); assert(f); for(i = 0; i < 32; i++) fprintf(f, "%X\n", c->mmem[i]); fclose(f); } int main() { uload(&cons, stdin); dumphex(&cons); return 0; }