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