AltairZ80: Fixed breakpoint detection after PC wrap around

This commit is contained in:
Peter Schorn 2020-06-08 09:25:13 +02:00
parent d92805f258
commit f91d56c60f

View file

@ -284,8 +284,8 @@ struct idev {
const char* name; const char* name;
}; };
static int32 switcherPort = SWITCHCPU_DEFAULT; static int32 switcherPort = SWITCHCPU_DEFAULT;
static struct idev oldSwitcherDevice = { NULL, NULL }; static struct idev oldSwitcherDevice = { NULL, NULL };
// CPU_INDEX_8080 is defined in altairz80_defs.h // CPU_INDEX_8080 is defined in altairz80_defs.h
#define CPU_INDEX_8086 26 #define CPU_INDEX_8086 26
@ -321,7 +321,7 @@ REG cpu_reg[] = {
}, /* 13 */ }, /* 13 */
{ GRDATAD (IFF, IFF_S, 2, 2, 0, "Z80 Interrupt Flip Flop register") { GRDATAD (IFF, IFF_S, 2, 2, 0, "Z80 Interrupt Flip Flop register")
}, /* 6 */ }, /* 6 */
{ HRDATAD (IR, IR_S, 16, "Z80 Interrupt (upper) / Refresh (lower) register") { HRDATAD (IR, IR_S, 16, "Z80 Interrupt (upper) / Refresh (lower) register")
}, /* 7 */ }, /* 7 */
// 8086 registers // 8086 registers
@ -431,11 +431,11 @@ REG cpu_reg[] = {
}, /* 64 M68K, PREF_ADDR */ }, /* 64 M68K, PREF_ADDR */
{ HRDATAD (M68K_PREF_DATA, m68k_registers[M68K_REG_PREF_DATA], 32, "M68K Last Prefetch Data register"), { HRDATAD (M68K_PREF_DATA, m68k_registers[M68K_REG_PREF_DATA], 32, "M68K Last Prefetch Data register"),
}, /* 65 M68K, PREF_DATA */ }, /* 65 M68K, PREF_DATA */
{ HRDATAD (M68K_PPC, m68k_registers[M68K_REG_PPC], 32, "M68K Previous Proram Counter register"), { HRDATAD (M68K_PPC, m68k_registers[M68K_REG_PPC], 32, "M68K Previous Proram Counter register"),
}, /* 66 M68K, PPC */ }, /* 66 M68K, PPC */
{ HRDATAD (M68K_IR, m68k_registers[M68K_REG_IR], 32, "M68K Instruction Register"), { HRDATAD (M68K_IR, m68k_registers[M68K_REG_IR], 32, "M68K Instruction Register"),
}, /* 67 M68K, IR */ }, /* 67 M68K, IR */
{ HRDATAD (M68K_CPU_TYPE, m68k_registers[M68K_REG_CPU_TYPE], 32, "M68K CPU Type register"), { HRDATAD (M68K_CPU_TYPE, m68k_registers[M68K_REG_CPU_TYPE], 32, "M68K CPU Type register"),
REG_RO }, /* 68 M68K, CPU_TYPE */ REG_RO }, /* 68 M68K, CPU_TYPE */
// Pseudo registers // Pseudo registers
@ -642,14 +642,14 @@ static struct idev dev_table[256] = {
{&nulldev, "nulldev"}, {&nulldev, "nulldev"}, {&nulldev, "nulldev"}, {&nulldev, "nulldev"}, /* F0 */ {&nulldev, "nulldev"}, {&nulldev, "nulldev"}, {&nulldev, "nulldev"}, {&nulldev, "nulldev"}, /* F0 */
{&nulldev, "nulldev"}, {&nulldev, "nulldev"}, {&nulldev, "nulldev"}, {&nulldev, "nulldev"}, /* F4 */ {&nulldev, "nulldev"}, {&nulldev, "nulldev"}, {&nulldev, "nulldev"}, {&nulldev, "nulldev"}, /* F4 */
{&nulldev, "nulldev"}, {&nulldev, "nulldev"}, {&nulldev, "nulldev"}, {&nulldev, "nulldev"}, /* F8 */ {&nulldev, "nulldev"}, {&nulldev, "nulldev"}, {&nulldev, "nulldev"}, {&nulldev, "nulldev"}, /* F8 */
{&nulldev, "nulldev"}, {&hdsk_io, "hdsk_io"}, {&simh_dev,"simh_dev"},{&sr_dev, "sr_dev"} /* FC */ {&nulldev, "nulldev"}, {&hdsk_io, "hdsk_io"}, {&simh_dev,"simh_dev"},{&sr_dev, "sr_dev"} /* FC */
}; };
const char* handlerNameForPort(const int32 port) { const char* handlerNameForPort(const int32 port) {
return dev_table[port & 0xff].name; return dev_table[port & 0xff].name;
} }
static int32 ramtype = 0; static int32 ramtype = 0;
#define MAX_RAM_TYPE 3 #define MAX_RAM_TYPE 3
ChipType chiptype = CHIP_TYPE_8080; ChipType chiptype = CHIP_TYPE_8080;
@ -6124,33 +6124,34 @@ static t_stat sim_instr_mmu (void) {
PC = 0x38; PC = 0x38;
} }
/* /*
** Save in instruction history ring buffer? ** Save in instruction history ring buffer
*/ */
if (hst_lnt && ((chiptype == CHIP_TYPE_8080) || (chiptype == CHIP_TYPE_Z80))) { if (hst_lnt && ((chiptype == CHIP_TYPE_8080) || (chiptype == CHIP_TYPE_Z80))) {
hst[hst_p].valid = 1; hst[hst_p].valid = 1;
hst[hst_p].pc = PCX; hst[hst_p].pc = PCX;
hst[hst_p].sp = SP; hst[hst_p].sp = SP;
hst[hst_p].af = AF; hst[hst_p].af = AF;
hst[hst_p].bc = BC; hst[hst_p].bc = BC;
hst[hst_p].de = DE; hst[hst_p].de = DE;
hst[hst_p].hl = HL; hst[hst_p].hl = HL;
hst[hst_p].af1 = AF1_S; hst[hst_p].af1 = AF1_S;
hst[hst_p].bc1 = BC1_S; hst[hst_p].bc1 = BC1_S;
hst[hst_p].de1 = DE1_S; hst[hst_p].de1 = DE1_S;
hst[hst_p].hl1 = HL1_S; hst[hst_p].hl1 = HL1_S;
hst[hst_p].ix = IX; hst[hst_p].ix = IX;
hst[hst_p].iy = IY; hst[hst_p].iy = IY;
for (i = 0; i < INST_MAX_BYTES; i++) { for (i = 0; i < INST_MAX_BYTES; i++) {
hst[hst_p].op[i] = GetBYTE(PCX + i); hst[hst_p].op[i] = GetBYTE(PCX + i);
}
if (++hst_p == hst_lnt) {
hst_p = 0;
}
} }
if (++hst_p == hst_lnt) { PC &= ADDRMASK; /* reestablish invariant */
hst_p = 0;
}
}
sim_interval--; sim_interval--;
} }