@X @~ %`
~V7 56 2 -5
~D10
~H                 MUSS
~
~
~D10
~H           AP2501
~D10
~MMANCHESTER UNIVERSITY  -  CONFIDENTIAL~
~
~
                                                             ISSUE 11~
~V9 -1
~P
~V9 1
~YAP2501
~S1~M~OAP2 IMPLEMENTATION DESCRIPTION~
~S1~M~OSection 50 Version 1~
~S~OSection 50.1 Monitor CPU Appendix (PDP11)
~S1~O1. General Description
~BThis module contains the definition of the VSTORE used to drive the console
and the host comms in polling mode.
~S1~O2. Interfaces
~S1~O2.1 MUSS Interface
~S1~O2.1.1 Hardware Interface
~
~S1~O3. Implementation
~S1~O3.1 Outline of Operation
~S1~O3.2 Data Structures
~S1~O3.3 Special Notes
~Y
~P
~V9 -1
~D15
~HFLOWCHARTS
~
~
~H               AP2501
~V9 -1
~F
@TITLE AP250(1,11)
@COL 1S-2R-4F
@FLOW 1-2-4
@BOX 1.0
PDP11 MONITOR CPU APPENDIX
@BOX 2.0
PROCEDURES IN THIS MODULE
   1 INIT IO LINES
   2 PUT CONS
   3 PRINT
   4 GET CONS
   5 GET HOST
   6 GO
@BOX 4.0
END
@BOX 1.1
PSPEC MONITOR (INTEGER);
MODULE (V.CONS.RX.BUFF, V.CONS.TX.BUFF, V.CONS.STAT,
   V.HOST.RX.BUFF, V.HOST.TX.BUFF, V.HOST.STAT,
   INIT.IO.LINES, PUT.CONS, PRINT, GET.CONS,
   GET.HOST, LAST.CH, CANCEL.LINE, GO, RESET,
   D.REG, A.REG, PC, STATUS, USP, LAST.CH, MAX.MEM.MODULES, EDC.STATUS);
@BOX 2.1
*CODE 1;
#AP250/1
#AP250.1
#AP250.2
#AP250.3
#AP250.4
#AP250.5
#AP250.6
@BOX 4.1
*END
@END
@TITLE AP250/1(1,11)
@COL 1S-2R-3R-4F
@FLOW -1-2-3-4
@BOX 1.0
DECLARATIONS
@BOX 2.0
HOST COMMS
AND CONSOLE
VSTORE
@BOX 3.0
OTHER DECLARATIONS
@BOX 4.0
END
@BOX 1.1
::DECLARATIONS
@BOX 2.1
LITERAL TX.READY = 4, RX.READY = 1;
LITERAL / LOGICAL8 LF = 10, CR = 13, XLIN = %18;
PSPEC INIT.IO.LINES (INTEGER);
PSPEC GO ();
PSPEC PUT.CONS (LOGICAL);
PSPEC PRINT (ADDR [LOGICAL8]);
PSPEC GET.CONS () / LOGICAL;
PSPEC GET.HOST () / LOGICAL;
PSPEC RESET();
*GLOBAL 3;
LOGICAL32 [8] D.REG, A.REG;
LOGICAL32 PC, STATUS, USP;
LOGICAL8 CRX.BUFF, CTX.BUFF, CONS.REG, HRX.BUFF, HTX.BUFF, HOST.REG;
INTEGER I, LAST.CH;
LOGICAL8 MAX.MEM.MODULES, EDC.STATUS;
LABEL CANCEL.LINE;
*VTYPE LOGICAL16;
VSTORE DZ11.CSR %E040;
VSTORE DZ11.RBUF %E042;
VSTORE DZ11.LPR %E042;
VSTORE DZ11.TCR %E044;
VSTORE DZ11.TDR %E046;
VSTORE V.CONS.RCSR %FF70;
VSTORE V.CONS.TCSR %FF74;
*VTYPE LOGICAL8;
VSTORE V.CONS.RX.BUFF %FF72;
VSTORE V.CONS.TX.BUFF %FF76;
VSTORE V.CONS.STAT CONS.REG < CONS.PP;
VSTORE V.HOST.RX.BUFF HRX.BUFF < HOST.PRE;
VSTORE V.HOST.TX.BUFF HTX.BUFF > HOST.POST;
VSTORE V.HOST.STAT HOST.REG < HOST.PP;
@BOX 3.1
PROC CONS.PP;
0 => CONS.REG;
IF V.CONS.TCSR & %80 /= 0 THEN
   TXREADY !> CONS.REG;
FI
IF V.CONS.RCSR & %80 /= 0 THEN
   RXREADY !> CONS.REG;
FI
END

PROC HOST.PP;
0 => HOST.REG;
IF DZ11.CSR & %8000 /= 0 THEN
   TXREADY !> HOST.REG;
FI
IF DZ11.CSR & %80 /= 0 THEN
   RXREADY !> HOST.REG;
FI
END

PROC HOST.PRE;
DZ11.RBUF => HRX.BUFF;
END

PROC HOST.POST;
HTX.BUFF => DZ11.TDR;
END

PROC RESET;
MONITOR (0);
END
@BOX 4.1
::END
@END
@TITLE AP250.1(1,11)

@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
INITIALISE HOST DEVICE
@BOX 2.0
ENABLE DZ11
RECEIVER AND TRANSMITTER
@BOX 3.0
END
@BOX 1.1
PROC INIT.IO.LINES (LINK);
@BOX 2.1
%20 => DZ11.CSR;
1 => V.CONS.RCSR;
%1E50 => DZ11.LPR;
1 => DZ11.TCR;
@BOX 3.1
END
@END

@TITLE AP250.2(1,11)
@COL 1S-7N-2R-3R-4T-6F
@COL 8N-5R
@ROW 7-8
@ROW 6-5
@FLOW 1-7-2-3-4NOT LF-6
@FLOW 4NEWLINE-5-8-7
@BOX 1.0
PUT CHAR TO CONSOLE
@BOX 2.0
WAIT UNTIL READY
@BOX 3.0
OUTPUT CHAR
@BOX 4.0
IS CHAR = NEWLINE ?
@BOX 5.0
SET CHAR TO LINEFEED
REPEAT OUTPUT
@BOX 6.0
END
@BOX 1.1
PROC PUT.CONS (CH);
CH =>  LAST.CH;
@BOX 2.1
WHILE V.CONS.STAT & TX.READY = 0 DO OD
@BOX 3.1
CH => V.CONS.TX.BUFF;
@BOX 4.1
IF CH = LF
@BOX 5.1
CR => CH;
@BOX 6.1
END
@END
@TITLE AP250.3(1,11)
@COL 1S-2R-3T
@FLOW 1-2-3
@BOX 1.0
PRINT (MESS) MESSAGE
@BOX 2.0
PRINT EACH CHARACTER IN STRING
@BOX 3.0
END
@BOX 1.1
PROC PRINT (MESS);
INTEGER I;
@BOX 2.1
FOR I < SIZE (MESS) DO
   PUT.CONS (MESS^ [I])
OD
@BOX 3.1
END
@END
@TITLE AP250.4(1,11)
@COL 1S-2R-3R-4F
@FLOW 1-2-3-4
@BOX 1.0
GET CHAR FROM CONSOLE (AND ECHO)
@BOX 2.0
WAIT UNTIL READY
@BOX 3.0
READ AND ECHO CHAR
@BOX 4.0
END
@BOX 1.1
PROC GET.CONS;
@BOX 2.1
WHILE V.CONS.STAT & RX.READY = 0 DO OD
@BOX 3.1
IF V.CONS.RX.BUFF & %7F => GET.CONS = CR THEN
   LF => GET.CONS;
FI
IF GET.CONS = XLIN THEN
   PRINT (%" <Cancelled>");
   -> CANCEL.LINE;
   FI
PUT.CONS (GET.CONS);
@BOX 4.1
END
@END
@TITLE AP250.5(1,11)
@COL 1S-2R-3R-4F
@FLOW 1-2-3-4
@BOX 1.0
GET CH FROM HOST MACHINE
@BOX 2.0
WAIT UNTIL CH AVAILABLE
@BOX 3.0
READ CH
@BOX 4.0
END
@BOX 1.1
PROC GET.HOST;
@BOX 2.1
WHILE V.HOST.STAT & RX.READY = 0 DO OD
@BOX 3.1
V.HOST.RX.BUFF & %7F => GET.HOST;
@BOX 4.1
END
@END
@TITLE AP250.6(1,11)

@COL 1S-2R-3F

@FLOW 1-2-3

@BOX 1.0
GO
@BOX 2.0
JUMP TO VALUE OF PC
@BOX 3.0
END
@BOX 1.1
PROC GO;
@BOX 2.1
*#%17C7 %DF42; ::PC => R7;
@BOX 3.1
END
@END



