Add FIN
This commit is contained in:
1 parent
7b9c028c79
commit
241cd603eb
19 files changed
+325
-26
No files matched your search
@@ -239,7 +239,7 @@ Floating point mathematical routines - not official, but well known and broadly
|
|||||||
| `$BC5B` | `FCOMP` | DONE | |
|
| `$BC5B` | `FCOMP` | DONE | |
|
||||||
| `$BC9B` | `QINT` | NOT DONE | convert FAC1 to 32 bit signed integer |
|
| `$BC9B` | `QINT` | NOT DONE | convert FAC1 to 32 bit signed integer |
|
||||||
| `$BCCC` | `int_FAC1` | DONE | |
|
| `$BCCC` | `int_FAC1` | DONE | |
|
||||||
| `$BCF3` | `FIN` | NOT DONE | imports string to FAC1, ignores spaces |
|
| `$BCF3` | `FIN` | PARTIAL | Only for 38k memory model + not fully tested yet |
|
||||||
| `$BD7E` | `FINLOG` | NOT DONE | |
|
| `$BD7E` | `FINLOG` | NOT DONE | |
|
||||||
| `$BDDD` | `FOUT` | NOT DONE | outputs FAC1 to string at $0100 |
|
| `$BDDD` | `FOUT` | NOT DONE | outputs FAC1 to string at $0100 |
|
||||||
| `$BF71` | `sqr_FAC1` | PARTIAL | needs `sqr_FAC2` |
|
| `$BF71` | `sqr_FAC1` | PARTIAL | needs `sqr_FAC2` |
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
;; #LAYOUT# STD * #TAKE
|
|
||||||
;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000
|
|
||||||
;; #LAYOUT# * BASIC_0 #TAKE
|
|
||||||
;; #LAYOUT# * * #IGNORE
|
|
||||||
|
|
||||||
;
|
|
||||||
; Math package - imports string to FAC1, ignores spaces
|
|
||||||
;
|
|
||||||
;
|
|
||||||
; Input:
|
|
||||||
; - .A needs to be loaded with first char of the string
|
|
||||||
; - Carry flag must be clear
|
|
||||||
; - string address in $7A/$7B
|
|
||||||
;
|
|
||||||
; See also:
|
|
||||||
; - [CM64] Computes Mapping the Commodore 64 - page 116
|
|
||||||
; - https://www.c64-wiki.com/wiki/Floating_point_arithmetic
|
|
||||||
; - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics
|
|
||||||
;
|
|
||||||
|
|
||||||
; XXX provide implementation
|
|
||||||
|
|
||||||
FIN:
|
|
||||||
|
|
||||||
+STUB_IMPLEMENTATION
|
|
||||||
@@ -0,0 +1,155 @@
|
|||||||
|
;; #LAYOUT# STD * #TAKE
|
||||||
|
;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000
|
||||||
|
;; #LAYOUT# * BASIC_0 #TAKE
|
||||||
|
;; #LAYOUT# * * #IGNORE
|
||||||
|
|
||||||
|
;
|
||||||
|
; Math package - imports string to FAC1, ignores spaces
|
||||||
|
;
|
||||||
|
;
|
||||||
|
; Input:
|
||||||
|
; - .A needs to be loaded with first char of the string
|
||||||
|
; - Carry flag must be clear
|
||||||
|
; - string address in $7A/$7B
|
||||||
|
;
|
||||||
|
; See also:
|
||||||
|
; - [CM64] Computes Mapping the Commodore 64 - page 116
|
||||||
|
; - https://www.c64-wiki.com/wiki/Floating_point_arithmetic
|
||||||
|
; - https://codebase64.org/doku.php?id=base:kernal_floating_point_mathematics
|
||||||
|
;
|
||||||
|
|
||||||
|
!ifdef CONFIG_MEMORY_MODEL_38K {
|
||||||
|
; NOTE: Currently CHRGET is only available for the 38K model and the equivalent function
|
||||||
|
; does not test for digits to set carry
|
||||||
|
|
||||||
|
FIN_NUMDEC = TEMPF2
|
||||||
|
FIN_DIGIT = TEMPF2 + 1
|
||||||
|
FIN_DECFOUND = TEMPF2 + 2
|
||||||
|
FIN_EXPSIGN = TEMPF2 + 3
|
||||||
|
FIN_EXP = TEMPF2 + 4
|
||||||
|
|
||||||
|
|
||||||
|
FIN:
|
||||||
|
ldx #$00
|
||||||
|
stx SGNFLG ; Sign is positive
|
||||||
|
stx FIN_DECFOUND ; Decimal point not found
|
||||||
|
stx FIN_EXP ; Exponent
|
||||||
|
stx FAC1_exponent ; FAC1 <- 0
|
||||||
|
bcc FIN_loop ; Starting with digit
|
||||||
|
cmp #$2D ; Is minus?
|
||||||
|
bne @1
|
||||||
|
dec SGNFLG
|
||||||
|
bne FIN_next ; Will always branch
|
||||||
|
|
||||||
|
@1: cmp #$2B ; Is plus?
|
||||||
|
beq FIN_next
|
||||||
|
|
||||||
|
FIN_loop:
|
||||||
|
bcs FIN_nonnumeric
|
||||||
|
sec
|
||||||
|
sbc #48 ; Convert to number
|
||||||
|
sta FIN_DIGIT
|
||||||
|
jsr mul10_FAC1
|
||||||
|
jsr mov_FAC1_FAC2
|
||||||
|
lda FIN_DIGIT
|
||||||
|
jsr convert_A_to_FAC1
|
||||||
|
jsr add_FAC2_FAC1
|
||||||
|
|
||||||
|
lda FIN_DECFOUND ; Have we passed the decimal sign?
|
||||||
|
bpl FIN_next
|
||||||
|
inc FIN_NUMDEC
|
||||||
|
|
||||||
|
FIN_next:
|
||||||
|
jsr CHRGET
|
||||||
|
+bra FIN_loop
|
||||||
|
|
||||||
|
FIN_nonnumeric:
|
||||||
|
cmp #$2E ; decimal point
|
||||||
|
beq FIN_decimal
|
||||||
|
cmp #$45 ; E
|
||||||
|
beq FIN_exponent
|
||||||
|
FIN_finalize:
|
||||||
|
lda FIN_EXP
|
||||||
|
sec
|
||||||
|
sbc FIN_NUMDEC
|
||||||
|
sta FIN_EXP
|
||||||
|
bmi FIN_div_loop
|
||||||
|
|
||||||
|
FIN_mul_loop:
|
||||||
|
dec FIN_EXP
|
||||||
|
bmi FIN_out
|
||||||
|
jsr mul10_FAC1
|
||||||
|
+bra FIN_mul_loop
|
||||||
|
|
||||||
|
FIN_div_loop:
|
||||||
|
jsr div10_FAC1_p
|
||||||
|
inc FIN_EXP
|
||||||
|
bne FIN_div_loop
|
||||||
|
|
||||||
|
FIN_out:
|
||||||
|
lda SGNFLG
|
||||||
|
sta FAC1_sign
|
||||||
|
rts
|
||||||
|
|
||||||
|
FIN_decimal:
|
||||||
|
lda FIN_DECFOUND
|
||||||
|
bmi FIN_finalize
|
||||||
|
dec FIN_DECFOUND ; Indicate found decimal point
|
||||||
|
sta FIN_NUMDEC ; Number of decimal places = 0
|
||||||
|
+bra FIN_next
|
||||||
|
|
||||||
|
FIN_exponent:
|
||||||
|
ldx #0
|
||||||
|
stx FIN_EXPSIGN
|
||||||
|
jsr CHRGET
|
||||||
|
bcc FIN_exp_loop
|
||||||
|
cmp #$2D ; Is minus?
|
||||||
|
bne @1
|
||||||
|
dec FIN_EXPSIGN
|
||||||
|
bne FIN_exp_next ; Always branches
|
||||||
|
@1: cmp #$2B ; Is plus?
|
||||||
|
beq FIN_exp_next
|
||||||
|
bne FIN_done_exp
|
||||||
|
|
||||||
|
FIN_exp_loop:
|
||||||
|
tax
|
||||||
|
lda FIN_EXP
|
||||||
|
cmp #10
|
||||||
|
bcs FIN_exp_limit
|
||||||
|
asl ; Multiply by 10
|
||||||
|
sta FIN_EXP
|
||||||
|
asl
|
||||||
|
asl
|
||||||
|
clc
|
||||||
|
adc FIN_EXP
|
||||||
|
sta FIN_EXP
|
||||||
|
txa
|
||||||
|
sec
|
||||||
|
sbc #48 ; Convert to number
|
||||||
|
clc
|
||||||
|
adc FIN_EXP
|
||||||
|
sta FIN_EXP
|
||||||
|
|
||||||
|
FIN_exp_next:
|
||||||
|
jsr CHRGET
|
||||||
|
bcc FIN_exp_loop
|
||||||
|
|
||||||
|
FIN_done_exp:
|
||||||
|
lda FIN_EXP
|
||||||
|
bpl FIN_finalize
|
||||||
|
eor #$FF
|
||||||
|
tax
|
||||||
|
inx
|
||||||
|
stx FIN_EXP
|
||||||
|
+bra FIN_finalize
|
||||||
|
|
||||||
|
FIN_exp_limit:
|
||||||
|
ldx FIN_EXPSIGN
|
||||||
|
bmi FIN_zero
|
||||||
|
jmp do_OVERFLOW_error
|
||||||
|
|
||||||
|
FIN_zero:
|
||||||
|
ldx #0
|
||||||
|
stx FAC1_exponent
|
||||||
|
rts
|
||||||
|
}
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
;; #LAYOUT# STD * #TAKE
|
||||||
|
;; #LAYOUT# X16 BASIC_0 #TAKE-OFFSET 2000
|
||||||
|
;; #LAYOUT# * BASIC_0 #TAKE
|
||||||
|
;; #LAYOUT# * * #IGNORE
|
||||||
|
|
||||||
|
; Just a compatibility jump - our routine is longer than original one
|
||||||
|
|
||||||
|
!ifdef CONFIG_MEMORY_MODEL_38K {
|
||||||
|
jmp FIN
|
||||||
|
} else {
|
||||||
|
+STUB_IMPLEMENTATION
|
||||||
|
}
|
||||||
File renamed without changes.
@@ -0,0 +1,3 @@
|
|||||||
|
ASL + ASL + CLC + ADC fragment
|
||||||
|
|
||||||
|
Multiply by 4 and add. Common fragment for multiplication by 10 or other constants.
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
JSR $0073 + JMP fragment
|
||||||
|
|
||||||
|
Call well known address in zero page + fragment
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
JSR $BAE2 + JSR fragment
|
||||||
|
|
||||||
|
Call well known floating point function + fragment
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
JSR $BAFE + INC fragment
|
||||||
|
|
||||||
|
Call to well known floating point function + fragment
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
$5D + JSR $BAE2
|
||||||
|
|
||||||
|
Fragment + call to well known floating point function
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
RTS + JSR $0073
|
||||||
|
|
||||||
|
Fragment + call well known subrouting in zero page
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
RTS + JSR $0073 + BCC fragment
|
||||||
|
|
||||||
|
Fragments + Call to well known zero page address
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
$B86A + LDA $5E
|
||||||
|
|
||||||
|
Fragment of address of well known floating point function and a load from zero page
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
STA $66 + RTS + LDA fragment
|
||||||
|
|
||||||
|
Store to well known zero page location + fragment
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
STA $70 + LDA $65
|
||||||
|
|
||||||
|
Store to well known zero page variable and load from another
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
CMP #$2D + BNE $04
|
||||||
|
|
||||||
|
Compare with ASCII minus and branch
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
CMP #$30 + BCC $04 + CMP #$3C + BCC fragment
|
||||||
|
|
||||||
|
Comparisons of some ASCII values
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
BNE $F9 + LDA $67
|
||||||
|
|
||||||
|
Loop fragment + load from zero page
|
||||||
@@ -382,5 +382,123 @@ print "COMPARE"
|
|||||||
compare $62 $65 $1001
|
compare $62 $65 $1001
|
||||||
print "END"
|
print "END"
|
||||||
|
|
||||||
|
print "TEST: FIN 1"
|
||||||
|
fill $61 $66 FF FF FF FF FF CC
|
||||||
|
fill $7A $7B $00 $05
|
||||||
|
fill $500 $501 31 00
|
||||||
|
r A=$31
|
||||||
|
r FL=$20
|
||||||
|
r PC=$BCF3
|
||||||
|
ret
|
||||||
|
fill $1001 $1006 81 80 00 00 00 00
|
||||||
|
print "COMPARE"
|
||||||
|
compare $61 $66 $1001
|
||||||
|
print "END"
|
||||||
|
|
||||||
|
|
||||||
|
print "TEST: FIN 17"
|
||||||
|
fill $61 $66 FF FF FF FF FF CC
|
||||||
|
fill $7A $7B $00 $05
|
||||||
|
fill $500 $502 31 37 00
|
||||||
|
r A=$31
|
||||||
|
r FL=$20
|
||||||
|
r PC=$BCF3
|
||||||
|
ret
|
||||||
|
fill $1001 $1006 85 88 00 00 00 00
|
||||||
|
print "COMPARE"
|
||||||
|
compare $61 $66 $1001
|
||||||
|
print "END"
|
||||||
|
|
||||||
|
print "TEST: FIN +17"
|
||||||
|
fill $61 $66 FF FF FF FF FF CC
|
||||||
|
fill $7A $7B $00 $05
|
||||||
|
fill $500 $503 2B 31 37 00
|
||||||
|
r A=$2B
|
||||||
|
r FL=$21
|
||||||
|
r PC=$BCF3
|
||||||
|
ret
|
||||||
|
fill $1001 $1006 85 88 00 00 00 00
|
||||||
|
print "COMPARE"
|
||||||
|
compare $61 $66 $1001
|
||||||
|
print "END"
|
||||||
|
|
||||||
|
print "TEST: FIN -17"
|
||||||
|
fill $61 $66 FF FF FF FF FF CC
|
||||||
|
fill $7A $7B $00 $05
|
||||||
|
fill $500 $503 2D 31 37 00
|
||||||
|
r A=$2D
|
||||||
|
r FL=$21
|
||||||
|
r PC=$BCF3
|
||||||
|
ret
|
||||||
|
fill $1001 $1006 85 88 00 00 00 FF
|
||||||
|
print "COMPARE"
|
||||||
|
compare $61 $66 $1001
|
||||||
|
print "END"
|
||||||
|
|
||||||
|
print "TEST: FIN 20E1"
|
||||||
|
fill $61 $66 FF FF FF FF FF CC
|
||||||
|
fill $7A $7B $00 $05
|
||||||
|
fill $500 $504 32 30 45 31 00
|
||||||
|
r A=$32
|
||||||
|
r FL=$20
|
||||||
|
r PC=$BCF3
|
||||||
|
ret
|
||||||
|
fill $1001 $1006 88 C8 00 00 00 00
|
||||||
|
print "COMPARE"
|
||||||
|
compare $61 $66 $1001
|
||||||
|
print "END"
|
||||||
|
|
||||||
|
print "TEST: FIN 20.0E1"
|
||||||
|
fill $61 $66 FF FF FF FF FF CC
|
||||||
|
fill $7A $7B $00 $05
|
||||||
|
fill $500 $506 32 30 2E 30 45 31 00
|
||||||
|
r A=$32
|
||||||
|
r FL=$20
|
||||||
|
r PC=$BCF3
|
||||||
|
ret
|
||||||
|
fill $1001 $1006 88 C8 00 00 00 00
|
||||||
|
print "COMPARE"
|
||||||
|
compare $61 $66 $1001
|
||||||
|
print "END"
|
||||||
|
|
||||||
|
print "TEST: FIN 20.0E+1"
|
||||||
|
fill $61 $66 FF FF FF FF FF CC
|
||||||
|
fill $7A $7B $00 $05
|
||||||
|
fill $500 $507 32 30 2E 30 45 2B 31 00
|
||||||
|
r A=$32
|
||||||
|
r FL=$20
|
||||||
|
r PC=$BCF3
|
||||||
|
ret
|
||||||
|
fill $1001 $1006 88 C8 00 00 00 00
|
||||||
|
print "COMPARE"
|
||||||
|
compare $61 $66 $1001
|
||||||
|
print "END"
|
||||||
|
|
||||||
|
print "TEST: FIN 200E-1"
|
||||||
|
fill $61 $66 FF FF FF FF FF CC
|
||||||
|
fill $7A $7B $00 $05
|
||||||
|
fill $500 $507 32 30 30 45 2D 31 00
|
||||||
|
r A=$32
|
||||||
|
r FL=$20
|
||||||
|
r PC=$BCF3
|
||||||
|
ret
|
||||||
|
fill $1001 $1006 88 C8 00 00 00 00
|
||||||
|
print "COMPARE"
|
||||||
|
compare $61 $66 $1001
|
||||||
|
print "END"
|
||||||
|
|
||||||
|
print "TEST: FIN 123E-100"
|
||||||
|
fill $61 $66 FF FF FF FF FF CC
|
||||||
|
fill $7A $7B $00 $05
|
||||||
|
fill $500 $509 31 32 33 45 2D 31 30 30 00
|
||||||
|
r A=$32
|
||||||
|
r FL=$20
|
||||||
|
r PC=$BCF3
|
||||||
|
ret
|
||||||
|
fill $1001 $1001 00
|
||||||
|
print "COMPARE"
|
||||||
|
compare $61 $61 $1001
|
||||||
|
print "END"
|
||||||
|
|
||||||
|
|
||||||
q
|
q
|
||||||
Reference in new issue
Block a user