mapper fixes for ncpu, debug is broken atm
[fceu.git] / fce.c
diff --git a/fce.c b/fce.c
index 4c7ffc6..1d5b493 100644 (file)
--- a/fce.c
+++ b/fce.c
 #include       "crc32.h"
 #include        "ppu.h"
 
+#include        "movie.h"
+
 #define Pal     (PALRAM)
 
 
+#ifdef DEBUG_ASM_6502
+extern int cpu_repeat;
+extern int cpu_lastval;
+#endif
+
 static void (*RefreshLine)(uint8 *P, uint32 vofs) = NULL;
 static void PRefreshLine(void);
 
@@ -98,6 +105,71 @@ static readfunc *AReadG;
 static writefunc *BWriteG;
 static int RWWrap=0;
 
+#ifdef ASM_6502
+static void asmcpu_update(int32 cycles)
+{
+ // timestamp..
+ timestamp += ((cycles >> 4) * 43) >> 7; // aproximating /= 48
+
+ // some code from x6502.c
+ fhcnt-=cycles;
+ if(fhcnt<=0)
+ {
+  FrameSoundUpdate();
+  fhcnt+=fhinc;
+ }
+
+ if(PCMIRQCount>0)
+ {
+  PCMIRQCount-=cycles;
+  if(PCMIRQCount<=0)
+  {
+   vdis=1;
+   if((PSG[0x10]&0x80) && !(PSG[0x10]&0x40))
+   {
+    extern uint8 SIRQStat;
+    SIRQStat|=0x80;
+    X6502_IRQBegin(FCEU_IQDPCM);
+   }
+  }
+ }
+}
+
+void asmcpu_unpack(void)
+{
+       nes_registers[0] = X.A << 24;
+       nes_registers[1] = X.X;
+       nes_registers[2] = X.Y;
+       pc_base = 0;
+       nes_registers[3] = X.PC;
+       X6502_Rebase_a();
+       nes_registers[4] = X.S << 24;
+       nes_registers[4]|= X.IRQlow << 8;
+       nes_registers[7] = (uint32)X.count;
+
+       // NVUB DIZC
+       nes_registers[4]|= X.P & 0x5d;
+       nes_registers[5] = X.P << 24; // N
+       if (!(X.P&0x02)) nes_registers[5] |= 1; // Z
+}
+
+void asmcpu_pack(void)
+{
+       X.A = nes_registers[0] >> 24;
+       X.X = nes_registers[1];
+       X.Y = nes_registers[2];
+       X.PC= nes_registers[3] - pc_base;
+       X.S = nes_registers[4] >> 24;
+       X.IRQlow = nes_registers[4] >> 8;
+       X.count = (int32) nes_registers[7];
+
+       // NVUB DIZC
+       X.P = nes_registers[4] & 0x5d;
+       if (  nes_registers[5]&0x80000000)  X.P |= 0x80; // N
+       if (!(nes_registers[5]&0x000000ff)) X.P |= 0x02; // Z
+}
+#endif
+
 DECLFW(BNull)
 {
 
@@ -203,12 +275,13 @@ uint32 TempAddr,RefreshAddr;
 /* scanline is equal to the current visible scanline we're on. */
 
 int scanline;
-static uint32 scanlines_per_frame;
 
 uint8 GameMemBlock[131072] __attribute__ ((aligned (4)));
 uint8 NTARAM[0x800] __attribute__ ((aligned (4)));
 uint8 PALRAM[0x20] __attribute__ ((aligned (4)));
+#if !defined(ASM_6502) || defined(DEBUG_ASM_6502)
 uint8 RAM[0x800] __attribute__ ((aligned (4)));
+#endif
 
 uint8 PPU[4];
 uint8 PPUSPL;
@@ -243,9 +316,15 @@ static DECLFR(ARAMH)
 static DECLFR(A2002)
 {
                         uint8 ret;
+#ifdef DEBUG_ASM_6502
+       if (cpu_repeat) return cpu_lastval;
+#endif
                         ret = PPU_status;
                         vtoggle=0;
                         PPU_status&=0x7F;
+#ifdef DEBUG_ASM_6502
+//     cpu_lastval=ret|(PPUGenLatch&0x1F);
+#endif
                         return ret|(PPUGenLatch&0x1F);
 }
 
@@ -258,6 +337,9 @@ static DECLFR(A2007)
 {
                         uint8 ret;
                        uint32 tmp=RefreshAddr&0x3FFF;
+#ifdef DEBUG_ASM_6502
+       if (cpu_repeat) return cpu_lastval;
+#endif
 
                         PPUGenLatch=ret=VRAMBuffer;
                        if(PPU_hook) PPU_hook(tmp);
@@ -273,6 +355,9 @@ static DECLFR(A2007)
                         if (INC32) RefreshAddr+=32;
                         else RefreshAddr++;
                        if(PPU_hook) PPU_hook(RefreshAddr&0x3fff);
+#ifdef DEBUG_ASM_6502
+//     cpu_lastval=ret;
+#endif
                         return ret;
 }
 
@@ -936,28 +1021,54 @@ void ResetGameLoaded(void)
        FCEUGameInfo.inputfc=-1;
 }
 
