mirror of
https://github.com/SEPPDROID/DR-DOS-OpenDOS.git
synced 2025-10-22 16:04:20 +00:00
469 lines
13 KiB
Plaintext
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
|