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