initial import
[picodrive.git] / platform / win32 / GenaDrive / Loop.cpp
diff --git a/platform/win32/GenaDrive/Loop.cpp b/platform/win32/GenaDrive/Loop.cpp
new file mode 100644 (file)
index 0000000..54d3519
--- /dev/null
@@ -0,0 +1,244 @@
+#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