1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
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
|