home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / magazine / msysjour / ms / s12349 / test.asm < prev    next >
Assembly Source File  |  1989-06-06  |  8KB  |  253 lines

  1.         PAGE    ,132
  2.         TITLE   Test Device Driver
  3.         SUBTTL  MAIN MODULE
  4. .286P                   ; Enable 80286 protect-mode instructions
  5.  
  6.  
  7.         INCLUDE SAMPDEFS.INC                    ; which includes some other .incs
  8.  
  9. MAIN_DATA       SEGMENT WORD PUBLIC 'DATA'
  10.  
  11. MAIN_DATA       ENDS
  12.  
  13.  
  14. MAIN_CODE       SEGMENT WORD PUBLIC 'CODE'
  15.  
  16. MAIN_CODE       ENDS
  17.  
  18.  
  19. HIGH_DATA       SEGMENT WORD PUBLIC 'FAR_DATA'
  20.  
  21. HIGH_DATA       ENDS
  22.  
  23.  
  24. HIGH_CODE       SEGMENT WORD PUBLIC 'FAR_CODE'
  25.  
  26. extrn  HighTimer:FAR
  27.  
  28. HIGH_CODE       ENDS
  29.  
  30. MAIN_DATA SEGMENT WORD PUBLIC 'DATA'
  31.          ASSUME CS:MAIN_CODE,DS:MAIN_DATA,ES:NOTHING,SS:NOTHING
  32.  
  33. ;====================================================
  34. ;
  35. ; Device Header -
  36. ;
  37. ;====================================================
  38.  
  39. IFDEF DEBUG
  40.         PUBLIC  SAMP_DEV
  41. ENDIF
  42.  
  43. SAMP_DEV LABEL WORD
  44.         DW      -1,-1                               ; SYSINIT handles the segment part
  45.         DW      DEV_CHAR_DEV OR DEVLEV_1 OR DEV_30 OR DEV_GIOCTL
  46.                                                     ; Use equates in DEVHDR.INC
  47.                                                     ; to define Attribute word
  48.         DW      OFFSET MAIN_CODE:STRAT              ; offset to strategy routine
  49.                                                     ; entry point
  50.         DW      0                                   ; Reserved
  51.         DB      'TEST$   '                          ; Name of device
  52. DPS     DB      8 DUP (?)                           ; More reserved
  53.  
  54. ; End of the device header.
  55. ;============================================================================
  56.  
  57. ;
  58. ;  data structure used by this device driver
  59. ;
  60.  
  61.         EVEN
  62. DISPTAB LABEL WORD
  63.  
  64.         DW      OFFSET MAIN_CODE:SAMP_INIT       ;0: Init
  65.         DW      OFFSET MAIN_CODE:SAMP_EXIT       ;1: Media Check (Block Devices Only)
  66.         DW      OFFSET MAIN_CODE:SAMP_EXIT       ;2: Build BPB (Block Devices Only)
  67.         DW      OFFSET MAIN_CODE:SAMP_EXIT       ;3: Reserved (used to be Ioctl Input)
  68.         DW      OFFSET MAIN_CODE:SAMP_EXIT       ;4: Input (Read)
  69.         DW      OFFSET MAIN_CODE:SAMP_EXIT       ;5: Non-Destructive Input, no wait.
  70.         DW      OFFSET MAIN_CODE:SAMP_EXIT       ;6: Input Status
  71.         DW      OFFSET MAIN_CODE:SAMP_EXIT       ;7: Input Flush
  72.         DW      OFFSET MAIN_CODE:SAMP_EXIT       ;8: Output (Write)
  73.         DW      OFFSET MAIN_CODE:SAMP_EXIT       ;9: Output (Write) with verify
  74.         DW      OFFSET MAIN_CODE:SAMP_EXIT       ;10: Output Status
  75.         DW      OFFSET MAIN_CODE:SAMP_EXIT       ;11: Output Flush
  76.         DW      OFFSET MAIN_CODE:SAMP_EXIT       ;12: Reserved (used to be Ioctl Output)
  77.         DW      OFFSET MAIN_CODE:SAMP_EXIT       ;13: Device Open
  78.         DW      OFFSET MAIN_CODE:SAMP_EXIT       ;14: Device Close
  79.         DW      OFFSET MAIN_CODE:SAMP_EXIT       ;15: Removable Media
  80.         DW      OFFSET MAIN_CODE:SAMP_EXIT       ;16: Generic Ioctl
  81.         DW      OFFSET MAIN_CODE:SAMP_EXIT       ;17: Reset Media
  82.         DW      OFFSET MAIN_CODE:SAMP_EXIT       ;18: Get Logical Drive Map
  83.         DW      OFFSET MAIN_CODE:SAMP_EXIT       ;19: Set Logical Drive Map
  84.         DW      OFFSET MAIN_CODE:SAMP_EXIT       ;20: DeInstall
  85.  
  86. MAXCMD = (($ - DispTab)/2) - 1
  87.  
  88. DevHlp        DD   0
  89. HighDS        DW   SEG HIGH_DATA
  90.  
  91. PUBLIC        DevHlp
  92.  
  93. MAIN_DATA       ENDS
  94.  
  95.  
  96. page
  97.  
  98.  
  99. MAIN_CODE       SEGMENT WORD PUBLIC 'CODE'
  100.          ASSUME CS:MAIN_CODE,DS:MAIN_DATA,ES:NOTHING,SS:NOTHING
  101.  
  102. ;============================================================================
  103. ;
  104. ; - SAMP_STRAT -
  105. ;
  106. ;       Device Driver strategy entry point.
  107. ;       Parameters      - es:bx = Pointer to the request block
  108. ;
  109.  
  110. STRAT       PROC    FAR
  111.         ASSUME  DS:MAIN_DATA
  112.  
  113. IFDEF      DEBUG
  114.                INT     3
  115. ENDIF
  116.  
  117.         SUB     SP,SIZE LOCALDATA               ; reserve space for LocalData (Defined in .INC file)
  118.         MOV     BP,SP                           ; ...referenced with positive offsets
  119.         MOV     [BP].LD_PTRSAVE._OFF,BX         ; Save the virtual address  (ES:BX)
  120.         MOV     [BP].LD_PTRSAVE._SEG,ES         ; ...of the Request Packet.
  121.         MOV     AL,ES:[BX].PKTCMD               ; Get command from packet
  122.         CBW
  123.         CMP     AL,MAXCMD                       ; Make sure its allowed
  124.         JA      SAMPEXIT1                        ; Jump to exit if bad command.
  125.  
  126.         ADD     AX,AX                           ; Convert to table index
  127.                                                 ; (Word sized instead of byte sized)
  128.  
  129.         MOV     BX,AX                           ; Move to BX and...
  130.         JMP     DISPTAB[BX]                     ;Go execute command
  131.  
  132. ;
  133. ; On entry to each of the command handlers:
  134. ;
  135. ;       DS                 = Driver data
  136. ;       SS:BP              = LocalData structure
  137. ;       SS:[BP].LD_PTRSAVE = Far pointer to the request block, which looks like:
  138. ;
  139. ;               13-BYTE request header
  140. ;                   BYTE    length of packet in bytes
  141. ;                   BYTE    subunit number of BLOCK device (unused by char dev.)
  142. ;                   BYTE    command code
  143. ;                   WORD    status word (returned by DD)
  144. ;                   DWORD   reserved
  145. ;                   DWORD   request queue link
  146. ;               n WORDS command specific data
  147. ;
  148.  
  149. STRAT       ENDP
  150.  
  151. page
  152. ;============================================================================
  153. ;
  154. ; - SAMP_EXIT - All routines return through this path
  155. ;
  156. ; On transfer to a label within SAMPExit:
  157. ;       ss:bp              = LocalData structure
  158. ;       ss:[bp].ld_ptrsave = Far pointer to the request block
  159. ;
  160. ;   Notice that the stack doesn't have to be balanced when you get to here.
  161. ; You can be down 6 pushes deep, and jump to here, just so long as SS:BP
  162. ; points to the LocalData structure.  SP will be set from BP.
  163. ;============================================================================
  164.  
  165.  
  166.         PUBLIC  SAMP_EXIT,SAMPEXIT0,SAMPEXIT1,SAMPEXIT9
  167.  
  168. SAMP_EXIT PROC FAR
  169.     ASSUME DS:MAIN_DATA
  170.  
  171. SAMPEXIT0:                                      ;0100h Done, no error
  172.         MOV     AX,STDON
  173.         JMP     SHORT  FINAL_EXIT
  174.  
  175. SAMPEXIT1:                                      ;8103h Done, error = "unknown command"
  176.  
  177.  
  178. SAMPEXIT9:                                      ;810Ch Done, error = "general failure"
  179.  
  180.         MOV     AX,STDON+STERR+ERROR_I24_GEN_FAILURE
  181.  
  182. ; All exits come to this point before returning.
  183. ;
  184. FINAL_EXIT:
  185.  
  186.         LDS     BX,[BP].LD_PTRSAVE              ;Load packet address back into DS:BX
  187.         MOV     [BX].PKTSTATUS,AX               ;Mark operation complete
  188.  
  189.         MOV     SP,BP                           ;Re-Load SP form BP (clean up stack)
  190.         ADD     SP,SIZE LOCALDATA               ;And de-allocate local data space
  191.  
  192.  
  193.         RET
  194. SAMP_EXIT ENDP
  195.  
  196.  
  197. ;==============================================================================
  198. ;
  199. ;
  200. ;
  201. ;  Timer Handler
  202. ;
  203. ;
  204. ;
  205. ;==============================================================================
  206.  
  207.  
  208. TimerHandler   PROC    FAR
  209.                PUBLIC  TimerHandler
  210.  
  211.     pusha                                         ;
  212.     push    ds
  213.     mov     ds, HighDS                            ; DS -> extra data segment
  214.  
  215.     call    HighTimer                             ; HighTimer is in extra code
  216.  
  217.     pop     ds                                    ; segment (test_hi.asm)
  218.  
  219.     popa
  220.     ret
  221.  
  222. TimerHandler   ENDP
  223.  
  224.  
  225. ;==============================================================================
  226. ;
  227. ;
  228. ;
  229. ;  SAMP_INIT
  230. ;
  231. ;
  232. ;
  233. ;==============================================================================
  234.  
  235. IFDEF DEBUG
  236.         PUBLIC  SAMP_INIT
  237. ENDIF
  238.  
  239.  
  240. SAMP_INIT PROC NEAR
  241.         ASSUME  DS:MAIN_DATA
  242.  
  243. extrn   Do_Init:near
  244.         jmp    Do_Init         ; A routine in test_i.asm
  245.  
  246. SAMP_INIT        ENDP
  247.  
  248.  
  249. MAIN_CODE       ENDS
  250.                 END
  251.