www.pudn.com > tp60src.zip > 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,_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 mov [di].exMisc,lvAX jmp short @@5 @@1: Invoke CheckProgLoaded les bx,dword ptr [di].exValue mov bx,es:[bx] mov es,DataSegment.Segm mov ax,es:[bx] jmp short @@4 @@2: push di Invoke GetTypeName mov bx,di pop di @@3: mov ax,es:[bx].tdSizeOf @@4: xor dx,dx mov [di].exCode,dx mov [di].exLocation,elImmediate mov [di].exRegsUsed,dl Invoke SetValue @@5: Invoke NeedCParen Chain CastLongint _SizeOf endp _TypeOf proc near Invoke NeedOParen Invoke GetSymbol cmp CurrentToken,t_Type je @@2 Invoke GetReference les bx,[di].exType call Check mov ax,es:[bx].otVMTOffset add [di].exOffset,ax test CompilerFlags.B0,cfDebugging jnz @@1 Invoke UseExpr mov [di].exModifier,emWord mov al,lvAX Invoke LoadValue mov ax,0da8ch ; mov dx,ds Invoke PutWord Invoke DoneExpr mov [di].exLocation,elRegister mov [di].exModifier,emLongint or [di].exRegsUsed,erAX+erDX mov [di].exMisc,lvAX jmp short @@5 @@1: Invoke CheckProgLoaded les bx,dword ptr [di].exValue mov ax,es:[bx] jmp short @@4 @@2: push di Invoke GetTypeName mov bx,di pop di call Check test CompilerFlags.B0,cfDebugging jnz @@3 xor ax,ax mov cx,es:[bx].otVMTAddr mov [di].exCode,ax mov [di].exRegsUsed,al mov [di].exLocation,elAddress mov [di].exModifier,emLongint mov [di].exMisc,efDS+efConst mov [di].exOffset,ax mov [di].exMap,cx mov [di].exSegment,es jmp short @@5 @@3: Invoke CheckProgLoaded mov bx,es:[bx].otVMTAddr add bx,es:uhConstMap mov ax,es:[bx] cmp ax,-1 je @@6 @@4: mov dx,DataSegment.Segm mov [di].exCode,0 mov [di].exLocation,elImmediate mov [di].exRegsUsed,0 Invoke SetValue @@5: Invoke NeedCParen Chain CastPointer Check proc near cmp es:[bx].tdType,ttObject jne @@1 cmp es:[bx].otVMTSize,0 je @@1 ret @@1: mov ax,147 Chain CompileError Check endp @@6: mov ax,139 Chain CompileError _TypeOf endp _Sqrt proc near push ax Invoke GetNumParam pop si ZZT label near test CompilerOptions,co8087 jz @@1 push cs:[si] Invoke ConvInt2Ext Invoke ConvReal2Ext Invoke PushExt Invoke UseExpr jmp short @@2 @@1: push cs:[si+2] Invoke ConvInt2Real Invoke ConvExt2Real Invoke UseExpr mov al,lrR1 Invoke LoadReal @@2: pop ax Invoke PutSystemCall Invoke DoneExpr mov [di].exRegsUsed,erAll ret _Sqrt endp _Trunc proc near push ax Invoke GetNumParam Invoke GetVarValue pop si cmp [di].exLocation,elImmediate jne @@2 Invoke ConvInt2Ext xor ax,ax cmp si,offset TruncTb je @@1 inc ax @@1: lea bx,[di].exValue Invoke TruncExtended mov ax,[bx].W0 mov dx,[bx].W2 Invoke SetValue Chain CastLongint @@2: call ZZT mov [di].exLocation,elRegister mov [di].exModifier,emLongint mov [di].exMisc,lvAX Chain CastLongint _Trunc endp _Pi proc near mov [di].exCode,0 mov [di].exLocation,elImmediate mov [di].exModifier,emExtended mov [di].exRegsUsed,0 mov [di].exValue.W0,0c235h mov [di].exValue.W2,2168h mov [di].exValue.W4,0daa2h mov [di].exValue.W6,0c90fh mov [di].exValue.W8,4000h Chain CastExtended _Pi endp _Random proc near Invoke CheckOParen jnz @@1 Invoke GetIntExpr Invoke NeedCParen Invoke CastWord Invoke PushValue Invoke UseExpr mov ax,_RandInt Invoke PutSystemCall Invoke DoneExpr mov [di].exLocation,elRegister mov [di].exModifier,emWord mov [di].exRegsUsed,erAll mov [di].exMisc,lvAX Chain CastLongint @@1: test CompilerOptions,co8087 jnz @@2 mov ax,_RandReal Invoke PutSystemCall Invoke DoneExpr mov [di].exLocation,elRegister mov [di].exModifier,emReal mov [di].exRegsUsed,erAll Chain CastReal @@2: mov ax,_RandFloat+fnNeed8087 Invoke PutSystemCall Invoke DoneExpr mov [di].exLocation,elStack mov [di].exModifier,emExtended mov [di].exRegsUsed,erAll Chain CastExtended _Random endp _NewFunc proc near Invoke NeedOParen push di Invoke GetTypeName mov bx,di pop di cmp es:[bx].tdType,ttPointer jne @@1 Invoke _New Chain NeedCParen @@1: mov ax,33 Chain CompileError _NewFunc endp _MemAvail proc near xchg ax,si test CompilerFlags.B0,cfDebugging jnz @@1 mov ax,cs:[si] Invoke PutSystemCall Invoke DoneExpr mov [di].exLocation,elRegister mov [di].exModifier,emLongint mov [di].exRegsUsed,erAll mov [di].exMisc,lvAX Chain CastLongint @@1: Invoke CheckProgLoaded call word ptr cs:[si+2] mov [di].exCode,0 mov [di].exLocation,elImmediate mov [di].exRegsUsed,0 Invoke SetValue Chain CastLongint MemAvailProc proc near lea bx,@@4 jmp short Avail @@1: add dx,1000h jmp short @@3 @@2: add ax,[si+4] jc @@1 @@3: add dx,[si+6] lds si,[si] @@4: mov bx,ds cmp bx,cx jne @@2 ret MemAvailProc endp MaxAvailProc proc near lea bx,@@4 jmp short Avail @@1: cmp dx,[si+6] ja @@3 jb @@2 cmp ax,[si+4] jae @@3 @@2: mov ax,[si+4] mov dx,[si+6] @@3: lds si,[si] @@4: mov bx,ds cmp bx,cx jne @@1 ret MaxAvailProc endp Avail proc near push ds lds si,DataSegment mov ax,[si]._HeapEnd.Offs mov dx,[si]._HeapEnd.Segm sub ax,[si]._HeapPtr.Offs sbb dx,[si]._HeapPtr.Segm and ax,0fh mov cx,[si]._HeapPtr.Segm lds si,[si]._FreeList call bx mov cl,4 rol dx,cl mov cx,dx and cl,0f0h and dx,0fh add ax,cx adc dx,0 pop ds ret Avail endp _MemAvail endp _Length proc near Invoke NeedOParen Invoke GetStringExpr Invoke NeedCParen Invoke MarkReadOnly Chain StringLength _Length endp _Pos proc near Loc S,byte, Entry Invoke NeedOParen Invoke PushStringExpr push di Invoke NeedComma lea di,S Invoke PushStringExpr Invoke NeedCParen pop di Invoke UseExpr mov ax,S.exCode Invoke UseGoal mov ax,_SPos Invoke PutSystemCall Invoke DoneExpr mov [di].exLocation,elRegister mov [di].exModifier,emInteger mov [di].exRegsUsed,erAll mov [di].exMisc,lvAX Invoke CastLongint Exit _Pos endp _Copy proc near Loc Index,byte, Loc Count,byte, Entry Invoke NeedOParen Invoke PushStringExpr push di Invoke NeedComma lea di,Index Invoke GetIntExpr Invoke CastInt Invoke PushValue Invoke NeedComma lea di,Count Invoke GetIntExpr Invoke CastInt Invoke PushValue Invoke NeedCParen pop di mov ax,256 Invoke CreateLocalVar Invoke UseExpr mov ax,Index.exCode Invoke UseGoal mov ax,Count.exCode Invoke UseGoal mov ax,_SCopy Invoke PutSystemCall Invoke DoneExpr mov [di].exRegsUsed,erAll Exit _Copy endp _Concat proc near Loc S,byte, Entry Invoke NeedOParen Invoke GetStringExpr Invoke LoadString @@1: Invoke CheckComma jnz @@2 push di lea di,S Invoke PushStringExpr pop di Invoke UseExpr mov ax,S.exCode Invoke UseGoal mov ax,_SConcat Invoke PutSystemCall Invoke DoneExpr mov [di].exRegsUsed,erAll jmp @@1 @@2: Invoke NeedCParen Exit _Concat endp _ParamStr proc near Invoke GetIntParam Invoke CastInt Invoke PushValue mov ax,256 Invoke CreateLocalVar Invoke UseExpr mov ax,_GetParStr Invoke PutSystemCall Invoke DoneExpr mov [di].exRegsUsed,erAll Chain CastString _ParamStr endp _ParamCount proc near Invoke PutSystemCall Invoke DoneExpr mov [di].exLocation,elRegister mov [di].exModifier,emInteger mov [di].exRegsUsed,erAll mov [di].exMisc,lvAX Chain CastLongint _ParamCount endp _IOResult proc near test CompilerFlags.B0,cfDebugging jnz @@1 call _ParamCount mov [di].exRegsUsed,erAX ret @@1: Invoke CheckProgLoaded les bx,DataSegment mov ax,es:[bx]._InOutRes cwd mov [di].exCode,0 mov [di].exLocation,elImmediate mov [di].exRegsUsed,0 Invoke SetValue Chain CastLongint _IOResult endp _Eof proc near push ax Invoke CheckOParen jz @@1 xor ax,ax mov dx,_Input Invoke DefaultFile jmp short @@3 @@1: Invoke PushFileRef cmp es:[bx].tdType,ttText je @@2 pop ax cmp ax,_GetTEof jne @@4 mov ax,_GetFEof push ax @@2: Invoke NeedCParen Invoke UseExpr @@3: pop ax Invoke PutSystemCall Invoke CheckIOResult Invoke DoneExpr mov [di].exLocation,elRegister mov [di].exModifier,emBoolean mov [di].exRegsUsed,erAll mov [di].exMisc,lvAX Chain CastBoolean @@4: mov ax,63 Chain CompileError _Eof endp _FilePos proc near push ax Invoke NeedOParen Invoke PushFileRef cmp es:[bx].tdType,ttFile jne @@1 Invoke NeedCParen Invoke UseExpr pop ax Invoke PutSystemCall Invoke CheckIOResult Invoke DoneExpr mov [di].exLocation,elRegister mov [di].exModifier,emLongint mov [di].exRegsUsed,erAll mov [di].exMisc,lvAX Chain CastLongint @@1: mov ax,63 Chain CompileError _FilePos endp end