notaz.gp2x.de
/
fceu.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
mapper fixes for ncpu, debug is broken atm
[fceu.git]
/
x6502.c
diff --git
a/x6502.c
b/x6502.c
index
c1e55b3
..
81eb56e
100644
(file)
--- a/
x6502.c
+++ b/
x6502.c
@@
-26,6
+26,11
@@
#include "sound.h"
#include "cart.h"
#include "sound.h"
#include "cart.h"
+#ifdef DEBUG_ASM_6502
+extern uint32 PC_prev, OP_prev;
+extern int cpu_lastval;
+#endif
+
X6502 X;
uint32 timestamp;
void FP_FASTAPASS(1) (*MapIRQHook)(int a);
X6502 X;
uint32 timestamp;
void FP_FASTAPASS(1) (*MapIRQHook)(int a);
@@
-37,7
+42,7
@@
void FP_FASTAPASS(1) (*MapIRQHook)(int a);
#define _S X.S
#define _P X.P
#define _PI X.mooPI
#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
#define _DB X.DB
#define _count X.count
#define _tcount X.tcount
@@
-59,7
+64,16
@@
static INLINE uint8 RdMem(unsigned int A)
return (_DB=RAM[A&0x7FF]);
}
#endif
return (_DB=RAM[A&0x7FF]);
}
#endif
- return((_DB=ARead[A](A)));
+ _DB=ARead[A](A);
+#ifdef DEBUG_ASM_6502
+ // TODO: read counter, not 0x10000..
+ if (cpu_lastval)
+ cpu_lastval|=_DB<<8;
+ else
+ cpu_lastval=_DB|0x10000;
+ printf("read [%04x] %02x, cpu_lastval=%02x\n", A, _DB, cpu_lastval);
+#endif
+ return _DB;
}
static INLINE void WrMem(unsigned int A, uint8 V)
}
static INLINE void WrMem(unsigned int A, uint8 V)
@@
-88,7
+102,7
@@
static INLINE void ADDCYC(int x)
timestamp+=x;
}
timestamp+=x;
}
-void FASTAPASS(1) X6502_AddCycles(int x)
+void FASTAPASS(1) X6502_AddCycles
_c
(int x)
{
ADDCYC(x);
}
{
ADDCYC(x);
}
@@
-130,7
+144,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_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(); \
/* Care must be taken if you want to turn this into a macro. Use { and }. */
#define JR(); \
@@
-366,22
+380,22
@@
static uint8 CycTable[256] =
/*0xF0*/ 2,5,2,8,4,4,6,6,2,4,2,7,4,4,7,7,
};
/*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;
}
{
_IRQlow|=w;
}
-void FASTAPASS(1) X6502_IRQEnd(int w)
+void FASTAPASS(1) X6502_IRQEnd
_c
(int w)
{
_IRQlow&=~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;
}
{
_IRQlow|=FCEU_IQTEMP;
}
-void TriggerNMINSF(void)
+void TriggerNMINSF
_c
(void)
{
ADDCYC(7);
PUSH(_PC>>8);
{
ADDCYC(7);
PUSH(_PC>>8);
@@
-390,7
+404,7
@@
void TriggerNMINSF(void)
_PC=0x3800;
}
_PC=0x3800;
}
-void TriggerNMI(void)
+void TriggerNMI
_c
(void)
{
_IRQlow|=FCEU_IQNMI;
}
{
_IRQlow|=FCEU_IQNMI;
}
@@
-402,9
+416,14
@@
static void TriggerNMIReal(void)
ADDCYC(7);
PUSH(_PC>>8);
PUSH(_PC);
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;
_PC=RdMem(0xFFFA);
_PC|=RdMem(0xFFFB)<<8;
+#ifdef DEBUG_ASM_6502
+ PC_prev = _PC;
+ OP_prev = 0x100;
+#endif
}
}
}
}
@@
-415,14
+434,19
@@
void TriggerIRQReal(void)
ADDCYC(7);
PUSH(_PC>>8);
PUSH(_PC);
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;
_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;
{
_PC=RdMem(0xFFFC);
_PC|=RdMem(0xFFFD)<<8;
@@
-431,17
+455,16
@@
void X6502_Reset(void)
_PI=_P=I_FLAG;
}
_PI=_P=I_FLAG;
}
-void X6502_Power(void)
+void X6502_Power
_c
(void)
{
memset((void *)&X,0,sizeof(X));
timestamp=0;
{
memset((void *)&X,0,sizeof(X));
timestamp=0;
- X6502_Reset();
+ X6502_Reset
_c
();
}
//int asdc = 0;
}
//int asdc = 0;
-
-void X6502_Run_(void/*int32 cycles*/)
+void X6502_Run_c(void/*int32 cycles*/)
{
/*
if(PAL)
{
/*
if(PAL)
@@
-475,6
+498,7
@@
void X6502_Run_(void/*int32 cycles*/)
ADDCYC(temp);
//temp=_tcount;
//_tcount=0;
ADDCYC(temp);
//temp=_tcount;
//_tcount=0;
+
if(MapIRQHook) MapIRQHook(temp);
temp*=48;
if(MapIRQHook) MapIRQHook(temp);
temp*=48;
@@
-486,7
+510,6
@@
void X6502_Run_(void/*int32 cycles*/)
fhcnt+=fhinc;
}
fhcnt+=fhinc;
}
-
if(PCMIRQCount>0)
{
PCMIRQCount-=temp;
if(PCMIRQCount>0)
{
PCMIRQCount-=temp;
@@
-497,10
+520,16
@@
void X6502_Run_(void/*int32 cycles*/)
{
extern uint8 SIRQStat;
SIRQStat|=0x80;
{
extern uint8 SIRQStat;
SIRQStat|=0x80;
- X6502_IRQBegin(FCEU_IQDPCM);
+ X6502_IRQBegin
_c
(FCEU_IQDPCM);
}
}
}
}
}
}
+
+#ifdef DEBUG_ASM_6502
+ PC_prev = _PC;
+ OP_prev = b1;
+ cpu_lastval = 0;
+#endif
//printf("$%04x:$%02x\n",_PC,b1);
//_PC++;
//printf("$%02x\n",b1);
//printf("$%04x:$%02x\n",_PC,b1);
//_PC++;
//printf("$%02x\n",b1);
@@
-509,6
+538,10
@@
void X6502_Run_(void/*int32 cycles*/)
{
#include "ops.h"
}
{
#include "ops.h"
}
+
+#ifdef DEBUG_ASM_6502
+ _PI=_P;
+#endif
}
}
}
}