X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=fceu.git;a=blobdiff_plain;f=x6502.c;h=c8c0032c95d6b20df519f5cb5701a26cca747881;hp=c1e55b35ab38f9142f5bd15de8c686de66303f8c;hb=370cff9a997d3bbdb65602b597a1a10e1e9a1542;hpb=937bf65b1c80e9394547e5f105664bd26f3671de diff --git a/x6502.c b/x6502.c index c1e55b3..c8c0032 100644 --- a/x6502.c +++ b/x6502.c @@ -26,9 +26,23 @@ #include "sound.h" #include "cart.h" +#ifdef DEBUG_ASM_6502 +#include +#include +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 @@ -37,7 +51,7 @@ void FP_FASTAPASS(1) (*MapIRQHook)(int a); #define _S X.S #define _P X.P #define _PI X.mooPI -#define _PZ X.PZ +//#define _PZ X.PZ // unused? #define _DB X.DB #define _count X.count #define _tcount X.tcount @@ -59,7 +73,15 @@ static INLINE uint8 RdMem(unsigned int A) return (_DB=RAM[A&0x7FF]); } #endif - return((_DB=ARead[A](A))); + _DB=ARead[A](A); +#ifdef DEBUG_ASM_6502 + //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 (dread_count_c > 4) { printf("dread_count out of range\n"); exit(1); } + } +#endif + return _DB; } static INLINE void WrMem(unsigned int A, uint8 V) @@ -69,6 +91,10 @@ static INLINE void WrMem(unsigned int A, uint8 V) return; } BWrite[A](A,V); +#ifdef DEBUG_ASM_6502 + dwrites_c[dwrite_count_c++] = (A<<8)|V; + if (dwrite_count_c > 2) { printf("dwrite_count_c out of range\n"); exit(1); } +#endif } static INLINE uint8 RdRAM(unsigned int A) @@ -83,12 +109,12 @@ static INLINE void WrRAM(unsigned int A, uint8 V) static INLINE void ADDCYC(int x) { - //_tcount+=x; + _tcount+=x; _count-=x*48; timestamp+=x; } -void FASTAPASS(1) X6502_AddCycles(int x) +void FASTAPASS(1) X6502_AddCycles_c(int x) { ADDCYC(x); } @@ -130,7 +156,7 @@ static uint8 ZNTable[256] = { //#define X_ZN(zort) _P&=~(Z_FLAG|N_FLAG);_P|=ZNTable[zort] //#define X_ZNT(zort) _P|=ZNTable[zort] #define X_ZN(zort) _P&=~(Z_FLAG|N_FLAG);if(!zort) _P|=Z_FLAG;else _P|=zort&N_FLAG -#define X_ZNT(zort) if(!zort) _P|=Z_FLAG;else _P|=zort&N_FLAG +#define X_ZNT(zort) if(!zort) _P|=Z_FLAG;else _P|=(zort&N_FLAG) /* Care must be taken if you want to turn this into a macro. Use { and }. */ #define JR(); \ @@ -241,7 +267,7 @@ static uint8 ZNTable[256] = { if((target^tmp)&0x100) \ { \ target&=0xFFFF; \ - RdMem(target^0x100); \ + DummyRdMem(target^0x100); \ ADDCYC(1); \ } \ } @@ -254,7 +280,7 @@ static uint8 ZNTable[256] = { target=rt; \ target+=i; \ target&=0xFFFF; \ - RdMem((target&0x00FF)|(rt&0xFF00)); \ + DummyRdMem((target&0x00FF)|(rt&0xFF00)); \ } /* Zero Page */ @@ -292,7 +318,7 @@ static uint8 ZNTable[256] = { if((target^rt)&0x100) \ { \ target&=0xFFFF; \ - RdMem(target^0x100); \ + DummyRdMem(target^0x100); \ ADDCYC(1); \ } \ } @@ -307,7 +333,7 @@ static uint8 ZNTable[256] = { rt|=RdRAM(tmp)<<8; \ target=rt; \ target+=_Y; \ - RdMem((target&0x00FF)|(rt&0xFF00)); \ + DummyRdMem((target&0x00FF)|(rt&0xFF00)); \ } /* Now come the macros to wrap up all of the above stuff addressing mode functions @@ -366,22 +392,22 @@ static uint8 CycTable[256] = /*0xF0*/ 2,5,2,8,4,4,6,6,2,4,2,7,4,4,7,7, }; -void FASTAPASS(1) X6502_IRQBegin(int w) +void FASTAPASS(1) X6502_IRQBegin_c(int w) { _IRQlow|=w; } -void FASTAPASS(1) X6502_IRQEnd(int w) +void FASTAPASS(1) X6502_IRQEnd_c(int w) { _IRQlow&=~w; } -void TriggerIRQ(void) /* This function should probably be phased out. */ +void TriggerIRQ_c(void) /* This function should probably be phased out. */ { _IRQlow|=FCEU_IQTEMP; } -void TriggerNMINSF(void) +void TriggerNMINSF_c(void) { ADDCYC(7); PUSH(_PC>>8); @@ -390,7 +416,7 @@ void TriggerNMINSF(void) _PC=0x3800; } -void TriggerNMI(void) +void TriggerNMI_c(void) { _IRQlow|=FCEU_IQNMI; } @@ -402,9 +428,14 @@ static void TriggerNMIReal(void) ADDCYC(7); PUSH(_PC>>8); PUSH(_PC); - PUSH((_P&~B_FLAG)|(U_FLAG)); + _P&=~B_FLAG; + PUSH(_P|U_FLAG); _PC=RdMem(0xFFFA); _PC|=RdMem(0xFFFB)<<8; +#ifdef DEBUG_ASM_6502 + PC_prev = _PC; + OP_prev = 0x100; +#endif } } @@ -415,14 +446,19 @@ void TriggerIRQReal(void) ADDCYC(7); PUSH(_PC>>8); PUSH(_PC); - PUSH((_P&~B_FLAG)|(U_FLAG)); + _P&=~B_FLAG; + PUSH(_P|U_FLAG); _P|=I_FLAG; _PC=RdMem(0xFFFE); _PC|=RdMem(0xFFFF)<<8; +#ifdef DEBUG_ASM_6502 + PC_prev = _PC; + OP_prev = 0x101; +#endif } } -void X6502_Reset(void) +void X6502_Reset_c(void) { _PC=RdMem(0xFFFC); _PC|=RdMem(0xFFFD)<<8; @@ -431,17 +467,16 @@ void X6502_Reset(void) _PI=_P=I_FLAG; } -void X6502_Power(void) +void X6502_Power_c(void) { memset((void *)&X,0,sizeof(X)); timestamp=0; - X6502_Reset(); + X6502_Reset_c(); } //int asdc = 0; - -void X6502_Run_(void/*int32 cycles*/) +void X6502_Run_c(void/*int32 cycles*/) { /* if(PAL) @@ -466,16 +501,20 @@ void X6502_Run_(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; b1=RdMem(_PC); - temp=CycTable[b1]; - ADDCYC(temp); - //temp=_tcount; - //_tcount=0; - if(MapIRQHook) MapIRQHook(temp); + ADDCYC(CycTable[b1]); + temp=_tcount; temp*=48; @@ -486,7 +525,6 @@ void X6502_Run_(void/*int32 cycles*/) fhcnt+=fhinc; } - if(PCMIRQCount>0) { PCMIRQCount-=temp; @@ -497,10 +535,15 @@ void X6502_Run_(void/*int32 cycles*/) { extern uint8 SIRQStat; SIRQStat|=0x80; - X6502_IRQBegin(FCEU_IQDPCM); + X6502_IRQBegin_c(FCEU_IQDPCM); } } } + +#ifdef DEBUG_ASM_6502 + PC_prev = _PC; + OP_prev = b1; +#endif //printf("$%04x:$%02x\n",_PC,b1); //_PC++; //printf("$%02x\n",b1); @@ -509,6 +552,20 @@ void X6502_Run_(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 } }