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; }
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; }
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; }
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); }
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; }
// 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]; } }
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; }
// 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; }
#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);
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); } }
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; }