@X @~ %`
~L3 COUK1247
80
~V7 56 2 -5
~D10
~H                 MUSS
~
~
~D10
~H           AP5112
~D10
~MMANCHESTER UNIVERSITY  -  CONFIDENTIAL~
~
~
                                                             ISSUE 11~
~V9 -1
~P
~V9 1
~YAP5112
~S1~M~OAP5 IMPLEMENTATION DESCRIPTION~
~S1~M~OSection 11 Version 2~
~S~OSection 11.2 ROM Initialisation (GEMSTONE)
~S1~O1. General Description
~BThis module contains the interrupt vectors, the hand coded
sequence which is executed when the reset interrupt occurs
and the definition of the VSTORE used to drive the console
and the host comms in polling mode.  The reset
sequence initialises the error correction logic, tests the RAM, and
then calls the monitor procedure.
~BOnly 64 entries are required in the interrupt vectors in RAM, and
the last one of these will receive hardware interrupts 64 - 255 which
are normally used for the user vectors.  The RTV hardware does not
exploit user vectoring in this way, therefore this level of resolution
is forfeited in the interest of saving space.
~BMost of the interrupt vector entries in the ROM will result in an
instruction being obeyed to jump to the corresponding RAM entry which
will then jump to the interrupt procedure.  Four interrupts are
treated specially~
~
~MReset (1)
~NMonitor (31)
~NTrap (47)
~NSingle Step (9)
~BThe reset action is described below and the other three result in
procedure calls to the appropriate (imported) addresses
after the stack pointer and frame pointer have been
preserved and reset.
~S1~O2. Interfaces
~S1~O2.1 MUSS Interface
~S1~O2.1.1 Hardware Interface
~S1~O3. Implementation
~S1~O3.1 Outline of Operation
~BThe reset sequence is entered on power up, or by activating the reset switch o
n the
processor. It then waits for a key to be pressed on the console. The character
typed determines whether the monitor is to perform a store check prior to starti
ng fully, or imediately starting. The latter is acheived by typing a space
or newline character. The former, store check, entry is obtained by one of
the ~Wfour characters "A" to "D", each permitting a different area of store
to be checked as follows:~
~
~M"A" locations %080000 to %0FFFFF.
~N"B"     "     %100000 to %17FFFF.
~N"C"     "     %180000 to %1FFFFF.
~N"D"     "     %200000 to %2FFFFF.
~BIf the check is successful, the monitor will be entered as usual.
If it fails, one of the following characters will be diplayed, and the monitor
will loop indefinitely.
~
~
~3
~M"x" Failure to write all zeros and read back.
~N"y"     "    "    "   "  ones   "    "   "
~N"z"     "    "    "  word addresses and read back.
~0
~S1~O3.2 Data Structures
~S1~O3.3 Special Notes
~Y
~V9 -1
~P
~D15
~HFLOWCHARTS
~
~
~H               AP5112
~V9 -1
~F
@TITLE AP511(2,11)
@COL 1S-2R-4F
@FLOW 1-2-4
@BOX 1.0
GEMSTONE INT.VECTOR MODULE
@BOX 2.0
IN THIS MODULE
   VSTORE DECLARATIONS
   HARDWARE VECTORS
   ENTER ROM INT. SEQ.
   RESET SEQUENCE
@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,
        D.REG, A.REG, PC, STATUS, USP, MAX.MEM.MODULES, EDC.STATUS,
        GO, INIT.IO.LINES, PUT.CONS, PRINT, GET.CONS, GET.HOST, LAST.CH,
        CANCEL.LINE, CONSOLE, HOST, RESET);
@BOX 2.1
#AP511.1
#AP511/1
#AP511.2
#AP511.3
#AP511.4
#AP511.5
#AP511.6
#AP511.7
#AP511.8
#AP511.9
#AP511.10
@BOX 4.1
*END
@END
@TITLE AP511/1(2,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
::VSTORE
@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;
LOGICAL16 [%300] RAM.I.VEC;
LOGICAL32 [8] D.REG, A.REG;
LOGICAL32 PC, STATUS, USP, DO.SAVE, I.VEC.NO;
LOGICAL8 MAX.MEM.MODULES, EDC.STATUS;
LOGICAL8 CRX.BUFF, HRX.BUFF;
INTEGER I;
INTEGER LAST.CH;
LABEL CANCEL.LINE;
LOGICAL8 [8] BUFF;
LOGICAL8 CONS.REG, HOST.REG;
*VTYPE LOGICAL16;
VSTORE MONITOR.ENABLE %486000;
*VTYPE LOGICAL8;
VSTORE LIGHT %408000;
VSTORE DARK %408001;
VSTORE V.CONS.RX.BUFF CRX.BUFF < CONS.PRE;
VSTORE V.CRX.BUFF %40C480;
VSTORE V.CONS.TX.BUFF %40C482;
VSTORE V.CONS.STAT CONS.REG<CONS.PP;
VSTORE V.HOST.RX.BUFF HRX.BUFF < HOST.PRE;
VSTORE V.HRX.BUFF %40C500;
VSTORE V.HOST.TX.BUFF %40C502;
VSTORE V.HOST.STAT HOST.REG<HOST.PP;
VSTORE V.CONS.STATUS %40C481;
VSTORE V.HOST.STATUS %40C501;
@BOX 3.1
PROC CONS.PP;
   0 => CONS.REG;
   IF V.CONS.TX.BUFF = 0 THEN
      TXREADY !> CONS.REG;
   FI
   IF V.CONS.STATUS  & 1/= 0 THEN
      RX.READY !> CONS.REG;
   FI
END
PROC CONS.PRE;
   V.CRX.BUFF => CRX.BUFF;
   0 => V.CONS.STATUS;
END
PROC HOST.PP;
0 => HOST.REG;
   IF V.HOST.TX.BUFF = 0 THEN
      TXREADY !> HOST.REG;
   FI
   IF V.HOST.STATUS & 1 /= 0 THEN
      RX.READY !> HOST.REG;
   FI
END
PROC HOST.PRE;
   V.HRX.BUFF => HRX.BUFF;
   0 => V.HOST.STATUS;
END
@BOX 4.1
::END
@END
@TITLE AP511.1(2,11)
@COL 1S-2R-3R-4F
@FLOW 1-2-3-4
@BOX 1.0
INTERRUPT STACK POINTER VALUE
@BOX 2.0
INTERRUPT VECTOR OF 256 ENTRIES
 1 = RESET SEQ ADDR
 9 = STEP.TRAP.ADDR
 31 = MONITOR PROC ADDR
 47 = BREAKPOINT TRAP.ADDR
OTHER ENTRIES < 63 GIVE THE CORRESPONDING
ADDRESS IN THE RAM INT VECTOR TABLE.
@BOX 3.0
COPY MONITOR TO ADDRESS 0
AND ENTER RESET PATH
END
@BOX 1.1
->COPYSEQ;
*CODE 8;
*GLOBAL 1;
@BOX 2.1
L24: *#0 0 0;L30: *#0 0 0;L36: *#0 0 0;L42: *#0 0 0;
L48: *#0 0 0;L54: *#0 0 0;L60: *#0 0 0;L66: *#0 0 0;
L72: *#0 0 0;L78: *#0 0 0;L84: *#0 0 0;L90: *#0 0 0;
L96: *#0 0 0;N02: *#0 0 0;N08: *#0 0 0;N14: *#0 0 0;
N20: *#0 0 0;N26: *#0 0 0;N32: *#0 0 0;N38: *#0 0 0;
N44: *#0 0 0;N50: *#0 0 0;N56: *#0 0 0;N62: *#0 0 0;
N68: *#0 0 0;N74: *#0 0 0;N80: *#0 0 0;N86: *#0 0 0;
N92: *#0 0 0;N98: *#0 0 0;M04: *#0 0 0;M10: *#0 0 0;
M16: *#0 0 0;M22: *#0 0 0;M28: *#0 0 0;M34: *#0 0 0;
M40: *#0 0 0;M46: *#0 0 0;M52: *#0 0 0;M58: *#0 0 0;
M64: *#0 0 0;M70: *#0 0 0;M76: *#0 0 0;M82: *#0 0 0;
M88: *#0 0 0;M94: *#0 0 0;K00: *#0 0 0;K06: *#0 0 0;
K12: *#0 0 0;K18: *#0 0 0;K24: *#0 0 0;K30: *#0 0 0;
K36: *#0 0 0;K42: *#0 0 0;K48: *#0 0 0;K54: *#0 0 0;
K60: *#0 0 0;K66: *#0 0 0;K72: *#0 0 0;K78: *#0 0 0;
K84: *#0 0 0;K90: *#0 0 0;K96: *#0 0 0;I02: *#0 0 0;
I03: *#0 0 0;I04: *#0 0 0;I05: *#0 0 0;I06: *#0 0 0;
I07: *#0 0 0;I08: *#0 0 0;I10: *#0 0 0;I11: *#0 0 0;
I12: *#0 0 0;I13: *#0 0 0;I14: *#0 0 0;I15: *#0 0 0;
I16: *#0 0 0;I17: *#0 0 0;I18: *#0 0 0;I19: *#0 0 0;
I20: *#0 0 0;I21: *#0 0 0;I22: *#0 0 0;I23: *#0 0 0;
I24: *#0 0 0;I25: *#0 0 0;I26: *#0 0 0;I27: *#0 0 0;
I28: *#0 0 0;I29: *#0 0 0;I30: *#0 0 0;I31: *#0 0 0;
I32: *#0 0 0;I33: *#0 0 0;I34: *#0 0 0;I35: *#0 0 0;
I36: *#0 0 0;I37: *#0 0 0;I38: *#0 0 0;I39: *#0 0 0;
I40: *#0 0 0;I41: *#0 0 0;I42: *#0 0 0;I43: *#0 0 0;
I44: *#0 0 0;I45: *#0 0 0;I46: *#0 0 0;I47: *#0 0 0;
I48: *#0 0 0;I49: *#0 0 0;I50: *#0 0 0;I51: *#0 0 0;
I52: *#0 0 0;I53: *#0 0 0;I54: *#0 0 0;I55: *#0 0 0;
I56: *#0 0 0;I57: *#0 0 0;I58: *#0 0 0;I59: *#0 0 0;
I60: *#0 0 0;I61: *#0 0 0;I62: *#0 0 0;I63: *#0 0 0;
I64: *#0 0 0;I65: *#0 0 0;I66: *#0 0 0;I67: *#0 0 0;
I68: *#0 0 0;I69: *#0 0 0;I70: *#0 0 0;I71: *#0 0 0;
I72: *#0 0 0;I73: *#0 0 0;I74: *#0 0 0;I75: *#0 0 0;
I76: *#0 0 0;I77: *#0 0 0;I78: *#0 0 0;I79: *#0 0 0;
I80: *#0 0 0;I81: *#0 0 0;I82: *#0 0 0;I83: *#0 0 0;
I84: *#0 0 0;I85: *#0 0 0;I86: *#0 0 0;I87: *#0 0 0;
I88: *#0 0 0;I89: *#0 0 0;I90: *#0 0 0;I91: *#0 0 0;
I92: *#0 0 0;I93: *#0 0 0;I94: *#0 0 0;I95: *#0 0 0;
I96: *#0 0 0;I97: *#0 0 0;I98: *#0 0 0;I99: *#0 0 0;
J01: *#0 0 0;J02: *#0 0 0;J03: *#0 0 0;J04: *#0 0 0;
J05: *#0 0 0;J06: *#0 0 0;J07: *#0 0 0;J08: *#0 0 0;
J09: *#0 0 0;J10: *#0 0 0;J11: *#0 0 0;J12: *#0 0 0;
J13: *#0 0 0;J14: *#0 0 0;J15: *#0 0 0;J16: *#0 0 0;
J17: *#0 0 0;J18: *#0 0 0;J19: *#0 0 0;J20: *#0 0 0;
J21: *#0 0 0;J22: *#0 0 0;J23: *#0 0 0;J24: *#0 0 0;
J25: *#0 0 0;J26: *#0 0 0;J27: *#0 0 0;J28: *#0 0 0;
J29: *#0 0 0;J30: *#0 0 0;J31: *#0 0 0;J32: *#0 0 0;
J33: *#0 0 0;J34: *#0 0 0;J35: *#0 0 0;J36: *#0 0 0;
J37: *#0 0 0;J38: *#0 0 0;J39: *#0 0 0;J40: *#0 0 0;
J41: *#0 0 0;J42: *#0 0 0;J43: *#0 0 0;J44: *#0 0 0;
J45: *#0 0 0;J46: *#0 0 0;J47: *#0 0 0;J48: *#0 0 0;
J49: *#0 0 0;J50: *#0 0 0;J51: *#0 0 0;J52: *#0 0 0;
J53: *#0 0 0;J54: *#0 0 0;J55: *#0 0 0;J56: *#0 0 0;
J57: *#0 0 0;J58: *#0 0 0;J59: *#0 0 0;J60: *#0 0 0;
J61: *#0 0 0;J62: *#0 0 0;J63: *#0 0 0;J64: *#0 0 0;
J65: *#0 0 0;J66: *#0 0 0;J67: *#0 0 0;J68: *#0 0 0;
J69: *#0 0 0;J70: *#0 0 0;J71: *#0 0 0;J72: *#0 0 0;
J73: *#0 0 0;J74: *#0 0 0;J75: *#0 0 0;J76: *#0 0 0;
J77: *#0 0 0;J78: *#0 0 0;J79: *#0 0 0;J80: *#0 0 0;
J81: *#0 0 0;J82: *#0 0 0;J83: *#0 0 0;J84: *#0 0 0;
J85: *#0 0 0;J86: *#0 0 0;J87: *#0 0 0;J88: *#0 0 0;
J89: *#0 0 0;J90: *#0 0 0;J91: *#0 0 0;J92: *#0 0 0;
J93: *#0 0 0;J94: *#0 0 0;J95: *#0 0 0;J96: *#0 0 0;
DATAVEC ROM.VECTOR (LABEL)
   L30 L36 L42 L48 L54 L60 L66
   L72 ONETR L84 L90 L96 N02 N08 N14
   N20 N26 N32 N38 N44 N50 N56 N62
   N68 N74 N80 N86 N92 N98 M04 MONITOR.TR
   M16 M22 M28 M34 M40 M46 M52 M58
   M64 M70 M76 M82 M88 M94 K00 BREAKPOINT.TR
   K12 K18 K24 K30 K36 K42 K48 K54
   K60 K66 K72 K78 K84 K90 K96 I02
   I03 I04 I05 I06 I07 I08 I10 I11
   I12 I13 I14 I15 I16 I17 I18 I19
   I20 I21 I22 I23 I24 I25 I26 I27
   I28 I29 I30 I31 I32 I33 I34 I35
   I36 I37 I38 I39 I40 I41 I42 I43
   I44 I45 I46 I47 I48 I49 I50 I51
   I52 I53 I54 I55 I56 I57 I58 I59
   I60 I61 I62 I63 I64 I65 I66 I67
   I68 I69 I70 I71 I72 I73 I74 I75
   I76 I77 I78 I79 I80 I81 I82 I83
   I84 I85 I86 I87 I88 I89 I90 I91
   I92 I93 I94 I95 I96 I97 I98 I99
   J01 J02 J03 J04 J05 J06 J07 J08
   J09 J10 J11 J12 J13 J14 J15 J16
   J17 J18 J19 J20 J21 J22 J23 J24
   J25 J26 J27 J28 J29 J30 J31 J32
   J33 J34 J35 J36 J37 J38 J39 J40
   J41 J42 J43 J44 J45 J46 J47 J48
   J49 J50 J51 J52 J53 J54 J55 J56
   J57 J58 J59 J60 J61 J62 J63 J64
   J65 J66 J67 J68 J69 J70 J71 J72
   J73 J74 J75 J76 J77 J78 J79 J80
   J81 J82 J83 J84 J85 J86 J87 J88
   J89 J90 J91 J92 J93 J94 J95 J96
END
@BOX 3.1
*GLOBAL 3;
*CODE 1;
-> RESET.TR ::RE-ENTER MONITOR;
COPYSEQ:
*#%41F8 %0000;::LEA #0, A0
LOOPA:
*#%20E8 %2000;::MOV.L 8K(A0), (A0)+
*#%B0FC %2000;::CMPA A0, 8K
*#%6DF6   ::BLT LOOPA
*#%6000 %E002 ::BRA -8K+2
->RESET.TR;
@BOX 4.1
::END
@END
@TITLE AP511.2(2,11)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
ENTER ROM INT.SEQ.
@BOX 2.0
ENTRY POINT FOR
   SINGLE STEP
   MONITOR
   BREAKPOINT
SET ENTRY NUMBER THEN
SAVE REGISTERS IN RAM AREA.
CLEAR SINGLE STEP MODE.
@BOX 3.0
ENTER MONITOR
@BOX 1.1
:: ENTER ROM INT.SEQ.
@BOX 2.1
BREAKPOINT.TR:
   %BC => I.VEC.NO;
   -> INT.ENTRY;
ONE.TR:
   %24 => I.VEC.NO;
   -> INT.ENTRY;
MONITOR.TR:
   %7C => I.VEC.NO;
   0 => MONITOR.ENABLE;
   8 => MONITOR.ENABLE;
INT.ENTRY:
*#%46FC %2400; ::SET PROC STAT = 4;
*#%33DF %0000 %2646         :: MOVE.W    (A7)+,@%2646
*#%23DF %0000 %2640         :: MOVE.L    (A7)+,@%2640
*#%48F9 %FFFF %0000 %2600   :: MOVEM.L   (ALL),%2600
*#%4E68                     :: MOVE      USP,A0
*#%23C8 %0000 %2648         :: MOVE.L    A0,@%2648
*#%4FF9 %0000 %2C00         :: LEA       %2C00,A7
%7FFF &> STATUS;
@BOX 3.1
MONITOR (I.VEC.NO);
:: END OF ENTRY
@END
@TITLE AP511.3(2,11)
@COL 1S-11R-12R-13F
@FLOW 1-11-12-13
@BOX 1.0
PRE-MONITOR STORE CHECK
@BOX 11.0
CLEAR STORE
@BOX 12.0
INITIALISE
INT VECTORS
@BOX 13.0
CALL MONITOR
@BOX 1.1
RESET.TR: ::BEGIN
@BOX 11.1
*#%2E7C %0000 %2C00         ::SETS SF
*#%247C %0000 %2000  :: MOVE.L #%2000,A2  (START ADDRESS)
*#%227C %0010 %0000  :: MOVE.L #%1MEG,A1  (SIZE)
L11A:
*#%429A                :: CLR.L (A2)+
*#%B3CA                :: CMPA A2.L, A1
*#%66FA                :: BNE L11
RESET.RE:
@BOX 12.1
0 => I;
FOR 256 DO
   %4E73 => RAM.I.VEC [I];
%FF => LIGHT;
   3 +> I;
OD
*#%46FC %2400   ::SET PROC STAT = 4;
8 => MONITOR.ENABLE;
@BOX 13.1
MONITOR (0);
::END
@END
@TITLE AP511.4(2,11)

@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
INITIALIZE HOST DEVICE
@BOX 2.0
NO INITIALISATION
NECESSARY
@BOX 3.0
END
@BOX 1.1
PROC INIT.IO.LINES (LINK);
INTEGER I;
@BOX 3.1
END
@END

@TITLE AP511.5(2,11)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
ENTER USER PROGRAM.
@BOX 2.0
RESTORE USER REGISTERS
   D0 - D7, A0 - A7(SP)
   STATUS (ON STACK)
   PC     (ON STACK)
THEN DO RTE TO GET OUT.
@BOX 3.0
(DUMMY) END
@BOX 1.1
PROC GO;
@BOX 2.1
*#%2079 %0000 %2648          :: MOVE.L   @%2648,A0
*#%4E60                      :: MOVE.L   A0,USP
*#%4CF9 %FFFF %0000 %2600    :: MOVEM.L  @%2600,(ALL)
*#%2F39 %0000 %2640          :: MOVE.L   @%2640,-(A7)
*#%3F39 %0000 %2646          :: MOVE.W   @%2646,-(A7)
*#%4E73                      :: RTE
@BOX 3.1
END
@END
@TITLE AP511.6(2,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 'TIL 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 AP511.7(2,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 AP511.8(2,11)
@COL 1S-2R-3R-4F
@FLOW 1-2-3-4
@BOX 1.0
GET CHAR FROM CONSOLE (AND ECHO)
@BOX 2.0
WAIT 'TIL 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 AP511.9(2,11)
@COL 1S-2R-3R-4F
@FLOW 1-2-3-4
@BOX 1.0
GET CH FROM HOST MACHINE
@BOX 2.0
WAIT 'TIL 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 AP511.10(2,11)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.1
RESET AND RE-ENTER
@BOX 2.1
RESET MACHINE STATE
AND RE-ENTER THE
RESET INTERRUPT PATH
@BOX 3.1
END
@BOX 1.1
PROC RESET;
@BOX 2.1
::COLIN !!!???
*#%4EF8 %0400 :: JUMP TO RESET.TR (VIA %400)
@BOX 3.1
END
@END
