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