optimizations, fixes, hacks, psp, ...
[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
263 addiu $sp, -4
264 jal SRAMRead
265 sw $ra, 0($sp)
266 lw $ra, 0($sp)
267 addiu $sp, 4
268 jr $ra
269 ins $v0, $v0, 8, 8
270.else
271 addiu $sp, -8
272 sw $a0, 4($sp)
273 jal SRAMRead
274 sw $ra, 0($sp)
275 lw $a0, 4($sp)
276 sw $v0, 4($sp)
277 jal SRAMRead
278 addiu $a0, 2
279 lw $v1, 4($sp)
280 lw $ra, 0($sp)
281 addiu $sp, 8
282 ins $v0, $v1, 16, 16
283 sll $t0, $v0, 8
284 jr $ra
285 or $v0, $t0
286.endif
287# m_read_nosram:
2881:
289.endm
290
291.macro m_read8_rom sect
292 lui $t0, %hi(Pico+0x22200)
293 lw $t0, %lo(Pico+0x22200)($t0) # rom
294 xori $a0, 1
295 ins $a0, $0, 19, 13
296.if \sect
297 lui $t1, 8*\sect
298 addu $a0, $t1
299.endif
300 addu $t0, $a0
301 jr $ra
302 lb $v0, 0($t0)
303.endm
304
305
306m_read8_rom0: # 0x000000 - 0x07ffff
307 m_read8_rom 0
308
309m_read8_rom1: # 0x080000 - 0x0fffff
310 m_read8_rom 1
311
312m_read8_rom2: # 0x100000 - 0x17ffff
313 m_read8_rom 2
314
315m_read8_rom3: # 0x180000 - 0x1fffff
316 m_read8_rom 3
317
318m_read8_rom4: # 0x200000 - 0x27ffff, SRAM area
319 m_read_rom_try_sram 1 8
320 lw $t1, 4($t3) # romsize
321 subu $t4, $t1, $a0
322 blez $t4, m_read_null
323 lw $t1, 0($t3) # rom
324 xori $a0, 1
325 addu $t1, $a0
326 jr $ra
327 lb $v0, 0($t1)
328
329m_read8_rom5: # 0x280000 - 0x2fffff
330 m_read8_rom 5
331
332m_read8_rom6: # 0x300000 - 0x37ffff
333 m_read8_rom 6
334
335m_read8_rom7: # 0x380000 - 0x3fffff
336 m_read8_rom 7
337
338m_read8_rom8: # 0x400000 - 0x47ffff
339 m_read8_rom 8
340
341m_read8_rom9: # 0x480000 - 0x4fffff
342 m_read8_rom 9
343
344m_read8_romA: # 0x500000 - 0x57ffff
345 m_read8_rom 0xA
346
347m_read8_romB: # 0x580000 - 0x5fffff
348 m_read8_rom 0xB
349
350m_read8_romC: # 0x600000 - 0x67ffff
351 m_read8_rom 0xC
352
353m_read8_romD: # 0x680000 - 0x6fffff
354 m_read8_rom 0xD
355
356m_read8_romE: # 0x700000 - 0x77ffff
357 m_read8_rom 0xE
358
359m_read8_romF: # 0x780000 - 0x7fffff
360 m_read8_rom 0xF
361
362m_read8_rom10: # 0x800000 - 0x87ffff
363 m_read8_rom 0x10
364
365m_read8_rom11: # 0x880000 - 0x8fffff
366 m_read8_rom 0x11
367
368m_read8_rom12: # 0x900000 - 0x97ffff
369 m_read8_rom 0x12
370
371m_read8_rom13: # 0x980000 - 0x9fffff
372 m_read8_rom 0x13
373
374
375m_read8_misc:
376 srl $t0, $a0, 5
377 sll $t0, $t0, 5
378 lui $t1, 0xa1
379 bne $t0, $t1, m_read8_misc2
380 andi $t0, $a0, 0x1e
381m_read8_misc_io:
382 beqz $t0, m_read8_misc_hwreg
383 sub $t1, $t0, 4
384 bgtz $t1, m_read8_misc_ioports
385 nop
386 slti $a0, $t0, 4
387 xori $a0, 1
388 j PadRead
389 nop
390
391m_read8_misc_hwreg:
392 lui $v0, %hi(Pico+0x2220f)
393 jr $ra
394 lb $v0, %lo(Pico+0x2220f)($v0)
395
396m_read8_misc_ioports:
397 lui $v0, %hi(Pico+0x22000)
398 ins $v0, $t0, 0, 5
399 jr $ra
400 lb $v0, %lo(Pico+0x22000)($v0)
401
402m_read8_misc2:
403 lui $t0, 0xa1
404 ori $t0, 0x1100
405 bne $a0, $t0, m_read8_misc3
406 srl $t0, $a0, 16
407 j z80ReadBusReq
408
409m_read8_misc3:
410 addiu $t0, 0xff60 # expecting 0xa0 to get 0
411 bnez $t0, m_read8_misc4
412
413 # z80 area
414 andi $t0, $a0, 0x4000
415 bnez $t0, m_read8_z80_misc
416 andi $t0, $a0, 0x6000
417 j z80Read8 # z80 RAM
418
419m_read8_z80_misc:
420 addiu $t0, 0xc000 # expecting 0x4000 to get 0
421 bnez $t0, m_read_neg1 # invalid
422
423 lui $t0, %hi(PicoOpt)
424 lw $t0, %lo(PicoOpt)($t0)
425 andi $t0, 1
426 beqz $t0, m_read8_fake_ym2612
427 lui $t0, %hi(Pico+0x22208)
b542be46 428 lui $t0, %hi(ym2612_st)
429 lw $t0, %lo(ym2612_st)($t0)
430 jr $ra
431 lb $v0, 0x11($t0)
3ec29f01 432
433m_read8_fake_ym2612:
434 lb $v0, %lo(Pico+0x22208)($t0) # Pico.m.rotate
435 addiu $t1, $v0, 1
436 jr $ra
437 sb $t1, %lo(Pico+0x22208)($t0)
438
439# delay slot friendly
440.macro m_read8_call16 funcname
441 andi $t0, $a0, 1
442 beqz $t0, 1f
443 li $a1, 8 # not always needed, but shouln't cause problems
444 j \funcname # odd address
445 nop
4461:
447 addiu $sp, -4
448 sw $ra, 0($sp)
449 jal \funcname
450 xori $a0, 1
451 lw $ra, 0($sp)
452 addiu $sp, 4
453 jr $ra
454 srl $v0, 8
455.endm
456
457m_read8_misc4:
458 # if everything else fails, use generic handler
459 m_read8_call16 OtherRead16
460
461m_read8_vdp:
462 ext $t0, $a0, 16, 3
463 andi $t1, $a0, 0xe0
464 or $t0, $t1
465 bnez $t0, m_read_null # invalid address
466 m_read8_call16 PicoVideoRead
467
468m_read8_ram:
469 lui $t0, %hi(Pico)
470 ins $t0, $a0, 0, 16
471 xori $t0, 1
472 jr $ra
473 lb $v0, %lo(Pico)($t0)
474
475m_read8_above_rom:
476 # might still be SRam (Micro Machines, HardBall '95)
477 m_read_rom_try_sram 0 8
478 m_read8_call16 OtherRead16End
479
480# #############################################################################
481
482.macro m_read16_rom sect
483 lui $t0, %hi(Pico+0x22200)
484 lw $t0, %lo(Pico+0x22200)($t0) # rom
485 ins $a0, $0, 0, 1
486 ins $a0, $0, 19, 13
487.if \sect
488 lui $t1, 8*\sect
489 addu $a0, $t1
490.endif
491 addu $t0, $a0
492 jr $ra
493 lh $v0, 0($t0)
494.endm
495
496
497m_read16_rom0: # 0x000000 - 0x07ffff
498 m_read16_rom 0
499
500m_read16_rom1: # 0x080000 - 0x0fffff
501 m_read16_rom 1
502
503m_read16_rom2: # 0x100000 - 0x17ffff
504 m_read16_rom 2
505
506m_read16_rom3: # 0x180000 - 0x1fffff
507 m_read16_rom 3
508
509m_read16_rom4: # 0x200000 - 0x27ffff, SRAM area
510 m_read_rom_try_sram 1 16
511 lw $t1, 4($t3) # romsize
512 subu $t4, $t1, $a0
513 blez $t4, m_read_null
514 lw $t1, 0($t3) # rom
515 ins $a0, $0, 0, 1
516 addu $t1, $a0
517 jr $ra
518 lh $v0, 0($t1)
519
520m_read16_rom5: # 0x280000 - 0x2fffff
521 m_read16_rom 5
522
523m_read16_rom6: # 0x300000 - 0x37ffff
524 m_read16_rom 6
525
526m_read16_rom7: # 0x380000 - 0x3fffff
527 m_read16_rom 7
528
529m_read16_rom8: # 0x400000 - 0x47ffff
530 m_read16_rom 8
531
532m_read16_rom9: # 0x480000 - 0x4fffff
533 m_read16_rom 9
534
535m_read16_romA: # 0x500000 - 0x57ffff
536 m_read16_rom 0xA
537
538m_read16_romB: # 0x580000 - 0x5fffff
539 m_read16_rom 0xB
540
541m_read16_romC: # 0x600000 - 0x67ffff
542 m_read16_rom 0xC
543
544m_read16_romD: # 0x680000 - 0x6fffff
545 m_read16_rom 0xD
546
547m_read16_romE: # 0x700000 - 0x77ffff
548 m_read16_rom 0xE
549
550m_read16_romF: # 0x780000 - 0x7fffff
551 m_read16_rom 0xF
552
553m_read16_rom10: # 0x800000 - 0x87ffff
554 m_read16_rom 0x10
555
556m_read16_rom11: # 0x880000 - 0x8fffff
557 m_read16_rom 0x11
558
559m_read16_rom12: # 0x900000 - 0x97ffff
560 m_read16_rom 0x12
561
562m_read16_rom13: # 0x980000 - 0x9fffff
563 m_read16_rom 0x13
564
565m_read16_misc:
566 ins $a0, $0, 0, 1
567 j OtherRead16
568 li $a1, 16
569
570m_read16_vdp:
571 ext $t0, $a0, 16, 3
572 andi $t1, $a0, 0xe0
573 or $t0, $t1
574 bnez $t0, m_read_null # invalid address
575 ins $a0, $0, 0, 1
576 j PicoVideoRead
577 nop
578
579m_read16_ram:
580 lui $t0, %hi(Pico)
581 ins $a0, $0, 0, 1
582 ins $t0, $a0, 0, 16
583 jr $ra
584 lh $v0, %lo(Pico)($t0)
585
586m_read16_above_rom:
587 # might still be SRam
588 m_read_rom_try_sram 0 16
589 j OtherRead16End
590 ins $a0, $0, 0, 1
591
592# #############################################################################
593
594.macro m_read32_rom sect
595 lui $t0, %hi(Pico+0x22200)
596 lw $t0, %lo(Pico+0x22200)($t0) # rom
597 ins $a0, $0, 0, 1
598 ins $a0, $0, 19, 13
599.if \sect
600 lui $t1, 8*\sect
601 addu $a0, $t1
602.endif
603 addu $t0, $a0
604 lh $v1, 0($t0)
605 lh $v0, 2($t0)
606 jr $ra
607 ins $v0, $v1, 16, 16
608.endm
609
610
611m_read32_rom0: # 0x000000 - 0x07ffff
612 m_read32_rom 0
613
614m_read32_rom1: # 0x080000 - 0x0fffff
615 m_read32_rom 1
616
617m_read32_rom2: # 0x100000 - 0x17ffff
618 m_read32_rom 2
619
620m_read32_rom3: # 0x180000 - 0x1fffff
621 m_read32_rom 3
622
623m_read32_rom4: # 0x200000 - 0x27ffff, SRAM area
624 m_read_rom_try_sram 1 32
625 lw $t1, 4($t3) # romsize
626 subu $t4, $t1, $a0
627 blez $t4, m_read_null
628 lw $t1, 0($t3) # rom
629 ins $a0, $0, 0, 1
630 addu $t1, $a0
631 lh $v1, 0($t1)
632 lh $v0, 2($t1)
633 jr $ra
634 ins $v0, $v1, 16, 16
635
636m_read32_rom5: # 0x280000 - 0x2fffff
637 m_read32_rom 5
638
639m_read32_rom6: # 0x300000 - 0x37ffff
640 m_read32_rom 6
641
642m_read32_rom7: # 0x380000 - 0x3fffff
643 m_read32_rom 7
644
645m_read32_rom8: # 0x400000 - 0x47ffff
646 m_read32_rom 8
647
648m_read32_rom9: # 0x480000 - 0x4fffff
649 m_read32_rom 9
650
651m_read32_romA: # 0x500000 - 0x57ffff
652 m_read32_rom 0xA
653
654m_read32_romB: # 0x580000 - 0x5fffff
655 m_read32_rom 0xB
656
657m_read32_romC: # 0x600000 - 0x67ffff
658 m_read32_rom 0xC
659
660m_read32_romD: # 0x680000 - 0x6fffff
661 m_read32_rom 0xD
662
663m_read32_romE: # 0x700000 - 0x77ffff
664 m_read32_rom 0xE
665
666m_read32_romF: # 0x780000 - 0x7fffff
667 m_read32_rom 0xF
668
669m_read32_rom10: # 0x800000 - 0x87ffff
670 m_read32_rom 0x10
671
672m_read32_rom11: # 0x880000 - 0x8fffff
673 m_read32_rom 0x11
674
675m_read32_rom12: # 0x900000 - 0x97ffff
676 m_read32_rom 0x12
677
678m_read32_rom13: # 0x980000 - 0x9fffff
679 m_read32_rom 0x13
680
681.macro m_read32_call16 func need_a1=0
682 addiu $sp, -8
683 sw $ra, 0($sp)
684 sw $s0, 4($sp)
685.if \need_a1
686 li $a1, 16
687.endif
688 jal \func
689 move $s0, $a0
690
691 addu $a0, $s0, 2
692.if \need_a1
693 li $a1, 16
694.endif
695 jal \func
696 move $s0, $v0
697
698 ins $v0, $s0, 16, 16
699 lw $ra, 0($sp)
700 lw $s0, 4($sp)
701 jr $ra
702 addiu $sp, 8
703.endm
704
705m_read32_misc:
706 ins $a0, $0, 0, 1
707 m_read32_call16 OtherRead16, 1
708
709m_read32_vdp:
710 ext $t0, $a0, 16, 3
711 andi $t1, $a0, 0xe0
712 or $t0, $t1
713 bnez $t0, m_read_null # invalid address
714 ins $a0, $0, 0, 1
715 m_read32_call16 PicoVideoRead
716
717m_read32_ram:
718 lui $t0, %hi(Pico)
719 ins $a0, $0, 0, 1
720 ins $t0, $a0, 0, 16
721 lh $v1, %lo(Pico)($t0)
722 lh $v0, %lo(Pico+2)($t0)
723 jr $ra
724 ins $v0, $v1, 16, 16
725
726m_read32_above_rom:
727 # might still be SRam
728 m_read_rom_try_sram 0 32
729 ins $a0, $0, 0, 1
730 m_read32_call16 OtherRead16End
731
732# #############################################################################
733
734.macro PicoWriteRomHW_SSF2_ls def_table table
735 lui $t3, %hi(\def_table)
736 ins $t3, $a1, 2, 5
737 lw $t0, %lo(\def_table)($t3)
738 lui $t2, %hi(\table)
739 ins $t2, $a0, 2, 3
740 sw $t0, %lo(\table)($t2)
741.endm
742
743PicoWriteRomHW_SSF2: # u32 a, u32 d
744 ext $a0, $a0, 1, 3
745 bnez $a0, pwr_banking
746
747 # sram register
748 lui $t0, %hi(Pico+0x22211)
749 lb $t1, %lo(Pico+0x22211)($t0) # Pico.m.sram_reg
750 ins $t1, $a1, 0, 2
751 jr $ra
752 sb $t1, %lo(Pico+0x22211)($t0)
753
754pwr_banking:
755 andi $a1, 0x1f
756
757 PicoWriteRomHW_SSF2_ls m_read8_def_table m_read8_table
758 PicoWriteRomHW_SSF2_ls m_read16_def_table m_read16_table
759 PicoWriteRomHW_SSF2_ls m_read32_def_table m_read32_table
760
761 jr $ra
762 nop
763