home *** CD-ROM | disk | FTP | other *** search
- /*
- * 6502 ┴SSEMBLER - ├ODE SEGMENT 1
- * ╞ILENAME: ASSM1.C
- *
- */
-
- #INCLUDE <STDIO.H>
- #INCLUDE <STRINGS.H>
- #INCLUDE "ASSM.D1"
- #INCLUDE "ASSM.D2"
-
-
- STATIC UNSIGNED INCLUDING;
-
- STATIC ╞╔╠┼╘┘╨┼ SVIPTR; /* SAVED INPUT FILE POINTER */
- STATIC UNSIGNED SVLINE;
-
- STATIC CHAR *PROGNAME; /* NAME OF THIS ASSEMBLER */
-
- MAIN(ARGC, ARGV)
- UNSIGNED ARGC;
- CHAR *ARGV[];
- █
- CHAR C;
- UNSIGNED CNT;
- UNSIGNED I;
-
- PROGNAME = ARGV[0];
- PRINTF("├/┴╙╙═ - VERSION 2.0 - 10/24/85\N");
-
- DFLAG = 0;
- IFLAG = 0;
- LFLAG = 0;
- FFLAG = 1; /* DEFAULT FORMATTED LISTING */
- CFLAG = 1; /* DEFAULT LIST EXCLUDED COND ASSEMBLY */
- OFLAG = 1; /* DEFAULT = CREATE OBJECT */
- SFLAG = 0;
-
- WHILE (--ARGC && (*++ARGV)[0] == '-')
- █
- FOR (I = 1; (C = TOLOWER((*ARGV)[I])) != '\0'; I++)
- █
- IF (C == 'D') /* DEBUG FLAG */
- DFLAG++;
- ELSE IF (C == 'I')/* IGNORE .NLST FLAG */
- IFLAG++;
- ELSE IF (C == 'L')/* DISABLE LISTING FLAG */
- LFLAG--;
- ELSE IF (C == 'F')/* INHIBIT FORMATTING LISTING */
- FFLAG = 0;
- ELSE IF (C == 'C')/* NO LIST EXCLUDED CONDITIONAL ASSMBLY */
- CFLAG = 0;
- ELSE IF (C == 'O')/* OBJECT OUTPUT FLAG */
- OFLAG = 0;
- ELSE IF (C == 'S')/* LIST SYMBOL TABLE FLAG */
- SFLAG = 1;
- ELSE USAGE();
- ▌
- ▌
-
- IF (!ARGC) USAGE();
-
- WHILE ( ARGC )
- █
- PASS = ╞╔╥╙╘ñ╨┴╙╙;
- FOR (I = 0; I < ╚╘╙╔┌┼; I++)
- HASHñTBL[I] = ╬╒╠╠;
- INITIALIZE( ARGC, ARGV );
- WHILE (READLINE() != ┼╧╞)
- ASSEMBLE();
- WRAPUP();
- PASS = ╠┴╙╘ñ╨┴╙╙;
- IF (!ERRCNT)
- █
- IF (LFLAG == 0)
- LFLAG++;
- INITIALIZE ( ARGC, ARGV );
- WHILE ( READLINE() != ┼╧╞ )
- █
- LISTED = 0;
- ASSEMBLE();
- IF (!LISTED)
- PRINTLN();
- ▌
- ▌
- WRAPUP();
- STPRNT();
- PRINTF( "┼ND OF ASSEMBLY, %D ERRORS\N", ERRCNT);
- IF (DFLAG)
- █
- CNT = 0;
- FOR (I = 0; I < ╚╘╙╔┌┼; I++)
- IF (!HASHñTBL[I]) CNT++;
- PRINTF( "%D UNUSED HASH TABLE POINTERS OUT OF %D\N",
- CNT, ╚╘╙╔┌┼);
- ▌
- ARGC--;
- ARGV++;
- ▌
- ▌
-
- /* INITIALIZE THIS PASS */
-
- ╓╧╔─ INITIALIZE (AC, AV)
- UNSIGNED AC;
- CHAR *AV[];
- █
- UNSIGNED LNG;
- CHAR *S,ONAME[30];
-
- S = *AV;
- LNG = STRLEN(S); /* LOOK FOR '.A' SUFFIX */
- IF (PASS == ╞╔╥╙╘ñ╨┴╙╙)
- PRINTF("%S:\N", S);
-
- IF (LNG <= 2 ▀▀ STRCMP(&S[LNG-2],".A")) █
- PRINTF("╬OT AN ASSEMBLER SOURCE (.A EXPECTED).\N");
- QUIT();
- ▌
-
- IPTR = FILEOPEN(S, "R");
- STRNCPY ( FILENAME, S, LNG-2 );
-
- IF (PASS == ╠┴╙╘ñ╨┴╙╙ && OFLAG) █
- #IFDEF ╒╬╔╪
- *ONAME = 0;
- #ELSE
- STRCPY(ONAME,"@0:");
- #ENDIF
- STRCAT(ONAME,FILENAME);
- STRCAT(ONAME,".O");
- OPTR = FILEOPEN(ONAME, "W");
- PUTOC(); /* INITIALIZE OBJECT OUTPUT ROUTINES */
- ▌
-
- INCLUDING = 0;
- ERRCNT = 0;
- LOCCNT = 0;
- SLNUM = 0;
- CASMFLG = 1;
- ▌
-
- ╞╔╠┼╘┘╨┼ FILEOPEN(FNAME,DIR)
- CHAR *FNAME, *DIR;
- █
- ╞╔╠┼╘┘╨┼ FD;
- CHAR ERR;
-
- ERR = 0;
- #IFDEF ╒╬╔╪
- IF ((FD = FOPEN(FNAME,DIR))==╬╒╠╠)
- #ELSE
- IF ((FD = FOPEN(FNAME,DIR))==╬╒╠╠
- ▀▀ (ERR = FERROR()))
- #ENDIF
- █
- PRINTF("├AN'T OPEN %S", FNAME);
- IF (ERR) PRINTF(", ERROR = %D", ERR);
- PUTCHAR('\N');
- QUIT();
- ▌
- RETURN FD;
- ▌
-
- ╓╧╔─ USAGE()
- █
- PRINTF( "╒SAGE: %S [-CDFILOS] FILE.A [FILE.A ...]\N",PROGNAME);
- QUIT();
- ▌
-
- CHAR FIELD[] =
- █
- ╙╞╔┼╠─,
- ╙╞╔┼╠─ + ╙┬╧╠╙┌,
- ╙╞╔┼╠─ + ╙┬╧╠╙┌ + 6,
- ╙╞╔┼╠─ + ╙┬╧╠╙┌ + 15
- ▌;
-
- /* READLINE READS AND FORMATS AN INPUT LINE, RETURNS
- * -1 AT END OF FILE.
- */
-
- INT READLINE()
- █
- UNSIGNED I; /* POINTER INTO PRLNBUF */
- UNSIGNED J; /* POINTER TO CURRENT FIELD START */
- CHAR CMNT; /* COMMENT LINE FLAG */
- UNSIGNED SPCNT; /* CONSECUTIVE SPACE COUNTER */
- CHAR STRING; /* ┴╙├╔╔ STRING FLAG */
- UNSIGNED TEMP1; /* TEMP USED FOR LINE NUMBER CONVERSION */
-
- DO █
- CPOS = ╙╞╔┼╠─;
- TEMP1 = ++SLNUM;
- FOR (I = 0; I < ╠┴╙╘ñ├╚ñ╨╧╙; I++)
- PRLNBUF[I] = ' ';
- I = 3;
- WHILE (TEMP1) █ /* PUT SOURCE LINE NUMBER INTO PRLNBUF */
- PRLNBUF[I--] = TEMP1 % 10 + '0';
- TEMP1 /= 10;
- ▌
- IF (INCLUDING) PRLNBUF[4] = '#';
- I = ╙╞╔┼╠─;
- CMNT = 0; SPCNT = 0; STRING = 0;
- J = 1;
- WHILE ((CH = GETC(IPTR)) != '\N') █
- PRLNBUF[I++] = CH;
- IF (CH == ┼╧╞) █
- IF (INCLUDING) █
- PRLNBUF[--I] = '\0'; /* ERASE ┼╧╞ CHARACTER */
- FCLOSE(IPTR);
- IPTR = SVIPTR; /* RESTORE PREVIOUS FILE */
- SLNUM = SVLINE;
- INCLUDING--;
- ▌
- ELSE RETURN(┼╧╞);
- ▌
- ELSE IF (FFLAG == 0)
- ;
- ELSE IF ((CH == ' ') && (STRING == 0)) █
- IF (SPCNT)
- --I;
- ELSE IF (CMNT == 0) █
- ++SPCNT;
- IF (I < FIELD[J])
- I = FIELD[J];
- IF (++J > 3) █
- SPCNT = 0;
- ++CMNT;
- ▌
- ▌
- ▌
-
- ELSE IF ((CH == ';') && (STRING == 0)) █
- SPCNT = 0;
- IF (I == ╙╞╔┼╠─ + 1)
- ++CMNT;
- ELSE IF (PRLNBUF[I - 2] != '\'') █
- ++CMNT;
- PRLNBUF[I-1] = ' ';
- IF (I < FIELD[3])
- I = FIELD[3];
- PRLNBUF[I++] = ';';
- ▌
- ▌
- ELSE █
- IF ((CH == '"') && (CMNT == 0))
- STRING = STRING ^ 1;
- SPCNT = 0;
- IF (I >= ╠┴╙╘ñ├╚ñ╨╧╙ - 1)
- --I;
- ▌
- ▌
- PRLNBUF[I] = 0;
- IF (PRLNBUF[╙╞╔┼╠─]=='#') INCLUDE();
- ▌ WHILE (PRLNBUF[╙╞╔┼╠─]=='#');
- RETURN(0);
- ▌
-
- /*
- ** ╨ROCESS INCLUDE STATEMENT.
- **
- */
- ╓╧╔─ INCLUDE()
- █
- STATIC CHAR *ICLDSTR = "INCLUDE ";
-
- CHAR C,FLNM[30];
- UNSIGNED I;
-
- IF (INCLUDING) █
- PRINTF("╧NLY ONE INCLUDE LEVEL SUPPORTED!\N");
- QUIT();
- ▌
- I=0;
- WHILE (NEXTCH()!=' ' && CH==ICLDSTR[I]) I++;
- IF (I!=7) █
- BAD:
- PRINTF("%S\N",PRLNBUF);
- PRINTF("┬AD INCLUDE SYNTAX\N");
- QUIT();
- ▌
- SKIP();
- IF ( !INDEX("\"<",(C=CH)) ) GOTO BAD;
- IF (PASS == ╠┴╙╘ñ╨┴╙╙)
- PRINTLN();
- IF (C=='<') C='>';
- I=0;
- WHILE (NEXTCH()!=C && CH)
- FLNM[I++]=CH;
- FLNM[I]='\0';
- SVLINE = SLNUM;
- SLNUM = 0;
- SVIPTR = IPTR;
- INCLUDING++;
- #IFDEF ╒╬╔╪
- IF ((IPTR=FILEOPEN(FLNM,"R")) == ╬╒╠╠)
- #ELSE
- IF ((IPTR=OPENFILE(FLNM,"R")) == ╬╒╠╠ ▀▀ FERROR())
- #ENDIF
- █
- PRINTF("├AN'T OPEN INCLUDE: %S\N",FLNM);
- QUIT();
- ▌
- ▌
-
- /*
- ** 08/04/85 - ├ENTRALIZE ERROR STRINGS
- ** TO AVOID REDUNDANCY AND ELIMINATE
- ** 'PSEUDO-XREFS' IN OTHER OBJECTS.
- */
- ╓╧╔─ ERROR(CODE)
- UNSIGNED CODE;
- █
- STATIC CHAR *ERRMSG[] = █
- /* 0 */ "╒╬╦╬╧╫╬ ┼╥╥╧╥!!!",
- /* 1 */ "╔NTERNAL ERROR",
- /* 2 */ "╔NVALID OPERATION CODE",
- /* 3 */ "┴,╪,┘ ARE RESERVED SYMBOLS",
- /* 4 */ "╙YMBOL TABLE OVERFLOW",
- /* 5 */ "─UPLICATE DEFINITION",
- /* 6 */ "╙YNC ERROR",
- /* 7 */ "┬RANCH OUT OF RANGE",
- /* 8 */ "═ISSING OPERAND",
- /* 9 */ "╔NVALID ADDRESSING MODE",
- /* 10 */ "═ISSING STRING TERMINATOR",
- /* 11 */ "╓ALUE ERROR",
- /* 12 */ "╒NDEFINED SYMBOL",
- /* 13 */ "╙YMBOL REQUIRED",
- /* 14 */ "═ULTIPLY DEFINED",
- /* 15 */ "╥ELOCATION ERROR",
- /* 16 */ "├OND ASSBLY NESTED TOO DEEPLY",
- /* 17 */ "╒NBALANCED PARENTHESES",
- /* 18 */ "─IVIDE BY ZERO",
- /* 19 */ "╚I/╠O OPERATOR MUST BE FIRST",
- /* 20 */ "╔NVALID OPERAND FIELD",
- /* 21 */ "╧UT OF MEMORY",
- /* 22 */ ".FI WITHOUT .IF",
- /* 23 */ "╠ABEL REQUIRED",
- /* 24 */ "╠ABEL NOT ALLOWED"
- ▌;
-
- PRINTF("%S\N",PRLNBUF);
- LISTED = 1;
-
- /* ╧UTPUT A POSITION MARKER */
-
- PRINTF ("%*S!\N", CPOS, "");
- IF (CODE<1 ▀▀ CODE>24) CODE = 0;
- PRINTF("%2D %S\N\N", CODE, ERRMSG[CODE]);
-
- ERRCNT++;
- ▌
-
- /*
- * WRAPUP() CLOSES THE SOURCE,
- * OUTPUTS REMAINING OBJECT DATA AND
- * CLOSES THE OBJECT FILE.
- */
-
- ╓╧╔─ WRAPUP()
- █
- FCLOSE(IPTR);
-
- IF (PASS == ╠┴╙╘ñ╨┴╙╙ && OFLAG && !ERRCNT) █
- PUTRECS(0); /* RELOCATION DATA */
- PUTRECS(1); /* EXTERNAL IDENTIFIERS */
- PUTRECS(2); /* EXTERNAL REFERENCES */
- PUTRECS(3); /* DATA BLOCKS */
- FCLOSE(OPTR);
- ▌
-
- RETURN;
- ▌
-
- /* SYMBOL TABLE PRINT
- */
-
- ╓╧╔─ STPRNT()
- █
- STATIC CHAR SYMTP[] = █
- /* ?????? */ '?',
- /* ╒╬─┼╞ */ '╒',
- /* ─┼╞┌╥╧ */ '┌',
- /* ═─┼╞ */ '═',
- /* ─┼╞┴┬╙ */ '┴',
- /* ─┼╞╥┼╠ */ '╥',
- /* ╪╥┼╞ */ '╪'
- ▌;
-
- CHAR I,J;
- STRUCT SYMTYPE *PTR, *NXTPTR;
-
- IF (SFLAG)
- PRINTF("\N╙┘═┬╧╠ ╘┴┬╠┼:\N");
- J = 1;
- FOR (I=0; I<╚╘╙╔┌┼; I++) █
- FOR (PTR = HASHñTBL[I]; PTR ; PTR=NXTPTR) █
- IF (SFLAG)
- █
- PRINTF("%-*S%04X %C", ╙┬╧╠╙┌,
- PTR->NAME,PTR->VALUE,
- SYMTP[PTR->FLAG]);
- IF (PTR->XDFLAG)
- PUTCHAR('─');
- ELSE
- PUTCHAR(' ');
- IF (J ^= 1)
- PUTCHAR('\N');
- ELSE PUTCHAR(' ');
- ▌
- NXTPTR = PTR->NEXT;
- FREE(PTR->NAME);
- FREE(PTR);
- ▌
- ▌
- IF (SFLAG && !J)
- PUTCHAR('\N');
- ▌
-
- ╞╔╠┼╘┘╨┼ OPENFILE(NAME,HOW)
- CHAR *NAME,HOW;
- █
- CHAR *XNAME;
- CHAR C;
- UNSIGNED DVC;
-
- XNAME = NAME; /* COPY POINTER */
- DVC = 8; /* DEFAULT IS DEVICE 8 */
- IF ((C=*XNAME) == '#') █
- XNAME++;
- IF (((C=*XNAME) == '8') ▀▀ ((C=*XNAME) == '9')) █
- XNAME++;
- DVC = (8 + (C - '8'));
- IF (*XNAME==':') XNAME++;
- ELSE █
- PRINTF("MISSING ':' IN DEVICE SPECIFICATION\N%S\N",XNAME);
- RETURN ╬╒╠╠;
- ▌
- ▌
- ELSE █
- PRINTF("ILLEGAL DEVICE NUMBER:\N%S\N",XNAME);
- RETURN ╬╒╠╠;
- ▌
- ▌
-
- DEVICE(DVC);
- RETURN (FOPEN(XNAME,HOW));
- ▌
-