mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-25 17:34:06 +00:00
123 lines
2.9 KiB
Plaintext
123 lines
2.9 KiB
Plaintext
|
||
;=====
|
||
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
|
||
|