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

操作系统开发

开发平台:

Asm

  1. ;    File              : $Workfile$
  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. ;
  33. ;    CONSOLE.ASM 1.8 93/07/22 19:43:16
  34. ;    switch over to REQUEST.EQU
  35. ;    CONSOLE.ASM 1.7 93/07/19 18:57:15
  36. ;    Add header
  37. ;
  38. ;    ENDLOG
  39. include BIOSGRPS.EQU
  40.     include DRMACROS.EQU    ; standard DR macros
  41. include IBMROS.EQU ; ROM BIOS equates
  42. include REQUEST.EQU ; request header equates
  43. include DRIVER.EQU ; device driver equates
  44. page
  45. CGROUP group CODE, RCODE, ICODE
  46. CG equ offset CGROUP
  47. Assume CS:CGROUP, DS:CGROUP, ES:CGROUP, SS:CGROUP
  48. CODE segment 'CODE'
  49. INSERT_ACTIVE equ 2 ; set if cmdline insert active
  50. extrn endbios:word ; for device driver INIT function
  51. extrn FastConsole:far ; console output vector
  52.     extrn   ControlBreak:far    ; ^C program abort
  53. extrn local_flag:byte
  54. extrn local_char:byte
  55. CODE ends
  56. RCODE segment 'RCODE'
  57. ; Device driver function table
  58. Public ConsoleTable
  59. ConsoleTable:
  60. db 14 ; Last supported command
  61. dw CG:dd_init ; 0-initialize driver
  62. dw CG:dd_error ; 1-media change check (disks only)
  63. dw CG:dd_error ; 2-build BPB (disks only)
  64. dw CG:dd_inioctl ; 3-IOCTL string input
  65. dw CG:dd_input ; 4-input
  66. dw CG:dd_poll ; 5-nondestructive input (char only)
  67. dw CG:dd_instat ; 6-input status (char only)
  68. dw CG:dd_inflush ; 7-input flush
  69. dw CG:dd_output ; 8-output
  70. dw CG:dd_output ; 9-output with verify
  71. dw CG:dd_outstat ; 10-output status (char only)
  72. dw CG:dd_outflush ; 11-output flush (char only)
  73. dw CG:dd_outioctl ; 12-IOCTL string output
  74. dw CG:dd_open ; 13-device open
  75. dw CG:dd_close ; 14-device close
  76. Assume DS:CGROUP, ES:Nothing, SS:Nothing
  77. page
  78. driver proc near
  79. dd_outioctl:
  80. ;-----------
  81. mov cx,es:RH4_COUNT[bx] ; get # of characters to output
  82. cmp cx,2 ; is it what we expect ?
  83.  jne dd_error ; no, bail out
  84. push ds
  85. lds si,es:RH4_BUFFER[bx] ; DS:SI -> buffer
  86. lodsw ; get the data
  87. pop ds
  88. xchg ax,si ; save data in SI
  89. mov ah,3 ; read cursor position/type
  90. mov bh,0 ;  for page zero
  91. int VIDEO_INT
  92. and ch,0c0h ; make cursor start line = 0
  93. mov al,cl ; AL = bottom line of cursor
  94. dec ax ; AL = bottom line - 1
  95. test si,INSERT_ACTIVE
  96.  jz dd_outioctl10
  97. shr al,1 ; Insert active is 1/2 size block
  98. dd_outioctl10:
  99. or ch,al ; cursor start line is now here
  100. mov ah,1 ; set cursor type
  101. int VIDEO_INT
  102. ret
  103. dd_inioctl:
  104. ;----------
  105. ; jmp dd_error ; input not supported
  106. dd_error: ; used for all unsupported driver functions
  107. ;--------
  108. mov ax,RHS_ERROR+3 ; "invalid command" error
  109. ret
  110. poll_c1:
  111. mov ah,0 ; eat the next character
  112. int KEYBOARD_INT ; take it out of ROS buffer
  113. ;    and check again
  114. poll_char:
  115. ;---------
  116. ; exit: ZF = 1  =>  no character ready
  117. ; ZF = 0  =>  AL = character
  118. mov al,local_char ; get the local character
  119. cmp local_flag,TRUE ; do we have local character?
  120.  je poll_c4 ; no, check ROS keyboard status
  121. mov ah,1 ; get keyboard status (and character)
  122. int KEYBOARD_INT ; read character from keyboard
  123.  jz input9  ; skip if no character there
  124. test ax,ax ; test if we got Ctrl-Brk
  125.  jz poll_c1 ;  and eat it if we have
  126. poll_c3: ; we've got a character
  127. cmp ax,7200h ; is this Ctrl-PrtSc?
  128.  jne poll_c4
  129. mov al,'P'-40h ; convert to ^P character
  130. poll_c4: ; return the character in AL
  131. or ah,TRUE ; indicate "ready" status
  132. ret
  133. char_read:
  134. ;---------
  135. cmp local_flag,TRUE ; do we have local character?
  136.  je rdchr3 ; handle that specially
  137. mov ah,0
  138. int KEYBOARD_INT ; read character from keyboard
  139. test ax,ax ; test if we got Ctrl-Brk
  140.  jz char_read ; retry in that case
  141. cmp ax,7200h ; is this Ctrl-PrtSc?
  142.  jne rdchr1 ; skip if any other
  143. mov al,'P'-40h ; convert to ^P character
  144. ret ;    and return it
  145. rdchr1: ; else it is normal or function key
  146. test al,al ; test if function key
  147.  jnz rdchr2 ; skip if normal character
  148. mov local_flag,TRUE ; else return scan code as next
  149. mov local_char,ah ;    character from next INPUT
  150. rdchr2: ; return the character in AL
  151. ret
  152. rdchr3:
  153. mov local_flag,FALSE ; tell them buffer is invalid
  154. mov al,local_char ; get the local charcater
  155. ret ;    and return it
  156. page
  157. dd_input: ; 4-input
  158. ;--------
  159. mov cx,es:RH4_COUNT[bx] ; get # of characters to output
  160.  jcxz input9 ; return if nothing to input
  161. push es ; save ES (-> request header!)
  162. les di,es:RH4_BUFFER[bx] ; get address of string to input
  163. input1:
  164. call char_read ; read 8-bit character
  165. stosb ; store it in input buffer
  166. loop input1 ; repeat for all characters
  167. pop es
  168. input9:
  169. ; sub ax,ax
  170. ; ret
  171. dd_outstat: ; 10-output status (char only)
  172. ;---------- ; always ready, return no busy
  173. dd_outflush: ; 11-output flush (char only)
  174. ;----------- ; unbuffered, perform no operation
  175. dd_open: ; 13-device open
  176. ;------- ; no operation
  177. dd_close: ; 14-device close
  178. ;-------- ; no operation
  179. sub ax,ax
  180. ret
  181. dd_poll: ; 5-nondestructive input (char only)
  182. ;-------
  183. call poll_char ; check keyboard status
  184.  jz dd_instat20
  185. mov es:RH5_CHAR[bx],al ; return the character
  186. dd_poll10:
  187. sub ax,ax
  188. ret
  189. dd_instat: ; 6-input status (char only)
  190. ;---------
  191. call poll_char ; check keyboard status
  192.  jnz dd_poll10
  193. dd_instat20:
  194. mov ax,RHS_BUSY
  195. ret
  196. dd_inflush: ; 7-input flush
  197. ;---------
  198. call poll_char ; check keyboard status
  199.  jz dd_poll10  ; skip if not ready
  200. call char_read ; else read next character
  201. jmps dd_inflush ; repeat until buffer empty
  202. dd_output: ; 8-output
  203. ;---------
  204. mov cx,es:RH4_COUNT[bx] ; get # of characters to output
  205.  jcxz output9 ; return if nothing to output
  206. push es ; save ES (-> request header!)
  207. les si,es:RH4_BUFFER[bx] ; get address of string to output
  208. output1:
  209. lods es:byte ptr [si] ; get next character to output
  210. pushf ; stack as per Int 29
  211. db 09Ah ; CALLF to our fastconsole entry
  212. dw CG:FastConsole
  213. dw 70h
  214. loop output1 ; repeat for all characters
  215. pop es
  216. output9:
  217. sub ax,ax
  218. ret
  219. driver endp
  220. RCODE ends ; end of device driver code
  221. page
  222. ICODE segment 'ICODE' ; initialization code
  223. dd_init: ; 0-initialize driver
  224. ;-------
  225. push es
  226. sub ax,ax
  227. mov es,ax
  228. mov ax,CG:FastConsole ; console output vector
  229. mov di,FASTCON_INT*4 ; setup fast single character
  230. stosw ; console output vector
  231. mov ax,ds ; (identified by DA_SPECIAL)
  232. stosw
  233. mov di,CTRLBRK_INT*4 ; setup Ctrl-Break ROS vector
  234. mov ax,CG:ControlBreak ;   for ^C program abort
  235. stosw ;   when a character has already
  236. mov ax,ds ;   been typed into the ROS buffer
  237. stosw
  238. pop es
  239. ifdef JAPAN
  240. mov ax,05000H ; Japanese mode (AX machine)
  241. mov bx,81 ; 081 : Japanese mode select
  242. int VIDEO_INT ;
  243. mov ax,05000h ; Japanese mode (AX machine)
  244. mov bx,81 ; 081 : Japanese mode select
  245. int KEYBOARD_INT ;
  246. endif
  247. mov ax,14*256 + 13 ; output a carriage return
  248. int VIDEO_INT
  249. mov ax,14*256 + 10 ; output a line feed
  250. int VIDEO_INT
  251. les bx,REQUEST[bp] ; ES:BX -> request header
  252. mov ax,endbios ; get last resident byte in BIOS
  253. mov es:RH0_RESIDENT[bx],ax ; set end of device driver
  254. mov es:RH0_RESIDENT+2[bx],ds
  255. sub ax,ax ; initialization succeeded
  256.     ret             
  257. ICODE ends
  258. end