Mercurial > repos > blastem
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 } |