Files
Sepp J Morris 31738079c4 Upload
Digital Research
2020-11-06 18:50:37 +01:00

235 lines
4.3 KiB
NASM
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

title 'MP/M II V2.0 List Handler'
name 'lst'
dseg
@@lst:
public @@lst
cseg
;List$handler:
@lst:
public @lst
;do;
;$include (copyrt.lit)
;/*
; Copyright (C) 1979,1980,1981
; Digital Research
; P.O. Box 579
; Pacific Grove, CA 93950
;
; Revised:
; 14 Sept 81 by Thomas Rolander
;*/
;$include (common.lit)
;$nolist
;$include (proces.lit)
;$nolist
;$include (datapg.ext)
;$nolist
;$include (proces.ext)
;$nolist
; declare list$attlsted (1) address external;
extrn lstatt
; declare list$queue (1) address external;
extrn lstque
; declare drl address external;
extrn drl
; declare thread$root address external;
extrn thrdrt
; declare nmb$lst byte external;
; extrn nmblst
; declare insert$process literally 'inspr';
; insert$process:
extrn inspr
; procedure (pdladr,pdadr) external;
; declare (pdladr,pdadr) address;
; end insert$process;
; exitr:
extrn exitr
; procedure external;
; end exitr;
; process descriptor offsets
nameos equ 6
CMNCODE:
; if (list$attlsted(pd.console) = pdadr)
LXI H,0EH
DAD B
MOV a,M
ani 0f0h
rrc
rrc
rrc
rrc
mov e,a
INX H
MVI D,0
LXI H,lstatt
DAD D
DAD D
MOV A,M
CMP C
RNZ
INX H
MOV A,M
CMP B
DCX H
RET
;/*
; attlst:
; The purpose of the attlst procedure is to attlst a
; list to the calling process. The list to attlst
; is obtained from the process descriptor. If the list
; is already attlsted to the process or if no one has the
; list attlsted the process is given the list and
; is then placed on the DRL list. If the list is
; attlsted to some other process the current process is
; placed on the list queue.
; Entry Conditions:
; BC = process descriptor address
; Exit Conditions:
; None
; **** Note: this procedure must be called from within a
; critical region.
;*/
; attlst:
attlst:
public attlst
; procedure (pdadr) reentrant public;
; declare pdadr address;
; declare pd based pdadr process$descriptor;
; if (list$attlsted(pd.console) = pdadr) or
CALL CMNCODE
JZ @1A
MOV A,M
INX H
ORA M
JNZ @1
; (list$attlsted(pd.console) = 0) then
; do;
; list$attlsted(pd.console) = pdadr;
MOV M,B
DCX H
MOV M,C
; pd.pl = drl;
@1A:
LHLD DRL
XCHG
MOV H,B
MOV L,C
MOV M,E
INX H
MOV M,D
; drl = pdadr;
DCX H
SHLD DRL
; end;
RET
@1:
; else
; do;
; call insert$process (.list$queue(pd.console),pdadr);
LXI H,lstQUE
DAD D
DAD D
MOV D,B
MOV E,C
MOV B,H
MOV C,L
JMP INSPR
; end;
; end attlst;
;/*
; detlst:
; The purpose of the detlst procedure is to detlst the
; list from the calling process. After checking to
; determine that the list is attlsted to the process
; invoking the detlst, the list is detlsted, attlsting
; the next waiting process to the list and then placing
; it on the DRL.
; Entry Conditions:
; BC = process descriptor address
; Exit Conditions:
; None
; **** Note: this procedure must be called from within a
; critical region.
;*/
; detlst:
detlst:
public detlst
; procedure (pdadr) reentrant public;
; declare pdadr address;
; declare pd based pdadr process$descriptor;
; if pdadr = list$attlsted(pd.console) then
CALL CMNCODE
RNZ
; do;
; list$attlsted(pd.console) = list$queue(pd.console);
PUSH H
LXI H,lstQUE
DAD D
DAD D
POP D
MOV A,M
STAX D
MOV C,A
INX H
INX D
MOV A,M
STAX D
MOV B,A
; pdadr = list$attlsted(pd.console);
; if pdadr <> 0 then
ORA C
RZ
; do;
; list$queue(pd.console) = pd.pl;
LDAX B
DCX H
MOV M,A
INX B
LDAX B
INX H
MOV M,A
; pd.pl = drl;
LHLD DRL
MOV A,H
STAX B
DCX B
MOV A,L
STAX B
; drl = pdadr;
MOV H,B
MOV L,C
SHLD DRL
; pd.status = rtr$status;
INX H
INX H
MVI M,0H
; end;
; end;
; end detlst;
RET
;end List$handler;
END