CONSOLE.ASM
资源名称:drdossrc.zip [点击查看]
上传用户:xiaogehua
上传日期:2007-01-08
资源大小:1183k
文件大小:8k
源码类别:
操作系统开发
开发平台:
Asm
- ; File : $Workfile$
- ;
- ; Description :
- ;
- ; Original Author : DIGITAL RESEARCH
- ;
- ; Last Edited By : $CALDERA$
- ;
- ;-----------------------------------------------------------------------;
- ; Copyright Work of Caldera, Inc. All Rights Reserved.
- ;
- ; THIS WORK IS A COPYRIGHT WORK AND CONTAINS CONFIDENTIAL,
- ; PROPRIETARY AND TRADE SECRET INFORMATION OF CALDERA, INC.
- ; ACCESS TO THIS WORK IS RESTRICTED TO (I) CALDERA, INC. EMPLOYEES
- ; WHO HAVE A NEED TO KNOW TO PERFORM TASKS WITHIN THE SCOPE OF
- ; THEIR ASSIGNMENTS AND (II) ENTITIES OTHER THAN CALDERA, INC. WHO
- ; HAVE ACCEPTED THE CALDERA OPENDOS SOURCE LICENSE OR OTHER CALDERA LICENSE
- ; AGREEMENTS. EXCEPT UNDER THE EXPRESS TERMS OF THE CALDERA LICENSE
- ; AGREEMENT NO PART OF THIS WORK MAY BE USED, PRACTICED, PERFORMED,
- ; COPIED, DISTRIBUTED, REVISED, MODIFIED, TRANSLATED, ABRIDGED,
- ; CONDENSED, EXPANDED, COLLECTED, COMPILED, LINKED, RECAST,
- ; TRANSFORMED OR ADAPTED WITHOUT THE PRIOR WRITTEN CONSENT OF
- ; CALDERA, INC. ANY USE OR EXPLOITATION OF THIS WORK WITHOUT
- ; AUTHORIZATION COULD SUBJECT THE PERPETRATOR TO CRIMINAL AND
- ; CIVIL LIABILITY.
- ;-----------------------------------------------------------------------;
- ;
- ; *** Current Edit History ***
- ; *** End of Current Edit History ***
- ;
- ; $Log$
- ;
- ; CONSOLE.ASM 1.8 93/07/22 19:43:16
- ; switch over to REQUEST.EQU
- ; CONSOLE.ASM 1.7 93/07/19 18:57:15
- ; Add header
- ;
- ; ENDLOG
- include BIOSGRPS.EQU
- include DRMACROS.EQU ; standard DR macros
- include IBMROS.EQU ; ROM BIOS equates
- include REQUEST.EQU ; request header equates
- include DRIVER.EQU ; device driver equates
- page
- CGROUP group CODE, RCODE, ICODE
- CG equ offset CGROUP
- Assume CS:CGROUP, DS:CGROUP, ES:CGROUP, SS:CGROUP
- CODE segment 'CODE'
- INSERT_ACTIVE equ 2 ; set if cmdline insert active
- extrn endbios:word ; for device driver INIT function
- extrn FastConsole:far ; console output vector
- extrn ControlBreak:far ; ^C program abort
- extrn local_flag:byte
- extrn local_char:byte
- CODE ends
- RCODE segment 'RCODE'
- ; Device driver function table
- Public ConsoleTable
- ConsoleTable:
- db 14 ; Last supported command
- dw CG:dd_init ; 0-initialize driver
- dw CG:dd_error ; 1-media change check (disks only)
- dw CG:dd_error ; 2-build BPB (disks only)
- dw CG:dd_inioctl ; 3-IOCTL string input
- dw CG:dd_input ; 4-input
- dw CG:dd_poll ; 5-nondestructive input (char only)
- dw CG:dd_instat ; 6-input status (char only)
- dw CG:dd_inflush ; 7-input flush
- dw CG:dd_output ; 8-output
- dw CG:dd_output ; 9-output with verify
- dw CG:dd_outstat ; 10-output status (char only)
- dw CG:dd_outflush ; 11-output flush (char only)
- dw CG:dd_outioctl ; 12-IOCTL string output
- dw CG:dd_open ; 13-device open
- dw CG:dd_close ; 14-device close
- Assume DS:CGROUP, ES:Nothing, SS:Nothing
- page
- driver proc near
- dd_outioctl:
- ;-----------
- mov cx,es:RH4_COUNT[bx] ; get # of characters to output
- cmp cx,2 ; is it what we expect ?
- jne dd_error ; no, bail out
- push ds
- lds si,es:RH4_BUFFER[bx] ; DS:SI -> buffer
- lodsw ; get the data
- pop ds
- xchg ax,si ; save data in SI
- mov ah,3 ; read cursor position/type
- mov bh,0 ; for page zero
- int VIDEO_INT
- and ch,0c0h ; make cursor start line = 0
- mov al,cl ; AL = bottom line of cursor
- dec ax ; AL = bottom line - 1
- test si,INSERT_ACTIVE
- jz dd_outioctl10
- shr al,1 ; Insert active is 1/2 size block
- dd_outioctl10:
- or ch,al ; cursor start line is now here
- mov ah,1 ; set cursor type
- int VIDEO_INT
- ret
- dd_inioctl:
- ;----------
- ; jmp dd_error ; input not supported
- dd_error: ; used for all unsupported driver functions
- ;--------
- mov ax,RHS_ERROR+3 ; "invalid command" error
- ret
- poll_c1:
- mov ah,0 ; eat the next character
- int KEYBOARD_INT ; take it out of ROS buffer
- ; and check again
- poll_char:
- ;---------
- ; exit: ZF = 1 => no character ready
- ; ZF = 0 => AL = character
- mov al,local_char ; get the local character
- cmp local_flag,TRUE ; do we have local character?
- je poll_c4 ; no, check ROS keyboard status
- mov ah,1 ; get keyboard status (and character)
- int KEYBOARD_INT ; read character from keyboard
- jz input9 ; skip if no character there
- test ax,ax ; test if we got Ctrl-Brk
- jz poll_c1 ; and eat it if we have
- poll_c3: ; we've got a character
- cmp ax,7200h ; is this Ctrl-PrtSc?
- jne poll_c4
- mov al,'P'-40h ; convert to ^P character
- poll_c4: ; return the character in AL
- or ah,TRUE ; indicate "ready" status
- ret
- char_read:
- ;---------
- cmp local_flag,TRUE ; do we have local character?
- je rdchr3 ; handle that specially
- mov ah,0
- int KEYBOARD_INT ; read character from keyboard
- test ax,ax ; test if we got Ctrl-Brk
- jz char_read ; retry in that case
- cmp ax,7200h ; is this Ctrl-PrtSc?
- jne rdchr1 ; skip if any other
- mov al,'P'-40h ; convert to ^P character
- ret ; and return it
- rdchr1: ; else it is normal or function key
- test al,al ; test if function key
- jnz rdchr2 ; skip if normal character
- mov local_flag,TRUE ; else return scan code as next
- mov local_char,ah ; character from next INPUT
- rdchr2: ; return the character in AL
- ret
- rdchr3:
- mov local_flag,FALSE ; tell them buffer is invalid
- mov al,local_char ; get the local charcater
- ret ; and return it
- page
- dd_input: ; 4-input
- ;--------
- mov cx,es:RH4_COUNT[bx] ; get # of characters to output
- jcxz input9 ; return if nothing to input
- push es ; save ES (-> request header!)
- les di,es:RH4_BUFFER[bx] ; get address of string to input
- input1:
- call char_read ; read 8-bit character
- stosb ; store it in input buffer
- loop input1 ; repeat for all characters
- pop es
- input9:
- ; sub ax,ax
- ; ret
- dd_outstat: ; 10-output status (char only)
- ;---------- ; always ready, return no busy
- dd_outflush: ; 11-output flush (char only)
- ;----------- ; unbuffered, perform no operation
- dd_open: ; 13-device open
- ;------- ; no operation
- dd_close: ; 14-device close
- ;-------- ; no operation
- sub ax,ax
- ret
- dd_poll: ; 5-nondestructive input (char only)
- ;-------
- call poll_char ; check keyboard status
- jz dd_instat20
- mov es:RH5_CHAR[bx],al ; return the character
- dd_poll10:
- sub ax,ax
- ret
- dd_instat: ; 6-input status (char only)
- ;---------
- call poll_char ; check keyboard status
- jnz dd_poll10
- dd_instat20:
- mov ax,RHS_BUSY
- ret
- dd_inflush: ; 7-input flush
- ;---------
- call poll_char ; check keyboard status
- jz dd_poll10 ; skip if not ready
- call char_read ; else read next character
- jmps dd_inflush ; repeat until buffer empty
- dd_output: ; 8-output
- ;---------
- mov cx,es:RH4_COUNT[bx] ; get # of characters to output
- jcxz output9 ; return if nothing to output
- push es ; save ES (-> request header!)
- les si,es:RH4_BUFFER[bx] ; get address of string to output
- output1:
- lods es:byte ptr [si] ; get next character to output
- pushf ; stack as per Int 29
- db 09Ah ; CALLF to our fastconsole entry
- dw CG:FastConsole
- dw 70h
- loop output1 ; repeat for all characters
- pop es
- output9:
- sub ax,ax
- ret
- driver endp
- RCODE ends ; end of device driver code
- page
- ICODE segment 'ICODE' ; initialization code
- dd_init: ; 0-initialize driver
- ;-------
- push es
- sub ax,ax
- mov es,ax
- mov ax,CG:FastConsole ; console output vector
- mov di,FASTCON_INT*4 ; setup fast single character
- stosw ; console output vector
- mov ax,ds ; (identified by DA_SPECIAL)
- stosw
- mov di,CTRLBRK_INT*4 ; setup Ctrl-Break ROS vector
- mov ax,CG:ControlBreak ; for ^C program abort
- stosw ; when a character has already
- mov ax,ds ; been typed into the ROS buffer
- stosw
- pop es
- ifdef JAPAN
- mov ax,05000H ; Japanese mode (AX machine)
- mov bx,81 ; 081 : Japanese mode select
- int VIDEO_INT ;
- mov ax,05000h ; Japanese mode (AX machine)
- mov bx,81 ; 081 : Japanese mode select
- int KEYBOARD_INT ;
- endif
- mov ax,14*256 + 13 ; output a carriage return
- int VIDEO_INT
- mov ax,14*256 + 10 ; output a line feed
- int VIDEO_INT
- les bx,REQUEST[bp] ; ES:BX -> request header
- mov ax,endbios ; get last resident byte in BIOS
- mov es:RH0_RESIDENT[bx],ax ; set end of device driver
- mov es:RH0_RESIDENT+2[bx],ds
- sub ax,ax ; initialization succeeded
- ret
- ICODE ends
- end