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

  1. /*
  2.  * 6502 ┴SSEMBLER - ├ODE ╙EGMENT 2
  3.  * ╞ILENAME: ASSM2.C
  4.  *
  5.  */
  6.  
  7. #INCLUDE <STDIO.H>
  8. #INCLUDE <STRINGS.H>
  9.  
  10. #INCLUDE "ASSM.D1"
  11. #INCLUDE "ASSM.D2"
  12.  
  13. EXTERN CHAR *OPMNEM[];
  14. EXTERN UNSIGNED OPTAB[];
  15.  
  16. STRUCT SYMTYPE *STLOOK();
  17. STRUCT SYMTYPE *STINSTAL();
  18.  
  19. STATIC UNSIGNED SYMLEN;
  20.  
  21. /* ┴DVANCE LINE POINTER TO NEXT CHARACTER AND STORE CHARACTER IN 'CH' */
  22. CHAR NEXTCH()
  23.   RETURN((CH = PRLNBUF[++CPOS]));
  24.  
  25.  
  26. /* ╔NSURE WE HAVE THE CURRENT CHARACTER */
  27.  
  28. CHAR GETCH()
  29.   RETURN((CH = PRLNBUF[CPOS]));
  30.  
  31. /* ╒NCONDITIONAL SKIP TO NEXT NON-BLANK */
  32. CHAR SKIP()
  33.   WHILE (NEXTCH()==' ');
  34.   RETURN (CH);
  35.  
  36. /* ├ONDITIONAL SKIP TO NEXT NON-BLANK */
  37. CHAR CSKIP()
  38.   IF (CH==' ') SKIP();
  39.   RETURN (CH);
  40.  
  41. CHAR TOLOWER ( C )
  42. CHAR C;
  43.   RETURN (C>='┴' && C<='┌'? C+'A'-'┴': C);
  44.  
  45. /* TRANSLATE SOURCE LINE TO MACHINE LANGUAGE */
  46.  
  47. ╓╧╔─ ASSEMBLE()
  48.   INT FLG;
  49.  
  50.   CPOS = ╙╞╔┼╠─; /* SET STARTING POSITION */
  51.   GETCH();       /* GET STARTING CHARACTER */
  52.  
  53.   IF ((CH == ';') ▀▀ (CH == 0))
  54.     RETURN;
  55.   LABLPTR = ╬╒╠╠;
  56.   IF ( COLSYM() ) LABLPTR = STLOOK();
  57.  
  58.   CSKIP();
  59.  
  60.   IF ((FLG = OPLOOK()) >= 0 && OPFLG == ├┴╙╙═)
  61.   █
  62.     CASSM();
  63.     RETURN;
  64.   ▌
  65.   IF (NOASM())
  66.   █
  67.     LISTED ▀= !CFLAG;
  68.     RETURN;
  69.   ▌
  70.  
  71.   IF (FLG < 0) █
  72.     LABLDEF(LOCCNT,─┼╞╥┼╠);
  73.     IF (FLG == -1)
  74.       ERROR(2); /* INVALID OPCODE */
  75.     IF ((FLG == -2) && (PASS == ╠┴╙╘ñ╨┴╙╙))
  76.       IF (LABLPTR)
  77.         LOADLC(LOCCNT, 1);
  78.     RETURN;
  79.   ▌
  80.   IF (OPFLG == ╨╙┼╒─╧)
  81.     PSEUDO();
  82.   ELSE █
  83.     LABLDEF(LOCCNT,─┼╞╥┼╠);
  84.     IF (OPFLG == ├╠┴╙╙1)
  85.       CLASS1();
  86.     ELSE IF (OPFLG == ├╠┴╙╙2)
  87.       CLASS2();
  88.     ELSE CLASS3();
  89.   ▌
  90.   RETURN;
  91.  
  92. /* PRINTLINE PRINTS THE CONTENTS OF PRLNBUF */
  93.  
  94. ╓╧╔─ PRINTLN()
  95.   IF (LFLAG > 0)
  96.     PRINTF("%S\N", PRLNBUF);
  97.  
  98. /* COLSYM() COLLECTS A SYMBOL FROM PRLNBUF INTO SYMBOL[],
  99.  *    LEAVES PRLNBUF POINTER AT FIRST INVALID SYMBOL CHARACTER,
  100.  *    RETURNS
  101.  *      SYMBOL LENGTH, OR
  102.  *      0 => NO SYMBOL COLLECTED
  103.  */
  104.  
  105. UNSIGNED COLSYM()
  106.   UNSIGNED I,VALID;
  107.  
  108.   VALID = 1;
  109.   I = 0;
  110.   WHILE (VALID) █
  111.     IF ( ISLSTRT() );
  112.     ELSE IF (I >= 1 && INDEX("0123456789$",CH));
  113.     ELSE VALID = 0;
  114.     IF (VALID) █
  115.       IF (I < ╙┬╧╠╙┌ )
  116.         SYMBOL[I++] = CH;
  117.       NEXTCH();
  118.     ▌
  119.   ▌
  120.   IF (I == 1 && INDEX("┴A╪X┘Y", *SYMBOL)) █
  121.     ERROR(3); /* RESERVED SYMBOL */
  122.     I = 0;
  123.   ▌
  124.   SYMBOL[I] = 0;
  125.   RETURN(I);
  126.  
  127. UNSIGNED ISLSTRT ()
  128.   CHAR C;
  129.  
  130.   C = TOLOWER( CH );
  131.   RETURN (0 != INDEX("ñ.ABCDEFGHIJKLMNOPQRSTUVWXYZ", C));
  132.  
  133. /* SYMBOL TABLE LOOKUP
  134.  *      IF FOUND, RETURN POINTER TO SYMBOL
  135.  *      ELSE, INSTALL SYMBOL AS UNDEFINED, AND RETURN POINTER
  136.  */
  137.  
  138. STRUCT SYMTYPE *STLOOK()
  139.   CHAR *SYM;
  140.   STRUCT SYMTYPE *PTR;
  141.   INT HASHV;
  142.  
  143.   HASHV = 0;
  144.  
  145.   FOR (SYM=SYMBOL; *SYM ; SYM++)
  146.     HASHV += *SYM;
  147.   SYMLEN = SYM - SYMBOL;
  148.  
  149.   HASHV %= ╚╘╙╔┌┼;
  150.   FOR (PTR=HASHñTBL[HASHV]; PTR ; PTR = PTR->NEXT) █
  151.     IF (!STRCMP(SYMBOL,PTR->NAME))
  152.       RETURN(PTR);
  153.   ▌
  154.   
  155.   RETURN(STINSTAL(HASHV));
  156.  
  157. /*  INSTALL SYMBOL
  158.  */
  159. STRUCT SYMTYPE *STINSTAL(HV)
  160. INT HV;
  161.   STRUCT SYMTYPE *NEWSYM;
  162.  
  163.   NEWSYM = (STRUCT SYMTYPE *) MAKEREC(SIZEOF(STRUCT SYMTYPE));
  164.  
  165.   NEWSYM->FLAG = ╒╬─┼╞;
  166.   NEWSYM->XDFLAG = 0;
  167.   NEWSYM->NAME = (CHAR *) MAKEREC(SYMLEN+1);
  168.   STRCPY(NEWSYM->NAME,SYMBOL);
  169.   NEWSYM->VALUE = 0;
  170.   NEWSYM->NEXT = HASHñTBL[HV];
  171.   HASHñTBL[HV] = NEWSYM; /* PUT AT HEAD OF LIST */
  172.  
  173.   RETURN(NEWSYM);
  174.  
  175. /* OPERATION CODE TABLE LOOKUP
  176.  * RETURNS:
  177.  *      INDEX IN 'OPMNEM' OF SYMBOL, IF VALID
  178.  *      -1 IF INVALID
  179.  *      -2 IF NO OPCODE COLLECTED
  180.  */
  181.  
  182. INT OPLOOK()
  183.   UNSIGNED C,I;
  184.   UNSIGNED J;
  185.   INT K;
  186.   CHAR TEMP[╧╨╙┌+1];
  187.  
  188.   FOR (I=0;I<╧╨╙┌;I++) 
  189.     TEMP[I] = ' ';
  190.  
  191.   I = 0;
  192.   J = 0;
  193.   WHILE( CH && !INDEX(" ;", CH) ) █
  194.     C = TOLOWER(CH);
  195.     IF ( INDEX(".=ABCDEFGHIJKLMNOPQRSTUVWXYZ", C) )
  196.        TEMP[J] = C;
  197.     ELSE RETURN(-1);
  198.  
  199.     IF (++J > ╧╨╙┌)     /* TOO LONG? */
  200.         RETURN(-1);
  201.  
  202.     IF (C == '=')
  203.       BREAK;
  204.  
  205.     NEXTCH();
  206.   ▌
  207.   IF (J==0) RETURN(-2); /* NO OPCODE FIELD */
  208.  
  209. /* USE VARIABLES AS FOLLOWS:
  210.  * I = MNEMONIC TABLE INDEX
  211.  * J = 2 * I FOR OPTAB INDEX
  212.  * K = COMPARE DESIGNATOR
  213.  */
  214.  
  215.   TEMP[╧╨╙┌] = '\0'; /* TERMINATE WITH NULL */ 
  216.  
  217. /* ─O THIS QUICK AND DIRTY FOR NOW... */
  218.  
  219.   FOR (I=0;I<╬╒═╧╨╙;I++) █
  220.     
  221.     IF (!(K=STRCMP(TEMP,OPMNEM[I]))) █
  222.       J = I << 1 ; /* FAST MULTIPLY X 2 */
  223.       OPFLG = OPTAB[J];
  224.       OPVAL = OPTAB[++J];
  225.       RETURN(I);
  226.     ▌
  227.     IF (K<0) RETURN(-1); /* BEYOND? */
  228.   ▌
  229.   RETURN(-1);
  230.  
  231. /* LOAD 16 BIT VALUE IN PRINTABLE FORM INTO PRLNBUF */
  232.  
  233. ╓╧╔─ LOADLC(VAL, F)
  234. UNSIGNED VAL,F;
  235.   CHAR I;
  236.   CHAR *P1, *P2;
  237.   STATIC CHAR POS[] = █6, 13, 18▌;
  238.  
  239.   I = POS[ F ];
  240.   HEXCON(4, VAL);
  241.   FOR (P1 = &PRLNBUF[I],P2=HEX; P2<HEX+4; )
  242.     *P1++ = *P2++;
  243.  
  244.  
  245. /* LOAD VALUE IN HEX INTO PRLNBUF[CONTENTS[I]] */
  246.  
  247. ╓╧╔─ LOADV(VAL,F)
  248. UNSIGNED  VAL,F;
  249.   CHAR I;
  250.  
  251.   I = 3*F;
  252.   HEXCON(2, VAL);
  253.   PRLNBUF[13 + I] = HEX[0];
  254.   PRLNBUF[14 + I] = HEX[1];
  255.  
  256. /* CONVERT NUMBER SUPPLIED AS ARGUMENT TO HEXADECIMAL IN HEX[DIGIT-1] (LSD)
  257.     THROUGH HEX[0] (MSD)      */
  258.  
  259. ╓╧╔─ HEXCON(DIGIT, NUM)
  260.   UNSIGNED DIGIT,NUM;
  261.   HEX[DIGIT] = 0;
  262.   WHILE (DIGIT)
  263.   █
  264.     HEX[--DIGIT] = (NUM & 0X0F) + '0';
  265.     IF (HEX[DIGIT] > '9')
  266.       HEX[DIGIT] += '┴' -'9' - 1;
  267.     NUM >>= 4;
  268.   ▌
  269.  
  270. /* ASSIGN <VALUE> TO LABEL POINTED TO BY LABLPTR,
  271.  *      CHECKING FOR VALID DEFINITION, ETC.
  272.  * CALLED WITH:
  273.  *          VALUE TO BE ASSIGNED
  274.  *          LABEL TYPE (FLAG)
  275.  * RETURNS:
  276.  *          0 => SUCCESS
  277.  *          1 => MULTIPLY DEFINED LABEL
  278.  *          2 => SYNC ERROR
  279.  */
  280.  
  281. ╓╧╔─ LABLDEF(LVAL,LTYP)
  282. UNSIGNED LVAL,LTYP;
  283.   IF (LABLPTR) █
  284.  
  285.     IF (PASS == ╞╔╥╙╘ñ╨┴╙╙) █
  286.       IF (LABLPTR->FLAG == ╒╬─┼╞ ) █
  287.         LABLPTR->VALUE = LVAL;
  288.         LABLPTR->FLAG = LTYP;
  289.       ▌
  290.       ELSE █
  291.         LABLPTR->FLAG = ═─┼╞;
  292.         LABLPTR->VALUE = 0;
  293.         ERROR(5); /* MULTIPLY DEFINED */
  294.         RETURN;
  295.       ▌
  296.     ▌
  297.     ELSE █
  298.       IF (PASS == ╠┴╙╘ñ╨┴╙╙) █
  299.         IF (LABLPTR->VALUE != LVAL) █
  300.           ERROR(6);
  301.           RETURN;
  302.         ▌
  303.         ELSE █ /* ┴DD ╪─┼╞ TO RELOC. INFO? */
  304.           IF (LABLPTR->XDFLAG) ADDDEF(LABLPTR);
  305.         ▌
  306.       ▌
  307.     ▌
  308.   ▌
  309.   RETURN;
  310.