home *** CD-ROM | disk | FTP | other *** search
- /*
- * 6502 ┴SSEMBLER - ├ODE ╙EGMENT 2
- * ╞ILENAME: ASSM2.C
- *
- */
-
- #INCLUDE <STDIO.H>
- #INCLUDE <STRINGS.H>
-
- #INCLUDE "ASSM.D1"
- #INCLUDE "ASSM.D2"
-
- EXTERN CHAR *OPMNEM[];
- EXTERN UNSIGNED OPTAB[];
-
- STRUCT SYMTYPE *STLOOK();
- STRUCT SYMTYPE *STINSTAL();
-
- STATIC UNSIGNED SYMLEN;
-
- /* ┴DVANCE LINE POINTER TO NEXT CHARACTER AND STORE CHARACTER IN 'CH' */
- CHAR NEXTCH()
- █
- RETURN((CH = PRLNBUF[++CPOS]));
- ▌
-
-
- /* ╔NSURE WE HAVE THE CURRENT CHARACTER */
-
- CHAR GETCH()
- █
- RETURN((CH = PRLNBUF[CPOS]));
- ▌
-
- /* ╒NCONDITIONAL SKIP TO NEXT NON-BLANK */
- CHAR SKIP()
- █
- WHILE (NEXTCH()==' ');
- RETURN (CH);
- ▌
-
- /* ├ONDITIONAL SKIP TO NEXT NON-BLANK */
- CHAR CSKIP()
- █
- IF (CH==' ') SKIP();
- RETURN (CH);
- ▌
-
- CHAR TOLOWER ( C )
- CHAR C;
- █
- RETURN (C>='┴' && C<='┌'? C+'A'-'┴': C);
- ▌
-
- /* TRANSLATE SOURCE LINE TO MACHINE LANGUAGE */
-
- ╓╧╔─ ASSEMBLE()
- █
- INT FLG;
-
- CPOS = ╙╞╔┼╠─; /* SET STARTING POSITION */
- GETCH(); /* GET STARTING CHARACTER */
-
- IF ((CH == ';') ▀▀ (CH == 0))
- RETURN;
- LABLPTR = ╬╒╠╠;
- IF ( COLSYM() ) LABLPTR = STLOOK();
-
- CSKIP();
-
- IF ((FLG = OPLOOK()) >= 0 && OPFLG == ├┴╙╙═)
- █
- CASSM();
- RETURN;
- ▌
- IF (NOASM())
- █
- LISTED ▀= !CFLAG;
- RETURN;
- ▌
-
- IF (FLG < 0) █
- LABLDEF(LOCCNT,─┼╞╥┼╠);
- IF (FLG == -1)
- ERROR(2); /* INVALID OPCODE */
- IF ((FLG == -2) && (PASS == ╠┴╙╘ñ╨┴╙╙))
- IF (LABLPTR)
- LOADLC(LOCCNT, 1);
- RETURN;
- ▌
- IF (OPFLG == ╨╙┼╒─╧)
- PSEUDO();
- ELSE █
- LABLDEF(LOCCNT,─┼╞╥┼╠);
- IF (OPFLG == ├╠┴╙╙1)
- CLASS1();
- ELSE IF (OPFLG == ├╠┴╙╙2)
- CLASS2();
- ELSE CLASS3();
- ▌
- RETURN;
- ▌
-
- /* PRINTLINE PRINTS THE CONTENTS OF PRLNBUF */
-
- ╓╧╔─ PRINTLN()
- █
- IF (LFLAG > 0)
- PRINTF("%S\N", PRLNBUF);
- ▌
-
- /* COLSYM() COLLECTS A SYMBOL FROM PRLNBUF INTO SYMBOL[],
- * LEAVES PRLNBUF POINTER AT FIRST INVALID SYMBOL CHARACTER,
- * RETURNS
- * SYMBOL LENGTH, OR
- * 0 => NO SYMBOL COLLECTED
- */
-
- UNSIGNED COLSYM()
- █
- UNSIGNED I,VALID;
-
- VALID = 1;
- I = 0;
- WHILE (VALID) █
- IF ( ISLSTRT() );
- ELSE IF (I >= 1 && INDEX("0123456789$",CH));
- ELSE VALID = 0;
- IF (VALID) █
- IF (I < ╙┬╧╠╙┌ )
- SYMBOL[I++] = CH;
- NEXTCH();
- ▌
- ▌
- IF (I == 1 && INDEX("┴A╪X┘Y", *SYMBOL)) █
- ERROR(3); /* RESERVED SYMBOL */
- I = 0;
- ▌
- SYMBOL[I] = 0;
- RETURN(I);
- ▌
-
- UNSIGNED ISLSTRT ()
- █
- CHAR C;
-
- C = TOLOWER( CH );
- RETURN (0 != INDEX("ñ.ABCDEFGHIJKLMNOPQRSTUVWXYZ", C));
- ▌
-
- /* SYMBOL TABLE LOOKUP
- * IF FOUND, RETURN POINTER TO SYMBOL
- * ELSE, INSTALL SYMBOL AS UNDEFINED, AND RETURN POINTER
- */
-
- STRUCT SYMTYPE *STLOOK()
- █
- CHAR *SYM;
- STRUCT SYMTYPE *PTR;
- INT HASHV;
-
- HASHV = 0;
-
- FOR (SYM=SYMBOL; *SYM ; SYM++)
- HASHV += *SYM;
- SYMLEN = SYM - SYMBOL;
-
- HASHV %= ╚╘╙╔┌┼;
- FOR (PTR=HASHñTBL[HASHV]; PTR ; PTR = PTR->NEXT) █
- IF (!STRCMP(SYMBOL,PTR->NAME))
- RETURN(PTR);
- ▌
-
- RETURN(STINSTAL(HASHV));
- ▌
-
- /* INSTALL SYMBOL
- */
- STRUCT SYMTYPE *STINSTAL(HV)
- INT HV;
- █
- STRUCT SYMTYPE *NEWSYM;
-
- NEWSYM = (STRUCT SYMTYPE *) MAKEREC(SIZEOF(STRUCT SYMTYPE));
-
- NEWSYM->FLAG = ╒╬─┼╞;
- NEWSYM->XDFLAG = 0;
- NEWSYM->NAME = (CHAR *) MAKEREC(SYMLEN+1);
- STRCPY(NEWSYM->NAME,SYMBOL);
- NEWSYM->VALUE = 0;
- NEWSYM->NEXT = HASHñTBL[HV];
- HASHñTBL[HV] = NEWSYM; /* PUT AT HEAD OF LIST */
-
- RETURN(NEWSYM);
- ▌
-
- /* OPERATION CODE TABLE LOOKUP
- * RETURNS:
- * INDEX IN 'OPMNEM' OF SYMBOL, IF VALID
- * -1 IF INVALID
- * -2 IF NO OPCODE COLLECTED
- */
-
- INT OPLOOK()
- █
- UNSIGNED C,I;
- UNSIGNED J;
- INT K;
- CHAR TEMP[╧╨╙┌+1];
-
- FOR (I=0;I<╧╨╙┌;I++)
- TEMP[I] = ' ';
-
- I = 0;
- J = 0;
- WHILE( CH && !INDEX(" ;", CH) ) █
- C = TOLOWER(CH);
- IF ( INDEX(".=ABCDEFGHIJKLMNOPQRSTUVWXYZ", C) )
- TEMP[J] = C;
- ELSE RETURN(-1);
-
- IF (++J > ╧╨╙┌) /* TOO LONG? */
- RETURN(-1);
-
- IF (C == '=')
- BREAK;
-
- NEXTCH();
- ▌
- IF (J==0) RETURN(-2); /* NO OPCODE FIELD */
-
- /* USE VARIABLES AS FOLLOWS:
- * I = MNEMONIC TABLE INDEX
- * J = 2 * I FOR OPTAB INDEX
- * K = COMPARE DESIGNATOR
- */
-
- TEMP[╧╨╙┌] = '\0'; /* TERMINATE WITH NULL */
-
- /* ─O THIS QUICK AND DIRTY FOR NOW... */
-
- FOR (I=0;I<╬╒═╧╨╙;I++) █
-
- IF (!(K=STRCMP(TEMP,OPMNEM[I]))) █
- J = I << 1 ; /* FAST MULTIPLY X 2 */
- OPFLG = OPTAB[J];
- OPVAL = OPTAB[++J];
- RETURN(I);
- ▌
- IF (K<0) RETURN(-1); /* BEYOND? */
- ▌
- RETURN(-1);
- ▌
-
- /* LOAD 16 BIT VALUE IN PRINTABLE FORM INTO PRLNBUF */
-
- ╓╧╔─ LOADLC(VAL, F)
- UNSIGNED VAL,F;
- █
- CHAR I;
- CHAR *P1, *P2;
- STATIC CHAR POS[] = █6, 13, 18▌;
-
- I = POS[ F ];
- HEXCON(4, VAL);
- FOR (P1 = &PRLNBUF[I],P2=HEX; P2<HEX+4; )
- *P1++ = *P2++;
- ▌
-
-
- /* LOAD VALUE IN HEX INTO PRLNBUF[CONTENTS[I]] */
-
- ╓╧╔─ LOADV(VAL,F)
- UNSIGNED VAL,F;
- █
- CHAR I;
-
- I = 3*F;
- HEXCON(2, VAL);
- PRLNBUF[13 + I] = HEX[0];
- PRLNBUF[14 + I] = HEX[1];
- ▌
-
- /* CONVERT NUMBER SUPPLIED AS ARGUMENT TO HEXADECIMAL IN HEX[DIGIT-1] (LSD)
- THROUGH HEX[0] (MSD) */
-
- ╓╧╔─ HEXCON(DIGIT, NUM)
- UNSIGNED DIGIT,NUM;
- █
- HEX[DIGIT] = 0;
- WHILE (DIGIT)
- █
- HEX[--DIGIT] = (NUM & 0X0F) + '0';
- IF (HEX[DIGIT] > '9')
- HEX[DIGIT] += '┴' -'9' - 1;
- NUM >>= 4;
- ▌
- ▌
-
- /* ASSIGN <VALUE> TO LABEL POINTED TO BY LABLPTR,
- * CHECKING FOR VALID DEFINITION, ETC.
- * CALLED WITH:
- * VALUE TO BE ASSIGNED
- * LABEL TYPE (FLAG)
- * RETURNS:
- * 0 => SUCCESS
- * 1 => MULTIPLY DEFINED LABEL
- * 2 => SYNC ERROR
- */
-
- ╓╧╔─ LABLDEF(LVAL,LTYP)
- UNSIGNED LVAL,LTYP;
- █
- IF (LABLPTR) █
-
- IF (PASS == ╞╔╥╙╘ñ╨┴╙╙) █
- IF (LABLPTR->FLAG == ╒╬─┼╞ ) █
- LABLPTR->VALUE = LVAL;
- LABLPTR->FLAG = LTYP;
- ▌
- ELSE █
- LABLPTR->FLAG = ═─┼╞;
- LABLPTR->VALUE = 0;
- ERROR(5); /* MULTIPLY DEFINED */
- RETURN;
- ▌
- ▌
- ELSE █
- IF (PASS == ╠┴╙╘ñ╨┴╙╙) █
- IF (LABLPTR->VALUE != LVAL) █
- ERROR(6);
- RETURN;
- ▌
- ELSE █ /* ┴DD ╪─┼╞ TO RELOC. INFO? */
- IF (LABLPTR->XDFLAG) ADDDEF(LABLPTR);
- ▌
- ▌
- ▌
- ▌
- RETURN;
- ▌
-