Beispiel #1
0
int PS2MouseGetBoundary(int *minx, int *maxx, int *miny, int *maxy)

{
  u32* uncached = (u32 *) UNCACHED_SEG(buffer);

  if (SifCallRpc(&mouseif, PS2MOUSE_GETBOUNDARY, 0, buffer, 128, buffer, 128, NULL, NULL) < 0)
    return -1;

  *minx = uncached[0];
  *maxx = uncached[1];
  *miny = uncached[2];
  *maxy = uncached[3];

  return 1;
}
Beispiel #2
0
int PS2KbdReadRaw(PS2KbdRawKey *key)
/* Reads 1 raw character from the keyboard */
{
	int res;
	if ((!kbdInitialized) || (curr_readmode != PS2KBD_READMODE_RAW))
		return -1;

	if (PollSema(kbdRpcSema) >= 0) {
		// last rpc call completed
		res = (rpcKey != 0);
		*key = *(PS2KbdRawKey *)UNCACHED_SEG(&rpcKey);
		SifCallRpc(&cd0, KBD_RPC_READRAW, SIF_RPC_M_NOWAIT, rpcBuf, 0, &rpcKey, 4, rpcCompleteIntr, NULL);
		return res;
	} else // rpc still running
		return 0;
}
Beispiel #3
0
int PS2MouseRead(PS2MouseData *data)

