📄 generr.asm
字号:
add eax,mcbLen
add esi,eax
jmp @@mcbs1
@@nomcbsel: stc
@@s3: popad
jc @@r4
;
mov b[edi],'Y'
jmp @@r5
;
@@r4: mov d[edi],'N'
;
@@r5: inc edi
mov b[edi],' '
inc edi
;
mov eax,es:[esi]
mov bx,fs:w[EPSP_SegBase]
cmp ax,bx
jc @@r2
mov bx,fs:w[EPSP_SegSize]
add bx,fs:w[EPSP_SegBase]
cmp ax,bx
jnc @@r2
mov bx,fs:w[EPSP_SegBase]
shr bx,3
shr ax,3
sub ax,bx
inc ax
mov ecx,4
call bin2hex_err
jmp @@r20
;
@@r2: mov d[edi],'xxxx'
add edi,4
;
@@r20: mov b[edi],13
mov b[edi+1],10
mov b[edi+2],'$'
add edi,2
push edi
pop ecx
sub ecx,offset eDebugHeader
mov edx,offset eDebugHeader
mov ah,40h
mov ebx,d[ERRHandle]
int 21h
popad
;
@@r1: add esi,4
inc edi
dec ebp
jnz @@r0
pop edi
mov esi,es:[edi+8] ;link to next list.
or esi,esi
jnz @@LookLoop
;
mov edi,offset TotalSelsNum
mov eax,TotalSelectors
mov ecx,4
call bin2hex_err
mov ecx,TotalSelsTLen
mov edx,offset TotalSelsText
mov ah,40h
mov ebx,d[ERRHandle]
int 21h
;
;Now do memory blocks.
;
mov edx,offset MemHeader
mov ah,40h
mov ecx,MemHeaderLen
mov ebx,d[ERRHandle]
int 21h
;
mov esi,fs:d[EPSP_Resource]
mov es,RealSegment
@@mLookLoop: push esi
mov ebp,ResNum ;get number of entries.
mov edi,esi
add esi,ResHead+ResNum
add edi,ResHead
@@m0: cmp es:b[edi],Res_MEM
jnz @@m1
;
mov eax,fs:d[EPSP_INTMem]
cmp es:[esi],eax
jz @@m1
cmp fs:w[EPSP_DPMIMem],0
jz @@nodpmimem
pushad
mov bx,fs:w[EPSP_DPMIMem]
sys GetSelDet32
cmp es:[esi],edx
popad
jz @@m1
;
@@nodpmimem: ;Check if this is an MCB block.
;
push edi
cmp fs:d[EPSP_mcbHead],0
jz @@MEM
mov ebx,es:[esi]
mov edi,fs:d[EPSP_mcbHead]
@@mcbmc0: cmp ebx,edi
jz @@mcbmc1
mov edi,es:[edi+mcbChunkNext]
or edi,edi
jz @@MEM
jmp @@mcbmc0
;
@@mcbmc1: ;Update Total memory value and skip this block.
;
mov eax,es:[esi+8]
add eax,4095
and eax,0fffff000h
add TotalLinearMem+4,eax
pop edi
jmp @@m1
@@MEM: pop edi
pushad
mov edi,offset eDebugHeader
mov eax,es:[esi+4]
mov ecx,8
call bin2hex_err
mov b[edi],' '
inc edi
mov eax,es:[esi]
mov ecx,8
call bin2hex_err
mov b[edi],' '
inc edi
mov eax,es:[esi+8]
add TotalLinearMem,eax
push eax
add eax,4095
and eax,0fffff000h
add TotalLinearMem+4,eax
pop eax
inc TotalLinearMem+8
mov ecx,8
call bin2hex_err
mov b[edi],' '
inc edi
;
mov b[edi],13
mov b[edi+1],10
mov b[edi+2],'$'
add edi,2
push edi
pop ecx
push es
sub ecx,offset eDebugHeader
mov edx,offset eDebugHeader
mov ah,40h
mov ebx,d[ERRHandle]
int 21h
pop es
popad
;
@@m1: add esi,4
inc edi
dec ebp
jnz @@m0
pop edi
mov esi,es:[edi+8] ;link to next list.
or esi,esi
jnz @@mLookLoop
;
;Now print MCB controlled blocks.
;
cmp fs:d[EPSP_mcbHead],0
jz @@nomcbdis
mov esi,fs:d[EPSP_mcbHead]
@@mcb0: mov edi,esi
add esi,mcbChunkLen
@@mcb1: cmp es:b[esi+mcbFreeUsed],"J" ;Free block?
jz @@mcb2
mov eax,fs:d[EPSP_INTMem]
sub eax,mcbLen
cmp esi,eax
jz @@mcb2
cmp fs:w[EPSP_DPMIMem],0
jz @@nodpmimemhere
pushad
mov bx,fs:w[EPSP_DPMIMem]
sys GetSelDet32
sub edx,mcbLen
cmp esi,edx
popad
jz @@mcb2
@@nodpmimemhere:
pushad
mov edi,offset eDebugHeader
mov eax,esi
add eax,mcbLen
mov cx,8
call bin2hex_err
mov b[edi],' '
inc edi
mov eax,esi
add eax,mcbLen
mov cx,8
call bin2hex_err
mov b[edi],' '
inc edi
movzx eax,es:w[esi+mcbNextSize]
inc TotalLinearMem+8
mov cx,8
push eax
call bin2hex_err
mov b[edi],' '
inc edi
pop eax
add TotalLinearMem,eax
;
mov b[edi],13
mov b[edi+1],10
mov b[edi+2],'$'
add edi,2
push edi
pop ecx
push es
sub ecx,offset eDebugHeader
mov edx,offset eDebugHeader
mov ah,40h
mov ebx,d[ERRHandle]
int 21h
pop es
popad
@@mcb2: cmp es:b[esi+mcbNext],"M" ;end of the chain?
jz @@mcb3
mov esi,es:[edi+mcbChunkNext]
or esi,esi
jnz @@mcb0
jmp @@nomcbdis
;
@@mcb3: movzx eax,es:w[esi+mcbNextSize]
add eax,mcbLen
add esi,eax
jmp @@mcb1
;
@@nomcbdis: ;Display totals.
;
mov edi,offset TotalMemNum1
mov eax,TotalLinearMem
mov ecx,8
call bin2hex_err
mov edi,offset TotalMemNum2
mov eax,TotalLinearMem+4
mov ecx,8
call bin2hex_err
mov edi,offset TotalMemNum3
mov eax,TotalLinearMem+8
mov ecx,8
call bin2hex_err
mov ecx,TotalMemTLen
mov edx,offset TotalMemText
mov ah,40h
mov ebx,d[ERRHandle]
int 21h
;
;Now do lock details.
;
mov edx,offset LockHeader
mov ah,40h
mov ecx,LockHeaderLen
mov ebx,d[ERRHandle]
int 21h
;
mov esi,fs:d[EPSP_Resource]
@@lLookLoop: push esi
mov ebp,ResNum ;get number of entries.
mov edi,esi
add esi,ResHead+ResNum
add edi,ResHead
@@l0: cmp es:b[edi],Res_LOCK
jnz @@l1
;
@@LOCK: pushad
mov edi,offset eDebugHeader
mov eax,es:[esi]
mov cx,8
call bin2hex_err
mov b[edi],' '
inc edi
mov eax,es:[esi+4]
mov cx,8
call bin2hex_err
mov b[edi],' '
inc edi
;
mov b[edi],13
mov b[edi+1],10
mov b[edi+2],'$'
add edi,2
push edi
pop ecx
sub ecx,offset eDebugHeader
mov edx,offset eDebugHeader
mov ah,40h
mov ebx,d[ERRHandle]
int 21h
popad
;
@@l1: add esi,4
inc edi
dec ebp
jnz @@l0
pop edi
mov esi,es:[edi+8] ;link to next list.
or esi,esi
jnz @@lLookLoop
;
;Now do DOS memory details.
;
mov edx,offset DosMemHeader
mov ah,40h
mov ecx,DosMemHeaderLen
mov ebx,d[ERRHandle]
int 21h
;
mov esi,fs:d[EPSP_Resource]
@@dmLookLoop: push esi
mov ebp,ResNum ;get number of entries.
mov edi,esi
add esi,ResHead+ResNum
add edi,ResHead
@@dm0: cmp es:b[edi],Res_DOSMEM
jnz @@dm1
;
pushad
mov edi,offset eDebugHeader
mov eax,es:[esi]
mov cx,4
call bin2hex_err
mov b[edi],' '
inc edi
pushm ebx,ecx,edx
mov bx,es:[esi]
sys GetSelDet32
mov eax,edx
popm ebx,ecx,edx
mov cx,8
call bin2hex_err
mov b[edi],' '
inc edi
mov eax,es:[esi+4]
mov cx,8
call bin2hex_err
mov b[edi],' '
inc edi
;
mov b[edi],13
mov b[edi+1],10
mov b[edi+2],'$'
add edi,2
push edi
pop ecx
sub ecx,offset eDebugHeader
mov edx,offset eDebugHeader
mov ah,40h
mov ebx,d[ERRHandle]
int 21h
popad
;
@@dm1: add esi,4
inc edi
dec ebp
jnz @@dm0
pop edi
mov esi,es:[edi+8] ;link to next list.
or esi,esi
jnz @@dmLookLoop
cmp fs:d[EPSP_INTMem],0
jz @@r8
;
;Now do protected mode int details.
;
mov edx,offset PIntHeader
mov ah,40h
mov ecx,PIntHeaderLen
mov ebx,d[ERRHandle]
int 21h
;
mov ecx,256
mov esi,fs:d[EPSP_INTMem]
mov ebx,0
@@pv0: pushm ebx,ecx,esi
sys GetVect
cmp cx,es:w[esi+4]
jnz @@pv10
cmp edx,es:d[esi]
jz @@pv1
@@pv10: ;
mov edi,offset eDebugHeader
mov eax,ebx
mov cx,2
call bin2hex_err
mov b[edi],' '
inc edi
mov ax,es:w[esi+4]
mov cx,4
call bin2hex_err
mov b[edi],' '
inc edi
mov eax,es:d[esi]
mov cx,8
call bin2hex_err
mov b[edi],' '
inc edi
;
mov b[edi],13
mov b[edi+1],10
mov b[edi+2],'$'
add edi,2
push edi
pop ecx
sub ecx,offset eDebugHeader
mov edx,offset eDebugHeader
mov ah,40h
mov ebx,d[ERRHandle]
int 21h
;
@@pv1: popm ebx,ecx,esi
add esi,6
inc ebx
loop @@pv0
;
;Now do protected mode exception details.
;
mov edx,offset EIntHeader
mov ah,40h
mov ecx,EIntHeaderLen
mov ebx,d[ERRHandle]
int 21h
;
mov ecx,32
mov esi,fs:d[EPSP_INTMem]
add esi,256*6
mov ebx,0
@@pe0: pushm ebx,ecx,esi
sys GetEVect
cmp cx,es:w[esi+4]
jnz @@pv100
cmp edx,es:d[esi]
jz @@pe1
@@pv100: ;
mov edi,offset eDebugHeader
mov eax,ebx
mov cx,2
call bin2hex_err
mov b[edi],' '
inc edi
mov ax,es:w[esi+4]
mov cx,4
call bin2hex_err
mov b[edi],' '
inc edi
mov eax,es:d[esi]
mov cx,8
call bin2hex_err
mov b[edi],' '
inc edi
;
mov b[edi],13
mov b[edi+1],10
mov b[edi+2],'$'
add edi,2
push edi
pop ecx
sub ecx,offset eDebugHeader
mov edx,offset eDebugHeader
mov ah,40h
mov ebx,d[ERRHandle]
int 21h
;
@@pe1: popm ebx,ecx,esi
add esi,6
inc ebx
loop @@pe0
;
;Now do real mode int details.
;
mov edx,offset RIntHeader
mov ah,40h
mov ecx,RIntHeaderLen
mov ebx,d[ERRHandle]
int 21h
;
mov ecx,256
mov esi,fs:d[EPSP_INTMem]
add esi,(256*6)+(32*6)
mov ebx,0
@@ri0: pushm ebx,ecx,esi
sys GetRVect
cmp cx,es:w[esi+2]
jnz @@pv1000
cmp dx,es:w[esi]
jz @@ri1
@@pv1000: ;
mov edi,offset eDebugHeader
mov eax,ebx
mov cx,2
call bin2hex_err
mov b[edi],' '
inc edi
mov ax,es:w[esi+2]
mov cx,4
call bin2hex_err
mov b[edi],' '
inc edi
mov ax,es:w[esi]
mov cx,4
call bin2hex_err
mov b[edi],' '
inc edi
;
mov b[edi],13
mov b[edi+1],10
mov b[edi+2],'$'
add edi,2
push edi
pop ecx
sub ecx,offset eDebugHeader
mov edx,offset eDebugHeader
mov ah,40h
mov ebx,d[ERRHandle]
int 21h
;
@@ri1: popm ebx,ecx,esi
add esi,4
inc ebx
loop @@ri0
;
;Now do call-back details.
;
mov edx,offset CallBackHeader
mov ah,40h
mov ecx,CallBackHeaderLen
mov ebx,d[ERRHandle]
int 21h
;
mov esi,fs:d[EPSP_Resource]
@@cbLookLoop: push esi
mov ebp,ResNum ;get number of entries.
mov edi,esi
add esi,ResHead+ResNum
add edi,ResHead
@@cb0: cmp es:b[edi],Res_CALLBACK
jnz @@cb1
;
pushad
mov edi,offset eDebugHeader
mov eax,es:[esi]
shr eax,16
mov cx,4
call bin2hex_err
mov b[edi],':'
inc edi
mov eax,es:[esi]
mov cx,4
call bin2hex_err
mov b[edi],' '
inc edi
mov eax,es:[esi+8]
mov cx,4
call bin2hex_err
mov b[edi],':'
inc edi
mov eax,es:[esi+4]
mov cx,8
call bin2hex_err
;
mov b[edi],13
mov b[edi+1],10
mov b[edi+2],'$'
add edi,2
push edi
pop ecx
sub ecx,offset eDebugHeader
mov edx,offset eDebugHeader
mov ah,40h
mov ebx,d[ERRHandle]
int 21h
popad
;
@@cb1: add esi,4
inc edi
dec ebp
jnz @@cb0
pop edi
mov esi,es:[edi+8] ;link to next list.
or esi,esi
jnz @@cbLookLoop
@@r8: popad
pop es
pop fs
;
mov ebx,d[ERRHandle]
mov ah,3eh
int 21h
;
@@9: ret
GenerateCWD_ERR endp
;-------------------------------------------------------------------------
;
;Convert number into ASCII Hex version.
;
;On Entry:-
;
;EAX - Number to convert.
;CX - Digits to do.
;DS:EDI - Buffer to put string in.
;
Bin2Hex_err proc near
pushm eax,ebx,ecx,edx,edi
movzx ecx,cx
mov ebx,offset HexTable
add edi,ecx
dec edi
mov edx,eax
@@0: mov al,dl
shr edx,4
and al,15
xlat [ebx]
mov [edi],al
dec edi
dec ecx
jnz @@0
popm eax,ebx,ecx,edx,edi
push ecx
movzx ecx,cx
add edi,ecx
pop ecx
ret
Bin2Hex_err endp
;-------------------------------------------------------------------------
;
;Convert segment value into real & application relative.
;
;On Entry:-
;
;AX - Selector.
;DS:EDI - Buffer address.
;
DebugSegmentDPMI proc near
push fs
mov fs,DebugPSP
mov ebx,-1
;
push eax
mov ax,fs
movzx eax,ax
lsl eax,eax
cmp eax,(size PSP_Struc)+(size EPSP_Struc)
pop eax
jc @@9
;
mov dx,ax
cmp ax,fs:w[EPSP_SegBase] ;inside application selector space?
jc @@9
mov cx,fs:w[EPSP_SegSize]
add cx,fs:w[EPSP_SegBase] ;add in base selector.
cmp ax,cx
jnc @@9 ;outside application startup selectors.
mov bx,dx
pushm cx,dx
mov ax,0006h
int 31h
mov ax,cx
shl eax,16
mov ax,dx
popm cx,dx
sub eax,fs:d[EPSP_MemBase] ;get offset within application.
mov ebx,eax
@@9: pop fs
mov [edi],ebx ;store generated value.
ret
DebugSegmentDPMI endp
;-------------------------------------------------------------------------
; copy debug text into output buffer
; upon entry ds:edi -> out buffer, ds:edx -> in buffer
;
DebugTextCopy PROC NEAR
dbdloop:
mov al,ds:[edx]
test al,al
je dbdret ; null terminator flags end of text, don't transfer
mov ds:[edi],al
inc edx
inc edi
jmp dbdloop
dbdret:
ret
DebugTextCopy ENDP
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -