aboutsummaryrefslogtreecommitdiff
path: root/libpsn00b/psxapi/_syscalls.S
diff options
context:
space:
mode:
Diffstat (limited to 'libpsn00b/psxapi/_syscalls.S')
-rw-r--r--libpsn00b/psxapi/_syscalls.S161
1 files changed, 161 insertions, 0 deletions
diff --git a/libpsn00b/psxapi/_syscalls.S b/libpsn00b/psxapi/_syscalls.S
new file mode 100644
index 0000000..cef349d
--- /dev/null
+++ b/libpsn00b/psxapi/_syscalls.S
@@ -0,0 +1,161 @@
+# PSn00bSDK syscall wrappers
+# (C) 2022-2023 spicyjpeg - MPL licensed
+
+.set noreorder
+
+## Interrupt enable/disable
+
+.section .text.EnterCriticalSection, "ax", @progbits
+.global EnterCriticalSection
+.type EnterCriticalSection, @function
+
+EnterCriticalSection:
+ li $a0, 0x01
+ syscall 0
+
+ jr $ra
+ nop
+
+.section .text.ExitCriticalSection, "ax", @progbits
+.global ExitCriticalSection
+.type ExitCriticalSection, @function
+
+ExitCriticalSection:
+ li $a0, 0x02
+ syscall 0
+
+ jr $ra
+ nop
+
+.section .text.SwEnterCriticalSection, "ax", @progbits
+.global SwEnterCriticalSection
+.type SwEnterCriticalSection, @function
+
+SwEnterCriticalSection:
+ mfc0 $a0, $12 # cop0r12 &= ~0x401
+ li $a1, -1026
+ and $a1, $a0
+ mtc0 $a1, $12
+ andi $a0, 0x0401 # return !((cop0r12_prev & 0x401) < 0x401)
+ sltiu $v0, $a0, 0x0401
+
+ jr $ra
+ xori $v0, 1
+
+.section .text.SwExitCriticalSection, "ax", @progbits
+.global SwExitCriticalSection
+.type SwExitCriticalSection, @function
+
+SwExitCriticalSection:
+ mfc0 $a0, $12 # cop0r12 |= 0x401
+ nop
+ ori $a0, 0x0401
+ mtc0 $a0, $12
+ nop
+
+ jr $ra
+ nop
+
+## PCDRV (host file access) API
+
+.section .text.PCinit, "ax", @progbits
+.global PCinit
+.type PCinit, @function
+
+PCinit:
+ break 0, 0x101 # () -> error
+
+ jr $ra
+ nop
+
+.section .text.PCcreat, "ax", @progbits
+.global PCcreat
+.type PCcreat, @function
+
+PCcreat:
+ li $a2, 0
+ move $a1, $a0
+ break 0, 0x102 # (path, path, 0) -> error, fd
+
+ bgez $v0, .Lcreate_ok # if (error < 0) fd = error
+ nop
+ move $v1, $v0
+.Lcreate_ok:
+ jr $ra # return fd
+ move $v0, $v1
+
+.section .text.PCopen, "ax", @progbits
+.global PCopen
+.type PCopen, @function
+
+PCopen:
+ move $a2, $a1
+ move $a1, $a0
+ break 0, 0x103 # (path, path, mode) -> error, fd
+
+ bgez $v0, .Lopen_ok # if (error < 0) fd = error
+ nop
+ move $v1, $v0
+.Lopen_ok:
+ jr $ra # return fd
+ move $v0, $v1
+
+.section .text.PCclose, "ax", @progbits
+.global PCclose
+.type PCclose, @function
+
+PCclose:
+ move $a1, $a0
+ break 0, 0x104 # (fd, fd) -> error
+
+ jr $ra
+ nop
+
+.section .text.PCread, "ax", @progbits
+.global PCread
+.type PCread, @function
+
+PCread:
+ move $a3, $a1
+ move $a1, $a0
+ break 0, 0x105 # (fd, fd, length, data) -> error, length
+
+ bgez $v0, .Lread_ok # if (error < 0) length = error
+ nop
+ move $v1, $v0
+.Lread_ok:
+ jr $ra # return length
+ move $v0, $v1
+
+.section .text.PCwrite, "ax", @progbits
+.global PCwrite
+.type PCwrite, @function
+
+PCwrite:
+ move $a3, $a1
+ move $a1, $a0
+ break 0, 0x106 # (fd, fd, length, data) -> error, length
+
+ bgez $v0, .Lwrite_ok # if (error < 0) length = error
+ nop
+ move $v1, $v0
+.Lwrite_ok:
+ jr $ra # return length
+ move $v0, $v1
+
+.section .text.PClseek, "ax", @progbits
+.global PClseek
+.type PClseek, @function
+
+PClseek:
+ move $a3, $a2
+ move $a2, $a1
+ move $a1, $a0
+ break 0, 0x107 # (fd, fd, offset, mode) -> error, offset
+
+ bgez $v0, .Lseek_ok # if (error < 0) offset = error
+ nop
+ move $v1, $v0
+.Lseek_ok:
+ jr $ra # return offset
+ move $v0, $v1