📄 help.asm
字号:
;
; GRDB
;
; Copyright(c) LADsoft
;
; David Lindauer, camille@bluegrass.net
;
;
; help.asm
;
; Function: Handle help and most of the status screens
;
; Handles numbers
; Handles segments
; Handles trapping page faults
; Handles command input
;
;MASM MODE
.model small
.386
include iversion.inc
include eprints.inc
include emtrap.inc
include eenv.inc
include eloader.inc
include einput.inc
include edos.inc
include eoptions.inc
include eints.inc
extrn cpumodel : byte
PUBLIC help
.data
memx dw 0 ; used to filter non-program stuff in arena dump (?m)
none db "none",0
cputypes db "386",0,"486",0,"Pentium",0
db "Pentium Pro",0,"786",0,"886",0,"986",0
.code
;
; help command entry point
;
Help PROC
; call PrintFollowingMessage
; db 13,10,"Get Real Debugger Version "
; db 30h + verid/10,'.',30h + verid MOD 10,9
; db "Copyright (c) LADsoft",13,10
; db 0
call WadeSpace
jnz help2
call PrintFollowingMessage
db 13,10
db "a [address] - assemble",13,10
db "b [d][#] - Show breakpoint(s)",13,10
db "b [d][-]#,addr[,r/w/x[,len]] - set or clear a breakpoint",13,10
db "d [start [,end]] - dump memory",13,10
db "e start [,list] - examine memory",13,10
db "g [=start] [,break] - run from start (or pos) to break",13,10
db "h val1 [+-*/] val2 - hex arithmetic",13,10
db "i[bwd] port - read from port",13,10
db "l [@] [-] [name[ command]] - read from file",13,10
db "n [s] - show fp regs/status",13,10
db "n #, val - set value in an FP reg",13,10
db "o[bwd] port,val - write to port",13,10
db "p [r] - step through",13,10
db "q - quit",13,10
db "r [reg[:val]] - show/modify regs",13,10
db "t [count] - step into",13,10
db "u [start [,end]] - unassemble",13,10
db "w [@addr] [name] [,len] - write to file",13,10
db "? - this help",13,10
db "?? - help for extended commands"
db 0
clc
ret
help2:
cmp al,'?'
jnz status
inc si
call wadespace
jnz herr
call PrintFollowingMessage
db 13,10
db "c start,end,start2 - compare memory",13,10
db "f start,end [,val] - fill memory",13,10
db "m source,end,dest - move memory",13,10
db "s start,end [,list] - search for a byte pattern",13,10
db "xr drive: addr,start [,len] - read logical disk sector",13,10
db "xw drive: addr,start [,len] - write logical disk sector",13,10
db "y pfa,reg[,val] - read/[write] PCI reg",13,10
db "y? bus, dev, func - get PFA from bus:dev:func",13,10
db "@ [a] [logfile] - start/stop logging to a file",13,10
db "?i - view interrupt info",13,10
db "?m [x] - view arena tags",13,10
db "?o [+-option] - view/set options",13,10
db "?p - view program status"
db 0
clc
ret
;
; program & processor info
;
status:
cmp al,'p'
jnz hmem
inc si
call WadeSpace
jnz herr
PRINT_MESSAGE <13,10,"Dos version: ">
mov al,byte ptr [dosver + 1]
call printbyte
mov dl,'.'
call putchar
mov al,byte ptr [dosver]
call printbyte
PRINT_MESSAGE <13,10,"CPU type: ">
mov di,offset cputypes ; calculate CPU type message pos
movzx cx,[cpumodel] ; program needs a 386+ :)
sub cx,3
jcxz gotcpu
sub al,al
cpulp:
push cx
mov cx,-1
repne scasb
pop cx
loop cpulp
gotcpu:
mov bx,di ; put out CPU type
call dgroupMessage
call crlf
mov si,offset loadfile ; calc loadfile and command
mov di,offset loadcommand
test [filelen],-1
jnz okprog
mov si,offset none
mov di,si
okprog:
test byte ptr [di],-1
jnz okgotdi
mov di,offset none
okgotdi:
test byte ptr [si],-1
jnz okgotsi
mov si,offset none
okgotsi:
PRINT_MESSAGE <13,10,"Program: ">
mov bx,si
call DgroupMessage
PRINT_MESSAGE <13,10,"Arguments: ">
mov bx,di
call DgroupMessage
call ExeStats ; put out EXE file stats
call crlf
PRINT_MESSAGE <13,10,"Psp at ">
mov ax,[userbasepsp]
call PrintWord
mov ax,[userpsp]
cmp ax,[userbasepsp]
jz normpsp
push ax ; display if they have changed it
call printspace
mov dl,'('
call PutChar
pop ax
call PrintWord
mov dl,')'
call PutChar
call printspace
normpsp:
PRINT_MESSAGE <" with length ">
mov ax,[userbasepsp]
dec ax
mov fs,ax
mov ax,fs:[3]
call PrintWord
PRINT_MESSAGE <13,10,"Environment at ">
mov ax,[TgtPgmEnvSeg]
call PrintWord
PRINT_MESSAGE <" with ">
mov ax,[TgtPgmEnvSpaceUsed]
call Printword
PRINT_MESSAGE <" bytes used of ">
mov ax,[TgtPgmEnvLen]
call PrintWord
clc
ret
;
; arena stats
;
hmem: cmp al,'m'
jnz hopt
mov ax,[userbasepsp] ; calc PSP match
mov [memx],ax
inc si
call WadeSpace
jz memok
cmp al,'x'
jnz herr
inc si
call WadeSpace
jnz herr
mov [memx],0
memok:
PRINT_MESSAGE <13,10,13,10,"Top of memory: ">
mov fs,[userbasepsp]
mov ax,fs:[2]
call PrintWord
call crlf
push es ; get root of chain
mov ah,52h
int 21h
mov bx,es:[bx-2]
pop es
meml:
mov fs,bx
test [memx],0ffffh ; check match and jump around if not
jz memd
mov ax,fs:[1]
cmp ax,[memx]
jnz memnd
memd:
PRINT_MESSAGE <13,10,"Address: ">
mov ax,fs
call PrintWord
PRINT_MESSAGE <" Owner: ">
test word ptr fs:[1],-1
jz memu
cmp word ptr fs:[1],100h
jc memdos
cmp word ptr fs:[1],0f000h
jnc membios
push fs ; not special
mov bx,fs:[1] ; display prog name owner
dec bx
mov fs,bx
mov si,8
mov cx,8
memns:
lods byte ptr fs:[si]
or al,al
jz memnsx
mov dl,al
call PutChar
loop memns
memnsx:
pop fs
inc cx
push cx
mov dl,'('
call PutChar
mov ax,fs:[1]
call PrintWord
mov dl,')'
call PutChar
jmp memsz
memdos: ; dos special case
push 12
PRINT_MESSAGE "DOS"
jmp memmsg
membios: ; bios special case
push 11
PRINT_MESSAGE "BIOS"
jmp memmsg
memu: ; free special case
push 11
PRINT_MESSAGE "FREE"
memmsg:
memsz:
pop cx
memspl:
mov dl,' ' ; field pad
push cx
call PutChar
pop cx
loop memspl
PRINT_MESSAGE " Size: "
mov ax,fs:[3]
call PrintWord
mov bx,fs
memnd:
add bx,fs:[3] ; index to next entry
inc bx
cmp byte ptr fs:[0],'Z' ; quit if this entry was EOM
jnz meml
clc
ret
;
; option status, jump to option routine
;
hopt:
cmp al,'o'
jnz hchain
inc si
jmp doopt
;
; chain status
;
hchain:
cmp al,'i'
jnz herr
inc si
call wadespace
jnz herr
inc si
call crlf
push es
mov es,[intpage]
sub ax,ax
mov gs,ax
mov cx,256
sub si,si
sub di,di
chl:
lods dword ptr gs:[si] ; compare currint int page entry
scasd
jz noch
push si
push di
push eax ; mismatch, print int #
mov al,cl
neg al
push ax
call printbyte
pop ax
cmp al,21h ; int 21h is modifiable
jz nostar
or al,al ; so are all ints > 7FH
js nostar
push es
push ds
pop es
mov di,offset veclist
chlx:
scasb
jz dostar
inc di
inc di
cmp byte ptr [di],0ffh
jnz chlx
pop es
nostar:
call printspace ; not overridden
jmp chj
dostar:
pop es
mov dl,'*'
call putchar
chj: ; print int vect address
mov dl,':'
call putchar
call printspace
pop bx
pop ax
call printword
mov dl,':'
call putchar
mov ax,bx
call printword
call crlf
pop di
pop si
noch:
loop chl
pop es
PRINT_MESSAGE <13,10,"PIC 0 mask: ">
mov dx,21h
mov ah,byte ptr [orgpic+1]
call picval
PRINT_MESSAGE <13,10,"PIC 1 mask: ">
mov dx,0a1h
mov ah,byte ptr [orgpic]
call picval
clc
ret
picval:
push ax
in al,dx
push dx
call printbyte
call printspace
mov dl,'('
call putchar
pop dx
pop ax
push dx
mov al,ah
call printbyte
mov dl,','
call putchar
pop dx
dec dx
mov al,0bh
out dx,al
in al,dx
call printbyte
mov dl,')'
call putchar
ret
herr:
stc
ret
Help ENDP
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -