home *** CD-ROM | disk | FTP | other *** search
- /*
- * 6502 ┴SSEMBLER - ├ODE ╙EGMENT 3
- * ╞ILENAME: ASSM3.C
- *
- */
-
- #INCLUDE "STDIO.H"
- #INCLUDE "ASSM.D1"
- #INCLUDE "ASSM.D2"
-
- /* CLASS 1 MACHINE OPERATIONS PROCESSOR - 1 BYTE, NO OPERAND FIELD */
-
- ╓╧╔─ CLASS1()
- █
- IF (PASS == ╠┴╙╘ñ╨┴╙╙) █
- LOADLC(LOCCNT, 0);
- LOADV(OPVAL, 0);
- IF (OFLAG) PUT1(OPVAL);
- ▌
- LOCCNT++;
- ▌
-
-
- /* CLASS 2 MACHINE OPERATIONS PROCESSOR - 2 BYTE, RELATIVE ADDRESSING */
-
- ╓╧╔─ CLASS2()
- █
- LOADLC(LOCCNT, 0);
- LOADV(OPVAL, 0);
- SKIP();
- IF (PASS != ╠┴╙╘ñ╨┴╙╙ ▀▀ EVALUATE())
- █
- LOCCNT += 2;
- RETURN;
- ▌
-
- LOCCNT += 2;
- IF (!ISREL(EXPRTYP))
- █
- ERROR(15);
- RETURN;
- ▌
-
- IF ((INT)(VALUE -= LOCCNT) < -128 ▀▀ (INT) VALUE > 127)
- █
- ERROR(7);
- RETURN;
- ▌
- LOADV(VALUE, 1);
- IF (OFLAG) █
- EXPRTYP = ╬╒╠╠;
- PUT2(OPVAL,VALUE);
- ▌
- ▌
-
-
- /* CLASS 3 MACHINE OPERATIONS PROCESSOR - VARIOUS ADDRESSING MODES */
-
- ╓╧╔─ CLASS3()
- █
- UNSIGNED CODE,FLAG,I,ZTMASK;
- CHAR C;
-
- SKIP();
- LOADLC(LOCCNT, 0);
-
- SWITCH(CH) █
- CASE 0:
- CASE ';':
- ERROR(8);
- RETURN;
- CASE '┴':
- CASE 'A':
- IF ( (C = PRLNBUF[CPOS + 1])==' ' ▀▀ C==0 )
- █
- FLAG = ┴├├;
- BREAK;
- ▌
- DEFAULT:
- SWITCH(CH) █
- CASE '#': CASE '=':
- FLAG = ╔══1 ▀ ╔══2;
- NEXTCH();
- BREAK;
- CASE '(':
- FLAG = ╔╬─ ▀ ╔╬─╪ ▀ ╔╬─┘;
- NEXTCH();
- BREAK;
- DEFAULT:
- FLAG = ┴┬╙ ▀ ┌┼╥ ▀ ┌┼╥╪ ▀ ┴┬╙╪ ▀ ┴┬╙┘ ▀ ┴┬╙┘2 ▀ ┌┼╥┘;
- ▌
- IF (EVALUATE())
- █
- IF ((FLAG & ╔══1)
- ▀▀ (CH == ')' && PRLNBUF[CPOS+1] == ',' ))
- LOCCNT += 2;
- ELSE
- LOCCNT += 3;
- RETURN;
- ▌
- IF (UNDEF)
- ZTMASK = ┴┬╙ ▀ ┴┬╙╪ ▀ ┴┬╙┘ ▀ ┴┬╙┘2;
- ELSE IF (ZPREF) █
- FLAG &= (┴┬╙ ▀ ┴┬╙╪ ▀ ┴┬╙┘ ▀ ┴┬╙┘2 ▀ ╔╬─);
- ZTMASK = 0;
- ▌
- ELSE ZTMASK = ┌┼╥ ▀ ┌┼╥╪ ▀ ┌┼╥┘;
- CODE = 0;
- I = 0;
-
- WHILE (CH != ' ' && CH != ';' && CH != 0 && I++ < 4) █
- CODE *= 8;
- SWITCH(CH) █
- CASE ')': /* ) = 4 */
- ++CODE;
- CASE ',': /* , = 3 */
- ++CODE;
- CASE '╪': /* ╪ = 2 */
- CASE 'X':
- ++CODE;
- CASE '┘': /* ┘ = 1 */
- CASE 'Y':
- ++CODE;
- BREAK;
- DEFAULT:
- FLAG = 0;
-
- ▌
- NEXTCH();
- ▌
- SWITCH(CODE) █
- CASE 0: /* NO TERMINATION CHARACTERS */
- FLAG &= (┴┬╙ ▀ ┌┼╥ ▀ ╔══1 ▀ ╔══2);
- BREAK;
- CASE 4: /* TERMINATION = ) */
- FLAG &= ╔╬─;
- BREAK;
- CASE 25: /* TERMINATION = ,┘ */
- FLAG &= (┴┬╙┘ ▀ ┴┬╙┘2 ▀ ┌┼╥┘);
- BREAK;
- CASE 26: /* TERMINATION = ,╪ */
- FLAG &= (┴┬╙╪ ▀ ┌┼╥╪);
- BREAK;
- CASE 212: /* TERMINATION = ,╪) */
- FLAG &= ╔╬─╪;
- BREAK;
- CASE 281: /* TERMINATION = ),┘ */
- FLAG &= ╔╬─┘;
- BREAK;
- DEFAULT:
- FLAG = 0;
-
- ▌
- ▌
- IF ((OPFLG &= FLAG) == 0) █
- LOCCNT += 3;
- ERROR(9);
- RETURN;
- ▌
- IF ((OPFLG & ZTMASK) )
- OPFLG &= ZTMASK;
- SWITCH(OPFLG) █
- CASE ┴├├: /* SINGLE BYTE - CLASS 3 */
- LOADV(OPVAL + 8, 0);
- IF (PASS == ╠┴╙╘ñ╨┴╙╙)
- PUT1(OPVAL + 8);
- LOCCNT++;
- RETURN;
- CASE ┌┼╥╪: CASE ┌┼╥┘: /* DOUBLE BYTE - CLASS 3 */
- OPVAL += 4;
- CASE ╔╬─┘:
- OPVAL += 8;
- CASE ╔══2:
- OPVAL += 4;
- CASE ┌┼╥:
- OPVAL += 4;
- CASE ╔╬─╪: CASE ╔══1:
- LOADV(OPVAL, 0);
- LOADV(VALUE, 1);
- IF (PASS == ╠┴╙╘ñ╨┴╙╙)
- PUT2(OPVAL,VALUE);
- LOCCNT += 2;
- RETURN;
- CASE ╔╬─: /* TRIPLE BYTE - CLASS 3 */
- OPVAL += 16;
- CASE ┴┬╙╪:
- CASE ┴┬╙┘2:
- OPVAL += 4;
- CASE ┴┬╙┘:
- OPVAL += 12;
- CASE ┴┬╙:
- OPVAL += 12;
- LOADV(OPVAL, 0);
- LOADV(VALUE, 1);
- LOADV(VALUE >> 8, 2);
- IF (PASS == ╠┴╙╘ñ╨┴╙╙)
- PUT3(OPVAL,VALUE);
- LOCCNT += 3;
- RETURN;
- DEFAULT:
- ERROR(9);
- LOCCNT += 3;
- RETURN;
- ▌
- ▌
-
- /*
- PSEUDO OPERATIONS PROCESSOR */
-
- ╓╧╔─ PSEUDO()
- █
- UNSIGNED COUNT,TVALUE;
-
- SWITCH(OPVAL)
- █
- CASE 0: /* .BYTE PSEUDO */
- LABLDEF(LOCCNT,─┼╞╥┼╠);
- LOADLC(LOCCNT, 0);
- COUNT = 0;
- DO █
- SKIP();
- IF (CH == '"') █
- WHILE ((CH=NEXTCH()) != '"') █
- IF ((TVALUE=CH) == 0) █
- ERROR(10);
- RETURN;
- ▌
- IF (TVALUE == '\\') █
- IF ((TVALUE=NEXTCH())=='L')
- TVALUE = '\014'; /* FORM FEED */
-
- ELSE IF (TVALUE=='N')
- TVALUE = '\N';
- ▌
- LOCCNT++;
- IF (PASS == ╠┴╙╘ñ╨┴╙╙) █
- PUT1(TVALUE);
- LOADV(TVALUE, COUNT);
- IF (++COUNT >= 3) █
- PRINTLN();
- CLEARLN();
- COUNT = 0;
- LOADLC(LOCCNT, 0);
- ▌
- ▌
- ▌
- NEXTCH();
- ▌
- ELSE █
- EVALUATE();
- IF (VALUE > 0XFF) █
- ERROR(11);
- VALUE = 0;
- ▌
- LOCCNT++;
- IF (PASS == ╠┴╙╘ñ╨┴╙╙) █
- PUT1R(VALUE);
- LOADV(VALUE, COUNT);
- IF (++COUNT >= 3) █
- PRINTLN();
- CLEARLN();
- COUNT = 0;
- LOADLC(LOCCNT, 0);
- ▌
- ▌
- ▌
- ▌ WHILE (CH == ',');
- LISTED = (COUNT == 0);
- RETURN;
-
- CASE 1: /* = PSEUDO */
- IF (!LABLPTR)
- █
- ERROR(23);
- RETURN;
- ▌
- SKIP(); /* OPLOOK LEAVES '=' CURRENT */
- IF (EVALUATE())
- RETURN;
- IF ( !ISREL(EXPRTYP) && !ISABS(EXPRTYP) )
- ERROR(15);
- LABLDEF(VALUE,EXPRTYP);
- IF (PASS == ╠┴╙╘ñ╨┴╙╙)
- LOADLC(VALUE, 1);
- RETURN;
-
- CASE 2: /* .WORD PSEUDO */
- LABLDEF(LOCCNT,─┼╞╥┼╠);
- DO █
- LOADLC(LOCCNT, 0);
- SKIP();
- LISTED = EVALUATE();
- IF (PASS == ╠┴╙╘ñ╨┴╙╙) █
- LOADV(VALUE, 0);
- LOADV(VALUE>>8, 1);
- PUT2(VALUE,VALUE>>8);
- IF (!LISTED) PRINTLN();
- CLEARLN();
- ▌
- LOCCNT += 2;
- ▌ WHILE (CH == ',');
- LISTED = 1;
- RETURN;
-
- CASE 3: /* .DSEG PSEUDO */
- IF (!LABLPTR)
- █
- ERROR( 23 );
- RETURN;
- ▌
- IF (PASS == ╞╔╥╙╘ñ╨┴╙╙)
- █
- IF (LABLPTR->FLAG != ╒╬─┼╞)
- █
- ERROR(14); /* MULTIPLY DEFINED */
- RETURN;
- ▌
- LABLDEF ( 0, ╪╥┼╞ );
- ▌
- ELSE
- █
- IF ( EVALUATE() )
- RETURN;
- LOADLC ( VALUE, 1 );
- PUTDSEG ( VALUE );
- ▌
- RETURN;
-
- CASE 4: /* .LIST PSEUDO */
- CASE 5: /* .NLST PSEUDO */
- IF (LABLPTR)
- █
- ERROR(24);
- RETURN;
- ▌
- IF (LFLAG >= 0)
- LFLAG = (OPVAL==4? 1: IFLAG);
- RETURN;
-
- CASE 6: /* .DBYT PSEUDO */
- LABLDEF(LOCCNT,─┼╞╥┼╠);
- LOADLC(LOCCNT, 0);
- DO █
- SKIP();
- LISTED = EVALUATE();
- LOCCNT += 2;
- IF (PASS == ╠┴╙╘ñ╨┴╙╙) █
- LOADV(VALUE>>8, 0);
- LOADV(VALUE, 1);
- PUT1R(VALUE>>8);
- PUT1R(VALUE);
- IF (!LISTED) PRINTLN();
- LOADLC(LOCCNT, 0);
- ▌
- CLEARLN();
- ▌ WHILE (CH == ',');
- LISTED = 1;
- RETURN;
-
- CASE 7: /* .BSS */
- LABLDEF(LOCCNT,─┼╞╥┼╠);
- LOADLC(LOCCNT, 0);
- IF (EVALUATE())
- RETURN;
- IF (UNDEF) █
- ERROR(12);
- RETURN;
- ▌
- IF ( !ISABS ( EXPRTYP ) )
- █
- ERROR(15);
- RETURN;
- ▌
- IF ( VALUE & 0X8000 ) /* NEGATIVE? */
- █
- ERROR(11);
- RETURN;
- ▌
- LOADLC(VALUE, 1);
- IF (PASS == ╠┴╙╘ñ╨┴╙╙) █
- PUTN ( VALUE );
- ▌
- LOCCNT += VALUE;
- RETURN;
-
- CASE 8: /* .DEF */
- CASE 9: /* .REF */
- IF (LABLPTR)
- █
- ERROR(24);
- RETURN;
- ▌
- DO █
- SKIP();
- IF (!COLSYM()) █
- ERROR(13);
- RETURN;
- ▌
- LABLPTR = STLOOK(); /* DEFINE LABEL */
- IF (OPVAL==8)
- █
- IF (PASS == ╞╔╥╙╘ñ╨┴╙╙)
- LABLPTR->XDFLAG = 1;
- ▌
- ELSE
- █
- IF (LABLPTR->FLAG != ╒╬─┼╞ && LABLPTR->FLAG != ╪╥┼╞)
- ERROR(15);
- ELSE
- █
- LABLPTR->FLAG = ╪╥┼╞;
- LABLPTR->XDFLAG = 0;
- ▌
- ▌
- ▌ WHILE (CH == ',');
- RETURN;
- ▌
- ▌
-
- ╓╧╔─ CASSM()
- █
- UNSIGNED TVAL;
-
- IF (LABLPTR)
- ERROR(24);
- IF (OPVAL == 0) /* .FI */
- █
- IF (CASMFLG == 1)
- ERROR(22); /* .FI WITHOUT .IF */
- ELSE
- CASMFLG >>= 1;
- RETURN;
- ▌
- ELSE IF (OPVAL == 1) /* .ELSE */
- █
- CASMFLG = CASMFLG ^ 1;
- RETURN;
- ▌
- CASMFLG <<= 1;
- CASMFLG ▀= 1;
- IF (NOASM()) RETURN;
- IF (CAñOP(1)) RETURN;
- TVAL = VALUE;
- IF (CH != ',')
- █
- ERROR(8);
- RETURN;
- ▌
- NEXTCH();
- IF (CAñOP(2)) RETURN;
- CASMFLG &= 0XFFFE;
- IF (CASMFLG & 0X80)
- █
- ERROR(16);
- QUIT();
- ▌
- SWITCH (OPVAL)
- █
- CASE 2: /* .IFLT */
- CASMFLG ▀= (TVAL < VALUE);
- BREAK;
- CASE 3: /* .IFGT */
- CASMFLG ▀= (TVAL > VALUE);
- BREAK;
- CASE 4: /* .IFEQ */
- CASMFLG ▀= (TVAL == VALUE);
- BREAK;
- CASE 5: /* .IFGE */
- CASMFLG ▀= (TVAL >= VALUE);
- BREAK;
- CASE 6: /* .IFLE */
- CASMFLG ▀= (TVAL <= VALUE);
- BREAK;
- CASE 7: /* .IFNE */
- CASMFLG ▀= (TVAL != VALUE);
- BREAK;
- ▌
- ▌
-
- /* EVALUATE OPERAND #F FOR COND ASM */
-
- CHAR CAñOP( F )
- CHAR F;
- █
- IF (EVALUATE())
- RETURN 1;
- IF (UNDEF)
- █
- ERROR(12);
- RETURN 1;
- ▌
- LOADLC ( VALUE, F );
- RETURN 0;
- ▌
-
- /* DETERMINE WHETHER TO ASSEMBLE CODE
- DUE TO CONDITIONAL ASSEMBLY */
-
- CHAR NOASM()
- █
- RETURN !INDEX("\01\03\07\017\037\077\177", CASMFLG);
- ▌
-
- /* ├LEAR CONTENTS OF PRINT LINE BUFFER */
- ╓╧╔─ CLEARLN()
- █
- UNSIGNED I;
-
- FOR (I = 0; I < ╙╞╔┼╠─; I++) PRLNBUF[I] = ' ';
- PRLNBUF[I] = 0;
- ▌
-