summaryrefslogtreecommitdiffstats
path: root/private/mvdm/vdd/samples/mscdex/tsr/mscdexnt.asm
diff options
context:
space:
mode:
Diffstat (limited to 'private/mvdm/vdd/samples/mscdex/tsr/mscdexnt.asm')
-rw-r--r--private/mvdm/vdd/samples/mscdex/tsr/mscdexnt.asm246
1 files changed, 246 insertions, 0 deletions
diff --git a/private/mvdm/vdd/samples/mscdex/tsr/mscdexnt.asm b/private/mvdm/vdd/samples/mscdex/tsr/mscdexnt.asm
new file mode 100644
index 000000000..ca0ff46a1
--- /dev/null
+++ b/private/mvdm/vdd/samples/mscdex/tsr/mscdexnt.asm
@@ -0,0 +1,246 @@
+ name mscdexnt
+;
+; MSCDEXNT
+;
+; Author: Neil Sandlin (neilsa)
+;
+; Description:
+;
+; This TSR implements the v86 mode portion of MSCDEX support under
+; NT. Basically, all this piece does is hook INT2F and watch for
+; MSCDEX calls. When the first one occurs, it tries to load VCDEX.DLL.
+; If that succeeds, it passes the call (and all subsequent calls)
+; to VCDEX for processing.
+;
+ include isvbop.inc
+ include mscdexnt.inc
+
+_TEXT segment word public 'CODE'
+ assume cs:_TEXT,ds:_TEXT,es:_TEXT
+
+;*----------------------- TSR Code --------------------------*
+
+DrvStrat proc far ; Strategy Routine
+ ret
+DrvStrat endp
+
+DrvIntr proc far ; INterrupt routine
+ ret
+DrvIntr endp
+
+;******************************************************************************
+;
+; Int2FHook
+;
+;
+;******************************************************************************
+Int2FHook proc near
+
+ cmp ah, MSCDEX_ID ;MSCDEX?
+ jnz int2fchain ;no
+ cmp al, MAX_MSCDEX_CMD ;command too high?
+ ja int2fchain ;yes
+
+ cmp word ptr cs:[hVDD], 0 ;zero is an invalid module handle
+ jnz callvdd ;registered ok
+
+ cmp byte ptr cs:[fVDDChecked],1
+ jz vddfailed
+
+ call RegisterVDD
+ jc vddfailed ;didn't get it
+
+callvdd:
+ push ax ;put ax on stack
+ mov ax, word ptr cs:[hVDD]
+ DispatchCall
+ add sp, 2 ;vdd has set ax accordingly
+ iret ;svc handled, return to caller
+
+vddfailed:
+ or al,al
+ jnz try_0b
+ xor bx,bx
+ jmp short int2f_done
+try_0b:
+ cmp al,0bh
+ jne int2f_done
+;; williamh - June 1 1993 - if unable to load VDD, we should tell
+;; the caller that the drive is NOT a cd rom.
+ xor ax, ax
+ mov bx,0adadh
+int2f_done:
+ iret
+
+int2fchain:
+ jmp dword ptr cs:[oldint]
+
+Int2FHook endp
+
+;****************************************************************************
+;
+; RegisterVDD
+;
+;****************************************************************************
+RegisterVDD proc near
+
+ push ax
+ push bx
+ push cx
+ push dx
+ push si
+ push di
+ push ds
+ push es
+
+
+ mov ax, cs
+ mov ds, ax
+ mov es, ax
+ ; Load vcdex.dll
+ mov si, offset DllName ; ds:si = dll name
+ mov di, offset InitFunc ; es:di = init routine
+ mov bx, offset DispFunc ; ds:bx = dispatch routine
+
+ push cs ; pass far pointer to headers
+ pop cx ; in cx:dx
+ mov dx, offset drive_header
+
+ RegisterModule
+ jc errorexit ; jif error
+ mov cs:[hVDD],ax ; save handle
+
+errorexit:
+ mov byte ptr cs:[fVDDChecked],1
+ pop es
+ pop ds
+ pop di
+ pop si
+ pop dx
+ pop cx
+ pop bx
+ pop ax
+ ret
+
+RegisterVDD endp
+
+;*----------------------- TSR Data Area ---------------------*
+oldint dd 0
+hVDD DW 0
+
+fVDDChecked DB 0 ; 0 - VDD never called. 1 - VDD once called.
+
+DllName DB "VCDEX.DLL",0
+InitFunc DB "VDDRegisterInit",0
+DispFunc DB "VDDDispatch",0
+
+
+ ALIGN 16
+drive_header:
+ DrvHd 'MSCDEX00'
+
+ ALIGN 16
+Init_Fence:
+;*-------------------------- Initialization Code ----------------------*
+
+mscdexnt proc far
+
+ ; at this point es,ds -> PSP
+ ; SS:SP points to stack
+
+ ; first check that we are running under NT
+
+ mov ax, GET_NT_VERSION
+ int 21h
+ cmp bl, NT_MAJOR_VERSION
+ je cdx_chk_more
+ jmp cdx_badver
+cdx_chk_more:
+ cmp bh, NT_MINOR_VERSION
+ je cdx_ver_ok
+ jmp cdx_badver
+
+cdx_ver_ok:
+ ; Now check that this TSR is'nt already installed
+ mov ah,MSCDEX_ID
+ mov al,0bh ; call function 0b
+ int MPX_INT ; int 2f
+
+ cmp bx,0adadh
+ jne cdx_chks_done
+ jmp cdx_installed
+
+cdx_chks_done:
+
+ ; free the env segment
+
+ push es
+ push ds
+ mov es, es:[2ch]
+ mov ah, 49h
+ int 21h
+
+ mov ah, DOS_GET_VECTOR
+ mov al, MPX_INT ; 2f
+ int 21h ; get old vector
+ mov WORD PTR cs:oldint,bx ; save old vector here
+ mov WORD PTR cs:oldint+2,es
+
+ mov dx, offset Int2FHook
+ push cs ; get current code segment
+ pop ds
+ mov ah, DOS_SET_VECTOR
+ mov al, MPX_INT ; vector to hook
+ int 21h ; hook that vector
+
+;
+; Compute size of TSR area
+;
+ pop ds
+ pop es
+ mov dx, offset Init_Fence ; end of fixed TSR code
+ mov cl, 4 ; divide by 16
+ shr dx, cl
+ add dx, 16 ; add in PSP
+;
+; Terminate and stay resident
+;
+ mov ah, DOS_TSR ; TSR
+ mov al, 0
+ int 21h ; TSR
+
+cdx_badver:
+ mov dx, offset Message1
+ push cs
+ pop ds
+ mov ah,09h
+ int 21h
+ jmp short cdx_exit
+
+cdx_installed:
+ mov dx, offset Message2
+ push cs
+ pop ds
+ mov ah,09h
+ int 21h
+
+cdx_exit:
+ mov ax,4c00h ; Exit
+ int 21h
+
+mscdexnt endp
+
+ include messages.inc
+
+_TEXT ends
+
+InitStack segment para stack 'STACK'
+
+ dw 256 dup (?)
+
+top_of_stack equ $
+
+InitStack ends
+
+ end mscdexnt
+