| Private pre-game match simulation, preserving existing season and goalie patches.
    .include "season-symbols.inc"
    .equ SIMFLAG,0xFFF00A
    .equ RESULT,0xFFE700
    .equ HOME_T,0xFFC331
    .equ AWAY_T,0xFFC333
    .equ HOME_G,0xFFC6DA
    .equ AWAY_G,0xFFCA3E
    .equ PERIOD,0xFFC466
    .equ SHOTSV,0xFFF0F2
    .text
    .globl _start
_start:
    bra.w simulate
    bra.w statgate
simulate:
    tst.w 0xFFD048
    bne.w back
    tst.w PERIOD
    bne.w back
    | Read the header to reject a completed season (including eliminated teams).
    lea RESULT,%a0
    move.l #0x1000,%d0
    moveq #16,%d1
    jsr 0x1a244
    cmpi.l #0x5345534E,RESULT
    bne.s eligible
    tst.w RESULT+12
    bne.s eligible
    tst.w RESULT+6
    beq.s eligible
    move.w RESULT+8,%d0
    cmp.w RESULT+10,%d0
    bcc.w completed
eligible:
    move.w 0xFFD04C,%d0
    move.b %d0,HOME_T
    jsr GOALS_FN
    move.w %d0,HOME_G
    move.w 0xFFD04E,%d0
    move.b %d0,AWAY_T
    jsr GOALS_FN
    move.w %d0,AWAY_G
    move.w #2,PERIOD
    cmp.w HOME_G,%d0
    bne.s score_ready
    move.w #3,PERIOD
    moveq #2,%d0
    jsr 0x11086
    tst.w %d0
    beq.s away_ot
    addq.w #1,HOME_G
    bra.s score_ready
away_ot:
    addq.w #1,AWAY_G
score_ready:
    bclr #4,0xFFC2EA
    move.w #0x5349,SIMFLAG
    | Skip only the original menu/record routine at the entry. The season's
    | normal initialization, round, player stats, goalie stats and checksum run.
    jsr 0x2f8006
    clr.w SIMFLAG
    bsr.w panel
    lea saved,%a1
    jsr 0x11a48
    move.w #8,0xFFB028
    move.w #11,0xFFB02A
    bsr.w scoretext
    lea RESULT,%a1
    jsr 0x11ba4
    lea regulation,%a1
    cmpi.w #3,PERIOD
    bne.s 1f
    lea overtime,%a1
1:  jsr 0x11a48
    bra.s resultloop
completed:
    bsr.w panel
    lea complete_text,%a1
    jsr 0x11a48
resultloop:
    | Wait for a fresh Start press; the selection button cannot simulate twice.
    moveq #0,%d0
    jsr 0x80ba
    jsr 0x2fd500
    jsr 0x11318
    btst #7,%d3
    beq.s resultloop
    jmp 0x172fa
back:
    jmp 0x9cd8
panel:
    move.l #0x17692,0xFFB03A
    moveq #10,%d0
    moveq #26,%d1
    jsr 0x9bd8
    jsr 0x11b92
    .word 6
    .byte 0xBD,0x04,0x01,0x00
    moveq #0x20,%d0
    moveq #6,%d1
    jsr 0x119b8
    jsr 0x11de2
    .word 24
    .byte 0xBD,0x06,0x04
    .ascii "Simulated Match "
    .byte 0xBD,0x07,0x01
    | Static panel: stop the rink sprite DMA and terminate its old sprite list.
    clr.w 0xFFC2E8
    move.w %sr,-(%sp)
    move.w #0x2700,%sr
    move.w 0xFFB002,%d0
    jsr 0x11680
    moveq #0,%d0
    move.l %d0,(%a0)
    move.l %d0,(%a0)
    move.w (%sp)+,%sr
    rts

statgate:
    cmpi.w #0x5349,SIMFLAG
    beq.s simulated_stats
    | Original eight bytes replaced at season.s save: addreal; gkreal.
    jsr ADDREAL_FN
    jmp GKREAL_FN
simulated_stats:
    movem.l %d0-%d7/%a0-%a6,-(%sp)
    moveq #0,%d0
    move.b HOME_T,%d0
    move.w HOME_G,%d1
    jsr DIST_FN
    move.w SHOTSV,-(%sp)
    moveq #0,%d0
    move.b AWAY_T,%d0
    move.w AWAY_G,%d1
    jsr DIST_FN
    moveq #0,%d0
    move.b HOME_T,%d0
    move.w AWAY_G,%d1
    move.w SHOTSV,%d2
    moveq #0,%d3
    move.w HOME_G,%d4
    cmp.w AWAY_G,%d4
    bls.s 1f
    moveq #1,%d3
1:  jsr GKSIM_FN
    moveq #0,%d0
    move.b AWAY_T,%d0
    move.w HOME_G,%d1
    move.w (%sp)+,%d2
    moveq #0,%d3
    move.w AWAY_G,%d4
    cmp.w HOME_G,%d4
    bls.s 2f
    moveq #1,%d3
2:  jsr GKSIM_FN
    movem.l (%sp)+,%d0-%d7/%a0-%a6
    rts

scoretext:
    lea RESULT,%a0
    move.w #22,(%a0)+
    move.w 0xFFD04C,%d0
    bsr.s abbreviation
    move.b #32,(%a0)+
    move.w HOME_G,%d0
    addi.b #48,%d0
    move.b %d0,(%a0)+
    move.b #32,(%a0)+
    move.b #45,(%a0)+
    move.b #32,(%a0)+
    move.w AWAY_G,%d0
    addi.b #48,%d0
    move.b %d0,(%a0)+
    move.b #32,(%a0)+
    move.w 0xFFD04E,%d0
    bsr.s abbreviation
    moveq #6,%d0
1:  move.b #32,(%a0)+
    dbra %d0,1b
    rts
abbreviation:
    mulu.w #3,%d0
    lea abbr,%a1
    move.b (%a1,%d0.w),(%a0)+
    move.b 1(%a1,%d0.w),(%a0)+
    move.b 2(%a1,%d0.w),(%a0)+
    rts
saved:
    .word saved_end-saved
    .byte 0xF8,6,3,1,5,0xF9,1,0xFC,9,0xFD,8
    .ascii "Final score"
    .byte 0xFC,16,0xFD,8
    .ascii "Result saved"
    .byte 0xFC,20,0xFD,6
    .ascii "Start = next match"
    .byte 0xF9,0
saved_end:
    .even
regulation:
    .word regulation_end-regulation
    .byte 0xF8,6,3,1,5,0xFC,13,0xFD,8
    .ascii "Regulation"
regulation_end:
    .even
overtime:
    .word overtime_end-overtime
    .byte 0xF8,6,3,1,5,0xFC,13,0xFD,8
    .ascii "Overtime"
overtime_end:
    .even
complete_text:
    .word complete_end-complete_text
    .byte 0xF8,6,3,1,5,0xFC,11,0xFD,6
    .ascii "Season complete"
    .byte 0xFC,20,0xFD,6
    .ascii "Start = main menu"
complete_end:
    .even
abbr:
    .ascii "ANABOSBUFCGYCARCHICOLCBJDALDETEDMFLALAKMINMTLNSHNJDNYINYROTTPHIPITSJSSEASTLTBLTORUTAVANVGKWASWPG"
    .even
