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..3307
NOWARN
.
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