159 lines
3.6 KiB
NASM
159 lines
3.6 KiB
NASM
include isvbop.inc
|
|
|
|
.286
|
|
.model medium,pascal
|
|
|
|
_DATA segment word public 'DATA'
|
|
|
|
Old2fHandler dd ?
|
|
Old73Handler dd ?
|
|
VddHandle dw -1
|
|
|
|
DllName db "VWIPXSPX.DLL",0
|
|
InitFunc db "VwInitialize",0
|
|
DispFunc db "VwDispatcher",0
|
|
|
|
_DATA ends
|
|
|
|
INIT_TEXT segment byte public 'CODE'
|
|
|
|
assume cs:INIT_TEXT
|
|
|
|
GrabInterrupts proc far
|
|
pusha
|
|
push ds
|
|
push es
|
|
push _DATA
|
|
pop ds
|
|
assume ds:_DATA
|
|
push ds
|
|
pop es
|
|
mov si,offset DllName ; ds:si = library name
|
|
mov di,offset InitFunc ; es:di = init function name
|
|
mov bx,offset DispFunc ; ds:bx = dispatcher function name
|
|
RegisterModule ; returns carry if problem
|
|
jc @f
|
|
mov VddHandle,ax
|
|
mov ax,352fh
|
|
int 21h
|
|
mov word ptr Old2fHandler,bx
|
|
mov word ptr Old2fHandler+2,es
|
|
ifdef NEC_98
|
|
mov ax,3513h
|
|
else ; NEC_98
|
|
mov ax,3573h
|
|
endif ; NEC_98
|
|
int 21h
|
|
mov word ptr Old73Handler,bx
|
|
mov word ptr Old73Handler+2,es
|
|
push seg PmIpx2fHandler
|
|
pop ds
|
|
assume ds:nothing
|
|
mov dx,offset PmIpx2fHandler
|
|
mov ax,252fh
|
|
int 21h
|
|
mov dx,offset PmIpx73Handler
|
|
ifdef NEC_98
|
|
mov ax,2513h
|
|
else ; NEC_98
|
|
mov ax,2573h
|
|
endif ; NEC_98
|
|
int 21h
|
|
@@: pop es
|
|
pop ds
|
|
popa
|
|
ret
|
|
GrabInterrupts endp
|
|
|
|
INIT_TEXT ends
|
|
|
|
_TEXT segment byte public 'CODE'
|
|
|
|
assume cs:_TEXT
|
|
|
|
public PmIpx2fHandler
|
|
PmIpx2fHandler proc
|
|
cmp ax,1684h
|
|
jne @f
|
|
cmp bx,200h
|
|
jne @f
|
|
push cs
|
|
pop es
|
|
mov di,offset PmIpxEntryPoint
|
|
iret
|
|
@@: push bp
|
|
mov bp,sp
|
|
push ax
|
|
push ds
|
|
mov ax,_DATA
|
|
mov ds,ax
|
|
assume ds:_DATA
|
|
push word ptr Old2fHandler+2
|
|
push word ptr Old2fHandler
|
|
mov ds,[bp-4]
|
|
mov ax,[bp-2]
|
|
mov bp,[bp]
|
|
retf 6
|
|
PmIpx2fHandler endp
|
|
|
|
public PmIpx73Handler
|
|
PmIpx73Handler proc
|
|
push ds
|
|
push es
|
|
pusha
|
|
mov bx,_DATA
|
|
mov ds,bx
|
|
assume ds:_DATA
|
|
mov ax,VddHandle
|
|
mov bx,-2
|
|
DispatchCall ; get ECB
|
|
jc @f
|
|
call dword ptr es:[si][4] ; branch to the ESR
|
|
mov al,20h
|
|
ifdef NEC_98
|
|
out 08h,al ; clear slave pic
|
|
out 00h,al ; " master "
|
|
else ; NEC_98
|
|
out 0a0h,al ; clear slave pic
|
|
out 20h,al ; " master "
|
|
endif ; NEC_98
|
|
popa
|
|
pop es
|
|
pop ds
|
|
assume ds:nothing
|
|
iret
|
|
@@: popa
|
|
pop es
|
|
push bp
|
|
mov bp,sp
|
|
push _DATA
|
|
pop ds
|
|
assume ds:_DATA
|
|
push word ptr Old73Handler+2
|
|
push word ptr Old73Handler
|
|
mov ds,[bp+2]
|
|
assume ds:nothing
|
|
mov bp,[bp]
|
|
retf 4
|
|
PmIpx73Handler endp
|
|
|
|
public PmIpxEntryPoint
|
|
PmIpxEntryPoint proc
|
|
push bp
|
|
push ds
|
|
push _DATA
|
|
pop ds
|
|
assume ds:_DATA
|
|
mov bp,ax
|
|
mov ax,VddHandle
|
|
pop ds
|
|
assume ds:nothing
|
|
DispatchCall
|
|
pop bp
|
|
ret
|
|
PmIpxEntryPoint endp
|
|
|
|
_TEXT ends
|
|
|
|
end
|