5 ;==============================================================================
7 ;AN000 - New for DOS Version 4.00 - J.K.
8 ;AC000 - Changed for DOS Version 4.00 - J.K.
9 ;AN00x - PTM number for DOS Version 4.00 - J.K.
10 ;==============================================================================
11 ;AN001 - P58 Diskcopy format fails when error occurs during format op.6/26/87 J.K.
12 ;AN002; - d24 MultiTrack= command added. 6/29/87 J.K.
13 ;AN003; - p155 Format intermittant failre due to haed settle time 8/18/87 J.K.
14 ;AN004; D113 Disable I/O access to unformatted media 9/03/87 J.K.
15 ;AN005; P985 Allow I/O access to unformtted media 9/14/87 J.K.
16 ;AN006; D241 Provide support of Multi-track Format/Verify 9/23/87 J.K.
17 ;AN007; P1535 Unformatted hard file problem 10/15/87 J.K.
18 ;AN008; P2590 Change the recommended BPB info. after AFS format 11/20/87 J.K.
19 ;AN009; P2828 Do not retry for multi-track format request 12/08/87 J.K.
20 ;AN010; P2781 Changeline error behavior incompatibile with DOS 3.3. 1/06/88 J.K.
21 ;AN011; P3178 Set Media ID should update media info in BDS table. 1/21/88 J.K.
22 ;AN012; D490 IOCTL subfunction 63h,43h,64h,44h conflicts with OS2 2/26/88 J.K.
23 ;==============================================================================
26 ;NOTE: GetAccessFlag/SetAccessFlag is unpublished function.
27 ; This function is intended to give the user to control the
28 ; BDS table FLAGS of UNFORMATTED_MEDIA bit.
29 ; GetAccessFlag will show the status -
30 ; A_DISKACCESS_CONTROL.DAC_ACCESS_FLAG = 0 DISK I/O not allowed
32 ; SetAccessFlag will Set/Reset the UNFORMATTED_MEDIA bit in FLAGS -
33 ; A_DISKACCESS_CONTROL.DAC_ACCESS_FLAG = 0 Allow disk I/O
35 ;------------------------------------------------------------------------------
37 ; GENERIC IOCTL DISPATCH TABLES
39 IOREADJUMPTABLE DB 7 ;AN012;maximum number (0 based)
40 DW OFFSET GETDEVICEPARAMETERS ;60h
41 DW OFFSET READTRACK ;61h
42 DW OFFSET VERIFYTRACK ;62h
43 dw Cmd_Err_Proc ;AN012;Overlapped with OS2 subfunction
44 dw Cmd_Err_Proc ;AN012;
45 dw Cmd_Err_Proc ;AN012;
46 dw GetMediaID ;AN000;AN012;66h
47 dw GetAccessFlag ;AN007;AN012;67h Unpublished function
49 IOWRITEJUMPTABLE DB 7 ;AN012;
50 DW OFFSET SETDEVICEPARAMETERS ;40h
51 DW OFFSET WRITETRACK ;41h
52 DW OFFSET FORMATTRACK ;42h
53 dw Cmd_Err_Proc ;AN012;
54 dw Cmd_Err_Proc ;AN012;
55 dw Cmd_Err_Proc ;AN012;
56 dw SetMediaID ;AN000;AN012;46h
57 dw SetAccessFlag ;AN007;AN012;47h Unpublished function
59 ; TRACKTABLE CONTAINS A 4-TUPLES (C,H,R,N) FOR EACH SECTOR IN A TRACK
60 ; C = CYLINDER NUMBER, H = HEAD NUMBER, R = SECTOR ID, N = BYTES PER SECTOR
62 ; --- ----------------
68 MAX_SECTORS_CURR_SUP EQU 63 ; CURRENT MAXIMUM SEC/TRK THAT
69 ; WE SUPPORT (Was 40 in DOS 3.2)
107 DB 4*MAX_SECTORS_CURR_SUP - ($ - TRACKTABLE) DUP (0)
109 ; THIS IS A REAL UGLY PLACE TO PUT THIS
110 ; IT SHOULD REALLY GO IN THE BDS
113 MEDIA_SET_FOR_FORMAT DB 0 ; 1 IF WE HAVE DONE AN INT 13 SET MEDIA
114 ; TYPE FOR FORMAT CALL
115 Had_Format_Error db 0 ; 1 if the previous format operation
116 ; failed. - J.K. 7/8/86
117 Dsk_time_out_Err equ 80h ; Time out error (No media present).
118 Dsk_change_line_Err equ 6h ; Change line error
119 Dsk_illegal_combination equ 0Ch ; Return code of ah=18h function.
121 ; TEMP DISK BASE TABLE. IT HOLDS THE THE CURRENT DPT WHICH IS THEN REPLACED BY
122 ; THE ONE PASSED BY "NEW ROMS" BEFORE WE PERFORM A FORMAT OPERATION. THE OLD
123 ; DPT IS RESTORED IN RESTOREOLDDPT. THE FIRST ENTRY (DISK_SPECIFY_1) IS -1 IF
124 ; THIS TABLE DOES NOT CONTAIN THE PREVIOUSLY SAVED DPT.
129 ; PERFORM GENERIC IOCTL REQUEST
133 ; IF CARRY SET THEN AL CONTAINS ERROR CODE
137 MESSAGE FTESTDISK,<"GENERIC IOCTL",CR,LF>
138 LES BX,CS:[PTRSAV] ; ES:BX POINTS TO REQUEST HEADER.
139 CALL SETDRIVE ; DS:DI POINTS TO BDS FOR DRIVE.
142 ; ES:BX - POINTS TO THE REQUEST HEADER
143 ; DS:DI POINTS TO THE BDS FOR THE DRIVE
145 CMP ES:[BX].MAJORFUNCTION, RAWIO
147 MOV AL, ES:[BX].MINORFUNCTION
148 MOV SI, OFFSET IOREADJUMPTABLE
149 TEST AL, GEN_IOCTL_FN_TST ; TEST OF REQ. FUNCTION
150 JNZ NOTGENERICIOCTLWRITE ; FUNCTION IS A READ.
151 MOV SI, OFFSET IOWRITEJUMPTABLE
152 NOTGENERICIOCTLWRITE:
154 and al, 9fH ;AN000; Try to check other than 6x, 4x.
161 LES BX, ES:[BX].GENERICIOCTL_PACKET
171 Cmd_Err_Proc: ;AN012;
172 pop dx ;AN012;clear up stack
173 pop dx ;AN012;clear up stack
174 jmp IOCTL_FUNC_ERR ;AN012;Cmd error
176 ; GETDEVICEPARAMETERS:
178 ; INPUT: DS:DI POINTS TO BDS FOR DRIVE
179 ; ES:BX POINTS TO DEVICE PARAMETER PACKET
181 PUBLIC GETDEVICEPARAMETERS
182 GETDEVICEPARAMETERS PROC NEAR
183 ; COPY INFO FROM BDS TO THE DEVICE PARAMETERS PACKET
184 MOV AL, BYTE PTR DS:[DI].FORMFACTOR
185 MOV BYTE PTR ES:[BX].DP_DEVICETYPE, AL
186 MOV AX, WORD PTR DS:[DI].FLAGS
187 AND AX,FNON_REMOVABLE+FCHANGELINE ; MASK OFF OTHER BITS
188 MOV WORD PTR ES:[BX].DP_DEVICEATTRIBUTES, AX
189 MOV AX, WORD PTR DS:[DI].CCYLN
190 MOV WORD PTR ES:[BX].DP_CYLINDERS, AX
192 ; SET MEDIA TYPE TO DEFAULT
194 MOV BYTE PTR ES:[BX].DP_MEDIATYPE, AL
196 ; COPY RECOMMENDED BPB
197 LEA SI, BYTE PTR [DI].RBYTEPERSEC
198 TEST BYTE PTR ES:[BX].DP_SPECIALFUNCTIONS, BUILD_DEVICE_BPB
200 ; GET THE CORRECT DISK IN THE DRIVE
202 ; BUILD THE BPB FROM SCRATCH
205 LEA SI,BYTE PTR [DI].BYTEPERSEC
207 LEA DI, BYTE PTR [BX].DP_BPB
208 MOV CX, SIZE BPB_TYPE ; FOR NOW USE 'SMALL' BPB
213 GETDEVICEPARAMETERS ENDP
216 ; SETDEVICEPARAMETERS:
218 ; INPUT: DS:DI POINTS TO BDS FOR DRIVE
219 ; ES:BX POINTS TO DEVICE PARAMETER PACKET
221 PUBLIC SETDEVICEPARAMETERS
222 SETDEVICEPARAMETERS PROC NEAR
223 ; MAKE SURE THE FCHANGED_BY_FORMAT FLAG GETS SET TO KICK DOS INTO LOOKING AT
225 OR WORD PTR DS:[DI].FLAGS, FCHANGED_BY_FORMAT OR FCHANGED
226 TEST BYTE PTR ES:[BX].DP_SPECIALFUNCTIONS, ONLY_SET_TRACKLAYOUT
227 JZ SHORT SETDEVPARM_1
228 JMP SETTRACKTABLE ; ORIGINALLY TRACKLAYOUT
231 ; COPY INFO FROM THE DEVICE PARAMETERS PACKET TO BDS
232 MOV AL, BYTE PTR ES:[BX].DP_DEVICETYPE
233 MOV BYTE PTR DS:[DI].FORMFACTOR, AL
235 MOV AX, WORD PTR ES:[BX].DP_CYLINDERS
236 MOV WORD PTR DS:[DI].CCYLN, AX
238 ; IF CHANGE LINE IS NOT LOADED THEN IGNORE CHANGELING FLAG
239 MOV AX, WORD PTR ES:[BX].DP_DEVICEATTRIBUTES
242 AND AX,NOT FCHANGELINE
244 ; IGNORE ALL BITS EXCEPT NON_REMOVABLE AND CHANGELINE
245 AND AX,FNON_REMOVABLE OR FCHANGELINE
246 MOV CX, WORD PTR DS:[DI].FLAGS
247 ; AND CX, NOT (FNON_REMOVABLE OR FCHANGELINE OR GOOD_TRACKLAYOUT)
248 AND CX, NOT (FNON_REMOVABLE OR FCHANGELINE OR GOOD_TRACKLAYOUT or UNFORMATTED_MEDIA) ;AN004;AN005;AN007;
250 MOV WORD PTR DS:[DI].FLAGS, AX
253 MOV AL, BYTE PTR ES:[BX].DP_MEDIATYPE
255 ; THE MEDIA CHANGED (MAYBE) SO WE WILL HAVE TO DO A SETDASD THE NEXT TIME
257 OR WORD PTR DS:[DI].FLAGS, SET_DASD_TRUE
259 SAVEREG <DS,DI,ES,BX>
260 ; FIGURE OUT WHAT WE ARE SUPPOSED TO DO WITH THE BPB
262 ; WERE WE ASKED TO INSTALL A FAKE BPB?
263 TEST BYTE PTR ES:[BX].DP_SPECIALFUNCTIONS, INSTALL_FAKE_BPB
264 JNZ SHORT INSTALLFAKEBPB
266 ; WERE WE RETURNING A FAKE BPB WHEN ASKED TO BUILD A BPB?
267 TEST WORD PTR DS:[DI].FLAGS, RETURN_FAKE_BPB
268 JZ SHORT INSTALLRECOMMENDEDBPB
270 ; WE WERE RETURNING A FAKE BPB BUT WE CAN STOP NOW
271 AND WORD PTR DS:[DI].FLAGS, NOT RETURN_FAKE_BPB
272 ; JMP DONEWITHBPBSTUFF ;AN008; Comment out this instruction.
274 INSTALLRECOMMENDEDBPB:
276 LEA DI, BYTE PTR [DI].RBYTEPERSEC
280 or word ptr ds:[di].flags, return_fake_bpb ;AN000; Problem
282 MOV CX, SIZE BPB_TYPE ; MOVE 'SMALLER' BPB
283 LEA DI, BYTE PTR [DI].BYTEPERSEC
285 LEA SI, BYTE PTR [BX].DP_BPB
295 CALL RESTOREOLDDPT ; RESTORE THE OLD DPT FROM TEMPDPT
296 RESTOREREG <BX,ES,DI,DS>
298 ; SET UP TRACK TABLE (IF NECCESSARY)
300 MOV CX, WORD PTR ES:[BX].DP_TRACKTABLEENTRIES
301 MOV CS:SECTORSPERTRACK, CX
302 AND WORD PTR DS:[DI].FLAGS, NOT GOOD_TRACKLAYOUT
303 TEST BYTE PTR ES:[BX].DP_SPECIALFUNCTIONS, TRACKLAYOUT_IS_GOOD
305 OR WORD PTR DS:[DI].FLAGS, GOOD_TRACKLAYOUT
308 CMP CX, MAX_SECTORS_IN_TRACK
309 JA TOOMANYSECTORSPERTRACK
311 MOV DI, OFFSET TRACKTABLE
312 LEA SI, ES:[BX].DP_SECTORTABLE
318 INC DI ; SKIP OVER CYLINDER
319 INC DI ; SKIP OVER HEAD
320 LODSW ; GET SECTOR ID
322 LODSW ; GET SECTOR SIZE
323 CALL SECTORSIZETOSECTORINDEX
324 POP DX ; GET SECTOR ID BACK
325 MOV AL, DL ; AH = SECTOR SIZE INDEX
334 TOOMANYSECTORSPERTRACK:
339 SETDEVICEPARAMETERS ENDP
342 ; SET MEDIA TYPE FOR FORMAT
343 ; PERFORMS THE INT 13 WITH AH = 18H TO SEE IF THE MEDIUM DESCRIBED IN THE
344 ; BPB AREA IN THE BDS CAN BE HANDLED BY THE ROM.
345 ; ON INPUT, DS:DI -> CURRENT BDS.
346 ; THE STATUS OF THE OPERATION IS RETURNED IN AL
347 ; - 0 - IF THE SUPPORT IS AVAILABLE, AND THE COMBINATION IS VALID.
348 ; - 1 - NO ROM SUPPORT
349 ; - 2 - ILLEGAL COMBINATION
350 ; - 3 - No media present (ROM support exists but cannot determine now)
351 ; FLAGS ALSO MAY BE ALTERED. ALL OTHER REGISTERS PRESERVED.
352 ; IF THE CALL TO ROM RETURNS NO ERROR, THEN THE CURRENT DPT IS "REPLACED" BY
353 ; THE ONE RETURNED BY THE ROM. THIS IS DONE BY CHANGING THE POINTER IN [DPT]
354 ; TO THE ONE RETURNED. THE ORIGINAL POINTER TO THE DISK BASE TABLE IS STORED
355 ; IN TEMPDPT, UNTIL IT IS RESTORED.
357 PUBLIC SET_MEDIA_FOR_FORMAT
358 SET_MEDIA_FOR_FORMAT PROC NEAR
361 cmp cs:[Had_Format_Error],1 ;Did we have a format error before?
362 jne No_Form_Err ;AN001;
365 CMP BYTE PTR CS:[MEDIA_SET_FOR_FORMAT],1
366 jnz Do_Set_Media_for_Format
367 jmp SET_MED_RET ; MEDIA ALREADY SET
368 Do_Set_Media_for_Format:
371 LDS SI,DWORD PTR DS:[DSKADR] ; GET POINTER TO DISK BASE TABLE
372 MOV WORD PTR CS:[DPT],SI
373 MOV WORD PTR CS:[DPT+2],DS ; SAVE POINTER TO TABLE
374 ;SB34IOCTL000******************************************************************
375 ;SB Initialise the head settle time to 0fh. See the offsets given in
376 ;SB DSKPRM.INC. 1 LOC.
378 mov ds:[si].DISK_HEAD_STTL, 0Fh
379 ;SB34IOCTL000******************************************************************
381 mov cs:[New_Rom], 1 ;assume a new ROM.
383 ;SB33031****************************************************************
384 mov cx,ds:[di.ccyln] ;get number of cylinders ;SB ;3.30*
385 dec cx ;cylinder must be zero based ;SB ;3.30*
386 and ch,03h ; blank out unnecessary bits
387 ror ch,1 ;put in int form ;SB ;3.30*
388 ror ch,1 ; ;SB ;3.30*
389 xchg ch,cl ; ;SB ;3.30*
390 or cl,byte ptr ds:[di.seclim] ;get number of sectors ;SB ;3.30*
391 mov dl,ds:[di.drivenum] ;get drive number ;SB ;3.30*
392 mov ah,18h ;set media for format ;SB ;3.30*
393 SAVEREG <ES,DS,SI,DI>
394 int 13h ;call rom bios ;SB ;3.30*
395 ;SB33031****************************************************************
397 ; ES:DI POINTS TO A DISK BASE TABLE FOR THIS COMBINATION FOR THIS DRIVE.
399 MOV DS,CX ; HAVE DS -> SEGMENT 0
400 LDS SI,DWORD PTR DS:[DSKADR] ; GET CURRENT DISK BASE TABLE
401 MOV WORD PTR CS:[TEMPDPT],SI
402 MOV WORD PTR CS:[TEMPDPT+2],DS ; SAVE IT
403 MOV WORD PTR DS:[DSKADR],DI
404 MOV WORD PTR DS:[DSKADR+2],ES ; REPLACE WITH ONE RETURNED BY ROM
405 MOV BYTE PTR CS:[MEDIA_SET_FOR_FORMAT],1
406 Skip_Disk_Base_setting:
407 XOR AL,AL ; LEGAL COMBINATION + ROM SUPPORT CODE
408 mov cs:[Had_Format_Error],al ;reset the flag
409 JMP SHORT POP_STAT_RET
412 cmp ah, Dsk_illegal_combination ;J.K. illegal combination = 0ch
413 je Format_stat_illegal_comb
414 cmp ah, Dsk_Time_Out_Err ;J.K. = 80h
415 je Format_stat_Time_out
416 mov al, 1 ;Function not supported.
417 mov cs:[New_Rom], 0 ;So, it is an old rom.
418 jmp short Pop_stat_ret
419 Format_stat_illegal_comb: ;J.K. Function supported, but
420 MOV AL,2 ;J.K. illegal sect/trk, trk combination.
421 jmp short Pop_stat_ret
422 Format_stat_Time_out: ;J.K. Function supported, but
423 mov al, 3 ;J.K. media not present.
425 RESTOREREG <DI,SI,DS,ES>
430 SET_MEDIA_FOR_FORMAT ENDP
434 ; IF SPECIALFUNCTION BYTE IS 1, THEN THIS IS A STATUS CALL TO SEE IF THERE IS
435 ; ROM SUPPORT FOR THE COMBINATION OF SEC/TRK AND # OF CYLN, AND IF THE
436 ; COMBINATION IS LEGAL. IF SPECIALFUNCTION BYTE IS 0, THEN FORMAT THE TRACK.
438 ; INPUT: DS:DI POINTS TO BDS FOR DRIVE
439 ; ES:BX POINTS TO FORMAT PACKET
443 ; SPECIALFUNCTION BYTE SET TO:
444 ; 0 - ROM SUPPORT + LEGAL COMBINATION
446 ; 2 - ILLEGAL COMBINATION
447 ; 3 - no media present ;J.K. 7/8/86
454 FORMATTRACK PROC NEAR
455 TEST BYTE PTR ES:[BX].DP_SPECIALFUNCTIONS,STATUS_FOR_FORMAT
457 CALL SET_MEDIA_FOR_FORMAT ; ALSO MOVES CURRENT DPT TO TEMPDPT
459 MOV BYTE PTR ES:[BX].DP_SPECIALFUNCTIONS,AL
464 CMP BYTE PTR DS:[DI].FORMFACTOR, DEV_HARDDISK
465 jne Do_Format_Diskette
468 SAVEREG <DS,DI,ES,BX>
469 ;SB34IOCTL001*************************************************************
470 ;SB check the special functions word to see if DO_FAST_FORMAT has been
471 ;SB specified. If so it is an error and we need to finish this operation
472 ;SB by indicating the error value 1 in register ah and going to the
473 ;SB the code at DO_MAP_IT to map the error. This is because we cannot
474 ;SB allow multitrack format on floppies - 5 LOCS
476 test byte ptr es:[bx].FP_SPECIALFUNCTIONS,DO_FAST_FORMAT
481 ;SB34IOCTL001*************************************************************
482 CALL SET_MEDIA_FOR_FORMAT ; ALSO MOVES CURRENT DPT TO TEMPDPT
483 CMP AL,1 ; DO WE HAVE ROM SUPPORT FOR sector/trk, # trks combination?
484 JZ Need_Set_DASD ;Old ROM.
485 cmp al,3 ;time out error?
486 jnz No_Set_DASD ;No, fine.(At this point, don't care about the illegal combination.)
489 CALL SETDASD ;AH=17h, INT 13h
491 ; STORE CYLINDER,HEAD IN TRACK TABLE
492 ; ***** ASSUMPTION *******
493 ; SINCE FORMAT REQUESTS ON FIXED MEDIA ARE CONVERTED TO VERIFIES, WE
494 ; ASSUME THAT WE ARE FORMATTING A FLOPPY AND HENCE HAVE 255 OR LESS
495 ; TRACKS AND HEADS. WE THEREFORE MUST CHANGE THE CYLINDER, HEAD DATA
496 ; FROM THE REQUEST PACKET SIZE TO THAT OF THE TRACKTABLE (SEE INT 13
497 ; INTERFACE IN IBM'S TECH REF.).
500 ; CHECK TO ENSURE CORRECT DISK IS IN DRIVE
503 MOV AX, WORD PTR ES:[BX].FP_CYLINDER
504 MOV WORD PTR CS:[TRKNUM],AX
505 MOV CX, WORD PTR ES:[BX].FP_HEAD
506 MOV BYTE PTR CS:[HDNUM],CL
509 PUSH DI ; SAVE PTR TO BDS
510 MOV DI, OFFSET TRACKTABLE
513 MOV CX, CS:SECTORSPERTRACK
516 INC DI ; SKIP SECTOR ID
517 INC DI ; SKIP SECTOR SIZE
518 LOOP STORECYLINDERHEAD
519 POP DI ; RESTORE PTR TO BDS
521 MOV CX, MAXERR ; SET UP RETRY COUNT
524 MOV BX, OFFSET TRACKTABLE
527 MOV AX, CS:SECTORSPERTRACK
533 mov cs:[Had_Format_Error],1
537 call Set_Media_For_Format
546 ;SB33106*******************************************************************
548 mov cs:[Had_Format_Error], 1 ;set the format error flag.
549 cmp ah, Dsk_Change_Line_Err ;=06h. Convert change line
550 jne Do_Map_it ;error to Time Out error.
551 mov ah, Dsk_Time_Out_Err ;=80h
552 ;SB33106*******************************************************************
555 RESTOREREG <BX,ES,DI,DS>
559 mov cs:[Had_Format_Error],0 ;reset the format error flag.
560 RESTOREREG <BX,ES,DI,DS>
568 VerifyTrack_Err: ;AN006;
570 call MapError ;AN006;
576 ; INPUT: DS:DI POINTS TO BDS FOR DRIVE
577 ; ES:BX POINTS TO VERIFY PACKET
580 VERIFYTRACK PROC NEAR
581 MOV CS:RFLAG, ROMVERIFY
582 MOV AX, WORD PTR ES:[BX].VP_CYLINDER
584 MOV AX, WORD PTR ES:[BX].VP_HEAD
586 ; ****** ASSUMPTION ******
587 ; WE ASSUME THAT WE HAVE LESS THAN 256 HEADS, AND THAT THE REQUEST
588 ; HEADER DATA STRUCTURE IS UNNECCESSARILY BIG
590 MOV CX, CS:SECTORSPERTRACK ;CL = sectors/track
591 ;SB34IOCTL005*************************************************************
593 ;SB Check SPECIALFUNCTIONS to see if DO_FAST_FORMAT has been specified
594 ;SB If not we should go to the normal track verification routine. If
595 ;SB fast format has been specified we should get the number of tracks
596 ;SB to be verified and check it to see if it is > 255. If it is then
597 ;SB it is an error and we should go to VerifyTrack_Err. If not multiply
598 ;SB the number of tracks by the sectors per track to get the total
599 ;SB number of sectors to be verified. This should also be less than
600 ;SB equal to 255 otherwise we go to same error exit. If everything
601 ;SB is okay we initalise cx to the total sectors. use ax as a temporary
604 test byte ptr es:[bx].FP_SPECIALFUNCTIONS,DO_FAST_FORMAT
606 mov ax,es:[bx].FP_TRACKCOUNT ;ax <- tracks to be verify
608 ja VerifyTrack_Err ;#tracks > 255
610 cmp ax,0FFh ;#sectors > 255
612 mov cx,ax ;#sectors to verify
613 ;SB34IOCTL005*************************************************************
615 ;Set the multi track request flag
616 test word ptr [di].Flags, fNON_REMOVABLE ;AN009;hard disk?
617 jz Norm_VerifyTrack ;AN009;
618 test cs:Multrk_Flag, MULTRK_ON ;AN009;MultiTrack operation = on?
619 jz Norm_VerifyTrack ;AN009;
620 mov cs:Multitrk_Format_Flag, 1 ;AN009; then set the flag
621 Norm_VerifyTrack: ;AN006;
622 XOR AX, AX ;1st sector
623 ; USE 0:0 AS THE TRANSFER ADDRESS FOR VERIFY
627 mov cs:Multitrk_Format_Flag, 0 ;AN009;Reset the flag.
634 ; INPUT: DS:DI POINTS TO BDS FOR DRIVE
635 ; ES:BX POINTS TO READ PACKET
639 MOV CS:RFLAG, ROMREAD
645 ; INPUT: DS:DI POINTS TO BDS FOR DRIVE
646 ; ES:BX POINTS TO WRITE PACKET
650 MOV CS:RFLAG, ROMWRITE
656 ; DS:DI POINTS TO BDS FOR DRIVE
657 ; ES:BX POINTS TO WRITE PACKET
658 ; RFLAG - 2 FOR READ, 3 FOR WRITE
660 PUBLIC READWRITETRACK
661 READWRITETRACK PROC NEAR
662 MOV AX, WORD PTR ES:[BX].TRWP_CYLINDER
664 MOV AX, WORD PTR ES:[BX].TRWP_HEAD
666 ; ****** ASSUMPTION ******
667 ; WE ASSUME THAT WE HAVE LESS THAN 256 HEADS, AND THAT THE REQUEST
668 ; HEADER DATA STRUCTURE IS UNNECCESSARILY BIG
670 MOV AX, WORD PTR ES:[BX].TRWP_FIRSTSECTOR
671 MOV CX, WORD PTR ES:[BX].TRWP_SECTORSTOREADWRITE
672 LES BX, ES:[BX].TRWP_TRANSFERADDRESS
680 ; PERFORMS TRACK READ/WRITE/VERIFY
686 ; AX - INDEX INTO TRACK TABLE OF FIRST SECTOR TO IO
687 ; CX - NUMBER OF SECTORS TO IO
688 ; ES:BX - TRANSFER ADDRESS
689 ; DS:DI - POINTER TO BDS
690 ; CURTRK - CURRENT CYLINDER
691 ; CURHD - CURRENT HEAD
695 ; PROCEDURE `DISK' WILL POP STACK TO SPSAV AND RETURN IF ERROR
697 ; ENSURE CORRECT DISK IS IN DRIVE
699 ; SEE IF WE HAVE ALREADY SET THE DISK BASE TABLE
700 CMP BYTE PTR CS:[MEDIA_SET_FOR_FORMAT],1
703 ; SET UP TABLES AND VARIABLES FOR I/O
709 ; POINT SI AT THE TABLE ENTRY OF THE FIRST SECTOR TO BE IO'D
712 MOV SI, OFFSET TRACKTABLE
718 ; CX TO BE THE NUMBER OF TIMES WE HAVE TO LOOP
719 ; DX TO BE THE NUMBER OF SECTORS WE READ ON EACH ITERATION
721 TEST WORD PTR DS:[DI].FLAGS, GOOD_TRACKLAYOUT
724 ; HEY! WE CAN READ ALL THE SECTORS IN ONE BLOW
730 ; SKIP OVER THE CYLINDER AND HEAD IN THE TRACK TABLE
733 ; GET SECTOR ID FROM TRACK TABLE
734 LODS BYTE PTR CS:[SI]
736 ;*** For a Fixed disk multi-track disk I/O - J.K. 4/14/86
737 ;Assumptions: 1). In the input CX (# of sectors to go) to TRACKIO, only CL is
738 ;valid. 2). Sector size should be set to 512 bytes. 3). GOODTRACKLAYOUT.
740 test word ptr [di].Flags, fNon_Removable ;Fixed disk? - J.K.
741 jz IOREMOVABLE ;no -J.K.
742 test cs:MulTrk_Flag, MULTRK_ON ;AN002; Allow multi-track operation?
743 jz IORemovable ;AN002; No, don't do that.
744 mov cs:[seccnt], dx ;# of sectors to I/O -J.K.
752 ; GET SECTOR SIZE INDEX FROM TRACK TABLE AND SAVE IT
753 LODS BYTE PTR CS:[SI]
755 ; PATCH SECTOR SIZE IN DPT
759 MOV BYTE PTR DS:[SI].DISK_SECTOR_SIZ,AL
761 MOV [SI].DISK_EOT,AL ; SET UP THE MAX NUMBER OF SEC/TRACK
765 MOV CS:[SECCNT],AX ; SET UP THE COUNT OF SECTORS TO I/O
767 ; ADVANCE BUFFER POINTER BY ADDING SECTOR SIZE
770 CALL SECTORSIZEINDEXTOSECTORSIZE
775 cmp byte ptr cs:[Media_Set_For_Format], 1 ;AN001;
776 je No_Need_Done ;AN001;
777 CALL DONE ; SET TIME OF LAST ACCESS, AND RESET
778 No_Need_Done: ;AN001;
779 CLC ; ENTRIES IN DPT.
784 ; THE SECTOR SIZE IN BYTES NEEDS TO BE CONVERTED TO AN INDEX VALUE FOR THE IBM
785 ; ROM. (0=>128, 1=>256,2=>512,3=>1024). IT IS ASSUMED THAT ONLY THESE VALUES
787 ; ON INPUT AX CONTAINS SECTOR SIZE IN BYTES
788 ; ON OUTPUT AL CONTAINS INDEX
790 PUBLIC SECTORSIZETOSECTORINDEX
791 SECTORSIZETOSECTORINDEX PROC NEAR
792 CMP AH,2 ; EXAMINE UPPER BYTE ONLY
794 MOV AL,AH ; VALUE IN AH IS THE INDEX!
799 SECTORSIZETOSECTORINDEX ENDP
801 SECTORSIZEINDEXTOSECTORSIZE PROC NEAR
806 SECTORSIZEINDEXTOSECTORSIZE ENDP
809 ; SET UP THE ROM FOR FORMATTING.
810 ; WE HAVE TO TELL THE ROM BIOS WHAT TYPE OF DISK IS IN THE DRIVE.
811 ; ON INPUT - DS:DI - POINTS TO BDS
815 ; SEE IF WE HAVE PREVIOUSLY SET DASD TYPE
816 ;SB33114******************************************************************
817 cmp cs:[Had_Format_Error],1
819 ;SB33114******************************************************************
820 TEST WORD PTR DS:[DI].FLAGS, SET_DASD_TRUE
822 AND WORD PTR DS:[DI].FLAGS, NOT SET_DASD_TRUE
823 ;SB33115******************************************************************
825 mov cs:[Had_Format_Error],0 ;reset it
826 ;SB33115******************************************************************
827 MOV CS:[GAP_PATCH],50H ; FORMAT GAP FOR 48TPI DISKS
829 CMP BYTE PTR DS:[DI].FORMFACTOR,DEV_3INCH720KB
831 CMP BYTE PTR DS:[DI].FORMFACTOR, DEV_5INCH96TPI
833 MOV AL,1 ; 160/320K IN A 160/320K DRIVE
836 MOV AL,2 ; 160/320K IN A 1.2 MEG DRIVE
839 MOV AL,3 ; 1.2MEG IN A 1.2MEG DRIVE
840 MOV CS:[GAP_PATCH],54H
844 ;SB34IOCTL002****************************************************************
845 ;SB Get the disk parameter table address (dword address) from the location
846 ;SB 0:[DSKADR] and fix the head settle time in this to be 0fh. 4 LOCS
850 lds si, dword ptr ds:[DSKADR]
851 mov ds:[si].DISK_HEAD_STTL, 0Fh
852 ;SB34IOCTL002****************************************************************
855 ;SB33032******************************************************************
856 mov AH, 17h ; set command to Set DASD type;SB ;3.30*
857 mov DL, [di].DriveNum ; set drive number ;SB ;3.30*
858 int 13h ; call rom-bios ;SB ;3.30*
859 ;SB33032******************************************************************
861 MOV AH,BYTE PTR [DI].SECLIM
862 MOV CS:[FORMT_EOT],AH
866 ; THIS ROUTINE IS CALLED IF AN ERROR OCCURS WHILE FORMATTING OR VERIFYING.
867 ; IT RESETS THE DRIVE, AND DECREMENTS THE RETRY COUNT.
868 ; ON ENTRY - DS:DI - POINTS TO BDS FOR THE DRIVE
869 ; BP - CONTAINS RETRY COUNT
870 ; ON EXIT FLAGS INDICATE RESULT OF DECREMENTING RETRY COUNT
875 ;(deleted section here, as requested by D.L.)
877 DEC BP ; DECREMENT RETRY COUNT
882 ; WE ALSO SET [STEP_DRV] TO -1 TO FORCE THE MAIN DISK ROUTINE TO USE THE
883 ; SLOW HEAD SETTLE TIME FOR THE NEXT OPERATION. THIS IS BECAUSE THE RESET
884 ; OPERATION MOVES THE HEAD TO CYLINDER 0, SO WE NEED TO DO A SEEK THE NEXT
885 ; TIME AROUND - THERE IS A PROBLEM WITH 3.5" DRIVES IN THAT THE HEAD DOES
886 ; NOT SETTLE DOWN IN TIME, EVEN FOR READ OPERATIONS!!
891 ;SB33033******************************************************************
892 xor AH, AH ; set command to reset disk ;SB ;3.30*
893 int 13h ; call the rom-bios ;SB ;3.30*
894 ;SB33033******************************************************************
895 MOV CS:[STEP_DRV],-1 ; ZAP UP THE SPEED
900 ; THIS ROUTINE SETS UP THE DRIVE PARAMETER TABLE WITH THE VALUES NEEDED FOR
901 ; FORMAT, DOES AN INT 13. VALUES IN DPT ARE RESTORED AFTER A VERIFY IS DONE.
903 ; ON ENTRY - DS:DI - POINTS TO BDS FOR THE DRIVE
904 ; ES:BX - POINTS TO TRKBUF
905 ; AL - NUMBER OF SECTORS
906 ; AH - INT 13 FUNCTION CODE
907 ; CL - SECTOR NUMBER FOR VERIFY
908 ; ON EXIT - DS,DI,ES,BX REMAIN UNCHANGED.
909 ; AX AND FLAGS ARE THE RESULTS OF THE INT 13
913 SAVEREG <DS,DI,ES,BX,SI>
914 TEST BYTE PTR CS:[NEW_ROM],1
917 MOV DX,DS ; SAVE DS:DI-> BDS
920 LDS SI,DWORD PTR DS:[DSKADR] ; GET POINTER TO DISK BASE TABLE
921 MOV WORD PTR CS:[DPT],SI
922 MOV WORD PTR CS:[DPT+2],DS ; SAVE POINTER TO TABLE
923 MOV AL,CS:[FORMT_EOT]
925 MOV AL,CS:[GAP_PATCH]
926 MOV [SI].DISK_FORMT_GAP,AL ; IMPORTANT FOR FORMAT
927 MOV [SI].DISK_HEAD_STTL,15 ; ASSUME WE ARE DOING A SEEK OPERATION
928 ; SET UP MOTOR START CORRECTLY FOR 3.5" DRIVES.
931 CMP BYTE PTR ES:[DI].FORMFACTOR,FFSMALL ; IS IT A 3.5" DRIVE?
934 XCHG AL,[SI].DISK_MOTOR_STRT
937 ;----------------------------------------------------------------------------
938 ; THE FOLLOWING TWO LINES ARE NO LONGER NECESSARY SINCE THEY ARE ONLY USEFUL
939 ; FOR A VERIFY OPERATION.
940 ; MOV AL,CS:[SECTOR_SIZ_IND]
941 ; MOV [SI].DISK_SECTOR_SIZ,AL ; IMPORTANT FOR VERIFY
942 ;----------------------------------------------------------------------------
943 MOV DS,DX ; RESTORE DS:DI-> BDS
946 ;SB33034*******************************************************************
947 mov dx, cs:[trknum] ; set track number ;SB ;3.30*
948 mov ch,dl ; set low 8 bits in ch ;SB ;3.30*
949 mov DL, ds:[di].DriveNum ; set drive number ;SB ;3.30*
950 mov DH, CS:[HDNUM] ; set head number ;SB ;3.30*
951 int 13h ; call the rom-bios routines ;SB ;3.30*
952 ;SB33034*******************************************************************
953 RESTOREREG <SI,BX,ES,DI,DS>
957 ; GET THE OWNER OF THE PHYSICAL DRIVE REPRESENTED BY THE LOGICAL DRIVE IN BL.
958 ; THE ASSUMPTION IS THAT WE **ALWAYS** KEEP TRACK OF THE OWNER OF A DRIVE!!
959 ; IF THIS IS NOT THE CASE, THE SYSTEM MAY HANG, JUST FOLLOWING THE LINKED LIST.
964 MOV AL,BYTE PTR [DI].DRIVENUM ; GET PHYSICAL DRIVE NUMBER
967 MOV DI,WORD PTR START_BDS
969 CMP BYTE PTR [DI].DRIVENUM,AL
971 TEST WORD PTR [DI].FLAGS,FI_OWN_PHYSICAL
974 MOV BX,WORD PTR [DI].LINK+2
975 MOV DI,WORD PTR [DI].LINK
982 ; SET THE OWNERSHIP OF THE PHYSICAL DRIVE REPRESENTED BY THE LOGICAL DRIVE IN
988 MOV BYTE PTR CS:[FSETOWNER],1 ; SET FLAG FOR CHECKSINGLE TO
990 CALL CHECKSINGLE ; SET OWNERSHIP OF DRIVE
991 MOV BYTE PTR CS:[FSETOWNER],0 ; RESET FLAG
995 MOV BYTE PTR ES:[LSTDRV],CL ; SET UP SDSB AS WELL
998 ; IF THERE IS ONLY ONE LOGICAL DRIVE ASSIGNED TO THIS PHYSICAL DRIVE, RETURN
999 ; 0 TO USER TO INDICATE THIS.
1001 TEST WORD PTR [DI].FLAGS,FI_AM_MULT
1003 MOV CL,BYTE PTR [DI].DRIVELET ; GET LOGICAL DRIVE NUMBER
1004 INC CL ; GET IT 1-BASED
1007 MOV BYTE PTR [BX].UNIT,CL
1012 ; MOVES THE OLD DPT THAT HAD BEEN SAVED IN TEMPDPT BACK TO DPT. THIS IS DONE
1013 ; ONLY IF THE FIRST BYTE OF TEMPDPT IS NOT -1.
1014 ; ALL REGISTERS (INCLUDING FLAGS) ARE PRESERVED.
1016 PUBLIC RESTOREOLDDPT
1018 ; IF WE HAVE ALREADY RESTORED THE DISK BASE TABLE EARLIER, DO NOT DO IT
1022 ; RESET FLAG AND GET CURRENT FLAG SETTING
1023 mov cs:[Had_Format_Error],al
1024 XCHG BYTE PTR CS:[MEDIA_SET_FOR_FORMAT],AL
1030 MOV ES,AX ; HAVE ES -> SEGMENT 0
1031 MOV WORD PTR ES:[DSKADR],SI
1032 MOV WORD PTR ES:[DSKADR+2],DS
1034 RESTOREREG <ES,DS,SI>
1040 ;******************************************************************************
1041 ;AN000; Get Media ID
1042 ;*******************************************************************************
1044 ; Function: Get the volume label, the system id and the serial number from *
1045 ; the media that has the extended boot record. *
1046 ; For the conventional media, this routine will return "Unknown *
1047 ; media type" error to DOS. *
1049 ; Input : DS:DI -> BDS table for this drive. *
1050 ; ES:BX -> Request packet (= A_Media_ID_INFO structure) *
1052 ; Output: The request packet filled with the information, if not carry. *
1053 ; If carry set, then AL contains the device driver error number *
1054 ; that will be returned to DOS. *
1055 ; Register DS,DX,AX,CX,DI,SI destroyed. *
1056 ; Subroutines to be called: *
1060 ; /*To recognize the extended boot record, this logic will actually */ *
1061 ; /*access the boot sector even if it is a hard disk. */ *
1062 ; /*NOTE:the valid extended bpb is recognized by looking at the mediabyte*
1063 ; /*field of BPB and the extended Boot Signature. *
1066 ; Get logical drive number from BDS table; *
1067 ; RFLAG = Read operation; *
1068 ; BOOT_IO; /*Get the media boot record into the buffer*/ *
1069 ; IF (no error) THEN *
1070 ; IF (extended boot record) THEN *
1071 ; { set Volume Label, Volume Serial number and System id *
1072 ; of the Request packet to those of the boot record; *
1074 ; ELSE /*Not an extended BPB */ *
1075 ; { set Register AL to "Unknown media.." error code; *
1079 ; Exit; /*Already error code is set in the register AL*
1081 ; Expected LOC: 40 (New) *
1082 ;*******************************************************************************
1084 GetMediaID proc near ;AN000;
1085 call Changeline_Chk ;AN010;
1086 mov al, DS:[DI].DRIVELET ;AN000; logical drive number
1087 mov cs:RFlag, ROMREAD ;AN000; read operation
1088 call Boot_IO ;AN000; read boot sector into cs:DiskSector
1091 mov cl, cs:MediaByte ;AN000; Mediabyte in BPB
1092 and cl, 0F0h ;AN000;
1093 cmp cl, 0F0h ;AN000; Is it a valid BPB?
1096 cmp cs:Ext_Boot_Sig, EXT_BOOT_SIGNATURE ;AN000; =90h
1097 ; $IF E ;AN000; Extended Boot Record
1101 mov si, offset Boot_Serial_L ;AN000;
1103 add di, MI_SERIAL ;AN000;
1104 mov cx, BOOT_SERIAL_SIZE+BOOT_VOLUME_LABEL_SIZE+BOOT_SYSTEM_ID_SIZE
1107 JMP SHORT $IOCTL$EN2
1109 mov al, ERROR_UNKNOWN_MEDIA ;AN000; =7
1111 ; $ENDIF ;End Extended Boot Record check.
1113 ; $ENDIF ;Read boot sector failed. Hard error.
1118 ;******************************************************************************
1119 ;AN000; Set Media ID
1120 ;*******************************************************************************
1122 ; Function: Set the volume label, the system id and the serial number of *
1123 ; the media that has the extended boot record. *
1124 ; For the conventional media, this routine will return "Unknown *
1125 ; media.." error to DOS. *
1126 ; This routine will also set the corresponding informations in *
1129 ; Input : DS:DI -> BDS table for this drive. *
1130 ; ES:BX -> Request packet (= A_Media_ID_INFO structure) *
1132 ; Output: The extended boot record in the media will be set according to *
1133 ; the Request packet. *
1134 ; If carry set, then AL contains the device driver error number *
1135 ; that will be returned to DOS. *
1137 ; Subroutines to be called: *
1144 ; Get Drive_Number from BDS; *
1145 ; RFLAG = "Read operation"; *
1147 ; IF (no error) THEN *
1148 ; IF (extended boot record) THEN *
1149 ; { set Volume Label, Volume Serial number and System id *
1150 ; of the boot record to those of the Request packet; *
1151 ; RFLAG = "Write operation"; *
1152 ; Get Drive Number from BDS; *
1153 ; BOOT_IO; /*Write it back*/ *
1155 ; ELSE /*Not an extended BPB */ *
1156 ; { set Register AL to "Unknown media.." error code; *
1158 ; Exit; /*Return back to caller */ *
1161 ; Exit; /*Already error code is set */ *
1163 ; Expected LOC: 45 (New) *
1164 ;*******************************************************************************
1166 SetMediaID proc near
1167 call Changeline_Chk ;AN010;
1168 mov al, DS:[DI].DRIVELET ;AN000; logical drive number
1169 mov dl, al ;AN000; save it for the time being.
1170 mov cs:RFlag, ROMREAD ;AN000; read operation
1171 push dx ;AN000; save drive number
1172 call Boot_IO ;AN000; read boot sector into cs:DiskSector
1173 pop dx ;AN000; restore drive number
1176 mov cl, cs:MediaByte ;AN000; Mediabyte in BPB
1177 and cl, 0F0h ;AN000;
1178 cmp cl, 0F0h ;AN000; Is it a valid BPB?
1181 cmp cs:Ext_Boot_Sig, EXT_BOOT_SIGNATURE ;AN000; =41 (=29h)
1182 ; $IF E ;AN000; Extended Boot Record
1184 push ds ;AN011; save BDS pointer
1187 pop ds ;AN000;Now DS-> Request packet
1189 pop es ;AN000;Now ES -> Boot Record
1190 mov di, offset Boot_Serial_L ;AN000;
1192 add si, MI_Serial ;AN000;
1193 mov cx, BOOT_SERIAL_SIZE+BOOT_VOLUME_LABEL_SIZE+BOOT_SYSTEM_ID_SIZE
1195 pop di ;AN011;Restore BDS pointer
1197 call Mov_Media_IDs ;AN011; Update the BDS media ID info.
1198 mov al, dl ;AN000; set drive number for Boot_IO
1199 mov cs:RFlag, ROMWRITE ;AN000;
1200 call Boot_IO ;AN000; write it back.
1201 mov cs:[TIM_DRV], -1 ;AN011; Make sure chk$media check the driver
1203 JMP SHORT $IOCTL$EN7
1205 mov al, ERROR_UNKNOWN_MEDIA ;AN000; =7
1207 ; $ENDIF ;End Extended Boot Record check.
1209 ; $ENDIF ;Read boot sector failed. Hard error.
1214 ;******************************************************************************
1216 ;*******************************************************************************
1218 ; Function: Read/Write the boot record into Boot sector. *
1221 ; AL=logical drive number *
1222 ; RFLAG = operation (read/write) *
1224 ; Output: For read operation, the boot record of the drive specified in BDS *
1225 ; be read into the DISKSECTOR buffer. *
1226 ; For write operation, the DISKSECTOR buffer image will be written *
1227 ; to the drive specified in BDS. *
1228 ; If carry set, then AL contains the device driver error number *
1229 ; that will be returned to DOS. *
1230 ; AX,CX,DX register destroyed. *
1231 ; If carry set, then AL will contain the error code from DISKIO. *
1233 ; Subroutines to be called: *
1239 ; First_Sector = 0; /*logical sector 0 is the boot sector */ *
1240 ; SectorCount = 1; /*read 1 sector only */ *
1241 ; Buffer = DISKSECTOR; /*read it into the disksector buffer */ *
1242 ; Call DISKIO (RFLAG, Drive_Number,First_Sector,SectorCount,Buffer); *
1244 ; Expected LOC: 6 (New) *
1245 ;*******************************************************************************
1246 Boot_IO proc near ;AN000;
1251 ;SB34IOCTL003**************************************************************
1252 ;SB Call DISKIO to read/write the boot sector. The parameters which
1253 ;SB need to be initialised for this subroutine out here are
1254 ;SB - transfer address to cs:DiskSector
1255 ;SB - low sector needs to be initalised to 0. This is a reg. param
1256 ;SB - hi sector in cs:[Start_Sec_H] needs to be initialised to 0.
1257 ;SB - number of sectors <-- 1
1263 mov di, offset DiskSector ;es:di -> transfer address
1264 xor dx, dx ;first sector (H) -> 0
1265 mov [Start_Sec_H], dx ;start sector (H) -> 0
1266 mov cx, 01 ;one sector
1268 ;SB34IOCTL003**************************************************************
1274 Boot_IO endp ;AN000;
1276 ;*******************************************************************************
1277 ;AN010; Changeline_Chk
1278 ;*******************************************************************************
1279 ;When the user calls Get/Set media ID call before DOS establishes the media *
1280 ;by calling "Media$Chk", the change line activity of the drive is going to be *
1281 ;lost. This routine will check the change line activity and will save the *
1282 ;history in the flags. *
1284 ; Function: Check the change line error activity *
1286 ; Input : DS:DI -> BDS table. *
1288 ; Output: FLAG in BDS table will be updated if change line occurs. *
1290 ; Subroutines to be called: *
1293 ;*******************************************************************************
1294 Changeline_Chk proc near ;AN010;
1295 mov dl, byte ptr ds:[di].DRIVENUM ;AN010;
1296 or dl, dl ;AN010;Fixed disk?
1297 js Chln_Chk_Ret ;AN010;Yes, skip it.
1298 cmp cs:[fHave96], 1 ;AN011;This ROM support change line?
1299 jne Chln_Chk_Ret ;AN011;
1300 call HasChange ;AN011;This drive support change line?
1301 jz Chln_Chk_Ret ;AN011;do nothing
1302 ;SB34IOCTL004*****************************************************************
1303 ;SB Execute the ROM disk interrupt to check changeline activity. 2 LOCS
1307 ;SB34IOCTL004*****************************************************************
1308 jnc Chln_Chk_Ret ;AN010;no change line activity?
1309 mov word ptr cs:[FLAGBITS], FCHANGED ;AN010;
1310 call SET_CHANGED_DL ;AN010;Update FLAG in BDS for this physical drive
1311 Chln_Chk_Ret: ;AN010;
1313 Changeline_Chk endp ;AN010;
1315 ;******************************************************************************
1316 ;AN007; GetAccessFlag
1317 ;*******************************************************************************
1319 ; Function: Get the status of UNFORMATTED_MEDIA bit of FLAGS in BDS table *
1322 ; es:bx -> A_DISKACCESS_CONTROL structure *
1323 ; ds:di -> BDS table *
1325 ; Output: A_DISKACCESS_CONTROL.DAC_ACCESS_FLAG = 0 if disk I/O not allowed. *
1326 ; = 1 if disk I/O allowed. *
1327 ;*******************************************************************************
1328 GetAccessFlag proc ;AN007;
1329 test word ptr ds:[di].FLAGS, UNFORMATTED_MEDIA ;AN007;Is it unformtted media?
1330 jz GAF_Allowed ;AN007;No, formatted media
1331 mov es:[bx].DAC_ACCESS_FLAG, 0 ;AN007;
1332 jmp short GAF_Done ;AN007;
1333 GAF_Allowed: ;AN007;
1334 mov es:[bx].DAC_ACCESS_FLAG, 1 ;AN007;
1337 GetAccessFlag endp ;AN007;
1339 ;******************************************************************************
1340 ;AN007; SetAccessFlag
1341 ;*******************************************************************************
1343 ; Function: Set/Reset the UNFORMATTED_MEDIA bit of FLAGS in BDS table *
1346 ; es:bx -> A_DISKACCESS_CONTROL structure *
1347 ; ds:di -> BDS table *
1349 ; Output: UNFORMTTED_MEDIA bit modified according to the user request *
1350 ;*******************************************************************************
1351 SetAccessFlag proc ;AN007;
1352 cmp es:[bx].DAC_ACCESS_FLAG, 0 ;AN007;
1353 jne SAF_Allow_Access ;AN007;
1354 or word ptr ds:[di].FLAGS, UNFORMATTED_MEDIA ;AN007;
1355 jmp short SAF_Done ;AN007;
1356 SAF_Allow_Access: ;AN007;
1357 and word ptr ds:[di].FLAGS, not UNFORMATTED_MEDIA ;AN007;
1360 SetAccessFlag endp ;AN007;