home *** CD-ROM | disk | FTP | other *** search
-
- /*
- * Copyright (c) 1988 by Sozobon, Limited. Author: Joseph M Treat
- *
- * Permission is granted to anyone to use this software for any purpose
- * on any computer system, and to redistribute it freely, with the
- * following restrictions:
- * 1) No charge may be made other than reasonable charges for reproduction.
- * 2) Modified versions must be clearly marked as such.
- * 3) The authors are not responsible for any harmful consequences
- * of using this software, even if they result from defects in it.
- */
-
- #include "jas.h"
-
- extern long newdot;
- extern int line;
-
- extern SYM dot;
-
- CLIST *t_head = (CLIST *) NULL,
- *d_head = (CLIST *) NULL;
- CLIST *txtptr = (CLIST *) NULL,
- *datptr = (CLIST *) NULL;
-
- bufhead()
- {
- txtptr = t_head;
- datptr = d_head;
- if ( txtptr )
- txtptr->inx = 0;
- if ( datptr )
- datptr->inx = 0;
- }
-
- CBUF *
- cget( seg )
- unsigned short seg;
- {
- register CLIST *xc, *oxc;
-
- xc = seg == TXT ? txtptr : datptr;
- if ( xc == (CLIST *) NULL )
- return (CBUF *) NULL;
-
- if ( xc->inx >= xc->cnt ) {
- /*
- * the current CLIST is used up
- */
- oxc = xc;
- xc = xc->next;
- *( seg == TXT ? &txtptr : &datptr ) = xc;
- free( (char *) oxc );
- if (! xc ) {
- return (CBUF *) NULL;
- }
- xc->inx = 0;
- }
- return &xc->cblock[xc->inx++];
- }
-
- CBUF *
- generate( n, act, val, psym )
- short n, act;
- long val;
- SYM *psym;
- {
- register CLIST *xc;
- register CBUF *cp;
-
- if ( act == GENRELOC && psym == (SYM *) NULL )
- act = GENVALUE;
-
- /* out for now ...
- fprintf( stderr, "generate( [%x], %d, %d, %lx, ",
- dot.flags, n, act, val );
- if ( psym )
- fprintf( stderr, "\"%s\" )\n", psym->name );
- else
- fprintf( stderr, "\"\" )\n" );
- ... */
-
- switch ( dot.flags ) {
- case TXT:
- if ( txtptr == (CLIST *) NULL )
- txtptr = t_head = ALLO(CLIST);
- xc = txtptr;
- break;
- case BSS:
- if ( act != GENVALUE || val != 0L || psym != (SYM *) NULL )
- Yerror( "Attempt to initialize bss" );
- newdot += n / 8;
- return;
- case DAT:
- if ( datptr == (CLIST *) NULL )
- datptr = d_head = ALLO(CLIST);
- xc = datptr;
- break;
- }
-
- if ( xc->cnt == CBLEN || (act == GENBRNCH && xc->cnt >= CBLEN-1) ) {
- xc->next = ALLO(CLIST);
- xc = xc->next;
- *( dot.flags == TXT ? &txtptr : &datptr ) = xc;
- xc->cnt = 0;
- xc->next = (CLIST *) NULL;
- }
-
- cp = &xc->cblock[xc->cnt++];
-
- if ( psym )
- psym->flags |= DEFINED;
- cp->action = act == GENBRNCH ? GENSTMT : act;
- cp->nbits = n;
- cp->value.value = val;
- cp->value.psym = psym;
- cp->line = line;
-
- newdot += n / 8;
- return cp;
- }
-
- zeros( n )
- register long n;
- {
- if ( newdot & 1 ) {
- generate( 8, GENVALUE, 0L, (SYM *) NULL );
- n--;
- }
- /* out for now ...
- for (; n >= 4; n -= 4 )
- generate(32, GENVALUE, 0L, (SYM *) NULL );
- ... */
- for (; n >= 2; n -= 2 )
- generate( 16, GENVALUE, 0L, (SYM *) NULL );
- if ( n )
- generate( 8, GENVALUE, 0L, (SYM *) NULL );
- }
-