summaryrefslogtreecommitdiff
path: root/sdas/asxxsrc/asdata.c
blob: 9e7dffef8647e4260ff1dd53bf0918cb91685656 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
/* asdata.c */

/*
 *  Copyright (C) 1989-2010  Alan R. Baldwin
 *
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 *
 * Alan R. Baldwin
 * 721 Berkeley St.
 * Kent, Ohio  44240
 *
 *   With enhancements from
 *
 *      John L. Hartman (JLH)
 *      jhartman@compuserve.com
 *
 *      Bill McKinnon (BM)
 *      w_mckinnon@conknet.com
 *
 *      Mike McCarty
 *      mike dot mccarty at sbcglobal dot net
 */

#include "asxxxx.h"

/*)Module       asdata.c
 *
 *      The module asdata.c contains the global constants,
 *      structures, and variables used in the assembler.
 */

int     aserr;          /*      ASxxxx error counter
                         */
jmp_buf jump_env;       /*      compiler dependent structure
                         *      used by setjmp() and longjmp()
                         */

/*
 *      The asmf structure contains the information
 *      pertaining to an assembler source file/macro.
 *
 * The Parameters:
 *      next    is a pointer to the next object in the linked list
 *      objtyp  specifies the object type - T_ASM, T_INCL, T_MACRO
 *      line    is the saved line number of the parent object
 *      fp      is the source FILE handle
 *      afp     is the file path length (excludes the files name.ext)
 *      afn[]   is the assembler/include file path/name.ext
 *
 *      struct  asmf
 *      {
 *              struct  asmf *next;     Link to Next Object
 *              int     objtyp;         Object Type
 *              int     line;           Saved Line Counter
 *              int     flevel;         saved flevel
 *              int     tlevel;         saved tlevel
 *              int     lnlist;         saved lnlist
 *              FILE *  fp;             FILE Handle
 *              int     afp;            File Path Length
 *              char    afn[FILSPC];    File Name
 *      };
 */
struct  asmf    *asmp;  /*      The pointer to the first assembler
                         *      source file structure of a linked list
                         */
struct  asmf    *asmc;  /*      Pointer to the current
                         *      source input structure
                         */
struct  asmf    *asmi;  /*      Queued pointer to an include file
                         *      source input structure
                         */
struct  asmf    *asmq;  /*      Queued pointer to a macro
                         *      source input structure
                         */

/*
 *      The mcrdef structure contains the
 *      information about a macro definition.
 *
 *      When the macro is defined the definition
 *      arguments are packed into a linked list of
 *      strings beginning with bgnarg and ending with
 *      endarg. The number of args is placed in narg.
 *
 *      When the macro is invoked the expansion
 *      argument strings are placed into a linked
 *      list of strings beginning with bgnxrg and
 *      ending with endxrg. The number of expansion
 *      arguments is placed in xarg.
 *
 * The Parameters:
 *      next    is a pointer to the next macro definition structure
 *      name    is a pointer to the macro name string
 *      bgnlst  is a pointer to the first text line of the macro
 *      endlst  is a pointer to the last  text line of the macro
 *      type    is the macro type - .macro, .irp, .irpc, or .rept
 *      rptcnt  is the repeat count for the macro
 *      nest    is the macro nesting counter
 *      narg    is the number of macro definition arguments
 *      bgnarg  is a pointer to the first definition argument string
 *      endarg  is a pointer to the last  definition argument string
 *      xarg    is the number of expansion arguments at macro invocation
 *      bgnxrg  is a pointer to the first expansion argument string
 *      endxrg  is a pointer to the last  expansion argument string
 *
 *      struct  mcrdef {
 *              struct mcrdef * next;           link to next macro definition
 *              char *          name;           pointer to the macro name
 *              struct strlst * bgnlst;         link to first text line of macro
 *              struct strlst * endlst;         link to last text line of macro
 *              int             type;           macro type
 *              int             rptcnt;         repeat counter
 *              int             nest;           macro nesting counter
 *              int             narg;           number of macro defintion arguments
 *              struct strlst * bgnarg;         link to first macro defintion argument
 *              struct strlst * endarg;         link to last macro definition argument
 *              int             xarg;           number of macro expansion arguments
 *              struct strlst * bgnxrg;         link to first macro expansion argument
 *              struct strlst * endxrg;         link to last macro xpansion argument
 *      };
 */
struct mcrdef * mcrlst; /*      link to list of defined macros
                         */
