From 974251540da6c4a924bfced57f9fa98defe127a1 Mon Sep 17 00:00:00 2001 From: Raimon Zamora Date: Mon, 27 Jan 2025 22:09:02 +0100 Subject: [PATCH] =?UTF-8?q?-=20[FIX]=20Les=20interrupcions=20comencen=20mi?= =?UTF-8?q?rant=20IE=20&=20IF,=20i=20despr=C3=A9s=20IME.=20Estava=20al=20r?= =?UTF-8?q?eves.=20-=20[FIX]=20En=20cada=20interrupci=C3=B3=20se=20marcava?= =?UTF-8?q?=20el=20exit=5Ffrom=5Fhalt,=20i=20sino=20estaves=20en=20halt,?= =?UTF-8?q?=20el=20pr=C3=B2xim=20halt=20no=20ten=C3=ADa=20efecte.=20-=20[F?= =?UTF-8?q?IX]=20Implementat=20el=20halt=20bug=20quan=20va=20despres=20de?= =?UTF-8?q?=20EI=20-=20[FIX]=20una=20demanda=20de=20interrupci=C3=B3=20ha?= =?UTF-8?q?=20de=20quedar=20marcada=20en=20IF,=20encara=20que=20en=20IE=20?= =?UTF-8?q?no=20estiga=20habilitada.=20-=20[FIX]=20durant=20el=20pintat=20?= =?UTF-8?q?se=20marquen=20les=20interrupcions=20que=20toque,=20i=20al=20fi?= =?UTF-8?q?nal=20es=20quan=20s'envia=20tot=20junt.=20-=20[FIX]=20estava=20?= =?UTF-8?q?enviant=20una=20interrupcio=20VBLANK=20al=20acabar=20el=20pinta?= =?UTF-8?q?t=20total,=20com=20en=20spectrum,=20adicional=20a=20la=20que=20?= =?UTF-8?q?toca,=20i=20tot=20anava=20loco.=20-=20[FIX]=20Llevats=20tots=20?= =?UTF-8?q?els=20fullrefresh,=20no=20funciona=20be=20en=20GameBoy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- debug.cpp | 6 ++++-- gbscreen.cpp | 27 ++++++++++++++------------- sm83.cpp | 33 ++++++++++++++++++++++++++------- 3 files changed, 44 insertions(+), 22 deletions(-) diff --git a/debug.cpp b/debug.cpp index 444bb8c..3b0018e 100644 --- a/debug.cpp +++ b/debug.cpp @@ -360,7 +360,8 @@ namespace debug pause(); is_debugging = true; show(); - if ( gbscreen::getFullRefresh()) gbscreen::fullrefresh(); + gbscreen::redraw(true); + //if ( gbscreen::getFullRefresh()) gbscreen::fullrefresh(); } void cont() { @@ -777,7 +778,8 @@ namespace debug uint8_t dt = sm83::step(); //zx_tape::update(dt); //zx_ula::sound_update(dt); - gbscreen::fullrefresh(); + gbscreen::refresh(dt); + gbscreen::redraw(); //z80analyze::refresh(); } else if (strcmp(cmd, "c")==0 || strcmp(cmd, "cont")==0) { sm83::step(); diff --git a/gbscreen.cpp b/gbscreen.cpp index 165b555..41deab2 100644 --- a/gbscreen.cpp +++ b/gbscreen.cpp @@ -301,7 +301,7 @@ namespace gbscreen } // gestió de en quin dot i linea estem, i tot el que ha de passar - bool stat_interrupt = false; + uint8_t interrupts = 0x00; dots_in_scanline++; if ( (dots_in_scanline==80) && (LY<144) ) { @@ -310,26 +310,26 @@ namespace gbscreen else if ( (dots_in_scanline==252) && (LY<144) ) { STAT = (STAT & 0xFC); // Set mode 0 - if (STAT&0x08) stat_interrupt = true; + if (STAT&0x08) interrupts |= INTERRUPT_LCD; } else if (dots_in_scanline==456) { - dots_in_scanline = 0; + dots_in_scanline = 0; LY++; if (LY==144) { STAT = (STAT & 0xFC) | 0x01; // Set mode 1 - mem::writeMem(0xff41, STAT); - mem::writeMem(0xff44, LY); - sm83::interrupt(INTERRUPT_VBLANK); - if (STAT&0x10) stat_interrupt = true; + //mem::writeMem(0xff41, STAT); + //mem::writeMem(0xff44, LY); + interrupts |= INTERRUPT_VBLANK; + if (STAT&0x10) interrupts |= INTERRUPT_LCD; } else { if (LY<144) { STAT = (STAT & 0xFC) | 0x02; // Set mode 2 - if (STAT&0x20) stat_interrupt = true; + if (STAT&0x20) interrupts |= INTERRUPT_LCD; fill_line_buffer_bkg(LY); fill_line_buffer_win(LY); fill_line_buffer_obj(LY); @@ -342,7 +342,7 @@ namespace gbscreen if (LY==LYC) { STAT = (STAT & 0xFB) | 0x04; - if (STAT&0x40) stat_interrupt = true; + if (STAT&0x40) interrupts |= INTERRUPT_LCD; } else { @@ -350,11 +350,11 @@ namespace gbscreen } } - if (stat_interrupt) + if (interrupts) { mem::writeMem(0xff41, STAT); mem::writeMem(0xff44, LY); - sm83::interrupt(INTERRUPT_LCD); + sm83::interrupt(interrupts); } t_screen++; @@ -363,7 +363,7 @@ namespace gbscreen t_screen=0; ptr_pixel = gb_pixels; redraw(); - if (!full) sm83::interrupt(INTERRUPT_VBLANK); + //if (!full) sm83::interrupt(INTERRUPT_VBLANK); } } mem::writeMem(0xff41, STAT); @@ -383,7 +383,8 @@ namespace gbscreen void debugrefresh(const uint32_t dt) { - if (full_refresh) fullrefresh(); else refresh(dt); + /*if (full_refresh) fullrefresh(); else*/ refresh(dt); + redraw(); } void redraw(const bool present) diff --git a/sm83.cpp b/sm83.cpp index 8eb1639..06344f6 100644 --- a/sm83.cpp +++ b/sm83.cpp @@ -46,6 +46,7 @@ namespace sm83 uint8_t *_rIME = ®s[12]; + bool halted = false; bool exit_from_halt = false; int pending_ei = 0; @@ -521,12 +522,18 @@ namespace sm83 void processInterrupts() { + uint8_t *IE = mem::rawPtr(0xffff); uint8_t *IF = mem::rawPtr(0xff0f); + if ( (*IF & *IE) == 0 ) return; + if (halted) { + //exit_from_halt = true; + halted = false; + rPC++; + } if (ime==0) return; - if ( (*IF & 0x1f) == 0) return; DI(); PUSH(rPC); - t+=20; + //t+=20; if (*IF & INTERRUPT_VBLANK) { rPC = 0x40; *IF = *IF & ~INTERRUPT_VBLANK; @@ -584,12 +591,24 @@ namespace sm83 void HALT() { - if (exit_from_halt) { + if (!halted) { + uint8_t *IE = mem::rawPtr(0xffff); + uint8_t *IF = mem::rawPtr(0xff0f); + if ( (ime==0) && ((*IF & *IE) != 0) ) { + // [TODO] HALT BUG + if (pending_ei==2) rPC--; + return; + } else { + halted = true; + } + } + /*if (exit_from_halt) { exit_from_halt = false; - } else { + halted = false; + } else {*/ //printf("HALT\n"); rPC--; - } + //} } void STOP() @@ -600,9 +619,9 @@ namespace sm83 void interrupt(uint8_t type) { const uint8_t IE = mem::readMem(0xffff); - if (IE & type) exit_from_halt = true; + //if (IE & type) exit_from_halt = true; const uint8_t IF = mem::readMem(0xff0f); - mem::writeMem(0xff0f, IF | (IE & type)); + mem::writeMem(0xff0f, IF | type); //processInterrupts(); }