X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=fceu.git;a=blobdiff_plain;f=x6502.c;h=b428056abe14746dfa6757ac905a0fc9d553a233;hp=cb0d76110d37deeee6a4bb3398d86231b66d89a2;hb=81bd66a11186efb420eb8d6fd5766f0ef26d5919;hpb=92e249b10ad9e479eddb18974555366dba725ef3 diff --git a/x6502.c b/x6502.c index cb0d761..b428056 100644 --- a/x6502.c +++ b/x6502.c @@ -26,6 +26,18 @@ #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; +#define DummyRdMem(...) +#else +#define DummyRdMem RdMem +#endif + X6502 X; uint32 timestamp; void FP_FASTAPASS(1) (*MapIRQHook)(int a); @@ -59,7 +71,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 +89,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) @@ -130,7 +154,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 +265,7 @@ static uint8 ZNTable[256] = { if((target^tmp)&0x100) \ { \ target&=0xFFFF; \ - RdMem(target^0x100); \ + DummyRdMem(target^0x100); \ ADDCYC(1); \ } \ } @@ -254,7 +278,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 +316,7 @@ static uint8 ZNTable[256] = { if((target^rt)&0x100) \ { \ target&=0xFFFF; \ - RdMem(target^0x100); \ + DummyRdMem(target^0x100); \ ADDCYC(1); \ } \ } @@ -307,7 +331,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 @@ -402,9 +426,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,10 +444,15 @@ 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 } } @@ -440,7 +474,6 @@ void X6502_Power_c(void) //int asdc = 0; - void X6502_Run_c(void/*int32 cycles*/) { /* @@ -502,6 +535,10 @@ void X6502_Run_c(void/*int32 cycles*/) } } +#ifdef DEBUG_ASM_6502 + PC_prev = _PC; + OP_prev = b1; +#endif //printf("$%04x:$%02x\n",_PC,b1); //_PC++; //printf("$%02x\n",b1);