; ========================================================================
; B9_VALUE: independent 9-byte memory and native-register transports.
; Candidate only. UA=14 RAM pointers. Scratch clobbers documented in API.
; Input bank and pointer validity are caller responsibilities.
; ========================================================================
; B9_ZERO: $10=dest pointer. Clobbers IX,$0,$20. UA returns 14.
B9_ZERO:
        PST     UA,&H14
        PRE     IX,$10
        LD      $20,9
        LD      $0,0
B9Z_LOOP:
        STI     $0,(IX+$SX)
        SB      $20,$SY
        JP      NZ,B9Z_LOOP
        RTN

; B9_COPY: $10=source, $12=dest, non-overlap or exact same address.
;          Clobbers IX,$2,$4,$16,$20. UA returns 14.
B9_COPY:
        PST     UA,&H14
        LDW     $2,$10
        LDW     $4,$12
        LD      $20,9
B9C_MOVLOOP:
        PRE     IX,$2
        LD      $16,(IX+$SX)
        ADW     $2,$SY
        PRE     IX,$4
        ST      $16,(IX+$SX)
        ADW     $4,$SY
        SB      $20,$SY
        JP      NZ,B9C_MOVLOOP
        RTN

; B9_LOAD_A: $10=source RAM 9 bytes -> $10..$18 native operand A.
;            Clobbers $2/$3, IX, $20/$21. UA returns 14.
B9_LOAD_A:
        PST     UA,&H14
        LDW     $2,$10
        PRE     IX,$2
        LDM     $10,(IX+$SX),8
        LDW     $20,$2
        LDW     $22,8
        ADW     $20,$22
        PRE     IX,$20
        LD      $18,(IX+$SX)
        RTN

 ; B9_SAVE_A: $24/$25=RAM dest pointer, native $10..$18 unchanged.
;            Clobbers IX,$20..$23; UA returns 14.
; This pointer ABI is intentionally DISJOINT from result registers.
B9_SAVE_A:
        PST     UA,&H14
        PRE     IX,$24
        STM     $10,(IX+$SX),8
        LDW     $20,$24
        LDW     $22,8
        ADW     $20,$22
        PRE     IX,$20
        ST      $18,(IX+$SX)
        RTN

; B9_LOAD_B: $10=source RAM 9 bytes -> $0..$8 native operand B.
;            Clobbers IX,$20..$23; UA returns 14.
B9_LOAD_B:
        PST     UA,&H14
        PRE     IX,$10
        LDM     $0,(IX+$SX),8
        LDW     $20,$10
        LDW     $22,8
        ADW     $20,$22
        PRE     IX,$20
        LD      $8,(IX+$SX)
        RTN

 ; B9_SAVE_B: $24/$25=RAM dest pointer, native $0..$8 unchanged.
;            Clobbers IX,$20..$23; UA returns 14.
B9_SAVE_B:
        PST     UA,&H14
        PRE     IX,$24
        STM     $0,(IX+$SX),8
        LDW     $20,$24
        LDW     $22,8
        ADW     $20,$22
        PRE     IX,$20
        ST      $8,(IX+$SX)
        RTN