struct mcrdef * mcrp;   /*      link to list of defined macros
                         */

/*
 *      The memlnk structure is a linked list
 *      of memory allocations.
 *
 *      The function new() uses the memlnk structure
 *      to create a linked list of allocated memory
 *      that can be traversed by asfree() to release
 *      the allocated memory.
 *
 *      The function mhunk() uses the memlnk structure
 *      to create a linked list of allocated memory
 *      that can be reused.
 *
 * The Parameters:
 *      next    is a pointer to the next memlnk structure.
 *      ptr     is a pointer to the allocated memory.
 *
 *      struct  memlnk {
 *              struct memlnk * next;           link to next memlnk
 *              VOID *          ptr;            pointer to allocated memory
 *      };
 */
struct memlnk * pmcrmem;/*      First Macro Memory Allocation Structure
                         */
struct memlnk * mcrmem; /*      Macro Memory Allocation Structure
                         */
int     mcrblk;         /*      new data blocks allocated
                         */
int     incfil;         /*      include file nesting counter
                         */
int     maxinc;         /*      maximum include file nesting encountered
                         */
int     mcrfil;         /*      macro nesting counter
                         */
int     maxmcr;         /*      maximum macro nesting encountered
                         */
int     flevel;         /*      IF-ELSE-ENDIF flag will be non
                         *      zero for false conditional case
                         */
int     ftflevel;       /*      IIFF-IIFT-IIFTF FLAG
                         */
int     tlevel;         /*      current conditional level
                         */
int     lnlist;         /*      LIST-NLIST options
                         */
int     ifcnd[MAXIF+1]; /*      array of IF statement condition
                         *      values (0 = FALSE) indexed by tlevel
                         */
int     iflvl[MAXIF+1]; /*      array of IF-ELSE-ENDIF flevel
                         *      values indexed by tlevel
                         */
char    afn[FILSPC];    /*      current input file specification
                         */
int     afp;            /*      current input file path length
                         */
char    afntmp[FILSPC]; /*      temporary input file specification
                         */
int     afptmp;         /*      temporary input file path length
                         */
int     srcline;        /*      current source line number
                         */
int     asmline;        /*      current assembler file line number
                         */
int     incline;        /*      current include file line number
                         */
int     mcrline;        /*      current macro line number
                         */
int     radix;          /*      current number conversion radix:
                         *      2 (binary), 8 (octal), 10 (decimal),
                         *      16 (hexadecimal)
                         */
int     line;           /*      current assembler source
                         *      line number
                         */
int     page;           /*      current page number
                         */
int     lop;            /*      current line number on page
                         */
int     pass;           /*      assembler pass number
                         */
int     aflag;          /*      -a, make all symbols global flag
                         */
int     bflag;          /*      -b(b), listing modes flag
                         */
int     cflag;          /*      -c, disable cycle counts in listing flag
                         */
int     fflag;          /*      -f(f), relocations flagged flag
                         */
int     gflag;          /*      -g, make undefined symbols global flag
                         */
int     jflag;          /*      -j, generate debug information flag
                         */
int     lflag;          /*      -l, generate listing flag
                         */
int     oflag;          /*      -o, generate relocatable output flag
                         */
int     pflag;          /*      -p, disable listing pagination
                         */
int     sflag;          /*      -s, generate symbol table flag
                         */
int     uflag;          /*      -u, disable .list/.nlist processing flag
                         */
int     wflag;          /*      -w, enable wide listing format
                         */
int     xflag;          /*      -x, listing radix flag
                         */
int     yflag;          /*      -y, enable SDCC Debug Symbols
                         */
int     zflag;          /*      -z, disable symbol case sensitivity
                         */
int     waddrmode;      /*      WORD Address mode flag
                         */
int     a_bytes;        /*      REL file T Line address length
                         */
a_uint  a_mask;         /*      Address Mask
                         */
a_uint  s_mask;         /*      Sign Mask
                         */
a_uint  v_mask;         /*      Value Mask
                         */
a_uint  laddr;          /*      address of current assembler line
                         *      or value of .if argument
                         */
a_uint  fuzz;           /*      tracks pass to pass changes in the
                         *      address of symbols caused by
                         *      variable length instruction formats
                         */
int     lmode;          /*      listing mode
                         */
char    *ep;            /*      pointer into error list
                         *      array eb[NERR]
                         */
char    eb[NERR];       /*      array of generated error codes
                         */
char    *ip;            /*      pointer into the assembler-source
                         *      text line in ib[]
                         */
char    *ib;            /*      assembler-source text line for processing
                         */
char    *ic;            /*      assembler-source text line for listing
                         */
char    *cp;            /*      pointer to assembler output
                         *      array cb[]
                         */
char    cb[NCODE];      /*      array of assembler output values
                         */
int     *cpt;           /*      pointer to assembler relocation type
                         *      output array cbt[]
                         */
int     cbt[NCODE];     /*      array of assembler relocation types
                         *      describing the data in cb[]
                         */
int     opcycles;       /*      opcode execution cycles
                         */
char    tb[NTITL];      /*      Title string buffer
                         */
char    stb[NSBTL];     /*      Subtitle string buffer
                         */
char    erb[NINPUT+4];  /*      Error string buffer
                         */

char    symtbl[] = { "Symbol Table" };
char    aretbl[] = { "Area Table" };

char    module[NCPS+2]; /*      module name string
                         */
/* sdas specific */
int     org_cnt;        /*      .org directive counter
                         */
char    *optsdcc;       /*      sdcc compile options
                         */
/* end sdas specific */

/*
 *      The mne structure is a linked list of the assembler
 *      mnemonics and directives.  The list of mnemonics and
 *      directives contained in the device dependent file
 *      xxxpst.c are hashed and linked into NHASH lists in
 *      module assym.c by syminit().  The structure contains
 *      the mnemonic/directive name, a subtype which directs
 *      the evaluation of this mnemonic/directive, a flag which
 *      is used to detect the end of the mnemonic/directive
 *      list in xxxpst.c, and a value which is normally
 *      associated with the assembler mnemonic base instruction
 *      value.
 *
 *      struct  mne
 *      {
 *              struct  mne *m_mp;      Hash link
 *              char *  m_id;           Mnemonic (JLH)
 *              char    m_type;         Mnemonic subtype
 *              char    m_flag;         Mnemonic flags
 *              a_uint  m_valu;         Value
 *      };
 */
struct  mne     *mnehash[NHASH];

/*
 *      The sym structure is a linked list of symbols defined
 *      in the assembler source files.  The first symbol is "."
 *      defined here.  The entry 'struct tsym *s_tsym'
 *      links any temporary symbols following this symbol and
 *      preceeding the next normal symbol.  The structure also
 *      contains the symbol's name, type (USER or NEW), flag
 *      (global, assigned, and multiply defined), a pointer
 *      to the area structure defining where the symbol is
 *      located, a reference number assigned by outgsd() in
 *      asout.c, and the symbols address relative to the base
 *      address of the area where the symbol is located.
 *
 *      struct  sym
 *      {
 *              struct  sym  *s_sp;     Hash link
 *              struct  tsym *s_tsym;   Temporary symbol link
 *              char    *s_id;          Symbol (JLH)
 *              char    s_type;         Symbol subtype
 *              char    s_flag;         Symbol flags
 *              struct  area *s_area;   Area line, 0 if absolute
 *              int     s_ref;          Ref. number
 *              a_uint  s_addr;         Address
 * sdas specific
 *              a_uint  s_org;          Start Address if absolute
 * end sdas specific
 *      };
 */
struct  sym     sym[] = {
    {   NULL,   NULL,   ".",        S_USER, 0,                  NULL,   0,  0,  0 },
    {   NULL,   NULL,   ".__.ABS.", S_USER, S_ASG|S_GBL,        NULL,   0,  0,  0 },
    {   NULL,   NULL,   ".__.CPU.", S_USER, S_ASG|S_LCL,        NULL,   0,  0,  0 },
    {   NULL,   NULL,   ".__.H$L.", S_USER, S_ASG|S_LCL,        NULL,   0,  0,  0 },
    {   NULL,   NULL,   ".__.$$$.", S_USER, S_ASG|S_LCL|S_EOL,  NULL,   0,  0,  0 }
};

struct  sym     *symp;          /*      pointer to a symbol structure
                                 */
struct  sym *symhash[NHASH];    /*      array of pointers to NHASH
                                 *      linked symbol lists
                                 */

