6 ;==============================================================================
8 ;AN000 - New for DOS Version 4.00 - J.K.
9 ;AC000 - Changed for DOS Version 4.00 - J.K.
10 ;AN00x - PTM number for DOS Version 4.00 - J.K.
11 ;==============================================================================
12 ;AN001; - P1820 New Message SKL file 10/20/87 J.K.
13 ;AN002; - P5045 New INT 2fh for Get BDS table vector for EMS 06/06/88 J.K.
14 ;==============================================================================
17 MODELBYTE EQU
DS:BYTE PTR [0FFFEH]
22 INCLUDE MSGROUP
.INC ;DEFINE CODE SEGMENT
28 ASSUME
DS:NOTHING
,ES:NOTHING
39 EXTRN CHECKSINGLE
:NEAR
40 EXTRN CHECK_TIME_OF_ACCESS
:NEAR
43 EXTRN READ_SECTOR
:NEAR
49 EXTRN PTRSAV
:DWORD ;IBMBIO1
59 extrn Ext_Boot_Sig
:byte ;AN000; ibmbdata
60 extrn SecPerClusInSector
:byte ;AN000; ibmbdata
61 extrn Boot_Serial_L
:word ;AN000; ibmbdata
62 extrn Boot_Serial_H
:word ;AN000; ibmbdata
67 MODEL_BYTE
DB 0FFH ; MODEL BYTE. SET UP AT INIT TIME.
69 ; FE - XT (64/256K PLANAR)
72 public Secondary_Model_Byte
73 Secondary_Model_Byte db 0
79 INT19SEM
DB 0 ; INDICATE THAT ALL INT 19
80 ; INITIALIZATION IS COMPLETE
82 IRP AA
,<02,08,09,0A
,0B,0C
,0D,0E
,70,72,73,74,76,77>
84 Int19OLD
&AA
dd -1 ;Orignal hardware int. vectors for INT 19h.
96 ;* Next area is reseved for mini disk BPB pointers *** J.K. 4/7/86
97 ;* Don't change this position. Should be addressible from DskDrvs *** J.K. 4/7/86
98 MINI_DISK_BPB_PTRS
DB 40 dup (?
) ;J.K. 4/7/86 - memory reserved for Mini disk.
107 ; = = = = = = = = = = = = = = = = = = = =
111 ; WE "HOOK" THE INT 19 VECTOR, BECAUSE CONTRARY TO IBM DOCUMENTATION,
112 ; IT DOES NOT "BOOTSTRAP" THE MACHINE. IT LEAVES MEMORY ALMOST UNTOUCHED.
113 ; SINCE THE BIOS_INIT CODE ASSUMES THAT CERTAIN INTERRUPT VECTORS POINT TO
114 ; THE ROM_BIOS WE MUST "UNHOOK" THEM BEFORE ISSUING THE ACTUAL INT_19.
115 ; CURRENTLY THE ONLY VECTORS THAT NEED TO BE UNHOOKED ARE INT_19, INT_13,
116 ; AND THE HARDWARE INTERRUPTS.
129 CMP BYTE PTR INT19SEM
, 0
133 ; ON THE PCJR, DON'T REPLACE ANY VECTORS
134 ; MODEL BYTE DEFINITIONS FROM IBMSTACK.ASM
143 ;Stacks code has changed these hardware interrupt vectors
144 ;STKINIT in SYSINIT1 will initialzie Int19hOLDxx values.
149 IRP AA
,<02,08,09,0A
,0B,0C
,0D,0E
,70,72,73,74,76,77>
152 ;SB33103******************************************************************
155 cmp ax,-1 ;OPT 0ffffh is unlikely segment
156 je skip_int
&AA
;OPT no need to check selector too
157 cmp di,-1 ;OPT 0ffffh is unlikely offset
160 ;SB33103******************************************************************
179 MOV AH,BYTE PTR DRVMAX
180 MOV DI,OFFSET DSKDRVS
185 ; INT 2F HANDLER FOR EXTERNAL BLOCK DRIVERS TO COMMUNICATE WITH THE INTERNAL
186 ; BLOCK DRIVER IN IBMDISK. THE MULTIPLEX NUMBER CHOSEN IS 8. THE HANDLER
187 ; SETS UP THE POINTER TO THE REQUEST PACKET IN [PTRSAV] AND THEN JUMPS TO
188 ; DSK$IN, THE ENTRY POINT FOR ALL DISK REQUESTS.
189 ; ON EXIT FROM THIS DRIVER (AT EXIT), WE WILL RETURN TO THE EXTERNAL DRIVER
190 ; THAT ISSUED THIS INT 2F, AND CAN THEN REMOVE THE FLAGS FROM THE STACK.
191 ; THIS SCHEME ALLOWS US TO HAVE A SMALL EXTERNAL DEVICE DRIVER, AND MAKES
192 ; THE MAINTAINANCE OF THE VARIOUS DRIVERS (DRIVER AND IBMBIO) MUCH EASIER,
193 ; SINCE WE ONLY NEED TO MAKE CHANGES IN ONE PLACE (MOST OF THE TIME).
195 ; 06/03/88 J.K. When AL=3, return DS:DI -> Start of BDS table.
196 ; (EMS device driver hooks INT 13h to handle 16KB DMA overrun
197 ; problem. BDS table is going to be used to get head/sector
198 ; informations without calling Generic IOCTL Get Device Parm call.)
200 ; AL CONTAINS THE INT2F FUNCTION:
201 ; 0 - CHECK FOR INSTALLED HANDLER - RESERVED
202 ; 1 - INSTALL THE BDS INTO THE LINKED LIST
204 ; 3 - Get BDS vector ;06/03/88 J.K.
205 ; Return BDS table starting pointer in DS:DI
213 JMP CS:[INT_2F_NEXT
] ; CHAIN TO NEXT INT 2F HANDLER
215 CMP AL,0F8H ; IRET ON RESERVED FUNCTIONS
219 OR AL,AL ; A GET INSTALLED STATE REQUEST?
224 MESSAGE FTESTINIT
,<"INT2F_DISK",CR
,LF
>
225 CMP AL,1 ; REQUEST FOR INSTALLING BDS?
231 ; SET UP POINTER TO REQUEST PACKET
232 cmp al, 3 ;AN002; Get BDS vector?
233 je DO_Get_BDS_Vector
;AN002;
234 MOV WORD PTR CS:[PTRSAV
],BX ;othrwise DOS function.
235 MOV WORD PTR CS:[PTRSAV
+2],ES
238 DO_Get_BDS_Vector: ;AN002; AL=3
241 mov di, Start_BDS
;AN002;
247 ; INSTALL_BDS INSTALLS A BDS A LOCATION DS:DI INTO THE CURRENT LINKED LIST OF
248 ; BDS MAINTAINED BY THIS DEVICE DRIVER. IT PLACES THE BDS AT THE END OF THE
251 INSTALL_BDS PROC
NEAR
252 MESSAGE FTESTINIT
,<"INSTALL BDS",CR
,LF
>
253 ; DS:DI POINT TO BDS TO BE INSTALLED
254 LES SI,DWORD PTR CS:[START_BDS
] ; START AT BEGINNING OF LIST
255 PUSH ES ; SAVE POINTER TO CURRENT BDS
257 ; ES:SI NOW POINT TO BDS IN LINKED LIST
259 CMP SI,-1 ; GOT TO END OF LINKED LIST?
261 ; IF WE HAVE SEVERAL LOGICAL DRIVES USING THE SAME PHYSICAL DRIVE, WE MUST
262 ; SET THE I_AM_MULT FLAG IN EACH OF THE APPROPRIATE BDSS.
263 MOV AL,BYTE PTR DS:[DI].DRIVENUM
264 CMP BYTE PTR ES:[SI].DRIVENUM
,AL
266 MESSAGE FTESTINIT
,<"LOGICAL DRIVES",CR
,LF
>
269 OR WORD PTR DS:[DI].FLAGS
,BX ; SET FLAGS IN BOTH BDSS CONCERNED
270 OR WORD PTR ES:[SI].FLAGS
,BX
271 MOV BL,FI_OWN_PHYSICAL
273 AND WORD PTR DS:[DI].FLAGS
,BX ; RESET THAT FLAG FOR 'NEW' BDS
274 ; WE MUST ALSO SET THE FCHANGELINE BIT CORRECTLY.
275 MOV BX,WORD PTR ES:[SI].FLAGS
; DETERMINE IF CHANGELINE AVAILABLE
278 OR WORD PTR DS:[DI].FLAGS
,BX
281 ; BEFORE MOVING TO NEXT BDS, PRESERVE POINTER TO CURRENT ONE. THIS IS NEEDED AT
282 ; THE END WHEN THE NEW BDS IS LINKED INTO THE LIST.
283 POP BX ; DISCARD PREVIOUS POINTER TO BDS
287 MOV BX,WORD PTR ES:[SI].LINK
+ 2
288 MOV SI,WORD PTR ES:[SI].LINK
290 JMP SHORT LOOP_NEXT_BDS
293 POP SI ; RETRIEVE POINTER TO LAST BDS
294 POP ES ; IN LINKED LIST.
296 MOV WORD PTR ES:[SI].LINK
+2,AX ; INSTALL BDS
297 MOV WORD PTR ES:[SI].LINK
,DI
298 MOV WORD PTR DS:[DI].LINK
,-1 ; SET NEXT POINTER TO NULL
303 ; RE_INIT INSTALLS THE INT 2F VECTOR THAT WILL HANDLE COMMUNICATION BETWEEN
304 ; EXTERNAL BLOCK DRIVERS AND THE INTERNAL DRIVER. IT ALSO INSTALLS THE
305 ; RESET_INT_13 INTERFACE. IT IS CALLED BY SYSYINIT
309 MESSAGE FTESTINIT
,<"REINIT",CR
,LF
>
315 MOV DI,2FH
*4 ; POINT IT TO INT 2F VECTOR
316 MOV AX,WORD PTR DS:[DI]
317 MOV WORD PTR CS:[INT_2F_NEXT
],AX
318 MOV AX,WORD PTR DS:[DI+2] ; PRESERVE OLD INT 2F VECTOR
319 MOV WORD PTR CS:[INT_2F_NEXT
+2],AX
321 ; INSTALL THE RESET_INT_13
325 ; THE FOLLOWING TWO LINES ARE NOT NEEDED ANYMORE BECAUSE THE LINK HAS BEEN
326 ; HARD-WIRED INTO THE CODE AT NEXT2F_13. - RAJEN.
327 ;------------------------------------------------------------------------------
328 ; MOV WORD PTR CS:[NEXT2F_13],OFFSET INT2F_DISK ; PRESERVE INT2F_DISK POINTER
329 ; MOV WORD PTR CS:[NEXT2F_13+2],CS
330 ;------------------------------------------------------------------------------
333 MOV WORD PTR DS:[DI],OFFSET INT_2F_13
; INSTALL NEW VECTORS
334 MOV WORD PTR DS:[DI+2],CS
344 ;-------------------------------------------------
346 ; ASK TO SWAP THE DISK IN DRIVE A:
350 MOV AL,BYTE PTR DS:[DI].DRIVELET
; GET THE DRIVE LETTER
351 ;USING A DIFFERENT DRIVE IN A ONE DRIVE SYSTEM SO REQUEST THE USER CHANGE DISKS
354 PUSH DS ; PRESERVE SEGMENT REGISTER
357 MOV SI,OFFSET SNGMSG
; DS:SI -> MESSAGE
359 CALL WRMSG
;PRINT DISK CHANGE MESSAGE
361 ;SB33003***************************************************************
362 xor AH, AH ; set command to read character;SB
363 int 16h
; call rom-bios ;SB
364 ;SB33003***************************************************************
366 POP DS ; RESTORE SEGMENT REGISTER
371 ;----------------------------------------------
373 ; WRITE OUT MESSAGE POINTED TO BY [SI]
377 LODSB ;GET THE NEXT CHARACTER OF THE MESSAGE
378 OR AL,AL ;SEE IF END OF MESSAGE
391 ; END OF SUPPORT FOR MULTIPLE FLOPPIES WITH NO LOGICAL DRIVES
392 ; THIS IS NOT 'SPECIAL' ANY MORE BECAUSE WE NOW HAVE THE CAPABILITY OF
393 ; DEFINING LOGICAL DRIVES IN CONFIG.SYS. WE THEREFORE KEEP THE CODE FOR
394 ; SWAPPING RESIDENT ALL THE TIME.
397 ;J.K. 10/1/86 *******************************************************
398 ;Variables for Dynamic Relocatable modules
399 ;These should be stay resident.
401 public INT6C_RET_ADDR
402 INT6C_RET_ADDR
DD ?
; return address from INT 6C for P12 machine
406 ; DATA STRUCTURES FOR REAL-TIME DATE AND TIME
413 DB 0 ; CENTURY (19 OR 20) OR HOURS (0-23)
414 DB 0 ; YEAR IN CENTURY (0...99) OR MINUTES (0-59)
415 DB 0 ; MONTH IN YEAR (1...12) OR SECONDS (0-59)
416 DB 0 ; DAY IN MONTH (1...31)
419 DW 31 ;MJB002 FEBRUARY
429 DW 334 ;MJB002 DECEMBER
430 DAYCNT2
DW 0000 ;MJB002 TEMP FOR COUNT OF DAYS SINCE 1-1-80
431 FEB29
DB 0 ;MJB002 FEBRUARY 29 IN A LEAP YEAR FLAG
434 ;********************************************************************
440 ; END OF CODE FOR VIRTUAL FLOPPY DRIVES
448 HNUM
DB 0 ;NUMBER OF HARDFILES
450 HARDDRV
DB 80H
;PHYSICAL DRIVE NUMBER OF FIRST HARDFILE
451 ;**********************************************************************
452 ; "HDRIVE" IS A HARD DISK WITH 512 BYTE SECTORS
453 ;*********************************************************************
456 BDSH
DW -1 ;LINK TO NEXT STRUCTURE
458 DB 80 ;INT 13 DRIVE NUMBER
459 DB "C" ;LOGICAL DRIVE LETTER
463 DB 1 ;SECTORS/ALLOCATION UNIT
464 DW 1 ;RESERVED SECTORS FOR DOS
465 DB 2 ;NO. OF ALLOCATION TABLES
466 DW 16 ;NUMBER OF DIRECTORY ENTRIES
467 DW 0000 ;NUMBER OF SECTORS (AT 512 BYTES EACH)
468 DB 11111000B ;MEDIA DESCRIPTOR
469 DW 1 ;NUMBER OF FAT SECTORS
472 DW 00 ;HIDDEN SECTOR COUNT(low)
473 dw 00 ;AN000; Hidden Sector (high)
474 dw 00 ;AN000; Number of Sectors (low)
475 dw 00 ;AN000; Number of Sectors (high)
476 DB 0 ; TRUE => BIGFAT
477 OPCNTH
DW 0 ;OPEN REF. COUNT
479 FLAGSH
DW 0020H ;VARIOUS FLAGS
480 ; DB 9 DUP (0) ;RESERVED FOR FUTURE USE
481 DW 40 ; NUMBER OF CYLINDERS
482 RECBPBH
DB 31 DUP (?
) ; RECOMMENDED BPB FOR DRIVE
483 TRACKH
DB -1 ;LAST TRACK ACCESSED ON THIS DRIVE
484 TIM_LOH
DW -1 ;KEEP THESE TWO CONTIGUOUS (?)
486 VOLIDH
DB "NO NAME ",0 ;AN000; VOLUME ID FOR THIS DISK
487 VolSerH dd 0 ;AN000; Current volume serial number from Boot record
488 SysIDH db "FAT12 " ,0 ;AN000; Current file system id from Boot record
491 ; END OF SINGLE HARD DISK SECTION
494 ENDONEHARD
LABEL BYTE
495 ;**********************************************************************
496 ; "DRIVEX " IS AN EXTRA TYPE OF DRIVE USUALLY RESERVED FOR AN
497 ; ADDITIONAL HARD FILE
498 ;*********************************************************************
501 BDSX
DW -1 ;LINK TO NEXT STRUCTURE
503 DB 81 ;INT 13 DRIVE NUMBER
504 DB "D" ;LOGICAL DRIVE LETTER
508 DB 00 ;SECTORS/ALLOCATION UNIT
509 DW 1 ;RESERVED SECTORS FOR DOS
510 DB 2 ;NO. OF ALLOCATION TABLES
511 DW 0000 ;NUMBER OF DIRECTORY ENTRIES
512 DW 0000 ;NUMBER OF SECTORS (AT 512 BYTES EACH)
513 DB 11111000B ;MEDIA DESCRIPTOR
514 DW 0000 ;NUMBER OF FAT SECTORS
517 DW 00 ;HIDDEN SECTOR COUNT (low)
518 dw 00 ;AN000; Hidden Sector (high)
519 dw 00 ;AN000; Number of Sectors (low)
520 dw 00 ;AN000; Number of Sectors (high)
521 DB 0 ; TRUE => BIGFAT
522 OPCNTD
DW 0 ;OPEN REF. COUNT
524 FLAGSD
DW 0020H ;VARIOUS FLAGS
525 ; DB 9 DUP (0) ;RESERVED FOR FUTURE USE
526 DW 40 ; NUMBER OF CYLINDERS
527 RECBPBD
DB 31 DUP (?
) ; RECOMMENDED BPB FOR DRIVE
528 TRACKD
DB -1 ;LAST TRACK ACCESSED ON THIS DRIVE
529 TIM_LOD
DW -1 ;KEEP THESE TWO CONTIGUOUS (?)
531 VOLIDD
DB "NO NAME ",0 ;AN000; VOLUME ID FOR THIS DISK
532 VolSerD dd 0 ;AN000; Current volume serial number from Boot record
533 SysIDD db "FAT12 " ,0 ;AN000; Current file system id from Boot record
536 ; END OF SECTION FOR TWO HARD DISKS
538 ENDTWOHARD
LABEL BYTE
547 ;*********************************************************************
548 ;Memory allocation for BDSM table. - J.K. 2/21/86
549 ;*********************************************************************
551 BDSMs BDSM_type Max_mini_dsk_num
dup (<>) ;currently max. 23
553 ;** End_of_BDSM defined in IBMINIT.ASM will be used to set the appropriate
554 ;** ending address of BDSM table.
557 ;;3.3 BUG FIX -SP ------------------------------
558 ;;Migrated into 4.00 -MRW
559 ;Paragraph buffer between the BDSMs and MSHARD
561 ;The relocation code for MSHARD needs this. this cannot be used for
562 ;anything. nothing can come before this or after this.....IMPORTANT!!!!
563 ;don't get too smart and using this buffer for anything!!!!!!
567 ;end of bug fix buffer
569 ;;3.3 BUG FIX -SP------------------------------