#include "types.h"
#include "x6502.h"
#include "fce.h"
+#include "fceu098.h"
#include "sound.h"
-#include "svga.h"
+#include "svga.h"
#include "netplay.h"
#include "general.h"
#include "endian.h"
#include "file.h"
#include "crc32.h"
#include "ppu.h"
+#include "ppu098.h"
#include "palette.h"
#include "movie.h"
#include "dprintf.h"
-#ifdef GP2X
-#include "drivers/gp2x/asmutils.h"
+#ifdef __arm__
+#include "drivers/arm/asmutils.h"
#endif
#define Pal (PALRAM)
uint64 timestampbase=0;
-static int ppudead=1;
-static int kook=0;
+int ppudead=1;
+int kook=0;
int MMC5Hack;
uint32 MMC5HackVROMMask;
static int RWWrap=0;
#ifdef ASM_6502
+#ifdef DEBUG_ASM_6502
+extern uint8 nes_internal_ram[0x800];
+#else
static void asmcpu_update(int32 cycles)
{
// some code from x6502.c
}
}
}
+#endif
void asmcpu_unpack(void)
{
nes_registers[4]|= X.P & 0x5d;
nes_registers[5] = X.P << 24; // N
if (!(X.P&0x02)) nes_registers[5] |= 1; // Z
+
+#ifdef DEBUG_ASM_6502
+ memcpy(nes_internal_ram, RAM, 0x800);
+#endif
}
void asmcpu_pack(void)
DECLFR(ANull)
{
+ //printf("open [%04x] %02x @ %04x (%04x)\n", A, X.DB, X.PC, X.PC&0x7ff);
return(X.DB);
}
return;
}
- if(scanline < FSettings.FirstSLine || scanline > FSettings.LastSLine)
+ if(!ScreenON)
+ {
+ tem=Pal[0]|0x40;
+ tem|=tem << 8;
+ tem|=tem << 16;
+ FCEU_dwmemset(target,tem,256);
+ }
+ else if(scanline < FSettings.FirstSLine || scanline > FSettings.LastSLine)
{
if(PPU_hook)
PRefreshLine();
}
else
{
- if(ScreenON)
- {
- BGRender(target);
- }
- else
- {
- tem=Pal[0]|0x40;
- tem|=tem << 8;
- tem|=tem << 16;
- FCEU_dwmemset(target,tem,256);
- }
+ BGRender(target);
}
if(InputScanlineHook)
static void LineUpdateEnd(uint8 *target)
{
-#ifdef GP2X
+#ifdef __arm__
if(ScreenON || SpriteON) // Yes, very el-cheapo.
{
if(PPU[1]&0x01)
FCEUGameInfo.vidsys=GIV_USER;
FCEUGameInfo.input[0]=FCEUGameInfo.input[1]=-1;
FCEUGameInfo.inputfc=-1;
+
+ FCEUGameInfo.soundchan=0;
+ FCEUGameInfo.soundrate=0;
+ FCEUGameInfo.cspecial=0;
}
char lastLoadedGameName [2048];
FCEUGI *FCEUI_LoadGame(char *name)
{
char name2[512];
- int have_movie = 0;
+ int have_movie = 0, have_ips = 0;
int fp;
//Exit=1;
{
char *p = name2 + strlen(name2) - 4;
- if (strcmp(p, ".fcm") == 0)
+ if (strcasecmp(p, ".fcm") == 0) printf("movie detected\n"), have_movie = 1;
+ if (strcasecmp(p, ".ips") == 0) printf("ips detected\n"), have_ips = 1;
+ if (have_movie || have_ips)
{
// movie detected
- printf("movie detected\n");
FCEU_fclose(fp);
*p = 0;
fp=FCEU_fopen(name2,"rb");
- if (!fp && p - name2 > 2) p[-2] = 0;
- fp=FCEU_fopen(name2,"rb");
+ if (!fp && p - name2 > 2)
+ {
+ for (p--; p > name2 && *p != '.'; p--);
+ *p = 0;
+ fp=FCEU_fopen(name2,"rb");
+ }
if (!fp) {
- printf("no ROM for movie\n");
+ printf("no ROM for ips/movie\n");
LoadGameLastError = 2;
return 0;
}
- have_movie = 1;
}
}
+ // do IPS patch
+ if (have_ips)
+ {
+ FCEU_fclose(fp);
+ FILE *ips = fopen(name, "rb");
+ if (!ips) return 0;
+ fp=FCEU_fopen_forcemem(name2);
+ if (!fp) { fclose(ips); return 0; }
+ ApplyIPS(ips, fp); // closes ips
+ }
+
GetFileBase(name2);
if(iNESLoad(name2,fp))
goto endlseq;
FSettings.UsrFirstSLine[1]=0;
FSettings.UsrLastSLine[0]=FSettings.UsrLastSLine[1]=239;
FSettings.SoundVolume=100;
+
+ FCEUI_Initialize098();
+ FCEUI_SetEmuMode(0);
+
return 1;
}
+void FCEUI_Kill(void)
+{
+ FCEU_KillGenie();
+}
+
+static void EmLoop(void);
+
+int use098code = 0;
+void (*ResetNES)(void) = 0;
+void (*FCEUI_Emulate)(void) = 0;
+
+void FCEUI_SetEmuMode(int is_new)
+{
+ use098code = is_new;
+ if (is_new)
+ {
+ ResetNES=ResetNES098;
+ FCEUI_Emulate=FCEUI_Emulate098;
+ }
+ else
+ {
+ ResetNES=ResetNES081;
+ FCEUI_Emulate=EmLoop;
+ }
+}
+
void MMC5_hb(int); /* Ugh ugh ugh. */
static void DoLine(void)
{
}
-void EmLoop(void)
+static void EmLoop(void)
{
for(;;)
{
if(ppudead) /* Needed for Knight Rider, possibly others. */
{
//memset(XBuf, 0, 320*240);
- X6502_Run(scanlines_per_frame*(256+85));
+ //X6502_Run(scanlines_per_frame*(256+85));
+ int lines;
+ for (lines=scanlines_per_frame;lines;lines--)
+ X6502_Run(256+85);
ppudead--;
goto update;
}
} // for
}
-#ifdef FPS
-#include <sys/time.h>
-uint64 frcount;
-#endif
-void FCEUI_Emulate(void)
-{
- #ifdef FPS
- uint64 starttime,end;
- struct timeval tv;
- frcount=0;
- gettimeofday(&tv,0);
- starttime=((uint64)tv.tv_sec*1000000)+tv.tv_usec;
- #endif
- EmLoop();
-
- #ifdef FPS
- // Probably won't work well on Windows port; for
- // debugging/speed testing.
- {
- uint64 w;
- int i,frac;
- gettimeofday(&tv,0);
- end=((uint64)tv.tv_sec*1000000)+tv.tv_usec;
- w=frcount*10000000000LL/(end-starttime);
- i=w/10000;
- frac=w-i*10000;
- printf("Average FPS: %d.%04d\n",i,frac);
- }
- #endif
-
-}
-
void FCEUI_CloseGame(void)
{
Exit=1;
ResetPPU();
}
-void ResetNES(void)
+void ResetNES081(void)
{
if(!GameLoaded) return;
GameInterface(GI_RESETM2, 0);
X6502_Reset();
}
+#ifndef DEBUG_ASM_6502
static void FCEU_MemoryRand(uint8 *ptr, uint32 size)
{
int x=0;
ptr++;
}
}
+#endif
void PowerNES(void)
{
FCEU_MemoryRand(RAM,0x800);
#else
memset(RAM,0x00,0x800);
+ memset(nes_internal_ram,0x00,0x800);
#endif
ResetMapping();
PowerSound();
PowerPPU();
+
+ if (use098code)
+ FCEUPPU_Power();
+
+ /* Have the external game hardware "powered" after the internal NES stuff.
+ Needed for the NSF code and VS System code.
+ */
GameInterface(GI_POWER, 0);
if(FCEUGameInfo.type==GIT_VSUNI)
FCEU_VSUniPower();