{
  u8* uncached = UNCACHED_SEG(buffer);

  if(!data)
    {
      return -1;
    }

  if (SifCallRpc(&mouseif, PS2MOUSE_READ, 0, buffer, 128, buffer, 128, 0, 0) < 0)
    return -1;


  memcpy(data, uncached, sizeof(PS2MouseData));
  //  printf("MouseRead %d %d %d %d\n", data->x, data->y, data->wheel, data->buttons);
  
  return 1;
}
Beispiel #4
0
s32 sceCdDiskReady(s32 mode)
{
	s32 i;

	if (sceCdDebug > 0)
		printf("DiskReady 0\n");

	sceCdSemaInit();
	if (PollSema(sCmdSemaId) != sCmdSemaId)
		return SCECdNotReady;
	if (sceCdSyncS(1)) {
		SignalSema(sCmdSemaId);
		return SCECdNotReady;
	}

	SifInitRpc(0);
	if (bindDiskReady < 0) {
		while (1) {
			if (SifBindRpc(&clientDiskReady, CD_SERVER_DISKREADY, 0) < 0) {
				if (sceCdDebug > 0)
					printf("LibsceCdvd bind err CdDiskReady\n");
			}
			if (clientDiskReady.server != 0)
				break;

			i = 0x10000;
			while (i--);
		}
	}
	bindDiskReady = 0;
	diskReadyMode = mode;

	if (SifCallRpc(&clientDiskReady, 0, 0, &diskReadyMode, 4, sCmdRecvBuff, 4, 0, 0) < 0) {
		SignalSema(sCmdSemaId);
		return 6;
	}
	if (sceCdDebug > 0)
		printf("DiskReady ended\n");

	SignalSema(sCmdSemaId);
	return *(s32 *) UNCACHED_SEG(sCmdRecvBuff);
}
Beispiel #5
0
static int DrawSprites(GS_PACKET_TABLE *table)
{
	int i;
	QWORD *p;

	for(i=0;i<MAX_SPRITES;i++)
	{
		//Use the uncached segment, to avoid needing to flush the data cache.
		p = (QWORD*)UNCACHED_SEG(GsGifPacketsAlloc(table, 5)); //Allocate 5 qword for 1 untextured strite

		gs_setGIF_TAG(((GS_GIF_TAG	*)&p[0]), 4,1,0,0,0,0,1,0x0e);
		gs_setR_PRIM(((GS_R_PRIM	*)&p[1]), GS_PRIM_SPRITE,0, 0, 0, 1, 0, 0, 0, 0);
		gs_setR_RGBAQ(((GS_R_RGBAQ	*)&p[2]), sprites[i].color.r, sprites[i].color.g, sprites[i].color.b, sprites[i].color.a, sprites[i].color.q);
		gs_setR_XYZ2(((GS_R_XYZ		*)&p[3]), (ScreenOffsetX+sprites[i].x_pos)<<4,	(ScreenOffsetY+sprites[i].y_pos)<<4, 0x00000000);
		gs_setR_XYZ2(((GS_R_XYZ		*)&p[4]), (ScreenOffsetX+sprites[i].x_pos+10)<<4,	(ScreenOffsetY+sprites[i].y_pos+10)<<4, 0x00000000);
	}

	return 0;

}
Beispiel #6
0
// function that gets called when mcRead ends
// and interrupts are disabled
static void mcReadFixAlign(volatile int* data_raw)
{
	int	*ptr = (int*)UNCACHED_SEG(data_raw);
	u8	*src, *dest;
	int  i;

	dest = (u8*)ptr[2];
	src  = (u8*)(ptr + 4);
	for(i=0; i<ptr[0]; i++)
	{
		dest[i] = src[i];
	}

	dest = (u8*)ptr[3];
	if(g_mcType == MC_TYPE_MC)
		src  = (u8*)(ptr +  8);
	else
		src  = (u8*)(ptr + 20);
	for(i=0; i<ptr[1]; i++)
	{
		dest[i] = src[i];
	}
}
Beispiel #7
0
int mcReadPage(int port, int slot, unsigned int page, void *buffer){
	int result;

	// check lib is inited
	if((!g_mclibInited)||(g_mcType==MC_TYPE_XMC))
		return -1;
	// check nothing else is processing
	if(g_currentCmd != MC_FUNC_NONE)
		return g_currentCmd;

	g_descParam.fd=page;
	g_descParam.port=port;
	g_descParam.slot=slot;
	g_descParam.buffer=(unsigned int)buffer;
	g_descParam.param=(unsigned int)&libmc_ReadPageAlignData;

	SifWriteBackDCache(buffer, 0x200);

	if((result = SifCallRpc(&g_cdata, mcRpcCmd[g_mcType][MC_RPCCMD_READ_PAGE], SIF_RPC_M_NOWAIT, &g_descParam, sizeof(g_descParam), g_rdata, 4, (void*)&libmc_ReadAlignFunction, UNCACHED_SEG(&libmc_ReadPageAlignData)))==0){
		g_currentCmd = MC_FUNC_READ_PAGE;
	}

	return result;
}
Beispiel #8
0
// init memcard lib
//
// args:	MC_TYPE_MC  = use MCSERV/MCMAN
//			MC_TYPE_XMC = use XMCSERV/XMCMAN
// returns:	0   = successful
//			< 0 = error
int mcInit(int type)
{
	int ret=0;
	static int _rb_count = 0;

	if(_rb_count != _iop_reboot_count)
	{
		_rb_count = _iop_reboot_count;
		mcReset();
	}

	if(g_mclibInited)
		return -1;

	SifInitRpc(0);

	// set which modules to use
	g_mcType = type;

	// bind to mc rpc on iop
	do
	{
		if((ret=SifBindRpc(&g_cdata, 0x80000400, 0)) < 0)
		{
			#ifdef MC_DEBUG
				printf("libmc: bind error\n");
			#endif

			return ret;
		}
		if(g_cdata.server == NULL)
			nopdelay();
	}
	while (g_cdata.server == NULL);

	// for some reason calling this init sif function with 'mcserv' makes all other
	// functions not work properly. although NOT calling it means that detecting
	// whether or not cards are formatted doesnt seem to work :P
	if(g_mcType == MC_TYPE_MC)
	{
#ifdef MC_DEBUG
		printf("libmc: using MCMAN & MCSERV\n");

#endif
		g_descParam.offset=0xFFFFFF27;

		// call init function
		if((ret = SifCallRpc(&g_cdata, mcRpcCmd[g_mcType][MC_RPCCMD_INIT], 0, &g_descParam, sizeof(g_descParam), g_rdata, 4, NULL, NULL))>=0)
		{
			ret = *(s32*)g_rdata;
		}
		else{
			// init error
#ifdef MC_DEBUG
			printf("libmc: initialisation error\n");
#endif
			g_mclibInited = 0;
			return *(s32*)g_rdata - 100;
		}
	}
	else if(g_mcType == MC_TYPE_XMC)
	{
#ifdef MC_DEBUG
		printf("libmc: using XMCMAN & XMCSERV\n");
#endif

		// call init function
		if((ret = SifCallRpc(&g_cdata, mcRpcCmd[g_mcType][MC_RPCCMD_INIT], 0, &g_descParam, sizeof(g_descParam), g_rdata, 12, NULL, NULL)) < 0)
		{
			// init error
#ifdef MC_DEBUG
			printf("libmc: initialisation error\n");
#endif
			g_mclibInited = 0;
			return ret - 100;
		}

		// check if old version of mcserv loaded
		if(*(s32*)UNCACHED_SEG(g_rdata+4) < 0x205)
		{
#ifdef MC_DEBUG
			printf("libmc: mcserv is too old (%x)\n", *(s32*)UNCACHED_SEG(g_rdata+4));
#endif
			g_mclibInited = 0;
			return -120;
		}

		// check if old version of mcman loaded
		if(*(s32*)UNCACHED_SEG(g_rdata+8) < 0x206)
		{
#ifdef MC_DEBUG
			printf("libmc: mcman is too old (%x)\n", *(s32*)UNCACHED_SEG(g_rdata+8));
#endif
			g_mclibInited = 0;
			return -121;
		}
		ret = *(s32*)UNCACHED_SEG(g_rdata+0);
	}

	// successfully inited
	g_mclibInited = 1;
	g_currentCmd = 0;
	return ret;
}
Beispiel #9
0
#include <stdio.h>
#include <kernel.h>
#include <libgs.h>

