aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorspicyjpeg <thatspicyjpeg@gmail.com>2023-05-12 18:05:21 +0200
committerspicyjpeg <thatspicyjpeg@gmail.com>2023-05-12 18:05:21 +0200
commit513a6e99dd1f9cf5531d55f544478bec72efb910 (patch)
tree47d7789347ba596dca54704df24e85b6763f26a2
parent4230715311892502452f326f3618e5ef4dc81972 (diff)
downloadpsn00bsdk-513a6e99dd1f9cf5531d55f544478bec72efb910.tar.gz
Downgrade GCC to 12.3, add setjmp(), fix CdGetRegion()
-rw-r--r--.github/workflows/build.yml2
-rw-r--r--CHANGELOG.md5
-rw-r--r--libpsn00b/include/psxapi.h136
-rw-r--r--libpsn00b/include/setjmp.h31
-rw-r--r--libpsn00b/libc/setjmp.s48
-rw-r--r--libpsn00b/psxcd/common.c4
-rw-r--r--libpsn00b/psxetc/interrupts.c3
7 files changed, 154 insertions, 75 deletions
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index e84dbca..00926ef 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -12,7 +12,7 @@ on: [ push, pull_request ]
env:
BINUTILS_VERSION: '2.40'
BINUTILS_OPTIONS: '--disable-docs --disable-nls --disable-werror --with-float=soft'
- GCC_VERSION: '13.1.0'
+ GCC_VERSION: '12.3.0'
GCC_OPTIONS: '--disable-docs --disable-nls --disable-werror --disable-libada --disable-libssp --disable-libquadmath --disable-threads --disable-libgomp --disable-libstdcxx-pch --disable-hosted-libstdcxx --enable-languages=c,c++ --without-isl --without-headers --with-float=soft --with-gnu-as --with-gnu-ld'
GCC_TARGET: 'mipsel-none-elf'
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 971b71c..2d6a313 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -21,8 +21,11 @@ to ensure the changelog can be parsed correctly.
## 2023-05-11: 0.23
+spicyjpeg:
+
- libc: Added some missing C++ STL headers (`cassert`, `cctype`, `cstdint`,
- `cstdio`, `cstdlib`, `cstring`).
+ `cstdio`, `cstdlib`, `cstring`). Added `setjmp()` and `longjmp()` as well as
+ the `jmp_buf` type.
- psxgpu: Added `SetDrawOpType()` and the `GPU_DrawOpType` enum for more
flexibility when using custom drawing queue callbacks with `EnqueueDrawOp()`.
diff --git a/libpsn00b/include/psxapi.h b/libpsn00b/include/psxapi.h
index 35ee040..49d1620 100644
--- a/libpsn00b/include/psxapi.h
+++ b/libpsn00b/include/psxapi.h
@@ -19,69 +19,73 @@
#include <stdint.h>
#include <stddef.h>
+#include <setjmp.h>
#include <hwregs_c.h>
/* Definitions */
-// TODO: these desperately need to be cleaned up
-
-#define SEEK_SET 0
-#define SEEK_CUR 1
-#define SEEK_END 2
-
-#define DescMask 0xff000000 // Event descriptor mask
-#define DescTH DescMask
-#define DescHW 0xf0000000 // Hardware event (IRQ)
-#define DescEV 0xf1000000 // Event event
-#define DescRC 0xf2000000 // Root counter event
-#define DescUEV 0xf3000000 // User event
-#define DescSW 0xf4000000 // BIOS event
-
-#define HwVBLANK (DescHW|0x01) // VBlank
-#define HwGPU (DescHW|0x02) // GPU
-#define HwCdRom (DescHW|0x03) // CDROM
-#define HwDMAC (DescHW|0x04) // DMA
-#define HwRTC0 (DescHW|0x05) // Timer 0
-#define HwRTC1 (DescHW|0x06) // Timer 1
-#define HwRTC2 (DescHW|0x07) // Timer 2
-#define HwCNTL (DescHW|0x08) // Controller
-#define HwSPU (DescHW|0x09) // SPU
-#define HwPIO (DescHW|0x0a) // PIO & lightgun
-#define HwSIO (DescHW|0x0b) // Serial
-
-#define HwCPU (DescHW|0x10) // Processor exception
-#define HwCARD (DescHW|0x11) // Memory card (lower level BIOS functions)
-#define HwCard_0 (DescHW|0x12)
-#define HwCard_1 (DescHW|0x13)
-#define SwCARD (DescSW|0x01) // Memory card (higher level BIOS functions)
-#define SwMATH (DescSW|0x02)
-
-#define EvSpIOE 0x0004
-#define EvSpERROR 0x8000
-#define EvSpTIMOUT 0x0100
-#define EvSpNEW 0x0200
-
-#define EvMdINTR 0x1000
-#define EvMdNOINTR 0x2000
-
-// Root counter (timer) definitions
-#define DescRC 0xf2000000
-
-#define RCntCNT0 (DescRC|0x00)
-#define RCntCNT1 (DescRC|0x01)
-#define RCntCNT2 (DescRC|0x02)
-#define RCntCNT3 (DescRC|0x03)
-
-#define RCntMdINTR 0x1000 // Turns on IRQ
-#define RCntMdNOINTR 0x2000 // Polling mode
-#define RCntMdSC 0x0001 // IRQ when counter target
-#define RCntMdSP 0x0000
-#define RCntMdFR 0x0000
-#define RCntMdGATE 0x0010
+typedef enum _SeekMode {
+ SEEK_SET = 0,
+ SEEK_CUR = 1,
+ SEEK_END = 2
+} SeekMode;
+
+typedef enum _EventDescriptor {
+ DescMask = 0xff000000, // Event descriptor mask
+ DescTH = 0xff000000,
+ DescHW = 0xf0000000, // Hardware event (IRQ)
+ DescEV = 0xf1000000, // Event event
+ DescRC = 0xf2000000, // Root counter event
+ DescUEV = 0xf3000000, // User event
+ DescSW = 0xf4000000 // BIOS event
+} EventDescriptor;
+
+typedef enum _EventType {
+ HwVBLANK = DescHW | 0x01, // VBlank
+ HwGPU = DescHW | 0x02, // GPU
+ HwCdRom = DescHW | 0x03, // CDROM
+ HwDMAC = DescHW | 0x04, // DMA
+ HwRTC0 = DescHW | 0x05, // Timer 0
+ HwRTC1 = DescHW | 0x06, // Timer 1
+ HwRTC2 = DescHW | 0x07, // Timer 2
+ HwCNTL = DescHW | 0x08, // Controller
+ HwSPU = DescHW | 0x09, // SPU
+ HwPIO = DescHW | 0x0a, // PIO & lightgun
+ HwSIO = DescHW | 0x0b, // Serial
+ HwCPU = DescHW | 0x10, // Processor exception
+ HwCARD = DescHW | 0x11, // Memory card (lower level BIOS functions)
+ HwCARD_0 = DescHW | 0x12,
+ HwCARD_1 = DescHW | 0x13,
+
+ RCntCNT0 = DescRC | 0x00,
+ RCntCNT1 = DescRC | 0x01,
+ RCntCNT2 = DescRC | 0x02,
+ RCntCNT3 = DescRC | 0x03,
+
+ SwCARD = DescSW | 0x01, // Memory card (higher level BIOS functions)
+ SwMATH = DescSW | 0x02
+} EventType;
+
+typedef enum _EventFlag {
+ EvSpIOE = 1 << 2,
+ EvSpTIMOUT = 1 << 8,
+ EvSpNEW = 1 << 9,
+ EvSpERROR = 1 << 15,
+
+ EvMdINTR = 1 << 12,
+ EvMdNOINTR = 1 << 13,
+
+ RCntMdSP = 0 << 0,
+ RCntMdFR = 0 << 0,
+ RCntMdSC = 1 << 0, // IRQ when counter target
+ RCntMdGATE = 1 << 4,
+ RCntMdINTR = 1 << 12, // Turns on IRQ
+ RCntMdNOINTR = 1 << 13 // Polling mode
+} EventFlag;
/* Structure definitions */
-typedef struct { // Thread control block
+typedef struct _TCB { // Thread control block
int status;
int mode;
union {
@@ -106,11 +110,11 @@ typedef struct { // Thread control block
int _reserved[9];
} TCB;
-typedef struct { // Process control block
+typedef struct _PCB { // Process control block
TCB *thread;
} PCB;
-typedef struct { // Device control block
+typedef struct _DCB { // Device control block
char *name;
int flags;
int ssize;
@@ -133,7 +137,7 @@ typedef struct { // Device control block
void *f_testdevice;
} DCB;
-typedef struct { // File control block
+typedef struct _FCB { // File control block
int status;
uint32_t diskid;
void *trns_addr;
@@ -147,7 +151,7 @@ typedef struct { // File control block
uint32_t fcbnum;
} FCB;
-struct DIRENTRY { // Directory entry
+struct DIRENTRY { // Directory entry
char name[20];
int attr;
int size;
@@ -165,13 +169,7 @@ struct EXEC {
uint32_t sp, fp, rp, ret, base;
};
-struct JMP_BUF {
- uint32_t ra, sp, fp;
- uint32_t s0, s1, s2, s3, s4, s5, s6, s7;
- uint32_t gp;
-};
-
-typedef struct {
+typedef struct _INT_RP {
uint32_t *next;
uint32_t *func2;
uint32_t *func1;
@@ -303,10 +301,8 @@ int Exec(struct EXEC *exec, int argc, const char **argv);
int LoadExec(const char *path, int argc, const char **argv);
void FlushCache(void);
-void b_setjmp(struct JMP_BUF *buf);
-void b_longjmp(const struct JMP_BUF *buf, int param);
void ResetEntryInt(void);
-void HookEntryInt(const struct JMP_BUF *buf);
+void HookEntryInt(jmp_buf buf);
void ReturnFromException(void);
int SetConf(int evcb, int tcb, uint32_t sp);
diff --git a/libpsn00b/include/setjmp.h b/libpsn00b/include/setjmp.h
new file mode 100644
index 0000000..0f05b67
--- /dev/null
+++ b/libpsn00b/include/setjmp.h
@@ -0,0 +1,31 @@
+/*
+ * PSn00bSDK standard library
+ * (C) 2023 spicyjpeg - MPL licensed
+ *
+ * This setjmp() implementation is compatible with the one in the BIOS, making
+ * it possible to pass a jmp_buf structure as-is to BIOS functions such as
+ * HookEntryInt().
+ */
+
+#pragma once
+
+#include <stdint.h>
+
+typedef struct _JumpBuffer {
+ uint32_t ra, sp, fp;
+ uint32_t s0, s1, s2, s3, s4, s5, s6, s7;
+ uint32_t gp;
+} JumpBuffer;
+
+typedef JumpBuffer *jmp_buf;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int setjmp(jmp_buf buf);
+void longjmp(jmp_buf buf, int value);
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/libpsn00b/libc/setjmp.s b/libpsn00b/libc/setjmp.s
new file mode 100644
index 0000000..465a712
--- /dev/null
+++ b/libpsn00b/libc/setjmp.s
@@ -0,0 +1,48 @@
+# PSn00bSDK setjmp/longjmp
+# (C) 2023 spicyjpeg - MPL licensed
+#
+# This is not a "proper" implementation of setjmp/longjmp as it does not save
+# COP0 and GTE registers, but it is fully compatible with the version found in
+# the BIOS.
+
+.set noreorder
+
+.section .text.setjmp
+.global setjmp
+.type setjmp, @function
+setjmp:
+ sw $ra, 0x00($a0)
+ sw $sp, 0x04($a0)
+ sw $fp, 0x08($a0)
+ sw $s0, 0x0c($a0)
+ sw $s1, 0x10($a0)
+ sw $s2, 0x14($a0)
+ sw $s3, 0x18($a0)
+ sw $s4, 0x1c($a0)
+ sw $s5, 0x20($a0)
+ sw $s6, 0x24($a0)
+ sw $s7, 0x28($a0)
+ sw $gp, 0x2c($a0)
+
+ jr $ra
+ li $v0, 0
+
+.section .text.longjmp
+.global longjmp
+.type longjmp, @function
+longjmp:
+ lw $ra, 0x00($a0)
+ lw $sp, 0x04($a0)
+ lw $fp, 0x08($a0)
+ lw $s0, 0x0c($a0)
+ lw $s1, 0x10($a0)
+ lw $s2, 0x14($a0)
+ lw $s3, 0x18($a0)
+ lw $s4, 0x1c($a0)
+ lw $s5, 0x20($a0)
+ lw $s6, 0x24($a0)
+ lw $s7, 0x28($a0)
+ lw $gp, 0x2c($a0)
+
+ jr $ra
+ move $v0, $a1
diff --git a/libpsn00b/psxcd/common.c b/libpsn00b/psxcd/common.c
index 461ab91..438fcc1 100644
--- a/libpsn00b/psxcd/common.c
+++ b/libpsn00b/psxcd/common.c
@@ -12,6 +12,7 @@
#define CD_ACK_TIMEOUT 0x100000
#define CD_SYNC_TIMEOUT 0x100000
+#define MAX_RESULT_SIZE 32
/* Internal globals */
@@ -134,7 +135,7 @@ static void _cd_irq_handler(void) {
if (_result_ptr) {
_result_ptr[0] = first_byte;
- for (int i = 1; (CD_REG(0) & 0x20) && (i < 8); i++)
+ for (int i = 1; (CD_REG(0) & 0x20) && (i < MAX_RESULT_SIZE); i++)
_result_ptr[i] = CD_REG(1);
}
@@ -257,7 +258,6 @@ int CdCommandF(CdlCommand cmd, const void *param, int length) {
// Keep track of the last mode and seek location set (so retries can be
// attempted).
-
if (cmd == CdlSetloc) {
_last_pos.minute = _param[0];
_last_pos.second = _param[1];
diff --git a/libpsn00b/psxetc/interrupts.c b/libpsn00b/psxetc/interrupts.c
index 8bd11fc..acb5736 100644
--- a/libpsn00b/psxetc/interrupts.c
+++ b/libpsn00b/psxetc/interrupts.c
@@ -5,6 +5,7 @@
#include <stdint.h>
#include <assert.h>
+#include <setjmp.h>
#include <psxapi.h>
#include <psxetc.h>
#include <hwregs_c.h>
@@ -36,7 +37,7 @@ static uint8_t _isr_stack[ISR_STACK_SIZE];
extern uint8_t _gp[];
static void _global_isr(void);
-static const struct JMP_BUF _isr_jmp_buf = {
+static const JumpBuffer _isr_jmp_buf = {
.ra = (uint32_t) &_global_isr,
.sp = (uint32_t) &_isr_stack[ISR_STACK_SIZE],
.fp = 0,