Digital Research
This commit is contained in:
2020-11-06 18:50:37 +01:00
parent 621ed8ccaf
commit 31738079c4
8481 changed files with 1888323 additions and 0 deletions

View File

@@ -0,0 +1,305 @@
;*****************************************************
;*
;* More CIO Routines
;*
;*****************************************************
;===============
lstattach_entry:
;===============
mov cx,0 ! mov si,p_lst
jmps cioattach
;===============
clstattch_entry:
;===============
mov cx,0ffffh ! mov si,p_lst
jmps cioattach
;===============
cconattch_entry:
;===============
mov cx,0ffffh ! mov si,p_cns
jmps cioattach
;===============
conattach_entry:
;===============
mov cx,0 ! mov si,p_cns
;jmps cioattach
;=========
cioattach:
;=========
; Attach calling process to default ciodev.
; if ciodev is being used, sleep on c_queue
; until another process detaches from device
; and calling process is next in queue.
; input: SI = offset of dev number in PD
; CX = 0ffffh if conditional
push si ! push cx ! mov bx,rlr
mov dh,[si+bx] ! call getccbadr
pop cx
; BX = PD addr
; SI = CCB addr
pushf ! cli
cmp bx,c_attach[si] ! je ca_ret
cmp c_attach[si],0 ! je ca_atch
cmp c_attach[si],0ffffh ! jne ca_chkslp
;This is a Mimic Device
mov dh,c_msource[si]
push cx ! push si ! call getccbadr
cmp bx,c_attach[si]
pop si ! pop cx ! je ca_ret
ca_chkslp: jcxz ca_sleep
popf ! pop si ! mov bx,0ffffh
mov cx,e_no_attach ! ret
ca_sleep: lea dx,c_queue[si]
mov p_stat[bx],ps_ciowait
mov cx,f_sleep ! call mpmif
popf ! pop si ! sub cx,cx
jmps cioattach
ca_atch: mov c_attach[si],bx
ca_ret: popf ! pop si
sub bx,bx ! mov cx,bx ! ret
;===============
lstdetach_entry:
;===============
mov si,p_lst ! jmps ciodetach
;===============
condetach_entry:
;===============
mov si,p_cns
;jmps ciodetach
;=========
ciodetach:
;=========
; Detach Calling process from default ciodev.
; If current owner of ciodev then zero c_attach
; and wakeup the c_queue list to give another
; process the ciodev.
; input: SI = offset of default dev in PD
mov bx,rlr
mov dh,[si+bx] ! call getccbadr
; SI = CCB address
; BX = PD address
pushf ! cli
cmp c_attach[si],0 ! je cd_ret
cmp c_attach[si],bx ! je cd_detach
popf ! mov bx,0ffffh
mov cx,e_not_owner ! ret
cd_detach: mov ax,c_queue[si]
mov c_attach[si],ax
mov cx,f_wakeup
lea dx,c_queue[si]
call mpmif
cd_ret: popf ! sub bx,bx
mov cx,bx ! ret
;===============
conassign_entry:
;===============
; Attach specified console to specified process
;
; input: DX -> acb address in u_wrkseg
;
; +-----+-----+-----+-----+
; | cns |match| PD addr |
; +-----+-----+-----+-----+-----+-----+-----+-----+
; | Name |
; +-----+-----+-----+-----+-----+-----+-----+-----+
;
; cns - console to assign
; match - if not 0,
; PD's default console must match acb_cns
; PD addr - PD to assign to
; name - PD name to assign to if PD addr=0
;
; return: BX = 0 if success,0ffffh if failure
; CX = Error Code
;get console #
push ds ! mov ds,u_wrkseg
mov di,dx ! mov ah,acb_cns[di] ! pop ds
;DI->ACB in u_wrkseg
;AH = console
;check if legal console
cmp ah,ncns ! jbe as_gcns
mov cx,e_ill_cns ! mov bx,0ffffh ! ret
;check if owner is passing console
as_gcns:push di ! push dx ! push ax ! mov dh,ah
call getccbadr ! pop ax ! pop dx ! pop di
mov bx,si ! mov si,rlr
; AH = console
; BX = CCB address
; SI = Calling PD address
; DI = ACB in u_wrkseg
cmp c_attach[bx],0 ! je as_own
cmp c_attach[bx],si ! je as_own
mov cx,e_not_owner ! mov bx,0ffffh ! ret
as_own:
;find pd to assign to
mov bp,bx
push ds ! mov ds,u_wrkseg
mov bx,acb_pd[di]
cmp bx,0 ! jne as_gpd
mov bx,(offset thrdrt)-p_thread
as_trya: push bp ! push ax ! push di
lea dx,acb_name[di]
mov cx,f_findpdname ! call mpmif
pop di ! pop ax ! pop bp
jcxz as_gpd
pop ds ! mov bx,0ffffh ! ret
as_gpd:
;see if pd has same default cns
; BP -> CCB
; BX -> matched pd
mov cl,acb_match[di]
pop ds
cmp cl,0 ! jz as_mok
cmp ah,p_cns[bx] ! je as_mok
push ds ! mov ds,u_wrkseg
jmps as_trya
; see if process is waiting in c_queue
; wakeup if it is
as_mok: mov si,bx ! mov bx,bp
; BP=BX = CCB
; SI = PD to assign to
mov c_attach[bx],si ! add bx,c_queue-p_link
pushf ! cli
as_nqpd:cmp p_link[bx],0 ! jz as_gexit ; cnsque
cmp p_link[bx],si ! je as_qfix
mov bx,p_link[bx] ! jmps as_nqpd
;found pd in c_queue
;take off queue and wakeup
as_qfix: mov ax,p_link[si] ! mov p_link[bx],ax
mov bx,bp ! mov bp,c_queue[bx]
mov c_queue[bx],si
mov p_link[si],bp
popf ! lea dx,c_queue[bx]
mov cx,f_wakeup ! call mpmif
jmps as_ge
as_gexit: ; console is assigned
popf
as_ge: sub cx,cx ! mov bx,cx ! ret
;=============== =====================
getdefcon_entry: ; Get Default Console
;=============== =====================
mov si,rlr
mov bh,0 ! mov bl,p_cns[si]
sub cx,cx ! ret
;=============== ==================
getdeflst_entry: ; Get Default List
;=============== ==================
mov si,rlr
mov bh,0 ! mov bl,p_lst[si]
sub bl,ncondev
sub cx,cx ! ret
;=============== =====================
setdefcon_entry: ; Set Default Console
;=============== =====================
cmp dl,ncondev ! jb sd_good
mov cx,e_ill_cns
mov bx,0ffffh ! ret
sd_good:mov si,rlr
cmp dl,p_cns[si] ! je sd_nodet
push dx ! call condetach_entry ! pop dx
sd_nodet:
mov si,rlr ! mov p_cns[si],dl
sub bx,bx ! mov cx,bx ! ret
; jmp conattach_entry ; NO AUTO ATTACH
;=============== ==================
setdeflst_entry: ; Set Default List
;=============== ==================
cmp dl,nlstdev ! jb sdl_good
mov cx,e_ill_lst
mov bx,0ffffh ! ret
sdl_good:
add dl,ncondev
mov si,rlr
cmp dl,p_lst[si] ! je sdl_nodet
push dx ! call lstdetach_entry ! pop dx
sdl_nodet:
mov si,rlr ! mov p_lst[si],dl
sub bx,bx ! mov cx,bx ! ret
; jmp lstattach_entry ; NO AUTO ATTACH
;=========== ========================
mimic_entry: ; mimic character device
;=========== ========================
; mimic a device. All character output from a source device
; will be echoed on the mimic device.
; input: DH=source
; DL=mimic device
; output: BX = 0 if successful
; BX = 0ffffh on error
; CX = Error Code
; check if source is owned
push dx ! call getccbadr
mov bx,rlr ! pop dx
pushf ! cli
cmp c_attach[si],bx ! jne mim_err
cmp c_mimic[si],0ffh ! jne mim_err
push si ! push dx ! mov dh,dl
call getccbadr ! pop dx ! pop di
cmp c_attach[si],0 ! jne mim_err
cmp c_mimic[si],0ffh ! jne mim_err
; SI->mimic CCB , DI->source CCB
mov c_attach[si],0ffffh
mov c_msource[si],dh
mov c_mimic[di],dl ! popf ! ret
mim_err:mov bx,0ffffh ! mov cx,e_no_mimic
popf ! ret
;============= ===================
unmimic_entry: ; un mimic a device
;============= ===================
; input: DL = device
mov dh,dl ! call getccbadr
pushf ! cli
cmp c_attach[si],0ffffh ! jne mim_err
push dx ! push si
mov dh,c_msource[si]
call getccbadr ! pop di ! pop dx
cmp c_mimic[si],dl ! jne mim_err
mov bx,rlr
mov c_attach[di],bx
mov c_msource[di],0ffh
mov al,c_mimic[di]
mov c_mimic[si],al
mov al,p_lst[bx]
mov p_lst[bx],dl
push ax ! push bx
call lstdetach_entry
pop bx ! pop ax ! mov p_lst[bx],al
popf ! ret