mirror of
https://github.com/SEPPDROID/DR-DOS-OpenDOS.git
synced 2025-10-22 07:54:28 +00:00
308 lines
8.1 KiB
NASM
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
|