summaryrefslogtreecommitdiff
path: root/v4.0/src/CMD/DEBUG/DEBCOM2.ASM
diff options
context:
space:
mode:
Diffstat (limited to 'v4.0/src/CMD/DEBUG/DEBCOM2.ASM')
-rw-r--r--v4.0/src/CMD/DEBUG/DEBCOM2.ASM1308
1 files changed, 1308 insertions, 0 deletions
diff --git a/v4.0/src/CMD/DEBUG/DEBCOM2.ASM b/v4.0/src/CMD/DEBUG/DEBCOM2.ASM
new file mode 100644
index 0000000..b22795f
--- /dev/null
+++ b/v4.0/src/CMD/DEBUG/DEBCOM2.ASM
@@ -0,0 +1,1308 @@
1 PAGE 60,132 ;
2 TITLE DEBCOM2.ASM - PART2 DEBUGGER COMMANDS PC DOS
3;======================= START OF SPECIFICATIONS =========================
4;
5; MODULE NAME: DECOM2.SAL
6;
7; DESCRIPTIVE NAME: DEBUGGING TOOL
8;
9; FUNCTION: PROVIDES USERS WITH A TOOL FOR DEBUGGING PROGRAMS.
10;
11; ENTRY POINT: ANY CALLED ROUTINE
12;
13; INPUT: NA
14;
15; EXIT NORMAL: NA
16;
17; EXIT ERROR: NA
18;
19; INTERNAL REFERENCES:
20;
21; EXTERNAL REFERENCES:
22;
23; ROUTINE: DEBCOM1 - CONTAINS ROUTINES CALLED BY DEBUG
24; DEBCOM3 - CONTAINS ROUTINES CALLED BY DEBUG
25; DEBASM - CONTAINS ROUTINES CALLED BY DEBUG
26; DEBUASM - CONTAINS ROUTINES CALLED BY DEBUG
27; DEBMES - CONTAINS ROUTINES CALLED BY DEBUG
28;
29; NOTES: THIS MODULE IS TO BE PREPPED BY SALUT WITH THE "PR" OPTIONS.
30; LINK DEBUG+DEBCOM1+DEBCOM2+DEBCOM3+DEBASM+DEBUASM+DEBERR+
31; DEBCONST+DEBDATA+DEBMES
32;
33; REVISION HISTORY:
34;
35; AN000 VERSION 4.00 - REVISIONS MADE RELATE TO THE FOLLOWING:
36; AC000 VERSION 4.00 -
37;
38; - IMPLEMENT DBCS HANDLING DMS:6/17/87
39; - IMPLEMENT MESSAGE RETRIEVER DMS:6/17/87
40; - IMPLEMENT > 32MB SUPPORT DMS:6/17/87
41;
42; COPYRIGHT: "MS DOS DEBUG UTILITY"
43; "VERSION 4.00 (C) COPYRIGHT 1988 Microsoft"
44; "LICENSED MATERIAL - PROPERTY OF Microsoft "
45;
46;======================= END OF SPECIFICATIONS ===========================
47
48; Routines to perform debugger commands except ASSEMble and UASSEMble
49
50 IF1
51 %OUT COMPONENT=DEBUG, MODULE=DEBCOM2
52 ENDIF
53.XLIST
54.XCREF
55 INCLUDE DOSSYM.INC
56 INCLUDE DEBEQU.ASM
57.CREF
58.LIST
59CODE SEGMENT PUBLIC BYTE
60CODE ENDS
61
62CONST SEGMENT PUBLIC BYTE
63 EXTRN NOTFND_PTR:BYTE,NOROOM_PTR:BYTE,DRVLET:BYTE,ERRMES_PTR:BYTE
64 EXTRN NAMBAD_PTR:BYTE,NOSPACE_PTR:BYTE,TOOBIG_PTR:BYTE
65 EXTRN HEXERR_PTR:BYTE,HEXWRT_PTR:BYTE,ACCMES_PTR:BYTE
66 EXTRN EXEBAD_PTR:BYTE,EXEWRT_PTR:BYTE
67 EXTRN EXECEMES_PTR:BYTE,NONAMESPEC_PTR:BYTE
68
69 EXTRN FLAGTAB:WORD,EXEC_BLOCK:BYTE,COM_LINE:DWORD,COM_FCB1:DWORD
70 EXTRN COM_FCB2:DWORD,COM_SSSP:DWORD,COM_CSIP:DWORD,RETSAVE:WORD
71 EXTRN NEWEXEC:BYTE,HEADSAVE:WORD
72 EXTRN REGTAB:BYTE,TOTREG:BYTE,NOREGL:BYTE
73 EXTRN USER_PROC_PDB:WORD,STACK:BYTE,RSTACK:WORD,AXSAVE:WORD
74 EXTRN BXSAVE:WORD,DSSAVE:WORD,ESSAVE:WORD,CSSAVE:WORD,IPSAVE:WORD
75 EXTRN SSSAVE:WORD,CXSAVE:WORD,SPSAVE:WORD,FLSAVE:WORD
76 EXTRN SREG:BYTE,SEGTAB:WORD,REGDIF:ABS,RDFLG:BYTE
77 EXTRN REGTABEND:WORD
78 EXTRN NAMESPEC:BYTE
79CONST ENDS
80
81CSTACK SEGMENT STACK
82CSTACK ENDS
83
84DATA SEGMENT PUBLIC BYTE
85 EXTRN DEFDUMP:BYTE,TRANSADD:DWORD,INDEX:WORD,BUFFER:BYTE
86 EXTRN ASMADD:BYTE,DISADD:BYTE,NSEG:WORD
87 EXTRN SWITCHAR:BYTE,XNXCMD:BYTE,XNXOPT:BYTE
88 EXTRN AWORD:BYTE,EXTPTR:WORD,HANDLE:WORD,PARSERR:BYTE
89 EXTRN REG_NAME:WORD,REG_CONTENTS:WORD,REGISTER_PTR:BYTE
90 EXTRN ARG_BUF:BYTE,ARG_BUF_PTR:BYTE,LOC_ADD:WORD,LOC_PTR:BYTE
91 EXTRN BIG_CONTENTS:WORD,BIG_PTR:BYTE,LITTLE_CONTENTS:WORD,LITTLE_PTR:BYTE
92 EXTRN SINGLE_REG_ARG:WORD,CHANGE_FLAG_PTR:BYTE,DF_ERROR:BYTE
93 EXTRN BR_ERROR:BYTE,BF_ERROR:BYTE,SINGLE_REG_PTR:WORD
94 EXTRN WRT_ARG1:WORD,WRT_ARG2:WORD,WRTMES_PTR:BYTE,BEGSEG:WORD
95 EXTRN FILESTRT:WORD,FILEEND:WORD
96 EXTRN ERR_TYPE:BYTE ;ac000;converted to buffer
97
98 extrn rel_read_write_tab:dword ;an000;primitive I/O
99 extrn rel_rw_add:dword ;an000;transfer address
100 extrn rel_low_sec:word ;an000;low sector word
101 extrn rel_high_sec:word ;an000;high sector word
102 extrn rel_sec_num:word ;an000;# of sectors
103
104fnd_dbcs db 0
105DATA ENDS
106
107DG GROUP CODE,CONST,CSTACK,DATA
108
109CODE SEGMENT PUBLIC BYTE
110ASSUME CS:DG,DS:DG,ES:DG,SS:DG
111 PUBLIC DEFIO,PREPNAME,DEBUG_FOUND
112 PUBLIC REG,LOAD
113 PUBLIC NAMED,DWRITE
114 PUBLIC DISPREG,ERR,DELIM1,DELIM2,delim0
115 public getchrup,open1,open2,open3,open4,oc_file,opnret ;an001;bgb
116 public delete_a_file, parse_a_file, exec_a_file, open_a_file, create_a_file ;an001;bgb
117 public gcur,ifhex ;an001;bgb
118 public comtail ;an001;bgb
119 extrn test_lead:near ;an001;bgb
120 EXTRN OUTSI:NEAR,OUTDI:NEAR,INBUF:NEAR,SCANB:NEAR,SCANP:NEAR
121 EXTRN COMMAND:NEAR,DISASLN:NEAR,SET_TERMINATE_VECTOR:NEAR
122 EXTRN RESTART:NEAR,TERMINATE:NEAR,DRVERR:NEAR
123 EXTRN GETHEX:NEAR,GETEOL:NEAR,SKIP_FILE:NEAR
124 EXTRN HEXCHK:NEAR,GETHEX1:NEAR,PRINT:NEAR
125 EXTRN CRLF:NEAR,BLANK:NEAR
126 EXTRN HEX:NEAR,DIGIT:NEAR
127 EXTRN FIND_DEBUG:NEAR
128 EXTRN ADDRESS:NEAR,PERROR:NEAR
129 EXTRN STD_PRINTF:NEAR,PRINTF_CRLF:NEAR
130DEBCOM2:
131DISPLAY_LINE:
132 mov ax,word ptr [si] ;an000;move reg name to ax
133 MOV [REG_NAME],ax ;ac000;save it in reg_name
134 ADD SI,3
135 MOV AX,[BX]
136 ADD BX,2
137 MOV [REG_CONTENTS],AX
138 MOV DX,OFFSET DG:REGISTER_PTR
139 CALL STD_PRINTF
140
141 LOOP DISPLAY_LINE
142
143 RETURN
144
145DISPLAY_FLAGS:
146 MOV DI,OFFSET DG:ARG_BUF
147 MOV AL,CHAR_BLANK
148 STOSB
149DISPLAY_FLAGS_2:
150 MOV SI,OFFSET DG:FLAGTAB
151 MOV CX,16
152 MOV DX,[FLSAVE]
153DFLAGS:
154 LODS CS:WORD PTR [SI]
155 SHL DX,1
156 JC FLAGSET
157
158 MOV AX,CS:[SI+30]
159FLAGSET:
160 OR AX,AX
161 JZ NEXT_FLAG
162
163 STOSW
164 MOV AL,CHAR_BLANK
165 STOSB
166NEXT_FLAG:
167 LOOP DFLAGS
168 XOR AL,AL
169 STOSB
170 RETURN
171
172DISPREG:
173 MOV SI,OFFSET DG:REGTAB
174 MOV DI,OFFSET DG:ARG_BUF
175 MOV BX,OFFSET DG:AXSAVE
176 MOV BYTE PTR TOTREG,CR
177 MOV CH,0
178 MOV CL,NOREGL
179SET_DISPLAY:
180REPEAT_DISPLAY:
181 SUB TOTREG,CL
182 CALL DISPLAY_LINE
183
184 CALL CRLF
185
186 XOR CH,CH
187 MOV CL,NOREGL
188 CMP CL,TOTREG
189 JB REPEAT_DISPLAY
190
191 MOV CL,TOTREG
192 CALL DISPLAY_LINE
193
194 CALL DISPLAY_FLAGS
195
196 MOV DX,OFFSET DG:ARG_BUF_PTR
197 CALL PRINTF_CRLF
198
199 MOV AX,[IPSAVE]
200 MOV WORD PTR [DISADD],AX
201 PUSH AX
202 MOV AX,[CSSAVE]
203 MOV WORD PTR [DISADD+WORD],AX
204 PUSH AX
205 MOV [NSEG],-1
206 CALL DISASLN
207
208 POP WORD PTR DISADD+WORD
209 POP WORD PTR DISADD
210 MOV AX,[NSEG]
211 CMP AL,-1
212 JNZ ASSEM_LIN_CONT
213
214 JMP CRLF
215
216ASSEM_LIN_CONT:
217 CMP AH,-1
218 JZ NOOVER
219
220 XCHG AL,AH
221NOOVER:
222 CBW
223 MOV BX,AX
224 SHL BX,1
225 MOV AX,WORD PTR [BX+SREG]
226 MOV DI,OFFSET DG:ARG_BUF
227 STOSB
228 XCHG AL,AH
229 STOSB
230 XOR AL,AL
231 STOSB
232 MOV DX,[INDEX]
233 MOV LOC_ADD,DX
234 MOV DX,OFFSET DG:LOC_PTR
235 CALL STD_PRINTF
236
237 MOV BX,[BX+SEGTAB]
238 PUSH DS
239 MOV DS,[BX]
240 MOV BX,CS:[INDEX]
241 MOV BX,[BX]
242 POP DS
243 MOV BIG_CONTENTS,BX
244 MOV DX,OFFSET DG:BIG_PTR
245 TEST BYTE PTR [AWORD],-1
246 JNZ SHOW_CHARS
247
248 XOR BH,BH
249 MOV LITTLE_CONTENTS,BX
250 MOV DX,OFFSET DG:LITTLE_PTR
251SHOW_CHARS:
252 CALL PRINTF_CRLF
253
254 RETURN
255
256DISPREGJ:
257 JMP DISPREG
258
259; Perform register dump if no parameters or set register if a
260; register designation is a parameter.
261REG:
262 CALL SCANP
263
264 JZ DISPREGJ
265
266 MOV DL,[SI]
267 INC SI
268 MOV DH,[SI]
269 CMP DH,CR
270 JZ FLAG
271
272 INC SI
273 CALL GETEOL
274
275 CMP DH,CHAR_BLANK
276 JZ FLAG
277
278 MOV DI,OFFSET DG:REGTAB
279 XCHG AX,DX
280 PUSH CS
281 POP ES
282 XOR CX,CX
283CHECK_NEXT_REG:
284 CMP AX,WORD PTR[ DI]
285 JZ REG_FOUND
286
287 ADD DI,3
288 INC CX
289 CMP DI,OFFSET DG:REGTABEND
290 JB CHECK_NEXT_REG
291
292 JMP BADREG
293
294REG_FOUND:
295 CMP DI,OFFSET DG:REGTABEND
296 JNZ NOTPC
297
298 DEC DI
299 DEC DI
300 DEC DI
301 MOV AX,CS:[DI-WORD]
302NOTPC:
303 PUSH DI
304 MOV DI,OFFSET DG:ARG_BUF
305 STOSB
306 XCHG AL,AH
307 STOSB
308 XOR AL,AL
309 STOSB
310 POP DI
311 PUSH DS
312 POP ES
313 LEA BX,[DI+REGDIF]
314 SUB BX,CX
315 MOV DX,[BX]
316 MOV SINGLE_REG_ARG,DX
317 MOV DX,OFFSET DG:SINGLE_REG_PTR
318 CALL STD_PRINTF
319
320 CALL INBUF
321
322 CALL SCANB
323
324 RETZ
325
326 push bx ;an000;save bx - we stomp it
327 MOV CX,4
328 CALL GETHEX1
329 pop bx ;an000;restore it
330
331 CALL GETEOL
332
333 MOV [BX],DX
334 RETURN
335BADREG:
336 MOV DX,OFFSET DG:BR_ERROR ; BR ERROR
337 JMP ERR
338
339FLAG:
340 CMP DL,UPPER_F
341 JNZ BADREG
342
343 MOV DI,OFFSET DG:ARG_BUF
344 CALL DISPLAY_FLAGS_2
345
346 MOV DX,OFFSET DG:CHANGE_FLAG_PTR
347 CALL STD_PRINTF
348
349 CALL INBUF
350
351 CALL SCANB
352
353 XOR BX,BX
354 MOV DX,[FLSAVE]
355GETFLG:
356 LODSW
357 CMP AL,CR
358 JZ SAVCHG
359
360 CMP AH,CR
361 JZ FLGERR
362
363 MOV DI,OFFSET DG:FLAGTAB
364 MOV CX,32
365 PUSH CS
366 POP ES
367 REPNE SCASW
368 JNZ FLGERR
369
370 MOV CH,CL
371 AND CL,0FH
372 MOV AX,1
373 ROL AX,CL
374 TEST AX,BX
375 JNZ REPFLG
376
377 OR BX,AX
378 OR DX,AX
379 TEST CH,16
380 JNZ NEXFLG
381
382 XOR DX,AX
383NEXFLG:
384 CALL SCANP
385
386 JMP SHORT GETFLG
387
388REPFLG:
389 MOV DX,OFFSET DG:DF_ERROR ; DF ERROR
390FERR:
391 CALL SAVCHG
392ERR:
393 push si ;an000;save affected registers
394 push di ;an000;
395 push cx ;an000;
396 mov cx,03h ;an000;move only three bytes
397 mov di,offset dg:err_type ;an000;point to buffer
398 mov si,dx ;an000;dx holds the string
399 rep movsb ;an000;fill up the buffer
400 pop cx ;an000;restore registers
401 pop di ;an000;
402 pop si ;an000;
403 MOV DX,OFFSET DG:ERRMES_PTR
404 JMP PRINT
405
406SAVCHG:
407 MOV [FLSAVE],DX
408 RETURN
409
410FLGERR:
411 MOV DX,OFFSET DG:BF_ERROR ; BF ERROR
412 JMP SHORT FERR
413
414PREPNAME:
415 MOV ES,DSSAVE
416 PUSH SI
417 MOV DI,81H
418COMTAIL:
419 LODSB
420 STOSB
421 CMP AL,CR
422 JNZ COMTAIL
423
424 SUB DI,82H
425 XCHG AX,DI
426 MOV ES:(BYTE PTR [80H]),AL
427 POP SI
428 MOV DI,FCB ;05cH
429 MOV AX,(PARSE_FILE_DESCRIPTOR SHL 8) OR SET_DRIVEID_OPTION ;AL=01H
430 INT 21H
431
432 MOV BYTE PTR [AXSAVE],AL ; Indicate analysis of first parm
433 CALL SKIP_FILE
434
435 MOV DI,6CH
436 MOV AX,(PARSE_FILE_DESCRIPTOR SHL 8) OR SET_DRIVEID_OPTION ;AL=01H
437 INT 21H
438
439 MOV BYTE PTR [AXSAVE+1],AL ; Indicate analysis of second parm
440 RETURN
441
442; OPENS A XENIX PATHNAME SPECIFIED IN THE UNFORMATTED PARAMETERS
443; VARIABLE [XNXCMD] SPECIFIES WHICH COMMAND TO OPEN IT WITH
444
445; VARIABLE [HANDLE] CONTAINS THE HANDLE
446; VARIABLE [EXTPTR] POINTS TO THE FILES EXTENSION
447DELETE_A_FILE:
448 MOV BYTE PTR [XNXCMD],UNLINK
449 JMP SHORT OC_FILE
450
451PARSE_A_FILE:
452 MOV BYTE PTR [XNXCMD],0
453 JMP SHORT OC_FILE
454
455EXEC_A_FILE:
456 MOV BYTE PTR CS:[XNXCMD],EXEC
457 MOV BYTE PTR CS:[XNXOPT],1
458 JMP SHORT OC_FILE
459
460OPEN_A_FILE:
461 MOV BYTE PTR [XNXCMD],OPEN
462 MOV BYTE PTR [XNXOPT],2 ; Try read write
463 CALL OC_FILE
464
465 RETNC
466 MOV BYTE PTR [XNXCMD],OPEN
467 MOV BYTE PTR [XNXOPT],0 ; Try read only
468 JMP SHORT OC_FILE
469
470CREATE_A_FILE:
471 MOV BYTE PTR [XNXCMD],CREAT
472OC_FILE:
473 PUSH DS
474 PUSH ES
475 PUSH AX
476 PUSH BX
477 PUSH CX
478 PUSH DX
479 PUSH SI
480 XOR AX,AX
481 MOV CS:[EXTPTR],AX ; INITIALIZE POINTER TO EXTENSIONS
482 MOV AH,CHAR_OPER
483 INT 21H
484
485 MOV CS:[SWITCHAR],DL ; GET THE CURRENT SWITCH CHARACTER
486 MOV SI,81H
487
488open1: CALL GETCHRUP ;convert 1 byte to uppercase
489 CALL DELIM2 ; END OF LINE?
490 JZ OPEN4
491
492 CALL DELIM1 ; SKIP LEADING DELIMITERS
493 JZ OPEN1
494
495 MOV DX,SI ; SAVE POINTER TO BEGINNING
496 cmp fnd_dbcs,1
497; $if z
498 JNZ $$IF1
499 dec dx ;dec it twice if dbcs
500; $endif
501$$IF1:
502 DEC DX
503open2: CMP AL,CHAR_PERIOD ; LAST CHAR A "."?
504 JNZ OPEN3
505
506 MOV CS:[EXTPTR],SI ; SAVE POINTER TO THE EXTENSION
507OPEN3:
508 CALL GETCHRUP
509
510 CALL DELIM1 ; LOOK FOR END OF PATHNAME
511
512 JZ OPEN4
513
514 CALL DELIM2
515
516 JNZ OPEN2
517
518OPEN4: DEC SI ; POINT BACK TO LAST CHAR
519 PUSH [SI] ; SAVE TERMINATION CHAR
520 MOV BYTE PTR [SI],0 ; NULL TERMINATE THE STRING
521 MOV AL,CS:[XNXOPT]
522 MOV AH,CS:[XNXCMD] ; OPEN OR CREATE FILE
523 OR AH,AH
524 JZ OPNRET
525
526 MOV CS:[FILESTRT],DX ; Set values for later call on this file
527 MOV CS:[FILEEND],SI
528 PUSH CS
529 POP ES ; Set ES seg for EXEC_BLOCK
530 MOV BX,OFFSET DG:EXEC_BLOCK
531 XOR CX,CX
532 INT 21H
533
534 MOV CS:[HANDLE],AX ; SAVE ERROR CODE OR HANDLE
535OPNRET:
536 POP [SI]
537 POP SI
538 POP DX
539 POP CX
540 POP BX
541 POP AX ; blow away error code...
542 POP ES
543 POP DS
544 RETURN
545
546GETCHRUP: ;an001;bgb
547 lodsb ;get the character from [si] ;an001;bgb
548 call test_lead ;is it a dbcs lead byte? ;an001;bgb
549; $IF C ;yes ;an001;bgb
550 JNC $$IF3
551 inc si ;bump ptr to past 2nd dbcs byte ;an001;bgb
552 mov fnd_dbcs,1 ;found a dbcs char
553 jmp gcur ;dont capitalize it ;an001;bgb
554; $ENDIF ;an001;bgb
555$$IF3:
556 ; ;an001;bgb
557 mov fnd_dbcs,0 ;did not find a dbcs char
558 cmp al,lower_a ;is it >= "a" ? ;an001;bgb
559 jb gcur ;no - exit ;an001;bgb
560 ;an001;bgb
561 cmp al,lower_z ;is it =< "z" ? ;an001;bgb
562 ja gcur ;no - exit ;an001;bgb
563 ;an001;bgb
564;if we get here, the char is lowercase, so change it ;an001;bgb
565 sub al,32 ;convert to uppercase ;an001;bgb
566 mov [si-1],al ;move it back (si points 1 past) ;an001;bgb
567gcur: return ;an001;bgb
568
569DELIM0:
570 CMP AL,CHAR_LEFT_BRACKET
571 RETZ
572DELIM1:
573 CMP AL,CHAR_BLANK ; SKIP THESE GUYS
574 RETZ
575
576 CMP AL,CHAR_SEMICOLON
577 RETZ
578
579 CMP AL,CHAR_EQUAL
580 RETZ
581
582 CMP AL,CHAR_TAB
583 RETZ
584
585 CMP AL,CHAR_COMMA
586 RETURN
587
588DELIM2:
589 CMP AL,CS:[SWITCHAR] ; STOP ON THESE GUYS
590 RETZ
591
592 CMP AL,CR
593 RETURN
594
595NAMED:
596 OR [NAMESPEC],1 ; Flag a name command executed
597 CALL PREPNAME
598
599 MOV AL,BYTE PTR AXSAVE
600 MOV PARSERR,AL
601 PUSH ES
602 POP DS
603 PUSH CS
604 POP ES
605 MOV SI,FCB ; DS:SI points to user FCB
606 MOV DI,SI ; ES:DI points to DEBUG FCB
607 MOV CX,82
608 REP MOVSW
609 RETURN
610
611BADNAM:
612 MOV DX,OFFSET DG:NAMBAD_PTR
613 JMP RESTART
614
615IFHEX:
616 CMP BYTE PTR [PARSERR],-1 ; Invalid drive specification?
617 JZ BADNAM
618
619 CALL PARSE_A_FILE
620
621 MOV BX,[EXTPTR]
622 CMP WORD PTR DS:[BX],"EH" ; "HE"
623 RETNZ
624
625 CMP BYTE PTR DS:[BX+WORD],UPPER_X
626 RETURN
627
628IFEXE:
629 PUSH BX
630 MOV BX,[EXTPTR]
631 CMP WORD PTR DS:[BX],"XE" ; "EX"
632 JNZ RETIF
633
634 CMP BYTE PTR DS:[BX+WORD],UPPER_E
635RETIF:
636 POP BX
637 RETURN
638
639LOAD:
640 MOV BYTE PTR [RDFLG],READ
641 JMP SHORT DSKIO
642
643DWRITE:
644 MOV BYTE PTR [RDFLG],WRITE
645DSKIO:
646 MOV BP,[CSSAVE]
647 CALL SCANB
648
649 JNZ PRIMIO
650
651 JMP DEFIO
652
653PRIMIO:
654 CALL ADDRESS
655
656 CALL SCANB
657
658 JNZ PRMIO
659
660 JMP FILEIO
661
662;=========================================================================
663; PRMIO: This routine builds the necessary table for the new
664; generic IOCtl primitive read/write logical sector function.
665;
666; Inputs : Binary addresses and values converted by GETHEX
667;
668; Outputs: REL_READ_WRITE_TAB - Table needed by IOCtl function to
669; perform 32 bit sector addressing.
670;
671; Date : 6/17/87
672;=========================================================================
673
674PRMIO:
675 mov word ptr dg:[rel_rw_add],dx ;ac000;save transfer address
676 ; in table
677 mov word ptr dg:[rel_rw_add+2],ax ;ac000;save segment of transfer
678 ; address
679 MOV CX,2
680 CALL GETHEX ; Drive number must be 2 digits or less
681
682 PUSH DX ;save drive number
683 MOV CX,8 ;ac000;allow 32 bit addressibilty
684 CALL GETHEX ; Logical record number
685 mov word ptr dg:[rel_low_sec],dx ;ac000;save low word of logical
686 ; sector address
687 mov word ptr dg:[rel_high_sec],bx ;ac000;save high word of
688 ; logical sector address
689
690 MOV CX,3
691 CALL GETHEX ; Number of records
692 mov word ptr dg:[rel_sec_num],dx ;ac000;save number of sectors
693 ; to read/write
694
695 CALL GETEOL
696
697 POP BX ;ac000;drive number
698 CBW ; Turn off verify after write
699 MOV BYTE PTR DRVLET,bl ;ac000;save drive in case of error
700 PUSH BX
701 MOV DL,bL ;ac000;move drive to dl
702; Clean off the buffer cache for physical I/O
703 push ds
704 MOV AH,DISK_RESET
705 INT 21H
706
707 INC DL
708 MOV AH,GET_DPB
709 INT 21H
710 pop ds
711
712 or al,al ;ac000;see if an error occurred
713 pop ax ;ac000;restore drive
714
715 JNZ DRVERRJ
716
717 CMP CS:BYTE PTR [RDFLG],WRITE
718; $if z ;an000;we will write to sector(s)
719 JNZ $$IF5
720 call ABSWRT ;an000;logical sector write
721; $else ;an000;
722 JMP SHORT $$EN5
723$$IF5:
724 call ABSREAD ;an000;we will read sector(s)
725; $endif ;an000;
726$$EN5:
727
728
729ENDABS:
730 JNC RET0
731
732DRVERRJ:
733 JMP DRVERR
734
735RET0:
736; Clean cache again...
737 MOV AH,DISK_RESET
738 INT 21H
739
740 RETURN
741
742
743;called from debug.sal
744DEFIO:
745 MOV AX,[CSSAVE] ; Default segment
746 MOV DX,100H ; Default file I/O offset
747 CALL IFHEX
748 JNZ EXECHK
749 XOR DX,DX ; If HEX file, default OFFSET is zero
750HEX2BINJ:
751 JMP HEX2BIN
752
753FILEIO:
754; AX and DX have segment and offset of transfer, respectively
755 CALL IFHEX
756 JZ HEX2BINJ
757
758EXECHK:
759 CALL IFEXE
760 JNZ BINFIL
761 CMP BYTE PTR [RDFLG],READ
762 JZ EXELJ
763 MOV DX,OFFSET DG:EXEWRT_PTR
764 JMP RESTART ; Can't write .EXE files
765
766BINFIL:
767 CMP BYTE PTR [RDFLG],WRITE
768 JZ BINLOAD
769 CMP WORD PTR DS:[BX],4F00H + UPPER_C ;"CO"
770 JNZ BINLOAD
771 CMP BYTE PTR DS:[BX+WORD],UPPER_M
772 JNZ BINLOAD
773
774EXELJ:
775 DEC SI
776 CMP DX,100H
777 JNZ PRER
778
779 CMP AX,[CSSAVE]
780 JZ OAF
781
782PRER:
783 JMP PERROR
784
785OAF:
786 CALL OPEN_A_FILE
787
788 JNC GDOPEN
789
790 MOV AX,ERROR_FILE_NOT_FOUND
791 JMP EXECERR
792
793GDOPEN:
794 XOR DX,DX
795 XOR CX,CX
796 MOV BX,[HANDLE]
797 MOV AL,2
798 MOV AH,LSEEK
799 INT 21H
800
801 CALL IFEXE ; SUBTRACT 512 BYTES FOR EXE
802
803 JNZ BIN2 ; FILE LENGTH BECAUSE OF
804
805 SUB AX,512 ; THE HEADER
806BIN2:
807 MOV [BXSAVE],DX ; SET UP FILE SIZE IN DX:AX
808 MOV [CXSAVE],AX
809 MOV AH,CLOSE
810 INT 21H
811
812 JMP EXELOAD
813
814NO_MEM_ERR:
815 MOV DX,OFFSET DG:TOOBIG_PTR
816 CALL PRINTF_CRLF
817
818 JMP COMMAND
819
820WRTFILEJ:
821 JMP WRTFILE
822NOFILEJ:
823 JMP NOFILE
824
825BINLOAD:
826 PUSH AX
827 PUSH DX
828 CMP BYTE PTR [RDFLG],WRITE
829 JZ WRTFILEJ
830
831 CALL OPEN_A_FILE
832
833 JC NOFILEJ
834
835 MOV BX,[HANDLE]
836 MOV AX,(LSEEK SHL 8) OR LSEEK_EOF_OPTION
837 XOR DX,DX ;CX:DX=DISTANCE (OFFSET) TO MOVE IN BYTES
838 MOV CX,DX
839 INT 21H ; GET SIZE OF FILE
840
841 MOV SI,DX
842 MOV DI,AX ; SIZE TO SI:DI
843 MOV AX,(LSEEK SHL 8) OR LSEEK_FROM_START
844 XOR DX,DX
845 MOV CX,DX
846 INT 21H ; RESET POINTER BACK TO BEGINNING
847
848 POP AX
849 POP BX
850 PUSH BX
851 PUSH AX ; TRANS ADDR TO BX:AX
852 ADD AX,15
853 RCR AX,1
854 MOV CL,3
855 MOV CL,4
856 SHR AX,CL
857 ADD BX,AX ; Start of transfer rounded up to seg
858 MOV DX,SI
859 MOV AX,DI ; DX:AX is size
860 cmp dx,10h
861 jnc no_mem_err
862 MOV CX,16
863 DIV CX
864 OR DX,DX
865 JZ NOREM
866
867 INC AX
868NOREM: ; AX is number of paras in transfer
869 ADD AX,BX ; AX is first seg that need not exist
870 jc no_mem_err
871 CMP AX,CS:[PDB_BLOCK_LEN]
872 JA NO_MEM_ERR
873
874 MOV CXSAVE,DI
875 MOV BXSAVE,SI
876 POP DX
877 POP AX
878; AX:DX is disk transfer address (segment:offset)
879; SI:DI is length (32-bit number)
880RDWR:
881RDWRLOOP:
882 MOV BX,DX ; Make a copy of the offset
883 AND DX,000FH ; Establish the offset in 0H-FH range
884 MOV CL,4
885 SHR BX,CL ; Shift offset and
886 ADD AX,BX ; Add to segment register to get new Seg:offset
887 PUSH AX
888 PUSH DX ; Save AX,DX register pair
889 MOV WORD PTR [TRANSADD],DX
890 MOV WORD PTR [TRANSADD+WORD],AX
891 MOV CX,0FFF0H ; Keep request in segment
892 OR SI,SI ; Need > 64K?
893 JNZ BIGRDWR
894
895 MOV CX,DI ; Limit to amount requested
896BIGRDWR:
897 PUSH DS
898 PUSH BX
899 MOV BX,[HANDLE]
900 MOV AH,[RDFLG]
901 LDS DX,[TRANSADD]
902 INT 21H ; Perform read or write
903
904 POP BX
905 POP DS
906 JC BADWR
907
908 CMP BYTE PTR [RDFLG],WRITE
909 JNZ GOODR
910
911 CMP CX,AX
912 JZ GOODR
913
914BADWR:
915 MOV CX,AX
916 STC
917 POP DX ; READ OR WRITE BOMBED OUT
918 POP AX
919 RETURN
920
921GOODR:
922 MOV CX,AX
923 SUB DI,CX ; Request minus amount transferred
924 SBB SI,0 ; Ripple carry
925 OR CX,CX ; End-of-file?
926 POP DX ; Restore DMA address
927 POP AX
928 JZ DOCLOSE
929
930 ADD DX,CX ; Bump DMA address by transfer length
931 MOV BX,SI
932 OR BX,DI ; Finished with request
933 JNZ RDWRLOOP
934
935DOCLOSE:
936 SAVEREG <AX,BX>
937 MOV BX,HANDLE
938 MOV AH,CLOSE
939 INT 21H
940
941 RESTOREREG <BX,AX>
942 RETURN
943
944NOFILE:
945 MOV DX,OFFSET DG:NOTFND_PTR
946 JMP RESTART
947
948NO_NAME_GIVEN:
949 MOV DX,OFFSET DG:NONAMESPEC_PTR
950RESTARTJMP:
951 JMP RESTART
952
953WRTFILE:
954 CMP [NAMESPEC],0
955 JZ NO_NAME_GIVEN ; Hey User, you forgot to specify a name
956
957 CALL CREATE_A_FILE ; Create file we want to write to
958
959 JC CHECKREADONLY ; ARR 2.4
960
961 MOV SI,BXSAVE ; Get high order number of bytes to transfer
962 CMP SI,000FH
963 JLE WRTSIZE ; Is bx less than or equal to FH
964
965 XOR SI,SI ; Ignore BX if greater than FH - set to zero
966WRTSIZE:
967 MOV WRT_ARG2,SI
968 MOV DI,CXSAVE
969 MOV WRT_ARG1,DI
970 MOV DX,OFFSET DG:WRTMES_PTR
971 CALL PRINTF_CRLF
972
973 POP DX
974 POP AX
975 CALL RDWR
976
977 JNC CLSFLE
978
979 CALL CLSFLE
980
981 CALL DELETE_A_FILE
982
983 MOV DX,OFFSET DG:NOSPACE_PTR
984 JMP RESTARTJMP
985
986 CALL CLSFLE ;is this dead code? - edk
987
988 JMP COMMAND
989
990CHECKREADONLY: ; ARR 2.4
991 MOV DX,[FILESTRT]
992 MOV SI,[FILEEND]
993 PUSH [SI]
994 MOV BYTE PTR [SI],0
995 MOV AX,CHMOD SHL 8 ;AL=0,REQUEST FILE'S CURRENT
996 ; ATTRIBUTE BE RETURNED IN CX
997 INT 21H
998
999 POP [SI]
1000 MOV DX,OFFSET DG:NOROOM_PTR ; Creation error - report error
1001 JC RESTARTJMP
1002
1003 TEST CX,ATTR_READ_ONLY+ATTR_HIDDEN+ATTR_SYSTEM
1004 JZ RESTARTJMP
1005
1006 MOV DX,OFFSET DG:ACCMES_PTR ; Write on read only file
1007 JMP RESTARTJMP
1008
1009CLSFLE:
1010 MOV AH,CLOSE
1011 MOV BX,[HANDLE]
1012 INT 21H
1013
1014 RETURN
1015
1016EXELOAD:
1017 POP [RETSAVE] ; Suck up return addr
1018 INC BYTE PTR [NEWEXEC]
1019 MOV BX,[USER_PROC_PDB]
1020 MOV AX,BEGSEG
1021 MOV DS,AX
1022 ASSUME DS:NOTHING
1023
1024 CMP AX,BX
1025 JZ DEBUG_CURRENT
1026
1027 JMP FIND_DEBUG
1028
1029DEBUG_CURRENT:
1030 MOV AX,CS:[DSSAVE]
1031DEBUG_FOUND:
1032 MOV CS:BYTE PTR [NEWEXEC],0
1033 MOV CS:[HEADSAVE],AX
1034 PUSH CS:[RETSAVE] ; Get the return address back
1035 PUSH AX
1036 MOV BX,CS
1037 SUB AX,BX
1038 PUSH ES
1039 MOV ES,CS:BEGSEG
1040 ASSUME ES:NOTHING
1041
1042 MOV BX,AX ; size of debug in para.
1043 ADD BX,10H
1044 MOV AX,CS ; and the size of printf in para.
1045 SUB AX,CS:BEGSEG
1046 ADD BX,AX
1047 MOV AH,SETBLOCK
1048 INT 21H
1049
1050 POP ES
1051 POP AX
1052 MOV CS:WORD PTR [COM_LINE+WORD],AX
1053 MOV CS:WORD PTR [COM_FCB1+WORD],AX
1054 MOV CS:WORD PTR [COM_FCB2+WORD],AX
1055 PUSH DS
1056 PUSH CS
1057 POP DS
1058 CALL EXEC_A_FILE
1059
1060 POP DS
1061 MOV AX,CS:[HANDLE]
1062 JC EXECERR
1063
1064 CALL SET_TERMINATE_VECTOR ; Reset int 22
1065
1066 MOV AH,GET_CURRENT_PDB
1067 INT 21H
1068
1069 MOV CS:[USER_PROC_PDB],BX
1070 MOV CS:[DSSAVE],BX
1071 MOV CS:[ESSAVE],BX
1072 MOV ES,BX
1073 MOV WORD PTR ES:[PDB_EXIT],OFFSET DG:TERMINATE
1074 MOV WORD PTR ES:[PDB_EXIT+WORD],CS
1075 LES DI,CS:[COM_CSIP]
1076 MOV CS:[CSSAVE],ES
1077 MOV CS:[IPSAVE],DI
1078 MOV CS:WORD PTR [DISADD+WORD],ES
1079 MOV CS:WORD PTR [DISADD],DI
1080 MOV CS:WORD PTR [ASMADD+WORD],ES
1081 MOV CS:WORD PTR [ASMADD],DI
1082 MOV CS:WORD PTR [DEFDUMP+WORD],ES
1083 MOV CS:WORD PTR [DEFDUMP],DI
1084 MOV BX,DS
1085 MOV AH,SET_CURRENT_PDB
1086 INT 21H
1087
1088 LES DI,CS:[COM_SSSP]
1089 MOV AX,ES:[DI]
1090 INC DI
1091 INC DI
1092 MOV CS:[AXSAVE],AX
1093 MOV CS:[SSSAVE],ES
1094 MOV CS:[SPSAVE],DI
1095 RETURN
1096
1097EXECERR:
1098 PUSH CS
1099 POP DS
1100 MOV DX,OFFSET DG:NOTFND_PTR
1101 CMP AX,ERROR_FILE_NOT_FOUND
1102 JZ GOTEXECEMES
1103
1104 MOV DX,OFFSET DG:ACCMES_PTR
1105 CMP AX,ERROR_ACCESS_DENIED
1106 JZ GOTEXECEMES
1107
1108 MOV DX,OFFSET DG:TOOBIG_PTR
1109 CMP AX,ERROR_NOT_ENOUGH_MEMORY
1110 JZ GOTEXECEMES
1111
1112 MOV DX,OFFSET DG:EXEBAD_PTR
1113 CMP AX,ERROR_BAD_FORMAT
1114 JZ GOTEXECEMES
1115
1116 MOV DX,OFFSET DG:EXECEMES_PTR
1117GOTEXECEMES:
1118 CALL PRINTF_CRLF
1119
1120 JMP COMMAND
1121
1122HEX2BIN:
1123 MOV [INDEX],DX
1124 MOV DX,OFFSET DG:HEXWRT_PTR
1125 CMP BYTE PTR [RDFLG],WRITE
1126 JNZ RDHEX
1127
1128 JMP RESTARTJ2
1129
1130RDHEX:
1131 MOV ES,AX
1132 CALL OPEN_A_FILE
1133
1134 MOV DX,OFFSET DG:NOTFND_PTR
1135 JNC HEXFND
1136
1137 JMP RESTART
1138
1139HEXFND:
1140 XOR BP,BP
1141 MOV SI,OFFSET DG:(BUFFER+BUFSIZ) ; Flag input buffer as empty
1142READHEX:
1143 CALL GETCH
1144
1145 CMP AL,CHAR_COLON ; Search for : to start line
1146 JNZ READHEX
1147
1148 CALL GETBYT ; Get byte count
1149
1150 MOV CL,AL
1151 MOV CH,0
1152 JCXZ HEXDONE
1153
1154 CALL GETBYT ; Get high byte of load address
1155
1156 MOV BH,AL
1157 CALL GETBYT ; Get low byte of load address
1158
1159 MOV BL,AL
1160 ADD BX,[INDEX] ; Add in offset
1161 MOV DI,BX
1162 CALL GETBYT ; Throw away type byte
1163
1164READLN:
1165 CALL GETBYT ; Get data byte
1166
1167 STOSB
1168 CMP DI,BP ; Check if this is the largest address so far
1169 JBE HAVBIG
1170
1171 MOV BP,DI ; Save new largest
1172HAVBIG:
1173 LOOP READLN
1174
1175 JMP SHORT READHEX
1176
1177GETCH:
1178 CMP SI,OFFSET DG:(BUFFER+BUFSIZ)
1179 JNZ NOREAD
1180
1181 MOV DX,OFFSET DG:BUFFER
1182 MOV SI,DX
1183 MOV AH,READ
1184 PUSH BX
1185 PUSH CX
1186 MOV CX,BUFSIZ
1187 MOV BX,cs:[HANDLE]
1188 INT 21H
1189
1190 POP CX
1191 POP BX
1192 OR AX,AX
1193 JZ HEXDONE
1194
1195NOREAD:
1196 LODSB
1197 CMP AL,CHAR_EOF
1198 JZ HEXDONE
1199
1200 OR AL,AL
1201 RETNZ
1202
1203HEXDONE:
1204 MOV [CXSAVE],BP
1205 MOV BXSAVE,0
1206 RETURN
1207
1208HEXDIG:
1209 CALL GETCH
1210
1211 CALL HEXCHK
1212
1213 RETNC
1214
1215 MOV DX,OFFSET DG:HEXERR_PTR
1216RESTARTJ2:
1217 JMP RESTART
1218
1219GETBYT:
1220 CALL HEXDIG
1221
1222 MOV BL,AL
1223 CALL HEXDIG
1224
1225 SHL BL,1
1226 SHL BL,1
1227 SHL BL,1
1228 SHL BL,1
1229 OR AL,BL
1230 RETURN
1231
1232;=========================================================================
1233; ABSREAD: This routine performs a primitive logical sector read of
1234; the specified drive. This routine replaces the old
1235; INT 25h function which only allowed 16 bit addressibility.
1236; The new generic IOCtl logical sector read will permit
1237; 32 bit addressibility on a disk device.
1238;
1239; Inputs : REL_READ_WRITE_TAB - Table provides dword sector
1240; addressibility.
1241;
1242; Outputs: Data located at specified transfer address.
1243;
1244; Error : Carry is set on error.
1245;
1246; Date : 6/17/87
1247;=========================================================================
1248
1249ABSREAD proc near ;an000;read logical sector(s)
1250
1251 push ds ;an000;save affected regs
1252 push cx ;an000;save affected regs
1253 push bx ;an000;
1254
1255 mov cx,-1 ;an000;extended format
1256 mov bx,offset dg:rel_read_write_tab ;an000;point to read/write table
1257 int 25h ;an000;invoke relative sector read
1258 pop bx ;an000;discard stack word
1259
1260 pop bx ;an000;restore regs
1261 pop cx ;an000;
1262 pop ds ;an000;
1263
1264 ret ;an000;return to caller
1265
1266ABSREAD endp ;an000;end proc
1267
1268
1269;=========================================================================
1270; ABSWRT: This routine performs a primitive logical sector write of
1271; the specified drive. This routine replaces the old
1272; INT 26h function which only allowed 16 bit addressibility.
1273; The new generic IOCtl logical sector write will permit
1274; 32 bit addressibility on a disk device.
1275;
1276; Inputs : REL_READ_WRITE_TAB - Table provides dword sector
1277; addressibility.
1278;
1279; Outputs: Data moved from transfer address to applicable sector(s).
1280;
1281; Error : Carry is set on error.
1282;
1283; Date : 6/17/87
1284;=========================================================================
1285
1286ABSWRT proc near ;an000;write logical sector(s)
1287
1288 push ds ;an000;save affected regs
1289 push cx ;an000;
1290 push bx ;an000;
1291
1292 mov cx,-1 ;an000;extended format
1293 mov bx,offset dg:rel_read_write_tab ;an000;point to read/write table
1294 int 26h ;an000;invoke relative sector write
1295 pop bx ;an000;discard stack word
1296
1297 pop bx ;an000;restore regs
1298 pop cx ;an000;
1299 pop ds ;an000;
1300
1301 ret ;an000;return to caller
1302
1303ABSWRT endp ;an000;end proc
1304
1305
1306CODE ENDS
1307 END DEBCOM2
1308 \ No newline at end of file