Blaster Master + other fixes
[fceu.git] / fce.c
diff --git a/fce.c b/fce.c
index 64bb8dc..3cb0632 100644 (file)
--- a/fce.c
+++ b/fce.c
 #include       "crc32.h"
 #include        "ppu.h"
 
-#define Pal     (PALRAM)
+#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);
@@ -107,7 +104,7 @@ static int RWWrap=0;
 static void asmcpu_update(int32 cycles)
 {
  // timestamp..
- timestamp += ((cycles >> 4) * 43) >> 7; // aproximating /= 48
//timestamp += ((cycles >> 4) * 43) >> 7; // aproximating /= 48
 
  // some code from x6502.c
  fhcnt-=cycles;
@@ -140,10 +137,10 @@ void asmcpu_unpack(void)
        nes_registers[2] = X.Y;
        pc_base = 0;
        nes_registers[3] = X.PC;
-       X6502_rebase_a();
+       X6502_Rebase_a();
        nes_registers[4] = X.S << 24;
        nes_registers[4]|= X.IRQlow << 8;
-       nes_registers[7] = (uint32)X.count;
+       nes_registers[7] = (uint32)X.count << 16;
 
        // NVUB DIZC
        nes_registers[4]|= X.P & 0x5d;
@@ -159,7 +156,7 @@ void asmcpu_pack(void)
        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];
+       X.count = (int32) nes_registers[7] >> 16;
 
        // NVUB DIZC
        X.P = nes_registers[4] & 0x5d;
@@ -314,15 +311,9 @@ 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);
 }
 
@@ -335,9 +326,6 @@ 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);
@@ -353,9 +341,6 @@ 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;
 }
 
@@ -481,16 +466,9 @@ static DECLFW(B4014)
 {
        uint32 t=V<<8;
        int x;
-#ifdef DEBUG_ASM_6502
-  if (cpu_repeat) { X6502_AddCycles_a(512); return; }
-       for(x=0;x<256;x++)
-        B2004(0x2004,X.DB=ARead[t+x](t+x));
-       X6502_AddCycles_c(512);
-#else
        for(x=0;x<256;x++)
         B2004(0x2004,X.DB=ARead[t+x](t+x));
        X6502_AddCycles(512);
-#endif
 }
 
 void BGRender(uint8 *target)
@@ -1026,28 +1004,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.");
@@ -1076,6 +1080,9 @@ FCEUGI *FCEUI_LoadGame(char *name)
 
        FCEU_ResetPalette();
         Exit=0;
+
+       if (have_movie)
+               FCEUI_LoadMovie(name, 1);
         return(&FCEUGameInfo);
 }
 
@@ -1183,9 +1190,15 @@ void EmLoop(void)
   else if(VBlankON)
    TriggerNMI();
 
-  X6502_Run(256+85-12);
-  for(scanline=242+1;scanline<scanlines_per_frame;scanline++)
-    X6502_Run(256+85);
+  // Note: this is needed for asm core
+  // Warning: using 'scanline' var here breaks Castlevania III
+  {
+   int lines;
+   X6502_Run(256+85-12);
+   for (lines=scanlines_per_frame-242-1;lines;lines--)
+     X6502_Run(256+85);
+  }
+  // X6502_Run((scanlines_per_frame-242)*(256+85)-12);
 
   PPU_status&=0x1f;
 
@@ -1336,8 +1349,6 @@ void PowerNES(void)
 
         GeniePower();
 
-printf("X.DB offs: %02x\n", (int)&X.DB - (int)&X);
-
         memset(RAM,0x00,0x800);
         ResetMapping();
        GameInterface(GI_POWER);