| Optional targeted B-pass speed. Normal is native; Slow solves the same
| intercept quadratic at floor(4/5 of the original power), minimum1. Native
| time bounds and lead/catch timers remain. Fast-receiver guards keep original
| timing when receiver speed meets/exceeds lower power. Lift uses original time.
| F0E8 active0Normal/1Slow; F0EA original-time transient for this pass only.
| Shared lift/speed tagged record50..53 plus complement is written by2DE410.
| Exports +0 flight wrapper at BF54, +4 menu writer.
    .equ VALUE,0xFFFFF0E8
    .equ VIEW,0xFFFFF06C
    .equ MAP,0xA130F1
    .text
    .globl _start
_start:
    bra.w flight
    bra.w writer
flight:
    jsr 0x2EF00C                     | retain native bounds/short-pass correction first
    move.w %sr,-(%sp)
    cmpi.w #1,VALUE
    bne.w flight_done
    move.w %d2,0xFFFFF0EA             | height remains independent of the slower time
    movem.l %d0-%d1/%d5,-(%sp)
    move.w 18(%sp),%d0               | conservative guard: fast receiver must keep original timing
    move.w 20(%sp),%d1
    muls.w %d0,%d0
    muls.w %d1,%d1
    add.l %d1,%d0
    move.w 0xFFFFBEDE,%d5
    asr.w #2,%d5
    mulu.w #4,%d5
    divu.w #5,%d5
    andi.l #0xFFFF,%d5
    bne.s power_ready
    moveq #1,%d5
power_ready:
    move.w %d5,%d1
    muls.w %d1,%d1
    cmp.l %d1,%d0
    bcc.s retain_native
    move.w %d5,10(%sp)               | keep lower power while restoring all original scratch registers
    movem.l (%sp)+,%d0-%d1/%d5
    move.w 10(%sp),%d2               | native saved target dx/dy below return+SR+velocity pair
    move.w 12(%sp),%d3
    asr.w #2,%d2
    asr.w #2,%d3
    move.w 6(%sp),%d0                | native normalized receiver velocity, never fabricated
    move.w 8(%sp),%d1
    bsr.w solve
    jsr 0x2EF00C                     | same native keeper/skater min/max time rules
    cmp.w 0xFFFFF0EA,%d2
    bge.s flight_done
    move.w 0xFFFFF0EA,%d2              | native no-intercept/root fallback must never make Slow earlier
    bra.s flight_done
retain_native:
    movem.l (%sp)+,%d0-%d1/%d5
flight_done:
    move.w (%sp)+,%sr
    rts

solve:                               | exact native BF04..BF52 arithmetic, local velocity save
    movem.w %d0-%d1,-(%sp)
    muls.w %d2,%d0
    muls.w %d3,%d1
    add.w %d1,%d0
    asl.w #1,%d0
    move.w %d0,%d4
    movem.w (%sp),%d0-%d1
    muls.w %d0,%d0
    muls.w %d1,%d1
    muls.w %d5,%d5
    neg.l %d5
    add.l %d0,%d5
    add.l %d1,%d5
    muls.w %d2,%d2
    muls.w %d3,%d3
    add.l %d2,%d3
    muls.w %d5,%d3
    asl.l #2,%d3
    move.w %d4,%d0
    muls.w %d0,%d0
    sub.l %d3,%d0
    jsr 0x110BE
    moveq #1,%d3
    asr.w #2,%d5
    bne.s root
    moveq #1,%d5
root:
    move.w %d0,%d2
    neg.w %d0
    sub.w %d4,%d2
    ext.l %d2
    divs.w %d5,%d2
    dbpl %d3,root
    bne.s rounded
    addq.w #1,%d2
rounded:
    addq.l #4,%sp
    rts

writer:
    cmpi.w #1,%d3
    bhi.w flags
    tst.w VIEW
    beq.s writable
    tst.w 0xFFFFE3E8                  | completed-game index of the selected season header
    beq.s writable
    cmpi.w #1,0xFFFFE3F0
    beq.w flags
    cmpi.w #3,0xFFFFE3F0
    beq.w flags
    cmpi.w #4,0xFFFFE3F0
    beq.w flags
writable:
    cmp.w VALUE,%d3
    beq.w flags
    move.w %sr,-(%sp)
    movem.l %d0-%d1/%a0-%a1,-(%sp)
    ori.w #0x700,%sr
    move.w %d3,VALUE
    move.b #1,MAP
    jsr 0x2DE410
    lea 0x200001,%a0
    tst.w VIEW
    bne.s checksum
    lea 0x208001,%a0
checksum:
    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
    movem.l (%sp)+,%d0-%d1/%a0-%a1
    move.w (%sp)+,%sr
flags:
    tst.w %d2                        | native row writer return contract
    rts
