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

  1. /* m05adr.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 "6805.h"
  16.  
  17. int
  18. addr(esp)
  19. register struct expr *esp;
  20. {
  21.     register c;
  22.     register struct area *espa;
  23.  
  24.     if ((c = getnb()) == '#') {
  25.         expr(esp, 0);
  26.         esp->e_mode = S_IMMED;
  27.     } else if (c == ',') {
  28.         if ((c = admode(ax)) != S_X)
  29.             aerr();
  30.         esp->e_mode = S_IX;
  31.         esp->e_flag = 0;
  32.         esp->e_addr = 0;
  33.         esp->e_base.e_ap = NULL;
  34.     } else if (c == '*') {
  35.         expr(esp, 0);
  36.         esp->e_mode = S_DIR;
  37.         espa = esp->e_base.e_ap;
  38.         if (esp->e_addr & ~0xFF)
  39.             aerr();
  40.         if (espa && espa != sdp->s_area)
  41.             rerr();
  42.         if (more()) {
  43.             comma();
  44.             if (admode(ax) == S_X)
  45.                 esp->e_mode = S_DIRX;
  46.         }
  47.     } else {
  48.         unget(c);
  49.         if (esp->e_mode = admode(ax)) {
  50.             ;
  51.         } else {
  52.             expr(esp, 0);
  53.             if (more()) {
  54.                 comma();
  55.                 espa = esp->e_base.e_ap;
  56.                 if (esp->e_flag ||
  57.                     esp->e_addr & ~0xFF ||
  58.                    (espa && espa != sdp->s_area)) {
  59.                     esp->e_mode = S_INDX;
  60.                 } else {
  61.                     esp->e_mode = S_DIRX;
  62.                 }
  63.                 if (admode(ax) != S_X)
  64.                     aerr();
  65.             } else {
  66.                 if ( !esp->e_base.e_ap &&
  67.                     !(esp->e_addr & ~0xFF)) {
  68.                     esp->e_mode = S_DIR;
  69.                 } else {
  70.                     esp->e_mode = S_EXT;
  71.                 }
  72.             }
  73.         }
  74.     }
  75.     return (esp->e_mode);
  76. }
  77.     
  78. /*
  79.  * Enter admode() to search a specific addressing mode table
  80.  * for a match. Return the addressing value on a match or
  81.  * zero for no match.
  82.  */
  83. int
  84. admode(sp)
  85. register struct adsym *sp;
  86. {
  87.     register char *ptr;
  88.     register int i;
  89.     unget(getnb());
  90.     i = 0;
  91.     while ( *(ptr = (char *) &sp[i].a_str) ) {
  92.         if (srch(ptr)) {
  93.             return(sp[i].a_val);
  94.         }
  95.         i++;
  96.     }
  97.     return(0);
  98. }
  99.  
  100. /*
  101.  *      srch --- does string match ?
  102.  */
  103. int
  104. srch(str)
  105. register char *str;
  106. {
  107.     register char *ptr;
  108.     ptr = ip;
  109.  
  110. #if    CASE_SENSITIVE
  111.     while (*ptr && *str) {
  112.         if(*ptr != *str)
  113.             break;
  114.         ptr++;
  115.         str++;
  116.     }
  117.     if (*ptr == *str) {
  118.         ip = ptr;
  119.         return(1);
  120.     }
  121. #else
  122.     while (*ptr && *str) {
  123.         if(ccase[*ptr] != ccase[*str])
  124.             break;
  125.         ptr++;
  126.         str++;
  127.     }
  128.     if (ccase[*ptr] == ccase[*str]) {
  129.         ip = ptr;
  130.         return(1);
  131.     }
  132. #endif
  133.  
  134.     if (!*str)
  135.         if (any(*ptr," \t\n,];")) {
  136.             ip = ptr;
  137.             return(1);
  138.         }
  139.     return(0);
  140. }
  141.  
  142. /*
  143.  *      any --- does str contain c?
  144.  */
  145. int
  146. any(c,str)
  147. char    c, *str;
  148. {
  149.     while (*str)
  150.         if(*str++ == c)
  151.             return(1);
  152.     return(0);
  153. }
  154.  
  155. struct adsym    ax[] = {    /* a or x registers */
  156.     "a",    S_A,
  157.     "x",    S_X,
  158.     "",    0x00
  159. };
  160.