diff --git a/glaurung.sav b/glaurung.sav new file mode 100644 index 0000000..5cb2fa0 Binary files /dev/null and b/glaurung.sav differ diff --git a/z80.cpp b/z80.cpp index 35b8d11..750017c 100644 --- a/z80.cpp +++ b/z80.cpp @@ -10,7 +10,7 @@ namespace z80 static uint8_t memtouched[65536]; static uint32_t t = 0; static uint16_t current_opcode_address = 0; - bool options[Z80_NUM_OPTIONS] = { true }; + bool options[Z80_NUM_OPTIONS] = { true, false }; int (*in_ports[256])(int); void (*out_ports[256])(int, int); @@ -666,7 +666,12 @@ namespace z80 } else if (im==2) { const uint16_t address = (rI<<8) | 0xFE; rPC = READ_MEM_16(address); + } else if (im==0) { + printf("Interrupt mode 0!\n"); + z80debug::stop(); + return; } + if (options[Z80_OPTION_BREAK_ON_INTERRUPT]) z80debug::stop(); } void RST(uint8_t vec) diff --git a/z80.h b/z80.h index 053128e..ee9e72c 100644 --- a/z80.h +++ b/z80.h @@ -10,7 +10,8 @@ namespace z80 #define MEMTAG_DATA 3 #define Z80_OPTION_STOP_ON_INVALID 0 - #define Z80_NUM_OPTIONS 1 + #define Z80_OPTION_BREAK_ON_INTERRUPT 1 + #define Z80_NUM_OPTIONS 2 void reset(uint8_t* mem); void connect_port(int num, int (*in_ptr)(int), void (*out_ptr)(int,int)); diff --git a/z80debug.cpp b/z80debug.cpp index 69fc888..ac53704 100644 --- a/z80debug.cpp +++ b/z80debug.cpp @@ -623,6 +623,7 @@ namespace z80debug } else if (strcmp(cmd, "b")==0 || strcmp(cmd, "break")==0) { getcmd(); if (cmd[0] == 0) { breakpoints[z80::getPC()]=1; return; } + if (cmd[0] == 'i') { z80::setOption(Z80_OPTION_BREAK_ON_INTERRUPT, !z80::getOption(Z80_OPTION_BREAK_ON_INTERRUPT)); return; } int address = getnum(cmd); if (address<0 || address>65536) { sendToConsoleLog("Illegal break address"); return; } getcmd();