Release 2026-11-04-r2 · SHA256 dd170d4f16002011f7dd873637bcd5bc2e4e1f0256c424fec199d457d623a886 · Click a line number for a direct link.
1| Conditional real-player getters. Active52UID cache avoids SRAM mapping while2| game animation/audio DMA is running. Other-club menu reads wait for DMA under3| masked IRQs. Allocation F860..F8D7 still requires complete lifetime/stack QA.4 .equ TAG,0xFFFFF8605 .equ LEAGUE,0xFFFFF8626 .equ BANK,0xFFFFF8647 .equ HOMEID,0xFFFFF8688 .equ AWAYID,0xFFFFF86A9 .equ CACHE,0xFFFFF87010 .equ MAPPER,0xA130F111 .text12 .globl _start13_start:14 bra.w preload_hook15 bra.w uid16 bra.w pointer17 bra.w enabled18 bra.w count_g19 bra.w count_gf20 bra.w count_f21 bra.w count_all22 bra.w attribute_hook23 bra.w name_hook24 bra.w preload25 bra.w goalie_base_a026 bra.w goalie_base_a127 bra.w keeper_candidate28 bra.w critical_base29 bra.w profile_photo30 bra.w card_photo31 bra.w card_limit32 bra.w card_name33 bra.w line_initializer34 bra.w active_line_a035 bra.w player_load36 bra.w selection_attribute37 bra.w goalkeeper_name38 bra.w roster_number39 bra.w keeper_label40 bra.w profile_number41 bra.w receiver_record42 bra.w profile_record_a243 bra.w editor_record_a244 bra.w season_pick45 bra.w season_skater46 bra.w season_record_a147 bra.w season_prepare48 bra.w card_starting_line49 bra.w card_position50enabled:51 move.w %sr,-(%sp)52 moveq #0,%d053 cmpi.w #0x5452,TAG54 bne.s disabled55 tst.w 0xFFFFF06C56 beq.s disabled57 tst.w 0xFFFFF84C58 bne.s disabled59 cmpi.w #1,0xFFFFF85C60 bne.s disabled61 move.w 0xFFFFF06A,%d062 cmp.w LEAGUE,%d063 bne.s not_enabled64 subq.w #1,%d065 cmpi.w #2,%d066 bhi.s not_enabled67 andi.l #0xFFFF,%d068 lsl.l #8,%d069 lsl.l #5,%d070 addi.l #0x204000,%d071 cmp.l BANK,%d072 beq.s bank_valid73 addi.l #0x1000,%d074 cmp.l BANK,%d075 bne.s not_enabled76bank_valid:77 moveq #1,%d078 bra.s disabled79not_enabled:80 moveq #0,%d081disabled:82 move.w (%sp)+,%sr83 tst.l %d084 rts85preload_hook:86 bsr.w preload87 move.w 0xFFFFC6F4,-(%sp)88 move.w 0xFFFFCA58,-(%sp)89 movem.l %a1-%a3,-(%sp)90 jmp 0x1710E91preload:92 move.w %sr,-(%sp)93 movem.l %d0-%d7/%a0-%a6,-(%sp)94 clr.w TAG95 tst.w 0xFFFFF06C96 beq.w preload_done97 tst.w 0xFFFFF84C98 bne.w preload_done99 jsr 0x254000100 cmpi.w #1,0xFFFFF85C101 bne.w preload_done102 move.w 0xFFFFF06A,%d0103 jsr 0x234014104 tst.l %d0105 ble.w preload_done106 movea.l %d0,%a4107 move.w #0x2700,%sr108 bsr.w wait_dma109 move.b #1,MAPPER110 cmpi.b #1,12(%a4)111 bne.s preload_unmap112 | Valid unready preseason ownership may also be previewed in native menus.113 | The actual match Start modal still requires Ready before continuing.114 move.w 0xFFFFC330,%d0115 cmpi.w #31,%d0116 bhi.s preload_unmap117 move.w %d0,HOMEID118 mulu.w #104,%d0119 lea 64(%a4),%a0120 adda.l %d0,%a0121 lea CACHE,%a1122 bsr.s copy_row123 move.w 0xFFFFC332,%d0124 cmpi.w #31,%d0125 bhi.s preload_unmap126 move.w %d0,AWAYID127 mulu.w #104,%d0128 lea 64(%a4),%a0129 adda.l %d0,%a0130 bsr.s copy_row131 move.l %a4,BANK132 move.w 0xFFFFF06A,LEAGUE133 move.w #0x5452,TAG134preload_unmap:135 move.b #0,MAPPER136preload_done:137 movem.l (%sp)+,%d0-%d7/%a0-%a6138 move.w (%sp)+,%sr139 rts140copy_row:141 moveq #25,%d2142copy_uid:143 moveq #0,%d0144 move.b (%a0),%d0145 lsl.w #8,%d0146 move.b 2(%a0),%d0147 addq.l #4,%a0148 move.w %d0,(%a1)+149 dbra %d2,copy_uid150 rts151wait_dma:152 btst #1,0xC00005153 bne.s wait_dma154 rts155156| D0.W club,D1.W slot -> D0.L UID orFFFFFFFF. All other GPRs and IRQ/X157| preserved; NZVC from TST.L result. Off maps the original catalogue identity.158uid:159 move.w %sr,-(%sp)160 movem.l %d1-%d7/%a0-%a6,-(%sp)161 move.w %d0,%d6162 cmpi.w #31,%d6163 bhi.w uid_bad164 cmpi.w #25,%d1165 bhi.w uid_bad166 bsr.w enabled167 beq.s original_uid168 lea CACHE,%a0169 cmp.w HOMEID,%d6170 beq.s cached171 lea CACHE+52,%a0172 cmp.w AWAYID,%d6173 beq.s cached174 move.w #0x2700,%sr175 bsr.s wait_dma176 movea.l BANK,%a0177 adda.w #64,%a0178 mulu.w #104,%d6179 adda.l %d6,%a0180 move.w %d1,%d0181 lsl.w #2,%d0182 adda.w %d0,%a0183 move.b #1,MAPPER184 moveq #0,%d0185 move.b (%a0),%d0186 lsl.w #8,%d0187 move.b 2(%a0),%d0188 move.b #0,MAPPER189 bra.s uid_check190cached:191 move.w %d1,%d0192 add.w %d0,%d0193 moveq #0,%d2194 move.w (%a0,%d0.w),%d2195 move.l %d2,%d0196uid_check:197 cmpi.w #831,%d0198 bhi.s uid_bad199 bra.s uid_done200original_uid:201 mulu.w #26,%d6202 moveq #0,%d0203 move.w %d6,%d0204 add.w %d1,%d0205 bra.s uid_done206uid_bad:207 moveq #-1,%d0208uid_done:209 movem.l (%sp)+,%d1-%d7/%a0-%a6210 move.w (%sp)+,%sr211 tst.l %d0212 rts213pointer:214 move.w %sr,-(%sp)215 bsr.w uid216 tst.l %d0217 bmi.s empty_pointer218 move.l %d1,-(%sp)219 move.w %d0,%d1220 lsl.w #2,%d1221 lea 0x238800,%a0222 movea.l (%a0,%d1.w),%a0223 move.l (%sp)+,%d1224 move.w (%sp)+,%sr225 tst.l %d0226 rts227empty_pointer:228 lea 0x23B588,%a0229 move.w (%sp)+,%sr230 tst.l %d0231 rts232233| D0=club -> D0=G,D1=F,D2=total. Wrapper owns register preservation.234counts:235 move.w %d0,%d7236 moveq #0,%d5237 moveq #0,%d6238 moveq #0,%d4239 moveq #0,%d3240count_next:241 move.w %d7,%d0242 move.w %d3,%d1243 bsr.w uid244 tst.l %d0245 bmi.s count_skip246 addq.w #1,%d4247 lea 0x239B80,%a0248 moveq #0,%d1249 move.b (%a0,%d0.w),%d1250 tst.w %d1251 bne.s count_forward252 addq.w #1,%d5253 bra.s count_skip254count_forward:255 cmpi.w #4,%d1256 bhi.s count_skip257 addq.w #1,%d6258count_skip:259 addq.w #1,%d3260 cmpi.w #26,%d3261 blo.s count_next262 move.w %d5,%d0263 move.w %d6,%d1264 move.w %d4,%d2265 rts266267 .macro count_wrapper label,kind,continuation268\label:269 move.w %sr,-(%sp)270 movem.l %d0-%d7/%a0-%a6,-(%sp)271 bsr.w enabled272 beq.w \label\()_old273 move.w 0x28(%a2),%d0274 bsr.w counts275 .if \kind == 0276 move.w %d0,2(%sp)277 moveq #0x15,%d3278 .elseif \kind == 1279 add.w %d1,%d0280 move.w %d0,2(%sp)281 moveq #0,%d3282 .elseif \kind == 2283 move.w %d1,2(%sp)284 sub.w %d0,%d2285 sub.w %d1,%d2286 move.w %d2,%d3287 andi.w #8,%d3288 lsl.w #1,%d3289 .else290 move.w %d2,2(%sp)291 moveq #4,%d3292 .endif293 andi.w #0xFFE0,60(%sp)294 or.w %d3,60(%sp)295 movem.l (%sp)+,%d0-%d7/%a0-%a6296 move.w (%sp)+,%sr297 rts298\label\()_old:299 movem.l (%sp)+,%d0-%d7/%a0-%a6300 move.w (%sp)+,%sr301 .if \kind == 0302 movem.l %d1/%a0,-(%sp)303 movea.l 0x1E(%a2),%a0304 .elseif \kind == 1305 movem.l %a0,-(%sp)306 jsr 0x9F40307 .else308 movem.l %a0,-(%sp)309 movea.l 0x1E(%a2),%a0310 .endif311 jmp \continuation312 .endm313 count_wrapper count_g,0,0x9F48314 count_wrapper count_gf,1,0x9F62315 count_wrapper count_f,2,0x9F86316 count_wrapper count_all,3,0x9FA2317318attribute_hook:319 move.w %sr,-(%sp)320 movem.l %d0-%d7/%a0-%a6,-(%sp)321 bsr.w enabled322 beq.s attribute_old323 move.w 2(%sp),%d1324 move.w 0x28(%a2),%d0325 bsr.w pointer326 adda.w (%a0),%a0327 addq.l #8,%a0328 move.l %a0,32(%sp)329 move.w #0xFFFF,2(%sp)330 movem.l (%sp)+,%d0-%d7/%a0-%a6331 move.w (%sp)+,%sr332 rts333attribute_old:334 movem.l (%sp)+,%d0-%d7/%a0-%a6335 move.w (%sp)+,%sr336 adda.w (%a0),%a0337attribute_next:338 adda.w (%a0),%a0339 addq.w #8,%a0340 dbra %d0,attribute_next341 rts342name_hook:343 move.w %sr,-(%sp)344 movem.l %d0-%d7/%a0-%a6,-(%sp)345 bsr.w enabled346 beq.s name_old347 move.w 2(%sp),%d1348 move.w 0x28(%a2),%d0349 bsr.w pointer350 move.l %a0,32(%sp)351 move.w #0xFFFF,2(%sp)352 movem.l (%sp)+,%d0-%d7/%a0-%a6353 move.w (%sp)+,%sr354 rts355name_old:356 movem.l (%sp)+,%d0-%d7/%a0-%a6357 move.w (%sp)+,%sr358 movea.l 0x1E(%a2),%a0359 adda.w (%a0),%a0360 jmp 0x18BCE361362| Original Allstar-aware bases have already been selected. Off retains that363| exact pointer and every flag; On adapts indexed4-byte goalkeeper metadata.364goalie_base_a0:365 move.w %sr,-(%sp)366 movem.l %d0-%d7/%a1-%a6,-(%sp)367 bsr.w enabled368 beq.s goalie_a0_done369 move.w 2(%sp),%d0370 lsr.w #2,%d0371 bsr.w counts372 lea keeper_signatures(%pc),%a0373 cmpi.w #3,%d0374 bne.s goalie_a0_index375 addq.l #4,%a0376goalie_a0_index:377 move.w 2(%sp),%d0378 suba.w %d0,%a0379goalie_a0_done:380 movem.l (%sp)+,%d0-%d7/%a1-%a6381 move.w (%sp)+,%sr382 rts383goalie_base_a1:384 move.w %sr,-(%sp)385 movem.l %d0-%d7/%a0/%a2-%a6,-(%sp)386 bsr.w enabled387 beq.s goalie_a1_done388 move.w 10(%sp),%d0389 lsr.w #2,%d0390 bsr.w counts391 lea keeper_signatures(%pc),%a1392 cmpi.w #3,%d0393 bne.s goalie_a1_index394 addq.l #4,%a1395goalie_a1_index:396 move.w 10(%sp),%d0397 suba.w %d0,%a1398goalie_a1_done:399 movem.l (%sp)+,%d0-%d7/%a0/%a2-%a6400 move.w (%sp)+,%sr401 rts402keeper_candidate:403 move.w %sr,-(%sp)404 movem.l %d0-%d7/%a0-%a6,-(%sp)405 bsr.w enabled406 beq.s keeper_old407 move.w 26(%sp),%d1408 move.w 0x28(%a2),%d0409 bsr.w pointer410 adda.w (%a0),%a0411 move.l %a0,36(%sp)412 addq.l #8,%a0413 move.l %a0,48(%sp)414 movem.l (%sp)+,%d0-%d7/%a0-%a6415 move.w (%sp)+,%sr416 rts417keeper_old:418 movem.l (%sp)+,%d0-%d7/%a0-%a6419 move.w (%sp)+,%sr420 movea.l %a4,%a1421 adda.w (%a1),%a1422 lea 8(%a1),%a4423 rts424keeper_signatures:425 .byte 0,1,2,0,0,1,3,0426427| Preserve the original indexed lookup and its flags. Only its base changes.428critical_base:429 move.w %sr,-(%sp)430 movem.l %d0-%d7/%a1-%a6,-(%sp)431 bsr.w enabled432 beq.s critical_base_done433 move.l (%sp),%d0434 andi.l #0xFFFF,%d0435 divu.w #26,%d0436 move.l %d0,%d1437 swap %d1438 bsr.w uid439 tst.l %d0440 bmi.s critical_empty441 lea 0x2FF800,%a0442 adda.w %d0,%a0443 bra.s critical_adjust444critical_empty:445 lea 0x23B58A,%a0446critical_adjust:447 move.w 2(%sp),%d0448 suba.w %d0,%a0449critical_base_done:450 movem.l (%sp)+,%d0-%d7/%a1-%a6451 move.w (%sp)+,%sr452 rts453454| NativeFAE26 D0=slot,D1=club -> actual source photo,A0 only.455| Flags match the native source-photo entry search, precomputed from real order.456profile_photo:457 move.w %sr,-(%sp)458 movem.l %d0-%d7/%a1-%a6,-(%sp)459 bsr.w enabled460 beq.s profile_original461 move.w 2(%sp),%d1462 move.w 6(%sp),%d0463 bsr.w uid464 tst.l %d0465 bmi.s profile_empty466 lea 0x23B600,%a1467 moveq #0,%d2468 move.b (%a1,%d0.w),%d2469 lsl.w #2,%d0470 lea 0x23A200,%a0471 movea.l (%a0,%d0.w),%a0472 bra.s profile_flags473profile_empty:474 lea 0xC63F8,%a0475 moveq #4,%d2476profile_flags:477 andi.w #0xFFE0,56(%sp)478 or.w %d2,56(%sp)479 movem.l (%sp)+,%d0-%d7/%a1-%a6480 move.w (%sp)+,%sr481 rts482profile_original:483 movem.l (%sp)+,%d0-%d7/%a1-%a6484 move.w (%sp)+,%sr485 movem.l %d0-%d7/%a1-%a6,-(%sp)486 jsr 0x22C018487 jmp 0xFAE30488489| Native card index D0=4*club,D3=6*current-slot. Retain current slot for490| the following mapped name/ratings renderer; portrait follows the real UID.491card_photo:492 move.w %sr,-(%sp)493 movem.l %d0-%d7/%a0-%a6,-(%sp)494 bsr.w enabled495 beq.s card_photo_original496 move.l 12(%sp),%d1497 andi.l #0xFFFF,%d1498 divu.w #6,%d1499 move.w %d1,0xFFFFD434500 andi.w #0xFFF0,60(%sp)501 tst.w %d1502 bne.s card_photo_slot503 ori.w #4,60(%sp)504card_photo_slot:505 move.w 2(%sp),%d0506 lsr.w #2,%d0507 bsr.w uid508 lea 0xC63F8,%a0509 tst.l %d0510 bmi.s card_photo_done511 lsl.w #2,%d0512 lea 0x23A200,%a0513 movea.l (%a0,%d0.w),%a0514card_photo_done:515 move.l %a0,32(%sp)516 movem.l (%sp)+,%d0-%d7/%a0-%a6517 move.w (%sp)+,%sr518 rts519card_photo_original:520 movem.l (%sp)+,%d0-%d7/%a0-%a6521 move.w (%sp)+,%sr522 movea.l (%a0,%d0.w),%a0523 move.w 4(%a0,%d3.w),0xFFFFD434524 movea.l (%a0,%d3.w),%a0525 rts526card_limit:527 move.w %sr,-(%sp)528 movem.l %d0-%d7/%a0-%a6,-(%sp)529 bsr.w enabled530 beq.s card_limit_original531 move.w 0xFFFFC330,%d0532 btst #1,0xFFFFD42E533 beq.s card_limit_team534 move.w 0xFFFFC332,%d0535card_limit_team:536 bsr.w counts537 move.w 0xFFFFD43E,%d1538 cmp.w %d2,%d1539 move.w %sr,%d0540 andi.w #15,%d0541 andi.w #0xFFF0,60(%sp)542 or.w %d0,60(%sp)543 movem.l (%sp)+,%d0-%d7/%a0-%a6544 move.w (%sp)+,%sr545 rts546card_limit_original:547 movem.l (%sp)+,%d0-%d7/%a0-%a6548 move.w (%sp)+,%sr549 cmpi.w #26,0xFFFFD43E550 rts551card_name:552 move.w %sr,-(%sp)553 movem.l %d0-%d7/%a0-%a6,-(%sp)554 bsr.w enabled555 beq.s card_name_original556 move.w 0xFFFFD434,%d1557 andi.w #0xFFF0,60(%sp)558 tst.w %d1559 bne.s card_name_slot560 ori.w #4,60(%sp)561card_name_slot:562 move.w 0xFFFFD446,%d0563 bsr.w pointer564 move.l %a0,40(%sp)565 move.w #0xFFFF,2(%sp)566 movem.l (%sp)+,%d0-%d7/%a0-%a6567 move.w (%sp)+,%sr568 rts569card_name_original:570 movem.l (%sp)+,%d0-%d7/%a0-%a6571 move.w (%sp)+,%sr572 movea.l (%a2,%d0.w),%a2573 adda.w (%a2),%a2574 move.w 0xFFFFD434,%d0575 bra.s card_name_test576card_name_next:577 adda.w (%a2),%a2578 addq.w #8,%a2579card_name_test:580 dbra %d0,card_name_next581 rts582583 .include "transfers_lines.s"584 .include "transfers_getters.s"585586 .include "transfers_season.s"587588 .include "transfers_cards.s"589