PicoVideoRead optimization
[picodrive.git] / Pico / Memory_amips.s
CommitLineData
3ec29f01 1# vim:filetype=mips
2
3# memory handlers with banking support for SSF II - The New Challengers
4# mostly based on Gens code
5
6# (c) Copyright 2007, Grazvydas "notaz" Ignotas
7# All Rights Reserved
8
9
10.set noreorder
11.set noat
12
13.text
14.align 4
15
16# default jump tables
17
18m_read8_def_table:
19 .long m_read8_rom0 # 0x000000 - 0x07FFFF
20 .long m_read8_rom1 # 0x080000 - 0x0FFFFF
21 .long m_read8_rom2 # 0x100000 - 0x17FFFF
22 .long m_read8_rom3 # 0x180000 - 0x1FFFFF
23 .long m_read8_rom4 # 0x200000 - 0x27FFFF
24 .long m_read8_rom5 # 0x280000 - 0x2FFFFF
25 .long m_read8_rom6 # 0x300000 - 0x37FFFF
26 .long m_read8_rom7 # 0x380000 - 0x3FFFFF
27 .long m_read8_rom8 # 0x400000 - 0x47FFFF - for all those large ROM hacks
28 .long m_read8_rom9 # 0x480000 - 0x4FFFFF
29 .long m_read8_romA # 0x500000 - 0x57FFFF
30 .long m_read8_romB # 0x580000 - 0x5FFFFF
31 .long m_read8_romC # 0x600000 - 0x67FFFF
32 .long m_read8_romD # 0x680000 - 0x6FFFFF
33 .long m_read8_romE # 0x700000 - 0x77FFFF
34 .long m_read8_romF # 0x780000 - 0x7FFFFF
35 .long m_read8_rom10 # 0x800000 - 0x87FFFF
36 .long m_read8_rom11 # 0x880000 - 0x8FFFFF
37 .long m_read8_rom12 # 0x900000 - 0x97FFFF
38 .long m_read8_rom13 # 0x980000 - 0x9FFFFF
39 .long m_read8_misc # 0xA00000 - 0xA7FFFF
40 .long m_read_null # 0xA80000 - 0xAFFFFF
41 .long m_read_null # 0xB00000 - 0xB7FFFF
42 .long m_read_null # 0xB80000 - 0xBFFFFF
43 .long m_read8_vdp # 0xC00000 - 0xC7FFFF
44 .long m_read8_vdp # 0xC80000 - 0xCFFFFF
45 .long m_read8_vdp # 0xD00000 - 0xD7FFFF
46 .long m_read8_vdp # 0xD80000 - 0xDFFFFF
47 .long m_read8_ram # 0xE00000 - 0xE7FFFF
48 .long m_read8_ram # 0xE80000 - 0xEFFFFF
49 .long m_read8_ram # 0xF00000 - 0xF7FFFF
50 .long m_read8_ram # 0xF80000 - 0xFFFFFF
51
52m_read16_def_table:
53 .long m_read16_rom0 # 0x000000 - 0x07FFFF
54 .long m_read16_rom1 # 0x080000 - 0x0FFFFF
55 .long m_read16_rom2 # 0x100000 - 0x17FFFF
56 .long m_read16_rom3 # 0x180000 - 0x1FFFFF
57 .long m_read16_rom4 # 0x200000 - 0x27FFFF
58 .long m_read16_rom5 # 0x280000 - 0x2FFFFF
59 .long m_read16_rom6 # 0x300000 - 0x37FFFF
60 .long m_read16_rom7 # 0x380000 - 0x3FFFFF
61 .long m_read16_rom8 # 0x400000 - 0x47FFFF
62 .long m_read16_rom9 # 0x480000 - 0x4FFFFF
63 .long m_read16_romA # 0x500000 - 0x57FFFF
64 .long m_read16_romB # 0x580000 - 0x5FFFFF
65 .long m_read16_romC # 0x600000 - 0x67FFFF
66 .long m_read16_romD # 0x680000 - 0x6FFFFF
67 .long m_read16_romE # 0x700000 - 0x77FFFF
68 .long m_read16_romF # 0x780000 - 0x7FFFFF
69 .long m_read16_rom10 # 0x800000 - 0x87FFFF
70 .long m_read16_rom11 # 0x880000 - 0x8FFFFF
71 .long m_read16_rom12 # 0x900000 - 0x97FFFF
72 .long m_read16_rom13 # 0x980000 - 0x9FFFFF
73 .long m_read16_misc # 0xA00000 - 0xA7FFFF
74 .long m_read_null # 0xA80000 - 0xAFFFFF
75 .long m_read_null # 0xB00000 - 0xB7FFFF
76 .long m_read_null # 0xB80000 - 0xBFFFFF
77 .long m_read16_vdp # 0xC00000 - 0xC7FFFF
78 .long m_read16_vdp # 0xC80000 - 0xCFFFFF
79 .long m_read16_vdp # 0xD00000 - 0xD7FFFF
80 .long m_read16_vdp # 0xD80000 - 0xDFFFFF
81 .long m_read16_ram # 0xE00000 - 0xE7FFFF
82 .long m_read16_ram # 0xE80000 - 0xEFFFFF
83 .long m_read16_ram # 0xF00000 - 0xF7FFFF
84 .long m_read16_ram # 0xF80000 - 0xFFFFFF
85
86m_read32_def_table:
87 .long m_read32_rom0 # 0x000000 - 0x07FFFF
88 .long m_read32_rom1 # 0x080000 - 0x0FFFFF
89 .long m_read32_rom2 # 0x100000 - 0x17FFFF
90 .long m_read32_rom3 # 0x180000 - 0x1FFFFF
91 .long m_read32_rom4 # 0x200000 - 0x27FFFF
92 .long m_read32_rom5 # 0x280000 - 0x2FFFFF
93 .long m_read32_rom6 # 0x300000 - 0x37FFFF
94 .long m_read32_rom7 # 0x380000 - 0x3FFFFF
95 .long m_read32_rom8 # 0x400000 - 0x47FFFF
96 .long m_read32_rom9 # 0x480000 - 0x4FFFFF
97 .long m_read32_romA # 0x500000 - 0x57FFFF
98 .long m_read32_romB # 0x580000 - 0x5FFFFF
99 .long m_read32_romC # 0x600000 - 0x67FFFF
100 .long m_read32_romD # 0x680000 - 0x6FFFFF
101 .long m_read32_romE # 0x700000 - 0x77FFFF
102 .long m_read32_romF # 0x780000 - 0x7FFFFF
103 .long m_read32_rom10 # 0x800000 - 0x87FFFF
104 .long m_read32_rom11 # 0x880000 - 0x8FFFFF
105 .long m_read32_rom12 # 0x900000 - 0x97FFFF
106 .long m_read32_rom13 # 0x980000 - 0x9FFFFF
107 .long m_read32_misc # 0xA00000 - 0xA7FFFF
108 .long m_read_null # 0xA80000 - 0xAFFFFF
109 .long m_read_null # 0xB00000 - 0xB7FFFF
110 .long m_read_null # 0xB80000 - 0xBFFFFF
111 .long m_read32_vdp # 0xC00000 - 0xC7FFFF
112 .long m_read32_vdp # 0xC80000 - 0xCFFFFF
113 .long m_read32_vdp # 0xD00000 - 0xD7FFFF
114 .long m_read32_vdp # 0xD80000 - 0xDFFFFF
115 .long m_read32_ram # 0xE00000 - 0xE7FFFF
116 .long m_read32_ram # 0xE80000 - 0xEFFFFF
117 .long m_read32_ram # 0xF00000 - 0xF7FFFF
118 .long m_read32_ram # 0xF80000 - 0xFFFFFF
119
120
121# #############################################################################
122
123.bss
124.align 4
125
126# used tables
127m_read8_table:
128 .skip 32*4
129
130m_read16_table:
131 .skip 32*4
132
133m_read32_table:
134 .skip 32*4
135
136
137# #############################################################################
138
139.text
140.align 4
141
142.global PicoMemReset
143.global PicoRead8
144.global PicoRead16
145.global PicoRead32
146.global PicoWriteRomHW_SSF2
147
148.global m_read8_def_table
149.global m_read8_table
150
151.macro PicoMemResetCopyDef dst_table src_table
152 lui $t0, %hi(\dst_table)
153 addiu $t0, %lo(\dst_table)
154 lui $t1, %hi(\src_table)
155 addiu $t1, %lo(\src_table)
156 li $t2, 32
1571:
158 lw $t3, 0($t1)
159 sw $t3, 0($t0)
160 addiu $t2, -1
161 addiu $t1, 4
162 bnez $t2, 1b
163 addiu $t0, 4
164.endm
165
166# $t4 = 4
167.macro PicoMemResetRomArea dst_table ar_label
168 lui $t0, %hi(\dst_table)
169 addiu $t0, %lo(\dst_table)
170 lui $t1, %hi(\ar_label)
171 addiu $t1, %lo(\ar_label)
172 li $t2, 20
1731:
174 beq $t2, $v1, 2f
175 addiu $t2, -1
176 sll $t3, $t2, 2
177 beq $t2, $t4, 1b # do not touch the SRAM area
178 addu $t3, $t0
179 j 1b
180 sw $t1, 0($t3)
1812:
182.endm
183
184
185PicoMemReset:
186 lui $v1, %hi(Pico+0x22204)
187 lw $v1, %lo(Pico+0x22204)($v1) # romsize
188 lui $t0, 8
189 addu $v1, $t0
190 addiu $v1, -1
191 srl $v1, 19
192
193 PicoMemResetCopyDef m_read8_table m_read8_def_table
194 PicoMemResetCopyDef m_read16_table m_read16_def_table
195 PicoMemResetCopyDef m_read32_table m_read32_def_table
196
197 # update memhandlers according to ROM size
198 li $t4, 4
199 PicoMemResetRomArea m_read8_table m_read8_above_rom
200 PicoMemResetRomArea m_read16_table m_read16_above_rom
201 PicoMemResetRomArea m_read32_table m_read32_above_rom
202
203 jr $ra
204 nop
205
206# #############################################################################
207
208.macro PicoReadJump table
209 lui $t0, %hi(\table)
210 srl $t1, $a0, 19
211 ins $t0, $t1, 2, 5
212 lw $t0, %lo(\table)($t0)
213 ins $a0, $0, 24, 8
214 jr $t0
215 nop
216.endm
217
218PicoRead8: # u32 a
219 PicoReadJump m_read8_table
220
221PicoRead16: # u32 a
222 PicoReadJump m_read16_table
223
224PicoRead32: # u32 a
225 PicoReadJump m_read32_table
226
227# #############################################################################
228
229m_read_null:
230 jr $ra
231 li $v0, 0
232
233m_read_neg1:
234 jr $ra
235 addiu $v0, $0, 0xffff
236
237# loads &Pico.rom to $t3
238.macro m_read_rom_try_sram is200000 size
239 lui $t2, %hi(SRam)
240 addiu $t2, %lo(SRam)
241 lui $t3, %hi(Pico+0x22200)
242 lw $t1, 8($t2) # SRam.end
243.if \is200000
244 ins $a0, $0, 19, 13
245 lui $t4, 0x20
246 or $a0, $t4
247.endif
248 subu $t4, $a0, $t1
249 bgtz $t4, 1f
250 addiu $t3, %lo(Pico+0x22200)
251 lw $t1, 4($t2) # SRam.start
252 subu $t4, $t1, $a0
253 bgtz $t4, 1f
254 nop
255 lb $t1, 0x11($t3) # Pico.m.sram_reg
256 andi $t4, $t1, 5
257 beqz $t4, 1f
258 nop
259.if \size == 8
260 j SRAMRead
261 nop
262.elseif \size == 16
9dc09829 263 sw $ra, -4($sp)
264 jal SRAMRead16
3ec29f01 265 addiu $sp, -4
3ec29f01 266 lw $ra, 0($sp)
3ec29f01 267 jr $ra
9dc09829 268 addiu $sp, 4
3ec29f01 269.else
270 addiu $sp, -8
3ec29f01 271 sw $ra, 0($sp)
9dc09829 272 sw $a0, 4($sp)
273 jal SRAMRead16
274 nop
3ec29f01 275 lw $a0, 4($sp)
276 sw $v0, 4($sp)
9dc09829 277 jal SRAMRead16
3ec29f01 278 addiu $a0, 2
279 lw $v1, 4($sp)
280 lw $ra, 0($sp)
281 addiu $sp, 8
3ec29f01 282 jr $ra
9dc09829 283 ins $v0, $v1, 16, 16
3ec29f01 284.endif
285# m_read_nosram:
2861:
287.endm
288
289.macro m_read8_rom sect
290 lui $t0, %hi(Pico+0x22200)
291 lw $t0, %lo(Pico+0x22200)($t0) # rom
292 xori $a0, 1
293 ins $a0, $0, 19, 13
294.if \sect
295 lui $t1, 8*\sect
296 addu $a0, $t1
297.endif
298 addu $t0, $a0
299 jr $ra
300 lb $v0, 0($t0)
301.endm
302
303
304m_read8_rom0: # 0x000000 - 0x07ffff
305 m_read8_rom 0
306
307m_read8_rom1: # 0x080000 - 0x0fffff
308 m_read8_rom 1
309
310m_read8_rom2: # 0x100000 - 0x17ffff
311 m_read8_rom 2
312
313m_read8_rom3: # 0x180000 - 0x1fffff
314 m_read8_rom 3
315
316m_read8_rom4: # 0x200000 - 0x27ffff, SRAM area
317 m_read_rom_try_sram 1 8
318 lw $t1, 4($t3) # romsize
319 subu $t4, $t1, $a0
320 blez $t4, m_read_null
321 lw $t1, 0($t3) # rom
322 xori $a0, 1
323 addu $t1, $a0
324 jr $ra
325 lb $v0, 0($t1)
326
327m_read8_rom5: # 0x280000 - 0x2fffff
328 m_read8_rom 5
329
330m_read8_rom6: # 0x300000 - 0x37ffff
331 m_read8_rom 6
332
333m_read8_rom7: # 0x380000 - 0x3fffff
334 m_read8_rom 7
335
336m_read8_rom8: # 0x400000 - 0x47ffff
337 m_read8_rom 8
338
339m_read8_rom9: # 0x480000 - 0x4fffff
340 m_read8_rom 9
341
342m_read8_romA: # 0x500000 - 0x57ffff
343 m_read8_rom 0xA
344
345m_read8_romB: # 0x580000 - 0x5fffff
346 m_read8_rom 0xB
347
348m_read8_romC: # 0x600000 - 0x67ffff
349 m_read8_rom 0xC
350
351m_read8_romD: # 0x680000 - 0x6fffff
352 m_read8_rom 0xD
353
354m_read8_romE: # 0x700000 - 0x77ffff
355 m_read8_rom 0xE
356
357m_read8_romF: # 0x780000 - 0x7fffff
358 m_read8_rom 0xF
359
360m_read8_rom10: # 0x800000 - 0x87ffff
361 m_read8_rom 0x10
362
363m_read8_rom11: # 0x880000 - 0x8fffff
364 m_read8_rom 0x11
365
366m_read8_rom12: # 0x900000 - 0x97ffff
367 m_read8_rom 0x12
368
369m_read8_rom13: # 0x980000 - 0x9fffff
370 m_read8_rom 0x13
371
372
373m_read8_misc:
374 srl $t0, $a0, 5
375 sll $t0, $t0, 5
376 lui $t1, 0xa1
377 bne $t0, $t1, m_read8_misc2
378 andi $t0, $a0, 0x1e
379m_read8_misc_io:
380 beqz $t0, m_read8_misc_hwreg
381 sub $t1, $t0, 4
382 bgtz $t1, m_read8_misc_ioports
383 nop
384 slti $a0, $t0, 4
385 xori $a0, 1
386 j PadRead
387 nop
388
389m_read8_misc_hwreg:
390 lui $v0, %hi(Pico+0x2220f)
391 jr $ra
392 lb $v0, %lo(Pico+0x2220f)($v0)
393
394m_read8_misc_ioports:
395 lui $v0, %hi(Pico+0x22000)
396 ins $v0, $t0, 0, 5
397 jr $ra
398 lb $v0, %lo(Pico+0x22000)($v0)
399
400m_read8_misc2:
401 lui $t0, 0xa1
402 ori $t0, 0x1100
403 bne $a0, $t0, m_read8_misc3
404 srl $t0, $a0, 16
405 j z80ReadBusReq
406
407m_read8_misc3:
408 addiu $t0, 0xff60 # expecting 0xa0 to get 0
409 bnez $t0, m_read8_misc4
410
411 # z80 area
412 andi $t0, $a0, 0x4000
413 bnez $t0, m_read8_z80_misc
414 andi $t0, $a0, 0x6000
415 j z80Read8 # z80 RAM
416
417m_read8_z80_misc:
418 addiu $t0, 0xc000 # expecting 0x4000 to get 0
419 bnez $t0, m_read_neg1 # invalid
420
421 lui $t0, %hi(PicoOpt)
422 lw $t0, %lo(PicoOpt)($t0)
423 andi $t0, 1
43e6eaad 424 bnez $t0, ym2612_read_local_68k
425 nop
3ec29f01 426
427m_read8_fake_ym2612:
428 lb $v0, %lo(Pico+0x22208)($t0) # Pico.m.rotate
429 addiu $t1, $v0, 1
430 jr $ra
431 sb $t1, %lo(Pico+0x22208)($t0)
432
433# delay slot friendly
0ffefdb8 434.macro m_read8_call16 funcname is_func_ptr=0
435.if \is_func_ptr
436 lui $t1, %hi(\funcname)
437 lw $t1, %lo(\funcname)($t1)
438.endif
3ec29f01 439 andi $t0, $a0, 1
440 beqz $t0, 1f
441 li $a1, 8 # not always needed, but shouln't cause problems
0ffefdb8 442.if \is_func_ptr
443 jr $t1
444.else
3ec29f01 445 j \funcname # odd address
0ffefdb8 446.endif
3ec29f01 447 nop
4481:
449 addiu $sp, -4
450 sw $ra, 0($sp)
0ffefdb8 451.if \is_func_ptr
452 jalr $t1
453.else
3ec29f01 454 jal \funcname
0ffefdb8 455.endif
3ec29f01 456 xori $a0, 1
457 lw $ra, 0($sp)
458 addiu $sp, 4
459 jr $ra
460 srl $v0, 8
461.endm
462
463m_read8_misc4:
464 # if everything else fails, use generic handler
465 m_read8_call16 OtherRead16
466
467m_read8_vdp:
468 ext $t0, $a0, 16, 3
469 andi $t1, $a0, 0xe0
470 or $t0, $t1
471 bnez $t0, m_read_null # invalid address
9761a7d0 472 nop
473 j PicoVideoRead8
474 nop
3ec29f01 475
476m_read8_ram:
477 lui $t0, %hi(Pico)
478 ins $t0, $a0, 0, 16
479 xori $t0, 1
480 jr $ra
481 lb $v0, %lo(Pico)($t0)
482
483m_read8_above_rom:
484 # might still be SRam (Micro Machines, HardBall '95)
485 m_read_rom_try_sram 0 8
0ffefdb8 486 m_read8_call16 PicoRead16Hook 1
3ec29f01 487
488# #############################################################################
489
490.macro m_read16_rom sect
491 lui $t0, %hi(Pico+0x22200)
492 lw $t0, %lo(Pico+0x22200)($t0) # rom
493 ins $a0, $0, 0, 1
494 ins $a0, $0, 19, 13
495.if \sect
496 lui $t1, 8*\sect
497 addu $a0, $t1
498.endif
499 addu $t0, $a0
500 jr $ra
501 lh $v0, 0($t0)
502.endm
503
504
505m_read16_rom0: # 0x000000 - 0x07ffff
506 m_read16_rom 0
507
508m_read16_rom1: # 0x080000 - 0x0fffff
509 m_read16_rom 1
510
511m_read16_rom2: # 0x100000 - 0x17ffff
512 m_read16_rom 2
513
514m_read16_rom3: # 0x180000 - 0x1fffff
515 m_read16_rom 3
516
517m_read16_rom4: # 0x200000 - 0x27ffff, SRAM area
518 m_read_rom_try_sram 1 16
519 lw $t1, 4($t3) # romsize
520 subu $t4, $t1, $a0
521 blez $t4, m_read_null
522 lw $t1, 0($t3) # rom
523 ins $a0, $0, 0, 1
524 addu $t1, $a0
525 jr $ra
526 lh $v0, 0($t1)
527
528m_read16_rom5: # 0x280000 - 0x2fffff
529 m_read16_rom 5
530
531m_read16_rom6: # 0x300000 - 0x37ffff
532 m_read16_rom 6
533
534m_read16_rom7: # 0x380000 - 0x3fffff
535 m_read16_rom 7
536
537m_read16_rom8: # 0x400000 - 0x47ffff
538 m_read16_rom 8
539
540m_read16_rom9: # 0x480000 - 0x4fffff
541 m_read16_rom 9
542
543m_read16_romA: # 0x500000 - 0x57ffff
544 m_read16_rom 0xA
545
546m_read16_romB: # 0x580000 - 0x5fffff
547 m_read16_rom 0xB
548
549m_read16_romC: # 0x600000 - 0x67ffff
550 m_read16_rom 0xC
551
552m_read16_romD: # 0x680000 - 0x6fffff
553 m_read16_rom 0xD
554
555m_read16_romE: # 0x700000 - 0x77ffff
556 m_read16_rom 0xE
557
558m_read16_romF: # 0x780000 - 0x7fffff
559 m_read16_rom 0xF
560
561m_read16_rom10: # 0x800000 - 0x87ffff
562 m_read16_rom 0x10
563
564m_read16_rom11: # 0x880000 - 0x8fffff
565 m_read16_rom 0x11
566
567m_read16_rom12: # 0x900000 - 0x97ffff
568 m_read16_rom 0x12
569
570m_read16_rom13: # 0x980000 - 0x9fffff
571 m_read16_rom 0x13
572
573m_read16_misc:
574 ins $a0, $0, 0, 1
575 j OtherRead16
576 li $a1, 16
577
578m_read16_vdp:
579 ext $t0, $a0, 16, 3
580 andi $t1, $a0, 0xe0
581 or $t0, $t1
582 bnez $t0, m_read_null # invalid address
583 ins $a0, $0, 0, 1
584 j PicoVideoRead
585 nop
586
587m_read16_ram:
588 lui $t0, %hi(Pico)
589 ins $a0, $0, 0, 1
590 ins $t0, $a0, 0, 16
591 jr $ra
592 lh $v0, %lo(Pico)($t0)
593
594m_read16_above_rom:
595 # might still be SRam
596 m_read_rom_try_sram 0 16
0ffefdb8 597 lui $t1, %hi(PicoRead16Hook)
598 lw $t1, %lo(PicoRead16Hook)($t1)
599 jr $t1
3ec29f01 600 ins $a0, $0, 0, 1
601
602# #############################################################################
603
604.macro m_read32_rom sect
605 lui $t0, %hi(Pico+0x22200)
606 lw $t0, %lo(Pico+0x22200)($t0) # rom
607 ins $a0, $0, 0, 1
608 ins $a0, $0, 19, 13
609.if \sect
610 lui $t1, 8*\sect
611 addu $a0, $t1
612.endif
613 addu $t0, $a0
614 lh $v1, 0($t0)
615 lh $v0, 2($t0)
616 jr $ra
617 ins $v0, $v1, 16, 16
618.endm
619
620
621m_read32_rom0: # 0x000000 - 0x07ffff
622 m_read32_rom 0
623
624m_read32_rom1: # 0x080000 - 0x0fffff
625 m_read32_rom 1
626
627m_read32_rom2: # 0x100000 - 0x17ffff
628 m_read32_rom 2
629
630m_read32_rom3: # 0x180000 - 0x1fffff
631 m_read32_rom 3
632
633m_read32_rom4: # 0x200000 - 0x27ffff, SRAM area
634 m_read_rom_try_sram 1 32
635 lw $t1, 4($t3) # romsize
636 subu $t4, $t1, $a0
637 blez $t4, m_read_null
638 lw $t1, 0($t3) # rom
639 ins $a0, $0, 0, 1
640 addu $t1, $a0
641 lh $v1, 0($t1)
642 lh $v0, 2($t1)
643 jr $ra
644 ins $v0, $v1, 16, 16
645
646m_read32_rom5: # 0x280000 - 0x2fffff
647 m_read32_rom 5
648
649m_read32_rom6: # 0x300000 - 0x37ffff
650 m_read32_rom 6
651
652m_read32_rom7: # 0x380000 - 0x3fffff
653 m_read32_rom 7
654
655m_read32_rom8: # 0x400000 - 0x47ffff
656 m_read32_rom 8
657
658m_read32_rom9: # 0x480000 - 0x4fffff
659 m_read32_rom 9
660
661m_read32_romA: # 0x500000 - 0x57ffff
662 m_read32_rom 0xA
663
664m_read32_romB: # 0x580000 - 0x5fffff
665 m_read32_rom 0xB
666
667m_read32_romC: # 0x600000 - 0x67ffff
668 m_read32_rom 0xC
669
670m_read32_romD: # 0x680000 - 0x6fffff
671 m_read32_rom 0xD
672
673m_read32_romE: # 0x700000 - 0x77ffff
674 m_read32_rom 0xE
675
676m_read32_romF: # 0x780000 - 0x7fffff
677 m_read32_rom 0xF
678
679m_read32_rom10: # 0x800000 - 0x87ffff
680 m_read32_rom 0x10
681
682m_read32_rom11: # 0x880000 - 0x8fffff
683 m_read32_rom 0x11
684
685m_read32_rom12: # 0x900000 - 0x97ffff
686 m_read32_rom 0x12
687
688m_read32_rom13: # 0x980000 - 0x9fffff
689 m_read32_rom 0x13
690
691.macro m_read32_call16 func need_a1=0
692 addiu $sp, -8
693 sw $ra, 0($sp)
694 sw $s0, 4($sp)
695.if \need_a1
696 li $a1, 16
697.endif
698 jal \func
699 move $s0, $a0
700
701 addu $a0, $s0, 2
702.if \need_a1
703 li $a1, 16
704.endif
705 jal \func
706 move $s0, $v0
707
708 ins $v0, $s0, 16, 16
709 lw $ra, 0($sp)
710 lw $s0, 4($sp)
711 jr $ra
712 addiu $sp, 8
713.endm
714
715m_read32_misc:
716 ins $a0, $0, 0, 1
717 m_read32_call16 OtherRead16, 1
718
719m_read32_vdp:
720 ext $t0, $a0, 16, 3
721 andi $t1, $a0, 0xe0
722 or $t0, $t1
723 bnez $t0, m_read_null # invalid address
724 ins $a0, $0, 0, 1
725 m_read32_call16 PicoVideoRead
726
727m_read32_ram:
728 lui $t0, %hi(Pico)
729 ins $a0, $0, 0, 1
730 ins $t0, $a0, 0, 16
731 lh $v1, %lo(Pico)($t0)
732 lh $v0, %lo(Pico+2)($t0)
733 jr $ra
734 ins $v0, $v1, 16, 16
735
736m_read32_above_rom:
737 # might still be SRam
738 m_read_rom_try_sram 0 32
739 ins $a0, $0, 0, 1
0ffefdb8 740 lui $t1, %hi(PicoRead16Hook)
741 lw $t1, %lo(PicoRead16Hook)($t1)
742 addiu $sp, -4*3
743 sw $ra, 0($sp)
744 sw $s0, 4($sp)
745 sw $t1, 8($sp)
746 jalr $t1
747 move $s0, $a0
748
749 lw $t1, 8($sp)
750 addu $a0, $s0, 2
751 jalr $t1
752 move $s0, $v0
753
754 ins $v0, $s0, 16, 16
755 lw $ra, 0($sp)
756 lw $s0, 4($sp)
757 jr $ra
758 addiu $sp, 4*3
3ec29f01 759
760# #############################################################################
761
762.macro PicoWriteRomHW_SSF2_ls def_table table
763 lui $t3, %hi(\def_table)
764 ins $t3, $a1, 2, 5
765 lw $t0, %lo(\def_table)($t3)
766 lui $t2, %hi(\table)
767 ins $t2, $a0, 2, 3
768 sw $t0, %lo(\table)($t2)
769.endm
770
771PicoWriteRomHW_SSF2: # u32 a, u32 d
772 ext $a0, $a0, 1, 3
773 bnez $a0, pwr_banking
774
775 # sram register
776 lui $t0, %hi(Pico+0x22211)
777 lb $t1, %lo(Pico+0x22211)($t0) # Pico.m.sram_reg
778 ins $t1, $a1, 0, 2
779 jr $ra
780 sb $t1, %lo(Pico+0x22211)($t0)
781
782pwr_banking:
783 andi $a1, 0x1f
784
785 PicoWriteRomHW_SSF2_ls m_read8_def_table m_read8_table
786 PicoWriteRomHW_SSF2_ls m_read16_def_table m_read16_table
787 PicoWriteRomHW_SSF2_ls m_read32_def_table m_read32_table
788
789 jr $ra
790 nop
791