#include "internal.h"

extern QWORD GsPrimWorkArea[];

static GS_TEST GSGLOBAL_TEST1;
static GS_TEST GSGLOBAL_TEST2;

void GsOverridePrimAttributes(char override, char iip, char tme, char fge, char abe, char aa1, char fst, char ctxt, char fix)
{
	QWORD *p;

	p=UNCACHED_SEG(GsPrimWorkArea);
	gs_setGIF_TAG(((GS_GIF_TAG *)&p[0]), 2,1,0,0,0,0,1,0x0e);

	//override. (0 = use PRIM)(1 = use PRMODE)
	if(override)
	{
		gs_setR_PRMODECONT(((GS_R_PRMODECONT *)&p[1]), 0);
	}
	else
	{
		gs_setR_PRMODECONT(((GS_R_PRMODECONT *)&p[1]), 1);
	}

	gs_setR_PRMODE(((GS_R_PRMODE *)&p[2]), iip,tme,fge,abe,aa1,fst,ctxt,fix);

	GsDmaSend(GsPrimWorkArea, 3);
Beispiel #10
0
void SifInitCmd()
{
	u32 packet[5];	/* Implicitly aligned to 16 bytes */
	int i;
	static int _rb_count = 0;
	if(_rb_count != _iop_reboot_count)
	{
	    _rb_count = _iop_reboot_count;
	    if (sif0_id >= 0)
	    {
    	        DisableDmac(5);
    	        RemoveDmacHandler(5, sif0_id);
	    }
	    init = 0;
	}

	if (init)
		return;

	DI();

	_sif_cmd_data.pktbuf = UNCACHED_SEG(_sif_cmd_data.pktbuf);
	_sif_cmd_data.unused = UNCACHED_SEG(_sif_cmd_data.unused);

	for (i = 0; i < CMD_HANDLER_MAX; i++) {
		_sif_cmd_data.sys_cmd_handlers[i].handler = NULL;
		_sif_cmd_data.sys_cmd_handlers[i].harg = NULL;
	}

	for (i = 0; i < 32; i++)
		_sif_cmd_data.sregs[i] = 0;

	_sif_cmd_data.sys_cmd_handlers[0].handler = change_addr;
	_sif_cmd_data.sys_cmd_handlers[0].harg    = &_sif_cmd_data;
	_sif_cmd_data.sys_cmd_handlers[1].handler = set_sreg;
	_sif_cmd_data.sys_cmd_handlers[1].harg    = &_sif_cmd_data;

	EI();
	FlushCache(0);

	if (_lw(DMAC_COMM_STAT) & STAT_SIF0)
		_sw(STAT_SIF0, DMAC_COMM_STAT);

	if (!(_lw(DMAC_SIF0_CHCR) & CHCR_STR))
		SifSetDChain();

	sif0_id = AddDmacHandler(5, _SifCmdIntHandler, 0);
	EnableDmac(5);
	
	init = 1;

	_sif_cmd_data.iopbuf = (void *)SifGetReg(0x80000000);
	if (_sif_cmd_data.iopbuf) {
		/* IOP SIF CMD is already initialized, so give it our new
		   receive address.  */
		((struct ca_pkt *)(packet))->buf = _sif_cmd_data.pktbuf;
		SifSendCmd(0x80000000, packet, sizeof packet, NULL, NULL, 0);
	} else {
		/* Sync */
		while (!(SifGetReg(SIF_REG_SMFLAG) & 0x20000)) ;

		_sif_cmd_data.iopbuf = (void *)SifGetReg(SIF_REG_SUBADDR);
		SifSetReg(0x80000000, (u32)_sif_cmd_data.iopbuf);
		/* See the note above about struct cmd_data, and the use of
		   this register.  */
		SifSetReg(0x80000001, (u32)&_sif_cmd_data);
		packet[3] = 0;
		packet[4] = (u32)_sif_cmd_data.pktbuf;
		SifSendCmd(0x80000002, packet, sizeof packet, NULL, NULL, 0);
	}
}
Beispiel #11
0
int NetManInitRPCClient(void){
	static const char NetManID[]="NetMan";
	int result;
	ee_sema_t SemaData;
	ee_thread_t ThreadData;

	if(!IsInitialized){
		memset(&TxFIFOData1, 0, sizeof(TxFIFOData1));
		memset(&TxFIFOData2, 0, sizeof(TxFIFOData2));

		TxFIFOData1.FrameBuffer = memalign(64, (MAX_FRAME_SIZE*NETMAN_RPC_BLOCK_SIZE+0x3F)&~0x3F);
		TxFIFOData2.FrameBuffer = memalign(64, (MAX_FRAME_SIZE*NETMAN_RPC_BLOCK_SIZE+0x3F)&~0x3F);

		if(TxFIFOData1.FrameBuffer == NULL) return -ENOMEM;
		if(TxFIFOData2.FrameBuffer == NULL){
			deinitCleanup();
			return -ENOMEM;
		}

		SemaData.max_count=1;
		SemaData.init_count=1;
		SemaData.option=(unsigned int)NetManID;
		SemaData.attr=0;
		if((NetManIOSemaID=CreateSema(&SemaData)) < 0){
			deinitCleanup();
			return NetManIOSemaID;
		}

		TxActiveBankID=0;
		CurrentTxFIFOData=UNCACHED_SEG(&TxFIFOData1);

		SemaData.max_count=1;
		SemaData.init_count=1;
		SemaData.option=(unsigned int)NetManID;
		SemaData.attr=0;
		if((TxBankAccessSema=CreateSema(&SemaData)) < 0){
			deinitCleanup();
			return TxBankAccessSema;
		}

		SemaData.max_count=1;
		SemaData.init_count=1;
		SemaData.option=(unsigned int)NetManID;
		SemaData.attr=0;
		if((NetManTxSemaID=CreateSema(&SemaData)) < 0){
			deinitCleanup();
			return NetManTxSemaID;
		}

		ThreadData.func=&TxThread;
		ThreadData.stack=TxThreadStack;
		ThreadData.stack_size=sizeof(TxThreadStack);
		ThreadData.gp_reg=&_gp;
		ThreadData.initial_priority=0x58;
		ThreadData.attr=ThreadData.option=0;

		if((TxThreadID=CreateThread(&ThreadData)) < 0){
			deinitCleanup();
			return TxThreadID;
		}

		if((result = StartThread(TxThreadID, NULL)) < 0){
			deinitCleanup();
			return result;
		}

		while((SifBindRpc(&NETMAN_rpc_cd, NETMAN_RPC_NUMBER, 0)<0)||(NETMAN_rpc_cd.server==NULL)){
			nopdelay();
			nopdelay();
			nopdelay();
			nopdelay();
		}

		if((result=SifCallRpc(&NETMAN_rpc_cd, NETMAN_IOP_RPC_FUNC_INIT, 0, NULL, 0, ReceiveBuffer, sizeof(int), NULL, NULL))>=0){
			if((result=*(int*)ReceiveBuffer) == 0)
				IsInitialized=1;
			else
				deinitCleanup();
		}else{
			deinitCleanup();
		}
	}
	else result=0;

	return result;
}