home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 10 Tools
/
10-Tools.zip
/
cset21v5.zip
/
TOOLKT21
/
ASM
/
SAMPLES
/
PDD
/
PDDDDM.ASM
< prev
next >
Wrap
Assembly Source File
|
1993-03-12
|
7KB
|
209 lines
; SCCSID = @(#)pddddm.asm 6.2 92/03/24
;**************************************************************************
; IBM Sample Physical Device Driver
;
; Copyright IBM Corp 1992.
;***************************************************************************
.286P
page 60,132
title _DD Kriter Tca Device Driver
.MODEL large,os_os2
INCLUDE devhlp.inc ; DEFINITION OF DEVICE HELP CALLS
EXTRN initialize:NEAR ;@VDD
EXTRN VTCAAddress:FAR ;@VDD
PUBLIC devhlp_ptr ;@VDD
page
; Request Header
rh segment at 0
rh_len db ? ; length of request header
rh_unit db ? ; unit CSEG (not used)
rh_command db ? ; command CSEG
rh_status dw ? ; status
rh_rsvd dw 2 dup(?) ; reserved for DOS
rh_q_link dw 2 dup(?) ; request queue linkage
rh_DSEG equ $ ; DSEG appropriate to the operation
; Request Header DSEG for INIT command
org rh_DSEG-rh
rh_no_units db ? ; number of units (not used)
rh_end_addr dd ? ; ending address of device driver
rh_bpb dd ? ; address of BPB array (not used)
rh_drive db ?
; Request Header DSEG for IOCTL command
org rh_DSEG-rh
rh_ioctl_categ db ? ; category CSEG
rh_ioctl_funct db ? ; function CSEG
rh_ioctl_parm dd ? ; addr of parms (offset and selector)
rh_ioctl_buff dd ? ; addr of buffer (offset and selector)
rh ends
;
;*******************************************************************************
; DSEG segment
;*******************************************************************************
DSEG SEGMENT PUBLIC 'DATA' ;@VDD
; Device Header
dd -1 ; address of next device header
dw 8880h ; device attribute
dw dev_strategy ; address of device strategy entry point
dw ? ; reserved
db 'TCA_DDM ' ; name
dw 4 dup(?) ; reserved
; TCA Device Driver Work Area
devhlp_ptr dd ? ; device help interface pointer
public IRQ_level
IRQ_level dw 9 ; hardware IRQ level currently in use @A0A
DSEG ends
;*******************************************************************************
; CSEG segment
;*******************************************************************************
CSEG SEGMENT PUBLIC 'CODE' ;@VDD
StatusReg equ 02d0h ; Tca card status reg io port (adapter 0)
ControlReg equ 02d4h ; Tca card control reg io port (adapter 0)
ControlDisable equ 080h ; Output to ControlReg to disable adapter
page
assume cs:CSEG,ds:DSEG,es:rh
;Device Strategy Entry Point
dev_strategy proc far
; INT 3
mov rh_status[bx],0100h ; store successful return CSEG and
; request complete status in
; request header status word
mov al,rh_command[bx] ; route control based on
cmp al,10h ; command CSEG
ja invalid_command ; invalid if above generic ioctl
sal al,1 ; set up to
cbw ; take the
mov si,ax ; correct jump into the table
jmp short route
page
function_table label word
dw initialize ; init
dw media_check
dw build_bpb
dw reserved_3
dw read
dw non_destruc_read
dw input_status
dw input_flush
dw write
dw write_verify
dw output_status
dw output_flush
dw reserved_c
dw dev_open ; open
dw dev_close ; close
dw remov_media
dw ioctl ; generic ioctl
route:
jmp function_table[si]
; Unsupported command CSEGs
invalid_command:
media_check:
build_bpb:
reserved_3:
read:
non_destruc_read:
input_status:
input_flush:
write:
write_verify:
output_status:
output_flush:
reserved_c:
remov_media:
dev_open:
dev_close:
ioctl:
mov rh_status[bx],8103h ; store unknown command error and
; request complete status in
; request header status word
ret
dev_strategy endp
;Device Interrupt Entry Point
public dev_interrupt
dev_interrupt proc far
assume ds:DSEG
cli ; ensure interrupts are inhibited
;
; remove IRQ entry point (disables IRQ)
;
mov bx,9 ; get the IRQ number @A0C
mov dl,DevHlp_UnSetIRQ ; UnSetIRQ command code in dl @A1A
call dword ptr [devhlp_ptr] ; Call to Device Help Services
jnc int198
; int 3
int198:
; @VDD
; Let VTCA know the interrupt occurred @VDD
; @VDD
.386P
mov eax,0 ;@VDD
push eax ;Function @VDD
push eax ;@VDD
push eax ;@VDD
call FWORD PTR [VTCAAddress] ;@VDD
.286P
mov ax,IRQ_level ; hardware EOI level in use @A2C
mov dl,31h
call [devhlp_ptr] ; issue EOI for level 9 interrupt
sti ;@VDD
clc
;@VDD
ret ; return @VDD
dev_interrupt endp
CSEG ends
end