summaryrefslogtreecommitdiff
path: root/libpsx/src
diff options
context:
space:
mode:
authorXavi Del Campo <xavi.dcr@tutanota.com>2020-01-31 13:13:14 +0100
committerXavi Del Campo <xavi.dcr@tutanota.com>2020-01-31 13:13:14 +0100
commit78128c8058e6f522c55e7945274926d33183634f (patch)
tree728add7839e1abc7c29e085e2076ae968e00b7bf /libpsx/src
parent08ca71f289cd63090edea06ce9fe1803c20d799b (diff)
downloadpsxsdk-78128c8058e6f522c55e7945274926d33183634f.tar.gz
Added PSX_PollPad_Fast_Ex() from psxsdk-20150729 fork
Also, added extern "C" on some header files. Some are still missing.
Diffstat (limited to 'libpsx/src')
-rw-r--r--libpsx/src/pad.c32
-rw-r--r--libpsx/src/psxsdk.c253
2 files changed, 171 insertions, 114 deletions
diff --git a/libpsx/src/pad.c b/libpsx/src/pad.c
index ea3e20e..b3dd151 100644
--- a/libpsx/src/pad.c
+++ b/libpsx/src/pad.c
@@ -53,12 +53,12 @@ void QueryPAD(int pad_n, unsigned char *in, unsigned char *out, int len)
int i;
unsigned char TempData;
int EmuFlag = 0;
-
+
PADSIO_MODE(0) = 0xD;
PADSIO_BAUD(0) = 0x88;
-
+
if(pad_n == 1) PADSIO_CTRL(0) = 0x3003; else PADSIO_CTRL(0) = 0x1003;
-
+
/*Get the initial command (usually 0x01 or 0x81)*/
TempData = *in;
@@ -75,7 +75,7 @@ void QueryPAD(int pad_n, unsigned char *in, unsigned char *out, int len)
if(PADSIO_STATUS(0) & 4)break;
}
}
-
+
PADSIO_DATA(0) = *in;
in++;
@@ -90,48 +90,48 @@ void QueryPAD(int pad_n, unsigned char *in, unsigned char *out, int len)
if(PADSIO_STATUS(0) & 128)break;
}
}
-
+
for(i=0;i<100;i++)
{
/*Read RX status flag, required for Xebra*/
if(PADSIO_STATUS(0) & 2)break;
}
}
-
+
*out = PADSIO_DATA(0);
-
+
/*This is emulator, valid data was received without ACK, ePSXe and PCSX*/
if(x == 0 && y > 1900 && *out != 0xFF)EmuFlag = 1;
-
+
out++;
}
-
+
PADSIO_CTRL(0) = 0;
}
void pad_read_raw(int pad_n, unsigned char *arr)
{
// arr must be at least 16 bytes long...
-
+
unsigned char pad_cmd[PAD_READ_RAW_SIZE] = {1,0x42,0,0,0};
-
+
pad_cmd[3] = readpad_vibrations[pad_n][0];
pad_cmd[4] = readpad_vibrations[pad_n][1];
-
+
QueryPAD(pad_n, pad_cmd, arr, sizeof(pad_cmd));
}
void pad_escape_mode(int pad_n, int enable)
{
unsigned char pad_cmd[] = {1,0x43,0,enable?1:0,0};
-
+
QueryPAD(pad_n, pad_cmd, NULL, sizeof(pad_cmd));
}
void pad_enable_vibration(int pad_n)
{
unsigned char pad_cmd[] = {1, 0x4d, 0, 0, 1, 0xff, 0xff, 0xff, 0xff};
-
+
pad_escape_mode(pad_n, 1); // Enter escape / configuration mode
QueryPAD(pad_n, pad_cmd, NULL, sizeof(pad_cmd));
pad_escape_mode(pad_n, 0); // Exit escape / configuration mode
@@ -154,10 +154,10 @@ void pad_set_analog(int pad_n, int lock)
{1, 0x44, 0, 1, lock?3:0, 0, 0, 0, 0};
unsigned char pad_cmd2[9] =
{1, 0x4f, 0, 0xff, 0xff, 3, 0, 0, 0};
-
+
pad_escape_mode(pad_n, 1);
QueryPAD(pad_n, pad_cmd, NULL, sizeof(pad_cmd));
- QueryPAD(pad_n, pad_cmd2, NULL, sizeof(pad_cmd));
+ QueryPAD(pad_n, pad_cmd2, NULL, sizeof(pad_cmd));
pad_escape_mode(pad_n, 0);
}*/
diff --git a/libpsx/src/psxsdk.c b/libpsx/src/psxsdk.c
index a595bdb..6fd97af 100644
--- a/libpsx/src/psxsdk.c
+++ b/libpsx/src/psxsdk.c
@@ -3,7 +3,7 @@
*
* Free and open source library to develop for the Sony PlayStation
*/
-
+
#include <psx.h>
#include <stdio.h>
#include <stdlib.h>
@@ -25,8 +25,8 @@ extern int *rcnt_handler();
(unsigned int)vblank_handler, // func2
0x0, // pad
};*/
-
-static int vblank_handler_set = 0;
+
+static int vblank_handler_set = 0;
static unsigned int vblank_handler_event_id = 0;
static int rcnt_handler_set = 0;
@@ -37,7 +37,7 @@ void _internal_cdromlib_init(void);
static unsigned int psxSdkFlags = 0;
-static unsigned char *psxBiosState;
+static unsigned char *psxBiosState;
extern void _96_remove(void);
extern void _96_init(void);
@@ -46,40 +46,40 @@ extern void StartCARD(void);
extern void StopCARD(void);
extern void _bu_init(void);
extern void BIOSWarmReboot(void);
-
+
void PSX_InitEx(unsigned int flags)
-{
+{
if(flags & PSX_INIT_NOBIOS)
{
printf("Entering No BIOS mode...\n");
-
+
__PSX_Init_NoBios();
goto _initex_end;
}
-
+
if(flags & PSX_INIT_SAVESTATE)
{
// Save BIOS state
// This simply copies the entire section of RAM used by the BIOS
-// in a buffer.
+// in a buffer.
EnterCriticalSection();
psxBiosState = malloc(0x10000);
memcpy(psxBiosState, (void*)0x80000000, 0x10000);
ExitCriticalSection();
}
-
+
/* Reinitialize ISO 9660 filesystem driver */
-
+
if(flags & PSX_INIT_CD)
{
EnterCriticalSection();
_96_remove();
ExitCriticalSection();
-
+
_96_init();
}
-
-
+
+
/*This is needed, otherwise PSX will crash when VBlank handler is set*/
/*InitCARD(1);
StartCARD();
@@ -89,7 +89,7 @@ void PSX_InitEx(unsigned int flags)
_internal_cdromlib_init();
printf("PSXSDK testing version !!!\n");
-
+
vblank_handler_set = 0;
_initex_end:
psxSdkFlags = flags;
@@ -108,9 +108,9 @@ void PSX_DeInit(void)
_96_remove();
ExitCriticalSection();
}
-
+
RemoveVBlankHandler();
-
+
if(psxSdkFlags & PSX_INIT_SAVESTATE)// This must always be the last to be called!
PSX_RestoreBiosState();
}
@@ -120,15 +120,15 @@ void PSX_ReadPad(unsigned short *padbuf, unsigned short *padbuf2)
int x;
unsigned char arr[PAD_READ_RAW_SIZE];
unsigned short *padbuf_a[2];
-
-// Now uses low level pad routines...
+
+// Now uses low level pad routines...
padbuf_a[0] = padbuf;
padbuf_a[1] = padbuf2;
-
+
for(x = 0; x < 2; x++)
{
pad_read_raw(x, arr);
-
+
if(arr[2] == 0x5a)
{
*padbuf_a[x] = (arr[3]<<8)|arr[4];
@@ -139,21 +139,78 @@ void PSX_ReadPad(unsigned short *padbuf, unsigned short *padbuf2)
}
}
-unsigned char psxsdkPadArr[PAD_READ_RAW_SIZE];
+unsigned char psxsdkPadArr[PAD_READ_RAW_SIZE][2];
+
+void PSX_PollPad_Fast_Ex(const unsigned char* const arr, psx_pad_state* const pad_state)
+{
+ //Rely on pad_read_raw being called AFTER PSX_ReadPad(),
+ //so that pad_read_raw is only called once.
+ pad_state->status = arr[0];
+ pad_state->id = arr[1];
+
+ pad_state->buttons = (arr[3]<<8)|arr[4];
+ pad_state->buttons = ~pad_state->buttons;
+
+ //dprintf("Pad Status: 0x%.2X\n",pad_state->status);
+
+ switch(pad_state->id)
+ {
+ case 0xFF:
+ pad_state->type = PADTYPE_NONE;
+ break;
+ case 0x41:
+ pad_state->type = PADTYPE_NORMALPAD;
+ break;
+ case 0x53:
+ pad_state->type = PADTYPE_ANALOGJOY;
+ pad_state->extra.analogJoy.x[0] = arr[5]-128;
+ pad_state->extra.analogJoy.y[0] = arr[6]-128;
+ pad_state->extra.analogJoy.x[1] = arr[7]-128;
+ pad_state->extra.analogJoy.y[1] = arr[8]-128;
+ break;
+ case 0x73:
+ pad_state->type = PADTYPE_ANALOGPAD;
+ pad_state->extra.analogPad.x[0] = arr[5]-128;
+ pad_state->extra.analogPad.y[0] = arr[6]-128;
+ pad_state->extra.analogPad.x[1] = arr[7]-128;
+ pad_state->extra.analogPad.y[1] = arr[8]-128;
+ break;
+ case 0x23:
+ pad_state->type = PADTYPE_NEGCON;
+ pad_state->extra.negCon.steering = arr[5]-128;
+ pad_state->extra.negCon.one = arr[6];
+ pad_state->extra.negCon.two = arr[7];
+ pad_state->extra.negCon.shoulder = arr[8];
+ break;
+ case 0x31:
+ pad_state->type = PADTYPE_KONAMIGUN;
+ break;
+ case 0x12:
+ pad_state->type = PADTYPE_MOUSE;
+ break;
+ default:
+ pad_state->type = PADTYPE_UNKNOWN;
+ }
+}
+
+void PSX_PollPad_Fast(int pad_num, psx_pad_state *pad_state)
+{
+ PSX_PollPad_Fast_Ex(psxsdkPadArr[pad_num], pad_state);
+}
void PSX_PollPad(int pad_num, psx_pad_state *pad_state)
{
// int x;
/*unsigned short *padbuf_a[2];
-
-// Now uses low level pad routines...
+
+// Now uses low level pad routines...
padbuf_a[0] = padbuf;
padbuf_a[1] = padbuf2;
-
+
for(x = 0; x < 2; x++)
{
pad_read_raw(x, arr);
-
+
if(arr[2] == 0x5a)
{
*padbuf_a[x] = (arr[3]<<8)|arr[4];
@@ -162,17 +219,17 @@ void PSX_PollPad(int pad_num, psx_pad_state *pad_state)
else
*padbuf_a[x] = 0;
}*/
-
- unsigned char *arr = psxsdkPadArr;
-
+
+ unsigned char *arr = psxsdkPadArr[pad_num];
+
pad_read_raw(pad_num, arr);
-
+
pad_state->status = arr[0];
pad_state->id = arr[1];
-
+
pad_state->buttons = (arr[3]<<8)|arr[4];
pad_state->buttons = ~pad_state->buttons;
-
+
switch(pad_state->id)
{
case 0xFF:
@@ -211,10 +268,10 @@ void PSX_PollPad(int pad_num, psx_pad_state *pad_state)
}
/*int PSX_GetPadType(unsigned int pad_num)
-//{
+//{
//#warning "Function does not currently work!"
// unsigned char arr[16];
-
+
pad_read_raw(pad_num, arr);
switch(arr[1])
@@ -232,7 +289,7 @@ void PSX_PollPad(int pad_num, psx_pad_state *pad_state)
return PADTYPE_ANALOGPAD;
break;
}
-
+
return PADTYPE_UNKNOWN;
}*/
@@ -242,33 +299,33 @@ void PSX_GetSysInfo(struct psx_info *info)
unsigned long i,i2;
info->kernel.version = GetKernelRomVersion();
-
+
i = GetKernelDate();
-
+
/*
* Convert year from BCD to decimal
*/
-
+
i2 = i >> 16;
-
+
info->kernel.year = i2 & 0xf;
info->kernel.year+= ((i2>>4)&0xf)*10;
info->kernel.year+= ((i2>>8)&0xf)*100;
info->kernel.year+= ((i2>>12)&0xf)*1000;
-
+
/*
* Convert month from BCD to decimal
*/
i2 = (i >> 8) & 0xff;
-
+
info->kernel.month = i2 & 0xf;
- info->kernel.month+= (i2>>4) * 10;
-
+ info->kernel.month+= (i2>>4) * 10;
+
/*
* Convert day from BCD to decimal
*/
i2 = i & 0xff;
-
+
info->kernel.day = i2 & 0xf;
info->kernel.day+= (i2>>4) * 10;
@@ -276,21 +333,21 @@ void PSX_GetSysInfo(struct psx_info *info)
* Unless we receive something in the range >= 1 && <= 16,
* RAM size will be reported as 2 Megabytes
*/
-
+
i = GetRamSize();
-
+
if(i == 0 || i > 16)
info->system.memory = 2<<20; /* 2 Megabytes */
else
info->system.memory <<= 20;
}
-
+
int get_real_file_size(const char *name)
{
struct DIRENTRY dirent_buf;
-
+
if(firstfile(name, &dirent_buf) == &dirent_buf)
return dirent_buf.size;
else
@@ -300,7 +357,7 @@ int get_real_file_size(const char *name)
int get_file_size(const char *name)
{
int i = get_real_file_size(name);
-
+
if(strncmp(name, "cdrom:", 6) == 0)
{
if(i & 0x7ff)
@@ -316,58 +373,58 @@ int get_file_size(const char *name)
i &= ~0x7f;
}
}
-
+
return i;
}
int SetRCnt(int spec, unsigned short target, unsigned int mode)
{
spec &= 0xf;
-
+
if(spec >= 3)
return 0;
-
+
RCNT_MODE(spec)=0;
RCNT_TARGET(spec)=target;
RCNT_MODE(spec)=mode;
-
+
return 1;
}
int GetRCnt(int spec)
{
spec &= 0xf;
-
+
if(spec >= 4)
return -1;
-
+
return (RCNT_COUNT(spec) & 0xffff);
}
int StartRCnt(int spec)
{
spec &= 0xf;
-
+
if(spec >= 3)
return 0;
-
+
IMASK |= 1 << (spec + 4);
-
+
return 1;
}
int StopRCnt(int spec)
{
spec &= 0xf;
-
+
if(spec >= 3)
return 0;
-
+
IMASK ^= 1 << (spec + 4);
-
+
return 1;
}
-
+
void SetVBlankHandler(void (*callback)())
{
if(psxSdkFlags & PSX_INIT_NOBIOS)
@@ -377,32 +434,32 @@ void SetVBlankHandler(void (*callback)())
_EXC_vblank_handler_set = 1;
return;
}
-
+
if(vblank_handler_set == 1)
{
EnterCriticalSection();
-
+
vblank_handler_callback = callback;
-
+
ExitCriticalSection();
-
+
return;
}
-
+
// Enter critical section
-
+
EnterCriticalSection();
-
+
IMASK|=1;
-
+
vblank_handler_event_id = OpenEvent(RCntCNT3, 2, 0x1000, vblank_handler);
EnableEvent(vblank_handler_event_id);
-
+
vblank_handler_callback = callback;
vblank_handler_set = 1;
// Exit critical section
-
+
ExitCriticalSection();
}
@@ -414,19 +471,19 @@ void RemoveVBlankHandler(void)
_EXC_vblank_handler = NULL;
return;
}
-
+
if(vblank_handler_set)
{
EnterCriticalSection();
-
+
DisableEvent(vblank_handler_event_id);
CloseEvent(vblank_handler_event_id);
-
+
//IMASK^=1;
// ^ commented because masking out vblank could give problems to other bios functions
-
+
vblank_handler_set = 0;
-
+
ExitCriticalSection();
}
}
@@ -435,27 +492,27 @@ void SetRCntHandler(void (*callback)(), int spec, unsigned short target)
{
if(psxSdkFlags & PSX_INIT_NOBIOS)
return; // Not yet supported in No-Bios Mode
-
+
if(rcnt_handler_set)
{
EnterCriticalSection();
-
+
rcnt_handler_callback = callback;
-
+
ExitCriticalSection();
-
+
return;
}
-
+
// Enter critical section
-
+
SetRCnt(spec, target, RCntIntr | 0x08 | 0x10 | 0x40);
StartRCnt(spec);
-
+
EnterCriticalSection();
rcnt_handler_event_id = OpenEvent(spec, 2, 0x1000, rcnt_handler);
EnableEvent(rcnt_handler_event_id);
-
+
rcnt_handler_callback = callback;
rcnt_handler_set = spec;
@@ -466,9 +523,9 @@ void SetRCntHandler(void (*callback)(), int spec, unsigned short target)
case RCntCNT2: rcnt_handler_evfield = 1 << 6; break;
case RCntCNT3: rcnt_handler_evfield = 1; break;
}
-
+
// Exit critical section
-
+
ExitCriticalSection();
}
@@ -476,16 +533,16 @@ void RemoveRCntHandler(int spec)
{
if(psxSdkFlags & PSX_INIT_NOBIOS)
return; // Not yet supported in No-Bios Mode
-
+
if(rcnt_handler_set)
{
EnterCriticalSection();
-
+
DisableEvent(rcnt_handler_event_id);
CloseEvent(rcnt_handler_event_id);
-
+
rcnt_handler_set = 0;
-
+
ExitCriticalSection();
}
}
@@ -496,13 +553,13 @@ const char *GetSystemRomVersion(void)
// most PlayStation BIOSes.
// If getting the pointer is not possible, a pointer to a string saying "System ROM Unavailable" is returned.
-
+
int x;
-
+
for(x = 0x7ffee; x >= 0; x--)
if(memcmp("System ROM Version", (void*)(0xbfc00000 + x), 18) == 0)
return (char*)(0xbfc00000 + x);
-
+
return sysromver_unavail;
}
@@ -510,11 +567,11 @@ int PSX_RestoreBiosState(void)
{
if(!(psxSdkFlags & PSX_INIT_SAVESTATE))
return 0; // can't restore BIOS state if it was not saved previously
-
+
EnterCriticalSection();
memcpy((void*)0x80000000, psxBiosState, 0x10000);
ExitCriticalSection();
-
+
return 1;
}
@@ -535,8 +592,8 @@ psx_warmreboot_nobios:
else
{
if(!(psxSdkFlags & PSX_INIT_CD))
- goto psx_warmreboot_nobios;
-
+ goto psx_warmreboot_nobios;
+
BIOSWarmReboot();
}
}