aboutsummaryrefslogtreecommitdiff
path: root/examples/demos/n00bdemo/smdparser.s
diff options
context:
space:
mode:
authorJohn Wilbert M. Villamor <lameguy64@gmail.com>2020-04-24 19:01:28 +0800
committerJohn Wilbert M. Villamor <lameguy64@gmail.com>2020-04-24 19:01:28 +0800
commit1aa0e17df7c325a41de8cf8a57f52ed853f08bf3 (patch)
tree5ec7f69ca0104f2b0a41e2ee7d3cb0cf0c9c54c5 /examples/demos/n00bdemo/smdparser.s
parente82da2abe4c264d4b48a48d79cf9b8e4c4fb8ab6 (diff)
downloadpsn00bsdk-1aa0e17df7c325a41de8cf8a57f52ed853f08bf3.tar.gz
Refined toolchain instructions, organized examples, added automatic retry for CdRead(), added FIOCSCAN ioctl in psxsio TTY driver, added tty and console examples.
Diffstat (limited to 'examples/demos/n00bdemo/smdparser.s')
-rw-r--r--examples/demos/n00bdemo/smdparser.s129
1 files changed, 129 insertions, 0 deletions
diff --git a/examples/demos/n00bdemo/smdparser.s b/examples/demos/n00bdemo/smdparser.s
new file mode 100644
index 0000000..379690f
--- /dev/null
+++ b/examples/demos/n00bdemo/smdparser.s
@@ -0,0 +1,129 @@
+.set noreorder
+
+.include "smd_s.h"
+
+.set SMD_PRI_ID, 0
+.set SMD_PRI_v0, 4
+.set SMD_PRI_v1, 6
+.set SMD_PRI_v2, 8
+.set SMD_PRI_v3, 10
+.set SMD_PRI_n0, 12
+.set SMD_PRI_n1, 14
+.set SMD_PRI_n2, 16
+.set SMD_PRI_n3, 18
+.set SMD_PRI_rgbc0, 20
+.set SMD_PRI_rgbc1, 24
+.set SMD_PRI_rgbc2, 28
+.set SMD_PRI_rgbc3, 32
+.set SMD_PRI_tuv0, 36
+.set SMD_PRI_tuv1, 38
+.set SMD_PRI_tuv2, 40
+.set SMD_PRI_tuv3, 42
+.set SMD_PRI_tpage, 44
+.set SMD_PRI_clut, 46
+
+.section .text
+
+
+.comm _smd_parse_addr, 4, 4
+
+
+.global OpenSMD
+.type OpenSMD, @function
+OpenSMD:
+ lw $v0, SMD_HEAD_ID($a0)
+ li $v1, 0x01444d53
+
+ bne $v0, $v1, .not_smd
+ nop
+
+ lw $v0, SMD_HEAD_PPRIMS($a0)
+ la $v1, _smd_parse_addr
+ sw $v0, 0($v1)
+
+ jr $ra
+ lhu $v0, SMD_HEAD_NPRIMS($a0)
+
+.not_smd:
+ jr $ra
+ move $v0, $0
+
+
+.global ReadSMD
+.type ReadSMD, @function
+ReadSMD:
+
+ la $v0, _smd_parse_addr
+ lw $v0, 0($v0)
+ nop
+
+ lw $a2, 0($v0) # Load primitive ID
+ addiu $a1, $v0, 4
+
+ sw $a2, SMD_PRI_ID($a0)
+
+ beqz $a2, $end_prim
+ nop
+
+ srl $v1, $a2, 24 # Get primitive size
+ addu $v0, $v1
+ la $v1, _smd_parse_addr
+ sw $v0, 0($v1)
+
+ lw $v0, 0($a1) # Copy vertex coords
+ lw $v1, 4($a1)
+ sw $v0, SMD_PRI_v0($a0)
+ sw $v1, SMD_PRI_v2($a0)
+ addiu $a1, 8
+
+ srl $v0, $a2, 2 # Lighting enabled?
+ andi $v0, 0x3
+ bnez $v0, $light
+ nop
+
+ b $no_light
+ nop
+
+$light:
+ srl $v1, $a2, 2
+ lw $v0, 0($a1) # Copy vertex coords
+ andi $v1, 0x3
+ sw $v0, SMD_PRI_n0($a0)
+
+ bne $v1, 0x2, $light_flat
+ addiu $a1, 4
+
+ lw $v1, 0($a1)
+ addiu $a1, 4
+ sw $v1, SMD_PRI_n2($a0)
+
+$light_flat:
+$no_light:
+
+ lw $v0, 0($a1)
+ nop
+ sw $v0, SMD_PRI_rgbc0($a0)
+ addiu $a1, 4
+
+ srl $v0, $a2, 5
+ andi $v0, 0x1
+ beqz $v0, $not_textured
+ nop
+
+ lw $v0, 0($a1)
+ lw $v1, 4($a1)
+ sw $v0, SMD_PRI_tuv0($a0)
+ lw $v0, 8($a1)
+ sw $v1, SMD_PRI_tuv2($a0)
+ sw $v0, SMD_PRI_tpage($a0)
+
+$not_textured:
+
+ jr $ra
+ move $v0, $a0
+
+$end_prim:
+
+ jr $ra
+ move $v0, $0
+ \ No newline at end of file