home *** CD-ROM | disk | FTP | other *** search
/ GEMini Atari / GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso / files / language / asxsrc / m11mch.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-06-10  |  5.1 KB  |  357 lines

  1. /* m11mch.c */
  2.  
  3. /*
  4.  * (C) Copyright 1989
  5.  * All Rights Reserved
  6.  *
  7.  * Alan R. Baldwin
  8.  * 721 Berkeley St.
  9.  * Kent, Ohio  44240
  10.  */
  11.  
  12. #include <stdio.h>
  13. #include <setjmp.h>
  14. #include "asm.h"
  15. #include "6811.h"
  16.  
  17. struct    sdp    sdp[] = {
  18.     NULL
  19. };
  20.  
  21. /*
  22.  * Process a machine op.
  23.  */
  24. VOID
  25. machine(mp)
  26. struct mne *mp; {
  27.  
  28.     register op, t1, t2;
  29.     struct expr e1, e2, e3;
  30.     struct area *espa;
  31.     char id[NCPS];
  32.     int reg, cpg, type, v1;
  33.  
  34.     reg = 0;
  35.     cpg = 0;
  36.     op = mp->m_valu;
  37.     type = mp->m_type;
  38.     switch (type) {
  39.  
  40.     case S_SDP:
  41.         espa = NULL;
  42.         if (more()) {
  43.             getid(id, -1);
  44.             espa = alookup(id);
  45.             if ( espa == NULL) {
  46.                 err('u');
  47.             }
  48.         }
  49.         if (espa) {
  50.             sdp->s_area = espa;
  51.         } else {
  52.             sdp->s_area = dot->s_area;
  53.         }
  54.         lmode = SLIST;
  55.         break;
  56.  
  57.     case S_INH2:
  58.         outab(PAGE2);
  59.  
  60.     case S_INH:
  61.         outab(op);
  62.         break;
  63.  
  64.     case S_PUL:
  65.         v1 = admode(abdxy);
  66.         if (v1 == S_A) {
  67.             outab(op);
  68.             break;
  69.         }
  70.         if (v1 == S_B) {
  71.             outab(op+1);
  72.             break;
  73.         }
  74.         if (v1 == S_X) {
  75.             outab(op+6);
  76.             break;
  77.         }
  78.         if (v1 == S_Y) {
  79.             outab(PAGE2);
  80.             outab(op+6);
  81.             break;
  82.         }
  83.         aerr();
  84.         break;
  85.  
  86.     case S_BRA:
  87.         expr(&e1, 0);
  88.         v1 = e1.e_addr - dot->s_addr - 2;
  89.         if ((v1 < -128) || (v1 > 127))
  90.             aerr();
  91.         if (e1.e_base.e_ap != dot->s_area)
  92.             rerr();
  93.         outab(op);
  94.         outab(v1);
  95.         break;
  96.  
  97.     case S_TYP1:
  98.         t1 = addr(&e1);
  99.         if (t1 == S_A) {
  100.             outab(op|A);
  101.             break;
  102.         }
  103.         if (t1 == S_B) {
  104.             outab(op|B);
  105.             break;
  106.         }
  107.         if (t1 == S_D) {
  108.             if (op == 0x44) {
  109.                 outab(0x04);
  110.                 break;
  111.             }
  112.             if (op == 0x48) {
  113.                 outab(0x05);
  114.                 break;
  115.             }
  116.             aerr();
  117.             break;
  118.         }
  119.         if (t1 == S_INDX || t1 == S_INDY) {
  120.             if (t1 == S_INDY)
  121.                 outab(PAGE2);
  122.             outab(op|X);
  123.             outrb(&e1, 0);
  124.             break;
  125.         }
  126.         if (t1 == S_DIR || t1 == S_EXT) {
  127.             outab(op|0x30);
  128.             outrw(&e1, 0);
  129.             break;
  130.         }
  131.         aerr();
  132.         break;
  133.  
  134.     case S_TYP2:
  135.         if (!(reg = admode(abdxy)))
  136.             aerr();
  137.  
  138.     case S_TYP3:
  139.         if (!reg) {
  140.             reg = op & 0x40;
  141.         } else
  142.         if (reg == S_A) {
  143.             reg = 0x00;
  144.         } else
  145.         if (reg == S_B) {
  146.             reg = 0x40;
  147.         } else
  148.         if (reg == S_D) {
  149.             if (op == 0x80) {
  150.                 op = 0x83;
  151.             } else
  152.             if (op == 0x8B) {
  153.                 op = 0xC3;
  154.             } else {
  155.                 aerr();
  156.             }
  157.             reg = 0x00;
  158.         } else {
  159.             aerr();
  160.             reg = 0x00;
  161.         }
  162.         t1 = addr(&e1);
  163.         if (t1 == S_IMMED) {
  164.             if ((op|0x40) == 0xC7)
  165.                 aerr();
  166.             if (op == 0x83 || op == 0xC3) {
  167.                 outab(op|reg);
  168.                 outrw(&e1, 0);
  169.             } else {
  170.                 outab(op|reg);
  171.                 outrb(&e1, 0);
  172.             }
  173.             break;
  174.         }
  175.         if (t1 == S_DIR) {
  176.             outab(op|reg|0x10);
  177.             outrb(&e1, 0);
  178.             break;
  179.         }
  180.         if (t1 == S_INDX || t1 == S_INDY) {
  181.             if (t1 == S_INDY)
  182.                 outab(PAGE2);
  183.             outab(op|reg|0x20);
  184.             outrb(&e1, 0);
  185.             break;
  186.         }
  187.         if (t1 == S_EXT) {
  188.             outab(op|reg|0x30);
  189.             outrw(&e1, 0);
  190.             break;
  191.         }
  192.         aerr();
  193.         break;
  194.  
  195.     case S_TYP4:
  196.         t1 = addr(&e1);
  197.         if (t1 == S_IMMED) {
  198.             if (op&0x0D == 0x0D)
  199.                 aerr();
  200.             outab(op);
  201.             outrw(&e1, 0);
  202.             break;
  203.         }
  204.         if (t1 == S_DIR) {
  205.             outab(op|0x10);
  206.             outrb(&e1, 0);
  207.             break;
  208.         }
  209.         if (t1 == S_INDX || t1 == S_INDY) {
  210.             if (t1 == S_INDY)
  211.                 outab(PAGE2);
  212.             outab(op|0x20);
  213.             outrb(&e1, 0);
  214.             break;
  215.         }
  216.         if (t1 == S_EXT) {
  217.             outab(op|0x30);
  218.             outrw(&e1, 0);
  219.             break;
  220.         }
  221.         aerr();
  222.         break;
  223.  
  224.     case S_TYP5:
  225.         t1 = addr(&e1);
  226.         if (t1 == S_INDX || t1 == S_INDY) {
  227.             if (t1 == S_INDY)
  228.                 outab(PAGE2);
  229.             outab(op);
  230.             outrb(&e1, 0);
  231.             break;
  232.         }
  233.         if (t1 == S_EXT) {
  234.             outab(op|0x10);
  235.             outrw(&e1, 0);
  236.             break;
  237.         }
  238.         aerr();
  239.         break;
  240.  
  241.     case S_PG3:
  242.         cpg += (PAGE3-PAGE2);
  243.  
  244.     case S_PG2:
  245.         cpg += PAGE2;
  246.  
  247.     case S_TYP6:
  248.         t1 = addr(&e1);
  249.         if (t1 == S_IMMED) {
  250.             if (op == 0xCF)
  251.                 aerr();
  252.             if (cpg)
  253.                 outab(cpg);
  254.             outab(op);
  255.             outrw(&e1, 0);
  256.             break;
  257.         }
  258.         if (t1 == S_DIR) {
  259.             if (cpg)
  260.                 outab(cpg);
  261.             outab(op|0x10);
  262.             outrb(&e1, 0);
  263.             break;
  264.         }
  265.         if (t1 == S_INDX) {
  266.             if (cpg)
  267.                 outab(PAGE3);
  268.             outab(op|0x20);
  269.             outrb(&e1, 0);
  270.             break;
  271.         }
  272.         if (t1 == S_INDY) {
  273.             if (cpg == PAGE2) {
  274.                 outab(PAGE2);
  275.             } else {
  276.                 outab(PAGE4);
  277.             }
  278.             outab(op|0x20);
  279.             outrb(&e1, 0);
  280.             break;
  281.         }
  282.         if (t1 == S_EXT) {
  283.             if (cpg)
  284.                 outab(cpg);
  285.             outab(op|0x30);
  286.             outrw(&e1, 0);
  287.             break;
  288.         }
  289.         aerr();
  290.         break;
  291.  
  292.     case S_BTB:
  293.     case S_STCLR:
  294.         v1 = 0;
  295.         t1 = addr(&e1);
  296.         if (t1 == S_DIR) {
  297.             ;
  298.         } else
  299.         if (t1 == S_INDX || t1 == S_INDY) {
  300.             if (type == S_BTB) {
  301.                 op += 0x0C;
  302.             } else {
  303.                 op += 0x08;
  304.             }
  305.         } else {
  306.             aerr();
  307.         }
  308.         comma();
  309.         t2 = addr(&e2);
  310.         if (t2 != S_IMMED)
  311.             aerr();
  312.         if (type == S_BTB) {
  313.             comma();
  314.             expr(&e3, 0);
  315.             v1 = e3.e_addr - dot->s_addr - 4;
  316.             if (t1 == S_INDY)
  317.                 --v1;
  318.             if ((v1 < -128) || (v1 > 127))
  319.                 aerr();
  320.             if (e3.e_base.e_ap != dot->s_area)
  321.                 rerr();
  322.         }
  323.         if (t1 == S_INDY)
  324.             outab(PAGE2);
  325.         outab(op);
  326.         outrb(&e1, 0);
  327.         outrb(&e2, 0);
  328.         if (type == S_BTB)
  329.             outab(v1);
  330.         break;
  331.  
  332.     default:
  333.         err('o');
  334.     }
  335. }
  336.  
  337.  
  338. /*
  339.  * The next character must be a
  340.  * comma.
  341.  */
  342. VOID
  343. comma()
  344. {
  345.     if (getnb() != ',')
  346.         qerr();
  347. }
  348.  
  349. /*
  350.  * Machine dependent initialization
  351.  */
  352. VOID
  353. minit()
  354. {
  355.     sdp->s_area = dot->s_area;
  356. }
  357.