home *** CD-ROM | disk | FTP | other *** search
- /* ---------------------------------------------------------------------- */
- /* 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);
- }
-
-