/* asxxxx.h */
/*
* Copyright (C) 1989-2012 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 .
*
*
* Alan R. Baldwin
* 721 Berkeley St.
* Kent, Ohio 44240
*
* With enhancements from
*
* John L. Hartman (JLH)
* jhartman at compuserve dot com
*
* Bill McKinnon (BM)
* w_mckinnon at conknet dot com
*
* Boisy G. Petri (BGP)
* boisy at boisypitre dot com
*
* Mike McCarty
* mike dot mccarty at sbcglobal dot net
*/
/*
* 28-Oct-97 JLH:
* - add proto for strsto
* - change s_id from [NCPS] to pointer
* - change m_id from [NCPS] to pointer
* - change NCPS to 80
* - case sensitive
* - add R_J11 for 8051 assembler
* - add outr11 prototype for 8051 assembler
* - always define "ccase"
* 2-Nov-97 JLH:
* - add jflag for debug control
* - prototypes for DefineNoICE_Line
* 30-Jan-98 JLH:
* - add memory space flags to a_flag for 8051
*
* 3-Feb-00 KV:
* - add DS80C390 flat mode support.
* 10-Nov-07 borutr:
* - change a_id from [NCPS] to pointer
*/
/*
* System Include Files
*/
#include
#include
#include
#include
/*
* Local Definitions
*/
#define VERSION "V02.00 + NoICE + SDCC mods"
#define COPYRIGHT "2012"
/*
* To include NoICE Debugging set non-zero
*/
#define NOICE 1
/*
* To include SDCC Debugging set non-zero
*/
#define SDCDB 1
/*
* The assembler requires certain variables to have
* at least 32 bits to allow correct address processing.
*
* The type INT32 is defined so that compiler dependent
* variable sizes may be specified in one place.
*
* LONGINT is defined when INT32 is 'long' to
* select the 'l' forms for format strings
* and constants.
*/
/* Turbo C++ 3.0 for DOS */
/* 'int' is 16-bits, 'long' is 32-bits */
#ifdef __TURBOC__
#define INT32 long
#define LONGINT
#endif
/* Symantec C++ V6.x/V7.x for DOS (not DOSX) */
/* 'int' is 16-bits, 'long' is 32-bits */
#ifdef __SC__
#define INT32 long
#define LONGINT
#endif
/* The DEFAULT is 'int' is 32 bits */
#ifndef INT32
#define INT32 int
#endif
#if !defined(__BORLANDC__) && !defined(_MSC_VER)
#include
#endif
/*)Module asxxxx.h
*
* The module asxxxx.h contains the definitions for constants,
* structures, global variables, and ASxxxx functions
* contained in the ASxxxx.c files. The functions and
* global variables from the machine dependent files are
* also defined.
*/
/*
* compiler/operating system specific definitions
*/
/* DECUS C void definition */
/* File/extension seperator */
#ifdef DECUS
#define VOID char
#define FSEPX '.'
#endif
/* PDOS C void definition */
/* File/extension seperator */
#ifdef PDOS
#define VOID char
#define FSEPX ':'
#endif
/* Default void definition */
/* File/extension seperator */
#ifndef VOID
#define VOID void
#define FSEPX '.'
#define OTHERSYSTEM
#endif
/*
* PATH_MAX
*/
#include
#ifndef PATH_MAX /* POSIX, but not required */
# if defined(_MSC_VER) || defined(__BORLANDC__) /* Microsoft C or Borland C */
# define PATH_MAX _MAX_PATH
# else
# define PATH_MAX FILENAME_MAX /* define a reasonable value */
# endif
#endif
#ifdef _WIN32 /* WIN32 native */
# define NATIVE_WIN32 1
# ifdef __MINGW32__ /* GCC MINGW32 depends on configure */
# include "../../sdccconf.h"
# else
# include "../../sdcc_vc.h"
# define PATH_MAX _MAX_PATH
# endif
#else /* Assume *nix style system */
# include "../../sdccconf.h"
#endif
/*
* Error definitions
*/
#define ER_NONE 0 /* No error */
#define ER_WARNING 1 /* Warning */
#define ER_ERROR 2 /* Assembly error */
#define ER_FATAL 3 /* Fatal error */
/*
* Assembler definitions.
*/
#define LFTERM '(' /* Left expression delimeter */
#define RTTERM ')' /* Right expression delimeter */
#define NCPS 80 /* Characters per symbol */
#define ASXHUGE 1000 /* A huge number */
#define NERR 3 /* Errors per line */
#define NINPUT 1024 /* Input buffer size */
#define NCODE 128 /* Listing code buffer size */
#define NTITL 80 /* Title buffer size */
#define NSBTL 80 /* SubTitle buffer size */
#define NHASH (1 << 6) /* Buckets in hash table */
#define HMASK (NHASH - 1) /* Hash mask */
#define NLPP 60 /* Lines per page */
#define MAXMCR 20 /* Maximum nesting of macro expansions */
#define MAXIF 10 /* Maximum nesting of if/else/endif */
#define FILSPC PATH_MAX /* Chars. in filespec */
#define NLIST 0 /* No listing */
#define SLIST 1 /* Source only */
#define ALIST 2 /* Address only */
#define BLIST 3 /* Address only with allocation */
#define CLIST 4 /* Code */
#define ELIST 5 /* Equate only */
#define LIST_ERR 0x0001 /* Error Code(s) */
#define LIST_LOC 0x0002 /* Location */
#define LIST_BIN 0x0004 /* Generated Binary Value(s)*/
#define LIST_EQT 0x0008 /* Assembler Equate Value */
#define LIST_CYC 0x0010 /* Opcode Cycles */
#define LIST_LIN 0x0020 /* Line Numbers */
#define LIST_SRC 0x0040 /* Assembler Source Code */
#define LIST_PAG 0x0080 /* Assembler Pagination */
#define LIST_LST 0x0100 /* .LIST/.NLIST Listing */
#define LIST_MD 0x0200 /* Macro Definition */
#define LIST_ME 0x0400 /* Macro Expansion */
#define LIST_MEB 0x0800 /* Macro Expansion Binary */
#define LIST_BITS 0x0FFF /* LIST Flags Mask */
#define LIST_NONE 0x0000 /* NLIST Flags Mask */
#define LIST_ASM 0x007F /* LIST Flags Mask for Assembler Line */
#define LIST_NORM 0x03FF /* LIST Flags Mask */
#define LIST_NOT 0x1000 /* Force Complement of Listing Mode */
#define LIST_TORF 0x8000 /* IF-ENDIF Conditional Overide Flag */
#define T_ASM 0 /* Assembler Source File */
#define T_INCL 1 /* Assembler Include File */
#define T_MACRO 2 /* Assembler Macro */
/*
* Opcode Cycle definitions (Must Be The Same In ASxxxx / ASLink)
*/
#define CYCNT_BGN '[' /* Cycle count begin delimiter */
#define CYCNT_END ']' /* Cycle count end delimiter */
/*
* OPCY_NONE bit set signifies no opcode cycles set.
*/
#define OPCY_NONE ((char) 0x80) /* Opcode Cycle Count Not Set */
#define OPCY_MASK ((char) 0x7F) /* Opcode Cycle Count MASK */
/*
* NTXT must be defined to have the same value in
* the ASxxxx assemblers and ASLink.
*
* The R Line coding allows only 4-bits for coding
* the T Line index. The MAXIMUM value for NTXT
* is 16. It should not be changed.
*/
#define NTXT 16 /* Maximum T Line Values */
#define NREL 16 /* Maximum R Line Values */
/*
* Internal Definitions
*/
#define dot sym[0] /* Dot, current loc */
#define dca area[0] /* Dca, default code area */
#define hilo sym[3].s_addr /* hilo, byte order flag */
#define mls sym[4] /* Mls, Macro local symbol */
/*
* The defined type 'a_uint' is used for all address and
* unsigned variable value calculations. Its size is
* required to be at least 32-bits to allow upto
* 32-bit addressing or 32-bit value manipulation.
*/
typedef unsigned INT32 a_uint;
/*
* The defined type 'v_sint' is used for address and
* variable value calculations requiring a sign.
* Its size is required to be at least 32-bits to allow
* upto 32-bit addressing or 32-bit value manipulation.
*/
typedef signed INT32 v_sint;
/*
* 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 in asdata.c, 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; /* Ref. number */
a_uint a_size; /* Area size */
a_uint a_fuzz; /* Area fuzz */
int a_flag; /* Area flags */
/* sdas specific */
a_uint a_addr; /* Area address */
/* end sdas specific */
};
/*
* The "A_" area constants define values used in
* generating the assembler area output data.
*
* Area flags
*
* 7 6 5 4 3 2 1 0
* +-----+-----+-----+-----+-----+-----+-----+-----+
* | BIT |XDATA|DATA | PAG | ABS | OVR | | |
* +-----+-----+-----+-----+-----+-----+-----+-----+
*/
#define A_CON 0000 /* Concatenating */
#define A_OVR 0004 /* Overlaying */
#define A_REL 0000 /* Relocatable */
#define A_ABS 0010 /* absolute */
#define A_NOPAG 0000 /* Non-Paged */
#define A_PAG 0020 /* Paged */
/* sdas specific */
/* Additional flags for 8051 address spaces */
#define A_DATA 0000 /* data space (default)*/
#define A_CODE 0040 /* code space */
#define A_XDATA 0100 /* external data space */
#define A_BIT 0200 /* bit addressable space */
#define A_NOLOAD 0400 /* nonloadable */
#define A_LOAD 0000 /* loadable (default) */
/* end sdas specific */
/*
* The "R_" relocation constants define values used in
* generating the assembler relocation output data for
* areas, symbols, and code.
*
* Relocation flags
*
* 7 6 5 4 3 2 1 0
* +-----+-----+-----+-----+-----+-----+-----+-----+
* | MSB | PAGn| PAG0| USGN| BYT2| PCR | SYM | BYT |
* +-----+-----+-----+-----+-----+-----+-----+-----+
*/
#define R_BYTE 0x01 /* 8 bit */
#define R_WORD 0x00 /* 16 bit */
#define R_BYT1 0x00 /* Byte count for R_BYTE = 1 */
#define R_BYTX 0x08 /* Byte count for R_BYTE = 2 */
#define R_HIB 0x200 /* If R_BYTE & R_BYT3 are set, linker
* will select byte 3 of the relocated
* 24 bit address.
*/
#define R_SGND 0x00 /* Signed Byte */
#define R_USGN 0x10 /* Unsigned Byte */
#define R_LSB 0x00 /* low byte */
#define R_MSB 0x80 /* high byte */
#define R_BIT 0x400 /* Linker will convert from byte-addressable
* space to bit-addressable space.
*/
#define R_AREA 0x00 /* Base type */
#define R_SYM 0x02
/*
* Note: The PAGE modes and PCR modes are mutually exclusive !!!
*
*
* Paging Modes:
*/
#define R_NOPAG 0x0000 /* Page Mode */
#define R_PAG0 0x0020 /* Page '0' */
#define R_PAGN 0x0040 /* Page 'nnn' */
#define R_PAGX 0x0060 /* Page 'x', Extended Relocation Mode */
/*
* PCR Modes:
*/
#define R_PCR 0x04
#define R_J11 (R_WORD|R_BYTX) /* JLH: 11 bit JMP and CALL (8051) */
#define R_J19 (R_WORD|R_BYTX|R_MSB) /* 19 bit JMP/CALL (DS80C390) */
#define R_C24 (R_WORD|R_BYT1|R_MSB) /* 24 bit address (DS80C390) */
#define R_J19_MASK (R_BYTE|R_BYTX|R_MSB)
#define IS_R_J19(x) (((x) & R_J19_MASK) == R_J19)
#define IS_R_J11(x) (((x) & R_J19_MASK) == R_J11)
#define IS_C24(x) (((x) & R_J19_MASK) == R_C24)
/*
* Basic Relocation Modes
*/
#define R_NORM 0x0000 /* No Bit Positioning */
/*
* Extended Relocation Modes are defined in
* the ___pst.c files.
*
* #define R_0100 0x0100 Extended mode 1
* ...
* #define R_0F00 0x0F00 Extended mode 15
*/
#define R_ESCAPE_MASK 0xf0 /* Used to escape relocation modes
* greater than 0xff in the .rel
* file.
*/
/*
* Listing Control Flags
*/
#define R_HIGH 0040000 /* High Byte */
#define R_BYT3 0x100 /* if R_BYTE is set, this is a
* 3 byte address, of which
* the linker must select one byte.
*/
#define R_RELOC 0100000 /* Relocation */
#define R_DEF 00 /* Global def. */
#define R_REF 01 /* Global ref. */
#define R_REL 00 /* Relocatable */
#define R_ABS 02 /* Absolute */
#define R_GBL 00 /* Global */
#define R_LCL 04 /* Local */
/*
* 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 */
};
/*
* The sym structure is a linked list of symbols defined
* in the assembler source files. The first symbol is "."
* defined in asdata.c. 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 (NEW or USER),
* 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 */
};
#define S_EOL 040 /* End mark for ___pst files */
#define S_LCL 001 /* Local Variable */
#define S_GBL 002 /* Global Variable */
#define S_ASG 004 /* Assigned Value */
#define S_MDF 010 /* Multiple Definition */
#define S_NEW 0 /* New Name (External) */
#define S_USER 1 /* User Name (Assigned) */
#define S_SPARE 2 /* Spare Definition */
#define S_PAGE 3 /* .page */
#define S_HEADER 4 /* .title, .sbttl */
#define O_TITLE 0 /* .title */
#define O_SBTTL 1 /* .sbttl */
#define S_MODUL 5 /* .module */
#define S_INCL 6 /* .include */
#define S_AREA 7 /* .area */
#define S_ATYP 8 /* .area type */
#define S_ORG 11 /* .org */
#define S_RADIX 12 /* .radix */
#define S_GLOBL 13 /* .globl */
#define S_LOCAL 14 /* .local */
#define S_CONDITIONAL 15 /* .if, .iif, .else, .endif, ... */
#define O_IF 0 /* .if */
#define O_IFF 1 /* .iff */
#define O_IFT 2 /* .ift */
#define O_IFTF 3 /* .iftf */
#define O_IFGT 6 /* .ifgt (BGP) */
#define O_IFLT 7 /* .iflt (BGP) */
#define O_IFGE 8 /* .ifge (BGP) */
#define O_IFLE 9 /* .ifle (BGP) */
#define O_IFEQ 10 /* .ifeq (BGP) */
#define O_IFNE 11 /* .ifne (BGP) */
#define O_IFEND 20 /* end of .if conditionals */
#define O_IIF 20 /* .iif */
#define O_IIFF 21 /* .iiff */
#define O_IIFT 22 /* .iift */
#define O_IIFTF 23 /* .iiftf */
#define O_IIFGT 26 /* .iifgt */
#define O_IIFLT 27 /* .iiflt */
#define O_IIFGE 28 /* .iifge */
#define O_IIFLE 29 /* .iifle */
#define O_IIFEQ 30 /* .iifeq */
#define O_IIFNE 31 /* .iifne */
#define O_IIFEND 40 /* end of .iif conditionals */
#define O_ELSE 40 /* .else */
#define O_ENDIF 41 /* .endif */
#define S_LISTING 16 /* .nlist, .list */
#define O_LIST 0 /* .list */
#define O_NLIST 1 /* .nlist */
#define S_EQU 17 /* .equ, .gblequ, .lclequ */
#define O_EQU 0 /* .equ */
#define O_GBLEQU 1 /* .gblequ */
#define O_LCLEQU 2 /* .lclequ */
#define S_DATA 18 /* .byte, .word, .3byte, .4byte, .db, .dw, .fcb, .fdb */
#define O_1BYTE 1 /* .byte, .db, .fcb */
#define O_2BYTE 2 /* .word, .dw, .fdb */
#define O_3BYTE 3 /* .3byte */
#define O_4BYTE 4 /* .4byte */
#define S_BLK 19 /* .blkb or .blkw */
#define S_ASCIX 20 /* .ascii, .ascis, .asciz, .str, .strs, .strz */
#define O_ASCII 0 /* .ascii */
#define O_ASCIS 1 /* .ascis */
#define O_ASCIZ 2 /* .asciz */
#define S_BOUNDARY 22 /* .even, .odd */
#define O_EVEN 0 /* .even */
#define O_ODD 1 /* .odd */
#define O_BNDRY 2 /* .bndry */
#define S_BITS 26 /* .8bit, .16bit, .24bit, .32bit */
/* O_1BYTE 1 */ /* .8bit */
/* O_2BYTE 2 */ /* .16bit */
/* O_3BYTE 3 */ /* .24bit */
/* O_4BYTE 4 */ /* .32bit */
#define S_END 27 /* .end */
#define S_MACRO 28 /* .macro, .endm, .mexit, ... */
#define O_MACRO 0 /* .macro */
#define O_ENDM 1 /* .endm */
#define O_MEXIT 2 /* .mexit */
#define O_NCHR 3 /* .nchr */
#define O_NARG 4 /* .narg */
#define O_NTYP 5 /* .ntyp */
#define O_IRP 6 /* .irp */
#define O_IRPC 7 /* .irpc */
#define O_REPT 8 /* .rept */
#define O_NVAL 9 /* .nval */
#define O_MDEL 10 /* .mdelete */
#define O_CHECK 255 /* Building/Exiting a Macro Check */
#define S_DIREOL 30 /* Assembler Directive End Of List */
/* sdas specific */
#define S_FLOAT 32 /* .df */
#define S_ULEB128 33 /* .uleb128 */
#define S_SLEB128 34 /* .sleb128 */
#define S_OPTSDCC 35 /* .optsdcc */
/* end sdas specific */
/*
* The tsym structure is a linked list of temporary
* symbols defined in the assembler source files following
* a normal symbol. The structure contains the temporary
* symbols number, a flag (multiply defined), a pointer to the
* area structure defining where the temporary structure
* is located, and the temporary symbol's address relative
* to the base address of the area where the symbol
* is located.
*/
struct tsym
{
struct tsym *t_lnk; /* Link to next */
a_uint t_num; /* 0-65535$ for a 16-bit int */
/* 0-4294967295$ for a 32-bit int */
int t_flg; /* flags */
struct area *t_area; /* Area */
a_uint t_addr; /* Address */
};
/*
* The def structure is used by the .define assembler
* directive to define a substitution string for a
* single word. The def structure contains the
* string being defined, the string to substitute
* for the defined string, and a link to the next
* def structure. The defined string is a sequence
* of characters not containing any white space
* (i.e. NO SPACEs or TABs). The substitution string
* may contain SPACES and/or TABs.
*/
struct def
{
struct def *d_dp; /* link to next define */
char *d_id; /* defined string */
char *d_define; /* string to substitute for defined string */
int d_dflag; /* (1) .defined / (0) .undefined */
};
/*
* The mode structure contains the specification of one of the
* assemblers' merge modes. Each assembler must specify
* at least one merge mode. The merging specification
* allows arbitrarily defined active bits and bit positions.
* The 32 element arrays are indexed from 0 to 31.
* Index 0 corresponds to bit 0, ..., and 31 corresponds to bit 31
* of a normal integer value.
*
* The value of the element specifies if the normal integer bit
* is active (bit <7> is set, 0x80) and what destination bit
* (bits <4:0>, 0 - 31) should be loaded with this normal
* integer bit.
*
* The specification for a 32-bit integer:
*
* char mode_[32] = {
* '\200', '\201', '\202', '\203', '\204', '\205', '\206', '\207',
* '\210', '\211', '\212', '\213', '\214', '\215', '\216', '\217',
* '\220', '\221', '\222', '\223', '\224', '\225', '\226', '\227',
* '\230', '\231', '\232', '\233', '\234', '\235', '\236', '\237'
* };
*
*
* The specification for the 11-bit 8051 addressing mode:
*
* char mode_[32] = {
* '\200', '\201', '\202', '\203', '\204', '\205', '\206', '\207',
* '\215', '\216', '\217', '\013', '\014', '\015', '\016', '\017',
* '\020', '\021', '\022', '\023', '\024', '\025', '\026', '\027',
* '\030', '\031', '\032', '\033', '\034', '\035', '\036', '\037'
* };
*
*
* *m_def is a pointer to the bit relocation definition.
* m_flag indicates that bit position swapping is required.
* m_dbits contains the active bit positions for the output.
* m_sbits contains the active bit positions for the input.
*/
struct mode
{
char * m_def; /* Bit Relocation Definition */
a_uint m_flag; /* Bit Swapping Flag */
a_uint m_dbits; /* Destination Bit Mask */
a_uint m_sbits; /* Source Bit Mask */
};
/*
* Definitions for Character Types
*/
#define SPACE '\000'
#define ETC '\000'
#define LETTER '\001'
#define DIGIT '\002'
#define BINOP '\004'
#define RAD2 '\010'
#define RAD8 '\020'
#define RAD10 '\040'
#define RAD16 '\100'
#define ILL '\200'
#define DGT2 (DIGIT|RAD16|RAD10|RAD8|RAD2)
#define DGT8 (DIGIT|RAD16|RAD10|RAD8)
#define DGT10 (DIGIT|RAD16|RAD10)
#define LTR16 (LETTER|RAD16)
/*
* The expr structure is used to return the evaluation
* of an expression. The structure supports three valid
* cases:
* (1) The expression evaluates to a constant,
* mode = S_USER, flag = 0, addr contains the
* constant, and base = NULL.
* (2) The expression evaluates to a defined symbol
* plus or minus a constant, mode = S_USER,
* flag = 0, addr contains the constant, and
* base = pointer to area symbol.
* (3) The expression evaluates to a external
* global symbol plus or minus a constant,
* mode = S_NEW, flag = 1, addr contains the
* constant, and base = pointer to symbol.
*/
struct expr
{
char e_mode; /* Address mode */
char e_flag; /* Symbol flag */
a_uint e_addr; /* Address */
union {
struct area *e_ap;
struct sym *e_sp;
} e_base; /* Rel. base */
int e_rlcf; /* Rel. flags */
};
/*
* 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
* flevel is the saved flevel of the parent object
* tlevel is the saved tlevel of the parent object
* lnlist is the saved lnlist 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 */
};
/*
* The macrofp structure masquerades as a FILE Handle
* for inclusion in an asmf structure. This structure
* contains the reference to the macro to be inserted
* into the assembler stream and information to
* restore the assembler state at macro completion.
*
* The Parameters:
* np is a pointer to the macro definition
* lstptr is a pointer to the next macro line
* rptcnt is the macro repeat counter
* rptidx is the current repeat count
* flevel is the saved assembler flevel
* tlevel is the saved assembler tlevel
* lnlist is the saved assembler lnlist
* npexit non zero if an .mexit is encountered
*/
struct macrofp {
struct mcrdef * np; /* pointer to macro definition */
struct strlst * lstptr; /* pointer to next line of macro */
int rptcnt; /* repeat counter */
int rptidx; /* repeat index */
int flevel; /* saved flevel */
int tlevel; /* saved tlevel */
int lnlist; /* saved lnlist */
int npexit; /* .mexit called */
};
/*
* 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 */
};
/*
* The strlst structure is a linked list of strings.
*
* The Parameters:
* next is a pointer to the next string.
* text is a pointer to a text string.
*/
struct strlst {
struct strlst * next; /* pointer to next string */
char * text; /* pointer to string text */
};
/*
* 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 */
};
/*
* External Definitions for all Global Variables
*/
extern int aserr; /* ASxxxx error counter
*/
extern jmp_buf jump_env; /* compiler dependent structure
* used by setjmp() and longjmp()
*/
extern struct asmf *asmp; /* The pointer to the first assembler
* source file structure of a linked list
*/
extern struct asmf *asmc; /* Pointer to the current
* source input structure
*/
extern struct asmf *asmi; /* Queued pointer to an include file
* source input structure
*/
extern struct asmf *asmq; /* Queued pointer to a macro
* source input structure
*/
extern struct mcrdef * mcrlst; /* link to list of defined macros
*/
extern struct mcrdef * mcrp; /* link to list of defined macros
*/
extern struct memlnk * pmcrmem;/* First Macro Memory Allocation Structure
*/
extern struct memlnk * mcrmem; /* Macro Memory Allocation Structure
*/
extern int mcrblk; /* Macro data blocks allocated
*/
extern int incfil; /* include file nesting counter
*/
extern int maxinc; /* maximum include file nesting encountered
*/
extern int mcrfil; /* macro nesting counter
*/
extern int maxmcr; /* maximum macro nesting encountered
*/
extern int flevel; /* IF-ELSE-ENDIF flag will be non
* zero for false conditional case
*/
extern int ftflevel; /* IIFF-IIFT-IIFTF FLAG
*/
extern int tlevel; /* current conditional level
*/
extern int lnlist; /* LIST-NLIST options
*/
extern int ifcnd[MAXIF+1]; /* array of IF statement condition
* values (0 = FALSE) indexed by tlevel
*/
extern int iflvl[MAXIF+1]; /* array of IF-ELSE-ENDIF flevel
* values indexed by tlevel
*/
extern char afn[FILSPC]; /* current input file specification
*/
extern int afp; /* current input file path length
*/
extern char afntmp[FILSPC]; /* temporary input file specification
*/
extern int afptmp; /* temporary input file path length
*/
extern int srcline; /* current source line number
*/
extern int asmline; /* current assembler file line number
*/
extern int incline; /* current include file line number
*/
extern int mcrline; /* current macro line number
*/
extern int radix; /* current number conversion radix:
* 2 (binary), 8 (octal), 10 (decimal),
* 16 (hexadecimal)
*/
extern int line; /* current assembler source line number
*/
extern int page; /* current page number
*/
extern int lop; /* current line number on page
*/
extern int pass; /* assembler pass number
*/
extern int aflag; /* -a, make all symbols global flag
*/
extern int bflag; /* -b(b), listing mode flag
*/
extern int cflag; /* -c, disable cycle counts in listing flag
*/
extern int fflag; /* -f(f), relocations flagged flag
*/
extern int gflag; /* -g, make undefined symbols global flag
*/
#if NOICE
extern int jflag; /* -j, generate debug information flag
*/
#endif
extern int lflag; /* -l, generate listing flag
*/
extern int oflag; /* -o, generate relocatable output flag
*/
extern int pflag; /* -p, disable listing pagination
*/
extern int sflag; /* -s, generate symbol table flag
*/
extern int uflag; /* -u, disable .list/.nlist processing flag
*/
extern int wflag; /* -w, enable wide listing format
*/
extern int xflag; /* -x, listing radix flag
*/
#if SDCDB
extern int yflag; /* -y, enable SDCC Debug Symbols
*/
#endif
extern int zflag; /* -z, disable symbol case sensitivity
*/
extern int waddrmode; /* WORD Address mode flag
*/
extern int a_bytes; /* REL file T Line address length
*/
extern a_uint a_mask; /* Address Mask
*/
extern a_uint s_mask; /* Sign Mask
*/
extern a_uint v_mask; /* Value Mask
*/
extern a_uint laddr; /* address of current assembler line,
* equate, or value of .if argument
*/
extern a_uint fuzz; /* tracks pass to pass changes in the
* address of symbols caused by
* variable length instruction formats
*/
extern int lmode; /* listing mode
*/
extern char txt[NTXT]; /* T Line Values
*/
extern char rel[NREL]; /* R Line Values
*/
extern char *txtp; /* Pointer to T Line Values
*/
extern char *relp; /* Pointer to R Line Values
*/
extern struct area *areap; /* pointer to an area structure
*/
extern struct area area[]; /* array of 1 area
*/
extern struct sym sym[]; /* array of 1 symbol
*/
extern struct sym *symp; /* pointer to a symbol structure
*/
extern struct sym *symhash[NHASH]; /* array of pointers to NHASH
* linked symbol lists
*/
extern struct mne *mnehash[NHASH]; /* array of pointers to NHASH
* linked mnemonic/directive lists
*/
extern char *ep; /* pointer into error list
* array eb[NERR]
*/
extern char eb[NERR]; /* array of generated error codes
*/
extern char *ip; /* pointer into the assembler-source
* text line in ib[]
*/
extern char *ib; /* assembler-source text line for processing
*/
extern char *ic; /* assembler-source text line for listing
*/
extern char *cp; /* pointer to assembler output
* array cb[]
*/
extern char cb[NCODE]; /* array of assembler output values
*/
extern int *cpt; /* pointer to assembler relocation type
* output array cbt[]
*/
extern int cbt[NCODE]; /* array of assembler relocation types
* describing the data in cb[]
*/
extern int opcycles; /* opcode execution cycles
*/
extern char tb[NTITL]; /* Title string buffer
*/
extern char stb[NSBTL]; /* Subtitle string buffer
*/
extern char erb[NINPUT+4]; /* Error string buffer
*/
extern char symtbl[]; /* string "Symbol Table"
*/
extern char aretbl[]; /* string "Area Table"
*/
extern char module[NCPS+2]; /* module name string
*/
extern FILE *lfp; /* list output file handle
*/
extern FILE *ofp; /* relocation output file handle
*/
extern FILE *tfp; /* symbol table output file handle
*/
extern unsigned char ctype[128]; /* array of character types, one per
* ASCII character
*/
extern char ccase[128]; /* an array of characters which
* perform the case translation function
*/
/*sdas specific */
extern int asfatal; /* ASxxxx fatal error counter
*/
extern int org_cnt; /* .org directive counter
*/
extern char *optsdcc; /* sdcc compile options
*/
/*end sdas specific */
/* C Library functions */
/* for reference only
extern VOID exit();
extern int fclose();
extern char * fgets();
extern FILE * fopen();
extern int fprintf();
extern VOID free();
extern VOID longjmp();
extern VOID * malloc();
extern int printf();
extern char putc();
extern int rewind();
extern int setjmp();
extern int strcmp();
extern char * strcpy();
extern int strlen();
extern char * strncpy();
extern char * strrchr();
*/
/* Machine independent functions */
#ifdef OTHERSYSTEM
/* asmain.c */
extern FILE * afile(char *fn, char *ft, int wf);
extern VOID afilex(char *fn, char *ft);
extern VOID asexit(int i);
extern VOID asmbl(void);
extern VOID equate(char *id,struct expr *e1,a_uint equtype);
extern int fndidx(char *str);
extern int intsiz(void);
extern VOID newdot(struct area *nap);
extern VOID phase(struct area *ap, a_uint a);
extern VOID usage(int n);
/* asmcro.c */
extern char * fgetm(char *ptr, int len, FILE *fp);
extern VOID getdarg(struct mcrdef *np);
extern VOID getxarg(struct mcrdef *np);
extern VOID getxstr(char *id);
extern VOID macro(struct mcrdef * np);
extern VOID macroscn(struct macrofp *nfp);
extern int macrosub(char *id, struct macrofp *nfp);
extern VOID mcrinit(void);
extern int mcrprc(int code);
extern VOID * mhunk(void);
extern char * mstring(char *str);
extern char * mstruct(int n);
extern struct mcrdef * newdef(int code, char *id);
extern struct mcrdef * nlookup(char *id);
/* aslex.c */
extern int comma(int flag);
extern char endline(void);
extern int get(void);
extern int getdlm(void);
extern VOID getdstr(char *str, int slen);
extern VOID getid(char *id, int c);
extern int getmap(int d);
extern int getnb(void);
extern int getlnm(void);
extern VOID getst(char *id, int c);
extern int more(void);
extern int nxtline(void);
extern VOID unget(int c);
/* assym.c */
extern VOID allglob(void);
extern struct area * alookup(char *id);
extern int hash(const char *p, int flag);
extern struct sym * lookup(const char *id);
extern struct mne * mlookup(char *id);
extern char * new(unsigned int n);
extern char * strsto(const char *str);
extern int symeq(const char *p1, const char *p2, int flag);
extern VOID syminit(void);
extern VOID symglob(void);
/* assubr.c */
extern VOID aerr(void);
extern VOID diag(void);
extern VOID err(int c);
extern char * geterr(int c);
extern VOID qerr(void);
extern VOID rerr(void);
/* sdas specific */
extern VOID warnBanner(void);
/* end sdas specific */
/* asexpr.c */
extern VOID abscheck(struct expr *esp);
extern a_uint absexpr(void);
extern VOID clrexpr(struct expr *esp);
extern int digit(int c, int r);
extern VOID exprmasks(int n);
extern VOID expr(struct expr *esp, int n);
extern int is_abs(struct expr *esp);
extern int oprio(int c);
extern a_uint rngchk(a_uint n);
extern VOID term(struct expr *esp);
/* asdbg */
extern char * BaseFileName(struct asmf *currFile, int spacesToUnderscores);
extern VOID DefineNoICE_Line(void);
extern VOID DefineSDCC_Line(void);
/* aslist.c */
extern VOID list(void);
extern VOID list1(char *wp, int *wpt, int nb, int n, int f, int g);
extern VOID list2(int t);
extern VOID lstsym(FILE *fp);
extern VOID slew(FILE *fp, int flag);
/* asout.c */
extern int lobyte(a_uint v);
extern int hibyte(a_uint v);
extern int thrdbyte(a_uint v);
extern int frthbyte(a_uint v);
extern VOID out(char *p, int n);
extern VOID outarea(struct area *ap);
extern VOID outdp(struct area *carea, struct expr *esp, int r);
extern VOID outall(void);
extern VOID outdot(void);
extern VOID outbuf(char *s);
extern VOID outchk(int nt, int nr);
extern VOID outradix(void);
extern VOID outgsd(void);
extern VOID outsym(struct sym *sp);
extern VOID outab(a_uint v);
extern VOID outaw(a_uint v);
extern VOID outa3b(a_uint v);
extern VOID outa4b(a_uint v);
extern VOID outaxb(int i, a_uint v);
extern VOID outatxb(int i, a_uint v);
extern VOID outrb(struct expr *esp, int r);
extern VOID outrw(struct expr *esp, int r);
extern VOID outr3b(struct expr *esp, int r);
extern VOID outrxb(int i, struct expr *esp, int r);
extern VOID outrwm(struct expr *esp, int r, a_uint v);
extern VOID outrwp(struct expr *esp, a_uint op, a_uint mask, int jump);
extern VOID outr3bm(struct expr *esp, int r, a_uint v);
extern VOID out_lb(a_uint v, int t);
extern VOID out_lw(a_uint v, int t);
extern VOID out_l3b(a_uint v, int t);
extern VOID out_l4b(a_uint v, int t);
extern VOID out_lxb(int i, a_uint v, int t);
extern VOID out_rw(a_uint v);
extern VOID out_txb(int i, a_uint v);
/* Machine dependent variables */
extern char * cpu;
extern char * dsft;
extern struct mne mne[];
/* Machine dependent functions */
extern VOID machine(struct mne *mp);
extern VOID minit(void);
/* sdas specific */
/* strcmpi.c */
extern int as_strcmpi(const char *s1, const char *s2);
extern int as_strncmpi(const char *s1, const char *s2, size_t n);
/* end sdas specific */
#else
/* asmain.c */
extern FILE * afile();
extern VOID afilex();
extern VOID asexit();
extern VOID asmbl();
extern VOID equate();
extern int fndidx();
extern int intsiz();
extern int main();
extern VOID newdot();
extern VOID phase();
extern VOID usage();
/* asmcro.c */
extern char * fgetm();
extern VOID getdarg();
extern VOID getxarg();
extern VOID getxstr();
extern VOID macro();
extern VOID macroscn();
extern int macrosub();
extern VOID mcrinit();
extern int mcrprc();
extern VOID * mhunk();
extern char * mstring();
extern char * mstruct();
extern struct mcrdef * newdef();
extern struct mcrdef * nlookup();
/* aslex.c */
extern int comma();
extern char endline();
extern int get();
extern int getdlm();
extern VOID getdstr();
extern VOID getid();
extern int getmap();
extern int getnb();
extern int getlnm();
extern VOID getst();
extern int more();
extern int nxtline();
extern VOID unget();
/* assym.c */
extern VOID allglob();
extern struct area * alookup();
extern int hash();
extern struct sym * lookup();
extern struct mne * mlookup();
extern char * new();
extern char * strsto();
extern int symeq();
extern VOID syminit();
extern VOID symglob();
/* assubr.c */
extern VOID aerr();
extern VOID diag();
extern VOID err();
extern char * geterr();
extern VOID qerr();
extern VOID rerr();
/* sdas specific */
extern VOID warnBanner();
/* end sdas specific */
/* asexpr.c */
extern VOID abscheck();
extern a_uint absexpr();
extern VOID clrexpr();
extern int digit();
extern VOID exprmasks();
extern VOID expr();
extern int is_abs();
extern int oprio();
extern a_uint rngchk();
extern VOID term();
/* asdbg */
extern char * BaseFileName();
extern VOID DefineNoICE_Line();
extern VOID DefineSDCC_Line();
/* aslist.c */
extern VOID list();
extern VOID list1();
extern VOID list2();
extern VOID lstsym();
extern VOID slew();
/* asout.c */
extern int lobyte();
extern int hibyte();
extern int thrdbyte();
extern int frthbyte();
extern VOID out();
extern VOID outarea();
extern VOID outdp();
extern VOID outall();
extern VOID outdot();
extern VOID outbuf();
extern VOID outchk();
extern VOID outradix();
extern VOID outgsd();
extern VOID outsym();
extern VOID outab();
extern VOID outaw();
extern VOID outa3b();
extern VOID outa4b();
extern VOID outaxb();
extern VOID outatxb();
extern VOID outrb();
extern VOID outrw();
extern VOID outr3b();
extern VOID outrxb();
extern VOID outrwm();
extern VOID outrwp();
extern VOID outr3bm();
extern VOID out_lb();
extern VOID out_lw();
extern VOID out_rw();
extern VOID out_tw();
/* Machine dependent variables */
extern int hilo;
extern char * cpu;
extern char * dsft;
extern struct mne mne[];
/* Machine dependent functions */
extern VOID machine();
extern VOID minit();
/* sdas specific */
/* strcmpi.c */
extern int as_strcmpi();
extern int as_strncmpi();
/* end sdas specific */
#endif