2 TITLE DEBCOM2
.ASM
- PART2 DEBUGGER COMMANDS PC DOS
3 ;======================= START OF SPECIFICATIONS =========================
5 ; MODULE NAME: DECOM2.SAL
7 ; DESCRIPTIVE NAME: DEBUGGING TOOL
9 ; FUNCTION: PROVIDES USERS WITH A TOOL FOR DEBUGGING PROGRAMS.
11 ; ENTRY POINT: ANY CALLED ROUTINE
19 ; INTERNAL REFERENCES:
21 ; EXTERNAL REFERENCES:
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
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
35 ; AN000 VERSION 4.00 - REVISIONS MADE RELATE TO THE FOLLOWING:
36 ; AC000 VERSION 4.00 -
38 ; - IMPLEMENT DBCS HANDLING DMS:6/17/87
39 ; - IMPLEMENT MESSAGE RETRIEVER DMS:6/17/87
40 ; - IMPLEMENT > 32MB SUPPORT DMS:6/17/87
42 ; COPYRIGHT: "MS DOS DEBUG UTILITY"
43 ; "VERSION 4.00 (C) COPYRIGHT 1988 Microsoft"
44 ; "LICENSED MATERIAL - PROPERTY OF Microsoft "
46 ;======================= END OF SPECIFICATIONS ===========================
48 ; Routines to perform debugger commands except ASSEMble and UASSEMble
51 %
OUT COMPONENT
=DEBUG
, MODULE
=DEBCOM2
59 CODE SEGMENT PUBLIC BYTE
62 CONST
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
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
84 DATA 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
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
107 DG GROUP
CODE,CONST
,CSTACK
,DATA
109 CODE SEGMENT PUBLIC BYTE
110 ASSUME
CS:DG
,DS:DG
,ES:DG
,SS:DG
111 PUBLIC DEFIO
,PREPNAME
,DEBUG_FOUND
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
132 mov ax,word ptr [si] ;an000;move reg name to ax
133 MOV [REG_NAME
],ax ;ac000;save it in reg_name
137 MOV [REG_CONTENTS
],AX
138 MOV DX,OFFSET DG
:REGISTER_PTR
146 MOV DI,OFFSET DG
:ARG_BUF
150 MOV SI,OFFSET DG
:FLAGTAB
154 LODS CS:WORD PTR [SI]
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
196 MOV DX,OFFSET DG
:ARG_BUF_PTR
200 MOV WORD PTR [DISADD
],AX
203 MOV WORD PTR [DISADD
+WORD],AX
208 POP WORD PTR DISADD
+WORD
225 MOV AX,WORD PTR [BX+SREG
]
226 MOV DI,OFFSET DG
:ARG_BUF
234 MOV DX,OFFSET DG
:LOC_PTR
244 MOV DX,OFFSET DG
:BIG_PTR
245 TEST BYTE PTR [AWORD
],-1
249 MOV LITTLE_CONTENTS
,BX
250 MOV DX,OFFSET DG
:LITTLE_PTR
259 ; Perform register dump if no parameters or set register if a
260 ; register designation is a parameter.
278 MOV DI,OFFSET DG
:REGTAB
289 CMP DI,OFFSET DG
:REGTABEND
295 CMP DI,OFFSET DG
:REGTABEND
304 MOV DI,OFFSET DG
:ARG_BUF
316 MOV SINGLE_REG_ARG
,DX
317 MOV DX,OFFSET DG
:SINGLE_REG_PTR
326 push bx ;an000;save bx - we stomp it
329 pop bx ;an000;restore it
336 MOV DX,OFFSET DG
:BR_ERROR
; BR ERROR
343 MOV DI,OFFSET DG
:ARG_BUF
346 MOV DX,OFFSET DG
:CHANGE_FLAG_PTR
363 MOV DI,OFFSET DG
:FLAGTAB
389 MOV DX,OFFSET DG
:DF_ERROR
; DF ERROR
393 push si ;an000;save affected registers
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
403 MOV DX,OFFSET DG
:ERRMES_PTR
411 MOV DX,OFFSET DG
:BF_ERROR
; BF ERROR
426 MOV ES:(BYTE PTR [80H
]),AL
429 MOV AX,(PARSE_FILE_DESCRIPTOR
SHL 8) OR SET_DRIVEID_OPTION
;AL=01H
432 MOV BYTE PTR [AXSAVE
],AL ; Indicate analysis of first parm
436 MOV AX,(PARSE_FILE_DESCRIPTOR
SHL 8) OR SET_DRIVEID_OPTION
;AL=01H
439 MOV BYTE PTR [AXSAVE
+1],AL ; Indicate analysis of second parm
442 ; OPENS A XENIX PATHNAME SPECIFIED IN THE UNFORMATTED PARAMETERS
443 ; VARIABLE [XNXCMD] SPECIFIES WHICH COMMAND TO OPEN IT WITH
445 ; VARIABLE [HANDLE] CONTAINS THE HANDLE
446 ; VARIABLE [EXTPTR] POINTS TO THE FILES EXTENSION
448 MOV BYTE PTR [XNXCMD
],UNLINK
452 MOV BYTE PTR [XNXCMD
],0
456 MOV BYTE PTR CS:[XNXCMD
],EXEC
457 MOV BYTE PTR CS:[XNXOPT
],1
461 MOV BYTE PTR [XNXCMD
],OPEN
462 MOV BYTE PTR [XNXOPT
],2 ; Try read write
466 MOV BYTE PTR [XNXCMD
],OPEN
467 MOV BYTE PTR [XNXOPT
],0 ; Try read only
471 MOV BYTE PTR [XNXCMD
],CREAT
481 MOV CS:[EXTPTR
],AX ; INITIALIZE POINTER TO EXTENSIONS
485 MOV CS:[SWITCHAR
],DL ; GET THE CURRENT SWITCH CHARACTER
488 open1: CALL GETCHRUP
;convert 1 byte to uppercase
489 CALL DELIM2
; END OF LINE?
492 CALL DELIM1
; SKIP LEADING DELIMITERS
495 MOV DX,SI ; SAVE POINTER TO BEGINNING
499 dec dx ;dec it twice if dbcs
503 open2: CMP AL,CHAR_PERIOD
; LAST CHAR A "."?
506 MOV CS:[EXTPTR
],SI ; SAVE POINTER TO THE EXTENSION
510 CALL DELIM1
; LOOK FOR END OF PATHNAME
518 OPEN4: DEC SI ; POINT BACK TO LAST CHAR
519 PUSH [SI] ; SAVE TERMINATION CHAR
520 MOV BYTE PTR [SI],0 ; NULL TERMINATE THE STRING
522 MOV AH,CS:[XNXCMD
] ; OPEN OR CREATE FILE
526 MOV CS:[FILESTRT
],DX ; Set values for later call on this file
529 POP ES ; Set ES seg for EXEC_BLOCK
530 MOV BX,OFFSET DG
:EXEC_BLOCK
534 MOV CS:[HANDLE
],AX ; SAVE ERROR CODE OR HANDLE
541 POP AX ; blow away error code...
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
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
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
561 cmp al,lower_z
;is it =< "z" ? ;an001;bgb
562 ja gcur
;no - exit ;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
567 gcur: return
;an001;bgb
570 CMP AL,CHAR_LEFT_BRACKET
573 CMP AL,CHAR_BLANK
; SKIP THESE GUYS
576 CMP AL,CHAR_SEMICOLON
589 CMP AL,CS:[SWITCHAR
] ; STOP ON THESE GUYS
596 OR [NAMESPEC
],1 ; Flag a name command executed
599 MOV AL,BYTE PTR AXSAVE
605 MOV SI,FCB
; DS:SI points to user FCB
606 MOV DI,SI ; ES:DI points to DEBUG FCB
612 MOV DX,OFFSET DG
:NAMBAD_PTR
616 CMP BYTE PTR [PARSERR
],-1 ; Invalid drive specification?
622 CMP WORD PTR DS:[BX],"EH" ; "HE"
625 CMP BYTE PTR DS:[BX+WORD],UPPER_X
631 CMP WORD PTR DS:[BX],"XE" ; "EX"
634 CMP BYTE PTR DS:[BX+WORD],UPPER_E
640 MOV BYTE PTR [RDFLG
],READ
644 MOV BYTE PTR [RDFLG
],WRITE
662 ;=========================================================================
663 ; PRMIO: This routine builds the necessary table for the new
664 ; generic IOCtl primitive read/write logical sector function.
666 ; Inputs : Binary addresses and values converted by GETHEX
668 ; Outputs: REL_READ_WRITE_TAB - Table needed by IOCtl function to
669 ; perform 32 bit sector addressing.
672 ;=========================================================================
675 mov word ptr dg
:[rel_rw_add
],dx ;ac000;save transfer address
677 mov word ptr dg
:[rel_rw_add
+2],ax ;ac000;save segment of transfer
680 CALL GETHEX
; Drive number must be 2 digits or less
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
687 mov word ptr dg
:[rel_high_sec
],bx ;ac000;save high word of
688 ; logical sector address
691 CALL GETHEX
; Number of records
692 mov word ptr dg
:[rel_sec_num
],dx ;ac000;save number of sectors
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
701 MOV DL,bL ;ac000;move drive to dl
702 ; Clean off the buffer cache for physical I/O
712 or al,al ;ac000;see if an error occurred
713 pop ax ;ac000;restore drive
717 CMP CS:BYTE PTR [RDFLG
],WRITE
718 ; $if z ;an000;we will write to sector(s)
720 call ABSWRT
;an000;logical sector write
724 call ABSREAD
;an000;we will read sector(s)
736 ; Clean cache again...
743 ;called from debug.sal
745 MOV AX,[CSSAVE
] ; Default segment
746 MOV DX,100H
; Default file I/O offset
749 XOR DX,DX ; If HEX file, default OFFSET is zero
754 ; AX and DX have segment and offset of transfer, respectively
761 CMP BYTE PTR [RDFLG
],READ
763 MOV DX,OFFSET DG
:EXEWRT_PTR
764 JMP RESTART
; Can't write .EXE files
767 CMP BYTE PTR [RDFLG
],WRITE
769 CMP WORD PTR DS:[BX],4F00H
+ UPPER_C
;"CO"
771 CMP BYTE PTR DS:[BX+WORD],UPPER_M
790 MOV AX,ERROR_FILE_NOT_FOUND
801 CALL IFEXE
; SUBTRACT 512 BYTES FOR EXE
803 JNZ BIN2
; FILE LENGTH BECAUSE OF
805 SUB AX,512 ; THE HEADER
807 MOV [BXSAVE
],DX ; SET UP FILE SIZE IN DX:AX
815 MOV DX,OFFSET DG
:TOOBIG_PTR
828 CMP BYTE PTR [RDFLG
],WRITE
836 MOV AX,(LSEEK
SHL 8) OR LSEEK_EOF_OPTION
837 XOR DX,DX ;CX:DX=DISTANCE (OFFSET) TO MOVE IN BYTES
839 INT 21H
; GET SIZE OF FILE
842 MOV DI,AX ; SIZE TO SI:DI
843 MOV AX,(LSEEK
SHL 8) OR LSEEK_FROM_START
846 INT 21H
; RESET POINTER BACK TO BEGINNING
851 PUSH AX ; TRANS ADDR TO BX:AX
857 ADD BX,AX ; Start of transfer rounded up to seg
859 MOV AX,DI ; DX:AX is size
868 NOREM: ; AX is number of paras in transfer
869 ADD AX,BX ; AX is first seg that need not exist
871 CMP AX,CS:[PDB_BLOCK_LEN
]
878 ; AX:DX is disk transfer address (segment:offset)
879 ; SI:DI is length (32-bit number)
882 MOV BX,DX ; Make a copy of the offset
883 AND DX,000FH ; Establish the offset in 0H-FH range
885 SHR BX,CL ; Shift offset and
886 ADD AX,BX ; Add to segment register to get new Seg:offset
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?
895 MOV CX,DI ; Limit to amount requested
902 INT 21H
; Perform read or write
908 CMP BYTE PTR [RDFLG
],WRITE
917 POP DX ; READ OR WRITE BOMBED OUT
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
930 ADD DX,CX ; Bump DMA address by transfer length
932 OR BX,DI ; Finished with request
945 MOV DX,OFFSET DG
:NOTFND_PTR
949 MOV DX,OFFSET DG
:NONAMESPEC_PTR
955 JZ NO_NAME_GIVEN
; Hey User, you forgot to specify a name
957 CALL CREATE_A_FILE
; Create file we want to write to
959 JC CHECKREADONLY
; ARR 2.4
961 MOV SI,BXSAVE
; Get high order number of bytes to transfer
963 JLE WRTSIZE
; Is bx less than or equal to FH
965 XOR SI,SI ; Ignore BX if greater than FH - set to zero
970 MOV DX,OFFSET DG
:WRTMES_PTR
983 MOV DX,OFFSET DG
:NOSPACE_PTR
986 CALL CLSFLE
;is this dead code? - edk
990 CHECKREADONLY: ; ARR 2.4
995 MOV AX,CHMOD
SHL 8 ;AL=0,REQUEST FILE'S CURRENT
996 ; ATTRIBUTE BE RETURNED IN CX
1000 MOV DX,OFFSET DG
:NOROOM_PTR
; Creation error - report error
1003 TEST CX,ATTR_READ_ONLY
+ATTR_HIDDEN
+ATTR_SYSTEM
1006 MOV DX,OFFSET DG
:ACCMES_PTR
; Write on read only file
1017 POP [RETSAVE
] ; Suck up return addr
1018 INC BYTE PTR [NEWEXEC
]
1019 MOV BX,[USER_PROC_PDB
]
1032 MOV CS:BYTE PTR [NEWEXEC
],0
1033 MOV CS:[HEADSAVE
],AX
1034 PUSH CS:[RETSAVE
] ; Get the return address back
1042 MOV BX,AX ; size of debug in para.
1044 MOV AX,CS ; and the size of printf in para.
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
1064 CALL SET_TERMINATE_VECTOR
; Reset int 22
1066 MOV AH,GET_CURRENT_PDB
1069 MOV CS:[USER_PROC_PDB
],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
]
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
1085 MOV AH,SET_CURRENT_PDB
1088 LES DI,CS:[COM_SSSP
]
1100 MOV DX,OFFSET DG
:NOTFND_PTR
1101 CMP AX,ERROR_FILE_NOT_FOUND
1104 MOV DX,OFFSET DG
:ACCMES_PTR
1105 CMP AX,ERROR_ACCESS_DENIED
1108 MOV DX,OFFSET DG
:TOOBIG_PTR
1109 CMP AX,ERROR_NOT_ENOUGH_MEMORY
1112 MOV DX,OFFSET DG
:EXEBAD_PTR
1113 CMP AX,ERROR_BAD_FORMAT
1116 MOV DX,OFFSET DG
:EXECEMES_PTR
1124 MOV DX,OFFSET DG
:HEXWRT_PTR
1125 CMP BYTE PTR [RDFLG
],WRITE
1134 MOV DX,OFFSET DG
:NOTFND_PTR
1141 MOV SI,OFFSET DG
:(BUFFER
+BUFSIZ
) ; Flag input buffer as empty
1145 CMP AL,CHAR_COLON
; Search for : to start line
1148 CALL GETBYT
; Get byte count
1154 CALL GETBYT
; Get high byte of load address
1157 CALL GETBYT
; Get low byte of load address
1160 ADD BX,[INDEX
] ; Add in offset
1162 CALL GETBYT
; Throw away type byte
1165 CALL GETBYT
; Get data byte
1168 CMP DI,BP ; Check if this is the largest address so far
1171 MOV BP,DI ; Save new largest
1178 CMP SI,OFFSET DG
:(BUFFER
+BUFSIZ
)
1181 MOV DX,OFFSET DG
:BUFFER
1215 MOV DX,OFFSET DG
:HEXERR_PTR
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.
1239 ; Inputs : REL_READ_WRITE_TAB - Table provides dword sector
1242 ; Outputs: Data located at specified transfer address.
1244 ; Error : Carry is set on error.
1247 ;=========================================================================
1249 ABSREAD proc
near ;an000;read logical sector(s)
1251 push ds ;an000;save affected regs
1252 push cx ;an000;save affected regs
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
1260 pop bx ;an000;restore regs
1264 ret ;an000;return to caller
1266 ABSREAD endp
;an000;end proc
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.
1276 ; Inputs : REL_READ_WRITE_TAB - Table provides dword sector
1279 ; Outputs: Data moved from transfer address to applicable sector(s).
1281 ; Error : Carry is set on error.
1284 ;=========================================================================
1286 ABSWRT proc
near ;an000;write logical sector(s)
1288 push ds ;an000;save affected regs
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
1297 pop bx ;an000;restore regs
1301 ret ;an000;return to caller
1303 ABSWRT endp
;an000;end proc