    .ifndef WITH_REFINEMENTS
    .equ WITH_REFINEMENTS,0
    .endif
    .ifndef WITH_TRANSFERS
    .equ WITH_TRANSFERS,0
    .endif
    .equ TRANSFER_ROW_SHIFT,2*WITH_TRANSFERS
    .ifndef WITH_MOMENTUM
    .equ WITH_MOMENTUM,0
    .endif
    .ifndef WITH_FACEOFF_DOTS
    .equ WITH_FACEOFF_DOTS,0
    .endif
    .ifndef WITH_AI_SHOT_PLAN
    .equ WITH_AI_SHOT_PLAN,0
    .endif
    .ifndef WITH_STRICT_SO
    .equ WITH_STRICT_SO,0
    .endif
    .ifndef WITH_ALT_GOALIES
    .equ WITH_ALT_GOALIES,0
    .endif
    .ifndef WITH_PICKUP_DELAY
    .equ WITH_PICKUP_DELAY,0
    .endif
    .ifndef WITH_PASS_CHARGE
    .equ WITH_PASS_CHARGE,0
    .endif
    .ifndef WITH_PENALTY_RATE
    .equ WITH_PENALTY_RATE,0
    .endif
    .ifndef WITH_DIRECTIONAL
    .equ WITH_DIRECTIONAL,0
    .endif
    .ifndef WITH_PASS_SPEED
    .equ WITH_PASS_SPEED,0
    .endif
    .ifndef WITH_PASS_HEIGHT
    .equ WITH_PASS_HEIGHT,0
    .endif
    .ifndef ICING_DEFAULT
    .equ ICING_DEFAULT,0
    .endif
    .ifndef WITH_PREF_DEFAULTS
    .equ WITH_PREF_DEFAULTS,1
    .endif
    .ifndef WITH_ICING_MENU
    .equ WITH_ICING_MENU,1
    .endif
    .ifndef WITH_CRIT_OPTION
    .equ WITH_CRIT_OPTION,1
    .endif
    .if WITH_CRIT_OPTION
| Global Auto Replays and Crit Shots preferences, independent tagged records.
| +0 row mapper, +4 boot/load, +8 main-menu writer. 0 On, 1 Off.
    .equ VALUE,0xFFFFF0DE
    .equ CVALUE,0xFFFFF0EC
    .equ RECORD,0x205C31
    .equ CRECORD,0x205C39
    .equ MAP,0xA130F1
    .text
    .globl _start
_start:
    bra.w rowmap
    bra.w defaults
    bra.w writer
rowmap:
    .if WITH_REFINEMENTS
    cmpi.w #48,%d7
    bne.s not_units
    move.w #0xF8D8-0xD048,%d1
    rts
not_units:
    cmpi.w #50,%d7
    bne.s not_glass
    move.w #0xF8DA-0xD048,%d1
    rts
not_glass:
    .endif
    .if WITH_TRANSFERS
    cmpi.w #26,%d7
    bne.s not_transfers
    jsr 0x254000
    move.w #0xF85C-0xD048,%d1
    rts
not_transfers:
    .endif
    .if WITH_MOMENTUM
    cmpi.w #48+TRANSFER_ROW_SHIFT-4*WITH_REFINEMENTS,%d7
    bne.s not_momentum
    move.w #0xF84A-0xD048,%d1
    rts
not_momentum:
    .endif
    .if WITH_FACEOFF_DOTS && !WITH_REFINEMENTS
    cmpi.w #46+TRANSFER_ROW_SHIFT,%d7
    bne.s not_faceoff_dots
    move.w #0xF848-0xD048,%d1
    rts
not_faceoff_dots:
    .endif
    .if WITH_AI_SHOT_PLAN
    cmpi.w #44+TRANSFER_ROW_SHIFT-2*WITH_REFINEMENTS,%d7
    bne.s not_ai_shot_plan
    move.w #0xF810-0xD048,%d1
    rts
not_ai_shot_plan:
    .endif
    .if WITH_STRICT_SO && !WITH_REFINEMENTS
    cmpi.w #42+TRANSFER_ROW_SHIFT,%d7
    bne.s not_strict_so
    move.w #0xF046-0xD048,%d1
    rts
