EAOPT is a set of €ASM options controlled with
euroasm.execommand-line,
euroasm.ini,
Instances of this class appear as a member of
EA,
SRC,
PGM and
Src.EaoptStack objects.
All EAOPT objects allocate memory from Ea.Pool.
Current Euroasm options in charge, which control the assembly, are always read from Ea.Eaopt.
| Action | Source | Destination |
|---|---|---|
| EaCreate | Factory defaults | Ea.Eaopt |
| EaMain | Cmd line options | Ea.Eaopt |
Global euroasm.ini | Ea.Eaopt | |
| Cmd line options again | Ea.Eaopt | |
| Ea.Eaopt | Ea.EaoptIni | |
| SrcCreate | Ea.EaoptIni | Src.Eaopt |
Local euroasm.ini | Src.Eaopt | |
| Src.Eaopt | Ea.Eaopt | |
| PgmCreateProgram | Ea.Eaopt | Pgm.Eaopt |
| PassCreate | Pgm.Eaopt | Ea.Eaopt |
| EUROASM PUSH | Ea.Eaopt | Src.EaoptStack |
| EUROASM option= | option= | Ea.Eaopt |
| EUROASM POP | Src.EaoptStack | Ea.Eaopt |
In order to introduce a new EUROASM option, it must be inserted into
- %Eaopt*List enumeration,
- EAOPT structure,
- factory-default
euroasm.inifile,- EaoptAssemble configuration handler,
- VarExpand retrieve handler,
- Pseudoinstructions/EUROASM manual,
- Elements/EUROASM System %variables manual,
- test program.
eaopt PROGRAM FORMAT=COFF,MODEL=FLAT,WIDTH=32
INCLUDEHEAD euroasm.htm, \ Interface (structures, symbols and macros) of other modules used in this source.
dict.htm, ea.htm,exp.htm,ii.htm,msg.htm,pf.htm,pgm.htm,pgmopt.htm,sss.htm,sym.htm,var.htm
eaopt HEAD ; Start of module interface.
euroasm.inior from pseudoinstruction PseudoEUROASM. There are five kinds of options in EAOPT, specified in enumerations defined below:
EAOPT.Status,EAOPT.Machine,EAOPT.Machine,EAOPT.Features,EAOPT members.
EAOPT STRUC
.ListFilePtr D DWORD ; Option EUROASM LISTFILE=.
.ListFileSize D DWORD ; Number of bytes in LISTFILE.
.MaxInclusions D DWORD ; Option EUROASM MAXINCLUSIONS=.
.MaxLinks D DWORD ; Option EUROASM MAXLINKS=.
; +10h.
.Status D DWORD ; Boolean EUROASM options in EaoptEnc below.
.Machine D DWORD ; CPU and SIMD generation in CPU requirements encoding.
.Features D DWORD ; Processor properties in CPU features encoding.
.DumpWidth D DWORD ; Option EUROASM DUMPWIDTH=.
; +20h.
.IncludePathPtr D DWORD ; Option EUROASM INCLUDEPATH=.
.IncludePathSize D DWORD ; Number of bytes in INCLUDEPATH string.
.LinkPathPtr D DWORD ; Option EUROASM LINKPATH=.
.LinkPathSize D DWORD ; Number of bytes in LINKPATH string.
; +30h.
.RunPathPtr D DWORD ; Option EUROASM RUNPATH=.
.RunPathSize D DWORD ; Number of bytes in RUNPATH string.
.InterpreterPtr D DWORD ; Option EUROASM INTERPRETER=.
.InterpreterSize D DWORD ; Number of bytes in INTERPRETER string.
; +40h.
.CodePage D DWORD ; Option EUROASM CODEPAGE=.
.TimeStamp D DWORD ; Option EUROASM TIMESTAMP=. Initialized from Ea.TimeStart in EaCreate.
.NoWarn D 500*B ; Options EUROASM NOWARN= and WARN=.
; Each .NoWarn bit will suppress one warning from I0000 to W3999.
; E.g. EUROASM NOWARN=0003..0006 will set the byte [EAOPT.NoWarn+0] to 0x79.
ENDSTRUC EAOPT ; Size=0x23C=572.
EUROASM.eaoptAUTOALIGN EQU 0x0000_0001 eaoptAUTOSEGMENT EQU 0x0000_0002 eaoptDUMP EQU 0x0000_0010 eaoptDUMPALL EQU 0x0000_0020 eaoptLIST EQU 0x0000_0100 eaoptLISTINCLUDE EQU 0x0000_1000 eaoptLISTMACRO EQU 0x0000_2000 eaoptLISTREPEAT EQU 0x0000_4000 eaoptLISTVAR EQU 0x0000_8000 eaoptDISPLAYSTM EQU 0x0001_0000 eaoptDISPLAYENC EQU 0x0002_0000 eaoptUNICODE EQU 0x0010_0000 eaoptDEBUG EQU 0x0040_0000 eaoptPROFILE EQU 0x0080_0000 eaoptNOWARN EQU 0x8000_0000 ; Internal flag to distinguish WARN=/NOWARN= in EaoptAssemble.
%EaoptMiscList %SET CPU,SIMD,WARN,NOWARN,CODEPAGE,DUMPWIDTH,LISTFILE, TIMESTAMP, \
MAXINCLUSIONS,MAXLINKS,INCLUDEPATH,LINKPATH,RUNPATH,INTERPRETER
%EaoptFeaList %SET PROT,VMX,AES,SHA,LWP,XOP,MVEX,EVEX,FPU,TSX,MMX,SGX,ABM,SVM,MPX, \
PRIV,UNDOC,AMD,CYRIX,VIA,D3NOW,FMA,SPEC,CET
%EaoptStatusList %SET AUTOALIGN,AUTOSEGMENT,DUMP,DUMPALL,LIST,LISTINCLUDE,LISTMACRO,LISTREPEAT,LISTVAR, \
DISPLAYSTM,DISPLAYENC,UNICODE,DEBUG,PROFILE
%EaoptEasmList %SET DATE, ERRORLEVEL, EUROASMOS, PASS, PROC, PROGRAM, SECTION, SEGMENT, \
SOURCEEXT, SOURCEFILE, SOURCELINE, SOURCENAME, TIME, VERSION
%EaoptEasmListLength %SETL %EaoptEasmList
ENDHEAD eaopt ; End of module interface. [.text]
LISTVAR=ON or NOWARN=3305..3307NOWARN.
3305..3307.
EaoptAssemble Procedure EaoptPtr, KeyPtr, KeySize, ValPtr, ValSize
EaoptKey LocalVar ; Ptr to Msg !1S with option name.
EaoptVal LocalVar ; Ptr to Msg !2S with unassembled option value.
EaoptRightPtr LocalVar ; Right range expression.
EaoptRightSize LocalVar
EaoptLeftVal LocalVar ; Value of lower (left side) range expression.
EaoptRightVal LocalVar ; Value of greater (right side) range expression.
MOV EDI,[%EaoptPtr]
MOV ESI,[%ValPtr]
MOV ECX,[%ValSize]
LEA EBX,[%KeyPtr]
LEA EAX,[%ValPtr]
MOV [%EaoptKey],EBX
MOV [%EaoptVal],EAX
; Parse option keyname.
Invoke DictLookup::, DictEaoptMisc::,[%KeyPtr],[%KeySize]
JNC .Misc: ; If non-boolean option was used.
Invoke DictLookup::, DictEaoptStatus::,[%KeyPtr],[%KeySize]
JNC .Status: ; If boolean nonfeature key was used.
Invoke DictLookup::, DictEaoptFea::,[%KeyPtr],[%KeySize]
JNC .Fea: ; If boolean feature key was used.
Msg '3720',[%EaoptKey] ; "!1S" is unknown option in [EUROASM] section.
JMP .99:
[.data] ; Assembled EAOPT values are stored in arrays of dwords, respectively to their order in enumeration.
ALIGN DWORD
.FeaFlags:
fea %FOR %EaoptFeaList
DD iiFea_%fea
%ENDFOR fea
.StatusFlags:
status %FOR %EaoptStatusList
DD eaopt%status
%ENDFOR status
.MiscTable:
misc %FOR %EaoptMiscList
DD .%misc
%ENDFOR misc
[.text]
.Fea: ; Feature flag recognized, e.g. MMX=. EAX=%ordinal<<16 + varTypeSysEaopt + varTypeSysEaoptF. ;>>
AND EAX,varTypeSysEnum
SHR EAX,16
MOV EAX,[.FeaFlags-4+4*EAX]
Invoke ExpEvalBoolean::, ESI,ECX
JC .99:
JZ .F0:
OR [EDI+EAOPT.Features],EAX
JMP .99:
.F0: NOT EAX
AND [EDI+EAOPT.Features],EAX
JMP .99:
.Status: ; Status flag was recognized, e.g. LISTMACRO=. EAX==%ordinal<<16 + varTypeSysEaopt + varTypeSysEaoptS. ; >>
AND EAX,varTypeSysEnum
SHR EAX,16
MOV EAX,[.StatusFlags-4+4*EAX]
Invoke ExpEvalBoolean::, ESI,ECX
JC .99:
JZ .S0:
OR [EDI+EAOPT.Status],EAX
JMP .99:
.S0: NOT EAX
AND [EDI+EAOPT.Status],EAX
JMP .99:
.Misc: ; Non-boolean EAOPT flag was recognized, e.g. DUMPWIDTH=. EAX=%ordinal<<16+varTypeSysEaopt+varTypeSysEaoptM. ; >>
; Input: EBX is !1S key name, ESI,ECX is key value.
AND EAX,varTypeSysEnum
SHR EAX,16
MOV EAX,[.MiscTable-4+4*EAX]
CALL EAX
JMP .99:
.W3712:Msg '3712',[%EaoptKey],EAX,ECX,EBX ; DB '3709 !1S=!2D is out of limit !3D..!4D. Ignored.
RET
.W3713:Msg '3713',[%EaoptKey],ESI,ECX,EBX,EAX ; DB '3709 !1S=!2D is out of limit !3D..!4D. Set to !5D.
RET
.W3715:Msg '3715',[%EaoptKey],[%EaoptVal] ; Invalid [EUROASM] option "!1S=!2S". Ignored.
RET
.CODEPAGE::
PUSH ECX,ESI
StripSpaces ESI,ECX
JECXZ .CP6:
CMPB [ESI],'"'
JE .CP2:
CMPB [ESI],"'"
JE .CP3:
.CP2: StripQuotes ESI,ECX
JMP .CP5:
.CP3: StripApostrophes ESI,ECX
.CP5: StripSpaces ESI,ECX
.CP6: Invoke DictLookup::,DictCodePages::,ESI,ECX
POP ESI,ECX
JNC .CP8: ; If valid enumerated codepage token found.
Invoke ExpEvalNum::,ESI,ECX ; Otherwise assume it is a numeric identifier.
JC .W3715:
Invoke ExpCheckBounds::,0,65535
JNZ .W3715:
.CP8:MOV [EDI+EAOPT.CodePage],EAX
RET
.DUMPWIDTH::
Invoke ExpEvalNum::, ESI,ECX
JC .W3715:
MOV ECX,16 ; Min.
MOV EBX,128 ; Max.
Invoke ExpCheckBounds::, ECX,EBX
JNL .D5:
MOV ESI,EAX
MOV EAX,ECX
CALL .W3713:
JMP .D9:
.D5:JNG .D9:
MOV ESI,EAX
MOV EAX,EBX
CALL .W3713:
.D9:MOV [EDI+EAOPT.DumpWidth],EAX
RET
.MAXINCLUSIONS::
Invoke ExpEvalNum::, ESI,ECX
JC .W3715:
MOV [EDI+EAOPT.MaxInclusions],EAX
RET
.MAXLINKS::
Invoke ExpEvalNum::, ESI,ECX
JC .W3715:
MOV [EDI+EAOPT.MaxLinks],EAX
RET
.TIMESTAMP::
StripSpaces ESI,ECX
JECXZ .TS9: ; If TIMESTAMP= is empty or -1, do not change Ea.TimeStamp.
Invoke ExpEvalNum::, ESI,ECX
JC .W3715:
CMP EAX,-1
JE .TS9: ; If TIMESTAMP= is empty or -1, do not change Ea.TimeStamp.
.TS8:MOV [EDI+EAOPT.TimeStamp],EAX
.TS9:RET
.INCLUDEPATH::
StripQuotes ESI,ECX
PoolStore [Ea.Pool::],ESI,ECX
MOV [EDI+EAOPT.IncludePathSize],ECX
MOV [EDI+EAOPT.IncludePathPtr],EAX
RET
.LINKPATH::
StripQuotes ESI,ECX
PoolStore [Ea.Pool::],ESI,ECX
MOV [EDI+EAOPT.LinkPathSize],ECX
MOV [EDI+EAOPT.LinkPathPtr],EAX
RET
.RUNPATH::
StripQuotes ESI,ECX
PoolStore [Ea.Pool::],ESI,ECX
MOV [EDI+EAOPT.RunPathSize],ECX
MOV [EDI+EAOPT.RunPathPtr],EAX
RET
.INTERPRETER::
StripQuotes ESI,ECX
PoolStore [Ea.Pool::],ESI,ECX
MOV [EDI+EAOPT.InterpreterSize],ECX
MOV [EDI+EAOPT.InterpreterPtr],EAX
RET
.LISTFILE::
StripQuotes ESI,ECX
PoolStore [Ea.Pool::],ESI,ECX
MOV [EDI+EAOPT.ListFileSize],ECX
MOV [EDI+EAOPT.ListFilePtr],EAX
RET
.CPU::
Invoke DictLookup::, DictEaoptCpu::,ESI,ECX
JC .W3715: ; Invalid [EUROASM] option "!1S=!2S". Ignored.
RstSt [EDI+EAOPT.Machine],iiCPU_CpuMask
SetSt [EDI+EAOPT.Machine],EAX
RET
.SIMD::
Invoke DictLookup::, DictEaoptSimd::,ESI,ECX
JNC .S5:
Invoke ExpEvalBoolean::, ESI,ECX
JC .W3715: ; Invalid [EUROASM] option "!1S=!2S". Ignored.
MOV EAX,iiCPU_SSE1 ; EUROASM SIMD=TRUE alias SIMD=SSE1 alias SIMD=SSE.
JNZ .S5:
XOR EAX,EAX ; SIMD=FALSE.
.S5:RstSt [EDI+EAOPT.Machine],iiCPU_SimdMask ; Erase all previous SIMD flags.
SetSt [EDI+EAOPT.Machine],EAX
RET
.NOWARN::
SetSt [EDI+EAOPT.Status],eaoptNOWARN
JMPS .W1:
.WARN::
RstSt [EDI+EAOPT.Status],eaoptNOWARN
.W1: ADD ECX,ESI ; Common handler for WARN= and NOWARN=,
Invoke ExpParseRange::,ESI,ECX
JC .W3: ; When no range was provided, e.g. EUROASM NOWARN=3205.
SUB ECX,EAX
MOV [%EaoptRightPtr],EAX
MOV [%EaoptRightSize],ECX
LEA ECX,[EAX-2]
SUB ECX,ESI
Invoke ExpEvalNum::,ESI,ECX
JC .W3715:
SUB ECX,ECX
MOV EBX,3999
Invoke ExpCheckBounds::,ECX,EBX
JNZ .W3712:
MOV [%EaoptLeftVal],EAX
MOV ESI,[%EaoptRightPtr]
MOV ECX,[%EaoptRightSize]
Invoke ExpEvalNum::,ESI,ECX
JC .W3715:
SUB ECX,ECX
Invoke ExpCheckBounds::,ECX,EBX
JNZ .W3712:
CMP EAX,[%EaoptLeftVal]
JGE .W4:
XCHG EAX,[%EaoptLeftVal] ; If swapped range was provided, e.g.EUROASM NOWARN=3205..3200.
JMPS .W4:
.W3: SUB ECX,ESI ; No range was detected.
Invoke ExpEvalNum::,ESI,ECX
JC .W3715:
SUB ECX,ECX
MOV EBX,3999
Invoke ExpCheckBounds::,ECX,EBX
JNZ .W3712:
MOV [%EaoptLeftVal],EAX
.W4: MOV [%EaoptRightVal],EAX
SUB ECX,ECX
MOV EAX,[%EaoptLeftVal] ; Option number 0..3999.
.W5: MOV CL,07h
AND ECX,EAX
SHR EAX,3
JSt [EDI+EAOPT.Status],eaoptNOWARN,.W6:
; WARN=reset bit.
BTR [EDI+EAOPT.NoWarn+EAX],ECX
JMPS .W7:
.W6: ; NOWARN=set bit.
BTS [EDI+EAOPT.NoWarn+EAX],ECX
.W7: MOV EAX,[%EaoptLeftVal]
INC EAX
MOV [%EaoptLeftVal],EAX
CMP EAX,[%EaoptRightVal]
JBE .W5:
RET
.99:EndProcedure EaoptAssemble
EaoptGetOnePath Procedure PathPtr, PathSize, PathNr
SUB EAX,EAX
MOV ECX,[%PathSize]
MOV ESI,[%PathPtr]
MOVD [%ReturnECX],EAX
LEA EDX,[ESI+ECX] ; End of pathes.
.10:CMP ESI,EDX
CMC
JC .90:
MOV EDI,ESI ; Potential start of path.
.30:CMP ESI,EDX ; Parse pathstring up to the separator or EDX.
JNB .50:
LODSB
CMP AL,','
JE .40;
CMP AL,';'
JNE .30:
.40:DEC ESI
.50:MOV ECX,ESI ; EDI..ESI is parsed path.
INC ESI
SUB ECX,EDI
StripSpaces EDI,ECX
JECXZ .10: ; Empty pathes do not count, e.g. path1;;path2.
DECD [%PathNr]
JNS .10: ; If not the required path number yet.
CLC
MOV [%ReturnESI],EDI
MOV [%ReturnECX],ECX
.90:EndProcedure EaoptGetOnePath
ENDPROGRAM eaopt