@X @~ %`
~V7 56 2 -5
~D10
~H                       MUSS
~
~
~HAPPENDIX        7
~D13
This volume contains the machine dependent software for MU6G11.~
~D12
~MUNIVERSITY OF MANCHESTER~
~V9 -1
~P
~V9 -1
~S1~MAppendix 7   CONTENTS~
~
~
~S~MPART 1
~
~
~MAP7011   -  MU6G CPU Appendix~
~NAP7021   -  Drum Appendix (SI9500)~
~NAP1031   -  MU6G I/O Appendix~
~NAP7041   -  DZ11 Device Driver Appendix
~NAP7051   -  CIU Appendix~
~NAP7061   -  Remote I/0 Appendix~
~NAP7111   -  MU6G Console Terminal Appendix~
~NAP7501   -  Monitor CPU Appendix (MU6G)~
~NAP7511   -  Monitor Drum Appendix (MU6G)~
~NAP7991   -  End of Initialisation~
~S~MPART 2
~
~
~MAP2501   -  Monitor CPU Appendix PDP11~
~NAP2511   -  Monitor Drum Appendix (PDP11)~
~NAP7012   -  PDP/11 Processor Appendix~
~NAP1031   -  I/O Appendix~
~NAP7042   -  DZ11 Multiplexor Device Driver Appendix~
~NAP7051   -  CIU Appendix~
~NAP7071   -  LP11 Lineprinter Driver Appendix~
~NAP7081   -  Operators Console Device Driver Appendix~
~NAP7091   -  I/O Manager Appendix~
~NAP7101   -  Centrenet Driver Appendix~
~NAP7121   -  PC11 Paper Tape Punch Driver Appendix~
~NAP7131   -  Paper Tape Reader Device Driver Appendix~
~V9 -1
~P
~D10
~H                    MUSS
~
~
~D10
~H             AP7011
~D10
~MMANCHESTER UNIVERSITY  -  CONFIDENTIAL
~
~
~V2 -16
                                                                       ISSUE 11~
~V2 0
~V9 -1
~P
~V9 1
~YAP7011
~S1~M~OAP7 IMPLEMENTATION DESCRIPTION~
~S1~M~OSection 1 Version 1~
~S1~OSection 1.1 MU6G Processor Appendix~
~S1~O1. General Description~
~BThis module is concerned with implementing those CPU features of the MUSS
ideal machine which are not available on MU6G.
~S1~O2. Interfaces~
~
Other modules used~
~
None~
~
Ideal hardware registers used~
~
None~
~
Interrupt Procedures~
~
NONE~
~
Interface Procedures~
   EMPTY.ACTIVITY ()~
   MS.BIT (WORD)~
   BIT (INDEX)~
   SET.BIT (BIT VECTOR, INDEX)~
   CLEAR.BIT (BIT VECTOR, INDEX)~
   TEST.BIT (BIT VECTOR, INDEX)~
~
Configuration Parameters~
~
None~
~S1~O2.1 MUSS Interface~
~S1~O2.1.1 Hardware Interface~
~
None~
~S1~O2.1.2 Software Interface~
~S11) EMPTY.ACTIVITY ()~
~BThis procedure is used as an entry in the ACTIVITY.LINK table
(SYS Section 1) for those entries allocated to the system which
have no corresponding activity.~
~S12) MS.BIT (WORD)~
~BThis procedure finds and returns the most significant bit in WORD,
which must be non-zero. It can run at interrupt or command level.~
~S13) BIT (INDEX)~
~BThis procedure returns a bit pattern with the required bit set.
It can run at interrupt or command level.~
~S14) SET.BIT (BIT VECTOR, INDEX)~
~BThis procedure sets the indicated bit in the specified bit vector. It can
run at interrupt or command level.~
~S15) CLEAR.BIT (BIT VECTOR, INDEX)~
~BThis procedure clears the indicated bit in the specified bit vector.
It can run at interrupt or command level.~
~S16) TEST.BIT (BIT VECTOR, INDEX)~
~BThis procedure returns the value of the indicated bit in the
specified bit vector. It can run at interrupt or command level.~
~S1~O3.1 Outline of Implementation~
~S1~O3.2 Data Structures~
~
~T# 20
~
BIT.POSN~IThis datavector is used in BIT.~
~
BIT.POSN8~IThis datavector is used in SET.BIT and TEST.BIT.~
~
BIT.MASK8~IThis datavector is used in CLEAR.BIT.~
~S1~O3.3 Special Notes~
~Y
~P
~V9 -1
~D15
~HFLOWCHARTS
~
~
~H                AP7011
~V9 -1
~F
@TITLE AP701(1,11)
@COL 1S-2R-3R-4R-5R-6F
@FLOW 1-2-3-4-5-6
@BOX 1.0
MU6G PROCESSOR APPENDIX
@BOX 4.0
PROCEDURES IN MODULE
[AP701/2]
@BOX 6.0
END
@BOX 1.1
#AP701/1
MODULE (V.HW.INTS, V.SW.INTS, V.HALT.MASK, V.INTERRUPT.TYPE, V.FI, V.INT.MC.CONT
ROL,
   V.EXEC.MC.CONTROL, V.PF.STATUS, V.TIME, V.CLOCK, V.VM.INTS,
   V.NEQ.SEG, V.NEQ.BLK, V.NEQ.ACCESS, V.CALL.LINK, V.EXIT.LINK, V.SF,
   V.INIT.REGS, V.DUMPED.CONTROL, PURGE.CACHE,
   V.SEARCH.PROC, V.SEARCH.SEG, V.SEARCH.BLK, V.SEARCH.MASK, V.PAR.NO,
   V.PROCESS.NUMBER, V.PRB.RA, V.STACK.SEG, V.MC.NO,V.BYTE, V.WRITE.BYTE, V.READ
.BYTE,
   EMPTY.ACTIVITY, CLEAR.HW.INT, MS.BIT, BIT, SET.BIT, CLEAR.BIT, TEST.BIT, SET.
HW.INT,
   APP.OUTWARD.CALL, APP.STATS.TYPE, REG.DUMP.SIZE,
   DUMPED.V.VM.INTS.REG.NO, DUMPED.V.VM.TIMER.REG.NO, DUMPED.V.VAL.ACCESS.REG.NO
,
   VALIDATE, ALLOW.INTERRUPTS, INHIBIT.INTERRUPTS, MAP.IO.APP, UNMAP.IO.APP,
   V.MILLI.TIME, UPDATE.IDLE.TIME, V.FI.HW, V.CLEAR.PAGE);
@BOX 2.1
TYPE APP.STATS.TYPE IS
   INTEGER CMDS.CALLED, USER.TIME, CMD.TIME, INT.TIME, APP.TIME
OR
   INTEGER DUMMY
   INTEGER [4] TIMES;
@BOX 3.1
#AP701/2
@BOX 4.1
#AP701/3
@BOX 5.1
*CODE 7;
BEGIN
5 => VV.MC.NO;
SYS14.SEG.SIZE - 512 <<- 3 => USER.STACK.TOP;
MAKE (APP.STATS.TYPE, 0, SYS21.GET.STATS (0)) => APP.STATS;
CLEAR.PAGE.ADDR => V.CLEAR.PAGE;
%10600140 => STACK.ZERO;
END
@BOX 6.1
*END
@END
@TITLE AP701/1(1,11)
@COL 1S-2R-3R-4R
@FLOW 1-2-3-4
@BOX 1.0
OTHER MODULES REFERENCED
@BOX 4.0
@BOX 1.1
:: EXTERNAL ENVIRONMENT
@BOX 2.1
IMPORT LITERAL ILLEGAL.ORDER, RESERVED.STACK.BOTTOM,
   NO.OF.COMMANDS, BYTES.PER.WORD;
IMPORT VSTORE V.PAR [];
INTEGER CLEAR.PAGE.ADDR;
@BOX 3.1
@BOX 4.1
ADDR PW0, PW1, PW2;
PSPEC POLL.DEVICES ();
PSPEC CONS.POLL ();
PSPEC DZ11.INT ();
PSPEC CIU.INTERRUPT ();
IMPORT LITERAL SYS01.INT.ACTIVITIES, SYS01.CLOCK.ACTIVITY,
   SYS01.PZ.ACTIVITY, SYS01.NO.OF.ACTIVITIES, AP.ACTIVITY.MASK,
   AP.DZ11.ACTIVITY, SYS.ACTIVITY.MASK, AP.CIU.ACTIVITY;
LOGICAL SYS01.CURRENT.ACTIVITY.BIT;
INTEGER SYS01.CURRENT.ACTIVITY;
PSPEC SYS01.SET.INTERRUPT (LOGICAL, LOGICAL);
PSPEC SYS10.PROC.TYPE (INTEGER, INTEGER);
PSPEC SYS10.SET.VM.INT (INTEGER, LOGICAL);
PSPEC SYS10.VM.INTERRUPT ();
IMPORT LITERAL SYS11.INITIAL.TIMER;
PSPEC SYS11.VM.TIMER.INTERRUPT ();
PSPEC SYS12.SYSTEM.ERROR (INTEGER);
INTEGER SYS13.CURRENT.SPN;
IMPORT LITERAL SYS13.NO.OF.PROCS, PRBS.PER.SEG;
PSPEC SYS13.INT.PROC (LOGICAL, LOGICAL);
PSPEC SYS13.ENTER.INT.LEVEL (ADDR SYS13.INT.PROC, LOGICAL, LOGICAL);
PSPEC SYS13.INT.GET.PRB (INTEGER) / ADDR;
PSPEC SYS13.GET.PRB (INTEGER, INTEGER) / ADDR;
IMPORT LITERAL SYS14.NO.OF.LOCAL.SEGS, SYS14.NO.OF.COMMON.SEGS,
   SYS14.NO.OF.SYS.SEGS, SYS14.SEG.SIZE, SYS14.FIRST.COMMON.SEG,
   SYS14.PAGE.SIZE, SYS14.NO.OF.X.SEGS, PRB.SEG;
TYPE SYS14.LST.TYPE IS
   LOGICAL8 ACCESS, SSN
OR
   LOGICAL16 LST.ENTRY;
TYPE SYS14.SST.TYPE IS
   INTEGER LIMIT
   LOGICAL8 STATUS, COUNT
OR
   INTEGER SST.LINK;
TYPE SYS14.SEG.VARS IS
   SYS14.LST.TYPE [SYS14.NO.OF.X.SEGS] XST
   SYS14.LST.TYPE [SYS14.NO.OF.LOCAL.SEGS] LST
   INTEGER PROCESS.NUMBER, SEG.NO1, BLK1, SEG.NO2, BLK2;
SYS14.SST.TYPE [SYS14.NO.OF.SYS.SEGS] SYS14.SST;
SYS14.LST.TYPE [SYS14.NO.OF.COMMON.SEGS] SYS14.CST;
PSPEC SYS14.MAP.ADDRESS (INTEGER32, INTEGER) / ADDR [LOGICAL8];
PSPEC SYS21.GET.STATS (INTEGER) / ADDR;
@END
@TITLE AP701/2(1,11)

@COL 1S
@BOX 1.0
DECLARATIONS
@BOX 1.1
*GLOBAL 5;
LITERAL / INTEGER REG.DUMP.SIZE = 50, EXEC.MC.CONTROL = %80, DUMPED.V.VM.INTS.RE
G.NO = 30,
DUMPED.LINK.REG.NO =  40, LINK.REG.NO = 32, DUMPED.V.VM.TIMER.REG.NO = 42,
   DUMPED.V.VAL.ACCESS.REG.NO = 16, AOD.REG.NO = 17, HW.TIMER.REG.NO = 31, TIMER
.SCALE = 1300;
LOGICAL VV.INT.MC.CTRL, VV.PRB.RA, VV.MC.NO, VV.STACK.SEG, VV.TIME, VV.INIT.REGS
,
   VV.INTERRUPT.TYPE, VV.BYTE, VV.READ.BYTE, VV.WRITE.BYTE, VV.FI, VV.VM.INTS,
   HW.INTS, VV.MILLI.TIME, VV.CLEAR.PAGE;
ADDR VV.SF, VV.DUMPED.CONTROL, VV.CALL.LINK, VV.EXIT.LINK;
INTEGER INIT.REGS.COUNT, OLD.PROC.NO, OLD.PAR, INDEX, STACK.ZERO;
ADDR USER.STACK.TOP;
ADDR LOGICAL8 BUFFER;
ADDR [LOGICAL] PRB.PTR, INIT.REGS.PRB.PTR;
ADDR APP.STATS.TYPE APP.STATS;
ADDR [LOGICAL64] CLEAR.PTR;
::
:: VSTORE DECLARATIONS
::
*VTYPE LOGICAL;
VSTORE V.HW.INTS %5C;
VSTORE V.SW.INTS %4;
VSTORE V.HALT.MASK %C;
VSTORE V.FI.HW %14;
VSTORE V.FI VV.FI < FI.PRE.PROC;
VSTORE V.SB.INTS %78004;
VSTORE PURGE.CACHE %8F4;
VSTORE V.INTERRUPT.TYPE VV.INTERRUPT.TYPE;
VSTORE V.INT.MC.CONTROL VV.INT.MC.CTRL > INT.MC.CONTROL.POST.PROC;
VSTORE V.INIT.REGS VV.INIT.REGS > INIT.REGS.POST.PROC;
*VTYPE ADDR;
VSTORE V.CALL.LINK VV.CALL.LINK < CALL.LINK.PRE.PROC;
VSTORE V.EXIT.LINK VV.EXIT.LINK > EXIT.LINK.POST.PROC;
VSTORE V.SF VV.SF;
VSTORE V.DUMPED.CONTROL VV.DUMPED.CONTROL;
*VTYPE LOGICAL;
VSTORE V.CLEAR.PAGE VV.CLEAR.PAGE > CLEAR.PAGE.POST.PROC;
VSTORE V.BYTE VV.BYTE;
VSTORE V.READ.BYTE VV.READ.BYTE > READ.BYTE.POST.PROC;
VSTORE V.WRITE.BYTE VV.WRITE.BYTE > WRITE.BYTE.POST.PROC;
VSTORE V.STACK.SEG VV.STACK.SEG;
VSTORE V.PROCESS.NUMBER %804;
VSTORE V.MC.NO VV.MC.NO;
VSTORE V.PRB.RA VV.PRB.RA;
VSTORE V.PRB.RA.HW %00024;
VSTORE V.PF.STATUS %34;
VSTORE V.HW.VMI %2C;
VSTORE V.VM.INTS VV.VM.INTS < VM.INTS.PRE.PROC > VM.INTS.POST.PROC;
VSTORE V.VM.TIMER %1C;
VSTORE V.TIME VV.TIME;
VSTORE V.CLOCK %50 > CLOCK.POST.PROC;
VSTORE V.MC.CONTROL %0003C;
VSTORE V.NEQ.SEG %81C;
VSTORE V.NEQ.BLK %814;
VSTORE V.NEQ.ACCESS %824;
VSTORE V.SEARCH.PROC %82C;
VSTORE V.SEARCH.SEG %834;
VSTORE V.SEARCH.BLK %83C;
VSTORE V.SEARCH.MASK %8C4;
VSTORE V.PAR.NO %84C;
VSTORE V.MILLI.TIME VV.MILLI.TIME;
::
:: MACHINE FUNCTIONS
::
LOGICAL VV.ALLOW.INTERRUPTS, VV.INHIBIT.INTERRUPTS, VV.MAP.IO.APP,
   VV.UNMAP.IO.APP;
VSTORE MAP.IO.APP VV.MAP.IO.APP;
VSTORE UNMAP.IO.APP VV.UNMAP.IO.APP;
VSTORE ALLOW.INTERRUPTS VV.ALLOW.INTERRUPTS;
VSTORE INHIBIT.INTERRUPTS VV.INHIBIT.INTERRUPTS;
::
DATAVEC BIT.POSN (LOGICAL)
   %80000000 %40000000 %20000000 %10000000
   %08000000 %04000000 %02000000 %01000000
   %00800000 %00400000 %00200000 %00100000
   %00080000 %00040000 %00020000 %00010000
   %00008000 %00004000 %00002000 %00001000
   %00000800 %00000400 %00000200 %00000100
   %00000080 %00000040 %00000020 %00000010
   %00000008 %00000004 %00000002 %00000001
END
DATAVEC BIT.POSN8 (LOGICAL8)
   %80 %40 %20 %10
   %08 %04 %02 %01
END
DATAVEC BIT.MASK8 (LOGICAL8)
   %7F %BF %DF %EF
   %F7 %FB %FD %FE
END
@END
@TITLE AP701/3(1,11)

@COL 1S
@BOX 1.0
PROCEDURES IN MODULE:
   1 CALL LINK PRE PROC
   2 EXIT LINK POST PROC
   3 MS BIT
   4 BIT
   5 SET BIT
   6 CLEAR BIT
   7 TEST BIT
   8 SET INT
   9 CLEAR INT
   10 INT MC CONTROL POST PROC
   11 PRB RA POST PROC
   12 CMD ENTRY INTERRUPT
   13 INIT REGS POST PROC
   14 APP OUTWARD CALL
   15 VALIDATE
   16 READ BYTE POST PROC
   17 WRITE BYTE POST PROC
   18 FI PRE PROC
   19 VM INTS PRE PROC
   20 VM INTS POST PROC
   21 CLOCK POST PROC
   22 CLEAR PAGE POST PROC
@BOX 1.1
*CODE 2;
PSPEC SET.HW.INT (LOGICAL);
PSPEC CLEAR.HW.INT (LOGICAL);
:: PSPEC READ.BYTE.POST.PROC ();
:: PSPEC WRITE.BYTE.POST.PROC ();
   #AP701.8
   #AP701.9
   #AP701.16
   #AP701.17
PSPEC EMPTY.ACTIVITY ();
PROC EMPTY.ACTIVITY;
   SYS12.SYSTEM.ERROR (-1);
END
PSPEC UPDATE.IDLE.TIME ();
PROC UPDATE.IDLE.TIME;
END
*CODE 11;
:: PSPEC INT.MC.CONTROL.POST.PROC ();
PSPEC MS.BIT (LOGICAL) / INTEGER;
PSPEC BIT (INTEGER) / LOGICAL;
PSPEC SET.BIT (ADDR [LOGICAL8], INTEGER);
PSPEC CLEAR.BIT (ADDR [LOGICAL8], INTEGER);
PSPEC TEST.BIT (ADDR [LOGICAL8], INTEGER) / INTEGER;
::PSPEC FI.PRE.PROC ();
::PSPEC VM.INTS.PRE.PROC ();
::PSPEC VM.INTS.POST.PROC ();
::PSPEC CLOCK.POST.PROC ();
::PSPEC CLEAR.PAGE.POST.PROC ();
   #AP701.10
   #AP701.3
   #AP701.4
   #AP701.5
   #AP701.6
   #AP701.7
   #AP701.18
   #AP701.19
   #AP701.20
   #AP701.21
   #AP701.22
*CODE 15;
:: PSPEC CMD.ENTRY
:: PSPEC INIT.REGS.POST.PROC ();
PSPEC APP.OUTWARD.CALL (INTEGER, INTEGER, INTEGER, ADDR SYS10.PROC.TYPE);
PSPEC VALIDATE (ADDR, LOGICAL) / INTEGER;
   #AP701.12
   #AP701.13
   #AP701.14
   #AP701.15
*CODE 2;
*GLOBAL 5;
:: PSPEC CALL.LINK.PRE.PROC ();
:: PSPEC EXIT.LINK.POST.PROC ();
   #AP701.1
   #AP701.2
@END
@TITLE AP701.1(1,9)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
CALL LINK PRE PROC
@BOX 2.0
SAVE FRAME POINTER
@BOX 3.0
END
@BOX 1.1
PROC CALL.LINK.PRE.PROC;
@BOX 2.1
VV.CALL.LINK => VV.CALL.LINK;
*#%A998 %0000; :: STA4 0/6
:: BA4 => SAVE.LINK {V.CALL.LINK}
STACK.ZERO => STACK.ZERO;
*#%C998 %0000; :: LDA4 0/6
*#%E0C0; :: RTS @0/4
:: RETURN TO STACK ZERO
@BOX 3.1
END
@END
@TITLE AP701.2(1,9)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
EXIT LINK POST PROC
@BOX 2.0
RESET DUMPED FRAME POINTER
@BOX 3.0
END
@BOX 1.1
PROC EXIT.LINK.POST.PROC;
@BOX 2.1
VV.EXIT.LINK => VV.EXIT.LINK;
*#%A398 %0000; :: STK 0/6
:: SAVE.LINK {V.EXIT.LINK} => DUMPED.LINK
@BOX 3.1
END
@END
@TITLE AP701.3(1,9)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
MS BIT (WORD)
@BOX 2.0
RETURN POSITION OF
MOST SIGNIFICANT BIT IN WORD
@BOX 3.0
END
@BOX 1.1
PROC MS.BIT (WORD);
@BOX 2.1
0 => MS.BIT;
WHILE WORD & %80000000 = 0 DO
   WORD <<- 1 => WORD;
   1 +> MS.BIT;
OD
@BOX 3.1
END
@END


@TITLE AP701.4(1,9)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
BIT (INDEX)
@BOX 2.0
RETURN BIT PATTERN WITH
REQUIRED BIT SET
@BOX 3.0
END
@BOX 1.1
PROC BIT (INDEX);
@BOX 2.1
BIT.POSN [INDEX] => BIT;
@BOX 3.1
END
@END

@TITLE AP701.5(1,9)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
SET BIT (BIT VECTOR, INDEX)
@BOX 2.0
SET BIT IN SPECIFIED
BIT VECTOR
@BOX 3.0
END
@BOX 1.1
PROC SET.BIT (VEC, INDEX);
@BOX 2.1
BIT.POSN8 [INDEX & 7] !> VEC^ [INDEX / 8];
@BOX 3.1
END
@END

@TITLE AP701.6(1,9)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
CLEAR BIT (BIT VECTOR, INDEX)
@BOX 2.0
CLEAR BIT IN SPECIFIED
BIT VECTOR
@BOX 3.0
END
@BOX 1.1
PROC CLEAR.BIT (VEC, INDEX);
@BOX 2.1
BIT.MASK8 [INDEX & 7] &> VEC^ [INDEX / 8];
@BOX 3.1
END
@END


@TITLE AP701.7(1,9)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
TEST BIT (BIT VECTOR, INDEX)
@BOX 2.0
RETURN VALUE OF SPECIFIED BIT
IN BIT VECTOR
@BOX 3.0
END
@BOX 1.1
PROC TEST.BIT (VEC, INDEX);
@BOX 2.1
BIT.POSN8 [INDEX & 7] & VEC^ [INDEX / 8] => TEST.BIT;
@BOX 3.1
END
@END


@TITLE AP701.8(1,9)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
SET INT (ACTIVITY)
@BOX 2.0
SET APPROPRIATE BIT
IN V HW INTS
@BOX 3.0
END
@BOX 1.1
PROC SET.HW.INT (ACTIVITY);
@BOX 2.1
ACTIVITY !> HW.INTS;
@BOX 3.1
END
@END
@TITLE AP701.9(1,9)

@COL 1S-2R-3F

@FLOW 1-2-3

@BOX 1.0
CLEAR INT (ACTIVITY);
@BOX 2.0
CLEAR APPRPRIATE BIT
IN SW INT
@BOX 3.0
END
@BOX 1.1
PROC CLEAR.HW.INT (ACTIVITY);
@BOX 2.1
ACTIVITY & HW.INTS -=> HW.INTS;
@BOX 3.1
END
@END
@TITLE AP701.10(1,11)

@COL 1S-2T-3R-17N-4T-12T-7R-5R-19T-20R-21T-10T-11N-15N-6F
@COL 8R-16N-18N-9R-14R-13N
@ROW 17-18
@ROW 15-13
@ROW 11-14
@ROW 3-8
@ROW 9-7
@FLOW 1-2NO-3-17-4NO-12NO-7-5-19NO-20-21NO-10-11-15-6
@FLOW 10-14-18-17
@FLOW 4YES-5
@FLOW 2YES-8-13-15
@FLOW 12YES-9-5
@FLOW 19YES-10
@FLOW 21YES-5
@BOX 1.0
INT MC CONTROL POST PROC
@BOX 2.0
ENTER INTERRUPT LEVEL?
@BOX 3.0
GET PRB
@BOX 4.0
NO VM INTERRUPT OUTSTANDING
OR NOT IN USER MODE?
@BOX 5.0
RETURE TO PROCESS LEVEL
@BOX 6.0
END
@BOX 7.0
FORCE ENTRY TO VM INTERRUPT
AT COMMAND LEVEL
@BOX 8.0
CHANGE MODE TO KERNEL
@BOX 9.0
RESET STACK AND INDICATE PROGRAM
FAULT
@BOX 10.0
IS INTERRUPT SYSTEM ERROR OR
VM INTERRUPT
@BOX 12.0
STACK OVERFLOW?
@BOX 14.0
LOOP STOP IF INTERRUPT
IS SYSTEM ERROR
@BOX 19.0
SYSTEM ACTIVITIES ONLY?
@BOX 20.0
PROCESS APPENDIX INTERRUPTS
@BOX 21.0
APPENDIX INTERRUPT ONLY?
@BOX 1.1
PROC INT.MC.CONTROL.POST.PROC;
@BOX 2.1
IF V.MC.CONTROL = 0
@BOX 3.1
MAKE (LOGICAL, REG.DUMP.SIZE, V.PROCESS.NUMBER
   / PRBS.PER.SEG + PRB.SEG <<- 18 + (V.PROCESS.NUMBER
   / PRBS.PER.SEG -: V.PROCESS.NUMBER <<- 11)) => PRB.PTR;
BYTE (PRB.PTR) <<- 3 => V.PRB.RA.HW;
@BOX 4.1
SYS13.CURRENT.SPN => V.PROCESS.NUMBER;
IF PRB.PTR^ [LINK.REG.NO] & EXEC.MC.CONTROL = EXEC.MC.CONTROL
   OR PRB.PTR^ [DUMPED.V.VM.INTS.REG.NO] = 0
@BOX 5.1
L5.1: 0 => V.MC.CONTROL;
@BOX 6.1
END
@BOX 7.1
PRB.PTR^ [LINK.REG.NO] => PRB.PTR^ [DUMPED.LINK.REG.NO];
PRB.PTR^ [1 + LINK.REG.NO] => PRB.PTR^ [1 + DUMPED.LINK.REG.NO];
EXEC.MC.CONTROL !> PRB.PTR^ [1 + LINK.REG.NO];
%10002160 => PRB.PTR^ [1 + LINK.REG.NO]; :: RESET CO
%FFFFFFBF &> PRB.PTR^ [LINK.REG.NO]; :: CLEAR OVERFLOW
%EF &> PRB.PTR^ [AOD.REG.NO]; :: CLEAR ACC OVERFLOW
%80 !> PRB.PTR^ [LINK.REG.NO]; :: SET EXEC BIT
*CODE 15;
BEGIN
-> CMD.ENTRY;:: AVOID THIS CODE ON CMD ENTRY
:: CODE TO BE OBEYED ON ENTERING VM INTERRUPT
*#%E200; :: STR #0
:: LEAVE SPACE ON STACK FOR USE BY RETURN FROM TRAP [MTL21.3]
*#%AA7E; :: STA5 STK
*#%AC7E; :: STA6 STK
*#%AE7E; :: STA7 STK
*#%B07E; :: STA8 STK
*#%B27E; :: STA9 STK
*#%B47E; :: STA10 STK
*#%B67E; :: STA11 STK
*#%B87E; :: STA12 STK
*#%BA7E; :: STA13 STK
*#%BC7E; :: STA14 STK
*#%BE7E; :: STA15 STK
*#%207E; :: STM1 STK
*#%407E; :: STM2 STK
*#%607E; :: STM3 STK
*#%2462; :: LDM1 AOD
*#%207E; :: STM1 STK
*#%2475; :: LDM1 BREM
*#%207E; :: STM1 STK
*#%007E; :: ST STK
*#%027E; :: AEX STK
:: STACK REGISTERS
*#%E200; :: STR #0;
*#%E200; :: STR #0;
:: LEAVES SPACE ON STACK FOR USE BY APP OUTWARD CALL [AP301.25]
SYS10.VM.INTERRUPT ();
CMD.ENTRY:
END
*CODE 11;
@BOX 8.1
1 => V.MC.CONTROL;
@BOX 9.1
RESERVED.STACK.BOTTOM => PRB.PTR^ [0] <<- 2
   => PRB.PTR^ [LINK.REG.NO];
%40 !> V.PF.STATUS;
@BOX 10.1
L10.1:
DATAVEC INT.SWITCH (INTEGER8)
   -1 1 2 3
   5 4 -2 0
END
VV.INTERRUPT.TYPE => VV.INTERRUPT.TYPE;
*#%244F; :: LDM1 BA15
*#%3208; :: SUB1 #8
*#%2198 %0000; :: STM1 0/6
IF INT.SWITCH [VV.INTERRUPT.TYPE] => VV.INTERRUPT.TYPE = 4 THEN
   TIMER.SCALE +> PRB.PTR^ [HW.TIMER.REG.NO];
   IF 1 -> PRB.PTR^ [DUMPED.V.VM.TIMER.REG.NO] > 0 THEN
      0 => VV.INTERRUPT.TYPE;
      -> L5.1;
   FI
FI
0 => V.PROCESS.NUMBER;
IF VV.INTERRUPT.TYPE < 0
@BOX 12.1
IF PRB.PTR^ [0] < RESERVED.STACK.BOTTOM OR
   PRB.PTR^ [0] > USER.STACK.TOP
@BOX 13.1
END
@BOX 14.1
IF VV.INTERRUPT.TYPE = -1 THEN
   *#%8E00;
FI
0 => VV.INTERRUPT.TYPE;
@BOX 19.1
*#%244F; :: LDM1 BA15
*#%3F00 %000F; :: CMP1 #15
*#%9300 %0004; :: INE #4
-> L10.1;
*#%2451; :: NOP
*#%2584 %0002; ::LDM1 %0002/VS
*#%3D00 %00D0; ::SFT1# 208
*#%2900 %0040; ::AND1#%040
*#%9300 %0004; :: INE#4
-> L10.1;
*#%2451; :: NOP
@BOX 20.1
DZ11.INT ();
*#%DF00 %000F; ::LD15 #15
@BOX 21.1
IF HW.INTS & V.HALT.MASK -= HW.INTS
   ! V.FI.HW & SYS.ACTIVITY.MASK
   & SYS01.INT.ACTIVITIES = 0
@END
@TITLE AP701.12(1,9)

@COL 1S-7T-17N-8T-2R-3R-16N-4R-5F
@COL 6R-9R-15N

@ROW 6-17
@ROW 9-2
@ROW 15-16

@FLOW 1-7NO-17-8NO-2-3-16-4-5
@FLOW 7YES-6-15-16
@FLOW 8YES-9-15

@BOX 1.0
CMD ENTRY INTERRUPT (ENTRY INDEX)
@BOX 2.0
UPDATE STATISTICS
@BOX 3.0
JUMP CMD PROCEDURE
@BOX 4.0
RETURN FROM COMMAND LEVEL
@BOX 5.0
END
@BOX 6.0
RESET USER STACK FRONT
ENTER INTERRUPT LEVEL
WITH CALL TO SET VM INT
FOR INVALID STACK
@BOX 7.0
IS STACK OUTSIDE BOUNDS
@BOX 8.0
INVALID ENTRY INDEX?
@BOX 9.0
ENTER INTERRUPT LEVEL
WITH CALL TO SET VM INT
FOR PROGRAM FAULT
@BOX 1.1
CMD.ENTRY : BEGIN
@BOX 2.1
1 +> CMDS.CALLED OF APP.STATS^;
@BOX 3.1
0 => PW0;
*#%C580 %0002; :: JMP #0002
@BOX 4.1
*#%E0FF; :: RTS @-1/4
@BOX 5.1
END
@BOX 6.1
*#%2500 %0800; :: LDM1 %800
*#%C851; :: LDA4 BM1
:: RESET FRAME POINTER
SYS13.ENTER.INT.LEVEL (^SYS10.SET.VM.INT, 0, %40);
@BOX 7.1
*#%4443; :: LDM2 BA3
*#%4180 %0001; :: STM2 PW1
:: BA3 => PW1;
*#%2180 %0002; :: STM1 PW2
:: BM1 => PW2;
IF PW1 < RESERVED.STACK.BOTTOM OR
   PW1 > USER.STACK.TOP
@BOX 8.1
IF PW2 ->> 5 & %FFFF > NO.OF.COMMANDS
   OR PW2 ->> 5 & %FFFF < 1
@BOX 9.1
SYS13.ENTER.INT.LEVEL (^SYS10.SET.VM.INT, 0, %80);
@END
@TITLE AP701.13(1,9)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
INIT REGS POST PROC
@BOX 2.0
INITIALIZE REGISTERS IN
PRB OF NEW PROCESS
@BOX 3.0
END
@BOX 1.1
PROC INIT.REGS.POST.PROC;
@BOX 2.1
MAKE (LOGICAL, REG.DUMP.SIZE, SYS13.GET.PRB (VV.INIT.REGS, 13))
   => INIT.REGS.PRB.PTR;
-1 => INIT.REGS.COUNT;
WHILE 1 +> INIT.REGS.COUNT < REG.DUMP.SIZE DO
   0 => INIT.REGS.PRB.PTR^ [INIT.REGS.COUNT];
OD
RESERVED.STACK.BOTTOM => INIT.REGS.PRB.PTR^ [0] <<- 2
   ! %20 => INIT.REGS.PRB.PTR^ [LINK.REG.NO];
:: INIT USER SP AND FP
VV.DUMPED.CONTROL <<- 3 => INIT.REGS.PRB.PTR^ [LINK.REG.NO + 1]; :: INIT PC
SYS11.INITIAL.TIMER => INIT.REGS.PRB.PTR^ [DUMPED.V.VM.TIMER.REG.NO];
TIMER.SCALE => INIT.REGS.PRB.PTR^ [HW.TIMER.REG.NO];
@BOX 3.1
END
@END


@TITLE AP701.14(1,9)
@COL 1S-2R-3F
@FLOW 1-2
@BOX 1.0
APP OUTWARD CALL (PRB PTR, TRAP NO, REASON, PROCEDURE)
@BOX 2.0
OBTAIN DUMPED PC FROM PRB
SET UP STACK TO
FORCE PROCEDURE CALL
PROCEDURE (TRAP NO, REASON)
ON RETURN TO USER LEVEL
@BOX 3.0
END
@BOX 1.1
PROC APP.OUTWARD.CALL (PRB.PTR, TRAP, REASON, PROCEDURE);
LOGICAL MASK;
DATAVEC FP.MASK (LOGICAL)
   %7FFFFF00
END
@BOX 2.1
FP.MASK [0] => MASK;
%A0 +> PRB.PTR; :: NOW POINT TO DUMPED PC
*#%CC44; :: LDA6 BA4
:: BA6 NOW POINTS TO A.O.C. LINK
*#%6480; :: LDM3 0/4
*#%4483; :: LDM2 3/4
*#%6852; :: AND3 BM2
*#%7C02; :: SFT3 #2
*#%C853; :: LDA4 BM3
:: UNWIND FRAME POINTER ONE FRAME
*#%7100 %0040; :: ADD3 #%40
:: HOLD CORRECT LINK POSITION IN BM3
*#%25D8 %FFFC; :: LDM1 @-4/6
*#%EF41 %0000; :: LRA7 $0/0/1
:: CONVERT PRB.PTR BYTE ADDR TO BIT ADDR
*#%25DC %0000; :: LDM1 @0/7
*#%20C0; :: STM1 @0/4
:: LOAD DUMPED LINK IN CORRECT POSITION
*#%25D8 %FFFD; :: LDM1 @-3/6
*#%20FE; :: STM1 @-2/4
:: LOAD TRAP IN CORRECT POSITION
*#%25D8 %FFFE; :: LDM1 @-2/6
*#%20FF; :: STM1 @-1/4
:: LOAD REASON IN CORRECT POSITION
*#%4444; :: LDM2 BA4
*#%C853; :: LDA4 BM3
:: SET FRAME POINTER TO CORRECT POSITION
*#%25D8 %FFFF; :: LDM1 @-1/6
*#%2081; :: STM1 1/4
*#%5C3E; :: SFT2 #-2
*#%4080; :: STM2 0/4
:: FORM NEW LINK AND LOAD IN CORRECT POSITION
*#%E0FF; :: RTS @-1/4
@BOX 3.1
END
@END
@TITLE AP701.15(1,11)

@COL 1S-8T-7T-2R-3T-4T-9N-11N-5F
@COL 12N-10N-6R

@ROW 3-12
@ROW 4-10
@ROW 9-6

@FLOW 1-8NO-7-2-3DEFINED-4NO-9-11-5
@FLOW 8YES-5
@FLOW 7INVALID-12-10-6-5
@FLOW 3UNDEFINED-12
@FLOW 4YES-10

@BOX 1.0
VALIDATE (ADDRESS, REQUIRED ACCESS)
@BOX 2.0
SET POINTERS TO
RELEVANT SEGMENT TABLE
@BOX 3.0
IS SEGMENT DEFINED?
@BOX 4.0
IS ADDRESS OUT OF RANGE
OR REQUIRED ACCESS ILLEGAL?
@BOX 5.0
RETURN ALLOWED ACCESS PERMISSION
IN DUMPED REGISTER
@BOX 5.0
END
@BOX 6.0
INDICATE VALIDATE FAIL
@BOX 7.0
IS SEGMENT NUMBER VALID?
@BOX 8.0
PROCESS ZERO?
@BOX 1.1
PROC VALIDATE (ADDRESS, REQ.ACCESS);
INTEGER SEG, BLK;
ADDR SYS14.LST.TYPE SEG.TABLE;
ADDR SYS14.SEG.VARS C.SEG.VARS;
0 => VALIDATE;
@BOX 2.1
IF SEG < SYS14.NO.OF.LOCAL.SEGS THEN
   MAKE (SYS14.SEG.VARS, 0, SYS13.GET.PRB (-1, 14)) => C.SEG.VARS;
   ^LST [SEG] OF C.SEG.VARS^ => SEG.TABLE;
ELSE
   ^SYS14.CST [SEG - SYS14.FIRST.COMMON.SEG] => SEG.TABLE;
FI
SELECT SEG.TABLE^;
@BOX 3.1
IF ACCESS & %80 = 0
@BOX 4.1
IF LIMIT OF SYS14.SST [SSN] =< BLK OR
   REQ.ACCESS -= ACCESS & REQ.ACCESS /= 0
@BOX 5.1
END
@BOX 6.1
1 => VALIDATE;
@BOX 7.1
ADDRESS ->> 18 => SEG;
ADDRESS ->> 11 & %7F => BLK;
IF SEG < SYS14.FIRST.COMMON.SEG >= SYS14.NO.OF.LOCAL.SEGS OR
   SEG >= SYS14.FIRST.COMMON.SEG + SYS14.NO.OF.COMMON.SEGS
@BOX 8.1
IF SYS01.CURRENT.ACTIVITY.BIT & SYS01.PZ.ACTIVITY /= 0
@END
@TITLE AP701.16(1,9)

@COL 1S-2R-3F

@FLOW 1-2-3

@BOX 1.0
READ BYTE POST PROC
@BOX 2.0
MAP REAL ADDRESS AND
READ BYTE
@BOX 3.0
END
@BOX 1.1
PROC READ.BYTE.POST.PROC;
@BOX 2.1
MAKE (LOGICAL8, 0, BYTE (SYS14.MAP.ADDRESS (VV.READ.BYTE, 0))) => BUFFER;
BUFFER^ => VV.BYTE;
@BOX 3.1
END
@END

@TITLE AP701.17(1,9)

@COL 1S-2R-3F

@FLOW 1-2-3

@BOX 1.0
WRITE BYTE POST PROC
@BOX 2.0
MAP REAL ADDRESS AND
WRITE BYTE
@BOX 3.0
END
@BOX 1.1
PROC WRITE.BYTE.POST.PROC;
@BOX 2.1
MAKE (LOGICAL8, 0, BYTE (SYS14.MAP.ADDRESS (VV.WRITE.BYTE, 0))) => BUFFER;
VV.BYTE => BUFFER^;
@BOX 3.1
END
@END

@TITLE AP701.18(1,10)

@COL 1S-2R-3R-4F
@FLOW 1-2-3-4

@BOX 1.0
FI PRE PROC
@BOX 2.0
HANDLE APPENDIX INTERRUPTS
@BOX 3.0
RETURN FREE INDICATOR
@BOX 4.0
END
@BOX 1.1
PROC FI.PRE.PROC;
@BOX 2.1
CONS.POLL ();
IF V.FI.HW & AP.ACTIVITY.MASK /= 0 THEN
   IF V.FI.HW & AP.DZ11.ACTIVITY /= 0 THEN
      DZ11.INT ();
   FI
   IF V.FI.HW & AP.CIU.ACTIVITY /= 0 THEN
      CIU.INTERRUPT ();
   FI
FI
@BOX 3.1
HW.INTS & V.HALT.MASK -= HW.INTS
   ! V.FI.HW & SYS.ACTIVITY.MASK => VV.FI;
@BOX 4.1
END
@END

@TITLE AP701.19(1,10)

@COL 1S-2R-3F

@FLOW 1-2-3

@BOX 1.0
VM INTS PRE PROC
@BOX 2.0
SHIFT UP H/W REGISTER AND RETURN VALUE
@BOX 3.0
END
@BOX 1.1
PROC VM.INTS.PRE.PROC;
@BOX 2.1
V.HW.VMI <<- 24 => VV.VM.INTS;
@BOX 3.1
END
@END

@TITLE AP701.20(1,10)

@COL 1S-2R-3F

@FLOW 1-2-3

@BOX 1.0
VM INTS POST PROC
@BOX 2.0
SHIFT DOWN VALUE AND
STORE IN H/W REGISTER
@BOX 3.0
END
@BOX 1.1
PROC VM.INTS.POST.PROC;
@BOX 2.1
VV.VM.INTS ->> 24 => V.HW.VMI;
@BOX 3.1
END
@END


@TITLE AP701.21(1,11)

@COL 1S-2R-3R-4F

@FLOW 1-2-3-4

@BOX 1.0
CLOCK POST PROC
@BOX 2.0
UPDATE REAL TIME CLOCK
@BOX 3.0
POLL DEVICES
[AP103]
@BOX 4.0
END
@BOX 1.1
PROC CLOCK.POST.PROC;
@BOX 2.1
1 +> VV.TIME;
@BOX 3.1
POLL.DEVICES ();
@BOX 4.1
END
@END



@TITLE AP701.22(1,11)
@COL 1S-2R-3R-4R-5R-6F
@FLOW 1-2-3-4-5-6
@BOX 1.0
CLEAR PAGE POST PROC
@BOX 2.0
SAVE OLD PAR ENTRY AND PROCESS NUMBER
@BOX 3.0
CHANGE PAR TO ALLOW WRITING
@BOX 4.0
WRITE ZEROES TO PAGE
@BOX 5.0
RESTORE PAR ENTRY AND PROCESS NUMBER
@BOX 6.0
END
@BOX 1.1
PROC CLEAR.PAGE.POST.PROC;
@BOX 2.1
V.PAR [VV.CLEAR.PAGE] => OLD.PAR;
V.PROCESS.NUMBER => OLD.PROC.NO;
@BOX 3.1
OLD.PAR ->> 24 => V.PROCESS.NUMBER;
OLD.PAR & %F(7)E ! %20 => V.PAR [VV.CLEAR.PAGE];
@BOX 4.1
MAKE (LOGICAL64, %100, OLD.PAR & %00FFFE00 <<- 2)
   => CLEAR.PTR;
FOR INDEX < %100 DO
   0 => CLEAR.PTR^ [INDEX];
OD
@BOX 5.1
OLD.PAR => V.PAR [VV.CLEAR.PAGE];
OLD.PROC.NO => V.PROCESS.NUMBER;
OLD.PAR ->> 24 => V.SEARCH.PROC;
OLD.PAR ->> 16 & %FF => V.SEARCH.SEG;
OLD.PAR ->> 9 & %7F => V.SEARCH.BLK;
0 => V.SEARCH.MASK;
@BOX 6.1
END
@END



