|
|
1.1 root 1: #include <stdio.h>
2: #include <setjmp.h>
3: #include "asmch.h"
4: #ifdef LADDR
5: #include "n.out.h"
6: #else
7: #include <l.out.h>
8: #endif
9:
10: /* Basic */
11: #define HUGE 1000 /* A huge number */
12: #define NERR 10 /* Errors per line */
13: #define NINPUT 128 /* Input buffer size */
14: #define NCODE 128 /* Listing code buffer size */
15: #define NTIT 64 /* Title buffer size */
16: #define NHASH 64 /* Buckets in hash table */
17: #define HMASK 077 /* Hash mask */
18: #define NLPP 60 /* Lines per page */
19:
20: /* Listing */
21: #define NLIST 0 /* No listing */
22: #define SLIST 1 /* Source only */
23: #define ALIST 2 /* Address only */
24: #define BLIST 3 /* Bytes */
25: #define WLIST 4 /* Words */
26:
27: #define dot (&sym[0]) /* Dot, current loc */
28:
29: /*
30: * Symbol.
31: * The names `s_ref' and `s_base'
32: * don't get init. in `pst.c'.
33: * Good thing: you cannot initialise
34: * a union.
35: */
36: struct sym
37: {
38: struct sym *s_sp; /* Hash link */
39: char s_id[NCPLN]; /* Name */
40: unsigned char s_kind; /* Symbol kind (S_) */
41: unsigned char s_flag; /* Symbol flags */
42: int s_type; /* Expression type */
43: address s_addr; /* Address */
44: int s_ref; /* Ref. number */
45: int s_total; /* Hash total */
46: union {
47: struct sym *s_sp;
48: struct loc *s_lp;
49: int s_segn;
50: } s_base; /* Base */
51: };
52:
53: /* Flags */
54: #define S_GBL 01 /* Global */
55: #define S_ASG 02 /* Assigned */
56: #define S_MDF 04 /* Mult. def */
57: #define S_END 010 /* End mark */
58: #define S_SYMT 020 /* For l.out symbol table */
59:
60: /* Kinds */
61: #define S_NEW 0 /* New name */
62: #define S_USER 1 /* User name */
63: #define S_LOC 2 /* Loc. counter */
64: #define S_SEG 3 /* Seg. name */
65: #define S_BYTE 4 /* .byte */
66: #define S_WORD 5 /* .word */
67: #define S_SDEF 6 /* .segdef */
68: #define S_ASCII 7 /* .ascii */
69: #define S_COMM 8 /* .comm */
70: #define S_LDEF 9 /* .locdef */
71: #define S_GLOBL 10 /* .globl */
72: #define S_PAGE 11 /* .page */
73: #define S_TITLE 12 /* .title */
74: #define S_BLK 13 /* .blk[bwl] */
75:
76: /*
77: * Location counter.
78: */
79: struct loc
80: {
81: struct loc *l_lp; /* Link */
82: int l_seg; /* Seg. no. */
83: address l_break; /* Size */
84: address l_offset; /* Offset in area */
85: address l_fuzz; /* Fuzz */
86: };
87:
88: /*
89: * Temp. symbols.
90: */
91: struct tsym
92: {
93: struct tsym *t_fp; /* Link to next */
94: struct loc *t_lp; /* Location counter */
95: address t_addr; /* Address */
96: };
97:
98: struct tsymp
99: {
100: struct tsym *tp_fp; /* Symbol for `n'f */
101: struct tsym *tp_bp; /* Symbol for `n'b */
102: struct tsym *tp_lfp; /* First symbol */
103: struct tsym *tp_llp; /* Last symbol */
104: };
105:
106: /*
107: * Globals.
108: */
109: extern address absexpr();
110: extern struct sym *lookup();
111: extern int inbss;
112: extern jmp_buf env;
113: extern char *new();
114: extern struct sym sym[];
115: extern int line;
116: extern int page;
117: extern int lop;
118: extern int pass;
119: extern int lflag;
120: extern int gflag;
121: extern int eflag;
122: extern int xflag;
123: extern address laddr;
124: extern address fuzz;
125: extern int lmode;
126: extern struct sym *symhash[NHASH];
127: extern int nloc;
128: extern int nerr;
129: extern struct loc *loc[];
130: extern struct loc *defloc;
131: extern char *ep;
132: extern char eb[NERR];
133: extern char *ip;
134: extern char ib[NINPUT];
135: extern char *cp;
136: extern char cb[NCODE];
137: extern char tb[NTIT];
138: extern struct tsymp tsymp[10];
139: extern char *ofn;
140: extern char *ifn;
141: extern FILE *ofp;
142: extern FILE *sfp;
143: extern FILE *efp;
144: extern char ctype[];
145:
146: /*
147: * Character types.
148: * Letters are < 0.
149: * Letters and digits are <= 0.
150: * This speeds up getid.
151: */
152: #define LETTER (-1)
153: #define DIGIT 0
154: #define BINOP 1
155: #define ETC 2
156: #define ILL 3
157: #define SPACE 4
158:
159: /*
160: * Expression.
161: */
162: struct expr
163: {
164: char e_mode; /* Address mode */
165: char e_type; /* Type */
166: address e_addr; /* Address */
167: union {
168: struct loc *e_lp;
169: struct sym *e_sp;
170: int e_segn;
171: } e_base; /* Rel. base */
172: };
173:
174: /* Types */
175: #define E_ACON 0 /* A constant */
176: #define E_ASEG 1 /* An absolute segment */
177: #define E_SYM 2 /* Symbol base */
178: #define E_DIR 3 /* Direct address */
179: #define E_AREG 4 /* Reg */
180: #define E_SEG 5 /* Relocatable segment */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.