1 #include "disassemble.h"
9 * @brief 機械コードをコメントとして標準出力へ出力する
13 * @param ascol アセンブラの列位置
14 * @param pradr 次に実行すべき命令語の先頭アドレス
16 * @param wordv ワード値の配列
18 void disassemble_puts_code(int ascol, WORD pradr, int wordc, WORD wordv[]);
21 * @brief 種類がR_ADRまたはR_ADR_Xのコマンドを逆アセンブルし、標準出力へ出力する
25 * @param cmdtype コマンドの種類
26 * @param *cmdname コマンドの名前
29 * @param pradr 次に実行すべき命令語の先頭アドレス
31 void disassemble_cmd_adr_x(CMDTYPE cmdtype, const char *cmdname, WORD word, WORD adr, WORD pradr);
34 * @brief 種類がR1_R2またはR_のコマンドを逆アセンブルし、標準出力へ出力する
38 * @param cmdtype コマンドの種類
39 * @param *cmdname コマンドの名前
41 * @param pradr 次に実行すべき命令語の先頭アドレス
43 void disassemble_cmd_r(CMDTYPE cmdtype, const char *cmdname, WORD word, WORD pradr);
46 * @brief DCコマンドを逆アセンブルし、標準出力へ出力する
50 * @param cmdtype コマンドの種類
51 * @param *cmdname コマンドの名前
54 * @param pradr 次に実行すべき命令語の先頭アドレス
56 void disassemble_dc(WORD word, WORD pradr);
58 void disassemble_puts_code(int ascol, WORD pradr, int wordc, WORD wordv[])
61 for(i = 0; i < codecol-ascol; i++){
65 fprintf(stdout, "; #%04X: #%04X", pradr, wordv[0]);
66 } else if(wordc == 2) {
67 fprintf(stdout, "; #%04X: #%04X #%04X", pradr, wordv[0], wordv[1]);
70 void disassemble_cmd_adr_x(CMDTYPE cmdtype, const char *cmdname, WORD word, WORD adr, WORD pradr)
75 cnt += fprintf(stdout, " %-7s ", cmdname);
76 if(cmdtype == R_ADR_X) {
77 cnt += fprintf(stdout, "%s,", g = grstr((word & 0x00F0) >> 4));
80 cnt += fprintf(stdout, "#%04X", adr);
81 if((x = (word & 0x000F)) != 0) {
82 cnt += fprintf(stdout, ",%s", g = grstr(x));
85 disassemble_puts_code(cnt, pradr, 2, (WORD []){word, adr});
88 void disassemble_cmd_r(CMDTYPE cmdtype, const char *cmdname, WORD word, WORD pradr)
92 cnt += fprintf(stdout, " %-7s ", cmdname);
93 if(cmdtype == R1_R2) {
94 g1 = grstr((word & 0x00F0) >> 4);
95 g2 = grstr(word & 0x000F);
96 cnt += fprintf(stdout, "%s,%s", g1, g2);
99 } else if(cmdtype == R_) {
100 g = grstr((word & 0x00F0) >> 4);
101 cnt += fprintf(stdout, "%s", g);
104 disassemble_puts_code(cnt, pradr, 1, (WORD []){word});
107 void disassemble_dc(WORD word, WORD pradr)
110 cnt = fprintf(stdout, " DC %-5d ", word);
111 disassemble_puts_code(cnt, pradr, 1, (WORD []){word});
112 fprintf(stdout, " ::" );
113 print_dumpword(word, true);
116 void disassemble_ds(WORD wcnt, WORD pradr)
119 cnt = fprintf(stdout, " DS %-5d ", wcnt);
120 disassemble_puts_code(cnt, pradr, 1, (WORD []){0});
121 for(i = 0; i < wcnt - 1; i++) {
122 fprintf(stdout, "\n");
123 disassemble_puts_code(0, pradr+1, 1, (WORD []){0});
127 bool disassemble_file(const char *file)
131 WORD i = 0, w, cmd, adr, dsarea;
136 assert(file != NULL);
137 if((fp = fopen(file, "rb")) == NULL) {
142 create_code_cmdtype(); /* 命令のコードとタイプがキーのハッシュ表を作成 */
144 fprintf(stdout, "MAIN START\n");
145 for(fread(&w, sizeof(WORD), 1, fp); !feof(fp); i++, fread(&w, sizeof(WORD), 1, fp)) {
147 cmdname = getcmdname(cmd);
148 cmdtype = getcmdtype(cmd);
151 disassemble_cmd_r(NONE, "nop", 0, i);
155 fread(&w, sizeof(WORD), 1, fp);
157 } while(w == 0 && !feof(fp));
159 fseek(fp, -1 * sizeof(WORD) , SEEK_CUR);
162 disassemble_dc(0, i);
164 disassemble_ds(dsarea, i);
168 } else if(cmd == 0) {
169 disassemble_dc(w, i);
171 if(cmdtype == R_ADR_X || cmdtype == ADR_X) {
172 fread(&adr, sizeof(WORD), 1, fp);
173 disassemble_cmd_adr_x(cmdtype, cmdname, w, adr, i++);
175 disassemble_cmd_r(cmdtype, cmdname, w, i);
177 inst = (cmd != 0x8100) ? true : false;
179 fprintf(stdout, "\n");
181 fprintf(stdout, " END\n");
187 void disassemble_memory(WORD start, WORD end)
194 for(i = start; i <= end; i++) {
197 cmdname = getcmdname(cmd);
198 cmdtype = getcmdtype(cmd);
201 disassemble_cmd_r(NONE, "nop", 0, i);
203 disassemble_dc(0, i);
205 } else if(cmd == 0) {
206 disassemble_dc(w, i);
208 if(cmdtype == R_ADR_X || cmdtype == ADR_X) {
209 adr = sys->memory[i+1];
210 disassemble_cmd_adr_x(cmdtype, cmdname, w, adr, i++);
212 disassemble_cmd_r(cmdtype, cmdname, w, i);
214 inst = (cmd != 0x8100) ? true : false;
216 fprintf(stdout, "\n");