From: Spiro Trikaliotis (ml-cbmhackers_at_trikaliotis.net)
Date: 2004-12-13 10:58:57
Hello,
* On Mon, Dec 13, 2004 at 09:57:28AM +0100 Baltissen, GJPAA (Ruud) wrote:
> "Astro compiler" just popped up in my mind. Anyone?
I believe I saw this on one disc I transferred last weekend for someone
else. I will have a look, if no one else jumps in.
> To use the above subroutine I have to do this:
> lda addr7
> sta addr1
> lda addr8
> sta addr2
> ldx #size
> jsr Loop
> lda addr3
> sta addr9
> The subroutine itself takes 14 bytes (incl. ldx #size), the above routine 23
> !!! So its clear to forget using the subroutine as so.
Why don't you use some ZP locations as pointers? Thus, you do not give
the value itself, but pointers to it? This shortens the subroutine as
well as the calling function.
> I use these routines at the moment:
>
> .eq AscFloat = $BCF3
> .eq Byte2Real = $B3A2
> .eq ChrGot = $0079
> .eq FAC2ARG = $BC0C
> .eq FACplusARG = $B86A
> .eq Int2Real = $B395
> .eq Long2Real = $BC4F
> .eq Real2Long = $BC9B ; result at $62
> .eq Real2ZStr = $BDDD ; result at $0100
> .eq SignFAC = $BC2B ; negative: A = $FF, pos: A
> = $01
> .eq ScrOut = $E716 ; out put char in A
> .eq Word2Real = $BC49
>
>
> > and output the string ($AB1E)
>
> Don't use it yet, see above.
I once outputted something on comp.sys.cbm for the numerical functions:
Message-ID: <38d49f55.2317131@news.cis.dfn.de>
http://groups.google.com/groups?selm=38d49f55.2317131%40news.cis.dfn.de
Furthermore, according to the same book (Lothar English, "Das
Maschinensprache Buch für Fortgeschrittene zum Commodore 64", Data
Becker, 1984), there are the following conversion routines:
1. signed byte -> FP:
LDA #byte
JSR $BC3C
2. unsigned byte -> FP:
LDA #byte
JSR $B3A2
3. signed word (2 byte) -> FP:
LDY #low
LDA #high
JSR $B395
4. unsigned word (2 byte) -> FP:
LDY #low
LDA #high
STY $63
STA $62
LDX #$90
SEC
JSR $BC49
5. signed 24 bit (3 byte) -> FP:
LDA #low
LDX #mid
LDY #high
STY $62
STX $63
STA $64
LDA $62
EOR #$FF
ASL A
LDA #0
STA $65
LDX #$98
JSR $BC4F
6. unsigned 24 bit (3 byte) -> FP:
LDA #low
LDX #mid
LDX #high
JSR $AF87
JSR $AF7E
7. signed dword (4 byte) -> FP:
; $62 (MSB) - $65 (LSB) already contain the bytes!
LDA $62
EOR #$FF
ASL A
LDA #0
LDX #$A0
JSR $BC4F
8. unsigned dword (4 byte) -> FP:
; $62 (MSB) - $65 (LSB) already contain the bytes!
SEC
LDA #0
LDX #$A0
JSR $BC4F
A. FP -> integer
; the FP values has to be already in the FAC
; exponent should be less than $A0; if not, this will not work,
; as the value is to big
JSR $BC9B
; result is in $62 (MSB) to $65 (LSB)
As you can read german: If you want, I can scan the appropriate pages of
this book for you (no OCR, just plain PNG files!).
> > Furthermore, that routine - as almost all other routines in BASIC,
> > too - utilizes FP. It first converts the integer to FP, then it
> > converts the FP to ASCII, and then it prints out the ASCII.
>
> But when going for size, information like that is more then welcome.
AFAIK, the only math function in the C64 that does not utility FP is
$A96B, which converts an ASCII string into a 16-bit-integer (in
$14/$15). This function is used to convert the line number into binary.
Unfortunately, this function has two drawbacks:
- it can only convert values of 0 to 63999
- it has the known "bug" if the value is bigger than this
AFAIK, every other function utilizes the FP format.
Regards,
Spiro.
--
Spiro R. Trikaliotis
http://www.trikaliotis.net/
Message was sent through the cbm-hackers mailing list
Archive generated by hypermail pre-2.1.8.