Blaster Master + other fixes
[fceu.git] / x6502.h
diff --git a/x6502.h b/x6502.h
index 48843fc..3216d50 100644 (file)
--- a/x6502.h
+++ b/x6502.h
@@ -24,7 +24,7 @@ typedef struct {
         uint16 PC;             /* I'll change this to uint32 later... */
                                /* I'll need to AND PC after increments to 0xFFFF */
                                /* when I do, though.  Perhaps an IPC() macro? */
-        uint8 A,X,Y,S,P,mooPI,PZ;
+        uint8 A,X,Y,S,P,mooPI;
         uint8 DB;               /* Data bus "cache" for reads from certain areas */
        uint8 IRQlow;           /* Simulated IRQ pin held low(or is it high?). */
        uint8 jammed;
@@ -63,6 +63,7 @@ extern void FP_FASTAPASS(1) (*MapIRQHook)(int a);
 #define X6502_AddCycles X6502_AddCycles_d
 #define X6502_IRQBegin X6502_IRQBegin_d
 #define X6502_IRQEnd X6502_IRQEnd_d
+#define X6502_Rebase X6502_Rebase_d
 #define X6502_C
 #define X6502_A
 #define X6502_D
@@ -76,18 +77,34 @@ extern void FP_FASTAPASS(1) (*MapIRQHook)(int a);
 #define X6502_AddCycles X6502_AddCycles_a
 #define X6502_IRQBegin X6502_IRQBegin_a
 #define X6502_IRQEnd X6502_IRQEnd_a
+#define X6502_Rebase X6502_Rebase_a
 #define X6502_A
 
-extern uint32 nes_registers[0x10];
 #define X6502_Run(c) \
 { \
  int32 cycles = (c) << 4; /* *16 */ \
  if (PAL) cycles -= (c);  /* *15 */ \
- nes_registers[7]+=cycles; \
- if (nes_registers[7] > 0) X6502_Run_a(); \
+ nes_registers[7]+=cycles<<16; \
+ cycles=(int32)nes_registers[7]>>16; \
+ if (cycles > 0) { \
+   X6502_Run_a(); \
+   cycles -= (int32)nes_registers[7]>>16; \
+   asmcpu_update(cycles); \
+ } \
 }
 
 #else
+#define TriggerIRQ TriggerIRQ_c
+#define TriggerNMI TriggerNMI_c
+#define TriggerNMINSF TriggerNMINSF_c
+#define X6502_Reset X6502_Reset_c
+#define X6502_Power X6502_Power_c
+#define X6502_AddCycles X6502_AddCycles_c
+#define X6502_IRQBegin X6502_IRQBegin_c
+#define X6502_IRQEnd X6502_IRQEnd_c
+#define X6502_Rebase(...)
+#define X6502_C
+
 #define X6502_Run(c) \
 { \
  int32 cycles = (c) << 4; /* *16 */ \
@@ -113,6 +130,8 @@ void FASTAPASS(1) X6502_IRQEnd_c(int w);
 
 // asm
 #ifdef X6502_A
+extern uint32 nes_registers[0x10];
+extern uint32 pc_base;
 void TriggerIRQ_a(void);
 void TriggerNMI_a(void);
 void TriggerNMINSF_a(void);
@@ -122,6 +141,7 @@ void X6502_Power_a(void);
 void X6502_AddCycles_a(int x);
 void X6502_IRQBegin_a(int w);
 void X6502_IRQEnd_a(int w);
+void X6502_Rebase_a(void);
 #endif
 
 // debug
@@ -135,5 +155,6 @@ void X6502_Power_d(void);
 void X6502_AddCycles_d(int x);
 void X6502_IRQBegin_d(int w);
 void X6502_IRQEnd_d(int w);
+void X6502_Rebase_d(void);
 #endif