📄 math.asm
字号:
; Math functions
; Chris Ward, 7/1/2000
; Some code from the CC65 run-time library by Ullrich von Bassewitz
; *** ADD32: 32-bit add
; ZTMP0-ZTMP3 + ZTMP4-ZTMP7 -> ZTMP0-ZTMP3
; X,Y preserved
ADD32 CLC
LDA ZTMP0 ;byte 0
ADC ZTMP4
STA ZTMP4
LDA ZTMP1 ;byte 1
ADC ZTMP5
STA ZTMP1
LDA ZTMP2 ;byte 2
ADC ZTMP6
STA ZTMP2
LDA ZTMP3 ;byte 3
ADC ZTMP7
STA ZTMP3
RTS
; *** MUL8: 8-bit multiply
; Use only if result < 256
; X * Y -> A (also ZTMP0)
; X,Y preserved
MUL8 TYA
PHA
STX ZTMP0
LDA #0
MUL80 CLC
ADC ZTMP0
DEY
BNE MUL80
PLA
TAY
LDA ZTMP0
RTS
; *** MUL16: 16-bit multiply
; ZTMP0:ZTMP1 * ZTMP2:ZTMP3 -> ZTMP0:ZTMP1
MUL16 lda #0
sta ZTMP4
ldx ZTMP3 ; Get into register for speed
ldy #16 ; Number of bits
MUL160 lsr ZTMP4
ror a
ror ZTMP1
ror ZTMP0
bcc MUL161
clc
adc ZTMP2
pha
txa ; hi byte of left op
adc ZTMP4
sta ZTMP4
pla
MUL161 dey
bpl MUL160
; lda ZTMP0 ; Load the result
; ldx ZTMP1
rts ; Done
; *** MUL32: 32-bit multiply
; ZTMP0-ZTMP3 * ZTMP4-ZTMP7 -> ZTMP0-ZTMP3
MUL32 lda #0
sta ZTMP10
sta ZTMP9
sta ZTMP8
ldy #32
MUL320 lsr ZTMP10
ror ZTMP9
ror ZTMP8
ror a
ror ZTMP3
ror ZTMP2
ror ZTMP1
ror ZTMP0
bcc MUL321
clc
adc ZTMP4
pha
lda ZTMP5
adc ZTMP8
sta ZTMP8
lda ZTMP6
adc ZTMP9
sta ZTMP9
lda ZTMP7
adc ZTMP10
sta ZTMP10
pla
MUL321 dey
bpl MUL320
; lda ZTMP0 ; Load the low result word
; ldx ZTMP1
rts
; *** UDIV16: 16-bit unsigned division
; input: dividend at ZTMP0:ZTMP1
; divisor at ZTMP2:ZTMP3
; output: result at ZTMP0-ZTMP1
; remainder at ZTMP4:ZTMP5
; X,Y preserved
UDIV16 TYA
PHA
LDA #0
STA ZTMP5
LDY #16
UDIV160 ASL ZTMP0
ROL ZTMP1
ROL a
ROL ZTMP5
PHA
CMP ZTMP2
LDA ZTMP5
SBC ZTMP3
BCC UDIV161
STA ZTMP5
PLA
SBC ZTMP2
PHA
INC ZTMP0
UDIV161 PLA
DEY
BNE UDIV160
STA ZTMP4
PLA
TAY
RTS
; *** UDIV32: 32-bit unsigned division
; input: dividend at ZTMP0-ZTMP3
; divisor at ZTMP4-ZTMP7
; output: result at ZTMP0-ZTMP3
; remainder at ZTMP8-ZTMP11
; X,Y preserved
UDIV32 TYA
PHA
LDA #0
STA ZTMP9
STA ZTMP10
STA ZTMP11
LDY #32
UDIV320 ASL ZTMP0
ROL ZTMP1
ROL ZTMP2
ROL ZTMP3
ROL A
ROL ZTMP9
ROL ZTMP10
ROL ZTMP11
;do a subtraction
PHA
CMP ZTMP4
LDA ZTMP9
SBC ZTMP5
LDA ZTMP10
SBC ZTMP6
LDA ZTMP11
SBC ZTMP7
BCC UDIV321
;overflow, do the subtraction again, this time store the result
STA ZTMP7 ;we have the high byte already
PLA
SBC ZTMP4 ;byte 0
PHA
LDA ZTMP9
SBC ZTMP5
STA ZTMP9 ;byte 1
LDA ZTMP10
SBC ZTMP6
STA ZTMP10 ;byte 2
INC ZTMP0 ;set result bit
UDIV321 PLA
DEY
BNE UDIV320
STA ZTMP8
PLA
TAY
RTS
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -