This macrolibrary syslin.htm
is Linux version of macroinstructions which encapsulate system calls in EuroAssembler.
List of used kernel services:
In order to port EuroAssembler to a different operating system:
- Specify 1..4 character shortcut of the system, e.g.
Lin, Win, BSD, OS2, Sol,...
and set it to %^EuroasmOS variable instead ofWin
.- Create source file
sys%^EuroasmOS.htm.- Rewrite all macros in this source file, exactly keeping their parameters, input, output and functionality.
- Rebuild EuroAssembler.
- Update documentation.
syslin HEAD ; Start of interface, which is included to other modules.
SysANSI2Wide %MACRO Codepage, ANSIPtr, ANSISize, WidePtr, WideSize PUSHAD MOV ESI,%ANSIPtr MOV ECX,%ANSISize MOV EDI,%WidePtr MOV EDX,%WideSize ADD EDX,EDI XOR EAX,EAX SysANSI2Wide2%.: LODSB CMP EDI,EDX JNB SysANSI2Wide9%.: STOSW LOOP SysANSI2Wide2%.: SysANSI2Wide9%.: CMC POPAD %ENDMACRO SysANSI2Wide
SysAssignFile %MACRO File, FilenamePtr, FilenameSize FileAssign %File, %FilenamePtr,Size=%FilenameSize, Unicode=0 %ENDMACRO SysAssignFile
SysCloseFile %MACRO File FileClose %File %ENDMACRO SysCloseFile
SysCreateFile %MACRO File, FileName$ FileAssign %File,%FileName$ FileMkDir %File FileCreate %File %ENDMACRO SysCreateFile
SysEachFile %MACRO File, Callback FileEach %File, %Callback %ENDMACRO SysEachFile
SysExitProcess %MACRO Errorlevel TerminateProgram %Errorlevel %ENDMACRO SysExitProcess
SysGetArg %MACRO ArgNr GetArg %ArgNr,Frame=ESP %ENDMACRO SysGetArg
argc
value.
$PWD
was not found.
SysGetCurrentDirectory %MACRO DirNamePtr, DirNameSize=NAME_MAX, Frame=ESP
PUSHD %Frame, %DirNameSize, %DirNamePtr
CALL SysGetCurrentDirectory@RT:
SysGetCurrentDirectory@RT: PROC1
PUSHAD
MOV EBX,[ESP+11*4] ; %Frame
MOV EAX,[EBX]
LEA EBX,[EBX+4*EAX+4] ; EBX points at env.string, say PWD=/mnt
MOV EDI,[ESP+9*4] ; %NamePtr
MOV ECX,[ESP+10*4] ; %NameSize
MOVB [EDI],0
.10: ADD EBX,4
MOV ESI,[EBX]
TEST ESI
STC
JZ .90: ; If not found.
LODSD
CMP EAX,'PWD='
JNE .10:
REP MOVSB
.90: POPAD
RET 3*4
ENDP1 SysGetCurrentDirectory@RT:
%ENDMACRO SysGetCurrentDirectory
SysGetEnvironment %MACRO NamePtr, NameSize, OutEnvBuffer
PUSHD %OutEnvBuffer, %NameSize, %NamePtr
CALL SysGetEnvironment@RT:
SysGetEnvironment@RT: PROC1
PUSHAD
MOV EBX,[Ea.StackOrg::]
MOV EAX,[EBX] ; EAX is the number of cmd-line arguments.
LEA EBX,[EBX+4*EAX+4] ; EBX points at env.string, say TERM=/xterm
.10: ADD EBX,4
MOV ESI,[EBX]
TEST ESI
JZ .80: ; If not found.
MOV EDI,[ESP+9*4] ; %NamePtr
MOV ECX,[ESP+10*4] ; %NameSize
REPE CMPSB
JNE .10:
LODSB
CMP AL,'='
JNE .10:
MOV EBX,[ESP+11*4] ; %OutEnvBuffer
.30: LODSB
CMP AL,0
JE .80:
BufferStoreByte EBX,EAX
JMP .30:
.80: CMP AL,1 ; Set ZF=0.
POPAD
RET 3*4
ENDPROC1 SysGetEnvironment@RT:
%ENDMACRO SysGetEnvironment
Win
(or Lin
etc)
depending on OS which the EuroAssembler is compiled for.SysGetEuroasmOS %MACRO EuroasmOSPtr MOV EAX,"Lin" ; OS version is hardwired here. Change it in ported versions. %ENDMACRO SysGetEuroasmOS
Macro SysGetStackSize returns the amount of memory in bytes
reserved during linkage of the actually running euroasm.exe
. Obtained value will be used for protection from stack overflow error.
Stack in the loaded PECOFF executable is allocated in virtual address space but I didn't find a reliable way how to get its size, so I set a fiction value here.
SysGetStackSize %MACRO MOV EAX,1M CLC %ENDMACRO SysGetStackSize
SysGetUTC %MACRO LinAPI time,0 %ENDMACRO SysGetUTC
SysOpenFileMap %MACRO File, FileNamePtr, FileNameSize=-1 FileAssign %File, %FileNamePtr, Size=%FileNameSize FileMapOpen %File %ENDMACRO SysOpenFileMap
SysWriteFile %MACRO File, DataPtr, DataSize FileWrite %File,%DataPtr,%DataSize %ENDMACRO SysWriteFile
SysGetFileTime %MACRO FileNamePtr PUSH EDI SUB ESP,SIZE# STAT64 ; Make room for STAT64structure (44 bytes). MOV EDI,ESP LinAPI stat64,%FileNamePtr,EDI MOV EAX,[EDI+STAT64.st_mtime] ADD ESP,SIZE# STAT64 POP EDI %ENDMACRO SysGetFileTime
SysGetFileSize %MACRO FileNamePtr PUSH EDI SUB ESP,SIZE# STAT64 ; Make room for STAT64structure (44 bytes). MOV EDI,ESP LinAPI stat64,%FileNamePtr,EDI MOV EAX,[EDI+STAT64.st_size+0] MOV EDX,[EDI+STAT64.st_size+4] ADD ESP,SIZE# STAT64 POP EDI %ENDMACRO SysGetFileSize
SysMkDir %MACRO theFile FileMkDir %theFile %ENDMACRO SysMkDir
ENDHEAD syslin