📄 generr.asm
字号:
;==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==-==
;
;Generate a CWD.ERR file for current program.
;
ResSize equ 4096 ;Size of resource block.
ResHead equ 16 ;Size of main header.
ResNum equ ((((4096-ResHead)/5) shr 2) shl 2) ;Number of entries.
ResCount equ ResNum-4 ;count for free entry checking.
Res_NULL equ 0 ;MUST be zero.
Res_PSP equ 1 ;single entry.
Res_SEL equ 2 ;single entry.
Res_MEM equ 3 ;3 entries.
Res_LOCK equ 4 ;2 entries.
Res_DOSMEM equ 5 ;?
Res_CALLBACK equ 6 ;3 entries.
Res_NOTHING equ 254
Res_CHAIN equ 255 ;single entry.
mcbChunkLast equ 0 ;pointer to previous chunk in chain.
mcbChunkNext equ 4 ;pointer to next chunk in chain.
mcbBiggest equ 8 ;biggest free block in this chunk.
mcbChunkSize equ 10 ;size of this chunk.
mcbChunkLen equ 12 ;length of chunk control entry.
mcbID equ 0 ;ID for corruption checking.
mcbLast equ 1 ;previous MCB pointer status.
mcbLastSize equ 2 ;pointer to previous MCB.
mcbFreeUsed equ 4 ;free or used status.
mcbNext equ 5 ;next MCB pointer status.
mcbNextSize equ 6 ;pointer to next MCB.
mcbLen equ 8 ;length of an MCB entry.
GenerateCWD_ERR proc near
mov d[ErrHandle],0
mov TotalLinearMem,0
mov TotalLinearMem+4,0
mov TotalLinearMem+8,0
mov TotalSelectors,0
;
;Process segment registers to produce application relative base
;addresses.
;
mov ax,DebugCS
mov edi,offset DebugCSApp
call DebugSegmentDPMI
mov ax,DebugDS
mov edi,offset DebugDSApp
call DebugSegmentDPMI
mov ax,DebugES
mov edi,offset DebugESApp
call DebugSegmentDPMI
mov ax,DebugFS
mov edi,offset DebugFSApp
call DebugSegmentDPMI
mov ax,DebugGS
mov edi,offset DebugGSApp
call DebugSegmentDPMI
mov ax,DebugSS
mov edi,offset DebugSSApp
call DebugSegmentDPMI
;
mov edx,offset eDebugName
xor cx,cx
mov ax,3c00h
int 21h
jc @@NoFile
mov d[ERRHandle],eax
;
@@NoFile: ;Display debug info.
;
mov esi,offset Copyright+1
xor ecx,ecx
@@LookCEnd: cmp b[esi],0
jz @@AtCEnd
inc ecx
inc esi
jmp @@LookCEnd
@@AtCEnd: mov edx,offset Copyright+1
mov ebx,d[ERRHandle]
mov ah,40h
int 21h
;
mov ax,DebugTR
mov ecx,4
mov edi,offset eDebugTRt
call bin2hex_err
mov eax,DebugCR0
mov ecx,8
mov edi,offset eDebugCR0t
call bin2hex_err
mov eax,DebugCR2
mov ecx,8
mov edi,offset eDebugCR2t
call bin2hex_err
mov eax,DebugCR3
mov ecx,8
mov edi,offset eDebugCR3t
call bin2hex_err
;
mov eax,DebugEAX
mov ecx,8
mov edi,offset eDebugEAXt
call bin2hex_err
mov eax,DebugEBX
mov ecx,8
mov edi,offset eDebugEBXt
call bin2hex_err
mov eax,DebugECX
mov ecx,8
mov edi,offset eDebugECXt
call bin2hex_err
mov eax,DebugEDX
mov ecx,8
mov edi,offset eDebugEDXt
call bin2hex_err
mov eax,DebugESI
mov ecx,8
mov edi,offset eDebugESIt
call bin2hex_err
mov eax,DebugEDI
mov ecx,8
mov edi,offset eDebugEDIt
call bin2hex_err
mov eax,DebugEBP
mov ecx,8
mov edi,offset eDebugEBPt
call bin2hex_err
mov eax,DebugESP
mov ecx,8
mov edi,offset eDebugESPt
call bin2hex_err
mov eax,DebugEIP
mov ecx,8
mov edi,offset eDebugEIPt
call bin2hex_err
mov eax,DebugEFL
mov ecx,8
mov edi,offset eDebugEFLt
call bin2hex_err
;
mov ax,DebugCS
mov ecx,4
mov edi,offset eDebugCSt
call bin2hex_err
mov eax,DebugCSApp
mov ecx,8
mov edi,offset eDebugCSAppt
cmp eax,-1
jnz @@0
mov d[edi],'xxxx'
mov d[edi+4],'xxxx'
add edi,8
jmp @@1
@@0: call bin2hex_err
@@1: mov ax,DebugDS
mov ecx,4
mov edi,offset eDebugDSt
call bin2hex_err
mov eax,DebugDSApp
mov ecx,8
mov edi,offset eDebugDSAppt
cmp eax,-1
jnz @@2
mov d[edi],'xxxx'
mov d[edi+4],'xxxx'
add edi,8
jmp @@3
@@2: call bin2hex_err
@@3: mov ax,DebugES
mov ecx,4
mov edi,offset eDebugESt
call bin2hex_err
mov eax,DebugESApp
mov ecx,8
mov edi,offset eDebugESAppt
cmp eax,-1
jnz @@4
mov d[edi],'xxxx'
mov d[edi+4],'xxxx'
add edi,8
jmp @@5
@@4: call bin2hex_err
@@5: mov ax,DebugFS
mov ecx,4
mov edi,offset eDebugFSt
call bin2hex_err
mov eax,DebugFSApp
mov ecx,8
mov edi,offset eDebugFSAppt
cmp eax,-1
jnz @@6
mov d[edi],'xxxx'
mov d[edi+4],'xxxx'
add edi,8
jmp @@7
@@6: call bin2hex_err
@@7: mov ax,DebugGS
mov ecx,4
mov edi,offset eDebugGSt
call bin2hex_err
mov eax,DebugGSApp
mov ecx,8
mov edi,offset eDebugGSAppt
cmp eax,-1
jnz @@10
mov d[edi],'xxxx'
mov d[edi+4],'xxxx'
add edi,8
jmp @@11
@@10: call bin2hex_err
@@11: mov ax,DebugSS
mov ecx,4
mov edi,offset eDebugSSt
call bin2hex_err
mov eax,DebugSSApp
mov ecx,8
mov edi,offset eDebugSSAppt
cmp eax,-1
jnz @@12
mov d[edi],'xxxx'
mov d[edi+4],'xxxx'
add edi,8
jmp @@13
@@12: call bin2hex_err
@@13: ;
mov edi,offset DebugSysFlags
movzx eax,w[SystemFlags]
mov ecx,8
call bin2hex_err
;
mov edx,offset eDebugRegs
mov ecx,offset eDebugHeaderEnd-(eDebugRegs+1)
mov ebx,d[ERRHandle]
mov ah,40h
int 21h
CSEIPDEBUGDUMPCOUNT EQU 64 ; should be multiple of 16, <=256
SSESPDEBUGDUMPCOUNT EQU 64 ; should be multiple of 16, <=256
SSEBPDEBUGDUMPCOUNT EQU 64 ; should be multiple of 16, <=256
push fs
;
;Do a CS:EIP dump.
;
mov ecx,CSEIPDEBUGDUMPCOUNT
mov fs,DebugCS
mov esi,DebugEIP
test SystemFlags,1
jz @@cseip32
movzx esi,si
@@cseip32:
xor eax,eax
mov ax,fs
lsl eax,eax
cmp eax,-1
jz @@flat0
inc eax
@@flat0:
mov ebx,esi
add ebx,ecx
cmp ebx,eax
jc @@cseip2
sub ebx,eax
sub ecx,ebx
jz @@cseip3
js @@cseip3
@@cseip2:
;
mov edi,offset eDebugHeader
mov edx,OFFSET CSEIPDebugText
call DebugTextCopy
xor edx,edx
@@cseip0:
push ecx
mov ecx,2
mov al,fs:[esi]
call bin2hex_err
pop ecx
mov b[edi]," "
inc edi
inc esi
inc edx
and dl,0fh
jnz @@cseip1
mov WORD PTR ds:[edi],0a0dh
add edi,2
mov eax,20202020h
mov DWORD PTR ds:[edi],eax
mov DWORD PTR ds:[edi+4],eax
add edi,8
mov BYTE PTR ds:[edi],al
inc edi
;
@@cseip1:
dec ecx
jnz @@cseip0
mov DWORD PTR ds:[edi],0a0d0a0dh
add edi,4
mov b[edi],"$"
;
mov edx,offset eDebugHeader
sub edi,edx
mov ecx,edi
mov ah,40h
mov ebx,d[ErrHandle]
int 21h
;
@@cseip3:
;
;Do a SS:ESP dump.
;
mov ecx,SSESPDEBUGDUMPCOUNT
mov fs,DebugSS
mov esi,DebugESP
test SystemFlags,1
jz @@ssesp32
movzx esi,si
@@ssesp32:
xor eax,eax
mov ax,fs
lsl eax,eax
cmp eax,-1
jz @@flat1
inc eax
@@flat1:
mov ebx,esi
add ebx,ecx
cmp ebx,eax
jc @@ssesp2
sub ebx,eax
sub ecx,ebx
jz @@ssesp3
js @@ssesp3
@@ssesp2:
;
mov edi,offset eDebugHeader
mov edx,OFFSET SSESPDebugText
call DebugTextCopy
xor edx,edx
@@ssesp0:
push ecx
mov ecx,2
mov al,fs:[esi]
call bin2hex_err
pop ecx
mov b[edi]," "
inc edi
inc esi
inc edx
test dl,0fh
jnz @@ssesp1
mov WORD PTR ds:[edi],0a0dh
add edi,2
mov eax,20202020h
mov DWORD PTR ds:[edi],eax
mov DWORD PTR ds:[edi+4],eax
add edi,8
mov BYTE PTR ds:[edi],al
inc edi
;
@@ssesp1:
dec ecx
jnz @@ssesp0
mov DWORD PTR ds:[edi],0a0d0a0dh
add edi,4
mov b[edi],"$"
;
mov edx,offset eDebugHeader
sub edi,edx
mov ecx,edi
mov ah,40h
mov ebx,d[ErrHandle]
int 21h
@@ssesp3:
;
;Do a SS:EBP dump.
;
; do a pre-EBP dump for stack frames
mov ecx,SSEBPDEBUGDUMPCOUNT
mov fs,DebugSS
mov esi,DebugEBP
test esi,esi ; see if any previous bytes
je ebpdump ; no, nothing to display
cmp esi,ecx ; see if stack frame as large as display byte dump
jae med2 ; yes
mov ecx,esi
med2:
sub esi,ecx
test SystemFlags,1
jz medssebp32
movzx esi,si
medssebp32:
xor eax,eax
mov ax,fs
lsl eax,eax
cmp eax,-1
jz medflat2
inc eax
medflat2:
mov ebx,esi
add ebx,ecx
cmp ebx,eax
jc medssebp2
sub ebx,eax
sub ecx,ebx
jz ebpdump
js ebpdump
medssebp2:
;
xor edx,edx
mov edi,offset eDebugHeader
mov eax,20202020h
mov DWORD PTR ds:[edi],eax
mov DWORD PTR ds:[edi+4],eax
add edi,8
mov BYTE PTR ds:[edi],al
inc edi
push ecx
and ecx,0fh
je med3
mov dl,16 ; high bytes known zero
sub dl,cl ; save hex bytes left to display on row
mov cl,dl
medloop:
mov ds:[edi],ax ; 3-byte pads until at proper display position
mov ds:[edi+2],al
add edi,3
dec ecx
jne medloop
med3:
pop ecx
medssebp0:
push ecx
mov al,fs:[esi]
mov ecx,2
call bin2hex_err
pop ecx
mov b[edi]," "
inc edi
inc esi
inc edx
test dl,0fh
jnz medssebp1
mov WORD PTR ds:[edi],0a0dh
add edi,2
cmp ecx,1
je medssebp1
mov eax,20202020h
mov DWORD PTR ds:[edi],eax
mov DWORD PTR ds:[edi+4],eax
add edi,8
mov BYTE PTR ds:[edi],al
inc edi
;
medssebp1:
dec ecx
jne medssebp0
; mov WORD PTR ds:[edi],0a0dh
; add edi,2
; mov b[edi],"$"
;
mov edx,offset eDebugHeader
sub edi,edx
mov ecx,edi
mov ah,40h
mov ebx,d[ErrHandle]
int 21h
;
ebpdump:
mov ecx,SSEBPDEBUGDUMPCOUNT
mov fs,DebugSS
mov esi,DebugEBP
test SystemFlags,1
jz @@ssebp32
movzx esi,si
@@ssebp32:
xor eax,eax
mov ax,fs
lsl eax,eax
cmp eax,-1
jz @@flat2
inc eax
@@flat2:
mov ebx,esi
add ebx,ecx
cmp ebx,eax
jc @@ssebp2
sub ebx,eax
sub ecx,ebx
jz @@ssebp3
js @@ssebp3
@@ssebp2:
;
mov edi,offset eDebugHeader
mov edx,OFFSET SSEBPDebugText
call DebugTextCopy
xor edx,edx
@@ssebp0:
push ecx
mov ecx,2
mov al,fs:[esi]
call bin2hex_err
pop ecx
mov b[edi]," "
inc edi
inc esi
inc edx
test dl,0fh
jnz @@ssebp1
mov WORD PTR ds:[edi],0a0dh
add edi,2
mov eax,20202020h
mov DWORD PTR ds:[edi],eax
mov DWORD PTR ds:[edi+4],eax
add edi,8
mov BYTE PTR ds:[edi],al
inc edi
;
@@ssebp1:
dec ecx
jnz @@ssebp0
mov DWORD PTR ds:[edi],0a0d0a0dh
add edi,4
mov b[edi],"$"
;
mov edx,offset eDebugHeader
sub edi,edx
mov ecx,edi
mov ah,40h
mov ebx,d[ErrHandle]
int 21h
;
@@ssebp3:
pop fs
;
;Do resource output stuff.
;
push fs
mov fs,DebugPSP
push es
pushad
cmp fs:d[EPSP_Resource],0
jz @@r8
mov edx,offset ResHeader
mov ah,40h
mov ecx,ResHeaderLen
mov ebx,d[ERRHandle]
int 21h
mov edx,offset SelHeader
mov ah,40h
mov ecx,SelHeaderLen
mov ebx,d[ERRHandle]
int 21h
mov es,RealSegment
mov esi,fs:d[EPSP_Resource]
@@LookLoop: push esi
mov ebp,ResNum ;get number of entries.
mov edi,esi
add esi,ResHead+ResNum
add edi,ResHead
@@r0: cmp es:b[edi],Res_SEL
jnz @@r1
mov ax,fs:w[EPSP_DPMIMem]
cmp es:w[esi],ax
jz @@r1
;
@@SEL: pushad
mov edi,offset eDebugHeader
mov eax,es:[esi]
mov ecx,4
call bin2hex_err
mov b[edi],' '
inc edi
mov ebx,es:[esi]
sys GetSelDet32
push ecx
mov eax,edx
mov ecx,8
call bin2hex_err
mov b[edi],' '
inc edi
pop eax
mov ecx,8
call bin2hex_err
mov b[edi],' '
inc edi
mov eax,es:[esi]
lar eax,eax
test eax,0000100000000000b
mov ebx,'EDOC'
jnz @@dc0
mov ebx,'ATAD'
@@dc0: mov [edi],ebx
add edi,4
mov b[edi],' '
inc edi
mov eax,es:[esi]
lar eax,eax
mov bx,"61"
test eax,00400000h
jz @@Use32It
mov bx,"23"
@@Use32It: mov [edi],bx
add edi,2
mov b[edi],' '
inc edi
inc TotalSelectors
;
;See if there is a memory block that matches this selector.
;
mov ebx,es:[esi]
sys GetSelDet32
mov ebx,edx
pushad
mov esi,fs:d[EPSP_Resource]
@@s2: push esi
mov ebp,ResNum ;get number of entries.
mov edi,esi
add esi,ResHead+ResNum
add edi,ResHead
@@s0: cmp es:b[edi],Res_MEM ;Anything here?
jnz @@s1
mov eax,fs:d[EPSP_INTMem]
cmp es:[esi],eax
jz @@s1
cmp fs:w[EPSP_DPMIMem],0
jz @@nodpmi
pushad
mov bx,fs:w[EPSP_DPMIMem]
sys GetSelDet32
cmp es:[esi],edx
popad
jz @@s1
@@nodpmi: ;
cmp ebx,es:[esi] ;Fits this block?
jnz @@s1
pop esi
clc
jmp @@s3
;
@@s1: add esi,4
inc edi
dec ebp
jnz @@s0
pop esi
mov esi,es:[esi+8] ;link to next list.
or esi,esi
jnz @@s2
;
;Have a look in the MCB list.
;
cmp fs:d[EPSP_mcbHead],0
jz @@nomcbsel
mov esi,fs:d[EPSP_mcbHead]
@@mcbs0: mov edi,esi
add esi,mcbChunkLen
@@mcbs1: mov eax,esi
add eax,mcbLen
cmp ebx,eax
jnz @@mcbs2
clc
jmp @@s3
@@mcbs2: cmp es:b[esi+mcbNext],"M"
jz @@mcbs3
mov esi,es:[edi+mcbChunkNext]
or esi,esi
jz @@nomcbsel
jmp @@mcbs0
@@mcbs3: movzx eax,es:w[esi+mcbNextSize]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -