X-Git-Url: http://j8takagi.net/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdisassemble.c;h=8107d4594b47c90fe8900e59a98c36c11791de86;hb=e21c536987c4bfbff61ea627e2bc27c46910ec53;hp=7aef8bd6ded3405afb864fb05e4b071362ff8638;hpb=4d98d132e119aa98dd7abcb76b6a96ae4723f274;p=YACASL2.git diff --git a/src/disassemble.c b/src/disassemble.c index 7aef8bd..8107d45 100644 --- a/src/disassemble.c +++ b/src/disassemble.c @@ -11,20 +11,18 @@ char *grstr(WORD word) { - char *str; - str = (char *)malloc(4); + char *str = malloc_chk(3 + 1, "grstr.str"); sprintf(str, "GR%d", word); return str; } bool disassemble(const char *file) { - FILE *fp; bool stat = true; - int i = 0; - WORD w, cmd, r, x, r1, r2, adr; - CMDTYPE type = 0; - char *cmdname; + FILE *fp; + WORD i = 0, w, cmd, r, x, r1, r2, adr; + CMDTYPE cmdtype = 0; + char *cmdname, *g1, *g2; assert(file != NULL); if((fp = fopen(file, "rb")) == NULL) { @@ -35,41 +33,52 @@ bool disassemble(const char *file) create_code_cmdtype(); /* 命令のコードとタイプがキーのハッシュ表を作成 */ fprintf(stdout, "MAIN\tSTART\n"); - for( ; !feof(fp); ) { + for(; ;) { fread(&w, sizeof(WORD), 1, fp); + if(feof(fp)) { + break; + } cmd = w & 0xFF00; cmdname = getcmdname(cmd); + cmdtype = getcmdtype(cmd); if(cmd == 0xFF00 || (w != 0 && cmd == 0x0000)) { - fprintf(stdout, "\tDC\t%d\t\t; #%04X", w, i++); - } else if((type = getcmdtype(cmd)) == R_ADR_X || type == ADR_X) { + fprintf(stdout, "\tDC\t%d\t\t\t\t; #%04X: #%04X :: ", w, i++, w); + print_dumpword(w, true); + } else if(cmdtype == R_ADR_X || cmdtype == ADR_X) { fread(&adr, sizeof(WORD), 1, fp); fprintf(stdout, "\t%s\t", cmdname); - if(type == R_ADR_X) { - r = (w & 0x00F0) >> 4; - fprintf(stdout, "%s,", grstr(r)); + if(cmdtype == R_ADR_X) { + r = (w & 0x00F0) >> 4; + fprintf(stdout, "%s,", (g1 = grstr(r))); + FREE(g1); } fprintf(stdout, "#%04X", adr); - if((x = w & 0x000F) != 0) { - fprintf(stdout, ",%s", grstr(x)); + if((x = w & 0x000F) != 0) { + fprintf(stdout, ",%s", (g1 = grstr(x))); + FREE(g1); } - fprintf(stdout, "\t\t; #%04X", i); + fprintf(stdout, "\t\t\t\t; #%04X: #%04X #%04X", i, w, adr); i += 2; } else { fprintf(stdout, "\t%s", cmdname); - if(type == R1_R2) { - r1 = (w & 0x00F0) >> 4; - r2 = w & 0x000F; - fprintf(stdout, "\t%s,%s", grstr(r1), grstr(r2)); - } else if(type == R_) { + if(cmdtype == R1_R2) { + r1 = (w & 0x00F0) >> 4; + r2 = w & 0x000F; + fprintf(stdout, "\t%s,%s", (g1=grstr(r1)), (g2=grstr(r2))); + FREE(g1); + FREE(g2); + } else if(cmdtype == R_) { r = (w & 0x00F0) >> 4; - fprintf(stdout, "\t%s", grstr(r)); + fprintf(stdout, "\t%s", (g1 = grstr(r))); + FREE(g1); } - fprintf(stdout, "\t\t; #%04X", i++); + fprintf(stdout, "\t\t\t\t; #%04X: #%04X", i++, w); } fprintf(stdout, "\n"); } fprintf(stdout, "\tEND\n"); free_code_cmdtype(); + fclose(fp); return stat; }