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);