Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1512 lines
51 KiB

/* asm86.h -- include file for microsoft 80x86 assembler
**
** microsoft (r) macro assembler
** copyright (c) microsoft corp 1986. all rights reserved
**
** randy nevin
*/
#include "asmconf.h"
#include "asmdebug.h"
#include <setjmp.h>
#ifdef MSDOS
# define PSEP '\\'
# define ALTPSEP '/'
# define BINOPEN (O_CREAT | O_TRUNC | O_WRONLY | O_BINARY)
# define BINSTDIO "b"
# define TEXTREAD (O_RDONLY | O_BINARY)
# define OBJ_EXT ".obj"
# define NLINE "\r\n"
#else
# define PSEP '/'
# define ALTPSEP '\\'
# define BINOPEN (O_CREAT | O_TRUNC | O_WRONLY)
# define BINSTDIO
# define TEXTREAD O_RDONLY
# define OBJ_EXT ".o"
# define NLINE "\n"
#endif /* MSDOS */
# ifdef MSDOS
# define DEF_OBJBUFSIZ 8
# define DEF_INCBUFSIZ 2
# define DEF_SRCBUFSIZ 8
# else
# define DEF_OBJBUFSIZ 1
# define DEF_INCBUFSIZ 1
# define DEF_SRCBUFSIZ 1
# endif /* MSDOS */
# define DEF_LISTWIDTH 79
#ifdef XENIX286
# define DEF_LISTCON TRUE
#else
# define DEF_LISTCON FALSE
#endif /* XENIX286 */
#define DEF_CREFING FALSE
#define DEF_DEBUG FALSE
#define DEF_DUMPSYM TRUE
#define DEF_LSTING FALSE
#define DEF_OBJING TRUE
#define DEF_ORIGCON FALSE
#define DEF_SEGA FALSE
#define DEF_VERBOSE FALSE
#define SYMMAX 63
#define ELSEMAX 20
#define INCLUDEMAX 10
#define PROCMAX 20
#define NUMLIN 58
#define EMITBUFSIZE 1023
#define EMITBUFMAX 1022
#define highWord(l) (*((USHORT *)&l+1))
#define LST_EXT ".lst"
#undef NULL
#define NULL 0
#define FALSE 0
#define TRUE 1
#define MAXCHR 27
#define LINEMAX 200
#define LBUFMAX 512
#define LISTMAX 32
#define TITLEWIDTH 61
#define LSTDATA 7
#define LSTMAX 25
#define ESSEG 0
#define CSSEG 1
#define SSSEG 2
#define DSSEG 3
#define FSSEG 4
#define GSSEG 5
#define NOSEG 6
#define FH_CLOSED -1 /* Used to mark a file temporarily closed */
/* scanatom positioning options */
#define SCEND 0 /* position at end of token */
#define SCSKIP 1 /* position at end of white space */
/* case sensitivity flags */
#define CASEU 0 /* force case to upper case */
#define CASEL 1 /* leave symbol case alone */
#define CASEX 2 /* force all symbols except EXTRN and PUBLIC to upper */
/* opcode types */
#define PGENARG 0 /* general two argument opcodes */
#define PCALL 1 /* call */
#define PJUMP 2 /* jump */
#define PSTACK 3 /* stack manipulation */
#define PRETURN 4 /* return */
#define PRELJMP 5 /* relative jumps */
#define PNOARGS 6 /* no argument opcodes */
#define PREPEAT 7 /* repeat */
#define PINCDEC 8 /* increment/decrement */
#define PINOUT 9 /* in/out */
#define PARITH 10 /* arithmetic opcodes */
#define PESC 11 /* escape */
#define PXCHG 12 /* exchange */
#define PLOAD 13 /* load */
#define PMOV 14 /* moves */
#define PSHIFT 15 /* shifts */
#define PXLAT 16 /* translate */
#define PSTR 17 /* string */
#define PINT 18 /* interrupt */
#define PENTER 19 /* enter */
#define PBOUND 20 /* bounds */
#define PCLTS 21 /* */
#define PDESCRTBL 22 /* */
#define PDTTRSW 23 /* */
#define PARSL 24 /* */
#define PARPL 25 /* */
#define PVER 26 /* */
#define PMOVX 27 /* movzx, movsx */
#define PSETCC 28 /* setle, setge, etc */
#define PBIT 29 /* bt, bts, etc */
#define PBITSCAN 30 /* bsf, bsr */
/* leave some room */
#define OPCODPARSERS 37 /* number of non 8087/286 parsers */
/* fltparsers, 8087 opcode types */
#define FNOARGS 37
#define F2MEMSTK 38
#define FSTKS 39
#define FMEMSTK 40
#define FSTK 41
#define FMEM42 42
#define FMEM842 43
#define FMEM4810 44
#define FMEM2 45
#define FMEM14 46
#define FMEM94 47
#define FWAIT 48
#define FBCDMEM 49
/* masks for opcode types */
#define M_PGENARG (1L << PGENARG)
#define M_PCALL (1L << PCALL)
#define M_PJUMP (1L << PJUMP)
#define M_PSTACK (1L << PSTACK)
#define M_PRETURN (1L << PRETURN)
#define M_PRELJMP (1L << PRELJMP)
#define M_PNOARGS (1L << PNOARGS)
#define M_PREPEAT (1L << PREPEAT)
#define M_PINCDEC (1L << PINCDEC)
#define M_PINOUT (1L << PINOUT)
#define M_PARITH (1L << PARITH)
#define M_PESC (1L << PESC)
#define M_PXCHG (1L << PXCHG)
#define M_PLOAD (1L << PLOAD)
#define M_PMOV (1L << PMOV)
#define M_PSHIFT (1L << PSHIFT)
#define M_PXLAT (1L << PXLAT)
#define M_PSTR (1L << PSTR)
#define M_PINT (1L << PINT)
#define M_PENTER (1L << PENTER)
#define M_PBOUND (1L << PBOUND)
#define M_PCLTS (1L << PCLTS)
#define M_PDESCRTBL (1L << PDESCRTBL)
#define M_PDTTRSW (1L << PDTTRSW)
#define M_PARSL (1L << PARSL)
#define M_PARPL (1L << PARPL)
#define M_PVER (1L << PVER)
/* dkind */
/* low 4 bits reserved for dkinds 0-15 reseved for .model */
#define NL 0
#define IGNORECASE 0x10 /* ignorecase for if's */
#define BLKBEG 0x20 /* macro */
#define CONDBEG 0x40 /* condition */
#define CONDCONT 0x80 /* elseif */
/* assembler directive types */
#define TNAME 1
#define TPUBLIC 2
#define TEXTRN 3
#define TEND 4
#define TORG 5
#define TEVEN 6
#define TPURGE 7
#define TPAGE 8
#define TRADIX 9
#define TLIST 10
#define TXLIST 11
#define TLALL 12
#define TXALL 13
#define TSALL 14
#define TCREF 15
#define TXCREF 16
#define TTFCOND 17
#define TLFCOND 18
#define TSFCOND 19
#define TIF 20
#define TIFE 21
#define TIFDEF 22
#define TIFNDEF 23
#define TIFDIF 24
#define TIFIDN 25
#define TIF1 26
#define T8086 27
#define T8087 28
#define T287 29
#define T186 30
#define T286C 31
#define T286P 32
#define TLOCAL 33
#define TIF2 34
#define TIFNB 35
#define TIFB 36
#define TENDIF 37
#define TIRP 38
#define TIRPC 39
#define TREPT 40
#define TENDM 41
#define TERR 42
#define TERR1 43
#define TERR2 44
#define TERRB 45
#define TERRDEF 46
#define TERRDIF 47
#define TERRE 48
#define TERRNZ 49
#define TERRIDN 50
#define TERRNB 51
#define TERRNDEF 52
#define T386C 53
#define T386P 54
#define T387 55
#define TALIGN 56
#define TASSUME 57
#define TFPO 99
/* 1st only */
#define TEXITM 60
#define TINCLUDE 61
#define TSUBTTL 62
#define TELSE 63
#define TTITLE 64
#define TCOMMENT 65
#define TOUT 66
/* 1st or 2nd */
/* note that TDW has to be the last in the group */
#define TDB 70
#define TDD 71
#define TDQ 72
#define TDT 73
#define TDF 74
#define TDW 75
/* 2nd only */ /* note--datadsize assumes TDx and TMACRO are adjacent */
#define TMACRO 76
#define TEQU 77
#define TSUBSTR 78
#define TCATSTR 79
#define TSIZESTR 80
#define TINSTR 81
#define TSEGMENT 82
#define TENDS 83
#define TPROC 84
#define TENDP 85
#define TGROUP 86
#define TLABEL 87
#define TSTRUC 88
#define TRECORD 89
/* other directives */
#define TSEQ 90
#define TALPHA 91
#define TMODEL 92
#define TMSEG 93
#define TMSTACK 94
#define TDOSSEG 95
#define TINCLIB 96
#define TCOMM 97
#define TMSFLOAT 98
#ifdef MSDOS
#define ERRFILE stdout
#else
#define ERRFILE stderr
#endif
/* operator list */
#define OPLENGTH 0
#define OPSIZE 1
#define OPWIDTH 2
#define OPMASK 3
#define OPOFFSET 4
#define OPSEG 5
#define OPTYPE 6
#define OPSTYPE 7
#define OPTHIS 8
#define OPHIGH 9
#define OPLOW 10
#define OPNOT 11
#define OPSHORT 12
#define OPAND 13
#define OPEQ 14
#define OPGE 15
#define OPGT 16
#define OPLE 17
#define OPLT 18
#define OPMOD 19
#define OPNE 20
#define OPOR 21
#define OPPTR 22
#define OPSHL 23
#define OPSHR 24
#define OPXOR 25
#define OPNOTHING 26
#define OPDUP 27
#define OPLPAR 28
#define OPRPAR 29
#define OPLANGBR 30
#define OPRANGBR 31
#define OPLBRK 32
#define OPRBRK 33
#define OPDOT 34
#define OPCOLON 35
#define OPMULT 36
#define OPDIV 37
#define OPPLUS 38
#define OPMINUS 39
#define OPUNMINUS 40
#define OPUNPLUS 41
/* processor types */
#define P86 0x01 /* all 8086/8088 instructions */
#define P186 0x02 /* + 186 */
#define P286 0x04 /* + 286 unprotected */
#define FORCEWAIT 0x10 /* keep FWAIT on these 287 instructions */
#define PROT 0x80 /* protected mode instructions */
/* See also F_W, S_W in asmtab.h */
/* For NT the .MSFLOAT keyword has been removed */
/* Therefore PXNONE can't be set (Jeff Spencer 11/2/90) */
#define PXNONE 0x00 /* MSFLOAT, no coprocessor */
#define PX87 0x01 /* 8087 */
#define PX287 0x04 /* 80287 */
#define PX387 0x08 /* 80387 */
#ifdef V386
#define P386 0x08 /* + 386 unprotected */
#endif
/* cross-reference information */
#define CREFEND 0 /* member of enumerated set */
#define REF 1 /* member of enumerated set */
#define DEF 2 /* member of enumerated set */
#define CREFINF 3 /* number of cross reference types */
/* cross-reference selection */
#define CREF_SINGLE 1 /* generate single file cross reference */
#define CREF_MULTI 2 /* generate multiple file cross reference */
/* Symbol reference type */
#define REF_NONE 0 /* symbol reference type is none */
#define REF_READ 1 /* symbol reference type is read */
#define REF_WRITE 2 /* symbol reference type is write */
#define REF_XFER 3 /* symbol reference type is jump */
#define REF_OTHER 4 /* symbol reference type is other */
/* number of arguments for opcodes */
#define NONE 0 /* no arguments */
#define MAYBE 1 /* may have arguments */
#define ONE 2 /* one argument */
#define TWO 3 /* two arguments */
#define VARIES 4 /* variable number */
/* opcode argument class */
#define FIRSTDS 0
#define SECONDDS 1
#define STRINGOPCODE 2
/* symbol attributes */
#define CDECL_ 0
#define XTERN 1
#define DEFINED 2
#define MULTDEFINED 3
#define NOCREF 4
#define BACKREF 5
#define PASSED 6
#define GLOBAL 7
/* masks for attributes */
#define M_GLOBAL (1 << GLOBAL)
#define M_XTERN (1 << XTERN)
#define M_DEFINED (1 << DEFINED)
#define M_MULTDEFINED (1 << MULTDEFINED)
#define M_NOCREF (1 << NOCREF)
#define M_BACKREF (1 << BACKREF)
#define M_PASSED (1 << PASSED)
#define M_CDECL (1 << CDECL_)
/* symbol kinds */
#define SEGMENT 0
#define GROUP 1
#define CLABEL 2
#define PROC 3
#define REC 4
#define STRUC 5
#define EQU 6
#define DVAR 7
#define CLASS 8
#define RECFIELD 9
#define STRUCFIELD 10
#define MACRO 11
#define REGISTER 12
/* masks for symbol kinds */
#define M_SEGMENT (1 << SEGMENT)
#define M_GROUP (1 << GROUP)
#define M_CLABEL (1 << CLABEL)
#define M_PROC (1 << PROC)
#define M_REC (1 << REC)
#define M_STRUC (1 << STRUC)
#define M_EQU (1 << EQU)
#define M_DVAR (1 << DVAR)
#define M_CLASS (1 << CLASS)
#define M_RECFIELD (1 << RECFIELD)
#define M_STRUCFIELD (1 << STRUCFIELD)
#define M_MACRO (1 << MACRO)
#define M_REGISTER (1 << REGISTER)
/* Special values for symtype - which normaly is the size of the type */
#define CSNEAR ((USHORT)(~0)) /* type for near proc/label */
#define CSNEAR_LONG ((long)(~0)) /* For use after CSNEAR has been sign extened */
#define CSFAR ((USHORT)(~1)) /* .. far .. */
#define CSFAR_LONG ((long)(~1)) /* .. far .. */
/* equ types */
#define ALIAS 0
#define TEXTMACRO 1
#define EXPR 2
/* register kinds */
#define BYTREG 0 /* byte register */
#define WRDREG 1 /* word register */
#define SEGREG 2 /* segment register */
#define INDREG 3 /* index register */
#define STKREG 4 /* stack register */
#ifdef V386
#define DWRDREG 5 /* double word register */
#define CREG 6 /* 386 control, debug, or test register */
#endif
/* masks for register kinds */
#define M_BYTREG (1 << BYTREG)
#define M_WRDREG (1 << WRDREG)
#define M_SEGREG (1 << SEGREG)
#define M_INDREG (1 << INDREG)
#define M_STKREG (1 << STKREG)
#ifdef V386
#define M_DWRDREG (1 << DWRDREG)
#define M_CREG (1 << CREG)
#endif
/* source type */
#define RREADSOURCE 0 /* read line from file */
#define RMACRO 1 /* macro expansion */
/* source line handlers */
#define HPARSE 0 /* parse line */
#define HMACRO 1 /* build macro */
#define HIRPX 2 /* build irp/irpx */
#define HCOMMENT 3 /* copy comment lines */
#define HSTRUC 4 /* build struc definition */
/* codeview debugging obj generation */
#define CVNONE 0
#define CVLINE 1
#define CVSYMBOLS 2
/* Predefined type index component parts for codeview*/
#define BT_UNSIGNED 1 /* Basic types */
#define BT_REAL 2
#define BT_ASCII 5
#define BT_DIRECT 0 /* Address type */
#define BT_NEARP 1
#define BT_FARP 2
#define BT_sz1 0 /* Size */
#define BT_sz2 1
#define BT_sz4 2
#define makeType(type, mode, size) (0x0080 | mode << 5 | type << 2 | size)
#define isCodeLabel(pSY) (pSY->symtype >= CSFAR)
/* tags for fProcArgs, controls frame building*/
#define ARGS_NONE 0 /* no arguments */
#define ARGS_REG 1 /* register save list */
#define ARGS_PARMS 2 /* parms present */
#define ARGS_LOCALS 3 /* locals present */
#define CLANG 1 /* langType tag for C */
#define STRUC_INIT -1 /* special mark for clabel.proclen to indicate
* a structure initialization */
/* listing type */
#define SUPPRESS 0
#define LISTGEN 1
#define LIST 2
/* parameter types */
#define CHRTXT 0
#define PLIST 1
#define MACROS 2
/* type of entry on parse stack */
#define OPERATOR 0
#define OPERAND 1
#define ENDEXPR 2
/* okind */
#define ICONST 0
#define ISYM 1
#define IUNKNOWN 2
#define ISIZE 3
#define IRESULT 4
/* ftype */
#define FORREF 1 /* symbol is forward reference */
#define UNDEFINED 2 /* symbol is undefined */
#define KNOWN 4 /* symbol is known */
#define XTERNAL 8 /* symbol is external */
#define INDETER 10 /* symbol value is indeterminate */
/* tset */
#define UNKNOWN 0
#define HIGH 1
#define LOW 2
#define DATA 3
#define CODE 4
#define RCONST 5
#define REGRESULT 6
#define SHRT 7 /* Was SHORT, but that conflicted with the type */
#define SEGRESULT 8
#define GROUPSEG 9
#define FORTYPE 10
#define PTRSIZE 11
#define EXPLOFFSET 12
#define FLTSTACK 13
#define EXPLCOLON 14
#define STRUCTEMPLATE 15
/* masks for above */
#define M_UNKNOWN (1 << UNKNOWN) // 0x0001
#define M_HIGH (1 << HIGH) // 0x0002
#define M_LOW (1 << LOW) // 0x0004
#define M_DATA (1 << DATA) // 0x0008
#define M_CODE (1 << CODE) // 0x0010
#define M_RCONST (1 << RCONST) // 0x0020
#define M_REGRESULT (1 << REGRESULT) // 0x0040
#define M_SHRT (1 << SHRT) // 0x0080
#define M_SEGRESULT (1 << SEGRESULT) // 0x0100
#define M_GROUPSEG (1 << GROUPSEG) // 0x0200
#define M_FORTYPE (1 << FORTYPE) // 0x0400
#define M_PTRSIZE (1 << PTRSIZE) // 0x0800
#define M_EXPLOFFSET (1 << EXPLOFFSET) // 0x1000
#define M_FLTSTACK (1 << FLTSTACK) // 0x2000
#define M_EXPLCOLON (1 << EXPLCOLON) // 0x4000
#define M_STRUCTEMPLATE ((USHORT)(1 << STRUCTEMPLATE)) // 0x8000
/* fixup types */
#define FPOINTER 0 /* four bytes offset and segment */
#define FOFFSET 1 /* two bytes relative to context */
#define FBASESEG 2 /* two bytes segment address */
#define FGROUPSEG 3 /* two bytes segment address of group */
#define FCONSTANT 4 /* one or two bytes of constant data */
#define FHIGH 5 /* one byte high part of offset */
#define FLOW 6 /* one byte low part of offset */
#define FNONE 7 /* no offset */
#ifndef V386
#define FIXLIST 8 /* number of fixup types */
#else
#define F32POINTER 8 /* 6 bytes offset and segment--for 386 */
#define F32OFFSET 9 /* 4 bytes offset--for 386 */
#define DIR32NB 10 /* DIR32NB fixup type for FPO */
#define FIXLIST 11 /* number of fixup types */
#endif
/* masks for fixup types */
#define M_F32POINTER (1 << F32POINTER)
#define M_F32OFFSET (1 << F32OFFSET)
#define M_FPOINTER (1 << FPOINTER)
#define M_FOFFSET (1 << FOFFSET)
#define M_FBASESEG (1 << FBASESEG)
#define M_FGROUPSEG (1 << FGROUPSEG)
#define M_FCONSTANT (1 << FCONSTANT)
#define M_FHIGH (1 << FHIGH)
#define M_FLOW (1 << FLOW)
#define M_FNONE (1 << FNONE)
/* record for DUP lists */
#define NEST 0 /* Dup item is nested */
#define ITEM 1 /* Dup item is regular size */
#define LONG 2 /* Dup item is long size */
/* assembler exit codes */
#define EX_NONE 0 /* no error */
#define EX_ARGE 1 /* argument error */
#define EX_UINP 2 /* unable to open input file */
#define EX_ULST 3 /* unable to open listing file */
#define EX_UOBJ 4 /* unable to open object file */
#define EX_UCRF 5 /* unable to open cross reference file */
#define EX_UINC 6 /* unable to open include file */
#define EX_ASME 7 /* assembly errors */
#define EX_MEME 8 /* memory allocation error */
#define EX_REAL 9 /* real number input not allowed */
#define EX_DSYM 10 /* error defining symbol from command line */
#define EX_INT 11 /* assembler interrupted */
#define TERMINATE(message, exitCode)\
terminate( (SHORT)((exitCode << 12) | message), NULL, NULL, NULL )
#define TERMINATE1(message, exitCode, a1)\
terminate( (SHORT)((exitCode << 12) | message), a1, NULL, NULL )
/* Bit flags or'ed into the error numbers */
#define E_WARN1 ((USHORT)(1 << 12)) /* level 1 warning */
#define E_WARN2 ((USHORT)(2 << 12)) /* level 2 warning */
#define E_PASS1 ((USHORT)(8 << 12)) /* pass 1 error */
#define E_ERRMASK 0x0fff /* low 12 bits contain error code */
/* error code definitions */
#define E_BNE 1 /* block nesting error */
#define E_ECL (2|E_WARN1) /* extra characters on line */
#define E_RAD (3|E_PASS1) /* ?register already defined */
#define E_UST 4 /* unknown type specifier */
#define E_RSY (5|E_PASS1) /* redefinition of symbol */
#define E_SMD 6 /* symbol multiply defined */
#define E_PHE 7 /* phase error */
#define E_ELS 8 /* already had ELSE clause */
#define E_NCB 9 /* not in conditional block */
#define E_SND 10 /* symbol not defined */
#define E_SYN 11 /* syntax error */
#define E_TIL 12 /* type illegal in context */
#define E_NGR 13 /* need group name */
#define E_PS1 (14|E_PASS1) /* must be declared in pass 1 */
#define E_TUL 15 /* symbol type usage illegal */
#define E_SDK 16 /* symbol already different kind */
#define E_RES (17|E_WARN1) /* symbol is reserved word */
#define E_IFR (18|E_PASS1) /* forward reference is illegal */
#define E_MBR 19 /* must be register */
#define E_WRT 20 /* wrong register type */
#define E_MSG 21 /* must be segment or group */
/*#define E_SNS 22 obsolete: symbol has no segment */
#define E_MSY 23 /* must be symbol type */
#define E_ALD 24 /* already locally defined */
#define E_SPC 25 /* segment parameters changed */
#define E_NPA 26 /* not proper align /combine type */
#define E_RMD 27 /* reference to multiply defined */
#define E_OPN 28 /* operand was expected */
#define E_OPR 29 /* operator was expected */
#define E_DVZ 30 /* division by 0 or overflow */
#define E_SCN 31 /* shift count negative */
#define E_OMM (32|E_WARN1) /* operand types must match */
#define E_IUE 33 /* illegal use of external */
/*#define E_RFM 34 obsolete: must be record field name */
#define E_RRF 35 /* must be record or fieldname */
#define E_OHS 36 /* operand must have size */
#define E_NOP (37|E_WARN2) /* nops generated */
#define E_LOS 39 /* left operand must have segmnt */
#define E_OOC 40 /* one operand must be constant */
#define E_OSA 41 /* operands must be same or 1 abs*/
/*#define E_NOE 42 obsolete: normal type operand expected */
#define E_CXP 43 /* constant was expected */
#define E_OSG 44 /* operand must have segment */
#define E_ASD 45 /* must be associated with data */
#define E_ASC 46 /* must be associated with code */
#define E_DBR 47 /* already have base register */
#define E_DIR 48 /* already have index register */
#define E_IBR 49 /* must be index or base register*/
#define E_IUR 50 /* illegal use of register */
#define E_VOR 51 /* value out of range */
#define E_NIP 52 /* operand not in IP segment */
#define E_IOT 53 /* improper operand type */
#define E_JOR 54 /* relative jump out of range */
/*#define E_IDC 55 obsolete: index displ must be constant */
#define E_IRV 56 /* illegal register value */
#define E_NIM 57 /* no immediate mode */
#define E_IIS (58|E_WARN1) /* illegal size for item */
#define E_BRI 59 /* byte register is illegal */
#define E_CSI 60 /* CS register illegal usage */
#define E_AXL 61 /* must be AX or AL */
#define E_ISR 62 /* improper use of segment reg */
#define E_NCS 63 /* no or unreachable CS */
#define E_OCI 64 /* operand combination illegal */
#define E_JCD 65 /* near JMP /CALL to differend CS */
#define E_NSO 66 /* label can't have seg override */
#define E_OAP 67 /* must have opcode after prefix */
#define E_OES 68 /* can't override ES segment */
#define E_CRS 69 /* can't reach with segment reg */
#define E_MSB 70 /* must be in segment block */
#define E_NEB 71 /* can't use EVEN or BYTE seg */
#define E_FOF 72 /* forward needs override or far */
#define E_IDV 73 /* illegal value for DUP count */
#define E_SAE 74 /* symbol already external */
#define E_DTL 75 /* DUP too large for linker */
#define E_UID 76 /* usage of ?(indeterminate) bad */
#define E_MVD 77 /* more values than defined with */
#define E_OIL 78 /* only initialize list legal */
#define E_DIS 79 /* directive illegal in struc */
#define E_ODI 80 /* override with DUP is illegal */
#define E_FCO 81 /* fields cannot be overriden */
/*#define E_RFR 83 obsolete: register can't be forward ref */
#define E_CEA 84 /* circular chain of EQU aliases */
#define E_7OE 85 /* 8087 opcode can't be emulated */
#define E_EOF (86|E_PASS1|E_WARN1) /* end of file, no END directive */
#define E_ENS 87 /* data emitted with no segment */
#define E_EP1 88 /* error if pass1 */
#define E_EP2 89 /* error if pass2 */
#define E_ERR 90 /* error */
#define E_ERE 91 /* error if expr = 0 */
#define E_ENZ 92 /* error if expr != 0 */
#define E_END 93 /* error if symbol not defined */
#define E_ESD 94 /* error if symbol defined */
#define E_EBL 95 /* error if string blank */
#define E_ENB 96 /* error if string not blank */
#define E_EID 97 /* error if strings identical */
#define E_EDF 98 /* error if strings different */
#define E_OWL 99 /* overide is too long */
#define E_LTL (100|E_PASS1)/* line too long */
#define E_IMP (101|E_WARN1)/* impure memory reference */
#define E_MDZ (102|E_WARN1)/* missing data; zero assumed */
#define E_286 (103|E_WARN1)/* segment near (or at) 64K limit*/
#define E_AP2 104 /* Align must be power of 2 */
#define E_JSH (105|E_WARN2)/* shortened jump (warning) */
#define E_EXP 106 /* expected "<what was expected>"*/
#define E_LNL 107 /* line too long */
#define E_NDN 108 /* non-digit in number */
#define E_EMS 109 /* empty string */
#define E_MOP 110 /* missing operand */
#define E_PAR 111 /* open parenthesis or bracket */
#define E_NMC 112 /* not in macro expansion */
#define E_UEL 113 /* unexpected end of line */
#define E_CPU 114 /* can't change cpu type after first segment */
#define E_ONW (115|E_WARN2)/* operand size does not match wordsize (warning) */
#define E_ANW (116|E_WARN2)/* address size does not match wordsize (warning) */
#define E_INC (117|E_PASS1)/* include file not found */
#define E_FPO1 (118|E_PASS1)
#define E_FPO2 (119|E_WARN1)
#define E_MAX 120 /* number of error messages */
/* symbol name entry */
struct idtext {
SHORT hashval; /* value of hash function */
char id[1]; /* name */
};
/* parse stack entry */
struct dscrec {
DSCREC *previtem; /* previous item on stack */
UCHAR prec; /* precedence */
char itype; /* type of entry */
union {
/* OPERAND */
struct psop {
SYMBOL FARSYM *dsegment; /* segment of result */
SYMBOL FARSYM *dcontext; /* context(CS) of label
or current segment register*/
SYMBOL FARSYM *dextptr; /* pointer to external */
USHORT dlength;
USHORT rm; /* register/index mode */
USHORT dtype; /* copy of dtype */
OFFSET doffset; /* offset */
USHORT dsize; /* size */
char mode; /* mode bits */
char w; /* word/byte mode */
char s; /* sign extend */
char sized; /* TRUE if has size */
char seg; /* segment register, etc */
char dflag; /* copy of dflag */
char fixtype; /* fixup type */
char dsign;
} opnd;
/* OPERATOR */
struct {
char oidx;
} opr;
} dsckind;
};
/* record for dup list */
struct duprec {
struct duprec FARSYM *itemlst; /* list of items to dup */
OFFSET rptcnt; /* number of times to repeat */
USHORT itemcnt; /* number of duprecs in itemlist */
USHORT type; /* data type for codeview */
char decltype; /* STRUC data declaration type */
char dupkind; /* dup type */
union {
/* NEXT */
struct {
struct duprec FARSYM *dup;
} dupnext;
/* ITEM */
struct {
DSCREC *ddata;
} dupitem;
/* LONG */
struct {
char *ldata;
UCHAR llen;
} duplong;
} duptype;
};
/* symbol entry */
struct symb {
SYMBOL FARSYM *next; /* pointer to next symbol */
SYMBOL FARSYM *alpha; /* pointer to next symbol alpha ordered */
SYMBOL FARSYM *symsegptr; /* pointer to segment entry for symbol */
NAME FAR *nampnt; /* pointer to name structure */
NAME *lcnamp; /* pointer to lower case name structure */
OFFSET offset;
USHORT length;
USHORT symtype; /* DB .. DT plus NEAR/FAR */
UCHAR attr; /* GLOBAL .. LOCALSYM */
char symkind; /* SEGMENT .. REGISTER */
union {
/* SEGMENT */
struct symbseg {
USHORT segIndex; /* must be first */
SYMBOL FARSYM *segordered;
SYMBOL FARSYM *lastseg;
SYMBOL FARSYM *grouptr;
SYMBOL FARSYM *nxtseg;
SYMBOL FARSYM *classptr;
OFFSET seglen;
OFFSET locate;
USHORT lnameIndex; /* for class aliaes */
char align;
char combine;
char use32;
char hascode;
} segmnt;
/* GROUP */
struct symbgrp {
USHORT groupIndex; /* must be first */
SYMBOL FARSYM *segptr;
} grupe;
/* CLABEL */
struct symbclabel {
USHORT type; /* type index, for codeview */
SYMBOL FARSYM *csassume;
USHORT iProc; /* procedure index belonging to */
} clabel;
/* PROC */
struct symbproc {
USHORT type; /* type index, for codeview */
SYMBOL FARSYM *csassume;
USHORT proclen;
SYMBOL FARSYM *pArgs; /* arguments and locals */
} plabel;
/* extern (code & data), comm & class (known as DVAR) */
struct symbext {
USHORT extIndex; /* must be first */
SYMBOL FARSYM *csassume;
OFFSET length; /* so comms > 64K */
UCHAR commFlag; /* used for comm defs */
} ext;
/* EQU */
struct symbequ {
char equtyp;
USHORT iProc; /* procedure index belonging to */
union {
/* ALIAS */
struct {
SYMBOL FARSYM *equptr;
} alias;
/* TEXTMACRO */
struct {
char *equtext;
USHORT type; /* CV type for parms/locals */
} txtmacro;
/* EXPR */
struct {
SYMBOL FARSYM *eassume;
char esign;
} expr;
} equrec;
} equ;
/* RECFIELD */
struct symbrecf {
SYMBOL FARSYM *recptr;
SYMBOL FARSYM *recnxt;
OFFSET recinit; /* Initial Value */
OFFSET recmsk; /* bit mask */
char recwid; /* with in bits */
} rec;
/* STRUCFIELD */
struct symbstrucf {
SYMBOL FARSYM *strucnxt;
USHORT type;
} struk;
/* REC, STRUC, MACRO */
struct symbrsm {
union {
/* REC */
struct {
SYMBOL FARSYM *reclist;
char recfldnum;
} rsmrec;
/* STRUC */
struct {
SYMBOL FARSYM *struclist;
struct duprec FARSYM *strucbody;
USHORT strucfldnum;
USHORT type;
USHORT typePtrNear;
USHORT typePtrFar;
} rsmstruc;
/* MACRO */
struct {
TEXTSTR FAR *macrotext;
UCHAR active;
UCHAR delete;
UCHAR parmcnt;
UCHAR lclcnt;
} rsmmac;
} rsmtype;
} rsmsym;
/* REGISTER */
struct symbreg {
char regtype;
} regsym;
} symu;
};
/* textstring descriptor */
struct textstr {
TEXTSTR FAR *strnext; /* next string in list */
char size; /* allocated size */
char text[1]; /* text of string */
};
typedef union PV_u {
char *pActual; /* pointer to actual parm value */
char localName[4]; /* or local name cache */
} PV;
typedef struct MC_s { /* Macro parameter build/call struct */
TEXTSTR FAR *pTSHead; /* Head of linked body lines */
TEXTSTR FAR *pTSCur; /* Current body line */
UCHAR flags; /* macro type */
UCHAR iLocal; /* index of first local */
USHORT cbParms; /* byte count of parms string */
USHORT localBase; /* first local # to use */
USHORT count; /* count of excution loops */
char *pParmNames; /* parameter names during build */
char *pParmAct; /* actual parm names during expansion*/
char svcondlevel; /* condlevel at macro call */
char svlastcondon; /* lastcondon at macro call */
char svelseflag; /* elseflag at macro call */
PV rgPV[1]; /* parm index to point to actual */
} MC;
/* data descriptor entry */
struct dsr {
DSCREC *valrec;
struct duprec FARSYM *dupdsc;
char longstr;
char flag;
char initlist;
char floatflag;
char *dirscan;
OFFSET i;
};
struct eqar {
SYMBOL FARSYM *equsym;
DSCREC *dsc;
UCHAR *dirscan;
UCHAR svcref;
};
struct datarec {
OFFSET datalen;
USHORT type;
SYMBOL FARSYM *labelptr;
char buildfield;
};
struct fileptr {
FILE *fil;
struct fileptr *prevfil;
short line;
char *name;
};
struct objfile {
int fh;
char FARIO *pos;
char FARIO *buf;
SHORT cnt;
SHORT siz;
char *name;
};
/* BUFFER CONTROL BLOCK - Information concerning a file buffer */
#ifdef BCBOPT
typedef struct BCB {
struct BCB * pBCBNext; /* next BCB for file */
struct BCB * pBCBPrev; /* last BCB allocated */
char FARIO * pbuf; /* pointer to buffer */
long filepos; /* current position in file */
char fInUse; /* Set during pass 2 if buffer is active */
} BCB;
#endif
/* FCB - Information concerning a particular file */
typedef struct FCB {
int fh; /* file handle */
long savefilepos; /* file position if file closed temporarily */
struct FCB * pFCBParent; /* parent file */
struct FCB * pFCBChild; /* child file (bi-directional linked list */
#ifdef BCBOPT
struct FCB * pFCBNext; /* next file to be opened */
BCB * pBCBFirst; /* first BCB for file */
BCB * pBCBCur; /* current BCB for file */
#endif
char FARIO * pbufCur; /* read/write loc in current buffer */
char FARIO * ptmpbuf; /* current position in temp read buffer */
char FARIO * buf; /* temporary read buffer */
USHORT ctmpbuf; /* count of bytes in temporary buffer */
USHORT cbbuf; /* size of buffer */
USHORT cbufCur; /* count of bytes in current buffer */
USHORT line; /* current line number */
char fname[1]; /* file name */
} FCB;
typedef struct FASTNAME {
UCHAR * pszName; /* text of the name, upper case if appropriate */
UCHAR * pszLowerCase; /* Mixed case version of pszName */
USHORT usHash; /* hash value of string in pszName */
UCHAR ucCount; /* length of the name */
} FASTNAME;
// Used to store real number initializers
struct realrec {
UCHAR num[10];
USHORT i;
};
/* Used to parse and generate CODE for 8086 opcodes */
struct parsrec {
DSCREC *op1;
DSCREC *op2;
UCHAR bytval;
USHORT wordval;
DSCREC *dsc1;
DSCREC *dsc2;
UCHAR defseg;
char *dirscan;
char svxcref;
};
struct evalrec {
struct ar *p;
char parenflag;
char evalop;
char curitem;
char idx;
DSCREC *curoper;
};
struct exprec {
struct evalrec *p;
DSCREC *valright;
DSCREC *valleft;
UCHAR stkoper;
USHORT t;
OFFSET left;
OFFSET right;
};
struct fltrec {
UCHAR fseg;
char args;
USHORT stknum;
USHORT stk1st;
};
/* reg initialization data */
struct mreg {
char nm[4];
UCHAR rt;
UCHAR val;
};
typedef struct _FPO_DATA {
unsigned long ulOffStart; // offset 1st byte of function code
unsigned long cbProcSize; // # bytes in function
unsigned long cdwLocals; // # bytes in locals/4
unsigned short cdwParams; // # bytes in params/4
unsigned short cbProlog : 8; // # bytes in prolog
unsigned short cbRegs : 3; // # regs saved
unsigned short fHasSEH : 1; // TRUE if SEH in func
unsigned short fUseBP : 1; // TRUE if EBP has been allocated
unsigned short reserved : 1; // reserved for future use
unsigned short cbFrame : 2; // frame type
} FPO_DATA, *PFPO_DATA;
typedef struct _FPOSTRUCT {
struct _FPOSTRUCT *next;
FPO_DATA fpoData;
SYMBOL *pSym;
SYMBOL *pSymAlt;
USHORT extidx;
} FPOSTRUCT, *PFPOSTRUCT;
#ifndef ASMGLOBAL
# if defined M8086OPT
extern UCHAR *naim;
extern UCHAR *svname;
# else
extern FASTNAME naim;
extern FASTNAME svname;
# endif
extern UCHAR X87type;
extern char ampersand;
extern char addplusflagCur;
extern char baseName[];
extern char caseflag;
extern char checkpure;
extern char condflag;
extern OFFSET cbProcLocals;
extern OFFSET cbProcParms;
extern UCHAR cpu;
extern UCHAR cputype;
extern UCHAR crefinc;
extern char crefing;
extern char crefnum[];
extern char crefopt;
extern UCHAR creftype;
extern char wordszdefault;
extern char emittext; /* emit linker test if true */
extern char debug; /* true if debug set */
extern USHORT dirsize[];
extern char displayflag;
extern char dumpsymbols; /* do symbol table display if true */
extern char dupflag;
extern char elseflag;
extern char emulatethis;
extern char endbody;
extern char equdef; /* TRUE if equ already defined */
extern char equflag;
extern char equsel;
extern USHORT errorlineno;
extern char exitbody;
extern char expandflag;
extern char fDosSeg;
extern char fSimpleSeg;
extern char fCheckRes;
extern UCHAR fCrefline;
extern char fNeedList;
extern char fProcArgs;
extern USHORT fPass1Err;
extern char f386already;
extern char fArth32;
extern char fSkipList;
extern char fSecondArg;
extern char farData[];
extern char fltemulate;
extern UCHAR fKillPass1;
extern jmp_buf forceContext;
extern char generate;
extern UCHAR goodlbufp;
extern char impure;
extern USHORT iProcCur;
extern USHORT iProc;
extern char inclcnt;
extern char inclFirst;
extern SHORT iRegSave;
extern char *inclpath[];
extern char initflag;
extern char labelflag;
extern SHORT handler;
extern char lastreader;
extern char linebuffer[];
extern char *linebp;
extern char lbuf[];
extern char *lbufp;
extern SHORT langType;
extern char listbuffer[];
extern char listblank [];
extern char listconsole;
extern char listed;
extern char listflag;
extern char listindex;
extern char listquiet;
extern char localflag;
extern char loption;
extern char lsting;
extern char moduleflag;
extern USHORT nestCur;
extern USHORT nestMax;
extern char noexp;
extern char objectascii[];
extern char objing;
extern char opctype;
extern char opertype;
extern char opkind;
extern char optyp;
extern char origcond;
extern char *pText, *pTextEnd;
extern SYMBOL FARSYM *pStrucCur;
extern SYMBOL FARSYM *pStrucFirst;
extern char pass2; /* true if in pass 2 */
extern char popcontext;
extern char radix; /* assumed radix base */
extern char radixescape;
extern char resvspace;
extern char save[];
extern char segalpha;
extern char segtyp;
extern char strucflag;
extern char subttlbuf[];
extern char swaphandler;
extern char titlebuf[];
extern char titleflag;
extern char titlefn[];
extern USHORT tempLabel;
extern char unaryset[];
extern char xcreflag;
extern char xoptoargs[];
extern char *atime;
extern long linestot;
extern long linessrc;
extern short pagemajor;
extern short pageminor;
extern short symbolcnt;
extern DSCREC emptydsc;
extern DSCREC *fltdsc;
extern DSCREC *itemptr;
extern DSCREC *resptr;
extern DSCREC *startaddr;
extern struct duprec FARSYM *strucprev;
extern struct duprec FARSYM *strclastover;
extern struct duprec FARSYM *strucoveride;
extern struct fileptr crf;
extern struct fileptr lst;
extern NAME FAR *modulename;
extern TEXTSTR FAR *rmtline;
extern SYMBOL FARSYM *curgroup;
extern SYMBOL FARSYM *firstsegment;
extern SYMBOL FARSYM *lastsegptr;
extern SYMBOL FARSYM *macroptr;
extern SYMBOL FARSYM *macroroot;
extern SYMBOL FARSYM *procStack[PROCMAX];
extern SYMBOL FARSYM *pProcCur;
extern SYMBOL FARSYM *pProcFirst;
extern SYMBOL FARSYM *pFlatGroup;
extern short iProcStack;
extern SYMBOL FARSYM *pcproc;
extern MC *pMCur;
extern TEXTSTR FAR *pLib;
extern SYMBOL FARSYM *pcsegment;
extern SYMBOL FARSYM *recptr;
extern char regSave[8][SYMMAX+1];
extern SYMBOL FARSYM *regsegment[6];
extern SYMBOL FARSYM *struclabel;
extern SYMBOL FARSYM *strucroot;
extern SYMBOL FARSYM *symptr;
extern SYMBOL FARSYM *symroot[];
extern UCHAR delim;
extern SHORT errorcode;
extern UCHAR fixvalues[];
extern UCHAR modrm;
extern UCHAR nilseg;
extern char opcref;
extern UCHAR opcbase;
extern long oEndPass1;
extern UCHAR xltftypetolen[];
extern UCHAR xoptoseg[];
extern char *begatom;
extern USHORT blocklevel;
extern OFFSET clausesize;
extern USHORT condlevel; /* conditional level */
extern USHORT count;
extern USHORT codeview;
extern USHORT crefcount;
extern USHORT datadsize[];
extern USHORT duplevel; /* indent for dup listing */
extern char *endatom;
extern USHORT errornum; /* error count */
extern USHORT externnum;
extern UCHAR fPutFirstOp;
extern USHORT fltfixmisc[4][2];
extern USHORT fltselect[4][2];
extern USHORT groupnum;
extern USHORT lastcondon;
extern UCHAR linelength; /* length of line */
extern USHORT lnameIndex;
extern USHORT localbase;
extern USHORT macrolevel;
extern USHORT operprec;
extern USHORT pagelength;
extern USHORT pageline;
extern USHORT pagewidth;
extern OFFSET pcmax;
extern OFFSET pcoffset;
extern USHORT segidx;
extern USHORT segmentnum;
extern USHORT typeIndex;
extern USHORT temp;
extern OFFSET val;
extern USHORT varsize;
extern USHORT warnnum; /* warning count */
extern USHORT warnlevel; /* warning level */
extern USHORT warnCode;
extern USHORT xltsymtoresult[];
extern OFFSET CondJmpDist; /* conditional jump distance (for error) */
extern char segName[];
extern char procName[];
# ifdef M8086
extern char qname[]; /* native coded in asmhelp.asm */
extern char qlcname[]; /* "" */
extern char qsvname[]; /* "" */
extern char qsvlcname[]; /* "" */
extern SHORT objerr;
extern char srceof;
extern char fNotStored;
extern USHORT obufsiz;
# endif /* M8086 */
extern struct objfile obj;
extern FCB * pFCBCur; /* Current file being read */
#ifdef BCBOPT
extern BCB * pBCBAvail; /* List of deallocatable file buffers */
extern FCB * pFCBInc; /* Next include file */
extern UCHAR fBuffering; /* TRUE if storing lines for pass 2 */
#endif
extern FCB * pFCBMain; /* main file */
# ifndef XENIX286
extern char terse;
# endif
#ifndef V386
#define wordsize 2 /* becomes a constant for 16 bit only segments */
#else
extern SHORT wordsize;
#endif
#endif /* ASMGLOBAL */