mirror of
https://github.com/byteworksinc/ORCALib.git
synced 2024-09-27 04:55:02 +00:00
2334443437
This differs from scalbn in that the exponent has type long. When scaling an extended value, exponents slightly outside the range of int can actually be used meaningfully. We address this by doing multiple SCALBX calls (at most 2) in a loop.
391 lines
4.5 KiB
Plaintext
391 lines
4.5 KiB
Plaintext
MACRO
|
|
&lab csubroutine &parms,&work
|
|
&lab anop
|
|
aif c:&work,.a
|
|
lclc &work
|
|
&work setc 0
|
|
.a
|
|
gbla &totallen
|
|
gbla &worklen
|
|
&worklen seta &work
|
|
&totallen seta 0
|
|
aif c:&parms=0,.e
|
|
lclc &len
|
|
lclc &p
|
|
lcla &i
|
|
&i seta 1
|
|
.b
|
|
&p setc &parms(&i)
|
|
&len amid &p,2,1
|
|
aif "&len"=":",.c
|
|
&len amid &p,1,2
|
|
&p amid &p,4,l:&p-3
|
|
ago .d
|
|
.c
|
|
&len amid &p,1,1
|
|
&p amid &p,3,l:&p-2
|
|
.d
|
|
&p equ &totallen+4+&work
|
|
&totallen seta &totallen+&len
|
|
&i seta &i+1
|
|
aif &i<=c:&parms,^b
|
|
.e
|
|
tsc
|
|
aif &work=0,.f
|
|
sec
|
|
sbc #&work
|
|
tcs
|
|
.f
|
|
phd
|
|
tcd
|
|
mend
|
|
MACRO
|
|
&lab creturn &r
|
|
&lab anop
|
|
lclc &len
|
|
aif c:&r,.a
|
|
lclc &r
|
|
&r setc 0
|
|
&len setc 0
|
|
ago .h
|
|
.a
|
|
&len amid &r,2,1
|
|
aif "&len"=":",.b
|
|
&len amid &r,1,2
|
|
&r amid &r,4,l:&r-3
|
|
ago .c
|
|
.b
|
|
&len amid &r,1,1
|
|
&r amid &r,3,l:&r-2
|
|
.c
|
|
aif &len<>2,.d
|
|
ldy &r
|
|
ago .h
|
|
.d
|
|
aif &len<>4,.e
|
|
ldx &r+2
|
|
ldy &r
|
|
ago .h
|
|
.e
|
|
aif &len<>10,.g
|
|
ldy #&r
|
|
ldx #^&r
|
|
ago .h
|
|
.g
|
|
mnote 'Not a valid return length',16
|
|
mexit
|
|
.h
|
|
aif &totallen=0,.i
|
|
lda &worklen+2
|
|
sta &worklen+&totallen+2
|
|
lda &worklen+1
|
|
sta &worklen+&totallen+1
|
|
.i
|
|
pld
|
|
tsc
|
|
clc
|
|
adc #&worklen+&totallen
|
|
tcs
|
|
aif &len=0,.j
|
|
tya
|
|
.j
|
|
rtl
|
|
mend
|
|
MACRO
|
|
&LAB PH4 &N1
|
|
LCLC &C
|
|
&LAB ANOP
|
|
&C AMID &N1,1,1
|
|
AIF "&C"="#",.D
|
|
AIF S:LONGA=1,.A
|
|
REP #%00100000
|
|
.A
|
|
AIF "&C"<>"{",.B
|
|
&C AMID &N1,L:&N1,1
|
|
AIF "&C"<>"}",.G
|
|
&N1 AMID &N1,2,L:&N1-2
|
|
LDY #2
|
|
LDA (&N1),Y
|
|
PHA
|
|
LDA (&N1)
|
|
PHA
|
|
AGO .E
|
|
.B
|
|
AIF "&C"<>"[",.C
|
|
LDY #2
|
|
LDA &N1,Y
|
|
PHA
|
|
LDA &N1
|
|
PHA
|
|
AGO .E
|
|
.C
|
|
LDA &N1+2
|
|
PHA
|
|
LDA &N1
|
|
PHA
|
|
AGO .E
|
|
.D
|
|
&N1 AMID &N1,2,L:&N1-1
|
|
PEA +(&N1)|-16
|
|
PEA &N1
|
|
AGO .F
|
|
.E
|
|
AIF S:LONGA=1,.F
|
|
SEP #%00100000
|
|
.F
|
|
MEXIT
|
|
.G
|
|
MNOTE "Missing closing '}'",16
|
|
MEND
|
|
macro
|
|
&l cmp4 &n1,&n2
|
|
lclb &yistwo
|
|
&l ~setm
|
|
~lda.h &n1
|
|
~op.h eor,&n2
|
|
bpl ~a&SYSCNT
|
|
~lda.h &n2
|
|
~op.h cmp,&n1
|
|
bra ~b&SYSCNT
|
|
~a&SYSCNT ~lda.h &n1
|
|
~op.h cmp,&n2
|
|
bne ~b&SYSCNT
|
|
~lda &n1
|
|
~op cmp,&n2
|
|
~b&SYSCNT anop
|
|
~restm
|
|
mend
|
|
macro
|
|
&l ~lda &op
|
|
lclc &c
|
|
&c amid "&op",1,1
|
|
aif "&c"<>"{",.b
|
|
&c amid "&op",l:&op,1
|
|
aif "&c"="}",.a
|
|
mnote "Missing closing '}'",2
|
|
&op setc &op}
|
|
.a
|
|
&op amid "&op",2,l:&op-2
|
|
&op setc (&op)
|
|
.b
|
|
&l lda &op
|
|
mend
|
|
macro
|
|
&l ~lda.h &op
|
|
&l anop
|
|
lclc &c
|
|
&c amid "&op",1,1
|
|
aif "&c"="[",.b
|
|
aif "&c"<>"{",.d
|
|
&c amid "&op",l:&op,1
|
|
aif "&c"="}",.a
|
|
mnote "Missing closing '}'",2
|
|
&op setc &op}
|
|
.a
|
|
&op amid "&op",2,l:&op-2
|
|
&op setc (&op)
|
|
.b
|
|
aif &yistwo,.c
|
|
&yistwo setb 1
|
|
ldy #2
|
|
.c
|
|
&op setc "&op,y"
|
|
lda &op
|
|
mexit
|
|
.d
|
|
aif "&c"<>"#",.e
|
|
&op amid "&op",2,l:&op-1
|
|
&op setc "#^&op"
|
|
lda &op
|
|
mexit
|
|
.e
|
|
lda 2+&op
|
|
mend
|
|
macro
|
|
&l ~op &opc,&op
|
|
lclc &c
|
|
&c amid "&op",1,1
|
|
aif "&c"<>"{",.b
|
|
&c amid "&op",l:&op,1
|
|
aif "&c"="}",.a
|
|
mnote "Missing closing '}'",2
|
|
&op setc &op}
|
|
.a
|
|
&op amid "&op",2,l:&op-2
|
|
&op setc (&op)
|
|
.b
|
|
&l &opc &op
|
|
mend
|
|
macro
|
|
&l ~op.h &opc,&op
|
|
&l anop
|
|
lclc &c
|
|
&c amid "&op",1,1
|
|
aif "&c"="[",.b
|
|
aif "&c"<>"{",.d
|
|
&c amid "&op",l:&op,1
|
|
aif "&c"="}",.a
|
|
mnote "Missing closing '}'",2
|
|
&op setc &op}
|
|
.a
|
|
&op amid "&op",2,l:&op-2
|
|
&op setc (&op)
|
|
.b
|
|
aif &yistwo,.c
|
|
&yistwo setb 1
|
|
ldy #2
|
|
.c
|
|
&op setc "&op,y"
|
|
&opc &op
|
|
mexit
|
|
.d
|
|
aif "&c"<>"#",.e
|
|
&op amid "&op",2,l:&op-1
|
|
&op setc "#^&op"
|
|
&opc &op
|
|
mexit
|
|
.e
|
|
&opc 2+&op
|
|
mend
|
|
macro
|
|
&l ~restm
|
|
&l anop
|
|
aif (&~la+&~li)=2,.i
|
|
sep #32*(.not.&~la)+16*(.not.&~li)
|
|
aif &~la,.h
|
|
longa off
|
|
.h
|
|
aif &~li,.i
|
|
longi off
|
|
.i
|
|
mend
|
|
macro
|
|
&l ~setm
|
|
&l anop
|
|
aif c:&~la,.b
|
|
gblb &~la
|
|
gblb &~li
|
|
.b
|
|
&~la setb s:longa
|
|
&~li setb s:longi
|
|
aif s:longa.and.s:longi,.a
|
|
rep #32*(.not.&~la)+16*(.not.&~li)
|
|
longa on
|
|
longi on
|
|
.a
|
|
mend
|
|
MACRO
|
|
&LAB FCLASSS
|
|
&LAB PEA $021C
|
|
LDX #$090A
|
|
JSL $E10000
|
|
MEND
|
|
MACRO
|
|
&LAB FCLASSD
|
|
&LAB PEA $011C
|
|
LDX #$090A
|
|
JSL $E10000
|
|
MEND
|
|
MACRO
|
|
&LAB FCLASSX
|
|
&LAB PEA $001C
|
|
LDX #$090A
|
|
JSL $E10000
|
|
MEND
|
|
MACRO
|
|
&LAB FX2S
|
|
&LAB PEA $0210
|
|
LDX #$090A
|
|
JSL $E10000
|
|
MEND
|
|
MACRO
|
|
&LAB FX2D
|
|
&LAB PEA $0110
|
|
LDX #$090A
|
|
JSL $E10000
|
|
MEND
|
|
MACRO
|
|
&LAB FCMPX
|
|
&LAB PEA $0008
|
|
LDX #$090A
|
|
JSL $E10000
|
|
MEND
|
|
MACRO
|
|
&LAB FEXP2X
|
|
&LAB PEA $000A
|
|
LDX #$0B0A
|
|
JSL $E10000
|
|
MEND
|
|
MACRO
|
|
&LAB FEXP1X
|
|
&LAB PEA $000C
|
|
LDX #$0B0A
|
|
JSL $E10000
|
|
MEND
|
|
MACRO
|
|
&LAB FLN1X
|
|
&LAB PEA $0004
|
|
LDX #$0B0A
|
|
JSL $E10000
|
|
MEND
|
|
MACRO
|
|
&LAB FLOG2X
|
|
&LAB PEA $0002
|
|
LDX #$0B0A
|
|
JSL $E10000
|
|
MEND
|
|
MACRO
|
|
&LAB FLOGBX
|
|
&LAB PEA $001A
|
|
LDX #$090A
|
|
JSL $E10000
|
|
MEND
|
|
MACRO
|
|
&LAB FX2I
|
|
&LAB PEA $0410
|
|
LDX #$090A
|
|
JSL $E10000
|
|
MEND
|
|
MACRO
|
|
&LAB FTINTX
|
|
&LAB PEA $0016
|
|
LDX #$090A
|
|
JSL $E10000
|
|
MEND
|
|
MACRO
|
|
&LAB FRINTX
|
|
&LAB PEA $0014
|
|
LDX #$090A
|
|
JSL $E10000
|
|
MEND
|
|
MACRO
|
|
&LAB FX2L
|
|
&LAB PEA $0310
|
|
LDX #$090A
|
|
JSL $E10000
|
|
MEND
|
|
MACRO
|
|
&LAB FXPWRY
|
|
&LAB PEA $0012
|
|
LDX #$0B0A
|
|
JSL $E10000
|
|
MEND
|
|
MACRO
|
|
&LAB FREMX
|
|
&LAB PEA $000C
|
|
LDX #$090A
|
|
JSL $E10000
|
|
MEND
|
|
MACRO
|
|
&LAB FSCALBX
|
|
&LAB PEA $0018
|
|
LDX #$090A
|
|
JSL $E10000
|
|
MEND
|
|
MACRO
|
|
&LAB FSUBX
|
|
&LAB PEA $0002
|
|
LDX #$090A
|
|
JSL $E10000
|
|
MEND
|