/*
 *      The area structure contains the parameter values for a
 *      specific program or data section.  The area structure
 *      is a linked list of areas.  The initial default area
 *      is "_CODE" defined here, the next area structure
 *      will be linked to this structure through the structure
 *      element 'struct area *a_ap'.  The structure contains the
 *      area name, area reference number ("_CODE" is 0) determined
 *      by the order of .area directives, area size determined
 *      from the total code and/or data in an area, area fuzz is
 *      a variable used to track pass to pass changes in the
 *      area size caused by variable length instruction formats,
 *      and area flags which specify the area's relocation type.
 *
 *      struct  area
 *      {
 *              struct  area *a_ap;     Area link
 *              char *  a_id;           Area Name
 *              int     a_ref;          Reference number
 *              a_uint  a_size;         Area size
 *              a_uint  a_fuzz;         Area fuzz
 *              int     a_flag;         Area flags
 *      };
 */
struct  area    area[] = {
    {NULL,      "_CODE",        0,      0,      0,      A_CON|A_REL}
};

struct  area    *areap; /*      pointer to an area structure
                         */

FILE    *lfp;           /*      list output file handle
                         */
FILE    *ofp;           /*      relocation output file handle
                         */
FILE    *tfp;           /*      symbol table output file handle
                         */
char    txt[NTXT];      /*      T Line Values
                         */
char    rel[NREL];      /*      R Line Values
                         */
char    *txtp = &txt[0];/*      Pointer to T Line Values
                         */
char    *relp = &rel[0];/*      Pointer to R Line Values
                         */

/*
 *      an array of character types,
 *      one per ASCII character
 */
unsigned char   ctype[128] = {
/*NUL*/ ILL,    ILL,    ILL,    ILL,    ILL,    ILL,    ILL,    ILL,
/*BS*/  ILL,    SPACE,  ILL,    ILL,    SPACE,  ILL,    ILL,    ILL,
/*DLE*/ ILL,    ILL,    ILL,    ILL,    ILL,    ILL,    ILL,    ILL,
/*CAN*/ ILL,    ILL,    ILL,    ILL,    ILL,    ILL,    ILL,    ILL,
/*SPC*/ SPACE,  ETC,    ETC,    ETC,    LETTER, BINOP,  BINOP,  ETC,
/*(*/   ETC,    ETC,    BINOP,  BINOP,  ETC,    BINOP,  LETTER, BINOP,
/*0*/   DGT2,   DGT2,   DGT8,   DGT8,   DGT8,   DGT8,   DGT8,   DGT8,
/*8*/   DGT10,  DGT10,  ETC,    ETC,    BINOP,  ETC,    BINOP,  ETC,
/*@*/   ETC,    LTR16,  LTR16,  LTR16,  LTR16,  LTR16,  LTR16,  LETTER,
/*H*/   LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER,
/*P*/   LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER,
/*X*/   LETTER, LETTER, LETTER, BINOP,  ETC,    ETC,    BINOP,  LETTER,
/*`*/   ETC,    LTR16,  LTR16,  LTR16,  LTR16,  LTR16,  LTR16,  LETTER,
/*h*/   LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER,
/*p*/   LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER, LETTER,
/*x*/   LETTER, LETTER, LETTER, ETC,    BINOP,  ETC,    ETC,    ETC
};

/*
 *      an array of characters which
 *      perform the case translation function
 */
char    ccase[128] = {
/*NUL*/ '\000', '\001', '\002', '\003', '\004', '\005', '\006', '\007',
/*BS*/  '\010', '\011', '\012', '\013', '\014', '\015', '\016', '\017',
/*DLE*/ '\020', '\021', '\022', '\023', '\024', '\025', '\026', '\027',
/*CAN*/ '\030', '\031', '\032', '\033', '\034', '\035', '\036', '\037',
/*SPC*/ '\040', '\041', '\042', '\043', '\044', '\045', '\046', '\047',
/*(*/   '\050', '\051', '\052', '\053', '\054', '\055', '\056', '\057',
/*0*/   '\060', '\061', '\062', '\063', '\064', '\065', '\066', '\067',
/*8*/   '\070', '\071', '\072', '\073', '\074', '\075', '\076', '\077',
/*@*/   '\100', '\141', '\142', '\143', '\144', '\145', '\146', '\147',
/*H*/   '\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157',
/*P*/   '\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167',
/*X*/   '\170', '\171', '\172', '\133', '\134', '\135', '\136', '\137',
/*`*/   '\140', '\141', '\142', '\143', '\144', '\145', '\146', '\147',
/*h*/   '\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157',
/*p*/   '\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167',
/*x*/   '\170', '\171', '\172', '\173', '\174', '\175', '\176', '\177'
};