    .ifndef WITH_REFINEMENTS
    .equ WITH_REFINEMENTS,0
    .endif
| Conditional Allstar records; no ordinary roster table or SRAM is rewritten.
    .ifndef WITH_TRANSFERS
    .equ WITH_TRANSFERS,0
    .endif
    .include "season-symbols.inc"
    .equ ACTIVE,0xFFFFF850
    .equ OLDHOME,0xFFFFF858
    .equ OLDAWAY,0xFFFFF85A
    .text
    .globl _start
_start:
    bra.w enter
    bra.w leave
    bra.w table_a0
    bra.w table_a1
    bra.w table_a2
    bra.w table_a5
    bra.w photo_a0
    bra.w crit_a0
    bra.w goalie_a0
    bra.w a0_shift_d0
    bra.w a1_shift_d0
    bra.w a1_shift_d3
    bra.w a1_index_d0
    bra.w a1_index_d1
    bra.w a0_read_d0
    bra.w crit_attribute
    bra.w strict_compare
    bra.w goalie_a1
    bra.w team_title
    bra.w team_overall
enter:
    cmpi.w #1,ACTIVE
    beq.s entered
    move.w 0xFFFFD04C,OLDHOME
    move.w 0xFFFFD04E,OLDAWAY
    move.w #1,ACTIVE
entered:
    jsr 0x229000
    clr.w 0xFFFFD04C
    move.w #1,0xFFFFD04E
    rts
leave:
    cmpi.w #1,ACTIVE
    bne.s left
    clr.w ACTIVE
    move.w OLDHOME,0xFFFFD04C
    move.w OLDAWAY,0xFFFFD04E
left:
    rts

| MOVEA/LEA preserve every CCR/IRQ bit. These selected bases do so too.
    .macro base name,reg,ordinary,special
\name:
    move.w %sr,-(%sp)
    movea.l #\ordinary,\reg
    cmpi.w #1,ACTIVE
    bne.s 9f
    cmpi.w #1,0xFFFFF84C
    bne.s 9f
    tst.w 0xFFFFF06C
    bne.s 9f
    movea.l #\special,\reg
9:  move.w (%sp)+,%sr
    .if WITH_TRANSFERS
    .ifc \name,goalie_a0
    jsr 0x23602C
    .endif
    .ifc \name,goalie_a1
    jsr 0x236030
    .endif
    .ifc \name,crit_a0
    jsr 0x236038
    .endif
    .endif
    rts
    .endm
    base table_a0,%a0,0x30E,0x22C800
    base table_a1,%a1,0x30E,0x22C800
    base table_a2,%a2,0x30E,0x22C800
    base table_a5,%a5,0x30E,0x22C800
    base photo_a0,%a0,0x38E,0x22C880
    base crit_a0,%a0,0x2FF800,0x22C900
    base goalie_a0,%a0,GK_TAB,0x22CC40
    base goalie_a1,%a1,GK_TAB,0x22CC40

| Whole displaced native instruction sequences, including their exact flags.
a0_shift_d0:
    bsr.w table_a0
    asl.w #2,%d0
    rts
a1_shift_d0:
    bsr.w table_a1
    asl.w #2,%d0
    rts
a1_shift_d3:
    bsr.w table_a1
    asl.w #2,%d3
    rts
a1_index_d0:
    bsr.w table_a1
    movea.l (%a1,%d0.w),%a1
    rts
a1_index_d1:
    bsr.w table_a1
    movea.l (%a1,%d1.w),%a1
    rts
a0_read_d0:
    bsr.w table_a0
    move.w (%a2),%d0
    rts
crit_attribute:
    bsr.w table_a0
    movea.l 0x1E(%a2),%a1
    rts
strict_compare:
    bsr.w table_a0
    cmp.l (%a0,%d0.w),%d5
    rts

| Cached city-title bitmaps still belong to the cosmetic club shells. Use the
| native text font in their same11x2 cell rectangle for actual Allstar names.
team_title:
    cmpi.w #1,ACTIVE
    bne.w original_title
    cmpi.w #1,0xFFFFF84C
    bne.w original_title
    tst.w 0xFFFFF06C
    bne.w original_title
    tst.w %d0
    beq.s title_home
    cmpi.w #44,%d0
    bne.w original_title
    cmpi.w #1,0xFFFFC332
    bhi.w original_title
    bra.s title_valid
title_home:
    cmpi.w #1,0xFFFFC330
    bhi.w original_title
title_valid:
    movem.l %d0-%d7/%a0-%a6,-(%sp)
    move.w 0xFFFFBF78,-(%sp)
    bset #2,0xFFFFBF78
    move.w 0xFFFFB028,%d6
    move.w 0xFFFFB02A,%d7
    move.w 0xFFFFB02C,%d4
    lea 0xFFFFC330,%a0
    tst.w %d0
    beq.s title_side
    addq.l #2,%a0
title_side:
    lea title_a(%pc),%a1
    tst.w (%a0)
    beq.s draw_title
    lea title_b(%pc),%a1
draw_title:
    jsr 0x11BA4
    move.w %d6,0xFFFFB028
    move.w %d7,0xFFFFB02A
    addq.w #1,0xFFFFB02A
    lea title_blank(%pc),%a1
    jsr 0x11BA4
    move.w %d4,0xFFFFB02C
    move.w %d6,0xFFFFB028
    move.w %d7,0xFFFFB02A
    addq.w #2,0xFFFFB02A
    addi.w #11,0xFFFFB028
    subq.w #2,0xFFFFB02A
    move.w (%sp)+,0xFFFFBF78
    movem.l (%sp)+,%d0-%d7/%a0-%a6
    rts
original_title:
    movem.l %d0-%d2/%a0-%a1,-(%sp)
    move.w 0xFFFFBF78,-(%sp)
    jmp 0x8080
title_a:
    .word 13
    .ascii " ALLSTAR A "
    .even
title_b:
    .word 13
    .ascii " ALLSTAR B "
    .even
title_blank:
    .word 13
    .ascii "           "
    .even

| Native FE172 otherwise reads a fixed original-club rating. Selected Allstar
| teams display floor(mean of their26 native zero-hot/cold player overalls).
team_overall:
    .if WITH_REFINEMENTS
    move.l %d0,-(%sp)
    jsr 0x25800C                       | current transferred roster mean, or -1 for ordinary/Allstar
    tst.w %d0
    bmi.s refined_overall_fallback
    move.w %d0,2(%sp)                  | native getter changes only D0's low word
    move.l (%sp)+,%d0
    tst.w %d0                          | exact native MOVE.w N/Z/V/C; preserve caller's X
    rts
refined_overall_fallback:
    move.l (%sp)+,%d0                  | -1 sentinel must not replace the caller's high word
    .endif
    cmpi.w #1,ACTIVE
    bne.w original_overall
    cmpi.w #1,0xFFFFF84C
    bne.w original_overall
    tst.w 0xFFFFF06C
    bne.w original_overall
    cmpa.l #0xFFFFC6CE,%a2
    beq.s overall_cache
    cmpa.l #0xFFFFCA32,%a2
    bne.s original_overall
overall_cache:
    cmpi.l #0x22D000,0x1E(%a2)
    beq.s overall_a
    cmpi.l #0x22D800,0x1E(%a2)
    bne.s original_overall
    move.w 0x22CD6A,%d0
    rts
overall_a:
    move.w 0x22CD68,%d0
    rts
original_overall:
    movem.l %d1-%d7/%a0-%a6,-(%sp)
    move.w 0x28(%a2),%d0
    jmp 0xFE17A
