Release 2026-11-04-r2 · SHA256 3cfd9ffe3318820f0c1d9299c87d47088d7b4026d7cb01822a73a3ffd1eda825 · Click a line number for a direct link.
1 .ifndef WITH_TRANSFERS2 .equ WITH_TRANSFERS,03 .endif4 .equ TRANSFER_ROW_SHIFT,2*WITH_TRANSFERS5 .ifndef WITH_MOMENTUM6 .equ WITH_MOMENTUM,07 .endif8 .ifndef WITH_FACEOFF_DOTS9 .equ WITH_FACEOFF_DOTS,010 .endif11 .ifndef WITH_AI_SHOT_PLAN12 .equ WITH_AI_SHOT_PLAN,013 .endif14 .ifndef WITH_STRICT_SO15 .equ WITH_STRICT_SO,016 .endif17 .ifndef WITH_ALT_GOALIES18 .equ WITH_ALT_GOALIES,019 .endif20 .ifndef WITH_PICKUP_DELAY21 .equ WITH_PICKUP_DELAY,022 .endif23 .ifndef WITH_PASS_CHARGE24 .equ WITH_PASS_CHARGE,025 .endif26 .ifndef WITH_PENALTY_RATE27 .equ WITH_PENALTY_RATE,028 .endif29 .ifndef WITH_DIRECTIONAL30 .equ WITH_DIRECTIONAL,031 .endif32 .ifndef WITH_PASS_SPEED33 .equ WITH_PASS_SPEED,034 .endif35 .ifndef WITH_PASS_HEIGHT36 .equ WITH_PASS_HEIGHT,037 .endif38 .ifndef ICING_DEFAULT39 .equ ICING_DEFAULT,040 .endif41 .ifndef WITH_PREF_DEFAULTS42 .equ WITH_PREF_DEFAULTS,143 .endif44 .ifndef WITH_ICING_MENU45 .equ WITH_ICING_MENU,146 .endif47 .ifndef WITH_CRIT_OPTION48 .equ WITH_CRIT_OPTION,149 .endif50| Per-season human count, including Continue Playoffs. Optional PC record in51| unused logical SRAM1EF0..1EF3 follows each slot's existing snapshot/checksum.52| +0 load (mapper enabled), +4 store, +8 menu step (D2 direction,D3 result),53| +12 label (D0 pointer), +16 league settings, +20 playoff settings, +24 cursor.54 .equ COUNT,0xFFFFF0D0 | preferred1..4; F0D2 is the existing playoff-game flag55 .equ TM,0xFFFFF07C56 .equ MTAP,0xFFFFD04657 .equ PLAYERS,0xFFFFD04A58 .equ PMODE,0xFFFFD04859 .equ RECORD,0x203DE1 | logical1EF0, physical odd bytes: P,C,count,~count60 .equ MAP,0xA130F161 .equ NCOUNT,0xFFFFF0DA | standalone:1One,2Two coop,3Three,4Four,5Two head-to-head62 .equ DIFF,0xFFFFF07A | crowd.s Difficulty: 0 Normal, 1 Hard, 2 Easy63 .equ DREC,0x203DE9 | r36: logical1EF4..1EF5 = difficulty, ~difficulty (was unused)64 .equ SREC,0x203FED | logical1FF6..1FFD: U adds Icing at1FFD to the XOR; old S/T accepted as On.65 | Per.Length, Goalie Ctrl, Penalties,66 | Line Changes, Fighting, xor check (was unused; NHL94 forum report:67 | the season's settings came back as the start-up defaults, locked)68 .equ EXTRA,0x203D59 | old per-slot D046..D087 snapshot, logical 1EAC69 .equ NRECORD,0x205C29 | logical2E14..2E17, after the standalone NPO1 context70 .text71 .globl _start72_start:73 bra.w load74 bra.w store75 bra.w step76 bra.w label77 bra.w league78 bra.w playoff79 bra.w cursor80 bra.w native_load | +28 mapper already enabled by slots.ctxload81 bra.w native_step | +3282 bra.w native_label | +3683 bra.w native_sides | +4084 bra.w writer | +44 native/season writer dispatch85 bra.w display | +48 native/season value-label dispatch86 bra.w diffstore | +52 r36: season difficulty record (crowd.s, each new game)87 bra.w openrow | +56 compatibility entry: started seasons never unlock88 bra.w startsettings | +60 freeze/restore settings before native match preparation8990cursor: | native Continue skips Players/Home/Away; expose Players only for seasons91 tst.w 0xFFFFF06C92 beq.s cursor_row93 cmpi.w #3,0xFFFFE3F094 bne.s native_cursor95cursor_row:96 cmpi.w #2,%d797 bne.s native_cursor98 tst.w %d7 | clear Z: bypass the native Continue row-skip test99 rts100native_cursor:101 cmpi.w #1,PMODE102 rts103104load:105 movem.l %d0-%d2/%a0-%a1,-(%sp)106 clr.w DIFF | played legacy fallback remains Normal107 .if WITH_PREF_DEFAULTS108 tst.b 0x202011109 bne.s default_difficulty_ready110 tst.b 0x202013111 bne.s default_difficulty_ready112 move.w #1,DIFF | a fresh empty season starts Hard, as requested113default_difficulty_ready:114 .endif115 move.b DREC,%d0 | r36 (jdc: Easy came back as Normal after a restart, then116 cmpi.b #2,%d0 | locked): the slot's own difficulty, when it has one117 bhi.s 1f118 move.b %d0,%d1119 not.b %d1120 cmp.b DREC+2,%d1121 bne.s 1f122 andi.w #3,%d0123 move.w %d0,DIFF1241: bsr.w loadsettings125 .if WITH_PASS_HEIGHT126 jsr 0x2DE404127 .endif1283:129 lea RECORD,%a0130 cmpi.b #0x50,(%a0)131 bne.s legacy132 cmpi.b #0x43,2(%a0)133 bne.s legacy134 moveq #0,%d0135 move.b 4(%a0),%d0136 cmpi.w #1,%d0137 bcs.s legacy138 cmpi.w #4,%d0139 bhi.s legacy140 move.b %d0,%d1141 not.b %d1142 cmp.b 6(%a0),%d1143 beq.s loaded144legacy:145 moveq #1,%d0146 tst.w PMODE147 bne.s old_playoff148 cmpi.w #3,PLAYERS149 beq.s old_two150 moveq #3,%d0151 cmpi.w #5,PLAYERS152 beq.s loaded153 moveq #4,%d0154 cmpi.w #6,PLAYERS155 beq.s loaded156 moveq #1,%d0157 bra.s loaded158old_playoff:159 cmpi.w #6,PLAYERS160 beq.s old_two161 cmpi.w #8,PLAYERS162 bne.s loaded163old_two:164 moveq #2,%d0165loaded:166 move.w %d0,COUNT167 bsr.w effective168 tst.w PMODE169 bne.s loaded_done | force applies playoff encoding after native password decode170 bsr.w league_value171 move.w %d0,PLAYERS172loaded_done:173 movem.l (%sp)+,%d0-%d2/%a0-%a1174 rts175176| Never erase a saved four-pad preference merely because the adapter is absent.177effective: | D0=effective1..4; synchronize TM, preserve preferred COUNT178 move.w COUNT,%d0179 cmpi.w #1,%d0180 bcs.s one181 cmpi.w #4,%d0182 bls.s count_valid183one:moveq #1,%d0184count_valid:185 tst.w MTAP186 bne.s adapter187 cmpi.w #2,%d0188 bls.s adapter189 moveq #2,%d0190adapter:191 clr.w TM192 cmpi.w #3,%d0193 bcs.s effective_done194 move.w %d0,TM195effective_done:196 rts197league_value: | D0 count -> native Regular Season Players198 subq.w #1,%d0199 add.w %d0,%d0200 lea league_values(%pc),%a0201 move.w (%a0,%d0.w),%d0202 rts203league:204 movem.l %d0/%a0,-(%sp)205 bsr.s effective206 bsr.s league_value207 move.w %d0,PLAYERS208 movem.l (%sp)+,%d0/%a0209 rts210211playoff: | after native17CA0/17D16; keep bracket/password/club untouched212 move.l %d0,-(%sp)213 bsr.s effective214 cmpi.w #2,%d0215 bcs.s po_one216 moveq #1,%d0 | native saved co-op side encoding without adapter217 tst.w MTAP218 beq.s po_encoded219 moveq #3,%d0 | adapter table's two-on-one entry220 bra.s po_encoded221po_one:222 moveq #0,%d0223po_encoded:224 move.w %d0,0xFFFFCEF0225 moveq #7,%d0226 tst.w MTAP227 beq.s po_players228 moveq #11,%d0229po_players:230 sub.w 0xFFFFCEF0,%d0231 move.w %d0,PLAYERS232 move.l (%sp)+,%d0233 rts234235step: | one real native key (caller excludes unchanged-row writes)236 movem.l %d0-%d1/%a0,-(%sp)237 bsr.w effective238 moveq #2,%d1239 tst.w MTAP240 beq.s max_ready241 moveq #4,%d1242max_ready:243 tst.w %d2244 bmi.s left245 addq.w #1,%d0246 cmp.w %d1,%d0247 bls.s selected248 moveq #1,%d0249 bra.s selected250left:251 subq.w #1,%d0252 bne.s selected253 move.w %d1,%d0254selected:255 move.w %d0,COUNT256 bsr.w store257 tst.w PMODE258 bne.s step_po259 bsr.w league260 bra.s step_ready261step_po:262 bsr.w playoff263step_ready:264 move.w PLAYERS,%d3265 movem.l (%sp)+,%d0-%d1/%a0266 rts267268label: | D0 points at native word22 +22chars; all other registers kept269 move.l %a0,-(%sp)270 bsr.w effective271 subq.w #1,%d0272 mulu.w #24,%d0273 lea labels(%pc),%a0274 adda.w %d0,%a0275 move.l %a0,%d0276 movea.l (%sp)+,%a0277 rts278279store: | active slot only; native slot manager snapshots it on switch280 movem.l %d0-%d2/%a0-%a1,-(%sp)281 move.w %sr,-(%sp)282 ori.w #0x700,%sr283 move.b #1,MAP284 lea RECORD,%a0285 move.b #0x50,(%a0)286 move.b #0x43,2(%a0)287 move.w COUNT,%d0288 move.b %d0,4(%a0)289 not.b %d0290 move.b %d0,6(%a0)291 .if WITH_PASS_HEIGHT292 jsr 0x2DE408293 .endif294resum:295 lea 0x200001,%a0296 moveq #0,%d0297 move.w #0x1FFE-1,%d1298sum:299 add.b (%a0),%d0300 addq.l #2,%a0301 dbra %d1,sum302 not.b %d0303 move.b %d0,(%a0)304 not.b %d0305 move.b %d0,2(%a0)306 move.b #0,MAP307 move.w (%sp)+,%sr308 movem.l (%sp)+,%d0-%d2/%a0-%a1309 rts310311| r36: the season's difficulty into the active slot (season view only; same stack frame and312| checksum tail as store). Nothing is written when the record already holds it.313diffstore:314 tst.w 0xFFFFF06C315 beq.w 9f316 cmpi.w #2,DIFF317 bhi.w 9f318 movem.l %d0-%d2/%a0-%a1,-(%sp)319 move.w %sr,-(%sp)320 ori.w #0x700,%sr321 move.b #1,MAP322 moveq #0,%d2 | becomes 1 when a byte changes323 lea DREC,%a0324 move.w DIFF,%d0325 bsr.w putb326 not.b %d0327 addq.l #2,%a0328 bsr.w putb329 bsr.w settingsvalid | first Start captured menu values before Auto normalizes330 beq.w settingsready | never overwrite that record with in-game D058=0331 lea SREC,%a0 | Per.Length, Goalie Ctrl, Penalties, Line Changes, Fighting332 .if WITH_ICING_MENU333 moveq #0x55,%d0334 .else335 moveq #0x54,%d0336 .endif337 bsr.w putb338 moveq #0x5A,%d1339 move.w 0xFFFFD050,%d0340 bsr.w putx341 move.w 0xFFFFD052,%d0342 bsr.w putx343 move.w 0xFFFFD056,%d0344 bsr.w putx345 move.w 0xFFFFD058,%d0346 bsr.w putx347 move.w 0xFFFFF004,%d0348 bsr.w putx349 .if WITH_ICING_MENU350 move.w 0xFFFFF0EE,%d0351 eor.b %d0,%d1352 move.l %a0,-(%sp)353 addq.l #4,%a0 | logical1FFD, final free byte before the native bank CRC354 bsr.w putb355 movea.l (%sp)+,%a0356 .endif357 move.b %d1,%d0358 addq.l #2,%a0359 bsr.w putb360settingsready:361 tst.w %d2362 bne.w resum | something changed: new checksum (store's tail)363 move.b #0,MAP364 move.w (%sp)+,%sr365 movem.l (%sp)+,%d0-%d2/%a0-%a13669: rts367| Compatibility entry remains at +56, but migration never unlocks a played season.368openrow:369 andi.b #0xFB,%ccr370 rts371372| Validate every enum as well as the XOR. D0=0/Z on valid, -1/not-Z otherwise.373settingsvalid:374 lea SREC,%a0375 .if WITH_ICING_MENU376 cmpi.b #0x55,(%a0)377 beq.s validtag378 .endif379 cmpi.b #0x54,(%a0) | corrected pre-match record380 beq.s validtag381 cmpi.b #0x53,(%a0) | accept the earlier in-game record382 bne.s invalidsettings383validtag:384 moveq #0x5A,%d1385 lea limits(%pc),%a1386 moveq #4,%d0387 move.w %d2,-(%sp)388checksetting:389 addq.l #2,%a0390 move.b (%a0),%d2391 cmp.b (%a1)+,%d2392 bhi.s badsetting393 eor.b %d2,%d1394 dbra %d0,checksetting395 .if WITH_ICING_MENU396 cmpi.b #0x55,SREC397 bne.s oldcheck398 move.b 4(%a0),%d2399 cmpi.b #1,%d2400 bhi.s badsetting401 eor.b %d2,%d1402oldcheck:403 .endif404 cmp.b 2(%a0),%d1405 movem.w (%sp)+,%d2 | preserve the checksum compare flags406 bne.s invalidsettings407 moveq #0,%d0408 rts409badsetting:410 move.w (%sp)+,%d2411invalidsettings:412 moveq #-1,%d0413 rts414limits: .byte 3,1,2,2,1415 .even416417loadsettings:418 move.l %a1,-(%sp)419 bsr.s settingsvalid420 bne.w legacysettings421 lea SREC,%a0422 moveq #0,%d0423 move.b 2(%a0),%d0424 move.w %d0,0xFFFFD050425 move.b 4(%a0),%d0426 move.w %d0,0xFFFFD052427 move.b 6(%a0),%d0428 move.w %d0,0xFFFFD056429 move.b 8(%a0),%d0430 move.w %d0,0xFFFFD058431 move.w %d0,0xFFFFD072432 move.b 10(%a0),%d0433 move.w %d0,0xFFFFF004434 .if WITH_ICING_MENU435 clr.w 0xFFFFF0EE | old S/T records always retain native Icing On436 cmpi.b #0x55,SREC437 bne.s icingloaded438 moveq #0,%d0439 move.b 14(%a0),%d0440 move.w %d0,0xFFFFF0EE441icingloaded:442 .endif443 cmpi.b #0x53,SREC | old S record could have stored normalized Auto as On444 bne.w settingsloaded445 tst.w 0xFFFFD058446 bne.w settingsloaded447 cmpi.b #0x53,0x203D41448 bne.w settingsloaded449 cmpi.b #0x33,0x203D43450 bne.w settingsloaded451 cmpi.b #0x53,0x203D45452 bne.w settingsloaded453 cmpi.b #0x56,0x203D47454 bne.w settingsloaded455 cmpi.b #2,EXTRA+90 | old snapshot retains D072=Auto456 bne.w settingsloaded457 tst.b EXTRA+88458 bne.w settingsloaded459 move.w #2,0xFFFFD058460 move.w #2,0xFFFFD072461 bra.w settingsloaded462legacysettings:463 .if WITH_ICING_MENU464 clr.w 0xFFFFF0EE | played absent/corrupt old records preserve native Icing On465 .if WITH_PREF_DEFAULTS466 tst.b 0x202011467 bne.s legacy_icing_ready468 tst.b 0x202013469 bne.s legacy_icing_ready470 move.w #ICING_DEFAULT,0xFFFFF0EE | fresh Icing On; valid saved choices still win471legacy_icing_ready:472 .endif473 .endif474 | Empty/new slots retain editable menu choices. Played old seasons stay475 | locked and recover four values from their old slot snapshot when present.476 tst.b 0x202011 | logical1008 games played, high then low477 bne.s oldplayed478 tst.b 0x202013479 beq.w settingsloaded480oldplayed:481 clr.w 0xFFFFD050 | explicit legacy fallback, not another slot's RAM482 clr.w 0xFFFFD052483 move.w #2,0xFFFFD056484 move.w #2,0xFFFFD058485 move.w #2,0xFFFFD072486 clr.w 0xFFFFF004 | Fighting was never in the old snapshot; default Off487 cmpi.b #0x53,0x203D41488 bne.w settingsloaded489 cmpi.b #0x33,0x203D43490 bne.w settingsloaded491 cmpi.b #0x53,0x203D45492 bne.w settingsloaded493 cmpi.b #0x56,0x203D47494 bne.w settingsloaded495 lea EXTRA,%a0496 moveq #0,%d0497 move.b 20(%a0),%d0 | high byte must be zero for every enum498 bne.w settingsloaded499 move.b 22(%a0),%d0500 cmpi.w #3,%d0501 bhi.w settingsloaded502 move.w %d0,0xFFFFD050503 moveq #0,%d0504 move.b 24(%a0),%d0505 bne.w settingsloaded506 move.b 26(%a0),%d0507 cmpi.w #1,%d0508 bhi.w settingsloaded509 move.w %d0,0xFFFFD052510 moveq #0,%d0511 move.b 32(%a0),%d0512 bne.w settingsloaded513 move.b 34(%a0),%d0514 cmpi.w #2,%d0515 bhi.w settingsloaded516 move.w %d0,0xFFFFD056517 moveq #0,%d0518 move.b 88(%a0),%d0 | D072 is the original Auto/On/Off menu value519 bne.w settingsloaded520 move.b 90(%a0),%d0521 cmpi.w #2,%d0522 bhi.w settingsloaded523 move.w %d0,0xFFFFD058524 move.w %d0,0xFFFFD072525settingsloaded:526 movea.l (%sp)+,%a1527 rts528529startsettings:530 tst.w 0xFFFFF06C531 beq.s startdone532 movem.l %d0-%d2/%a0-%a1,-(%sp)533 move.w %sr,-(%sp)534 ori.w #0x700,%sr535 move.b #1,MAP536 tst.b 0x202011537 bne.s restorelocked538 tst.b 0x202013539 bne.s restorelocked540 clr.b SREC | a new season freezes its chosen menu values, not old ones541 bra.s capturemenu542restorelocked:543 move.w PLAYERS,%d2 | seasonmenu already chose Home/Visitor for this fixture544 bsr.w load | restore before any native match normalization545 tst.w PMODE546 bne.s restoredside547 cmpi.w #1,COUNT548 bne.s restoredside549 cmpi.w #1,%d2550 bcs.s restoredside551 cmpi.w #2,%d2552 bhi.s restoredside553 move.w %d2,PLAYERS | loading the count must not turn an away human into Home554restoredside:555 cmpi.b #0x53,SREC556 bne.s capturemenu557 clr.b SREC | promote recovered old S record to pre-match T format558capturemenu:559 move.b #0,MAP560 bsr.w diffstore561 move.w (%sp)+,%sr562 movem.l (%sp)+,%d0-%d2/%a0-%a1563startdone:564 rts565566putx: | next byte = d0, folded into the xor check d1567 addq.l #2,%a0568 eor.b %d0,%d1569putb: | (a0) = d0 unless it already is; d2 = 1 on a change570 cmp.b (%a0),%d0571 beq.s 1f572 move.b %d0,(%a0)573 moveq #1,%d25741: rts575576league_values: .word 1,3,5,6577labels:578 .word 22579 .ascii "One "580 .word 22581 .ascii "Two - Teammates "582 .word 22583 .ascii "Three - Teammates "584 .word 22585 .ascii "Four - Teammates "586 .even587588| Standalone native playoffs own a separate optional NC record in the Full589| bank's shared-profile gap. A season slot's PC preference is never changed.590native_load:591 .if WITH_PASS_HEIGHT592 jsr 0x2DE404593 .endif594 movem.l %d0/%a0,-(%sp)595 move.w #1,NCOUNT596 lea NRECORD,%a0597 cmpi.b #0x4E,(%a0)598 bne.s nloaded599 cmpi.b #0x43,2(%a0)600 bne.s nloaded601 moveq #0,%d0602 move.b 4(%a0),%d0603 cmpi.w #1,%d0604 bcs.s nloaded605 cmpi.w #5,%d0606 bhi.s nloaded607 not.b %d0608 cmp.b 6(%a0),%d0609 bne.s nloaded610 not.b %d0611 move.w %d0,NCOUNT612nloaded:613 movem.l (%sp)+,%d0/%a0614 rts615native_effective: | D0 preference code, clamp Three/Four only with no adapter616 move.w NCOUNT,%d0617 cmpi.w #1,%d0618 bcs.s none619 cmpi.w #5,%d0620 bls.s nvalid621none:moveq #1,%d0622nvalid:623 tst.w MTAP624 bne.s neffective625 cmpi.w #3,%d0626 bcs.s neffective627 cmpi.w #4,%d0628 bhi.s neffective629 moveq #2,%d0630neffective:631 rts632native_sides:633 btst #0,0xFFFFC2FA | the existing two-actor shootout controls remain authoritative634 bne.w nsides_done635 movem.l %d0-%d2,-(%sp)636 bsr.s native_effective637 clr.w TM638 cmpi.w #5,%d0639 beq.s nhead640 cmpi.w #3,%d0641 bcs.s ntm_ready642 move.w %d0,TM643ntm_ready:644 moveq #0,%d1645 cmpi.w #1,%d0646 beq.s nencoded647 moveq #1,%d1648 tst.w MTAP649 beq.s nencoded650 moveq #3,%d1651 bra.s nencoded652nhead:653 moveq #2,%d1654 tst.w MTAP655 beq.s nencoded656 moveq #4,%d1657nencoded:658 move.w %d1,0xFFFFCEF0659 moveq #7,%d2660 tst.w MTAP661 beq.s nplayers662 moveq #11,%d2663nplayers:664 sub.w %d1,%d2665 move.w %d2,PLAYERS666 move.w 0xFFFFC328,%d2 | native bracket assignment still picks the user's club/side667 cmpi.w #1,%d2668 bcs.s nsides_restore669 cmpi.w #2,%d2670 bhi.s nsides_restore671 clr.w 0xFFFFC32A672 clr.l 0xFFFFC32C673 cmpi.w #1,%d0674 beq.s nsides_restore675 cmpi.w #5,%d0676 bne.s nteammates677 neg.w %d2678 addq.w #3,%d2679nteammates:680 move.w %d2,0xFFFFC32A681nsides_restore:682 movem.l (%sp)+,%d0-%d2683nsides_done:684 rts685native_step:686 movem.l %d0-%d1,-(%sp)687 bsr.w native_effective688 tst.w %d2689 bmi.s nleft690 addq.w #1,%d0691 tst.w MTAP692 bne.s nright_wrap693 cmpi.w #3,%d0694 bne.s nright_wrap695 moveq #5,%d0696nright_wrap:697 cmpi.w #5,%d0698 bls.s nselected699 moveq #1,%d0700 bra.s nselected701nleft:702 subq.w #1,%d0703 bne.s nleft_skip704 moveq #5,%d0705nleft_skip:706 tst.w MTAP707 bne.s nselected708 cmpi.w #4,%d0709 bne.s nselected710 moveq #2,%d0711nselected:712 move.w %d0,NCOUNT713 bsr.w native_store714 bsr.w native_sides715 move.w PLAYERS,%d3716 movem.l (%sp)+,%d0-%d1717 rts718native_label:719 move.l %a0,-(%sp)720 bsr.w native_effective721 cmpi.w #5,%d0722 beq.s nhead_label723 subq.w #1,%d0724 mulu.w #24,%d0725 lea labels(%pc),%a0726 adda.w %d0,%a0727 bra.s nlabel_ready728nhead_label:729 lea headlabel(%pc),%a0730nlabel_ready:731 move.l %a0,%d0732 movea.l (%sp)+,%a0733 rts734native_store:735 movem.l %d0-%d1/%a0,-(%sp)736 move.w %sr,-(%sp)737 ori.w #0x700,%sr738 move.b #1,MAP739 lea NRECORD,%a0740 move.b #0x4E,(%a0)741 move.b #0x43,2(%a0)742 move.w NCOUNT,%d0743 move.b %d0,4(%a0)744 not.b %d0745 move.b %d0,6(%a0)746 lea 0x204001,%a0 | Full bank only; active season preference/checksum untouched747 moveq #0,%d0748 move.w #0x1FFE-1,%d1749nsum:750 add.b (%a0),%d0751 addq.l #2,%a0752 dbra %d1,nsum753 not.b %d0754 move.b %d0,(%a0)755 not.b %d0756 move.b %d0,2(%a0)757 move.b #0,MAP758 move.w (%sp)+,%sr759 movem.l (%sp)+,%d0-%d1/%a0760 rts761is_native_players:762 tst.w 0xFFFFF06C763 bne.s not_native764 cmpi.w #2,%d7765 bne.s not_native766 tst.w PMODE767 beq.s not_native768 cmpi.w #3,PMODE769 bhi.s not_native770 tst.w PMODE | nonzero: handled by native helpers771 rts772not_native:773 cmp.w %d7,%d7 | Z=1: keep existing season/native path774 rts775writer:776 .if WITH_QUICKGAME777 tst.w 0xFFFFF84C778 beq.s ordinary_writer779 cmpi.w #2,%d7780 bne.s ordinary_writer781 cmp.w PLAYERS,%d3782 beq.s quick_write_flags783 jsr 0x229008784quick_write_flags:785 tst.w %d2786 rts787ordinary_writer:788 .endif789 .if WITH_TRANSFERS790 cmpi.w #26,%d7791 bne.s not_transfer_writer792 jmp 0x254004793not_transfer_writer:794 .endif795 .if WITH_MOMENTUM796 cmpi.w #48+TRANSFER_ROW_SHIFT,%d7797 bne.s not_momentum_writer798 jmp 0x2E680C799not_momentum_writer:800 .endif801 .if WITH_FACEOFF_DOTS802 cmpi.w #46+TRANSFER_ROW_SHIFT,%d7803 bne.s not_dots_writer804 jmp 0x2E680C805not_dots_writer:806 .endif807 .if WITH_AI_SHOT_PLAN808 cmpi.w #44+TRANSFER_ROW_SHIFT,%d7809 bne.s not_plan_writer810 jmp 0x2E680C811not_plan_writer:812 .endif813 .if WITH_STRICT_SO814 cmpi.w #42+TRANSFER_ROW_SHIFT,%d7815 bne.s not_strict_writer816 jmp 0x2E680C817not_strict_writer:818 .endif819 .if WITH_ALT_GOALIES820 cmpi.w #40+TRANSFER_ROW_SHIFT,%d7821 bne.s not_alt_writer822 jmp 0x2E680C823not_alt_writer:824 .endif825 .if WITH_PICKUP_DELAY826 cmpi.w #38+TRANSFER_ROW_SHIFT,%d7827 bne.s not_pickup_writer828 jmp 0x2E680C829not_pickup_writer:830 .endif831 .if WITH_PASS_CHARGE832 cmpi.w #36+TRANSFER_ROW_SHIFT,%d7833 bne.s not_charge_writer834 jmp 0x2E680C835not_charge_writer:836 .endif837 .if WITH_PENALTY_RATE838 cmpi.w #34+TRANSFER_ROW_SHIFT,%d7839 bne.s not_rate_writer840 jmp 0x2E680C841not_rate_writer:842 .endif843 .if WITH_DIRECTIONAL844 cmpi.w #30+TRANSFER_ROW_SHIFT,%d7845 beq.s directional_writer846 cmpi.w #32+TRANSFER_ROW_SHIFT,%d7847 bne.s not_directional_writer848directional_writer:849 jmp 0x2E680C850not_directional_writer:851 .endif852 .if WITH_PASS_SPEED853 cmpi.w #28+TRANSFER_ROW_SHIFT,%d7854 bne.s speed_writer_done855 jmp 0x2DE604856speed_writer_done:857 .endif858 .if WITH_PASS_HEIGHT859 cmpi.w #26+TRANSFER_ROW_SHIFT,%d7860 bne.s height_writer_done861 jmp 0x2DE40C862height_writer_done:863 .endif864 .if WITH_CRIT_OPTION865 cmpi.w #22,%d7866 .if WITH_CRIT_LOCK867 bne.s other_option868 tst.w 0xFFFFF06C | native modes retain the global preference writer869 beq.w replay_writer870 tst.w 0xFFFFE3E8 | selected header's actual completed-game index871 beq.w replay_writer | starting an unfinished first match does not lock Crit872 cmpi.w #1,0xFFFFE3F0 | selected season has completed a match873 beq.w crit_locked874 cmpi.w #3,0xFFFFE3F0 | that season's playoffs875 beq.w crit_locked876 cmpi.w #4,0xFFFFE3F0 | completed season review877 beq.w crit_locked878 bra.w replay_writer879other_option:880 .else881 beq.w replay_writer882 .endif883 .endif884 cmpi.w #20,%d7 | presentation preference stays editable in a locked season885 beq.w replay_writer886 .if WITH_DIRECTIONAL887 bsr.w is_native_players888 .else889 bsr.s is_native_players890 .endif891 beq.s season_writer892 cmp.w PLAYERS,%d3893 beq.s nwrite_flags894 bsr.w native_step895 jmp 0x2095D6896nwrite_flags:897 tst.w %d2898 rts899season_writer:900 jmp 0x2F9808901 .if WITH_CRIT_LOCK902crit_locked:903 tst.w %d2 | exact native writer return flags; no settings/SRAM writes904 rts905 .endif906replay_writer:907 jmp 0x2DE008908display:909 .if WITH_QUICKGAME910 tst.w 0xFFFFF84C911 beq.s ordinary_display912 cmpi.w #2,%d7913 bne.s ordinary_display914 jsr 0x229004915 move.l %d0,-(%sp)916 jsr 0x20961A917 movea.l (%sp)+,%a1918 addq.l #4,%sp919 jmp 0x11BA4920ordinary_display:921 .endif922 .if WITH_CRIT_LOCK923 bsr.w is_native_players924 .else925 bsr.s is_native_players926 .endif927 beq.s season_display928 bsr.w native_label929 move.l %d0,-(%sp)930 jsr 0x20961A931 movea.l (%sp)+,%a1932 addq.l #4,%sp933 jmp 0x11BA4934season_display:935 jmp 0x2F9800936headlabel:937 .word 22938 .ascii "Two - Head to Head "939 .even940