diff options
Diffstat (limited to '')
-rw-r--r-- | private/mvdm/softpc.new/bios/msint13.asm | 214 |
1 files changed, 214 insertions, 0 deletions
diff --git a/private/mvdm/softpc.new/bios/msint13.asm b/private/mvdm/softpc.new/bios/msint13.asm new file mode 100644 index 000000000..a95c05d92 --- /dev/null +++ b/private/mvdm/softpc.new/bios/msint13.asm @@ -0,0 +1,214 @@ + page ,160 + title MS-DOS BIOS int 2f handler +; +;---------------------------------------------------------------------------- +; +; Modification history +; +; 26-Feb-1991 sudeepb Ported for NT DOSEm +;---------------------------------------------------------------------------- + +; THIS FILE SHOULD BE NAMED INT2f.ASM RATHER THAN INT13.ASM AS I HAVE RIPPED +; THE INT 13 SUPPORT. TO REDUCE CONFUSION WHEN PICKING FIXES FROM DOS 5.1 +; THE NAME IS RETAINED AS IT IS. + + include version.inc ; set build flags + include biosseg.inc ; establish bios segment structure + + include msequ.inc + include biostruc.inc + + include msgroup.inc ; establish Bios_Data segment + include vint.inc + +multMULT equ 4ah +multMULTGETHMAPTR equ 1 +multMULTALLOCHMA equ 2 + + +Win386_RelTS equ 80h +NT_WAIT_BOP equ 5Ah + +bop MACRO callid + db 0c4h,0c4h,callid +endm + +;SR; +; Include file for WIN386 support +; + include win386.inc + + + extrn SysinitPresent:byte + extrn FreeHMAPtr:word + extrn MoveDOSIntoHMA:dword + +;SR; +;New variables for Win386 support +; + extrn IsWin386:byte + extrn Win386_SI:byte + extrn SI_Next:dword + + +; close data, open Bios_code segment + + tocode + + extrn Bios_Data_Word:word + +; Int 2f functions to support communication of external block device +; drivers with msdisk are not supported. It also does'nt support +; function 13h which replaces the int 13 vector. +; + + public i2f_handler +i2f_handler proc far + assume ds:nothing,es:nothing + + cmp ah,13h + jz i2f_iret + cmp ah,8 + jz i2f_iret + +; +;Check for WIN386 startup and return the BIOS instance data +; + cmp ah,MULTWIN386 + jz win386call + + cmp ah, multMULT + jne i2f_iret + jmp handle_multmult + +i2f_iret: + FIRET + + +;WIN386 startup stuff is done here. If starting up we set our WIN386 present +;flag and return instance data. If exiting, we reset the WIN386 present flag +;NOTE: We assume that the BIOS int 2fh is at the bottom of the chain. + +win386call: + push ds + mov ds,cs:Bios_Data_Word + assume ds:Bios_Data + + cmp al, Win386_Init ; is it win386 initializing? + je Win386Init + cmp al, Win386_Exit ; is it win386 exiting? + je Win386Exit + cmp al, Win386_RelTS ; is it app release timeslice call? + jne win_iret ; if not, continue int2f chain + + push ax ; It's the idling case - call MS BOP A + xor ax,ax ; with AX = 0 + bop NT_WAIT_BOP + pop ax + xor al, al + jmp short win_iret + +Win386Exit: + test dx, 1 ; is it win386 or win286 dos extender? + jnz win_iret ; if not win386, then continue + and [IsWin386], 0 ; indicate that win386 is not present + jmp short win_iret + +Win386Init: + test dx, 1 ; is it win386 or win286 dos extender? + jnz win_iret ; if not win386, then continue + + or [IsWin386], 1 ; Indicate WIN386 present + mov word ptr [SI_Next], bx ; Hook our structure into chain + mov word ptr [SI_Next + 2], es + mov bx, offset Win386_SI ; point ES:BX to Win386_SI + push ds + pop es + +win_iret: + pop ds + assume ds:nothing + jmp i2f_iret ;return back up the chain + +handle_multmult: + cmp al, multMULTGETHMAPTR + jne try_2 + + push ds + call HMAPtr ; get offset of free HMA + mov bx, 0ffffh + mov es, bx ; seg of HMA + mov bx, di + not bx + or bx, bx + jz @f + inc bx +@@: + pop ds + jmp i2f_iret +try_2: + cmp al, multMULTALLOCHMA + jne try_3 + + push ds + mov di, 0ffffh ; assume not enough space + mov es, di + call HMAPtr ; get offset of free HMA + assume ds:Bios_Data + cmp di, 0ffffh + je InsuffHMA + neg di ; free space in HMA + cmp bx, di + jbe @f + mov di, 0ffffh + jmp short InsuffHMA +@@: + mov di, FreeHMAPtr + add bx, 15 + and bx, 0fff0h + add FreeHMAPtr, bx ; update the free pointer + jnz InsuffHMA + mov FreeHMAPtr, 0ffffh ; no more HMA if we have wrapped +InsuffHMA: + pop ds + assume ds:nothing + jmp i2f_iret +try_3: + jmp i2f_iret +i2f_handler endp + +; +;-------------------------------------------------------------------------- +; +; procedure : HMAPtr +; +; Gets the offset of the free HMA area ( with respect to +; seg ffff ) +; If DOS has not moved high, tries to move DOS high. +; In the course of doing this, it will allocate all the HMA +; and set the FreeHMAPtr to past the end of the BIOS and +; DOS code. The call to MoveDOSIntoHMA (which is a pointer) +; enters the routine in sysinit1 called FTryToMoveDOSHi. +; +; RETURNS : offset of free HMA in DI +; BIOS_DATA, seg in DS +; +;-------------------------------------------------------------------------- +; +HMAPtr proc near + mov ds, Bios_Data_Word + assume ds:Bios_Data + mov di, FreeHMAPtr + cmp di, 0ffffh + jne @f + cmp SysinitPresent, 0 + je @f + call MoveDOSIntoHMA + mov di, FreeHMAPtr +@@: + ret +HMAPtr endp + + +Bios_Code ends + end |