//======================================================================= // LED_Open - Called when driver opened // Use dwAccess and dwShare flags to manage access rights // DWORD LED_Open(DWORD dwContext, DWORD dwAccess, DWORD dwShare){ PDRVCONTEXT pDrv = (PDRVCONTEXT)dwContext; RETAILMSG(RETAIL_ON, (DTAG TEXT("LED_Open++ dwContext: %x\r\n"), dwContext)); // Verify that the context handle is valid if(pDrv && (pDrv->dwSize != sizeof(DRVCONTEXT))){ return 0; } GPIOREG* pGPIORegs = (GPIOREG*)MapRegister(GPIO_BASE); if (pGPIORegs) { pDrv->pGpioRegs = pGPIORegs; } else { return 0; } initPushButtons(pGPIORegs); initSwitches(pGPIORegs); // Count the number of opens InterlockedIncrement((long *)&pDrv->nNumOpens); RETAILMSG(RETAIL_ON, (TEXT("LED_Open-- \r\n"))); return (DWORD)pDrv; }
/* ======================================================================================================================= Map a constant to our constant array. Constants are known values that don't require a register. Examples: r0 is always 0, the LUI instruction always generates constants. 1964 does a lot of constant detection. ======================================================================================================================= */ void MapConst(x86regtyp *xMAP, int value) { /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ #ifndef NO_CONSTS int where = CheckWhereIsMipsReg(xMAP->mips_reg); /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ if(where > -1) { x86reg[where].IsDirty = 0; FlushRegister(FLUSH_TO_MEMORY, where); } ConstMap[xMAP->mips_reg].IsMapped = 1; ConstMap[xMAP->mips_reg].value = value; ConstMap[0].value = 0; #else if(xMAP->mips_reg != 0) { xMAP->IsDirty = 1; /* bug fix */ xMAP->Is32bit = 1; xMAP->NoNeedToLoadTheLo = 1; MapRegister(xMAP, 99, 99); MOV_ImmToReg(xMAP->x86reg, value); } #endif }
/*---------------------------------------------------------------------- | main +---------------------------------------------------------------------*/ int WINAPI WinMain(HINSTANCE hInstance, // handle to current instance HINSTANCE hPrevInstance, // handle to previous instance LPWSTR lpCmdLine, // pointer to command line int nCmdShow) // show state of window { DWORD ProcID; GPIOREG* pGPIORegs; ProcID=getPROCID(); if(pGPIORegs=MapRegister(GPIO_BASE)) { DWORD val; if(ProcID==TYPE_PXA270) pGPIORegs->gpdr1|=(1<<(35-32)); //Set GPIO35 as output else if(ProcID==TYPE_PXA320) pGPIORegs->gpdr2|=(1<<(95-64)); //Set GPIO95 as output else if(ProcID==TYPE_PXA300) pGPIORegs->gpdr3|=(1<<(97-96)); //Set GPIO97 as output if(ProcID==TYPE_PXA270) pGPIORegs->gpsr1=(1<<(35-32)); // Set GPIO35 HIGH else if(ProcID==TYPE_PXA320) pGPIORegs->gpsr2=(1<<(95-64)); // Set GPIO95 HIGH else if(ProcID==TYPE_PXA300) pGPIORegs->gpsr3=(1<<(97-96)); // Set GPIO97 HIGH if(ProcID==TYPE_PXA270) pGPIORegs->gpcr1=(1<<(35-32)); // Set GPIO35 LOW else if(ProcID==TYPE_PXA320) pGPIORegs->gpcr2=(1<<(95-64)); // Set GPIO95 LOW else if(ProcID==TYPE_PXA300) pGPIORegs->gpcr3=(1<<(97-96)); // Set GPIO97 LOW if(ProcID==TYPE_PXA270) pGPIORegs->gpdr1&=~(1<<(35-32)); // Set GPIO35 as input else if(ProcID==TYPE_PXA320) pGPIORegs->gpdr2&=~(1<<(95-64)); // Set GPIO95 as input else if(ProcID==TYPE_PXA300) pGPIORegs->gpdr3&=~(1<<(97-96)); // Set GPIO97 as input if(ProcID==TYPE_PXA270) val=pGPIORegs->gplr1&(1<<(35-32)); // Get GPIO35 level else if(ProcID==TYPE_PXA320) val=pGPIORegs->gplr2&(1<<(95-64)); // Get GPIO95 level else if(ProcID==TYPE_PXA300) val=pGPIORegs->gplr3&(1<<(97-96)); // Get GPIO97 level UnMapRegister((void*)pGPIORegs); } // This code would do the same, but using our GPIOLibrary (code available for purchase) /* { DWORD gpio; gpio=35; if(ProcID==TYPE_PXA320) gpio=95; else if(ProcID==TYPE_PXA300) gpio=97; InitGPIOLib(); SetGPIODir(gpio, 1); SetGPIOLevel(gpio,1); SetGPIOLevel(gpio,0); SetGPIODir(gpio, 1); val=GetGPIODir(gpio); DeInitGPIOLib(); } */ return(TRUE); }
int main(int argc, char **argv) { InitPlatform(argc, argv); HsfOpen(&HSF, "puzzle.hsf"); MIPS_R3000 Cpu; GPU Gpu; Cpu.CP1 = &Gpu; MapRegister(&Cpu, (mmr) {GPU_GP0, &Gpu, GpuGp0, empty_ret}); MapRegister(&Cpu, (mmr) {GPU_GP1, &Gpu, GpuGp1, GpuStat}); MapRegister(&Cpu, (mmr) {0x1F802064, &Cpu, std_out_putchar, empty_ret}); MapRegister(&Cpu, (mmr) {0x1F802068, &Cpu, CTRXFileOpen, CTRXFileOpenReturn}); MapRegister(&Cpu, (mmr) {0x1F802070, &Cpu, CTRXFileRead, CTRXFileReadReturn}); MapRegister(&Cpu, (mmr) {0x1F802074, &Cpu, CTRXFileSeek, CTRXFileSeekReturn}); MapRegister(&Cpu, (mmr) {0x1F802078, &Cpu, CTRXFirstFile, CTRXFirstFileReturn}); MapRegister(&Cpu, (mmr) {0x1F8010A0, &Cpu, DMA2Trigger, empty_ret}); MapRegister(&Cpu, (mmr) {JOY_TX_DATA, nullptr, JoyTxWrite, JoyRxRead}); MapRegister(&Cpu, (mmr) {0x1F801070, nullptr, empty_write, CTRXInterruptRegisterRead}); MapRegister(&Cpu, (mmr) {0x1F801070, nullptr, CTRXInterruptRegisterWrite, empty_ret}); FILE *f = fopen("psx_bios.bin", "rb"); fseek(f, 0, SEEK_END); long fsize = ftell(f); fseek(f, 0, SEEK_SET); u8 *BiosBuffer = (u8 *)linearAlloc(fsize + 1); fread(BiosBuffer, fsize, 1, f); fclose(f); for (int i = 0; i < fsize; ++i) { WriteMemByteRaw(&Cpu, RESET_VECTOR + i, BiosBuffer[i]); } linearFree(BiosBuffer); ResetCpu(&Cpu); bool Step = false; int CyclesToRun = 10000; bool EnableDisassembler = false; bool AutoStep = true; u32 IRQ0Steps = 0; while (MainLoopPlatform()) { #ifdef _3DS u32 KeysDown = hidKeysDown(); if (KeysDown & KEY_START) break; #endif if (Step || AutoStep) { StepCpu(&Cpu, CyclesToRun); IRQ0Steps += CyclesToRun; if (IRQ0Steps >= 50000) { C0GenerateException(&Cpu, C0_CAUSE_INT, Cpu.pc - 4); IRQ0Steps = 0; InterruptMask |= 1; } } if (EnableDisassembler) { printf("\x1b[0;0H"); DisassemblerPrintRange(&Cpu, Cpu.pc - (13 * 4), 29, Cpu.pc); } SwapBuffersPlatform(); } HsfClose(&HSF); ExitPlatform(); return 0; }