mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-24 08:54:17 +00:00
416 lines
15 KiB
Plaintext
416 lines
15 KiB
Plaintext
1File: AS68.H Page 1
|
|
1 /*
|
|
2 Copyright 1981
|
|
3 Alcyon Corporation
|
|
4 8716 Production Ave.
|
|
5 San Diego, Ca. 92121
|
|
6 */
|
|
7 #include <stdio.h>
|
|
8 #include <klib.h>
|
|
9 #include "machine.h"
|
|
10 #include "ctype.h"
|
|
11
|
|
12 #ifdef PDP11
|
|
13 struct {
|
|
14 char lobyte;
|
|
15 char hibyte;
|
|
16 };
|
|
17 struct {
|
|
18 char *ptrw1;
|
|
19 char *ptrw2;
|
|
20 };
|
|
21 struct {
|
|
22 int wd1;
|
|
23 int wd2;
|
|
24 };
|
|
25 struct {
|
|
26 int swd1;
|
|
27 };
|
|
28 #endif
|
|
29
|
|
30 #ifdef MC68000
|
|
31 struct {
|
|
32 char hibyte;
|
|
33 char lobyte;
|
|
34 };
|
|
35 struct {
|
|
36 char *ptrw2;
|
|
37 };
|
|
38 struct {
|
|
39 int wd1;
|
|
40 int wd2;
|
|
41 };
|
|
42 struct {
|
|
43 int swd1;
|
|
44 };
|
|
45 #endif
|
|
46
|
|
47 #ifdef VAX
|
|
48 struct {
|
|
49 short wd2;
|
|
50 short wd1;
|
|
51 };
|
|
52 struct {
|
|
53 short swd1;
|
|
54 };
|
|
55
|
|
56 struct {
|
|
57 char lobyte;
|
|
58 char hibyte;
|
|
59 };
|
|
1File: AS68.H Page 2
|
|
60 struct {
|
|
61 char *ptrw2;
|
|
62 };
|
|
63 #endif
|
|
64
|
|
65 /* format of a symbol entry in the main table*/
|
|
66
|
|
67 # define NAMELEN 8 /*length of name in symbol table*/
|
|
68 struct symtab {
|
|
69 char name[NAMELEN]; /*symbol name*/
|
|
70 short flags; /*bit flags*/
|
|
71 char *tlnk; /*table link*/
|
|
72 long vl1; /*symbol value*/
|
|
73 };
|
|
74
|
|
75 struct symtab *symtptr;
|
|
76 # define STESIZE (sizeof *symtptr) /*byte length of symbol table entry*/
|
|
77
|
|
78 /* flags for symbols*/
|
|
79 # define SYDF 0100000 /*defined*/
|
|
80 # define SYEQ 0040000 /*equated*/
|
|
81 # define SYGL 0020000 /*global - entry or external*/
|
|
82 # define SYER 0010000 /*equated register*/
|
|
83 # define SYXR 0004000 /*external reference*/
|
|
84 # define SYRA 0002000 /*DATA based relocatable*/
|
|
85 # define SYRO 0001000 /*TEXT based relocatable*/
|
|
86 # define SYBS 0000400 /*BSS based relocatable*/
|
|
87 # define SYIN 0000200 /*internal symbol -- opcode, directive or equ*/
|
|
88 # define SYPC 0000100 /*[vlh]equated using star '*' expression*/
|
|
89 # define SYRM 0000040 /*[vlh]register mask equate*/
|
|
90
|
|
91 /*flags for opcodes and directives*/
|
|
92 # define OPDR 0100000 /*0=>opcode, 1=>directive*/
|
|
93 # define OPFF 037 /*type of instruction (used as mask)*/
|
|
94
|
|
95 struct irts {
|
|
96 char *irle; /*ptr to last entry in chain*/
|
|
97 char *irfe; /*ptr to first entry in chain*/
|
|
98 };
|
|
99
|
|
100 long stlen; /*length of symbol table*/
|
|
101
|
|
102 /*
|
|
103 * intermediate text file
|
|
104 * format of the intermediate text for one statement:
|
|
105 *
|
|
106 * ******************************************************
|
|
107 * * it type = ITBS * # it entries * 0
|
|
108 * ******************************************************
|
|
109 * * absolute line number (long) *
|
|
110 * ******************************************************
|
|
111 * * it type = ITSY * instr length * 1
|
|
112 * ******************************************************
|
|
113 * * symbol table pointer for stmt label (long) *
|
|
114 * ******************************************************
|
|
115 * * it type = ITSY * instr mode length * 2
|
|
116 * ******************************************************
|
|
117 * * opcode ptr (long) *
|
|
118 * ******************************************************
|
|
1File: AS68.H Page 3
|
|
119 * * it type = ITCN * relocation base * 3
|
|
120 * ******************************************************
|
|
121 * * location counter (pass 1) *
|
|
122 * ******************************************************
|
|
123 * * it type * relocation flag * 4 - oprnds
|
|
124 * ******************************************************
|
|
125 * * value (long) *
|
|
126 * ******************************************************
|
|
127 * .
|
|
128 *
|
|
129 * .
|
|
130 * ******************************************************
|
|
131 * * it type * relocation flag * n - oprnds
|
|
132 * ******************************************************
|
|
133 * * value (long) *
|
|
134 * ******************************************************
|
|
135 */
|
|
136
|
|
137 #define ITOP1 4 /*first it entry for operands*/
|
|
138
|
|
139 /*
|
|
140 * it type meaning
|
|
141 * 0 beginning of statement
|
|
142 * 1 value is pointer to symbol table
|
|
143 * 2 value is a constant
|
|
144 * 3 value is a specal char
|
|
145 *
|
|
146 * relocation flag for opcode it entry is operand length:
|
|
147 * 'b' => byte
|
|
148 * 'w' => word
|
|
149 * 'l' => long
|
|
150 */
|
|
151
|
|
152 struct it {
|
|
153 char itty; /*it type*/
|
|
154 char itrl; /*relocation flag or # it entries*/
|
|
155 long itop;
|
|
156 };
|
|
157
|
|
158 int mode; /*operand mode (byte, word, long)*/
|
|
159 int modelen; /*operand length per mode*/
|
|
160 #define BYTE 'b'
|
|
161 #define WORD 'w'
|
|
162 #define LONG 'l'
|
|
163
|
|
164 /* parameters that define the main table*/
|
|
165 #define SZMT 300 /*initial size of the main table */
|
|
166 /*must be large enough to initialize*/
|
|
167 #ifdef PDP11
|
|
168 #define ICRSZMT 10 /*add to main table when run out*/
|
|
169 #else
|
|
170 #define ICRSZMT 50 /*add to main table when run out*/
|
|
171 #endif
|
|
172 int cszmt; /*current size of main table*/
|
|
173 char *bmte; /*beginning of main table*/
|
|
174 char *emte; /*end of main table*/
|
|
175
|
|
176 /* intermediate text types*/
|
|
177 #define ITBS 0 /*beginning of statement*/
|
|
1File: AS68.H Page 4
|
|
178 #define ITSY 1 /*pointer to symbol table*/
|
|
179 #define ITCN 2 /*constant*/
|
|
180 #define ITSP 3 /*special*/
|
|
181 #define ITRM 4 /*[vlh]register mask!*/
|
|
182 #define ITPC 5 /*[vlh]pc relative argument*/
|
|
183
|
|
184 # define ITBSZ 256 /*size of the it buffer*/
|
|
185 short itbuf[ITBSZ]; /*it buffer*/
|
|
186
|
|
187 #define STMAX 200 /*size of intermediate text buffer*/
|
|
188 struct it stbuf[STMAX]; /*holds it for one statement*/
|
|
189
|
|
190 char sbuf[512]; /*holds one block of source*/
|
|
191
|
|
192 /*initial reference table for symbols*/
|
|
193 # define SZIRT 128
|
|
194 char *sirt[SZIRT];
|
|
195
|
|
196 /*initial reference table to opcodes*/
|
|
197 char *oirt[SZIRT];
|
|
198
|
|
199 /*external symbol table*/
|
|
200 #define EXTSZ 512
|
|
201 char *extbl[EXTSZ];
|
|
202 int extindx; /*index to external symbol table*/
|
|
203 char **pexti; /*ptr to external symbol table*/
|
|
204
|
|
205 int absln; /*absolute line number*/
|
|
206 int p2absln; /*pass 2 line number*/
|
|
207 int fcflg; /*0=>passed an item. 1=>first char*/
|
|
208 int fchr; /*first char in term*/
|
|
209 int ifn; /*source file descriptor*/
|
|
210 short *pitix; /*ptr to it buffer*/
|
|
211 int itwc; /*number of words in it buffer*/
|
|
212 struct it *pitw; /*ptr to it buffer next entry*/
|
|
213 int itype; /*type of item*/
|
|
214 long ival; /*value of item*/
|
|
215 char *lblpt; /*label pointer*/
|
|
216 char lbt[NAMELEN]; /*holds label name*/
|
|
217 char *lmte; /*last entry in main table*/
|
|
218 long loctr; /*location counter*/
|
|
219 long savelc[4]; /*save relocation counters for 3 bases*/
|
|
220 int nite; /*number of entries in stbuf*/
|
|
221 struct it *pnite;
|
|
222 int lfn; /*loader output file descriptor*/
|
|
223 char *opcpt; /*pointer to opcode entry in main table*/
|
|
224 int p2flg; /*0=>pass 1 1=>pass 2*/
|
|
225 char **pirt; /*entry in initial reference table*/
|
|
226 int reloc; /*relocation value returned by expression evaluator (expr)*/
|
|
227 int rlflg; /*relocation value of current location counter*/
|
|
228 /*relocation values*/
|
|
229 # define ABS 0 /*absolute*/
|
|
230 # define DATA 1
|
|
231 # define TEXT 2
|
|
232 # define BSS 3
|
|
233 # define EXTRN 4 /*externally defined*/
|
|
234
|
|
235 #define EOLC '\n' /*end of line character*/
|
|
236 #define EOF 0 /*end of file indicator*/
|
|
1File: AS68.H Page 5
|
|
237 #define NULL 0 /* [vlh] character null '\0' */
|
|
238 #define TRUE 1 /* [vlh] boolean values */
|
|
239 #define FALSE 0 /* [vlh] boolean values */
|
|
240
|
|
241 int format;
|
|
242 int sbuflen; /*number of chars in sbuf*/
|
|
243 char *psbuf; /*ptr into sbuf*/
|
|
244 int itfn; /*it file number*/
|
|
245 char itfnc; /*last char of it file name*/
|
|
246 int trbfn; /*temp for text relocation bits*/
|
|
247 char trbfnc; /*last char of text rb file*/
|
|
248 int dafn; /*file for data stuff*/
|
|
249 char dafnc; /*last char of data file*/
|
|
250 int drbfn; /*file for data relocation bits*/
|
|
251 char drbfnc; /*last char*/
|
|
252 int prtflg; /*print output flag*/
|
|
253 int undflg; /*make undefined symbols external flag*/
|
|
254
|
|
255 int starmul; /* * is multiply operator*/
|
|
256
|
|
257 char *endptr, *addptr;
|
|
258 char *orgptr;
|
|
259 char *subptr, *addiptr, *addqptr, *subiptr, *subqptr;
|
|
260 char *cmpptr, *addaptr, *cmpaptr, *subaptr, *cmpmptr;
|
|
261 char *equptr;
|
|
262 char *andptr, *andiptr, *eorptr, *eoriptr, *orptr, *oriptr;
|
|
263 char *cmpiptr;
|
|
264 char *moveptr, *moveqptr;
|
|
265 char *exgptr;
|
|
266 char *evenptr;
|
|
267 char *jsrptr, *bsrptr, *nopptr;
|
|
268 char peekc;
|
|
269 int numcon[2], numsym[2], indir[2], immed[2], numreg[2];
|
|
270 int plevel; /*parenthesis level counter*/
|
|
271 int opdix; /*operand index counter*/
|
|
272 int p1inlen; /*pass 1 instr length*/
|
|
273 int instrlen; /*pass 2 bytes in current instruction*/
|
|
274
|
|
275 /* effective address mode bits*/
|
|
276 #define DDIR 000
|
|
277 #define ADIR 010
|
|
278 #define INDIRECT 020
|
|
279 #define INDINC 030
|
|
280 #define DECIND 040
|
|
281 #define INDDISP 050
|
|
282 #define INDINX 060
|
|
283 #define SADDR 070
|
|
284 #define LADDR 071
|
|
285 #define IMM 074
|
|
286
|
|
287 #define AREGLO 8
|
|
288 #define AREGHI 15
|
|
289
|
|
290 /* relocation bit definitions:*/
|
|
291 #define RBMASK 07 /*tells type of relocation*/
|
|
292 #define INSABS 7 /*first word of instr -- absolute*/
|
|
293 #define DABS 0 /*data word absolute*/
|
|
294 #define TRELOC 2 /* TEXT relocatable*/
|
|
295 #define DRELOC 1 /* DATA relocatable*/
|
|
1File: AS68.H Page 6
|
|
296 #define BRELOC 3 /* BSS relocatable*/
|
|
297 #define EXTVAR 4 /* ref to external variable*/
|
|
298 #define LUPPER 5 /* upper word of long*/
|
|
299 #define EXTREL 6 /* external relative mode*/
|
|
300
|
|
301 /* ptrs to ins[] and rlbits[]*/
|
|
302 int *pins;
|
|
303 int *prlb;
|
|
304 int ins[5]; /*holds instruction words*/
|
|
305
|
|
306 #define PRTCHLEN 128
|
|
307 char prtchars[PRTCHLEN]; /*line buffer for putchar*/
|
|
308 char *prtchidx; /*index for putchar*/
|
|
309
|
|
310 int extflg, extref; /*external in expr*/
|
|
311
|
|
312 #define CCR 16
|
|
313 #define SR 17
|
|
314 #define USP 18
|
|
315 #define MOVECCR 042300
|
|
316 #define MOVESR 043300
|
|
317 #define SRMOVE 040300
|
|
318 #define MOVEUSP 047140
|
|
319
|
|
320 struct op {
|
|
321 int ea; /* effective address bits*/
|
|
322 int len; /* effective address length in bytes*/
|
|
323 long con; /*constant or reloc part of operand*/
|
|
324 int drlc; /*reloc of con*/
|
|
325 int ext; /*external variable #*/
|
|
326 int idx; /*index register if any*/
|
|
327 int xmod; /*mode of index reg*/
|
|
328 } opnd[2];
|
|
329 #define OPSTLEN 10
|
|
330 #define TREELEN 20
|
|
331 struct buf{
|
|
332 int fildes;
|
|
333 int nunused;
|
|
334 char *xfree;
|
|
335 char buff[512];
|
|
336 };
|
|
337
|
|
338 struct buf lbuf;
|
|
339 struct buf tbuf;
|
|
340 struct buf dabuf;
|
|
341 struct buf drbuf;
|
|
342
|
|
343 int nerror; /*# of assembler errors*/
|
|
344 int in_err; /*[vlh] don't generate instrlen err if already err state*/
|
|
345 int shortadr; /*short addresses if set*/
|
|
346
|
|
347 #define CLRFOR 24
|
|
348 #define CLRVAL 041000
|
|
349
|
|
350 long itoffset;
|
|
351
|
|
352 #define LASTCHTFN *tfilptr
|
|
353 char *tfilptr; /* -> Changed filename character */
|
|
354 #define PC 22
|
|
1File: AS68.H Page 7
|
|
355
|
|
356 int equflg; /*doing an equate stmt*/
|
|
357
|
|
358 #define ANDI 01000
|
|
359 #define AND 0140000
|
|
360 #define ORI 0
|
|
361 #define OR 0100000
|
|
362 #define EORI 05000
|
|
363 #define EOR 0130000
|
|
364 #define MOVE 0
|
|
365
|
|
366 long lseek();
|
|
367 char *sbrk();
|
|
368 char *lemt();
|
|
369
|
|
370 int refpc; /* * referenced in expr*/
|
|
371 #define SOH 1
|
|
372
|
|
373 /* Conditional Assembly variables and constants [vlh] */
|
|
374 #define LOW_CA 21 /* [vlh] */
|
|
375 #define HI_CA 30 /* [vlh] */
|
|
376
|
|
377 int ca_true; /* true unless in a false CA*/
|
|
378 int ca; /* depth of conditional assembly, none = 0*/
|
|
379 int ca_level; /* at what CA depth did CA go false?*/
|
|
380
|
|
381 /* pass 1 global variables */
|
|
382 int numops; /*number of operands*/
|
|
383 int inoffset; /*[vlh]offset directive*/
|
|
384 int didorg;
|
|
385 int initflg; /*initialize flag*/
|
|
386
|
|
387 /* defines */
|
|
388 #define igblk() while(fchr==' ') fchr=gchr()
|
|
389 #define ckein() ((pitw >= pnite))
|
|
390
|
|
391 /* is it an alterable operand */
|
|
392 #define memalt(ap) (memea(ap) && altea(ap))
|
|
393 #define dataalt(ap) (dataea(ap) && altea(ap))
|
|
394 #define altea(ap) ((((ap)->ea&070)!=SADDR || ((ap)->ea&6)==0))
|
|
395
|
|
396 /* is it the specific type of operand */
|
|
397 #define memea(ap) (((ap)->ea&070) >= INDIRECT)
|
|
398 #define dataea(ap) (((ap)->ea&070) != ADIR)
|
|
399 #define pcea(ap) ((ap)->ea==072 || (ap)->ea==073)
|
|
400 #define ckdreg(ap) ((ap)->ea>=0 && (ap)->ea<AREGLO)
|
|
401 #define ckareg(ap) ((ap)->ea>=AREGLO && (ap)->ea<=AREGHI)
|
|
402 /*
|
|
403 * DRI Listing Hacks:
|
|
404 */
|
|
405 char *sfname; /* -> Source file name */
|
|
406 #define LPP 58 /* # lines / page */
|
|
407 int xline; /* Present line # */
|
|
408 int xpage; /* Present Page # */
|