|
|
1.1 root 1: head 1.2;
2: access ;
3: symbols ;
4: locks bin:1.2;
5: comment @ * @;
6:
7:
8: 1.2
9: date 91.02.06.20.42.57; author bin; state Exp;
10: branches ;
11: next 1.1;
12:
13: 1.1
14: date 91.02.06.20.42.47; author bin; state Exp;
15: branches ;
16: next ;
17:
18:
19: desc
20: @steve 2/6/91
21: Initial MWC RCS revision.
22: @
23:
24:
25: 1.2
26: log
27: @steve 2/6/91
28: Descriptive error messages.
29: @
30: text
31: @#include "asm.h"
32:
33: /*
34: * Address mode table.
35: * This table is indexed by the number
36: * that gets put in the r/m field,
37: * and holds a word containing a bit for
38: * each index register.
39: */
40:
41: int amodes[] = {
42: (1<<reg(BX)) + (1<<reg(SI)),
43: (1<<reg(BX)) + (1<<reg(DI)),
44: (1<<reg(BP)) + (1<<reg(SI)),
45: (1<<reg(BP)) + (1<<reg(DI)),
46: (1<<reg(SI)),
47: (1<<reg(DI)),
48: (1<<reg(BP)),
49: (1<<reg(BX))
50: };
51:
52: char segovr[] = {
53: 0x26,
54: 0x2E,
55: 0x36,
56: 0x3E
57: };
58:
59: /*
60: * Read an address.
61: * Return the addressing mode.
62: */
63: addr(esp)
64: register struct expr *esp;
65: {
66: register c;
67:
68: if ((c = getnb()) == '$') {
69: expr(esp, 0);
70: esp->e_mode = IM;
71: return (IM);
72: }
73: if (c == '(') {
74: addrx(esp);
75: esp->e_type = E_ACON;
76: esp->e_addr = 0;
77: return (esp->e_mode & MMASK);
78: }
79: unget(c);
80: expr(esp, 0);
81: if (esp->e_type == E_AREG) {
82: esp->e_mode = esp->e_addr;
83: if ((esp->e_mode & MMASK) == SEGR)
84: if ((c = getnb()) == ':') { /* segment override */
85: outab(segovr[reg(esp->e_addr)]);
86: addr(esp);
87: } else
88: unget(c);
89: return (esp->e_mode & MMASK);
90: }
91: if ((c = getnb()) == '(') {
92: addrx(esp);
93: if (esp->e_mode==IDX || esp->e_mode==ICL)
94: aerr("invalid index register");
95: return (esp->e_mode & MMASK);
96: }
97: unget(c);
98: esp->e_mode = DIR;
99: return (DIR);
100: }
101:
102: /*
103: * Read in index register field
104: * of an address. The leading `(' has already
105: * been read. Set the mode into the `e_mode'
106: * field of the expression structure.
107: */
108: addrx(esp)
109: struct expr *esp;
110: {
111: register struct sym *sp;
112: register c, i;
113: int mask, mode;
114: char id[NCPLN];
115:
116: mode = 0;
117: do {
118: getid(id, -1);
119: if ((sp=lookup(id, 0))==NULL || sp->s_type!=E_AREG)
120: aerr("index by non-register");
121: else {
122: mask = 01 << reg(sp->s_addr);
123: if ((mode&mask) != 0)
124: aerr("invalid index register");
125: mode |= mask;
126: }
127: } while ((c = getnb()) == ',');
128: if (c != ')')
129: qerr("missing ')'");
130: if (mode == (01<<reg(CL))) {
131: esp->e_mode = ICL;
132: return;
133: }
134: if (mode == (01<<reg(DX))) {
135: esp->e_mode = IDX;
136: return;
137: }
138: for (i=0; i<8; ++i) {
139: if (mode == amodes[i]) {
140: esp->e_mode = X | i;
141: return;
142: }
143: }
144: aerr("invalid index");
145: esp->e_mode = D;
146: }
147: @
148:
149:
150: 1.1
151: log
152: @Initial revision
153: @
154: text
155: @d64 1
156: a64 1
157: aerr();
158: d90 1
159: a90 1
160: aerr();
161: d94 1
162: a94 1
163: aerr();
164: d99 1
165: a99 1
166: qerr();
167: d114 1
168: a114 1
169: aerr();
170: @
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.