1 TITLE DEBUGger for
MS-DOS
2 ; DEBUG-86 8086 debugger runs under 86-DOS version 2.30
4 ; Modified 5/4/82 by AaronR to do all I/O direct to devices
5 ; Runs on MS-DOS 1.28 and above
8 ; New device interface (1.29 and above)
10 ; line by line assembler added by C. Peters
12 ; Uses EXEC system call
14 ; Ztrace mode by zibo.
15 ; Fix dump display to indent properly
16 ; Parity nonsense by zibo
19 ; Split into seperate modules to allow for
20 ; assembly on an IBM PC
34 ; Structure for system call 72
37 DPBHEAD
DD ?
; Pointer to head of DPB-FAT list
38 sft_addr
DD ?
; Pointer to first FCB table
39 ; The following address points to the CLOCK device
41 ; The following address is used by DISKSTATCHK it is always
42 ; points to the console input device header
43 BCON
DD ?
; Console device entry points
44 NUMIO
DB 0 ; Number of disk tables
45 MAXSEC
DW 0 ; Maximum allowed sector size
53 CODE SEGMENT PUBLIC 'CODE'
56 CONST
SEGMENT PUBLIC BYTE
58 EXTRN USER_PROC_PDB
:WORD,STACK:BYTE,CSSAVE
:WORD,DSSAVE
:WORD
59 EXTRN SPSAVE
:WORD,IPSAVE
:WORD,LINEBUF
:BYTE,QFLAG
:BYTE
60 EXTRN NEWEXEC
:BYTE,HEADSAVE
:WORD,LBUFSIZ
:BYTE,BACMES
:BYTE
61 EXTRN BADVER
:BYTE,ENDMES
:BYTE,CARRET
:BYTE,ParityMes
:BYTE
64 EXTRN DSIZ
:BYTE,NOREGL
:BYTE,DISPB
:WORD
68 EXTRN CONFCB
:BYTE,POUT
:DWORD,COUT
:DWORD,CIN
:DWORD,IOBUFF
:BYTE
69 EXTRN IOADDR
:DWORD,IOCALL
:BYTE,IOCOM
:BYTE,IOSTAT
:WORD,IOCNT
:WORD
70 EXTRN IOSEG
:WORD,COLPOS
:BYTE,BADDEV
:BYTE,BADLSTMES
:BYTE
71 EXTRN LBUFFCNT
:BYTE,PFLAG
:BYTE
76 DATA SEGMENT PUBLIC BYTE
78 EXTRN PARSERR
:BYTE,DATAEND
:WORD,ParityFlag
:BYTE,DISADD
:BYTE
79 EXTRN ASMADD
:BYTE,DEFDUMP
:BYTE,BYTEBUF
:BYTE
83 DG GROUP
CODE,CONST
,DATA
86 CODE SEGMENT PUBLIC 'CODE'
87 ASSUME
CS:DG
,DS:DG
,ES:DG
,SS:DG
89 PUBLIC RESTART
,SET_TERMINATE_VECTOR
,DABORT
,TERMINATE
,COMMAND
90 PUBLIC FIND_DEBUG
,CRLF
,BLANK
,TAB
,OUT,INBUF
,SCANB
,SCANP
91 PUBLIC PRINTMES
,RPRBUF
,HEX
,OUTSI
,OUTDI
,OUT16
,DIGIT
,BACKUP
,RBUFIN
94 PUBLIC SETUDEV
,DEVIOCALL
95 EXTRN DISPREG
:NEAR,IN:NEAR
98 EXTRN PERR
:NEAR,COMPARE
:NEAR,DUMP
:NEAR,ENTER:NEAR,FILL
:NEAR
99 EXTRN GO
:NEAR,INPUT
:NEAR,LOAD:NEAR,MOVE
:NEAR,NAME
:NEAR
100 EXTRN REG
:NEAR,SEARCH
:NEAR,DWRITE
:NEAR,UNASSEM
:NEAR,ASSEM
:NEAR
101 EXTRN OUTPUT
:NEAR,ZTRACE
:NEAR,TRACE
:NEAR,GETHEX
:NEAR,GETEOL
:NEAR
103 EXTRN PREPNAME
:NEAR,DEFIO
:NEAR,SKIP_FILE
:NEAR,DEBUG_FOUND
:NEAR
104 EXTRN TrapParity
:NEAR,ReleaseParity
:NEAR
112 HEADER
DB "Vers 2.30"
115 DOSVER_HIGH EQU
0200H ; 2.00 in hex
118 XCHG AH,AL ; Turn it around to AH.AL
122 MOV DX,OFFSET DG
:BADVER
123 MOV AH,STD_CON_STRING_OUTPUT
128 CALL TrapParity
; scarf up those parity guys
129 MOV AH,GET_CURRENT_PDB
131 MOV [USER_PROC_PDB
],BX ; Initially set to DEBUG
137 MOV SP,OFFSET DG
:STACK
145 MOV WORD PTR CS:[CIN
+2],DS
146 MOV WORD PTR CS:[CIN
],SI
147 MOV WORD PTR CS:[COUT
+2],DS
148 MOV WORD PTR CS:[COUT
],SI
151 MOV DX,OFFSET DG
:CONFCB
156 MOV DX,OFFSET DG
:BADLSTMES
162 JZ NOLIST1
; User didn't specify one
164 MOV DI,OFFSET DG
:(CONFCB
+ 1)
165 MOV SI,OFFSET DG
:LINEBUF
167 MOV DX,OFFSET DG
:CONFCB
172 MOV DX,OFFSET DG
:BADDEV
175 MOV WORD PTR [POUT
+2],CS
176 MOV WORD PTR [POUT
],OFFSET DG
:LONGRET
187 LDS SI,DWORD PTR DS:[SI.fcb_FIRCLUS
]
188 MOV WORD PTR CS:[POUT
+2],DS
189 MOV WORD PTR CS:[POUT
],SI
196 ; Code to print header
197 ; MOV DX,OFFSET DG:HEADER
200 CALL SET_TERMINATE_VECTOR
203 MOV AL,23H
; Set vector 23H
204 MOV DX,OFFSET DG
:DABORT
208 MOV DX,CS ; Get DEBUG's segment
209 MOV AX,OFFSET DG
:DATAEND
+ 15 ; End of debug
210 SHR AX,1 ; Convert to segments
214 ADD DX,AX ; Add siz of debug in paragraphs
215 MOV AH,CREATE_PROCESS_DATA_BLOCK
; create program segment just after DEBUG
218 MOV DI,OFFSET DG
:DSSAVE
224 MOV WORD PTR [DISADD
+2],AX
225 MOV WORD PTR [ASMADD
+2],AX
226 MOV WORD PTR [DEFDUMP
+2],AX
228 MOV WORD PTR[DISADD
],AX
229 MOV WORD PTR[ASMADD
],AX
230 MOV WORD PTR [DEFDUMP
],AX
235 INT 21H
; Set default DMA address to 80H
236 MOV AX,WORD PTR DS:[6]
242 MOV AX,WORD PTR DS:[6]
244 MOV BX,OFFSET DG
:DATAEND
+ 15
245 AND BX,0FFF0H ; Size of DEBUG in bytes (rounded up to PARA)
257 MOV ES:WORD PTR [6],AX
261 ADD ES:WORD PTR [8],BX
264 ; Get screen size and initialize display related variables
270 MOV BYTE PTR NOREGL
,4
275 ; Copy rest of command line to test program's parameter area
278 MOV AX,(PARSE_FILE_DESCRIPTOR
SHL 8) OR 01H
280 CALL SKIP_FILE
; Make sure si points to delimiter
286 CMP BYTE PTR ES:[DI],0 ; ANY STUFF FOUND?
289 CMP BYTE PTR ES:[DI],13 ; COMMAND LINE JUST SPACES?
291 CMP BYTE PTR ES:[DI]," "
293 CMP BYTE PTR ES:[DI],9
296 CALL DEFIO
; WELL READ IT IN
298 MOV WORD PTR DISADD
+2,AX
299 MOV WORD PTR ASMADD
+2,AX
301 MOV WORD PTR DISADD
,AX
302 MOV WORD PTR ASMADD
,AX
309 MOV SP,OFFSET DG
:STACK
311 CMP [ParityFlag
],0 ; did we detect a parity error?
312 JZ GoPrompt
; nope, go prompt
313 MOV [ParityFlag
],0 ; reset flag
314 MOV DX,OFFSET DG
:ParityMes
; message to print
315 MOV AH,STD_CON_STRING_OUTPUT
; easy way out
320 CALL INBUF
; Get command line
321 ; From now and throughout command line processing, DI points
322 ; to next character in command line to be processed.
323 CALL SCANB
; Scan off leading blanks
324 JZ COMMAND
; Null command?
325 LODSB ; AL=first non-blank character
326 ; Prepare command letter for table lookup
327 SUB AL,"A" ; Low end range check
329 CMP AL,"Z"-"A" ; Upper end range check
332 CBW ; Now a 16-bit quantity
333 XCHG BX,AX ; In BX we can address with it
334 CALL CS:[BX+COMTAB
] ; Execute command
335 JMP SHORT COMMAND
; Get next command
338 SET_TERMINATE_VECTOR:
339 MOV AX,(SET_INTERRUPT_VECTOR
SHL 8) OR 22H
; Set vector 22H
340 MOV DX,OFFSET DG
:TERMINATE
345 CMP BYTE PTR CS:[QFLAG
],0
347 MOV CS:[USER_PROC_PDB
],CS
348 CMP BYTE PTR CS:[NEWEXEC
],0
353 MOV SP,OFFSET DG
:STACK
358 MOV DX,OFFSET DG
:ENDMES
366 MOV DX,OFFSET DG
:CARRET
371 MOV SP,OFFSET DG
:STACK
377 MOV DI,OFFSET DG
:CONFCB
378 MOV AX,(PARSE_FILE_DESCRIPTOR
SHL 8) OR 01H
384 MOV DX,OFFSET DG
:CONFCB
390 TEST BYTE PTR [SI.fcb_DEVID
],080H ; Device?
392 LDS SI,DWORD PTR [CONFCB
.fcb_FIRCLUS
]
393 MOV WORD PTR CS:[CIN
],SI
394 MOV WORD PTR CS:[CIN
+2],DS
395 MOV WORD PTR CS:[COUT
],SI
396 MOV WORD PTR CS:[COUT
+2],DS
403 MOV DX,OFFSET DG
:BADDEV
408 ; Get input line. Convert all characters NOT in quotes to upper case.
412 MOV SI,OFFSET DG
:LINEBUF
413 MOV DI,OFFSET DG
:BYTEBUF
420 ADD AL,"A"-"a" ; Convert to upper case
441 MOV SI,OFFSET DG
:BYTEBUF
443 ; Output CR/LF sequence
451 ; Physical backspace - blank, backspace, blank
454 MOV SI,OFFSET DG
:BACMES
456 ; Print ASCII message. Last char has bit 7 set
459 LODS CS:BYTE PTR [SI] ; Get char to print
461 SHL AL,1 ; High bit set?
465 ; Scan for parameters of a command
468 CALL SCANB
; Get first non-blank
469 CMP BYTE PTR [SI],"," ; One comma between params OK
470 JNE EOLCHK
; If not comma, we found param
471 INC SI ; Skip over comma
473 ; Scan command line for next non-blank character
483 DEC SI ; Back to first non-blank
489 ; Hex addition and subtraction
509 ; Print the hex address of DS:SI
512 MOV DX,DS ; Put DS where we can work with it
513 CALL OUT16
; Display segment
517 JMP SHORT OUT16
; Output displacement
519 ; Print hex address of ES:DI
520 ; Same as OUTSI above
529 ; Print out 16-bit value in DX in hex
532 MOV AL,DH ; High-order byte first
534 MOV AL,DL ; Then low-order byte
536 ; Output byte in AL as two hex digits
539 MOV AH,AL ; Save for second digit
540 ; Shift high digit into low 4 bits
546 CALL DIGIT
; Output first digit
547 MOV AL,AH ; Now do digit saved in AH
549 AND AL,0FH ; Mask to 4 bits
550 ; Trick 6-byte hex conversion works on 8086 too.
556 ; Console output of character in AL. No registers affected but bit 7
557 ; is reset before output.
565 MOV AL,8 ; DELETE same as backspace
580 CMP BYTE PTR CS:[COLPOS
],0
582 DEC BYTE PTR CS:[COLPOS
]
585 MOV BYTE PTR CS:[COLPOS
],0FFH
587 INC BYTE PTR CS:[COLPOS
]
589 TEST BYTE PTR CS:[PFLAG
],1
660 MOV BX,OFFSET DG
:IOCALL
662 MOV WORD PTR CS:[IOSTAT
],0
663 MOV WORD PTR CS:[IOCNT
],1
665 MOV WORD PTR CS:[IOADDR
+2],DS
667 MOV WORD PTR CS:[IOADDR
],AX
668 CALL DWORD PTR CS:[IOADDR
]
670 MOV WORD PTR CS:[IOADDR
],AX
671 CALL DWORD PTR CS:[IOADDR
]
698 MOV BYTE PTR [LBUFFCNT
],0
699 MOV DI,OFFSET DG
:LINEBUF
708 CMP BYTE PTR [LBUFFCNT
],BUFLEN
711 INC BYTE PTR [LBUFFCNT
]
729 CMP DI,OFFSET DG
:LINEBUF
732 DEC BYTE PTR [LBUFFCNT
]
740 MOV DX,OFFSET DG
:LBUFSIZ
779 ; Output the number of blanks in CX
786 ; Command Table. Command letter indexes into table to get
787 ; address of command. PERR prints error for no such command.
826 MOV BX,[USER_PROC_PDB
]
829 MOV AH,SET_CURRENT_PDB
832 CALL ReleaseParity
; let system do normal parity stuff