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,235 @@
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