home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / listings / v_02_05 / 2n05026a < prev    next >
Text File  |  1991-03-27  |  8KB  |  396 lines

  1.         title    Net_CD
  2.         page    59, 132
  3. ;
  4. ; File:        Net_CD.ASM
  5. ; Purpose:    Workstation client device driver for
  6. ;        remote CDROM access
  7. ; Description:    This file contains the device driver 
  8. ;        header and the standard strategy and
  9. ;        interrupt routines, as well as some
  10. ;        of the initialization code and 
  11. ;        interfaces to BIOS, DOS, and NetBIOS
  12. ;        functions.
  13. ;
  14.  
  15.         subttl    Structure definitions
  16.         page    +
  17. ;
  18. ; Standard device driver header
  19. ;
  20. rh        struc
  21.  
  22. rh_length    db    ?    ; header size, bytes
  23. rh_unit        db    ?    ; block dev. unit #
  24. rh_command    db    ?    ; device command code
  25. rh_status    dw    ?    ; device command status
  26. rh_reserved    db     8 dup (?)
  27. rh        ends
  28.  
  29. ;
  30. ; INIT command header extensions
  31. ;
  32. rh0        struc
  33.  
  34. rh0_rh        db    size rh dup (?)
  35. rh0_numUnits    db    ?    ; number block units
  36. rh0_brkAddress    dd    ?    ; end of driver address
  37. rh0_bpb        dd    ?    ; BIOS parameter block
  38. rh0_devNumber    db    ?    ; block device number 
  39. rh0        ends
  40.  
  41.         subttl     'C' Driver Functions
  42.         page    +
  43. ;
  44. ; Externally linked 'C' function declarations
  45. ;
  46. extrn        _UnknownCommand:near
  47. extrn        _Initialize:near
  48. extrn        _DevOpen:near
  49. extrn        _DevClose:near
  50. extrn        _IOInput:near
  51. extrn        _IOOutput:near
  52.  
  53. extrn        _ReadLong:near
  54. extrn        _ReadPrefetch:near
  55. extrn        _Seek:near
  56.  
  57.  
  58.         subttl     Segment Declarations
  59.         page    +
  60. ;
  61. ; Segments are declared with _DATA first to allow the
  62. ; device driver header to appear at offset 0 within the
  63. ; driver at load time.  _BSS and CONST are present to
  64. ; handle normal MS-C code emissions.  _TEXT and INIT are
  65. ; declared last to allow for easy discarding of the
  66. ; driver Initialize routine.
  67. ;
  68. DGROUP    group    _DATA, _BSS, CONST, _TEXT, INIT
  69.  
  70. _DATA        segment word PUBLIC 'DATA'
  71.         assume ds:DGROUP
  72. _DATA        ends
  73.  
  74. _BSS        segment word PUBLIC 'BSS'
  75.         assume ds:DGROUP
  76. _BSS        ends
  77.  
  78. CONST        segment word PUBLIC 'CONST'
  79.         assume ds:DGROUP
  80. CONST        ends
  81.  
  82. _TEXT        segment word PUBLIC 'CODE'
  83.         assume cs:DGROUP, ds:DGROUP
  84. _TEXT        ends
  85.  
  86. INIT        segment word PUBLIC 'INIT'
  87.         assume cs:DGROUP, ds:DGROUP
  88. INIT        ends
  89.  
  90.         subttl    Net_CD Data Segment
  91.         page    + 
  92.  
  93. _DATA        segment
  94.  
  95. Net_CD:
  96.  
  97. ; Public declarations for initialization code 
  98.         PUBLIC    _DevHeader 
  99. ; Device driver header with CDROM extension fields 
  100. _DevHeader    label    word
  101.         dd    -1    ; next driver
  102.         dw    0c800h    ; device attributes
  103.         dw    DGROUP:DevStrategy
  104.         dw    DGROUP:DevInterrupt
  105.         db    'NET-CD  '
  106.         dw    0    ; CDROM reserved
  107.         db    0    ; CDROM drive letter
  108.         db    1    ; number of units
  109.  
  110. ;
  111. ; Local data for function dispatcher
  112. ;
  113. rh_offset    dw    ?    ; Req Hdr pointer
  114. rh_segment    dw    ?
  115.  
  116. save_sp        dw    ?    ; old stack save
  117. save_ss        dw    ?    ;   area
  118.  
  119. local_stack    dw    256 dup ('s')    ; local stack
  120. top_stack    dw    DGROUP:$    ;   me and 'C'
  121.  
  122. ;
  123. ; Driver standard commands jump table
  124. ;
  125. DevCmdTbl    label    word
  126.         dw    DGROUP:_Initialize
  127.         dw    DGROUP:_UnknownCommand
  128.         dw    DGROUP:_UnknownCommand
  129.         dw    DGROUP:_IOInput
  130.         dw    DGROUP:_UnknownCommand
  131.         dw    DGROUP:_UnknownCommand
  132.         dw    DGROUP:_UnknownCommand
  133.         dw    DGROUP:_UnknownCommand
  134.         dw    DGROUP:_UnknownCommand
  135.         dw    DGROUP:_UnknownCommand
  136.         dw    DGROUP:_UnknownCommand
  137.         dw    DGROUP:_UnknownCommand
  138.         dw    DGROUP:_IOOutput
  139.         dw    DGROUP:_DevOpen
  140.         dw    DGROUP:_DevClose
  141.         dw    DGROUP:_UnknownCommand
  142.  
  143. ;
  144. ; CDROM extended commands jump table
  145. ;
  146. DevExtCmdTbl    label     word
  147.         dw    DGROUP:_ReadLong
  148.         dw    DGROUP:_UnknownCommand
  149.         dw    DGROUP:_ReadPrefetch
  150.         dw    DGROUP:_Seek
  151.         dw    DGROUP:_UnknownCommand
  152.         dw    DGROUP:_UnknownCommand
  153.         dw    DGROUP:_UnknownCommand
  154.         dw    DGROUP:_UnknownCommand
  155.         dw    DGROUP:_UnknownCommand
  156.  
  157.  
  158. _DATA        ends
  159.  
  160.         subttl     Net_CD Text Segment
  161.         page    +
  162.  
  163. ;
  164. ; Assembly language portion of the Text segment contains
  165. ; the standard driver Strategy and Interrupt routines as
  166. ; well an interface routine to NetBIOS
  167. ;
  168.  
  169. _TEXT        segment
  170.  
  171. ;
  172. ; Device Strategy routine
  173. ;   Save request header pointer for subsequent call to
  174. ;   Interrupt routine.
  175. ;
  176.  
  177. DevStrategy    proc    far
  178.  
  179.         mov    cs:rh_offset, bx
  180.         mov    cs:rh_segment, es
  181.         ret
  182.  
  183. DevStrategy    endp
  184.  
  185. ;
  186. ; Device Interrupt routine
  187. ;   DevInterrupt sets up a stack for the 'C' routines
  188. ;   and validates the command before dispatching it to
  189. ;   an appropriate handler.
  190. ;
  191.  
  192. DevInterrupt    proc    far
  193.  
  194.         ; save calling context
  195.         pushf    
  196.         push    ax
  197.         push    bx
  198.         push    cx
  199.         push    dx
  200.         push    si
  201.         push    di
  202.         push    ds
  203.         push    es
  204.  
  205.         ; setup addressing for local and 'C'
  206.         mov    ax, cs
  207.         mov    ds, ax
  208.  
  209.         ; switch to local stack
  210.         mov    save_sp, sp
  211.         mov    save_ss, ss
  212.         mov    ss, ax
  213.         mov    sp, top_stack
  214.  
  215.         ; reload request header pointer
  216.         mov    ax, rh_segment
  217.         mov    es, ax
  218.         mov    bx, rh_offset
  219.  
  220.         ; prepare for call to handlers
  221.         push    es
  222.         push    bx
  223.  
  224.         ; process command
  225.         mov    al, es:[bx].rh_command
  226.         xor    ah, ah
  227.         cmp    al, 128        ; CDROM cmd?
  228.         jae    IntCDROMCmd
  229.  
  230.         cmp    al, 15        ; valid cmd?
  231.         jb    IntStdCmd
  232.  
  233. IntInvalid:    mov    ax, 8013h    ; set unknown
  234.         jmp    IntExit
  235.  
  236. IntCDROMCmd:    sub    al, 128
  237.         cmp    al, 8        ; valid CDROM?
  238.         ja    IntInvalid
  239.  
  240.         shl    ax, 1        ; dispatch to
  241.         mov    si, ax        ;   handler
  242.         call    DevExtCmdTbl[si]
  243.         jmp    IntExit
  244.  
  245. IntStdCmd:    shl    ax, 1        ; dispatch to
  246.         mov    si, ax        ;   handler
  247.         call    DevCmdTbl[si]
  248.  
  249.         ; set up exit status
  250. IntExit:    pop    bx
  251.         pop    es
  252.         mov    es:[bx].rh_status, ax
  253.  
  254.         ; reset calling context
  255.         mov    ss, save_ss
  256.         mov    sp, save_sp
  257.  
  258.         pop    es
  259.         pop    ds
  260.         pop    di
  261.         pop    si
  262.         pop    dx
  263.         pop    cx
  264.         pop    bx
  265.         pop    ax
  266.         popf
  267.  
  268.         ret
  269.         even
  270. DevInterrupt    endp
  271.  
  272. ;
  273. ; _NetBIOS : void NetBIOS (NCB far *)
  274. ;   Call NetBIOS at INT 5C.  This function assumes
  275. ;   NetBIOS has been loaded and makes no checks to
  276. ;   verify that.
  277. ;
  278.  
  279.         PUBLIC    _NetBIOS
  280. _NetBIOS    proc    near
  281.         push    bp
  282.         mov    bp, sp
  283.  
  284.         ; set es:bx to point to NCB and go
  285.         push    bx
  286.         push    es
  287.         mov    bx, [bp+4]
  288.         mov    ax, [bp+6]
  289.         mov    es, ax
  290.         int    5ch
  291.  
  292.         pop    bx
  293.         pop    es
  294.         pop    bp
  295.         ret
  296. _NetBIOS    endp
  297.  
  298.  
  299. _TEXT        ends
  300.  
  301.         subttl    Net_CD INIT Segment
  302.         page    +
  303.  
  304. ;
  305. ; Driver INIT segment
  306. ;   Having the Initialize function linked last guarantees
  307. ;   that it appears last in the _TEXT segment.  Since this
  308. ;   segment comes after the _TEXT segment when Initializes
  309. ;   tells DOS to discard the data from _Initialize on all
  310. ;   of this segment will disappear also.
  311. ;
  312.  
  313. INIT        segment
  314.  
  315. ;
  316. ; _DisplayString : void DisplayString (char *)
  317. ;   Displays a string using DOS function 9.  This function
  318. ;   may only be used during device driver initialization.
  319. ;
  320.  
  321.         PUBLIC    _DisplayString
  322. _DisplayString    proc    near
  323.         
  324.         push    bp
  325.         mov    bp, sp
  326.  
  327.         push    di
  328.         push    si
  329.  
  330.         mov    ah, 9        ; display str$
  331.         mov    dx, [bp+4]    ; string ptr.
  332.         int    21h
  333.  
  334.         pop    si
  335.         pop    di
  336.         pop    bp
  337.         ret
  338. _DisplayString    endp
  339.  
  340. ;
  341. ; _SetEndAddress : void SetEndAddress (struc rh0 far *)
  342. ;   Set the ending address of the device driver in the 
  343. ;   Initialize request header.  The location of
  344. ;   _Initialize is taken to be the location at which
  345. ;   discardable data begins, which will effectively
  346. ;   eliminate the INIT segment also.
  347. ;
  348.         
  349.         PUBLIC    _SetEndAddress
  350. _SetEndAddress    proc    near
  351.  
  352.         push    bp
  353.         mov    bp, sp
  354.  
  355.         ; get request header in es:di
  356.         push    di
  357.         mov    di, [bp+4]
  358.         mov    ax, [bp+6]
  359.         mov    es, ax
  360.  
  361.         ; set address in rh0_brkAddress
  362.     mov    word ptr es:[di].rh0_brkAddress, offset DGROUP:_Initialize
  363.     mov    word ptr es:[di].rh0_brkAddress+2, cs
  364.  
  365.         pop    di
  366.         pop    bp
  367.         ret
  368. _SetEndAddress    endp
  369.  
  370.  
  371. ;
  372. ; Discardable initialization data
  373. ;
  374.         PUBLIC    _banner, __acrtused
  375. ;
  376. ; Device Driver loading banner
  377. ;
  378. _banner        db     0dh, 0ah
  379.         db    'Net_CD.SYS:  Workstation Client'
  380.         db    ' Software Loaded'
  381.         db    0dh, 0ah, '$', 0
  382.  
  383. ;
  384. ; So MSC doesn't complain - set a CRT being used
  385. ;
  386. __acrtused    dw    1
  387.  
  388. INIT        ends
  389.  
  390.  
  391.         end     Net_CD
  392.