A TempleOS distro for heretics
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

471 lines
6.5 KiB

asm {
_MEMSET::
PUSH RBP
MOV RBP,RSP
PUSH RDI
CLD
MOV RDI,U64 SF_ARG1[RBP]
MOV RAX,U64 SF_ARG2[RBP]
MOV RCX,U64 SF_ARG3[RBP]
REP_STOSB
MOV RAX,RDI
POP RDI
POP RBP
RET1 24
_MEMSET_U16::
PUSH RBP
MOV RBP,RSP
PUSH RDI
CLD
MOV RDI,U64 SF_ARG1[RBP]
MOV RAX,U64 SF_ARG2[RBP]
MOV RCX,U64 SF_ARG3[RBP]
REP_STOSW
MOV RAX,RDI
POP RDI
POP RBP
RET1 24
_MEMSET_U32::
PUSH RBP
MOV RBP,RSP
PUSH RDI
CLD
MOV RDI,U64 SF_ARG1[RBP]
MOV RAX,U64 SF_ARG2[RBP]
MOV RCX,U64 SF_ARG3[RBP]
REP_STOSD
MOV RAX,RDI
POP RDI
POP RBP
RET1 24
_MEMSET_I64::
PUSH RBP
MOV RBP,RSP
PUSH RDI
CLD
MOV RDI,U64 SF_ARG1[RBP]
MOV RAX,U64 SF_ARG2[RBP]
MOV RCX,U64 SF_ARG3[RBP]
REP_STOSQ
MOV RAX,RDI
POP RDI
POP RBP
RET1 24
_MEMCPY::
PUSH RBP
MOV RBP,RSP
PUSH RSI
PUSH RDI
CLD
MOV RDI,U64 SF_ARG1[RBP]
MOV RSI,U64 SF_ARG2[RBP]
MOV RCX,U64 SF_ARG3[RBP]
REP_MOVSB
MOV RAX,RDI
POP RDI
POP RSI
POP RBP
RET1 24
_MEMCMP::
PUSH RBP
MOV RBP,RSP
PUSH RSI
PUSH RDI
CLD
MOV RSI,U64 SF_ARG1[RBP]
MOV RDI,U64 SF_ARG2[RBP]
MOV RCX,U64 SF_ARG3[RBP]
XOR RAX,RAX
REPE_CMPSB
JZ @@05
MOV AL,1
JA @@05
MOV RAX,-1
@@05: POP RDI
POP RSI
POP RBP
RET1 24
_BEQU::
PUSH RBP
MOV RBP,RSP
XOR RAX,RAX
MOV RDX,U64 SF_ARG3[RBP]
MOV RBX,U64 SF_ARG1[RBP]
MOV RCX,U64 SF_ARG2[RBP]
TEST RDX,RDX
JZ @@5
BTS U64 [RBX],RCX
JMP @@10
@@5: BTR U64 [RBX],RCX
@@10: ADC AL,0
POP RBP
RET1 24
_LBEQU::
PUSH RBP
MOV RBP,RSP
XOR RAX,RAX
MOV RDX,U64 SF_ARG3[RBP]
MOV RBX,U64 SF_ARG1[RBP]
MOV RCX,U64 SF_ARG2[RBP]
TEST RDX,RDX
JZ @@5
LOCK
BTS U64 [RBX],RCX
JMP @@10
@@5: LOCK
BTR U64 [RBX],RCX
@@10: ADC AL,0
POP RBP
RET1 24
_CLAMP_I64::
PUSH RBP
MOV RBP,RSP
MOV RAX,U64 SF_ARG1[RBP]
MOV RCX,U64 SF_ARG2[RBP]
MOV RDX,U64 SF_ARG3[RBP]
CMP RAX,RCX
CMOVL RAX,RCX
CMP RAX,RDX
CMOVG RAX,RDX
POP RBP
RET1 24
_CLAMP_U64::
PUSH RBP
MOV RBP,RSP
MOV RAX,U64 SF_ARG1[RBP]
MOV RCX,U64 SF_ARG2[RBP]
MOV RDX,U64 SF_ARG3[RBP]
CMP RAX,RCX
CMOVB RAX,RCX
CMP RAX,RDX
CMOVA RAX,RDX
POP RBP
RET1 24
_CALL::
PUSH RBP
MOV RBP,RSP
MOV RAX,U64 SF_ARG1[RBP]
TEST RAX,RAX
JZ @@05
CALL RAX
@@05: POP RBP
RET1 8
_BIT_FIELD_OR_U32::
PUSH RBP
MOV RBP,RSP
MOV RBX,U64 SF_ARG2[RBP]
SHR RBX,3
ADD RBX,U64 SF_ARG1[RBP]
MOV RAX,U64 SF_ARG3[RBP]
MOV RCX,U64 SF_ARG2[RBP]
AND CL,7
SHL RAX,CL
OR U64 [RBX],RAX
POP RBP
RET1 24
_BIT_FIELD_EXT_U32::
PUSH RBP
MOV RBP,RSP
MOV RBX,U64 SF_ARG2[RBP]
MOV RCX,RBX
SHR RBX,3
ADD RBX,U64 SF_ARG1[RBP]
MOV RDX,U64 [RBX]
AND CL,7
SHR RDX,CL
MOV RCX,U64 SF_ARG3[RBP]
MOV RAX,1
SHL RAX,CL
DEC RAX
AND RAX,RDX
POP RBP
RET1 24
_XCHG_I64::
PUSH RBP
MOV RBP,RSP
MOV RDX,U64 SF_ARG1[RBP]
MOV RAX,U64 SF_ARG2[RBP]
XCHG U64 [RDX],RAX
POP RBP
RET1 16
_XCHG_U32::
PUSH RBP
MOV RBP,RSP
MOV RDX,U64 SF_ARG1[RBP]
MOV EAX,U32 SF_ARG2[RBP]
XCHG U32 [RDX],EAX
POP RBP
RET1 16
_XCHG_U16::
PUSH RBP
MOV RBP,RSP
MOV RDX,U64 SF_ARG1[RBP]
MOVZX RAX,U16 SF_ARG2[RBP]
XCHG U16 [RDX],AX
POP RBP
RET1 16
_XCHG_U8::
PUSH RBP
MOV RBP,RSP
MOV RDX,U64 SF_ARG1[RBP]
MOVZX RAX,U8 SF_ARG2[RBP]
XCHG U8 [RDX],AL
POP RBP
RET1 16
_LXCHG_I64::
PUSH RBP
MOV RBP,RSP
MOV RDX,U64 SF_ARG1[RBP]
MOV RAX,U64 SF_ARG2[RBP]
LOCK
XCHG U64 [RDX],RAX
POP RBP
RET1 16
_LXCHG_U32::
PUSH RBP
MOV RBP,RSP
MOV RDX,U64 SF_ARG1[RBP]
MOV EAX,U32 SF_ARG2[RBP]
LOCK
XCHG U32 [RDX],EAX
POP RBP
RET1 16
_LXCHG_U16::
PUSH RBP
MOV RBP,RSP
MOV RDX,U64 SF_ARG1[RBP]
MOVZX RAX,U16 SF_ARG2[RBP]
LOCK
XCHG U16 [RDX],AX
POP RBP
RET1 16
_LXCHG_U8::
PUSH RBP
MOV RBP,RSP
MOV RDX,U64 SF_ARG1[RBP]
MOVZX RAX,U8 SF_ARG2[RBP]
LOCK
XCHG U8 [RDX],AL
POP RBP
RET1 16
_REP_IN_U32::
PUSH RBP
MOV RBP,RSP
PUSH RDI
MOV RDI,U64 SF_ARG1[RBP]
MOV RDX,U64 SF_ARG3[RBP]
MOV RCX,U64 SF_ARG2[RBP]
REP_INSD
POP RDI
POP RBP
RET1 24
_REP_IN_U16::
PUSH RBP
MOV RBP,RSP
PUSH RDI
MOV RDI,U64 SF_ARG1[RBP]
MOV RDX,U64 SF_ARG3[RBP]
MOV RCX,U64 SF_ARG2[RBP]
REP_INSW
POP RDI
POP RBP
RET1 24
_REP_IN_U8::
PUSH RBP
MOV RBP,RSP
PUSH RDI
MOV RDI,U64 SF_ARG1[RBP]
MOV RDX,U64 SF_ARG3[RBP]
MOV RCX,U64 SF_ARG2[RBP]
REP_INSB
POP RDI
POP RBP
RET1 24
_REP_OUT_U32::
PUSH RBP
MOV RBP,RSP
PUSH RSI
MOV RSI,U64 SF_ARG1[RBP]
MOV RDX,U64 SF_ARG3[RBP]
MOV RCX,U64 SF_ARG2[RBP]
REP_OUTSD
POP RSI
POP RBP
RET1 24
_REP_OUT_U16::
PUSH RBP
MOV RBP,RSP
PUSH RSI
MOV RSI,U64 SF_ARG1[RBP]
MOV RDX,U64 SF_ARG3[RBP]
MOV RCX,U64 SF_ARG2[RBP]
REP_OUTSW
POP RSI
POP RBP
RET1 24
_REP_OUT_U8::
PUSH RBP
MOV RBP,RSP
PUSH RSI
MOV RSI,U64 SF_ARG1[RBP]
MOV RDX,U64 SF_ARG3[RBP]
MOV RCX,U64 SF_ARG2[RBP]
REP_OUTSB
POP RSI
POP RBP
RET1 24
_CPUID::
PUSH RBP
MOV RBP,RSP
PUSH RSI
MOV RAX,U64 SF_ARG1[RBP]
CPUID
MOV RSI,U64 SF_ARG2[RBP]
MOV U64 [RSI],RAX
MOV U64 8[RSI],RBX
MOV U64 16[RSI],RCX
MOV U64 24[RSI],RDX
POP RSI
POP RBP
RET1 16
_CALL_IND:: //See $LK,"_LAST_FUN",A="MN:_LAST_FUN"$
PUSH RBP
MOV RBP,RSP
PUSH RSI
PUSH RDI
MOV RDX,U64 SF_ARG1[RBP]
MOV RCX,U64 SF_ARG2[RBP] //argc
LEA RSI,U64 SF_ARG3[RBP] //argv
SHL RCX,3
SUB RSP,RCX
MOV RDI,RSP
REP_MOVSB
TEST RDX,RDX
JZ @@05
CALL RDX
POP RDI
POP RSI
POP RBP
RET
@@05: MOV RCX,U64 SF_ARG2[RBP] //argc
SHL RCX,3
ADD RSP,RCX
XOR RAX,RAX
POP RDI
POP RSI
POP RBP
RET
_CALLEXTNUM::
PUSH RBP
MOV RBP,RSP
PUSH RSI
PUSH RDI
MOV RDX,U64 SF_ARG1[RBP]
MOV RCX,U64 SF_ARG2[RBP] //argc
LEA RSI,U64 SF_ARG3[RBP] //argv
SHL RCX,3
SUB RSP,RCX
MOV RDI,RSP
REP_MOVSB
MOV RAX,U64 [SYS_EXTERN_TABLE]
MOV RAX,U64 [RAX+RDX*8]
TEST RAX,RAX
JZ @@05
CALL RAX
POP RDI
POP RSI
POP RBP
RET
@@05: MOV RCX,U64 SF_ARG2[RBP] //argc
SHL RCX,3
ADD RSP,RCX
POP RDI
POP RSI
POP RBP
RET
_CALLEXTSTR::
PUSH RBP
MOV RBP,RSP
PUSH RSI
PUSH RDI
MOV RCX,U64 SF_ARG2[RBP] //argc
LEA RSI,U64 SF_ARG3[RBP] //argv
SHL RCX,3
SUB RSP,RCX
MOV RDI,RSP
REP_MOVSB
MOV RSI,U64 SF_ARG1[RBP]
MOV RCX,1
XOR RAX,RAX
MOV RDI,U64 FS:CTask.hash_table[RAX]
MOV RBX,HTT_FUN|HTT_EXPORT_SYS_SYM
CALL SYS_HASH_FIND
JZ @@15
TEST U32 CHash.type[RAX],HTT_FUN
JZ @@05
MOV RAX,U64 CHashFun.exe_addr[RAX]
JMP @@10
@@05: MOV RAX,U64 CHashExport.val[RAX]
@@10: TEST RAX,RAX
JZ @@15
CALL RAX
POP RDI
POP RSI
POP RBP
RET
@@15: MOV RCX,U64 SF_ARG2[RBP] //argc
SHL RCX,3
ADD RSP,RCX
POP RDI
POP RSI
POP RBP
RET
SET_GS_BASE::
PUSH RAX
PUSH RCX
PUSH RDX
MOV RDX,RAX
SHR RDX,32
MOV ECX,IA32_GS_BASE
WRMSR
POP RDX
POP RCX
POP RAX
RET
SET_FS_BASE::
PUSH RAX
PUSH RCX
PUSH RDX
MOV RDX,RAX
SHR RDX,32
MOV ECX,IA32_FS_BASE
WRMSR
POP RDX
POP RCX
POP RAX
_RET::
RET
_SET_MSR::
PUSH RBP
MOV RBP,RSP
MOV RAX,SF_ARG2[RBP]
MOV RDX,RAX
SHR RDX,32
MOV RCX,SF_ARG1[RBP]
WRMSR
POP RBP
RET1 16
_SYS_HLT::
CLI
@@05: HLT
JMP @@05
}