47 lines
1.3 KiB
NASM
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;
|