not_strict_so:
    .endif
    .if WITH_ALT_GOALIES
    cmpi.w #40+TRANSFER_ROW_SHIFT,%d7
    bne.s not_alt_goalies
    move.w #0xF012-0xD048,%d1
    rts
not_alt_goalies:
    .endif
    .if WITH_PICKUP_DELAY
    cmpi.w #38+TRANSFER_ROW_SHIFT,%d7
    bne.s not_pickup_delay
    move.w #0xF010-0xD048,%d1
    rts
not_pickup_delay:
    .endif
    .if WITH_PASS_CHARGE
    cmpi.w #36+TRANSFER_ROW_SHIFT,%d7
    bne.s not_charge
    move.w #0xF008-0xD048,%d1
    rts
not_charge:
    .endif
    .if WITH_PENALTY_RATE
    cmpi.w #34+TRANSFER_ROW_SHIFT,%d7
    bne.s not_rate
    move.w #0xF006-0xD048,%d1
    rts
not_rate:
    .endif
    .if WITH_DIRECTIONAL
    cmpi.w #30+TRANSFER_ROW_SHIFT,%d7
    bne.s not_mode
    move.w #0xF0FC-0xD048,%d1
    rts
not_mode:
    cmpi.w #32+TRANSFER_ROW_SHIFT,%d7
    bne.s not_cone
    move.w #0xF0FE-0xD048,%d1
    rts
not_cone:
    .endif
    .if WITH_PASS_SPEED
    cmpi.w #28+TRANSFER_ROW_SHIFT,%d7
    bne.s speed_mapped
    move.w #0xF0E8-0xD048,%d1
    rts
speed_mapped:
    .endif
    .if WITH_PASS_HEIGHT
    cmpi.w #26+TRANSFER_ROW_SHIFT,%d7
    bne.s height_mapped
    move.w #0xF0DC-0xD048,%d1
    rts
height_mapped:
    .endif
    .if WITH_ICING_MENU
    cmpi.w #24,%d7
    bne.s icingmapped
    move.w #0xF0EE-0xD048,%d1
    rts
icingmapped:
    .endif
    cmpi.w #22,%d7
    beq.s critmap
    cmpi.w #20,%d7
    bne.s oldmap
    move.w #0xF0DE-0xD048,%d1
    rts
critmap:
    move.w #0xF0EC-0xD048,%d1
    rts
oldmap:
    move.w %d7,%d1
    cmpi.w #12,%d1
    jmp 0x2FE226

defaults:
    .if WITH_ICING_MENU
    .if WITH_PREF_DEFAULTS
    move.w #ICING_DEFAULT,0xFFFFF0EE  | fresh Icing On; legacy flag reproduces r6 Off
    .else
    clr.w 0xFFFFF0EE
    .endif
    .endif
    movem.l %d0-%d1/%a0-%a1,-(%sp)
    move.w %sr,-(%sp)
    ori.w #0x700,%sr
    move.b #1,MAP
    lea RECORD,%a0
    lea VALUE,%a1
    move.w #0x5250,%d1
    bsr.w loadrecord
    lea CRECORD,%a0
    lea CVALUE,%a1
    move.w #0x4354,%d1
    bsr.w loadrecord
    .if WITH_PASS_HEIGHT
    jsr 0x2DE404
    .endif
    move.b #0,MAP
    move.w (%sp)+,%sr
    movem.l (%sp)+,%d0-%d1/%a0-%a1
    rts
loadrecord:
    .if WITH_PREF_DEFAULTS
    move.w #1,(%a1)                   | absent/corrupt RP/CT defaults Off, tagged saved values still win
    .else
    clr.w (%a1)
    .endif
    moveq #0,%d0
    move.b (%a0),%d0
    lsl.w #8,%d0
    move.b 2(%a0),%d0
    cmp.w %d1,%d0
    bne.s loaded
    moveq #0,%d0
    move.b 4(%a0),%d0
    cmpi.b #1,%d0
    bhi.s loaded
    not.b %d0
    cmp.b 6(%a0),%d0
    bne.s loaded
    not.b %d0
    move.w %d0,(%a1)
