mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-26 09:54:20 +00:00
Upload
Digital Research
This commit is contained in:
123
MPM OPERATING SYSTEMS/MPM-86/MPM-86 2.0 SOURCES/02/QUE2.RTM
Normal file
123
MPM OPERATING SYSTEMS/MPM-86/MPM-86 2.0 SOURCES/02/QUE2.RTM
Normal file
@@ -0,0 +1,123 @@
|
||||
|
||||
;=====
|
||||
rlsmx:
|
||||
;=====
|
||||
; Release all MX queues held by a given process
|
||||
; input: SI = pd address
|
||||
|
||||
pushf ! cli ! mov di,(offset qlr)-q_link
|
||||
rm_nxt:
|
||||
mov bx,q_link[di]
|
||||
or bx,bx ! jz rm_dne
|
||||
test q_flags[bx],qf_mx ! jz rm_notthis
|
||||
cmp si,q_buf[bx] ! jne rm_notthis
|
||||
push bx ! sub ax,ax ! push ax
|
||||
mov dx,sp ! mov cx,f_cqwrite
|
||||
push ds ! push ss ! pop ds
|
||||
call mpmif ! pop ds ! pop ax ! pop bx
|
||||
rm_notthis: mov di,bx ! jmps rm_nxt
|
||||
rm_dne: popf ! ret
|
||||
|
||||
getqdaddr:
|
||||
;----------
|
||||
; Check qd address. If within MPM, use it else grab
|
||||
; qd from table and initialize with buffer space
|
||||
; returning its address. also set qf_table flag.
|
||||
; input: DX = offset of qd in u_wrkseg
|
||||
; output: DX = offset of qd in MPM CSEG.
|
||||
|
||||
push dx ! mov ax,u_wrkseg
|
||||
push ax ! mov cl,4 ! shr dx,cl
|
||||
add ax,dx
|
||||
;must be above SYSDAT
|
||||
cmp ax,sysdat ! jb gqd_bad
|
||||
;must be below end of system
|
||||
cmp ax,endseg ! jae gqd_bad
|
||||
;must be within 64K of SYSDAT
|
||||
; 64K=1000h memory paragraphs
|
||||
mov cx,sysdat ! add cx,1000h
|
||||
cmp ax,cx ! jae gqd_bad
|
||||
pop ax ! sub ax,sysdat
|
||||
mov cl,4 ! shl ax,cl
|
||||
pop dx ! add dx,ax
|
||||
mov si,dx ! sub cx,cx
|
||||
cmp q_buf[si],cx
|
||||
je gqd_ret
|
||||
add q_buf[si],ax
|
||||
gqd_ret: ret
|
||||
gqd_bad:
|
||||
pop ax ! pop dx ! pushf ! cli
|
||||
mov di,qul
|
||||
cmp di,0 ! jne gqd_have
|
||||
mov cx,e_no_qd ! popf ! ret
|
||||
gqd_have:
|
||||
mov bx,q_link[di] ! mov qul,bx
|
||||
push di ! push es ! push ds
|
||||
mov ds,u_wrkseg ! pop es
|
||||
mov cx,qdlen/2 ! mov si,dx
|
||||
rep movs ax,ax
|
||||
push es ! pop ds ! pop es ! pop di
|
||||
or q_flags[di],qf_table
|
||||
push di ! mov si,di
|
||||
call qspace ! pop di
|
||||
cmp cx,0 ! je gqd_exit
|
||||
mov ax,qul ! mov q_link[di],ax
|
||||
mov qul,di
|
||||
gqd_exit:
|
||||
mov dx,di ! popf ! ret
|
||||
|
||||
remqd:
|
||||
;-------
|
||||
; Place qd on queue unused list
|
||||
; Input SI = qd address
|
||||
|
||||
mov ax,q_flags[si]
|
||||
and ax,qf_table ! jz rqd_exit
|
||||
pushf ! cli
|
||||
mov ax,qul ! mov q_link[si],ax
|
||||
mov qul,ax ! call qrelease
|
||||
popf
|
||||
rqd_exit:
|
||||
ret
|
||||
|
||||
qspace:
|
||||
;------
|
||||
; find buffer space for qd
|
||||
; input SI = QD address
|
||||
; output CX = Error Code
|
||||
|
||||
|
||||
|
||||
;compute AX=size of buffer wanted
|
||||
mov ax,q_msglen[si] ! mul q_nmsgs[si]
|
||||
;call maualloc
|
||||
mov cx,0 ! push cx ! push cx ! push ax
|
||||
push ax ! push cx
|
||||
mov dx,sp ! mov ax,ss ! mov ds,ax
|
||||
mov bx,offset qmau
|
||||
push si
|
||||
mov cx,f_maualloc ! call mpmif
|
||||
pop si ! mov ds,sysdat
|
||||
cmp cx,0 ! jne qspace_ret
|
||||
mov bp,sp ! mov ax,mpb_start[bp]
|
||||
mov q_buf[si],ax
|
||||
qspace_ret:
|
||||
pop ax ! pop ax ! pop ax ! pop ax ! pop ax
|
||||
ret
|
||||
|
||||
qrelease:
|
||||
;--------
|
||||
; release buffer space for qd
|
||||
; if the released space is ajacent to another
|
||||
; free area, they are joined and a md is freed.
|
||||
; input SI = QD address
|
||||
|
||||
mov ax,q_buf[si]
|
||||
mov cx,offset qmau
|
||||
push ax ! push ax ! push cx
|
||||
mov cx,f_maufree
|
||||
mov dx,sp ! mov ax,ss ! mov ds,ax
|
||||
call mpmif
|
||||
pop ax ! pop ax ! pop ax
|
||||
ret
|
||||
|
||||
Reference in New Issue
Block a user