experimental/transfers_runtime.s

Download file

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