home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Crawly Crypt Collection 1
/
crawlyvol1.bin
/
program
/
compiler
/
nasm20b
/
nasm_src
/
float.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-01-19
|
7KB
|
431 lines
/* ---------------------------------------------------------------------- */
/* This file is not copyrighted! */
/* ---------------------------------------------------------------------- */
#include "defines.h"
#include "nasm.h"
/* ---------------------------------------------------------- */
/* This is from the ATARI BASIC Source Book reverse */
/* engineered. OK. Since only mathematicians would be */
/* interested in optimizing this code, and knowing their */
/* humorlessness let me explain: "This is a 9K joke!" */
/* **-PORT #6-** */
/* ---------------------------------------------------------- */
#define _fprec 6
#define _fmprec _fprec - 1
static signed char a, x, y;
static signed char c, t;
signed char page0[ 0x100];
static signed char page1[ 0x100];
static unsigned char p1_sp = 0xFF;
static signed char *inbuff;
#define _fr0 0xD4U
#define _fr0m 0xD5U
#define _fre 0xDAU
#define _frx 0xECU
#define _eexp 0xEDU
#define _nsign 0xEEU
#define _esign 0xEFU
#define _fchrflg 0xF0U
#define _digrt 0xF1U
#define _cix 0xF2U
#define fr0 page0[ _fr0]
#define fr0m page0[ _fr0m]
#define fre page0[ _fre]
#define frx page0[ _frx]
#define eexp page0[ _eexp]
#define nsign page0[ _nsign]
#define esign page0[ _esign]
#define fchrflg page0[ _fchrflg]
#define digrt page0[ _digrt]
#define cix page0[ _cix]
#define pha() page1[ --p1_sp ] = a
#define pla() a = page1[ p1_sp++]
#define bcc(v) if( ! c) goto v
#define bcs(v) if( c) goto v
#define clc() c = 0
#define sec() c = 1
#define rts() return
#define jmp(v) goto v;
#define jsr(v) v()
#define lda(v) a = v
#define ldx(v) x = v
#define ldy(v) y = v
#define sta(v) v = a
#define stx(v) v = x
#define sty(v) v = y
#define iny() ++y
#define dey() --y
#define inx() ++x
#define dex() --x
#define ora(v) a |= v
#define eor(v) a ^= v
#define and(v) a &= v
#define inc(v) ++v
#define dec(v) --v
#define tax() x = a
#define tay() y = a
#define txa() a = x
#define tya() y = a
#define cmp(v) c = (( a - v) >= 0)
#define asl(v) c = (v) & 0x80; v <<= 1
#define lsr(v) c = (v) & 0x01; v >>= 1
#define rol(v) t = c; c = ((v) & 0x80) != 0; (v) = ((v) << 1) | t
#define ror(v) t = c; c = (v) & 0x01; (v) = ((v) >> 1) | (t ? 0x80 : 0)
#define adc(v) \
if( ((int) a + v + c) >= 0x100) \
{ \
a += v + c; \
c = 1; \
} \
else \
{ \
a += v + c; \
c = 0; \
}
#define sbc(v) \
if( ((int) a - v - ! c ) < 0) \
{ \
a -= v - ! c; \
c = 0; \
} \
else \
{ \
a -= v - ! c; \
c = 1; \
}
void ab_tstnum()
{
ldy( cix);
lda( inbuff[y]);
sec();
sbc( 0x30);
bcc( tsnfail1);
c = ((a - 0xA) >= 0);
rts();
tsnfail1:
sec();
rts();
}
void ab_getchar()
{
jsr( ab_tstnum);
ldy( cix);
bcc( _gchr1);
lda( inbuff[y]);
_gchr1:
jsr( ab_gchr1);
}
void ab_gchr1()
{
iny();
sty( cix);
rts();
}
void ab_tstchar()
{
lda( cix);
pha();
jsr( ab_getchar);
bcc( rtpass);
if( a == '.')
goto tstn;
if( a == '+')
goto tstn1;
if( a == '-')
goto tstn1;
rtfail:
pla();
sec();
rts();
tstn1:
jsr( ab_getchar);
bcc( rtpass);
if( a != '.')
goto rtfail;
tstn:
jsr( ab_getchar);
bcc( rtpass);
bcs( rtfail);
rtpass:
pla();
sta( cix);
clc();
rts();
}
void ab_nibsh0()
{
ldx( _fr0m);
ldy( 4);
nibs:
clc();
rol( page0[ 4 + (byte) x]);
rol( page0[ 3 + (byte) x]);
rol( page0[ 2 + (byte) x]);
rol( page0[ 1 + (byte) x]);
rol( page0[ (byte) x]);
rol( frx);
if( dey())
goto nibs;
rts();
}
void ab_norm()
{
ldx(0);
stx( page0[ _fr0 + _fprec]);
ldx( _fmprec - 1);
if( ! (lda( fr0)))
goto ndone;
norm:
if( lda( fr0m))
goto tstbig;
ldy(0);
nsh:
lda( page0[ _fr0m + 1 + (byte) y]);
sta( page0[ _fr0m + (byte) y]);
iny();
if( y < _fmprec)
goto nsh;
dec( fr0);
if( dex())
goto norm;
if( ! (lda( fr0m)))
goto tstbig;
sta( fr0);
clc();
rts();
tstbig:
lda( fr0);
and( 0x7F);
if( a < 49 + 64)
goto tstund;
rts();
tstund:
if( a >= -49 + 64)
goto ndone;
jsr( ab_zfr0);
ndone:
clc();
rts();
}
void ab_zfr0()
{
ldx( _fr0);
ldy( 6);
jsr( ab_zxly);
}
void ab_zxly()
{
lda( 0);
zf2:
sta( page0[ (byte) x]);
inx();
if( dey())
goto zf2;
rts();
}
int ab_ascin( s)
signed char *s;
{
inbuff = s;
cix = 0;
jsr( ab_tstchar);
bcs( nonum);
ldx( _eexp);
ldy( 4);
jsr( ab_zxly);
ldx( 0xFF);
stx( digrt);
jsr( ab_zfr0);
jmp( in2);
in1:
lda( 0xFF);
sta( fchrflg);
in2:
jsr( ab_getchar);
bcs( non1);
pha(); /* it's a number */
if( ldx( fr0m)) /* get 1st byte */
goto ince; /* incr exponent */
jsr( ab_nibsh0); /* shift fr0 one nibble left */
pla();
ora( page0[ _fr0m + _fmprec - 1]);
sta( page0[ _fr0m + _fmprec - 1]);
if( (ldx( digrt)) < 0)
goto in1;
inx();
if( stx( digrt))
goto in1;
ince:
pla();
if( (ldx( digrt)) >= 0)
goto ince2;
inc( eexp);
ince2:
jmp( in1);
nonum:
return( (int) c);
non1:
if( a == '.')
goto dp;
if( a == 'E')
goto exp;
if( ldx( fchrflg))
goto exit;
if( a == '+')
goto in1;
if( a == '-')
goto minus; /* it's unbelievable */
minus:
if( ! (sta( nsign)))
goto in1;
dp:
if( (ldx( digrt)) >= 0)
goto exit;
inx();
if( ! (stx( digrt)))
goto in1;
exp:
lda( cix);
sta( frx);
jsr( ab_getchar);
bcs( non2);
exp2:
tax();
lda( eexp);
pha();
stx( eexp);
jsr( ab_getchar);
bcs( exp3);
pha();
lda( eexp);
asl( a);
sta( eexp);
asl( a);
asl( a);
adc( eexp);
sta( eexp);
pla();
clc();
adc( eexp);
ldy( cix);
jsr( ab_gchr1);
exp3:
if( ! (lda( esign)))
goto exp1;
lda ( eexp);
eor( 0xFF);
clc();
adc( 1);
sta( eexp);
exp1:
pla();
clc();
adc( eexp);
if( sta( eexp))
goto exit;
non2:
if( a == '+')
goto eplus;
if( a != '-')
goto note;
sta( esign);
eplus:
jsr( ab_getchar);
bcc( exp2);
note:
lda( frx);
sta( cix);
exit:
dec( cix);
lda( eexp);
if( (ldx( digrt)) <= 0)
goto exit1;
sec();
sbc( digrt);
exit1:
pha();
rol( a);
pla();
ror( a);
sta( eexp);
bcc( even);
jsr( ab_nibsh0);
even:
lda( eexp);
clc();
adc( 0x44);
sta( fr0);
jsr( ab_norm);
bcs( ind2);
if( ! (ldx( nsign)))
goto indon;
lda( fr0);
ora( 0x80);
sta( fr0);
indon:
clc();
ind2:
return( c);
}