simias / rustation

Playstation emulator in the Rust programing language
Other
555 stars 20 forks source link

I was thinking... #34

Open AraHaan opened 7 years ago

AraHaan commented 7 years ago

I have the Psyq PSX(PS1) SDK installed would those C / C++ headers be useful to help implementing some things in Rust from the actual Playstation?

I even found the headers that contains information about things like loading / saving to / from memory cards. It could be helpful.

Also I wonder how quicksaves was done in emulators like ePSXe. I always wanted an Open source PSX emulator though.

(funny how the games on the PSX was created using C and/or C++ (Although not modern ones))

C:\psyq\include\KERNEL.H

#ifndef _KERNEL_H
#define _KERNEL_H

/*
 * File:kernel.h    Rev. 3
*/
/*
 * $PSLibId: Run-time Library Release 4.6$
 */
#ifndef _R3000_H
#include <r3000.h>
#endif

#ifndef _ASM_H
#include <asm.h>
#endif

/* don't change these macros and structures which is refereced in kernel code */ 

#define DescMask    0xff000000
#define DescTH      DescMask
#define DescHW      0xf0000000
#define DescEV      0xf1000000
#define DescRC      0xf2000000
#define DescUEV     0xf3000000  /* User event */
#define DescSW      0xf4000000  /* BIOS */

#define HwVBLANK    (DescHW|0x01)   /* VBLANK */
#define HwGPU       (DescHW|0x02)   /* GPU */
#define HwCdRom     (DescHW|0x03)   /* CDROM Decorder */
#define HwDMAC      (DescHW|0x04)   /* DMA controller */
#define HwRTC0      (DescHW|0x05)   /* RTC0 */
#define HwRTC1      (DescHW|0x06)   /* RTC1 */
#define HwRTC2      (DescHW|0x07)   /* RTC2 */
#define HwCNTL      (DescHW|0x08)   /* Controller */
#define HwSPU       (DescHW|0x09)   /* SPU */
#define HwPIO       (DescHW|0x0a)   /* PIO */
#define HwSIO       (DescHW|0x0b)   /* SIO */

#define HwCPU       (DescHW|0x10)   /* Exception */
#define HwCARD      (DescHW|0x11)   /* memory card */
#define HwCARD_0    (DescHW|0x12)   /* memory card */
#define HwCARD_1    (DescHW|0x13)   /* memory card */
#define SwCARD      (DescSW|0x01)   /* memory card */
#define SwMATH          (DescSW|0x02)   /* libmath */

#define RCntCNT0        (DescRC|0x00)   /* display pixel */
#define RCntCNT1    (DescRC|0x01)   /* horizontal sync */
#define RCntCNT2    (DescRC|0x02)   /* one-eighth of system clock */
#define RCntCNT3    (DescRC|0x03)   /* vertical sync target value fixed to 1 */

#define RCntMdINTR  0x1000
#define RCntMdNOINTR    0x2000
#define RCntMdSC    0x0001
#define RCntMdSP    0x0000
#define RCntMdFR    0x0000
#define RCntMdGATE  0x0010

#define EvSpCZ      0x0001      /* counter becomes zero */
#define EvSpINT     0x0002      /* interrupted */
#define EvSpIOE     0x0004      /* end of i/o */
#define EvSpCLOSE   0x0008      /* file was closed */
#define EvSpACK     0x0010      /* command acknowledged */
#define EvSpCOMP    0x0020      /* command completed */
#define EvSpDR      0x0040      /* data ready */
#define EvSpDE      0x0080      /* data end */
#define EvSpTIMOUT      0x0100          /* time out */
#define EvSpUNKNOWN     0x0200          /* unknown command */
#define EvSpIOER    0x0400      /* end of read buffer */
#define EvSpIOEW    0x0800      /* end of write buffer */
#define EvSpTRAP        0x1000          /* general interrupt */
#define EvSpNEW     0x2000      /* new device */
#define EvSpSYSCALL 0x4000      /* system call instruction */
#define EvSpERROR   0x8000      /* error happned */
#define EvSpPERROR  0x8001      /* previous write error happned */
#define EvSpEDOM        0x0301      /* domain error in libmath */
#define EvSpERANGE      0x0302      /* range error in libmath */

#define EvMdINTR    0x1000
#define EvMdNOINTR  0x2000

#define EvStUNUSED      0x0000
#define EvStWAIT        0x1000
#define EvStACTIVE      0x2000
#define EvStALREADY     0x4000

#define TcbMdRT     0x1000      /* reserved by system */
#define TcbMdPRI    0x2000      /* reserved by system */

#define TcbStUNUSED 0x1000
#define TcbStACTIVE 0x4000

#if defined(_LANGUAGE_C)||defined(LANGUAGE_C)||defined(_LANGUAGE_C_PLUS_PLUS)||defined(__cplusplus)||defined(c_plusplus)
struct ToT {
    unsigned long *head;
    long size;
};

struct TCBH {
    struct TCB *entry;  /* NULL */
    long flag;
};

struct TCB {
    long status;
    long mode;
    unsigned long reg[NREGS];   /* never change the offset of this */
    long system[6];         /* reserved by system */
};

struct EvCB {
    unsigned long desc; 
    long status;
    long spec;
    long mode;
    long (*FHandler)();
    long system[2];         /* reserved by system */
};

struct EXEC {                   
        unsigned long pc0;      
        unsigned long gp0;      
        unsigned long t_addr;   
        unsigned long t_size;   
        unsigned long d_addr;   
        unsigned long d_size;   
        unsigned long b_addr;   
        unsigned long b_size;   
    unsigned long s_addr;
    unsigned long s_size;
    unsigned long sp,fp,gp,ret,base;
};

struct XF_HDR {
    char key[8];
    unsigned long text;
    unsigned long data;
    struct EXEC exec;
    char title[60];     /* "PlayStation(tm) Executable A1" */
};

struct DIRENTRY {
    char name[20];
    long attr;
    long size;
    struct DIRENTRY *next;
    long head;
    char system[4];
};

extern struct ToT SysToT[32];

extern long SysClearRCnt[];

#ifndef NULL
#define NULL (0)
#endif

#if defined(_LANGUAGE_C)||defined(LANGUAGE_C)
#define delete  erase
#endif /* LANGUAGE_C */

#endif /* LANGUAGE_C||_LANGUAGE_C_PLUS_PLUS||__cplusplus||c_plusplus */

#endif /* _KERNEL_H */

But yeah maybe the psyq can actually help finish the emulator up to become as good as the original Playstation.

simias commented 7 years ago

That looks potentially interesting but I'm not sure it's very legal to paste that code on github, what's the license on this SDK?

At any rate I think the various BIOS APIs are fairly well documented already (by No$ and others) so I'm not it would help massively. Knowing how the SDK works is useful when debugging a game to figure out what it's doing. That being said if you want accuracy you don't emulate at the SDK level anyway, you target the low level hardware interfaces.

It could be a good inspiration if you wanted to write a Rust SDK for the PSX however. I tried doing that (at least for writing tests) but unfortunately LLVM doesn't seem to support the PSX CPU yet (see https://github.com/simias/psx-sdk-rs/issues/1)