home *** CD-ROM | disk | FTP | other *** search
/ 8bitfiles.net/archives / archives.tar / archives / genie-commodore-file-library / C64-128Toolkit / CASSM.SFX / assm4.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-11-27  |  7.1 KB  |  363 lines

  1. /*
  2.  * 6502 ┴SSEMBLER - ├ODE ╙EGMENT 4
  3.  * ╞ILENAME: ASSM4.C
  4.  *
  5.  */
  6.  
  7.  
  8. #INCLUDE "STDIO.H"
  9. #INCLUDE "ASSM.D1"
  10. #INCLUDE "ASSM.D2"
  11.  
  12. STATIC CHAR ERR;
  13.  
  14. /* EVALUATE EXPRESSION */
  15.  
  16. UNSIGNED EVALUATE()
  17.    IF ( COLEXPR () )
  18.    █
  19.       ERROR ( ERR );
  20.       RETURN ERR;
  21.    ▌
  22.    IF ( UNDEF && PASS != ╞╔╥╙╘ñ╨┴╙╙ )
  23.    █
  24.       ERROR ( 12 );
  25.       RETURN 12;
  26.    ▌
  27.    RETURN 0;
  28.  
  29. UNSIGNED COLEXPR ()
  30. /* CALCULATE THE VALUE AND TYPE OF AN
  31. EXPRESSION.  RETURNS 0 IF NO ERRORS;
  32. ELSE ERROR MESSAGE NUMBER.  SETS GLOBALS:
  33.    VALUE = VALUE OF EXPRESSION
  34.    EXPRTYP = TYPE OF EXPRESSION
  35.    EXPRSYM = PTR TO SYMBOL TABLE ENTRY FOR
  36.              EXPRESSIONS WHICH CONSIST OF A
  37.              SINGLE SYMBOLIC ENTRY
  38.    EXPRMC = 1 OR 2 IF HIGH BYTE OR LOW BYTE
  39.    UNDEF = 1 IF ANY TERM IS UNDEFINED.  IN
  40.            THAT CASE, VALUE, EXPRTYP, EXPRSYM
  41.            ARE MEANINGLESS.
  42. */
  43.    CHAR FORCE;
  44.    STATIC CHAR TERMS[] = "\N ,;)"; /* \N WILL BE CHANGED TO \0 */
  45.  
  46.    *TERMS = '\0';
  47.  
  48. #IFDEF ┼╪╨╥╘╥┴├┼
  49.    IF (DFLAG) PRINTF ( ">>COLEXPR:\N" );
  50. #ENDIF
  51.  
  52.    UNDEF = 0;
  53.    ERR = 0;
  54.    EXPRMC = ╬╒╠╠;   /* BOTH BYTES OF OPERAND ASSUMED */
  55.    EXPRSYM = ╬╒╠╠;
  56.    EXPRTYP = ╬╒╠╠;
  57.    VALUE = 0;
  58.    CSKIP ();
  59.    IF ( INDEX ("!<>",CH) )
  60.    █
  61.       FORCE = CH;
  62.       NEXTCH ();
  63.    ▌
  64.    ELSE
  65.       FORCE = ' ';
  66.    ZPREF = 1;
  67.  
  68.    IF ( COLTERM (TERMS) ▀▀ UNDEF )
  69.    █
  70.       EXPRTYP = ╬╒╠╠;
  71.       VALUE = 0;
  72.    ▌
  73.  
  74.    FULLVALUE = VALUE;
  75.    IF ( ISABS ( EXPRTYP )
  76.       && VALUE < 256 )
  77.       ZPREF = 0;
  78.  
  79.    SWITCH (FORCE)
  80.    █
  81.    CASE '!': ZPREF = 1;
  82.              BREAK;
  83.    CASE '<': ZPREF = 0;
  84.              EXPRMC = 2;
  85.              VALUE &= 0XFF;
  86.              BREAK;
  87.    CASE '>': ZPREF = 0;
  88.              EXPRMC = 1;
  89.              VALUE >>= 8;
  90.              BREAK;
  91.    ▌
  92.  
  93. #IFDEF ┼╪╨╥╘╥┴├┼
  94.    IF (DFLAG) PRINTF ( "<< VALUE=%X(%X),UNDEF=%D,ZPREF=%D,ERR=%D,EXPRMC=%D\N",
  95.       VALUE, EXPRTYP, UNDEF, ZPREF, ERR, EXPRMC );
  96. #ENDIF
  97.  
  98.    IF (PASS != ╞╔╥╙╘ñ╨┴╙╙)
  99.       HALFCHK ();
  100.    RETURN ERR;
  101.  
  102. UNSIGNED COLTERM ( TS )
  103. CHAR *TS;
  104. /*
  105. TS IS A STRING OF VALID TERMINATORS.  ╔F
  106. END OF LINE IS TO BE A TERMINATOR, \0 MUST
  107. BE THE FIRST CHARACTER OF THE STRING.
  108. */
  109.    UNSIGNED TVALUE, EVALUE, TTYPE, ETYPE;
  110.    CHAR OP, MONOP;
  111.    STRUCT SYMTYPE *XSYM;
  112.  
  113.    EVALUE = 0;
  114.    ETYPE = ╬╒╠╠;
  115.    OP = ' ';
  116.    MONOP = ' ';
  117.  
  118.    WHILE ( 1 )
  119.    █
  120.       /* RECOGNIZE MONADIC OPERATORS */
  121.       IF ( INDEX("»-+", CH ) )
  122.       █
  123.          MONOP = CH;
  124.          NEXTCH ();
  125.       ▌
  126.  
  127.       /* RECOGNIZE A TERM */
  128.  
  129.       IF ( ETYPE == ╪╥┼╞ )
  130.       █
  131.          CPOS--; GETCH(); /* INCLUDE + OR - AS MONADIC */
  132.          OP = '+';
  133.          XSYM = EXPRSYM; /* SAVE EXT SYM DATA */
  134.          IF (COLTERM ( TS )) /* EVALUATE OFFSET */
  135.             RETURN ERR;
  136.          EXPRSYM = XSYM;
  137.          TVALUE = VALUE;
  138.          TTYPE = EXPRTYP;
  139.       ▌
  140.       ELSE IF ( INDEX ("0123456789$@%", CH) )
  141.       █
  142.          TVALUE = COLNUM ();
  143.          TTYPE = ─┼╞┴┬╙;
  144.       ▌
  145.       ELSE IF ( ISLSTRT () )
  146.       █
  147.          COLSYM ();
  148.          EXPRSYM = STLOOK();
  149.          IF (EXPRSYM->FLAG == ╒╬─┼╞)
  150.          █
  151.             UNDEF = 1;
  152.             TVALUE = 0;
  153.             TTYPE = ╒╬─┼╞;
  154.          ▌
  155.          ELSE
  156.          █
  157.             TVALUE = EXPRSYM->VALUE;
  158.             TTYPE = EXPRSYM->FLAG;
  159.          ▌
  160.       ▌
  161.       ELSE SWITCH ( CH )
  162.       █
  163.       CASE '*':
  164.          TVALUE = LOCCNT;
  165.          TTYPE = ─┼╞╥┼╠;
  166.          NEXTCH ();
  167.          BREAK;
  168.       CASE '\'':
  169.          TVALUE = NEXTCH ();
  170.          TTYPE = ─┼╞┴┬╙;
  171.          IF (TVALUE)
  172.             NEXTCH ();
  173.          ELSE
  174.             TVALUE = ' ';
  175.          BREAK;
  176.       CASE '[':
  177.          NEXTCH ();
  178.          IF ( COLTERM ( "]" ) )
  179.             RETURN ERR;
  180.          IF ( CH != ']' )
  181.             RETURN (ERR = 17);
  182.          TVALUE = VALUE;
  183.          TTYPE = EXPRTYP;
  184.          NEXTCH ();
  185.          BREAK;
  186.       DEFAULT:
  187.          RETURN ( ERR = 20 );
  188.       ▌
  189.  
  190. #IFDEF ┼╪╨╥╘╥┴├┼
  191.       IF (DFLAG) PRINTF("OP=%C,MONOP=%C,E=%X(%X),T=%X(%X),ERR=%D\N",
  192.          OP,MONOP,EVALUE,ETYPE,TVALUE,TTYPE,ERR);
  193. #ENDIF
  194.  
  195.       /* DO ANY MONADIC OPERATOR */
  196.       SWITCH ( MONOP )
  197.       █
  198.       CASE '+':
  199.       CASE ' ':
  200.          BREAK;
  201.       CASE '»':
  202.       CASE '-':
  203.          EXPRSYM = ╬╒╠╠;
  204.          IF ( ISABS ( TTYPE ) )
  205.             TVALUE =
  206.                (MONOP=='-'? -TVALUE: »TVALUE);
  207.          ELSE
  208.             RETURN ( ERR = 15 );
  209.          BREAK;
  210.       DEFAULT:
  211.          RETURN ( ERR = 16 );
  212.       ▌
  213.       MONOP = ' ';
  214.  
  215.       /* ╥ELOCATABILITY CHECKS */
  216.  
  217.       IF ( ETYPE == ╪╥┼╞ )
  218.          IF ((ISABS(TTYPE) ▀▀ UNDEF)
  219.          && OP == '+')
  220.             EVALUE = TVALUE;
  221.          ELSE
  222.             RETURN ( ERR = 15 );
  223.       ELSE IF ( OP != ' ' )
  224.       █
  225.          EXPRSYM = ╬╒╠╠;
  226.          IF ( TTYPE == ╪╥┼╞ )
  227.             RETURN ( ERR = 15 );
  228.       ▌
  229.  
  230.       /* ─O ANY DYADIC OPERATION */
  231.  
  232.       IF ( ETYPE != ╪╥┼╞ && !UNDEF)
  233.       SWITCH(OP)
  234.       █
  235.       CASE ' ':
  236.          EVALUE = TVALUE;
  237.          ETYPE = TTYPE;
  238.          BREAK;
  239.       CASE '+':
  240.          IF ( ISREL ( ETYPE ) && ISREL ( TTYPE ) )
  241.             RETURN ( ERR = 15 );
  242.          EVALUE += TVALUE;
  243.          IF ( ISREL ( ETYPE ) ▀▀ ISREL ( TTYPE ) )
  244.             ETYPE = ─┼╞╥┼╠;
  245.          ELSE
  246.             ETYPE = ─┼╞┴┬╙;
  247.          BREAK;
  248.       CASE '-':
  249.          IF ( ISABS ( ETYPE ) && ISREL ( TTYPE ) )
  250.             RETURN ( ERR = 15 );
  251.          EVALUE -= TVALUE;
  252.          IF ( ISREL ( ETYPE ) && ISABS ( TTYPE ) )
  253.             ETYPE = ─┼╞╥┼╠;
  254.          ELSE
  255.             ETYPE = ─┼╞┴┬╙;
  256.          BREAK;
  257.       DEFAULT:
  258.          IF ( ISREL ( ETYPE ) ▀▀ ISREL (TTYPE ) )
  259.             RETURN ( ERR = 15 );
  260.          SWITCH (OP)
  261.          █
  262.          CASE '/': CASE '%':
  263.             IF (!TVALUE)
  264.                RETURN ( ERR = 18 );
  265.             IF (OP=='/')
  266.                EVALUE /= TVALUE;
  267.             ELSE
  268.                EVALUE %= TVALUE;
  269.             BREAK;
  270.          CASE '*':
  271.             EVALUE *= TVALUE;
  272.             BREAK;
  273.          CASE '^':
  274.             EVALUE ^= TVALUE;
  275.             BREAK;
  276.          CASE '&':
  277.             EVALUE &= TVALUE;
  278.             BREAK;
  279.          CASE '▀':
  280.             EVALUE ▀= TVALUE;
  281.             BREAK;
  282.          DEFAULT:
  283.             RETURN (ERR = 1);
  284.          ▌
  285.       ▌
  286.  
  287.       /* GET NEXT DYADIC OPERATOR */
  288.       IF ( INDEX ("+-*/%^&▀", CH) )
  289.       █
  290.          OP = CH;
  291.          NEXTCH ();
  292.       ▌
  293.  
  294.       /* CHECK FOR END OF EXPRESSION */
  295.       ELSE IF ( CH == *TS ▀▀ INDEX ( TS+1, CH ) )
  296.       █
  297.          VALUE = EVALUE;
  298.          EXPRTYP = ETYPE;
  299.          RETURN ERR;
  300.       ▌
  301.  
  302.       ELSE
  303.       █
  304. #IFDEF ┼╪╨╥╘╥┴├┼
  305.          IF (DFLAG) PRINTF ( "╔LLEGAL OPERATOR = %D\N", CH );
  306. #ENDIF
  307.  
  308.          RETURN ( ERR = 20 );
  309.       ▌
  310.    ▌
  311.  
  312. /* COLLECT NUMBER OPERAND   */
  313.  
  314. UNSIGNED COLNUM()
  315.   CHAR C;   /* LOCAL COPY OF 'CH' */
  316.   CHAR MUL;
  317.   UNSIGNED NVAL;
  318.  
  319.   NVAL = 0;
  320.   C=CH; /* COPY TO LOCAL */
  321.  
  322.   IF (C == '$')
  323.     MUL = 16;
  324.   ELSE IF (C >= '1' && C <= '9') █
  325.     MUL = 10;
  326.     NVAL = C - '0';
  327.   ▌
  328.   ELSE IF (C == '@' ▀▀ C == '0')
  329.     MUL = 8;
  330.   ELSE IF (C == '%')
  331.     MUL = 2;
  332.   C = NEXTCH();
  333.   WHILE ((C = (C - '0')) >= 0) █
  334.     IF (C > 9) █
  335.       C -= ('A' - '9' - 1);
  336.       IF (C > 15)
  337.         C -= ('┴' - 'A');
  338.       IF (C > 15)
  339.         BREAK;
  340.       IF (C < 10)
  341.         BREAK;
  342.     ▌
  343.     IF (C >= MUL)
  344.       BREAK;
  345.     NVAL = (NVAL * MUL) + C;
  346.     C = NEXTCH();
  347.   ▌
  348.   RETURN(NVAL);
  349.  
  350. UNSIGNED ISABS ( T )
  351. UNSIGNED T;
  352.    RETURN T==─┼╞┴┬╙ ▀▀ T==─┼╞┌╥╧;
  353.