mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-24 08:54:17 +00:00
154 lines
3.8 KiB
Plaintext
154 lines
3.8 KiB
Plaintext
|
||
;*****************************************************
|
||
;*
|
||
;* SUPERVISOR INTERFACE ROUTINES
|
||
;*
|
||
;*****************************************************
|
||
|
||
;=========
|
||
user_entry:
|
||
;=========
|
||
; User Entry Point - enter here from a INT 224
|
||
;
|
||
; REGISTER USAGE
|
||
; INPUT OUTPUT
|
||
; ----- ------
|
||
; CL - Function Code AX - Copy of BX
|
||
; DL - Byte Param BX - Return
|
||
; DX - Word Param CX - Error Code
|
||
; ES - Segment Return
|
||
;
|
||
; SETUP FOR ENTRY POINTS
|
||
; ----------------------
|
||
; contents of users stack
|
||
; Flags
|
||
; CS
|
||
; IP <- u_stack_ss,_sp
|
||
; in u_stack of uda:
|
||
; DS
|
||
; user_ret <- SS,SP
|
||
; DS = Sysdat Segment
|
||
; ES -> user_data_area
|
||
; BX -> pd address
|
||
; DX -> function parameter
|
||
; u_wrkseg == user's DS
|
||
; u_retseg == user's ES
|
||
|
||
;initialize critical areas
|
||
cld ! mov di,ds ;DI=user's DSEG
|
||
mov ds,sysdat ! mov bx,rlr ;BX=pd address
|
||
mov ax,es ! mov es,p_uda[bx] ;ES=uda
|
||
cmp u_insys,0 ! jne noswt
|
||
mov u_stack_ss,ss ;switch stacks
|
||
mov u_stack_sp,sp
|
||
mov bp,es ! mov ss,bp
|
||
mov sp,ulen
|
||
jmps uecont
|
||
noswt: push u_wrkseg
|
||
uecont: inc u_insys
|
||
;enable interrupts if intflag
|
||
cmp intflag,0 ! je noints
|
||
sti
|
||
noints: ;initialized non-critical areas
|
||
mov u_retseg,ax
|
||
mov u_wrkseg,di
|
||
mov ch,0 ! call func ; execute function
|
||
mov ax,bx ; for INTEL's PL/M
|
||
mov ds,u_wrkseg ! cli
|
||
dec u_insys
|
||
cmp u_insys,0 ! jne nstk
|
||
mov ss,u_stack_ss ; restore user's stack
|
||
mov sp,u_stack_sp
|
||
jmps ueout
|
||
nstk: pop u_wrkseg
|
||
ueout: mov es,u_retseg
|
||
iret ; back to user
|
||
|
||
func: ; call system function
|
||
;---- -----------------------
|
||
; input: CH = module (for explicit module function)
|
||
; bypassing network check...
|
||
; 0 if User function.
|
||
; network check is done
|
||
; CL = function #
|
||
; DX = arg
|
||
|
||
mov u_func,cl
|
||
func1: cmp ch,0 ! je userf
|
||
mov al,ch ! mov ch,0
|
||
jmps inmod
|
||
userf: mov si,cx ! shl si,1 ! add si,cx
|
||
add si,offset sysent
|
||
test ent_flag[si],ef_network ! jz nonet
|
||
test module_map,netmod_bit ! jz nonet
|
||
push si ! callf dword ptr .netmod ! pop si
|
||
cmp al,true ! jne nonet
|
||
mov si,0 ! mov ax,bx ! ret
|
||
nonet: mov cl,ent_func[si] ! mov ch,0
|
||
mov al,ent_mod[si]
|
||
;AL=mod,CL=func,CH=0
|
||
inmod: cmp al,sup ! jne gofar
|
||
shl cx,1 ! mov si,cx
|
||
jmp cs:supfunc[si]
|
||
gofar: push cx ! mov cx,ax ! dec cl
|
||
mov al,module_map ! shr al,cl
|
||
and al,1 ! jnz goodmod
|
||
pop cx ! mov cx,e_not_implemented
|
||
mov bx,0ffffh ! mov ax,bx ! ret
|
||
goodmod:mov ch,0 ! mov si,cx
|
||
mov cl,3 ! shl si,cl ! pop cx
|
||
callf dword ptr module_table[si]
|
||
ret
|
||
|
||
;=====
|
||
entry:
|
||
;=====
|
||
; Supervisor module entry point
|
||
|
||
cmp cl,f_flagset ! jne entry_notfs
|
||
mov cx,f_inflagset
|
||
call func1 ! mov ax,bx ! retf
|
||
entry_notfs:
|
||
call mpmif ! retf
|
||
|
||
;=====
|
||
mpmif:
|
||
;=====
|
||
push u_wrkseg
|
||
mov al,u_func ! push ax
|
||
mov u_wrkseg,ds
|
||
mov ds,sysdat
|
||
call func
|
||
mov ds,u_wrkseg
|
||
pop ax ! mov u_func,al
|
||
pop u_wrkseg
|
||
mov ax,bx
|
||
ret
|
||
|
||
;======
|
||
xiosif:
|
||
;======
|
||
callf dword ptr .xiosmod ! ret
|
||
|
||
;*****************************************************
|
||
;*
|
||
;* Supervisor function table
|
||
;*
|
||
;*****************************************************
|
||
|
||
supfunc dw not_implemented ; 0-not implemented
|
||
dw bad_entry ; 1-bad function number
|
||
dw version_entry ; 2-(12)get version
|
||
dw callbios_entry ; 3-(50)call bios
|
||
dw load_entry ; 4-(59)user load function
|
||
dw clicmd_entry ; 5-(150)CLI
|
||
dw rpl_entry ; 6-(151)Call RPL
|
||
dw parse_entry ; 7-(152)parse filename
|
||
dw sysdat_entry ; 8-(154)get sysdat addr
|
||
dw tod_entry ; 9-(155)get tod addr
|
||
dw load ; 10-load function
|
||
dw mpmversion_entry; 11-MP/M version number
|
||
dw chain_entry ; 12-(47)Program Chain
|
||
dw serial_entry ; 13-(107)return serial
|
||
dw cload_entry ; 14-chain load function
|
||
|