|
|
1.1 root 1: /*
2: * 80386 assembler header.
3: */
4: #include <stdio.h>
5:
6: #define new(s) ((s *)alloc(sizeof(s)))
7: #define gnew(s) ((s *)galloc(sizeof(s)))
8: #define clear(x) memset((char *)(x), 0, sizeof(*(x)))
9: #define offset(st, memb) ((unsigned)(((st *)0)->memb))
10:
11: typedef struct expr expr; /* generated address stuff */
12: typedef struct inpctl inpctl; /* include level of control */
13: typedef struct macctl macctl; /* macro level of control */
14: typedef struct macline macline; /* a macro line */
15: typedef struct macro macro; /* macro symbol */
16: typedef struct opc opc; /* opcode symbol entry */
17: typedef struct parm parm; /* a parameter on a control line */
18: typedef struct data data; /* data block for dc.w dc.d etc */
19: typedef struct sym sym; /* allocated symbol table entry */
20: typedef struct symt symt; /* opcode table entry */
21: typedef struct nhash nhash; /* hash table entry */
22: typedef struct psym psym; /* predefined symbol table entry */
23: typedef struct symdef symdef; /* defined in c_out.c uses SYMENT & AUXENT */
24:
25: struct expr { /* generated 80386 address stuff */
26: expr *next;
27: char mode; /* mode byte */
28: long exp; /* displacment */
29: short sg; /* segment override */
30: psym *r1; /* first register */
31: psym *r2; /* second register */
32: char scale; /* scaling factor */
33: long size; /* size of target */
34: sym *ref; /* pointer to associated symbol */
35: };
36:
37: #define T_IMM 1 /* $ immediate */
38: #define T_R 2 /* reg */
39: #define T_RI 3 /* ( reg ) */
40: #define T_RID 4 /* disp ( reg ) */
41: #define T_RIX 5 /* ( reg, reg ) */
42: #define T_RIXD 6 /* disp ( reg, reg ) */
43: #define T_RIS 7 /* ( reg, scale ) */
44: #define T_RIDS 8 /* disp ( reg, scale ) */
45: #define T_RIXS 9 /* ( reg , reg, scale ) */
46: #define T_RIXDS 10 /* disp ( reg , reg, scale ) */
47: #define T_D 11 /* displacment */
48: #define T_FP 12 /* %st( n ) */
49:
50: struct opc { /* slice in pref tab */
51: short code; /* opcode */
52: short kind; /* index to symt table */
53: };
54:
55: struct symt { /* Opcode symbol type. */
56: unsigned short type; /* yacc type */
57: unsigned short bldr; /* code for builder */
58: unsigned char operands; /* operands for this kind of symbol */
59: unsigned char ap[3]; /* operand types */
60: };
61:
62: struct nhash { /* name hash entry */
63: short next; /* index to next symbol same hash */
64: short nameIx; /* index into charLump */
65: char nlen; /* length of name */
66: char count; /* match count in prefTab */
67: short prefIx; /* index into prefTab */
68: };
69:
70: struct psym { /* predefined symbol table entry */
71: psym *next; /* same symbol with same hash */
72: short type; /* yacc type or coff debug type */
73: long loc; /* location of coff debug value */
74: long size; /* length */
75: short sg; /* segment plus 1 */
76: short flag; /* flag bits */
77: sym *ref; /* base copy of this symbol on symtab */
78: short num; /* symbol number for relocation */
79: int statement; /* statement no of definition */
80: char *name; /* symbol name */
81: };
82:
83: struct sym { /* allocated symbol table entry */
84: psym *next; /* same symbol with same hash */
85: short type; /* yacc type */
86: long loc; /* location */
87: long size; /* length */
88: short sg; /* segment plus 1 */
89: short flag; /* flag bits */
90: sym *ref; /* base copy of this symbol on symtab */
91: short num; /* symbol number for relocation */
92: int statement; /* statement no of definition */
93: char name[1]; /* symbol name */
94: };
95:
96: /* Register flags */
97: #define ORD_REG 0
98: #define SEG_REG 0x0800
99: #define CTL_REG 0x0400
100: #define DEB_REG 0x0200
101: #define TST_REG 0x0100
102:
103: #define BAD 1 /* Bad exit() code */
104: #define NCPLN 16 /* max external symbol length */
105: #define NINPUT 256 /* Input line size */
106:
107: /* Listing */
108: #define NLIST 0 /* No listing */
109: #define SLIST 1 /* Source only */
110: #define ALIST 2 /* Address only */
111: #define BLIST 3 /* Byte listing */
112:
113: #define dot (symtab[0]) /* Dot, current loc */
114:
115: /* symbol type flags */
116: #define S_EXDEF 0x01 /* defined here visable elsewhere */
117: #define S_LOCAL 0x02 /* defined here */
118: #define S_EXREF 0x04 /* defined elsewhere visable here */
119: #define S_UNDEF 0x08 /* unidentified so far */
120: #define S_DUPSYM 0x10 /* duplicate symbol */
121: #define S_XSYM 0x20 /* non identifier */
122: #define S_USED 0x40 /* symbol used */
123: #define S_COMMON 0x80 /* common symbol */
124:
125: #define S_ASYM 0x3F /* allocated symbol */
126:
127: #define SYMNAME(sp) ((sp->flag&S_ASYM) ? ((sym *)sp)->name : ((psym *)sp)->name)
128:
129: struct parm { /* a parameter on a control line */
130: parm *next; /* next parm on line */
131: char str[1];
132: };
133:
134: struct macline { /* a macro line */
135: macline *next;
136: char line[1]; /* data of indefinate length */
137: };
138:
139: struct macro { /* macro symbol */
140: macro *next; /* macro's searched sequentially */
141: unsigned short type; /* same position as sym type */
142: macline *first; /* first line of macro */
143: parm *names; /* names of macro parms */
144: char name[1]; /* name of macro */
145: };
146:
147: #define WHILETYPE 0 /* while loop */
148: #define MACTYPE 1 /* macro */
149: #define MACSTR 2 /* string */
150: #define MACSCAN 3 /* string being scaned */
151:
152: struct macctl { /* macro level of control */
153: macctl *prev; /* previous level of control */
154: unsigned short type; /* do mac while etc */
155: parm *parms; /* macro parm list */
156: parm *names; /* macro parm names */
157: macline *first; /* where it started for do else etc */
158: macline *curr; /* this macro line */
159: short expno; /* this macro expansion number */
160: };
161:
162: /* macctl types */
163: #define INMACDEF 1 /* in macro definition */
164: #define INWDEF 2 /* finding limits of a while */
165: #define INPWDEF 3 /* defining while internal to another while or mac */
166: #define PMACDEF 4 /* macro definition inside macro definition */
167: #define INIF0 5 /* in unsuccesfull if */
168: #define INIFX 6 /* if in unsuccessfull if */
169: #define INIF1 7 /* in successfull if */
170: #define INWHILE 8 /* in successfull while */
171: #define NORMAL 9 /* base mode */
172:
173: struct inpctl { /* include level of control */
174: inpctl *prev; /* previous file */
175: FILE *fp; /* File ptr */
176: short lineNo; /* current line number */
177: char name[1]; /* file name */
178: };
179:
180: struct data { /* misc data item */
181: data *next;
182: unsigned short type; /* 'd', 'l', 'y', 's' */
183: unsigned short count; /* repeat count */
184: union d {
185: double d; /* double data */
186: long l; /* long data */
187: sym *y; /* pointer to original symbol */
188: char *s; /* pointer to string */
189: } d;
190: };
191:
192: /* bits for lflags */
193: #define A_SHORT 1 /* Uses short address */
194: #define A_LONG 2 /* Uses long address */
195: #define O_SHORT 4 /* Uses short operand */
196: #define O_LONG 8 /* Uses long operand */
197: #define A_INDIR 16 /* Uses indirect operand */
198:
199: /*
200: * Some opcodes need to be known outside the tables.
201: * the following defines at least give them names.
202: */
203: #define PREFIX_OP 0x66 /* Operand size prefix */
204: #define PREFIX_AD 0x67 /* Address mode prefix */
205: #define PREFIX_ES 0x26 /* Use %es: */
206: #define PREFIX_CS 0x2e /* Use %cs: */
207: #define PREFIX_SS 0x36 /* Use %ss: */
208: #define PREFIX_DS 0x3e /* Use %ds: */
209: #define PREFIX_FS 0x64 /* Use %ds: */
210: #define PREFIX_GS 0x65 /* Use %ds: */
211:
212: #define JMP_SHORT 0xEB
213: #define JMP_NEAR 0xE9
214: #define JMP_INDIR 0xFF04
215: #define CALL_NEAR 0xE8
216: #define CALL_INDIR 0xFF02
217: #define JCC_SHORT 0x70
218: #define JCC_NEAR 0x0F80
219:
220: #define MOV_BYTE 0xC6 /* Ambigous move op code */
221: #define INSB 0x6C
222: #define INSW 0x6D
223: #define NOP 0x90
224: #define POPA 0x61
225: #define AAM ((unsigned short)0xD40A)
226: #define POP_MEM ((unsigned short)0x8F00)
227: #define NON_OP ((unsigned short)0x0201) /* not an op code */
228: #include "asme.h"
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.