;/***********************************************************************/
;/*                  Scanner Driver ToolKit                             */
;/*                   ASM Driver Program                                */
;/***********************************************************************/

SCANDRV_TEXT    SEGMENT WORD PUBLIC 'CODE'
                ASSUME  CS:SCANDRV_TEXT
                PUBLIC  _ScanOpen
                PUBLIC  _ScanClose
                PUBLIC  _ScanGetParameters
                PUBLIC  _ScanSetParameters
                PUBLIC  _ScanStart
                PUBLIC  _ScanStop

GetParameters           EQU     00
SetParameters           EQU     01
StartScan               EQU     02
StopScan                EQU     03

OPENFILE        EQU     3DH
CLOSEFILE       EQU     3EH
IOCTL           EQU     44H
SYSCALL         EQU     21H
NULLF           EQU     0H

gen_ioctl          struc
        ioctl_function  db      ?
        param_addr      dd      ?
        data_addr       dd      ?
gen_ioctl    ends

CB_function             db      0
CB_param_off            dw      0
CB_param_seg            dw      0
CB_data_off             dw      0
CB_data_seg             dw      0
                
wDrvHandle              dw      0
szDrvName               db      "PRO$SCAN",0

_ScanOpen       PROC    FAR
                PUSH    DX
                PUSH    DS

                MOV     AH,OPENFILE
                MOV     AL,2                    ;read & write
                MOV     DX,OFFSET szDrvName
                PUSH    CS
                POP     DS                      ;ds:dx point to driver name
                INT     SYSCALL
                MOV     CS:wDrvHandle,AX        ;save driver handle
                MOV     AX,1
                JNC     OPEN_SUCCESS
                MOV     AX,0
OPEN_SUCCESS:
                POP     DS
                POP     DX
                RET
_ScanOpen       ENDP

_ScanClose      PROC    FAR
                PUSH    BX

                MOV     AH,CLOSEFILE
                MOV     BX,CS:wDrvHandle
                INT     SYSCALL
                MOV     AX,1
                JNC     CLOSE_SUCCESS
                MOV     AX,0
CLOSE_SUCCESS:
                POP     BX
                RET
_ScanClose      ENDP

_ScanGetParameters      PROC    FAR
                PUSH    BP
                MOV     BP,SP
                PUSH    BX
                PUSH    CX
                PUSH    DX
                PUSH    DS

                PUSH    CS
                POP     DS
;
                MOV     CB_function,GetParameters
                XOR     AX,AX
                MOV     CB_param_off,AX
                MOV     CB_param_seg,AX
                MOV     AX,[BP+6]
                MOV     CB_data_off,AX
                MOV     AX,[BP+8]
                MOV     CB_data_SEG,AX
;
                MOV     AH,IOCTL
                MOV     AL,3                    ;SEND CONTROL DATA
                MOV     BX,wDrvHandle
                MOV     CX,9                    ;SIZE OF CB
                MOV     DX,OFFSET CB_function   ;ds:dx point to CB
                INT     SYSCALL
                MOV     AX,1
                JNC     GET_SUCCESS
                MOV     AX,0
GET_SUCCESS:
                POP     DS
                POP     DX
                POP     CX
                POP     BX
                MOV     SP,BP
                POP     BP
                RET
_ScanGetParameters      ENDP

_ScanSetParameters      PROC    FAR
                PUSH    BP
                MOV     BP,SP
                PUSH    BX
                PUSH    CX
                PUSH    DX
                PUSH    DS

                PUSH    CS
                POP     DS
;
                MOV     CB_function,SetParameters
                MOV     AX,[BP+6]
                MOV     CB_param_off,AX
                MOV     AX,[BP+8]
                MOV     CB_param_SEG,AX
                XOR     AX,AX
                MOV     CB_data_off,AX
                MOV     CB_data_seg,AX
;
                MOV     AH,IOCTL
                MOV     AL,3                    ;SEND CONTROL DATA
                MOV     BX,wDrvHandle
                MOV     CX,9                    ;SIZE OF CB
                MOV     DX,OFFSET CB_function   ;ds:dx point to CB
                INT     SYSCALL
                MOV     AX,1
                JNC     SET_SUCCESS
                MOV     AX,0
SET_SUCCESS:
                POP     DS
                POP     DX
                POP     CX
                POP     BX
                MOV     SP,BP
                POP     BP
                RET
_ScanSetParameters      ENDP

_ScanStart      PROC    FAR
                PUSH    BP
                MOV     BP,SP
                PUSH    BX
                PUSH    CX
                PUSH    DX
                PUSH    DS

                PUSH    CS
                POP     DS
;
                MOV     CB_function,StartScan
                MOV     AX,[BP+6]
                MOV     CB_param_off,AX
                MOV     AX,[BP+8]
                MOV     CB_param_SEG,AX
                MOV     AX,[BP+10]
                MOV     CB_data_off,AX
                MOV     AX,[BP+12]
                MOV     CB_data_seg,AX
;
                MOV     AH,IOCTL
                MOV     AL,3                    ;SEND CONTROL DATA
                MOV     BX,wDrvHandle
                MOV     CX,9                    ;SIZE OF CB
                MOV     DX,OFFSET CB_function   ;ds:dx point to CB
                INT     SYSCALL
                MOV     AX,1
                JNC     START_SUCCESS
                MOV     AX,0
START_SUCCESS:
                POP     DS
                POP     DX
                POP     CX
                POP     BX
                MOV     SP,BP
                POP     BP
                RET
_ScanStart      ENDP

_ScanStop       PROC    FAR
                PUSH    BP
                MOV     BP,SP
                PUSH    BX
                PUSH    CX
                PUSH    DX
                PUSH    DS

                PUSH    CS
                POP     DS
;
                MOV     CB_function,StopScan
                XOR     AX,AX
                MOV     CB_param_off,AX
                MOV     CB_param_SEG,AX
                MOV     CB_data_off,AX
                MOV     CB_data_seg,AX
;
                MOV     AH,IOCTL
                MOV     AL,3                    ;SEND CONTROL DATA
                MOV     BX,wDrvHandle
                MOV     CX,9                    ;SIZE OF CB
                MOV     DX,OFFSET CB_function   ;ds:dx point to CB
                INT     SYSCALL
                MOV     AX,1
                JNC     STOP_SUCCESS
                MOV     AX,0
STOP_SUCCESS:
                POP     DS
                POP     DX
                POP     CX
                POP     BX
                MOV     SP,BP
                POP     BP
                RET
_ScanStop       ENDP

SCANDRV_TEXT    ENDS
                END
