@X @~ %`
~V7 56 2 -5
~L3 COUK1247
80
~D10
~H                 MUSS
~
~
~D10
~H           AP5111
~D10
~MMANCHESTER UNIVERSITY  -  CONFIDENTIAL~
~
~
                                                             ISSUE 11~
~V9 -1
~P
~V9 1
~YAP5111
~S1~M~OAP5 IMPLEMENTATION DESCRIPTION~
~S1~M~OSection 11 Version 1~
~S~OSection 11.1 ROM Initialisation (PTV)
~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
~
   1) V.CONS.RX.BUFF~
   2) V.CONS.TX.BUFF~
   3) V.CONS.STAT~
   4) V.HOST.RX.BUFF~
   5) V.HOST.TX.BUFF~
   6) V.HOST.STAT~
~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               AP5111
~V9 -1
~F
@TITLE AP511(1,10)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
RTV INT.VECTOR MODULE
@BOX 2.0
IN THIS MODULE
   VSTORE DECLARATIONS
   HARDWARE VECTORS
   ENTER ROM INT. SEQ.
   RESET SEQUENCE
@BOX 3.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
::ATV #AP511.11
@BOX 3.1
*END
@END
@TITLE AP511/1(1,10)
@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
*VTYPE LOGICAL8;
VSTORE V.CONS.RX.BUFF    %2747;
VSTORE V.CONS.TX.BUFF    %2747;
VSTORE V.CONS.STAT       %2745;
VSTORE V.HOST.RX.BUFF    %2743;
VSTORE V.HOST.TX.BUFF    %2743;
VSTORE V.HOST.STAT       %2741;
LITERAL TX.READY = 4, RX.READY = 1;
LITERAL / LOGICAL8 LF = 10, CR = 13, XLIN = %18;
LITERAL LEN.IO.INIT = 20;
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();
::ATV PSPEC INIT.CRT();
::ATV LITERAL / INTEGER32 C.SCREEN.SIZE = %1000, G.SCREEN.SIZE = %10000;
::ATV *GLOBAL 8;
::ATV LOGICAL8 [G.SCREEN.SIZE] G.SCREEN;
::ATV *GLOBAL 9;
::ATV LOGICAL8 [C.SCREEN.SIZE] C.SCREEN;
*GLOBAL 3;
LOGICAL16 [192] RAM.I.VEC;
LOGICAL32 [8] D.REG, A.REG;
LOGICAL32 PC, STATUS, USP, DO.SAVE, I.VEC.NO;
LOGICAL8 MAX.MEM.MODULES, EDC.STATUS;
INTEGER I;
INTEGER LAST.CH;
LABEL CANCEL.LINE;
@BOX 3.1
LITERAL CONSOLE = 1, HOST = 2, RESET.CMD = 4;
@BOX 4.1
::END
@END
@TITLE AP511.1(1,10)
@COL 1S-2R-3F
@FLOW 1-2-3
@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.
THE REMAINDER (63 - 255) GIVE THE ADDRESS
OF POSITION 63 IN THIS TABLE.
@BOX 3.0
END
@BOX 1.1
*CODE 6;
*GLOBAL 1;
DATAVEC INT.SP (ADDR)
   %80400
END
@BOX 2.1
L1024: *#%0000 %0000 %0000;
L1030: *#%0000 %0000 %0000;
L1036: *#%0000 %0000 %0000;
L1042: *#%0000 %0000 %0000;
L1048: *#%0000 %0000 %0000;
L1054: *#%0000 %0000 %0000;
L1060: *#%0000 %0000 %0000;
L1066: *#%0000 %0000 %0000;
L1072: *#%0000 %0000 %0000;
L1078: *#%0000 %0000 %0000;
L1084: *#%0000 %0000 %0000;
L1090: *#%0000 %0000 %0000;
L1096: *#%0000 %0000 %0000;
L1102: *#%0000 %0000 %0000;
L1108: *#%0000 %0000 %0000;
L1114: *#%0000 %0000 %0000;
L1120: *#%0000 %0000 %0000;
L1126: *#%0000 %0000 %0000;
L1132: *#%0000 %0000 %0000;
L1138: *#%0000 %0000 %0000;
L1144: *#%0000 %0000 %0000;
L1150: *#%0000 %0000 %0000;
L1156: *#%0000 %0000 %0000;
L1162: *#%0000 %0000 %0000;
L1168: *#%0000 %0000 %0000;
L1174: *#%0000 %0000 %0000;
L1180: *#%0000 %0000 %0000;
L1186: *#%0000 %0000 %0000;
L1192: *#%0000 %0000 %0000;
L1198: *#%0000 %0000 %0000;
L1204: *#%0000 %0000 %0000;
L1210: *#%0000 %0000 %0000;
L1216: *#%0000 %0000 %0000;
L1222: *#%0000 %0000 %0000;
L1228: *#%0000 %0000 %0000;
L1234: *#%0000 %0000 %0000;
L1240: *#%0000 %0000 %0000;
L1246: *#%0000 %0000 %0000;
L1252: *#%0000 %0000 %0000;
L1258: *#%0000 %0000 %0000;
L1264: *#%0000 %0000 %0000;
L1270: *#%0000 %0000 %0000;
L1276: *#%0000 %0000 %0000;
L1282: *#%0000 %0000 %0000;
L1288: *#%0000 %0000 %0000;
L1294: *#%0000 %0000 %0000;
L1300: *#%0000 %0000 %0000;
L1306: *#%0000 %0000 %0000;
L1312: *#%0000 %0000 %0000;
L1318: *#%0000 %0000 %0000;
L1324: *#%0000 %0000 %0000;
L1330: *#%0000 %0000 %0000;
L1336: *#%0000 %0000 %0000;
L1342: *#%0000 %0000 %0000;
L1348: *#%0000 %0000 %0000;
L1354: *#%0000 %0000 %0000;
L1360: *#%0000 %0000 %0000;
L1366: *#%0000 %0000 %0000;
L1372: *#%0000 %0000 %0000;
L1378: *#%0000 %0000 %0000;
L1384: *#%0000 %0000 %0000;
L1390: *#%0000 %0000 %0000;
L1396: *#%0000 %0000 %0000;
L1402: *#%0000 %0000 %0000;
DATAVEC ROM.VECTOR (LABEL)
           RESET.TR    L1036  L1042
   L1048    L1054        L1060  L1066
   L1072    SINGLE.TR   L1084  L1090
   L1096    L1102        L1108  L1114
   L1120    L1126        L1132  L1138
   L1144    L1150        L1156  L1162
   L1168    L1174        L1180  L1186
   L1192    L1198        L1204  MONITOR.TR
   L1216    L1222        L1228  L1234
   L1240    L1246        L1252  L1258
   L1264    L1270        L1276  L1282
   L1288    L1294        L1300  BREAKPOINT.TR
   L1312    L1318        L1324  L1330
   L1336    L1342        L1348  L1354
   L1360    L1366        L1372  L1378
   L1384    L1390        L1396  L1402
   L1402 [192]
END
@BOX 3.1
*GLOBAL 3;
*CODE 1;
@END
@TITLE AP511.2(1,10)
@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;
SINGLE.TR:
   %24 => I.VEC.NO;
   -> INT.ENTRY;
MONITOR.TR:
*#%13F8 %2801 %0008 %01D5      ::  MOVE.B EDC0,EDC.STATUS
   %7C => I.VEC.NO;
INT.ENTRY:
*#%007C %0700               :: ORI.W       %0700,STATUS.REG
*#%33DF %0008 %01C6         :: MOVE.W    (A7)+,@%801C6
*#%23DF %0008 %01C0         :: MOVE.L    (A7)+,@%801C0
*#%48F9 %FFFF %0008 %0180   :: MOVEM.L   (ALL),%80180
*#%4E68                     :: MOVE      USP,A0
*#%23C8 %0008 %01C8         :: MOVE.L    A0,@%801C8
*#%4FF9 %0008 %0400         :: LEA       %80400,A7
%7FFF &> STATUS;
@BOX 3.1
MONITOR (I.VEC.NO);
:: END OF ENTRY
@END
@TITLE AP511.3(1,10)
@COL 1S-2R-3R-4R-6R-7R
@COL 8R-9R-10R-11R-12R-13F
@ROW 2-8
@FLOW 1-2-3-4-6-7-8-9-10-11-12-13
@BOX 1.0
PRE-MONITOR STORE CHECK
@BOX 2.0
INITIALISE CONSOLE
@BOX 3.0
WAIT UNTIL TRANSMIT &
RECEIVE BOTH READY.
@BOX 4.0
INITIALISE EDC
AND CLEAR STORE BLOCK
@BOX 6.0
CHECK STORE CONTAINS
ALL ZEROS
@BOX 7.0
SET TO ALL ONES AND
THEN READ BACK.
@BOX 8.0
WRITE ADDRESS (BY WORD)
AND THEN READ BACK.
@BOX 9.0
STORE TEST LIMITS
@BOX 10.0
ZYLOG SCC INITIALISATION
VECTOR (9600 BAUD)
@BOX 11.0
CLEAR STORE
@BOX 12.0
INITIALISE
INT VECTORS
@BOX 13.0
CALL MONITOR
@BOX 1.1
RESET.TR: ::BEGIN
@BOX 2.1
*#%47FA %00CA             :: LEA     #STORE.LIMITS, A3 (RELATIVE)
*#%41FA %00DA             :: LEA     #COMMS.INITLS, A0 (RELATIVE)
*#%43F9 %0000 %2745       :: LEA     %2745, A1 (SCC.CTL.LINE)
*#%7016                   :: MOVEQ   22, D0
L1:
*#%1298                   :: MOVE.B  (A0)+, (A1)
*#%5340                   :: SUBQ.W  1, D0
*#%66FA                   :: BNE     L1
@BOX 3.1
*#%41F9 %0000 %2747       :: LEA     %2747, A0 (SCC.DAT.LINE)
L2:
*#%1011                   :: MOVE.B  (A1), D0
*#%0240 %0005             :: ANDI.W  5, D0
*#%0440 %0005             :: SUBI.W  5, D0
*#%66F4                   :: BNE     L2
@BOX 4.1
*#%1010                   :: MOVE.B  (A0), D0
*#%7201                   :: MOVEQ  #1,D1  (ASSUME 2 BOARDS)
*#%0240 %005F             :: ANDI.W  #5F,D0 (INPUT A CHAR)
*#%0440 %0041             :: SUBI.W #41,D0  (-"A")
*#%40C3                   :: MOVE  SR,D3
*#%6D02                   :: BLT L3
*#%2200                   :: MOVE.L  D0,D1  (NR. BOARDS-1)
L3:
*#%2001                   :: MOVE.L  D1,D0
*#%E548                   :: LSL.W  2,D0
::
*#%2801                   :: MOVE.L  D1,D4  (INITIALIZE MEMORY)
*#%4BF8 %2801             :: LEA   @EDC0,A5
L13:
*#%1ABC %0018             :: MOVE.B #18,(A5) (INITIALIZE MODE)
*#%504D                   :: ADDQ.W  8,A5
*#%51CC %FFF8             :: DBRA  D4,L13
::
*#%2273 %0004             :: MOVE.L  4(A3,D0.W),A1 (END ADDRESS)
*#%2453                   :: MOVE.L  (A3),A2   (START ADDRESS)
L4A:
*#%429A                   :: CLR.L  (A2)+
*#%B3CA                   :: CMPA  A2.L,A1
*#%66FA                   :: BNE   L4A
::
*#%2801                   :: MOVE.L  D1,D4
*#%4BF8 %2801             :: LEA  @EDC0,A5
L4B:
*#%1ABC %00C0             :: MOVE.B  %C0,(A5)
*#%504D                   :: ADDQ.W 8,A5
*#%51CC %FFF8             :: DBRA  D4,L4B
::
*#%44C3                   :: MOVE  D3,CCR
*#%6D00 %008A             :: BLT   (OUT)
*#%7478                   :: MOVEQ  "X",D2
@BOX 6.1
*#%2453                   :: MOVE.L   (A3),A2
L5:
*#%4A9A                   :: TST.L   (A2)+
*#%6708                   :: BEQ     L4
*#%13C2 %0000 %2747       :: MOVE.B  D2, @%2747
*#%60FE                   :: BRA     (HERE) -- LOOP !!!
L4:
*#%B3CA                   :: CMPA    A1, A2
*#%66F0                   :: BNE     L5
@BOX 7.1
*#%2453                   :: MOVE.L   (A3),A2
L6:
*#%24FC %FFFF %FFFF       :: MOVE.L  %FFFFFFFF, (A2)+
*#%B3CA                   :: CMPA    A1, A2
*#%66F6                   :: BNE     L6
*#%5242                   :: ADDQ.W  1, D2
*#%2453                   :: MOVE.L   (A3),A2
L8:
*#%201A                   :: MOVE.L (A2)+, D0
*#%0C80 %FFFF %FFFF       :: CMPI.L  %FFFFFFFF, D0
*#%6708                   :: BEQ     L7
*#%13C2 %0000 %2747       :: MOVE.B  D2, @%2747
*#%60FE                   :: BRA     (HERE) -- LOOP !!!
L7:
*#%B3CA                   :: CMPA    A1, A2
*#%66EA                   :: BNE     L8
@BOX 8.1
*#%2453                   :: MOVE.L   (A3),A2
L9:
*#%24CA                   :: MOVE.L  A2, (A2)+
*#%B3CA                   :: CMPA    A1, A2
*#%66FA                   :: BNE     L9
*#%5242                   :: ADDQ.W  1, D2
*#%2453                   :: MOVE.L   (A3),A2
L11:
*#%284A                   :: MOVE.L  A2, A4
*#%2A5A                   :: MOVE.L  (A2)+, A5
*#%BBCC                   :: CMPA    A5, A4
*#%6708                   :: BEQ     L10
*#%13C2 %0000 %2747       :: MOVE.B  D2, @%2747
*#%66FE                   :: BRA     (HERE) -- LOOP !!!
L10:
*#%B3CA                   :: CMPA    A1, A2
*#%66EC                   :: BNE     L11
*#%602C                   :: BRA     (OUT)
@BOX 9.1
:: STORE.LIMITS
*#%0008 %0000 ;
*#%000C %0000 ;
*#%0010 %0000 ;
*#%001C %0000  ;
*#%0020 %0000 ;
@BOX 10.1
:: COMMS.INITLS
*#%09C0;
*CODE 2;
*GLOBAL 1;
DATAVEC IO.INIT.SEQ (LOGICAL8)
%04 %47
%01 %00
%03 %43
%05 %28
%0A %00
%0B %56
%0C %0B
%0D %00
%0E %83
%0F %00
END
*GLOBAL 3;
*CODE 1;
*#%0000 :: TO MAKE OUTPROG LOOK NICE !!
OUT:
@BOX 11.1
*#%2453                :: MOVE.L (A3),A2  (START ADDRESS)
L11A:
*#%429A                :: CLR.L (A2)+
*#%B3CA                :: CMPA A2.L, A1
*#%66FA                :: BNE L11
*#%13C1 %0008 %01D4    :: MOVE.B  D1, MAX.MEM.MODULES
@BOX 12.1
0 => I;
FOR 64 DO
   %4E4F => RAM.I.VEC [I];
   3 +> I;
OD
@BOX 13.1
MONITOR (0);
::END
@END
@TITLE AP511.4(1,10)

@COL 1S-2R-3R-4F
@FLOW 1-2-3-4
@BOX 1.0
INITIALIZE HOST DEVICE
@BOX 2.0
INITIALIZE SCC
@BOX 3.0
INITIALIZE & CRT
@BOX 4.0
END
@BOX 1.1
PROC INIT.IO.LINES (LINK);
INTEGER I;
@BOX 2.1
IF LINK & RESET.CMD /= 0 THEN
::NZY    %09 => V.CONS.STAT;
::NZY    %C0 => V.CONS.STAT;
FI
IF LINK & CONSOLE /= 0 THEN
   FOR I < LEN.IO.INIT DO
      IO.INIT.SEQ [I] => V.CONS.STAT;
   OD
FI
IF LINK & HOST /= 0 THEN
   FOR I < LEN.IO.INIT DO
      IO.INIT.SEQ [I] => V.HOST.STAT;
   OD
FI
@BOX 3.1
::ATV IF LINK & RESET.CMD /= 0 THEN
::ATV       INIT.CRT();
::ATV FI
@BOX 4.1
END
@END

@TITLE AP511.5(1,10)
@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 %0008 %01C8          :: MOVE.L   @%801C,A0
*#%4E60                      :: MOVE.L   A0,USP
*#%4CF9 %FFFF %0008 %0180    :: MOVEM.L  @%80180,(ALL)
*#%2F39 %0008 %01C0          :: MOVE.L   @%801C0,-(A7)
*#%3F39 %0008 %01C6          :: MOVE.W   @%801C6,-(A7)
*#%4E73                      :: RTE
@BOX 3.1
END
@END
@TITLE AP511.6(1,10)
@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(1,10)
@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(1,10)
@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(1,10)
@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(1,11)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
RESET MACHINE STATE
AND RE-ENTER MONITOR
@BOX 2.0
RE-ENTER VIA
THE INTERRUPT VECTOR
ENTRY 0
@BOX 3.0
END
@BOX 1.1
PROC RESET;
@BOX 2.1
*#%2E78 %0000 :: RESET STACK FRONT
*#%3078 %0004 :: A0 = RESET.TR
*#%4EC9       :: JUMP A0
@BOX 3.1
END
@END
@TITLE AP511.11(1,11)
@COL 1S-2R-3F
@FLOW 1-2-3
@BOX 1.0
INITIALIZE GRAPHICS
@BOX 2.0
INIT CRTC
@BOX 3.0
END
@BOX 1.1
PROC INIT.CRT;
@BOX 2.1
*VTYPE LOGICAL8;
VSTORE V.CRTC.REG.PTR %27C0;
VSTORE V.CRTC.LOAD.REG %27C2;
VSTORE V.BG.COLOUR %27D1;
*VTYPE LOGICAL;
INTEGER32 I;
DATAVEC INITIAL.SETTINGS (INTEGER8);
   99 80 83 10 24 6
   24 24 0  10 0 [6]
END
FOR I < 16 DO
   I => V.CRTC.REG.PTR;
   INITIAL.SETTINGS [I] => V.CRTC.LOAD.REG;
OD
0 => V.BG.COLOUR;
FOR I < C.SCREEN.SIZE DO
   %20 => C.SCREEN [I];
OD
FOR I < G.SCREEN.SIZE DO
   1 => G.SCREEN [I];
OD
@BOX 3.1
END
@END
