aboutsummaryrefslogtreecommitdiff
path: root/libpsn00b/smd/smdparser.S
diff options
context:
space:
mode:
authorXavier Del Campo Romero <xavi92@disroot.org>2025-07-05 02:34:11 +0200
committerXavier Del Campo Romero <xavi92@disroot.org>2025-07-05 02:34:11 +0200
commitbeb76e4dd362374b8f42cd971d394bba1074cd8d (patch)
tree3ea4cc342737afb9225c01160c92647ba66c78bd /libpsn00b/smd/smdparser.S
parent5d9aa2d3dfc7d6e51c2eb942ab4cdbae5571a40a (diff)
downloadpsn00bsdk-fix-include.tar.gz
Replace .include with #includefix-include
For some reason, both mipsel-unknown-elf-gcc 8.2.0 and mipsel-non-elf 15.1.0 were unable to resolve .include assembler directives. As a workaround, it is still possible to use the preprocessor, and therefore the usual #include preprocessor directive. However, this requires the assembly files to use the uppercase .S file extension.
Diffstat (limited to 'libpsn00b/smd/smdparser.S')
-rw-r--r--libpsn00b/smd/smdparser.S130
1 files changed, 130 insertions, 0 deletions
diff --git a/libpsn00b/smd/smdparser.S b/libpsn00b/smd/smdparser.S
new file mode 100644
index 0000000..857f861
--- /dev/null
+++ b/libpsn00b/smd/smdparser.S
@@ -0,0 +1,130 @@
+# PSn00bSDK .SMD model parser library
+# (C) 2019-2023 Lameguy64, spicyjpeg - MPL licensed
+
+.set noreorder
+
+#include "smd/smd_s.inc"
+
+.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.OpenSMD, "ax", @progbits
+.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
+
+.section .text.ReadSMD, "ax", @progbits
+.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
+
+.section .bss._smd_parse_addr, "w"
+.comm _smd_parse_addr, 4, 4