/* m04adr.c */ /* * (C) Copyright 1989 * All Rights Reserved * * Alan R. Baldwin * 721 Berkeley St. * Kent, Ohio 44240 */ #include #include #include "asm.h" #include "6804.h" int addr(esp) register struct expr *esp; { register c; register struct area *espa; if ((c = getnb()) == '#') { expr(esp, 0); esp->e_mode = S_IMMED; } else if (c == ',') { if (!(esp->e_mode = admode(xy))) aerr(); esp->e_flag = 0; esp->e_addr = 0; esp->e_base.e_ap = NULL; } else { unget(c); expr(esp, 0); esp->e_mode = S_DIR; } if (esp->e_addr & ~0xFF) aerr(); return (esp->e_mode); } /* * Enter admode() to search a specific addressing mode table * for a match. Return the addressing value on a match or * zero for no match. */ int admode(sp) register struct adsym *sp; { register char *ptr; register int i; unget(getnb()); i = 0; while ( *(ptr = (char *) &sp[i].a_str) ) { if (srch(ptr)) { return(sp[i].a_val); } i++; } return(0); } /* * srch --- does string match ? */ int srch(str) register char *str; { register char *ptr; ptr = ip; #if CASE_SENSITIVE while (*ptr && *str) { if(*ptr != *str) break; ptr++; str++; } if (*ptr == *str) { ip = ptr; return(1); } #else while (*ptr && *str) { if(ccase[*ptr] != ccase[*str]) break; ptr++; str++; } if (ccase[*ptr] == ccase[*str]) { ip = ptr; return(1); } #endif if (!*str) if (any(*ptr," \t\n,];")) { ip = ptr; return(1); } return(0); } /* * any --- does str contain c? */ int any(c,str) char c, *str; { while (*str) if(*str++ == c) return(1); return(0); } struct adsym xy[] = { /* x or y registers */ "x", S_IX, "y", S_IY, "", 0x00 };