Files
DR-DOS-OpenDOS/IBMDOS/IOCTL.A86
2020-11-04 23:59:28 +01:00

469 lines
13 KiB
Plaintext

; File : $IOCTL.A86$
;
; 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: $
; IOCTL.A86 1.17 94/11/28 15:42:19
; f440B now does not modify net_retry if DX=0
; IOCTL.A86 1.16 93/11/08 19:15:18
; SETVER to subversion 0xFF disabled int 21/4452
; IOCTL.A86 1.15 93/07/26 18:16:16
; add some code which disables drdos check if app is SETVER'd
; leave said code disabled unless required
; IOCTL.A86 1.14 93/07/22 19:29:54
; get/set serial number now the correct way round
; IOCTL.A86 1.11 93/06/17 22:14:34
; support for ioctl 10/11 query ioctl support
; ENDLOG
;
; 7 Nov 87 Removal of development flags
; 17 Dec 87 Return "Single device Supported" for IOCTL sub-functions
; 0Eh and 0Fh.
; 24 Feb 88 Return 1060h from IOCTL sub-function 51h under DOS PLUS
; instead of the Concurrent DOS OS version.
; 24 Feb 88 Correct Generic IOCTL function and prevent the generation
; of critical errors.
; 24 May 88 sub-function 53h returns the address of the INT24 handler
; for the command processor.
; 01 Jun 88 Add sub-function 4454 to support setting the default password
; 03 Nov 88 Add History Buffer Sub-Command f4456 for DOSPLUS
; 02 Feb 89 Add code page switching sub-function 0Ch
; 19 Feb 89 Support Sub-Command f4457 to control SHARE
; 15 Mar 89 Do not generate critical errors from 4402 and 4403.
; 18 Apr 89 Sub-function 53 only suported for Concurrect DOS
; 19 Apr 89 Don't clobber error code on 440D and 440E (pc-cache)
; 31 May 89 New function f4458 to return pointer to private data.
; 31 May 89 f440B sets up DOS internal data
; 15 Jun 89 Don't throw away inheritance bit when masking Share Mode Flags
; 11 Oct 89 f4407/07 set AX on return, not just AL
; 26 Oct 89 for a few bytes more...
; 18 Jan 90 HILOAD interface added onto f4457
; 25 Jan 90 INT21/4458 returns a pointer to IDLE_DATA in ES:AX
; 13 Jan 90 private_data exported in CDOS for DEBUG systems
; 27 Feb 90 4459 provides Int21 function that does Int224 calls
; 7 Mar 90 Convert to register preserved function calls
; 14 Mar 90 No critical error generated in IOCTL functions
; 3 May 90 stop forcing ioctl 4403/3/4/5 errors to ED_ACCESS
; 4 Jun 90 445A provides user group support on CDOS
; 3 jun 92 Add 4456/2+3 to examine history state, toggle history enable
; 30 jul 92 HILOAD now uses official memory strategy calls
;
include pcmode.equ
include fdos.def
include i:msdos.equ
include i:mserror.equ
include i:cmdline.equ
include i:driver.equ
include i:reqhdr.equ
include i:psp.def
PCM_CODE CSEG BYTE
extrn os_version:word
extrn patch_version:word
extrn invalid_function:near
extrn error_ret:near
extrn fdos_nocrit:near
extrn fdos_crit:near
extrn fdos_ax_crit:near
extrn return_AX_CLC:near
extrn return_DX:near
extrn return_DSBX_as_ESBX:near
extrn set_retry_RF:near
extrn patch_version:word
; *****************************
; *** DOS Function 69 ***
; *** set/get serial num ***
; *****************************
;
Public func69
func69:
call set_retry_RF ; Prepare for an FDOS function
mov FD_FUNC,MS_X_IOCTL
mov cx,866h ; assume a get serial num
cmp al,1 ; check for 0/1
mov al,0Dh ; ready for ioctl 0D
jb func44common ; go ahead with get serial num
mov cl,46h ; maybe it's a set
je func44common ; go ahead with set serial num
; jmp invalid_function ; ah well, it's an invalid one
jmps f44_30
; *****************************
; *** DOS Function 44 ***
; *** I/O Control ***
; *****************************
;
Public func44
func44:
call set_retry_RF ; Prepare for an FDOS function
func44common:
mov FD_IOCTLFUNC,ax ; save subfunction for FDOS
mov ioctlRH,22 ; assume RH will be wanted
mov ioctlRH+13,0 ; init len and media byte
mov word ptr ioctlRH+14,dx ; point at buffer segment
mov word ptr ioctlRH+16,es
mov word ptr ioctlRH+18,cx ; the Byte Count
cmp ax,dosf44_ftl ; Check for a valid PC-DOS
jae f44_20 ; sub-functions
f44_10:
xchg ax,si
shl si,1
mov si,func44_ft[si]
xchg ax,si
jmp ax
f44_20:
sub al,52h-dosf44_ftl ; adjust to our base of 52h
jc f44_30 ; bail out if too low
cmp ax,ourf44_ftl ; is it too high ?
jb f44_10
f44_30:
jmp invalid_function
; ***********************************************
; *** Sub Function 00 - Get Device Info ***
; ***********************************************
f4400:
call fdos_handle ; execute the function
mov dx,ax ; return in DX too
return_AX_and_DX:
call return_DX ; return to caller in DX
jmp return_AX_CLC ; return AX too
; ***********************************************
; *** Sub Function 01 - Set Device Info ***
; *** Sub Function 06 - Get Input Status ***
; *** Sub Function 07 - Get Output Status ***
; ***********************************************
f4401:
f4406:
f4407:
call fdos_handle ; Execute the Function
jmp return_AX_CLC
; ************************************************
; *** Sub Function 04 - Read Blk Device ***
; *** Sub Function 05 - Write Blk Device ***
; *** Sub Function 11 - Query ioctl Blk ***
; ************************************************
;
f4404:
f4405:
f4411:
xor bh,bh ; BX = drive number
; ************************************************
; *** Sub Function 02 - Read Character Dev ***
; *** Sub Function 03 - Write Character Dev ***
; *** Sub Function 10 - Query ioctl Char ***
; ************************************************
;
f4402:
f4403:
f4410:
mov dx,DA_QUERY ; assume we will query support
mov al,CMD_QUERY_IOCTL ; and be ready to go
mov cx,FD_IOCTLFUNC ; re-read the function number
test cl,10h ; is it function 10 of 11?
jnz f44ioctl ; yes, we are ready
mov dx,DA_IOCTL ; no, we actually want to do it
mov al,CMD_INPUT_IOCTL ; even functions are input
test cl,1 ; test for input functions
jz f44ioctl
mov al,CMD_OUTPUT_IOCTL ; odd functions are output
f44ioctl:
mov FD_IOCTLSTAT,dx ; this device driver support is required
mov ioctlRH+2,al ; this is the function
call fdos_handle ; Execute the Function
mov ax,word ptr ioctlRH+18 ; return # xfered
jmp return_AX_CLC
; *****************************
; *** Sub Function 09 ***
; *** Networked Media ***
; *****************************
;
f4409:
call fdos_drive ; Execute the Function
mov dx,ax ; Get the Return Information
mov ax,0300h
jmps return_AX_and_DX
; *****************************
; *** Sub Function 0A ***
; *** Networked Handle ***
; *****************************
;
f440A:
call fdos_handle ; Execute the Function
mov dx,ax ; Get the Return Information
jmp return_DX ; and return in DX
; *****************************
; *** Sub Function 0B ***
; *** Update Share Retry ***
; *****************************
;
; dos_CX [1] Number of times to execute the delay loop
; which consists of xor cx,cx ! loop $
;
; dos_DX [3] Number of times to retry
;
;
f440B:
mov net_delay,cx
test dx,dx
jz f440B_10
mov net_retry,dx
f440b_10:
ret
; *****************************
; *** Sub Function 0D ***
; *** Device Driver Req ***
; *****************************
;
f440D:
xor bh,bh
; jmp f440C
; *****************************
; *** Sub Function 0C ***
; *** Code Page Switching ***
; *****************************
;
f440C:
mov FD_IOCTLSTAT,DA_GETSET ; device driver support required
mov FD_HANDLE,bx ; Save the Handle Number
mov ioctlRH,23 ; different RH length
mov ioctlRH+2,CMD_GENERIC_IOCTL
xchg cl,ch ; swap minor/major functions
mov word ptr ioctlRH+13,cx ; and store in request header
mov word ptr ioctlRH+15,si
mov word ptr ioctlRH+17,di
mov word ptr ioctlRH+19,dx ; point at buffer segment
mov word ptr ioctlRH+21,es
call fdos_ax_crit ; Execute the Function and
jc fdos_error ; return all error codes
ret
; ***********************************************
; *** Sub Function 08 - Removable Media ***
; *** Sub Function 0E - Get Logical Drive ***
; *** Sub Function 0F - Set Logical Drive ***
; ***********************************************
;
f4408:
f440E:
f440F:
call fdos_drive ; Execute the Function
jmp return_AX_CLC ; return result in AX
fdos_drive:
;----------
xor bh,bh ; BX = the drive number
fdos_handle:
;----------
mov FD_HANDLE,bx
call fdos_crit ; then execute the FDOS
jnc fdos_OK ; exit on Error
add sp,WORD ; discard near return address
fdos_error:
jmp error_ret ; and return the error
fdos_OK:
mov ax,FD_IOCTLSTAT ; get the return information
ret
eject
; *****************************
; *** CCP/M Extension ***
; *** Sub Function 52 ***
; *** Return CCP/M Version ***
; *****************************
;
f4452:
if DOS5
mov es,current_psp ; version is kept in the PSP
cmp PSP_VERSION,0FF00h ; sub-version of 255 ?
jae f4452_10 ; then say we ain't DRDOS
endif
mov ax,cs:os_version ; Get OS ver number
mov dx,cs:patch_version
call return_DX ; return in DX
jmp return_AX_CLC ; return in AX
if DOS5
f4452_10:
jmp invalid_function
endif
if PASSWORD
; *****************************
; *** CCP/M Extension ***
; *** Sub Function 54 ***
; *** Set Default PASSWORD ***
; *****************************
;
f4454:
mov FD_IOCTLFUNC,0Bh ; save subfunction for FDOS
jmp fdos_nocrit ; Execute the Function
endif
; *****************************
; *** CCP/M Extension ***
; *** Sub Function 56 ***
; *** History Buffer Cntrl ***
; *****************************
;
; This function changes the default history buffer used for func0A:
;
; On Entry:
; DL = 0 -> Standard Process Buffer
; DL = 1 -> Command.com history Buffer
; DL = 2 -> Toggle history enable/disable
; DL = 3 -> Get current state of history buffers
; DL = 4 -> Toggle insert mode
;
; On Exit:
; AL = previous history state (Bit 0 set if history on)
; Bit 0 -> set if history enabled
; Bit 1 -> set if insert enabled
; Bit 7 -> set if command history buffer
;
f4456:
mov ax,cle_state ; Get the current History Status
cmp dl,2 ; are we disabling/enabling ?
jb f4456_10 ; below, switch buffers
je f4456_05 ; yes, try and do it
cmp dl,4 ; toggle insert state ?
jne f4456_20 ; no, return existing state
xor al,RLF_INS ; toggle insert state
jmps f4456_20 ; set and return prev state
f4456_05:
mov cl,RLF_ENHANCED ; we are interested in enhancements
test @hist_flg,cl ; only if history possible
jz f4456_20 ; just return existing state
xor al,cl ; invert current setting
; and fall thru' to enable/disable
; standard buffer (never called
; by COMMAND...)
f4456_10:
or al,RLF_INROOT ; assume we are in the root
if IDLE_DETECT
or idle_flags,IDLE_COMMAND
endif
test dl,1 ; Get new state and mask bit
jnz f4456_20
and al,not RLF_INROOT ; we are in application buffer
if IDLE_DETECT
and idle_flags,not IDLE_COMMAND
endif
f4456_20:
xchg ax,cle_state ; set state, returning old state
ret
; *****************************
; *** CCP/M Extension ***
; *** Sub Function 58 ***
; *** Private Data Func ***
; *****************************
;
; On Exit ES:BX points to our DRDOS private data.
; ES:AX points to the IDLE Data Area
f4458:
mov bx,offset @private_data
call return_DSBX_as_ESBX ; return ES:BX pointing to private data
mov ax,offset idle_data
jmp return_AX_CLC
PCM_RODATA CSEG WORD
;
; PCDOS Sub-Functions Only
;
func44_ft dw f4400
dw f4401
dw f4402
dw f4403
dw f4404
dw f4405
dw f4406
dw f4407
dw f4408
dw f4409
dw f440A
dw f440B
dw f440C
dw f440D
dw f440E
dw f440F
dw f4410
dw f4411
dosf44_ftl equ (offset $ - offset func44_ft)/2
;
; CCP/M Sub-Functions Only
;
dw f4452 ; 4452 OS version no
dw invalid_function ; 4453 Invalid Function
if PASSWORD
dw f4454 ; 4454 set default password
else
dw invalid_function ; 4454 was set default password
endif
dw invalid_function ; 4455 Invalid Function
dw f4456 ; 4456 history buffer support
dw invalid_function ; 4457 was share enable/disable
dw f4458 ; 4458 pointer to private data
ourf44_ftl equ (offset $ - offset func44_ft)/2
PCMODE_DATA DSEG WORD
extrn net_delay:word, net_retry:word
extrn @hist_flg:byte
extrn @private_data:byte
if IDLE_DETECT
extrn idle_data:word
extrn idle_flags:word
endif
extrn cle_state:word
extrn ioctlRH:byte
extrn dos_version:word
extrn current_psp:word
end