www.pudn.com > tp60src.zip > LINKMAP.ASM
model large tdinfo_text,pascal include compiler.inc PasStr macro Name,String local N,C N = 0 irpc C,N = N + 1 endm .data Name db N,'&String&' .code TDInfo_Text endm PS macro String local N PasStr N, lea bx,N endm extrn FileCreate:far extrn FileClose:far extrn FileWrite:far extrn GetFlatMem:far extrn FlatMemAvail:far extrn Error:far .data Power10 dw 10000,1000,100,10,1 Hex db '0123456789ABCDEF' .data? Buffer dd ? TextBuffer dd ? TextBufferLimit dw ? PublicCount dw ? Collect db ? .code tdinfo_text public LinkMap LinkMap proc far Entry far test CompilerFlags.B1,cfLinkMap jnz @@1 jmp @@7 @@1: mov al,CompilerFlags.B1 and al,cfLinkMap cmp al,cfPublicsMap jb @@3 mov PublicCount,0 mov Collect,0 call ProcessPublics mov cx,PublicCount mov ax,8 cwd mul cx or dx,dx jz @@2 mov ax,1 jmp Error @@2: call GetFlatMem mov Buffer.Offs,8 mov Buffer.Segm,bx mov Collect,1 call ProcessPublics call SortPublics @@3: mov ax,feMap+feForceExt+(fdOutputDir+fdNoEditor)*256 call FileCreate call FlatMemAvail or dx,dx jz @@4 mov ax,0fff0h @@4: mov TextBufferLimit,ax call GetFlatMem mov TextBuffer.Offs,0 mov TextBuffer.Segm,bx sub TextBufferLimit,8 call WriteSegments mov al,CompilerFlags.B1 and al,cfLinkMap cmp al,cfPublicsMap jb @@6 call WritePublics mov al,CompilerFlags.B1 and al,cfLinkMap cmp al,cfDetailedMap jb @@5 call WriteLines @@5: call WriteEntryPoint @@6: call WriteLn call Flush call FileClose @@7: Exit LinkMap endp ProcessSymbol proc near cmp al,t_Var jne @@6 mov dx,es @@1: mov ah,es:[di].vsFlags mov al,ah and al,vfType+vfAddress+vfField cmp al,vfConst ja @@5 test ah,vfAlias jz @@2 mov bp,es:[di].vsLink.Segm mov di,es:[di].vsLink.Offs mov es,es:[bp] jmp @@1 @@2: cmp al,vfConst je @@3 mov bp,es:uhDataMap jmp short @@4 @@3: mov bp,es:uhConstMap @@4: add bp,es:[di].vsMap mov ax,es:[bp].smAddr cmp ax,-1 je @@5 add ax,es:[di].vsOffset mov es,dx mov dx,DataStart jmp short @@7 @@5: mov es,dx jmp short @@8 @@6: mov al,es:[di].psFlags test al,pfInline jnz @@8 mov bp,es:uhProcMap add bp,es:[di].psProcMap mov di,es:uhCodeMap add di,es:[bp].pmCodeMap mov ax,es:[di].smAddr cmp ax,-1 je @@8 add ax,es:[bp].pmEntryPoint mov dx,es:uhCodeStart @@7: mov di,Buffer.Offs mov bp,es mov es,Buffer.Segm stosw mov ax,dx stosw mov ax,si stosw mov ax,bp stosw mov Buffer.Offs,di mov es,bp @@8: ret ProcessSymbol endp ProcessMain proc near mov bx,es:uhProcMap mov di,es:[bx].pmCodeMap cmp di,-1 jne @@1 ret @@1: mov ax,es:[bx].pmEntryPoint mov bx,es:uhCodeMap add ax,es:[bx+di].smAddr mov dx,es:uhCodeStart mov di,Buffer.Offs mov bp,es mov es,Buffer.Segm stosw mov ax,dx stosw lea ax,@At stosw mov ax,ds stosw mov Buffer.Offs,di mov es,bp ret ProcessMain endp ProcessPublics proc near push bp mov bx,FirstUnit @@1: mov es,bx inc PublicCount cmp Collect,0 je @@2 call ProcessMain @@2: mov bx,es:uhInterface mov cx,es:[bx] shr cx,1 inc cx @@3: inc bx inc bx mov si,es:[bx] or si,si jz @@6 @@4: mov al,es:[si].seType cmp al,t_Var jb @@5 cmp al,t_Proc ja @@5 inc PublicCount cmp Collect,0 je @@5 add si,seName mov dl,es:[si] xor dh,dh mov di,si add di,dx inc di call ProcessSymbol sub si,seName @@5: mov si,es:[si].sePrev or si,si jnz @@4 @@6: loop @@3 mov bx,es:uhNext or bx,bx jnz @@1 pop bp ret ProcessPublics endp SortPublics proc near push ds lds di,Buffer mov si,8 cmp si,di je @@1 sub di,8 call Sort @@1: pop ds ret SortPublics endp Sort proc near push bp mov bp,sp push si di xor dx,dx mov bx,di add bx,si adc dx,0 shr dx,1 rcr bx,1 and bx,0fff8h mov ax,[bx] mov dx,[bx+2] @@1: cmp [si+2],dx ja @@3 jb @@2 cmp [si],ax jae @@3 @@2: add si,8 jmp @@1 @@3: cmp [di+2],dx jb @@5 ja @@4 cmp [di],ax jbe @@5 @@4: sub di,8 jmp @@3 @@5: cmp si,di ja @@7 mov cx,4 @@6: mov bx,[si] xchg bx,[di] mov [si],bx add si,2 add di,2 loop @@6 sub di,16 cmp si,di jbe @@1 @@7: cmp [bp-2],di jae @@8 xchg si,[bp-2] call Sort mov si,[bp-2] @@8: cmp [bp-4],si jbe @@9 mov di,[bp-4] call Sort @@9: mov sp,bp pop bp ret Sort endp WriteSegments proc near call WriteLn push ds pop es PS < Start Stop Length Name Class> call WriteString call WriteLn call WriteLn mov ax,FirstUnit @@1: mov es,ax mov di,es:uhCodeStart mov cx,es:uhCodeLength mov bx,es:uhName add bx,seName PasStr CodeText, lea dx,CodeText push es call WriteSegment pop es mov ax,es:uhNext or ax,ax jnz @@1 push ds pop es mov di,DataStart mov cx,DataSize PS mov dx,bx call WriteSegment mov di,StackStart mov cx,StackSize PSmov dx,bx call WriteSegment mov ax,StackSize add ax,15 mov cl,4 shr ax,cl add ax,StackStart mov di,ax xor cx,cx PS mov dx,bx call WriteSegment ret WriteSegments endp WriteSegment proc near mov al,' ' call WriteChar mov ax,di call WriteHexNumber push es bx ds pop es PS <0H > call WriteString xor bx,bx jcxz @@1 mov bx,cx dec bx @@1: mov ax,bx shr ax,1 shr ax,1 shr ax,1 shr ax,1 add ax,di call WriteHexNumber mov ax,bx call WriteHexDigit PS call WriteString mov ax,cx call WriteHexNumber PS call WriteString pop bx es mov cl,es:[bx] xor ch,ch call WriteString mov al,' ' call WriteChar sub cx,18 jnc @@3 neg cx @@2: mov al,' ' call WriteChar loop @@2 @@3: push ds pop es mov bx,dx call WriteString call WriteLn ret WriteSegment endp WritePublics proc near call WriteLn push ds pop es PS < Address Publics by Value> call WriteString call WriteLn mov es,Buffer.Segm mov si,8 @@1: call WriteLn mov al,' ' call WriteChar seges lodsw mov dx,ax seges lodsw call WriteHexNumber mov al,':' call WriteChar mov ax,dx call WriteHexNumber mov cx,7 @@2: mov al,' ' call WriteChar loop @@2 seges lodsw mov bx,ax seges lodsw push es mov es,ax call WriteString pop es cmp si,Buffer.Offs jb @@1 ret WritePublics endp WriteLines proc near mov ax,FirstUnit @@1: mov es,ax mov cx,-1 mov dx,es:uhTrace mov di,es:uhCodeMap jmp short @@7 @@2: mov si,es:[di].smTrace cmp si,-1 je @@6 add si,dx mov bx,es:[di].smAddr cmp bx,-1 je @@6 mov ax,es:[si].trSource cmp ax,cx je @@3 mov cx,ax call WriteLineHeader @@3: push cx push dx mov cx,es:[si].trLineCount jcxz @@5 add bx,es:[si].trDataBytes mov dx,es:[si].trLineNumber add si,size TTraceTable @@4: call WriteLineNumber loop @@4 @@5: pop dx cx @@6: add di,size TSegMap @@7: cmp di,es:uhConstMap jne @@2 mov ax,es:uhNext or ax,ax jnz @@1 ret WriteLines endp WriteLineHeader proc near call WriteLn call WriteLn push bx cx es ds pop es PS call WriteString pop es mov bx,es:uhName add bx,seName call WriteString mov al,'(' call WriteChar pop bx push bx add bx,es:uhSources add bx,size TSourceList-1 call WriteString push es ds pop es PS <) segment > call WriteString pop es mov bx,es:uhName add bx,seName call WriteString call WriteLn pop cx bx xor bp,bp ret WriteLineHeader endp WriteLineNumber proc near mov al,es:[si] inc si or al,al js @@1 or al,al jz @@4 cbw jmp short @@2 @@1: and al,7fh mov ah,al mov al,es:[si] inc si @@2: push ax or bp,bp jnz @@3 call WriteLn @@3: mov ax,dx push dx mov dx,6 call WriteDecNumber pop dx mov al,' ' call WriteChar mov ax,es:uhCodeStart call WriteHexNumber mov al,':' call WriteChar mov ax,bx call WriteHexNumber inc bp and bp,3 pop ax add bx,ax @@4: inc dx ret WriteLineNumber endp WriteEntryPoint proc near call WriteLn call WriteLn push ds pop es PS call WriteString mov es,FirstUnit mov di,es:uhProcMap mov si,es:uhCodeMap add si,es:[di].pmCodeMap mov ax,es:[si].smAddr add ax,es:[di].pmEntryPoint call WriteHexNumber ret WriteEntryPoint endp WriteString proc near push bx cx mov cl,es:[bx] or cl,cl jmp short @@2 @@1: inc bx mov al,es:[bx] call WriteChar dec cl @@2: jnz @@1 pop cx bx ret WriteString endp WriteHexNumber proc near push es di bx cx dx lea bx,Hex mov cx,404h mov dx,ax les di,TextBuffer @@1: rol dx,cl mov al,dl and al,0fh xlat stosb dec ch jnz @@1 mov TextBuffer.Offs,di pop dx cx bx di es ret WriteHexNumber endp WriteDecNumber proc near push bx cx dx si mov bx,ax mov cx,5 lea si,Power10 @@1: cmp bx,[si] jae @@2 add si,2 loop @@1 @@2: sub dx,cx jbe @@4 xchg cx,dx @@3: mov al,' ' call WriteChar loop @@3 xchg cx,dx @@4: mov al,'0'-1 @@5: inc al sub bx,[si] jnc @@5 add bx,[si] add si,2 call WriteChar loop @@4 pop si dx cx bx ret WriteDecNumber endp WriteHexDigit proc near push bx lea bx,Hex and al,0fh xlat pop bx jmp short WriteChar WriteHexDigit endp WriteLn proc near mov al,0dh call WriteChar mov al,0ah WriteChar label near push es di les di,TextBuffer stosb mov TextBuffer.Offs,di cmp di,TextBufferLimit pop di es jae Flush ret WriteLn endp Flush proc near push ax bx cx dx mov cx,TextBuffer.Offs jcxz @@1 mov TextBuffer.Offs,0 mov dx,TextBuffer.Segm xor ax,ax mov bx,FileHandle call FileWrite @@1: pop dx cx bx ax ret Flush endp PasStr @At,<@> end