📄 stdfunc.asm
字号:
model large compiler_text,pascal
include compiler.inc
.data
extrn CurRegs:dword
.code compiler_text
public StdFunction
StdFunction proc near
les bx,CurrentSymbol
mov bx,es:[bx]
test CompilerFlags.B0,cfDebugging
jz @@1
test bx,fnImmediate
jnz @@1
mov ax,133
Chain CompileError
@@1: and bx,not (fnNeed8087+fnImmediate)
Invoke GetToken
mov ax,cs:@@2[bx+2]
jmp cs:@@2[bx]
@@2 dw _NewFunc,0
dw _Eof,_GetSEoln
dw _Eof,_GetSEof
dw _Eof,_GetTEoln
dw _Eof,_GetTEof
dw _FilePos,_GetFPos
dw _FilePos,_GetFSize
dw _UpCase,0
dw _Abs,0
dw _Sqr,0
dw _Succ,SuccTbl
dw _Succ,PredTbl
dw _Odd,0
dw _Ord,0
dw _Chr,0
dw _Ptr,0
dw _Ofs,1
dw _Ofs,2
dw _CSeg,CSegTbl
dw _CSeg,DSegTbl
dw _CSeg,SSegTbl
dw _CSeg,SPtrTbl
dw _SizeOf,0
dw _Sqrt,SqrtTb
dw _Sqrt,IntTb
dw _Sqrt,SinTb
dw _Sqrt,CosTb
dw _Sqrt,ArcTanT
dw _Sqrt,LnTb
dw _Sqrt,ExpTb
dw _Trunc,TruncTb
dw _Trunc,RoundTb
dw _MemAvail,MemAvTb
dw _MemAvail,MaxAvTb
dw _Length,0
dw _Pos,0
dw _Copy,0
dw _Concat,0
dw _IOResult,_GetIORes
dw _Sqrt,FracTb
dw _Random,0
dw _ParamStr,0
dw _ParamCount,_GetParCnt
dw _Lo,0
dw _Hi,0
dw _Swap,0
dw _Pi,0
dw _Ofs,0
dw _TypeOf,0
TruncTb dw _FTrunc+fnNeed8087,_RTrunc
RoundTb dw _FRound+fnNeed8087,_RRound
IntTb dw _FInt+fnNeed8087,_RInt
FracTb dw _FFrac+fnNeed8087,_RFrac
SqrtTb dw _FSqrt+fnNeed8087,_RSqrt
SinTb dw _FSin+fnNeed8087,_RSin
CosTb dw _FCos+fnNeed8087,_RCos
LnTb dw _FLn+fnNeed8087,_RLn
ExpTb dw _FExp+fnNeed8087,_RExp
ArcTanT dw _FArcTan+fnNeed8087,_RArcTan
CSegTbl dw 0c88ch,rCS ; mov ax,cs
DSegTbl dw 0d88ch,rDS ; mov ax,ds
SSegTbl dw 0d08ch,rSS ; mov ax,ss
SPtrTbl dw 0e089h,rSP ; mov ax,sp
MemAvTb dw _GetFreMem,MemAvailProc
MaxAvTb dw _GetFreMax,MaxAvailProc
StdFunction endp
_Abs proc near
Invoke GetNumParam
Invoke GetVarValue
les bx,[di].exType
cmp es:[bx].tdType,ttInteger
jne @@4
cmp [di].exLocation,elImmediate
je @@2
mov al,emInteger
mov ah,[di].exModifier
Invoke IntExtension
Invoke ConvertOrdinal
test [di].exModifier,emXX
jnz @@1
or [di].exRegsUsed,erDX
Invoke UseExpr
mov al,lvAX
Invoke LoadValue
mov al,99h ; cwd
Invoke PutByte
mov ax,0d031h ; xor ax,dx
Invoke PutWord
mov ax,0d029h ; sub ax,dx
Invoke PutWord
Chain DoneExpr
@@1: Invoke UseExpr
mov al,lvAX
Invoke LoadValue
mov ax,_LongAbs
Invoke PutSystemCall
Invoke DoneExpr
mov [di].exRegsUsed,erAll
ret
@@2: cmp [di].exValue.W2,0
jns @@3
xor ax,ax
xor dx,dx
sub ax,[di].exValue.W0
sbb dx,[di].exValue.W2
Chain SetValue
@@3: ret
@@4: cmp es:[bx].tdType,tt8087
jne @@7
cmp [di].exLocation,elImmediate
je @@6
@@5: Invoke ConvReal2Ext
Invoke PushExt
Invoke UseExpr
Invoke PutEmulInt
mov ax,0e135h ; fabs
Invoke PutWord
Chain DoneExpr
@@6: and [di].exValue.B9,7fh
ret
@@7: test CompilerOptions,co8087
jnz @@5
Invoke UseExpr
mov al,lrR1
Invoke LoadReal
mov ax,0e680h ; and dh,7fh
Invoke PutWord
mov al,7fh
Invoke PutByte
Chain DoneExpr
_Abs endp
_Sqr proc near
Invoke GetNumParam
cmp es:[bx].tdType,ttInteger
jne @@2
mov al,emInteger
mov ah,[di].exModifier
Invoke IntExtension
Invoke ConvertOrdinal
test [di].exModifier,emXX
jnz @@1
Invoke UseExpr
mov al,lvAX
Invoke LoadValue
mov ax,0e8f7h ; mul ax
Invoke PutWord
Invoke DoneExpr
or [di].exRegsUsed,erDX
ret
@@1: Invoke UseExpr
mov al,lvAX
Invoke LoadValue
mov ax,_LongSqr
Invoke PutSystemCall
Invoke DoneExpr
mov [di].exRegsUsed,erAll
ret
@@2: test CompilerOptions,co8087
jz @@3
Invoke ConvReal2Ext
Invoke PushExt
Invoke UseExpr
Invoke PutEmulInt
mov ax,0c035h ; fld st(0)
Invoke PutWord
Invoke PutEmulInt
mov ax,0c93ah ; fmul
Invoke PutWord
Chain DoneExpr
@@3: Invoke ConvExt2Real
Invoke UseExpr
mov al,lrR1
Invoke LoadReal
mov ax,_RSqr
Invoke PutSystemCall
Chain DoneExpr
_Sqr endp
_Succ proc near
push ax
Invoke GetOrdParam
Invoke GetVarValue
pop si
cmp [di].exLocation,elImmediate
je @@3
cmp [di].exLocation,elAddress
je @@4
Invoke UseExpr
mov al,lvAX
Invoke LoadValue
test [di].exModifier,emXX
jnz @@2
test [di].exModifier,emX
jnz @@1
mov ax,cs:[si+1]
Invoke PutWord
Chain DoneExpr
@@1: mov al,cs:[si+3]
Invoke PutByte
Chain DoneExpr
@@2: mov ax,cs:[si+4]
Invoke PutWord
mov ax,cs:[si+6]
Invoke PutWord
mov ax,cs:[si+8]
Invoke PutWord
Chain DoneExpr
@@3: mov al,cs:[si]
cbw
cwd
add ax,[di].exValue.W0
adc dx,[di].exValue.W2
Chain SetValue
@@4: mov al,cs:[si]
cbw
add [di].exValue.Offs,ax
ret
SuccTbl db 1
inc al
inc ax
add ax,1
adc dx,0
PredTbl db -1
dec al
dec ax
sub ax,1
sbb dx,0
_Succ endp
_Odd proc near
Invoke GetIntParam
Invoke GetVarValue
mov [di].exModifier,emBoolean
cmp [di].exLocation,elImmediate
je @@1
Invoke UseExpr
mov al,lvAX
Invoke LoadValue
mov ax,0e8d0h ; shr al,1
Invoke PutWord
Invoke DoneExpr
mov al,cdBelow
Chain _SetCondition
@@1: and [di].exValue.W0,1
and [di].exValue.W2,0
Chain CastBoolean
_Odd endp
_Ord proc near
Invoke GetOrdParam
Invoke MarkReadOnly
Chain CastLongint
_Ord endp
_Chr proc near
Invoke GetIntParam
Invoke MarkReadOnly
mov al,emByte
Invoke ConvertOrdinal
mov ax,SystemUnit
mov [di].exType.Offs,_Char
mov [di].exType.Segm,ax
ret
_Chr endp
_UpCase proc near
Invoke NeedOParen
Invoke GetExpr
cmp es:[bx].tdType,ttChar
jne @@1
Invoke NeedCParen
Invoke CastByte
Invoke PushValue
Invoke UseExpr
mov ax,_UpperCase
Invoke PutSystemCall
Invoke DoneExpr
mov [di].exLocation,elRegister
mov [di].exModifier,emByte
mov [di].exRegsUsed,erAll
mov [di].exMisc,lvAX
ret
@@1: mov ax,106
Chain CompileError
_UpCase endp
_Lo proc near
Invoke GetIntParam
Invoke MarkReadOnly
mov al,emByte
Chain ConvertOrdinal
_Lo endp
_Hi proc near
Invoke GetIntParam
Invoke MarkreadOnly
Invoke GetVarValue
cmp [di].exLocation,elImmediate
je @@3
mov al,emWord
Invoke ConvertOrdinal
cmp [di].exLocation,elMemory
jne @@1
inc [di].exValue.Offs
jmp short @@2
@@1: Invoke UseExpr
mov al,lvAX
Invoke LoadValue
mov ax,0e088h ; mov al,ah
Invoke PutWord
Invoke DoneExpr
@@2: mov [di].exModifier,emByte
ret
@@3: mov al,[di].exValue.B1
xor ah,ah
xor dx,dx
Chain SetValue
_Hi endp
_Swap proc near
Invoke GetIntParam
Invoke GetVarValue
cmp [di].exLocation,elImmediate
je @@1
mov al,emWord
Invoke ConvertOrdinal
Invoke UseExpr
mov al,lvAX
Invoke LoadValue
mov ax,0c486h ; xchg al,ah
Invoke PutWord
Chain DoneExpr
@@1: mov ax,[di].exValue.W0
xchg al,ah
xor dx,dx
Chain SetValue
_Swap endp
Loc Temp,byte,<size TExpr>
_Ptr proc near
Entry
Invoke NeedOParen
push di
lea di,Temp
Invoke GetIntExpr
Invoke GetVarValue
Invoke CastWord
pop di
Invoke NeedComma
Invoke GetIntExpr
Invoke GetVarValue
Invoke CastWord
Invoke NeedCParen
lea si,Temp
cmp [di].exLocation,elImmediate
jne @@1
cmp [si].exLocation,elImmediate
jne @@1
mov ax,[si].exValue.W0
mov [di].exValue.Segm,ax
jmp short @@2
@@1: Invoke MakePtr
Invoke DoneExpr
mov al,[si].exRegsUsed
or [di].exRegsUsed,al
@@2: mov [di].exModifier,emLongint
Invoke CastPointer
Exit
_Ptr endp
_Ofs proc near
push ax
Invoke NeedOParen
Invoke GetRef
pop cx
push cx
Invoke GetAddress
Invoke NeedCParen
pop cx
cmp cl,1
jb @@2
je @@1
mov ax,2
Invoke SwapSegOfs
@@1: mov al,emWord
Invoke ConvertOrdinal
Chain CastLongint
@@2: Chain CastPointer
_Ofs endp
_CSeg proc near
mov si,ax
test CompilerFlags.B0,cfDebugging
jnz @@1
mov ax,cs:[si]
Invoke PutWord
Invoke DoneExpr
mov [di].exLocation,elRegister
mov [di].exModifier,emWord
mov [di].exRegsUsed,erAX
mov [di].exMisc,lvAX
Chain CastLongint
@@1: Invoke CheckProgLoaded
mov [di].exCode,0
mov [di].exLocation,elImmediate
mov [di].exRegsUsed,0
les bx,CurRegs
add bx,cs:[si+2]
mov ax,es:[bx]
xor dx,dx
Invoke SetValue
Chain CastLongint
_CSeg endp
_SizeOf proc near
Invoke NeedOParen
Invoke GetSymbol
mov al,CurrentToken
cmp al,t_Type
je @@2
cmp al,tString
je @@2
cmp al,tFile
je @@2
Invoke GetReference
les bx,[di].exType
cmp es:[bx].tdType,ttObject
jne @@3
cmp es:[bx].otVMTSize,0
je @@3
mov ax,es:[bx].otVMTOffset
add [di].exValue.Offs,ax
test CompilerFlags.B0,cfDebugging
jnz @@1
Invoke UseExpr
mov dx,388bh ; mov di,...
Invoke AddReg
mov ax,058bh ; mov di,[di]
Invoke PutWord
Invoke DoneExpr
mov [di].exLocation,elRegister
mov [di].exModifier,emWord
or [di].exRegsUsed,erAX
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -