| Season mode: one team's players with their season stats (opened with C on a team in Season Standings).
| d0 = team on entry (jsr). Skaters sorted by points: #, name, G, A, PTS, SOG. 16 per page, Left/Right, Start = back (rts).
| Page 2: the rest of the skaters (up to 9), then the goalies: GP, W, GA, SV% (SRAM $E20, written by season.s).

        .equ    SRAM_OFF, 0x1000
        .equ    MAGIC,    0x5345534E
        .equ    SRAM_RD,  0x1A244
        .equ    PSTAT_OFF,0x1220
        .equ    ROWLEN,   100
        .equ    ROWBUF,   0xFFF100
        .equ    HDRT,     0xFFF180       | 16-byte header copy
        .equ    TEAM,     0xFFF190
        .equ    PAGE,     0xFFF192
        .equ    NSK,      0xFFF194       | number of skaters listed
        .equ    LST,      0xFFF1A0       | up to 25 x (slot byte, jersey byte, points word)
        .equ    TITLE,    0xFFF220       | title string for $11DF4
        .equ    STR,      0xFFF260       | text (up to $FFF7FF)
        .equ    GKT,      0xFFF240       | this team's 3 goalie records (15 bytes)
        .equ    GK_OFF,   0xE20

        .text
        .globl  _start
_start:
        move.w  %d0,TEAM
        clr.w   PAGE
        lea     HDRT,%a0
        move.l  #SRAM_OFF,%d0
        moveq   #16,%d1
        jsr     SRAM_RD
        moveq   #0,%d0
        move.w  TEAM,%d0
        mulu.w  #ROWLEN,%d0
        addi.l  #PSTAT_OFF,%d0
        lea     ROWBUF,%a0
        moveq   #ROWLEN,%d1
        jsr     SRAM_RD
        cmpi.l  #MAGIC,HDRT             | no stats yet: zeros
        bne.s   1f
        cmpi.w  #2,HDRT+14              | 2 = skaters, 3 = skaters and goalies
        bcs.s   1f
        tst.w   HDRT+12                 | "New Season" chosen: empty
        beq.s   2f
1:      lea     ROWBUF,%a0
        moveq   #ROWLEN/2-1,%d1
3:      clr.w   (%a0)+
        dbra    %d1,3b
        clr.w   HDRT+14
2:      moveq   #0,%d0                  | goalie records
        move.w  TEAM,%d0
        mulu.w  #15,%d0
        addi.l  #GK_OFF,%d0
        lea     GKT,%a0
        moveq   #15,%d1
        jsr     SRAM_RD
        cmpi.w  #3,HDRT+14
        beq.s   4f
        lea     GKT,%a0
        moveq   #14,%d1
5:      clr.b   (%a0)+
        dbra    %d1,5b
4:      bsr.w   build
        bsr.w   screen

loop:   moveq   #0,%d0
        jsr     0x80BA
        jsr     0xA41E
        jsr     0x11318
        btst    #7,%d3
        beq.s   4f
        rts                             | back to the standings
4:      btst    #3,%d1
        beq.s   5f
        tst.w   PAGE
        bne.s   loop
        move.w  #1,PAGE
        bsr.w   draw
        bra.s   loop
5:      btst    #2,%d1
        beq.s   loop
        tst.w   PAGE
        beq.s   loop
        clr.w   PAGE
        bsr.w   draw
        bra.s   loop

