X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=fceu.git;a=blobdiff_plain;f=x6502.c;h=c20edf9dc7a65ac3526f9b73dea9f5572c69665b;hp=b428056abe14746dfa6757ac905a0fc9d553a233;hb=396c448eb538587248ddbf586a90371c71b48183;hpb=81bd66a11186efb420eb8d6fd5766f0ef26d5919 diff --git a/x6502.c b/x6502.c index b428056..c20edf9 100644 --- a/x6502.c +++ b/x6502.c @@ -26,6 +26,8 @@ #include "sound.h" #include "cart.h" +#include "dprintf.h" + #ifdef DEBUG_ASM_6502 #include #include @@ -33,14 +35,16 @@ extern uint32 PC_prev, OP_prev; extern uint8 dreads[4]; extern uint32 dwrites_c[2]; extern int dread_count_c, dwrite_count_c; +extern int mapirq_cyc_c; +extern void (*MapIRQHook)(int a); #define DummyRdMem(...) #else #define DummyRdMem RdMem +void FP_FASTAPASS(1) (*MapIRQHook)(int a); #endif X6502 X; uint32 timestamp; -void FP_FASTAPASS(1) (*MapIRQHook)(int a); #define _PC X.PC #define _A X.A @@ -59,31 +63,29 @@ void FP_FASTAPASS(1) (*MapIRQHook)(int a); static INLINE uint8 RdMem(unsigned int A) { - // notaz: try to avoid lookup of every address at least for ROM and RAM areas - // I've verified that if ARead[0xfff0] points to CartBR, it is always normal ROM read. -#if 0 - if ((A&0x8000)/* && ARead[0xfff0] == CartBR*/) { - return (_DB=Page[A>>11][A]); - } -#endif -#if 0 // enabling this causes 4fps slowdown. Why? - if ((A&0xe000) == 0) { // RAM area (always 0-0x1fff) - return (_DB=RAM[A&0x7FF]); - } -#endif - _DB=ARead[A](A); + int _DB1=ARead[A](A); #ifdef DEBUG_ASM_6502 + //_DB=_DB1; //printf("a == %x, pc == %x\n", A, _PC); - if (A >= 0x2000 && A != _PC && A != _PC - 1 && A != _PC + 1) { - dreads[dread_count_c++] = _DB; + if (A >= 0x2000) { + if (A == _PC || A == _PC - 1 || A == _PC + 1) { + //printf("fr: %02x\n", _DB1); + } + _DB=_DB1; + } + if (A >= 0x2000 && A != _PC - 1) { + dreads[dread_count_c++] = _DB1; if (dread_count_c > 4) { printf("dread_count out of range\n"); exit(1); } } +#else + _DB=_DB1; #endif - return _DB; + return _DB1; } static INLINE void WrMem(unsigned int A, uint8 V) { + //printf("w [%04x] %02x\n", A, V); if ((A&0xe000) == 0) { // RAM area (always 0-0x1fff) RAM[A&0x7FF] = V; return; @@ -97,7 +99,12 @@ static INLINE void WrMem(unsigned int A, uint8 V) static INLINE uint8 RdRAM(unsigned int A) { - return((_DB=RAM[A])); + //return((_DB=RAM[A])); + int _DB1=RAM[A]; +#ifndef DEBUG_ASM_6502 + _DB=_DB1; +#endif + return _DB1; } static INLINE void WrRAM(unsigned int A, uint8 V) @@ -107,7 +114,7 @@ static INLINE void WrRAM(unsigned int A, uint8 V) static INLINE void ADDCYC(int x) { - //_tcount+=x; + _tcount+=x; _count-=x*48; timestamp+=x; } @@ -372,6 +379,7 @@ static uint8 ZNTable[256] = { static uint8 CycTable[256] = { +/* 0 1 2 3 4 5 6 7 8 9 a b c d e f */ /*0x00*/ 7,6,2,8,3,3,5,5,3,2,2,2,4,4,6,6, /*0x10*/ 2,5,2,8,4,4,6,6,2,4,2,7,4,4,7,7, /*0x20*/ 6,6,2,8,3,3,5,5,4,2,2,2,4,4,6,6, @@ -392,11 +400,13 @@ static uint8 CycTable[256] = void FASTAPASS(1) X6502_IRQBegin_c(int w) { + dprintf("IRQB %02x",w); _IRQlow|=w; } void FASTAPASS(1) X6502_IRQEnd_c(int w) { + dprintf("IRQE %02x",w); _IRQlow&=~w; } @@ -405,15 +415,6 @@ void TriggerIRQ_c(void) /* This function should probably be phased out. */ _IRQlow|=FCEU_IQTEMP; } -void TriggerNMINSF_c(void) -{ - ADDCYC(7); - PUSH(_PC>>8); - PUSH(_PC); - PUSH((_P&~B_FLAG)|(U_FLAG)); - _PC=0x3800; -} - void TriggerNMI_c(void) { _IRQlow|=FCEU_IQNMI; @@ -423,6 +424,7 @@ static void TriggerNMIReal(void) { if(!_jammed) { + dprintf("NMI"); ADDCYC(7); PUSH(_PC>>8); PUSH(_PC); @@ -441,6 +443,7 @@ void TriggerIRQReal(void) { if(!(_PI&I_FLAG) && !_jammed) { + dprintf("IRQ"); ADDCYC(7); PUSH(_PC>>8); PUSH(_PC); @@ -460,7 +463,6 @@ void X6502_Reset_c(void) { _PC=RdMem(0xFFFC); _PC|=RdMem(0xFFFD)<<8; - if(FCEUGameInfo.type==GIT_NSF) _PC=0x3830; _jammed=0; _PI=_P=I_FLAG; } @@ -499,17 +501,24 @@ void X6502_Run_c(void/*int32 cycles*/) TriggerIRQReal(); _IRQlow&=~(FCEU_IQTEMP|FCEU_IQNMI); - if(_count<=0) {_PI=_P;return;} /* Should increase accuracy without a */ - /* major speed hit. */ + if(_count<=0) + { +#ifdef DEBUG_ASM_6502 + if(MapIRQHook) mapirq_cyc_c = _tcount; + _tcount=0; +#endif + _PI=_P; + return; /* Should increase accuracy without a major speed hit. */ + } } _PI=_P; +#ifdef DEBUG_ASM_6502 + b1=RdMem(_PC++); _PC--; +#else b1=RdMem(_PC); - temp=CycTable[b1]; - ADDCYC(temp); - //temp=_tcount; - //_tcount=0; - - if(MapIRQHook) MapIRQHook(temp); +#endif + ADDCYC(CycTable[b1]); + temp=_tcount; temp*=48; @@ -530,7 +539,7 @@ void X6502_Run_c(void/*int32 cycles*/) { extern uint8 SIRQStat; SIRQStat|=0x80; - X6502_IRQBegin_c(FCEU_IQDPCM); + X6502_IRQBegin(FCEU_IQDPCM); } } } @@ -548,6 +557,16 @@ void X6502_Run_c(void/*int32 cycles*/) #include "ops.h" } + temp=_tcount; /* Gradius II (J) glitches if _tcount is not used */ + _tcount=0; + + if(MapIRQHook) { +#ifdef DEBUG_ASM_6502 + mapirq_cyc_c = temp; +#endif + MapIRQHook(temp); + } + #ifdef DEBUG_ASM_6502 _PI=_P; #endif