SERPAR.ASM
上传用户:xiaogehua
上传日期:2007-01-08
资源大小:1183k
文件大小:9k
源码类别:

操作系统开发

开发平台:

Asm

  1. ;    File              : $Workfile: SERPAR.ASM$
  2. ;
  3. ;    Description       :
  4. ;
  5. ;    Original Author   : DIGITAL RESEARCH
  6. ;
  7. ;    Last Edited By    : $CALDERA$
  8. ;
  9. ;-----------------------------------------------------------------------;
  10. ;    Copyright Work of Caldera, Inc. All Rights Reserved.
  11. ;      
  12. ;    THIS WORK IS A COPYRIGHT WORK AND CONTAINS CONFIDENTIAL,
  13. ;    PROPRIETARY AND TRADE SECRET INFORMATION OF CALDERA, INC.
  14. ;    ACCESS TO THIS WORK IS RESTRICTED TO (I) CALDERA, INC. EMPLOYEES
  15. ;    WHO HAVE A NEED TO KNOW TO PERFORM TASKS WITHIN THE SCOPE OF
  16. ;    THEIR ASSIGNMENTS AND (II) ENTITIES OTHER THAN CALDERA, INC. WHO
  17. ;    HAVE ACCEPTED THE CALDERA OPENDOS SOURCE LICENSE OR OTHER CALDERA LICENSE
  18. ;    AGREEMENTS. EXCEPT UNDER THE EXPRESS TERMS OF THE CALDERA LICENSE
  19. ;    AGREEMENT NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED,
  20. ;    COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED,
  21. ;    CONDENSED, EXPANDED, COLLECTED, COMPILED, LINKED, RECAST,
  22. ;    TRANSFORMED OR ADAPTED WITHOUT THE PRIOR WRITTEN CONSENT OF
  23. ;    CALDERA, INC. ANY USE OR EXPLOITATION OF THIS WORK WITHOUT
  24. ;    AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO CRIMINAL AND
  25. ;    CIVIL LIABILITY.
  26. ;-----------------------------------------------------------------------;
  27. ;
  28. ;    *** Current Edit History ***
  29. ;    *** End of Current Edit History ***
  30. ;
  31. ;    $Log$
  32. ;    SERPAR.ASM 1.7 93/07/22 19:44:27
  33. ;    switch over to REQUEST.EQU
  34. ;    SERPAR.ASM 1.6 93/07/19 18:57:59
  35. ;    Add header
  36. ;
  37. ;    ENDLOG
  38. include BIOSGRPS.EQU
  39. include DRMACROS.EQU ; standard DR macros
  40. include IBMROS.EQU ; ROM BIOS equates
  41. include REQUEST.EQU ; request header equates
  42. include DRIVER.EQU ; device driver equates
  43. page
  44. CGROUP group CODE, RCODE, ICODE
  45. CG equ offset CGROUP
  46. Assume CS:CGROUP, DS:CGROUP, ES:CGROUP, SS:CGROUP
  47. CODE segment 'CODE'
  48. extrn endbios:word ; for device driver INIT function
  49. extrn serparFlag:byte
  50. extrn serparChar:byte
  51. CODE ends
  52. RCODE segment 'RCODE'
  53. Public SerParCommonTable
  54. SerParCommonTable:
  55. db 19 ; Last supported function
  56. dw CG:dd_init ; 0-initialize driver
  57. dw CG:dd_error ; 1-media change check (disks only)
  58. dw CG:dd_error ; 2-build BPB (disks only)
  59. dw CG:dd_error ; 3-IOCTL string input
  60. dw CG:dd_input ; 4-input
  61. dw CG:dd_poll ; 5-nondestructive input (char only)
  62. dw CG:dd_instat ; 6-input status (char only)
  63. dw CG:dd_inflush ; 7-input flush
  64. dw CG:dd_output ; 8-output
  65. dw CG:dd_output ; 9-output with verify
  66. dw CG:dd_outstat ; 10-output status (char only)
  67. dw CG:dd_outflush ; 11-output flush (char only)
  68. dw CG:dd_error ; 12-IOCTL string output
  69. dw CG:dd_open ; 13-device open
  70. dw CG:dd_close ; 14-device close
  71. dw CG:dd_error ; 15-removable media check (disks only)
  72. dw CG:dd_error ; 16-n/a
  73. dw CG:dd_error ; 17-n/a
  74. dw CG:dd_error ; 18-n/a
  75. dw CG:dd_genioctl ; 19-generic IOCTL
  76. Assume DS:CGROUP, ES:Nothing, SS:Nothing
  77. page
  78. driver proc near
  79. dd_error: ; used for all unsupported driver functions
  80. ;--------
  81. mov ax,RHS_ERROR+3 ; "invalid command" error
  82. ret
  83. page
  84. poll_char:
  85. ;---------
  86. ; exit: ZF = 1  =>  no character ready
  87. ; ZF = 0  =>  AL = character
  88. cmp serparFlag[si],TRUE ; do we have local character?
  89.  jne poll_c2 ; skip if not
  90. mov al,serparChar[si] ; get the local charcater
  91. jmps poll_c4 ;    and return it
  92. poll_c2: ; need to check ROS keyboard status
  93. mov ah,3 ; get serial status status
  94. int ASYNC_INT ; read serial status
  95. test ah,1 ; test "received data" bit
  96.  jz poll_c9 ; skip if no character there
  97. mov ah,2 ; read the character
  98. int ASYNC_INT ; character returned in AL
  99. mov serparChar[si],al ; save it for look ahead
  100. mov serparFlag[si],TRUE ; we've got a local character
  101. poll_c4: ; return the character in AL
  102. or ah,TRUE ; indicate "ready" status
  103. ret
  104. poll_c9:
  105. sub ax,ax ; indicate "not-ready" status
  106. ret ; (driver is busy)
  107. char_read:
  108. ;---------
  109.     xor ax,ax 
  110. cmp serparFlag[si],TRUE ; do we have local character?
  111.  jne rdchr1
  112. mov serparFlag[si],FALSE ; tell them buffer is invalid
  113. mov al,serparChar[si] ; get the local character
  114. ret ;    and return it
  115. rdchr1:
  116. mov ah,2 ; read character from serial port
  117. int ASYNC_INT ; call the ROM BIOS
  118. and ah,0eh ; only worry about these error bits
  119. ret ; and return the character
  120. page
  121. dd_input: ; 4-input
  122. ;--------
  123. push es ; save ES (-> request header!)
  124. mov cx,es:RH4_COUNT[bx] ; get # of characters to output
  125.  jcxz input9 ; return if nothing to input
  126. sub dx,3 ; convert to serial port #
  127.  jb input9 ; return none read if parallel port
  128. mov si,dx ; SI = serial port index
  129. les di,es:RH4_BUFFER[bx] ; get address of string to input
  130. input2:
  131. call char_read ; read 8-bit character
  132. test ah,ah ; did we read OK ?
  133.  jnz input9 ; if we have an error stop now
  134. stosb ; store it in input buffer
  135. loop input2 ; repeat for all characters
  136. input9:
  137. pop es
  138. sub es:RH4_COUNT[bx],cx ; update to actual number xfered
  139. sub ax,ax
  140. ret
  141. dd_poll: ; 5-nondestructive input (console only)
  142. ;-------
  143. cmp dx,3 ; check if a parallel port
  144.  jb poll_busy ;  they are never ready
  145. sub dx,3
  146. mov si,dx ; SI = serial port index
  147. call poll_char ; check keyboard status
  148.  jz poll_busy
  149. mov es:RH5_CHAR[bx],al ; return the character
  150. sub ax,ax
  151. ret
  152. poll_busy:
  153. mov ax,RHS_BUSY ; indicate no character waiting
  154. ret
  155. dd_instat: ; 6-input status (char only)
  156. ;---------
  157. cmp dx,3 ; check if a parallel port
  158.  jb poll_busy ;  if so it's always busy
  159. sub dx,3
  160. mov si,dx ; SI = serial port index
  161. call poll_char ; check keyboard status
  162.  jz poll_busy
  163. sub ax,ax ; indicate "not ready" status
  164. ret
  165. dd_inflush: ; 7-input flush
  166. ;---------
  167. cmp dx,3 ; check if a parallel port
  168.  jae inflsh1 ; skip if serial port
  169. mov ax,RHS_ERROR+11 ; return "read error" if attempting
  170. ret ;  to read from the parallel port
  171. inflsh1:
  172. sub dx,3
  173. mov si,dx ; SI = serial port index
  174. inflsh2:
  175. call poll_char ; check keyboard status
  176.  jz inflsh_ret ; skip if not ready
  177. call char_read ; else read next character
  178. jmps inflsh2 ; repeat until buffer empty
  179. inflsh_ret: ; keyboard buffer empty
  180. sub ax,ax ; return success
  181. ret
  182. dd_output: ; 8-output
  183. ;---------
  184. mov cx,es:RH4_COUNT[bx] ; get # of characters to output
  185.  jcxz output5 ; return if nothing to output
  186. push es ; save ES (-> request header!)
  187. les si,es:RH4_BUFFER[bx] ; get address of string to output
  188. sub dx,3 ; test if parallel port
  189.  jae output2 ; skip if serial port
  190. add dx,3 ; back to parallel port number
  191. output1:
  192. lods es:byte ptr [si] ; get next character to output
  193. mov ah,0 ; output AL to parallel port
  194. int PRINTER_INT ; output to parallel port
  195. mov al,2 ; "not ready" error
  196. test ah,PRN_TIMEOUT ; printer not ready?
  197.  jnz output4 ;  yes, return error
  198. mov al,9 ; "printer out of paper" error
  199. test ah,PRN_PAPER ; printer out paper?
  200.  jnz output4 ;  yes, return error
  201. inc ax ; "write fault" error
  202. test ah,PRN_ERROR ; test if other errors
  203.  jnz output4 ; skip if any errors occurred
  204. loop output1 ; else repeat for all characters
  205. jmps output4 ; return successfully when done
  206. output2: ; output is for serial port
  207. lods es:byte ptr [si] ; get next character to output
  208. mov ah,1 ; output AL to serial port
  209. int ASYNC_INT ; output to serial port
  210. mov al,2 ; "not ready" error
  211. test ah,AUX_ERROR ; test if time out etc.
  212.  jnz output4 ; skip if any errors occurred
  213. loop output2 ; else repeat for all characters
  214. output4:
  215. mov ah,RHS_ERROR shr 8 ; assume an error code
  216. pop es
  217. sub es:RH4_COUNT[bx],cx ; update to actual number xfered
  218.  jz output6 ; none xfered is an error
  219. output5:
  220. sub ax,ax ; return successfully when done
  221. output6:
  222. ret
  223. dd_outstat: ; 10-output status (char only)
  224. ;----------
  225. cmp dx,3 ; test if parallel port
  226.  jae outstat1
  227. mov ah,2 ; read parallel port status
  228. int PRINTER_INT ; call the ROM BIOS
  229. test ah,80h ; test "not busy" bit
  230.  jnz outstat_ready ; if not busy then ready for output
  231. jmps outstat_busy ;    else we must be still busy
  232. outstat1:
  233. sub dx,3
  234. mov ah,3 ; get status for serial port
  235. int ASYNC_INT
  236. test ah,20h ; transmit buffer register emmpty?
  237.  jz outstat_busy
  238. test al,20h ; data set ready?
  239.  jz outstat_busy
  240. outstat_ready:
  241. sub ax,ax ; always ready, return no busy
  242. ret
  243. outstat_busy:
  244. mov ax,RHS_BUSY
  245. ret
  246. dd_outflush: ; 11-output flush (char only)
  247. ;-----------
  248. sub ax,ax ; unbuffered, perform no operation
  249. ret
  250. page
  251. dd_open: ; 13-device open
  252. ;-------
  253. sub ax,ax ; no operation
  254. ret
  255. dd_close: ; 14-device close
  256. ;--------
  257. sub ax,ax ; no operation
  258. ret
  259. page
  260. dd_genioctl: ; 19-generic IOCTL
  261. ;-----------
  262.     sub ax,ax           
  263. ret
  264. driver endp
  265. RCODE ends ; end of device driver code
  266. page
  267. ICODE segment 'ICODE' ; initialization code
  268. dd_init: ; 0-initialize driver
  269. ;-------
  270. cmp dx,3 ; check if serial or parallel
  271.  jae init1 ; skip if serial port setup
  272. mov ah,1 ; initialize parallel port
  273. int PRINTER_INT ; call the ROM BIOS
  274. jmps init2
  275. init1:
  276. sub dx,3
  277. mov ah,0 ; initialize serial port
  278. mov al,0A3h ; 2400 Bd, no parity, 8 data, 1 stop
  279. int ASYNC_INT ; call the ROM BIOS
  280. init2:
  281. les bx,REQUEST[bp] ; ES:BX -> request header
  282. mov ax,endbios
  283. mov es:RH0_RESIDENT[bx],ax ; set end of device driver
  284. mov es:RH0_RESIDENT+2[bx],ds
  285. sub ax,ax ; initialization succeeded
  286. ret ; (BIOS init always does...)
  287. ICODE ends
  288. end