PAGE ,132 ; TITLE MSBIO2 - BIOS %OUT ...MSBIO2.ASM ;============================================================================== ;REVISION HISTORY: ;AN000 - New for DOS Version 4.00 - J.K. ;AC000 - Changed for DOS Version 4.00 - J.K. ;AN00x - PTM number for DOS Version 4.00 - J.K. ;============================================================================== ;AN001; - P1820 New Message SKL file 10/20/87 J.K. ;AN002; - P5045 New INT 2fh for Get BDS table vector for EMS 06/06/88 J.K. ;============================================================================== ROMSEGMENT EQU 0F000H MODELBYTE EQU DS:BYTE PTR [0FFFEH] MODELPCJR EQU 0FDH itest=0 INCLUDE MSGROUP.INC ;DEFINE CODE SEGMENT INCLUDE MSEQU.INC INCLUDE DEVSYM.INC INCLUDE PUSHPOP.INC INCLUDE MSMACRO.INC ASSUME DS:NOTHING,ES:NOTHING EXTRN DSK$IN:NEAR EXTRN SETPTRSAV:NEAR EXTRN OUTCHR:NEAR EXTRN SETDRIVE:NEAR EXTRN FLUSH:NEAR EXTRN HARDERR:NEAR EXTRN HARDERR2:NEAR EXTRN MAPERROR:NEAR EXTRN GETBP:NEAR EXTRN CHECKSINGLE:NEAR EXTRN CHECK_TIME_OF_ACCESS:NEAR EXTRN EXIT:NEAR EXTRN HAS1:NEAR EXTRN READ_SECTOR:NEAR EXTRN INT_2F_13:FAR EXTRN OLD13:DWORD ;DATA EXTRN PTRSAV:DWORD ;IBMBIO1 EXTRN START_BDS:WORD EXTRN FDRIVE1:WORD EXTRN FDRIVE2:WORD EXTRN FDRIVE3:WORD EXTRN FDRIVE4:WORD EXTRN FLAGBITS:WORD EXTRN TIM_DRV:BYTE EXTRN MEDBYT:BYTE EXTRN DRVMAX:BYTE extrn Ext_Boot_Sig:byte ;AN000; ibmbdata extrn SecPerClusInSector:byte ;AN000; ibmbdata extrn Boot_Serial_L:word ;AN000; ibmbdata extrn Boot_Serial_H:word ;AN000; ibmbdata PATHSTART 005,DISK EVENB public Model_Byte MODEL_BYTE DB 0FFH ; MODEL BYTE. SET UP AT INIT TIME. ; FF - PC1 ; FE - XT (64/256K PLANAR) ; FD - PC-JR ; FC - PC/AT public Secondary_Model_Byte Secondary_Model_Byte db 0 PUBLIC ORIG19 ORIG19 DD ? PUBLIC INT19SEM INT19SEM DB 0 ; INDICATE THAT ALL INT 19 ; INITIALIZATION IS COMPLETE IRP AA,<02,08,09,0A,0B,0C,0D,0E,70,72,73,74,76,77> public Int19OLD&AA Int19OLD&AA dd -1 ;Orignal hardware int. vectors for INT 19h. ENDM EVENB PUBLIC DSKDRVS DSKDRVS DW FDRIVE1 DW FDRIVE2 DW FDRIVE3 DW FDRIVE4 PUBLIC HDSKTAB HDSKTAB DW HDRIVE DW DRIVEX ;* Next area is reseved for mini disk BPB pointers *** J.K. 4/7/86 ;* Don't change this position. Should be addressible from DskDrvs *** J.K. 4/7/86 MINI_DISK_BPB_PTRS DB 40 dup (?) ;J.K. 4/7/86 - memory reserved for Mini disk. EVENB PUBLIC INT_2F_NEXT INT_2F_NEXT DD ? RET_ADDR DD ? PATHEND 005,DISK ; = = = = = = = = = = = = = = = = = = = = ; INT19 ; ; WE "HOOK" THE INT 19 VECTOR, BECAUSE CONTRARY TO IBM DOCUMENTATION, ; IT DOES NOT "BOOTSTRAP" THE MACHINE. IT LEAVES MEMORY ALMOST UNTOUCHED. ; SINCE THE BIOS_INIT CODE ASSUMES THAT CERTAIN INTERRUPT VECTORS POINT TO ; THE ROM_BIOS WE MUST "UNHOOK" THEM BEFORE ISSUING THE ACTUAL INT_19. ; CURRENTLY THE ONLY VECTORS THAT NEED TO BE UNHOOKED ARE INT_19, INT_13, ; AND THE HARDWARE INTERRUPTS. ; PUBLIC INT19 INT19 PROC FAR XOR AX,AX MOV DS,AX assume ds:nothing assume es:nothing LES DI,OLD13 MOV DS:[13H*4],DI MOV DS:[13H*4+2],ES CMP BYTE PTR INT19SEM, 0 JNZ INT19VECS JMP DOINT19 ; ON THE PCJR, DON'T REPLACE ANY VECTORS ; MODEL BYTE DEFINITIONS FROM IBMSTACK.ASM MOV AX,ROMSEGMENT MOV DS,AX MOV AL,MODELPCJR CMP AL,MODELBYTE JNE INT19VECS JMP DOINT19 ;Stacks code has changed these hardware interrupt vectors ;STKINIT in SYSINIT1 will initialzie Int19hOLDxx values. INT19VECS: XOR AX,AX MOV DS,AX IRP AA,<02,08,09,0A,0B,0C,0D,0E,70,72,73,74,76,77> LES DI,Int19OLD&AA ;SB33103****************************************************************** mov ax,es ; cmp ax,-1 ;OPT 0ffffh is unlikely segment je skip_int&AA ;OPT no need to check selector too cmp di,-1 ;OPT 0ffffh is unlikely offset je skip_int&AA ;SB33103****************************************************************** MOV DS:[AA&H*4],DI MOV DS:[AA&H*4+2],ES skip_int&AA: ENDM DOINT19: LES DI,ORIG19 MOV DS:[19H*4],DI MOV DS:[19H*4+2],ES INT 19H INT19 ENDP ASSUME DS:CODE PUBLIC DSK$INIT DSK$INIT PROC NEAR PUSH CS POP DS MOV AH,BYTE PTR DRVMAX MOV DI,OFFSET DSKDRVS JMP SETPTRSAV DSK$INIT ENDP ; ; INT 2F HANDLER FOR EXTERNAL BLOCK DRIVERS TO COMMUNICATE WITH THE INTERNAL ; BLOCK DRIVER IN IBMDISK. THE MULTIPLEX NUMBER CHOSEN IS 8. THE HANDLER ; SETS UP THE POINTER TO THE REQUEST PACKET IN [PTRSAV] AND THEN JUMPS TO ; DSK$IN, THE ENTRY POINT FOR ALL DISK REQUESTS. ; ON EXIT FROM THIS DRIVER (AT EXIT), WE WILL RETURN TO THE EXTERNAL DRIVER ; THAT ISSUED THIS INT 2F, AND CAN THEN REMOVE THE FLAGS FROM THE STACK. ; THIS SCHEME ALLOWS US TO HAVE A SMALL EXTERNAL DEVICE DRIVER, AND MAKES ; THE MAINTAINANCE OF THE VARIOUS DRIVERS (DRIVER AND IBMBIO) MUCH EASIER, ; SINCE WE ONLY NEED TO MAKE CHANGES IN ONE PLACE (MOST OF THE TIME). ; ; 06/03/88 J.K. When AL=3, return DS:DI -> Start of BDS table. ; (EMS device driver hooks INT 13h to handle 16KB DMA overrun ; problem. BDS table is going to be used to get head/sector ; informations without calling Generic IOCTL Get Device Parm call.) ; ; AL CONTAINS THE INT2F FUNCTION: ; 0 - CHECK FOR INSTALLED HANDLER - RESERVED ; 1 - INSTALL THE BDS INTO THE LINKED LIST ; 2 - DOS REQUEST ; 3 - Get BDS vector ;06/03/88 J.K. ; Return BDS table starting pointer in DS:DI MYNUM EQU 8 PUBLIC INT2F_DISK INT2F_DISK PROC FAR CMP AH,MYNUM JE MINE JMP CS:[INT_2F_NEXT] ; CHAIN TO NEXT INT 2F HANDLER MINE: CMP AL,0F8H ; IRET ON RESERVED FUNCTIONS JB DO_FUNC IRET DO_FUNC: OR AL,AL ; A GET INSTALLED STATE REQUEST? JNE DISP_FUNC MOV AL,0FFH IRET DISP_FUNC: MESSAGE FTESTINIT,<"INT2F_DISK",CR,LF> CMP AL,1 ; REQUEST FOR INSTALLING BDS? JNE DO_DOS_REQ CALL INSTALL_BDS IRET DO_DOS_REQ: ; SET UP POINTER TO REQUEST PACKET cmp al, 3 ;AN002; Get BDS vector? je DO_Get_BDS_Vector ;AN002; MOV WORD PTR CS:[PTRSAV],BX ;othrwise DOS function. MOV WORD PTR CS:[PTRSAV+2],ES JMP DSK$IN DO_Get_BDS_Vector: ;AN002; AL=3 push cs ;AN002; pop ds ;AN002; mov di, Start_BDS ;AN002; IRET ;AN002; INT2F_DISK ENDP ; ; INSTALL_BDS INSTALLS A BDS A LOCATION DS:DI INTO THE CURRENT LINKED LIST OF ; BDS MAINTAINED BY THIS DEVICE DRIVER. IT PLACES THE BDS AT THE END OF THE ; LIST. PUBLIC INSTALL_BDS INSTALL_BDS PROC NEAR MESSAGE FTESTINIT,<"INSTALL BDS",CR,LF> ; DS:DI POINT TO BDS TO BE INSTALLED LES SI,DWORD PTR CS:[START_BDS] ; START AT BEGINNING OF LIST PUSH ES ; SAVE POINTER TO CURRENT BDS PUSH SI ; ES:SI NOW POINT TO BDS IN LINKED LIST LOOP_NEXT_BDS: CMP SI,-1 ; GOT TO END OF LINKED LIST? JZ INSTALL_RET ; IF WE HAVE SEVERAL LOGICAL DRIVES USING THE SAME PHYSICAL DRIVE, WE MUST ; SET THE I_AM_MULT FLAG IN EACH OF THE APPROPRIATE BDSS. MOV AL,BYTE PTR DS:[DI].DRIVENUM CMP BYTE PTR ES:[SI].DRIVENUM,AL JNZ NEXT_BDS MESSAGE FTESTINIT,<"LOGICAL DRIVES",CR,LF> XOR BX,BX MOV BL,FI_AM_MULT OR WORD PTR DS:[DI].FLAGS,BX ; SET FLAGS IN BOTH BDSS CONCERNED OR WORD PTR ES:[SI].FLAGS,BX MOV BL,FI_OWN_PHYSICAL XOR BX,-1 AND WORD PTR DS:[DI].FLAGS,BX ; RESET THAT FLAG FOR 'NEW' BDS ; WE MUST ALSO SET THE FCHANGELINE BIT CORRECTLY. MOV BX,WORD PTR ES:[SI].FLAGS ; DETERMINE IF CHANGELINE AVAILABLE AND BL,FCHANGELINE XOR BH,BH OR WORD PTR DS:[DI].FLAGS,BX NEXT_BDS: ; BEFORE MOVING TO NEXT BDS, PRESERVE POINTER TO CURRENT ONE. THIS IS NEEDED AT ; THE END WHEN THE NEW BDS IS LINKED INTO THE LIST. POP BX ; DISCARD PREVIOUS POINTER TO BDS POP BX PUSH ES PUSH SI MOV BX,WORD PTR ES:[SI].LINK + 2 MOV SI,WORD PTR ES:[SI].LINK MOV ES,BX JMP SHORT LOOP_NEXT_BDS INSTALL_RET: POP SI ; RETRIEVE POINTER TO LAST BDS POP ES ; IN LINKED LIST. MOV AX,DS MOV WORD PTR ES:[SI].LINK+2,AX ; INSTALL BDS MOV WORD PTR ES:[SI].LINK,DI MOV WORD PTR DS:[DI].LINK,-1 ; SET NEXT POINTER TO NULL RET INSTALL_BDS ENDP ; ; RE_INIT INSTALLS THE INT 2F VECTOR THAT WILL HANDLE COMMUNICATION BETWEEN ; EXTERNAL BLOCK DRIVERS AND THE INTERNAL DRIVER. IT ALSO INSTALLS THE ; RESET_INT_13 INTERFACE. IT IS CALLED BY SYSYINIT ; PUBLIC RE_INIT RE_INIT PROC FAR MESSAGE FTESTINIT,<"REINIT",CR,LF> PUSH AX PUSH DS PUSH DI XOR DI,DI MOV DS,DI MOV DI,2FH*4 ; POINT IT TO INT 2F VECTOR MOV AX,WORD PTR DS:[DI] MOV WORD PTR CS:[INT_2F_NEXT],AX MOV AX,WORD PTR DS:[DI+2] ; PRESERVE OLD INT 2F VECTOR MOV WORD PTR CS:[INT_2F_NEXT+2],AX ; INSTALL THE RESET_INT_13 ; INTERFACE ; ; THE FOLLOWING TWO LINES ARE NOT NEEDED ANYMORE BECAUSE THE LINK HAS BEEN ; HARD-WIRED INTO THE CODE AT NEXT2F_13. - RAJEN. ;------------------------------------------------------------------------------ ; MOV WORD PTR CS:[NEXT2F_13],OFFSET INT2F_DISK ; PRESERVE INT2F_DISK POINTER ; MOV WORD PTR CS:[NEXT2F_13+2],CS ;------------------------------------------------------------------------------ CLI MOV WORD PTR DS:[DI],OFFSET INT_2F_13 ; INSTALL NEW VECTORS MOV WORD PTR DS:[DI+2],CS STI POP DI POP DS POP AX RET RE_INIT ENDP ;------------------------------------------------- ; ; ASK TO SWAP THE DISK IN DRIVE A: ; PUBLIC SWPDSK SWPDSK PROC NEAR MOV AL,BYTE PTR DS:[DI].DRIVELET ; GET THE DRIVE LETTER ;USING A DIFFERENT DRIVE IN A ONE DRIVE SYSTEM SO REQUEST THE USER CHANGE DISKS ADD AL,"A" MOV CS:DRVLET,AL PUSH DS ; PRESERVE SEGMENT REGISTER PUSH CS POP DS MOV SI,OFFSET SNGMSG ; DS:SI -> MESSAGE PUSH BX CALL WRMSG ;PRINT DISK CHANGE MESSAGE CALL FLUSH ;SB33003*************************************************************** xor AH, AH ; set command to read character;SB int 16h ; call rom-bios ;SB ;SB33003*************************************************************** POP BX POP DS ; RESTORE SEGMENT REGISTER WRMRET: RET SWPDSK ENDP ;---------------------------------------------- ; ; WRITE OUT MESSAGE POINTED TO BY [SI] ; PUBLIC WRMSG WRMSG PROC NEAR LODSB ;GET THE NEXT CHARACTER OF THE MESSAGE OR AL,AL ;SEE IF END OF MESSAGE JZ WRMRET ; INT CHROUT PUSHF PUSH CS CALL OUTCHR JMP SHORT WRMSG WRMSG ENDP ; INCLUDE BIOMES.INC include MSBIO.CL2 ; ; END OF SUPPORT FOR MULTIPLE FLOPPIES WITH NO LOGICAL DRIVES ; THIS IS NOT 'SPECIAL' ANY MORE BECAUSE WE NOW HAVE THE CAPABILITY OF ; DEFINING LOGICAL DRIVES IN CONFIG.SYS. WE THEREFORE KEEP THE CODE FOR ; SWAPPING RESIDENT ALL THE TIME. ; ;J.K. 10/1/86 ******************************************************* ;Variables for Dynamic Relocatable modules ;These should be stay resident. public INT6C_RET_ADDR INT6C_RET_ADDR DD ? ; return address from INT 6C for P12 machine PATHSTART 001,CLK ; ; DATA STRUCTURES FOR REAL-TIME DATE AND TIME ; public BIN_DATE_TIME public MONTH_TABLE public DAYCNT2 public FEB29 BIN_DATE_TIME: DB 0 ; CENTURY (19 OR 20) OR HOURS (0-23) DB 0 ; YEAR IN CENTURY (0...99) OR MINUTES (0-59) DB 0 ; MONTH IN YEAR (1...12) OR SECONDS (0-59) DB 0 ; DAY IN MONTH (1...31) MONTH_TABLE: ; DW 0 ;MJB002 JANUARY DW 31 ;MJB002 FEBRUARY DW 59 ;MJB002 DW 90 ;MJB002 DW 120 ;MJB002 DW 151 ;MJB002 DW 181 ;MJB002 DW 212 ;MJB002 DW 243 ;MJB002 DW 273 ;MJB002 DW 304 ;MJB002 DW 334 ;MJB002 DECEMBER DAYCNT2 DW 0000 ;MJB002 TEMP FOR COUNT OF DAYS SINCE 1-1-80 FEB29 DB 0 ;MJB002 FEBRUARY 29 IN A LEAP YEAR FLAG PATHEND 001,CLK ;******************************************************************** ; PUBLIC ENDFLOPPY ENDFLOPPY LABEL BYTE ; ; END OF CODE FOR VIRTUAL FLOPPY DRIVES ; PUBLIC ENDSWAP ENDSWAP LABEL BYTE PATHSTART 004,BIO PUBLIC HNUM HNUM DB 0 ;NUMBER OF HARDFILES PUBLIC HARDDRV HARDDRV DB 80H ;PHYSICAL DRIVE NUMBER OF FIRST HARDFILE ;********************************************************************** ; "HDRIVE" IS A HARD DISK WITH 512 BYTE SECTORS ;********************************************************************* EVENB PUBLIC BDSH BDSH DW -1 ;LINK TO NEXT STRUCTURE DW CODE DB 80 ;INT 13 DRIVE NUMBER DB "C" ;LOGICAL DRIVE LETTER PUBLIC HDRIVE HDRIVE: DW 512 DB 1 ;SECTORS/ALLOCATION UNIT DW 1 ;RESERVED SECTORS FOR DOS DB 2 ;NO. OF ALLOCATION TABLES DW 16 ;NUMBER OF DIRECTORY ENTRIES DW 0000 ;NUMBER OF SECTORS (AT 512 BYTES EACH) DB 11111000B ;MEDIA DESCRIPTOR DW 1 ;NUMBER OF FAT SECTORS DW 00 ;SECTOR LIMIT DW 00 ;HEAD LIMIT DW 00 ;HIDDEN SECTOR COUNT(low) dw 00 ;AN000; Hidden Sector (high) dw 00 ;AN000; Number of Sectors (low) dw 00 ;AN000; Number of Sectors (high) DB 0 ; TRUE => BIGFAT OPCNTH DW 0 ;OPEN REF. COUNT DB 3 ;FORM FACTOR FLAGSH DW 0020H ;VARIOUS FLAGS ; DB 9 DUP (0) ;RESERVED FOR FUTURE USE DW 40 ; NUMBER OF CYLINDERS RECBPBH DB 31 DUP (?) ; RECOMMENDED BPB FOR DRIVE TRACKH DB -1 ;LAST TRACK ACCESSED ON THIS DRIVE TIM_LOH DW -1 ;KEEP THESE TWO CONTIGUOUS (?) TIM_HIH DW -1 VOLIDH DB "NO NAME ",0 ;AN000; VOLUME ID FOR THIS DISK VolSerH dd 0 ;AN000; Current volume serial number from Boot record SysIDH db "FAT12 " ,0 ;AN000; Current file system id from Boot record ; ; END OF SINGLE HARD DISK SECTION ; PUBLIC ENDONEHARD ENDONEHARD LABEL BYTE ;********************************************************************** ; "DRIVEX " IS AN EXTRA TYPE OF DRIVE USUALLY RESERVED FOR AN ; ADDITIONAL HARD FILE ;********************************************************************* EVENB PUBLIC BDSX BDSX DW -1 ;LINK TO NEXT STRUCTURE DW CODE DB 81 ;INT 13 DRIVE NUMBER DB "D" ;LOGICAL DRIVE LETTER PUBLIC DRIVEX DRIVEX: DW 512 DB 00 ;SECTORS/ALLOCATION UNIT DW 1 ;RESERVED SECTORS FOR DOS DB 2 ;NO. OF ALLOCATION TABLES DW 0000 ;NUMBER OF DIRECTORY ENTRIES DW 0000 ;NUMBER OF SECTORS (AT 512 BYTES EACH) DB 11111000B ;MEDIA DESCRIPTOR DW 0000 ;NUMBER OF FAT SECTORS DW 00 ;SECTOR LIMIT DW 00 ;HEAD LIMIT DW 00 ;HIDDEN SECTOR COUNT (low) dw 00 ;AN000; Hidden Sector (high) dw 00 ;AN000; Number of Sectors (low) dw 00 ;AN000; Number of Sectors (high) DB 0 ; TRUE => BIGFAT OPCNTD DW 0 ;OPEN REF. COUNT DB 3 ;FORM FACTOR FLAGSD DW 0020H ;VARIOUS FLAGS ; DB 9 DUP (0) ;RESERVED FOR FUTURE USE DW 40 ; NUMBER OF CYLINDERS RECBPBD DB 31 DUP (?) ; RECOMMENDED BPB FOR DRIVE TRACKD DB -1 ;LAST TRACK ACCESSED ON THIS DRIVE TIM_LOD DW -1 ;KEEP THESE TWO CONTIGUOUS (?) TIM_HID DW -1 VOLIDD DB "NO NAME ",0 ;AN000; VOLUME ID FOR THIS DISK VolSerD dd 0 ;AN000; Current volume serial number from Boot record SysIDD db "FAT12 " ,0 ;AN000; Current file system id from Boot record ; ; END OF SECTION FOR TWO HARD DISKS PUBLIC ENDTWOHARD ENDTWOHARD LABEL BYTE PATHEND 004,BIO PUBLIC TWOHARD TWOHARD LABEL BYTE PAGE INCLUDE MS96TPI.INC ;********************************************************************* ;Memory allocation for BDSM table. - J.K. 2/21/86 ;********************************************************************* PUBLIC BDSMs BDSMs BDSM_type Max_mini_dsk_num dup (<>) ;currently max. 23 ;** End_of_BDSM defined in IBMINIT.ASM will be used to set the appropriate ;** ending address of BDSM table. ; ;;3.3 BUG FIX -SP ------------------------------ ;;Migrated into 4.00 -MRW ;Paragraph buffer between the BDSMs and MSHARD ; ;The relocation code for MSHARD needs this. this cannot be used for ;anything. nothing can come before this or after this.....IMPORTANT!!!! ;don't get too smart and using this buffer for anything!!!!!! ; db 16 dup(0) ; ;end of bug fix buffer ;; ;;3.3 BUG FIX -SP------------------------------ CODE ENDS END