www.pudn.com > tp60src.zip > EXPR.ASM
model large compiler_text,pascal include compiler.inc .data extrn Rg:word .code compiler_text public GetExpression public GetExpr public GetBooleanExpr public GetNestedRef public GetTopScope public _GetMethod public GetAddress public CheckProgLoaded public GetReference public GetRef public GetLvalue public Qualifier public LoadPtr GetExpression proc near les bx,[si].exType cmp es:[bx].tdType,ttProc je @@3 xchg si,di Invoke CheckPackedChar xchg si,di jz @@1 GetExpr label near call Expression Invoke Cond2Number les bx,[di].exType ret @@1: push si call GetExpr pop si cmp es:[bx].tdType,ttString jne @@2 cmp [di].exLocation,elImmediate jne @@2 mov bx,SymbolValue.W0 les si,[si].exType mov ax,es:[si].tdSizeOf cmp al,[bx] jne @@2 mov dl,es:[si].tdModifier mov [di].exType.Offs,si mov [di].exType.Segm,es mov [di].exModifier,dl inc bx Invoke PutConst mov [di].exCode,0 mov [di].exLocation,elMemory mov [di].exRegsUsed,0 mov [di].exMisc,efDS+efConst mov [di].exOffset,dx mov [di].exMap,bx mov [di].exSegment,ax @@2: ret @@3: call GetRef mov ch,-1 jmp GetAddress GetExpression endp GetBooleanExpr proc near call Expression Invoke GetVarValue les bx,[di].exType cmp es:[bx].tdType,ttBoolean jne @@2 cmp [di].exLocation,elImmediate je @@1 Invoke Number2Cond Invoke UseExpr mov al,[di].exMisc xor al,1 lea bx,[di].exChain2 Invoke PutJmp lea bx,[di].exChain1 Invoke PutLabel Chain DoneExpr @@1: ret @@2: mov ax,40 Chain CompileError GetBooleanExpr endp Expression proc near call Expr1 lea bx,@@7 Invoke ChooseToken jnz @@4 Invoke GetToken mov al,cs:[bx+1] sub sp,size TExpr mov si,sp push ax di mov di,si call Expr1 mov si,di pop di ax Invoke Operation add sp,size TExpr @@1: ret @@2: mov ax,41 Chain CompileError @@3: mov ax,26 Chain CompileError @@4: mov al,tIn Invoke CheckToken jnz @@1 sub sp,size TExpr mov si,sp push di mov di,si call Expr1 Invoke GetVarValue mov si,di pop di les bx,[si].exType cmp es:[bx].tdType,ttSet jne @@2 mov cx,es:[bx].stBase.Offs mov bx,es:[bx].stBase.Segm mov es,es:[bx] mov bx,cx mov ax,es:[bx].itBase.Offs mov bx,es:[bx].itBase.Segm mov dx,es:[bx] les bx,[di].exType cmp ax,es:[bx].itBase.Offs jne @@3 mov bx,es:[bx].itBase.Segm cmp dx,es:[bx] jne @@3 Invoke GetVarValue Invoke Cond2Number Invoke CastByte cmp [di].exLocation,elImmediate jne @@5 cmp [si].exLocation,elImmediate jne @@5 mov bx,[di].exValue.W0 mov cl,3 shr bx,cl add bx,[si].exOffset mov al,[bx] mov cl,[di].exValue.B0 and cl,7 shr al,cl and al,1 Invoke StoreBoolean jmp short @@6 @@5: Invoke PushValue xchg si,di Invoke _LoadSet Invoke PushAddr xchg si,di Invoke Use2Exprs mov ax,_ZInTest Invoke PutSystemCall Invoke DoneExpr mov [di].exRegsUsed,erAll mov al,cdNotEqual Invoke _SetCondition @@6: add sp,size TExpr ret @@7 db 6,2 db tEqual,opEqual db tNotEqual,opNotEqual db tGreater,opGreater db tLess,opLess db tGEq,opGEq db tLEq,opLEq Expression endp Expr1 proc near call Expr2 @@1: lea bx,@@3 Invoke ChooseToken jnz @@2 Invoke GetToken mov al,cs:[bx+1] sub sp,size TExpr mov si,sp push ax di mov di,si call Expr2 mov si,di pop di ax Invoke Operation add sp,size TExpr jmp @@1 @@2: ret @@3 db 4,2 db tPlus,opPlus db tMinus,opMinus db tOr,opOr db tXor,opXor Expr1 endp Expr2 proc near call Primary @@1: lea bx,@@3 Invoke ChooseToken jnz @@2 Invoke GetToken mov al,cs:[bx+1] sub sp,size TExpr mov si,sp push ax di mov di,si call Primary mov si,di pop di ax Invoke Operation add sp,size TExpr jmp @@1 @@2: ret @@3 db 7,2 db tTimes,opTimes db tSlash,opSlash db tDiv,opDiv db tMod,opMod db tAnd,opAnd db tShl,opShl db tShr,opShr Expr2 endp Primary proc near Invoke ProcessCaret Invoke GetSymbol lea bx,@@7 Invoke ChooseToken jnz @@5 call cs:[bx+1] @@1: les bx,[di].exType cmp es:[bx].tdType,ttProc jne @@2 test CompilerFlags.B0,cfDebugging jnz @@4 cmp es:[bx].ptResult.Offs,0 je @@3 Invoke PutCall Invoke ReturnValue @@2: call Qualifier jz @@1 ret @@3: cmp [di].exLocation,elCall jne @@6 test es:[bx-psType].psFlags,pfConstructor jz @@6 Invoke PutCall Invoke UseExpr mov ax,0d009h ; or ax,dx Invoke PutWord Invoke DoneExpr mov [di].exRegsUsed,erAll mov al,cdNotEqual Chain _SetCondition @@4: xor cx,cx call GetAddress Chain CastPointer @@5: mov ax,42 Chain CompileError @@6: mov ax,143 Chain CompileError @@7 db 19,3 db t_Var dw ProcessVar db t_Constant dw ProcessConst db t_Proc dw ProcessProc db t_StdFun dw ProcessStdFun db tOParen dw ProcessParens db t_Const dw ProcessConst db tMinus dw ProcessMinus db tPlus dw ProcessMinus db tNot dw ProcessNot db tNil dw ProcessNil db t_Type dw ProcessType db tString dw ProcessType db tFile dw ProcessType db tOBracket dw ProcessSet db t_New dw ProcessStdFun db tAt dw ProcessAt db t_Mem dw ProcessMem db t_Port dw ProcessPort db t_Reg dw ProcessReg Primary endp ProcessStdFun proc near Chain StdFunction ProcessStdFun endp ProcessVar proc near Invoke GetToken les si,CurrentSymbol mov bx,es:[si].vsType.Offs mov si,es:[si].vsType.Segm mov es,es:[si] mov [di].exType.Offs,bx mov [di].exType.Segm,es mov al,es:[bx].tdModifier mov [di].exModifier,al mov [di].exLocation,elMemory mov [di].exRegsUsed,0 les si,CurrentSymbol @@1: mov al,es:[si] test al,vfAlias jz @@2 mov bx,es:[si].vsLink.Segm mov si,es:[si].vsLink.Offs mov es,es:[bx] jmp @@1 @@2: test al,vfField jz @@3 call GetRecordRef mov ax,es:[si].vsOffset add [di].exOffset,ax ret @@3: test CompilerFlags.B0,cfDebugging jnz @@10 mov dx,es:[si].vsOffset mov [di].exOffset,dx and al,vfType cmp al,vfVar je @@6 cmp al,vfConst je @@5 cmp al,vfLocal je @@4 mov ax,es:[si].vsAddress.Segm mov [di].exValue.Segm,ax mov [di].exMisc,0 jmp short @@8 @@4: mov dx,es:[si].vsScope call GetLocalRef jmp short @@8 @@5: mov [di].exMisc,efDS+efConst jmp short @@7 @@6: mov [di].exMisc,efDS @@7: mov ax,es:[si].vsMap mov [di].exMap,ax mov [di].exSegment,es @@8: test es:[si].vsFlags,vfAddress jz @@9 mov dx,38c4h ; les di, Invoke AddReg mov [di].exMisc,efES+efDI mov [di].exOffset,0 @@9: Chain DoneExpr @@10: call CheckProgLoaded mov cl,al and al,vfType cmp al,vfVar je @@12 cmp al,vfConst je @@11 cmp al,vfLocal je @@14 les bx,es:[si].vsAddress jmp short @@15 @@11: mov bx,uhConstMap jmp short @@13 @@12: mov bx,uhDataMap @@13: mov ax,es:[si].vsOffset mov si,es:[si].vsMap add si,es:[bx] mov bx,es:[si].smAddr cmp bx,-1 je @@17 add bx,ax mov ax,ProgramSegment add ax,DataStart mov es,ax jmp short @@15 @@14: mov ax,es:[si].vsOffset push ax cx mov si,es:[si].vsScope mov bl,es:[si].seName.B0 mov bh,0 lea si,[si+size TSymbol+bx] Invoke GetStackFrame pop cx ax add bx,ax @@15: test cl,vfAddress jz @@16 les bx,es:[bx] @@16: xor ax,ax mov [di].exCode,ax mov [di].exMisc,al mov [di].exValue.Offs,bx mov [di].exValue.Segm,es ret @@17: mov ax,139 Chain CompileError ProcessVar endp GetRecordRef proc near test CompilerFlags.B0,cfDebugging jnz @@4 mov bx,CurrentWith or bx,bx jnz @@1 mov cx,7ec4h ; les di,[bp-...] xor dx,dx call GetNestedRef jmp short @@2 @@1: mov [di].exLocation,elMemory mov al,[bx].wcFlags mov [di].exMisc,al mov ax,[bx].wcOffset mov [di].exOffset,ax mov ax,[bx].wcMap mov [di].exMap,ax mov ax,[bx].wcSegment mov [di].exSegment,ax cmp [bx].wcType,wfNoTempVar je @@3 mov dx,38c4h ; les di, Invoke AddReg @@2: mov [di].exMisc,efES+efDI mov [di].exOffset,0 @@3: Chain DoneExpr @@4: call CheckProgLoaded push es si call GetTopScope Invoke GetStackFrame les bx,es:[bx+6] mov [di].exValue.Offs,bx mov [di].exValue.Segm,es pop si es ret GetRecordRef endp GetLocalRef proc near mov [di].exMisc,efSS+efBP cmp dx,CurScope jne @@1 ret @@1: mov [di].exMisc,efSS+efDI mov cx,7e8bh ; mov di,[bp-...] GetNestedRef label near push es si mov es,Dictionary.segm mov si,CurProc test es:[si].psFlags,pfMethod jnz @@3 cmp dx,es:[si].psScope je @@3 dec ch mov ax,7e8bh ; mov di,[bp+...] call GetParentScope @@2: mov si,es:[si].psScope mov bl,es:[si].seName.B0 mov bh,0 lea si,[si+size TSymbol+bx] mov al,36h ; ss: Invoke PutByte test es:[si].psFlags,pfMethod jnz @@3 cmp dx,es:[si].psScope je @@3 mov ax,7d8bh ; mov di,[di+...] call GetParentScope jmp @@2 @@3: mov ax,cx call GetParentScope pop si es ret GetLocalRef endp GetParentScope proc near Invoke PutWord mov al,4 test es:[si].psFlags,pfFar jz @@1 mov al,6 @@1: Chain PutByte GetParentScope endp GetTopScope proc near mov es,Dictionary.segm mov si,CurScope jmp short @@2 @@1: mov bl,es:[si].seName.B0 xor bh,bh lea si,[si+size TSymbol+bx] test es:[si].psFlags,pfMethod jnz @@3 mov si,es:[si].psScope @@2: or si,si jnz @@1 @@3: ret GetTopScope endp ProcessConst proc near cmp CurrentToken,t_Constant je @@3 les si,CurrentSymbol mov bx,es:[si].csType.Offs mov si,es:[si].csType.Segm mov es,es:[si] mov SymbolType.Offs,bx mov SymbolType.Segm,es mov al,es:[bx].tdType les si,CurrentSymbol add si,csValue cmp al,ttString je @@1 cmp al,ttSet jne @@4 mov cx,32 jmp short @@2 @@1: mov cl,es:[si] xor ch,ch inc cx @@2: mov ax,cx Invoke AllocTempBuf mov SymbolValue.W0,bx push di mov di,bx push ds es pop ds es rep movsb push es pop ds di @@3: lea si,SymbolValue push ds pop es @@4: push di add di,exValue push ds es pop ds es mov cx,5 rep movsw push es pop ds di les bx,SymbolType mov [di].exType.Offs,bx mov [di].exType.Segm,es mov [di].exCode,0 mov [di].exLocation,elImmediate mov [di].exRegsUsed,0 mov al,es:[bx].tdModifier cmp es:[bx].tdType,ttInteger jb @@5 mov ax,[di].exValue.W0 mov dx,[di].exValue.W2 Invoke FitConstType @@5: mov [di].exModifier,al Chain GetToken ProcessConst endp ProcessProc proc near mov [di].exCode,0 mov [di].exRegsUsed,0 les si,CurrentSymbol test es:[si].psFlags,pfMethod jz @@1 call GetRecordRef @@1: mov al,0 _ProcessProc label near add si,psType mov [di].exType.Offs,si mov [di].exType.Segm,es mov [di].exLocation,elCall mov [di].exModifier,al mov ax,CurrentOwner.Offs mov [di].exOwner.Offs,ax mov ax,CurrentOwner.Segm mov [di].exOwner.Segm,ax Chain GetToken ProcessProc endp ProcessParens proc near mov al,tOParen Invoke NeedToken call Expression mov al,tCParen Chain NeedToken ProcessParens endp ProcessMinus proc near Invoke GetPlusMinus push ax call Primary pop ax cmp al,tMinus je @@1 ret @@1: Invoke GetVarValue les bx,[di].exType mov al,es:[bx].tdType cmp al,ttInteger jne @@4 cmp [di].exLocation,elImmediate je @@3 mov al,emInteger mov ah,[di].exModifier Invoke IntExtension Invoke ConvertOrdinal Invoke UseExpr mov al,lvAX Invoke LoadValue mov ax,0d8f7h ; neg ax Invoke PutWord test [di].exModifier,emXX jz @@2 mov ax,0d283h ; adc dx,0 Invoke PutWord mov al,0 Invoke PutByte mov ax,0daf7h ; neg dx Invoke PutWord @@2: Chain DoneExpr @@3: xor ax,ax xor dx,dx sub ax,[di].exValue.W0 sbb dx,[di].exValue.W2 Chain SetValue @@4: cmp al,tt8087 jne @@8 cmp [di].exLocation,elImmediate je @@6 @@5: Invoke ConvReal2Ext Invoke PushExt Invoke UseExpr Invoke PutEmulInt mov ax,0e035h ; fchs Invoke PutWord Chain DoneExpr @@6: cmp [di].exValue.W8,0 je @@7 xor [di].exValue.B9,80h @@7: ret @@8: cmp al,ttReal jne @@9 test CompilerOptions,co8087 jnz @@5 Invoke UseExpr mov al,lrR1 Invoke LoadReal mov ax,0c008h ; or al,al Invoke PutWord mov ax,374h ; jz $+5 Invoke PutWord mov ax,0f680h ; xor dh,80h Invoke PutWord mov al,80h Invoke PutByte Chain DoneExpr @@9: mov ax,41 Chain CompileError ProcessMinus endp ProcessNot proc near Invoke GetToken call Primary Invoke GetVarValue les bx,[di].exType cmp es:[bx].tdType,ttBoolean je @@1 cmp es:[bx].tdType,ttInteger je @@3 mov ax,41 Chain CompileError @@1: cmp [di].exLocation,elImmediate je @@2 Invoke Number2Cond xor [di].exMisc,1 mov ax,[di].exChain1 xchg ax,[di].exChain2 mov [di].exChain1,ax ret @@2: xor [di].exValue.W0,1 ret @@3: cmp [di].exLocation,elImmediate je @@5 Invoke UseExpr mov al,lvAX Invoke LoadValue mov ax,0d0f6h ; not al test [di].exModifier,emX jz @@4 mov ax,0d0f7h ; not ax test [di].exModifier,emXX jz @@4 Invoke PutWord mov ax,0d2f7h ; not dx @@4: Invoke PutWord Chain DoneExpr @@5: not [di].exValue.W0 not [di].exValue.W2 ret ProcessNot endp ProcessNil proc near Invoke GetToken mov [di].exLocation,elImmediate xor ax,ax mov [di].exCode,ax mov [di].exModifier,emLongint mov [di].exRegsUsed,al mov [di].exValue.Offs,ax mov [di].exValue.Segm,ax Chain CastPointer ProcessNil endp ProcessType proc near push di Invoke GetTypeName mov bx,di pop di cmp es:[bx].tdType,ttObject jne @@1 mov al,tPoint Invoke CheckToken jz @@7 @@1: push es bx mov al,tOParen Invoke NeedToken call GetExpr mov al,tCParen Invoke NeedToken mov al,es:[bx].tdType mov dx,es:[bx].tdSizeOf pop bx es mov [di].exType.Offs,bx mov [di].exType.Segm,es cmp [di].exLocation,elMemory jne @@3 test [di].exMisc,efReadOnly jnz @@3 or dx,dx jz @@2 cmp dx,es:[bx].tdSizeOf jne @@3 @@2: mov al,es:[bx].tdModifier mov [di].exModifier,al ret @@3: cmp al,ttInteger jae @@4 cmp al,ttPointer jne @@6 @@4: cmp es:[bx].tdType,ttInteger jae @@5 cmp es:[bx].tdType,ttPointer jne @@6 @@5: mov al,es:[bx].tdModifier push ax Invoke GetVarValue pop ax Chain ConvertOrdinal @@6: mov ax,61 Chain CompileError @@7: mov [di].exCode,0 mov [di].exRegsUsed,0 mov ax,emNotVirtual+pfMethod*256 mov dx,150 _GetMethod label near cmp CurrentToken,t_Ident jne @@8 push ax dx di mov si,bx Invoke SearchField mov cl,al mov si,di pop di dx ax jnz @@8 cmp cl,t_Proc jne @@8 test es:[si].psFlags,ah jz @@8 jmp _ProcessProc @@8: mov ax,dx Chain CompileError ProcessType endp ProcessSet proc near Loc BaseType,dword,1 Loc Temp1,byte,Loc Temp2,byte, Loc Value,byte,32 Loc Buffer,word,64 Entry Invoke GetToken push di xor ax,ax mov BaseType.Offs,ax mov BaseType.Segm,ax mov Buffer[0],ax lea di,Value push ds pop es mov cx,16 rep stosw mov al,tCBracket Invoke CheckToken jnz @@1 mov ax,SystemUnit mov BaseType.Offs,_EmptySet mov BaseType.Segm,ax jmp @@10 @@1: lea di,Temp1 call GetComponent mov al,tRange Invoke CheckToken jnz @@3 lea di,Temp2 call GetComponent cmp Temp1.exLocation,elImmediate jne @@2 cmp Temp2.exLocation,elImmediate jne @@2 mov ax,Temp1.exValue.W0 mov dx,Temp2.exValue.W0 jmp short @@4 @@2: lea di,Temp1 Invoke UseExpr Invoke PutPush lea di,Temp2 Invoke UseExpr Invoke PutPush mov ax,_ZAddRange jmp short @@7 @@3: cmp Temp1.exLocation,elImmediate jne @@6 mov ax,Temp1.exValue.W0 mov dx,ax @@4: sub dx,ax jc @@8 mov si,ax mov cl,3 shr si,cl mov cl,al and cl,7 mov al,1 shl al,cl @@5: or Value[si],al rol al,1 adc si,0 dec dx jns @@5 jmp short @@8 @@6: lea di,Temp1 Invoke UseExpr Invoke PutPush mov ax,_ZAddComp @@7: Invoke PutSystemCall Invoke DoneGoal lea bx,Buffer Invoke AddGoal @@8: mov al,tComma Invoke CheckToken jnz @@9 jmp @@1 @@9: mov al,tCBracket Invoke NeedToken @@10: mov ax,32 mov cx,ax Invoke AllocTempBuf lea si,Value mov di,bx push ds pop es rep movsb pop di les si,BaseType mov [di].exType.Offs,si mov [di].exType.Segm,es mov [di].exCode,0 mov [di].exLocation,elImmediate mov [di].exRegsUsed,0 mov [di].exOffset,bx cmp Buffer[0],0 je @@11 Invoke LoadSet Invoke UseExpr lea bx,Buffer Invoke FlushGoals Invoke DoneExpr @@11: Exit GetComponent proc near Invoke GetOrdExpr Invoke GetVarValue cmp BaseType.Offs,0 jne @@1 les bx,[di].exType mov ax,es:[bx].itBase.Offs mov bx,es:[bx].itBase.Segm mov bx,es:[bx] add ax,etSet mov BaseType.Offs,ax mov BaseType.Segm,bx @@1: les bx,[di].exType mov ax,es:[bx].itBase.Offs mov bx,es:[bx].itBase.Segm mov bx,es:[bx] add ax,etSet cmp ax,BaseType.Offs jne @@2 cmp bx,BaseType.Segm jne @@2 Chain CastByte @@2: mov ax,26 Chain CompileError GetComponent endp ProcessSet endp ProcessAt proc near Invoke GetToken call GetRef xor cx,cx call GetAddress Chain CastPointer ProcessAt endp GetAddress proc near les si,[di].exType cmp [di].exLocation,elCall je @@2 cmp es:[si].tdType,ttProc je @@1 mov [di].exLocation,elAddress mov [di].exModifier,emLongint and [di].exMisc,not efReadOnly test CompilerFlags.B0,cfDebugging jz @@1 mov [di].exLocation,elImmediate @@1: ret @@2: test CompilerFlags.B0,cfDebugging jnz @@6 mov al,es:[si-psType].psFlags test al,pfInline jnz @@5 test al,pfMethod jz @@3 test [di].exModifier,emNotVirtual jz @@5 @@3: or ch,ch jz @@4 test al,pfInterrupt+pfMethod jnz @@5 test al,pfFar jz @@5 cmp es:[si-psType].psScope,0 jne @@5 @@4: xor ax,ax mov bx,es:[si-psType].psProcMap mov [di].exLocation,elAddress mov [di].exModifier,emLongint mov [di].exRegsUsed,al mov [di].exMisc,efConst mov [di].exOffset,ax mov [di].exMap,bx mov [di].exSegment,es ret @@5: mov ax,143 Chain CompileError @@6: call CheckProgLoaded test [di].exModifier,emNotVirtual jnz @@7 mov bx,es:[si-psType].psOwner or bx,bx jz @@7 mov si,es:[si-psType].psScope mov ax,es:[si].otVMTOffset les si,dword ptr [di].exValue add si,ax mov si,es:[si] mov ax,ProgramSegment add ax,DataStart mov es,ax mov ax,es:[bx+si].Offs mov dx,es:[bx+si].Segm jmp short @@8 @@7: test es:[si-psType].psFlags,pfInline jnz @@9 mov si,es:[si-psType].psProcMap add si,es:uhProcMap mov ax,es:[si].pmEntryPoint mov si,es:[si].pmCodeMap add si,es:uhCodeMap mov dx,es:[si].smAddr cmp dx,-1 je @@9 add ax,dx mov dx,ProgramSegment add dx,es:uhCodeStart @@8: mov [di].exLocation,elImmediate mov [di].exModifier,emLongint mov [di].exValue.Offs,ax mov [di].exValue.Segm,dx ret @@9: mov ax,139 Chain CompileError GetAddress endp ProcessMem proc near Loc Temp1,byte, Loc Temp2,byte, Entry Invoke GetToken les si,CurrentSymbol mov bx,es:[si].Offs mov si,es:[si].Segm mov es,es:[si] mov [di].exType.Offs,bx mov [di].exType.Segm,es mov al,es:[bx].tdModifier mov [di].exModifier,al push di mov al,tOBracket Invoke NeedToken lea di,Temp1 Invoke GetIntExpr Invoke GetVarValue Invoke CastWord mov al,tColon Invoke NeedToken lea di,Temp2 Invoke GetIntExpr Invoke GetVarValue Invoke CastWord mov al,tCBracket Invoke NeedToken test CompilerFlags.B0,cfDebugging jnz @@1 lea di,Temp1 Invoke UseExpr mov al,lvAX Invoke LoadValue mov al,50h ; push ax Invoke PutByte lea di,Temp2 Invoke UseExpr mov al,lvDI Invoke LoadValue mov al,7 ; pop es Invoke PutByte pop di Invoke DoneExpr mov al,Temp1.exRegsUsed or al,Temp2.exRegsUsed and al,erAll mov [di].exRegsUsed,al mov [di].exMisc,efES+efDI xor ax,ax mov [di].exOffset,ax mov [di].exMap,ax mov [di].exSegment,ax jmp short @@2 @@1: pop di xor ax,ax mov [di].exCode,ax mov [di].exMisc,al mov ax,Temp2.exValue.W0 mov [di].exValue.Offs,ax mov ax,Temp1.exValue.W0 mov [di].exValue.Segm,ax @@2: mov [di].exLocation,elMemory Exit ProcessMem endp ProcessPort proc near Loc Opcode,byte,2 Entry call CheckDebugging Invoke GetToken les si,CurrentSymbol mov al,0e4h ; in al,... add al,es:[si] mov Opcode,al mov al,tOBracket Invoke NeedToken Invoke GetIntExpr Invoke CastWord mov al,tCBracket Invoke NeedToken cmp [di].exLocation,elImmediate jne @@1 mov ax,[di].exValue.W0 or ah,ah jnz @@1 mov ah,al mov al,Opcode Invoke PutWord jmp short @@2 @@1: Invoke UseExpr mov al,lvDX Invoke LoadValue mov al,Opcode or al,8 Invoke PutByte @@2: Invoke DoneExpr mov [di].exModifier,emByte test Opcode,1 jz @@3 mov [di].exModifier,emWord @@3: mov [di].exLocation,elRegister or [di].exRegsUsed,erAX mov [di].exMisc,0 Exit ProcessPort endp ProcessReg proc near Invoke GetToken les si,CurrentSymbol mov dl,es:[si] mov bx,_Byte or dl,dl js @@1 mov bx,_Word @@1: mov es,SystemUnit mov [di].exType.Offs,bx mov [di].exType.Segm,es xor ax,ax mov [di].exCode,ax mov [di].exLocation,elMemory mov cl,es:[bx].tdModifier mov [di].exModifier,cl mov [di].exRegsUsed,al mov [di].exMisc,al and dx,7fh add dx,offset Rg mov [di].exValue.Offs,dx mov [di].exValue.Segm,ds ret ProcessReg endp CheckDebugging proc near test CompilerFlags.B0,cfDebugging jnz @@1 ret @@1: mov ax,133 Chain CompileError CheckDebugging endp CheckProgLoaded proc near cmp ProgramSegment,0 je @@1 ret @@1: mov ax,139 Chain CompileError CheckProgLoaded endp GetReference proc near call LValue @@1: cmp [di].exLocation,elCall jne @@2 test CompilerFlags.B0,cfDebugging jnz @@4 les bx,[di].exType cmp es:[bx].ptResult.Offs,0 je @@3 Invoke PutCall Invoke ReturnValue @@2: call Qualifier jz @@1 cmp [di].exLocation,elMemory jne @@4 test [di].exMisc,efReadOnly jnz @@4 ret @@3: mov ax,143 Chain CompileError @@4: mov ax,122 Chain CompileError GetReference endp GetRef proc near call LValue @@1: les bx,[di].exType cmp es:[bx].tdType,ttProc je @@2 call Qualifier jz @@1 cmp [di].exLocation,elMemory jne @@3 test [di].exMisc,efReadOnly jnz @@3 @@2: ret @@3: mov ax,122 Chain CompileError GetRef endp GetLvalue proc near cmp CurrentToken,t_Proc jne LValue Invoke GetReturnVar jc LValue mov [di].exType.Offs,bx mov [di].exType.Segm,es mov [di].exOffset,ax mov al,es:[bx].tdModifier mov [di].exModifier,al mov [di].exLocation,elMemory mov [di].exRegsUsed,0 mov dx,CurrentHash call GetLocalRef cmp [di].exOffset,0 jl @@1 mov dx,38c4h ; les di, Invoke AddReg mov [di].exMisc,efES+efDI mov [di].exOffset,0 @@1: Invoke DoneExpr Chain GetToken GetLvalue endp LValue proc near Invoke GetSymbol lea bx,@@2 Invoke ChooseToken jnz @@1 jmp word ptr cs:[bx+1] @@1: mov ax,20 Chain CompileError @@2 db 8,3 db t_Var dw ProcessVar db t_Proc dw ProcessProc db t_Type dw ProcessType db tString dw ProcessType db tFile dw ProcessType db t_StdFun dw ProcessStdFun db t_Mem dw ProcessMem db tAt dw ProcessAt LValue endp Qualifier proc near mov al,CurrentToken lea bx,ProcessIndex cmp al,tOBracket je @@1 lea bx,ProcessField cmp al,tPoint je @@1 lea bx,ProcessPointer cmp al,tCaret je @@1 ret @@1: call bx xor ax,ax ret Qualifier endp ProcessIndex proc near Loc Temp,byte, Loc LowerBound,word,1 Loc ElementSize,word,1 Loc BaseType,dword,1 Entry @@1: les bx,[di].exType mov al,es:[bx].tdType cmp al,ttArray je @@3 cmp al,ttString je @@3 @@2: mov ax,121 Chain CompileError @@3: cmp [di].exLocation,elMemory jne @@2 test [di].exMisc,efReadOnly jnz @@2 mov ax,es:[bx].atBounds.Offs mov bx,es:[bx].atBounds.Segm mov es,es:[bx] mov bx,ax Invoke GetToken mov ax,es:[bx].itLowerBound.W0 mov LowerBound,ax mov BaseType.Offs,bx mov BaseType.Segm,es push di lea di,Temp call GetExpr Invoke LoadAddress Invoke GetVarValue lea si,BaseType Invoke TypeCompat mov IndexModifier,emX Invoke CastOrdinal mov IndexModifier,0 mov si,di pop di les bx,[di].exType mov ax,es:[bx].atBase.Offs mov bx,es:[bx].atBase.Segm mov es,es:[bx] mov bx,ax mov [di].exType.Offs,bx mov [di].exType.Segm,es mov al,es:[bx].tdModifier mov [di].exModifier,al mov ax,es:[bx].tdSizeOf mov ElementSize,ax cmp [si].exLocation,elImmediate jne @@4 mov ax,[si].exValue.W0 sub ax,LowerBound mul ElementSize add [di].exOffset,ax jmp short @@7 @@4: mov ax,LowerBound mul ElementSize sub [di].exOffset,ax xchg si,di Invoke UseExpr mov cx,ElementSize test [si].exMisc,efDI jnz @@5 mov al,lvDI Invoke Scale mov al,lvDI Invoke LoadValue xchg si,di Invoke UseExpr jmp short @@6 @@5: mov al,lvAX Invoke Scale mov al,[si].exRegsUsed Invoke FindEmptyReg xchg si,di Invoke UseExpr xchg si,di mov al,lvAX Invoke PopValue mov ax,0f803h ; add di, or ah,[di].exMisc Invoke PutWord xchg si,di @@6: Invoke DoneExpr mov al,[si].exRegsUsed and al,erAll or [di].exRegsUsed,al or [di].exMisc,efDI @@7: cmp CurrentToken,tComma jne @@8 jmp @@1 @@8: mov al,tCBracket Invoke NeedToken Exit ProcessIndex endp ProcessField proc near les bx,[di].exType cmp es:[bx].tdType,ttRecord je @@1 cmp es:[bx].tdType,ttObject jne @@3 @@1: Invoke GetToken cmp CurrentToken,t_Ident jne @@4 push di mov si,bx Invoke SearchField mov si,di pop di jnz @@4 cmp al,t_Var jne @@2 mov ax,es:[si].vsOffset add [di].exOffset,ax mov bx,es:[si].vsType.Offs mov si,es:[si].vsType.Segm mov es,es:[si] mov [di].exType.Offs,bx mov [di].exType.Segm,es mov al,es:[bx].tdModifier mov [di].exModifier,al Chain GetToken @@2: mov al,0 jmp _ProcessProc @@3: mov ax,121 Chain CompileError @@4: mov ax,44 Chain CompileError ProcessField endp ProcessPointer proc near les bx,[di].exType cmp es:[bx].tdType,ttPointer je @@1 mov ax,121 Chain CompileError @@1: Invoke GetToken mov si,es:[bx].ptBase.Segm mov bx,es:[bx].ptBase.Offs mov es,es:[si] mov [di].exType.Offs,bx mov [di].exType.Segm,es mov al,es:[bx].tdModifier mov [di].exModifier,al LoadPtr label near test CompilerFlags.B0,cfDebugging jnz @@6 cmp [di].exLocation,elAddress je @@5 cmp [di].exLocation,elImmediate jne @@2 mov [di].exMisc,0 jmp short @@5 @@2: Invoke UseExpr cmp [di].exLocation,elMemory jne @@3 mov dx,38c4h ; les di, Invoke AddReg jmp short @@4 @@3: mov ax,0c789h ; mov di,ax Invoke PutWord mov ax,0c28eh ; mov es,dx Invoke PutWord @@4: Invoke DoneExpr mov [di].exMisc,efES+efDI mov [di].exOffset,0 @@5: mov [di].exLocation,elMemory ret @@6: cmp [di].exLocation,elImmediate je @@7 les bx,dword ptr [di].exValue les bx,es:[bx] mov [di].exValue.Offs,bx mov [di].exValue.Segm,es @@7: mov [di].exLocation,elMemory mov [di].exMisc,0 ret ProcessPointer endp end