;; multiply two 24-bit operands; 24-bit product ;; ;; r = a * b ;; ;; args: ;; X: zero page offset ;; uint24_t * a = [0, 1, 2] ;; uint24_t * b = [3, 4, 5] ;; uint24_t * r = [6, 7, 8] mul24: LDA # 0 STA zp,x 6 STA zp,x 7 STA zp,x 8 _mul24_loop: LDA zp,x 0 ;; while (a) { ORA zp,x 1 ;; ORA zp,x 2 ;; BEQ r :_mul24_ret ;; LDA # 1 ;; if (a & 1) AND zp,x 0 ;; BEQ r :_mul24_nand_1 ;; CLC i ;; r += b; LDA zp,x 3 ;;; 7..0 ADC zp,x 6 ;; STA zp,x 6 ;; LDA zp,x 4 ;;; 15..8 ADC zp,x 7 ;; STA zp,x 7 ;; LDA zp,x 5 ;;; 23..16 ADC zp,x 8 ;; STA zp,x 8 ;; _mul24_nand_1: LSR zp,x 2 ;; a >>= 1 ROR zp,x 1 ;; ROR zp,x 0 ;; ASL zp,x 3 ;; b <<= 1 ROL zp,x 4 ;; ROL zp,x 5 ;; JMP a :_mul24_loop ;; } _mul24_ret: RTS s ;; return;