diff --git a/source/debug.cpp b/source/debug.cpp index d6f1589..01307ce 100644 --- a/source/debug.cpp +++ b/source/debug.cpp @@ -28,6 +28,8 @@ namespace debug int con_h = 6; int sym_h = 14; + uint8_t tags[65536]; + int resizing_type = RESIZING_MEMORY; bool resizing = false; @@ -304,10 +306,63 @@ namespace debug void processCommand(); + uint8_t getTag(uint16_t address) + { + return tags[address]; + } + + void setTag(uint16_t address, uint8_t value) + { + tags[address] = value; + } + + void onInstructionExecute(uint16_t address) + { + uint8_t &tag = tags[address]; + if ( !(tag & MEMTAG_IGNORE) ) tag |= MEMTAG_INST; + tag |= (!(tag&MEMTAG_TOUCHED) ? MEMTAG_TREPEAT : MEMTAG_TINST); + + setcursor(sm83::getPC()); + history::store(); + } + + void onMemRead(uint16_t address, bool code) + { + if (isbreak(address, 2)) stop(); + + uint8_t &tag = tags[address]; + if ( tag & MEMTAG_IGNORE) return; + + if ( code ) { + tag |= MEMTAG_CODE; + } else if ( !(tag & MEMTAG_INST) ) { + tag |= MEMTAG_DATA; + } + } + + void onMemWrite(uint16_t address) + { + if (isbreak(address, 4)) stop(); + + mem_modified[address] = true; + + uint8_t &tag = tags[address]; + if ( tag & MEMTAG_IGNORE ) return; + + if ( !(tag & MEMTAG_INST) ) { + tag |= ( MEMTAG_DATA | MEMTAG_TDATA ); + } + } + + void init() { is_debugging = is_paused = false; - for (int i=0; i<65536; ++i) breakpoints[i]=0; + for (int i=0; i<65536; ++i) { + breakpoints[i]=0; + tags[i] = MEMTAG_NONE; + } + if (!cur_df) cur_df = SDL_GetCursor(); if (!cur_ns) cur_ns = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_SIZENS); if (!cur_we) cur_we = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_SIZEWE); @@ -380,10 +435,9 @@ namespace debug uint16_t find_previous_opcode(uint16_t pc) { pc--; - uint8_t tag = mem::getTag(pc); - if ( !(tag & (MEMTAG_CODE | MEMTAG_INST) ) ) return pc; + if ( !(tags[pc] & (MEMTAG_CODE | MEMTAG_INST) ) ) return pc; - while ( !(mem::getTag(pc) & MEMTAG_INST) ) pc--; + while ( !(tags[pc] & MEMTAG_INST) ) pc--; return pc; @@ -409,7 +463,7 @@ namespace debug void printDissasemblerLine(const uint16_t address, const int line, const bool heuristics=false) { uint8_t colors[4] = { COLOR_RED, COLOR_CYAN, COLOR_WHITE, COLOR_WHITE}; - const uint8_t tag = mem::getTag(address); + const uint8_t &tag = tags[address]; if ( !(tag & (MEMTAG_TINST | MEMTAG_TREPEAT)) ) colors[3]=COLOR_GRAY; if ( !(tag & MEMTAG_TOUCHED) ) colors[1]=COLOR_GRAY; @@ -427,7 +481,7 @@ namespace debug const int opcodesize = sm83dis::getOpcodeSize(address); for (int i=0; i=65536) { sendToConsoleLog("Illegal address"); return; } - if ( !(mem::getTag(address) & MEMTAG_INST) ) address = find_previous_opcode(address); + if ( !(tags[address] & MEMTAG_INST) ) address = find_previous_opcode(address); debug::setcursor(address); } else if (strcmp(cmd, "sym")==0 || strcmp(cmd, "symbol")==0) { getcmd(); @@ -937,7 +991,7 @@ namespace debug } else if (strcmp(cmd, "ignore")==0) { getcmd(); const int address = getnum(cmd); - mem::setTag(address, mem::getTag(address) | MEMTAG_IGNORE); + tags[address] |= MEMTAG_IGNORE; } else if (strcmp(cmd, "search")==0) { getcmd(); if (strcmp(cmd, "next")==0) { @@ -978,30 +1032,6 @@ namespace debug return t; } - void setmemmodified(const uint16_t addr) - { - mem_modified[addr] = true; - } - - void loadngo(const char* filename, const char* addr) - { - /* - int address = getnum(addr); - if (address<0 || address>65536) { sendToConsoleLog("Illegal offset"); return; } - - FILE *f = fopen(filename, "rb"); - fseek(f, 0, SEEK_END); - int size = ftell(f); - fseek(f, 0, SEEK_SET); - uint32_t memsize; - uint8_t *memory = mem::getRawPointer(&memsize); - fread(memory+address, size, 1, f); - fclose(f); - sm83::setPC(address); - is_debugging = is_paused = false; - */ - } - void savestate(const char *filename) { uint8_t *regs = sm83::getRegs(); @@ -1025,7 +1055,7 @@ namespace debug void setcursor(const uint16_t address) { //if (!debugging()) return; - if ( !(mem::getTag(address) & MEMTAG_INST) ) + if ( !(tags[address] & MEMTAG_INST) ) cursor = find_previous_opcode(address); else cursor = address; diff --git a/source/debug.h b/source/debug.h index 87b1587..964ee84 100644 --- a/source/debug.h +++ b/source/debug.h @@ -3,6 +3,26 @@ namespace debug { + #define MEMTAG_NONE 0x00 + #define MEMTAG_DATA 0x01 + #define MEMTAG_INST 0x02 + #define MEMTAG_CODE 0x04 + #define MEMTAG_IGNORE 0x08 + #define MEMTAG_TDATA 0x10 + #define MEMTAG_TINST 0x20 + #define MEMTAG_TREPEAT 0x40 + #define MEMTAG_MODIFIED 0x80 + + #define MEMTAG_KNOWN 0x07 + #define MEMTAG_TOUCHED 0x70 + + uint8_t getTag(uint16_t address); + void setTag(uint16_t address, uint8_t value); + + void onInstructionExecute(uint16_t address); + void onMemRead(uint16_t address, bool code=false); + void onMemWrite(uint16_t address); + void init(); void show(); void focus(); @@ -13,7 +33,6 @@ namespace debug void cont(); const bool debugging(); const bool paused(); - void setmemmodified(const uint16_t addr); void refresh(); void sendToConsole(const char* text); @@ -29,8 +48,6 @@ namespace debug void savestate(const char *filename); void loadstate(const char *filename); - void loadngo(const char* filename, const char* addr); - void setcursor(const uint16_t address); void cursorfwd(); void cursorback(); diff --git a/source/display.cpp b/source/display.cpp index 6797ad5..aa7f584 100644 --- a/source/display.cpp +++ b/source/display.cpp @@ -53,10 +53,6 @@ namespace display display::incZoom(); } else if (e->key.keysym.scancode==SDL_SCANCODE_F3) { display::toggleFullscreen(); - } else if (e->key.keysym.scancode==SDL_SCANCODE_F6) { - //zx_tape::play(); - } else if (e->key.keysym.scancode==SDL_SCANCODE_F7) { - //zx_tape::rewind(); } else if (e->key.keysym.scancode==SDL_SCANCODE_Q && e->key.keysym.mod & KMOD_CTRL) { return false; } diff --git a/source/mem.cpp b/source/mem.cpp index 5712b5f..e378987 100644 --- a/source/mem.cpp +++ b/source/mem.cpp @@ -28,8 +28,6 @@ namespace mem uint8_t wram[8192]; uint8_t hram[512]; - uint8_t tags[65536]; - char *title = nullptr; uint8_t mapper_type = 0; uint32_t rom_size = 0; @@ -102,7 +100,6 @@ namespace mem for (int i=0; i<8192; ++i) { vram[i] = 0; } for (int i=0; i<8192; ++i) { wram[i] = 0; } for (int i=0; i<512; ++i) { hram[i] = 0; } - for (int i=0; i<65536; ++i) { tags[i] = MEMTAG_NONE; } resetMbc(); apu::reset(); @@ -188,16 +185,6 @@ namespace mem mem::writeMem(io_interrupts_address, mem::readMem(io_interrupts_address) | type); } - uint8_t getTag(uint16_t address) - { - return tags[address]; - } - - void setTag(uint16_t address, uint8_t value) - { - tags[address] = value; - } - void saveState(FILE* f) { diff --git a/source/mem.h b/source/mem.h index 93edc08..53e82f2 100644 --- a/source/mem.h +++ b/source/mem.h @@ -3,19 +3,6 @@ #include namespace mem { - #define MEMTAG_NONE 0x00 - #define MEMTAG_DATA 0x01 - #define MEMTAG_INST 0x02 - #define MEMTAG_CODE 0x04 - #define MEMTAG_IGNORE 0x08 - #define MEMTAG_TDATA 0x10 - #define MEMTAG_TINST 0x20 - #define MEMTAG_TREPEAT 0x40 - #define MEMTAG_MODIFIED 0x80 - - #define MEMTAG_KNOWN 0x07 - #define MEMTAG_TOUCHED 0x70 - #define MBC_NONE 0 #define MBC1 1 #define MBC2 2 @@ -31,9 +18,6 @@ namespace mem void writeMem(uint16_t address, uint8_t value); void requestInterrupt(uint8_t type); - uint8_t getTag(uint16_t address); - void setTag(uint16_t address, uint8_t value); - void saveState(FILE* f); void loadState(FILE* f); diff --git a/source/sm83.cpp b/source/sm83.cpp index 5f69e72..eef6c67 100644 --- a/source/sm83.cpp +++ b/source/sm83.cpp @@ -70,41 +70,23 @@ namespace sm83 bool halted = false; bool exit_from_halt = false; int pending_ei = 0; - bool reading_m1 = false; uint8_t READ_MEM_8(const uint16_t addr, const bool code=false) { - if (debug::isbreak(addr, 2)) debug::stop(); t+=4; - - const uint8_t tag = mem::getTag(addr); - if ( !(tag&MEMTAG_IGNORE) ) { - if (!code) { - if ( tag & MEMTAG_INST ) { - } else { - mem::setTag(addr, tag | MEMTAG_DATA); - } - } else { - if ( (reading_m1) && ( tag & MEMTAG_DATA ) ) { - } - } - } - reading_m1 = false; + debug::onMemRead(addr, code); return mem::readMem(addr); } uint8_t READ_MEM_8() { const uint8_t data = READ_MEM_8(rPC, true); - const uint8_t tag = mem::getTag(rPC); - if ( !(tag & MEMTAG_IGNORE) ) mem::setTag(rPC, tag | MEMTAG_CODE); rPC++; return data; } uint8_t READ_M1() { - reading_m1 = true; return READ_MEM_8(); } @@ -124,19 +106,7 @@ namespace sm83 { t+=4; mem::writeMem(addr, value); - - if (debug::isbreak(addr, 4)) debug::stop(); - debug::setmemmodified(addr); - - const uint8_t tag = mem::getTag(addr); - if ( !(tag & MEMTAG_IGNORE) ) { - if ( tag & MEMTAG_INST ) { - //printf("WARNING! WRITING DATA OVER CODE!!! $%4X\n", addr); - //z80debug::stop(); - } else { - mem::setTag(addr, tag | MEMTAG_DATA | MEMTAG_TDATA); - } - } + debug::onMemWrite(addr); return value; } @@ -501,19 +471,6 @@ namespace sm83 { POP(_rPC); if (cond != cUnconditional) t += 4; - - /*if (options[Z80_OPTION_BREAK_ON_RET]) { - if (calls_stacked>0) { - calls_stacked--; - printf("RET: calls still stacked: %i\n", calls_stacked); - } else { - printf("RET: BREAK\n"); - options[Z80_OPTION_BREAK_ON_RET] = false; - z80debug::setcursor(rPC); - z80debug::history::store(); - z80debug::stop(); - } - }*/ } } @@ -549,12 +506,6 @@ namespace sm83 rPC = 0x60; *IF = *IF & ~gb::interrupts::JOYPAD; } - /*if (options[Z80_OPTION_BREAK_ON_INTERRUPT]) { - printf("Break on interrupt! 0x%2x, PC: 0x%2x\n", address, rPC); - z80debug::setcursor(rPC); - z80debug::history::store(); - z80debug::stop(); - }*/ } void RETI() @@ -729,21 +680,9 @@ namespace sm83 rHL--; } - void INVALID(uint8_t opcode) - { - printf("INVALID OPCODE AT: %04x\n", current_opcode_address); - //if (options[Z80_OPTION_STOP_ON_INVALID]) z80debug::stop(); - } - - bool opcode_ignored = false; void IgnoreOpcode() { - debug::setcursor(rPC); - debug::history::store(); debug::stop(); - /*t-=3; - rPC--; - opcode_ignored=true;*/ } void reset() @@ -769,304 +708,292 @@ namespace sm83 uint32_t step() { - do { - opcode_ignored = false; - current_opcode_address = rPC; - t = 0; - const uint8_t opcode = READ_M1(); + current_opcode_address = rPC; + t = 0; + const uint8_t opcode = READ_M1(); + uint16_t tmp; - uint8_t tag = mem::getTag(current_opcode_address); - if ( !(tag & MEMTAG_IGNORE) ) - tag = tag | MEMTAG_INST; - mem::setTag(current_opcode_address, tag | (!(tag&MEMTAG_TOUCHED) ? MEMTAG_TREPEAT : MEMTAG_TINST) ); + switch (opcode) + { + case 0x00: /* NOP */ break; + case 0x01: rBC = READ_MEM_16(); break; + case 0x02: WRITE_MEM_8(rBC, rA); break; + case 0x03: INC16(_rBC); break; + case 0x04: INC8(_rB); break; + case 0x05: DEC8(_rB); break; + case 0x06: rB = READ_MEM_8(); break; + case 0x07: RLCA(); break; + case 0x08: WRITE_MEM_16(READ_MEM_16(), rSP);break; + case 0x09: ADD16(_rHL, rBC); break; + case 0x0A: rA = READ_MEM_8(rBC); break; + case 0x0B: DEC16(_rBC); break; + case 0x0C: INC8(_rC); break; + case 0x0D: DEC8(_rC); break; + case 0x0E: rC = READ_MEM_8(); break; + case 0x0F: RRCA(); break; - uint16_t tmp; + case 0x10: STOP(); break; + case 0x11: rDE = READ_MEM_16(); break; + case 0x12: WRITE_MEM_8(rDE, rA); break; + case 0x13: INC16(_rDE); break; + case 0x14: INC8(_rD); break; + case 0x15: DEC8(_rD); break; + case 0x16: rD = READ_MEM_8(); break; + case 0x17: RLA(); break; + case 0x18: JR(); break; + case 0x19: ADD16(_rHL, rDE); break; + case 0x1A: rA = READ_MEM_8(rDE); break; + case 0x1B: DEC16(_rDE); break; + case 0x1C: INC8(_rE); break; + case 0x1D: DEC8(_rE); break; + case 0x1E: rE = READ_MEM_8(); break; + case 0x1F: RRA(); break; + + case 0x20: JR(cNZ); break; + case 0x21: rHL = READ_MEM_16(); break; + case 0x22: LDI_HL_A(); break; + case 0x23: INC16(_rHL); break; + case 0x24: INC8(_rH); break; + case 0x25: DEC8(_rH); break; + case 0x26: rH = READ_MEM_8(); break; + case 0x27: DAA(); break; + case 0x28: JR(cZ); break; + case 0x29: ADD16(_rHL, rHL); break; + case 0x2A: LDI_A_HL(); break; + case 0x2B: DEC16(_rHL); break; + case 0x2C: INC8(_rL); break; + case 0x2D: DEC8(_rL); break; + case 0x2E: rL = READ_MEM_8(); break; + case 0x2F: CPL(); break; + + case 0x30: JR(cNC); break; + case 0x31: rSP = READ_MEM_16(); break; + case 0x32: LDD_HL_A(); break; + case 0x33: INC16(_rSP); break; + case 0x34: INCMEM8(rHL); break; + case 0x35: DECMEM8(rHL); break; + case 0x36: WRITE_MEM_8(rHL, READ_MEM_8()); break; + case 0x37: SCF(); break; + case 0x38: JR(cC); break; + case 0x39: ADD16(_rHL, rSP); break; + case 0x3A: LDD_A_HL(); break; + case 0x3B: DEC16(_rSP); break; + case 0x3C: INC8(_rA); break; + case 0x3D: DEC8(_rA); break; + case 0x3E: rA = READ_MEM_8(); break; + case 0x3F: CCF(); break; + + case 0x40: rB = rB; break; + case 0x41: rB = rC; break; + case 0x42: rB = rD; break; + case 0x43: rB = rE; break; + case 0x44: rB = rH; break; + case 0x45: rB = rL; break; + case 0x46: rB = READ_MEM_8(rHL); break; + case 0x47: rB = rA; break; + case 0x48: rC = rB; break; + case 0x49: rC = rC; break; + case 0x4A: rC = rD; break; + case 0x4B: rC = rE; break; + case 0x4C: rC = rH; break; + case 0x4D: rC = rL; break; + case 0x4E: rC = READ_MEM_8(rHL); break; + case 0x4F: rC = rA; break; + + case 0x50: rD = rB; break; + case 0x51: rD = rC; break; + case 0x52: rD = rD; break; + case 0x53: rD = rE; break; + case 0x54: rD = rH; break; + case 0x55: rD = rL; break; + case 0x56: rD = READ_MEM_8(rHL); break; + case 0x57: rD = rA; break; + case 0x58: rE = rB; break; + case 0x59: rE = rC; break; + case 0x5A: rE = rD; break; + case 0x5B: rE = rE; break; + case 0x5C: rE = rH; break; + case 0x5D: rE = rL; break; + case 0x5E: rE = READ_MEM_8(rHL); break; + case 0x5F: rE = rA; break; - //if (opcode!=0xED && opcode!=0xCB && opcode!=0xDD && opcode!=0xFD ) z80debug::useOpcode(opcode, 0); + case 0x60: rH = rB; break; + case 0x61: rH = rC; break; + case 0x62: rH = rD; break; + case 0x63: rH = rE; break; + case 0x64: rH = rH; break; + case 0x65: rH = rL; break; + case 0x66: rH = READ_MEM_8(rHL); break; + case 0x67: rH = rA; break; + case 0x68: rL = rB; break; + case 0x69: rL = rC; break; + case 0x6A: rL = rD; break; + case 0x6B: rL = rE; break; + case 0x6C: rL = rH; break; + case 0x6D: rL = rL; break; + case 0x6E: rL = READ_MEM_8(rHL); break; + case 0x6F: rL = rA; break; + + case 0x70: WRITE_MEM_8(rHL, rB); break; + case 0x71: WRITE_MEM_8(rHL, rC); break; + case 0x72: WRITE_MEM_8(rHL, rD); break; + case 0x73: WRITE_MEM_8(rHL, rE); break; + case 0x74: WRITE_MEM_8(rHL, rH); break; + case 0x75: WRITE_MEM_8(rHL, rL); break; + case 0x76: HALT(); break; + case 0x77: WRITE_MEM_8(rHL, rA); break; + case 0x78: rA = rB; break; + case 0x79: rA = rC; break; + case 0x7A: rA = rD; break; + case 0x7B: rA = rE; break; + case 0x7C: rA = rH; break; + case 0x7D: rA = rL; break; + case 0x7E: rA = READ_MEM_8(rHL); break; + case 0x7F: rA = rA; break; + + case 0x80: ADD8(rB); break; + case 0x81: ADD8(rC); break; + case 0x82: ADD8(rD); break; + case 0x83: ADD8(rE); break; + case 0x84: ADD8(rH); break; + case 0x85: ADD8(rL); break; + case 0x86: ADD8(READ_MEM_8(rHL)); break; + case 0x87: ADD8(rA); break; + case 0x88: ADC8(rB); break; + case 0x89: ADC8(rC); break; + case 0x8A: ADC8(rD); break; + case 0x8B: ADC8(rE); break; + case 0x8C: ADC8(rH); break; + case 0x8D: ADC8(rL); break; + case 0x8E: ADC8(READ_MEM_8(rHL)); break; + case 0x8F: ADC8(rA); break; - switch (opcode) - { - case 0x00: /* NOP */ break; - case 0x01: rBC = READ_MEM_16(); break; - case 0x02: WRITE_MEM_8(rBC, rA); break; - case 0x03: INC16(_rBC); break; - case 0x04: INC8(_rB); break; - case 0x05: DEC8(_rB); break; - case 0x06: rB = READ_MEM_8(); break; - case 0x07: RLCA(); break; - case 0x08: WRITE_MEM_16(READ_MEM_16(), rSP);break; - case 0x09: ADD16(_rHL, rBC); break; - case 0x0A: rA = READ_MEM_8(rBC); break; - case 0x0B: DEC16(_rBC); break; - case 0x0C: INC8(_rC); break; - case 0x0D: DEC8(_rC); break; - case 0x0E: rC = READ_MEM_8(); break; - case 0x0F: RRCA(); break; + case 0x90: SUB8(rB); break; + case 0x91: SUB8(rC); break; + case 0x92: SUB8(rD); break; + case 0x93: SUB8(rE); break; + case 0x94: SUB8(rH); break; + case 0x95: SUB8(rL); break; + case 0x96: SUB8(READ_MEM_8(rHL)); break; + case 0x97: SUB8(rA); break; + case 0x98: SBC8(rB); break; + case 0x99: SBC8(rC); break; + case 0x9A: SBC8(rD); break; + case 0x9B: SBC8(rE); break; + case 0x9C: SBC8(rH); break; + case 0x9D: SBC8(rL); break; + case 0x9E: SBC8(READ_MEM_8(rHL)); break; + case 0x9F: SBC8(rA); break; - case 0x10: STOP(); break; - case 0x11: rDE = READ_MEM_16(); break; - case 0x12: WRITE_MEM_8(rDE, rA); break; - case 0x13: INC16(_rDE); break; - case 0x14: INC8(_rD); break; - case 0x15: DEC8(_rD); break; - case 0x16: rD = READ_MEM_8(); break; - case 0x17: RLA(); break; - case 0x18: JR(); break; - case 0x19: ADD16(_rHL, rDE); break; - case 0x1A: rA = READ_MEM_8(rDE); break; - case 0x1B: DEC16(_rDE); break; - case 0x1C: INC8(_rE); break; - case 0x1D: DEC8(_rE); break; - case 0x1E: rE = READ_MEM_8(); break; - case 0x1F: RRA(); break; + case 0xA0: AND(rB); break; + case 0xA1: AND(rC); break; + case 0xA2: AND(rD); break; + case 0xA3: AND(rE); break; + case 0xA4: AND(rH); break; + case 0xA5: AND(rL); break; + case 0xA6: AND(READ_MEM_8(rHL)); break; + case 0xA7: AND(rA); break; + case 0xA8: XOR(rB); break; + case 0xA9: XOR(rC); break; + case 0xAA: XOR(rD); break; + case 0xAB: XOR(rE); break; + case 0xAC: XOR(rH); break; + case 0xAD: XOR(rL); break; + case 0xAE: XOR(READ_MEM_8(rHL)); break; + case 0xAF: XOR(rA); break; - case 0x20: JR(cNZ); break; - case 0x21: rHL = READ_MEM_16(); break; - case 0x22: LDI_HL_A(); break; - case 0x23: INC16(_rHL); break; - case 0x24: INC8(_rH); break; - case 0x25: DEC8(_rH); break; - case 0x26: rH = READ_MEM_8(); break; - case 0x27: DAA(); break; - case 0x28: JR(cZ); break; - case 0x29: ADD16(_rHL, rHL); break; - case 0x2A: LDI_A_HL(); break; - case 0x2B: DEC16(_rHL); break; - case 0x2C: INC8(_rL); break; - case 0x2D: DEC8(_rL); break; - case 0x2E: rL = READ_MEM_8(); break; - case 0x2F: CPL(); break; + case 0xB0: OR(rB); break; + case 0xB1: OR(rC); break; + case 0xB2: OR(rD); break; + case 0xB3: OR(rE); break; + case 0xB4: OR(rH); break; + case 0xB5: OR(rL); break; + case 0xB6: OR(READ_MEM_8(rHL)); break; + case 0xB7: OR(rA); break; + case 0xB8: CP(rB); break; + case 0xB9: CP(rC); break; + case 0xBA: CP(rD); break; + case 0xBB: CP(rE); break; + case 0xBC: CP(rH); break; + case 0xBD: CP(rL); break; + case 0xBE: CP(READ_MEM_8(rHL)); break; + case 0xBF: CP(rA); break; - case 0x30: JR(cNC); break; - case 0x31: rSP = READ_MEM_16(); break; - case 0x32: LDD_HL_A(); break; - case 0x33: INC16(_rSP); break; - case 0x34: INCMEM8(rHL); break; - case 0x35: DECMEM8(rHL); break; - case 0x36: WRITE_MEM_8(rHL, READ_MEM_8()); break; - case 0x37: SCF(); break; - case 0x38: JR(cC); break; - case 0x39: ADD16(_rHL, rSP); break; - case 0x3A: LDD_A_HL(); break; - case 0x3B: DEC16(_rSP); break; - case 0x3C: INC8(_rA); break; - case 0x3D: DEC8(_rA); break; - case 0x3E: rA = READ_MEM_8(); break; - case 0x3F: CCF(); break; + case 0xC0: RET(cNZ); break; + case 0xC1: POP(_rBC); break; + case 0xC2: JP(cNZ, READ_MEM_16()); break; + case 0xC3: JP(cUnconditional, READ_MEM_16());break; + case 0xC4: CALL(cNZ, READ_MEM_16()); break; + case 0xC5: PUSH(rBC); break; + case 0xC6: ADD8(READ_MEM_8()); break; + case 0xC7: RST(0x00); break; + case 0xC8: RET(cZ); break; + case 0xC9: RET(cUnconditional); break; + case 0xCA: JP(cZ, READ_MEM_16()); break; + case 0xCB: BIT_INSTRUCTIONS(); break; + case 0xCC: CALL(cZ, READ_MEM_16()); break; + case 0xCD: CALL(cUnconditional, READ_MEM_16());break; + case 0xCE: ADC8(READ_MEM_8()); break; + case 0xCF: RST(0x08); break; - case 0x40: rB = rB; break; - case 0x41: rB = rC; break; - case 0x42: rB = rD; break; - case 0x43: rB = rE; break; - case 0x44: rB = rH; break; - case 0x45: rB = rL; break; - case 0x46: rB = READ_MEM_8(rHL); break; - case 0x47: rB = rA; break; - case 0x48: rC = rB; break; - case 0x49: rC = rC; break; - case 0x4A: rC = rD; break; - case 0x4B: rC = rE; break; - case 0x4C: rC = rH; break; - case 0x4D: rC = rL; break; - case 0x4E: rC = READ_MEM_8(rHL); break; - case 0x4F: rC = rA; break; + case 0xD0: RET(cNC); break; + case 0xD1: POP(_rDE); break; + case 0xD2: JP(cNC, READ_MEM_16()); break; + case 0xD3: IgnoreOpcode(); break; + case 0xD4: CALL(cNC, READ_MEM_16()); break; + case 0xD5: PUSH(rDE); break; + case 0xD6: SUB8(READ_MEM_8()); break; + case 0xD7: RST(0x10); break; + case 0xD8: RET(cC); break; + case 0xD9: RETI(); break; + case 0xDA: JP(cC, READ_MEM_16()); break; + case 0xDB: IgnoreOpcode(); break; + case 0xDC: CALL(cC, READ_MEM_16()); break; + case 0xDD: IgnoreOpcode(); break; + case 0xDE: SBC8(READ_MEM_8()); break; + case 0xDF: RST(0x18); break; - case 0x50: rD = rB; break; - case 0x51: rD = rC; break; - case 0x52: rD = rD; break; - case 0x53: rD = rE; break; - case 0x54: rD = rH; break; - case 0x55: rD = rL; break; - case 0x56: rD = READ_MEM_8(rHL); break; - case 0x57: rD = rA; break; - case 0x58: rE = rB; break; - case 0x59: rE = rC; break; - case 0x5A: rE = rD; break; - case 0x5B: rE = rE; break; - case 0x5C: rE = rH; break; - case 0x5D: rE = rL; break; - case 0x5E: rE = READ_MEM_8(rHL); break; - case 0x5F: rE = rA; break; - - case 0x60: rH = rB; break; - case 0x61: rH = rC; break; - case 0x62: rH = rD; break; - case 0x63: rH = rE; break; - case 0x64: rH = rH; break; - case 0x65: rH = rL; break; - case 0x66: rH = READ_MEM_8(rHL); break; - case 0x67: rH = rA; break; - case 0x68: rL = rB; break; - case 0x69: rL = rC; break; - case 0x6A: rL = rD; break; - case 0x6B: rL = rE; break; - case 0x6C: rL = rH; break; - case 0x6D: rL = rL; break; - case 0x6E: rL = READ_MEM_8(rHL); break; - case 0x6F: rL = rA; break; - - case 0x70: WRITE_MEM_8(rHL, rB); break; - case 0x71: WRITE_MEM_8(rHL, rC); break; - case 0x72: WRITE_MEM_8(rHL, rD); break; - case 0x73: WRITE_MEM_8(rHL, rE); break; - case 0x74: WRITE_MEM_8(rHL, rH); break; - case 0x75: WRITE_MEM_8(rHL, rL); break; - case 0x76: HALT(); break; - case 0x77: WRITE_MEM_8(rHL, rA); break; - case 0x78: rA = rB; break; - case 0x79: rA = rC; break; - case 0x7A: rA = rD; break; - case 0x7B: rA = rE; break; - case 0x7C: rA = rH; break; - case 0x7D: rA = rL; break; - case 0x7E: rA = READ_MEM_8(rHL); break; - case 0x7F: rA = rA; break; - - case 0x80: ADD8(rB); break; - case 0x81: ADD8(rC); break; - case 0x82: ADD8(rD); break; - case 0x83: ADD8(rE); break; - case 0x84: ADD8(rH); break; - case 0x85: ADD8(rL); break; - case 0x86: ADD8(READ_MEM_8(rHL)); break; - case 0x87: ADD8(rA); break; - case 0x88: ADC8(rB); break; - case 0x89: ADC8(rC); break; - case 0x8A: ADC8(rD); break; - case 0x8B: ADC8(rE); break; - case 0x8C: ADC8(rH); break; - case 0x8D: ADC8(rL); break; - case 0x8E: ADC8(READ_MEM_8(rHL)); break; - case 0x8F: ADC8(rA); break; + case 0xE0: WRITE_MEM_8(READ_MEM_8()|0xff00, rA);break; + case 0xE1: POP(_rHL); break; + case 0xE2: WRITE_MEM_8(rC|0xff00, rA); break; + case 0xE3: IgnoreOpcode(); break; + case 0xE4: IgnoreOpcode(); break; + case 0xE5: PUSH(rHL); break; + case 0xE6: AND(READ_MEM_8()); break; + case 0xE7: RST(0x20); break; + case 0xE8: ADD16(_rSP, (int8_t)READ_MEM_8());break; /*[TODO] es correcte? ha de ser signed*/ + case 0xE9: JP(cUnconditional, rHL, true); break; + case 0xEA: WRITE_MEM_8(READ_MEM_16(), rA); break; + case 0xEB: IgnoreOpcode(); break; + case 0xEC: IgnoreOpcode(); break; + case 0xED: IgnoreOpcode(); break; + case 0xEE: XOR(READ_MEM_8()); break; + case 0xEF: RST(0x28); break; - case 0x90: SUB8(rB); break; - case 0x91: SUB8(rC); break; - case 0x92: SUB8(rD); break; - case 0x93: SUB8(rE); break; - case 0x94: SUB8(rH); break; - case 0x95: SUB8(rL); break; - case 0x96: SUB8(READ_MEM_8(rHL)); break; - case 0x97: SUB8(rA); break; - case 0x98: SBC8(rB); break; - case 0x99: SBC8(rC); break; - case 0x9A: SBC8(rD); break; - case 0x9B: SBC8(rE); break; - case 0x9C: SBC8(rH); break; - case 0x9D: SBC8(rL); break; - case 0x9E: SBC8(READ_MEM_8(rHL)); break; - case 0x9F: SBC8(rA); break; - - case 0xA0: AND(rB); break; - case 0xA1: AND(rC); break; - case 0xA2: AND(rD); break; - case 0xA3: AND(rE); break; - case 0xA4: AND(rH); break; - case 0xA5: AND(rL); break; - case 0xA6: AND(READ_MEM_8(rHL)); break; - case 0xA7: AND(rA); break; - case 0xA8: XOR(rB); break; - case 0xA9: XOR(rC); break; - case 0xAA: XOR(rD); break; - case 0xAB: XOR(rE); break; - case 0xAC: XOR(rH); break; - case 0xAD: XOR(rL); break; - case 0xAE: XOR(READ_MEM_8(rHL)); break; - case 0xAF: XOR(rA); break; - - case 0xB0: OR(rB); break; - case 0xB1: OR(rC); break; - case 0xB2: OR(rD); break; - case 0xB3: OR(rE); break; - case 0xB4: OR(rH); break; - case 0xB5: OR(rL); break; - case 0xB6: OR(READ_MEM_8(rHL)); break; - case 0xB7: OR(rA); break; - case 0xB8: CP(rB); break; - case 0xB9: CP(rC); break; - case 0xBA: CP(rD); break; - case 0xBB: CP(rE); break; - case 0xBC: CP(rH); break; - case 0xBD: CP(rL); break; - case 0xBE: CP(READ_MEM_8(rHL)); break; - case 0xBF: CP(rA); break; - - case 0xC0: RET(cNZ); break; - case 0xC1: POP(_rBC); break; - case 0xC2: JP(cNZ, READ_MEM_16()); break; - case 0xC3: JP(cUnconditional, READ_MEM_16());break; - case 0xC4: CALL(cNZ, READ_MEM_16()); break; - case 0xC5: PUSH(rBC); break; - case 0xC6: ADD8(READ_MEM_8()); break; - case 0xC7: RST(0x00); break; - case 0xC8: RET(cZ); break; - case 0xC9: RET(cUnconditional); break; - case 0xCA: JP(cZ, READ_MEM_16()); break; - case 0xCB: BIT_INSTRUCTIONS(); break; - case 0xCC: CALL(cZ, READ_MEM_16()); break; - case 0xCD: CALL(cUnconditional, READ_MEM_16());break; - case 0xCE: ADC8(READ_MEM_8()); break; - case 0xCF: RST(0x08); break; - - case 0xD0: RET(cNC); break; - case 0xD1: POP(_rDE); break; - case 0xD2: JP(cNC, READ_MEM_16()); break; - case 0xD3: IgnoreOpcode(); break; - case 0xD4: CALL(cNC, READ_MEM_16()); break; - case 0xD5: PUSH(rDE); break; - case 0xD6: SUB8(READ_MEM_8()); break; - case 0xD7: RST(0x10); break; - case 0xD8: RET(cC); break; - case 0xD9: RETI(); break; - case 0xDA: JP(cC, READ_MEM_16()); break; - case 0xDB: IgnoreOpcode(); break; - case 0xDC: CALL(cC, READ_MEM_16()); break; - case 0xDD: IgnoreOpcode(); break; - case 0xDE: SBC8(READ_MEM_8()); break; - case 0xDF: RST(0x18); break; - - case 0xE0: WRITE_MEM_8(READ_MEM_8()|0xff00, rA);break; - case 0xE1: POP(_rHL); break; - case 0xE2: WRITE_MEM_8(rC|0xff00, rA); break; - case 0xE3: IgnoreOpcode(); break; - case 0xE4: IgnoreOpcode(); break; - case 0xE5: PUSH(rHL); break; - case 0xE6: AND(READ_MEM_8()); break; - case 0xE7: RST(0x20); break; - case 0xE8: ADD16(_rSP, (int8_t)READ_MEM_8());break; /*[TODO] es correcte? ha de ser signed*/ - case 0xE9: JP(cUnconditional, rHL, true); break; - case 0xEA: WRITE_MEM_8(READ_MEM_16(), rA); break; - case 0xEB: IgnoreOpcode(); break; - case 0xEC: IgnoreOpcode(); break; - case 0xED: IgnoreOpcode(); break; - case 0xEE: XOR(READ_MEM_8()); break; - case 0xEF: RST(0x28); break; - - case 0xF0: rA = READ_MEM_8(READ_MEM_8()|0xff00);break; - case 0xF1: POP(_rAF); break; - case 0xF2: rA = READ_MEM_8(rC|0xff00); break; - case 0xF3: DI(); break; - case 0xF4: IgnoreOpcode(); break; - case 0xF5: PUSH(rAF); break; - case 0xF6: OR(READ_MEM_8()); break; - case 0xF7: RST(0x30); break; - case 0xF8: rHL = rSP + (int8_t)READ_MEM_8();break; /*[TODO] es correcte? ha de ser signed*/ - case 0xF9: rSP = rHL; t+=2; break; - case 0xFA: rA = READ_MEM_8(READ_MEM_16()); break; - case 0xFB: EI(); break; - case 0xFC: IgnoreOpcode(); break; - case 0xFD: IgnoreOpcode(); break; - case 0xFE: CP(READ_MEM_8()); break; - case 0xFF: RST(0x38); break; - } - - } while (opcode_ignored); + case 0xF0: rA = READ_MEM_8(READ_MEM_8()|0xff00);break; + case 0xF1: POP(_rAF); break; + case 0xF2: rA = READ_MEM_8(rC|0xff00); break; + case 0xF3: DI(); break; + case 0xF4: IgnoreOpcode(); break; + case 0xF5: PUSH(rAF); break; + case 0xF6: OR(READ_MEM_8()); break; + case 0xF7: RST(0x30); break; + case 0xF8: rHL = rSP + (int8_t)READ_MEM_8();break; /*[TODO] es correcte? ha de ser signed*/ + case 0xF9: rSP = rHL; t+=2; break; + case 0xFA: rA = READ_MEM_8(READ_MEM_16()); break; + case 0xFB: EI(); break; + case 0xFC: IgnoreOpcode(); break; + case 0xFD: IgnoreOpcode(); break; + case 0xFE: CP(READ_MEM_8()); break; + case 0xFF: RST(0x38); break; + } if (pending_ei==2) { pending_ei=0; actualEI(); } if (pending_ei==1) pending_ei=2; - debug::setcursor(rPC); - debug::history::store(); + debug::onInstructionExecute(current_opcode_address); mem::update_mapped(t); + return t; } @@ -1074,8 +1001,6 @@ namespace sm83 { const uint8_t opcode = READ_M1(); - //z80debug::useOpcode(opcode, 2); - switch (opcode) { case 0x00: rB = RLC(rB); break;