www.pudn.com > tp60src.zip > CONVERT.ASM
model large compiler_text,pascal include compiler.inc .code compiler_text public AssignmentCast public CheckInherit public Cond2Number public Number2Cond public CreateTempInt public ConvInt2Ext public ConvInt2Real public ConvReal2Ext public ConvExt2Real public Put8087Const public PushExt public LoadSet public _LoadSet public PutImmedString public LoadString public _LoadString public StringLength public ConvChar2String public LoadPackedChar public CheckPackedChar public LoadAddress public GetVarValue public Push2Addrs public PushAddr AssignmentCast proc near les bx,[si].exType mov al,es:[bx].tdType cmp al,ttString je @@1 cmp al,tt8087 je @@2 cmp al,ttReal je @@3 cmp al,ttObject je @@4 cmp al,ttPointer je @@5 ret @@1: call ConvChar2String jmp LoadPackedChar @@2: call ConvInt2Ext jmp ConvReal2Ext @@3: call ConvInt2Real jmp ConvExt2Real @@4: mov ax,bx mov dx,es les bx,[di].exType cmp es:[bx].tdType,ttObject je @@6 ret @@5: mov ax,es:[bx].ptBase.Offs mov bx,es:[bx].ptBase.Segm mov es,es:[bx] mov bx,ax cmp es:[bx].tdType,ttObject jne @@7 mov dx,es les bx,[di].exType cmp es:[bx].tdType,ttPointer jne @@7 mov cx,es:[bx].ptBase.Offs mov bx,es:[bx].ptBase.Segm mov es,es:[bx] mov bx,cx @@6: call CheckInherit jz @@8 @@7: ret @@8: mov ax,[si].exType.Offs mov [di].exType.Offs,ax mov ax,[si].exType.Segm mov [di].exType.Segm,ax ret AssignmentCast endp CheckInherit proc near cmp es:[bx].tdType,ttObject jne @@3 @@1: cmp bx,ax jne @@2 mov cx,es cmp cx,dx je @@3 @@2: mov cx,es:[bx].otParent.Offs mov bx,es:[bx].otParent.Segm jcxz @@3 mov es,es:[bx] mov bx,cx jmp @@1 @@3: ret CheckInherit endp Cond2Number proc near cmp [di].exLocation,elCondition jne @@3 Invoke UseExpr mov ax,[di].exChain1 or ax,[di].exChain2 jz @@1 mov al,[di].exMisc lea bx,[di].exChain1 Invoke PutJmp lea bx,[di].exChain2 Invoke PutLabel mov ax,0b0h ; mov al,0 Invoke PutWord mov ax,2ebh ; jmp short $+4 Invoke PutWord lea bx,[di].exChain1 Invoke PutLabel mov ax,1b0h ; mov al,1 Invoke PutWord jmp short @@2 @@1: mov ax,0b0h ; mov al,0 Invoke PutWord mov al,[di].exMisc mov ah,1 xor al,ah Invoke PutWord mov al,40h ; inc ax Invoke PutByte @@2: Invoke DoneExpr mov [di].exLocation,elRegister or [di].exRegsUsed,erAX mov [di].exMisc,lvAX @@3: ret Cond2Number endp Number2Cond proc near cmp [di].exLocation,elCondition je @@4 Invoke UseExpr cmp [di].exLocation,elMemory jne @@1 mov dx,3880h ; cmp ...,0 Invoke AddReg xor al,al Invoke PutByte jmp short @@3 @@1: cmp [di].exLocation,elRegister je @@2 mov al,lvAX Invoke LoadValue @@2: mov ax,0c008h ; or al,al Invoke PutWord @@3: Invoke DoneExpr mov [di].exLocation,elCondition mov [di].exMisc,cdNotEqual xor ax,ax mov [di].exChain1,ax mov [di].exChain2,ax @@4: ret Number2Cond endp CreateTempInt proc near Invoke UseExpr mov al,lvAX Invoke LoadValue mov ax,1 test [di].exModifier,emX jz @@1 inc ax test [di].exModifier,emXX jz @@1 inc ax inc ax @@1: Invoke AllocStack mov [di].exLocation,elMemory mov [di].exMisc,efSS+efBP mov [di].exValue.Offs,ax mov al,lvAX Invoke StoreValue Chain DoneExpr CreateTempInt endp ConvInt2Ext proc near les bx,[di].exType cmp es:[bx].tdType,ttInteger jne @@6 cmp [di].exLocation,elImmediate jne @@1 lea bx,[di].exValue Invoke Long2Extended jmp short @@5 @@1: cmp [di].exLocation,elMemory jne @@2 test [di].exModifier,emXX jnz @@3 test [di].exModifier,emX jz @@2 mov dx,0dfh ; fild word ptr test [di].exModifier,emUnsigned jz @@4 @@2: mov al,emLongint Invoke ConvertOrdinal call CreateTempInt @@3: mov dx,0dbh ; fild dword ptr @@4: Invoke UseExpr Invoke PutFloatRM Invoke DoneExpr mov [di].exLocation,elStack @@5: mov [di].exModifier,emExtended Chain CastExtended @@6: ret ConvInt2Ext endp ConvInt2Real proc near les bx,[di].exType cmp es:[bx].tdType,ttInteger jne @@3 cmp [di].exLocation,elImmediate jne @@1 lea bx,[di].exValue Invoke Long2Extended Invoke Extended2Real jmp short @@2 @@1: mov al,emLongint Invoke ConvertOrdinal Invoke UseExpr mov al,lvAX Invoke LoadValue mov ax,_RFloat Invoke PutSystemCall Invoke DoneExpr mov [di].exLocation,elRegister mov [di].exRegsUsed,erAll @@2: mov [di].exModifier,emReal Chain CastReal @@3: ret ConvInt2Real endp ConvReal2Ext proc near les bx,[di].exType cmp es:[bx].tdType,ttReal jne @@1 Invoke UseExpr mov al,lrR1 Invoke LoadReal mov ax,_FRealExt+fnNeed8087 Invoke PutSystemCall Invoke DoneExpr mov [di].exLocation,elStack mov [di].exModifier,emExtended mov [di].exRegsUsed,erAll Chain CastExtended @@1: ret ConvReal2Ext endp ConvExt2Real proc near les bx,[di].exType cmp es:[bx].tdType,tt8087 jne @@3 cmp [di].exLocation,elImmediate jne @@1 lea bx,[di].exValue Invoke Extended2Real jmp short @@2 @@1: call PushExt Invoke UseExpr mov ax,_FExtReal+fnNeed8087 Invoke PutSystemCall Invoke DoneExpr mov [di].exLocation,elRegister mov [di].exRegsUsed,erAll @@2: mov [di].exModifier,emReal Chain CastReal @@3: ret ConvExt2Real endp Put8087Const proc near cmp [di].exLocation,elImmediate jne @@5 lea bx,[di].exValue mov ax,[bx+8] and ax,7fffh jz @@1 cmp ax,3c01h jb @@3 cmp ax,43feh ja @@3 test word ptr [bx],7ffh jnz @@3 cmp ax,3f81h jb @@2 cmp ax,407eh ja @@2 cmp word ptr [bx+1],0 jne @@2 cmp word ptr [bx+3],0 jne @@2 @@1: mov al,emSingle mov cx,4 jmp short @@4 @@2: mov al,emDouble mov cx,8 jmp short @@4 @@3: mov al,emExtended mov cx,10 @@4: mov [di].exModifier,al push cx Invoke Extended2Float pop ax Invoke PutCodeConst mov [di].exLocation,elMemory mov [di].exMisc,efCS+efReadOnly mov [di].exOffset,dx mov [di].exMap,bx mov [di].exSegment,ax @@5: ret Put8087Const endp PushExt proc near cmp [di].exLocation,elStack je @@2 call Put8087Const Invoke UseExpr mov dx,0d9h ; fld test [di].exModifier,emExtended jz @@1 mov dh,28h ; fld tbyte ptr @@1: or dl,[di].exModifier Invoke PutFloatRM Invoke DoneExpr mov [di].exLocation,elStack mov [di].exModifier,emExtended @@2: ret PushExt endp LoadSet proc near xor ax,ax cmp [di].exLocation,elImmediate jne @@2 mov bx,[di].exOffset mov cx,16 xor dx,dx @@1: or dx,[bx] inc bx inc bx loop @@1 or dx,dx jnz @@2 mov ax,32 Invoke CreateLocalVar mov ax,_ZClear Invoke PutSystemCall Invoke DoneExpr mov [di].exRegsUsed,erAll ret _LoadSet label near mov ax,32 @@2: cmp [di].exLocation,elImmediate jne @@3 push ax mov ax,32 mov bx,[di].exOffset Invoke PutCodeConst mov [di].exLocation,elMemory mov [di].exMisc,efCS+efReadOnly mov [di].exOffset,dx mov [di].exMap,bx mov [di].exSegment,ax pop ax @@3: cmp [di].exLocation,elMemory jne @@4 les bx,[di].exType cmp ax,es:[bx].tdSizeOf je @@4 call PushAddr mov ax,32 Invoke CreateLocalVar Invoke UseExpr les bx,[di].exType Invoke PushSetAddr mov ax,_ZLoad Invoke PutSystemCall Invoke DoneExpr mov [di].exRegsUsed,erAll @@4: ret LoadSet endp PutImmedString proc near mov ax,256 cmp [di].exLocation,elImmediate jne @@1 mov bx,[di].exOffset mov al,[bx] xor ah,ah inc ax push ax Invoke PutCodeConst mov [di].exLocation,elMemory mov [di].exMisc,efCS+efReadOnly mov [di].exOffset,dx mov [di].exMap,bx mov [di].exSegment,ax pop ax @@1: ret PutImmedString endp LoadString proc near mov ax,256 _LoadString label near cmp [di].exLocation,elStack je @@1 push ax call PutImmedString call PushAddr pop ax Invoke CreateLocalVar Invoke UseExpr mov ax,_SLoad Invoke PutSystemCall Invoke DoneExpr mov [di].exRegsUsed,erAll @@1: ret LoadString endp StringLength proc near cmp [di].exLocation,elMemory je @@2 cmp [di].exLocation,elImmediate jne @@1 mov bx,[di].exOffset mov al,[bx] xor ah,ah xor dx,dx Invoke SetValue Chain CastLongint @@1: Invoke UseExpr mov ax,75fh ; pop di pop es Invoke PutWord Invoke DoneExpr mov [di].exLocation,elMemory mov [di].exMisc,efES+efDI mov [di].exOffset,0 @@2: mov [di].exModifier,emByte Chain CastLongint StringLength endp ConvChar2String proc near les bx,[di].exType cmp es:[bx].tdType,ttChar jne @@2 cmp [di].exLocation,elImmediate jne @@1 mov ax,2 Invoke AllocTempBuf mov al,1 mov ah,[di].exValue.B0 mov [bx],ax mov [di].exOffset,bx mov [di].exModifier,emBoolean Chain CastString @@1: Invoke PushValue mov ax,256 Invoke CreateLocalVar Invoke UseExpr mov ax,_SChar Invoke PutSystemCall Invoke DoneExpr mov [di].exRegsUsed,erAll Chain CastString @@2: ret ConvChar2String endp LoadPackedChar proc near call CheckPackedChar jnz @@1 push ax call PushAddr mov ax,256 Invoke CreateLocalVar Invoke UseExpr pop ax Invoke PushWord mov ax,_SPacked Invoke PutSystemCall Invoke DoneExpr mov [di].exRegsUsed,erAll Chain CastString @@1: ret LoadPackedChar endp CheckPackedChar proc near les bx,[di].exType cmp es:[bx].tdType,ttArray jne @@1 mov ax,es:[bx].atBase.Offs mov bx,es:[bx].atBase.Segm mov es,es:[bx] mov bx,ax cmp es:[bx].tdType,ttChar jne @@1 les bx,[di].exType mov ax,es:[bx].tdSizeOf cmp ax,255 ja @@1 cmp ax,ax @@1: ret CheckPackedChar endp LoadAddress proc near cmp [di].exLocation,elAddress je @@1 ret @@1: Invoke UseExpr mov al,lvAX Invoke LoadValue Chain DoneExpr LoadAddress endp GetVarValue proc near test CompilerFlags.B0,cfDebugging jnz @@2 @@1: ret @@2: cmp [di].exLocation,elMemory jne @@1 mov [di].exLocation,elImmediate les bx,[di].exType mov al,es:[bx].tdType cmp al,ttInteger jb @@3 call CopyValue mov al,[di].exModifier Chain ConvertOrdinal @@3: cmp al,ttPointer jne @@4 jmp CopyValue @@4: cmp al,ttReal jne @@5 call CopyValue lea bx,[di].exValue Invoke Real2Extended Chain CastExtended @@5: cmp al,tt8087 jne @@6 call CopyValue mov al,[di].exModifier lea bx,[di].exValue Invoke Float2Extended Chain CastExtended @@6: cmp al,ttString jne @@7 les bx,dword ptr [di].exValue mov al,es:[bx] xor ah,ah inc ax mov cx,ax Invoke AllocTempBuf call _CopyValue mov [di].exOffset,bx ret @@7: cmp al,ttSet jne @@8 Invoke SetBaseAndSize mov dx,ax mov ax,32 Invoke AllocTempBuf push si di ds ds pop es lds si,dword ptr [di].exValue mov di,bx mov cl,dh xor ch,ch xor al,al rep stosb mov cl,dl rep movsb mov cl,32 sub cl,dl sub cl,dh rep stosb pop ds di si mov [di].exOffset,bx ret @@8: cmp al,ttArray jne @@9 call CheckPackedChar jnz @@9 mov cx,ax inc ax Invoke AllocTempBuf mov [bx],cl inc bx call _CopyValue dec bx mov [di].exOffset,bx Chain CastString @@9: mov ax,137 Chain CompileError GetVarValue endp CopyValue proc near les bx,[di].exType mov cx,es:[bx].tdSizeOf lea bx,[di].exValue _CopyValue label near push si di ds ds pop es lds si,dword ptr [di].exValue mov di,bx rep movsb pop ds di si ret CopyValue endp Push2Addrs proc near call PushAddr xchg si,di call PushAddr xchg si,di ret Push2Addrs endp PushAddr proc near cmp [di].exLocation,elMemory jne @@1 mov [di].exLocation,elAddress mov [di].exModifier,emLongint and [di].exMisc,not efReadOnly Chain PushValue @@1: ret PushAddr endp end