Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
MorsGames
GitHub Repository: MorsGames/sm64plus
Path: blob/master/rsp/fast3d.s
7854 views
1
.rsp
2
3
.include "rsp/rsp_defs.inc"
4
.include "rsp/gbi.inc"
5
6
// This file assumes DATA_FILE and CODE_FILE are set on the command line
7
8
.if version() < 110
9
.error "armips 0.11 or newer is required"
10
.endif
11
12
// Overlay table data member offsets
13
overlay_load equ 0x0000
14
overlay_len equ 0x0004
15
overlay_imem equ 0x0006
16
.macro OverlayEntry, loadStart, loadEnd, imemAddr
17
.dw loadStart
18
.dh (loadEnd - loadStart - 1) & 0xFFFF
19
.dh (imemAddr) & 0xFFFF
20
.endmacro
21
22
.macro jumpTableEntry, addr
23
.dh addr & 0xFFFF
24
.endmacro
25
26
// RSP DMEM
27
.create DATA_FILE, 0x0000
28
29
// 0x0000-0x0027: Overlay Table
30
overlayInfo0:
31
OverlayEntry orga(Overlay0Address), orga(Overlay0End), Overlay0Address
32
overlayInfo1:
33
OverlayEntry orga(Overlay1Address), orga(Overlay1End), Overlay1Address
34
overlayInfo2:
35
OverlayEntry orga(Overlay2Address), orga(Overlay2End), Overlay2Address
36
overlayInfo3:
37
OverlayEntry orga(Overlay3Address), orga(Overlay3End), Overlay3Address
38
overlayInfo4:
39
OverlayEntry orga(Overlay4Address), orga(Overlay4End), Overlay4Address
40
41
// 0x0028-0x009F: ??
42
.dw 0x0FFAF006
43
.dw 0x7FFF0000
44
.dw 0x00000001
45
.dw 0x0002FFFF
46
.dw 0x40000004
47
.dw 0x06330200
48
.dw 0x7FFFFFF8
49
.dw 0x00080040
50
.dw 0x00208000
51
.dw 0x01CCCCCC
52
.dw 0x0001FFFF
53
.dw 0x00010001
54
.dw 0x0001FFFF
55
.dw 0x00010001
56
.dw 0x00020002
57
.dw 0x00020002
58
59
// 0x0068
60
.dw 0x00020002
61
.dw 0x00020002
62
63
data0070:
64
.dw 0x00010000
65
66
// 0x0074
67
.dh 0x0000
68
// 0x0076
69
.dh 0x0001
70
71
// 0x0078
72
.dw 0x00000001
73
.dw 0x00000001
74
.dw 0x00010000
75
.dw 0x0000FFFF
76
.dw 0x00000001
77
.dw 0x0000FFFF
78
.dw 0x00000000
79
.dw 0x0001FFFF
80
.dw 0x00000000
81
.dw 0x00010001
82
83
// 0x00A0-0x00A1
84
lightEntry:
85
jumpTableEntry load_lighting
86
87
// 0x00A2-0x00A3: ??
88
.dh 0x7FFF
89
90
// 0x00A4-0x00B3: ??
91
.dw 0x571D3A0C
92
.dw 0x00010002
93
.dw 0x01000200
94
.dw 0x40000040
95
96
// 0x00B4
97
.dh 0x0000
98
99
// 0x00B6-0x00B7
100
taskDoneEntry:
101
jumpTableEntry overlay_4_entry
102
103
// 0x00B8
104
lower24Mask:
105
.dw 0x00FFFFFF
106
107
// 0x00BC: Operation Types
108
operationJumpTable:
109
jumpTableEntry dispatch_dma // cmds 0x00-0x3f
110
spNoopEntry:
111
jumpTableEntry SP_NOOP // cmds 0x40-0x7f
112
jumpTableEntry dispatch_imm // cmds 0x80-0xbf
113
jumpTableEntry dispatch_rdp // cmds 0xc0-0xff
114
115
// 0x00C4: DMA operations
116
dmaJumpTable:
117
jumpTableEntry SP_NOOP // 0x00
118
jumpTableEntry dma_MTX // 0x01
119
jumpTableEntry SP_NOOP // 0x02
120
jumpTableEntry dma_MOVEMEM // 0x03
121
jumpTableEntry dma_VTX // 0x04
122
jumpTableEntry SP_NOOP // 0x05
123
jumpTableEntry dma_DL // 0x06
124
jumpTableEntry SP_NOOP // 0x07
125
jumpTableEntry SP_NOOP // 0x08
126
jumpTableEntry SP_NOOP // 0x09
127
128
// 0x00D8: Immediate operations
129
immediateJumpTableBase equ (immediateJumpTable - ((0xB2 << 1) & 0xFE))
130
.ifdef F3D_OLD
131
jumpTableEntry imm_UNKNOWN
132
.endif
133
immediateJumpTable:
134
jumpTableEntry imm_RDPHALF_CONT // 0xB2
135
jumpTableEntry imm_RDPHALF_2 // 0xB3
136
jumpTableEntry imm_RDPHALF_1 // 0xB4
137
jumpTableEntry SP_NOOP // 0xB5?
138
jumpTableEntry imm_CLEARGEOMETRYMODE // 0xB6
139
jumpTableEntry imm_SETGEOMETRYMODE // 0xB7
140
jumpTableEntry imm_ENDDL // 0xB8
141
jumpTableEntry imm_SETOTHERMODE_L // 0xB9
142
jumpTableEntry imm_SETOTHERMODE_H // 0xBA
143
jumpTableEntry imm_TEXTURE // 0xBB
144
jumpTableEntry imm_MOVEWORD // 0xBC
145
jumpTableEntry imm_POPMTX // 0xBD
146
jumpTableEntry imm_CULLDL // 0xBE
147
jumpTableEntry imm_TRI1 // 0xBF
148
149
// 0x00F6: Label constants
150
labelLUT:
151
jumpTableEntry found_in
152
foundOutEntry:
153
jumpTableEntry found_out
154
jumpTableEntry found_first_in
155
jumpTableEntry found_first_out
156
clipDrawEntry:
157
jumpTableEntry clip_draw_loop
158
performClipEntry:
159
jumpTableEntry perform_clip
160
nextClipEntry:
161
jumpTableEntry next_clip
162
DMAWaitEntry:
163
jumpTableEntry dma_wait_dl
164
165
// 0x0106: ??
166
data0106:
167
.dh 0x0000
168
169
.ifdef F3D_NEW
170
.dh 0x0000
171
.endif
172
173
// 0x0108: DRAM pointer
174
dramPtr:
175
.dw 0x00000000
176
.dh 0x0000 // 0x10C: RDPHALF_2
177
178
.dh 0x0000
179
180
// 0x110: display list stack size
181
displayListStackSize:
182
.dh 0x0000
183
.dh 0xFFFF // 0x112: RDPHALF_1
184
185
.dw 0x00000000 // 0x114: geometrymode (bit 1 is texture ON)
186
.dw 0xEF080CFF // 0x118: othermode
187
.dw 0x00000000
188
.dw 0x00000000 // 0x120: texture max mipmap levels, tile descriptor enable/disable
189
.dh 0x0000 // 0x124: texture scaling factor S axis (horizontal) U16 fraction
190
.dh 0x0000 // 0x126: texture scaling factor T axis (vertical)
191
.dw 0x00000000 // 0x128: some dpc dma address state
192
193
numLights:
194
.dw 0x80000040 // 0x12c: num lights, bit 31 = needs init, bits 11:0 = (num_lights+1)*32
195
.dw 0x00000000 // 0x130: dram stack pointer 1
196
.dw 0x00000000 // 0x134: dram stack pointer modelview matrices
197
198
data0138:
199
.dw 0x40004000 // 0x138: txtatt (unused?)
200
201
.dw 0x00000000
202
.dw 0x00000000
203
.dw 0x00000000
204
.dw 0x00000000
205
.dw 0x00000000
206
207
.dw 0x00000000 // 0x150: output buffer
208
209
.dw 0x00000000 // 0x154: output buffer size
210
211
data0158:
212
.dh 0x0000 // 0x158: ??
213
.dh 0x0000
214
.dw 0x00000000 // 0x15c: dram stack end?
215
216
// 0x160-0x19f: RSP memory segment table
217
segmentTable:
218
.fill 0x40, 0
219
220
// 0x1a0: Lights
221
.dw 0x80000000
222
.dw 0x80000000
223
.dw 0x00000000
224
.dw 0x00000000
225
226
lookAtY: // 0x1b0: lookaty
227
.dw 0x00800000, 0x00800000, 0x7F000000, 0x00000000
228
.dw 0x00000000, 0x00000000, 0x00000000, 0x00000000
229
230
lookAtX: // 0x1d0: lookatx
231
.dw 0x00000000, 0x00000000, 0x007F0000, 0x00000000
232
.dw 0x00000000, 0x00000000, 0x00000000, 0x00000000
233
234
// 0x1f0: L0..L7 light info (32 bytes each)
235
lightInfo0: // 0x1f0
236
.dw 0x00000000, 0x00000000, 0x00000000, 0x00000000
237
.dw 0x00000000, 0x00000000, 0xE0011FFF, 0x00040000
238
239
lightInfo1: // 0x210
240
.dw 0xFF000000, 0xFF000000, 0x00000000, 0x00000000
241
.dw 0x00000000, 0x00000000, 0x00000000, 0x00000000
242
243
lightInfo2: // 0x230
244
.dw 0x00000000, 0x00000000, 0x00000000, 0x00000000
245
.dw 0x00000000, 0x00000000, 0x00000000, 0x00000000
246
247
lightInfo3: // 0x250
248
.dw 0x00000000, 0x00000000, 0x00000000, 0x00000000
249
.dw 0x00000000, 0x00000000, 0x00000000, 0x00000000
250
251
lightInfo4: // 0x270
252
253
// L4-L7 overlap with version string
254
.definelabel lightInfo5, lightInfo4 + 0x20 // 0x290
255
.definelabel lightInfo6, lightInfo5 + 0x20 // 0x2b0
256
.definelabel lightInfo7, lightInfo6 + 0x20 // 0x2d0
257
258
.if defined(F3D_OLD) || defined(VERSION_EU)
259
.asciiz "RSP SW Version: 2.0D, 04-01-96"
260
.elseif defined(F3D_NEW)
261
.asciiz "RSP SW Version: 2.0H, 02-12-97"
262
.endif
263
.asciiz "SGI U64 GFX SW TEAM: S Anderson, S Carr, H Cheng, K Luster, R Moore, N Pooley, A Srinivasan", 0x0A
264
265
.dw 0x00000000
266
267
// 0x2f0-0x31f: DMEM table
268
dmemTableOffset equ (dmemTable - 0x80)
269
dmemTable:
270
.dh viewport, lookAtY, lookAtX, lightInfo0, lightInfo1, lightInfo2, lightInfo3, lightInfo4
271
.dh lightInfo5, lightInfo6, lightInfo7, data0138, mpMatrix+0x10, mpMatrix+0x20, mpMatrix+0x30, mpMatrix
272
.dh numLights, data0070, segmentTable, fogFactors, lightInfo0, pointsBuffer
273
.ifdef F3D_NEW
274
.dh displayListStackSize, 0x0000
275
.else
276
.dh 0x0000, 0x0000
277
.endif
278
279
// 0x320: Viewport (0x010 bytes)
280
viewport:
281
.dw 0x00000000, 0x00000000, 0x00000000, 0x00000000
282
283
// 0x330: fog factors (three 16-bit integers: mul, add, min)
284
fogFactors:
285
.dh 0x0100, 0x0000, 0x00FF
286
287
// 0x336: display list stack (return addresses)
288
displayListStack: // this is not 4-byte aligned
289
.fill 0x2a, 0
290
291
// 0x360-0x39f: Modelview matrix top of stack (0x40 bytes)
292
modelViewMatrixStack:
293
.fill 0x40, 0
294
295
// 0x3a0-0x3df Projection Matrix top of stack (0x40 bytes)
296
projectionMatrixStack:
297
.fill 0x40, 0
298
299
// 0x3e0-0x41f: MP matrix (Modelview * Projection)
300
mpMatrix:
301
.fill 0x40, 0
302
303
// 0x420: Points buffer (0x280 bytes)
304
pointsBuffer:
305
.fill 0x280, 0
306
307
// 0x6a0-0x7df: input display list buffer
308
inputDisplayList:
309
.fill 0x140, 0
310
311
// 0x7E0-0x7ff: input data
312
inputData:
313
.fill (0x800 - 0x7E0), 0
314
315
.close // DATA_FILE
316
317
// uninitialized variables
318
.definelabel setupTemp, 0x08E0
319
.definelabel data08e4, 0x08E4
320
.definelabel data08e8, 0x08E8
321
.definelabel data08ec, 0x08EC
322
.definelabel data08f0, 0x08F0
323
.definelabel clipTemp, 0x0940
324
.definelabel data0942, 0x0942
325
.definelabel data0944, 0x0944
326
.definelabel data0946, 0x0946
327
.definelabel rdpOutput, 0x09E0
328
.definelabel scratchSpace, 0x0DE0
329
.definelabel data0DE4, 0x0DE4
330
.definelabel data0DE8, 0x0DE8
331
332
.create CODE_FILE, 0x04001080
333
334
// Overlay 0
335
Overlay0Address:
336
j f3d_04001780
337
addi $29, $zero, displayListStackSize
338
jal segmented_to_physical
339
add $19, $24, $zero
340
add $20, $zero, $22
341
jal dma_read_write
342
addi $17, $zero, 0x00
343
344
// $1 = most significant 2 bits of cmd byte << 1
345
// $25 = first command word
346
dispatch_task:
347
lh $2, (operationJumpTable)($1)
348
jr $2
349
srl $2, $25, 23 // $2 = MSbyte << 1
350
351
SP_NOOP:
352
mfc0 $2, SP_STATUS
353
andi $2, $2, 0x0080
354
bne $2, $zero, f3d_040010cc
355
lh $21, 0x26($zero)
356
f3d_040010b8:
357
bgtz $28, read_next_task_entry
358
nop
359
j load_display_list_dma
360
lh $ra, DMAWaitEntry
361
f3d_040010c8:
362
lh $21, taskDoneEntry
363
f3d_040010cc:
364
j load_overlay
365
ori $30, $zero, overlayInfo4
366
367
load_display_list_dma:
368
addi $28, $zero, 0x0140 // size of display list
369
add $21, $zero, $ra
370
addi $20, $zero, inputDisplayList
371
add $19, $zero, $26 // TASK_DATA_PTR
372
addi $18, $zero, 0x013f
373
jal dma_read_write
374
addi $17, $zero, 0x00
375
jr $21
376
addi $27, $zero, inputDisplayList // initial pointer
377
378
// load overlay into IMEM
379
// $30 = offset into overlay table
380
// $21 = return address
381
load_overlay_fcn:
382
add $21, $zero, $ra
383
load_overlay:
384
lw $19, overlay_load($30)
385
lh $18, overlay_len($30)
386
lh $20, overlay_imem($30)
387
jal dma_read_write
388
addi $17, $zero, 0x00
389
jal wait_while_dma_busy
390
nop
391
jr $21
392
393
segmented_to_physical:
394
lw $11, lower24Mask
395
srl $12, $19, 22
396
andi $12, $12, 0x3c
397
and $19, $19, $11
398
add $13, $zero, $12
399
lw $12, 0x0160($13)
400
jr $ra
401
add $19, $19, $12
402
403
// $20 = SP_MEM address
404
// $19 = DRAM address
405
// $18 = length - 1
406
// $17 = 1:write, 0:read
407
dma_read_write:
408
@@dma_full:
409
mfc0 $11, SP_DMA_FULL
410
bne $11, $zero, @@dma_full
411
nop
412
mtc0 $20, SP_MEM_ADDR
413
bgtz $17, @@dma_write
414
mtc0 $19, SP_DRAM_ADDR
415
jr $ra
416
mtc0 $18, SP_RD_LEN
417
@@dma_write:
418
jr $ra
419
mtc0 $18, SP_WR_LEN
420
421
wait_while_dma_busy:
422
mfc0 $11, SP_DMA_BUSY
423
bne $11, $zero, wait_while_dma_busy
424
nop
425
jr $ra
426
nop
427
428
f3d_04001178: // sends stuff to RDP
429
add $21, $zero, $ra
430
lw $19, 0x18($29)
431
addi $18, $23, -0x09e0
432
lw $23, 0x44($29)
433
blez $18, f3d_040011f4
434
add $20, $19, $18
435
sub $20, $23, $20
436
bgez $20, f3d_040011b8
437
f3d_04001198:
438
mfc0 $20, DPC_STATUS
439
andi $20, $20, DPC_STATUS_START_VALID
440
bne $20, $zero, f3d_04001198
441
f3d_040011a4:
442
mfc0 $23, DPC_CURRENT
443
lw $19, 0x40($29)
444
beq $23, $19, f3d_040011a4
445
nop
446
mtc0 $19, DPC_START
447
f3d_040011b8:
448
mfc0 $23, DPC_CURRENT
449
sub $20, $19, $23
450
bgez $20, f3d_040011d4
451
add $20, $19, $18
452
sub $20, $20, $23
453
bgez $20, f3d_040011b8
454
nop
455
f3d_040011d4:
456
add $23, $19, $18
457
addi $18, $18, -0x01
458
addi $20, $zero, rdpOutput // output to RDP
459
jal dma_read_write
460
addi $17, $zero, 0x01
461
jal wait_while_dma_busy
462
sw $23, 0x18($29)
463
mtc0 $23, DPC_END
464
f3d_040011f4:
465
jr $21
466
addi $23, $zero, rdpOutput
467
468
// codes 0x80-0xBF
469
// $2 = immediate cmd byte << 1
470
dispatch_imm:
471
andi $2, $2, 0x00fe
472
lh $2, (immediateJumpTableBase)($2) // data IMM offset
473
jr $2
474
lbu $1, -0x01($27)
475
476
imm_TRI1:
477
lbu $5, -0x04($27)
478
lbu $1, -0x03($27)
479
lbu $2, -0x02($27)
480
lbu $3, -0x01($27)
481
sll $5, $5, 2
482
sll $1, $1, 2
483
sll $2, $2, 2
484
sll $3, $3, 2
485
addi $1, $1, pointsBuffer
486
addi $2, $2, pointsBuffer
487
addi $3, $3, pointsBuffer
488
sw $1, scratchSpace
489
sw $2, data0DE4
490
sw $3, data0DE8
491
lw $4, (scratchSpace)($5)
492
j f3d_04001998
493
lh $30, spNoopEntry
494
495
imm_POPMTX:
496
.ifdef F3D_NEW
497
sbv $v31[6], 0x1c($29)
498
.endif
499
lw $19, 0x24($29)
500
lw $3, 0x4c($29)
501
addi $20, $zero, modelViewMatrixStack
502
addi $18, $zero, 0x3f
503
sub $3, $3, $19
504
addi $3, $3, -0x0280
505
bgez $3, SP_NOOP // stop if stack is empty
506
addi $19, $19, -0x40
507
jal dma_read_write // read new top from DRAM
508
addi $17, $zero, 0x00
509
jal wait_while_dma_busy
510
addi $3, $zero, mpMatrix // MP matrix (modelview * projection)
511
j f3d_04001444 // recompute MP matrix
512
sw $19, 0x24($29)
513
514
imm_MOVEWORD:
515
lbu $1, -0x05($27)
516
lhu $2, -0x07($27)
517
lh $5, 0x030e($1)
518
add $5, $5, $2
519
j SP_NOOP
520
sw $24, 0x00($5)
521
522
imm_TEXTURE:
523
sw $25, 0x10($29)
524
sw $24, 0x14($29)
525
lh $2, 0x06($29)
526
andi $2, $2, 0xfffd
527
andi $3, $25, 0x0001
528
sll $3, $3, 1
529
or $2, $2, $3
530
j SP_NOOP
531
sh $2, 0x06($29)
532
533
imm_SETOTHERMODE_H:
534
j @f3d_040012d0
535
addi $7, $29, 8
536
imm_SETOTHERMODE_L:
537
addi $7, $29, 0x0c
538
@f3d_040012d0:
539
lw $3, 0x00($7)
540
addi $8, $zero, -1
541
lbu $5, -0x05($27)
542
lbu $6, -0x06($27)
543
addi $2, $zero, 1
544
sllv $2, $2, $5
545
addi $2, $2, -1
546
sllv $2, $2, $6
547
xor $2, $2, $8
548
and $2, $2, $3
549
or $3, $2, $24
550
sw $3, 0x00($7)
551
lw $25, 0x08($29)
552
j f3d_040013a8
553
lw $24, 0x0c($29)
554
555
imm_CULLDL:
556
andi $25, $25, 0x03ff
557
.ifdef F3D_OLD
558
ori $2, $zero, 0xffff
559
.else
560
ori $2, $zero, 0x7070
561
.endif
562
@@f3d_04001314:
563
lh $3, 0x0444($25)
564
addi $25, $25, 0x28
565
bne $25, $24, @@f3d_04001314
566
and $2, $2, $3
567
beq $2, $zero, SP_NOOP
568
569
DL_STACK_SIZE_OFFSET equ (defined(F3D_OLD) ? 0x00 : 0x4A)
570
571
imm_ENDDL:
572
lb $2, (DL_STACK_SIZE_OFFSET)($29)
573
addi $2, $2, -4
574
bltz $2, f3d_040010c8
575
addi $3, $2, displayListStack
576
lw $26, 0x00($3)
577
sb $2, (DL_STACK_SIZE_OFFSET)($29)
578
j SP_NOOP
579
addi $28, $zero, 0
580
581
imm_SETGEOMETRYMODE:
582
lw $2, 0x04($29)
583
or $2, $2, $24
584
j SP_NOOP
585
sw $2, 0x04($29)
586
587
imm_CLEARGEOMETRYMODE:
588
lw $2, 0x04($29)
589
addi $3, $zero, -1
590
xor $3, $3, $24
591
and $2, $2, $3
592
j SP_NOOP
593
sw $2, 0x04($29)
594
595
.ifdef F3D_OLD
596
imm_RDPHALF_1:
597
j SP_NOOP
598
sh $24, 0x02($29)
599
imm_RDPHALF_2:
600
.else
601
imm_RDPHALF_1:
602
.endif
603
j f3d_040010b8
604
sw $24, -0x04($29)
605
606
.ifdef F3D_OLD
607
imm_UNKNOWN:
608
.else
609
imm_RDPHALF_CONT:
610
.endif
611
ori $2, $zero, 0x0000
612
.ifdef F3D_OLD
613
imm_RDPHALF_CONT:
614
.else
615
imm_RDPHALF_2:
616
.endif
617
j f3d_040013a8
618
lw $25, -0x04($29)
619
620
// codes 0xC0-0xFF
621
dispatch_rdp:
622
sra $2, $25, 24
623
addi $2, $2, 3
624
bltz $2, f3d_040013a8
625
addi $2, $2, 0x18
626
jal segmented_to_physical
627
add $19, $24, $zero
628
add $24, $19, $zero
629
f3d_040013a8:
630
sw $25, 0x00($23)
631
sw $24, 0x04($23)
632
jal f3d_04001178
633
addi $23, $23, 0x08
634
bgtz $2, SP_NOOP
635
nop
636
j f3d_040010b8
637
638
dispatch_dma:
639
andi $2, $2, 0x01fe
640
lh $2, (dmaJumpTable)($2)
641
jal wait_while_dma_busy
642
lbu $1, -0x07($27)
643
jr $2
644
andi $6, $1, 0x000f
645
646
dma_MTX:
647
sbv $v31[6], 0x1c($29) // lights need re-init
648
andi $8, $1, 0x0001 // 1=projection, 0=modelview
649
bne $8, $zero, f3d_04001454
650
andi $7, $1, 0x0002 // 1=load, 0=multiply
651
addi $20, $zero, modelViewMatrixStack
652
andi $8, $1, 0x0004 // 1=push, 0=no push
653
beq $8, $zero, f3d_04001420
654
lqv $v26[0], 0x30($22)
655
lw $19, 0x24($29) // DRAM stack pointer 2
656
lw $8, 0x4c($29) // DRAM stack end
657
addi $17, $zero, 1
658
addi $1, $19, 0x40
659
beq $19, $8, f3d_04001420
660
addi $12, $zero, 0x3f // BUG: wrong register, should be $18
661
jal dma_read_write
662
sw $1, 0x24($29)
663
jal wait_while_dma_busy
664
f3d_04001420:
665
lqv $v28[0], 0x10($22)
666
beq $7, $zero, f3d_04001460
667
lqv $v27[0], 0x20($22)
668
sqv $v26[0], 0x30($20)
669
lqv $v29[0], 0x00($22)
670
sqv $v28[0], 0x10($20)
671
f3d_04001438:
672
addi $3, $zero, mpMatrix
673
sqv $v27[0], 0x20($20)
674
sqv $v29[0], 0x00($20)
675
f3d_04001444:
676
addi $1, $zero, modelViewMatrixStack
677
addi $2, $zero, projectionMatrixStack
678
j f3d_04001484
679
lh $ra, spNoopEntry
680
f3d_04001454:
681
lqv $v26[0], 0x30($22)
682
j f3d_04001420
683
addi $20, $zero, projectionMatrixStack
684
f3d_04001460:
685
addiu $3, $zero, scratchSpace
686
addu $1, $zero, $22 // input matrix from user
687
jal f3d_04001484
688
addu $2, $zero, $20 // current P matrix or M top
689
sqv $v6[0], 0x30($20) // store result to P or M
690
sqv $v5[0], 0x10($20)
691
lqv $v27[0], 0x00($3)
692
j f3d_04001438
693
lqv $v29[0], -0x20($3)
694
f3d_04001484:
695
addi $19, $3, 0x10
696
f3d_04001488:
697
vmudh $v5, $v31, $v31[0] // clear accumulator and $v5
698
addi $18, $1, 8
699
f3d_04001490:
700
ldv $v3[0], 0x00($2)
701
ldv $v4[0], 0x20($2)
702
lqv $v1[0], 0x00($1)
703
lqv $v2[0], 0x20($1)
704
ldv $v3[8], 0x00($2)
705
ldv $v4[8], 0x20($2)
706
vmadl $v6, $v4, $v2[0h]
707
addi $1, $1, 2
708
vmadm $v6, $v3, $v2[0h]
709
addi $2, $2, 8
710
vmadn $v6, $v4, $v1[0h]
711
vmadh $v5, $v3, $v1[0h]
712
bne $1, $18, f3d_04001490
713
vmadn $v6, $v31, $v31[0]
714
addi $2, $2, -0x20
715
addi $1, $1, 8
716
sqv $v5[0], 0x00($3)
717
sqv $v6[0], 0x20($3)
718
bne $3, $19, f3d_04001488
719
addi $3, $3, 0x10
720
jr $ra
721
nop
722
f3d_040014e8:
723
addi $8, $zero, viewport
724
lqv $v3[0], 0x50($zero)
725
lsv $v19[0], 0x02($29) // RDPHALF_1, contains persp normalize
726
lh $3, 0x04($29) // geometrymode
727
ldv $v0[0], 0x00($8) // viewport scale
728
ldv $v1[0], 0x08($8) // viewport translate
729
ldv $v0[8], 0x00($8)
730
ldv $v1[8], 0x08($8)
731
jr $ra
732
vmudh $v0, $v0, $v3 // negate Y?
733
734
load_mp_matrix:
735
addi $8, $zero, mpMatrix
736
ldv $v11[0], 0x18($8) // load into $v8-v15, dup lower half and higher half
737
ldv $v11[8], 0x18($8) // $v8-v11 integer parts, $v12-v15 frac parts
738
ldv $v15[0], 0x38($8)
739
ldv $v15[8], 0x38($8)
740
f3d_04001524:
741
ldv $v8[0], 0x00($8)
742
ldv $v9[0], 0x08($8)
743
ldv $v10[0], 0x10($8)
744
ldv $v12[0], 0x20($8)
745
ldv $v13[0], 0x28($8)
746
ldv $v14[0], 0x30($8)
747
ldv $v8[8], 0x00($8)
748
ldv $v9[8], 0x08($8)
749
ldv $v10[8], 0x10($8)
750
ldv $v12[8], 0x20($8)
751
ldv $v13[8], 0x28($8)
752
jr $ra
753
ldv $v14[8], 0x30($8)
754
755
dma_MOVEMEM:
756
lqv $v0[0], 0x00($22)
757
lh $5, (dmemTableOffset)($1)
758
j SP_NOOP
759
sqv $v0[0], 0x00($5)
760
761
dma_VTX:
762
lh $8, spNoopEntry
763
sh $8, data0106
764
srl $1, $1, 4
765
addi $5, $1, 1 // num vertex
766
addi $9, $5, 0
767
ldv $v2[0], 0x00($22) // input data
768
ldv $v2[8], 0x10($22) // load 2nd vertex (assuming it exists)
769
addi $7, $zero, pointsBuffer
770
sll $8, $6, 5 // dest index
771
sll $6, $6, 3
772
add $8, $6, $8 // 40 bytes per vertex
773
jal f3d_040014e8
774
add $7, $7, $8
775
llv $v17[0], 0x14($29) // texture scaling
776
jal load_mp_matrix
777
llv $v17[8], 0x14($29)
778
@f3d_040015a8:
779
vmudn $v28, $v12, $v2[0h] // x * first row frac
780
llv $v18[0], 0x08($22)
781
vmadh $v28, $v8, $v2[0h] // x * first row int
782
lw $15, 0x0c($22) // XR, YG, ZB, AA
783
vmadn $v28, $v13, $v2[1h] // y * second row frac
784
lw $16, 0x1c($22)
785
vmadh $v28, $v9, $v2[1h] // y * second row int
786
andi $1, $3, G_LIGHTING_H
787
vmadn $v28, $v14, $v2[2h] // z * third row frac
788
vmadh $v28, $v10, $v2[2h] // z * third row int
789
vmadn $v28, $v15, $v31[1] // 1 * fourth row frac
790
llv $v18[8], 0x18($22)
791
vmadh $v29, $v11, $v31[1] // 1 * fourth row int
792
bne $1, $zero, load_lighting
793
addi $22, $22, 0x20 // next 2 vertices
794
@f3d_040015e4:
795
vmudm $v18, $v18, $v17 // U *= S scale, V *= T scale (result >> 16)
796
@f3d_040015e8:
797
lsv $v21[0], 0x76($zero)
798
vmudn $v20, $v28, $v21[0]
799
vmadh $v21, $v29, $v21[0]
800
vch $v3, $v29, $v29[3h] // do trivial clip rejection
801
vcl $v3, $v28, $v28[3h] // by comparing xyz with w
802
cfc2 $13, vcc
803
vch $v3, $v29, $v21[3h]
804
vcl $v3, $v28, $v20[3h]
805
andi $8, $13, 0x0707 // filter out xyz clip result for 1st vertex
806
andi $13, $13, 0x7070 // filter out xyz clip result for 2nd vertex
807
sll $8, $8, 4
808
sll $13, $13, 16
809
or $13, $13, $8
810
cfc2 $14, vcc
811
andi $8, $14, 0x0707
812
vadd $v21, $v29, $v31[0]
813
andi $14, $14, 0x7070
814
vadd $v20, $v28, $v31[0]
815
sll $14, $14, 12
816
vmudl $v28, $v28, $v19[0] // persp normalize, used to improve precision
817
or $8, $8, $14
818
vmadm $v29, $v29, $v19[0]
819
or $8, $8, $13
820
vmadn $v28, $v31, $v31[0]
821
sh $8, 0x24($7)
822
jal f3d_04001000 // compute 1/w
823
lh $13, -0x1a($22) // $13 unused?
824
vge $v6, $v27, $v31[0] // 1/w >= 0?
825
sdv $v21[0], 0x00($7) // store xyzw int
826
vmrg $v6, $v27, $v30[0]
827
sdv $v20[0], 0x08($7) // store xyzw frac
828
vmudl $v5, $v20, $v26[3h] // mul xyzw with 1/w
829
vmadm $v5, $v21, $v26[3h]
830
vmadn $v5, $v20, $v6[3h]
831
vmadh $v4, $v21, $v6[3h]
832
addi $9, $9, -1 // decrement vertex input count
833
vmudl $v5, $v5, $v19[0] // take away persp normalize factor
834
vmadm $v4, $v4, $v19[0]
835
vmadn $v5, $v31, $v31[0]
836
andi $12, $3, G_FOG_H
837
ldv $v2[0], 0x00($22) // pre-load next vertices from input
838
vmudh $v7, $v1, $v31[1] // viewport translate * 0001
839
ldv $v2[8], 0x10($22)
840
vmadn $v7, $v5, $v0 // viewport scale
841
ldv $v29[0], 0x28($zero)
842
vmadh $v6, $v4, $v0
843
ldv $v29[8], 0x28($zero)
844
vmadn $v7, $v31, $v31[0] // $v6$v7 contains vertex results after viewport
845
vge $v6, $v6, $v29[1q] // some saturating 0FFA-F006
846
sw $15, 0x10($7)
847
beq $12, $zero, @@f3d_040016e0 // skip fog?
848
vlt $v6, $v6, $v29[0q]
849
lqv $v3[0], 0x0330($zero)
850
vmudn $v5, $v5, $v3[0] // mul fog factor (default 1)
851
vmadh $v4, $v4, $v3[0]
852
vadd $v4, $v4, $v3[1] // add parameter (default 0)
853
vge $v4, $v4, $v31[0]
854
vlt $v4, $v4, $v3[2] // min parameter (default 0xff)
855
sbv $v4[5], 0x13($7) // high z for 1st vertex, store in AA
856
sw $16, 0x18($7)
857
sbv $v4[13], 0x1b($7) // high z for 2nd vertex, store in AA
858
lw $16, 0x18($7)
859
@@f3d_040016e0:
860
slv $v18[0], 0x14($7) // texture coordinates, 1st vertex
861
sdv $v6[0], 0x18($7) // xyz_int after viewport
862
ssv $v7[4], 0x1e($7) // z_frac after viewport
863
ssv $v27[6], 0x20($7) // 1/w
864
ssv $v26[6], 0x22($7)
865
blez $9, @@f3d_04001728
866
addi $9, $9, -1 // decrement vertex input counter again
867
sdv $v21[8], 0x28($7)
868
sdv $v20[8], 0x30($7)
869
slv $v18[8], 0x3c($7) // texture coordinates, 2nd vertex
870
sw $16, 0x38($7)
871
sdv $v6[8], 0x40($7)
872
ssv $v7[12], 0x46($7)
873
ssv $v27[14], 0x48($7)
874
ssv $v26[14], 0x4a($7)
875
sw $8, 0x4c($7) // puts high hword first
876
addi $7, $7, 0x50
877
bgtz $9, @f3d_040015a8
878
@@f3d_04001728:
879
lh $8, data0106
880
jr $8
881
nop
882
883
dma_DL:
884
bgtz $1, @@f3d_04001754 // 0=store ret addr, 1=end DL after branch
885
lb $2, (DL_STACK_SIZE_OFFSET)($29)
886
addi $4, $2, -0x24 // DL stack full?
887
bgtz $4, SP_NOOP
888
addi $3, $2, displayListStack
889
addi $2, $2, 4
890
sw $26, 0x00($3) // store return address on DL stack
891
sb $2, (DL_STACK_SIZE_OFFSET)($29)
892
@@f3d_04001754:
893
jal segmented_to_physical
894
add $19, $24, $zero
895
add $26, $19, $zero
896
j SP_NOOP
897
addi $28, $zero, 0x00
898
899
// Overlays 2-4 will overwrite the following code
900
.org 0x04001768
901
f3d_04001768:
902
ori $30, $zero, overlayInfo2
903
b load_overlay
904
lh $21, performClipEntry
905
906
load_lighting:
907
ori $30, $zero, overlayInfo3
908
b load_overlay
909
lh $21, lightEntry
910
911
f3d_04001780:
912
ori $2, $zero, 0x2800 // clear yielded, clear taskdone
913
mtc0 $2, SP_STATUS
914
lqv $v31[0], 0x30($zero)
915
lqv $v30[0], 0x40($zero)
916
lw $4, OSTask_addr + OSTask_flags
917
andi $4, $4, 0x0001
918
bne $4, $zero, @@f3d_04001870
919
nop
920
lw $23, 0x28($1) // task output buff
921
lw $3, 0x2c($1) // task output buff size
922
sw $23, 0x40($29)
923
sw $3, 0x44($29)
924
mfc0 $4, DPC_STATUS
925
andi $4, $4, DPC_STATUS_XBUS_DMA
926
bne $4, $zero, @@f3d_040017e4
927
mfc0 $4, DPC_END
928
sub $23, $23, $4
929
bgtz $23, @@f3d_040017e4
930
mfc0 $5, DPC_CURRENT
931
beq $5, $zero, @@f3d_040017e4
932
nop
933
beq $5, $4, @@f3d_040017e4
934
nop
935
j @@f3d_04001800
936
ori $3, $4, 0x0000
937
@@f3d_040017e4:
938
mfc0 $4, DPC_STATUS
939
andi $4, $4, DPC_STATUS_START_VALID
940
bne $4, $zero, @@f3d_040017e4
941
addi $4, $zero, DPC_STATUS_CLR_XBUS
942
mtc0 $4, DPC_STATUS
943
mtc0 $3, DPC_START
944
mtc0 $3, DPC_END
945
@@f3d_04001800:
946
sw $3, 0x18($29)
947
addi $23, $zero, rdpOutput
948
lw $5, 0x10($1) // TASK_UCODE (DRAM address)
949
lw $2, overlayInfo1
950
lw $3, overlayInfo2
951
lw $4, overlayInfo3
952
lw $6, overlayInfo4
953
add $2, $2, $5 // apply DRAM offset
954
add $3, $3, $5
955
add $4, $4, $5
956
add $6, $6, $5
957
sw $2, overlayInfo1 // store back with DRAM offsets
958
sw $3, overlayInfo2
959
sw $4, overlayInfo3
960
sw $6, overlayInfo4
961
jal load_overlay_fcn
962
addi $30, $zero, overlayInfo1
963
jal load_display_list_dma
964
lw $26, 0x30($1) // TASK_DATA_PTR
965
lw $2, 0x20($1) // TASK_DRAM_STACK
966
sw $2, 0x20($29)
967
sw $2, 0x24($29)
968
addi $2, $2, 0x0280 // end of stack?
969
sw $2, 0x4c($29)
970
lw $2, -0x08($zero) // TASK_YIELD_DATA_PTR
971
sw $2, dramPtr
972
j dma_wait_dl
973
nop
974
@@f3d_04001870:
975
jal load_overlay_fcn
976
addi $30, $zero, overlayInfo1
977
lw $23, data08F0
978
lw $28, data08E4
979
lw $27, data08E8
980
j SP_NOOP
981
lw $26, data08EC
982
983
// 0x0400188c-0x04001987: bunch of nops
984
.fill 0xfc, 0
985
.ifdef F3D_OLD
986
.fill 16, 0
987
.endif
988
989
// from G_TRI1
990
f3d_04001998:
991
lh $11, 0x24($3)
992
lh $8, 0x24($2)
993
lh $9, 0x24($1)
994
and $12, $11, $8
995
or $11, $11, $8
996
and $12, $12, $9
997
andi $12, $12, 0x7070
998
bne $12, $zero, SP_NOOP // all vertices outside screen, return
999
or $11, $11, $9
1000
andi $11, $11, 0x4343
1001
bne $11, $zero, f3d_04001768 // halfway outside, so trigger clipping routine
1002
f3d_040019c4:
1003
llv $v13[0], 0x18($1) // xy_int after viewport
1004
llv $v14[0], 0x18($2)
1005
llv $v15[0], 0x18($3)
1006
lw $13, 0x04($29) // geometrymode
1007
addi $8, $zero, setupTemp // setup temp area
1008
lsv $v21[0], 0x02($29)
1009
lsv $v5[0], 0x06($1) // w_int p1
1010
vsub $v10, $v14, $v13 // p2-p1
1011
lsv $v6[0], 0x0e($1) // w_frac p1
1012
vsub $v9, $v15, $v13 // p3-p1
1013
lsv $v5[2], 0x06($2)
1014
vsub $v12, $v13, $v14 // p1-p2
1015
lsv $v6[2], 0x0e($2)
1016
lsv $v5[4], 0x06($3)
1017
lsv $v6[4], 0x0e($3)
1018
vmudh $v16, $v9, $v10[1] // (p3-p1)*((p2-p1)_y)
1019
lh $9, 0x1a($1) // y_int after viewport
1020
vsar $v18, $v18, $v18[1] // high into $v18
1021
lh $10, 0x1a($2)
1022
vsar $v17, $v17, $v17[0] // bits 47..31 of ACC
1023
lh $11, 0x1a($3)
1024
vmudh $v16, $v12, $v9[1] // (p1-p2)*((p3-p1)_y)
1025
andi $14, $13, G_CULL_FRONT
1026
vsar $v20, $v20, $v20[1]
1027
andi $15, $13, G_CULL_BACK
1028
vsar $v19, $v19, $v19[0]
1029
addi $12, $zero, 0 // now sort p1,p2,p3 by y
1030
@@sort_points_loop:
1031
slt $7, $10, $9
1032
blez $7, @@f3d_04001a58
1033
add $7, $10, $zero // y2_int < y1_int (after viewport)
1034
add $10, $9, $zero // swap $9/$10 and swap $1/$2
1035
add $9, $7, $zero
1036
addu $7, $2, $zero
1037
addu $2, $1, $zero
1038
addu $1, $7, $zero
1039
xori $12, $12, 0x0001 // xor that we swapped p1 and p2
1040
nop // interesting place for NOP
1041
@@f3d_04001a58:
1042
vaddc $v28, $v18, $v20
1043
slt $7, $11, $10
1044
vadd $v29, $v17, $v19
1045
blez $7, @@f3d_04001a88
1046
add $7, $11, $zero // y3_int < y2_int?
1047
add $11, $10, $zero // swap p2, p3
1048
add $10, $7, $zero
1049
addu $7, $3, $zero
1050
addu $3, $2, $zero
1051
addu $2, $7, $zero
1052
j @@sort_points_loop // go back to test y1 and new y2
1053
xori $12, $12, 0x0001 // xor that we swapped p2 and p3
1054
@@f3d_04001a88:
1055
vlt $v27, $v29, $v31[0]
1056
llv $v15[0], 0x18($3) // xy_int after viewport for new p3
1057
vor $v26, $v29, $v28
1058
llv $v14[0], 0x18($2)
1059
llv $v13[0], 0x18($1)
1060
blez $12, @@f3d_04001ab0 // skip if even number of swaps
1061
vsub $v4, $v15, $v14 // p3-p2
1062
vmudn $v28, $v28, $v31[3]
1063
vmadh $v29, $v29, $v31[3]
1064
vmadn $v28, $v31, $v31[0]
1065
@@f3d_04001ab0:
1066
vsub $v10, $v14, $v13 // p2-p1
1067
mfc2 $17, $v27[0]
1068
vsub $v9, $v15, $v13 // p3-p1
1069
mfc2 $16, $v26[0]
1070
sra $17, $17, 31
1071
vmov $v29[3], $v29[0]
1072
and $15, $15, $17
1073
vmov $v28[3], $v28[0]
1074
vmov $v4[2], $v10[0]
1075
beq $16, $zero, @@f3d_04001fd0 // skip this triangle?
1076
xori $17, $17, 0xffff
1077
vlt $v27, $v29, $v31[0]
1078
and $14, $14, $17
1079
vmov $v4[3], $v10[1]
1080
or $16, $15, $14
1081
vmov $v4[4], $v9[0]
1082
bgtz $16, @@f3d_04001fd0
1083
vmov $v4[5], $v9[1]
1084
mfc2 $7, $v27[0]
1085
jal f3d_04001000
1086
addi $6, $zero, 0x80 // left major flag
1087
bltz $7, @@f3d_04001b10
1088
lb $5, 0x07($29) // low byte for geometrymode
1089
addi $6, $zero, 0
1090
@@f3d_04001b10:
1091
vmudm $v9, $v4, $v31[4]
1092
vmadn $v10, $v31, $v31[0]
1093
vrcp $v8[1], $v4[1]
1094
vrcph $v7[1], $v31[0]
1095
ori $5, $5, 0x00c8 // OR with RDP command code
1096
lb $7, 0x12($29) // mpmap level and tile ID
1097
vrcp $v8[3], $v4[3]
1098
vrcph $v7[3], $v31[0]
1099
vrcp $v8[5], $v4[5]
1100
vrcph $v7[5], $v31[0]
1101
or $6, $6, $7
1102
vmudl $v8, $v8, $v30[4]
1103
sb $5, 0x00($23)
1104
vmadm $v7, $v7, $v30[4]
1105
sb $6, 0x01($23)
1106
vmadn $v8, $v31, $v31[0]
1107
vmudh $v4, $v4, $v31[5]
1108
lsv $v12[0], 0x18($2)
1109
vmudl $v6, $v6, $v21[0]
1110
lsv $v12[4], 0x18($1)
1111
vmadm $v5, $v5, $v21[0]
1112
lsv $v12[8], 0x18($1)
1113
vmadn $v6, $v31, $v31[0]
1114
sll $7, $9, 14
1115
vmudl $v1, $v8, $v10[0q]
1116
vmadm $v1, $v7, $v10[0q]
1117
vmadn $v1, $v8, $v9[0q]
1118
vmadh $v0, $v7, $v9[0q]
1119
mtc2 $7, $v2[0]
1120
vmadn $v1, $v31, $v31[0]
1121
sw $3, 0x00($8)
1122
vmudl $v8, $v8, $v31[4]
1123
vmadm $v7, $v7, $v31[4]
1124
vmadn $v8, $v31, $v31[0]
1125
vmudl $v1, $v1, $v31[4]
1126
vmadm $v0, $v0, $v31[4]
1127
vmadn $v1, $v31, $v31[0]
1128
sh $11, 0x02($23) // YL
1129
vand $v16, $v1, $v30[1]
1130
sh $9, 0x06($23) // YH
1131
vmudm $v12, $v12, $v31[4]
1132
sw $2, 0x04($8)
1133
vmadn $v13, $v31, $v31[0]
1134
sw $1, 0x08($8)
1135
sh $10, 0x04($23) // YM
1136
vcr $v0, $v0, $v30[6]
1137
ssv $v12[0], 0x08($23) // XL
1138
vmudl $v11, $v16, $v2[0]
1139
ssv $v13[0], 0x0a($23) // XL, frac
1140
vmadm $v10, $v0, $v2[0]
1141
ssv $v0[2], 0x0c($23) // DxLDy
1142
vmadn $v11, $v31, $v31[0]
1143
ssv $v1[2], 0x0e($23) // DxLDy, frac
1144
andi $7, $5, G_TEXTURE_ENABLE
1145
addi $15, $8, 8
1146
addi $16, $8, 0x10
1147
vsubc $v3, $v13, $v11[1q]
1148
ssv $v0[10], 0x14($23) // DxHDy
1149
vsub $v9, $v12, $v10[1q]
1150
ssv $v1[10], 0x16($23) // DxHDy, frac
1151
vsubc $v21, $v6, $v6[1]
1152
ssv $v0[6], 0x1c($23) // DxMDy
1153
vlt $v19, $v5, $v5[1]
1154
ssv $v1[6], 0x1e($23) // DxMDy, frac
1155
vmrg $v20, $v6, $v6[1]
1156
ssv $v9[8], 0x10($23) // XH
1157
vsubc $v21, $v20, $v6[2]
1158
ssv $v3[8], 0x12($23) // XH, frac
1159
vlt $v19, $v19, $v5[2]
1160
ssv $v9[4], 0x18($23) // XM
1161
vmrg $v20, $v20, $v6[2]
1162
ssv $v3[4], 0x1a($23) // XM, frac
1163
addi $23, $23, 0x20
1164
blez $7, @@f3d_04001cfc // no texture?
1165
vmudl $v20, $v20, $v30[5]
1166
lw $14, 0x00($15)
1167
vmadm $v19, $v19, $v30[5]
1168
lw $17, -0x04($15)
1169
vmadn $v20, $v31, $v31[0]
1170
lw $18, -0x08($15)
1171
llv $v9[0], 0x14($14)
1172
llv $v9[8], 0x14($17)
1173
llv $v22[0], 0x14($18)
1174
lsv $v11[0], 0x22($14)
1175
lsv $v12[0], 0x20($14)
1176
lsv $v11[8], 0x22($17)
1177
vmov $v9[2], $v30[0]
1178
lsv $v12[8], 0x20($17)
1179
vmov $v9[6], $v30[0]
1180
lsv $v24[0], 0x22($18)
1181
vmov $v22[2], $v30[0]
1182
lsv $v25[0], 0x20($18)
1183
vmudl $v6, $v11, $v20[0]
1184
vmadm $v6, $v12, $v20[0]
1185
ssv $v19[0], 0x44($8)
1186
vmadn $v6, $v11, $v19[0]
1187
ssv $v20[0], 0x4c($8)
1188
vmadh $v5, $v12, $v19[0]
1189
vmudl $v16, $v24, $v20[0]
1190
vmadm $v16, $v25, $v20[0]
1191
vmadn $v20, $v24, $v19[0]
1192
vmadh $v19, $v25, $v19[0]
1193
vmudm $v16, $v9, $v6[0h]
1194
vmadh $v9, $v9, $v5[0h]
1195
vmadn $v10, $v31, $v31[0]
1196
vmudm $v16, $v22, $v20[0]
1197
vmadh $v22, $v22, $v19[0]
1198
vmadn $v23, $v31, $v31[0]
1199
sdv $v9[8], 0x10($16)
1200
sdv $v10[8], 0x18($16)
1201
sdv $v9[0], 0x00($16)
1202
sdv $v10[0], 0x08($16)
1203
sdv $v22[0], 0x20($16)
1204
sdv $v23[0], 0x28($16)
1205
vabs $v9, $v9, $v9
1206
llv $v19[0], 0x10($16)
1207
vabs $v22, $v22, $v22
1208
llv $v20[0], 0x18($16)
1209
vabs $v19, $v19, $v19
1210
vge $v17, $v9, $v22
1211
vmrg $v18, $v10, $v23
1212
vge $v17, $v17, $v19
1213
vmrg $v18, $v18, $v20
1214
@@f3d_04001cfc:
1215
slv $v17[0], 0x40($8)
1216
slv $v18[0], 0x48($8)
1217
andi $7, $5, (G_SHADE | G_TEXTURE_ENABLE | G_ZBUFFER)
1218
blez $7, @@f3d_04001fcc // skip code below if no bits set
1219
vxor $v18, $v31, $v31
1220
luv $v25[0], 0x10($3)
1221
vadd $v16, $v18, $v30[5]
1222
luv $v15[0], 0x10($1)
1223
vadd $v24, $v18, $v30[5]
1224
andi $7, $13, 0x0200
1225
vadd $v5, $v18, $v30[5]
1226
bgtz $7, @@f3d_04001d3c
1227
luv $v23[0], 0x10($2)
1228
luv $v25[0], 0x10($4)
1229
luv $v15[0], 0x10($4)
1230
luv $v23[0], 0x10($4)
1231
@@f3d_04001d3c:
1232
vmudm $v25, $v25, $v31[7]
1233
vmudm $v15, $v15, $v31[7]
1234
vmudm $v23, $v23, $v31[7]
1235
ldv $v16[8], 0x18($8)
1236
ldv $v15[8], 0x10($8)
1237
ldv $v24[8], 0x28($8)
1238
ldv $v23[8], 0x20($8)
1239
ldv $v5[8], 0x38($8)
1240
ldv $v25[8], 0x30($8)
1241
lsv $v16[14], 0x1e($1)
1242
lsv $v15[14], 0x1c($1)
1243
lsv $v24[14], 0x1e($2)
1244
lsv $v23[14], 0x1c($2)
1245
lsv $v5[14], 0x1e($3)
1246
lsv $v25[14], 0x1c($3)
1247
vsubc $v12, $v24, $v16
1248
vsub $v11, $v23, $v15
1249
vsubc $v20, $v16, $v5
1250
vsub $v19, $v15, $v25
1251
vsubc $v10, $v5, $v16
1252
vsub $v9, $v25, $v15
1253
vsubc $v22, $v16, $v24
1254
vsub $v21, $v15, $v23
1255
vmudn $v6, $v10, $v4[3]
1256
vmadh $v6, $v9, $v4[3]
1257
vmadn $v6, $v22, $v4[5]
1258
vmadh $v6, $v21, $v4[5]
1259
vsar $v9, $v9, $v9[0]
1260
vsar $v10, $v10, $v10[1]
1261
vmudn $v6, $v12, $v4[4]
1262
vmadh $v6, $v11, $v4[4]
1263
vmadn $v6, $v20, $v4[2]
1264
vmadh $v6, $v19, $v4[2]
1265
vsar $v11, $v11, $v11[0]
1266
vsar $v12, $v12, $v12[1]
1267
vmudl $v6, $v10, $v26[3]
1268
vmadm $v6, $v9, $v26[3]
1269
vmadn $v10, $v10, $v27[3]
1270
vmadh $v9, $v9, $v27[3]
1271
vmudl $v6, $v12, $v26[3]
1272
vmadm $v6, $v11, $v26[3]
1273
vmadn $v12, $v12, $v27[3]
1274
sdv $v9[0], 0x08($23)
1275
vmadh $v11, $v11, $v27[3]
1276
sdv $v10[0], 0x18($23)
1277
vmudn $v6, $v12, $v31[1]
1278
vmadh $v6, $v11, $v31[1]
1279
vmadl $v6, $v10, $v1[5]
1280
vmadm $v6, $v9, $v1[5]
1281
vmadn $v14, $v10, $v0[5]
1282
sdv $v11[0], 0x28($23)
1283
vmadh $v13, $v9, $v0[5]
1284
sdv $v12[0], 0x38($23)
1285
vmudl $v28, $v14, $v2[0]
1286
sdv $v13[0], 0x20($23)
1287
vmadm $v6, $v13, $v2[0]
1288
sdv $v14[0], 0x30($23)
1289
vmadn $v28, $v31, $v31[0]
1290
vsubc $v18, $v16, $v28
1291
vsub $v17, $v15, $v6
1292
andi $7, $5, G_SHADE
1293
blez $7, @@f3d_04001e44
1294
andi $7, $5, G_TEXTURE_ENABLE
1295
addi $23, $23, 0x40
1296
sdv $v17[0], -0x40($23)
1297
sdv $v18[0], -0x30($23)
1298
@@f3d_04001e44:
1299
blez $7, @@f3d_04001f48
1300
andi $7, $5, G_ZBUFFER
1301
addi $16, $zero, 0x0800
1302
mtc2 $16, $v19[0]
1303
vabs $v24, $v9, $v9
1304
ldv $v20[8], 0x40($8)
1305
vabs $v25, $v11, $v11
1306
ldv $v21[8], 0x48($8)
1307
vmudm $v24, $v24, $v19[0]
1308
vmadn $v26, $v31, $v31[0]
1309
vmudm $v25, $v25, $v19[0]
1310
vmadn $v27, $v31, $v31[0]
1311
vmudl $v21, $v21, $v19[0]
1312
vmadm $v20, $v20, $v19[0]
1313
vmadn $v21, $v31, $v31[0]
1314
vmudn $v26, $v26, $v31[2]
1315
vmadh $v24, $v24, $v31[2]
1316
vmadn $v26, $v31, $v31[0]
1317
vmadn $v23, $v27, $v31[1]
1318
vmadh $v22, $v25, $v31[1]
1319
addi $16, $zero, 0x40
1320
vmadn $v6, $v21, $v31[1]
1321
mtc2 $16, $v19[0]
1322
vmadh $v5, $v20, $v31[1]
1323
vsubc $v23, $v6, $v6[5]
1324
vge $v5, $v5, $v5[5]
1325
vmrg $v6, $v6, $v6[5]
1326
vsubc $v23, $v6, $v6[6]
1327
vge $v5, $v5, $v5[6]
1328
vmrg $v6, $v6, $v6[6]
1329
vmudl $v6, $v6, $v19[0]
1330
vmadm $v5, $v5, $v19[0]
1331
vmadn $v6, $v31, $v31[0]
1332
vrcph $v23[0], $v5[4]
1333
vrcpl $v6[0], $v6[4]
1334
vrcph $v5[0], $v31[0]
1335
vmudn $v6, $v6, $v31[2]
1336
vmadh $v5, $v5, $v31[2]
1337
vlt $v5, $v5, $v31[1]
1338
vmrg $v6, $v6, $v31[0]
1339
vmudl $v20, $v18, $v6[0]
1340
vmadm $v20, $v17, $v6[0]
1341
vmadn $v20, $v18, $v5[0]
1342
vmadh $v19, $v17, $v5[0]
1343
vmudl $v22, $v10, $v6[0]
1344
vmadm $v22, $v9, $v6[0]
1345
vmadn $v22, $v10, $v5[0]
1346
sdv $v19[8], 0x00($23)
1347
vmadh $v21, $v9, $v5[0]
1348
sdv $v20[8], 0x10($23)
1349
vmudl $v24, $v12, $v6[0]
1350
vmadm $v24, $v11, $v6[0]
1351
vmadn $v24, $v12, $v5[0]
1352
sdv $v21[8], 0x08($23)
1353
vmadh $v23, $v11, $v5[0]
1354
sdv $v22[8], 0x18($23)
1355
vmudl $v26, $v14, $v6[0]
1356
vmadm $v26, $v13, $v6[0]
1357
vmadn $v26, $v14, $v5[0]
1358
sdv $v23[8], 0x28($23)
1359
vmadh $v25, $v13, $v5[0]
1360
sdv $v24[8], 0x38($23)
1361
addi $23, $23, 0x40
1362
sdv $v25[8], -0x20($23)
1363
sdv $v26[8], -0x10($23)
1364
@@f3d_04001f48:
1365
blez $7, @@f3d_04001fcc
1366
vmudn $v14, $v14, $v30[4]
1367
vmadh $v13, $v13, $v30[4]
1368
vmadn $v14, $v31, $v31[0]
1369
vmudn $v16, $v16, $v30[4]
1370
vmadh $v15, $v15, $v30[4]
1371
vmadn $v16, $v31, $v31[0]
1372
ssv $v13[14], 0x08($23)
1373
vmudn $v10, $v10, $v30[4]
1374
ssv $v14[14], 0x0a($23)
1375
vmadh $v9, $v9, $v30[4]
1376
vmadn $v10, $v31, $v31[0]
1377
vmudn $v12, $v12, $v30[4]
1378
vmadh $v11, $v11, $v30[4]
1379
vmadn $v12, $v31, $v31[0]
1380
lbu $7, 0x11($29)
1381
sub $7, $zero, $7
1382
beq $7, $zero, @@f3d_04001f9c
1383
mtc2 $7, $v6[0]
1384
vch $v11, $v11, $v6[0]
1385
vcl $v12, $v12, $v31[0]
1386
@@f3d_04001f9c:
1387
ssv $v9[14], 0x04($23)
1388
vmudl $v28, $v14, $v2[0]
1389
ssv $v10[14], 0x06($23)
1390
vmadm $v6, $v13, $v2[0]
1391
ssv $v11[14], 0x0c($23)
1392
vmadn $v28, $v31, $v31[0]
1393
ssv $v12[14], 0x0e($23)
1394
vsubc $v18, $v16, $v28
1395
vsub $v17, $v15, $v6
1396
addi $23, $23, 0x10
1397
ssv $v17[14], -0x10($23)
1398
ssv $v18[14], -0x0e($23)
1399
@@f3d_04001fcc:
1400
jal f3d_04001178
1401
@@f3d_04001fd0:
1402
nop
1403
jr $30
1404
nop
1405
nop
1406
Overlay0End:
1407
1408
// Overlay 1
1409
.headersize 0x04001000 - orga()
1410
.definelabel Overlay1LoadStart, orga()
1411
// reciprocal method, see RSP Programmers Guide page 79
1412
// $v29[3]=s_int, $v28[3]=s_frac, $v29[7]=t_int, $v28[7]=t_frac
1413
// out: $v27[3,7]=s,t int, $v26[3,7]=s,t frac
1414
Overlay1Address:
1415
f3d_04001000:
1416
vrcph $v27[3], $v29[3]
1417
vrcpl $v26[3], $v28[3]
1418
vrcph $v27[3], $v29[7]
1419
vrcpl $v26[7], $v28[7]
1420
vrcph $v27[7], $v31[0]
1421
vmudn $v26, $v26, $v31[2] // 0002, << 1 since input is S15.16
1422
vmadh $v27, $v27, $v31[2]
1423
vmadn $v26, $v31, $v31[0]
1424
// $v27[3]=sres_int, $v26[3]=sres_frac, $v27[7]=tres_int, $v26[7]=tres_frac
1425
lqv $v23[0], 0x60($zero)
1426
vxor $v22, $v31, $v31 // (1/w)*w
1427
vmudl $v24, $v26, $v28
1428
vmadm $v24, $v27, $v28
1429
vmadn $v24, $v26, $v29
1430
vmadh $v25, $v27, $v29
1431
// $v24=frac, $v25=int, should be very close to 1.0
1432
vsubc $v24, $v22, $v24 // take 2.0-result (better rounding?)
1433
vsub $v25, $v23, $v25
1434
vmudl $v22, $v26, $v24 // (2.0-(1/w)*w)*(1/w)
1435
vmadm $v23, $v27, $v24
1436
vmadn $v26, $v26, $v25
1437
vmadh $v27, $v27, $v25
1438
jr $ra
1439
nop
1440
1441
dma_wait_dl:
1442
jal wait_while_dma_busy
1443
addi $27, $zero, inputDisplayList
1444
1445
read_next_task_entry:
1446
lw $25, 0x00($27) // first command word
1447
lw $24, 0x04($27) // second command word
1448
srl $1, $25, 29
1449
andi $1, $1, 0x0006 // $1 = (two MSbits) << 1
1450
addi $26, $26, 8 // increase next task in DRAM ptr
1451
addi $27, $27, 8 // increase next task in DMEM ptr
1452
addi $28, $28, -8 // decrease task count left in DMEM
1453
bgtz $1, dispatch_task
1454
andi $18, $25, 0x01ff
1455
addi $22, $zero, inputData // command that loads data input
1456
Overlay1End:
1457
1458
1459
// Overlay 2
1460
.headersize 0x04001768 - orga()
1461
Overlay2Address:
1462
b perform_clip
1463
sh $ra, data0158
1464
nop
1465
nop
1466
ori $30, $zero, overlayInfo3
1467
b load_overlay
1468
lh $21, lightEntry
1469
1470
perform_clip:
1471
sh $3, clipTemp
1472
sh $2, data0942
1473
sh $1, data0944
1474
sh $zero, data0946
1475
ori $7, $zero, 0x0db8
1476
ori $30, $zero, clipTemp
1477
ori $6, $zero, 0x000c
1478
next_clip:
1479
or $5, $30, $30
1480
xori $30, $30, 0x0014
1481
f3d_040017a8:
1482
beq $6, $zero, @f3d_04001954
1483
lh $11, 0xa6($6)
1484
addi $6, $6, -2
1485
ori $17, $zero, 0x0000
1486
or $18, $zero, $zero
1487
1488
found_in:
1489
ori $2, $5, 0x0000
1490
1491
found_out:
1492
j f3d_040017d4
1493
addi $14, $30, 2
1494
f3d_040017c8:
1495
and $8, $8, $11
1496
beq $8, $18, f3d_o2_04001804
1497
addi $2, $2, 2
1498
f3d_040017d4:
1499
or $20, $10, $zero
1500
sh $10, 0x00($14)
1501
addi $14, $14, 2
1502
f3d_040017e0:
1503
lh $10, 0x00($2)
1504
bne $10, $zero, f3d_040017c8
1505
lh $8, 0x24($10)
1506
addi $8, $17, -2
1507
bgtz $8, f3d_040017e0
1508
ori $2, $5, 0x0000
1509
beq $8, $zero, f3d_040017a8
1510
nop
1511
j f3d_04001980
1512
f3d_o2_04001804:
1513
xor $18, $18, $11
1514
lh $8, lo(labelLUT)($17)
1515
addi $17, $17, 2
1516
jr $8
1517
lh $8, nextClipEntry
1518
1519
found_first_in:
1520
mtc2 $10, $v13[0]
1521
or $10, $20, $zero
1522
mfc2 $20, $v13[0]
1523
ori $14, $30, 0x0000
1524
lh $8, foundOutEntry
1525
1526
found_first_out:
1527
sh $8, data0106
1528
addi $7, $7, 0x28
1529
sh $7, 0x00($14)
1530
sh $zero, 0x02($14)
1531
ldv $v9[0], 0x00($10)
1532
ldv $v10[0], 0x08($10)
1533
ldv $v4[0], 0x00($20)
1534
ldv $v5[0], 0x08($20)
1535
sll $8, $6, 2
1536
ldv $v1[0], 0x70($8)
1537
vmudh $v0, $v1, $v31[3]
1538
vmudn $v12, $v5, $v1
1539
vmadh $v11, $v4, $v1
1540
vmadn $v12, $v31, $v31[0]
1541
vmadn $v28, $v10, $v0
1542
vmadh $v29, $v9, $v0
1543
vmadn $v28, $v31, $v31[0]
1544
vaddc $v26, $v28, $v28[0q]
1545
vadd $v27, $v29, $v29[0q]
1546
vaddc $v28, $v26, $v26[1h]
1547
vadd $v29, $v27, $v27[1h]
1548
mfc2 $8, $v29[6]
1549
vrcph $v7[3], $v29[3]
1550
vrcpl $v3[3], $v28[3]
1551
vrcph $v7[3], $v31[0]
1552
vmudn $v3, $v3, $v31[2]
1553
bgez $8, f3d_040018a4
1554
vmadh $v7, $v7, $v31[2]
1555
vmudn $v3, $v3, $v31[3]
1556
vmadh $v7, $v7, $v31[3]
1557
f3d_040018a4:
1558
veq $v7, $v7, $v31[0]
1559
vmrg $v3, $v3, $v31[3]
1560
vmudl $v28, $v28, $v3[3]
1561
vmadm $v29, $v29, $v3[3]
1562
jal f3d_04001000
1563
vmadn $v28, $v31, $v31[0]
1564
vaddc $v28, $v12, $v12[0q]
1565
vadd $v29, $v11, $v11[0q]
1566
vaddc $v12, $v28, $v28[1h]
1567
vadd $v11, $v29, $v29[1h]
1568
vmudl $v15, $v12, $v26
1569
vmadm $v15, $v11, $v26
1570
vmadn $v15, $v12, $v27
1571
vmadh $v8, $v11, $v27
1572
vmudl $v28, $v31, $v31[5]
1573
vmadl $v15, $v15, $v3[3]
1574
vmadm $v8, $v8, $v3[3]
1575
vmadn $v15, $v31, $v31[0]
1576
veq $v8, $v8, $v31[0]
1577
vmrg $v15, $v15, $v31[3]
1578
vne $v15, $v15, $v31[0]
1579
vmrg $v15, $v15, $v31[1]
1580
vnxor $v8, $v15, $v31[0]
1581
vaddc $v8, $v8, $v31[1]
1582
vadd $v29, $v29, $v29
1583
vmudl $v28, $v5, $v8[3h]
1584
vmadm $v29, $v4, $v8[3h]
1585
vmadl $v28, $v10, $v15[3h]
1586
vmadm $v29, $v9, $v15[3h]
1587
vmadn $v28, $v31, $v31[0]
1588
luv $v12[0], 0x10($10)
1589
luv $v11[0], 0x10($20)
1590
llv $v12[8], 0x14($10)
1591
llv $v11[8], 0x14($20)
1592
vmudm $v18, $v12, $v15[3]
1593
vmadm $v18, $v11, $v8[3]
1594
suv $v18[0], 0x00($7)
1595
sdv $v18[8], 0x08($7)
1596
ldv $v18[0], 0x08($7)
1597
jal f3d_040014e8
1598
lw $15, 0x00($7)
1599
mfc2 $10, $v13[0]
1600
j @f3d_040015e8
1601
ori $9, $zero, 0x0001
1602
@f3d_04001954:
1603
lh $8, 0x00($5)
1604
sh $8, 0xb4($zero)
1605
sh $5, data0106
1606
lh $30, clipDrawEntry
1607
1608
clip_draw_loop:
1609
lh $8, data0106
1610
lh $3, 0xb4($zero)
1611
lh $2, 0x02($8)
1612
lh $1, 0x04($8)
1613
addi $8, $8, 2
1614
bne $1, $zero, f3d_040019c4
1615
sh $8, data0106
1616
f3d_04001980:
1617
j SP_NOOP
1618
nop
1619
Overlay2End:
1620
1621
// Overlay 3
1622
.headersize 0x04001768 - orga()
1623
Overlay3Address:
1624
ori $30, $zero, overlayInfo2
1625
b load_overlay
1626
lh $21, performClipEntry
1627
lw $1, numLights
1628
sw $15, 0x00($7) // normal vector 1st vertex
1629
sw $16, 0x04($7) // normal vector 2nd vertex
1630
bltz $1, @init_lights
1631
lpv $v4[0], 0x00($7)
1632
luv $v7[0], 0x01d0($1) // ambient RGB
1633
vxor $v27, $v27, $v27
1634
@@f3d_04001790:
1635
vge $v7, $v7, $v31[0] // max(0, $v7)
1636
lpv $v5[0], 0x01c0($1) // calculated light
1637
vadd $v27, $v27, $v7
1638
luv $v7[0], 0x01b0($1) // light's RGB
1639
vor $v20, $v6, $v31[0]
1640
vmulf $v6, $v4, $v5 // mul normal vector
1641
vadd $v3, $v6, $v6[1q]
1642
vadd $v6, $v3, $v6[2h]
1643
vmulf $v7, $v7, $v6[0h] // $v6[0] and $v6[4] contain dot product
1644
bgtz $1, @@f3d_04001790
1645
addi $1, $1, -0x20
1646
suv $v27[0], 0x00($7)
1647
andi $8, $3, G_TEXTURE_GEN_H
1648
sb $15, 0x03($7)
1649
sb $16, 0x07($7)
1650
lw $15, 0x00($7)
1651
beq $8, $zero, @f3d_040015e4
1652
lw $16, 0x04($7)
1653
andi $8, $3, G_TEXTURE_GEN_LINEAR_H // not used in SM64
1654
lpv $v7[0], 0x90($29)
1655
ldv $v6[0], 0xa0($zero)
1656
vmadn $v20, $v7, $v20[0h]
1657
beq $8, $zero, @@f3d_o3_04001804
1658
vmadm $v18, $v31, $v31[0]
1659
vmulf $v7, $v18, $v18
1660
vmulf $v7, $v7, $v18
1661
vmulf $v20, $v7, $v6[1]
1662
vmacf $v20, $v7, $v6[3]
1663
vmacf $v18, $v18, $v6[2]
1664
@@f3d_o3_04001804:
1665
j @f3d_040015e4
1666
vadd $v18, $v18, $v31[4]
1667
1668
@init_lights:
1669
andi $1, $1, 0x0fff
1670
sw $1, numLights
1671
jal f3d_04001524
1672
addi $8, $zero, modelViewMatrixStack
1673
ori $8, $zero, scratchSpace
1674
stv $v8[2], 0x10($8) // transpose
1675
stv $v8[4], 0x20($8)
1676
stv $v8[12], 0x30($8)
1677
stv $v8[14], 0x40($8)
1678
ltv $v8[14], 0x10($8)
1679
ltv $v8[12], 0x20($8)
1680
ltv $v8[4], 0x30($8)
1681
ltv $v8[2], 0x40($8)
1682
sdv $v12[8], 0x10($8)
1683
sdv $v13[8], 0x20($8)
1684
sdv $v14[8], 0x30($8)
1685
ldv $v12[0], 0x10($8)
1686
ldv $v13[0], 0x20($8)
1687
ldv $v14[0], 0x30($8)
1688
f3d_04001858:
1689
lpv $v5[0], 0x01b8($1) // this light's dir vector
1690
vmulf $v5, $v5, $v31[4]
1691
vmudn $v6, $v12, $v5[0h]
1692
vmadn $v6, $v13, $v5[1h]
1693
vmadn $v6, $v14, $v5[2h]
1694
vmadm $v3, $v31, $v31[0]
1695
vmudm $v6, $v3, $v31[2]
1696
vmacf $v3, $v8, $v5[0h]
1697
vmacf $v3, $v9, $v5[1h]
1698
vmacf $v3, $v10, $v5[2h]
1699
vmadn $v6, $v31, $v31[0]
1700
vmudl $v5, $v6, $v6
1701
vmadm $v5, $v3, $v6
1702
vmadn $v5, $v6, $v3
1703
vmadh $v26, $v3, $v3
1704
vaddc $v7, $v5, $v5[1q]
1705
vadd $v4, $v26, $v26[1q]
1706
vaddc $v7, $v5, $v7[0h]
1707
vadd $v4, $v26, $v4[0h]
1708
vrsqh $v11[0], $v4[2] // normalize vector
1709
vrsql $v15[0], $v7[2]
1710
vrsqh $v11[0], $v31[0]
1711
vmudl $v15, $v15, $v30[3]
1712
vmadm $v11, $v11, $v30[3]
1713
vmadn $v15, $v31, $v31[0]
1714
vmudl $v7, $v6, $v15[0]
1715
vmadm $v7, $v3, $v15[0]
1716
vmadn $v7, $v6, $v11[0]
1717
vmadh $v4, $v3, $v11[0]
1718
vmadn $v7, $v31, $v31[0]
1719
ldv $v2[0], 0xf8($29)
1720
vge $v7, $v7, $v2[0]
1721
vlt $v7, $v7, $v2[1]
1722
vmudn $v7, $v7, $v2[2]
1723
spv $v7[0], 0x01c0($1)
1724
lw $8, 0x01c0($1)
1725
sw $8, 0x01c4($1)
1726
bgtz $1, f3d_04001858
1727
addi $1, $1, -0x20
1728
j load_mp_matrix
1729
lh $ra, lightEntry
1730
nop
1731
Overlay3End:
1732
1733
// Overlay 4
1734
.headersize 0x04001768 - orga()
1735
Overlay4Address:
1736
j f3d_04001788
1737
nop
1738
overlay_4_entry:
1739
nop
1740
jal wait_while_dma_busy
1741
ori $2, $zero, 0x4000
1742
mtc0 $2, SP_STATUS
1743
break
1744
nop
1745
f3d_04001788:
1746
ori $2, $zero, 0x1000
1747
sw $28, data08E4
1748
sw $27, data08E8
1749
sw $26, data08EC
1750
sw $23, data08F0
1751
lw $19, dramPtr
1752
ori $20, $zero, 0x0000
1753
ori $18, $zero, 0x08ff
1754
jal dma_read_write
1755
ori $17, $zero, 0x0001
1756
jal wait_while_dma_busy
1757
nop
1758
j f3d_040010c8
1759
mtc0 $2, SP_STATUS
1760
nop
1761
nop
1762
addiu $zero, $zero, 0xbeef
1763
nop
1764
Overlay4End:
1765
1766
.close // CODE_FILE
1767
1768