www.pudn.com > tp60src.zip > STMTPART.ASM
model large compiler_text,pascal include compiler.inc .code compiler_text public StatementPart StatementPart proc near Loc EntryGoal,word,1 Loc BeginLineNumber,word,1 Loc BodyGoal,word,1 Loc ExitGoal,word,1 Loc EndLineNumber,word,1 Entry push Dictionary.Offs mov InStmtPart,1 mov ax,2 mov LastGoal,ax Invoke GetStmtMem mov ax,LocalsSize mov TempLocalsSize,ax xor ax,ax mov ExitChain,ax mov FailChain,ax mov LabelChain,ax mov di,FileStackPtr mov ax,[di].fsLineNumber mov FirstLineNumber,ax mov LastLineNumber,ax Invoke GetLineNumber mov BeginLineNumber,ax push GlobalOptions mov es,Dictionary.Segm mov di,CurProc or di,di jz @@1 test es:[di].psFlags,pfAssembler jz @@1 Invoke AsmClause jmp short @@2 @@1: Invoke CompoundStmt @@2: mov BodyGoal,ax pop CompilerOptions Invoke GetLineNumber mov EndLineNumber,ax call ResolveLabels and LocalsSize,0fffeh mov es,Dictionary.Segm mov di,CurProc or di,di jnz @@3 call ProgramEntry push ax call ProgramExit pop dx jmp short @@5 @@3: test es:[di].psFlags,pfInterrupt jz @@4 and CompilerOptions,not coStackChk call InterruptEntry push ax call InterruptExit pop dx jmp short @@5 @@4: call ProcEntry push ax call ProcExit pop dx @@5: mov EntryGoal,dx mov ExitGoal,ax mov ax,BeginLineNumber Invoke PutLineNumber mov ax,EntryGoal Invoke UseGoal mov ax,BodyGoal Invoke UseGoal cmp FailChain,0 je @@6 mov al,cdAlways lea bx,ExitChain Invoke PutJmp lea bx,FailChain Invoke PutLabel mov es,Dictionary.Segm mov di,CurProc mov di,es:[di].psScope mov dx,es:[di].otVMTOffset mov al,lvDI Invoke LoadWord mov ax,_Destruct Invoke PutSystemCall @@6: lea bx,ExitChain Invoke PutLabel mov ax,EndLineNumber Invoke PutLineNumber mov ax,ExitGoal Invoke UseGoal mov ax,CompiledCode.Offs sub ax,CodeSectStart push ax Invoke RearrangeCode xor ax,ax mov StmtPart.Offs,ax mov LastGoal,ax mov InStmtPart,al pop ax Dictionary.Offs Exit StatementPart endp ProgramEntry proc near cmp ProgramSection,0 jge @@8 mov ax,_InitTurbo Invoke PutSystemCall mov ax,FirstUnit @@1: mov es,ax test es:uhFlags,uf8087 jnz @@2 mov ax,es:uhNext or ax,ax jnz @@1 jmp short @@4 @@2: mov ax,_InitEM86 test GlobalOptions,coEmulation jnz @@3 mov ax,_InitEM87 @@3: Invoke PutSystemCall @@4: xor cx,cx mov es,FirstUnit jmp short @@6 @@5: mov es,ax mov bx,es:uhProcMap cmp es:[bx].pmCodeMap,-1 je @@6 inc cx push es @@6: mov ax,es:uhNext or ax,ax jnz @@5 jcxz @@8 @@7: mov al,9ah ; call Invoke PutByte pop ax xor bx,bx xor dx,dx push cx mov cx,ffPtr Invoke PutFixup pop cx loop @@7 @@8: call StackEntry Chain DoneGoal ProgramEntry endp ProgramExit proc near call StackExit cmp ProgramSection,0 jl @@1 mov al,0cbh ; ret Invoke PutByte Chain DoneGoal @@1: mov ax,0c031h ; xor ax,ax Invoke PutWord mov ax,_HaltTurbo Invoke PutSystemCall Chain DoneGoal ProgramExit endp ProcEntry proc near Loc ParamOffset,word,1 Loc CopyOffset,word,1 Entry mov es,Dictionary.Segm mov di,CurProc test es:[di].psFlags,pfAssembler jz @@1 mov ax,ParamsSize or ax,LocalsSize jz @@2 @@1: call StackEntry @@2: mov cx,es:[di].psType.ptParamCount jcxz @@4 test es:[di].psFlags,pfAssembler jnz @@4 mov ax,ParamsBottom mov ParamOffset,ax mov ax,ProcResult mov CopyOffset,ax push di add di,psType.ptParams @@3: push cx di es mov al,es:[di].ppFlags mov bx,es:[di].ppType.Segm mov di,es:[di].ppType.Offs mov es,es:[bx] call ProcessParam pop es di cx add di,size TProcParam loop @@3 pop di @@4: test es:[di].psFlags,pfConstructor jz @@5 mov si,es:[di].psScope mov dx,es:[si].otVMTOffset mov al,lvDI Invoke LoadWord mov ax,_Construct Invoke PutSystemCall mov al,cdEqual lea bx,ExitChain Invoke PutJmp @@5: Invoke DoneGoal Exit ProcessParam proc near xor ah,ah Invoke ParamSize sub ParamOffset,cx sub CopyOffset,dx cmp dx,1 jbe @@1 test GlobalOptions,coWordAlign jz @@1 and CopyOffset,0fffeh @@1: test al,vfAddress jnz @@3 cmp es:[di].tdType,ttObject jne @@3 cmp es:[di].otVMTSize,0 je @@3 push dx mov ax,ParamOffset or dx,dx jz @@2 mov ax,CopyOffset @@2: add ax,es:[di].otVMTOffset mov dx,6c7h ; mov [bp- Invoke AddOffset mov ax,es mov bx,es:[di].otVMTAddr mov cx,ffOffs+ffConst xor dx,dx Invoke PutFixup pop dx @@3: or dx,dx jnz @@4 ret @@4: mov ax,ParamOffset mov dx,3ec4h ; les di,[bp+ Invoke AddOffset mov ax,5706h ; push es push di Invoke PutWord mov ax,CopyOffset mov dx,3e8dh ; lea di,[bp- Invoke AddOffset mov ax,5716h ; push ss push di Invoke PutWord mov al,es:[di].tdType cmp al,ttString jne @@5 mov ax,es:[di].tdSizeOf dec ax Invoke PushWord mov ax,_SStore jmp short @@8 @@5: cmp al,ttSet jne @@6 mov bx,di Invoke PushSetAddr mov ax,_ZStore jmp short @@8 @@6: cmp al,ttObject jne @@7 cmp es:[di].otVMTSize,0 je @@7 mov ax,es:[di].otVMTOffset Invoke PushWord mov ax,_CopyObject jmp short @@8 @@7: mov ax,es:[di].tdSizeOf Invoke PushWord mov ax,_BlockMove @@8: Chain PutSystemCall ProcessParam endp ProcEntry endp ProcExit proc near mov es,Dictionary.Segm mov di,CurProc test es:[di].psFlags,pfConstructor jz @@1 mov ax,46c4h ; les ax,[bp+6] Invoke PutWord mov al,6 Invoke PutByte mov ax,0c28ch ; mov dx,es Invoke PutWord jmp short @@2 @@1: test es:[di].psFlags,pfDestructor jz @@2 mov si,es:[di].psScope mov dx,es:[si].otVMTOffset mov al,lvDI Invoke LoadWord mov ax,_Destruct Invoke PutSystemCall @@2: mov bx,es:[di].psType.ptResult.Segm or bx,bx jz @@6 test es:[di].psFlags,pfAssembler jnz @@6 push es di mov di,es:[di].psType.ptResult.Offs mov es,es:[bx] mov al,es:[di].tdType cmp al,ttInteger jae @@4 cmp al,ttPointer je @@4 cmp al,ttReal je @@4 cmp al,tt8087 jne @@5 mov dx,6d9h ; fld [bp- or dl,es:[di].tdModifier test dl,2 jz @@3 mov dh,2eh @@3: mov ax,ProcResult Invoke FloatAddOffset Invoke PutFwait jmp short @@5 @@4: mov cx,ProcResult mov dx,es:[di].tdSizeOf call LoadResult @@5: pop di es @@6: test es:[di].psFlags,pfAssembler jz @@7 mov ax,ParamsSize or ax,LocalsSize jz @@8 @@7: call StackExit @@8: mov al,0c3h ; retn test es:[di].psFlags,pfFar jz @@9 mov al,0cbh ; retf @@9: mov cx,ParamsSize jcxz @@10 dec al Invoke PutByte mov ax,cx Invoke PutWord Chain DoneGoal @@10: Invoke PutByte Chain DoneGoal ProcExit endp LoadResult proc near mov ax,468ah ; mov al,[bp- dec dx jz @@2 inc ax dec dx jz @@2 call @@2 dec dx dec dx jz @@1 mov ax,5e8bh ; mov bx,[bp- call @@2 @@1: mov ax,568bh ; mov dx,[bp- @@2: Invoke PutWord mov al,cl inc cx inc cx Chain PutByte LoadResult endp InterruptEntry proc near mov ax,5350h ; push ax push bx Invoke PutWord mov ax,5251h ; push cx push dx Invoke PutWord mov ax,5756h ; push si push di Invoke PutWord mov ax,61eh ; push ds push es Invoke PutWord call StackEntry mov al,0b8h ; mov ax, Invoke PutByte mov ax,Dictionary.Segm xor bx,bx mov cx,ffSegm+ffData xor dx,dx Invoke PutFixup mov ax,0d88eh ; mov ds,ax Invoke PutWord Chain DoneGoal InterruptEntry endp InterruptExit proc near call StackExit mov ax,1f07h ; pop es pop ds Invoke PutWord mov ax,5e5fh ; pop di pop si Invoke PutWord mov ax,595ah ; pop dx pop cx Invoke PutWord mov ax,585bh ; pop bx pop ax Invoke PutWord mov al,0cfh ; iret Invoke PutByte Chain DoneGoal InterruptExit endp StackEntry proc near test CompilerOptions,co286Code jz @@1 cmp LocalsSize,0 je @@1 test CompilerOptions,coStackChk jnz @@1 mov al,0c8h ; enter Invoke PutByte mov ax,LocalsSize neg ax Invoke PutWord mov al,0 Chain PutByte @@1: mov al,55h ; push bp Invoke PutByte mov ax,0e589h ; mov bp,sp Invoke PutWord test CompilerOptions,coStackChk jz @@2 mov dx,LocalsBottom sub dx,LocalsSize mov al,0 Invoke LoadWord mov ax,_StackCheck Invoke PutSystemCall @@2: mov ax,LocalsBottom sub ax,LocalsSize jz @@3 mov dl,0ech ; sub sp, Chain PutArOpImm @@3: ret StackEntry endp StackExit proc near test CompilerOptions,co286Code jz @@1 mov al,0c9h ; leave Chain PutByte @@1: cmp LocalsSize,0 je @@2 mov ax,0ec89h ; mov sp,bp Invoke PutWord @@2: mov al,5dh ; pop bp Chain PutByte StackExit endp ResolveLabels proc near push ds mov si,LabelChain mov es,Dictionary.Segm mov ds,StmtPart.Segm jmp short @@2 @@1: mov di,[si+2] mov bl,es:[di].seName mov bh,0 mov ax,es:[di+size TSymbol+bx].lsLink or ax,ax jz @@3 mov [si+2],ax mov si,[si+4] @@2: or si,si jnz @@1 pop ds ret @@3: pop ds mov ax,82 add di,seName Chain ParamError ResolveLabels endp end