changeset 392:1b80b90399da

Z80 debugger improvements
author Mike Pavone <pavone@retrodev.com>
date Sun, 09 Jun 2013 02:03:26 -0700
parents 3f4f2b7318a1
children 30c250a41629
files blastem.c
diffstat 1 files changed, 34 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/blastem.c	Sat Jun 08 12:59:23 2013 -0700
+++ b/blastem.c	Sun Jun 09 02:03:26 2013 -0700
@@ -1132,6 +1132,8 @@
 			}
 		} else if(param[1] == '\'') {
 			value = context->alt_regs[Z80_B];
+		} else if(param[1] == 'a') {
+			value = context->bank_reg << 15;
 		} else {
 			value = context->regs[Z80_B];
 		}
@@ -1245,6 +1247,19 @@
 			uint16_t p_addr = strtol(param+2, NULL, 16);
 			if (p_addr < 0x4000) {
 				value = z80_ram[p_addr & 0x1FFF];
+			} else if(p_addr >= 0x8000) {
+				uint32_t v_addr = context->bank_reg << 15;
+				v_addr += p_addr & 0x7FFF;
+				if (v_addr < 0x400000) {
+					value = cart[v_addr/2];
+				} else if(v_addr > 0xE00000) {
+					value = ram[(v_addr & 0xFFFF)/2];
+				}
+				if (v_addr & 1) {
+					value &= 0xFF;
+				} else {
+					value >>= 8;
+				}
 			}
 		}
 		break;
@@ -1316,6 +1331,7 @@
 				}
 				value = strtol(param, NULL, 16);
 				zinsert_breakpoint(context, value, (uint8_t *)zdebugger);
+				debugging = 0;
 				break;
 			case 'b':
 				param = find_param(input_buf);
@@ -1380,7 +1396,24 @@
 				}
 				break;
 			case 'n':
-				//TODO: Handle branch instructions
+				//TODO: Handle conditional branch instructions
+				if (inst.op == Z80_JP) {
+					if (inst.addr_mode == Z80_IMMED) {
+						after = inst.immed;
+					} else if (inst.ea_reg == Z80_HL) {
+						after = context->regs[Z80_H] << 8 | context->regs[Z80_L];
+					} else if (inst.ea_reg == Z80_IX) {
+						after = context->regs[Z80_IXH] << 8 | context->regs[Z80_IXL];
+					} else if (inst.ea_reg == Z80_IY) {
+						after = context->regs[Z80_IYH] << 8 | context->regs[Z80_IYL];
+					}
+				} else if(inst.op == Z80_JR) {
+					after += inst.immed;
+				} else if(inst.op == Z80_RET) {
+					if (context->sp < 0x4000) {
+						after = z80_ram[context->sp & 0x1FFF] | z80_ram[(context->sp+1) & 0x1FFF] << 8;
+					}
+				}
 				zinsert_breakpoint(context, after, (uint8_t *)zdebugger);
 				debugging = 0;
 				break;