diff options
Diffstat (limited to 'libpsn00b/psxapi/_syscalls.S')
| -rw-r--r-- | libpsn00b/psxapi/_syscalls.S | 161 |
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 |