+char lastLoadedGameName [2048];
+
 FCEUGI *FCEUI_LoadGame(char *name)
 {
+       char name2[512];
+       int have_movie = 0;
         int fp;
 
         Exit=1;
         ResetGameLoaded();
 
-       fp=FCEU_fopen(name,"rb");
+       strncpy(name2, name, sizeof(name2));
+       name2[sizeof(name2)-1] = 0;
+
+       fp=FCEU_fopen(name2,"rb");
        if(!fp)
         {
         FCEU_PrintError("Error opening \"%s\"!",name);
         return 0;
        }
 
-        GetFileBase(name);
-        if(iNESLoad(name,fp))
+        {
+        char *p = name2 + strlen(name2) - 4;
+        if (strcmp(p, ".fcm") == 0)
+        {
+         // movie detected
+         printf("movie detected\n");
+         FCEU_fclose(fp);
+         *p = 0;
+         fp=FCEU_fopen(name2,"rb");
+         if (!fp) {
+          printf("no ROM for movie\n");
+          return 0;
+         }
+         have_movie = 1;
+        }
+       }
+
+       strcpy(lastLoadedGameName, name2);
+
+        GetFileBase(name2);
+        if(iNESLoad(name2,fp))
          goto endlseq;
         if(NSFLoad(fp))
          goto endlseq;
-        if(FDSLoad(name,fp))
+        if(FDSLoad(name2,fp))
          goto endlseq;
-        if(UNIFLoad(name,fp))
+        if(UNIFLoad(name2,fp))
          goto endlseq;
 
         FCEU_PrintError("An error occurred while loading the file.");
@@ -986,6 +1097,9 @@ FCEUGI *FCEUI_LoadGame(char *name)
 
        FCEU_ResetPalette();
         Exit=0;
+
+       if (have_movie)
+               FCEUI_LoadMovie(name, 1);
         return(&FCEUGameInfo);
 }
 
@@ -1004,14 +1118,12 @@ void FCEU_ResetVidSys(void)
  if(w)
  {
   PAL=1;
-  scanlines_per_frame=312;
   FSettings.FirstSLine=FSettings.UsrFirstSLine[1];
   FSettings.LastSLine=FSettings.UsrLastSLine[1];
  }
  else
  {
   PAL=0;
-  scanlines_per_frame=262;
   FSettings.FirstSLine=FSettings.UsrFirstSLine[0];
   FSettings.LastSLine=FSettings.UsrLastSLine[0];
  }
@@ -1074,6 +1186,7 @@ void EmLoop(void)
 {
  for(;;)
  {
+  uint32 scanlines_per_frame = PAL ? 312 : 262;
        //extern int asdc;
        //printf("asdc: %i\n", asdc);
        //asdc=0;
@@ -1094,7 +1207,9 @@ void EmLoop(void)
   else if(VBlankON)
    TriggerNMI();
 
-  X6502_Run((scanlines_per_frame-242)*(256+85)-12);
+  X6502_Run(256+85-12);
+  for(scanline=242+1;scanline<scanlines_per_frame;scanline++)
+    X6502_Run(256+85);
 
   PPU_status&=0x1f;