Files
DR-DOS-OpenDOS/IBMBIO/CONSOLE.ASM
2020-11-04 23:59:28 +01:00

308 lines
8.1 KiB
NASM

; 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