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

  1. /*
  2.  * 6502 ┴SSEMBLER - ├ODE ╙EGMENT 3
  3.  * ╞ILENAME: ASSM3.C
  4.  *
  5.  */
  6.  
  7. #INCLUDE "STDIO.H"
  8. #INCLUDE "ASSM.D1"
  9. #INCLUDE "ASSM.D2"
  10.  
  11. /* CLASS 1 MACHINE OPERATIONS PROCESSOR - 1 BYTE, NO OPERAND FIELD */
  12.  
  13. ╓╧╔─ CLASS1()
  14.   IF (PASS == ╠┴╙╘ñ╨┴╙╙) █
  15.     LOADLC(LOCCNT, 0);
  16.     LOADV(OPVAL, 0);
  17.     IF (OFLAG) PUT1(OPVAL);
  18.   ▌
  19.   LOCCNT++;
  20.  
  21.  
  22. /* CLASS 2 MACHINE OPERATIONS PROCESSOR - 2 BYTE, RELATIVE ADDRESSING */
  23.  
  24. ╓╧╔─ CLASS2()
  25.   LOADLC(LOCCNT, 0);
  26.   LOADV(OPVAL, 0);
  27.   SKIP();
  28.   IF (PASS != ╠┴╙╘ñ╨┴╙╙ ▀▀ EVALUATE())
  29.   █
  30.     LOCCNT += 2;
  31.     RETURN;
  32.   ▌
  33.  
  34.   LOCCNT += 2;
  35.   IF (!ISREL(EXPRTYP))
  36.   █
  37.     ERROR(15);
  38.     RETURN;
  39.   ▌
  40.  
  41.   IF ((INT)(VALUE -= LOCCNT) < -128 ▀▀ (INT) VALUE > 127)
  42.   █
  43.     ERROR(7);
  44.     RETURN;
  45.   ▌
  46.   LOADV(VALUE, 1);
  47.   IF (OFLAG) █
  48.     EXPRTYP = ╬╒╠╠; 
  49.     PUT2(OPVAL,VALUE);
  50.   ▌
  51.  
  52.  
  53. /* CLASS 3 MACHINE OPERATIONS PROCESSOR - VARIOUS ADDRESSING MODES */
  54.  
  55. ╓╧╔─ CLASS3()
  56.   UNSIGNED CODE,FLAG,I,ZTMASK;
  57.   CHAR C;
  58.  
  59.   SKIP();
  60.   LOADLC(LOCCNT, 0);
  61.  
  62.   SWITCH(CH) █
  63.   CASE 0:
  64.   CASE ';':
  65.     ERROR(8);
  66.     RETURN;
  67.   CASE '┴':
  68.   CASE 'A':
  69.     IF ( (C = PRLNBUF[CPOS + 1])==' ' ▀▀ C==0 )
  70.     █
  71.       FLAG = ┴├├;
  72.       BREAK;
  73.     ▌
  74.   DEFAULT:
  75.     SWITCH(CH) █
  76.     CASE '#': CASE '=':
  77.       FLAG = ╔══1 ▀ ╔══2;
  78.       NEXTCH();
  79.       BREAK;
  80.     CASE '(':
  81.       FLAG = ╔╬─ ▀ ╔╬─╪ ▀ ╔╬─┘;
  82.       NEXTCH();
  83.       BREAK;
  84.     DEFAULT:
  85.       FLAG = ┴┬╙ ▀ ┌┼╥ ▀ ┌┼╥╪ ▀ ┴┬╙╪ ▀ ┴┬╙┘ ▀ ┴┬╙┘2 ▀ ┌┼╥┘;
  86.     ▌
  87.     IF (EVALUATE())
  88.     █
  89.       IF ((FLAG & ╔══1)
  90.       ▀▀ (CH == ')' && PRLNBUF[CPOS+1] == ',' ))
  91.         LOCCNT += 2;
  92.       ELSE
  93.         LOCCNT += 3;
  94.       RETURN;
  95.     ▌
  96.     IF (UNDEF)
  97.       ZTMASK = ┴┬╙ ▀ ┴┬╙╪ ▀ ┴┬╙┘ ▀ ┴┬╙┘2;
  98.     ELSE IF (ZPREF) █
  99.       FLAG &= (┴┬╙ ▀ ┴┬╙╪ ▀ ┴┬╙┘ ▀ ┴┬╙┘2 ▀ ╔╬─);
  100.       ZTMASK = 0;
  101.     ▌
  102.     ELSE ZTMASK = ┌┼╥ ▀ ┌┼╥╪ ▀ ┌┼╥┘;
  103.     CODE = 0;
  104.     I = 0;
  105.  
  106.     WHILE (CH != ' ' && CH != ';' && CH != 0 && I++ < 4) █
  107.       CODE *= 8;
  108.       SWITCH(CH) █
  109.       CASE ')':   /* ) = 4 */
  110.         ++CODE;
  111.       CASE ',':   /* , = 3 */
  112.         ++CODE;
  113.       CASE '╪':   /* ╪ = 2 */
  114.       CASE 'X':
  115.         ++CODE;
  116.       CASE '┘':   /* ┘ = 1 */
  117.       CASE 'Y':
  118.         ++CODE;
  119.         BREAK;
  120.       DEFAULT:
  121.         FLAG = 0;
  122.  
  123.       ▌
  124.       NEXTCH();
  125.     ▌
  126.     SWITCH(CODE) █
  127.     CASE 0:   /* NO TERMINATION CHARACTERS */
  128.       FLAG &= (┴┬╙ ▀ ┌┼╥ ▀ ╔══1 ▀ ╔══2);
  129.       BREAK;
  130.     CASE 4:   /* TERMINATION = ) */
  131.       FLAG &= ╔╬─;
  132.       BREAK;
  133.     CASE 25:    /* TERMINATION = ,┘ */
  134.       FLAG &= (┴┬╙┘ ▀ ┴┬╙┘2 ▀ ┌┼╥┘);
  135.       BREAK;
  136.     CASE 26:    /* TERMINATION = ,╪ */
  137.       FLAG &= (┴┬╙╪ ▀ ┌┼╥╪);
  138.       BREAK;
  139.     CASE 212:   /* TERMINATION = ,╪) */
  140.       FLAG &= ╔╬─╪;
  141.       BREAK;
  142.     CASE 281:   /* TERMINATION = ),┘ */
  143.       FLAG &= ╔╬─┘;
  144.       BREAK;
  145.     DEFAULT:
  146.       FLAG = 0;
  147.  
  148.     ▌
  149.   ▌
  150.   IF ((OPFLG &= FLAG) == 0) █
  151.     LOCCNT += 3;
  152.     ERROR(9);
  153.     RETURN;
  154.   ▌
  155.   IF ((OPFLG & ZTMASK) )
  156.     OPFLG &= ZTMASK;
  157.   SWITCH(OPFLG) █
  158.   CASE ┴├├:   /* SINGLE BYTE - CLASS 3 */
  159.     LOADV(OPVAL + 8, 0);
  160.     IF (PASS == ╠┴╙╘ñ╨┴╙╙)
  161.       PUT1(OPVAL + 8);
  162.     LOCCNT++;
  163.     RETURN;
  164.   CASE ┌┼╥╪: CASE ┌┼╥┘:   /* DOUBLE BYTE - CLASS 3 */
  165.     OPVAL += 4;
  166.   CASE ╔╬─┘:
  167.     OPVAL += 8;
  168.   CASE ╔══2:
  169.     OPVAL += 4;
  170.   CASE ┌┼╥:
  171.     OPVAL += 4;
  172.   CASE ╔╬─╪: CASE ╔══1:
  173.     LOADV(OPVAL, 0);
  174.     LOADV(VALUE, 1);
  175.     IF (PASS == ╠┴╙╘ñ╨┴╙╙)
  176.       PUT2(OPVAL,VALUE);
  177.     LOCCNT += 2;
  178.     RETURN;
  179.   CASE ╔╬─:   /* TRIPLE BYTE - CLASS 3 */
  180.     OPVAL += 16;
  181.   CASE ┴┬╙╪:
  182.   CASE ┴┬╙┘2:
  183.     OPVAL += 4;
  184.   CASE ┴┬╙┘:
  185.     OPVAL += 12;
  186.   CASE ┴┬╙:
  187.     OPVAL += 12;
  188.     LOADV(OPVAL, 0);
  189.     LOADV(VALUE, 1);
  190.     LOADV(VALUE >> 8, 2);
  191.     IF (PASS == ╠┴╙╘ñ╨┴╙╙)
  192.       PUT3(OPVAL,VALUE);
  193.     LOCCNT += 3;
  194.     RETURN;
  195.   DEFAULT:
  196.     ERROR(9);
  197.     LOCCNT += 3;
  198.     RETURN;
  199.   ▌
  200.  
  201. /* 
  202. PSEUDO OPERATIONS PROCESSOR */
  203.  
  204. ╓╧╔─ PSEUDO()
  205.   UNSIGNED COUNT,TVALUE;
  206.  
  207.   SWITCH(OPVAL)
  208.   █
  209.   CASE 0:       /* .BYTE PSEUDO */
  210.     LABLDEF(LOCCNT,─┼╞╥┼╠);
  211.     LOADLC(LOCCNT, 0);
  212.     COUNT = 0;
  213.     DO █
  214.       SKIP();
  215.       IF (CH == '"') █
  216.         WHILE ((CH=NEXTCH()) != '"') █        
  217.           IF ((TVALUE=CH) == 0) █
  218.             ERROR(10);
  219.             RETURN;
  220.           ▌
  221.           IF (TVALUE == '\\') █
  222.             IF ((TVALUE=NEXTCH())=='L')
  223.               TVALUE = '\014'; /* FORM FEED */
  224.  
  225.             ELSE IF (TVALUE=='N')
  226.               TVALUE = '\N';
  227.           ▌
  228.           LOCCNT++;
  229.           IF (PASS == ╠┴╙╘ñ╨┴╙╙) █
  230.             PUT1(TVALUE);
  231.             LOADV(TVALUE, COUNT);
  232.             IF (++COUNT >= 3) █
  233.               PRINTLN();
  234.               CLEARLN();
  235.               COUNT = 0;
  236.               LOADLC(LOCCNT, 0);
  237.             ▌
  238.           ▌
  239.         ▌
  240.         NEXTCH();
  241.       ▌
  242.       ELSE █
  243.         EVALUATE();
  244.         IF (VALUE > 0XFF) █
  245.           ERROR(11);
  246.           VALUE = 0;
  247.         ▌
  248.         LOCCNT++;
  249.         IF (PASS == ╠┴╙╘ñ╨┴╙╙) █
  250.           PUT1R(VALUE);
  251.           LOADV(VALUE, COUNT);
  252.           IF (++COUNT >= 3) █
  253.             PRINTLN();
  254.             CLEARLN();
  255.             COUNT = 0;
  256.             LOADLC(LOCCNT, 0);
  257.           ▌
  258.         ▌
  259.       ▌
  260.     ▌ WHILE (CH == ',');
  261.     LISTED = (COUNT == 0);
  262.     RETURN;
  263.  
  264.   CASE 1:       /* = PSEUDO */
  265.     IF (!LABLPTR)
  266.     █
  267.       ERROR(23);
  268.       RETURN;
  269.     ▌
  270.     SKIP();     /* OPLOOK LEAVES '=' CURRENT */
  271.     IF (EVALUATE())
  272.       RETURN;
  273.     IF ( !ISREL(EXPRTYP) && !ISABS(EXPRTYP) )
  274.       ERROR(15);
  275.     LABLDEF(VALUE,EXPRTYP);
  276.     IF (PASS == ╠┴╙╘ñ╨┴╙╙)
  277.       LOADLC(VALUE, 1);
  278.     RETURN;
  279.  
  280.   CASE 2:       /* .WORD PSEUDO */
  281.     LABLDEF(LOCCNT,─┼╞╥┼╠);
  282.     DO █
  283.       LOADLC(LOCCNT, 0);
  284.       SKIP();
  285.       LISTED = EVALUATE();
  286.       IF (PASS == ╠┴╙╘ñ╨┴╙╙) █
  287.         LOADV(VALUE, 0);
  288.         LOADV(VALUE>>8, 1);
  289.         PUT2(VALUE,VALUE>>8);
  290.         IF (!LISTED) PRINTLN();
  291.         CLEARLN();
  292.       ▌
  293.       LOCCNT += 2;
  294.     ▌ WHILE (CH == ',');
  295.     LISTED = 1;
  296.     RETURN;
  297.  
  298.   CASE 3:       /* .DSEG PSEUDO */
  299.     IF (!LABLPTR)
  300.     █
  301.       ERROR( 23 );
  302.       RETURN;
  303.     ▌
  304.     IF (PASS == ╞╔╥╙╘ñ╨┴╙╙)
  305.     █
  306.       IF (LABLPTR->FLAG != ╒╬─┼╞)
  307.       █
  308.         ERROR(14); /* MULTIPLY DEFINED */
  309.         RETURN;
  310.       ▌
  311.       LABLDEF ( 0, ╪╥┼╞ );
  312.     ▌
  313.     ELSE
  314.     █
  315.       IF ( EVALUATE() )
  316.         RETURN;
  317.       LOADLC ( VALUE, 1 );
  318.       PUTDSEG ( VALUE );
  319.     ▌
  320.     RETURN;
  321.  
  322.   CASE 4:       /* .LIST PSEUDO */
  323.   CASE 5:       /* .NLST PSEUDO */
  324.     IF (LABLPTR)
  325.     █
  326.       ERROR(24);
  327.       RETURN;
  328.     ▌
  329.     IF (LFLAG >= 0)
  330.       LFLAG = (OPVAL==4? 1: IFLAG);
  331.     RETURN;
  332.  
  333.   CASE 6:       /* .DBYT PSEUDO */
  334.     LABLDEF(LOCCNT,─┼╞╥┼╠);
  335.     LOADLC(LOCCNT, 0);
  336.     DO █
  337.       SKIP();
  338.       LISTED = EVALUATE();
  339.       LOCCNT += 2;
  340.       IF (PASS == ╠┴╙╘ñ╨┴╙╙) █
  341.         LOADV(VALUE>>8, 0);
  342.         LOADV(VALUE, 1);
  343.         PUT1R(VALUE>>8);
  344.         PUT1R(VALUE);
  345.         IF (!LISTED) PRINTLN();
  346.         LOADLC(LOCCNT, 0);
  347.       ▌
  348.       CLEARLN();
  349.     ▌ WHILE (CH == ',');
  350.     LISTED = 1;
  351.     RETURN;
  352.  
  353.   CASE 7:     /* .BSS */
  354.     LABLDEF(LOCCNT,─┼╞╥┼╠);
  355.     LOADLC(LOCCNT, 0);
  356.     IF (EVALUATE())
  357.       RETURN;
  358.     IF (UNDEF) █
  359.       ERROR(12);
  360.       RETURN;
  361.     ▌
  362.     IF ( !ISABS ( EXPRTYP ) )
  363.     █
  364.       ERROR(15);
  365.       RETURN;
  366.     ▌
  367.     IF ( VALUE & 0X8000 ) /* NEGATIVE? */
  368.     █
  369.       ERROR(11);
  370.       RETURN;
  371.     ▌
  372.     LOADLC(VALUE, 1);
  373.     IF (PASS == ╠┴╙╘ñ╨┴╙╙) █
  374.       PUTN ( VALUE );
  375.     ▌
  376.     LOCCNT += VALUE;
  377.     RETURN;
  378.  
  379.   CASE 8:     /* .DEF */
  380.   CASE 9:     /* .REF */
  381.     IF (LABLPTR)
  382.     █
  383.       ERROR(24);
  384.       RETURN;
  385.     ▌
  386.     DO █
  387.       SKIP();
  388.       IF (!COLSYM()) █
  389.         ERROR(13);
  390.         RETURN;
  391.       ▌
  392.       LABLPTR = STLOOK(); /* DEFINE LABEL */
  393.       IF (OPVAL==8)
  394.       █
  395.         IF (PASS == ╞╔╥╙╘ñ╨┴╙╙)
  396.           LABLPTR->XDFLAG = 1;
  397.       ▌
  398.       ELSE
  399.       █
  400.         IF (LABLPTR->FLAG != ╒╬─┼╞ && LABLPTR->FLAG != ╪╥┼╞)
  401.           ERROR(15);
  402.         ELSE
  403.         █
  404.           LABLPTR->FLAG = ╪╥┼╞;
  405.           LABLPTR->XDFLAG = 0;
  406.         ▌
  407.       ▌
  408.     ▌ WHILE (CH == ',');
  409.   RETURN;       
  410.   ▌
  411.  
  412. ╓╧╔─ CASSM()
  413.   UNSIGNED TVAL;
  414.  
  415.   IF (LABLPTR)
  416.     ERROR(24);
  417.   IF (OPVAL == 0) /* .FI */
  418.   █
  419.     IF (CASMFLG == 1)
  420.       ERROR(22); /* .FI WITHOUT .IF */
  421.     ELSE
  422.       CASMFLG >>= 1;
  423.     RETURN;
  424.   ▌
  425.   ELSE IF (OPVAL == 1) /* .ELSE */
  426.   █
  427.     CASMFLG = CASMFLG ^ 1;
  428.     RETURN;
  429.   ▌
  430.   CASMFLG <<= 1;
  431.   CASMFLG ▀= 1;
  432.   IF (NOASM()) RETURN;
  433.   IF (CAñOP(1)) RETURN;
  434.   TVAL = VALUE;
  435.   IF (CH != ',')
  436.   █
  437.     ERROR(8);
  438.     RETURN;
  439.   ▌
  440.   NEXTCH();
  441.   IF (CAñOP(2)) RETURN;
  442.   CASMFLG &= 0XFFFE;
  443.   IF (CASMFLG & 0X80)
  444.   █
  445.     ERROR(16);
  446.     QUIT();
  447.   ▌
  448.   SWITCH (OPVAL)
  449.   █
  450.   CASE 2: /* .IFLT */
  451.     CASMFLG ▀= (TVAL < VALUE);
  452.     BREAK;
  453.   CASE 3: /* .IFGT */
  454.     CASMFLG ▀= (TVAL > VALUE);
  455.     BREAK;
  456.   CASE 4: /* .IFEQ */
  457.     CASMFLG ▀= (TVAL == VALUE);
  458.     BREAK;
  459.   CASE 5: /* .IFGE */
  460.     CASMFLG ▀= (TVAL >= VALUE);
  461.     BREAK;
  462.   CASE 6: /* .IFLE */
  463.     CASMFLG ▀= (TVAL <= VALUE);
  464.     BREAK;
  465.   CASE 7: /* .IFNE */
  466.     CASMFLG ▀= (TVAL != VALUE);
  467.     BREAK;
  468.   ▌
  469.  
  470. /* EVALUATE OPERAND #F FOR COND ASM */
  471.  
  472. CHAR CAñOP( F )
  473. CHAR F;
  474.   IF (EVALUATE())
  475.     RETURN 1;
  476.   IF (UNDEF)
  477.   █
  478.     ERROR(12);
  479.     RETURN 1;
  480.   ▌
  481.   LOADLC ( VALUE, F );
  482.   RETURN 0;
  483.  
  484. /* DETERMINE WHETHER TO ASSEMBLE CODE
  485.    DUE TO CONDITIONAL ASSEMBLY */
  486.  
  487. CHAR NOASM()
  488.   RETURN !INDEX("\01\03\07\017\037\077\177", CASMFLG);
  489.  
  490. /* ├LEAR CONTENTS OF PRINT LINE BUFFER */
  491. ╓╧╔─ CLEARLN()
  492.   UNSIGNED I;
  493.  
  494.   FOR (I = 0; I < ╙╞╔┼╠─; I++) PRLNBUF[I] = ' ';
  495.   PRLNBUF[I] = 0;
  496.