⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 math.asm

📁 6502bios,关于6502的sbc,有lcd,time,irq,模块
💻 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 + -