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

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