C64 ROM | Routines |
Prev: BDCD | Up: Map | Next: BF11 |
Used by the routine at AAA0.
|
||||
BDDD | A0 01 | LDY #$01 | set index = 1 | |
This entry point is used by the routines at B465 and BDCD.
|
||||
BDDF | A9 20 | LDA #" " | character = " " (assume +ve) | |
BDE1 | 24 66 | BIT $66 | test FAC1 sign (b7) | |
BDE3 | 10 02 | BPL $BDE7 | branch if +ve | |
BDE5 | A9 2D | LDA #"-" | else character = "-" | |
BDE7 | 99 FF 00 | STA $00FF,Y | save leading character (" " or "-") | |
BDEA | 85 66 | STA $66 | save FAC1 sign (b7) | |
BDEC | 84 71 | STY $71 | save index | |
BDEE | C8 | INY | increment index | |
BDEF | A9 30 | LDA #"0" | set character = "0" | |
BDF1 | A6 61 | LDX $61 | get FAC1 exponent | |
BDF3 | D0 03 | BNE $BDF8 | branch if FAC1<>0 | |
exponent was $00 so FAC1 is 0
|
||||
BDF5 | 4C 04 BF | JMP $BF04 | save last character, [EOT] and exit | |
FAC1 is some non zero value
|
||||
BDF8 | A9 00 | LDA #$00 | clear (number exponent count) | |
BDFA | E0 80 | CPX #$80 | compare FAC1 exponent with $80 (<1.00000) | |
BDFC | F0 02 | BEQ $BE00 | branch if 0.5 <= FAC1 < 1.0 | |
BDFE | B0 09 | BCS $BE09 | branch if FAC1=>1 | |
BE00 | A9 BD | LDA #$BD | set 1000000000 pointer low byte | |
BE02 | A0 BD | LDY #$BD | set 1000000000 pointer high byte | |
BE04 | 20 28 BA | JSR $BA28 | do convert AY, FCA1*(AY) | |
BE07 | A9 F7 | LDA #$F7 | set number exponent count | |
BE09 | 85 5D | STA $5D | save number exponent count | |
BE0B | A9 B8 | LDA #$B8 | set 999999999.25 pointer low byte (max before sci note) | |
BE0D | A0 BD | LDY #$BD | set 999999999.25 pointer high byte | |
BE0F | 20 5B BC | JSR $BC5B | compare FAC1 with (AY) | |
BE12 | F0 1E | BEQ $BE32 | exit if FAC1 = (AY) | |
BE14 | 10 12 | BPL $BE28 | go do /10 if FAC1 > (AY) | |
FAC1 < (AY)
|
||||
BE16 | A9 B3 | LDA #$B3 | set 99999999.90625 pointer low byte | |
BE18 | A0 BD | LDY #$BD | set 99999999.90625 pointer high byte | |
BE1A | 20 5B BC | JSR $BC5B | compare FAC1 with (AY) | |
BE1D | F0 02 | BEQ $BE21 | branch if FAC1 = (AY) (allow decimal places) | |
BE1F | 10 0E | BPL $BE2F | branch if FAC1 > (AY) (no decimal places) | |
FAC1 <= (AY)
|
||||
BE21 | 20 E2 BA | JSR $BAE2 | multiply FAC1 by 10 | |
BE24 | C6 5D | DEC $5D | decrement number exponent count | |
BE26 | D0 EE | BNE $BE16 | go test again, branch always | |
BE28 | 20 FE BA | JSR $BAFE | divide FAC1 by 10 | |
BE2B | E6 5D | INC $5D | increment number exponent count | |
BE2D | D0 DC | BNE $BE0B | go test again, branch always | |
now we have just the digits to do
|
||||
BE2F | 20 49 B8 | JSR $B849 | add 0.5 to FAC1 (round FAC1) | |
BE32 | 20 9B BC | JSR $BC9B | convert FAC1 floating to fixed | |
BE35 | A2 01 | LDX #$01 | set default digits before dp = 1 | |
BE37 | A5 5D | LDA $5D | get number exponent count | |
BE39 | 18 | CLC | clear carry for add | |
BE3A | 69 0A | ADC #$0A | up to 9 digits before point | |
BE3C | 30 09 | BMI $BE47 | if -ve then 1 digit before dp | |
BE3E | C9 0B | CMP #$0B | A>=$0B if n>=1E9 | |
BE40 | B0 06 | BCS $BE48 | branch if >= $0B | |
carry is clear
|
||||
BE42 | 69 FF | ADC #$FF | take 1 from digit count | |
BE44 | AA | TAX | copy to X | |
BE45 | A9 02 | LDA #$02 | set exponent adjust | |
BE47 | 38 | SEC | set carry for subtract | |
BE48 | E9 02 | SBC #$02 | -2 | |
BE4A | 85 5E | STA $5E | save exponent adjust | |
BE4C | 86 5D | STX $5D | save digits before dp count | |
BE4E | 8A | TXA | copy to A | |
BE4F | F0 02 | BEQ $BE53 | branch if no digits before dp | |
BE51 | 10 13 | BPL $BE66 | branch if digits before dp | |
BE53 | A4 71 | LDY $71 | get output string index | |
BE55 | A9 2E | LDA #"." | character "." | |
BE57 | C8 | INY | increment index | |
BE58 | 99 FF 00 | STA $00FF,Y | save to output string | |
BE5B | 8A | TXA | ||
BE5C | F0 06 | BEQ $BE64 | ||
BE5E | A9 30 | LDA #"0" | character "0" | |
BE60 | C8 | INY | increment index | |
BE61 | 99 FF 00 | STA $00FF,Y | save to output string | |
BE64 | 84 71 | STY $71 | save output string index | |
BE66 | A0 00 | LDY #$00 | clear index (point to 100,000) | |
This entry point is used by the routine at AF28.
|
||||
BE68 | A2 80 | LDX #$80 | ||
BE6A | A5 65 | LDA $65 | get FAC1 mantissa 4 | |
BE6C | 18 | CLC | clear carry for add | |
BE6D | 79 19 BF | ADC $BF19,Y | add byte 4, least significant | |
BE70 | 85 65 | STA $65 | save FAC1 mantissa4 | |
BE72 | A5 64 | LDA $64 | get FAC1 mantissa 3 | |
BE74 | 79 18 BF | ADC $BF18,Y | add byte 3 | |
BE77 | 85 64 | STA $64 | save FAC1 mantissa3 | |
BE79 | A5 63 | LDA $63 | get FAC1 mantissa 2 | |
BE7B | 79 17 BF | ADC $BF17,Y | add byte 2 | |
BE7E | 85 63 | STA $63 | save FAC1 mantissa2 | |
BE80 | A5 62 | LDA $62 | get FAC1 mantissa 1 | |
BE82 | 79 16 BF | ADC $BF16,Y | add byte 1, most significant | |
BE85 | 85 62 | STA $62 | save FAC1 mantissa1 | |
BE87 | E8 | INX | increment the digit, set the sign on the test sense bit | |
BE88 | B0 04 | BCS $BE8E | if the carry is set go test if the result was positive | |
else the result needs to be negative
|
||||
BE8A | 10 DE | BPL $BE6A | not -ve so try again | |
BE8C | 30 02 | BMI $BE90 | else done so return the digit | |
BE8E | 30 DA | BMI $BE6A | not +ve so try again | |
else done so return the digit
|
||||
BE90 | 8A | TXA | copy the digit | |
BE91 | 90 04 | BCC $BE97 | if Cb=0 just use it | |
BE93 | 49 FF | EOR #$FF | else make the 2's complement .. | |
BE95 | 69 0A | ADC #$0A | .. and subtract it from 10 | |
BE97 | 69 2F | ADC #$2F | add "0"-1 to result | |
BE99 | C8 | INY | increment .. | |
BE9A | C8 | INY | .. index to .. | |
BE9B | C8 | INY | .. next less .. | |
BE9C | C8 | INY | .. power of ten | |
BE9D | 84 47 | STY $47 | save current variable pointer low byte | |
BE9F | A4 71 | LDY $71 | get output string index | |
BEA1 | C8 | INY | increment output string index | |
BEA2 | AA | TAX | copy character to X | |
BEA3 | 29 7F | AND #%01111111 | mask out top bit | |
BEA5 | 99 FF 00 | STA $00FF,Y | save to output string | |
BEA8 | C6 5D | DEC $5D | decrement # of characters before the dp | |
BEAA | D0 06 | BNE $BEB2 | branch if still characters to do | |
else output the point
|
||||
BEAC | A9 2E | LDA #"." | character "." | |
BEAE | C8 | INY | increment output string index | |
BEAF | 99 FF 00 | STA $00FF,Y | save to output string | |
BEB2 | 84 71 | STY $71 | save output string index | |
BEB4 | A4 47 | LDY $47 | get current variable pointer low byte | |
BEB6 | 8A | TXA | get character back | |
BEB7 | 49 FF | EOR #$FF | toggle the test sense bit | |
BEB9 | 29 80 | AND #$80 | clear the digit | |
BEBB | AA | TAX | copy it to the new digit | |
BEBC | C0 24 | CPY #$24 | compare the table index with the max for decimal numbers | |
BEBE | F0 04 | BEQ $BEC4 | if at the max exit the digit loop | |
BEC0 | C0 3C | CPY #$3C | compare the table index with the max for time | |
BEC2 | D0 A6 | BNE $BE6A | loop if not at the max | |
now remove trailing zeroes
|
||||
BEC4 | A4 71 | LDY $71 | restore the output string index | |
BEC6 | B9 FF 00 | LDA $00FF,Y | get character from output string | |
BEC9 | 88 | DEY | decrement output string index | |
BECA | C9 30 | CMP #"0" | compare with "0" | |
BECC | F0 F8 | BEQ $BEC6 | loop until non "0" character found | |
BECE | C9 2E | CMP #"." | compare with "." | |
BED0 | F0 01 | BEQ $BED3 | branch if was dp | |
restore last character
|
||||
BED2 | C8 | INY | increment output string index | |
BED3 | A9 2B | LDA #"+" | character "+" | |
BED5 | A6 5E | LDX $5E | get exponent count | |
BED7 | F0 2E | BEQ $BF07 | if zero go set null terminator and exit | |
exponent isn't zero so write exponent
|
||||
BED9 | 10 08 | BPL $BEE3 | branch if exponent count +ve | |
BEDB | A9 00 | LDA #$00 | clear A | |
BEDD | 38 | SEC | set carry for subtract | |
BEDE | E5 5E | SBC $5E | subtract exponent count adjust (convert -ve to +ve) | |
BEE0 | AA | TAX | copy exponent count to X | |
BEE1 | A9 2D | LDA #"-" | character "-" | |
BEE3 | 99 01 01 | STA $0101,Y | save to output string | |
BEE6 | A9 45 | LDA #"E" | character "E" | |
BEE8 | 99 00 01 | STA $0100,Y | save exponent sign to output string | |
BEEB | 8A | TXA | get exponent count back | |
BEEC | A2 2F | LDX #$2F | one less than "0" character | |
BEEE | 38 | SEC | set carry for subtract | |
BEEF | E8 | INX | increment 10's character | |
BEF0 | E9 0A | SBC #$0A | subtract 10 from exponent count | |
BEF2 | B0 FB | BCS $BEEF | loop while still >= 0 | |
BEF4 | 69 3A | ADC #":" | add character ":" ($30+$0A, result is 10 less that value) | |
BEF6 | 99 03 01 | STA $0103,Y | save to output string | |
BEF9 | 8A | TXA | copy 10's character | |
BEFA | 99 02 01 | STA $0102,Y | save to output string | |
BEFD | A9 00 | LDA #$00 | set null terminator | |
BEFF | 99 04 01 | STA $0104,Y | save to output string | |
BF02 | F0 08 | BEQ $BF0C | go set string pointer (AY) and exit, branch always | |
save last character, [EOT] and exit
|
||||
BF04 | 99 FF 00 | STA $00FF,Y | save last character to output string | |
set null terminator and exit
|
||||
BF07 | A9 00 | LDA #$00 | set null terminator | |
BF09 | 99 00 01 | STA $0100,Y | save after last character | |
set string pointer (AY) and exit
|
||||
BF0C | A9 00 | LDA #$00 | set result string pointer low byte | |
BF0E | A0 01 | LDY #$01 | set result string pointer high byte | |
BF10 | 60 | RTS |
Prev: BDCD | Up: Map | Next: BF11 |