138 lines
4.2 KiB
NASM
138 lines
4.2 KiB
NASM
.MODEL small
|
||
;*************************************************
|
||
; Filename: hpscan16.asm
|
||
; Purpose: Stub DOS Device Driver. Pass device
|
||
; "HPSCAN" requests to the VDD, hpscan32.dll.
|
||
; Environment: MSDOS, Windows NT.
|
||
; (C) Hewlett-Packard Company 1993.
|
||
;*************************************************
|
||
INCLUDE hpscan16.inc ;private
|
||
INCLUDE isvbop.inc ;NT DDK
|
||
|
||
SUBTTL Segment and data definitions
|
||
ASSUME CS:CSEG,DS:NOTHING,ES:NOTHING
|
||
CSEG SEGMENT
|
||
|
||
;-------------------------------------------------
|
||
; Resident data area - variables needed after init
|
||
;-------------------------------------------------
|
||
|
||
;**--- Device Header, must be at offset zero ---**
|
||
SCAN_HEADER:
|
||
dd -1 ;becomes ptr to next req hdr
|
||
dw 0C000H ;character, supports IOCTL
|
||
dw offset STRAT ;Strategy routine
|
||
dw offset IDVR ;Interrupt routine
|
||
DH_NAME db 'HPSCAN ' ;char device name
|
||
|
||
;**---- Request Header addr, saved by STRAT ----**
|
||
RH_PTRA LABEL DWORD
|
||
RH_PTRO dw ? ;offset
|
||
RH_PTRS dw ? ;segment
|
||
|
||
;**------------- Define Stack Space ------------**
|
||
STK_SEG dw ? ;Save original stack segment
|
||
STK_PTR dw ? ;Save original stack pointer
|
||
STACK dw 200 DUP (0) ;Local stack
|
||
TOP_STK dw ? ;Top of local stack
|
||
|
||
;**--------------- VDD information -------------**
|
||
VDD_DllName db "HPSCAN32.DLL", 0
|
||
VDD_InitFunc db "VDDInit", 0
|
||
VDD_DispFunc db "VDDDispatch", 0
|
||
VDD_hVDD dw ?
|
||
|
||
;**-------------- Copyright Info ---------------**
|
||
db '(C) Copyright Hewlett-Packard Company 1993.'
|
||
db 'All rights reserved.'
|
||
|
||
SUBTTL Device Strategy & Interrupt entry points
|
||
|
||
;**--------------- STRAT routine ---------------**
|
||
STRAT proc far ;Strategy routine
|
||
mov cs:RH_PTRO,bx ;save offset address
|
||
mov cs:RH_PTRS,es ;save segment address
|
||
ret ;end Strategy routine
|
||
STRAT endp
|
||
|
||
;**--------------- IDVR routine ---------------**
|
||
IDVR proc far ;Interrupt routine
|
||
push ds ;save all modified registers
|
||
push es ;DOS has stack for 20 pushes
|
||
push ax
|
||
push bx
|
||
push cx
|
||
push dx
|
||
push di
|
||
push si
|
||
push bp
|
||
|
||
mov cs:STK_PTR,sp ;save original stack ptr
|
||
mov cs:STK_SEG,ss ;save original stack seg
|
||
cli ;disable for stack ops
|
||
mov ax,cs ;setup new stack ptr
|
||
mov ss,ax ;setup new stack seg
|
||
mov sp,offset TOP_STK
|
||
sti ;restore flags back
|
||
cld ;all moves are forward
|
||
|
||
les bx,cs:RH_PTRA ;load req hdr adr in es:bx
|
||
mov al,RH.RHC_CMD
|
||
cmp al,0 ;check for init command
|
||
je BOOTUP ;command 0 = init
|
||
|
||
xor dx,dx ;some other command
|
||
mov dl,RH.RHC_CMD ;dx = command code
|
||
mov cx,RH.RHC_CNT ;cx = count
|
||
mov ax,RH.RHC_SEG ;es:bx = addr of data
|
||
mov bx,RH.RHC_OFF
|
||
mov es,ax ;finally, load VDD handle
|
||
mov ax,word ptr cs:[VDD_hVDD]
|
||
DispatchCall ;call Dispatch in VDD
|
||
;returns with status in di
|
||
EXIT:
|
||
les bx,cs:RH_PTRA ;restore ES:BX
|
||
or di,STAT_DONE ;add "DONE" bit to status
|
||
mov RH.RHC_STA,di ;save status in requ hdr
|
||
cli ;disable ints for stack op
|
||
mov ss,cs:STK_SEG ;restore stack seg
|
||
mov sp,cs:STK_PTR ;restore stack ptr
|
||
sti ;re-enable interrupts
|
||
|
||
pop bp ;restore registers
|
||
pop si
|
||
pop di
|
||
pop dx
|
||
pop cx
|
||
pop bx
|
||
pop ax
|
||
pop es
|
||
pop ds
|
||
ret ;far return
|
||
IDVR endp
|
||
|
||
;**--------- jump here for Init Command --------**
|
||
BOOTUP:
|
||
mov ax,offset EndDriver
|
||
mov RH.RHC_OFF,ax ;address of end of driver
|
||
mov RH.RHC_SEG,CS ;reference from code seg
|
||
|
||
mov si,offset VDD_DllName ;load regs for VDD
|
||
mov di,offset VDD_InitFunc
|
||
mov bx,offset VDD_DispFunc
|
||
mov ax,ds
|
||
mov es,ax
|
||
RegisterModule ;calls the VDD
|
||
jnc save_hVDD ;if NC then success
|
||
mov di,STAT_GF ;set failure status
|
||
jmp EXIT ;return via common exit
|
||
|
||
save_hVDD:
|
||
mov [VDD_hVDD],ax ;save handle in ax
|
||
mov di,STAT_OK ;load OK status
|
||
jmp EXIT ;return via common exit
|
||
|
||
EndDriver db ?
|
||
CSEG ENDS
|
||
END SCAN_HEADER ;REQUIRED BY EXE2BIN
|
||
|