mirror of
https://github.com/irmen/prog8.git
synced 2024-10-25 00:24:16 +00:00
91 lines
1.8 KiB
Plaintext
91 lines
1.8 KiB
Plaintext
; IL65 integer math library for 6502
|
|
; (floating point math is done via the C-64's BASIC ROM routines)
|
|
;
|
|
; some more interesting routines can be found here http://6502org.wikidot.com/software-math
|
|
;
|
|
; Written by Irmen de Jong (irmen@razorvine.net)
|
|
; License: GNU GPL 3.0, see LICENSE
|
|
;
|
|
; indent format: TABS, size=8
|
|
|
|
|
|
output raw
|
|
|
|
~ math {
|
|
; note: the following two ZP scratch registers must be the same as in c64lib
|
|
memory SCRATCH_ZP1 = $02 ; scratch register #1 in ZP
|
|
memory SCRATCH_ZP2 = $03 ; scratch register #2 in ZP
|
|
|
|
|
|
|
|
sub multiply_bytes (byte1: X, byte2: Y) -> (A, X?) {
|
|
; ---- multiply 2 bytes, result as byte in A (signed or unsigned)
|
|
asm {
|
|
stx SCRATCH_ZP1
|
|
sty SCRATCH_ZP2
|
|
ldx #8
|
|
- asl a
|
|
asl SCRATCH_ZP1
|
|
bcc +
|
|
clc
|
|
adc SCRATCH_ZP2
|
|
+ dex
|
|
bne -
|
|
rts
|
|
}
|
|
}
|
|
|
|
|
|
sub multiply_bytes_16 (byte1: X, byte2: Y) -> (A?, XY) {
|
|
; ---- multiply 2 bytes, result as word in X/Y (unsigned)
|
|
asm {
|
|
lda #0
|
|
_m_with_add stx SCRATCH_ZP1
|
|
sty SCRATCH_ZP2
|
|
ldx #8
|
|
lsr SCRATCH_ZP1
|
|
- bcc +
|
|
clc
|
|
adc SCRATCH_ZP2
|
|
+ ror a
|
|
ror SCRATCH_ZP1
|
|
dex
|
|
bne -
|
|
tay
|
|
ldx SCRATCH_ZP1
|
|
rts
|
|
}
|
|
}
|
|
|
|
|
|
sub multiply_bytes_addA_16 (byte1: X, byte2: Y, add: A) -> (A?, XY) {
|
|
; ---- multiply 2 bytes and add A, result as word in X/Y (unsigned)
|
|
asm {
|
|
jmp multiply_bytes_16._m_with_add
|
|
}
|
|
}
|
|
|
|
|
|
sub divide_bytes (numerator: X, denominator: Y) -> (X, A) {
|
|
; ---- divide X by Y, result quotient in X, remainder in A (unsigned)
|
|
; division by zero will result in quotient = 255 and remainder = original number
|
|
asm {
|
|
stx SCRATCH_ZP1
|
|
sty SCRATCH_ZP2
|
|
lda #0
|
|
ldx #8
|
|
asl SCRATCH_ZP1
|
|
- rol a
|
|
cmp SCRATCH_ZP2
|
|
bcc +
|
|
sbc SCRATCH_ZP2
|
|
+ rol SCRATCH_ZP1
|
|
dex
|
|
bne -
|
|
ldx SCRATCH_ZP1
|
|
rts
|
|
}
|
|
}
|
|
|
|
}
|