87int ge_disasm_one(
const uint8_t *mem, uint16_t addr,
char *out,
size_t outn)
89 uint8_t
op = mem[addr];
94 uint8_t c2 = mem[(uint16_t)(addr + 1)];
95 const char *mn = NULL;
110 snprintf(out, outn,
"DB 0x%02X",
op);
113 snprintf(out, outn,
"%s", mn);
119 uint8_t aux = mem[(uint16_t)(addr + 1)];
120 uint16_t field = (uint16_t)((mem[(uint16_t)(addr + 2)] << 8) |
121 mem[(uint16_t)(addr + 3)]);
127 if (!mn) { snprintf(out, outn,
"DB 0x%02X",
op);
return 1; }
129 snprintf(out, outn,
"%s %s", mn, a1);
134 if (!m) { snprintf(out, outn,
"DB 0x%02X",
op);
return 1; }
139 snprintf(out, outn,
"%s %s", m->
name, a1);
142 snprintf(out, outn,
"%s 0x%02X, %s", m->
name, aux & 0xF0, a1);
146 snprintf(out, outn,
"%s %d, %s", m->
name, (aux >> 4) & 7, a1);
150 snprintf(out, outn,
"%s 0x%02X, %s", m->
name, aux, a1);
153 snprintf(out, outn,
"DB 0x%02X",
op);
161 if (!m) { snprintf(out, outn,
"DB 0x%02X",
op);
return 1; }
162 uint8_t ll = mem[(uint16_t)(addr + 1)];
163 uint16_t A1 = (uint16_t)((mem[(uint16_t)(addr + 2)] << 8) |
164 mem[(uint16_t)(addr + 3)]);
165 uint16_t A2 = (uint16_t)((mem[(uint16_t)(addr + 4)] << 8) |
166 mem[(uint16_t)(addr + 5)]);
170 snprintf(out, outn,
"%s %d, %s, %s", m->
name, ll + 1, a1, a2);
172 snprintf(out, outn,
"%s %d, %d, %s, %s", m->
name,
173 ((ll >> 4) & 0xf) + 1, (ll & 0xf) + 1, a1, a2);
179 int before,
int after,
char *out,
size_t outn)
187 for (
int lb = 1; lb <= 16; lb++) {
188 long s = (long)pc - lb;
194 a += (l > 0) ? l : 1;
204 while (a <= (
long)pc + 48 && n < (
int)(
sizeof addrs /
sizeof addrs[0])) {
205 addrs[n++] = (uint16_t)a;
207 a += (l > 0) ? l : 1;
211 for (
int i = 0; i < n; i++)
212 if (addrs[i] == pc) { cur = i;
break; }
213 if (cur < 0) { addrs[0] = pc; cur = 0; n = 1; }
215 int lo = cur - before;
if (lo < 0) lo = 0;
216 int hi = cur + after;
if (hi > n - 1) hi = n - 1;
220 for (
int i = lo; i <= hi; i++) {
221 uint16_t ad = addrs[i];
227 for (
int k = 0; k < l && hp < (int)
sizeof(hex) - 3; k++)
228 hp += snprintf(hex + hp,
sizeof(hex) - (size_t)hp,
"%02X ",
229 mem[(uint16_t)(ad + k)]);
231 int wrote = snprintf(out + used, outn - used,
"%c%04X: %-14s %s\n",
232 (i == cur) ?
'>' :
' ', ad, hex, text);
233 if (wrote < 0 || (
size_t)wrote >= outn - used)
235 used += (size_t)wrote;
int ge_disasm_window(const uint8_t *mem, uint16_t pc, int before, int after, char *out, size_t outn)