@X @~ %`
~V7 56 2 -5
~D10
~H                 MUSS
~
~
~D10
~H           AP7501
~D10
~MMANCHESTER UNIVERSITY  -  CONFIDENTIAL~
~
~
                                                             ISSUE 11~
~V9 -1
~P
~V9 1
~YAP7501
~S1~M~OAP7 IMPLEMENTATION DESCRIPTION~
~S1~M~OSection 50 Version 1~
~S~OSection 50.1 Monitor CPU Appendix (MU6G)
~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               AP7501
~V9 -1
~F
@TITLE AP750(1,11)
@COL 1S-2R-4F
@FLOW 1-2-4
@BOX 1.0
MU6G 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
#AP750/1
#AP750.1
#AP750.2
#AP750.3
#AP750.4
#AP750.5
#AP750.6
@BOX 4.1
*END
@END
@TITLE AP750/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;
VSTORE V.UNIBUS.EXTENSION %6800C;
VSTORE V.CONSI.CSR %74;
VSTORE V.CONSO.CSR %6C;
VSTORE V.CONSI.BUFF %64;
VSTORE V.CONSO.BUFF %64;
*VTYPE LOGICAL16;
VSTORE DZ11.CSR %6C106;
VSTORE DZ11.RBUF %6C10E;
VSTORE DZ11.LPR %6C10E;
VSTORE DZ11.TCR %6C116;
VSTORE DZ11.TDR %6C11E;
*VTYPE LOGICAL8;
VSTORE V.CONS.RX.BUFF CRX.BUFF < CONS.PRE;
VSTORE V.CONS.TX.BUFF CTX.BUFF > CONS.POST;
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.CONSO.CSR = 0 THEN
   TXREADY !> CONS.REG;
FI
IF V.CONSI.CSR /= 0 THEN
   RXREADY !> CONS.REG;
FI
END

PROC CONS.PRE;
V.CONSI.BUFF => CRX.BUFF;
0 => V.CONSI.CSR;
END

PROC CONS.POST;
IF V.CONSI.CSR /= 0 THEN
   0 => V.CONSI.CSR;
FI
CTX.BUFF => V.CONSO.BUFF;
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 AP750.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
%3E => V.UNIBUS.EXTENSION;
%20 => DZ11.CSR;
%1E50 => DZ11.LPR;
1 => DZ11.TCR;
@BOX 3.1
END
@END

@TITLE AP750.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 AP750.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 AP750.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 AP750.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 AP750.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;
INTEGER I;
@BOX 2.1
PC <<- 3 => I;
*#%C483; ::JMP PC;
@BOX 3.1
END
@END



