aboutsummaryrefslogtreecommitdiff
path: root/libpsn00b/psxsio/_sio_control.s
diff options
context:
space:
mode:
authorJohn Wilbert M. Villamor <lameguy64@gmail.com>2019-06-23 07:42:16 +0800
committerJohn Wilbert M. Villamor <lameguy64@gmail.com>2019-06-23 07:42:16 +0800
commit7be9178c0f9b0e698a305ecc5c0c41fcc596a4fc (patch)
treee98c627e1da5c764563774b89b0c06d7ac5ad0a4 /libpsn00b/psxsio/_sio_control.s
parentae9e545c3ed33d39ce21ae13ceb8337fa34901b8 (diff)
downloadpsn00bsdk-7be9178c0f9b0e698a305ecc5c0c41fcc596a4fc.tar.gz
LibPSn00b officially v0.10b, added psxsio library, better DrawSync() and VSync(), better reference manual.
Diffstat (limited to 'libpsn00b/psxsio/_sio_control.s')
-rw-r--r--libpsn00b/psxsio/_sio_control.s182
1 files changed, 182 insertions, 0 deletions
diff --git a/libpsn00b/psxsio/_sio_control.s b/libpsn00b/psxsio/_sio_control.s
new file mode 100644
index 0000000..bae7822
--- /dev/null
+++ b/libpsn00b/psxsio/_sio_control.s
@@ -0,0 +1,182 @@
+.set noreorder
+
+.include "hwregs_a.h"
+
+.section .text
+
+# Currently implemented serial control functions:
+#
+# cmd(a0) sub(a1)
+# 0 0 Get serial status
+# 0 1 Get control line status
+# 0 2 Get serial mode
+# 0 3 Get baud rate
+# 0 4 Read 1 byte
+# 1 1 Set serial control
+# 1 2 Set serial mode
+# 1 3 Set baud rate
+# 1 4 Write 1 byte
+# 2 0 Reset serial
+# 2 1 Acknowledge serial
+
+.global _sio_control
+.type _sio_control, @function
+_sio_control:
+
+ # a0 - command
+ # a1 - subcommand
+ # a2 - argument
+
+ lui $a3, IOBASE
+
+ beq $a0, $0, .Lcmd0
+ nop
+ beq $a0, 1, .Lcmd1
+ nop
+ beq $a0, 2, .Lcmd2
+ nop
+ jr $ra
+ nop
+
+
+.Lcmd0:
+
+ beq $a1, $0, .Lcmd0arg0
+ nop
+ beq $a1, 1, .Lcmd0arg1
+ nop
+ beq $a1, 2, .Lcmd0arg2
+ nop
+ beq $a1, 3, .Lcmd0arg3
+ nop
+ beq $a1, 4, .Lcmd0arg4
+ nop
+ jr $ra
+ nop
+
+.Lcmd0arg0: # Get SIO status
+
+ lhu $v0, SIO_STAT($a3)
+ nop
+
+ jr $ra
+ andi $v0, 0x3FF
+
+.Lcmd0arg1: # Get control line status
+
+ lhu $v1, SIO_CTRL($a3)
+ nop
+ srl $v0, $v1, 1
+ andi $v0, 0x1
+ srl $v1, 4
+ andi $v1, 0x2
+
+ jr $ra
+ or $v0, $v1
+
+
+.Lcmd0arg2: # Get serial mode
+
+ lhu $v0, SIO_MODE($a3)
+ nop
+ jr $ra
+ andi $v0, 0xFF
+
+.Lcmd0arg3:
+
+ lui $v1, 0x1f
+ lhu $v0, SIO_BAUD($a3)
+ ori $v1, 0xa400
+ div $v1, $v0
+ nop
+ nop
+ jr $ra
+ mflo $v0
+
+.Lcmd0arg4: # Serial RX read
+
+ lbu $v0, SIO_TXRX($a3)
+ nop
+ jr $ra
+ nop
+
+
+.Lcmd1:
+
+ beq $a1, 1, .Lcmd1arg1
+ nop
+ beq $a1, 2, .Lcmd1arg2
+ nop
+ beq $a1, 3, .Lcmd1arg3
+ nop
+ beq $a1, 4, .Lcmd1arg4
+ nop
+ jr $ra
+ nop
+
+.Lcmd1arg1:
+
+ andi $v0, $a2, 0x1CFF
+
+ jr $ra
+ sh $a2, SIO_CTRL($a3)
+
+.Lcmd1arg2:
+
+ jr $ra
+ sh $a2, SIO_MODE($a3)
+
+.Lcmd1arg3:
+
+ lui $v0, 0x1f
+ ori $v0, 0xa400
+ divu $v0, $a2
+ bnez $a2, .Lgood_baud
+ nop
+ jr $ra
+ nop
+
+.Lgood_baud:
+
+ mflo $v0
+ sh $v0, SIO_BAUD($a3)
+ nop
+ jr $ra
+ nop
+
+.Lcmd1arg4:
+
+ sb $a2, SIO_TXRX($a3)
+ nop
+ jr $ra
+ nop
+
+.Lcmd2:
+
+ beq $a1, $0 , .Lcmd2arg0
+ li $v0, 1
+ beq $a1, $v0, .Lcmd2arg1
+ nop
+ jr $ra
+ nop
+
+.Lcmd2arg0:
+
+ li $v0, 0x40
+ sh $v0, SIO_CTRL($a3)
+ sh $0 , SIO_MODE($a3)
+ sh $0 , SIO_BAUD($a3)
+ nop
+ jr $ra
+ nop
+
+.Lcmd2arg1:
+
+ lhu $v0, SIO_CTRL($a3)
+ nop
+ ori $v0, 0x10
+ sh $v0, SIO_CTRL($a3)
+ jr $ra
+ nop
+
+ \ No newline at end of file