EAOPT is a set of €ASM options controlled with
euroasm.execommand-line,
euroasm.ini,
Instances of this class appear as 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.
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 D ; Option EUROASM LISTFILE=.
.ListFileSize D D ; Number of bytes in LISTFILE.
.CodePage D D ; Option EUROASM CODEPAGE=.
.TimeStamp D D ; Option EUROASM TIMESTAMP=. Initialized from Ea.TimeStart in EaCreate.
.IncludePathPtr D D ; Option EUROASM INCLUDEPATH=.
.IncludePathSize D D ; Number of bytes in INCLUDEPATH.
.LinkPathPtr D D ; Option EUROASM LINKPATH=.
.LinkPathSize D D ; Number of bytes in LINKPATH.
.MaxInclusions D D ; Option EUROASM MAXINCLUSIONS=.
.MaxLinks D D ; Option EUROASM MAXLINKS=.
.DumpWidth D D ; Option EUROASM DUMPWIDTH=.
.Status D D ; Boolean EUROASM options in EaoptEnc below.
.Machine D D ; CPU and SIMD generation in CPU requirements encoding.
.Features D D ; Processor properties in CPU features encoding.
.NoWarn D 500*B ; Options EUROASM NOWARN= and WARN=.
; Each .NoWarn bit will suppress one warning from I0000 to W3999. I0000 is alway suppressed.
; E.g. EUROASM NOWARN=0003..0006 will set [EAOPT.NoWarn+0] to 0x79.
ENDSTRUC EAOPT
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
%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
%EaoptStatusList %SET AUTOALIGN,AUTOSEGMENT,DUMP,DUMPALL,LIST,LISTINCLUDE,LISTMACRO,LISTREPEAT,LISTVAR, \
DISPLAYSTM,DISPLAYENC,UNICODE,DEBUG,PROFILE
%EaoptEasmList %SET DATE, EUROASMOS, 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.
Invoke DictLookup::, DictEaoptStatus::,[%KeyPtr],[%KeySize]
JNC .Status: ; If boolean nonfeature key.
Invoke DictLookup::, DictEaoptFea::,[%KeyPtr],[%KeySize]
JNC .Fea: ; Feature boolean key.
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 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 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.
; Bug in 20180508 .TS7:MOV EAX,[Ea.TimeStart::] ; If TIMESTAMP= is empty or -1, use real system time (default).
.TS8:MOV [EDI+EAOPT.TimeStamp],EAX
.TS9:RET
.INCLUDEPATH::
StripQuotes ESI,ECX
PoolStore [Ea::+EA.Pool],ESI,ECX
MOV [EDI+EAOPT.IncludePathSize],ECX
MOV [EDI+EAOPT.IncludePathPtr],EAX
RET
.LINKPATH::
StripQuotes ESI,ECX
PoolStore [Ea::+EA.Pool],ESI,ECX
MOV [EDI+EAOPT.LinkPathSize],ECX
MOV [EDI+EAOPT.LinkPathPtr],EAX
RET
.LISTFILE::
StripQuotes ESI,ECX
PoolStore [Ea::+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
Invoke ExpParseRange::,ESI,ECX
JC .W3: ; If no range 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 provided, e.g.EUROASM NOWARN=3205..3200.
JMPS .W4:
.W3: SUB ECX,ESI ; No range.
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.
; Parse pathstring up to the separator or EDX.
.30:CMP ESI,EDX
JNB .50:
LODSB
CMP AL,','
JE .40;
CMP AL,';'
JNE .30:
.40:DEC ESI
.50:; EDI..ESI is parsed path.
MOV ECX,ESI
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