home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / cset21v5.zip / TOOLKT21 / ASM / SAMPLES / PDD / PDDIDC.ASM < prev    next >
Assembly Source File  |  1993-03-12  |  8KB  |  273 lines

  1. ;       SCCSID = @(#)pddidc.asm    6.3 92/03/24
  2. ;**************************************************************************
  3. ;                   IBM Sample Physical Device Driver
  4. ;
  5. ;                   Copyright  IBM Corp 1992.
  6. ;***************************************************************************
  7. ;CODING CONVENTIONS
  8. ; all psuedo-ops, equates, documentation, publics, and externs are in uppercase.
  9. ; all CSEG and DSEG names are in lowercase.
  10. ;
  11. ;  ROUTINES IN THIS MODULE:
  12. ;             tcacmd_entry               router routine for vtca calls
  13. ;             tcaRegister                registers PDD with VDMM
  14. ;
  15. ;****************************************************************************
  16. INCL_ERRORS     equ 1
  17. INCL_MACROS     equ 1
  18.  
  19. .MODEL  large,os_os2
  20. .XCREF
  21. .XLIST
  22.         INCLUDE  pdd.inc                ; TCA MACROS AND DEFINITIONS
  23.         INCLUDE  bseerr.inc             ; ERROR CSEGS FOR DEVICES
  24.         INCLUDE  basemaca.inc           ; VARIOUS MACRO'S (BREAK, LJC, ETC.)
  25.         INCLUDE  devhlp.inc             ; DEFINITION OF DEVICE HELP CALLS
  26. .286P
  27.         .LIST
  28.         .CREF
  29. ;**********************************************************************
  30. ;           EXTERNALS FOR VDD
  31. ;**********************************************************************
  32.         PUBLIC ptcaname                 ; pointer to Driver Name
  33.         PUBLIC VTCAAddress              ; address of TCA VDD entry point
  34.         EXTRN devhlp_ptr:DWORD          ; pointer to DEV HELP services
  35.         EXTRN    dev_interrupt:far
  36.         EXTRN    IRQ_level:word
  37. ;*****************************************************************************
  38. ; DSEG AREA FOR MVDM VDD-PDD IMPLEMENTATION
  39. ;*****************************************************************************
  40. DSEG    SEGMENT  PUBLIC  'DATA'
  41. VTCAAddress df         0               ; HOLDS ADDRESS OF TCA VDD ENTRY POINT
  42.  
  43. ptcaname    db         'PDD.SYS',0     ;DEVICE DRIVER NAME
  44.  
  45. DSEGend         label      byte
  46. DSEG            ends
  47.  
  48. ;***************************************************************
  49. ; CSEG segment
  50. ;***************************************************************
  51.  
  52. CSEG    SEGMENT  PUBLIC 'CODE'
  53.  
  54.         page
  55.  
  56.  
  57. ;******************* START OF SPECIFICATIONS ************************
  58. ;
  59. ; SUBROUTINE NAME:  tcacmd_entry
  60. ;
  61. ; DESCRIPTIVE NAME: TCA command processing entry point for VDD
  62. ;
  63. ; FUNCTION: This entry point is the TCA PDD's IDC router/handler.
  64. ;           IDC function requests are routed to the proper routines.
  65. ;           The address of this routine is set up during
  66. ;           initialization with the DevHlp RegisterPDD call.
  67. ;           Currently, the VDD does not call the PDD except during
  68. ;           VDD initialization.
  69. ;
  70. ; ENTRY POINT: tcacmd_entry
  71. ;       LINKAGE: CALL FAR
  72. ;
  73. ; INPUT: On entry the stack is set-up as shown:
  74. ;
  75. ;        TOS -> return address (4 words)
  76. ;               variable 2     (2 words)
  77. ;               variable 1     (2 words)
  78. ;               function code  (2 words)
  79. ;
  80. ; Where: Variable 1 and 2 are specified in the worker routine.
  81. ;        CX    -> Variable 1
  82. ;        DX:DI -> variable 2
  83. ;
  84. ; EXIT-NORMAL: EAX = 1
  85. ;
  86. ;           if Func = 0    (Register)
  87. ;              P1.offset  = 0
  88. ;              P1.segment = VDD's CS
  89. ;              P2.offset  = low 16-bits of VDD EIP for entry point
  90. ;              P2.segment = high 16-bits of VDD EIP for entry point
  91. ;
  92. ;           returns:
  93. ;              AX = 1
  94. ;
  95. ;           if Func = 1    (Enable)
  96. ;              P1.offset  = 0
  97. ;              P1.segment = 0
  98. ;              P2.offset  = 0
  99. ;              P2.segment = 0
  100. ;
  101. ;           returns:
  102. ;              AX = 1
  103. ;
  104. ;           if Func = 2    (Disable)
  105. ;              P1.offset  = 0
  106. ;              P1.segment = 0
  107. ;              P2.offset  = 0
  108. ;              P2.segment = 0
  109. ;
  110. ;           returns:
  111. ;              AX = 1
  112. ;
  113. ; EXIT-ERROR:  EAX = error return code
  114. ;              ERROR_I24_INVALID_PARAMETER    if function code from
  115. ;                                             VDD is not recognized
  116. ;
  117. ; INTERNAL REFERENCES:  NONE
  118. ;
  119. ; EXTERNAL REFERENCES:  NONE
  120. ;
  121. ;********************************************************************
  122. tcacmd_entry PROC FAR
  123.  
  124.         ASSUME  CS:CSEG,DS:DSEG
  125.  
  126. ;
  127. ;       set up stack frame pointer
  128. ;
  129.         SaveReg   <bp>
  130.         mov       bp,sp
  131.         SaveReg   <ds>
  132.         SaveReg   <bx>
  133.  
  134.         setDS   DSEG              ; get DS addressability
  135. ;
  136. ;    Select (Function type)
  137. ;
  138. ;        Case (Register - 0):
  139. pse000:
  140. .386P
  141.         cmp     [bp].uFunc,0
  142.  
  143. .286P
  144.         jne     pse010
  145. ;
  146. ;            Save 16:32 pointer of VTCA notification entry point
  147. ;            in global (fixed) DSEG (VTCAAddress)
  148. ;
  149.         mov     ax,[bp].ul1._lo
  150.         mov     [VTCAAddress].fp_sel,ax
  151.         mov     ax,[bp].ul2._lo
  152.         mov     [VTCAAddress].fp_offlo,ax
  153.         mov     ax,[bp].ul2._hi
  154.         mov     [VTCAAddress].fp_offhi,ax
  155.  
  156.         jmp     pse198
  157.  
  158. pse010:
  159. ;
  160. ;        Case (Enable - 1):
  161. .386P
  162.         cmp     [bp].uFunc,1
  163. .286P
  164.         jne     pse020
  165. ;
  166. ;       register interrupt entry point for IRQ (enables IRQ)
  167. ;
  168.  
  169.         mov     ax,offset CS:dev_interrupt  ; offset to interrupt routine @VDD?
  170.         mov     bx,9                     ; get the IRQ number              @A0C
  171.         mov     irq_level,bx              ;
  172.         mov     dh,0                                                     ; @A1A
  173.         mov     dl,DevHlp_SetIRQ         ; SetIRQ command code in dl       @A1A
  174.         call    dword ptr [devhlp_ptr]   ; Call to Device Help Services
  175.  
  176.         jnc     pse198
  177.       ; int 3
  178.  
  179. ;
  180. ;        Case (Disable - 2):
  181. pse020:
  182. .386P
  183.         cmp     [bp].uFunc,2
  184. .286P
  185.         jne     pse199
  186. ;
  187. ;       remove IRQ entry point (disables IRQ)
  188. ;
  189.  
  190.         mov     bx,9                     ; get the IRQ number              @A0C
  191.         mov     dl,DevHlp_UnSetIRQ       ; UnSetIRQ command code in dl     @A1A
  192.         call    dword ptr [devhlp_ptr]   ; Call to Device Help Services
  193.  
  194.         jnc     pse198
  195.         ; int 3
  196.  
  197. pse198:
  198.         mov     ax,1                    ; show no error
  199.         jmp     pse200                  ; now return
  200.  
  201. pse199:
  202.         mov     ax,ERROR_I24_INVALID_PARAMETER  ; indicate error
  203. pse200:
  204.  
  205.         RestoreReg <bx,ds,bp>              ; restore frame pointer
  206. ;
  207. ;    RETURN (32 bit)
  208. ;
  209.         db      66h
  210.         ret     12
  211.  
  212. tcacmd_entry endp
  213.  
  214.  
  215. ;******************* START OF SPECIFICATIONS ************************
  216. ;
  217. ; SUBROUTINE NAME:  tcaRegister
  218. ;
  219. ; DESCRIPTIVE NAME: TCA PDD register entry point for initializtion
  220. ;
  221. ; FUNCTION: This entry point is the TCA PDD's Register routine.
  222. ;           This routine registers the PDD's entry point with the
  223. ;           VDD. The PDD entry point is the router for all the IDC
  224. ;           communications.
  225. ;
  226. ; ENTRY POINT: tcaRegister
  227. ;       LINKAGE: CALL NEAR
  228. ;
  229. ; INPUT: NONE
  230. ;
  231. ; EXIT-NORMAL: EAX = NONE
  232. ;
  233. ; EXIT-ERROR:  EAX = NONE
  234. ;
  235. ; INTERNAL REFERENCES:  NONE
  236. ;
  237. ; EXTERNAL REFERENCES:  NONE
  238. ;
  239. ;********************************************************************
  240.  
  241. Procedure tcaRegister,FAR
  242.  
  243.         ASSUME  CS:CSEG,DS:DSEG
  244.  
  245. ;
  246. ;VDM call VDMM to register a stack-based entry point
  247. ;
  248.  
  249. ;        int   3                 ;uncomment this for debug
  250.          SaveReg <si,di,es>      ; save used registers
  251.  
  252.          lea     si,ptcaname     ; set up ds:si -> name string
  253.  
  254.          mov     dx,CSEG         ; set up es:di -> routine being registered
  255.          and dl,0FCh             ; make sure this is ring 0 !!!!!!!!!!!!
  256.  
  257.          mov     es,dx
  258.          lea     di,CSEG:tcacmd_entry
  259.  
  260.          mov     dl,DevHlp_RegisterPDD   ; set up function type
  261.  
  262.  
  263.          call    [devhlp_ptr]            ; call DEV HELP
  264.  
  265.          RestoreReg <es,di,si>           ; restore used registers
  266.  
  267.          ret
  268.  
  269. EndProc tcaRegister
  270.  
  271. CSEG    ends
  272.         end
  273.