aboutsummaryrefslogtreecommitdiff
path: root/libpsn00b/smd/smdparser.s
blob: 656e509ed1c55e1ce50a553fef6da4c49bdc216e (plain) (blame)
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