-#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