- [CHG] Pasada la gestió de tags de memòria de sm83 a debug
- [CHG] Netejada l'interficie debug->sm83 - [CHG] Un poc més de neteja de codi en general
This commit is contained in:
+64
-34
@@ -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<opcodesize; ++i) {
|
||||
const uint8_t tag = mem::getTag(address+i);
|
||||
const uint8_t &tag = tags[address+i];
|
||||
const uint32_t color = !(tag & MEMTAG_KNOWN) ? COLOR_GRAY : (tag & MEMTAG_DATA) ? ( (tag & (MEMTAG_CODE|MEMTAG_INST)) ? COLOR_MAGENTA : COLOR_BLUE ) : COLOR_GREEN;
|
||||
ui::printrect(19+i*3,line,2,1,color);
|
||||
}
|
||||
@@ -607,7 +661,7 @@ namespace debug
|
||||
ui::printtxt(1,i, tohex(mem_viewer_cursor, 4), COLOR_CYAN);
|
||||
for (int j=0; j<16; ++j) {
|
||||
|
||||
const uint8_t tag = mem::getTag(mem_viewer_cursor);
|
||||
const uint8_t &tag = tags[mem_viewer_cursor];
|
||||
const uint32_t color = !(tag & MEMTAG_KNOWN) ? COLOR_GRAY : (tag & MEMTAG_DATA) ? ( (tag & (MEMTAG_CODE|MEMTAG_INST)) ? COLOR_MAGENTA : COLOR_BLUE ) : COLOR_GREEN;
|
||||
ui::printrect(6+j*3,i,2,1,color);
|
||||
ui::printrect(54+j,i,1,1,color);
|
||||
@@ -885,7 +939,7 @@ namespace debug
|
||||
getcmd();
|
||||
int address = getnum(cmd);
|
||||
if (address<0 || address>=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;
|
||||
|
||||
+20
-3
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
|
||||
@@ -3,19 +3,6 @@
|
||||
#include <stdio.h>
|
||||
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);
|
||||
|
||||
|
||||
+273
-348
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user