annotate upddis.c @ 2717:04007ac9ee3b

Add upd78k2 disassembler
author Michael Pavone <pavone@retrodev.com>
date Wed, 16 Jul 2025 07:36:01 -0700
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2717
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1 #include <stdio.h>
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
2 #include <stdlib.h>
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
3 #include <string.h>
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
4 #include <stdarg.h>
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
5 #include "upd78k2_dis.h"
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
6 #include "util.h"
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
7
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
8 int headless;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
9 void render_errorbox(char *title, char *message) {}
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
10 void render_warnbox(char *title, char *message) {}
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
11 void render_infobox(char *title, char *message) {}
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
12
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
13 typedef struct {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
14 uint16_t address_off;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
15 uint16_t address_end;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
16 uint8_t *buffer;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
17 } rom_def;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
18
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
19 uint8_t fetch(uint16_t address, void *data)
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
20 {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
21 rom_def *rom = data;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
22 if (address >= rom->address_off && address < rom->address_end) {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
23 return rom->buffer[(address - rom->address_off)];
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
24 }
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
25 return 0;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
26 }
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
27
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
28 void print_label_def(char *key, tern_val val, uint8_t valtype, void *data)
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
29 {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
30 rom_def *rom = data;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
31 label_def *label = val.ptrval;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
32 uint32_t address = label->full_address & 0xFFFF;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
33 if (address >= rom->address_off && address < rom->address_end) {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
34 return;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
35 }
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
36 if (!label->referenced) {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
37 return;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
38 }
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
39 if (label->num_labels) {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
40 for (int i = 0; i < label->num_labels; i++)
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
41 {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
42 printf("%s equ 0%XH\n", label->labels[i], label->full_address);
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
43 }
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
44 } else {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
45 printf("ADR_%X equ 0%XH\n", label->full_address, label->full_address);
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
46 }
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
47 }
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
48
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
49 void format_data(disasm_context *context, rom_def *rom, uint8_t labels, uint16_t start_address, uint16_t end_address)
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
50 {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
51 char label_buf[256];
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
52 for (uint16_t address = start_address; address < end_address;)
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
53 {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
54 if (labels) {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
55 uint16_t end = address + 8;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
56 if (end > end_address) {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
57 end = end_address;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
58 }
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
59 uint16_t start = address;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
60 if (!(address & 1) && address < 0x80) {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
61 for (; address < end; address += 2) {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
62 uint16_t value = fetch(address, rom);
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
63 value |= fetch(address + 1, rom) << 8;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
64 format_label(label_buf, value, context);
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
65 if (address == start) {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
66 printf("\tdw %s", label_buf);
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
67 } else {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
68 printf(", %s", label_buf);
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
69 }
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
70 }
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
71 } else {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
72 if (address < 0x80) {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
73 end = address + 1;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
74 }
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
75 for (; address < end; address++) {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
76 uint8_t value = fetch(address, rom);
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
77 if (address == start) {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
78 printf("\tdb 0%02XH", value);
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
79 } else {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
80 printf(", 0%02XH", value);
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
81 }
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
82 }
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
83 }
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
84 address = end;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
85 puts("");
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
86 } else {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
87 uint8_t value = fetch(address, rom);
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
88 printf("%X: %X\n", address, value);
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
89 address++;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
90 }
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
91 }
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
92 }
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
93
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
94 int main(int argc, char ** argv)
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
95 {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
96 long filesize;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
97 uint8_t *filebuf = NULL;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
98 char disbuf[1024];
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
99
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
100 uint8_t labels = 0, addr = 0, only = 0, reset = 0;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
101 disasm_context *context = create_upd78k2_disasm();
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
102
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
103 uint32_t address_off = 0, address_end;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
104 for(uint8_t opt = 2; opt < argc; ++opt) {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
105 if (argv[opt][0] == '-') {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
106 FILE * address_log;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
107 switch (argv[opt][1])
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
108 {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
109 case 'l':
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
110 labels = 1;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
111 break;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
112 case 'a':
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
113 addr = 1;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
114 break;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
115 case 'o':
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
116 only = 1;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
117 break;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
118 case 'r':
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
119 reset = 1;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
120 break;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
121 case 's':
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
122 opt++;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
123 if (opt >= argc) {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
124 fputs("-s must be followed by an offset\n", stderr);
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
125 exit(1);
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
126 }
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
127 address_off = strtol(argv[opt], NULL, 0);
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
128 break;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
129 case 'f':
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
130 opt++;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
131 if (opt >= argc) {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
132 fputs("-f must be followed by a filename\n", stderr);
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
133 exit(1);
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
134 }
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
135 address_log = fopen(argv[opt], "r");
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
136 if (!address_log) {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
137 fprintf(stderr, "Failed to open %s for reading\n", argv[opt]);
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
138 exit(1);
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
139 }
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
140 while (fgets(disbuf, sizeof(disbuf), address_log)) {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
141 if (disbuf[0]) {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
142 char *end;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
143 uint32_t address = strtol(disbuf, &end, 16);
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
144 if (address) {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
145 defer_disasm(context, address);
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
146 if (*end == '=') {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
147 add_label(context, strip_ws(end+1), address);
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
148 } else {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
149 reference(context, address);
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
150 }
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
151 }
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
152 }
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
153 }
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
154 fclose(address_log);
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
155 }
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
156 } else {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
157 char *end;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
158 uint32_t address = strtol(argv[opt], &end, 16);
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
159 defer_disasm(context, address);
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
160 if (*end == '=') {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
161 add_label(context, end+1, address);
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
162 } else {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
163 reference(context, address);
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
164 }
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
165 }
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
166 }
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
167 if (labels) {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
168 add_upd7823x_labels(context);
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
169 }
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
170 FILE * f = fopen(argv[1], "rb");
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
171 fseek(f, 0, SEEK_END);
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
172 filesize = ftell(f);
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
173 fseek(f, 0, SEEK_SET);
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
174
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
175 char int_key[MAX_INT_KEY_SIZE];
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
176 uint8_t has_manual_defs = !!context->deferred;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
177 filebuf = malloc(filesize);
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
178 if (fread(filebuf, 1, filesize, f) != filesize)
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
179 {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
180 fprintf(stderr, "Failure while reading file %s\n", argv[1]);
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
181 }
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
182 address_end = address_off + filesize;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
183 if (address_end > 0xFB00) {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
184 //correct for uPD78237 and some other members of the uPD78K/II family
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
185 //but others allow external ROM up to higher addresses
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
186 address_end = 0xFB00;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
187 }
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
188 if (!address_off && filesize >= 0x40) {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
189 char *vector_names[] = {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
190 "reset",
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
191 "nmi",
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
192 NULL,
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
193 "intp0",
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
194 "intp1",
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
195 "intp2",
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
196 "intp3",
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
197 "intp4_intc30",
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
198 "intp5_intad",
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
199 "intc20_intp6",
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
200 "intc00",
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
201 "intc01",
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
202 "intc10",
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
203 "intc11",
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
204 "intc21",
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
205 NULL,
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
206 "intser",
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
207 "intsr",
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
208 "intst",
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
209 "intcsi",
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
210 [0x3E/2] = "brkex"
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
211 };
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
212 for (int i = 0; i < sizeof(vector_names)/sizeof(*vector_names); i++)
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
213 {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
214 if (vector_names[i]) {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
215 uint16_t address = filebuf[i * 2] | (filebuf[i * 2 + 1] << 8);
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
216 if (address < address_end) {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
217 defer_disasm(context, address);
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
218 add_label(context, vector_names[i], address);
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
219 }
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
220 }
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
221 }
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
222 }
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
223 rom_def rom = {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
224 .address_off = address_off,
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
225 .address_end = address_end,
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
226 .buffer = filebuf
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
227 };
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
228 uint16_t address, tmp_addr;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
229 uint8_t valid_address;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
230 while(context->deferred) {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
231 do {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
232 valid_address = 0;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
233 address = context->deferred->address;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
234 if (!is_visited(context, address)) {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
235 address &= context->address_mask;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
236 if (address < address_end && address >= address_off) {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
237 valid_address = 1;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
238 address = context->deferred->address;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
239 }
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
240 }
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
241 deferred_addr *tmpd = context->deferred;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
242 context->deferred = context->deferred->next;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
243 free(tmpd);
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
244 } while(context->deferred && !valid_address);
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
245 if (!valid_address) {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
246 break;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
247 }
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
248 for(;;) {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
249 if ((address & context->address_mask) > address_end || address < address_off) {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
250 break;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
251 }
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
252 visit(context, address);
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
253 upd_address_ref ref;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
254 address = upd78k2_disasm(disbuf, &ref, address, fetch, &rom, NULL);
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
255 if (!strcmp(disbuf, "invalid") || startswith(disbuf, "ret")) {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
256 break;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
257 }
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
258 switch(ref.ref_type)
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
259 {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
260 case UPD_REF_NONE:
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
261 if (startswith(disbuf, "br ")) {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
262 //unconditional branch to register
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
263 goto loop_end;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
264 }
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
265 break;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
266 case UPD_REF_OP:
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
267 reference(context, ref.address);
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
268 break;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
269 case UPD_REF_2OP:
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
270 reference(context, ref.address);
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
271 reference(context, ref.address2);
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
272 break;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
273 case UPD_REF_BRANCH:
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
274 reference(context, ref.address);
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
275 if (ref.address <= address) {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
276 defer_disasm(context, ref.address);
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
277 goto loop_end;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
278 } else {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
279 address = ref.address;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
280 }
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
281 break;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
282 case UPD_REF_COND_BRANCH:
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
283 case UPD_REF_CALL:
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
284 reference(context, ref.address);
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
285 defer_disasm(context, ref.address);
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
286 break;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
287 case UPD_REF_OP_BRANCH:
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
288 reference(context, ref.address);
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
289 reference(context, ref.address2);
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
290 defer_disasm(context, ref.address2);
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
291 break;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
292 case UPD_REF_CALL_TABLE:
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
293 reference(context, ref.address);
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
294 if (ref.address >= address_off && ref.address < address_end - 1) {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
295 uint16_t table_address = ref.address;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
296 ref.address = fetch(table_address, &rom);
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
297 ref.address |= fetch(table_address + 1, &rom) << 8;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
298 reference(context, ref.address);
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
299 defer_disasm(context, ref.address);
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
300 }
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
301 break;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
302 }
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
303 }
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
304 loop_end:
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
305 }
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
306 if (labels) {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
307 tern_foreach(context->labels, print_label_def, &rom);
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
308 puts("");
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
309 }
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
310 uint16_t data_start = 0xFFFF;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
311 for (address = address_off; address < address_end;) {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
312 if (labels) {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
313 label_def *label = find_label(context, address);
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
314 if (label) {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
315 if (data_start < address) {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
316 format_data(context, &rom, labels, data_start, address);
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
317 data_start = 0xFFFF;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
318 }
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
319 if (label->num_labels) {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
320 for (int i = 0; i < label->num_labels; i++)
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
321 {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
322 printf("%s:\n", label->labels[i]);
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
323 }
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
324 } else {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
325 printf("ADR_%X:\n", label->full_address);
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
326 }
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
327 }
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
328 }
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
329 if (is_visited(context, address)) {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
330 if (data_start < address) {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
331 format_data(context, &rom, labels, data_start, address);
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
332 data_start = 0xFFFF;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
333 }
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
334 uint16_t next = upd78k2_disasm(disbuf, NULL, address, fetch, &rom, labels ? context : NULL);
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
335 if (labels) {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
336 if (addr) {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
337 printf("\t%s\t;%X\n", disbuf, address);
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
338 } else {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
339 printf("\t%s\n", disbuf);
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
340 }
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
341 } else {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
342 printf("%X: %s\n", address, disbuf);
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
343 }
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
344 address = next;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
345 } else {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
346 if (data_start > address) {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
347 data_start = address;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
348 }
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
349 address++;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
350 }
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
351 }
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
352 if (data_start < address) {
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
353 format_data(context, &rom, labels, data_start, address);
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
354 }
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
355 return 0;
04007ac9ee3b Add upd78k2 disassembler
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
356 }