experimental/main_menu.s

Download file

Release 2026-11-04-r2 · SHA256 2d5026eb963b2b1f82c06a969a470f68f3c0587f950f4c6f6dd21c8305cfe8c9 · Click a line number for a direct link.

1| Main-menu-only responsiveness. Does not skip any SRAM/CRC validation.2| F930..F933 is a volatile guarded menu-lifetime tag, cleared before leaving.3| Original game/pause/statistics audio and repeat readers remain unchanged.4 .equ ACTIVE,0xFFFFF9305 .equ SEEN,0xFFFFF9346 .equ PENDING,0xFFFFF9357 .equ MAGIC,0x4D4EB2B18 .text9 .globl _start10_start:11 bra.w enter12 bra.w leave13 bra.w record_crc14 bra.w reset_crc15 .ascii "MM01"16 bra.w repeat17 bra.w menu_tick18 bra.w bank_sum19 bra.w bank_copy_d020 bra.w bank_copy_d221 bra.w bank_clear22enter:23 jsr 0xFE66024 move.w %sr,-(%sp)25 clr.w SEEN26 move.l #MAGIC,ACTIVE27 move.w (%sp)+,%sr28 rts29leave:30 move.w %sr,-(%sp)31 clr.w SEEN32 clr.l ACTIVE33 move.w (%sp)+,%sr34 jmp 0x2E600035| The original CRC entry has already saved all registers and the caller SR.36| Replay exact displaced setup off-menu. On-menu compute the SAME CCITT CRC37| over all record bytes, with the SAME commit/checksum exclusions.38record_crc:39 cmpi.l #MAGIC,ACTIVE40 beq.s record_fast41 adda.w %d7,%a042 move.w #0xFFFF,%d243 jmp 0x2340B044record_fast:45 adda.w %d7,%a046 move.w #255,%d247 move.w #255,%d548 lea crc_table(%pc),%a249 lea crc_table_low(%pc),%a150 moveq #0,%d151 moveq #14,%d352record_first:53 move.b (%a0),%d154 adda.w %d7,%a055 move.w %d2,%d456 eor.b %d1,%d457 move.b (%a2,%d4.w),%d258 eor.b %d5,%d259 move.b (%a1,%d4.w),%d560 dbra %d3,record_first61 move.w %d7,%d362 lsl.w #2,%d363 adda.w %d3,%a064 move.w #506,%d365record_rest:66 .rept 467 move.b (%a0),%d168 adda.w %d7,%a069 move.w %d2,%d470 eor.b %d1,%d471 move.b (%a2,%d4.w),%d272 eor.b %d5,%d273 move.b (%a1,%d4.w),%d574 .endr75 move.w %d3,%d476 andi.w #7,%d477 bne.s record_next78 bsr.w service_audio79record_next:80 dbra %d3,record_rest81record_done:82 bsr.w service_audio83 lsl.w #8,%d284 or.w %d5,%d285 moveq #0,%d086 move.w %d2,%d087 jmp 0x2340E688| Replay-journal CRC: every one of the8192 bytes is still checked. Binding the89| accepted target slot runs through the original tail at25627A unchanged.90reset_crc:91 cmpi.l #MAGIC,ACTIVE92 beq.s reset_fast93 lea 0x20A000,%a094 jmp 0x25625695reset_fast:96 movem.l %a1-%a2,-(%sp)97 lea 0x20A000,%a098 lea crc_table(%pc),%a199 lea crc_table_low(%pc),%a2100 move.w #255,%d1101 move.w #255,%d2102 move.w #2047,%d3103 moveq #0,%d0104reset_byte:105 .rept 4106 move.b (%a0),%d0107 eor.b %d1,%d0108 move.b (%a1,%d0.w),%d1109 eor.b %d2,%d1110 move.b (%a2,%d0.w),%d2111 addq.l #2,%a0112 .endr113 move.w %d3,%d0114 andi.w #15,%d0115 bne.s reset_no_service116 bsr.w service_audio117reset_no_service:118 dbra %d3,reset_byte119 bsr.w service_audio120 lsl.w #8,%d1121 or.w %d2,%d1122 movem.l (%sp)+,%a1-%a2123 jmp 0x25627A124| Preserve the real native reader's registers/status. Only main-menu fresh125| and held directional repeat delays change; selection/Start buttons do not.126repeat:127 jsr 0x11318128 move.w %sr,-(%sp)129 move.l %d0,-(%sp)130 move.w %d1,%d0131 andi.w #15,%d0132 beq.s repeat_done133 move.w %d2,%d0134 andi.w #15,%d0135 beq.s repeated_direction136 move.w %d3,%d0137 andi.w #15,%d0138 beq.s repeat_done139 move.w #7,0xFFFFB042140 bra.s repeat_done141repeated_direction:142 move.w #2,0xFFFFB042143repeat_done:144 move.l (%sp)+,%d0145 move.w (%sp)+,%sr146 rts147| Keep native music ticking during main-menu checks with IRQs masked.148| HV identifies physical VBlank. Mode5 status.bit7 distinguishes an unacked149| VINT from a previous native tick when a checksum starts just at the boundary.150| This read is only inside main-menu SRAM/checksum code (already status-polled151| by the native DMA waits); it writes no VDP/DMA command or game state.152| Each observed physical VBlank gets one original sound tick. The pending153| real main-menu IRQ subsequently skips its already serviced tick.154service_audio:155 move.w %sr,-(%sp)156 ori.w #0x700,%sr157 cmpi.l #MAGIC,ACTIVE158 bne.s audio_done159 cmpi.l #0x17C42,0xFFFFB03A160 bne.s audio_done161 move.l %d0,-(%sp)162 move.b 0xC00008,%d0163 cmpi.b #224,%d0164 blo.s audio_active165 tst.b SEEN166 beq.s audio_check_vint167 tst.b PENDING168 bne.s audio_restore_d0169audio_check_vint:170 btst #7,0xC00005171 beq.s audio_restore_d0172 st SEEN173 st PENDING174 addq.w #1,0xFFFFB03E175 movem.l %d1-%d7/%a0-%a6,-(%sp)176 jsr 0x1A50A177 movem.l (%sp)+,%d1-%d7/%a0-%a6178 bra.s audio_restore_d0179audio_active:180 clr.b SEEN181audio_restore_d0:182 move.l (%sp)+,%d0183audio_done:184 move.w (%sp)+,%sr185 rts186| Called ONLY by the original main-menu IRQ, after its palette/DMA work.187menu_tick:188 move.b SEEN,%d1189 clr.b SEEN190 move.b 0xC00008,%d0191 cmpi.b #224,%d0192 blo.s tick_pending193 st SEEN194tick_pending:195 tst.b PENDING196 beq.s tick_native197 clr.b PENDING198 tst.b SEEN199 beq.s tick_return200 tst.b %d1201 beq.s tick_native202 bra.s tick_return203tick_native:204 addq.w #1,0xFFFFB03E205 jsr 0x1A50A206tick_return:207 jmp 0x17C6C208| Exact8190-byte additive bank checksum for both validation and commit.209| Called at the two original loops; no metadata or checksum tail is changed.210bank_sum:211 cmpi.l #MAGIC,ACTIVE212 beq.s bank_sum_active213bank_sum_native:214 add.b (%a0),%d0215 addq.l #2,%a0216 dbra %d1,bank_sum_native217 rts218bank_sum_active:219 movem.l %d2-%d3,-(%sp)220 move.w %sr,-(%sp)221 moveq #0,%d2222 move.w %d1,%d2223 addq.l #1,%d2224 move.l %d2,%d3225 lsr.l #4,%d2226 andi.w #15,%d3227 subq.w #1,%d2228 subq.w #1,%d3229 move.w (%sp)+,%sr230 tst.w %d2231 bmi.w bank_sum_no_chunk232bank_sum_chunk:233 .rept 16234 add.b (%a0),%d0235 addq.l #2,%a0236 .endr237 bsr.w service_audio238 dbra %d2,bank_sum_chunk239bank_sum_no_chunk:240 move.w %sr,-(%sp)241 tst.w %d3242 bmi.s bank_sum_no_tail243 addq.l #2,%sp244bank_sum_tail:245 add.b (%a0),%d0246 addq.l #2,%a0247 dbra %d3,bank_sum_tail248 bra.s bank_sum_done249bank_sum_no_tail:250 move.w (%sp)+,%sr251bank_sum_done:252 bsr.w service_audio253 move.w %sr,-(%sp)254 move.w #0xFFFF,%d1255 move.w (%sp)+,%sr256 movem.l (%sp)+,%d2-%d3257 rts258bank_copy_d0:259 cmpi.l #MAGIC,ACTIVE260 beq.s bank_copy_d0_active261bank_copy_d0_native:262 move.b (%a0),(%a1)263 addq.l #2,%a0264 addq.l #2,%a1265 dbra %d0,bank_copy_d0_native266 rts267bank_copy_d0_active:268 movem.l %d1-%d2,-(%sp)269 move.w %sr,-(%sp)270 moveq #0,%d1271 move.w %d0,%d1272 addq.l #1,%d1273 move.l %d1,%d2274 lsr.l #4,%d1275 andi.w #15,%d2276 subq.w #1,%d1277 subq.w #1,%d2278 move.w (%sp)+,%sr279 tst.w %d1280 bmi.w bank_copy_d0_no_chunk281bank_copy_d0_chunk:282 .rept 16283 move.b (%a0),(%a1)284 addq.l #2,%a0285 addq.l #2,%a1286 .endr287 bsr.w service_audio288 dbra %d1,bank_copy_d0_chunk289bank_copy_d0_no_chunk:290 move.w %sr,-(%sp)291 tst.w %d2292 bmi.s bank_copy_d0_no_tail293 addq.l #2,%sp294bank_copy_d0_tail:295 move.b (%a0),(%a1)296 addq.l #2,%a0297 addq.l #2,%a1298 dbra %d2,bank_copy_d0_tail299 bra.s bank_copy_d0_done300bank_copy_d0_no_tail:301 move.w (%sp)+,%sr302bank_copy_d0_done:303 bsr.w service_audio304 move.w %sr,-(%sp)305 move.w #0xFFFF,%d0306 move.w (%sp)+,%sr307 movem.l (%sp)+,%d1-%d2308 rts309bank_copy_d2:310 cmpi.l #MAGIC,ACTIVE311 beq.s bank_copy_d2_active312bank_copy_d2_native:313 move.b (%a0),(%a1)314 addq.l #2,%a0315 addq.l #2,%a1316 dbra %d2,bank_copy_d2_native317 rts318bank_copy_d2_active:319 movem.l %d0-%d1,-(%sp)320 move.w %sr,-(%sp)321 moveq #0,%d0322 move.w %d2,%d0323 addq.l #1,%d0324 move.l %d0,%d1325 lsr.l #4,%d0326 andi.w #15,%d1327 subq.w #1,%d0328 subq.w #1,%d1329 move.w (%sp)+,%sr330 tst.w %d0331 bmi.w bank_copy_d2_no_chunk332bank_copy_d2_chunk:333 .rept 16334 move.b (%a0),(%a1)335 addq.l #2,%a0336 addq.l #2,%a1337 .endr338 bsr.w service_audio339 dbra %d0,bank_copy_d2_chunk340bank_copy_d2_no_chunk:341 move.w %sr,-(%sp)342 tst.w %d1343 bmi.s bank_copy_d2_no_tail344 addq.l #2,%sp345bank_copy_d2_tail:346 move.b (%a0),(%a1)347 addq.l #2,%a0348 addq.l #2,%a1349 dbra %d1,bank_copy_d2_tail350 bra.s bank_copy_d2_done351bank_copy_d2_no_tail:352 move.w (%sp)+,%sr353bank_copy_d2_done:354 bsr.w service_audio355 move.w %sr,-(%sp)356 move.w #0xFFFF,%d2357 move.w (%sp)+,%sr358 movem.l (%sp)+,%d0-%d1359 rts360bank_clear:361 cmpi.l #MAGIC,ACTIVE362 beq.s bank_clear_active363bank_clear_native:364 clr.b (%a0)365 addq.l #2,%a0366 dbra %d0,bank_clear_native367 rts368bank_clear_active:369 movem.l %d1-%d2,-(%sp)370 move.w %sr,-(%sp)371 moveq #0,%d1372 move.w %d0,%d1373 addq.l #1,%d1374 move.l %d1,%d2375 lsr.l #4,%d1376 andi.w #15,%d2377 subq.w #1,%d1378 subq.w #1,%d2379 move.w (%sp)+,%sr380 tst.w %d1381 bmi.w bank_clear_no_chunk382bank_clear_chunk:383 .rept 16384 clr.b (%a0)385 addq.l #2,%a0386 .endr387 bsr.w service_audio388 dbra %d1,bank_clear_chunk389bank_clear_no_chunk:390 move.w %sr,-(%sp)391 tst.w %d2392 bmi.s bank_clear_no_tail393 addq.l #2,%sp394bank_clear_tail:395 clr.b (%a0)396 addq.l #2,%a0397 dbra %d2,bank_clear_tail398 bra.s bank_clear_done399bank_clear_no_tail:400 move.w (%sp)+,%sr401bank_clear_done:402 bsr.w service_audio403 move.w %sr,-(%sp)404 move.w #0xFFFF,%d0405 move.w (%sp)+,%sr406 movem.l (%sp)+,%d1-%d2407 rts408 .org 0x800409crc_table:410 .byte 0x00,0x10,0x20,0x30,0x40,0x50,0x60,0x70,0x81,0x91,0xA1,0xB1,0xC1,0xD1,0xE1,0xF1411 .byte 0x12,0x02,0x32,0x22,0x52,0x42,0x72,0x62,0x93,0x83,0xB3,0xA3,0xD3,0xC3,0xF3,0xE3412 .byte 0x24,0x34,0x04,0x14,0x64,0x74,0x44,0x54,0xA5,0xB5,0x85,0x95,0xE5,0xF5,0xC5,0xD5413 .byte 0x36,0x26,0x16,0x06,0x76,0x66,0x56,0x46,0xB7,0xA7,0x97,0x87,0xF7,0xE7,0xD7,0xC7414 .byte 0x48,0x58,0x68,0x78,0x08,0x18,0x28,0x38,0xC9,0xD9,0xE9,0xF9,0x89,0x99,0xA9,0xB9415 .byte 0x5A,0x4A,0x7A,0x6A,0x1A,0x0A,0x3A,0x2A,0xDB,0xCB,0xFB,0xEB,0x9B,0x8B,0xBB,0xAB416 .byte 0x6C,0x7C,0x4C,0x5C,0x2C,0x3C,0x0C,0x1C,0xED,0xFD,0xCD,0xDD,0xAD,0xBD,0x8D,0x9D417 .byte 0x7E,0x6E,0x5E,0x4E,0x3E,0x2E,0x1E,0x0E,0xFF,0xEF,0xDF,0xCF,0xBF,0xAF,0x9F,0x8F418 .byte 0x91,0x81,0xB1,0xA1,0xD1,0xC1,0xF1,0xE1,0x10,0x00,0x30,0x20,0x50,0x40,0x70,0x60419 .byte 0x83,0x93,0xA3,0xB3,0xC3,0xD3,0xE3,0xF3,0x02,0x12,0x22,0x32,0x42,0x52,0x62,0x72420 .byte 0xB5,0xA5,0x95,0x85,0xF5,0xE5,0xD5,0xC5,0x34,0x24,0x14,0x04,0x74,0x64,0x54,0x44421 .byte 0xA7,0xB7,0x87,0x97,0xE7,0xF7,0xC7,0xD7,0x26,0x36,0x06,0x16,0x66,0x76,0x46,0x56422 .byte 0xD9,0xC9,0xF9,0xE9,0x99,0x89,0xB9,0xA9,0x58,0x48,0x78,0x68,0x18,0x08,0x38,0x28423 .byte 0xCB,0xDB,0xEB,0xFB,0x8B,0x9B,0xAB,0xBB,0x4A,0x5A,0x6A,0x7A,0x0A,0x1A,0x2A,0x3A424 .byte 0xFD,0xED,0xDD,0xCD,0xBD,0xAD,0x9D,0x8D,0x7C,0x6C,0x5C,0x4C,0x3C,0x2C,0x1C,0x0C425 .byte 0xEF,0xFF,0xCF,0xDF,0xAF,0xBF,0x8F,0x9F,0x6E,0x7E,0x4E,0x5E,0x2E,0x3E,0x0E,0x1E426crc_table_low:427 .byte 0x00,0x21,0x42,0x63,0x84,0xA5,0xC6,0xE7,0x08,0x29,0x4A,0x6B,0x8C,0xAD,0xCE,0xEF428 .byte 0x31,0x10,0x73,0x52,0xB5,0x94,0xF7,0xD6,0x39,0x18,0x7B,0x5A,0xBD,0x9C,0xFF,0xDE429 .byte 0x62,0x43,0x20,0x01,0xE6,0xC7,0xA4,0x85,0x6A,0x4B,0x28,0x09,0xEE,0xCF,0xAC,0x8D430 .byte 0x53,0x72,0x11,0x30,0xD7,0xF6,0x95,0xB4,0x5B,0x7A,0x19,0x38,0xDF,0xFE,0x9D,0xBC431 .byte 0xC4,0xE5,0x86,0xA7,0x40,0x61,0x02,0x23,0xCC,0xED,0x8E,0xAF,0x48,0x69,0x0A,0x2B432 .byte 0xF5,0xD4,0xB7,0x96,0x71,0x50,0x33,0x12,0xFD,0xDC,0xBF,0x9E,0x79,0x58,0x3B,0x1A433 .byte 0xA6,0x87,0xE4,0xC5,0x22,0x03,0x60,0x41,0xAE,0x8F,0xEC,0xCD,0x2A,0x0B,0x68,0x49434 .byte 0x97,0xB6,0xD5,0xF4,0x13,0x32,0x51,0x70,0x9F,0xBE,0xDD,0xFC,0x1B,0x3A,0x59,0x78435 .byte 0x88,0xA9,0xCA,0xEB,0x0C,0x2D,0x4E,0x6F,0x80,0xA1,0xC2,0xE3,0x04,0x25,0x46,0x67436 .byte 0xB9,0x98,0xFB,0xDA,0x3D,0x1C,0x7F,0x5E,0xB1,0x90,0xF3,0xD2,0x35,0x14,0x77,0x56437 .byte 0xEA,0xCB,0xA8,0x89,0x6E,0x4F,0x2C,0x0D,0xE2,0xC3,0xA0,0x81,0x66,0x47,0x24,0x05438 .byte 0xDB,0xFA,0x99,0xB8,0x5F,0x7E,0x1D,0x3C,0xD3,0xF2,0x91,0xB0,0x57,0x76,0x15,0x34439 .byte 0x4C,0x6D,0x0E,0x2F,0xC8,0xE9,0x8A,0xAB,0x44,0x65,0x06,0x27,0xC0,0xE1,0x82,0xA3440 .byte 0x7D,0x5C,0x3F,0x1E,0xF9,0xD8,0xBB,0x9A,0x75,0x54,0x37,0x16,0xF1,0xD0,0xB3,0x92441 .byte 0x2E,0x0F,0x6C,0x4D,0xAA,0x8B,0xE8,0xC9,0x26,0x07,0x64,0x45,0xA2,0x83,0xE0,0xC1442 .byte 0x1F,0x3E,0x5D,0x7C,0x9B,0xBA,0xD9,0xF8,0x17,0x36,0x55,0x74,0x93,0xB2,0xD1,0xF0443