mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-26 18:04:07 +00:00
Upload
Digital Research
This commit is contained in:
235
MPM OPERATING SYSTEMS/MPM II/MPM II SOURCE/NUCLEUS/LST.ASM
Normal file
235
MPM OPERATING SYSTEMS/MPM II/MPM II SOURCE/NUCLEUS/LST.ASM
Normal 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
|
||||
|
||||
Reference in New Issue
Block a user