#include "crc32.h"
#include "ppu.h"
+#include "movie.h"
+
#define Pal (PALRAM)
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)
{
/* 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;
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.");
FCEU_ResetPalette();
Exit=0;
+
+ if (have_movie)
+ FCEUI_LoadMovie(name, 1);
return(&FCEUGameInfo);
}
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];
}
{
for(;;)
{
+ uint32 scanlines_per_frame = PAL ? 312 : 262;
//extern int asdc;
//printf("asdc: %i\n", asdc);
//asdc=0;
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;