mirror of
https://github.com/SEPPDROID/DR-DOS-OpenDOS.git
synced 2025-10-22 16:04:20 +00:00
Upload
This commit is contained in:
468
IBMDOS/IOCTL.A86
Normal file
468
IBMDOS/IOCTL.A86
Normal file
@@ -0,0 +1,468 @@
|
||||
; 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
|
Reference in New Issue
Block a user