diff options
Diffstat (limited to 'v4.0/src/BIOS/MS96TPI.INC')
| -rw-r--r-- | v4.0/src/BIOS/MS96TPI.INC | 536 |
1 files changed, 536 insertions, 0 deletions
diff --git a/v4.0/src/BIOS/MS96TPI.INC b/v4.0/src/BIOS/MS96TPI.INC new file mode 100644 index 0000000..2760b00 --- /dev/null +++ b/v4.0/src/BIOS/MS96TPI.INC | |||
| @@ -0,0 +1,536 @@ | |||
| 1 | %OUT MS96TPI.INC... | ||
| 2 | ;============================================================================== | ||
| 3 | ;REVISION HISTORY: | ||
| 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 | ;============================================================================== | ||
| 10 | ; | ||
| 11 | ; DISK OPEN/CLOSE ROUTINES ARR 2.41 | ||
| 12 | ; | ||
| 13 | |||
| 14 | DSK$OPEN: ;ARR 2.41 | ||
| 15 | PUBLIC DSK$OPEN | ||
| 16 | |||
| 17 | MESSAGE FTESTDISK,<"DISK OPEN "> | ||
| 18 | MNUM FTESTDISK,AX | ||
| 19 | MESSAGE FTESTDISK,<CR,LF> | ||
| 20 | ; AL IS LOGICAL DRIVE | ||
| 21 | CALL SETDRIVE ;GET BDS FOR DRIVE | ||
| 22 | INC WORD PTR DS:[DI].OPCNT | ||
| 23 | JMP EXIT ;ARR 2.41 | ||
| 24 | |||
| 25 | DSK$CLOSE: ;ARR 2.41 | ||
| 26 | PUBLIC DSK$CLOSE | ||
| 27 | |||
| 28 | MESSAGE FTESTDISK,<"DISK CLOSE "> | ||
| 29 | MNUM FTESTDISK,AX | ||
| 30 | MESSAGE FTESTDISK,<CR,LF> | ||
| 31 | ; AL IS LOGICAL DRIVE | ||
| 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 | ||
| 36 | EXITJX: | ||
| 37 | JMP EXIT | ||
| 38 | |||
| 39 | ; INPUT : DS:DI POINTS TO CURRENT BDS FOR DRIVE. | ||
| 40 | ; RETURN : ZERO SET IF NO OPEN FILES | ||
| 41 | ; ZERO RESET IF OPEN FILES | ||
| 42 | CHKOPCNT: | ||
| 43 | MESSAGE FTEST96,<"CHECK OPEN COUNT "> | ||
| 44 | MNUM FTEST96,AX | ||
| 45 | MESSAGE FTEST96,<CR,LF> | ||
| 46 | CMP WORD PTR DS:[DI].OPCNT,0 | ||
| 47 | RET | ||
| 48 | |||
| 49 | ; | ||
| 50 | ; AT MEDIA CHECK TIME, WE NEED TO REALLY GET DOWN AND CHECK WHAT THE CHANGE IS. | ||
| 51 | ; THIS IS GUARANTEED TO BE EXPENSIVE. | ||
| 52 | ; | ||
| 53 | PUBLIC MEDIACHECK | ||
| 54 | MEDIACHECK: | ||
| 55 | CALL CHECKSINGLE ; MAKE SURE CORRECT DISK IS IN PLACE | ||
| 56 | XOR SI,SI | ||
| 57 | CALL HASCHANGE | ||
| 58 | JZ MEDIARET | ||
| 59 | CALL CHECKROMCHANGE | ||
| 60 | JNZ MEDIADOVOLID | ||
| 61 | PUSH AX | ||
| 62 | PUSH DX | ||
| 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**************************************************************** | ||
| 68 | POP DX | ||
| 69 | POP AX | ||
| 70 | JC MEDIADOVOLID | ||
| 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 | ||
| 77 | ; STATUS. | ||
| 78 | PUBLIC LOSECHNG | ||
| 79 | LOSECHNG: | ||
| 80 | MOV BL,CS:[TIM_DRV] ; GET LAST DRIVE ACCESSED | ||
| 81 | CMP BYTE PTR [DI].DRIVENUM,BL | ||
| 82 | JZ MEDIARET | ||
| 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. | ||
| 86 | SAVEREG <AX,CX,DX> | ||
| 87 | CALL CHECK_TIME_OF_ACCESS | ||
| 88 | RESTOREREG <DX,CX,AX> | ||
| 89 | OR SI,SI | ||
| 90 | JZ MEDIADOVOLID ; CHECK_TIME SAYS ">= 2 SECS PASSED" | ||
| 91 | XOR SI,SI ; RETURN "I DON'T KNOW" | ||
| 92 | PUBLIC MEDIARET | ||
| 93 | MEDIARET: | ||
| 94 | RET | ||
| 95 | ; | ||
| 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 | ||
| 98 | ; OR WRITE. | ||
| 99 | ; | ||
| 100 | MEDIADOVOLID: | ||
| 101 | CALL GETBP ; BUILD A NEW BPB IN CURRENT BDS | ||
| 102 | JC MEDIARET | ||
| 103 | CALL CHECK_VID | ||
| 104 | JNC MEDIARET | ||
| 105 | CALL MAPERROR ; FIX UP AL FOR RETURN TO DOS | ||
| 106 | RET | ||
| 107 | ; | ||
| 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 | ||
| 111 | ; DOS. | ||
| 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. | ||
| 114 | PUBLIC CHECKLATCHIO | ||
| 115 | CHECKLATCHIO: | ||
| 116 | ; IF RETURNING FAKE BPB THEN ASSUME THE DISK HAS NOT CHANGED | ||
| 117 | ; TEST WORD PTR DS:[DI].FLAGS, RETURN_FAKE_BPB | ||
| 118 | ; JNZ CHECKRET | ||
| 119 | ;J.K. 9/16/86 | ||
| 120 | ; call HasChange ;change line supported? | ||
| 121 | ; jz CheckRet ;No. Just return | ||
| 122 | CALL CHKOPCNT | ||
| 123 | JNZ CHECKROM | ||
| 124 | CHECKRET: | ||
| 125 | RET | ||
| 126 | ; | ||
| 127 | ; CHECK FOR PAST ROM INDICATIONS. IF NO ROM CHANGE INDICATED, THEN RETURN OK. | ||
| 128 | ; | ||
| 129 | PUBLIC CHECKROM | ||
| 130 | CHECKROM: | ||
| 131 | CALL CHECKROMCHANGE | ||
| 132 | JZ CHECKRET ; NO CHANGE | ||
| 133 | ; | ||
| 134 | ; WE NOW SEE THAT A CHANGE LINE HAS BEEN SEEN IN THE PAST. LET'S DO THE | ||
| 135 | ; EXPENSIVE VERIFICATION. | ||
| 136 | ; | ||
| 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 | ||
| 140 | CALL CHECK_VID | ||
| 141 | JC CHECKLATCHRET ; DISK ERROR TRYING TO READ IN. | ||
| 142 | OR SI,SI ; IS CHANGED FOR SURE? | ||
| 143 | JNS CHECKRET | ||
| 144 | CALL RETURNVID | ||
| 145 | CHECKLATCHRET: | ||
| 146 | CALL MAPERROR ; FIX UP AL FOR RETURN TO DOS | ||
| 147 | RET_NO_ERROR_MAP: | ||
| 148 | STC | ||
| 149 | POP SI ; POP OFF RETURN ADDRESS | ||
| 150 | RET | ||
| 151 | |||
| 152 | ; | ||
| 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. | ||
| 155 | ; | ||
| 156 | PUBLIC CHECKFATVID | ||
| 157 | CHECKFATVID: | ||
| 158 | MESSAGE FTEST96,<"CHECK FAT",CR,LF> | ||
| 159 | CALL FAT_CHECK | ||
| 160 | OR SI,SI | ||
| 161 | JS CHANGED_DRV | ||
| 162 | ; | ||
| 163 | ; THE FAT WAS THE SAME. HOW ABOUT THE VOLUME ID? | ||
| 164 | ; | ||
| 165 | CHECK_VID: | ||
| 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 | ||
| 177 | ;routine.) | ||
| 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 | ||
| 182 | ;SB with code below | ||
| 183 | ;SB 2 LOCS | ||
| 184 | |||
| 185 | cmp cs:[Ext_Boot_Sig],Ext_Boot_Signature | ||
| 186 | jz Do_Ext_Check_Id | ||
| 187 | ;SB34MS96TPI001********************************************************* | ||
| 188 | call HasChange ;AN000; | ||
| 189 | jz CheckRet ;AN000; | ||
| 190 | |||
| 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 | ||
| 194 | CALL READ_VOLUME_ID | ||
| 195 | JC CHECKFATRET | ||
| 196 | CALL CHECK_VOLUME_ID | ||
| 197 | OR SI,SI | ||
| 198 | JNZ CHANGED_DRV | ||
| 199 | MESSAGE FTEST96,<"VID NOT CHANGED",CR,LF> | ||
| 200 | |||
| 201 | VID_NO_Changed: | ||
| 202 | CALL RESETCHANGED | ||
| 203 | clc ;AN000; | ||
| 204 | CHECKFATRET: | ||
| 205 | RET | ||
| 206 | CHANGED_DRV: | ||
| 207 | MOV CS:[TIM_DRV],-1 ; ENSURE THAT WE ASK ROM FOR MEDIA | ||
| 208 | RET ; CHECK NEXT TIME ROUND | ||
| 209 | ; | ||
| 210 | ; extended ID check | ||
| 211 | ; | ||
| 212 | Do_Ext_Check_ID: ;AN000; | ||
| 213 | push ax ;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. | ||
| 227 | ;SB 7 LOCS | ||
| 228 | ;SB BDS fields in inc\msbds.inc | ||
| 229 | |||
| 230 | mov ax,cs:[Boot_Serial_L] | ||
| 231 | cmp ax,word ptr ds:[di+VOL_SERIAL] | ||
| 232 | jnz Ext_Changed | ||
| 233 | mov ax,cs:[Boot_Serial_H] | ||
| 234 | cmp ax,word ptr ds:[di+VOL_SERIAL+2] | ||
| 235 | jnz Ext_Changed | ||
| 236 | xor si,si ; don't know | ||
| 237 | |||
| 238 | ;SB34MS96TPI002************************************************************** | ||
| 239 | pop ax ;AN000; | ||
| 240 | ; jmp CheckFatRet ;AN000; | ||
| 241 | jmp VID_NO_Changed ;AN001;Reset the flag | ||
| 242 | Ext_Changed: ;AN000; Serial number is different! | ||
| 243 | pop ax ;AN000; | ||
| 244 | mov si, -1 ;AN000; disk changed! | ||
| 245 | clc ;AN000; clear carry. Only SI is meaningful here. | ||
| 246 | jmp Changed_Drv ;AN000; | ||
| 247 | |||
| 248 | ; | ||
| 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. | ||
| 252 | ; | ||
| 253 | PUBLIC CHECKIO | ||
| 254 | CHECKIO: | ||
| 255 | CMP AH,06 | ||
| 256 | JNZ CHECKFATRET | ||
| 257 | CALL CHKOPCNT | ||
| 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 | ||
| 261 | ; JNZ IGNORECHANGE | ||
| 262 | CALL GETBP ; BUILD UP A NEW BPB IN CURRENT BDS | ||
| 263 | JC NO_ERROR_MAP ; GETBP HAS ALREADY CALLED MAPERROR | ||
| 264 | CALL CHECKFATVID | ||
| 265 | JC CHECKIORET ; DISK ERROR TRYING TO READ IN. | ||
| 266 | OR SI,SI ; IS CHANGED FOR SURE? | ||
| 267 | JS CHECKIOERR ; YES CHANGED | ||
| 268 | IGNORECHANGE: | ||
| 269 | INC BP ; ALLOW A RETRY | ||
| 270 | RET | ||
| 271 | CHECKIOERR: | ||
| 272 | CALL RETURNVID | ||
| 273 | CHECKIORET: | ||
| 274 | ; POP SI ; POP OFF RETURN | ||
| 275 | STC ; MAKE SURE CARRY GETS PASSED THROUGH | ||
| 276 | JMP HARDERR | ||
| 277 | |||
| 278 | NO_ERROR_MAP: | ||
| 279 | JMP HARDERR2 | ||
| 280 | ; | ||
| 281 | ; RETURN VID SETS UP THE VID FOR A RETURN TO DOS. | ||
| 282 | ; | ||
| 283 | PUBLIC RETURNVID | ||
| 284 | RETURNVID: | ||
| 285 | MESSAGE FTEST96,<"RETURN VID",CR,LF> | ||
| 286 | PUSH DS ; SAVE POINTER TO CURRENT BDS | ||
| 287 | PUSH DI | ||
| 288 | PUSH CX | ||
| 289 | CALL INIT_VID_LOOP ; SETS ES:DI -> VID | ||
| 290 | LDS BX,CS:[PTRSAV] | ||
| 291 | MOV [BX.EXTRA],DI | ||
| 292 | MOV [BX.EXTRA+2],ES | ||
| 293 | POP CX | ||
| 294 | POP DI ; RESTORE CURRENT BDS | ||
| 295 | POP DS | ||
| 296 | MOV AH,6 ; INVALID MEDIA CHANGE | ||
| 297 | STC | ||
| 298 | RET | ||
| 299 | |||
| 300 | ; | ||
| 301 | ; MUNGE THE TIME OF LAST SUCCESSFUL ACCESS FOR TWEEKED DRIVES | ||
| 302 | ; | ||
| 303 | ; DON'T NEED ANY MORE | ||
| 304 | ; TWEEKCHECK: | ||
| 305 | ; PUSH AX | ||
| 306 | ; MOV AX,WORD PTR DS:[DI].FLAGS | ||
| 307 | ; TEST AL,FCHANGED_BY_FORMAT | ||
| 308 | ; JZ TWEEKDONE | ||
| 309 | ; MOV CS:[TIM_DRV],-1 | ||
| 310 | ; TWEEKDONE: | ||
| 311 | ; POP AX | ||
| 312 | ; RET | ||
| 313 | |||
| 314 | ; | ||
| 315 | ; DRIVE IS THE LOGICAL DRIVE TO USE | ||
| 316 | ; | ||
| 317 | ; FORMAT_MEDIA_CHECK: ;ARR 2.42 | ||
| 318 | ; PUSH AX | ||
| 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 | ||
| 325 | ; RETF1: | ||
| 326 | ; POP AX | ||
| 327 | ; RET | ||
| 328 | |||
| 329 | ; | ||
| 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. | ||
| 333 | ; | ||
| 334 | MEDIA_SET_VID: ; ARR 2.42 | ||
| 335 | PUBLIC MEDIA_SET_VID | ||
| 336 | |||
| 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 | ||
| 341 | RET | ||
| 342 | |||
| 343 | |||
| 344 | ; | ||
| 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. | ||
| 349 | ; | ||
| 350 | ; INPUTS: DS:DI POINT TO CORRECT BDS FOR THIS DRIVE | ||
| 351 | ; AH HAS MEDIA BYTE | ||
| 352 | ; | ||
| 353 | ; OUTPUTS: CARRY CLEAR | ||
| 354 | ; NO REGISTERS MODIFIED | ||
| 355 | ; CARRY SET | ||
| 356 | ; AL = SECTORS/FAT | ||
| 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 | ||
| 362 | ; | ||
| 363 | HIDENSITY: | ||
| 364 | PUBLIC HIDENSITY | ||
| 365 | ; | ||
| 366 | ; CHECK FOR CORRECT DRIVE | ||
| 367 | ; | ||
| 368 | TEST WORD PTR DS:[DI].FLAGS,FCHANGELINE ; IS IT SPECIAL? | ||
| 369 | JZ DOFLOPPY ; NO, DO NORMAL FLOPPY TEST | ||
| 370 | ; | ||
| 371 | ; WE HAVE A MEDIA BYTE THAT IS PRETTY COMPLEX. EXAMINE DRIVE INFORMATION | ||
| 372 | ; TABLE TO SEE WHAT KIND IT IS. | ||
| 373 | ; | ||
| 374 | CMP BYTE PTR DS:[DI].FORMFACTOR,FFSMALL; IS IT SINGLE-MEDIA? | ||
| 375 | JZ DOFLOPPY ; YES, USE FATID... | ||
| 376 | ; | ||
| 377 | ; 96 TPI DRIVE | ||
| 378 | ; | ||
| 379 | CMP AH,0F9H | ||
| 380 | JNZ DOFLOPPY | ||
| 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 | ||
| 385 | POPR: | ||
| 386 | ADD SP,2 ; POP OFF RETURN ADDRESS | ||
| 387 | JMP HAS1 ; RETURN TO TAIL OF GETBP | ||
| 388 | |||
| 389 | DOFLOPPY: | ||
| 390 | RET | ||
| 391 | |||
| 392 | PATHSTART 001,TPI96 | ||
| 393 | |||
| 394 | ; | ||
| 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. | ||
| 397 | ; | ||
| 398 | ; WE HOOK INT 13 AND NOTE ALL ERRORS. | ||
| 399 | ; | ||
| 400 | ASSUME DS:NOTHING,ES:NOTHING,SS:NOTHING | ||
| 401 | PUBLIC REAL13 | ||
| 402 | REAL13 DD ? | ||
| 403 | OLDINT DD ? | ||
| 404 | DMY DW ? | ||
| 405 | |||
| 406 | PATHEND 001,TPI96 | ||
| 407 | |||
| 408 | PUBLIC INT13 | ||
| 409 | INT13 PROC FAR | ||
| 410 | POP WORD PTR OLDINT | ||
| 411 | POP WORD PTR OLDINT+2 | ||
| 412 | POP DMY | ||
| 413 | MESSAGE FTEST13,<"*"> | ||
| 414 | PUSHF | ||
| 415 | CALL REAL13 ; SIMULATE ANOTHER INT 13 | ||
| 416 | JC ERR13 ; DID AN ERROR OCCUR? | ||
| 417 | JMP OLDINT ; NO, RETURN AND POP OFF FLAGS | ||
| 418 | ERR13: | ||
| 419 | MESSAGE FTEST13,<"INT 13 ERROR "> | ||
| 420 | MNUM FTEST13,AX | ||
| 421 | MESSAGE FTEST13,<CR,LF> | ||
| 422 | PUSHF ; SAVE STATE | ||
| 423 | CMP AH,06H ; DID I SEE A CHANGE EVENT? | ||
| 424 | JZ GOTERR ; YES | ||
| 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? | ||
| 428 | JS B ; YES, IGNORE | ||
| 429 | MOV WORD PTR CS:[FLAGBITS],FCHANGED | ||
| 430 | CALL SET_CHANGED_DL | ||
| 431 | JMP B | ||
| 432 | INT13 ENDP | ||
| 433 | |||
| 434 | ; | ||
| 435 | ; SET_CHANGED_DL - SETS FLAG BITS ACCORDING TO BITS SET IN [FLAGBITS]. | ||
| 436 | ; ESSENTIALLY USED TO INDICATE CHANGELINE, OR FORMAT. | ||
| 437 | ; | ||
| 438 | ; INPUTS: DL CONTAINS PHYSICAL DRIVE NUMBER | ||
| 439 | ; [FLAGBITS] CONTAINS BITS TO SET IN THE FLAG FIELD IN THE BDSS | ||
| 440 | ; OUTPUTS: NONE | ||
| 441 | ; REGISTERS MODIFIED: FLAGS | ||
| 442 | ; | ||
| 443 | SET_CHANGED_DL: | ||
| 444 | PUBLIC SET_CHANGED_DL | ||
| 445 | |||
| 446 | MESSAGE FTEST96,<"SET CHANGED",CR,LF> | ||
| 447 | PUSH BX | ||
| 448 | PUSH DX | ||
| 449 | MOV BL,DL | ||
| 450 | ALL_SET: | ||
| 451 | MOV DX,CS:[FLAGBITS] ; GET BITS TO SET IN FLAG FIELD | ||
| 452 | XOR BH,BH | ||
| 453 | ; | ||
| 454 | ; IN THE VIRTUAL DRIVE SYSTEM WE *MUST* FLAG THE OTHER DRIVES AS BEING CHANGED | ||
| 455 | ; | ||
| 456 | ; ASSUME FIRST BDS IS IN THIS SEGMENT | ||
| 457 | PUSH AX | ||
| 458 | PUSH DS ; SAVE CURRENT BDS | ||
| 459 | PUSH DI | ||
| 460 | LDS DI,DWORD PTR CS:[START_BDS] | ||
| 461 | SCAN_BDS: | ||
| 462 | CMP DI,-1 | ||
| 463 | JZ SKIPSET | ||
| 464 | CMP BYTE PTR [DI].DRIVENUM,BL | ||
| 465 | JNZ GET_NEXT_BDS | ||
| 466 | ; | ||
| 467 | ; SOMEONE MAY COMPLAIN, BUT THIS *ALWAYS* MUST BE DONE WHEN A DISK CHANGE IS | ||
| 468 | ; NOTED. THERE ARE *NO* OTHER COMPROMISING CIRCUMSTANCES. | ||
| 469 | ; | ||
| 470 | SETCHANGED: | ||
| 471 | OR WORD PTR DS:[DI].FLAGS,DX ; SIGNAL CHANGE ON OTHER DRIVE | ||
| 472 | GET_NEXT_BDS: | ||
| 473 | MOV AX,WORD PTR [DI].LINK+2 ; GO TO NEXT BDS | ||
| 474 | MOV DI,WORD PTR [DI].LINK | ||
| 475 | MOV DS,AX | ||
| 476 | JMP SHORT SCAN_BDS | ||
| 477 | SKIPSET: | ||
| 478 | POP DI ; RESTORE CURRENT BDS | ||
| 479 | POP DS | ||
| 480 | POP AX | ||
| 481 | POP DX | ||
| 482 | POP BX | ||
| 483 | RET | ||
| 484 | |||
| 485 | ; | ||
| 486 | ; CHECKROMCHANGE - SEE IF EXTERNAL PROGRAM HAS DIDDLED ROM CHANGE LINE. | ||
| 487 | ; | ||
| 488 | ; INPUTS: DS:DI POINTS TO CURRENT BDS. | ||
| 489 | ; OUTPUTS: ZERO SET - NO CHANGE | ||
| 490 | ; ZERO RESET - CHANGE | ||
| 491 | ; REGISTERS MODIFIED: NONE | ||
| 492 | |||
| 493 | CHECKROMCHANGE: | ||
| 494 | MESSAGE FTEST13,<"CHECKROM "> | ||
| 495 | MNUM FTEST13 | ||
| 496 | MESSAGE FTEST13,<CR,LF> | ||
| 497 | TEST WORD PTR [DI].FLAGS,FCHANGED | ||
| 498 | RET | ||
| 499 | |||
| 500 | ; | ||
| 501 | ; RESETCHANGED - RESTORE VALUE OF CHANGE LINE | ||
| 502 | ; | ||
| 503 | ; INPUTS: DS:DI POINTS TO CURRENT BDS | ||
| 504 | ; OUTPUTS: NONE | ||
| 505 | ; REGISTERS MODIFIED: NONE | ||
| 506 | |||
| 507 | public ResetChanged | ||
| 508 | RESETCHANGED: | ||
| 509 | MESSAGE FTEST13,<"RESETCHANGED "> | ||
| 510 | MNUM FTEST13 | ||
| 511 | MESSAGE FTEST13,<CR,LF> | ||
| 512 | AND WORD PTR DS:[DI].FLAGS,NOT FCHANGED | ||
| 513 | RET | ||
| 514 | |||
| 515 | ; | ||
| 516 | ; HASCHANGE - SEE IF DRIVE CAN SUPPLY CHANGE LINE | ||
| 517 | ; | ||
| 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 | ||
| 522 | |||
| 523 | PUBLIC HASCHANGE | ||
| 524 | HASCHANGE: | ||
| 525 | MESSAGE FTEST13,<"HASCHANGE "> | ||
| 526 | MNUM FTEST13 | ||
| 527 | MESSAGE FTEST13,<CR,LF> | ||
| 528 | TEST WORD PTR [DI].FLAGS,FCHANGELINE | ||
| 529 | RET | ||
| 530 | |||
| 531 | ASSUME DS:CODE | ||
| 532 | |||
| 533 | INCLUDE MSVOLID.INC | ||
| 534 | |||
| 535 | PUBLIC END96TPI | ||
| 536 | END96TPI LABEL BYTE | ||