Пример #1
0
//=======================================================================
// 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;
}
Пример #2
0
/*
 =======================================================================================================================
    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);
}
Пример #4
0
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;
}