diff options
| author | iCatButler <i.am.catbutler@gmail.com> | 2016-03-30 15:07:35 +0100 |
|---|---|---|
| committer | iCatButler <i.am.catbutler@gmail.com> | 2016-03-30 15:07:35 +0100 |
| commit | 8b4350fee747708ffd376744ef5dc1e239a87ba6 (patch) | |
| tree | a9ab6e2f25e06edc7c668353f8000856704f7fa3 /libpcsxcore | |
| parent | e3df273095a5800e3dcdcb63bd66e269c0c2d3a8 (diff) | |
| download | pcsxr-8b4350fee747708ffd376744ef5dc1e239a87ba6.tar.gz | |
Bring up to date with PCSX-R master (97809)
Diffstat (limited to 'libpcsxcore')
| -rwxr-xr-x | libpcsxcore/cdrom.c | 2 | ||||
| -rwxr-xr-x | libpcsxcore/ix86/iR3000A.c | 4 | ||||
| -rwxr-xr-x | libpcsxcore/ix86_64/iR3000A-64.c | 5 | ||||
| -rwxr-xr-x | libpcsxcore/misc.c | 28 | ||||
| -rwxr-xr-x | libpcsxcore/plugins.c | 3 | ||||
| -rwxr-xr-x | libpcsxcore/plugins.h | 2 | ||||
| -rwxr-xr-x | libpcsxcore/psxbios.c | 218 | ||||
| -rwxr-xr-x | libpcsxcore/psxcommon.h | 2 | ||||
| -rwxr-xr-x | libpcsxcore/sio.c | 12 | ||||
| -rwxr-xr-x | libpcsxcore/sio.h | 3 |
10 files changed, 187 insertions, 92 deletions
diff --git a/libpcsxcore/cdrom.c b/libpcsxcore/cdrom.c index 2aa6f9ad..f92cdd22 100755 --- a/libpcsxcore/cdrom.c +++ b/libpcsxcore/cdrom.c @@ -1328,7 +1328,7 @@ void cdrWrite1(unsigned char rt) { set_loc[i] = btoi(cdr.Param[i]); i = msf2sec(cdr.SetSectorPlay); - i = abs(i - msf2sec(set_loc)); + i = abs(i - (int)msf2sec(set_loc)); if (i > 16) cdr.Seeked = SEEK_PENDING; diff --git a/libpcsxcore/ix86/iR3000A.c b/libpcsxcore/ix86/iR3000A.c index 2ba1cd18..3d662537 100755 --- a/libpcsxcore/ix86/iR3000A.c +++ b/libpcsxcore/ix86/iR3000A.c @@ -418,6 +418,8 @@ static int recInit() { for (i = 0; i < 0x08; i++) psxRecLUT[i + 0xbfc0] = (u32)&recROM[i << 16]; + x86Init(); + return 0; } @@ -425,8 +427,6 @@ static void recReset() { memset(recRAM, 0, 0x200000); memset(recROM, 0, 0x080000); - x86Init(); - x86SetPtr(recMem); branch = 0; diff --git a/libpcsxcore/ix86_64/iR3000A-64.c b/libpcsxcore/ix86_64/iR3000A-64.c index 13cb432c..5c24142a 100755 --- a/libpcsxcore/ix86_64/iR3000A-64.c +++ b/libpcsxcore/ix86_64/iR3000A-64.c @@ -482,6 +482,9 @@ static int recInit() { for (i=0; i<0x08; i++) psxRecLUT[i + 0xbfc0] = (uptr)&recROM[PTRMULT*(i << 16)]; + //x86Init(); + cpudetectInit(); + return 0; } @@ -489,8 +492,6 @@ static void recReset() { memset(recRAM, 0, 0x200000 * PTRMULT); memset(recROM, 0, 0x080000 * PTRMULT); - //x86Init(); - cpudetectInit(); x86SetPtr(recMem); branch = 0; diff --git a/libpcsxcore/misc.c b/libpcsxcore/misc.c index f0f1c4ee..33944cd3 100755 --- a/libpcsxcore/misc.c +++ b/libpcsxcore/misc.c @@ -229,8 +229,17 @@ int LoadCdromFile(const char *filename, EXE_HEADER *head) { u8 time[4],*buf; u8 mdir[4096], exename[256]; u32 size, addr; - - sscanf(filename, "cdrom:\\%255s", exename); + void *psxaddr; + + if (sscanf(filename, "cdrom:\\%255s", exename) <= 0) + { + // Some games omit backslash (NFS4) + if (sscanf(filename, "cdrom:%255s", exename) <= 0) + { + SysPrintf("LoadCdromFile: EXE NAME PARSING ERROR (%s (%u))\n", filename, strlen(filename)); + exit (1); + } + } time[0] = itob(0); time[1] = itob(2); time[2] = itob(0x10); @@ -259,7 +268,9 @@ int LoadCdromFile(const char *filename, EXE_HEADER *head) { incTime(); READTRACK(); - memcpy((void *)PSXM(addr), buf + 12, 2048); + psxaddr = (void *)PSXM(addr); + assert(psxaddr != NULL); + memcpy(psxaddr, buf + 12, 2048); size -= 2048; addr += 2048; @@ -360,13 +371,15 @@ int CheckCdrom() { static int PSXGetFileType(FILE *f) { unsigned long current; - u8 mybuf[2048]; + u8 mybuf[sizeof(EXE_HEADER)]; // EXE_HEADER currently biggest EXE_HEADER *exe_hdr; FILHDR *coff_hdr; + size_t amt; + memset(mybuf, 0, sizeof(mybuf)); current = ftell(f); fseek(f, 0L, SEEK_SET); - fread(mybuf, 2048, 1, f); + amt = fread(mybuf, sizeof(mybuf), 1, f); fseek(f, current, SEEK_SET); exe_hdr = (EXE_HEADER *)mybuf; @@ -408,6 +421,7 @@ int Load(const char *ExePath) { int retval = 0; u8 opcode; u32 section_address, section_size; + void* psxmaddr; strncpy(CdromId, "SLUS99999", 9); strncpy(CdromLabel, "SLUS_999.99", 11); @@ -479,7 +493,9 @@ int Load(const char *ExePath) { fseek(tmpFile, SWAP32(section.s_scnptr), SEEK_SET); fread(PSXM(SWAP32(section.s_paddr)), SWAP32(section.s_size), 1, tmpFile); } else { - memset(PSXM(SWAP32(section.s_paddr)), 0, SWAP32(section.s_size)); + psxmaddr = PSXM(SWAP32(section.s_paddr)); + assert(psxmaddr != NULL); + memset(psxmaddr, 0, SWAP32(section.s_size)); } } break; diff --git a/libpcsxcore/plugins.c b/libpcsxcore/plugins.c index 54c7e468..1713670e 100755 --- a/libpcsxcore/plugins.c +++ b/libpcsxcore/plugins.c @@ -54,6 +54,7 @@ GPUvBlank GPU_vBlank; GPUvisualVibration GPU_visualVibration; GPUcursor GPU_cursor; GPUaddVertex GPU_addVertex; +GPUsetSpeed GPU_setSpeed; GPUpgxpMemory GPU_pgxpMemory; CDRinit CDR_init; @@ -215,6 +216,7 @@ void CALLBACK GPU__vBlank(int val) {} void CALLBACK GPU__visualVibration(unsigned long iSmall, unsigned long iBig) {} void CALLBACK GPU__cursor(int player, int x, int y) {} void CALLBACK GPU__addVertex(short sx,short sy,s64 fx,s64 fy,s64 fz) {} +void CALLBACK GPU__setSpeed(float newSpeed) {} void CALLBACK GPU__pgxpMemory(unsigned char* pMem, unsigned int count, unsigned int addr, unsigned char* pVRAM) {} #define LoadGpuSym1(dest, name) \ @@ -261,6 +263,7 @@ static int LoadGPUplugin(const char *GPUdll) { LoadGpuSym0(visualVibration, "GPUvisualVibration"); LoadGpuSym0(cursor, "GPUcursor"); LoadGpuSym0(addVertex, "GPUaddVertex"); + LoadGpuSym0(setSpeed, "GPUsetSpeed"); LoadGpuSym0(pgxpMemory, "GPUpgxpMemory"); LoadGpuSym0(configure, "GPUconfigure"); LoadGpuSym0(test, "GPUtest"); diff --git a/libpcsxcore/plugins.h b/libpcsxcore/plugins.h index 8f2cc189..c77c0ae0 100755 --- a/libpcsxcore/plugins.h +++ b/libpcsxcore/plugins.h @@ -96,6 +96,7 @@ typedef void (CALLBACK* GPUvBlank)(int); typedef void (CALLBACK* GPUvisualVibration)(uint32_t, uint32_t); typedef void (CALLBACK* GPUcursor)(int, int, int); typedef void (CALLBACK* GPUaddVertex)(short,short,s64,s64,s64); +typedef void (CALLBACK* GPUsetSpeed)(float); // 1.0 = natural speed typedef void (CALLBACK* GPUpgxpMemory)(unsigned int, unsigned char*); // GPU function pointers @@ -126,6 +127,7 @@ extern GPUvBlank GPU_vBlank; extern GPUvisualVibration GPU_visualVibration; extern GPUcursor GPU_cursor; extern GPUaddVertex GPU_addVertex; +extern GPUsetSpeed GPU_setSpeed; extern GPUpgxpMemory GPU_pgxpMemory; // CD-ROM Functions diff --git a/libpcsxcore/psxbios.c b/libpcsxcore/psxbios.c index 204e7536..2f6ce415 100755 --- a/libpcsxcore/psxbios.c +++ b/libpcsxcore/psxbios.c @@ -165,12 +165,21 @@ char *biosC0n[256] = { #define ra (psxRegs.GPR.n.ra) #define pc0 (psxRegs.pc) +#ifdef __NO_ASSERTS__ #define Ra0 ((char *)PSXM(a0)) #define Ra1 ((char *)PSXM(a1)) #define Ra2 ((char *)PSXM(a2)) #define Ra3 ((char *)PSXM(a3)) #define Rv0 ((char *)PSXM(v0)) #define Rsp ((char *)PSXM(sp)) +#else +#define Ra0 (assert(PSXM(a0) != NULL), (char *)PSXM(a0)) +#define Ra1 (assert(PSXM(a1) != NULL), (char *)PSXM(a1)) +#define Ra2 (assert(PSXM(a2) != NULL), (char *)PSXM(a2)) +#define Ra3 (assert(PSXM(a3) != NULL), (char *)PSXM(a3)) +#define Rv0 (assert(PSXM(v0) != NULL), (char *)PSXM(v0)) +#define Rsp (assert(PSXM(sp) != NULL), (char *)PSXM(sp)) +#endif typedef struct { u32 desc; @@ -655,7 +664,7 @@ void psxBios_memset() { // 0x2b while((s32)a2 > 0) { a2--; - psxMu8ref(a0) = a1; + *PSXM(a0) = a1; a0++; } } @@ -964,7 +973,7 @@ void psxBios_printf() { // 0x3f char *ptmp = tmp; int n=1, i=0, j; - memcpy(save, (char*)PSXM(sp), 4 * 4); + memcpy(save, Rsp, 4 * 4); psxMu32ref(sp) = SWAP32((u32)a0); psxMu32ref(sp + 4) = SWAP32((u32)a1); psxMu32ref(sp + 8) = SWAP32((u32)a2); @@ -1018,7 +1027,7 @@ _start: } *ptmp = 0; - memcpy((char*)PSXM(sp), save, 4 * 4); + memcpy(Rsp, save, 4 * 4); #ifdef PSXBIOS_LOG PSXBIOS_LOG("psxBios_%s: %s\n", biosA0n[0x3f], tmp); @@ -1273,16 +1282,34 @@ void psxBios_SetMem() { // 9f } void psxBios__card_info() { // ab - // COTS password option - boolean nocard = (Config.NoMemcard || ((strlen(Config.Mcd1) <=0) && (strlen(Config.Mcd2) <=0))); + u32 ret; #ifdef PSXBIOS_LOG - PSXBIOS_LOG("psxBios_%s: %x\n", biosA0n[0xab], a0); + PSXBIOS_LOG("psxBios_%s: 0x%x\n", biosA0n[0xab], a0); #endif card_active_chan = a0; + switch (card_active_chan) { + case 0x00: case 0x01: case 0x02: case 0x03: + ret = Config.Mcd1[0] ? 0x2 : 0x8; + break; + case 0x10: case 0x11: case 0x12: case 0x13: + ret = Config.Mcd2[0] ? 0x2 : 0x8; + break; + default: +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("psxBios_%s: UNKNOWN PORT 0x%x\n", biosA0n[0xab], card_active_chan); +#endif + ret = 0x11; + break; + } + + // COTS password option + if (Config.NoMemcard) + ret = 0x8; + // DeliverEvent(0x11, 0x2); // 0xf0000011, 0x0004 - DeliverEvent(0x81, nocard ? 0x8 : 0x2); // 0xf4000001, 0x0004 + DeliverEvent(0x81, ret); // 0xf4000001, 0x0004 v0 = 1; pc0 = ra; } @@ -1673,43 +1700,68 @@ void psxBios_UnDeliverEvent() { // 0x20 pc0 = ra; } -#define buopen(mcd) { \ - strcpy(FDesc[1 + mcd].name, Ra0+5); \ - FDesc[1 + mcd].offset = 0; \ - FDesc[1 + mcd].mode = a1; \ - \ - for (i=1; i<16; i++) { \ - ptr = Mcd##mcd##Data + 128 * i; \ - if ((*ptr & 0xF0) != 0x50) continue; \ - if (strcmp(FDesc[1 + mcd].name, ptr+0xa)) continue; \ - FDesc[1 + mcd].mcfile = i; \ - SysPrintf("open %s\n", ptr+0xa); \ - v0 = 1 + mcd; \ - break; \ - } \ - if (a1 & 0x200 && v0 == -1) { /* FCREAT */ \ - for (i=1; i<16; i++) { \ - int j, xor = 0; \ - \ - ptr = Mcd##mcd##Data + 128 * i; \ - if ((*ptr & 0xF0) == 0x50) continue; \ - ptr[0] = 0x50 | (u8)(a1 >> 16); \ - ptr[4] = 0x00; \ - ptr[5] = 0x20; \ - ptr[6] = 0x00; \ - ptr[7] = 0x00; \ - ptr[8] = 'B'; \ - ptr[9] = 'I'; \ - strcpy(ptr+0xa, FDesc[1 + mcd].name); \ - for (j=0; j<127; j++) xor^= ptr[j]; \ - ptr[127] = xor; \ - FDesc[1 + mcd].mcfile = i; \ - SysPrintf("openC %s\n", ptr); \ - v0 = 1 + mcd; \ - SaveMcd(Config.Mcd##mcd, Mcd##mcd##Data, 128 * i, 128); \ - break; \ - } \ - } \ +static void buopen(int mcd, u8 *ptr, u8 *cfg) +{ + int i; + u8 *fptr = ptr; + + strcpy(FDesc[1 + mcd].name, Ra0+5); + FDesc[1 + mcd].offset = 0; + FDesc[1 + mcd].mode = a1; + + for (i=1; i<16; i++) { + fptr += 128; + if ((*fptr & 0xF0) != 0x50) continue; + if (strcmp(FDesc[1 + mcd].name, fptr+0xa)) continue; + FDesc[1 + mcd].mcfile = i; + SysPrintf("open %s\n", fptr+0xa); + v0 = 1 + mcd; + break; + } + if (a1 & 0x200 && v0 == -1) { /* FCREAT */ + fptr = ptr; + for (i=1; i<16; i++) { + int j, xor, nblk = a1 >> 16; + u8 *pptr, *fptr2; + + fptr += 128; + if ((*fptr & 0xF0) != 0xa0) continue; + + FDesc[1 + mcd].mcfile = i; + fptr[0] = 0x51; + fptr[4] = 0x00; + fptr[5] = 0x20 * nblk; + fptr[6] = 0x00; + fptr[7] = 0x00; + strcpy(fptr+0xa, FDesc[1 + mcd].name); + pptr = fptr2 = fptr; + for(j=2; j<=nblk; j++) { + int k; + for(i++; i<16; i++) { + fptr2 += 128; + + memset(fptr2, 0, 128); + fptr2[0] = j < nblk ? 0x52 : 0x53; + pptr[8] = i - 1; + pptr[9] = 0; + for (k=0, xor=0; k<127; k++) xor^= pptr[k]; + pptr[127] = xor; + pptr = fptr2; + break; + } + /* shouldn't this return ENOSPC if i == 16? */ + } + pptr[8] = pptr[9] = 0xff; + for (j=0, xor=0; j<127; j++) xor^= pptr[j]; + pptr[127] = xor; + SysPrintf("openC %s %d\n", ptr, nblk); + v0 = 1 + mcd; + /* just go ahead and resave them all */ + SaveMcd(cfg, ptr, 128, 128 * 15); + break; + } + /* shouldn't this return ENOSPC if i == 16? */ + } } /* @@ -1717,8 +1769,7 @@ void psxBios_UnDeliverEvent() { // 0x20 */ void psxBios_open() { // 0x32 - int i; - char *ptr; + #ifdef PSXBIOS_LOG PSXBIOS_LOG("psxBios_%s: %s,%x\n", biosB0n[0x32], Ra0, a1); @@ -1727,11 +1778,11 @@ void psxBios_open() { // 0x32 v0 = -1; if (!strncmp(Ra0, "bu00", 4)) { - buopen(1); + buopen(1, Mcd1Data, Config.Mcd1); } if (!strncmp(Ra0, "bu10", 4)) { - buopen(2); + buopen(2, Mcd2Data, Config.Mcd2); } pc0 = ra; @@ -1770,7 +1821,7 @@ void psxBios_lseek() { // 0x33 if (FDesc[1 + mcd].mode & 0x8000) v0 = 0; \ else v0 = a2; \ FDesc[1 + mcd].offset += v0; \ - DeliverEvent(0x11, 0x2); /* 0xf0000011, 0x0004 */ \ + DeliverEvent(0x11, 0x2); /* 0xf0000011, 0x0004 */ \ DeliverEvent(0x81, 0x2); /* 0xf4000001, 0x0004 */ \ } @@ -1791,7 +1842,7 @@ void psxBios_read() { // 0x34 case 2: buread(1); break; case 3: buread(2); break; } - + pc0 = ra; } @@ -1804,7 +1855,7 @@ void psxBios_read() { // 0x34 SaveMcd(Config.Mcd##mcd, Mcd##mcd##Data, offset, a2); \ if (FDesc[1 + mcd].mode & 0x8000) v0 = 0; \ else v0 = a2; \ - DeliverEvent(0x11, 0x2); /* 0xf0000011, 0x0004 */ \ + DeliverEvent(0x11, 0x2); /* 0xf0000011, 0x0004 */ \ DeliverEvent(0x81, 0x2); /* 0xf4000001, 0x0004 */ \ } @@ -1855,21 +1906,21 @@ char psxstrbuf[PSXSTRBUFMAX+1]; unsigned short psxstrbuf_count = 0; void psxBios_putchar() { // 3d - char logchar = ( a0 == 0xa ? '>' : (char)a0 ); - if (psxstrbuf_count < PSXSTRBUFMAX) psxstrbuf[psxstrbuf_count++] = logchar; + char logchar = ( a0 == 0xa ? '>' : (char)a0 ); + if (psxstrbuf_count < PSXSTRBUFMAX) psxstrbuf[psxstrbuf_count++] = logchar; #ifdef PSXBIOS_LOG PSXBIOS_LOG("psxBios_%s: %x (%c)\n", biosB0n[0x3d], a0, logchar); #else SysPrintf("%c", (char)a0); #endif - if ((a0 == 0xa && psxstrbuf_count >= 2) || psxstrbuf_count >= PSXSTRBUFMAX) { - psxstrbuf[psxstrbuf_count++] = '\0'; + if ((a0 == 0xa && psxstrbuf_count >= 2) || psxstrbuf_count >= PSXSTRBUFMAX) { + psxstrbuf[psxstrbuf_count++] = '\0'; #ifdef PSXBIOS_LOG - PSXBIOS_LOG("psxBios_%s: string_[%d]_cr: %s\n", biosB0n[0x3d], psxstrbuf_count, psxstrbuf); + PSXBIOS_LOG("psxBios_%s: string_[%d]_cr: %s\n", biosB0n[0x3d], psxstrbuf_count, psxstrbuf); #endif - psxstrbuf_count = 0; - } + psxstrbuf_count = 0; + } pc0 = ra; } @@ -1890,17 +1941,18 @@ int nfile; while (nfile < 16) { \ int match=1; \ \ - ptr = Mcd##mcd##Data + 128 * nfile; \ + ptr = Mcd##mcd##Data + 128 * (nfile + 1); \ nfile++; \ if ((*ptr & 0xF0) != 0x50) continue; \ + /* Bug link files show up as free block. */ \ + if (!ptr[0xa]) continue; \ ptr+= 0xa; \ if (pfile[0] == 0) { \ strncpy(dir->name, ptr, sizeof(dir->name)); \ - dir->name[sizeof(dir->name) - 1] = '\0'; \ + dir->name[sizeof(dir->name)] = '\0'; \ } else for (i=0; i<20; i++) { \ if (pfile[i] == ptr[i]) { \ - dir->name[i] = ptr[i]; \ - if (ptr[i] == 0) break; else continue; } \ + dir->name[i] = ptr[i]; continue; } \ if (pfile[i] == '?') { \ dir->name[i] = ptr[i]; continue; } \ if (pfile[i] == '*') { \ @@ -1908,7 +1960,7 @@ int nfile; match = 0; break; \ } \ SysPrintf("%d : %s = %s + %s (match=%d)\n", nfile, dir->name, pfile, ptr, match); \ - if (match == 0) continue; \ + if (match == 0) { continue; } \ dir->size = 8192; \ v0 = _dir; \ break; \ @@ -1933,10 +1985,13 @@ void psxBios_firstfile() { // 42 strcpy(ffile, Ra0); pfile = ffile+5; - nfile = 1; + nfile = 0; + if (!strncmp(Ra0, "bu00", 4)) { + DeliverEvent(0x11, 0x2); bufile(1); } else if (!strncmp(Ra0, "bu10", 4)) { + DeliverEvent(0x11, 0x2); bufile(2); } @@ -2082,21 +2137,21 @@ void psxBios_StopCARD() { // 4c } void psxBios__card_write() { // 0x4e - int port; + int const port = a0 >> 4; + u32 const sect = a1 % (MCD_SIZE/8); // roll on range 0...3FFF #ifdef PSXBIOS_LOG - PSXBIOS_LOG("psxBios_%s: %x,%x,%x\n", biosB0n[0x4e], a0, a1, a2); + PSXBIOS_LOG("psxBios_%s, PORT=%i, SECT=%u(%u), DEST=%p\n", biosB0n[0x4e], port, sect, a1, a2); #endif card_active_chan = a0; - port = a0 >> 4; if (port == 0) { - memcpy(Mcd1Data + a1 * 128, Ra2, 128); - SaveMcd(Config.Mcd1, Mcd1Data, a1 * 128, 128); + memcpy(Mcd1Data + (sect * MCD_SECT_SIZE), Ra2, MCD_SECT_SIZE); + SaveMcd(Config.Mcd1, Mcd1Data, sect * MCD_SECT_SIZE, MCD_SECT_SIZE); } else { - memcpy(Mcd2Data + a1 * 128, Ra2, 128); - SaveMcd(Config.Mcd2, Mcd2Data, a1 * 128, 128); + memcpy(Mcd2Data + (sect * MCD_SECT_SIZE), Ra2, MCD_SECT_SIZE); + SaveMcd(Config.Mcd2, Mcd2Data, sect * MCD_SECT_SIZE, MCD_SECT_SIZE); } DeliverEvent(0x11, 0x2); // 0xf0000011, 0x0004 @@ -2106,19 +2161,19 @@ void psxBios__card_write() { // 0x4e } void psxBios__card_read() { // 0x4f - int port; + int const port = a0 >> 4; + u32 const sect = a1 % (MCD_SIZE/8); // roll on range 0...3FFF #ifdef PSXBIOS_LOG - PSXBIOS_LOG("psxBios_%s\n", biosB0n[0x4f]); + PSXBIOS_LOG("psxBios_%s, PORT=%i, SECT=%u(%u), DEST=%p\n", biosB0n[0x4f], port, sect, a1, a2); #endif card_active_chan = a0; - port = a0 >> 4; if (port == 0) { - memcpy(Ra2, Mcd1Data + a1 * 128, 128); + memcpy(Ra2, Mcd1Data + (sect * MCD_SECT_SIZE), MCD_SECT_SIZE); } else { - memcpy(Ra2, Mcd2Data + a1 * 128, 128); + memcpy(Ra2, Mcd2Data + (sect * MCD_SECT_SIZE), MCD_SECT_SIZE); } DeliverEvent(0x11, 0x2); // 0xf0000011, 0x0004 @@ -2178,6 +2233,15 @@ void psxBios_Krom2RawAdd() { // 0x51 pc0 = ra; } +// stub? +void psxBios__get_error() { // 55 +#ifdef PSXBIOS_LOG + PSXBIOS_LOG("psxBios_%s\n", biosB0n[0x55]); +#endif + + v0 = 0; pc0 = ra; +} + void psxBios_GetC0Table() { // 56 #ifdef PSXBIOS_LOG PSXBIOS_LOG("psxBios_%s\n", biosB0n[0x56]); @@ -2566,7 +2630,7 @@ void psxBiosInit() { //biosB0[0x52] = psxBios_sys_b0_52; //biosB0[0x53] = psxBios_sys_b0_53; //biosB0[0x54] = psxBios__get_errno; - //biosB0[0x55] = psxBios__get_error; + biosB0[0x55] = psxBios__get_error; biosB0[0x56] = psxBios_GetC0Table; biosB0[0x57] = psxBios_GetB0Table; biosB0[0x58] = psxBios__card_chan; diff --git a/libpcsxcore/psxcommon.h b/libpcsxcore/psxcommon.h index fc1a0c02..3f13dfa8 100755 --- a/libpcsxcore/psxcommon.h +++ b/libpcsxcore/psxcommon.h @@ -159,6 +159,8 @@ typedef struct { u8 PsxType; // PSX_TYPE_NTSC or PSX_TYPE_PAL u32 RewindCount; u32 RewindInterval; + u32 AltSpeed1; // Percent relative to natural speed. + u32 AltSpeed2; u8 HackFix; #ifdef _WIN32 char Lang[256]; diff --git a/libpcsxcore/sio.c b/libpcsxcore/sio.c index 22ca23e5..e4b8fea1 100755 --- a/libpcsxcore/sio.c +++ b/libpcsxcore/sio.c @@ -59,6 +59,10 @@ void SaveDongle( char *str ); static unsigned char buf[ BUFFER_SIZE ]; +//[0] -> dummy +//[1] -> memory card status flag +//[2] -> card 1 id, 0x5a->plugged, any other not plugged +//[3] -> card 2 id, 0x5d->plugged, any other not plugged unsigned char cardh[4] = { 0x00, 0x08, 0x5a, 0x5d }; // Transfer Ready and the Buffer is Empty @@ -722,10 +726,12 @@ void sioWrite8(unsigned char value) { StatReg |= RX_RDY; // Chronicles of the Sword - no memcard = password options - if( Config.NoMemcard || ((strlen(Config.Mcd1) <=0) && (strlen(Config.Mcd2) <=0)) ) { + if( Config.NoMemcard || (!Config.Mcd1[0] && !Config.Mcd2[0])) { memset(buf, 0x00, 4); } else { memcpy(buf, cardh, 4); + if (!Config.Mcd1[0]) buf[2]=0; // is card 1 plugged? (Codename Tenka) + if (!Config.Mcd2[0]) buf[3]=0; // is card 2 plugged? } parp = 0; @@ -883,8 +889,8 @@ void LoadMcd(int mcd, char *str) { if (mcd == 2) data = Mcd2Data; if (*str == 0) { - sprintf(str, "%s/.pcsxr/memcards/card%d.mcd", getenv("HOME"), mcd); // TODO: maybe just whine and quit.. - SysPrintf(_("No memory card value was specified - using a default card %s\n"), str); + SysPrintf(_("No memory card value was specified - card %i is not plugged.\n"), mcd); + return; } f = fopen(str, "rb"); if (f == NULL) { diff --git a/libpcsxcore/sio.h b/libpcsxcore/sio.h index f22218b3..64993992 100755 --- a/libpcsxcore/sio.h +++ b/libpcsxcore/sio.h @@ -31,7 +31,8 @@ extern "C" { #include "plugins.h" #include "psemu_plugin_defs.h" -#define MCD_SIZE (1024 * 8 * 16) +#define MCD_SECT_SIZE (8 * 16) +#define MCD_SIZE (1024 * MCD_SECT_SIZE) extern char Mcd1Data[MCD_SIZE], Mcd2Data[MCD_SIZE]; |
