Mercurial > repos > blastem
comparison blastem.c @ 392:1b80b90399da
Z80 debugger improvements
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Sun, 09 Jun 2013 02:03:26 -0700 |
parents | 1c8d74f2ab0b |
children | 0b5f93358a93 |
comparison
equal
deleted
inserted
replaced
391:3f4f2b7318a1 | 392:1b80b90399da |
---|---|
1130 value = context->regs[Z80_B] << 8; | 1130 value = context->regs[Z80_B] << 8; |
1131 value |= context->regs[Z80_C]; | 1131 value |= context->regs[Z80_C]; |
1132 } | 1132 } |
1133 } else if(param[1] == '\'') { | 1133 } else if(param[1] == '\'') { |
1134 value = context->alt_regs[Z80_B]; | 1134 value = context->alt_regs[Z80_B]; |
1135 } else if(param[1] == 'a') { | |
1136 value = context->bank_reg << 15; | |
1135 } else { | 1137 } else { |
1136 value = context->regs[Z80_B]; | 1138 value = context->regs[Z80_B]; |
1137 } | 1139 } |
1138 break; | 1140 break; |
1139 case 'c': | 1141 case 'c': |
1243 case '0': | 1245 case '0': |
1244 if (param[1] == 'x') { | 1246 if (param[1] == 'x') { |
1245 uint16_t p_addr = strtol(param+2, NULL, 16); | 1247 uint16_t p_addr = strtol(param+2, NULL, 16); |
1246 if (p_addr < 0x4000) { | 1248 if (p_addr < 0x4000) { |
1247 value = z80_ram[p_addr & 0x1FFF]; | 1249 value = z80_ram[p_addr & 0x1FFF]; |
1250 } else if(p_addr >= 0x8000) { | |
1251 uint32_t v_addr = context->bank_reg << 15; | |
1252 v_addr += p_addr & 0x7FFF; | |
1253 if (v_addr < 0x400000) { | |
1254 value = cart[v_addr/2]; | |
1255 } else if(v_addr > 0xE00000) { | |
1256 value = ram[(v_addr & 0xFFFF)/2]; | |
1257 } | |
1258 if (v_addr & 1) { | |
1259 value &= 0xFF; | |
1260 } else { | |
1261 value >>= 8; | |
1262 } | |
1248 } | 1263 } |
1249 } | 1264 } |
1250 break; | 1265 break; |
1251 } | 1266 } |
1252 printf(format, param, value); | 1267 printf(format, param, value); |
1314 fputs("a command requires a parameter\n", stderr); | 1329 fputs("a command requires a parameter\n", stderr); |
1315 break; | 1330 break; |
1316 } | 1331 } |
1317 value = strtol(param, NULL, 16); | 1332 value = strtol(param, NULL, 16); |
1318 zinsert_breakpoint(context, value, (uint8_t *)zdebugger); | 1333 zinsert_breakpoint(context, value, (uint8_t *)zdebugger); |
1334 debugging = 0; | |
1319 break; | 1335 break; |
1320 case 'b': | 1336 case 'b': |
1321 param = find_param(input_buf); | 1337 param = find_param(input_buf); |
1322 if (!param) { | 1338 if (!param) { |
1323 fputs("b command requires a parameter\n", stderr); | 1339 fputs("b command requires a parameter\n", stderr); |
1378 remove_display(&zdisplays, atoi(param)); | 1394 remove_display(&zdisplays, atoi(param)); |
1379 } | 1395 } |
1380 } | 1396 } |
1381 break; | 1397 break; |
1382 case 'n': | 1398 case 'n': |
1383 //TODO: Handle branch instructions | 1399 //TODO: Handle conditional branch instructions |
1400 if (inst.op == Z80_JP) { | |
1401 if (inst.addr_mode == Z80_IMMED) { | |
1402 after = inst.immed; | |
1403 } else if (inst.ea_reg == Z80_HL) { | |
1404 after = context->regs[Z80_H] << 8 | context->regs[Z80_L]; | |
1405 } else if (inst.ea_reg == Z80_IX) { | |
1406 after = context->regs[Z80_IXH] << 8 | context->regs[Z80_IXL]; | |
1407 } else if (inst.ea_reg == Z80_IY) { | |
1408 after = context->regs[Z80_IYH] << 8 | context->regs[Z80_IYL]; | |
1409 } | |
1410 } else if(inst.op == Z80_JR) { | |
1411 after += inst.immed; | |
1412 } else if(inst.op == Z80_RET) { | |
1413 if (context->sp < 0x4000) { | |
1414 after = z80_ram[context->sp & 0x1FFF] | z80_ram[(context->sp+1) & 0x1FFF] << 8; | |
1415 } | |
1416 } | |
1384 zinsert_breakpoint(context, after, (uint8_t *)zdebugger); | 1417 zinsert_breakpoint(context, after, (uint8_t *)zdebugger); |
1385 debugging = 0; | 1418 debugging = 0; |
1386 break; | 1419 break; |
1387 case 'p': | 1420 case 'p': |
1388 param = find_param(input_buf); | 1421 param = find_param(input_buf); |