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

  1. /*
  2.  * 6502 ┴SSEMBLER - ├ODE SEGMENT 1
  3.  * ╞ILENAME: ASSM1.C
  4.  *
  5.  */
  6.  
  7. #INCLUDE <STDIO.H>
  8. #INCLUDE <STRINGS.H>
  9. #INCLUDE "ASSM.D1"
  10. #INCLUDE "ASSM.D2"
  11.  
  12.  
  13. STATIC UNSIGNED INCLUDING;
  14.  
  15. STATIC ╞╔╠┼╘┘╨┼ SVIPTR; /* SAVED INPUT FILE POINTER */
  16. STATIC UNSIGNED SVLINE;
  17.  
  18. STATIC CHAR *PROGNAME; /* NAME OF THIS ASSEMBLER */
  19.  
  20. MAIN(ARGC, ARGV)
  21. UNSIGNED ARGC;
  22. CHAR *ARGV[];
  23.   CHAR C;
  24.   UNSIGNED CNT;
  25.   UNSIGNED I;
  26.  
  27.   PROGNAME = ARGV[0];
  28.   PRINTF("├/┴╙╙═ - VERSION 2.0 - 10/24/85\N");
  29.  
  30.   DFLAG = 0;
  31.   IFLAG = 0;
  32.   LFLAG = 0;
  33.   FFLAG = 1; /* DEFAULT FORMATTED LISTING */
  34.   CFLAG = 1; /* DEFAULT LIST EXCLUDED COND ASSEMBLY */
  35.   OFLAG = 1; /* DEFAULT = CREATE OBJECT */
  36.   SFLAG = 0;
  37.  
  38.   WHILE (--ARGC && (*++ARGV)[0] == '-')
  39.   █
  40.     FOR (I = 1; (C = TOLOWER((*ARGV)[I])) != '\0'; I++)
  41.     █
  42.       IF (C == 'D')     /* DEBUG FLAG */
  43.         DFLAG++;
  44.       ELSE IF (C == 'I')/* IGNORE .NLST FLAG */
  45.         IFLAG++;
  46.       ELSE IF (C == 'L')/* DISABLE LISTING FLAG */
  47.         LFLAG--;
  48.       ELSE IF (C == 'F')/* INHIBIT FORMATTING LISTING */
  49.         FFLAG = 0;
  50.       ELSE IF (C == 'C')/* NO LIST EXCLUDED CONDITIONAL ASSMBLY */
  51.         CFLAG = 0;
  52.       ELSE IF (C == 'O')/* OBJECT OUTPUT FLAG */
  53.         OFLAG = 0;
  54.       ELSE IF (C == 'S')/* LIST SYMBOL TABLE FLAG */
  55.         SFLAG = 1;
  56.       ELSE USAGE();
  57.     ▌
  58.   ▌
  59.  
  60.   IF (!ARGC) USAGE();
  61.  
  62.   WHILE ( ARGC )
  63.   █
  64.     PASS = ╞╔╥╙╘ñ╨┴╙╙;
  65.     FOR (I = 0; I < ╚╘╙╔┌┼; I++)
  66.       HASHñTBL[I] = ╬╒╠╠;
  67.     INITIALIZE( ARGC, ARGV );
  68.     WHILE (READLINE() != ┼╧╞)
  69.       ASSEMBLE();
  70.     WRAPUP();
  71.     PASS = ╠┴╙╘ñ╨┴╙╙;
  72.     IF (!ERRCNT)
  73.     █
  74.       IF (LFLAG == 0)
  75.         LFLAG++;
  76.       INITIALIZE ( ARGC, ARGV );
  77.       WHILE ( READLINE() != ┼╧╞ )
  78.       █
  79.         LISTED = 0;
  80.         ASSEMBLE();
  81.         IF (!LISTED)
  82.           PRINTLN();
  83.       ▌
  84.     ▌
  85.     WRAPUP();
  86.     STPRNT();
  87.     PRINTF( "┼ND OF ASSEMBLY, %D ERRORS\N", ERRCNT);
  88.     IF (DFLAG)
  89.     █
  90.       CNT = 0;
  91.       FOR (I = 0; I < ╚╘╙╔┌┼; I++)
  92.         IF (!HASHñTBL[I]) CNT++;
  93.       PRINTF( "%D UNUSED HASH TABLE POINTERS OUT OF %D\N",
  94.         CNT, ╚╘╙╔┌┼);
  95.     ▌
  96.     ARGC--;
  97.     ARGV++;
  98.   ▌
  99.  
  100. /* INITIALIZE THIS PASS */
  101.  
  102. ╓╧╔─ INITIALIZE (AC, AV)
  103. UNSIGNED  AC;
  104. CHAR      *AV[];
  105.   UNSIGNED LNG; 
  106.   CHAR *S,ONAME[30];
  107.  
  108.   S = *AV;
  109.   LNG = STRLEN(S); /* LOOK FOR '.A' SUFFIX */
  110.   IF (PASS == ╞╔╥╙╘ñ╨┴╙╙)
  111.     PRINTF("%S:\N", S);
  112.  
  113.   IF (LNG <= 2 ▀▀ STRCMP(&S[LNG-2],".A")) █
  114.     PRINTF("╬OT AN ASSEMBLER SOURCE (.A EXPECTED).\N");
  115.     QUIT();
  116.   ▌
  117.  
  118.   IPTR = FILEOPEN(S, "R");
  119.   STRNCPY ( FILENAME, S, LNG-2 );
  120.  
  121.   IF (PASS == ╠┴╙╘ñ╨┴╙╙ && OFLAG) █
  122. #IFDEF ╒╬╔╪
  123.     *ONAME = 0;
  124. #ELSE
  125.     STRCPY(ONAME,"@0:");
  126. #ENDIF
  127.     STRCAT(ONAME,FILENAME);
  128.     STRCAT(ONAME,".O");
  129.     OPTR = FILEOPEN(ONAME, "W");
  130.     PUTOC();    /* INITIALIZE OBJECT OUTPUT ROUTINES */
  131.   ▌
  132.  
  133.   INCLUDING = 0;
  134.   ERRCNT = 0;
  135.   LOCCNT = 0;
  136.   SLNUM = 0;
  137.   CASMFLG = 1;
  138.  
  139. ╞╔╠┼╘┘╨┼ FILEOPEN(FNAME,DIR)
  140. CHAR *FNAME, *DIR;
  141.   ╞╔╠┼╘┘╨┼ FD;
  142.   CHAR ERR;
  143.  
  144.   ERR = 0;
  145. #IFDEF ╒╬╔╪
  146.   IF ((FD = FOPEN(FNAME,DIR))==╬╒╠╠)
  147. #ELSE
  148.   IF ((FD = FOPEN(FNAME,DIR))==╬╒╠╠
  149.   ▀▀ (ERR = FERROR()))
  150. #ENDIF
  151.   █
  152.     PRINTF("├AN'T OPEN %S", FNAME);
  153.     IF (ERR) PRINTF(", ERROR = %D", ERR);
  154.     PUTCHAR('\N');
  155.     QUIT();
  156.   ▌
  157.   RETURN FD;
  158.  
  159. ╓╧╔─ USAGE()
  160.     PRINTF( "╒SAGE: %S [-CDFILOS] FILE.A [FILE.A ...]\N",PROGNAME);
  161.     QUIT();
  162.  
  163. CHAR FIELD[] =
  164.   ╙╞╔┼╠─,
  165.   ╙╞╔┼╠─ + ╙┬╧╠╙┌,
  166.   ╙╞╔┼╠─ + ╙┬╧╠╙┌ + 6,
  167.   ╙╞╔┼╠─ + ╙┬╧╠╙┌ + 15
  168. ▌;
  169.  
  170. /* READLINE READS AND FORMATS AN INPUT LINE, RETURNS
  171.  * -1 AT END OF FILE.
  172.  */
  173.  
  174. INT READLINE()
  175.   UNSIGNED I;       /* POINTER INTO PRLNBUF */
  176.   UNSIGNED J;       /* POINTER TO CURRENT FIELD START       */
  177.   CHAR CMNT;        /* COMMENT LINE FLAG    */
  178.   UNSIGNED SPCNT;   /* CONSECUTIVE SPACE COUNTER    */
  179.   CHAR STRING;      /* ┴╙├╔╔ STRING FLAG    */
  180.   UNSIGNED TEMP1;   /* TEMP USED FOR LINE NUMBER CONVERSION */
  181.  
  182.   DO █
  183.     CPOS = ╙╞╔┼╠─;
  184.     TEMP1 = ++SLNUM;
  185.     FOR (I = 0; I < ╠┴╙╘ñ├╚ñ╨╧╙; I++)
  186.       PRLNBUF[I] = ' ';
  187.     I = 3;
  188.     WHILE (TEMP1) █ /* PUT SOURCE LINE NUMBER INTO PRLNBUF */
  189.       PRLNBUF[I--] = TEMP1 % 10 + '0';
  190.       TEMP1 /= 10;
  191.     ▌
  192.     IF (INCLUDING) PRLNBUF[4] = '#';
  193.     I = ╙╞╔┼╠─;
  194.     CMNT = 0; SPCNT = 0; STRING = 0;
  195.     J = 1;
  196.     WHILE ((CH = GETC(IPTR)) != '\N') █
  197.       PRLNBUF[I++] = CH;
  198.       IF (CH == ┼╧╞) █
  199.         IF (INCLUDING) █
  200.           PRLNBUF[--I] = '\0'; /* ERASE ┼╧╞ CHARACTER */
  201.           FCLOSE(IPTR);
  202.           IPTR = SVIPTR; /* RESTORE PREVIOUS FILE */
  203.           SLNUM = SVLINE;
  204.           INCLUDING--;
  205.         ▌
  206.         ELSE RETURN(┼╧╞);
  207.       ▌
  208.       ELSE IF (FFLAG == 0)
  209.         ;
  210.       ELSE IF ((CH == ' ') && (STRING == 0)) █
  211.         IF (SPCNT)
  212.           --I;
  213.         ELSE IF (CMNT == 0) █
  214.           ++SPCNT;
  215.           IF (I < FIELD[J])
  216.             I = FIELD[J];
  217.           IF (++J > 3) █
  218.             SPCNT = 0;
  219.             ++CMNT;
  220.           ▌
  221.         ▌
  222.       ▌
  223.  
  224.       ELSE IF ((CH == ';') && (STRING == 0)) █
  225.         SPCNT = 0;
  226.         IF (I == ╙╞╔┼╠─ + 1)
  227.           ++CMNT;
  228.         ELSE IF (PRLNBUF[I - 2] != '\'') █
  229.           ++CMNT;
  230.           PRLNBUF[I-1] = ' ';
  231.           IF (I < FIELD[3])
  232.             I = FIELD[3];
  233.           PRLNBUF[I++] = ';';
  234.         ▌
  235.       ▌
  236.       ELSE █
  237.         IF ((CH == '"') && (CMNT == 0))
  238.           STRING = STRING ^ 1;
  239.         SPCNT = 0;
  240.         IF (I >= ╠┴╙╘ñ├╚ñ╨╧╙ - 1)
  241.           --I;
  242.       ▌
  243.     ▌
  244.     PRLNBUF[I] = 0;
  245.     IF (PRLNBUF[╙╞╔┼╠─]=='#') INCLUDE();
  246.   ▌ WHILE (PRLNBUF[╙╞╔┼╠─]=='#');
  247.   RETURN(0);
  248.  
  249. /* 
  250. ** ╨ROCESS INCLUDE STATEMENT.
  251. **
  252. */
  253. ╓╧╔─ INCLUDE()
  254.   STATIC CHAR *ICLDSTR = "INCLUDE ";
  255.  
  256.   CHAR C,FLNM[30];
  257.   UNSIGNED I;
  258.  
  259.   IF (INCLUDING) █
  260.     PRINTF("╧NLY ONE INCLUDE LEVEL SUPPORTED!\N");
  261.     QUIT();
  262.   ▌
  263.   I=0;
  264.   WHILE (NEXTCH()!=' ' && CH==ICLDSTR[I]) I++;
  265.   IF (I!=7) █
  266. BAD:
  267.     PRINTF("%S\N",PRLNBUF);
  268.     PRINTF("┬AD INCLUDE SYNTAX\N");
  269.     QUIT();
  270.   ▌
  271.   SKIP();
  272.   IF ( !INDEX("\"<",(C=CH)) ) GOTO BAD;
  273.   IF (PASS == ╠┴╙╘ñ╨┴╙╙)
  274.     PRINTLN();
  275.   IF (C=='<') C='>'; 
  276.   I=0;
  277.   WHILE (NEXTCH()!=C && CH)
  278.     FLNM[I++]=CH;
  279.   FLNM[I]='\0';
  280.   SVLINE = SLNUM;
  281.   SLNUM = 0;
  282.   SVIPTR = IPTR;
  283.   INCLUDING++;
  284. #IFDEF ╒╬╔╪
  285.   IF ((IPTR=FILEOPEN(FLNM,"R")) == ╬╒╠╠)
  286. #ELSE
  287.   IF ((IPTR=OPENFILE(FLNM,"R")) == ╬╒╠╠ ▀▀ FERROR())
  288. #ENDIF
  289.   █
  290.     PRINTF("├AN'T OPEN INCLUDE: %S\N",FLNM);
  291.     QUIT();
  292.   ▌
  293.  
  294. /*
  295. ** 08/04/85 - ├ENTRALIZE ERROR STRINGS
  296. ** TO AVOID REDUNDANCY AND ELIMINATE
  297. ** 'PSEUDO-XREFS' IN OTHER OBJECTS.
  298. */
  299. ╓╧╔─ ERROR(CODE)
  300. UNSIGNED CODE;
  301. STATIC CHAR *ERRMSG[] = █
  302. /*  0 */ "╒╬╦╬╧╫╬ ┼╥╥╧╥!!!",
  303. /*  1 */ "╔NTERNAL ERROR",
  304. /*  2 */ "╔NVALID OPERATION CODE",
  305. /*  3 */ "┴,╪,┘ ARE RESERVED SYMBOLS",
  306. /*  4 */ "╙YMBOL TABLE OVERFLOW",
  307. /*  5 */ "─UPLICATE DEFINITION",
  308. /*  6 */ "╙YNC ERROR",
  309. /*  7 */ "┬RANCH OUT OF RANGE",
  310. /*  8 */ "═ISSING OPERAND",
  311. /*  9 */ "╔NVALID ADDRESSING MODE",
  312. /* 10 */ "═ISSING STRING TERMINATOR",
  313. /* 11 */ "╓ALUE ERROR",
  314. /* 12 */ "╒NDEFINED SYMBOL",
  315. /* 13 */ "╙YMBOL REQUIRED",
  316. /* 14 */ "═ULTIPLY DEFINED",
  317. /* 15 */ "╥ELOCATION ERROR",
  318. /* 16 */ "├OND ASSBLY NESTED TOO DEEPLY",
  319. /* 17 */ "╒NBALANCED PARENTHESES",
  320. /* 18 */ "─IVIDE BY ZERO",
  321. /* 19 */ "╚I/╠O OPERATOR MUST BE FIRST",
  322. /* 20 */ "╔NVALID OPERAND FIELD",
  323. /* 21 */ "╧UT OF MEMORY",
  324. /* 22 */ ".FI WITHOUT .IF",
  325. /* 23 */ "╠ABEL REQUIRED",
  326. /* 24 */ "╠ABEL NOT ALLOWED"
  327. ▌;
  328.  
  329.   PRINTF("%S\N",PRLNBUF);
  330.   LISTED = 1;
  331.  
  332. /* ╧UTPUT A POSITION MARKER */
  333.  
  334.   PRINTF ("%*S!\N", CPOS, "");
  335.   IF (CODE<1 ▀▀ CODE>24) CODE = 0;
  336.   PRINTF("%2D %S\N\N", CODE, ERRMSG[CODE]);
  337.  
  338.   ERRCNT++;
  339.  
  340. /*
  341.  * WRAPUP() CLOSES THE SOURCE,
  342.  * OUTPUTS REMAINING OBJECT DATA AND
  343.  * CLOSES THE OBJECT FILE.
  344.  */
  345.  
  346. ╓╧╔─ WRAPUP()
  347.   FCLOSE(IPTR);
  348.  
  349.   IF (PASS == ╠┴╙╘ñ╨┴╙╙ && OFLAG && !ERRCNT) █
  350.     PUTRECS(0); /* RELOCATION DATA */
  351.     PUTRECS(1); /* EXTERNAL IDENTIFIERS */
  352.     PUTRECS(2); /* EXTERNAL REFERENCES */
  353.     PUTRECS(3); /* DATA BLOCKS */
  354.     FCLOSE(OPTR);
  355.   ▌
  356.  
  357.   RETURN;
  358.  
  359. /* SYMBOL TABLE PRINT
  360.  */
  361.  
  362. ╓╧╔─ STPRNT()
  363.   STATIC CHAR SYMTP[] = █
  364.     /* ??????  */ '?',
  365.     /* ╒╬─┼╞   */ '╒',
  366.     /* ─┼╞┌╥╧  */ '┌',
  367.     /* ═─┼╞    */ '═',
  368.     /* ─┼╞┴┬╙  */ '┴',
  369.     /* ─┼╞╥┼╠  */ '╥',
  370.     /* ╪╥┼╞    */ '╪'
  371.   ▌;
  372.  
  373.   CHAR I,J;
  374.   STRUCT SYMTYPE *PTR, *NXTPTR;
  375.  
  376.   IF (SFLAG)
  377.     PRINTF("\N╙┘═┬╧╠ ╘┴┬╠┼:\N");
  378.   J = 1;
  379.   FOR (I=0; I<╚╘╙╔┌┼; I++) █
  380.     FOR (PTR = HASHñTBL[I]; PTR ; PTR=NXTPTR) █
  381.       IF (SFLAG)
  382.       █
  383.         PRINTF("%-*S%04X %C", ╙┬╧╠╙┌,
  384.         PTR->NAME,PTR->VALUE,
  385.         SYMTP[PTR->FLAG]);
  386.         IF (PTR->XDFLAG)
  387.           PUTCHAR('─');
  388.         ELSE
  389.           PUTCHAR(' ');
  390.         IF (J ^= 1)
  391.           PUTCHAR('\N');
  392.         ELSE PUTCHAR(' ');
  393.       ▌
  394.       NXTPTR = PTR->NEXT;
  395.       FREE(PTR->NAME);
  396.       FREE(PTR);
  397.     ▌
  398.   ▌
  399.   IF (SFLAG && !J)
  400.     PUTCHAR('\N');
  401.  
  402. ╞╔╠┼╘┘╨┼ OPENFILE(NAME,HOW)
  403. CHAR *NAME,HOW;
  404.   CHAR *XNAME;
  405.   CHAR C;
  406.   UNSIGNED DVC;
  407.  
  408.   XNAME = NAME; /* COPY POINTER */
  409.   DVC = 8;  /* DEFAULT IS DEVICE 8 */
  410.   IF ((C=*XNAME) == '#') █
  411.     XNAME++;
  412.     IF (((C=*XNAME) == '8') ▀▀ ((C=*XNAME) == '9')) █
  413.       XNAME++;
  414.       DVC = (8 + (C - '8'));
  415.       IF (*XNAME==':') XNAME++;
  416.       ELSE █
  417.         PRINTF("MISSING ':' IN DEVICE SPECIFICATION\N%S\N",XNAME);
  418.         RETURN ╬╒╠╠;
  419.         ▌
  420.       ▌
  421.     ELSE █
  422.       PRINTF("ILLEGAL DEVICE NUMBER:\N%S\N",XNAME);
  423.       RETURN ╬╒╠╠;
  424.       ▌
  425.     ▌
  426.  
  427.   DEVICE(DVC);
  428.   RETURN (FOPEN(XNAME,HOW));
  429.