* Signed multiplication
* A*X -> A:Y (A-high byte, Y-low)
* b. Fox/Tqa

/*
     jsr fast_mul.init

     lda #123
     ldx #9
     jsr fast_mul
     rts

*/


.proc fast_mul

sq1l equ $a000
sq1h equ $a200
sq2l equ $a400
sq2h equ $a600

     eor #$80
     sta l1+1
     sta h1+1
     eor #$ff
     sta l2+1
     sta h2+1
     txa
     eor #$80
     tax
     sec
l1   lda sq1l,x
l2   sbc sq2l,x
     tay
h1   lda sq1h,x
h2   sbc sq2h,x
     rts

init ldx #0
     stx sq1l+$100
     stx sq1h+$100
     stx sq2l+$ff
     stx sq2h+$ff
     ldy #$ff
msqr txa
     lsr @
     adc sq1l+$100,x
     sta sq1l,y
     sta sq1l+$101,x
     sta sq2l-1,y
     sta sq2l+$100,x
     lda #0
     adc sq1h+$100,x
     sta sq1h,y
     sta sq1h+$101,x
     sta sq2h-1,y
     sta sq2h+$100,x
     inx
     dey
     bne msqr
     rts
.endp