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.
EUROASM NOWARN=3720,NOWARN=2101 eaopt PROGRAM FORMAT=COFF,MODEL=FLAT,WIDTH=32 INCLUDEHEAD "euroasm.htm" ; Interface (structures, symbols and macros) of other modules. INCLUDEHEAD \ ; Include headers of another modules used in this module. dict.htm, \ ea.htm, \ exp.htm, \ ii.htm, \ msg.htm, \ pf.htm, \ pgm.htm, \ pgmopt.htm, \ sss.htm, \ sym.htm, \ syswin.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, 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..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 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