asm-test/aoc/mul24.asm
2022-04-05 14:07:50 -07:00

47 lines
1.3 KiB
NASM

;; 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;