experimental/transfers.s

Download file

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

1| Preseason transfer engine. Initial pure pricing and record CRC exports.2| Price/CRC return D0.L; all other registers and original IRQ/X are preserved.3| N/Z follow D0, V/C clear. Invalid UID/even address returnsFFFFFFFF.4    .equ PRICES,0x2395005    .equ POSITIONS,0x239B806    .equ MAPPER,0xA130F17    .text8    .globl _start9_start:10    bra.w price11    bra.w crc_contiguous12    bra.w crc_even13    bra.w validate_contiguous14    bra.w validate_even15    bra.w select_even16    bra.w load_even17    bra.w save_even18    bra.w transact19price:20    move.w %sr,-(%sp)21    movem.l %d1/%a0,-(%sp)22    andi.l #0xFFFF,%d023    cmpi.w #831,%d024    bhi.s price_bad25    lea POSITIONS,%a026    cmpi.b #0xFF,(%a0,%d0.w)27    beq.s price_bad28    add.w %d0,%d029    lea PRICES,%a030    moveq #0,%d131    move.w (%a0,%d0.w),%d132    move.l %d1,%d033    bra.s price_done34price_bad:35    moveq #-1,%d036price_done:37    movem.l (%sp)+,%d1/%a038    move.w (%sp)+,%sr39    tst.l %d040    rts41crc_contiguous:42    move.w %sr,-(%sp)43    movem.l %d1-%d7/%a0-%a2,-(%sp)44    moveq #1,%d745    moveq #0,%d646    bra.s crc_start47crc_even:48    move.w %sr,-(%sp)49    movem.l %d1-%d7/%a0-%a2,-(%sp)50    moveq #2,%d751    moveq #0,%d652    cmpa.l #0x204000,%a053    blo.w crc_bad54    cmpa.l #0x209000,%a055    bhi.w crc_bad56    move.l %a0,%d057    andi.l #0xFFF,%d058    bne.w crc_bad59    move.w #0x2700,%sr60    bsr.w wait_dma61    move.b #1,MAPPER62    moveq #1,%d663crc_start:64    adda.w %d7,%a0                 | commit byte0 is excluded65    move.w #0xFFFF,%d266    moveq #1,%d367crc_byte:68    moveq #0,%d169    move.b (%a0),%d170    adda.w %d7,%a071    cmpi.w #16,%d372    blo.s crc_use73    cmpi.w #20,%d374    blo.s crc_next                 | stored checksum and inverse are excluded75crc_use:76    lsl.w #8,%d177    eor.w %d1,%d278    moveq #7,%d479crc_bit:80    add.w %d2,%d281    bcc.s crc_no_poly82    eori.w #0x1021,%d283crc_no_poly:84    dbra %d4,crc_bit85crc_next:86    addq.w #1,%d387    cmpi.w #2048,%d388    blo.s crc_byte89    moveq #0,%d090    move.w %d2,%d091    bra.s crc_done92crc_bad:93    moveq #-1,%d094crc_done:95    tst.w %d696    beq.s crc_unmapped97    move.b #0,MAPPER98crc_unmapped:99    movem.l (%sp)+,%d1-%d7/%a0-%a2100    move.w (%sp)+,%sr101    tst.l %d0102    rts103104| Validate a complete2048-byte record. D0.W expectedleague1..3,A0 source.105| Result D0.L1valid/0invalid; original GPRs(exceptD0),IRQ/X/SP restored.106    .equ RANKS,0x23AF08107    .equ CURRENCY,0x23AF00108    .equ CATALOGUE_CRC,0x23AF04109validate_contiguous:110    move.w %sr,-(%sp)111    movem.l %d1-%d7/%a0-%a6,-(%sp)112    moveq #1,%d7113    bra.s record_setup114validate_even:115    move.w %sr,-(%sp)116    movem.l %d1-%d7/%a0-%a6,-(%sp)117    moveq #2,%d7118record_setup:119    movea.l %a0,%a4120    move.w %d0,%d6121    lea -160(%sp),%sp122    movea.l %sp,%a5123    movea.l %sp,%a0124    moveq #39,%d1125record_clear:126    clr.l (%a0)+127    dbra %d1,record_clear128    cmpi.w #1,%d6129    blo.w record_bad130    cmpi.w #3,%d6131    bhi.w record_bad132    movea.l %a4,%a0133    cmpi.w #2,%d7134    beq.s record_even_crc135    bsr.w crc_contiguous136    bra.s record_crc_done137record_even_crc:138    move.w #0x2700,%sr139    bsr.w wait_dma140    bsr.w crc_even141record_crc_done:142    tst.l %d0143    bmi.w record_bad144    move.w %d0,%d5145    cmpi.w #2,%d7146    bne.s record_header147    move.l %a4,%d0148    subi.l #0x204000,%d0149    lsr.l #8,%d0150    lsr.l #5,%d0151    addq.w #1,%d0152    cmp.w %d6,%d0153    bne.w record_bad154    move.b #1,MAPPER155    move.w #1,142(%a5)156record_header:157    movea.l %a4,%a0158    bsr.w record_read_long159    cmpi.l #0x54524E46,%d0160    bne.w record_bad161    bsr.w record_read_byte162    cmpi.w #1,%d0163    bne.w record_bad164    bsr.w record_read_byte165    cmp.w %d6,%d0166    bne.w record_bad167    bsr.w record_read_byte168    cmpi.w #1,%d0169    bhi.w record_bad170    move.w %d0,%d2171    bsr.w record_read_byte172    cmp.w %d2,%d0                 | Ready cannot be set when disabled173    bhi.w record_bad174    bsr.w record_read_long175    move.l %d0,%d1176    bsr.w record_read_long177    not.l %d0178    cmp.l %d1,%d0179    bne.w record_bad180    bsr.w record_read_word181    cmp.w %d5,%d0182    bne.w record_bad183    bsr.w record_read_word184    eori.w #0xFFFF,%d0185    cmp.w %d5,%d0186    bne.w record_bad187    bsr.w record_read_long188    cmp.l CURRENCY,%d0189    bne.w record_bad190    bsr.w record_read_word191    cmpi.w #831,%d0192    bne.w record_bad193    bsr.w record_read_word194    cmpi.w #2,%d0195    bne.w record_bad196    bsr.w record_read_long197    cmp.l CATALOGUE_CRC,%d0198    bne.w record_bad199    movea.l %a0,%a2               | first roster UID200    movea.l %a4,%a3201    move.w #1824,%d0202    mulu.w %d7,%d0203    adda.l %d0,%a3               | stored six-position count bytes per club204    lea POSITIONS,%a6205    moveq #0,%d3                  | owned-price sum, then total currency206    moveq #0,%d6                  | club0..31207record_club:208    lea 104(%a5),%a0209    moveq #5,%d1210record_clear_counts:211    clr.w (%a0)+212    dbra %d1,record_clear_counts213    clr.w 120(%a5)                | actual roster count214    clr.w 122(%a5)                | trailing empty slots reached215    move.w #-1,124(%a5)          | previous global roster rank216    clr.w 126(%a5)                | slot0..25217record_uid:218    movea.l %a2,%a0219    bsr.w record_read_word220    movea.l %a0,%a2221    cmpi.w #0xFFFF,%d0222    beq.w record_hole223    tst.w 122(%a5)224    bne.w record_bad225    cmpi.w #831,%d0226    bhi.w record_bad227    moveq #0,%d4228    move.b (%a6,%d0.w),%d4229    cmpi.w #5,%d4230    bhi.w record_bad              | also rejects the duplicate-identity aliasFF231    move.w %d0,%d1232    andi.w #7,%d1233    move.w %d0,%d5234    lsr.w #3,%d5235    bset %d1,(%a5,%d5.w)236    bne.w record_bad              | global duplicate ownership237    move.w %d0,%d5238    add.w %d5,%d5239    lea RANKS,%a1240    move.w (%a1,%d5.w),%d1241    cmp.w 124(%a5),%d1242    ble.w record_bad              | sorted positions/overall/tie order243    move.w %d1,124(%a5)244    lea PRICES,%a1245    moveq #0,%d1246    move.w (%a1,%d5.w),%d1247    add.l %d1,%d3248    add.w %d4,%d4249    addq.w #1,104(%a5,%d4.w)250    addq.w #1,120(%a5)251    bra.s record_next_uid252record_hole:253    move.w #1,122(%a5)254record_next_uid:255    addq.w #1,126(%a5)256    cmpi.w #26,126(%a5)257    blo.w record_uid258    cmpi.w #20,120(%a5)259    blo.w record_bad260    cmpi.w #2,104(%a5)261    blo.w record_bad262    cmpi.w #3,104(%a5)263    bhi.w record_bad264    cmpi.w #6,114(%a5)265    blo.w record_bad266    move.w 106(%a5),%d0267    add.w 108(%a5),%d0268    add.w 110(%a5),%d0269    add.w 112(%a5),%d0270    cmpi.w #12,%d0271    blo.w record_bad272    moveq #0,%d2273record_counts:274    movea.l %a3,%a0275    bsr.w record_read_byte276    movea.l %a0,%a3277    move.w %d2,%d1278    add.w %d1,%d1279    cmp.w 104(%a5,%d1.w),%d0280    bne.w record_bad281    addq.w #1,%d2282    cmpi.w #6,%d2283    blo.s record_counts284    addq.w #1,%d6285    cmpi.w #32,%d6286    blo.w record_club287    movea.l %a4,%a0288    move.w #1696,%d0289    mulu.w %d7,%d0290    adda.l %d0,%a0291    moveq #31,%d2292record_budget:293    bsr.w record_read_long294    cmp.l CURRENCY,%d0295    bhi.w record_bad296    add.l %d0,%d3297    dbra %d2,record_budget298    cmp.l CURRENCY,%d3299    bne.w record_bad300    movea.l %a4,%a0301    move.w #2016,%d0302    mulu.w %d7,%d0303    adda.l %d0,%a0304    moveq #31,%d2305record_padding:306    bsr.w record_read_byte307    tst.w %d0308    bne.s record_bad309    dbra %d2,record_padding310    moveq #1,%d0311    bra.s record_done312record_bad:313    moveq #0,%d0314record_done:315    tst.w 142(%a5)316    beq.s record_unmapped317    move.b #0,MAPPER318record_unmapped:319    lea 160(%sp),%sp320    movem.l (%sp)+,%d1-%d7/%a0-%a6321    move.w (%sp)+,%sr322    tst.l %d0323    rts324record_read_byte:325    moveq #0,%d0326    move.b (%a0),%d0327    adda.w %d7,%a0328    rts329record_read_word:330    moveq #0,%d0331record_read_low_word:332    move.b (%a0),%d0333    adda.w %d7,%a0334    lsl.w #8,%d0335    move.b (%a0),%d0336    adda.w %d7,%a0337    rts338record_read_long:339    bsr.s record_read_word340    swap %d0341    bsr.s record_read_low_word342    rts343344| SRAM aliases native animation ROM. All mapping is IRQ-protected AND waits345| for an already active VDP DMA to complete before exposing battery memory.346| Caller uses these blocking routines only in the transfer/preload modal.347wait_dma:348    btst #1,0xC00005349    bne.s wait_dma350    rts351352    .include "transfers_store.s"353    .include "transfers_tx.s"354