home *** CD-ROM | disk | FTP | other *** search
/ Sound Sensations! / sound_sensations.iso / cmf / drivers / driver1.asm < prev    next >
Assembly Source File  |  1985-03-15  |  12KB  |  536 lines

  1. Page 60,132
  2.  
  3.  
  4. ;****************************************************************
  5. ;*                                *
  6. ;*    EMILY is a character-oriented device driver.        *
  7. ;*                                *
  8. ;*    All block-oriented functions in EMILY simply set the    *
  9. ;*    DONE status flag and exit.                *
  10. ;*                                *
  11. ;*    The basic request-header structure used in all        *
  12. ;*    request-headers is called the Request_Header_Preamble.    *
  13. ;*    All request-headers begin with a 13-byte area        *
  14. ;*    corresponding to the Request_Header_Preamble.        *
  15. ;*                                *
  16. ;*    Assembled using Microsoft MASM 1.25.            *
  17. ;*                                *
  18. ;****************************************************************
  19.  
  20.  
  21.  
  22. ;--------------------------------------------------------------------
  23. ;
  24. ; Request-header structure type 1
  25. ;
  26. ;    Used by services 6, 7, 10, and 11
  27. ;
  28. ;--------------------------------------------------------------------
  29. Request_Header_Preamble    STRUC
  30.  
  31. Header_Length           DB (?)       ; Length in bytes
  32. Unit_Code           DB (?)       ; Unit code
  33. Command_Code           DB (?)       ; Command code
  34. Status_Code           DW (?)       ; Status of the request
  35. PCDOS_Reserved           DB 8 Dup (?)    ; Reserved area for PC DOS
  36.  
  37. Request_Header_Preamble    Ends
  38. ;--------------------------------------------------------------------
  39.  
  40.  
  41.  
  42. ;--------------------------------------------------------------------
  43. ;
  44. ; Request-header structure type 2
  45. ;
  46. ;    Used by service 0    (Init)
  47. ;
  48. ;--------------------------------------------------------------------
  49. Request_Header_Init       STRUC
  50.  
  51.                DB  13 dup(?)   ; Area for Request_Header_Preamble
  52.  
  53. Init_Unit_Count        DB (?)       ; Number of units
  54. Init_Ending_Program_Addr   DD (?)       ; Stay resident address
  55. Init_Bios_Param_Block_Addr DD (?)       ; Doesn't apply to char. devices
  56. Init_Byte_Drive_Number       DB (?)
  57.  
  58. Request_Header_Init       Ends
  59. ;--------------------------------------------------------------------
  60.  
  61.  
  62.  
  63. ;--------------------------------------------------------------------
  64. ;
  65. ; Request-header structure type 3
  66. ;
  67. ;    Used by service 1    (Media Check - doesn't apply to char. devices)
  68. ;
  69. ;--------------------------------------------------------------------
  70. Request_Header_Media       STRUC
  71.  
  72.                DB  13 dup(?)   ; Area for Request_Header_Preamble
  73.  
  74. Media_Media_Descriptor       DB (?)       ; Define media type
  75. Media_Byte_return       DB (?)       ; Indicate media status
  76. Media_Vol_Id_Addr       DD (?)       ; Previous Vol ID pointer
  77.  
  78. Request_Header_Media       Ends
  79. ;--------------------------------------------------------------------
  80.  
  81.  
  82.  
  83. ;--------------------------------------------------------------------
  84. ;
  85. ; Request-header structure type 4
  86. ;
  87. ;    Used by service 2    (BUILD BPB - doesn't apply to char. devices)
  88. ;
  89. ;--------------------------------------------------------------------
  90. Request_Header_BPB       STRUC
  91.  
  92.                DB  13 dup(?)   ; Area for Request_Header_Preamble
  93.  
  94. BPB_Media_Descriptor       DB (?)       ; Define media type
  95. BPB_Data_Transfer_Address  DD (?)       ; I/O buffer
  96. BPB_Bios_Param_Block_Addr  DD (?)       ; Pointer to BPB
  97.  
  98. Request_Header_BPB       Ends
  99. ;--------------------------------------------------------------------
  100.  
  101.  
  102.  
  103. ;--------------------------------------------------------------------
  104. ;
  105. ; Request-header structure type 5
  106. ;
  107. ;    Used by service 3, 4, 8, 9, and 12 (Input or Output)
  108. ;
  109. ;--------------------------------------------------------------------
  110. Request_Header_IO       STRUC
  111.  
  112.                DB  13 dup(?)   ; Area for Request_Header_Preamble
  113.  
  114. IO_Media_Descriptor       DB (?)       ; Define media type
  115. IO_Data_Transfer_Address   DD (?)       ; I/O buffer
  116. IO_Byte_Counter        DW (?)       ; Number of bytes transferred
  117. IO_Starting_Sector       DW (?)       ; Not used in char. devices
  118. IO_Vol_Id_Addr           DD (?)       ; Pointer to Vol ID
  119.  
  120. Request_Header_IO       Ends
  121. ;--------------------------------------------------------------------
  122.  
  123.  
  124.  
  125. ;--------------------------------------------------------------------
  126. ;
  127. ; Request-header structure type 6
  128. ;
  129. ;    Used by service 5    (Non Destructive Input No Wait)
  130. ;
  131. ;--------------------------------------------------------------------
  132. Request_Header_Non_Dest    STRUC
  133.  
  134.                DB  13 dup(?)   ; Area for Request_Header_Preamble
  135. Non_Dest_Read_Byte       DB (?)       ; Byte read from device
  136.  
  137. Request_Header_Non_Dest    Ends
  138. ;--------------------------------------------------------------------
  139.  
  140.  
  141.  
  142.  
  143.  
  144. Page
  145. ;****************************************************************
  146. ;*                                *
  147. ;*    Beginning of EMILY                    *
  148. ;*                                *
  149. ;****************************************************************
  150.  
  151. CSEG    Segment Para Public 'CODE'
  152.     Assume CS:CSEG,DS:Nothing,ES:Nothing,SS:Nothing
  153. ;
  154. ;    The source code begins here
  155. ;
  156.         Org  0000H
  157. Device_Driver    Proc Far
  158. ;
  159. ;    Here is the device header
  160. ;
  161. Next_Device    DD    -1    ; Setting this field to -1
  162.                 ; . indicates that there is
  163.                 ; . only one driver in this
  164.                 ; . device-driver program.
  165.  
  166. Attribute    DW    0C000H    ; Turn bits 14 and 15 on, all
  167.                 ; . others off. Bit 15 = 1 for
  168.                 ; . a character device. Bit 14 = 1
  169.                 ; . if device supports the IOCTL
  170.                 ; . function.
  171.  
  172. Strategy    DW Offset Strategy_Routine
  173.                 ; Tells PC-DOS the offset address
  174.                 ; . of the Strategy routine.
  175.                 ; . The segment address is assumed
  176.                 ; . to be the value in the CS
  177.                 ; . register.
  178.  
  179.  
  180. Interrupt    DW Offset Interrupt_Routine
  181.                 ; Tells PC-DOS the offset address
  182.                 ; . of the Interrupt routine.
  183.                 ; . Like the Strategy routine, the
  184.                 ; . segment address is assumed to
  185.                 ; . be in the CS register.
  186.  
  187.  
  188. Device_Name    DB "EMILY   "   ; The name of this particular device
  189.                 ; . driver is EMILY. Name must be
  190.                 ; . 8 characters, so 3 blanks added.
  191.  
  192.  
  193. Request_Header        Label Word
  194.  
  195. Request_Header_Offset    DW (?)    ; Here is where the pointer
  196. Request_Header_Segment    DW (?)    ; . is defined
  197.  
  198.  
  199. ;
  200. ; Here is the jump table of command modules
  201. ;
  202. Device_Functions    Label Word
  203.  
  204.         DW Offset Initialize_Driver_Command    ;command-code = 0
  205.         DW Offset Media_Check_Command        ;command-code = 1
  206.         DW Offset Build_BPB_Command        ;command-code = 2
  207.         DW Offset IOCTL_Input_Command        ;command-code = 3
  208.         DW Offset Read_Input_Command        ;command-code = 4
  209.         DW Offset Non_Destruct_Input_Command    ;command-code = 5
  210.         DW Offset Input_Status_Command        ;command-code = 6
  211.         DW Offset Input_Flush_Command        ;command-code = 7
  212.         DW Offset Write_Output_Command        ;command-code = 8
  213.         DW Offset Write_Verify_Command        ;command-code = 9
  214.         DW Offset Output_Status_Command     ;command-code = 10
  215.         DW Offset Output_Flush_Command        ;command-code = 11
  216.         DW Offset IOCTL_Output_Command        ;command-code = 12
  217.         DW Offset Device_Open_Command        ;command-code = 13
  218.         DW Offset Device_Close_Command        ;command-code = 14
  219.         DW Offset Removable_Media_Command    ;command-code = 15
  220.  
  221.  
  222. ;
  223. ; Here is the strategy routine
  224. ;
  225. Strategy_Routine Proc Far
  226.  
  227.     Mov    Word Ptr CS:Request_Header_Offset,BX
  228.  
  229.     Mov    Word Ptr CS:Request_Header_Segment,ES
  230.  
  231.     Ret
  232.  
  233. Strategy_Routine Endp
  234.  
  235.  
  236. ;
  237. ; Here is the interrupt routine
  238. ;
  239. Interrupt_Routine Proc Far
  240.  
  241. INRT01:
  242.     Push    AX            ; Save the registers
  243.     Push    BX            ; . and flags
  244.     Push    CX            ; .
  245.     Push    DX            ; .
  246.     Push    SI            ; .
  247.     Push    DI            ; .
  248.     Push    DS            ; .
  249.     Push    ES            ; .
  250.     Pushf                ; ..End
  251. INRT02:
  252.     Push    CS            ; Set DS equal to CS
  253.     Pop    DS            ; ..End
  254.  
  255.     Mov    BX,Word Ptr CS:Request_Header_Offset
  256.     Mov    ES,Word Ptr CS:Request_Header_Segment
  257.                     ; Get the address of the
  258.                     ; . request header into
  259.                     ; . ES:[BX]
  260.  
  261.     Mov    Word Ptr ES:[BX].Status_Code,0000H
  262.                     ; Clear the status word
  263.  
  264.     Mov    DX,0000H        ; Calculate the index into
  265.     Mov    DL,Byte Ptr ES:[BX].Command_Code
  266.     Shl    DX,1            ; . the jump table and put
  267.     Mov    DI,DX            ; . it into DI
  268.  
  269.     Cmp    DI,0024D        ; Compare for an invalid
  270.     Jbe    INRT03            ; command
  271. ;
  272. ; Here is the error routine for an illegal command
  273. ;
  274.     Or    Byte Ptr ES:[BX].Status_Code+1,80H
  275.                     ; Set the error bit
  276.     Mov    Byte Ptr ES:[BX].Status_Code,03H
  277.                     ; Set the error byte
  278.     Jmp    Short INRT90
  279.  
  280. INRT03:
  281.     Mov    SI,Word Ptr CS:Device_Functions[DI]
  282.                     ; Get the offset address
  283.                     ; . of the appropriate
  284.                     ; . command
  285.  
  286.     Call    SI            ; This is a near call to
  287.                     ; . the command
  288. INRT90:
  289.     Popf                ; Restore the registers
  290.     Pop    ES            ; . and flags
  291.     Pop    DS            ; .
  292.     Pop    DI            ; .
  293.     Pop    SI            ; .
  294.     Pop    DX            ; .
  295.     Pop    CX            ; .
  296.     Pop    BX            ; .
  297.     Pop    AX            ; ..End
  298.  
  299.     Ret
  300.  
  301. Interrupt_Routine Endp
  302.  
  303. ;
  304. ; Here is the initialization command
  305. ;
  306. Initialize_Driver_Command Proc Near
  307.  
  308.     Mov    AX,Offset End_Of_the_Program
  309.  
  310.     Mov    Word Ptr ES:[BX].Init_Ending_Program_Addr,AX
  311.  
  312.     Mov    Word Ptr ES:[BX+2].Init_Ending_Program_Addr,CS
  313.  
  314.     Or    Word Ptr ES:[BX].Status_Code,0100H
  315.                     ; Set the finished bit
  316.  
  317.     Ret
  318.  
  319. Initialize_Driver_Command Endp
  320.  
  321. ;
  322. ; Here is the media check command
  323. ;
  324. Media_Check_Command Proc Near
  325.  
  326.     Or    Word Ptr ES:[BX].Status_Code,0100H
  327.                     ; Set the finished bit
  328.  
  329.     Ret
  330.  
  331. Media_Check_Command Endp
  332.  
  333. ;
  334. ; Here is the construct Bios Parameter Block command
  335. ;
  336. Build_BPB_Command Proc Near
  337.  
  338.     Or    Word Ptr ES:[BX].Status_Code,0100H
  339.                     ; Set the finished bit
  340.  
  341.     Ret
  342.  
  343. Build_BPB_Command Endp
  344.  
  345. ;
  346. ; Here is the IOCTL input command
  347. ;
  348. IOCTL_Input_Command Proc Near
  349.  
  350.     Lds    DI,ES:[BX].IO_Data_Transfer_Address
  351.  
  352.     Mov    Byte Ptr DS:[DI],'E'
  353.  
  354.     Mov    Word Ptr ES:[BX].IO_Byte_Counter,0001H
  355.  
  356.     Or    Word Ptr ES:[BX].Status_Code,0100H
  357.                     ; Set the finished bit
  358.  
  359.     Ret
  360.  
  361. IOCTL_Input_Command Endp
  362.  
  363. ;
  364. ; Here is the read input command
  365. ;
  366. Read_Input_Command Proc Near
  367.  
  368.     Mov    Word Ptr ES:[BX].IO_Byte_Counter,0000H
  369.  
  370.     Or    Word Ptr ES:[BX].Status_Code,0100H
  371.                     ; Set the finished bit
  372.  
  373.     Ret
  374.  
  375. Read_Input_Command Endp
  376.  
  377. ;
  378. ; Here is the non-destructive input command
  379. ;
  380. Non_Destruct_Input_Command Proc Near
  381.  
  382.     Or    Word Ptr ES:[BX].Status_Code,0200H
  383.                     ; Set the busy bit
  384.  
  385.     Mov    Word Ptr ES:[BX].Non_Dest_Read_Byte,0000H
  386.  
  387.     Or    Word Ptr ES:[BX].Status_Code,0100H
  388.                     ; Set the finished bit
  389.  
  390.     Ret
  391.  
  392. Non_Destruct_Input_Command Endp
  393.  
  394. ;
  395. ; Here is the input status command
  396. ;
  397. Input_Status_Command Proc Near
  398.  
  399.     Or    Word Ptr ES:[BX].Status_Code,0100H
  400.                     ; Set the finished bit
  401.  
  402.     Ret
  403.  
  404. Input_Status_Command Endp
  405.  
  406.  
  407. ;
  408. ; Here is the flush input command
  409. ;
  410. Input_Flush_Command Proc Near
  411.  
  412.     Or    Word Ptr ES:[BX].Status_Code,0100H
  413.                     ; Set the finished bit
  414.  
  415.     Ret
  416.  
  417. Input_Flush_Command Endp
  418.  
  419. ;
  420. ; Here is the write output command
  421. ;
  422. Write_Output_Command Proc Near
  423.  
  424.     Mov    Word Ptr ES:[BX].IO_Byte_Counter,0000H
  425.  
  426.     Or    Word Ptr ES:[BX].Status_Code,0100H
  427.                     ; Set the finished bit
  428.  
  429.     Ret
  430.  
  431. Write_Output_Command Endp
  432.  
  433.  
  434. ;
  435. ; Here is the write verify command
  436. ;
  437. Write_Verify_Command Proc Near
  438.  
  439.     Or    Word Ptr ES:[BX].Status_Code,0100H
  440.                     ; Set the finished bit
  441.  
  442.     Ret
  443.  
  444. Write_Verify_Command Endp
  445.  
  446.  
  447. ;
  448. ; Here is the output status command
  449. ;
  450. Output_Status_Command Proc Near
  451.  
  452.     Or    Word Ptr ES:[BX].Status_Code,0100H
  453.                     ; Set the finished bit
  454.  
  455.     Ret
  456.  
  457. Output_Status_Command Endp
  458.  
  459.  
  460. ;
  461. ; Here is the flush the output command
  462. ;
  463. Output_Flush_Command Proc Near
  464.  
  465.     Or    Word Ptr ES:[BX].Status_Code,0100H
  466.                     ; Set the finished bit
  467.  
  468.     Ret
  469.  
  470. Output_Flush_Command Endp
  471.  
  472.  
  473. ;
  474. ; Here is the IOCTL output command
  475. ;
  476. IOCTL_Output_Command Proc Near
  477.  
  478.     Mov    Word Ptr ES:[BX].IO_Byte_Counter,0000H
  479.  
  480.     Or    Word Ptr ES:[BX].Status_Code,0100H
  481.                     ; Set the finished bit
  482.  
  483.     Ret
  484.  
  485. IOCTL_Output_Command Endp
  486.  
  487. ;
  488. ; Here is the device open command
  489. ;
  490. Device_Open_Command Proc Near
  491.  
  492.     Or    Word Ptr ES:[BX].Status_Code,0100H
  493.                     ; Set the finished bit
  494.  
  495.     Ret
  496.  
  497. Device_Open_Command Endp
  498.  
  499.  
  500. ;
  501. ; Here is the device close command
  502. ;
  503. Device_Close_Command Proc Near
  504.  
  505.     Or    Word Ptr ES:[BX].Status_Code,0100H
  506.                     ; Set the finished bit
  507.  
  508.     Ret
  509.  
  510. Device_Close_Command Endp
  511.  
  512.  
  513. ;
  514. ; Here is the removable media command
  515. ;
  516. Removable_Media_Command Proc Near
  517.  
  518.     Or    Word Ptr ES:[BX].Status_Code,0100H
  519.                     ; Set the finished bit
  520.  
  521.     Ret
  522.  
  523. Removable_Media_Command Endp
  524.  
  525.  
  526. Device_Driver Endp
  527.  
  528.  
  529. End_of_the_Program    Equ $        ; The assembler sets the
  530.                     ; . variable to the last
  531.                     ; . valid address in the
  532.                     ; . program
  533.  
  534. CSEG    Ends
  535.     End    Device_Driver
  536.