summaryrefslogtreecommitdiffstats
path: root/private/mvdm/softpc.new/bios/msint13.asm
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--private/mvdm/softpc.new/bios/msint13.asm214
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