loaded:
    rts
writer:
    cmpi.w #1,%d3
    bhi.w flags
    movem.l %d0-%d1/%a0-%a1,-(%sp)
    lea RECORD,%a0
    lea VALUE,%a1
    move.w #0x5250,%d1
    cmpi.w #22,%d7
    bne.s selected
    lea CRECORD,%a0
    lea CVALUE,%a1
    move.w #0x4354,%d1
selected:
    cmp.w (%a1),%d3
    beq.s unchanged
    move.w %sr,-(%sp)
    ori.w #0x700,%sr
    move.w %d3,(%a1)
    move.b #1,MAP
    move.w %d1,%d0
    lsr.w #8,%d0
    move.b %d0,(%a0)
    move.b %d1,2(%a0)
    move.b %d3,4(%a0)
    move.w %d3,%d0
    not.b %d0
    move.b %d0,6(%a0)
    lea 0x204001,%a0
    moveq #0,%d0
    move.w #0x1FFE-1,%d1
sum:
    add.b (%a0),%d0
    addq.l #2,%a0
    dbra %d1,sum
    not.b %d0
    move.b %d0,(%a0)
    not.b %d0
    move.b %d0,2(%a0)
    move.b #0,MAP
    move.w (%sp)+,%sr
unchanged:
    movem.l (%sp)+,%d0-%d1/%a0-%a1
flags:
    tst.w %d2
    rts
    .else
| Global Auto Replays preference, shared by league slots and native modes.
| +0 row mapper, +4 boot/load, +8 main-menu writer. 0 On, 1 Off.
| Full-bank logical2E18..2E1B is in the shared-profile gap excluded by slots.copybank.
| Tagged/complemented record, included in that bank's normal checksum.
    .equ VALUE,0xFFFFF0DE
    .equ RECORD,0x205C31
    .equ MAP,0xA130F1
    .text
    .globl _start
_start:
    bra.w rowmap
    bra.w defaults
    bra.w writer
rowmap:
    cmpi.w #20,%d7
    bne.s oldmap
    move.w #0xF0DE-0xD048,%d1
    rts
oldmap:
    move.w %d7,%d1
    cmpi.w #12,%d1
    jmp 0x2FE226                       | original map continues with its original CCR

defaults:
    movem.l %d0/%a0,-(%sp)
    move.w %sr,-(%sp)
    ori.w #0x700,%sr
    move.b #1,MAP
    clr.w VALUE                        | absent/corrupt preference defaults to On
    lea RECORD,%a0
    cmpi.b #0x52,(%a0)
    bne.s loaded
    cmpi.b #0x50,2(%a0)
    bne.s loaded
    moveq #0,%d0
    move.b 4(%a0),%d0
    cmpi.b #1,%d0
    bhi.s loaded
    not.b %d0
    cmp.b 6(%a0),%d0
    bne.s loaded
    not.b %d0
    move.w %d0,VALUE
loaded:
    move.b #0,MAP
    move.w (%sp)+,%sr
    movem.l (%sp)+,%d0/%a0
    rts
writer:
    cmpi.w #1,%d3
    bhi.s flags
    cmp.w VALUE,%d3
    beq.s flags
    movem.l %d0-%d1/%a0,-(%sp)
    move.w %sr,-(%sp)
    ori.w #0x700,%sr
    move.w %d3,VALUE
    move.b #1,MAP
    lea RECORD,%a0
    move.b #0x52,(%a0)
    move.b #0x50,2(%a0)
    move.b %d3,4(%a0)
    move.w %d3,%d0
    not.b %d0
    move.b %d0,6(%a0)
    lea 0x204001,%a0
    moveq #0,%d0
    move.w #0x1FFE-1,%d1
sum:
    add.b (%a0),%d0
    addq.l #2,%a0
    dbra %d1,sum
    not.b %d0
    move.b %d0,(%a0)
    not.b %d0
    move.b %d0,2(%a0)
    move.b #0,MAP
    move.w (%sp)+,%sr
    movem.l (%sp)+,%d0-%d1/%a0
flags:
    tst.w %d2                          | native row-writer return contract
    rts
    .endif
