mirror of
https://github.com/RaySollium99/picodrive.git
synced 2025-09-05 15:27:46 -04:00
244 lines
5 KiB
C++
244 lines
5 KiB
C++
#include "app.h"
|
|
#include "FileMenu.h"
|
|
|
|
// sram
|
|
struct PicoSRAM
|
|
{
|
|
unsigned char *data; // actual data
|
|
unsigned int start; // start address in 68k address space
|
|
unsigned int end;
|
|
unsigned char resize; // 1=SRAM size changed and needs to be reallocated on PicoReset
|
|
unsigned char reg_back; // copy of Pico.m.sram_reg to set after reset
|
|
unsigned char changed;
|
|
unsigned char pad;
|
|
};
|
|
|
|
extern "C" PicoSRAM SRam;
|
|
extern char *romname;
|
|
int fastForward=0;
|
|
int frameStep=0;
|
|
|
|
char LoopQuit=0;
|
|
static FILE *DebugFile=NULL;
|
|
int LoopMode=0;
|
|
static void UpdateSound();
|
|
|
|
int LoopInit()
|
|
{
|
|
int ret=0;
|
|
|
|
// bits LSb->MSb:
|
|
// enable_ym2612&dac, enable_sn76496, enable_z80, stereo_sound;
|
|
// alt_renderer, 6button_gamepad, accurate_timing, accurate_sprites
|
|
PicoOpt=0x1f;
|
|
PsndRate=44100;
|
|
//PsndLen=PsndRate/60; // calculated later by pico itself
|
|
|
|
// Init Direct3D:
|
|
ret=DirectInit(); if (ret) return 1;
|
|
InputInit();
|
|
|
|
// Init DirectSound:
|
|
//DSoundInit();
|
|
|
|
ret=EmuInit(); if (ret) return 1;
|
|
FileMenu.init();
|
|
|
|
LoopMode=8;
|
|
PicoWriteSound = UpdateSound;
|
|
|
|
return 0;
|
|
}
|
|
|
|
void preLoopInit()
|
|
{
|
|
romname[strlen(romname)-3] = 0;
|
|
strcat(romname, "srm");
|
|
int sram_size = SRam.end-SRam.start+1;
|
|
if(SRam.reg_back & 4) sram_size=0x2000;
|
|
FILE *f = fopen(romname, "rb");
|
|
if(f && SRam.data)
|
|
fread(SRam.data, 1, sram_size, f);
|
|
if(f) fclose(f);
|
|
}
|
|
|
|
extern "C" char *debugString();
|
|
|
|
void LoopExit()
|
|
{
|
|
dprintf(debugString());
|
|
|
|
romname[strlen(romname)-3] = 0;
|
|
strcat(romname, "srm");
|
|
int sram_size = SRam.end-SRam.start+1;
|
|
if(SRam.reg_back & 4) sram_size=0x2000;
|
|
for(; sram_size > 0; sram_size--)
|
|
if(SRam.data[sram_size-1]) break;
|
|
if(sram_size) {
|
|
FILE *f = fopen(romname, "wb");
|
|
if(f) {
|
|
fwrite(SRam.data, 1, sram_size, f);
|
|
fclose(f);
|
|
}
|
|
}
|
|
|
|
FileMenu.exit();
|
|
EmuExit();
|
|
DSoundExit(); PsndLen=0;
|
|
InputExit();
|
|
DirectExit();
|
|
|
|
if (DebugFile) fclose(DebugFile);
|
|
DebugFile=NULL;
|
|
}
|
|
|
|
// ----------------------------------------------------------------
|
|
|
|
int emu_frame = 0;
|
|
|
|
static int DoGame()
|
|
{
|
|
if(fastForward) { PicoSkipFrame+=1; PicoSkipFrame&=7; }
|
|
else PicoSkipFrame=0;
|
|
|
|
if(frameStep==1) return 0;
|
|
else if(frameStep==3) frameStep=1;
|
|
|
|
EmuFrame();
|
|
emu_frame++;
|
|
|
|
if (Inp.held[7]==1) LoopMode=2; // Right thumb = Toggle Menu
|
|
|
|
return 0;
|
|
}
|
|
// ----------------------------------------------------------------
|
|
|
|
static int MenuUpdate()
|
|
{
|
|
int delta=0;
|
|
|
|
if (Inp.repeat[0]) delta-=0x100;
|
|
if (Inp.repeat[1]) delta+=0x100;
|
|
|
|
if (Inp.button[14]>30) delta-=Inp.button[14]-30;
|
|
if (Inp.button[15]>30) delta+=Inp.button[15]-30;
|
|
|
|
if (delta) FileMenu.scroll(delta);
|
|
|
|
if (Inp.held[8]==1 || Inp.held[10]==1 || Inp.held[4]==1) // A, X or Start
|
|
{
|
|
//RomFree();
|
|
//FileMenu.getFilePath(RomName);
|
|
//RomLoad();
|
|
//LoopMode=8; // Go to game
|
|
}
|
|
|
|
if (Inp.held[7]==1) LoopMode=8; // Right thumb = Toggle Menu
|
|
|
|
return 0;
|
|
}
|
|
|
|
static int MenuRender()
|
|
{
|
|
WCHAR text[80]={0};
|
|
wsprintfW(text,L"%.40S v%x.%.3x",AppName,PicoVer>>12,PicoVer&0xfff);
|
|
FontSetColour(0x60c0ff);
|
|
FontText(text,64,48);
|
|
|
|
FileMenu.render();
|
|
|
|
return 0;
|
|
}
|
|
|
|
// ----------------------------------------------------------------
|
|
|
|
static int ModeUpdate()
|
|
{
|
|
if (Inp.held[14] && Inp.held[15] && Inp.held[12]==1) LoopQuit=1; // L+R+black to quit:
|
|
if (Inp.button[4]>30 && Inp.button[5]>30) LoopQuit=1; // Start and back to quit
|
|
|
|
if (LoopMode==8) { DoGame(); return 0; }
|
|
|
|
if (DSoundNext) memset(DSoundNext,0,PsndLen<<2);
|
|
|
|
if (LoopMode==2) { FileMenu.scan(); LoopMode++; return 0; }
|
|
if (LoopMode==3) { MenuUpdate(); return 0; }
|
|
if (LoopMode==4) { LightCalUpdate(); return 0; }
|
|
|
|
LoopMode=2; // Unknown mode, go to rom menu
|
|
return 0;
|
|
}
|
|
|
|
|
|
static int ModeRender()
|
|
{
|
|
DirectScreen();
|
|
if (LoopMode==3) MenuRender();
|
|
if (LoopMode==4) LightCalRender();
|
|
|
|
return 0;
|
|
}
|
|
|
|
static void UpdateSound()
|
|
{
|
|
if(fastForward) return;
|
|
while (DSoundUpdate()) { Sleep(1); }
|
|
while (DSoundUpdate()==0) { }
|
|
}
|
|
|
|
int LoopCode()
|
|
{
|
|
|
|
// Main loop:
|
|
while (!LoopQuit)
|
|
{
|
|
InputUpdate();
|
|
|
|
DirectClear(0);
|
|
ModeUpdate();
|
|
ModeRender();
|
|
DirectPresent();
|
|
// UpdateSound();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
// -------------------------------------------------------------------------------------
|
|
|
|
extern "C" int dprintf(char *format, ...)
|
|
{
|
|
char *name=NULL;
|
|
va_list val=NULL;
|
|
|
|
#ifdef _XBOX
|
|
name="d:\\zout.txt";
|
|
#else
|
|
name="zout.txt";
|
|
#endif
|
|
|
|
if (DebugFile==NULL) DebugFile=fopen(name,"wt");
|
|
if (DebugFile==NULL) return 1;
|
|
|
|
fprintf(DebugFile, "%05i: ", emu_frame);
|
|
va_start(val,format);
|
|
vfprintf(DebugFile,format,val);
|
|
fprintf(DebugFile, "\n");
|
|
fflush(DebugFile);
|
|
|
|
va_end(val);
|
|
return 0;
|
|
}
|
|
|
|
extern "C" int dprintf2(char *format, ...)
|
|
{
|
|
char str[512];
|
|
va_list val=NULL;
|
|
|
|
va_start(val,format);
|
|
vsprintf(str,format,val);
|
|
va_end(val);
|
|
OutputDebugString(str);
|
|
|
|
return 0;
|
|
}
|