|
|
1.1 root 1: /* a9 -- pdp-11 assembler pass 1 */
2: #include "as1.h"
3:
4: /* key to types
5: /*
6: /* T_UNDEF 0 undefined
7: /* T_ABS 1 absolute
8: /* T_TEXT 2 text
9: /* T_DATA 3 data
10: /* T_BSS 4 bss
11: /* T_FLOPD 5 flop freg,dst (movfo, = stcfd)
12: /* T_BRANCH 6 branch
13: /* T_JSR 7 jsr
14: /* T_RTS 010 rts
15: /* T_SYS 011 sys
16: /* T_MOVF 012 movf (=ldf,stf)
17: /* T_DOUBLE 013 double operand (mov)
18: /* T_FLOPF 014 flop fsrc,freg (addf)
19: /* T_SINGLE 015 single operand (clr)
20: /* T_BYTE 016 .byte
21: /* T_STRING 017 string (.ascii, "<")
22: /* T_EVEN 020 .even
23: /* T_IF 021 .if
24: /* T_ENDIF 022 .endif
25: /* T_GLOBL 023 .globl
26: /* T_REG 024 register
27: /* T__TEXT 025 .text
28: /* T__DATA 026 .data
29: /* T__BSS 027 .bss
30: /* T_MUL 030 mul,div, etc
31: /* T_SOB 031 sob
32: /* T_COMM 032 .comm
33: /* T_ESTTXT 033 estimated text
34: /* T_ESTDAT 034 estimated data
35: /* T_JBR 035 jbr
36: /* T_JXX 036 jeq, jne, etc
37: */
38:
39: struct symtab symtab[] = {
40:
41: {".", T_TEXT, 000000},
42: {"..", T_ABS, 000000},
43:
44: {"r0", T_REG, 000000},
45: {"r1", T_REG, 000001},
46: {"r2", T_REG, 000002},
47: {"r3", T_REG, 000003},
48: {"r4", T_REG, 000004},
49: {"r5", T_REG, 000005},
50: {"sp", T_REG, 000006},
51: {"pc", T_REG, 000007},
52:
53: #if eae!=0
54: {"csw", T_ABS, 0177570},
55: {"div", T_ABS, 0177300},
56: {"ac", T_ABS, 0177302},
57: {"mq", T_ABS, 0177304},
58: {"mul", T_ABS, 0177306},
59: {"sc", T_ABS, 0177310},
60: {"sr", T_ABS, 0177311},
61: {"nor", T_ABS, 0177312},
62: {"lsh", T_ABS, 0177314},
63: {"ash", T_ABS, 0177316},
64: #endif
65:
66: {"mov", T_DOUBLE, 0010000},
67: {"movb", T_DOUBLE, 0110000},
68: {"cmp", T_DOUBLE, 0020000},
69: {"cmpb", T_DOUBLE, 0120000},
70: {"bit", T_DOUBLE, 0030000},
71: {"bitb", T_DOUBLE, 0130000},
72: {"bic", T_DOUBLE, 0040000},
73: {"bicb", T_DOUBLE, 0140000},
74: {"bis", T_DOUBLE, 0050000},
75: {"bisb", T_DOUBLE, 0150000},
76: {"add", T_DOUBLE, 0060000},
77: {"sub", T_DOUBLE, 0160000},
78:
79: {"br", T_BRANCH, 0000400},
80: {"bne", T_BRANCH, 0001000},
81: {"beq", T_BRANCH, 0001400},
82: {"bge", T_BRANCH, 0002000},
83: {"blt", T_BRANCH, 0002400},
84: {"bgt", T_BRANCH, 0003000},
85: {"ble", T_BRANCH, 0003400},
86: {"bpl", T_BRANCH, 0100000},
87: {"bmi", T_BRANCH, 0100400},
88: {"bhi", T_BRANCH, 0101000},
89: {"blos", T_BRANCH, 0101400},
90: {"bvc", T_BRANCH, 0102000},
91: {"bvs", T_BRANCH, 0102400},
92: {"bhis", T_BRANCH, 0103000},
93: {"bec", T_BRANCH, 0103000},
94: {"bcc", T_BRANCH, 0103000},
95: {"blo", T_BRANCH, 0103400},
96: {"bcs", T_BRANCH, 0103400},
97: {"bes", T_BRANCH, 0103400},
98:
99: {"jbr", T_JBR, 0000400},
100: {"jne", T_JXX, 0001000},
101: {"jeq", T_JXX, 0001400},
102: {"jge", T_JXX, 0002000},
103: {"jlt", T_JXX, 0002400},
104: {"jgt", T_JXX, 0003000},
105: {"jle", T_JXX, 0003400},
106: {"jpl", T_JXX, 0100000},
107: {"jmi", T_JXX, 0100400},
108: {"jhi", T_JXX, 0101000},
109: {"jlos", T_JXX, 0101400},
110: {"jvc", T_JXX, 0102000},
111: {"jvs", T_JXX, 0102400},
112: {"jhis", T_JXX, 0103000},
113: {"jec", T_JXX, 0103000},
114: {"jcc", T_JXX, 0103000},
115: {"jlo", T_JXX, 0103400},
116: {"jcs", T_JXX, 0103400},
117: {"jes", T_JXX, 0103400},
118:
119: {"clr", T_SINGLE, 0005000},
120: {"clrb", T_SINGLE, 0105000},
121: {"com", T_SINGLE, 0005100},
122: {"comb", T_SINGLE, 0105100},
123: {"inc", T_SINGLE, 0005200},
124: {"incb", T_SINGLE, 0105200},
125: {"dec", T_SINGLE, 0005300},
126: {"decb", T_SINGLE, 0105300},
127: {"neg", T_SINGLE, 0005400},
128: {"negb", T_SINGLE, 0105400},
129: {"adc", T_SINGLE, 0005500},
130: {"adcb", T_SINGLE, 0105500},
131: {"sbc", T_SINGLE, 0005600},
132: {"sbcb", T_SINGLE, 0105600},
133: {"tst", T_SINGLE, 0005700},
134: {"tstb", T_SINGLE, 0105700},
135: {"ror", T_SINGLE, 0006000},
136: {"rorb", T_SINGLE, 0106000},
137: {"rol", T_SINGLE, 0006100},
138: {"rolb", T_SINGLE, 0106100},
139: {"asr", T_SINGLE, 0006200},
140: {"asrb", T_SINGLE, 0106200},
141: {"asl", T_SINGLE, 0006300},
142: {"aslb", T_SINGLE, 0106300},
143: {"jmp", T_SINGLE, 0000100},
144: {"swab", T_SINGLE, 0000300},
145:
146: {"jsr", T_JSR, 0004000},
147:
148: {"rts", T_RTS, 000200},
149:
150: {"sys", T_SYS, 0104400},
151:
152: {"clc", T_ABS, 0000241},
153: {"clv", T_ABS, 0000242},
154: {"clz", T_ABS, 0000244},
155: {"cln", T_ABS, 0000250},
156: {"sec", T_ABS, 0000261},
157: {"sev", T_ABS, 0000262},
158: {"sez", T_ABS, 0000264},
159: {"sen", T_ABS, 0000270},
160:
161: {"cfcc", T_ABS, 0170000},
162: {"setf", T_ABS, 0170001},
163: {"setd", T_ABS, 0170011},
164: {"seti", T_ABS, 0170002},
165: {"setl", T_ABS, 0170012},
166: {"clrf", T_SINGLE, 0170400},
167: {"negf", T_SINGLE, 0170700},
168: {"absf", T_SINGLE, 0170600},
169: {"tstf", T_SINGLE, 0170500},
170: {"movf", T_MOVF, 0172400},
171: {"movif", T_FLOPF, 0177000},
172: {"movfi", T_FLOPD, 0175400},
173: {"movof", T_FLOPF, 0177400},
174: {"movfo", T_FLOPD, 0176000},
175: {"addf", T_FLOPF, 0172000},
176: {"subf", T_FLOPF, 0173000},
177: {"mulf", T_FLOPF, 0171000},
178: {"divf", T_FLOPF, 0174400},
179: {"cmpf", T_FLOPF, 0173400},
180: {"modf", T_FLOPF, 0171400},
181: {"movie", T_FLOPF, 0176400},
182: {"movei", T_FLOPD, 0175000},
183: {"ldfps", T_SINGLE, 0170100},
184: {"stfps", T_SINGLE, 0170200},
185: {"fr0", T_REG, 000000},
186: {"fr1", T_REG, 000001},
187: {"fr2", T_REG, 000002},
188: {"fr3", T_REG, 000003},
189: {"fr4", T_REG, 000004},
190: {"fr5", T_REG, 000005},
191:
192: {"als", T_MUL, 072000},
193: {"alsc", T_MUL, 073000},
194: {"mpy", T_MUL, 070000},
195: #if (eae-1)!=0
196: {"mul", T_MUL, 070000},
197: {"div", T_MUL, 071000},
198: {"ash", T_MUL, 072000},
199: {"ashc", T_MUL, 073000},
200: #endif
201: {"dvd", T_MUL, 071000},
202: {"xor", T_JSR, 074000},
203: {"sxt", T_SINGLE, 006700},
204: {"mark", T_SYS, 006400},
205: {"sob", T_SOB, 077000},
206:
207: {".byte", T_BYTE, 000000},
208: {".even", T_EVEN, 000000},
209: {".if", T_IF, 000000},
210: {".endif", T_ENDIF, 000000},
211: {".globl", T_GLOBL, 000000},
212: {".text", T__TEXT, 000000},
213: {".data", T__DATA, 000000},
214: {".bss", T__BSS, 000000},
215: {".comm", T_COMM, 000000},
216: };
217:
218: short *dotrel = &symtab[0].sval.typ;
219: short *dot = &symtab[0].sval.val;
220:
221: setup()
222: {
223: register int i,h;
224: register char *cp;
225: register struct symtab *sp, **hp;
226:
227: for (sp=symtab; sp<&symtab[sizeof(symtab)/sizeof(*sp)]; sp++) {
228: h=0; cp= &sp->name[0];
229: for (i=NCPS; --i>=0; ) {
230: if (*cp==0) break;
231: h+= *cp++; h=((h&0377)<<8)|((h>>8)&0377);
232: }
233: hp=hshtab+(((long)(unsigned short)h)%HSHSIZ);
234: h= ((long)(unsigned short)h)/HSHSIZ;
235: for (;;) {
236: if ((hp-=h)<=hshtab) hp+=HSHSIZ;
237: if (*--hp==0) break;
238: }
239: *hp=sp;
240: }
241: symend=usymtab=(struct symtab *)sbrk(0);
242: }
243:
244:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.