mirror of
https://github.com/byteworksinc/ORCALib.git
synced 2024-11-19 23:32:25 +00:00
Add signed/unsigned long long to SANE extended conversion routines.
SANE does not have built in operations for this, but all the values are exactly representable in the SANE extended format, so we just do the conversion ourselves based on the definition of the extended format.
This commit is contained in:
parent
c185face85
commit
a5d0172d82
123
int64.asm
123
int64.asm
@ -1,6 +1,6 @@
|
||||
keep obj/int64
|
||||
mcopy int64.macros
|
||||
case on
|
||||
case off
|
||||
|
||||
****************************************************************
|
||||
*
|
||||
@ -11,7 +11,7 @@
|
||||
*
|
||||
****************************************************************
|
||||
*
|
||||
Int64 start dummy segment
|
||||
Int64 private dummy segment
|
||||
end
|
||||
|
||||
****************************************************************
|
||||
@ -325,3 +325,122 @@ DV11 LDA ANS,X
|
||||
TCS
|
||||
RTL
|
||||
END
|
||||
|
||||
****************************************************************
|
||||
*
|
||||
* ~CnvULongLongReal - convert an unsigned long long integer
|
||||
* into an extended SANE real
|
||||
*
|
||||
* Inputs:
|
||||
* unsigned long long int on stack
|
||||
*
|
||||
* Outputs:
|
||||
* extended real on stack
|
||||
*
|
||||
****************************************************************
|
||||
*
|
||||
~CnvULongLongReal start
|
||||
mantissa equ 4 mantissa (integer and fraction)
|
||||
exponent equ mantissa+8 biased exponent and sign bit
|
||||
|
||||
lda 1,S move return value
|
||||
pha
|
||||
lda 4,S
|
||||
sta 2,S
|
||||
tsc set up DP
|
||||
phd
|
||||
tcd
|
||||
|
||||
lda mantissa+2 move 64-bit value to mantissa
|
||||
sta mantissa
|
||||
lda mantissa+4
|
||||
sta mantissa+2
|
||||
lda mantissa+6
|
||||
sta mantissa+4
|
||||
lda mantissa+8
|
||||
sta mantissa+6
|
||||
|
||||
ora mantissa if value is 0 then
|
||||
ora mantissa+2
|
||||
ora mantissa+4
|
||||
beq ret return
|
||||
|
||||
lda #63+16383 set initial exponent (2^63) and sign
|
||||
sta exponent
|
||||
|
||||
lda mantissa+6 if number is normalized (i=1) then
|
||||
bmi ret return
|
||||
|
||||
lp1 dec exponent normalize number
|
||||
asl mantissa
|
||||
rol mantissa+2
|
||||
rol mantissa+4
|
||||
rol mantissa+6
|
||||
bpl lp1
|
||||
|
||||
ret pld
|
||||
rtl
|
||||
end
|
||||
|
||||
****************************************************************
|
||||
*
|
||||
* ~CnvLongLongReal - convert a long long integer into
|
||||
* an extended SANE real
|
||||
*
|
||||
* Inputs:
|
||||
* signed long long int on stack
|
||||
*
|
||||
* Outputs:
|
||||
* extended real on stack
|
||||
*
|
||||
****************************************************************
|
||||
*
|
||||
~CnvLongLongReal start
|
||||
mantissa equ 4 mantissa (integer and fraction)
|
||||
exponent equ mantissa+8 biased exponent and sign bit
|
||||
|
||||
lda 1,S move return value
|
||||
pha
|
||||
lda 4,S
|
||||
sta 2,S
|
||||
tsc set up DP
|
||||
phd
|
||||
tcd
|
||||
|
||||
lda mantissa+2 move 64-bit value to mantissa
|
||||
sta mantissa
|
||||
lda mantissa+4
|
||||
sta mantissa+2
|
||||
lda mantissa+6
|
||||
sta mantissa+4
|
||||
lda mantissa+8
|
||||
sta mantissa+6
|
||||
|
||||
ora mantissa if value is 0 then
|
||||
ora mantissa+2
|
||||
ora mantissa+4
|
||||
beq ret return
|
||||
|
||||
ldy #0 default sign bit is 0 (positive)
|
||||
lda mantissa+6 if mantissa is negative then
|
||||
bpl lb0
|
||||
sub8 #0,mantissa,mantissa negate it
|
||||
ldy #$8000 sign bit is 1 (negative)
|
||||
|
||||
lb0 tya set sign
|
||||
ora #63+16383 set initial exponent (2^63)
|
||||
sta exponent
|
||||
|
||||
lda mantissa+6 if number is normalized (i=1) then
|
||||
bmi ret return
|
||||
|
||||
lp1 dec exponent normalize number
|
||||
asl mantissa
|
||||
rol mantissa+2
|
||||
rol mantissa+4
|
||||
rol mantissa+6
|
||||
bpl lp1
|
||||
|
||||
ret pld
|
||||
rtl
|
||||
end
|
||||
|
118
int64.macros
118
int64.macros
@ -121,3 +121,121 @@
|
||||
.d
|
||||
sta 2+&op
|
||||
mend
|
||||
macro
|
||||
&l sub8 &n1,&n2,&n3
|
||||
&l ~setm
|
||||
ph8 &n1
|
||||
ph8 &n2
|
||||
jsl ~sub8
|
||||
aif c:&n3,.a
|
||||
pl8 &n1
|
||||
ago .b
|
||||
.a
|
||||
pl8 &n3
|
||||
.b
|
||||
~restm
|
||||
mend
|
||||
macro
|
||||
&l ph8 &n1
|
||||
lclc &c
|
||||
&l anop
|
||||
&c amid &n1,1,1
|
||||
aif s:longa=1,.a
|
||||
rep #%00100000
|
||||
.a
|
||||
aif "&c"="#",.d
|
||||
aif "&c"="[",.b
|
||||
aif "&c"<>"{",.c
|
||||
&c amid &n1,l:&n1,1
|
||||
aif "&c"<>"}",.g
|
||||
&n1 amid &n1,2,l:&n1-2
|
||||
&n1 setc (&n1)
|
||||
.b
|
||||
ldy #6
|
||||
~&SYSCNT lda &n1,y
|
||||
pha
|
||||
dey
|
||||
dey
|
||||
bpl ~&SYSCNT
|
||||
ago .e
|
||||
.c
|
||||
ldx #6
|
||||
~&SYSCNT lda &n1,x
|
||||
pha
|
||||
dex
|
||||
dex
|
||||
bpl ~&SYSCNT
|
||||
ago .e
|
||||
.d
|
||||
&n1 amid &n1,2,l:&n1-1
|
||||
bra ~b&SYSCNT
|
||||
~a&SYSCNT dc i8"&n1"
|
||||
~b&SYSCNT ldx #6
|
||||
~c&SYSCNT lda ~a&SYSCNT,x
|
||||
pha
|
||||
dex
|
||||
dex
|
||||
bpl ~c&SYSCNT
|
||||
.e
|
||||
aif s:longa=1,.f
|
||||
sep #%00100000
|
||||
.f
|
||||
mexit
|
||||
.g
|
||||
mnote "Missing closing '}'",16
|
||||
mend
|
||||
macro
|
||||
&l pl8 &n1
|
||||
lclc &c
|
||||
&l anop
|
||||
aif s:longa=1,.a
|
||||
rep #%00100000
|
||||
.a
|
||||
&c amid &n1,1,1
|
||||
aif "&c"<>"{",.b
|
||||
&c amid &n1,l:&n1,1
|
||||
aif "&c"<>"}",.f
|
||||
&n1 amid &n1,2,l:&n1-2
|
||||
pla
|
||||
sta (&n1)
|
||||
ldy #2
|
||||
pla
|
||||
sta (&n1),y
|
||||
ldy #4
|
||||
pla
|
||||
sta (&n1),y
|
||||
ldy #6
|
||||
pla
|
||||
sta (&n1),y
|
||||
ago .d
|
||||
.b
|
||||
aif "&c"<>"[",.c
|
||||
pla
|
||||
sta &n1
|
||||
ldy #2
|
||||
pla
|
||||
sta &n1,y
|
||||
ldy #4
|
||||
pla
|
||||
sta &n1,y
|
||||
ldy #6
|
||||
pla
|
||||
sta &n1,y
|
||||
ago .d
|
||||
.c
|
||||
pla
|
||||
sta &n1
|
||||
pla
|
||||
sta &n1+2
|
||||
pla
|
||||
sta &n1+4
|
||||
pla
|
||||
sta &n1+6
|
||||
.d
|
||||
aif s:longa=1,.e
|
||||
sep #%00100000
|
||||
.e
|
||||
mexit
|
||||
.f
|
||||
mnote "Missing closing '}'",16
|
||||
mend
|
||||
|
Loading…
Reference in New Issue
Block a user