| screen: panel + title (the team's city) + rows
screen: 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
        bsr.w   teamrec                 | a1 = team record
        move.w  4(%a1),%d0              | offset to the name strings: city first
        adda.w  %d0,%a1
        lea     TITLE+2,%a0
        move.b  #0xBD,(%a0)+
        move.b  #0x06,(%a0)+
        move.b  #0x04,(%a0)+
        move.w  (%a1)+,%d1
        subq.w  #2,%d1
        cmpi.w  #16,%d1
        ble.s   1f
        moveq   #16,%d1
1:      subq.w  #1,%d1
2:      move.b  (%a1)+,%d0
        beq.s   3f
        move.b  %d0,(%a0)+
        dbra    %d1,2b
3:      move.b  #0xBD,(%a0)+
        move.b  #0x07,(%a0)+
        move.b  #0x01,(%a0)+
        move.l  %a0,%d0
        btst    #0,%d0
        beq.s   4f
        move.b  #0x20,(%a0)+
4:      lea     TITLE,%a1
        move.l  %a0,%d0
        sub.l   %a1,%d0
        move.w  %d0,(%a1)
        jsr     0x11DF4
        bra.w   draw

| a1 = this team's record (table at $30E)
teamrec:
        move.w  TEAM,%d0
        lsl.w   #2,%d0
        movea.l #0x30E,%a1
        movea.l (%a1,%d0.w),%a1
        rts

| build LST: skaters (not goalies) with points, sorted by points then goals
build:  bsr.s   teamrec
        move.w  (%a1),%d0
        adda.w  %d0,%a1                 | first player
        lea     LST,%a2
        moveq   #0,%d4                  | count
        moveq   #0,%d5                  | slot
1:      move.w  (%a1),%d1               | player: word length + name, jersey, 7 rating bytes
        lea     (%a1,%d1.w),%a3         | a3 = jersey byte
        tst.w   %d5
        beq.s   3f                      | slot 0 is a goalie (and holds no stats)
        move.b  5(%a3),%d0              | nibbles 8,9 (stick, accuracy) are 0 only for goalies
        bne.s   2f
        move.b  4(%a3),%d0              | nibble 6 (checking)
        andi.b  #0xF0,%d0
        beq.s   3f
2:      move.b  %d5,(%a2)+
        move.b  (%a3),(%a2)+            | jersey (BCD)
        lea     ROWBUF-4,%a0
        move.w  %d5,%d0
        lsl.w   #2,%d0
        moveq   #0,%d1
        moveq   #0,%d2
        move.b  (%a0,%d0.w),%d1         | goals
        move.b  1(%a0,%d0.w),%d2        | assists
        add.w   %d1,%d2
        lsl.w   #8,%d2
        add.w   %d1,%d2
        move.w  %d2,(%a2)+
        addq.w  #1,%d4
3:      lea     8(%a3),%a1
        addq.w  #1,%d5
        cmpi.w  #26,%d5
        blt.s   1b
        move.w  %d4,NSK
        | sort LST by key, highest first (insertion sort, stable)
        moveq   #1,%d6
5:      cmp.w   %d4,%d6
        bge.s   9f
        lea     LST,%a2
        move.w  %d6,%d0
        lsl.w   #2,%d0
        move.l  (%a2,%d0.w),%d2         | entry i
        move.w  %d6,%d7
6:      tst.w   %d7
        beq.s   8f
        move.w  %d7,%d0
        subq.w  #1,%d0
        lsl.w   #2,%d0
        move.l  (%a2,%d0.w),%d3
        cmp.w   %d3,%d2                 | key of j-1 < key of i: shift down
        bls.s   8f
        move.l  %d3,4(%a2,%d0.w)
        subq.w  #1,%d7
        bra.s   6b
8:      move.w  %d7,%d0
        lsl.w   #2,%d0
        move.l  %d2,(%a2,%d0.w)
        addq.w  #1,%d6
        bra.s   5b
9:      rts

draw:   lea     STR+2,%a0
        move.b  #0xF8,(%a0)+
        move.b  #0x06,(%a0)+
        move.b  #0x03,(%a0)+
        move.b  #0x01,(%a0)+
        move.b  #0x05,(%a0)+
        move.b  #0xF9,(%a0)+
        move.b  #0x01,(%a0)+
        lea     hdr,%a1
1:      move.b  (%a1)+,(%a0)+
        bne.s   1b
        subq.l  #1,%a0
        move.w  PAGE,%d7
        lsl.w   #4,%d7                  | first entry on this page
        moveq   #0,%d4                  | row
2:      move.w  %d7,%d6
        add.w   %d4,%d6
        move.b  #0xFC,(%a0)+
        move.w  %d4,%d1
        addq.w  #8,%d1
        move.b  %d1,(%a0)+
        tst.w   PAGE
        beq.s   30f
        cmpi.w  #9,%d4                  | page 2: rows 9.. are the goalies
        bge.w   40f
30:     cmp.w   NSK,%d6
        bge.w   20f                     | past the last player: blank row
        lea     LST,%a2
        lsl.w   #2,%d6
        lea     (%a2,%d6.w),%a2
        moveq   #1,%d1                  | jersey
        bsr.w   col
        move.b  1(%a2),%d0
        move.b  %d0,%d2
        lsr.b   #4,%d2
        beq.s   3f
        addi.b  #0x30,%d2
        move.b  %d2,(%a0)+
        bra.s   4f
3:      move.b  #0x20,(%a0)+
4:      andi.b  #15,%d0
        addi.b  #0x30,%d0
        move.b  %d0,(%a0)+
        moveq   #4,%d1
        bsr.w   col
        moveq   #0,%d6
        move.b  (%a2),%d6               | slot
        bsr.w   name
        lea     ROWBUF-4,%a3
        move.w  %d6,%d0
        lsl.w   #2,%d0
        lea     (%a3,%d0.w),%a3
        moveq   #21,%d1
        bsr.w   col
        moveq   #0,%d2
        move.b  (%a3),%d2               | G
        bsr.w   num3
        moveq   #25,%d1
        bsr.w   col
        moveq   #0,%d2
        move.b  1(%a3),%d2              | A
        bsr.w   num3
        moveq   #29,%d1
        bsr.w   col
        moveq   #0,%d2
        move.b  (%a3),%d2
        moveq   #0,%d0
        move.b  1(%a3),%d0
        add.w   %d0,%d2                 | PTS
        bsr.w   num3
        moveq   #34,%d1
        bsr.w   col
        move.w  2(%a3),%d2              | SOG
        bsr.w   num3
        bra.s   21f
20:     moveq   #1,%d1                  | blank row (clears page 1 text)
        bsr.w   col
        lea     blank,%a1
5:      move.b  (%a1)+,(%a0)+
        bne.s   5b
        subq.l  #1,%a0
21:     addq.w  #1,%d4
        cmpi.w  #16,%d4
        blt.w   2b
        bra.w   50f
| goalie rows on page 2: row 10 = header, 11.. = goalies (roster index 0..), others blank
40:     cmpi.w  #10,%d4
        bne.s   41f
        lea     ghdr,%a1
42:     move.b  (%a1)+,(%a0)+
        bne.s   42b
        subq.l  #1,%a0
        bra.s   21b
41:     move.w  %d4,%d6
        subi.w  #11,%d6                 | goalie index
        bmi.w   20b
        lea     gktab,%a1
        move.w  TEAM,%d0
        lsl.w   #2,%d0
        moveq   #0,%d1
        move.b  2(%a1,%d0.w),%d1        | number of goalies
        cmp.w   %d1,%d6
        bge.w   20b
        bsr.w   goalie
        bra.s   21b
50:
        lea     foot,%a1
6:      move.b  (%a1)+,(%a0)+
        bne.s   6b
        subq.l  #1,%a0
        tst.w   PAGE                    | page 2 (goalies) always exists
        bne.s   8f
        move.b  #0x20,-8(%a0)
        bra.s   9f
8:      move.b  #0x20,-1(%a0)
9:      move.l  %a0,%d0
        btst    #0,%d0
        beq.s   10f
        move.b  #0x20,(%a0)+
10:     move.b  #0xF9,(%a0)+
        move.b  #0x00,(%a0)+
        lea     STR,%a1
        move.l  %a0,%d0
        sub.l   %a1,%d0
        move.w  %d0,(%a1)
        jsr     0x11A48
        rts

| name: d6 = slot -> copy the player's name (max 16 chars, '_' -> ' ') to (a0)+
name:   movem.l %d0-%d2/%a1,-(%sp)
        move.l  %a0,-(%sp)              | start, to pad to 16 characters
        bsr.w   teamrec
        move.w  (%a1),%d1
        adda.w  %d1,%a1
        move.w  %d6,%d2
        bra.s   2f
1:      move.w  (%a1),%d1
        adda.w  %d1,%a1
        addq.l  #8,%a1
2:      dbra    %d2,1b
        move.w  (%a1)+,%d1
        subq.w  #2,%d1
        cmpi.w  #16,%d1
        ble.s   3f
        moveq   #16,%d1
3:      subq.w  #1,%d1
        bmi.s   6f
4:      move.b  (%a1)+,%d0
        beq.s   6f
        cmpi.b  #0x5F,%d0
        bne.s   5f
        moveq   #0x20,%d0
5:      move.b  %d0,(%a0)+
        dbra    %d1,4b
6:      move.l  %a0,%d0
        sub.l   (%sp)+,%d0
7:      cmpi.w  #16,%d0
        bge.s   8f
        move.b  #0x20,(%a0)+
        addq.w  #1,%d0
        bra.s   7b
8:      movem.l (%sp)+,%d0-%d2/%a1
        rts

col:    move.b  #0xFD,(%a0)+
        move.b  %d1,(%a0)+
        rts

num3:   movem.l %d0-%d3,-(%sp)
        andi.l  #0xFFFF,%d2
        divu.w  #100,%d2
        move.w  %d2,%d0
        swap    %d2
        andi.l  #0xFFFF,%d2
        divu.w  #10,%d2
        move.w  %d2,%d1
        swap    %d2
        moveq   #0x20,%d3
        tst.w   %d0
        beq.s   1f
        move.b  %d0,%d3
        addi.b  #0x30,%d3
1:      move.b  %d3,(%a0)+
        moveq   #0x20,%d3
        tst.w   %d0
        bne.s   2f
        tst.w   %d1
        beq.s   3f
2:      move.b  %d1,%d3
        addi.b  #0x30,%d3
3:      move.b  %d3,(%a0)+
        addi.b  #0x30,%d2
        move.b  %d2,(%a0)+
        movem.l (%sp)+,%d0-%d3
        rts

| goalie: d6 = roster index (0..2) -> #, name, GP, W, GA, SV% at (a0)+
goalie: movem.l %d0-%d7/%a1-%a3,-(%sp)
        bsr.w   teamrec                 | jersey: player entry start + its length word
        move.w  (%a1),%d1
        adda.w  %d1,%a1
        move.w  %d6,%d2
        bra.s   2f
1:      move.w  (%a1),%d1
        adda.w  %d1,%a1
        addq.l  #8,%a1
2:      dbra    %d2,1b
        move.w  (%a1),%d1
        move.b  (%a1,%d1.w),%d0         | BCD jersey
        moveq   #1,%d1
        bsr.w   col
        move.b  %d0,%d2
        lsr.b   #4,%d2
        beq.s   3f
        addi.b  #0x30,%d2
        move.b  %d2,(%a0)+
        bra.s   4f
3:      move.b  #0x20,(%a0)+
4:      andi.b  #15,%d0
        addi.b  #0x30,%d0
        move.b  %d0,(%a0)+
        moveq   #4,%d1
        bsr.w   col
        bsr.w   name
        lea     GKT,%a3                 | record: GP, W, GA:12 | SA:12
        move.w  %d6,%d0
        mulu.w  #5,%d0
        adda.w  %d0,%a3
        moveq   #21,%d1
        bsr.w   col
        moveq   #0,%d2
        move.b  (%a3),%d2               | GP
        bsr.w   num3
        moveq   #25,%d1
        bsr.w   col
        moveq   #0,%d2
        move.b  1(%a3),%d2              | W
        bsr.w   num3
        moveq   #0,%d4                  | d4 = GA
        move.b  2(%a3),%d4
        lsl.w   #4,%d4
        moveq   #0,%d0
        move.b  3(%a3),%d0
        move.w  %d0,%d5
        lsr.w   #4,%d0
        or.w    %d0,%d4
        andi.w  #15,%d5                 | d5 = SA
        lsl.w   #8,%d5
        move.b  4(%a3),%d5
        moveq   #29,%d1
        bsr.w   col
        move.w  %d4,%d2
        bsr.w   num3
        moveq   #34,%d1
        bsr.w   col
        tst.w   %d5
        bne.s   5f
        lea     nosv,%a1                | no shots yet
6:      move.b  (%a1)+,(%a0)+
        bne.s   6b
        subq.l  #1,%a0
        bra.s   9f
5:      move.w  %d5,%d2                 | (SA - GA) * 1000 / SA
        sub.w   %d4,%d2
        bcc.s   7f
        moveq   #0,%d2
7:      mulu.w  #1000,%d2
        divu.w  %d5,%d2
        cmpi.w  #1000,%d2
        bcs.s   8f
        lea     sv1,%a1                 | 1.000
        bra.s   6b
8:      move.b  #0x2E,(%a0)+            | .ddd
        andi.l  #0xFFFF,%d2
        divu.w  #100,%d2
        addi.b  #0x30,%d2
        move.b  %d2,(%a0)+
        swap    %d2
        andi.l  #0xFFFF,%d2
        divu.w  #10,%d2
        addi.b  #0x30,%d2
        move.b  %d2,(%a0)+
        swap    %d2
        addi.b  #0x30,%d2
        move.b  %d2,(%a0)+
9:      movem.l (%sp)+,%d0-%d7/%a1-%a3
        rts

ghdr:   .byte   0xFD,1
        .ascii  " #"
        .byte   0xFD,4
        .ascii  "Goalie          "
        .byte   0xFD,21
        .ascii  " GP"
        .byte   0xFD,25
        .ascii  "  W"
        .byte   0xFD,29
        .ascii  " GA"
        .byte   0xFD,34
        .ascii  "SV% "
        .byte   0
nosv:   .ascii  " ---"
        .byte   0
sv1:    .ascii  "1.00"
        .byte   0

hdr:    .byte   0xFC,7,0xFD,1
        .ascii  " #"
        .byte   0xFD,4
        .ascii  "Player"
        .byte   0xFD,21
        .ascii  "  G"
        .byte   0xFD,25
        .ascii  "  A"
        .byte   0xFD,29
        .ascii  "PTS"
        .byte   0xFD,34
        .ascii  "SOG"
        .byte   0
blank:  .ascii  "                                       "
        .byte   0
foot:   .byte   0xFC,0x1A,0xFD,0x10
        .ascii  "[ More ]"
        .byte   0
        .even
        .include "gk.inc"
