removed out-of-date s60 stuff
[picodrive.git] / platform / s60 / PicoDriveExe.Cpp
diff --git a/platform/s60/PicoDriveExe.Cpp b/platform/s60/PicoDriveExe.Cpp
deleted file mode 100644 (file)
index de576aa..0000000
+++ /dev/null
@@ -1,2495 +0,0 @@
-#include <stdlib.h>\r
-#include <stdio.h>\r
-#include <eikenv.h>\r
-#include <e32keys.h>\r
-#include <eikapp.h>\r
-#include <zlib.h>\r
-#ifdef S60V3\r
-#include <picodrive.rsg>\r
-#else\r
-#include <picodriveS60.rsg>\r
-#endif\r
-#include <eikdoc.h>\r
-#include <aknlistquerydialog.h>\r
-#include <s32file.h>\r
-#include <string.h>\r
-#include <ctype.h>\r
-#include <eikenv.h>\r
-#include <sys\time.h>\r
-\r
-#include "PicoDriveexe.h"\r
-#include "pico.h"\r
-#include "unzip.h"\r
-#include "PicoInt.h"\r
-#include "GGenie.h"\r
-\r
-TInt KLineGap = 2;\r
-static const char* KAboutText = \r
-"This emulator uses code from\n"\r
-"these people/projects:\n"\r
-"\n"\r
-"Dave\n"\r
-"Cyclone 68000 core,\n"\r
-"Pico emulation library\n"\r
-"Homepage:http://www.finalburn.com\n"\r
-"E-mail: david(at)finalburn.com\n"\r
-"\n"\r
-"notaz\n"\r
-"UIQ port,Cyclone 68000 hacks,some\n"\r
-"additional coding (see changelog).\n"\r
-"Homepage:http://notaz.atspace.com/\n"\r
-"E-mail: notasas(at)gmail.com\n"\r
-"\n"\r
-"Reesy\n"\r
-"DrZ80, the Z80 emulator\n"\r
-"written in ARM assembly.\n"\r
-"Homepage: http://reesy.gp32x.de/\n"\r
-"E-mail:drsms_reesy(at)yahoo.co.uk\n"\r
-"\n"\r
-"Tatsuyuki Satoh, Jarek Burczynski,\n"\r
-"MultiArcadeMachineEmulator\n"\r
-"development\n"\r
-"software implementation of\n"\r
-"Yamaha FM sound generator\n"\r
-"\n"\r
-"MultiArcadeMachineEmulator(MAME)\n"\r
-"development\n"\r
-"Texas Instruments SN76489/SN76496\n"\r
-"programmable tone/noise generator\n"\r
-"Homepage: http://www.mame.net/\n"\r
-"\n"\r
-"Additional thanks\n"\r
-"-----------------\n"\r
-"* Peter van Sebille for ECompXL\n"\r
-"  and his various open-source\n"\r
-"  Symbian project to learn from.\n"\r
-"* Mark and Jean-loup for zlib\n"\r
-"  library.\n"\r
-"* Reesy for also finding some\n"\r
-"  Cyclone bugs.\n"\r
-"* Charles MacDonald\n"\r
-"  (http://cgfm2.emuviews.com/)\n"\r
-"  for old but still very useful\n"\r
-"  info about genesis hardware.\n"\r
-"* Stúphane Dallongeville\n"\r
-"  for creating Gens\n"\r
-"  (http://www.gens.ws)\n"\r
-"*The development team behind the\n"\r
-" Symbian GCC Improvement Project\n"\r
-" http://www.inf.u-szeged.hu\n"\r
-" /symbian-gcc/) for their updated\n"\r
-" compiler tools.\n"\r
-"* Inder for the icons.\n";\r
-\r
-// Picodrive prefrence uid\r
-const TUid KPicoDrivePrefs={0x1234432E};\r
-\r
-// Bittable corresponding to the bitvalues for the different control actions\r
-TUint16 KBitValTable[EPicoNoKeys]={1,2,4,8 ,64,16,32,1024,512,256,2048,128,5,9,10,6,0,0,0};\r
-\r
-extern"C" unsigned short *framebuff = 0;  // temporary buffer in sega native BGR format\r
-const  int framebuffsize  = ((8+320)*(224+16))*2; // actual framebuffer size (in bytes+to support new rendering mode)\r
-\r
-// Colour lookuptable from BGR to RGB\r
-unsigned short gColorMapTab[4096];\r
-\r
-// Scaling line table\r
-TUint8 gColumnStepTable[320];\r
-TUint8 gNarrowColumnStepTable[256];\r
-unsigned short gLineTable[240];\r
-TUint32 gLineOffsets[416];\r
-TUint32 gFullOffset;\r
-extern int PsndLen;\r
-\r
-#ifndef S60V3\r
-GLDEF_C  TInt E32Dll(TDllReason)\r
-{\r
-       return KErrNone;\r
-}\r
-#ifdef __WINS__\r
-_LIT(KLitResourceFileName,     "z:\\system\\apps\\picodrives60\\PicoDriveS60.rsc");\r
-#else\r
-_LIT(KLitResourceFileName,     "PicoDriveS60.rsc");\r
-#endif\r
-\r
-#endif\r
-\r
-#ifdef __WINS__\r
-RHeap* gChunk;\r
-#endif\r
-struct Target Targ;\r
-\r
-#ifdef S60V3\r
-#include "S60V3Video.inl"\r
-#else\r
-#include "NormalVideo.inl"\r
-#include "InterpolateVideo.inl"\r
-#endif\r
-\r
-TInt CPicoDriveUi::AsyncUpdateL(TAny* aAppUi)\r
-{\r
-       static_cast<CPicoDriveUi*>(aAppUi)->UpdateScreen();\r
-       return 0;\r
-}\r
-\r
-void CPicoDriveUi::StartAsynchUpdate() \r
-{\r
-       TCallBack callback(AsyncUpdateL,iEikonEnv->EikAppUi());\r
-       iAsyncUpdate.Cancel();\r
-       iAsyncUpdate.Set(callback);\r
-       iAsyncUpdate.CallBack();\r
-}\r
-\r
-\r
-CPicoDriveUi::CPicoDriveUi():iIdleCallBack(CActive::EPriorityIdle),iStartUp(CActive::EPriorityIdle),\r
-iAsyncUpdate(CActive::EPriorityStandard)\r
-{\r
-       iCurrentScan=-1;\r
-       FramesPerSecond=60;\r
-       PicoOpt = 7;\r
-       iLastAboutPos = -1;\r
-       iFrameSkip = -1;\r
-       PsndRate = 8000;\r
-       iInterpolate = ETrue;\r
-       iSoundVolume = 6;\r
-       gFullOffset = 0;\r
-}\r
-\r
-CPicoDriveUi::~CPicoDriveUi()\r
-{\r
-       delete iKeyNames;\r
-       delete iRegNames;\r
-       if(iView)\r
-       {\r
-               RemoveFromStack(iView);\r
-               delete iView;\r
-       }\r
-       delete iBackBuffer;\r
-       delete iSndStream;\r
-#ifndef S60V3\r
-       iCoeEnv->DeleteResourceFile(iResourceFileId);\r
-#endif\r
-\r
-#ifdef __WINS__\r
-       if(gChunk != NULL)\r
-       {\r
-               gChunk->Close();\r
-       }\r
-#endif\r
-       free(framebuff);\r
-       framebuff = 0;\r
-       CloseSTDLIB();\r
-}\r
-\r
-TKeyResponse CPicoDriveUi::HandleKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType)\r
-{\r
-       if(iCheatEnter)\r
-       {\r
-               return iCheatDlg->OfferKeyEventL(aKeyEvent,aType);\r
-       }\r
-\r
-       if(aType==EEventKey && aKeyEvent.iScanCode==EStdKeyBackspace)\r
-       {\r
-               if(iPicoMenu ==ESelectSoundMenu)\r
-               {\r
-                       if(iSndRateChanged)\r
-                       {\r
-                               if(!UpdatePSndRate()) // Not compatible.. reset to 8000\r
-                               {\r
-                                       PsndRate = 8000;\r
-                                       UpdatePSndRate();                                                                                       \r
-                               }\r
-                               \r
-                               if(iRomLoaded)\r
-                               {\r
-                                       sound_rerate();\r
-                               }\r
-                       }\r
-\r
-                       iView->Clear();\r
-                       iPicoMenu = EPicoMainMenu;\r
-                       PutMainMenu();\r
-                       return EKeyWasConsumed;\r
-               }\r
-               else if (iPicoMenu == ESelectControlsMenu)\r
-               {\r
-                       iView->Clear();\r
-                       iPicoMenu = EPicoMainMenu;\r
-                       PutMainMenu();\r
-                       return EKeyWasConsumed;\r
-               }\r
-               else if(iPicoMenu == ESelectScrMenu)\r
-               {\r
-                       iScrMode = iLastScrMode;\r
-                       iView->Clear();\r
-                       iPicoMenu = EPicoMainMenu;\r
-                       PutMainMenu();\r
-                       return EKeyWasConsumed;\r
-               }\r
-               else if(iPicoMenu == ESelectCheatMenu)\r
-               {\r
-                       if(iCheatSelection<2)\r
-                       {\r
-                               iView->Clear();\r
-                               iPicoMenu = EPicoMainMenu;\r
-                               PutMainMenu();\r
-                       }\r
-                       else\r
-                       {\r
-                               TInt index = (iListOffset+iCheatSelection)-2;\r
-                               TInt noFound = 0;\r
-                               for(TInt i = 0; i < 256;i++)\r
-                               {\r
-                                       if (Liste_GG[i].code[0] != 0)\r
-                                       {\r
-                                               noFound++;\r
-                                               if(noFound-1 == index)\r
-                                               {\r
-                                                       Liste_GG[i].code[0] = 0;\r
-                                                       Liste_GG[i].active = 0;\r
-                                                       iNoCheats--;\r
-                                                       iListOffset = 0;\r
-                                                       iCheatSelection = 0;\r
-                                                       break;\r
-                                               }\r
-                                               \r
-                                       }\r
-                               }\r
-\r
-                               iView->Clear();\r
-                               PutCheatSelect();\r
-                       }\r
-\r
-                       return EKeyWasConsumed;\r
-               }\r
-\r
-               if(!iEmuRunning && (iPicoMenu!=EPicoMainMenu ||iCurrentScan!=-1) )\r
-                       return EKeyWasNotConsumed;\r
-               \r
-               if(iRomLoaded )\r
-               {\r
-                       iEmuRunning=!iEmuRunning;\r
-                       \r
-                       if(iEmuRunning && iRomLoaded)\r
-                       {\r
-                               iView->Clear();\r
-                               TCallBack callback(StartEmulatorL,this);\r
-                               iStartUp.Set(callback);\r
-                               iStartUp.CallBack();\r
-                       }\r
-               }\r
-               return EKeyWasConsumed;\r
-       }\r
-\r
-       if(!iEmuRunning)\r
-       {\r
-               if(iCurrentScan==-1)\r
-               {\r
-                       if(aType==EEventKey)\r
-                       {\r
-                               \r
-                               switch(aKeyEvent.iScanCode) // first determine bit value to change\r
-                               {\r
-                               case EStdKeyUpArrow:\r
-                                       switch(iPicoMenu)\r
-                                       {\r
-                                       case ESelectControlsMenu:\r
-                                               {\r
-                                                       iCtrlSelection=!iCtrlSelection;\r
-                                                       PutControllerSelect();\r
-                                               }break;\r
-                                       case EPicoMainMenu:\r
-                                               if(iSelection>0)\r
-                                                       iSelection--;\r
-                                               else iSelection=EExitPico;\r
-                                               PutMainMenu();\r
-                                               break;\r
-                                       case ESelectScrMenu:\r
-                                               if(iScrMode>0)\r
-                                                       iScrMode--;\r
-                                               else iScrMode=10;\r
-                                               PutScreenSelect();\r
-                                               break;\r
-                                       case ESelectCheatMenu:\r
-                                                       if(iCheatSelection>0)\r
-                                                               iCheatSelection--;\r
-                                                       else\r
-                                                               iCheatSelection = ELastCheatItem-1;                                             \r
-                                                       PutCheatSelect();\r
-                                               break;\r
-                                       case EAboutPicoMenu:\r
-                                               {\r
-                                                       iView->Clear();\r
-                                                       PutAbout();\r
-                                               }break;\r
-                                       case ESelectSoundMenu:\r
-                                               {\r
-                                                       if(iSndSelection>0)\r
-                                                               iSndSelection--;\r
-                                                       else\r
-                                                               iSndSelection = ELastSoundItem-1;                                               \r
-                                                       PutSoundSelect();\r
-                                               }break;\r
-                                       }                                       \r
-                               break;\r
-                                       case EStdKeyDownArrow:\r
-                                               switch(iPicoMenu)\r
-                                               {\r
-                                               case ESelectControlsMenu:\r
-                                                               {\r
-                                                                       iCtrlSelection=!iCtrlSelection;\r
-                                                                       PutControllerSelect();\r
-                                                               }break;\r
-                                               case EPicoMainMenu:\r
-                                                       iSelection++;\r
-                                                       if(iSelection==ELastMenuItem)\r
-                                                               iSelection=0;\r
-                                                       PutMainMenu();\r
-                                                       break;\r
-                                               case ESelectScrMenu:\r
-                                                       iScrMode++;\r
-                                                       if(iScrMode==11)\r
-                                                               iScrMode=0;\r
-                                                       PutScreenSelect();\r
-                                                       break;\r
-                                               case ESelectCheatMenu:\r
-                                                       if(iCheatSelection<(ELastCheatItem+iNoCheats-1) && iCheatSelection<6)\r
-                                                               iCheatSelection++;\r
-                                                       else if(iCheatSelection == ELastCheatItem+4 && iListOffset<iNoCheats-5)\r
-                                                       {\r
-                                                               iListOffset++;\r
-                                                       }\r
-                                                       else\r
-                                                       {\r
-                                                               iListOffset = 0;\r
-                                                               iCheatSelection = 0;                                            \r
-                                                       }\r
-                                                       PutCheatSelect();\r
-                                               break;\r
-                                                       case EAboutPicoMenu:\r
-                                                       {\r
-                                                               iView->Clear();\r
-                                                               PutAbout();\r
-                                                       }break;\r
-                                               case ESelectSoundMenu:\r
-                                                       {\r
-                                                               iSndSelection++;\r
-                                                               if(iSndSelection==ELastSoundItem)\r
-                                                                       iSndSelection=0;\r
-                                                               PutSoundSelect();\r
-                                                       }break;\r
-                                               }\r
-                                               break;\r
-                                               case EStdKeyDevice0:\r
-                                               case EStdKeyDevice3:\r
-                                                       {\r
-                                                               switch(iPicoMenu)\r
-                                                               {\r
-                                                               case ESelectControlsMenu:\r
-                                                               {\r
-                                                                       if(iCtrlSelection == EConfigControls)\r
-                                                                       {\r
-                                                                               iPicoMenu = EPicoMainMenu;\r
-                                                                               iView->Clear();\r
-                                                                               iCurrentScan=0;\r
-                                                                               PutConfigKeys();\r
-                                                                       }\r
-                                                                       else\r
-                                                                       {\r
-                                                                               iEnableSixButtons = !iEnableSixButtons;\r
-                                                                               PicoOpt=PicoOpt^ 32;                                                                    \r
-                                                                               \r
-                                                                               PutControllerSelect();\r
-                                                                       }\r
-                                                               }break;\r
-                                                               case ESelectCheatMenu:\r
-                                                                       {\r
-                                                                               switch(iCheatSelection)\r
-                                                                               {\r
-                                                                               case EAddCheat:\r
-                                                                                       {\r
-                                                                                               TBuf8<16> cheatCode;\r
-                                                                                               iCheatEnter = ETrue;\r
-                                                                                               iCheatDlg = new (ELeave) CPicoAddCheatDlg(cheatCode);\r
-                                                                                               iCheatDlg->SetMopParent(iEikonEnv->EikAppUi());            \r
-                                                                                               TInt result = iCheatDlg->ExecuteLD(R_PICO_ADD_CHEAT);\r
-\r
-                                                                                               if(result == EEikBidOk)\r
-                                                                                               {\r
-                                                                                                       for(TInt i = 0; i < 256;i++)\r
-                                                                                                       {\r
-                                                                                                               if (Liste_GG[i].code[0] == 0)\r
-                                                                                                               {                                                                                                               \r
-                                                                                                                       if(check_code((const char*) cheatCode.PtrZ(),i))\r
-                                                                                                                       {\r
-                                                                                                                               decode( Liste_GG[i].code, (patch *) (&(Liste_GG[i].addr)));\r
-                                                                                                                               \r
-                                                                                                                               if ((Liste_GG[i].restore == 0xFFFFFFFF) && (Liste_GG[i].addr < Pico.romsize) && (iRomLoaded))\r
-                                                                                                                               {\r
-                                                                                                                                       Liste_GG[i].restore = (unsigned int) (Pico.rom[Liste_GG[i].addr] & 0xFF);\r
-                                                                                                                                       Liste_GG[i].restore += (unsigned int) ((Pico.rom[Liste_GG[i].addr + 1] & 0xFF) << 8);\r
-                                                                                                                               }\r
-                                                                                                                               iNoCheats++;\r
-                                                                                                                               Liste_GG[i].active = 1;\r
-                                                                                                                       }\r
-                                                                                                                       break; // Found position free\r
-                                                                                                               }\r
-                                                                                                       }\r
-                                                                                               }\r
-                                                                                               iCheatDlg = NULL;\r
-                                                                                               iCheatEnter = EFalse;\r
-                                                                                       }break;\r
-                                                                               case EClearCheats:\r
-                                                                                       {\r
-                                                                                               iNoCheats = 0;\r
-                                                                                               for(TInt i = 0; i < 256;i++)\r
-                                                                                               {\r
-                                                                                                       Liste_GG[i].code[0] = 0;\r
-                                                                                                       Liste_GG[i].active = 0;\r
-                                                                                               }\r
-                                                                                       }\r
-                                                                                       break;\r
-                                                                               default:\r
-                                                                                       {\r
-                                                                                               TInt index = (iListOffset+iCheatSelection)-2;\r
-                                                                                               TInt noFound = 0;\r
-                                                                                               for(TInt i = 0; i < 256;i++)\r
-                                                                                                       {\r
-                                                                                                               if (Liste_GG[i].code[0] != 0)\r
-                                                                                                               {\r
-                                                                                                                       noFound++;\r
-                                                                                                                       if(noFound-1 == index)\r
-                                                                                                                       {\r
-                                                                                                                               Liste_GG[i].active=!Liste_GG[i].active;\r
-                                                                                                                               break;\r
-                                                                                                                       }\r
-\r
-                                                                                                               }\r
-                                                                                               }\r
-                                                                                       }\r
-                                                                                       break;\r
-                                                                       \r
-                                                                               }\r
-\r
-                                                                               PutCheatSelect();\r
-                                                                       }\r
-                                                                       break;\r
-                                                               case EAboutPicoMenu:\r
-                                                                       {\r
-                                                                               iView->Clear();\r
-                                                                               PutAbout();\r
-                                                                       }break;\r
-                                                               case ESelectScrMenu:\r
-                                                                       {\r
-\r
-                                                                               switch(iScrMode)\r
-                                                                               {\r
-                                                                               case 5:\r
-                                                                                       iInterpolate = !iInterpolate;\r
-                                                                                       iView->Clear();\r
-                                                                                       PutScreenSelect();\r
-                                                                                       break;\r
-                                                                               case 6:\r
-                                                                                       iFrameSkip++;\r
-                                                                                       if(iFrameSkip == 11)\r
-                                                                                       {\r
-                                                                                               iFrameSkip = -1;\r
-                                                                                       }\r
-                                                                                       iView->Clear();\r
-                                                                                       PutScreenSelect();\r
-                                                                                       break;\r
-                                                                               case 7:\r
-                                                                                       PicoOpt = PicoOpt^0x40;\r
-                                                                                       iView->Clear();\r
-                                                                                       PutScreenSelect();\r
-                                                                               break;\r
-                                                                               case 8:\r
-                                                                                       PicoOpt = PicoOpt^0x80;\r
-                                                                                       iView->Clear();\r
-                                                                                       PutScreenSelect();\r
-                                                                               break;\r
-                                                                               case 9:\r
-                                                                                       PicoOpt = PicoOpt^0x10;\r
-                                                                                       iView->Clear();\r
-                                                                                       PutScreenSelect();\r
-                                                                                       break;\r
-                                                                               case 10:\r
-                                                                                       switch(PicoRegionOverride)\r
-                                                                                       {\r
-                                                                                       case 0:\r
-                                                                                       default:\r
-                                                                                               PicoRegionOverride = 1;\r
-                                                                                               break;\r
-                                                                                       case 1:\r
-                                                                                               PicoRegionOverride = 2;\r
-                                                                                               break;\r
-                                                                                       case 2:\r
-                                                                                               PicoRegionOverride = 4;\r
-                                                                                               break;\r
-                                                                                       case 4:\r
-                                                                                               PicoRegionOverride = 8;\r
-                                                                                               break;\r
-                                                                                       case 8:\r
-                                                                                               PicoRegionOverride = 0;\r
-                                                                                               break;\r
-                                                                                       }\r
-\r
-                                                                                       iView->Clear();\r
-                                                                                       PutScreenSelect();\r
-                                                                                       break;\r
-                                                                               default:\r
-                                                                                       {\r
-                                                                                       TBitmapUtil util(iBackBuffer);\r
-                                                                                       util.Begin(TPoint(0,0));\r
-                                                                                       TSize sz=iBackBuffer->SizeInPixels();\r
-                                                                                       TInt dataSize=sz.iWidth*sz.iHeight*2;\r
-                                                                                       TPtr8 ptr(reinterpret_cast<unsigned char*>(iBackBuffer->DataAddress()),dataSize,dataSize);\r
-                                                                                       ptr.Fill(0);\r
-                                                                                       util.End();\r
-                                                                                       iPicoMenu=EPicoMainMenu;\r
-                                                                                       iView->Clear();\r
-                                                                                       PutMainMenu();\r
-                                                                                       TargetInit(); \r
-                                                                                       SaveSettingsL();\r
-                                                                                       }break;\r
-                                                                               }                                                                       \r
-                                                                       }break;\r
-                                                               case ESelectSoundMenu:\r
-                                                                       {\r
-                                                                               switch(iSndSelection)\r
-                                                                               {\r
-                                                                               case EEnableZ80:\r
-                                                                                       PicoOpt=PicoOpt^4;\r
-                                                                                       break;\r
-                                                                               case EEnableYM2612:\r
-                                                                                       PicoOpt=PicoOpt^1;\r
-                                                                                       break;\r
-                                                                               case EEnableSN76496:\r
-                                                                                       PicoOpt=PicoOpt^2;\r
-                                                                                       break;\r
-                                                                               case ESoundVolume:\r
-                                                                                       {                                                                               \r
-                                                                                               iSoundVolume++;\r
-                                                                                               if(iSoundVolume==11)\r
-                                                                                               {\r
-                                                                                                       iSoundVolume=0;\r
-                                                                                                       iEnableSound=EFalse;\r
-                                                                                               }\r
-                                                                                               else\r
-                                                                                               {\r
-                                                                                                       iEnableSound=ETrue;\r
-                                                                                                       iSndStream->SetVolume((iSndStream->MaxVolume()*iSoundVolume)/10);\r
-                                                                                               }\r
-\r
-                                                                                               if(!iEnableSound)\r
-                                                                                               {\r
-                                                                                                       iSndStream->Stop();\r
-                                                                                               }\r
-                                                                                       }break;\r
-                                                                               case ESoundRate:\r
-                                                                                       {\r
-                                                                                               iSndRateChanged = ETrue;\r
-\r
-                                                                                               switch(PsndRate)\r
-                                                                                               {\r
-                                                                                               case 8000:\r
-                                                                                                       PsndRate = 11025;\r
-                                                                                                       break;\r
-                                                                                               case 11025:\r
-                                                                                                       PsndRate = 16000;\r
-                                                                                                       break;\r
-                                                                                               case 16000:\r
-                                                                                                       PsndRate = 22050;\r
-                                                                                                       break;\r
-                                                                                               case 22050:\r
-                                                                                                       PsndRate = 8000;\r
-                                                                                                       break;\r
-                                                                                               }                                                                                       \r
-                                                                                       }break;\r
-                                                                               }       \r
-                                                                               PutSoundSelect();\r
-                                                                       }break;\r
-                                                               case EPicoMainMenu:\r
-                                                                       {\r
-                                                                               switch(iSelection)\r
-                                                                               {\r
-                                                                               case EResetHw:\r
-                                                                                       {\r
-                                                                                               if(!PicoReset(0))\r
-                                                                                               {\r
-                                                                                                       iEmuRunning=ETrue;\r
-                                                                                                       TCallBack callback(StartEmulatorL,this);\r
-                                                                                                       iStartUp.Set(callback);\r
-                                                                                                       iStartUp.CallBack();\r
-                                                                                               }\r
-                                                                                       }\r
-                                                                                       break;\r
-                                                                               case ELoadState:\r
-                                                                                       {\r
-                                                                                               if(iRomLoaded)\r
-                                                                                               {                                                                                                       \r
-                                                                                                       saveLoadGame(1,0);                                                                                                      \r
-                                                                                                       iEmuRunning=ETrue;\r
-                                                                                                       iView->Clear();\r
-                                                                                                       TCallBack callback(StartEmulatorL,this);\r
-                                                                                                       iStartUp.Set(callback);\r
-                                                                                                       iStartUp.CallBack();                                                                            \r
-                                                                                               }\r
-                                                                                       }\r
-                                                                                       break;\r
-                                                                               case ESaveState:\r
-                                                                                       {                                                                                               \r
-                                                                                               if(iRomLoaded)\r
-                                                                                               {                                                                                                       \r
-                                                                                                       saveLoadGame(0,0);\r
-                                                                                                       iEmuRunning=ETrue;\r
-                                                                                                       iView->Clear();\r
-                                                                                                       TCallBack callback(StartEmulatorL,this);\r
-                                                                                                       iStartUp.Set(callback);\r
-                                                                                                       iStartUp.CallBack();\r
-                                                                                                       \r
-                                                                                               }\r
-                                                                                       }\r
-                                                                                       break;\r
-                                                                               case ELoadRom:\r
-                                                                                       {\r
-                                                                                               TParsePtr parse(iRomName);\r
-                                                                                               iRomName=parse.DriveAndPath();\r
-                                                                                               if(SelectFile(iRomName))\r
-                                                                                               {\r
-                                                                                                       SaveSettingsL();\r
-                                                                                                       EmulateExit();\r
-                                                                                                       TPtr8 ptr((unsigned char*)RomName,256);\r
-                                                                                                       ptr.Fill(0,256);\r
-                                                                                                       ptr.Copy(iRomName);\r
-                                                                                                       User::CompressAllHeaps();\r
-                                                                                                       if(EmulateInit()==0)\r
-                                                                                                       {\r
-                                                                                                               if(Pico.m.pal)\r
-                                                                                                               {\r
-                                                                                                                       FramesPerSecond=50;\r
-                                                                                                               }\r
-                                                                                                               else \r
-                                                                                                               {\r
-                                                                                                                       FramesPerSecond=60;\r
-                                                                                                               }\r
-                                                                                                               \r
-                                                                                                               SetKeyBlockMode(ENoKeyBlock);\r
-                                                                                                               iEmuRunning=ETrue;\r
-                                                                                                               iRomLoaded=ETrue;\r
-                                                                                                               iView->Clear();\r
-                                                                                                               TCallBack callback(StartEmulatorL,this);\r
-                                                                                                               iStartUp.Set(callback);\r
-                                                                                                               iStartUp.CallBack();\r
-                                                                                                       }\r
-                                                                                                       else\r
-                                                                                                       {\r
-                                                                                                               iRomName=KNullDesC();\r
-                                                                                                               iView->Clear();\r
-                                                                                                               PutMainMenu();\r
-                                                                                                               iRomLoaded=EFalse;\r
-                                                                                                       }\r
-                                                                                               }\r
-                                                                                               else\r
-                                                                                               {\r
-                                                                                                       iView->Clear();\r
-                                                                                                       PutMainMenu();\r
-                                                                                               }\r
-                                                                                       }\r
-                                                                                       break;//load rom\r
-                                                                               case ESetControls:\r
-                                                                                       iPicoMenu = ESelectControlsMenu;\r
-                                                                                       PutControllerSelect();                                                                          \r
-                                                                                       break;\r
-                                                                               case ESetScreen:\r
-                                                                                       iView->Clear();\r
-                                                                                       iLastScrMode = iScrMode; // In case of cancel\r
-                                                                                       PutScreenSelect();\r
-                                                                                       iPicoMenu=ESelectScrMenu;\r
-                                                                                       break;\r
-                                                                               case ESelectSound:\r
-                                                                                       {                       \r
-                                                                                               iSndRateChanged = EFalse;\r
-                                                                                               iPicoMenu=ESelectSoundMenu;\r
-                                                                                               PutSoundSelect();\r
-                                                                                       }break;\r
-                                                                               case ESelectCheat:\r
-                                                                                       {\r
-                                                                                       iPicoMenu=ESelectCheatMenu;\r
-                                                                                       iListOffset = 0;\r
-                                                                                       iNoCheats = 0;\r
-                                                                                       for(TInt i = 0; i < 256;i++)\r
-                                                                                       {\r
-                                                                                               if (Liste_GG[i].code[0] != 0)\r
-                                                                                               {\r
-                                                                                                       iNoCheats++;\r
-                                                                                                       if ((Liste_GG[i].restore != 0xFFFFFFFF) && (Liste_GG[i].addr < Pico.romsize) && (iRomLoaded))\r
-                                                                                                       {\r
-                                                                                                               Pico.rom[Liste_GG[i].addr] = (unsigned char)(Liste_GG[i].restore & 0xFF);\r
-                                                                                                               Pico.rom[Liste_GG[i].addr + 1] = (unsigned char)((Liste_GG[i].restore & 0xFF00) >> 8);\r
-                                                                                                       }\r
-                                                                                                       \r
-                                                                                               }\r
-                                                                                       }\r
-\r
-                                                                                       PutCheatSelect();\r
-                                                                                       }\r
-                                                                               break;\r
-                                                                               case EAboutPico:\r
-                                                                                       {\r
-                                                                                               iView->Clear();\r
-                                                                                               PutAbout();\r
-                                                                                               iPicoMenu=EAboutPicoMenu;\r
-                                                                                       }break;\r
-                                                                               case EExitPico:\r
-                                                                                       {\r
-                                                                                               SaveSettingsL();\r
-                                                                                               EmulateExit();\r
-                                                                                               Exit();\r
-                                                                                       }\r
-                                                                                       break;\r
-                                                       }\r
-                                                               }\r
-                                               }break;\r
-                                       }\r
-                                       break;\r
-                               }\r
-                       }\r
-               }\r
-               else\r
-               {\r
-                       if(aType == EEventKeyDown)\r
-                       {\r
-                               if(aKeyEvent.iScanCode != EStdKeyBackspace)\r
-                               {\r
-                                       iScanCodes[iCurrentScan]=aKeyEvent.iScanCode;\r
-                               }\r
-                               else\r
-                               {\r
-                                       iScanCodes[iCurrentScan] = KErrNotFound;\r
-                               }\r
-\r
-                               iCurrentScan++;\r
-                               if(iCurrentScan==iKeyNames->Count())\r
-                               {\r
-                                       SaveSettingsL();\r
-                                       iCurrentScan=-1;\r
-                                       iView->DrawText(_L("Done!"),TPoint(0,iFontHeight*11));\r
-                                       \r
-                                       User::After(1000000);\r
-                                       iView->Clear();\r
-                                       PutMainMenu();\r
-                               }\r
-                               else\r
-                               {\r
-                                       iView->Clear();\r
-                                       PutConfigKeys();\r
-                               }\r
-                       }\r
-               }\r
-       }\r
-       else\r
-       {\r
-               if((aType == EEventKeyUp || aType == EEventKeyDown))\r
-               {                                               \r
-                       TUint16 bitVal=0;\r
-                       for(TInt loop=0;loop<16;loop++)\r
-                       {\r
-                               if(aKeyEvent.iScanCode==iScanCodes[loop])\r
-                               {\r
-                                       bitVal=KBitValTable[loop];\r
-                                       break;\r
-                               }\r
-                       }\r
-                       \r
-                       if(aType == EEventKeyUp)\r
-                       {\r
-                               iPad1=iPad1&(65535-bitVal); // remove bit\r
-                       }\r
-                       else \r
-                       {\r
-                               iPad1=(iPad1|bitVal); // set bit\r
-                       }                       \r
-               }\r
-\r
-               if(aType == EEventKey)\r
-               {\r
-                       if(aKeyEvent.iScanCode == iScanCodes[EPicoResetKey])\r
-                       {\r
-                               PicoReset(0);\r
-                       }\r
-\r
-                       if(aKeyEvent.iScanCode == iScanCodes[EPicoPanLKey] && gFullOffset>0)\r
-                       {\r
-                               gFullOffset-=24;\r
-                       }\r
-                       else if(aKeyEvent.iScanCode == iScanCodes[EPicoPanRKey]&& gFullOffset<144)\r
-                       {\r
-                               gFullOffset+=24;\r
-                       }\r
-               }\r
-       }\r
-       \r
-       return EKeyWasConsumed;\r
-}\r
-\r
-TInt CPicoDriveUi::SelectFile(TFileName& aFileName)\r
-{\r
-       TFileName filename=aFileName;\r
-       TInt selectedIndex=-1;\r
-       RArray<TEntry> romList;\r
-       TDriveList driveList;\r
-       TBool refresh=EFalse;\r
-       TInt lastLength=-1;\r
-       do\r
-       {\r
-               CAknListQueryDialog* dlg = new (ELeave) CAknListQueryDialog(&selectedIndex);\r
-               CDesCArrayFlat* list=new (ELeave) CDesCArrayFlat(5);\r
-               refresh=EFalse;\r
-               if(filename.Length()==0)\r
-               {\r
-                       \r
-                       iEikonEnv->FsSession().DriveList(driveList);\r
-                       for(TInt drive=0;drive<driveList.Length();drive++)\r
-                       {\r
-                               if(driveList[drive]!=0)\r
-                               {\r
-                                       TBuf<16> form;\r
-                                       form.Format(_L("%c:\\"),drive+65);\r
-                                       list->AppendL(form);\r
-                               }\r
-                       }       \r
-               }\r
-               else\r
-               {\r
-                       CDir* romDir = NULL;;\r
-                       romList.Reset();\r
-                       iEikonEnv->FsSession().GetDir(filename,KEntryAttMatchMask,0,romDir);\r
-                       \r
-                       if(romDir!=NULL)\r
-                               list->AppendL(_L(".. <DIR>"));\r
-                       \r
-                       if(romDir!=NULL && romDir->Count()>0)\r
-                       {\r
-                               for(TInt loop=0;loop<romDir->Count();loop++)\r
-                               {\r
-                                       const TEntry& entry=(*romDir)[loop];\r
-                                       TFileName name=entry.iName;\r
-                                       if(entry.IsDir())\r
-                                       {\r
-                                               name.Append(_L(" <DIR>"));\r
-                                               list->AppendL(name);\r
-                                               romList.Append(entry);\r
-                                       }\r
-                                       else\r
-                                       {\r
-                                               TParsePtr parse(name);\r
-                                               \r
-                                               if(parse.Ext().CompareF(_L(".bin"))==KErrNone ||\r
-                                                       parse.Ext().CompareF(_L(".smd"))==KErrNone ||\r
-                                                       parse.Ext().CompareF(_L(".zip"))==KErrNone)\r
-                                               {\r
-                                                       romList.Append(entry);\r
-                                                       list->AppendL(name);\r
-                                               }\r
-                                       }\r
-                                       \r
-                               }\r
-                               delete romDir;\r
-                               romDir=NULL;\r
-                       }\r
-                       else // no files found.. or path not found.. return to\r
-                       {\r
-                               if(filename.Length()>3) // more than a c:\ specified\r
-                               {\r
-                                       \r
-                                       refresh=ETrue;\r
-                                       filename=KNullDesC();\r
-                               }\r
-                               else return EFalse;\r
-                       }\r
-                       \r
-               }\r
-               if(list->Count()>0)\r
-               {\r
-                       dlg->PrepareLC(R_PICO_FILE_SELECT_DIALOG);\r
-                       dlg->SetItemTextArray(list);\r
-                       if(dlg->RunLD())\r
-                       {\r
-                               if(filename.Length()==0)\r
-                               {\r
-                                       TFileName driveLetter;\r
-                                       TUint8 driveL;\r
-                                       TInt countedDrives=0;\r
-                                       for(TInt drive=0;drive<driveList.Length();drive++)\r
-                                       {\r
-                                               if(driveList[drive]!=0 && countedDrives==selectedIndex)\r
-                                               {\r
-                                                       driveLetter.Format(_L("%c:\\"),drive+65);\r
-                                                       driveL=drive+65;\r
-                                                       break;\r
-                                               }\r
-                                               else if(driveList[drive]!=0) countedDrives++;\r
-                                               \r
-                                       }\r
-                                       filename=driveLetter;\r
-                                       refresh=ETrue;                                  \r
-                               }\r
-                               else\r
-                               {\r
-                                       if(selectedIndex>0)\r
-                                       {\r
-                                               selectedIndex--;\r
-                                               const TEntry& entry=romList[selectedIndex];\r
-                                               TFileName name =entry.iName;\r
-                                               if(entry.IsDir())\r
-                                               {\r
-                                                       lastLength=aFileName.Length();\r
-                                                       filename.Append(name);\r
-                                                       filename.Append(_L("\\"));\r
-                                                       \r
-                                                       refresh=ETrue;\r
-                                                       \r
-                                               }\r
-                                               else\r
-                                               {\r
-                                                       filename.Append(name);\r
-                                                       aFileName=filename;\r
-                                                       romList.Close();\r
-                                                       return ETrue;\r
-                                               }\r
-                                       }\r
-                                       else\r
-                                       {\r
-                                               refresh=ETrue;\r
-                                               TInt pos=filename.Left(filename.Length()-1).LocateReverse('\\');\r
-                                               if(pos!=KErrNotFound)\r
-                                                       filename=filename.Left(pos+1);// keep \r
-                                               else filename=KNullDesC();\r
-                                               // and changefilename..\r
-                                               \r
-                                               //return 2;// go up one.\r
-                                       }\r
-                               }\r
-                       }\r
-                       else\r
-                       {\r
-                               romList.Close();\r
-                               return EFalse;\r
-                       }\r
-               }\r
-       }while(refresh);\r
-       romList.Close();\r
-       return EFalse;\r
-}\r
-\r
-void CPicoDriveUi::SaveSettingsL()\r
-{\r
-#ifdef S60V3\r
-       CDictionaryStore* prefs = Application()->OpenIniFileLC(iEikonEnv->FsSession());\r
-#else\r
-       CDictionaryFileStore* prefs=CDictionaryFileStore::OpenLC(iEikonEnv->FsSession(),iAppPath,TUid::Uid(0));\r
-#endif\r
-       ExternalizeL(*prefs);\r
-       prefs->CommitL();\r
-       CleanupStack::PopAndDestroy();//close prefs\r
-}\r
-\r
-\r
-void CPicoDriveUi::ExternalizeL(CDictionaryStore& aStore) \r
-{      \r
-       RDictionaryWriteStream writeStream;\r
-       writeStream.AssignLC(aStore, KPicoDrivePrefs);\r
-       \r
-       TInt loop=0;\r
-       for(loop=0;loop<EPicoNoKeys;loop++)\r
-       {\r
-               writeStream.WriteInt32L(iScanCodes[loop]);\r
-       }\r
-       \r
-       writeStream.WriteInt32L(iScrMode);\r
-       writeStream.WriteInt32L(PicoOpt);\r
-       writeStream.WriteInt32L(iSoundVolume);\r
-       writeStream.WriteInt32L(iFrameSkip);\r
-       writeStream.WriteInt32L(PsndRate);\r
-       writeStream.WriteInt32L(iInterpolate);\r
-       writeStream.WriteInt32L(iEnableSixButtons);\r
-       writeStream.WriteInt32L(PicoRegionOverride);\r
-       TParsePtr parser(iRomName);\r
-       writeStream.WriteInt32L(parser.DriveAndPath().Length());\r
-       writeStream.WriteL(parser.DriveAndPath(),parser.DriveAndPath().Length());\r
-       writeStream.CommitL();\r
-       \r
-       CleanupStack::PopAndDestroy();//writeStream\r
-}\r
-\r
-void CPicoDriveUi::InternalizeL(const CDictionaryStore& aStore)\r
-{\r
-       if (!aStore.IsPresentL(KPicoDrivePrefs))\r
-       {\r
-               iFirstStart = ETrue;\r
-               return;\r
-       }\r
-       RDictionaryReadStream   readStream;\r
-       readStream.OpenLC(aStore, KPicoDrivePrefs);\r
-       TInt loop=0;\r
-       for(loop=0;loop<EPicoNoKeys;loop++)\r
-       {\r
-               iScanCodes[loop] = readStream.ReadInt32L();\r
-       }\r
-       \r
-       iScrMode=readStream.ReadInt32L();\r
-       PicoOpt=readStream.ReadInt32L();\r
-       iEnableSound = PicoOpt&3;\r
-       iSoundVolume=readStream.ReadInt32L();\r
-       iFrameSkip = readStream.ReadInt32L();\r
-       PsndRate = readStream.ReadInt32L();\r
-       iInterpolate = readStream.ReadInt32L();\r
-       iEnableSixButtons = readStream.ReadInt32L();\r
-       PicoRegionOverride = readStream.ReadInt32L();\r
-\r
-       TInt len=0;\r
-       TRAPD(err,len=readStream.ReadInt32L())\r
-               if(err==KErrNone)\r
-               {\r
-                       readStream.ReadL(iRomName,len);\r
-               }\r
-               \r
-               CleanupStack::PopAndDestroy();//readStream\r
-}\r
-\r
-void CPicoDriveUi::ConstructL()\r
-{\r
-#ifdef S60V3\r
-       CAknAppUi::BaseConstructL(CAknAppUi::EAknEnableSkin);\r
-#else\r
-       BaseConstructL(ENoAppResourceFile);     \r
-#endif\r
-       framebuff =  (unsigned short *) malloc(framebuffsize);\r
-       memset(framebuff,0,framebuffsize);\r
-\r
-       iFontHeight = iEikonEnv->NormalFont()->HeightInPixels()+KLineGap;\r
-       iScanCodes[0]= EStdKeyUpArrow;                  \r
-       iScanCodes[1]= EStdKeyDownArrow;\r
-       iScanCodes[2]=EStdKeyLeftArrow;\r
-       iScanCodes[3]= EStdKeyRightArrow;\r
-       iScanCodes[6]=EStdKeyDevice0;\r
-       iScanCodes[4]= EStdKeyDevice1;\r
-       iScanCodes[5]=EStdKeyDevice3;\r
-       iScanCodes[7]=0;//x\r
-       iScanCodes[8]=0; // y\r
-       iScanCodes[9]=0;//z\r
-       iScanCodes[10]=0;// mode\r
-       iScanCodes[11]= '0'; // start\r
-#ifdef __WINS__\r
-       gChunk = UserHeap::ChunkHeap(&_L("ROMHEAP"),512000,16384000);\r
-#endif\r
-\r
-#ifndef S60V3\r
-       TFileName name;\r
-       iEikonEnv->RootWin().SetName(_L("PicoDrive"));\r
-#ifndef __WINS__\r
-       RProcess process;\r
-       process.Rename(_L("PicoDrive"));\r
-       TFileName fname  =process.FileName();\r
-       TParsePtr parser(fname);\r
-       name.Append(parser.DriveAndPath());\r
-#endif\r
-       name.Append(KLitResourceFileName());\r
-       iAppPath=_L("C:");\r
-       iAppPath.Append(TParsePtr(name).Path());\r
-       iAppPath.Append(_L("PicoDriveS60.ini"));\r
-       iResourceFileId = iCoeEnv->AddResourceFileL(name); // eb205: needs to hunt around drives\r
-#endif // S60V3\r
-       iKeyNames =iEikonEnv->ReadDesCArrayResourceL(R_PICODRIVE_KEYS);\r
-       iRegNames = iEikonEnv->ReadDesCArrayResourceL(R_PICODRIVE_REGIONS);\r
-\r
-       iEikonEnv->FsSession().MkDirAll(TParsePtr(iAppPath).DriveAndPath());\r
-#ifdef S60V3\r
-       CDictionaryStore* prefs = Application()->OpenIniFileLC(iEikonEnv->FsSession());\r
-       InternalizeL(*prefs);\r
-       CleanupStack::PopAndDestroy();//close prefs\r
-#else\r
-       TRAPD(err,{CDictionaryFileStore* prefs=CDictionaryFileStore::OpenLC(iEikonEnv->FsSession(),iAppPath,TUid::Uid(0));\r
-       InternalizeL(*prefs);\r
-       CleanupStack::PopAndDestroy();//close prefs\r
-       });\r
-#endif\r
-       \r
-       if(iFirstStart)\r
-       {\r
-               iPicoMenu = EAboutPicoMenu;\r
-       }\r
-       \r
-       iView=new (ELeave)CQPicoDriveView;\r
-       iView->ConstructL();\r
-       AddToStackL(iView);\r
-       iDisplayMode =iEikonEnv->ScreenDevice()->DisplayMode();\r
-       if(iDisplayMode != EColor64K && iDisplayMode != EColor4K)\r
-       {\r
-               iDisplayMode=EColor64K;; // Also tried to switch to by the view.\r
-       }\r
-       CalculatePaletteTable();\r
-       iBackBuffer= new (ELeave)CFbsBitmap;\r
-       iBackBuffer->Create(iEikonEnv->ScreenDevice()->SizeInPixels(),iDisplayMode);\r
-       TBitmapUtil util(iBackBuffer);\r
-       util.Begin(TPoint(0,0));\r
-       TSize sz=iBackBuffer->SizeInPixels();\r
-       Targ.view = TRect(TPoint(0,0),sz);\r
-       TInt dataSize=sz.iWidth*sz.iHeight*2;\r
-       Targ.scanline_length = sz.iWidth*2;\r
-       Targ.screen_offset = Targ.scanline_length*(sz.iHeight-1);\r
-       TPtr8 ptr(reinterpret_cast<unsigned char*>(iBackBuffer->DataAddress()),dataSize,dataSize);\r
-       ptr.Fill(0);\r
-       util.End();\r
-       SetKeyBlockMode(ENoKeyBlock);\r
-       iSelection=0;\r
-       \r
-       iSndStream = CMdaAudioOutputStream::NewL(*this);\r
-       iAudioSettings.Query();\r
-       iAudioSettings.iSampleRate = TMdaAudioDataSettings::ESampleRate8000Hz;\r
-       iAudioSettings.iChannels = TMdaAudioDataSettings::EChannelsMono;\r
-       iAudioSettings.iFlags = 0;\r
-       iAudioSettings.iVolume = iAudioSettings.iMaxVolume/2;\r
-       iSndStream->Open(&iAudioSettings);\r
-       CActiveScheduler::Start(); // wait for open\r
-}\r
-\r
-void CPicoDriveUi::PutAbout(TBool iOnlyRedraw)\r
-{\r
-       TPtrC8 charPtr((unsigned char*)KAboutText,strlen(KAboutText));\r
-       HBufC* credits = HBufC::NewLC(charPtr.Length());\r
-       credits->Des().Copy(charPtr);\r
-       \r
-       if(iLastAboutPos>=credits->Length())\r
-       {\r
-               iLastAboutPos = -1;\r
-               iView->Clear();\r
-               iPicoMenu = EPicoMainMenu;\r
-               PutMainMenu();\r
-       }\r
-       else\r
-       {\r
-               if(iLastAboutPos == -1)\r
-                       iLastAboutPos = 0;\r
-               iView->DrawText(_L("PicoDrive S60 Credits"),TPoint(0,0));\r
-               if(iOnlyRedraw && iLastAboutPos == 0)\r
-                       iView->DrawTextInRect(*credits,TRect(0,iFontHeight*2,Targ.view.iBr.iX,Targ.view.iBr.iY),iLastAboutPos);\r
-               else\r
-                       iLastAboutPos = iView->DrawTextInRect(*credits,TRect(0,iFontHeight*2,Targ.view.iBr.iX,Targ.view.iBr.iY),iLastAboutPos);\r
-       }\r
-       CleanupStack::PopAndDestroy(credits);\r
-       \r
-}\r
-void CPicoDriveUi::PutMainMenu()\r
-{\r
-       iView->DrawText(_L("PicoDrive S60"),TPoint(0,0));\r
-       iView->DrawText(_L("by Dave et Co"),TPoint(0,iFontHeight*1));\r
-       \r
-       iView->DrawText(_L("Load ROM"),TPoint(0,iFontHeight*3),iSelection==0);\r
-       iView->DrawText(_L("Load state"),TPoint(0,iFontHeight*4),iSelection==1);\r
-       iView->DrawText(_L("Save state"),TPoint(0,iFontHeight*5),iSelection==2);\r
-       iView->DrawText(_L("Configure controls"),TPoint(0,iFontHeight*6),iSelection==3);\r
-       iView->DrawText(_L("Configure screen"),TPoint(0,iFontHeight*7),iSelection==4);\r
-       iView->DrawText(_L("Configure sound"),TPoint(0,iFontHeight*8),iSelection==5);\r
-       iView->DrawText(_L("Game Genie/Cheats"),TPoint(0,iFontHeight*9),iSelection==6);\r
-\r
-       iView->DrawText(_L("Reset"),TPoint(0,iFontHeight*10),iSelection==7);\r
-       \r
-       iView->DrawText(_L("Credits"),TPoint(0,iFontHeight*11),iSelection==8);\r
-       iView->DrawText(_L("Exit"),TPoint(0,iFontHeight*12),iSelection==9);\r
-       if(iRomName.Length()>0)\r
-       {\r
-               iView->DrawText(TParsePtr(iRomName).Name(),TPoint(0,iFontHeight*13));\r
-       }\r
-       else\r
-       {\r
-               iView->DrawText(_L("No rom loaded"),TPoint(0,iFontHeight*13));\r
-       }\r
-       \r
-}\r
-\r
-void CPicoDriveUi::PutScreenSelect()\r
-{\r
-       TInt regionIndex = 0;\r
-\r
-       switch(PicoRegionOverride)\r
-       {\r
-       default:\r
-               regionIndex = 0;\r
-               break;\r
-       case 1:\r
-               regionIndex = 1;\r
-               break;\r
-       case 2:\r
-               regionIndex = 2;\r
-               break;\r
-       case 4:\r
-               regionIndex = 3;\r
-               break;\r
-       case 8:\r
-               regionIndex = 4;\r
-               break;\r
-       }\r
-\r
-       iView->DrawText(_L("PicoDrive S60"),TPoint(0,0));\r
-       iView->DrawText(_L("Screen options"),TPoint(0,iFontHeight));\r
-       iView->DrawText(_L("Portrait"),TPoint(0,iFontHeight*3),iScrMode==0);\r
-       iView->DrawText(_L("Landscape Left"),TPoint(0,iFontHeight*4),iScrMode==1);\r
-       iView->DrawText(_L("Landscape Right"),TPoint(0,iFontHeight*5),iScrMode==2);\r
-       iView->DrawText(_L("Portrait stretched"),TPoint(0,iFontHeight*6),iScrMode==3);\r
-       iView->DrawText(_L("Portrait full"),TPoint(0,iFontHeight*7),iScrMode==4);\r
-       if(iInterpolate)\r
-       {\r
-       iView->DrawText(_L("Interpolate on"),TPoint(0,iFontHeight*8),iScrMode==5);\r
-       }\r
-       else\r
-       {\r
-       iView->DrawText(_L("Interpolate off"),TPoint(0,iFontHeight*8),iScrMode==5);\r
-       }\r
-\r
-       if(iFrameSkip == -1)\r
-       {\r
-               iView->DrawText(_L("Frameskip auto"),TPoint(0,iFontHeight*9),iScrMode==6);\r
-       }\r
-       else\r
-       {       \r
-               TBuf<64> skip;\r
-               skip.Format(_L("Frameskip %d"),iFrameSkip);\r
-               iView->DrawText(skip,TPoint(0,iFontHeight*9),iScrMode==6);\r
-       }\r
-\r
-       if(PicoOpt & 0x40)\r
-       {\r
-       iView->DrawText(_L("Accurate timing on"),TPoint(0,iFontHeight*10),iScrMode==7);\r
-       }\r
-       else\r
-       {\r
-       iView->DrawText(_L("Accurate timing off"),TPoint(0,iFontHeight*10),iScrMode==7);\r
-       }\r
-\r
-       if(PicoOpt & 0x80)\r
-       {\r
-       iView->DrawText(_L("Accurate sprites on"),TPoint(0,iFontHeight*11),iScrMode==8);\r
-       }\r
-       else\r
-       {\r
-       iView->DrawText(_L("Accurate sprites off"),TPoint(0,iFontHeight*11),iScrMode==8);\r
-       }\r
-\r
-       if(PicoOpt & 0x10)\r
-       {\r
-       iView->DrawText(_L("Alt. renderer on"),TPoint(0,iFontHeight*12),iScrMode==9);\r
-       }\r
-       else\r
-       {\r
-       iView->DrawText(_L("Alt. renderer off"),TPoint(0,iFontHeight*12),iScrMode==9);\r
-       }\r
-\r
-       iView->DrawText(iRegNames->MdcaPoint(regionIndex),TPoint(0,iFontHeight*13),iScrMode==10);\r
-       \r
-}\r
-\r
-void CPicoDriveUi::PutSoundSelect()\r
-{\r
-       iView->Clear();\r
-       iView->DrawText(_L("PicoDrive S60"),TPoint(0,0));\r
-       iView->DrawText(_L("Sound options"),TPoint(0,iFontHeight));\r
-       if (PicoOpt&4)\r
-               iView->DrawText(_L("Z80 enabled"),TPoint(0,iFontHeight*3),iSndSelection==EEnableZ80);\r
-       else\r
-               iView->DrawText(_L("Z80 disabled"),TPoint(0,iFontHeight*3),iSndSelection==EEnableZ80);\r
-       if (PicoOpt&1)\r
-               iView->DrawText(_L("YM2612 enabled"),TPoint(0,iFontHeight*4),iSndSelection==EEnableYM2612);\r
-       else\r
-               iView->DrawText(_L("YM2612 disabled"),TPoint(0,iFontHeight*4),iSndSelection==EEnableYM2612);\r
-       \r
-       if (PicoOpt&2)\r
-               iView->DrawText(_L("SN76496 enabled"),TPoint(0,iFontHeight*5),iSndSelection==EEnableSN76496);\r
-       else\r
-               iView->DrawText(_L("SN76496 disabled"),TPoint(0,iFontHeight*5),iSndSelection==EEnableSN76496);\r
-       \r
-       \r
-       TBuf<32> vol;\r
-       vol.Format(_L("Volume %d"),iSoundVolume*10);\r
-       iView->DrawText(vol,TPoint(0,iFontHeight*6),iSndSelection==ESoundVolume);\r
-\r
-       vol.Format(_L("Sample rate %dKhz"),PsndRate/1000);\r
-       iView->DrawText(vol,TPoint(0,iFontHeight*7),iSndSelection==ESoundRate);\r
-}\r
-\r
-\r
-void CPicoDriveUi::PutCheatSelect()\r
-{\r
-       iView->Clear();\r
-       iView->DrawText(_L("PicoDrive S60"),TPoint(0,0));\r
-       iView->DrawText(_L("Cheat options"),TPoint(0,iFontHeight));\r
-\r
-       iView->DrawText(_L("Add cheat"),TPoint(0,iFontHeight*3),iCheatSelection==EAddCheat);\r
-       iView->DrawText(_L("Clear cheats"),TPoint(0,iFontHeight*4),iCheatSelection==EClearCheats);\r
-       TInt noCheats = 0;\r
-       TBuf<17>cheatCode;\r
-\r
-       for(TInt i = iListOffset; (i < 256)&&(noCheats<5); i++)\r
-                       {\r
-                               if (Liste_GG[i].code[0] != 0)\r
-                               {\r
-\r
-                                       TRgb textColour = Liste_GG[i].active?KRgbGreen:KRgbDarkGreen;\r
-                                       if(iCheatSelection == 2+(i-iListOffset))\r
-                                       {\r
-                                               textColour = Liste_GG[i].active?KRgbRed:KRgbDarkRed;\r
-                                       }\r
-\r
-                                       TPtrC8 ptr((const unsigned char*)Liste_GG[i].code,strlen(Liste_GG[i].code));\r
-                                       cheatCode.Copy(ptr);                                                                            \r
-\r
-                                       iView->DrawText(cheatCode,TPoint(0,iFontHeight*(5+noCheats)),EFalse,textColour);\r
-                               \r
-                                       noCheats++;\r
-                               }\r
-                       }\r
-\r
-       iView->DrawText(_L("Supports GG & Patch"),TPoint(0,iFontHeight*11));\r
-       iView->DrawText(_L("GG: XXXX-XXXX"),TPoint(0,iFontHeight*12));\r
-       iView->DrawText(_L("Patch: XXXXXX:YYYY"),TPoint(0,iFontHeight*13));\r
-}\r
-\r
-void CPicoDriveUi::PutControllerSelect()\r
-{\r
-       iView->Clear();\r
-       iView->DrawText(_L("PicoDrive S60"),TPoint(0,0));\r
-       iView->DrawText(_L("Controller options"),TPoint(0,iFontHeight));\r
-               if (iEnableSixButtons)\r
-               iView->DrawText(_L("6 button pad"),TPoint(0,iFontHeight*3),iCtrlSelection==EControllerType);\r
-       else\r
-               iView->DrawText(_L("3 button pad"),TPoint(0,iFontHeight*3),iCtrlSelection==EControllerType);\r
-       iView->DrawText(_L("Configure keys"),TPoint(0,iFontHeight*4),iCtrlSelection==EConfigControls);\r
-\r
-\r
-\r
-}\r
-\r
-\r
-void CPicoDriveUi::PutConfigKeys()\r
-{\r
-       iView->DrawText(_L("PicoDrive S60"),TPoint(0,0));\r
-       iView->DrawText(_L("Configure keys"),TPoint(0,iFontHeight));\r
-       iView->DrawText(_L("Please press:"),TPoint(0,iFontHeight*3));\r
-       iView->DrawText(iKeyNames->MdcaPoint(iCurrentScan),TPoint(0,iFontHeight*4));\r
-\r
-       iView->DrawText(_L("Press 'C' to skip this!"),TPoint(0,iFontHeight*6));\r
-\r
-}\r
-\r
-TInt CPicoDriveUi::IdleCallBackStop(TAny* /*aAppUi*/)\r
-{\r
-       CActiveScheduler::Stop();\r
-       return 0;\r
-}\r
-\r
-TInt CPicoDriveUi::StartEmulatorL(TAny* aAppUi)\r
-{\r
-       static_cast<CPicoDriveUi*>(aAppUi)->StartEmulatorL();\r
-       return 0;\r
-}\r
-\r
-void CPicoDriveUi::HandleForegroundEventL(TBool aForeground)\r
-{\r
-       if(iView != NULL)\r
-       {\r
-               iView->iForeground=aForeground;\r
-       }\r
-\r
-       if(!aForeground)\r
-       {\r
-               if(iView != NULL)\r
-               {\r
-                       iView->AbortNow(RDirectScreenAccess::ETerminateCancel);\r
-               }\r
-       }\r
-       else\r
-       {\r
-               if(iView != NULL)\r
-               {\r
-               iView->Restart(RDirectScreenAccess::ETerminateCancel);\r
-               UpdateScreen();\r
-               }\r
-\r
-               SetKeyBlockMode(ENoKeyBlock);\r
-       }\r
-       \r
-}\r
-\r
-void CPicoDriveUi::UpdateScreen()\r
-{\r
-       if(!iEmuRunning)\r
-       {\r
-               iView->Clear();\r
-               if(iCurrentScan>=0)\r
-               {\r
-                       PutConfigKeys();\r
-               }\r
-               else if(iPicoMenu==ESelectScrMenu)\r
-               {\r
-                       PutScreenSelect();\r
-               }\r
-               else if (iPicoMenu==EAboutPicoMenu)\r
-               {\r
-                       PutAbout(ETrue);\r
-               }\r
-               else if (iPicoMenu==ESelectSoundMenu)\r
-               {\r
-                       PutSoundSelect();\r
-               }\r
-               else if (iPicoMenu==ESelectControlsMenu)\r
-               {\r
-                       PutControllerSelect();\r
-               }\r
-               else if (iPicoMenu==ESelectCheatMenu)\r
-               {\r
-                       PutCheatSelect();\r
-               }\r
-               else \r
-                       PutMainMenu();\r
-               \r
-       }\r
-}\r
-\r
-void CPicoDriveUi::StartEmulatorL()\r
-{      \r
-       iView->Clear();\r
-       TTime time;\r
-       time.HomeTime();\r
-#ifdef S60V3\r
-       LastSecond=(TInt)(time.Int64()/1000);//GetTickCount(); \r
-#else\r
-       LastSecond=(TInt)(time.Int64()/1000).GetTInt();//GetTickCount(); \r
-#endif\r
-       FramesDone=0;\r
-       \r
-       iSndStream->SetVolume((iSndStream->MaxVolume()*iSoundVolume)/10);\r
-       UpdatePSndRate();\r
-\r
-       while(iEmuRunning)\r
-       {       \r
-               EmulateFrame();\r
-       }\r
-       iSndStream->Stop();\r
-       iView->Clear();\r
-       PutMainMenu();\r
-       \r
-}\r
-\r
-/**\r
- * Calculates the palette table 0-4096\r
- */\r
-void CPicoDriveUi::CalculatePaletteTable()\r
-{\r
-       for(TInt cram =0;cram<4096;cram++)\r
-       {\r
-               if(iDisplayMode == EColor4K)\r
-               {\r
-                       unsigned short high=0x111;\r
-                       high|=(cram&0x00e)<<8; // Red\r
-                       high|=(cram&0x0e0); // Green\r
-                       high|=(cram&0xe00)>> 8; // Blue\r
-                       gColorMapTab[cram] =  high;\r
-               }\r
-               else // 64K color mode\r
-               {\r
-                       unsigned short high=0x0841;\r
-                       // Convert 0000bbbb ggggrrrr\r
-                       // to      rrrr1ggg g10bbbb1\r
-                       high|=(cram&0x00f)<<12; // Red\r
-                       high|=(cram&0x0f0)<< 3; // Green\r
-                       high|=(cram&0xf00)>> 7; // Blue\r
-                       gColorMapTab[cram] = high;\r
-               }\r
-       }\r
-}\r
-\r
-int CPicoDriveUi::TargetInit()\r
-{\r
-       PicoCram=NULL;\r
-       TUint16 currentLine = 0;\r
-       TReal xFactor = 1;\r
-       TReal xNarrowFactor = 1;\r
-       TReal yFactor = 1;\r
-       TInt loop;\r
-\r
-       memset(framebuff,0,framebuffsize);\r
-\r
-       if(iScrMode==0)\r
-       {\r
-#ifdef S60V3\r
-               xFactor = ((TReal)Targ.view.iBr.iX/(TReal)320);\r
-               xNarrowFactor = ((TReal)Targ.view.iBr.iX/(TReal)256);\r
-               \r
-               if(xFactor>1)\r
-                       xFactor = 1;\r
-               \r
-               if(xNarrowFactor>1)\r
-                       xNarrowFactor = 1;\r
-\r
-               yFactor = ((TReal)Targ.view.iBr.iY/(TReal)240);\r
-\r
-               if(yFactor>1)\r
-                       yFactor = 1;            \r
-               \r
-               for(loop = 0;loop<256;loop++)\r
-               {\r
-                       TInt line = (loop*xNarrowFactor);\r
-                       TInt nextLine = ((loop+1)*xNarrowFactor);\r
-                       if(line != nextLine)\r
-                       {\r
-                               gNarrowColumnStepTable[loop] = 1;\r
-                       }\r
-                       else\r
-                       {\r
-                               gNarrowColumnStepTable[loop] = 0;\r
-                       }                               \r
-               }\r
-               \r
-               for(loop = 0;loop<320;loop++)\r
-               {\r
-                       TInt line = (loop*xFactor);\r
-                       TInt nextLine = ((loop+1)*xFactor);\r
-                       if( line != nextLine) \r
-                       {\r
-                               gColumnStepTable[loop] = 1;\r
-                       }\r
-                       else\r
-                       {\r
-                               gColumnStepTable[loop] = 0;\r
-                       }               \r
-               }\r
-\r
-               for(TInt loop = 0;loop<240;loop++)\r
-               {\r
-                       gLineTable[loop] = currentLine;\r
-                       if((loop*yFactor) != ((loop+1)*yFactor))\r
-                               currentLine++;\r
-               }\r
-               myPicoScan=EmulateScan16;\r
-               \r
-#else\r
-               if(iInterpolate)\r
-                       myPicoScan=EmulateScan16_176Interpolate;\r
-               else\r
-                       myPicoScan=EmulateScan16_176;\r
-               for(TInt loop = 0;loop<240;loop++)\r
-               {\r
-                       gLineTable[loop] = currentLine;\r
-                       if(((loop*3)/4) != (((loop+1)*3)/4))\r
-                               currentLine++;\r
-               }\r
-#endif\r
-               KBitValTable[0] = 1;\r
-               KBitValTable[1] = 2;\r
-               KBitValTable[2] = 4;\r
-               KBitValTable[3] = 8;\r
-       }\r
-#ifdef S60V3\r
-       else if (iScrMode == 1 || iScrMode == 2)\r
-       {\r
-               xFactor = ((TReal)Targ.view.iBr.iY/(TReal)320);\r
-               xNarrowFactor = ((TReal)Targ.view.iBr.iY/(TReal)256);   \r
-\r
-               if(xFactor>2)\r
-                       xFactor = 2;\r
-               \r
-               if(xNarrowFactor>2)\r
-                       xNarrowFactor = 2;\r
-\r
-               yFactor = ((TReal)Targ.view.iBr.iX/(TReal)240);\r
-               if(yFactor>2)\r
-                       yFactor = 2;\r
-               \r
-               for(loop = 0;loop<256;loop++)\r
-               {\r
-                       TInt col = (loop*xNarrowFactor);\r
-                       TInt nextCol= ((loop+1)*xNarrowFactor);\r
-               \r
-                       gNarrowColumnStepTable[loop] = nextCol-col;;                                            \r
-               }\r
-               \r
-               for(loop = 0;loop<320;loop++)\r
-               {\r
-                       TInt col = (loop*xFactor);\r
-                       TInt nextCol= ((loop+1)*xFactor);\r
-               \r
-                       gColumnStepTable[loop] = nextCol-col;;\r
-               }\r
-\r
-               for(TInt loop = 0;loop<240;loop++)\r
-               {\r
-                       gLineTable[loop] = currentLine;\r
-                       TInt line = (loop*yFactor);\r
-                       TInt nextLine = ((loop+1)*yFactor);\r
-                       currentLine+=(nextLine-line);\r
-               }\r
-               if(iScrMode == 2)\r
-               {\r
-                       KBitValTable[0] = 4;\r
-                       KBitValTable[1] = 8;\r
-                       KBitValTable[2] = 2;\r
-                       KBitValTable[3] = 1;\r
-                       myPicoScan=EmulateScanFullRight16;\r
-               }\r
-               else\r
-               {\r
-                       KBitValTable[0] = 8;\r
-                       KBitValTable[1] = 4;\r
-                       KBitValTable[2] = 1;\r
-                       KBitValTable[3] = 2;\r
-                       myPicoScan=EmulateScanFull16;\r
-               }\r
-#else\r
-else if (iScrMode == 1)\r
-{\r
-               if(iInterpolate)\r
-                       myPicoScan=EmulateScanFull16_176Interpolate;\r
-               else\r
-                       myPicoScan=EmulateScanFull16_176;\r
-\r
-               for(TInt loop = 0;loop<240;loop++)\r
-               {\r
-                       gLineTable[loop] = currentLine;\r
-                       if(((loop*3)/4) != (((loop+1)*3)/4))\r
-                               currentLine++;\r
-               }\r
-               KBitValTable[0] = 8;\r
-               KBitValTable[1] = 4;\r
-               KBitValTable[2] = 1;\r
-               KBitValTable[3] = 2;\r
-#endif \r
-       }\r
-#ifndef S60V3\r
-       else if(iScrMode==2)\r
-       {\r
-               if(iInterpolate)\r
-                       myPicoScan=EmulateScanFullRight16_176Interpolate;\r
-               else\r
-                       myPicoScan=EmulateScanFullRight16_176;\r
-               for(TInt loop = 0;loop<240;loop++)\r
-               {\r
-                       gLineTable[loop] = currentLine;\r
-                       if(((loop*3)/4) != (((loop+1)*3)/4))\r
-                               currentLine++;\r
-               }\r
-               KBitValTable[0] = 4;\r
-               KBitValTable[1] = 8;\r
-               KBitValTable[2] = 2;\r
-               KBitValTable[3] = 1;\r
-       }\r
-#endif\r
-       else \r
-       {\r
-#ifdef S60V3\r
-               xFactor = ((TReal)Targ.view.iBr.iX/(TReal)320);\r
-               xNarrowFactor = ((TReal)Targ.view.iBr.iX/(TReal)256);\r
-               \r
-               if(xFactor>2)\r
-                       xFactor = 2;\r
-               \r
-               if(xNarrowFactor>2)\r
-                       xNarrowFactor = 2;\r
-\r
-               yFactor = ((TReal)Targ.view.iBr.iY/(TReal)240);\r
-\r
-               if(yFactor>2)\r
-                       yFactor = 2;            \r
-               \r
-               for(loop = 0;loop<256;loop++)\r
-               {\r
-                       TInt col = (loop*xNarrowFactor);\r
-                       TInt nextCol= ((loop+1)*xNarrowFactor);\r
-               \r
-                       gNarrowColumnStepTable[loop] = nextCol-col;;                                            \r
-               }\r
-               \r
-               for(loop = 0;loop<320;loop++)\r
-               {\r
-                       TInt col = (loop*xFactor);\r
-                       TInt nextCol= ((loop+1)*xFactor);\r
-               \r
-                       gColumnStepTable[loop] = nextCol-col;;\r
-               }\r
-\r
-               for(TInt loop = 0;loop<240;loop++)\r
-               {\r
-                       gLineTable[loop] = currentLine;\r
-                       TInt line = (loop*yFactor);\r
-                       TInt nextLine = ((loop+1)*yFactor);\r
-                       currentLine+=(nextLine-line);\r
-               }\r
-               myPicoScan=EmulateStretchScan16;\r
-#else\r
-               if(iScrMode == 4)\r
-               {\r
-                       myPicoScan=EmulateStretchScan16_320;\r
-                       iInterpolate = EFalse; // not needed\r
-               }\r
-               else\r
-               {\r
-               if(iInterpolate)\r
-                       myPicoScan=EmulateStretchScan16_176Interpolate;\r
-               else\r
-                       myPicoScan=EmulateStretchScan16_176;\r
-               }\r
-\r
-               for(TInt loop = 0;loop<240;loop++)\r
-               {\r
-                       gLineTable[loop] = currentLine;\r
-                       if(((loop*15)/16) != (((loop+1)*15)/16))\r
-                               currentLine++;\r
-               }\r
-#endif\r
-               KBitValTable[0] = 1;\r
-               KBitValTable[1] = 2;\r
-               KBitValTable[2] = 4;\r
-               KBitValTable[3] = 8;\r
-       }\r
-       \r
-       if(iView)\r
-               iView->SetRect(TRect(TPoint(0,0),iEikonEnv->ScreenDevice()->SizeInPixels()));\r
-#ifdef S60V3\r
-       switch(iScrMode)\r
-       {\r
-       case 0:\r
-       case 3:\r
-       case 4:\r
-               iPutRect=TRect(TPoint(0,0),TSize(xFactor*320,yFactor*240));\r
-               iPutPoint=TPoint(Targ.view.Size().iWidth/2-iPutRect.Size().iWidth/2,Targ.view.Size().iHeight/2-iPutRect.Size().iHeight/2);\r
-               \r
-               break;\r
-       case 1:\r
-       case 2:\r
-               iPutRect=TRect(TPoint(0,0),TSize(yFactor*240,xFactor*320));\r
-               iPutPoint=TPoint(Targ.view.Size().iWidth/2-iPutRect.Size().iWidth/2,Targ.view.Size().iHeight/2-iPutRect.Size().iHeight/2);\r
-               break;\r
-\r
-       }\r
-#else\r
-       switch(iScrMode)\r
-       {\r
-       case 0:\r
-               iPutPoint=TPoint(0,20);\r
-               iPutRect=TRect(TPoint(0,0),TSize(176,168));     \r
-               break;\r
-       case 1:\r
-       case 2:\r
-               iPutPoint=TPoint(4,1);\r
-               iPutRect=TRect(TPoint(4,1),TSize(168,205));\r
-\r
-               break;\r
-       case 3:\r
-       case 4:\r
-               iPutPoint=TPoint(0,0);\r
-               iPutRect=TRect(TPoint(0,0),TSize(176,208));\r
-               break;\r
-       }\r
-#endif\r
-       CalulateLineStarts();\r
-       return 0;\r
-}\r
-#ifdef S60V3\r
-#define KCenterOffset 8\r
-#else\r
-#define KCenterOffset 0\r
-#endif\r
-void CPicoDriveUi::CalulateLineStarts()\r
-{\r
-       switch(iScrMode)\r
-       {\r
-       case 0:\r
-       case 3:\r
-       case 4:\r
-               {\r
-                       for(TInt loop = 0;loop<Targ.view.Size().iHeight;loop++)\r
-                       {\r
-                               gLineOffsets[loop] = loop*Targ.scanline_length;\r
-                       }\r
-               }break;\r
-       case 1:\r
-               {               \r
-                       for(TInt loop = 0;loop<Targ.view.Size().iHeight;loop++)\r
-                       {\r
-                               gLineOffsets[loop] = loop*2+Targ.screen_offset+KCenterOffset;\r
-                       }\r
-               }break;\r
-       case 2:\r
-               {\r
-                       for(TInt loop = 0;loop<Targ.view.Size().iHeight;loop++)\r
-                       {\r
-                               gLineOffsets[loop] = Targ.scanline_length-loop*2-KCenterOffset;\r
-                       }\r
-               }break; \r
-       }\r
-}\r
-\r
-bool IsZip(char *filename)\r
-{\r
-       unsigned char buf[2];\r
-       FILE *fp;\r
-       \r
-       if((fp=fopen(filename,"rb"))!=NULL)\r
-       {\r
-               fread(buf, 2, 1, fp);\r
-               fclose(fp);\r
-               return(memcmp(buf,"PK",2)==0);\r
-       }\r
-       if(fp)fclose(fp);\r
-       return false;\r
-}\r
-\r
-int CPicoDriveUi::EmulateInit()\r
-{\r
-       FILE *f=NULL;\r
-       EmulateExit(); // Make sure exited\r
-       TargetInit(); // Find out where to put the screen\r
-       PicoInit();\r
-       // Load cartridge\r
-       if(IsZip(RomName))\r
-       {\r
-               if(CartLoadZip(RomName,&RomData,&RomSize))\r
-               {               \r
-                       return 1;\r
-               }\r
-       }\r
-       else\r
-       {\r
-               // Load cartridge\r
-               RFile file;\r
-               TInt error = file.Open(iEikonEnv->FsSession(),iRomName,0);\r
-               file.Close();\r
-               f=fopen(RomName,"rb"); \r
-               if (f==NULL) \r
-                       return 1;\r
-               TInt result =PicoCartLoad(f,&RomData,&RomSize);\r
-               fclose(f);\r
-               if(result)\r
-                       return 1; // failed to load cart\r
-       }\r
-       \r
-       TParsePtr parser(iRomName);\r
-       TPtr8 ptr(Pico.rom_name,511);\r
-       ptr.Copy(parser.DriveAndPath());\r
-       ptr.Append(parser.Name());\r
-       ptr.ZeroTerminate();\r
-\r
-       PicoCartInsert(RomData,RomSize);\r
-       Load_Patch_File();\r
-       saveLoadGame(1, 1); // load sram if any saved\r
-\r
-       if(!iEnableSixButtons)\r
-               PicoOpt=PicoOpt& 223;\r
-       else\r
-               PicoOpt=PicoOpt|32;     \r
-       return 0;\r
-}\r
-\r
-void CPicoDriveUi::EmulateExit()\r
-{\r
-       // Save sram if any\r
-       if(RomData != NULL)\r
-       {\r
-               if(SRam.changed)\r
-               {\r
-               saveLoadGame(0,1);\r
-               SRam.changed = 0;\r
-               }\r
-\r
-               Save_Patch_File();\r
-               // Remove cartridge\r
-               PicoCartInsert(NULL,0);\r
-               PicoUnloadCart(RomData);\r
-               RomData=NULL; RomSize=0;\r
-       }\r
-       PicoExit();\r
-}\r
-\r
-int CPicoDriveUi::InputFrame()\r
-{\r
-       if(PicoOpt & 3)\r
-       {\r
-               PsndOut=(short*)(iMonoSound.Ptr()+2*iCurrentSeg*PsndLen);\r
-       }\r
-       else\r
-       {\r
-               PsndOut=NULL;\r
-       }\r
-\r
-       Patch_Codes();\r
-\r
-       PicoFrame();\r
-\r
-       if(PicoOpt & 3)\r
-       {\r
-               iCurrentSeg++;\r
-               if(iCurrentSeg==6)\r
-               {\r
-                       iMonoSound.SetLength(PsndLen*2*6);\r
-                       iSndStream->WriteL(iMonoSound);\r
-                       iCurrentSeg=0;\r
-               }\r
-       }\r
-       \r
-       TCallBack callback(IdleCallBackStop,this);\r
-       iIdleCallBack.Cancel();\r
-       iIdleCallBack.Set(callback);\r
-       iIdleCallBack.CallBack();\r
-       CActiveScheduler::Start();\r
-       \r
-       \r
-       PicoPad[0]=iPad1;\r
-       return 0;\r
-}\r
-\r
-\r
-\r
-int CPicoDriveUi::EmulateFrame()\r
-{\r
-       int i=0,need=2;\r
-       if (!iRomLoaded) \r
-               return 1;\r
-       // Speed throttle:\r
-       if(iFrameSkip ==-1) // auto skipping\r
-       {\r
-               int time=0,frame=0;\r
-               TTime newtime;\r
-               newtime.HomeTime();\r
-#ifdef S60V3\r
-               TInt64 tic=(newtime.Int64()/1000);\r
-               time=(tic-LastSecond); // This will be about 0-1000 ms\r
-#else\r
-               TInt64 tic=(newtime.Int64()/1000).GetTInt();\r
-               time=(tic-LastSecond).GetTInt(); // This will be about 0-1000 ms\r
-#endif\r
-               frame=time*FramesPerSecond/1000;\r
-               need=frame-FramesDone;\r
-               FramesDone=frame;\r
-               \r
-               if (FramesPerSecond>0)\r
-               {\r
-                       // Carry over any >60 frame count to one second\r
-                       while (FramesDone>=FramesPerSecond) { FramesDone-=FramesPerSecond; LastSecond+=1000; }\r
-               }\r
-               \r
-               if (need<=0) { \r
-                       TTime nextTime;\r
-                       do\r
-                       {\r
-                       nextTime.HomeTime();\r
-                       }while((nextTime.Int64()-newtime.Int64())<15000);\r
-               }\r
-               if (need>10) need=10; // Limit frame skipping\r
-       }\r
-       else\r
-       {\r
-               need = iFrameSkip+1;\r
-       }\r
-       PicoSkipFrame=1;\r
-       for (i=0;i<need-1;i++) InputFrame(); // Frame skip if needed\r
-       PicoSkipFrame=0;\r
-\r
-       // Now final frame is drawn:\r
-       TBitmapUtil util(iBackBuffer);\r
-       util.Begin(TPoint(0,0));\r
-       Targ.screen=(unsigned char*)iBackBuffer->DataAddress();\r
-       \r
-       if (Targ.screen == NULL) \r
-       {\r
-               util.End();\r
-               return 1;\r
-       }\r
-       \r
-       PicoScan=myPicoScan; // Setup scanline callback\r
-       InputFrame();\r
-\r
-\r
-       if(PicoOpt & 0x10) // need to render separatly\r
-       {\r
-               unsigned short* framebuffptr = framebuff+2632;\r
-\r
-               if(!(Pico.video.reg[12]&1))\r
-               {\r
-                       framebuffptr=framebuffptr-32;\r
-               }\r
-\r
-               TInt skipNext =0;\r
-               for(TInt loop = 0;loop<224;loop++)\r
-               {\r
-                       if(skipNext == 0)\r
-                       {\r
-                               skipNext = PicoScan(loop,framebuffptr);\r
-                       }\r
-                       else\r
-                               skipNext--;\r
-                       framebuffptr+=328;\r
-               }\r
-       }\r
-       PicoScan=NULL;\r
-       util.End();\r
-\r
-       Targ.screen = NULL;\r
-       \r
-       iView->PutBitmap(iBackBuffer,iPutPoint,iPutRect);;\r
-       \r
-       return 0;\r
-}\r
-\r
-\r
-void CPicoDriveUi::MaoscOpenComplete(TInt aError)\r
-{\r
-       if(aError == KErrNone)\r
-       {\r
-               iSndStream->SetPriority(EPriorityMuchMore, EMdaPriorityPreferenceNone);\r
-               iSndStream->SetVolume((iSndStream->MaxVolume()*iSoundVolume)/10);\r
-               if(!UpdatePSndRate())\r
-               {\r
-                       PsndRate = 8000;\r
-                       UpdatePSndRate();\r
-               }\r
-       }\r
-       CActiveScheduler::Stop();\r
-}\r
-\r
-void CPicoDriveUi::MaoscBufferCopied(TInt /*aError*/, const TDesC8& /*aBuffer*/)\r
-{\r
-}\r
-\r
-void CPicoDriveUi::MaoscPlayComplete(TInt aError)\r
-{\r
-       if(aError != KErrNone)\r
-       {\r
-               iSndStream->SetVolume((iSndStream->MaxVolume()*iSoundVolume)/10);\r
-               UpdatePSndRate();\r
-       }\r
-}\r
-\r
-TBool CPicoDriveUi::UpdatePSndRate()\r
-{\r
-       TInt sampleRate = TMdaAudioDataSettings::ESampleRate8000Hz;\r
-       if(PsndRate == 11025)\r
-               sampleRate = TMdaAudioDataSettings::ESampleRate11025Hz;\r
-       else if (PsndRate == 16000)\r
-               sampleRate = TMdaAudioDataSettings::ESampleRate16000Hz;\r
-       else if (PsndRate == 22050)\r
-               sampleRate = TMdaAudioDataSettings::ESampleRate22050Hz;\r
-\r
-       TRAPD(err,iSndStream->SetAudioPropertiesL(sampleRate,TMdaAudioDataSettings::EChannelsMono));\r
-       return (err == KErrNone);\r
-}\r
-\r
-size_t gzRead2(void *p, size_t _size, size_t _n, void *file)\r
-{\r
-       return gzread(file, p, _n);\r
-}\r
-\r
-\r
-size_t gzWrite2(void *p, size_t _size, size_t _n, void *file)\r
-{\r
-       return gzwrite(file, p, _n);\r
-}\r
-\r
-\r
-\r
-// this function is shared between both threads\r
-int CPicoDriveUi::saveLoadGame(int load, int sram)\r
-{\r
-       int res = 0;\r
-       \r
-       if(!(iRomName.Length()>0)) return -1;\r
-       \r
-       // make save filename\r
-       strcpy(saveFname,RomName);\r
-       saveFname[KMaxFileName-5] = 0;\r
-       if(saveFname[strlen(saveFname)-4] == '.') saveFname[strlen(saveFname)-4] = 0;\r
-       strcat(saveFname, sram ? ".srm" : ".mds");\r
-       \r
-       if(sram) {\r
-               int sram_size = SRam.end-SRam.start+1;\r
-               if(SRam.reg_back & 4) sram_size=0x2000;\r
-               if(!SRam.data) return 0; // SRam forcefully disabled for this game\r
-               if(load) {\r
-                       PmovFile = fopen(saveFname, "rb");\r
-                       if(!PmovFile) return -1;\r
-                       fread(SRam.data, 1, sram_size, (FILE *) PmovFile);\r
-                       fclose((FILE *) PmovFile);\r
-               } else {\r
-                       // sram save needs some special processing\r
-                       // see if we have anything to save\r
-                       for(; sram_size > 0; sram_size--)\r
-                               if(SRam.data[sram_size-1]) break;\r
-                               \r
-                               if(sram_size) {\r
-                                       PmovFile = fopen(saveFname, "wb");\r
-                                       res = fwrite(SRam.data, 1, sram_size, (FILE *) PmovFile);\r
-                                       res = (res != sram_size) ? -1 : 0;\r
-                                       fclose((FILE *) PmovFile);\r
-                               }\r
-               }\r
-               PmovFile = 0;\r
-               return res;\r
-       } else {\r
-               // try gzip first\r
-               //if(currentConfig.iFlags & 0x80) {\r
-               strcat(saveFname, ".gz");\r
-               if( (PmovFile = gzopen(saveFname, load ? "rb" : "wb")) ) {\r
-                       areaRead  = gzRead2;\r
-                       areaWrite = gzWrite2;\r
-                       if(!load) gzsetparams(PmovFile, 9, Z_DEFAULT_STRATEGY);\r
-               } else\r
-                       saveFname[strlen(saveFname)-3] = 0;\r
-               //      }\r
-               \r
-               if(!PmovFile) { // gzip failed or was disabled\r
-                       if( (PmovFile = fopen(saveFname, load ? "rb" : "wb")) ) {\r
-                               areaRead  = (arearw *) fread;\r
-                               areaWrite = (arearw *) fwrite;\r
-                       }\r
-               }\r
-               if(PmovFile) {\r
-                       PmovAction = load ? 6 : 5; // load/save\r
-                       PmovState();\r
-                       if(areaRead == gzRead2)\r
-                               gzclose(PmovFile);\r
-                       else fclose ((FILE *) PmovFile);\r
-                       PmovFile = 0;\r
-               } else {\r
-                       res = -1;\r
-               }\r
-               \r
-               return res;\r
-       }\r
-       \r
-}\r
-\r
-CQPicoDriveView::~CQPicoDriveView()\r
-{\r
-       iDsa->Cancel();\r
-       delete iDsa;\r
-}\r
-\r
-void CQPicoDriveView::Restart(RDirectScreenAccess::TTerminationReasons /*aReason*/)\r
-{\r
-       if(iForeground)\r
-       {\r
-               iDsa->Cancel();\r
-               iDsa->StartL();\r
-               iDsa->Gc()->SetClippingRegion(iDsa->DrawingRegion());\r
-               iDrawingOn=ETrue;\r
-       }\r
-}\r
-\r
-void CQPicoDriveView::AbortNow(RDirectScreenAccess::TTerminationReasons /*aReason*/)\r
-{\r
-       iDsa->Cancel();\r
-       iDrawingOn=EFalse;\r
-}\r
-\r
-\r
-\r
-void CQPicoDriveView::Draw(const TRect& aRect) const\r
-{\r
-       CWindowGc& gc=SystemGc();\r
-       \r
-       gc.SetBrushColor(KRgbBlack);\r
-       gc.SetBrushStyle(CGraphicsContext::ESolidBrush);\r
-       gc.SetPenStyle(CGraphicsContext::ENullPen);\r
-       gc.DrawRect(aRect);\r
-       static_cast<CPicoDriveUi*>(iEikonEnv->EikAppUi())->StartAsynchUpdate();\r
-}\r
-\r
-void CQPicoDriveView::ConstructL()\r
-{\r
-       CreateWindowL();\r
-       ActivateL();\r
-       SetFocus(ETrue);\r
-       SetRect(TRect(TPoint(0,0),iEikonEnv->ScreenDevice()->SizeInPixels())/*iEikonEnv->EikAppUi()->ClientRect()*/);\r
-       iDsa=CDirectScreenAccess::NewL(iEikonEnv->WsSession(),*iEikonEnv->ScreenDevice(),Window(),*this);\r
-       iDsa->StartL();\r
-       iDsa->Gc()->SetClippingRegion(iDsa->DrawingRegion());\r
-       iDrawingOn=ETrue;\r
-       if(Window().DisplayMode() != EColor4K && Window().DisplayMode() != EColor64K)\r
-       {\r
-               Window().SetRequiredDisplayMode(EColor64K); // Try to set 64K color mode\r
-       }\r
-}\r
-void CQPicoDriveView::Clear()\r
-{\r
-       CBitmapContext* gc;\r
-       if(iDrawingOn)\r
-       {\r
-               gc=iDsa->Gc();\r
-       }\r
-       else\r
-       {\r
-               ActivateGc();\r
-               gc=&SystemGc();\r
-       }\r
-       \r
-       gc->SetBrushColor(KRgbBlack);\r
-       gc->SetBrushStyle(CGraphicsContext::ESolidBrush);\r
-       gc->SetPenStyle(CGraphicsContext::ENullPen);\r
-       gc->DrawRect(Rect());   \r
-       if(iDrawingOn)\r
-       {\r
-               iDsa->ScreenDevice()->Update();\r
-               iEikonEnv->WsSession().Flush();\r
-       }\r
-       else\r
-       {\r
-               DeactivateGc();\r
-       }\r
-}\r
-\r
-void CQPicoDriveView::DrawText(const TDesC& aText,TPoint aPoint,TBool aHighLight,TRgb aTextColour)\r
-{\r
-       CBitmapContext* gc;\r
-       if(iDrawingOn)\r
-       {\r
-               gc=iDsa->Gc();\r
-       }\r
-       else\r
-       {\r
-               ActivateGc();\r
-               gc=&SystemGc();\r
-       }\r
-       \r
-       gc->SetBrushColor(KRgbBlack);\r
-       gc->SetBrushStyle(CGraphicsContext::ESolidBrush);\r
-       if(!aHighLight)\r
-       {\r
-               gc->SetPenColor(aTextColour);\r
-       }\r
-       else\r
-       {\r
-               gc->SetPenColor(KRgbRed);\r
-       }\r
-       gc->SetPenStyle(CGraphicsContext::ESolidPen);\r
-       aPoint.iY+=iEikonEnv->NormalFont()->HeightInPixels()-2;\r
-       aPoint.iX=Size().iWidth/2-iEikonEnv->NormalFont()->TextWidthInPixels(aText)/2;\r
-       gc->UseFont(iEikonEnv->NormalFont());\r
-       gc->DrawText(aText,aPoint);\r
-       gc->DiscardFont();\r
-       \r
-       if(iDrawingOn)\r
-       {\r
-               iDsa->ScreenDevice()->Update();         \r
-       }\r
-       else\r
-       {\r
-               DeactivateGc();\r
-       }\r
-}\r
-\r
-TInt CQPicoDriveView::DrawTextInRect(const TDesC& aText,TRect aRect,TInt aStartPos)\r
-{\r
-       CBitmapContext* gc;\r
-       TInt pos = aStartPos;\r
-       TInt len = aText.Length();\r
-       if(iDrawingOn)\r
-       {\r
-               gc=iDsa->Gc();\r
-       }\r
-       else\r
-       {\r
-               ActivateGc();\r
-               gc=&SystemGc();\r
-       }\r
-       \r
-       gc->SetBrushColor(KRgbBlack);\r
-       gc->SetBrushStyle(CGraphicsContext::ESolidBrush);\r
-       \r
-       gc->SetPenColor(KRgbWhite);\r
-       \r
-       gc->SetPenStyle(CGraphicsContext::ESolidPen);\r
-       gc->UseFont(iEikonEnv->DenseFont());\r
-       while(pos<len && aRect.iTl.iY<aRect.iBr.iY-(iEikonEnv->DenseFont()->HeightInPixels()+3))\r
-       {\r
-               TInt newline = aText.Right(len-pos).Locate('\n');\r
-               if(newline == KErrNotFound)\r
-                       newline=(len-1)-pos;\r
-               gc->DrawText(aText.Mid(pos,newline),aRect,iEikonEnv->DenseFont()->HeightInPixels());\r
-               pos=pos+newline+1; // skip new line\r
-               aRect.iTl+=TSize(0,iEikonEnv->DenseFont()->HeightInPixels()+3);\r
-       }\r
-       gc->DiscardFont();\r
-       \r
-       if(iDrawingOn)\r
-       {\r
-               iDsa->ScreenDevice()->Update();\r
-       }\r
-       else\r
-       {\r
-               DeactivateGc();\r
-       }\r
-       return pos;\r
-}\r
-\r
-\r
-void CQPicoDriveView::PutBitmap(CFbsBitmap* aBitmap,TPoint aPoint,TRect aRect)\r
-{\r
-       if(iDrawingOn)\r
-       {\r
-               //#ifdef __WINS__\r
-               iDsa->Gc()->BitBlt(aPoint,aBitmap,aRect);\r
-               iDsa->ScreenDevice()->Update();\r
-               //#endif\r
-               //iEikonEnv->WsSession().Flush();\r
-       }\r
-       else\r
-       {\r
-               ActivateGc();\r
-               CWindowGc& gc=SystemGc();\r
-               gc.BitBlt(aPoint,aBitmap,aRect);\r
-               DeactivateGc();\r
-       }\r
-}\r
-\r
-\r
-\r
-void Execute()\r
-{\r
-       __UHEAP_MARK;\r
-       CTrapCleanup* cleanup = CTrapCleanup::New();\r
-       \r
-       // Create a eikenv\r
-       CEikonEnv* eikenv = new CEikonEnv;\r
-       if (!eikenv) \r
-       {\r
-               return /*KErrNoMemory*/;\r
-       }\r
-       TRAPD(eikErr, eikenv->ConstructL());\r
-       if (eikErr != KErrNone) \r
-       {\r
-               delete eikenv;\r
-               return /*eikErr*/;\r
-       }\r
-       CPicoDriveUi* appUi = new (ELeave) CPicoDriveUi;\r
-       if (!appUi) \r
-       {\r
-               delete eikenv;\r
-               return /*KErrNoMemory*/;\r
-       }\r
-       \r
-       TRAPD(constructErr,appUi->ConstructL());\r
-       \r
-       eikenv->SetAppUi(appUi);        // passing ownership of appUi to coe\r
-       \r
-       TInt leaveValue = KErrNone;     \r
-       if (leaveValue != KErrNone)\r
-       {\r
-               delete eikenv;\r
-       }\r
-       else\r
-       {\r
-               // now accept request from clients (start the scheduler)\r
-               eikenv->ExecuteD();\r
-               //delete eikenv;                                                        // ExecuteD kills eikenv\r
-               \r
-       }\r
-       \r
-       delete cleanup;\r
-       \r
-       __UHEAP_MARKEND;\r
-}\r
-\r
-//ARM build\r
-#ifdef S60V3\r
-CPicoDriveApp::CPicoDriveApp()\r
-{\r
-}\r
-\r
-CPicoDriveApp::~CPicoDriveApp()\r
-{\r
-}\r
-\r
-CApaDocument* CPicoDriveApp::CreateDocumentL()\r
-{\r
-       return new (ELeave) CPicoDriveDoc(*this);\r
-}\r
-\r
-\r
-TUid CPicoDriveApp::AppDllUid()const\r
-{\r
-       return TUid::Uid(0xA00007BE);\r
-}\r
-\r
-/**\r
-   * From @c CApaApplication. Opens the .ini file associated with the\r
-   * application. By default, ini files are not supported by SERIES60 \r
-    * applications. If you want to use an ini file, either override this\r
-    * function to base call @c CEikApplication::OpenIniFileLC, or call it\r
-    * directly.\r
-    * @param aFs File server session to use. Not used.\r
-    * @return Pointer to the dictionary store object representing the\r
-    * application's .ini file.\r
-    */\r
-CDictionaryStore* CPicoDriveApp::OpenIniFileLC(RFs& aFs) const\r
-{\r
-       return CEikApplication::OpenIniFileLC(aFs);\r
-}\r
-\r
-CPicoDriveDoc::CPicoDriveDoc(CEikApplication& aApp):CAknDocument(aApp)\r
-{\r
-}\r
-\r
-CPicoDriveDoc::~CPicoDriveDoc()\r
-{\r
-}\r
-\r
-CEikAppUi* CPicoDriveDoc::CreateAppUiL()\r
-{\r
-       return new (ELeave) CPicoDriveUi;\r
-}\r
-\r
-#ifdef S60V3\r
-LOCAL_C\r
-#endif\r
-CApaApplication* NewApplication() {\r
-       // Return pointer to newly created Application\r
-       return new CPicoDriveApp;\r
-}\r
-#include <eikstart.h>\r
-#endif\r
-GLDEF_C TInt E32Main()\r
-{\r
-#ifdef S60V3   \r
-       return EikStart::RunApplication(NewApplication);\r
-#else\r
-       Execute();\r
-#endif\r
-       return KErrNone;\r
-}\r
-#if defined(__WINS__)\r
-\r
-#ifndef S60V3\r
-EXPORT_C TInt WinsMain()\r
-{\r
-       E32Main();\r
-       return KErrNone;\r
-}\r
-#endif\r
-\r
-extern "C" void my_free(void* anAddress)\r
-{\r
-       if(gChunk != NULL)\r
-       {\r
-               gChunk->Free(anAddress);\r
-       }\r
-}\r
-\r
-extern "C" void* my_malloc(int aSize)\r
-{\r
-       if(gChunk != NULL)\r
-       {\r
-               return gChunk->Alloc(aSize);\r
-       }\r
- return NULL;\r
-}\r
-#endif\r
-\r