X-Git-Url: http://j8takagi.net/cgi-bin/gitweb.cgi?p=YACASL2.git;a=blobdiff_plain;f=src%2Fcasl2rev.c;h=f81d6402a5570eb26158e769e90d0cf1bef71fe0;hp=c849ecbe4b0946f089e75c9e2af25716c67f4b17;hb=HEAD;hpb=b8b0bb2a7b5ef20cdbee5f555c5846dfc1c7f981 diff --git a/src/casl2rev.c b/src/casl2rev.c index c849ecb..f81d640 100644 --- a/src/casl2rev.c +++ b/src/casl2rev.c @@ -1,86 +1,9 @@ -#include -#include - -#define _GNU_SOURCE -#include -#include - -#include "exec.h" -#include "cmem.h" -#include "cerr.h" #include "package.h" - -char *grstr(WORD word) -{ - assert(word <= 7); - char *str = malloc_chk(3 + 1, "grstr.str"); - sprintf(str, "GR%d", word); - return str; -} - -bool disassemble(const char *file) -{ - bool stat = true; - FILE *fp; - WORD i = 0, w, cmd, r, x, r1, r2, adr; - CMDTYPE cmdtype = 0; - char *cmdname; - - assert(file != NULL); - if((fp = fopen(file, "rb")) == NULL) { - perror(file); - return false; - } - - create_code_cmdtype(); /* 命令のコードとタイプがキーのハッシュ表を作成 */ - - fprintf(stdout, "MAIN\tSTART\n"); - 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\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(cmdtype == R_ADR_X) { - r = (w & 0x00F0) >> 4; - fprintf(stdout, "%s,", grstr(r)); - } - fprintf(stdout, "#%04X", adr); - if((x = w & 0x000F) != 0) { - fprintf(stdout, ",%s", grstr(x)); - } - fprintf(stdout, "\t\t\t\t; #%04X: #%04X #%04X", i, w, adr); - i += 2; - } else { - fprintf(stdout, "\t%s", cmdname); - if(cmdtype == R1_R2) { - r1 = (w & 0x00F0) >> 4; - r2 = w & 0x000F; - fprintf(stdout, "\t%s,%s", grstr(r1), grstr(r2)); - } else if(cmdtype == R_) { - r = (w & 0x00F0) >> 4; - fprintf(stdout, "\t%s", grstr(r)); - } - fprintf(stdout, "\t\t\t\t; #%04X: #%04X", i++, w); - } - fprintf(stdout, "\n"); - } - fprintf(stdout, "\tEND\n"); - free_code_cmdtype(); - fclose(fp); - return stat; -} +#include "disassemble.h" +#include "load.h" /** - * disassembleコマンドのオプション + * @brief casl2revコマンドのオプション */ static struct option longopts[] = { {"version", no_argument, NULL, 'v' }, @@ -89,7 +12,7 @@ static struct option longopts[] = { }; /** - * @brief disassembleコマンドのメイン + * @brief casl2revコマンドのメイン * * @return 正常終了時は0、異常終了時は1 * @@ -98,36 +21,41 @@ static struct option longopts[] = { */ int main(int argc, char *argv[]) { - int opt, stat = 0; - const char *version = PACKAGE_VERSION, *cmdversion = "disassemble of YACASL2 version %s\n"; + int opt = 0; + int stat = 0; + const char *version = PACKAGE_VERSION; + const char *cmdversion = "disassemble of YACASL2 version %s\n"; const char *usage = "Usage: %s [-vh] FILE\n"; + /* エラーの定義 */ cerr_init(); addcerrlist_load(); - addcerrlist_exec(); /* オプションの処理 */ while((opt = getopt_long(argc, argv, "vh", longopts, NULL)) != -1) { switch(opt) { case 'v': fprintf(stdout, cmdversion, version); - return 0; + goto casl2revfin; case 'h': fprintf(stdout, usage, argv[0]); - return 0; + goto casl2revfin; case '?': fprintf(stderr, usage, argv[0]); - exit(1); + setcerr(212, ""); /* invalid option */ + goto casl2revfin; } } if(argv[optind] == NULL) { setcerr(211, ""); /* object file not specified */ fprintf(stderr, "disassemble error - %d: %s\n", cerr->num, cerr->msg); - exit(1); + goto casl2revfin; + } + disassemble_file(argv[optind]); /* プログラム実行 */ +casl2revfin: + if(cerr->num > 0) { + stat = 1; } - disassemble(argv[optind]); /* プログラム実行 */ - stat = (cerr->num == 0) ? 0 : 1; - /* エラーの解放 */ - freecerr(); + freecerr(); /* エラーの解放 */ return stat; }