4 * (C) Copyright 1989,1990
11 * Ported from 8085 to 8051 by John Hartman 30-Apr-1995
12 * Continued, 29-May-95
20 extern int admode (struct adsym *);
22 struct adsym reg51[] = { /* R0 thru R7 registers */
52 /* Classify argument as to address mode */
55 register struct expr *esp;
60 if ((c = getnb()) == '#') {
63 esp->e_mode = S_IMMED;
66 /* choices are @R0, @R1, @DPTR, @A+PC, @A+DPTR */
77 esp->e_mode = S_AT_DP;
84 esp->e_mode = S_AT_APC;
86 } else if (rd == DPTR) {
87 esp->e_mode = S_AT_ADP;
98 esp->e_base.e_ap = NULL;
101 /* Force direct page */
104 if (esp->e_addr & ~0xFF)
108 /* Force inverted bit */
110 esp->e_mode = S_NOT_BIT;
111 if (esp->e_addr & ~0xFF)
117 /* try for register: A, AB, R0-R7, DPTR, PC, Cy */
118 if ((esp->e_addr = admode(reg51)) != -1) {
119 switch (esp->e_addr) {
127 esp->e_mode = S_DPTR;
140 /* Must be an expression */
143 && (esp->e_base.e_ap==NULL)
144 && !(esp->e_addr & ~0xFF)) {
151 return (esp->e_mode);
156 * any --- does str contain c?
176 while (*ptr && *str) {
187 while (*ptr && *str) {
188 if(ccase[*ptr] != ccase[*str])
193 if (ccase[*ptr] == ccase[*str]) {
200 if (any(*ptr," \t\n,];")) {
208 * Enter admode() to search a specific addressing mode table
209 * for a match. Return the addressing value on a match or
214 register struct adsym *sp;
220 while ( *(ptr = (char *) &sp[i]) ) {
230 * srch --- does string match ?
234 * Read a register name. Return register value, -1 if no register found
239 register struct mne *mp;
243 if ((mp = mlookup(id))==NULL) {
247 switch (mp->m_type) {