comparison zdis.c @ 2209:92dc3e24f309

Fix a couple of Z80 disassembler issues
author Michael Pavone <pavone@retrodev.com>
date Sat, 27 Aug 2022 22:02:32 -0700
parents 137dbd05ceab
children
comparison
equal deleted inserted replaced
2208:3809a0bd680e 2209:92dc3e24f309
1 /* 1 /*
2 Copyright 2013 Michael Pavone 2 Copyright 2013 Michael Pavone
3 This file is part of BlastEm. 3 This file is part of BlastEm.
4 BlastEm is free software distributed under the terms of the GNU General Public License version 3 or greater. See COPYING for full license text. 4 BlastEm is free software distributed under the terms of the GNU General Public License version 3 or greater. See COPYING for full license text.
5 */ 5 */
6 #include "z80inst.h" 6 #include "z80inst.h"
7 #include <stdio.h> 7 #include <stdio.h>
8 #include <stdlib.h> 8 #include <stdlib.h>
133 uint8_t *encoded, *next; 133 uint8_t *encoded, *next;
134 uint32_t size; 134 uint32_t size;
135 if (!def || !only) { 135 if (!def || !only) {
136 def = defer(start, def); 136 def = defer(start, def);
137 } 137 }
138 uint16_t address; 138 uint32_t address;
139 while(def) { 139 while(def) {
140 do { 140 do {
141 encoded = NULL; 141 encoded = NULL;
142 address = def->address; 142 address = def->address;
143 if (!is_visited(address)) { 143 if (!is_visited(address)) {
156 } 156 }
157 visit(address); 157 visit(address);
158 next = z80_decode(encoded, &instbuf); 158 next = z80_decode(encoded, &instbuf);
159 address += (next-encoded); 159 address += (next-encoded);
160 encoded = next; 160 encoded = next;
161 161
162 //z80_disasm(&instbuf, disbuf); 162 //z80_disasm(&instbuf, disbuf);
163 //printf("%X: %s\n", address, disbuf); 163 //printf("%X: %s\n", address, disbuf);
164 switch (instbuf.op) 164 switch (instbuf.op)
165 { 165 {
166 case Z80_JR: 166 case Z80_JR:
171 reference(address + instbuf.immed); 171 reference(address + instbuf.immed);
172 def = defer(address + instbuf.immed, def); 172 def = defer(address + instbuf.immed, def);
173 break; 173 break;
174 case Z80_JP: 174 case Z80_JP:
175 address = instbuf.immed; 175 address = instbuf.immed;
176 reference(address);
176 encoded = filebuf + address - offset; 177 encoded = filebuf + address - offset;
177 break; 178 break;
178 case Z80_JPCC: 179 case Z80_JPCC:
179 case Z80_CALL: 180 case Z80_CALL:
180 case Z80_CALLCC: 181 case Z80_CALLCC:
195 printf("ADR_%X equ $%X\n", address, address); 196 printf("ADR_%X equ $%X\n", address, address);
196 } 197 }
197 } 198 }
198 puts(""); 199 puts("");
199 } 200 }
200 for (address = offset; address < filesize + offset; address++) { 201 uint32_t end = filesize + offset;
202 if (end > 0xFFFF) {
203 end = 0x10000;
204 }
205 for (address = offset; address < end; address++) {
201 if (is_visited(address)) { 206 if (is_visited(address)) {
202 encoded = filebuf + address - offset; 207 encoded = filebuf + address - offset;
203 z80_decode(encoded, &instbuf); 208 z80_decode(encoded, &instbuf);
204 if (labels) { 209 if (labels) {
205 /*m68k_disasm_labels(&instbuf, disbuf); 210 z80_disasm(&instbuf, disbuf, address);
206 if (is_label(instbuf.address)) { 211 if (is_label(address)) {
207 printf("ADR_%X:\n", instbuf.address); 212 printf("ADR_%X:\n", address);
208 } 213 }
209 if (addr) { 214 if (addr) {
210 printf("\t%s\t;%X\n", disbuf, instbuf.address); 215 printf("\t%s\t;%X\n", disbuf, address);
211 } else { 216 } else {
212 printf("\t%s\n", disbuf); 217 printf("\t%s\n", disbuf);
213 }*/ 218 }
214 } else { 219 } else {
215 z80_disasm(&instbuf, disbuf, address); 220 z80_disasm(&instbuf, disbuf, address);
216 printf("%X: %s\n", address, disbuf); 221 printf("%X: %s\n", address, disbuf);
217 } 222 }
218 } 223 }