mirror of
https://github.com/SEPPDROID/DR-DOS-OpenDOS.git
synced 2025-10-22 07:54:28 +00:00
259 lines
6.4 KiB
Plaintext
259 lines
6.4 KiB
Plaintext
; File : $SUPPORT.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$
|
|
; SUPPORT.A86 1.11 93/11/29 13:39:28
|
|
; Don't rely on DS when return_ called
|
|
; ENDLOG
|
|
;
|
|
; The following Support routines are provided for both the
|
|
; handle and FCB functions which require critical error handler
|
|
; support.
|
|
;
|
|
; 15 Jun 88 Modify the SYSDAT and SUPERVISOR variables to enable
|
|
; the relocation of the BDOS into high memory
|
|
; 5 Jan 89 Only set PCKBD mode if we own the default console
|
|
; 9 Mar 89 Support a split PCMODE and SYSDAT Segments
|
|
; 22 Sep 89 LDT support routine added
|
|
; 29 Jan 90 Int 2A critical section support added to dpbdos_entry
|
|
; 7 Mar 90 Convert to register preserved function calls
|
|
; 4 May 90 DRDOS int3x handlers removed (they are pointed to IRET
|
|
; in PCMODE_DATA by INIT.PCM)
|
|
; 12 Dec 90 keep error server number inverted so local = 0, more compatible
|
|
|
|
;
|
|
include pcmode.equ
|
|
include fdos.def
|
|
include i:mserror.equ
|
|
include i:doshndl.def
|
|
|
|
eject
|
|
PCM_CODE CSEG BYTE
|
|
extrn error_exit:near ; Standard Error Exit Routine
|
|
extrn fcberror_exit:near ; Special FCB function Error Exit
|
|
extrn fdos_entry:near
|
|
extrn get_dseg:near
|
|
|
|
eject
|
|
;
|
|
; STRLEN determines the length of the string passed in DS:SI
|
|
; and returns the byte length in CX.
|
|
;
|
|
Public strlen
|
|
strlen:
|
|
push es ! push di
|
|
push ds ! pop es
|
|
mov di,si
|
|
mov cx,0FFFFh
|
|
sub al,al
|
|
repnz scasb
|
|
pop di ! pop es
|
|
not cx
|
|
dec cx
|
|
ret
|
|
|
|
eject
|
|
;
|
|
; This routine sets the address to be returned to by the
|
|
; FDOS when an error has occured and the RETRY request has been
|
|
; made. The set_retry routine should be used as follows:-
|
|
;
|
|
; mov al,Valid Error Responses
|
|
; call set_retry
|
|
; Init All FDOS Parameters
|
|
; call fdos_crit
|
|
;
|
|
; NB. For register model return with AX = dos_AL extended to 16 bit
|
|
|
|
Public set_retry_RF
|
|
set_retry_RF:
|
|
mov al,OK_RF ; Valid to RETRY or FAIL
|
|
; jmp set_retry ; (the most common case)
|
|
|
|
Public set_retry
|
|
set_retry:
|
|
mov valid_flg,al ; Save Valid Error Reponses
|
|
pop retry_off ; Save the Routine Address
|
|
mov retry_sp,sp ; and the Stack Pointer
|
|
mov al,ah ; get function number
|
|
xor ah,ah ; make it a word
|
|
mov FD_FUNC,ax ; save it for the FDOS
|
|
push ds
|
|
push bx
|
|
lds bx,int21regs_ptr ; point to users registers
|
|
and reg_FLAGS[bx],not CARRY_FLAG
|
|
mov al,reg_AL[bx] ; clear CY assuming we will succeed
|
|
pop bx ; and reload AL with entry value
|
|
pop ds
|
|
jmp retry_off
|
|
|
|
;
|
|
; The FDOS routine executes the CCP/M FDOS function using the
|
|
; static FDOS parameter block defined in the Data Segment.
|
|
;
|
|
Public fdos_crit
|
|
fdos_crit:
|
|
call fdos_nocrit
|
|
cmp ax,ED_LASTERROR ; Compare against last error code
|
|
jnb fdos_error ; if NOT below then is ERROR CODE
|
|
or ax,ax ; Reset the Carry Flag and Return
|
|
ret
|
|
|
|
Public fdos_ax_crit
|
|
fdos_ax_crit:
|
|
call fdos_nocrit
|
|
cmp ax,ED_LASTERROR ; Compare against last error code
|
|
jnb fdos_error ; if NOT below then is ERROR CODE
|
|
or ax,ax ; Reset the Carry Flag and Return
|
|
; jmp return_AX_CLC ; Save the Return Code
|
|
|
|
Public return_AX_CLC
|
|
return_AX_CLC:
|
|
;-------------
|
|
; On Entry:
|
|
; AX to be returned to caller in AX
|
|
; On Exit:
|
|
; ES:DI trashed
|
|
;
|
|
push ds ! push di
|
|
lds di,ss:int21regs_ptr
|
|
mov reg_AX[di],ax ; return AX to caller
|
|
and reg_FLAGS[di],not CARRY_FLAG
|
|
pop di ! pop ds
|
|
ret
|
|
|
|
|
|
fdos_error: ; Process the Error
|
|
cmp sp,retry_sp ; Is the user expecting use to
|
|
jnz fdos_e10 ; return or use the default handler
|
|
jmp error_exit ; If CALLed then return with the error
|
|
fdos_e10: ; to the calling routine.
|
|
stc
|
|
ret
|
|
|
|
Public fcbfdos_crit
|
|
fcbfdos_crit:
|
|
call fdos_nocrit
|
|
cmp ax,ED_LASTERROR ; Compare against last error code
|
|
jnb fcbfdos_error ; if NOT below then is ERROR CODE
|
|
or ax,ax ; Reset the Carry Flag and Return
|
|
ret
|
|
|
|
fcbfdos_error: ; Process the Error
|
|
cmp sp,retry_sp ; Is the user expecting use to
|
|
jnz fcbfdos_e10 ; return or use the default handler
|
|
jmp fcberror_exit ; If CALLed then return with the error
|
|
fcbfdos_e10: ; to the calling routine.
|
|
stc
|
|
ret
|
|
|
|
Public fdos_nocrit
|
|
fdos_nocrit:
|
|
mov dx,offset fdos_data ; point to fdos parameter block
|
|
push ds ! push es
|
|
push si ! push di ! push bp
|
|
call fdos_entry ; BDOS module entry point
|
|
or ax,ax ; Set the Flags
|
|
pop bp ! pop di ! pop si
|
|
pop es ! pop ds
|
|
ret
|
|
|
|
|
|
Public reload_ES
|
|
reload_ES:
|
|
; On Entry:
|
|
; None
|
|
; On Exit:
|
|
; ES = callers ES
|
|
; All regs preserved
|
|
;
|
|
push bx
|
|
les bx,ss:int21regs_ptr
|
|
mov es,es:reg_ES[bx] ; reload with callers ES
|
|
pop bx
|
|
ret
|
|
|
|
|
|
Public return_BX
|
|
return_BX:
|
|
;---------
|
|
; On Entry:
|
|
; BX to be returned to caller in BX
|
|
; On Exit:
|
|
; All regs preserved
|
|
;
|
|
push ds ! push bx
|
|
lds si,ss:int21regs_ptr
|
|
mov reg_BX[si],bx ; return BX to caller
|
|
pop bx ! pop ds
|
|
ret
|
|
|
|
Public return_CX
|
|
return_CX:
|
|
;---------
|
|
; On Entry:
|
|
; CX to be returned to caller in CX
|
|
; On Exit:
|
|
; All regs preserved
|
|
;
|
|
push ds ! push bx
|
|
lds bx,ss:int21regs_ptr
|
|
mov reg_CX[bx],cx ; return CX to caller
|
|
pop bx ! pop ds
|
|
ret
|
|
|
|
Public return_DX
|
|
return_DX:
|
|
;---------
|
|
; On Entry:
|
|
; DX to be returned to caller in DX
|
|
; On Exit:
|
|
; All regs preserved
|
|
;
|
|
push ds ! push bx
|
|
lds bx,ss:int21regs_ptr
|
|
mov reg_DX[bx],dx ; return DX to caller
|
|
pop bx ! pop ds
|
|
ret
|
|
|
|
PCMODE_DATA DSEG WORD
|
|
|
|
|
|
extrn current_psp:word
|
|
extrn DBCS_tbl:word ; double byte character set table
|
|
extrn int21regs_ptr:dword
|
|
extrn retry_off:word
|
|
extrn retry_sp:word
|
|
extrn valid_flg:byte
|
|
|
|
|
|
end
|
|
|