2 ;==============================================================================
4 ;AN000 - New for DOS Version 4.00 - J.K.
5 ;AC000 - Changed for DOS Version 4.00 - J.K.
6 ;AN00x - PTM number for DOS Version 4.00 - J.K.
7 ;==============================================================================
8 ;AN001 - p2781 Changeline error behavior incompatibile with DOS 3.3 1/06/88 J.K.
9 ;==============================================================================
11 ; DISK OPEN/CLOSE ROUTINES ARR 2.41
17 MESSAGE FTESTDISK,<"DISK OPEN ">
19 MESSAGE FTESTDISK,<CR,LF>
21 CALL SETDRIVE ;GET BDS FOR DRIVE
22 INC WORD PTR DS:[DI].OPCNT
28 MESSAGE FTESTDISK,<"DISK CLOSE ">
30 MESSAGE FTESTDISK,<CR,LF>
32 CALL SETDRIVE ;GET BDS FOR DRIVE
33 CMP WORD PTR DS:[DI].OPCNT,0
34 JZ EXITJX ; WATCH OUT FOR WRAP ARR 2.41
35 DEC WORD PTR DS:[DI].OPCNT
39 ; INPUT : DS:DI POINTS TO CURRENT BDS FOR DRIVE.
40 ; RETURN : ZERO SET IF NO OPEN FILES
41 ; ZERO RESET IF OPEN FILES
43 MESSAGE FTEST96,<"CHECK OPEN COUNT ">
45 MESSAGE FTEST96,<CR,LF>
46 CMP WORD PTR DS:[DI].OPCNT,0
50 ; AT MEDIA CHECK TIME, WE NEED TO REALLY GET DOWN AND CHECK WHAT THE CHANGE IS.
51 ; THIS IS GUARANTEED TO BE EXPENSIVE.
55 CALL CHECKSINGLE ; MAKE SURE CORRECT DISK IS IN PLACE
63 ;SB33001****************************************************************
64 mov DL, DS:[DI.drivenum] ;SB ; set logical drive number ;3.30*
65 mov AH, 16h ;SB ; get changeline status ;3.30*
66 int 13h ;SB ; call rom diskette routine ;3.30*
67 ;SB33001****************************************************************
71 MOV SI,1 ; SIGNAL NO CHANGE
72 ; THERE ARE SOME DRIVES WITH CHANGELINE THAT "LOSE" THE CHANGELINE INDICATION
73 ; IF A DIFFERENT DRIVE IS ACCESSED AFTER THE CURRENT ONE. IN ORDER TO AVOID
74 ; MISSING A MEDIA CHANGE, WE RETURN AN "I DON'T KNOW" TO DOS IF THE CHANGELINE
75 ; IS NOT ACTIVE AND WE ARE ACCESSING A DIFFERENT DRIVE FROM THE LAST ONE.
76 ; IF WE ARE ACCESSING THE SAME DRIVE, THEN WE CAN SAFELY RELY ON THE CHANGELINE
80 MOV BL,CS:[TIM_DRV] ; GET LAST DRIVE ACCESSED
81 CMP BYTE PTR [DI].DRIVENUM,BL
83 ; DO THE 2 SECOND TWIDDLE. IF TIME >= 2 SECONDS, DO A VOLID CHECK.
84 ; OTHERWISE RETURN "I DON'T KNOW" (STRICTLY SPEAKING, WE SHOULD RETURN A
85 ; "NOT CHANGED" HERE SINCE THE 2 SECOND TEST SAID NO CHANGE.) - RS.
87 CALL CHECK_TIME_OF_ACCESS
90 JZ MEDIADOVOLID ; CHECK_TIME SAYS ">= 2 SECS PASSED"
91 XOR SI,SI ; RETURN "I DON'T KNOW"
96 ; SOMEHOW THE MEDIA WAS CHANGED. LOOK AT VID TO SEE. WE DO NOT LOOK AT FAT
97 ; BECAUSE THIS MAY BE DIFFERENT SINCE WE ONLY SET MEDBYT WHEN DOING A READ
101 CALL GETBP ; BUILD A NEW BPB IN CURRENT BDS
105 CALL MAPERROR ; FIX UP AL FOR RETURN TO DOS
108 ; SIMPLE, QUICK CHECK OF LATCHED CHANGE. IF NO INDICATION, THEN RETURN
109 ; OTHERWISE DO EXPENSIVE CHECK. IF THE EXPENSIVE TEST FAILS, POP OFF THE
110 ; RETURN AND SET AL = 15 (FOR INVALID MEDIA CHANGE) WHICH WILL BE RETURNED TO
112 ;J.K. 9/16/86 For DOS 3.3, this will work only for the drive that has
113 ;J.K. 9/16/86 changeline.
116 ; IF RETURNING FAKE BPB THEN ASSUME THE DISK HAS NOT CHANGED
117 ; TEST WORD PTR DS:[DI].FLAGS, RETURN_FAKE_BPB
120 ; call HasChange ;change line supported?
121 ; jz CheckRet ;No. Just return
127 ; CHECK FOR PAST ROM INDICATIONS. IF NO ROM CHANGE INDICATED, THEN RETURN OK.
132 JZ CHECKRET ; NO CHANGE
134 ; WE NOW SEE THAT A CHANGE LINE HAS BEEN SEEN IN THE PAST. LET'S DO THE
135 ; EXPENSIVE VERIFICATION.
137 MESSAGE FTEST96,<"CHECKROMCHANGE SAYS YES...",CR,LF>
138 CALL GETBP ; BUILD BPB IN CURRENT BDS
139 JC RET_NO_ERROR_MAP ; GETBP HAS ALREADY CALLED MAPERROR
141 JC CHECKLATCHRET ; DISK ERROR TRYING TO READ IN.
142 OR SI,SI ; IS CHANGED FOR SURE?
146 CALL MAPERROR ; FIX UP AL FOR RETURN TO DOS
149 POP SI ; POP OFF RETURN ADDRESS
153 ; CHECK THE FAT AND THE VID. RETURN IN DI -1 OR 0. RETURN WITH CARRY SET
154 ; ONLY IF THERE WAS A DISK ERROR. RETURN THAT ERROR CODE IN AX.
158 MESSAGE FTEST96,<"CHECK FAT",CR,LF>
163 ; THE FAT WAS THE SAME. HOW ABOUT THE VOLUME ID?
166 ;J.K. Now with the extended BOOT record, the logic should be enhanced.
167 ;If it is the extended BOOT record, then we check the volume serial
168 ;number instead of volume id. If it is different, then set SI to -1.
169 ;If it is same, then SI= 1 (No change).
170 ;If it is not the extended BOOT record, then just follows the old
171 ;logic. DOS 4.00 will check if the # of FAT in the boot record BPB
172 ;is not 0. If it is 0 then it must be Non_FAT based system and
173 ;should have already covered by extended boot structure checking.
174 ;So, we will return "I don't know" by setting SI to 0.
175 ;This routine assume the newest valid boot record is in CS:[DISKSECTOR].
176 ;(This will be gauranteed by a successful GETBP call right before this
178 MESSAGE FTEST96,<"CHECK VID",CR,LF>
179 ;SB34MS96TPI001*********************************************************
180 ;SB check the EXT_Boot_Sig variable for the Extended boot signature
181 ;SB if it is set then go to do the extended ID check otherwise continue
185 cmp cs:[Ext_Boot_Sig],Ext_Boot_Signature
187 ;SB34MS96TPI001*********************************************************
188 call HasChange ;AN000;
191 xor si,si ;AN000; assume I don't know.
192 cmp byte ptr cs:[SECPERCLUSINSECTOR]+3,0 ;AN000; Don't read vol id from
193 je CHECKFATRET ;AN000; the directory if not FAT system
199 MESSAGE FTEST96,<"VID NOT CHANGED",CR,LF>
207 MOV CS:[TIM_DRV],-1 ; ENSURE THAT WE ASK ROM FOR MEDIA
208 RET ; CHECK NEXT TIME ROUND
212 Do_Ext_Check_ID: ;AN000;
214 ;SB34MS96TPI002**************************************************************
215 ;SB The code to check extended ID is basically a check to see if the
216 ;Sb volume serial number is still the same. The volume serial number
217 ;SB previously read is in cs:[Boot_Serial_H] and cs:[Boot_Serial_L]
218 ;SB high and low words respectively. DS:DI points to the BDS of the
219 ;SB drive under consideration. The BDS has fields containing the
220 ;SB high and low words of the volume serial number of the media in the
221 ;SB drive. Compare these fields to the fields mentioned above. If these
222 ;SB fields do not match the media has changed and so we should jump
223 ;SB to the code starting at Ext_Changed else return "I don't know" status
224 ;SB in the register used for the changeline status and continue executing
225 ;SB the code given below. For temporary storage use the register which
226 ;SB has been saved and restored around this block.
228 ;SB BDS fields in inc\msbds.inc
230 mov ax,cs:[Boot_Serial_L]
231 cmp ax,word ptr ds:[di+VOL_SERIAL]
233 mov ax,cs:[Boot_Serial_H]
234 cmp ax,word ptr ds:[di+VOL_SERIAL+2]
236 xor si,si ; don't know
238 ;SB34MS96TPI002**************************************************************
240 ; jmp CheckFatRet ;AN000;
241 jmp VID_NO_Changed ;AN001;Reset the flag
242 Ext_Changed: ;AN000; Serial number is different!
244 mov si, -1 ;AN000; disk changed!
245 clc ;AN000; clear carry. Only SI is meaningful here.
246 jmp Changed_Drv ;AN000;
249 ; AT I/O TIME, WE DETECTED THE ERROR. NOW WE NEED TO DETERMINE WHETHER THE
250 ; MEDIA WAS TRULY CHANGED OR NOT. WE RETURN NORMALLY IF MEDIA CHANGE UNKNOWN.
251 ; AND WE POP OFF THE CALL AND JMP TO HARDERR IF WE SEE AN ERROR.
258 JZ CHECKFATRET ; NO OPEN FILES
259 ; IF RETURNING FAKE BPB THEN IGNORE DISK CHANGES
260 ; TEST WORD PTR DS:[DI].FLAGS, RETURN_FAKE_BPB
262 CALL GETBP ; BUILD UP A NEW BPB IN CURRENT BDS
263 JC NO_ERROR_MAP ; GETBP HAS ALREADY CALLED MAPERROR
265 JC CHECKIORET ; DISK ERROR TRYING TO READ IN.
266 OR SI,SI ; IS CHANGED FOR SURE?
267 JS CHECKIOERR ; YES CHANGED
269 INC BP ; ALLOW A RETRY
274 ; POP SI ; POP OFF RETURN
275 STC ; MAKE SURE CARRY GETS PASSED THROUGH
281 ; RETURN VID SETS UP THE VID FOR A RETURN TO DOS.
285 MESSAGE FTEST96,<"RETURN VID",CR,LF>
286 PUSH DS ; SAVE POINTER TO CURRENT BDS
289 CALL INIT_VID_LOOP ; SETS ES:DI -> VID
294 POP DI ; RESTORE CURRENT BDS
296 MOV AH,6 ; INVALID MEDIA CHANGE
301 ; MUNGE THE TIME OF LAST SUCCESSFUL ACCESS FOR TWEEKED DRIVES
303 ; DON'T NEED ANY MORE
306 ; MOV AX,WORD PTR DS:[DI].FLAGS
307 ; TEST AL,FCHANGED_BY_FORMAT
309 ; MOV CS:[TIM_DRV],-1
315 ; DRIVE IS THE LOGICAL DRIVE TO USE
317 ; FORMAT_MEDIA_CHECK: ;ARR 2.42
319 ; MOV AX,WORD PTR DS:[DI].FLAGS
320 ; TEST AL,FCHANGED_BY_FORMAT
321 ; JZ RETF1 ; MEDIA NOT CHANGED VIA FORMAT
322 ; AND AL,NOT FCHANGED_BY_FORMAT
323 ; MOV WORD PTR [DI].FLAGS,AX ; RESET CHANGED_BY_FORMAT BIT
324 ; MOV SI,-1 ; MEDIA CHANGED VIA FORMAT
330 ; MOVES THE POINTER TO THE VOLID FOR THE DRIVE INTO THE ORIGINAL REQUEST PACKET
331 ; ON ENTRY, DS:BX POINTS TO THE ORIGINAL PACKET.
332 ; NO ATTEMPT IS MADE TO PRESERVE REGISTERS.
334 MEDIA_SET_VID: ; ARR 2.42
337 CALL INIT_VID_LOOP ; SETS ES:DI -> VID
338 LDS BX,CS:[PTRSAV] ; GET POINTER TO PACKET
339 MOV WORD PTR [BX.TRANS+1],DI
340 MOV WORD PTR [BX.TRANS+3],ES
345 ; HIDENSITY - EXAMINE A DRIVE/MEDIA DESCRIPTOR TO SET THE MEDIA TYPE. IF
346 ; THE MEDIA DESCRIPTOR IS NOT F9 (NOT 96TPI OR 3 1/2), WE RETURN AND LET THE
347 ; CALLER DO THE REST. OTHERWISE, WE POP OFF THE RETURN AND JUMP TO THE TAIL
348 ; OF GETBP. FOR 3.5" MEDIA, WE JUST RETURN.
350 ; INPUTS: DS:DI POINT TO CORRECT BDS FOR THIS DRIVE
353 ; OUTPUTS: CARRY CLEAR
354 ; NO REGISTERS MODIFIED
357 ; BH = NUMBER OF ROOT DIRECTORY ENTRIES
358 ; BL = SECTORS PER TRACK
359 ; CX = NUMBER OF SECTORS
360 ; DH = SECTORS PER ALLOCATION UNIT
361 ; DL = NUMBER OF HEADS
366 ; CHECK FOR CORRECT DRIVE
368 TEST WORD PTR DS:[DI].FLAGS,FCHANGELINE ; IS IT SPECIAL?
369 JZ DOFLOPPY ; NO, DO NORMAL FLOPPY TEST
371 ; WE HAVE A MEDIA BYTE THAT IS PRETTY COMPLEX. EXAMINE DRIVE INFORMATION
372 ; TABLE TO SEE WHAT KIND IT IS.
374 CMP BYTE PTR DS:[DI].FORMFACTOR,FFSMALL; IS IT SINGLE-MEDIA?
375 JZ DOFLOPPY ; YES, USE FATID...
381 MOV AL,7 ; SEVEN SECTORS / FAT
382 MOV BX,224*256+0FH ; 224 ROOT DIR ENTRIES & 0F SECTOR MAX
383 MOV CX,80*15*2 ; 80 TRACKS, 15 SECTORS/TRACK, 2 SIDES
384 MOV DX,01*256+2 ; SECTORS/ALLOCATION UNIT & HEAD MAX
386 ADD SP,2 ; POP OFF RETURN ADDRESS
387 JMP HAS1 ; RETURN TO TAIL OF GETBP
395 ; CERTAIN BOGUS PROGRAMS AVOID DOS ALTOGETHER AND USE INT 13 DIRECTLY. THESE
396 ; PROGRAMS EVEN RETRY OPERATIONS AND, THUS, WILL IGNORE THE DISK CHANGE LOGIC.
398 ; WE HOOK INT 13 AND NOTE ALL ERRORS.
400 ASSUME DS:NOTHING,ES:NOTHING,SS:NOTHING
411 POP WORD PTR OLDINT+2
413 MESSAGE FTEST13,<"*">
415 CALL REAL13 ; SIMULATE ANOTHER INT 13
416 JC ERR13 ; DID AN ERROR OCCUR?
417 JMP OLDINT ; NO, RETURN AND POP OFF FLAGS
419 MESSAGE FTEST13,<"INT 13 ERROR ">
421 MESSAGE FTEST13,<CR,LF>
423 CMP AH,06H ; DID I SEE A CHANGE EVENT?
425 B: POPF ; NO, SOME OTHER ERROR, IGNORE IT
426 JMP OLDINT ; RETURN AND POP OFF FLAGS
427 GOTERR: OR DL,DL ; IS THIS FOR THE HARD DISK?
429 MOV WORD PTR CS:[FLAGBITS],FCHANGED
435 ; SET_CHANGED_DL - SETS FLAG BITS ACCORDING TO BITS SET IN [FLAGBITS].
436 ; ESSENTIALLY USED TO INDICATE CHANGELINE, OR FORMAT.
438 ; INPUTS: DL CONTAINS PHYSICAL DRIVE NUMBER
439 ; [FLAGBITS] CONTAINS BITS TO SET IN THE FLAG FIELD IN THE BDSS
441 ; REGISTERS MODIFIED: FLAGS
444 PUBLIC SET_CHANGED_DL
446 MESSAGE FTEST96,<"SET CHANGED",CR,LF>
451 MOV DX,CS:[FLAGBITS] ; GET BITS TO SET IN FLAG FIELD
454 ; IN THE VIRTUAL DRIVE SYSTEM WE *MUST* FLAG THE OTHER DRIVES AS BEING CHANGED
456 ; ASSUME FIRST BDS IS IN THIS SEGMENT
458 PUSH DS ; SAVE CURRENT BDS
460 LDS DI,DWORD PTR CS:[START_BDS]
464 CMP BYTE PTR [DI].DRIVENUM,BL
467 ; SOMEONE MAY COMPLAIN, BUT THIS *ALWAYS* MUST BE DONE WHEN A DISK CHANGE IS
468 ; NOTED. THERE ARE *NO* OTHER COMPROMISING CIRCUMSTANCES.
471 OR WORD PTR DS:[DI].FLAGS,DX ; SIGNAL CHANGE ON OTHER DRIVE
473 MOV AX,WORD PTR [DI].LINK+2 ; GO TO NEXT BDS
474 MOV DI,WORD PTR [DI].LINK
478 POP DI ; RESTORE CURRENT BDS
486 ; CHECKROMCHANGE - SEE IF EXTERNAL PROGRAM HAS DIDDLED ROM CHANGE LINE.
488 ; INPUTS: DS:DI POINTS TO CURRENT BDS.
489 ; OUTPUTS: ZERO SET - NO CHANGE
490 ; ZERO RESET - CHANGE
491 ; REGISTERS MODIFIED: NONE
494 MESSAGE FTEST13,<"CHECKROM ">
496 MESSAGE FTEST13,<CR,LF>
497 TEST WORD PTR [DI].FLAGS,FCHANGED
501 ; RESETCHANGED - RESTORE VALUE OF CHANGE LINE
503 ; INPUTS: DS:DI POINTS TO CURRENT BDS
505 ; REGISTERS MODIFIED: NONE
509 MESSAGE FTEST13,<"RESETCHANGED ">
511 MESSAGE FTEST13,<CR,LF>
512 AND WORD PTR DS:[DI].FLAGS,NOT FCHANGED
516 ; HASCHANGE - SEE IF DRIVE CAN SUPPLY CHANGE LINE
518 ; INPUTS: DS:DI POINTS TO CURRENT BDS
519 ; OUTPUTS: ZERO SET - NO CHANGE LINE AVAILABLE
520 ; ZERO RESET - CHANGE LINE AVAILABLE
521 ; REGISTERS MODIFIED: NONE
525 MESSAGE FTEST13,<"HASCHANGE ">
527 MESSAGE FTEST13,<CR,LF>
528 TEST WORD PTR [DI].FLAGS,FCHANGELINE