+ cnt += fprintf(stdout, " %-7s ", cmdname);
+ if(cmdtype == R_ADR_X) {
+ cnt += fprintf(stdout, "%s,", g = grstr((word & 0x00F0) >> 4));
+ FREE(g);
+ }
+ cnt += fprintf(stdout, "#%04X", adr);
+ if((x = (word & 0x000F)) != 0) {
+ cnt += fprintf(stdout, ",%s", g = grstr(x));
+ FREE(g);
+ }
+ disassemble_puts_code(cnt, pradr, 2, (WORD []){word, adr});
+}
+
+void disassemble_cmd_r(CMDTYPE cmdtype, const char *cmdname, WORD word, WORD pradr)
+{
+ char *g = NULL;
+ char *g1 = NULL;
+ char *g2 = NULL;
+ int cnt = 0;
+
+ cnt += fprintf(stdout, " %-7s ", cmdname);
+ if(cmdtype == R1_R2) {
+ g1 = grstr((word & 0x00F0) >> 4);
+ g2 = grstr(word & 0x000F);
+ cnt += fprintf(stdout, "%s,%s", g1, g2);
+ FREE(g1);
+ FREE(g2);
+ } else if(cmdtype == R_) {
+ g = grstr((word & 0x00F0) >> 4);
+ cnt += fprintf(stdout, "%s", g);
+ FREE(g);
+ }
+ disassemble_puts_code(cnt, pradr, 1, (WORD []){word});
+}
+
+void disassemble_dc(WORD word, WORD pradr)
+{
+ int cnt = 0;
+
+ cnt = fprintf(stdout, " DC %-5d ", word);
+ disassemble_puts_code(cnt, pradr, 1, (WORD []){word});
+ fprintf(stdout, " ::" );
+ print_dumpword(word, true);
+}
+
+void disassemble_ds(WORD wcnt, WORD pradr)
+{
+ int cnt = 0;
+
+ cnt = fprintf(stdout, " DS %-5d ", wcnt);
+ disassemble_puts_code(cnt, pradr, 1, (WORD []){0});
+ for(int i = 0; i < wcnt - 1; i++) {
+ fprintf(stdout, "\n");
+ disassemble_puts_code(0, pradr+1, 1, (WORD []){0});
+ }
+}
+
+WORD fgetword(FILE *stream)
+{
+ WORD aword;
+ fread(&aword, sizeof(WORD), 1, stream);
+ return aword;
+}
+
+void fungetword(FILE *stream)
+{
+ fseek(stream, -sizeof(WORD), SEEK_CUR);
+}
+
+WORD zero_data_cnt(FILE *stream)
+{
+ WORD cnt = 0;
+ WORD word = 0;
+
+ while(!feof(stream) && word == 0) {
+ word = fgetword(stream);
+ cnt++;
+ }
+ if(!feof(stream)) {
+ fungetword(stream);
+ }
+ return cnt;
+}
+
+bool disassemble_file(const char *file)