        .include "features.inc"
| Select an unplayed circle round; preserve all league GP and unique opponents.
| SRAM $1212..$121f: magic, played mask, next round, GP, new round, new mode.
    .equ HDR,0xFFF020
    .equ REC,0xFFF030
    .equ CRC,0xFFF040
    .equ OLD,0xFFF042
    .equ STEP,0xFFF044
    .equ CACHE,0xFFF00C
    .equ NEWFLAG,0xFFF00E
    .text
    .globl _start
_start:
    bra.w get
    bra.w change
    bra.w capture
    bra.w commit
get:
    movem.l %d1-%d7/%a0-%a6,-(%sp)
    bsr.w load
    bsr.w selected
    movem.l (%sp)+,%d1-%d7/%a0-%a6
    rts
change:
    movem.l %d0-%d7/%a0-%a6,-(%sp)
    move.w %d2,STEP
    bsr.w load
    tst.w HDR+12                       | pending new season: opponent still free
    bne.s 0f
    tst.w HDR+8                        | jdc 2026-10-25: only before game 1, then locked
    bne.s 9f
0:  bsr.w selected
    move.l REC+2,%d1
    tst.w HDR+12
    beq.s 1f
    moveq #0,%d1
1:  bsr.w next
    tst.w HDR+12
    beq.s 2f
    move.w %d0,REC+10
    move.w HDR+12,REC+12
    bra.s 3f
2:  move.w %d0,REC+6
3:  bsr.w save
9:  movem.l (%sp)+,%d0-%d7/%a0-%a6
    rts
capture:
    movem.l %d0-%d7/%a0-%a6,-(%sp)
    bsr.w load
    bsr.w selected
    move.w %d0,CACHE
    move.w HDR+12,NEWFLAG
    movem.l (%sp)+,%d0-%d7/%a0-%a6
    rts
commit:
    movem.l %d0-%d7/%a0-%a6,-(%sp)
    tst.w 0xFFE006
    beq.w 9f
    bsr.w load
    tst.w NEWFLAG
    beq.s 1f
    clr.l REC+2
    clr.w REC+10
    clr.w REC+12
1:  move.l REC+2,%d1
    move.w CACHE,%d0
    bset %d0,%d1
    cmpi.l #0x7FFFFFFF,%d1
    bne.s 2f
    moveq #0,%d1
2:  move.l %d1,REC+2
    move.w #1,STEP
    bsr.w next
    move.w %d0,REC+6
    move.w 0xFFE008,REC+8
    bsr.w save
9:  movem.l (%sp)+,%d0-%d7/%a0-%a6
    rts
selected:
    move.w REC+6,%d0
    tst.w HDR+12
    beq.s 1f
    moveq #0,%d0
    move.w HDR+12,%d1
    cmp.w REC+12,%d1
    bne.s 1f
    move.w REC+10,%d0
1:
    .if WITH_DIVISION_MINI
    bsr.w limit
    cmp.w %d4,%d0
    .else
    cmpi.w #31,%d0
    .endif
    bcs.s 2f
    moveq #0,%d0
2:  rts
next:                                  | D0 current, D1 used mask, STEP +/-1; bounded search
    .if WITH_DIVISION_MINI
    bsr.w limit                        | d4 bound8(Mini) or31, d3 search count
    move.w %d4,%d3
    subq.w #1,%d3
    .else
    moveq #30,%d3
    .endif
1:  add.w STEP,%d0
    bpl.s 2f
    .if WITH_DIVISION_MINI
    move.w %d4,%d0
    subq.w #1,%d0
    .else
    moveq #30,%d0
    .endif
2:
    .if WITH_DIVISION_MINI
    cmp.w %d4,%d0
    .else
    cmpi.w #31,%d0
    .endif
    bcs.s 3f
    moveq #0,%d0
3:  btst %d0,%d1
    beq.s 4f
    dbra %d3,1b
    moveq #0,%d0
4:  rts
load:
    lea HDR,%a0
    move.l #0x1000,%d0
    moveq #16,%d1
    jsr 0x1A244
    cmpi.l #0x5345534E,HDR
    beq.s 1f
    clr.w HDR+8
    clr.w HDR+12
1:  lea REC,%a0
    move.l #0x1212,%d0
    moveq #14,%d1
    jsr 0x1A244
    bsr.w sum
    move.w %d7,OLD
    cmpi.w #0x5343,REC
    bne.s init
    move.w REC+8,%d0
    cmp.w HDR+8,%d0
    bne.s init
    rts
init:
    move.w #0x5343,REC
    clr.l REC+2
    move.w HDR+8,%d0
    move.w %d0,REC+8
    andi.l #0xFFFF,%d0
    divu.w #31,%d0
    swap %d0
    move.w %d0,REC+6
    clr.w REC+10
    clr.w REC+12
    moveq #1,%d1
    lsl.l %d0,%d1
    subq.l #1,%d1
    move.l %d1,REC+2
    rts
sum:
    lea REC,%a1
    moveq #0,%d7
    moveq #13,%d2
1:  add.b (%a1)+,%d7
    dbra %d2,1b
    rts
save:
    lea REC,%a0
    move.l #0x1212,%d0
    moveq #14,%d1
    jsr 0x1A1E4
    bsr.w sum
    sub.b OLD+1,%d7
    move.w %d7,OLD
    lea CRC,%a0
    move.l #0x1FFE,%d0
    moveq #2,%d1
    jsr 0x1A244
    move.b CRC+1,%d0
    add.b OLD+1,%d0
    move.b %d0,CRC+1
    not.b %d0
    move.b %d0,CRC
    lea CRC,%a0
    move.l #0x1FFE,%d0
    moveq #2,%d1
    jsr 0x1A1E4
    rts

    .if WITH_DIVISION_MINI
limit:                                  | pending new format takes precedence over old header length
    moveq #31,%d4
    cmpi.w #3,HDR+12
    beq.s mini_limit
    tst.w HDR+12
    bne.s limit_done
    .if MINI_GAMES != 8
    cmpi.w #8,HDR+10
    beq.s legacy_mini_limit              | old played eight-game slots keep their stored bound
    .endif
    cmpi.w #MINI_GAMES,HDR+10
    bne.s limit_done
mini_limit:
    moveq #MINI_GAMES,%d4
limit_done:
    rts
    .if MINI_GAMES != 8
legacy_mini_limit:
    moveq #8,%d4
    rts
    .endif
    .endif
