home *** CD-ROM | disk | FTP | other *** search
/ GEMini Atari / GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso / files / language / asxsrc / m01mch.c < prev    next >
Encoding:
C/C++ Source or Header  |  1989-08-25  |  3.9 KB  |  283 lines

  1. /* m01mch.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 "6801.h"
  16.  
  17. int    hd63;
  18.  
  19. struct    sdp    sdp[] = {
  20.     NULL
  21. };
  22.  
  23. /*
  24.  * Process a machine op.
  25.  */
  26. VOID
  27. machine(mp)
  28. struct mne *mp;
  29. {
  30.     register op, t1;
  31.     struct expr e1, e2;
  32.     struct area *espa;
  33.     char id[NCPS];
  34.     int v1, reg;
  35.  
  36.     reg = 0;
  37.     op = mp->m_valu;
  38.     switch (mp->m_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_HD63:
  58.         ++hd63;
  59.         break;
  60.  
  61.     case S_INH63:
  62.         if (!hd63) {
  63.             err('o');
  64.             break;
  65.         }
  66.  
  67.     case S_INH:
  68.         outab(op);
  69.         break;
  70.  
  71.     case S_TYP63:
  72.         if (!hd63) {
  73.             err('o');
  74.             break;
  75.         }
  76.         if (getnb() != '#')
  77.             aerr();
  78.         expr(&e2, 0);
  79.         comma();
  80.         t1 = addr(&e1);
  81.         if (t1 == S_DIR) {
  82.             outab(op|0x10);
  83.             outrb(&e2, 0);
  84.             outrb(&e1, 0);
  85.             break;
  86.         }
  87.         if (t1 == S_INDX) {
  88.             outab(op);
  89.             outrb(&e2, 0);
  90.             outrb(&e1, 0);
  91.             break;
  92.         }
  93.         aerr();
  94.         break;
  95.  
  96.     case S_PUL:
  97.         v1 = admode(abdx);
  98.         if (v1 == S_A) {
  99.             outab(op);
  100.             break;
  101.         }
  102.         if (v1 == S_B) {
  103.             outab(op+1);
  104.             break;
  105.         }
  106.         if (v1 == S_X) {
  107.             outab(op+6);
  108.             break;
  109.         }
  110.         aerr();
  111.         break;
  112.  
  113.     case S_BRA:
  114.         expr(&e1, 0);
  115.         v1 = e1.e_addr - dot->s_addr - 2;
  116.         if ((v1 < -128) || (v1 > 127))
  117.             aerr();
  118.         if (e1.e_base.e_ap != dot->s_area)
  119.             rerr();
  120.         outab(op);
  121.         outab(v1);
  122.         break;
  123.  
  124.     case S_TYP1:
  125.         t1 = addr(&e1);
  126.         if (t1 == S_A) {
  127.             outab(op|A);
  128.             break;
  129.         }
  130.         if (t1 == S_B) {
  131.             outab(op|B);
  132.             break;
  133.         }
  134.         if (t1 == S_D) {
  135.             if (op == 0x44) {
  136.                 outab(0x04);
  137.                 break;
  138.             }
  139.             if (op == 0x48) {
  140.                 outab(0x05);
  141.                 break;
  142.             }
  143.             aerr();
  144.             break;
  145.         }
  146.         if (t1 == S_INDX) {
  147.             outab(op|X);
  148.             outrb(&e1, 0);
  149.             break;
  150.         }
  151.         if (t1 == S_DIR || t1 == S_EXT) {
  152.             outab(op|0x30);
  153.             outrw(&e1, 0);
  154.             break;
  155.         }
  156.         aerr();
  157.         break;
  158.  
  159.     case S_TYP2:
  160.         if (!(reg = admode(abdx)))
  161.             aerr();
  162.  
  163.     case S_TYP3:
  164.         if (!reg) {
  165.             reg = op & 0x40;
  166.         } else if (reg == S_A) {
  167.             reg = 0x00;
  168.         } else if (reg == S_B) {
  169.             reg = 0x40;
  170.         } else if (reg == S_D) {
  171.             if (op == 0x80) {
  172.                 op = 0x83;
  173.             } else
  174.             if (op == 0x8B) {
  175.                 op = 0xC3;
  176.             } else {
  177.                 aerr();
  178.             }
  179.             reg = 0x00;
  180.         } else {
  181.             aerr();
  182.             reg = 0x00;
  183.         }
  184.         t1 = addr(&e1);
  185.         if (t1 == S_IMMED) {
  186.             if ((op|0x40) == 0xC7)
  187.                 aerr();
  188.             if (op == 0x83 || op == 0xC3) {
  189.                 outab(op|reg);
  190.                 outrw(&e1, 0);
  191.             } else {
  192.                 outab(op|reg);
  193.                 outrb(&e1, 0);
  194.             }
  195.             break;
  196.         }
  197.         if (t1 == S_DIR) {
  198.             outab(op|reg|0x10);
  199.             outrb(&e1, 0);
  200.             break;
  201.         }
  202.         if (t1 == S_INDX) {
  203.             outab(op|reg|0x20);
  204.             outrb(&e1, 0);
  205.             break;
  206.         }
  207.         if (t1 == S_EXT) {
  208.             outab(op|reg|0x30);
  209.             outrw(&e1, 0);
  210.             break;
  211.         }
  212.         aerr();
  213.         break;
  214.  
  215.     case S_TYP4:
  216.         t1 = addr(&e1);
  217.         if (t1 == S_IMMED) {
  218.             if (op&0x0D == 0x0D)
  219.                 aerr();
  220.             outab(op);
  221.             outrw(&e1, 0);
  222.             break;
  223.         }
  224.         if (t1 == S_DIR) {
  225.             outab(op|0x10);
  226.             outrb(&e1, 0);
  227.             break;
  228.         }
  229.         if (t1 == S_INDX) {
  230.             outab(op|0x20);
  231.             outrb(&e1, 0);
  232.             break;
  233.         }
  234.         if (t1 == S_EXT) {
  235.             outab(op|0x30);
  236.             outrw(&e1, 0);
  237.             break;
  238.         }
  239.         aerr();
  240.         break;
  241.  
  242.     case S_TYP5:
  243.         t1 = addr(&e1);
  244.         if (t1 == S_INDX) {
  245.             outab(op);
  246.             outrb(&e1, 0);
  247.             break;
  248.         }
  249.         if (t1 == S_DIR || t1 == S_EXT) {
  250.             outab(op|0x10);
  251.             outrw(&e1, 0);
  252.             break;
  253.         }
  254.         aerr();
  255.         break;
  256.  
  257.     default:
  258.         err('o');
  259.     }
  260. }
  261.  
  262.  
  263. /*
  264.  * The next character must be a
  265.  * comma.
  266.  */
  267. VOID
  268. comma()
  269. {
  270.     if (getnb() != ',')
  271.         qerr();
  272. }
  273.  
  274. /*
  275.  * Machine dependent initialization
  276.  */
  277. VOID
  278. minit()
  279. {
  280.     hd63 = 0;
  281.     sdp->s_area = dot->s_area;
  282. }
  283.