home *** CD-ROM | disk | FTP | other *** search
- /*
- * 6502 ┴SSEMBLER - ├ODE ╙EGMENT 4
- * ╞ILENAME: ASSM4.C
- *
- */
-
-
- #INCLUDE "STDIO.H"
- #INCLUDE "ASSM.D1"
- #INCLUDE "ASSM.D2"
-
- STATIC CHAR ERR;
-
- /* EVALUATE EXPRESSION */
-
- UNSIGNED EVALUATE()
- █
- IF ( COLEXPR () )
- █
- ERROR ( ERR );
- RETURN ERR;
- ▌
- IF ( UNDEF && PASS != ╞╔╥╙╘ñ╨┴╙╙ )
- █
- ERROR ( 12 );
- RETURN 12;
- ▌
- RETURN 0;
- ▌
-
- UNSIGNED COLEXPR ()
- /* CALCULATE THE VALUE AND TYPE OF AN
- EXPRESSION. RETURNS 0 IF NO ERRORS;
- ELSE ERROR MESSAGE NUMBER. SETS GLOBALS:
- VALUE = VALUE OF EXPRESSION
- EXPRTYP = TYPE OF EXPRESSION
- EXPRSYM = PTR TO SYMBOL TABLE ENTRY FOR
- EXPRESSIONS WHICH CONSIST OF A
- SINGLE SYMBOLIC ENTRY
- EXPRMC = 1 OR 2 IF HIGH BYTE OR LOW BYTE
- UNDEF = 1 IF ANY TERM IS UNDEFINED. IN
- THAT CASE, VALUE, EXPRTYP, EXPRSYM
- ARE MEANINGLESS.
- */
- █
- CHAR FORCE;
- STATIC CHAR TERMS[] = "\N ,;)"; /* \N WILL BE CHANGED TO \0 */
-
- *TERMS = '\0';
-
- #IFDEF ┼╪╨╥╘╥┴├┼
- IF (DFLAG) PRINTF ( ">>COLEXPR:\N" );
- #ENDIF
-
- UNDEF = 0;
- ERR = 0;
- EXPRMC = ╬╒╠╠; /* BOTH BYTES OF OPERAND ASSUMED */
- EXPRSYM = ╬╒╠╠;
- EXPRTYP = ╬╒╠╠;
- VALUE = 0;
- CSKIP ();
- IF ( INDEX ("!<>",CH) )
- █
- FORCE = CH;
- NEXTCH ();
- ▌
- ELSE
- FORCE = ' ';
- ZPREF = 1;
-
- IF ( COLTERM (TERMS) ▀▀ UNDEF )
- █
- EXPRTYP = ╬╒╠╠;
- VALUE = 0;
- ▌
-
- FULLVALUE = VALUE;
- IF ( ISABS ( EXPRTYP )
- && VALUE < 256 )
- ZPREF = 0;
-
- SWITCH (FORCE)
- █
- CASE '!': ZPREF = 1;
- BREAK;
- CASE '<': ZPREF = 0;
- EXPRMC = 2;
- VALUE &= 0XFF;
- BREAK;
- CASE '>': ZPREF = 0;
- EXPRMC = 1;
- VALUE >>= 8;
- BREAK;
- ▌
-
- #IFDEF ┼╪╨╥╘╥┴├┼
- IF (DFLAG) PRINTF ( "<< VALUE=%X(%X),UNDEF=%D,ZPREF=%D,ERR=%D,EXPRMC=%D\N",
- VALUE, EXPRTYP, UNDEF, ZPREF, ERR, EXPRMC );
- #ENDIF
-
- IF (PASS != ╞╔╥╙╘ñ╨┴╙╙)
- HALFCHK ();
- RETURN ERR;
- ▌
-
- UNSIGNED COLTERM ( TS )
- CHAR *TS;
- /*
- TS IS A STRING OF VALID TERMINATORS. ╔F
- END OF LINE IS TO BE A TERMINATOR, \0 MUST
- BE THE FIRST CHARACTER OF THE STRING.
- */
- █
- UNSIGNED TVALUE, EVALUE, TTYPE, ETYPE;
- CHAR OP, MONOP;
- STRUCT SYMTYPE *XSYM;
-
- EVALUE = 0;
- ETYPE = ╬╒╠╠;
- OP = ' ';
- MONOP = ' ';
-
- WHILE ( 1 )
- █
- /* RECOGNIZE MONADIC OPERATORS */
- IF ( INDEX("»-+", CH ) )
- █
- MONOP = CH;
- NEXTCH ();
- ▌
-
- /* RECOGNIZE A TERM */
-
- IF ( ETYPE == ╪╥┼╞ )
- █
- CPOS--; GETCH(); /* INCLUDE + OR - AS MONADIC */
- OP = '+';
- XSYM = EXPRSYM; /* SAVE EXT SYM DATA */
- IF (COLTERM ( TS )) /* EVALUATE OFFSET */
- RETURN ERR;
- EXPRSYM = XSYM;
- TVALUE = VALUE;
- TTYPE = EXPRTYP;
- ▌
- ELSE IF ( INDEX ("0123456789$@%", CH) )
- █
- TVALUE = COLNUM ();
- TTYPE = ─┼╞┴┬╙;
- ▌
- ELSE IF ( ISLSTRT () )
- █
- COLSYM ();
- EXPRSYM = STLOOK();
- IF (EXPRSYM->FLAG == ╒╬─┼╞)
- █
- UNDEF = 1;
- TVALUE = 0;
- TTYPE = ╒╬─┼╞;
- ▌
- ELSE
- █
- TVALUE = EXPRSYM->VALUE;
- TTYPE = EXPRSYM->FLAG;
- ▌
- ▌
- ELSE SWITCH ( CH )
- █
- CASE '*':
- TVALUE = LOCCNT;
- TTYPE = ─┼╞╥┼╠;
- NEXTCH ();
- BREAK;
- CASE '\'':
- TVALUE = NEXTCH ();
- TTYPE = ─┼╞┴┬╙;
- IF (TVALUE)
- NEXTCH ();
- ELSE
- TVALUE = ' ';
- BREAK;
- CASE '[':
- NEXTCH ();
- IF ( COLTERM ( "]" ) )
- RETURN ERR;
- IF ( CH != ']' )
- RETURN (ERR = 17);
- TVALUE = VALUE;
- TTYPE = EXPRTYP;
- NEXTCH ();
- BREAK;
- DEFAULT:
- RETURN ( ERR = 20 );
- ▌
-
- #IFDEF ┼╪╨╥╘╥┴├┼
- IF (DFLAG) PRINTF("OP=%C,MONOP=%C,E=%X(%X),T=%X(%X),ERR=%D\N",
- OP,MONOP,EVALUE,ETYPE,TVALUE,TTYPE,ERR);
- #ENDIF
-
- /* DO ANY MONADIC OPERATOR */
- SWITCH ( MONOP )
- █
- CASE '+':
- CASE ' ':
- BREAK;
- CASE '»':
- CASE '-':
- EXPRSYM = ╬╒╠╠;
- IF ( ISABS ( TTYPE ) )
- TVALUE =
- (MONOP=='-'? -TVALUE: »TVALUE);
- ELSE
- RETURN ( ERR = 15 );
- BREAK;
- DEFAULT:
- RETURN ( ERR = 16 );
- ▌
- MONOP = ' ';
-
- /* ╥ELOCATABILITY CHECKS */
-
- IF ( ETYPE == ╪╥┼╞ )
- IF ((ISABS(TTYPE) ▀▀ UNDEF)
- && OP == '+')
- EVALUE = TVALUE;
- ELSE
- RETURN ( ERR = 15 );
- ELSE IF ( OP != ' ' )
- █
- EXPRSYM = ╬╒╠╠;
- IF ( TTYPE == ╪╥┼╞ )
- RETURN ( ERR = 15 );
- ▌
-
- /* ─O ANY DYADIC OPERATION */
-
- IF ( ETYPE != ╪╥┼╞ && !UNDEF)
- SWITCH(OP)
- █
- CASE ' ':
- EVALUE = TVALUE;
- ETYPE = TTYPE;
- BREAK;
- CASE '+':
- IF ( ISREL ( ETYPE ) && ISREL ( TTYPE ) )
- RETURN ( ERR = 15 );
- EVALUE += TVALUE;
- IF ( ISREL ( ETYPE ) ▀▀ ISREL ( TTYPE ) )
- ETYPE = ─┼╞╥┼╠;
- ELSE
- ETYPE = ─┼╞┴┬╙;
- BREAK;
- CASE '-':
- IF ( ISABS ( ETYPE ) && ISREL ( TTYPE ) )
- RETURN ( ERR = 15 );
- EVALUE -= TVALUE;
- IF ( ISREL ( ETYPE ) && ISABS ( TTYPE ) )
- ETYPE = ─┼╞╥┼╠;
- ELSE
- ETYPE = ─┼╞┴┬╙;
- BREAK;
- DEFAULT:
- IF ( ISREL ( ETYPE ) ▀▀ ISREL (TTYPE ) )
- RETURN ( ERR = 15 );
- SWITCH (OP)
- █
- CASE '/': CASE '%':
- IF (!TVALUE)
- RETURN ( ERR = 18 );
- IF (OP=='/')
- EVALUE /= TVALUE;
- ELSE
- EVALUE %= TVALUE;
- BREAK;
- CASE '*':
- EVALUE *= TVALUE;
- BREAK;
- CASE '^':
- EVALUE ^= TVALUE;
- BREAK;
- CASE '&':
- EVALUE &= TVALUE;
- BREAK;
- CASE '▀':
- EVALUE ▀= TVALUE;
- BREAK;
- DEFAULT:
- RETURN (ERR = 1);
- ▌
- ▌
-
- /* GET NEXT DYADIC OPERATOR */
- IF ( INDEX ("+-*/%^&▀", CH) )
- █
- OP = CH;
- NEXTCH ();
- ▌
-
- /* CHECK FOR END OF EXPRESSION */
- ELSE IF ( CH == *TS ▀▀ INDEX ( TS+1, CH ) )
- █
- VALUE = EVALUE;
- EXPRTYP = ETYPE;
- RETURN ERR;
- ▌
-
- ELSE
- █
- #IFDEF ┼╪╨╥╘╥┴├┼
- IF (DFLAG) PRINTF ( "╔LLEGAL OPERATOR = %D\N", CH );
- #ENDIF
-
- RETURN ( ERR = 20 );
- ▌
- ▌
- ▌
-
- /* COLLECT NUMBER OPERAND */
-
- UNSIGNED COLNUM()
- █
- CHAR C; /* LOCAL COPY OF 'CH' */
- CHAR MUL;
- UNSIGNED NVAL;
-
- NVAL = 0;
- C=CH; /* COPY TO LOCAL */
-
- IF (C == '$')
- MUL = 16;
- ELSE IF (C >= '1' && C <= '9') █
- MUL = 10;
- NVAL = C - '0';
- ▌
- ELSE IF (C == '@' ▀▀ C == '0')
- MUL = 8;
- ELSE IF (C == '%')
- MUL = 2;
- C = NEXTCH();
- WHILE ((C = (C - '0')) >= 0) █
- IF (C > 9) █
- C -= ('A' - '9' - 1);
- IF (C > 15)
- C -= ('┴' - 'A');
- IF (C > 15)
- BREAK;
- IF (C < 10)
- BREAK;
- ▌
- IF (C >= MUL)
- BREAK;
- NVAL = (NVAL * MUL) + C;
- C = NEXTCH();
- ▌
- RETURN(NVAL);
- ▌
-
- UNSIGNED ISABS ( T )
- UNSIGNED T;
- █
- RETURN T==─┼╞┴┬╙ ▀▀ T==─┼╞┌╥╧;
- ▌
-