| Fixed Easy assistance. No new RAM/SRAM. Physical pad sides define human clubs;
| an AI teammate is helped even if he has never been manually controlled.
| Skills use native0..30; awareness stores (15 + (15 XOR (skill>>1)))>>1:
| maximum30 ->7ticks;20-equivalent6 ->13ticks. Fighting is even0..14.
 .text
 .globl _start
_start:
 bra.w frame
 bra.w apply
 bra.w roster
 bra.w crit
 bra.w lookup
 bra.w roster_format

| A2 = native team block. D0=1human,0CPU; all other registers preserved.
human:
 movem.l %d1-%d2/%a0,-(%sp)
 moveq #1,%d2
 move.l %a2,%d0
 cmpi.w #0xC6CE,%d0
 beq.s human_scan
 moveq #2,%d2
 cmpi.w #0xCA32,%d0
 bne.s human_no
human_scan:
 lea 0xFFFFC328,%a0
 moveq #3,%d1
human_loop:
 cmp.w (%a0)+,%d2
 beq.s human_yes
 dbra %d1,human_loop
human_no:
 moveq #0,%d0
 bra.s human_done
human_yes:
 moveq #1,%d0
human_done:
 movem.l (%sp)+,%d1-%d2/%a0
 rts
actor_team:
 movea.w #0xC6CE,%a2
 btst #6,0x62(%a3)
 beq.s actor_done
 adda.w #0x364,%a2
actor_done:
 rts

frame:
 movem.l %d0-%d4/%a0-%a3,-(%sp)
 move.w 0xFFF730,%d4
 clr.w 0xFFF70E
 clr.w 0xFFF72A
 movea.w #0xC6CE,%a2
 bsr.w human
 move.b %d0,0xFFF730
 move.w #-1000,0xFFF72C
 tst.w %d0
 beq.s frame_away
 neg.w 0xFFF72C
 bsr.w fill_energy
frame_away:
 movea.w #0xCA32,%a2
 bsr.w human
 move.b %d0,0xFFF731
 move.w #-1000,0xFFF72E
 tst.w %d0
 beq.s frame_actors
 neg.w 0xFFF72E
 bsr.w fill_energy
frame_actors:
 cmpi.w #0x4553,0xFFF732
 bne.s frame_dirty
 cmp.w 0xFFF730,%d4
 beq.s frame_done
frame_dirty:
 move.w #0x4553,0xFFF732
 move.w #0x4553,0xFFF734
 moveq #0,%d0
 movea.w #0xB04A,%a3
frame_loop:
 bsr.w apply
 adda.w #0x80,%a3
 addq.w #1,%d0
 cmpi.w #12,%d0
 bcs.s frame_loop
frame_done:
 movem.l (%sp)+,%d0-%d4/%a0-%a3
 rts
fill_energy:
 lea 0x32(%a2),%a0
 moveq #25,%d1
fill_loop:
 move.w #0x1000,(%a0)+
 dbra %d1,fill_loop
 rts

| D0=validated on-ice index; never touch identities, handedness or jersey.
apply:
 movem.l %d0-%d4/%a0-%a2,-(%sp)
 lea 0xFFF71C,%a0
 tst.b (%a0,%d0.w)
 beq.w apply_done
 lea 0xFFF710,%a0
 move.b #0x7F,(%a0,%d0.w)
 bsr.w actor_team
 bsr.w human
 moveq #6,%d1
 moveq #13,%d2
 moveq #2,%d3
 tst.w %d0
 beq.s apply_values
 moveq #30,%d1
 moveq #7,%d2
 moveq #14,%d3
apply_values:
 move.b %d1,0x68(%a3)
 move.b %d1,0x69(%a3)
 move.b %d2,0x6A(%a3)
 move.b %d2,0x6B(%a3)
 move.b %d1,0x6C(%a3)
 move.b %d1,0x6D(%a3)
 move.b %d1,0x6E(%a3)
 move.b %d1,0x70(%a3)
 move.b %d1,0x71(%a3)
 move.b %d1,0x72(%a3)
 move.b %d1,0x73(%a3)
 move.b %d3,0x74(%a3)
 move.b %d1,0x75(%a3)
apply_done:
 movem.l (%sp)+,%d0-%d4/%a0-%a2
 rts

| Native post-FA9F8 value; only game-time skill/Overall mode0A, never identity.
roster:
 movem.l %d2-%d3,-(%sp)
 cmpi.w #0x4352,0xFFF700
 bne.s roster_done
 move.l %d4,%d2
 swap %d2
 cmpi.w #0x0A,%d2
 bne.s roster_done
 bsr.w human
 tst.w %d0
 beq.s roster_cpu
 moveq #100,%d0
 move.w #100,%d1
 bra.s roster_done
roster_cpu:
 moveq #20,%d0
 move.w #100,%d1
roster_done:
 movem.l (%sp)+,%d2-%d3
 rts
crit:
 cmpi.w #0x4352,0xFFF700
 bne.s crit_done
 bsr.w human
 tst.w %d0
 beq.s crit_cpu
 moveq #100,%d0
 rts
crit_cpu:
 moveq #20,%d0
crit_done:
 rts
lookup:
 move.l %a2,-(%sp)
 bsr.w actor_team
 bsr.w human
 tst.w %d0
 beq.s lookup_cpu
 moveq #100,%d0
 bra.s lookup_done
lookup_cpu:
 moveq #20,%d0
lookup_done:
 movea.l (%sp)+,%a2
 rts

| Native numeric ratings normally lift low values into25..49. Easy's explicit
| 100/20 display bypasses that transform for skill/Overall mode0A only.
roster_format:
 cmpi.w #2,0xFFF07A
 bne.s format_native
 cmpi.w #0x4352,0xFFF700
 bne.s format_native
 cmpi.w #0x0A,%d4
 bne.s format_native
 cmpa.w #0xC6CE,%a2
 beq.s format_done
 cmpa.w #0xCA32,%a2
 bne.s format_native
format_done:
 rts
format_native:
 jmp 0xFEF7C
