DataMuseum.dk

Presents historical artifacts from the history of:

CR80 Hard and Floppy Disks

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about CR80 Hard and Floppy Disks

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦f85a4f20d⟧ TextFile

    Length: 49664 (0xc200)
    Types: TextFile
    Names: »RAMTST«

Derivation

└─⟦70c9bac02⟧ Bits:30005090 8" CR80 Floppy CR80FD_0046 ( CR/D/1098 CR80 Test oc add =8 JAS Tilhører Holger Bay Version 790720 )
    └─⟦324330f72⟧ 
        └─ ⟦this⟧ »FH.RAMTST« 

TextFile

LIST
;----------------------------------------------------------------------
;
;          TEST PROGRAMME FOR 32, 16 AND 4 K RAM BOARD
;
;----------------------------------------------------------------------
BEGIN USE BASE
MODULE
PMASK=       TRUE
BS1=         #EFD0                  ; PROGRAM DEFAULT PROCESS START;
PRG1=        #F800                  ; PROGRAM START;
                                    ;
                                    ; DEVICE DEFINITIONS;
OC=              8                  ;   OPERATORS CONSOLE;
RAMTM=           7                  ;   RAM TEST MODULE;
                                    ;
                                    ; OC STATUS BITS;
BINP=           10                  ;
BOUT=           11                  ;
BPERR=          13                  ;
                                    ; TEST MODULE REGISTERS;
COT=             0                  ;   COUNT;
ADR=             1                  ;   ADDRESS;
CNT=             2                  ;   CONTROL;
                                    ; SAVELOCATIONS:
BAS:=        #0008                  ;
PROGRAM:=    #000A                  ;
LOCACTION:=  #000F                  ;
LOCRETURN:=  #0010                  ;
CAUSE:=      #0011                  ;
DEVPR:=      #0012                  ;
CURADR:=     #0014                  ;
TOP:=        #0015                  ;
SAVE0:=      #0016                  ;
SAVE1:=      #0017                  ;
SAVE2:=      #0018                  ;
SAVE3:=      #0019                  ;
SAVE4:=      #001A                  ;
SAVE5:=      #001B                  ;
SAVE6:=      #001C                  ;
SAVE7:=      #001D                  ;
SAVE8:=      #001E                  ;
TESTNR:=     #001F                  ;
TESTOFF:=    #0020                  ;
SIZE:=       #0021                  ;
SIZE2:=      #0022                  ;
SIZE3:=      #0023                  ;
SIZE4:=      #0024                  ;
SAVE9:=      #0025                  ;
SAVE10:=     #0026                  ;
SAVEWR:=     #0027                  ;
SAVE11:=     #0028                  ;
SAVE12:=     #0029                  ;
SAVE13:=     #002A                  ;
TADR:=       #002B                  ;
SAVE14:=     #002C                  ;
DEVICE:=     #002D                  ;
SAVE15:=     #002E                  ;
                                    ; MONITOR CALLS:
REGISTERS=   #0040                  ; ;###

USE PROG

TESTS:                              ; RAM TESTS:
                                    ;
TEST04:                             ; TEST ROUTINES, 4K:
             MCPT2                  ;
             TEST1                  ;
             TEST2                  ;
             TEST3                  ;
             TEST4                  ;
             MSW04                  ;
             TEST6                  ;
             TEST7                  ;
             TEST8                  ;
             TEST9                  ;
             TESTCH                 ;
             TEST2                  ;
             TEST3                  ;
             TEST4                  ;
             MSW04                  ;
             TEST6                  ;
             TEST7                  ;
             TEST8                  ;
             TEST9                  ;
             TESTEND1               ;
             TESTEND2               ;
                                    ;
TEST16:                             ; TEST ROUTINES, 16K:
             MCPT2                  ;
             TEST1                  ;
             TEST2                  ;
             TEST3                  ;
             TEST4                  ;
             MSW16                  ;
             TEST6                  ;
             TEST7                  ;
             TEST8                  ;
             TEST9                  ;
             TESTCH                 ;
             TEST2                  ;
             TEST3                  ;
             TEST4                  ;
             MSW16                  ;
             TEST6                  ;
             TEST7                  ;
             TEST8                  ;
             TEST9                  ;
             TESTEND1               ;
             TESTEND2               ;
;###
TEST32:                             ; TEST ROUTINES, 32K:
             MCPT2                  ;
             TEST1                  ;
             TEST2                  ;
             TEST3                  ;
             TEST4                  ;
             MSW32                  ;
             TEST6                  ;
             TEST7                  ;
             TEST8                  ;
             TEST9                  ;
             TESTEND1               ;
             TESTEND2               ;
;###
                                    ; PROCEDURE REFERENCES:
IGETADR:     GETADR                 ;
IHEXIN:      HEXIN                  ;
IHEXIN1:     HEXIN1                 ;
IHEXOUT:     HEXOUT                 ;
INEXTLIN:    NEXTLIN                ;
IINCHAR:     INCHAR                 ;
IOUTCHAR:    OUTCHAR                ;
IOUTTXNL:    OUTTXNL                ;
IOUTTEXT:    OUTTEXT                ;
ICHECKB:     CHECKB                 ;
IADRFAULT:   ADRFAULT               ;
IDATFAULT:   DATFAULT               ; 
IPAGFAULT:   PAGFAULT               ;
IMSWSET:     MSWSET                 ;
ICLEAR:      CLEAR                  ;
IALOAD:      ALOAD                  ;
ICHECK:      CHECK                  ;
ICHECKX:     CHECKX                 ;
ISTARTW:     STARTW                 ;
ISTARTR:     STARTR                 ;
IREADTM:     READTM                 ;
IWRWR:       WRWR                   ;
IWRRE:       WRRE                   ;
IREWR:       REWR                   ;
IRERE:       RERE                   ;
IINPAR:      INPAR                  ;
IPAGTST:     PAGTST                 ;
                                    ; LABEL REFERENCES:
ISTART:                             ;
IINCOMMAND:  INCOMMAND              ;
IERROR:      ERROR                  ;
                                    ; CONSTANT REFERENCES:
RE00C:       #E00C                  ;
RE000:       #E000                  ;
RAAAA:       #AAAA                  ;
R8000:       #8000                  ;
R5555:       #5555                  ;
R4000:       #4000                  ;
R2000:       #2000                  ;
R1234:       #1234                  ;
R12AB:       #12AB                  ;
RCDAB:       #CDAB                  ;
R1000:       #1000                  ;
R2048:        2048                  ;
R1024:        1024                  ;
R015C:       #015C                  ;
                                    ;
PROGPOINTER: BPRG1                  ;
BOOTPOINTER: BBOOT                  ;
BASEPOINTER: BS1                    ; ;###
LOCNT:                              ; LOCAL ACTION, SPEC FOR TIMOUT:
        MOV          R0  SAVE7      ;
        MOV   RE000             R0  ;
        LDS          R0             ;
        MOV   CAUSE             R0  ;   IF 0.CAUSE = 3
        INEP         R0  3          ;   THEN
        MOV   SAVE7             R0  ;
        JMP              LOCNP      ;     RETURN(LOCRETURN+1);
        MOV   LOCRETURN         R0  ;
        ADDC  2                 R0  ;
        MOV          R0  LOCRETURN  ;
        MOV   SAVE7             R0  ;
        JMPI             LOCRETURN  ;   ELSE GOTO NO PAR. ACTION;
                                    ;
LOCMVM:                             ; LOCAL ACTION FOR MOVM, NO PAR.:
        MOV          R0  SAVE7      ;
        MOV   RE000             R0  ;
        LDS          R0             ;
        MOV   CAUSE             R0  ;
        IEQ          R0  2          ;   IF 0.CAUSE = 2 THEN
        JMP              LCNX       ;      RETURN
        MOV   SAVE7             R0  ;   ELSE CONTINUE;
                                    ;
LOCMVMP:                            ; LOCAL ACTION FOR MOVM, PAR.:
        SUB   BAS               R6  ;   MAKE ADDR REL.;
                                    ;   CONTINUE;
                                    ;
LOCACP:                             ; PAR. LOCAL ACTION:
        MOV          R0  SAVE7      ;
        MOV   RE000             R0  ;
        LDS          R0             ;
        MOV          R6  SAVE8      ;
        MOV   CAUSE             R0  ;
        INE          R0  2          ;   IF CAUSE <> PAR.ERR. THEN
        JMP              LCNP1      ;     GOTO LOCAL ACTION NO PAR.ERR.
        JMP          S4  OUTTXNL    ;   WRITE(TEXT);
        <:PARITY ERR AT ADD<0>:>    ;
        JMP              LCNP3      ;   GOTO WRITEADR;
;###
LOCNP:                              ; LOCAL ACTION, NO PARITY ERR STOP:
        MOV          R0  SAVE7      ;   SAVE(R0);
        MOV   RE000             R0  ;
        LDS          R0             ;
        MOV   CAUSE             R0  ;   IF 0.CAUSE = 2 THEN
        INE          R0  2          ;   BEGIN
        JMP              LCNP1      ;     RESTORE(R0);
LCNX:                               ; RETURN:
        MOV   LOCRETURN         R0  ;
        ADDC  1                 R0  ;
        MOV          R0  LOCRETURN  ;     RETURN(LOCRETURN);
        MOV   SAVE7             R0  ;
        JMPI             LOCRETURN  ;
LCNP1:                              ;   END;
        INE          R0  3          ;   IF 0.CAUSE = 3 THEN
        JMP              LCNP2      ;   BEGIN
        MOV          R6  SAVE8      ;     SAVE(ADR);
        JMP          S4  OUTTXNL    ;     WRITE(TEXT);
        <:TIMEOUT AT ADD<0>:>       ;
LCNP3:                              ; WRITEADR:
        MOV   SAVE8             R4  ;     RESTORE(ADDR);
        MOV   BAS               R3  ;
        ADD          R3         R4  ;     MAKE ADDR REL;
        JMP          S5  HEXOUT     ;     WRITE(ADDR);
        JMPI            IINCOMMAND  ;     GOTO INCOMMAND;
LCNP2:                              ;   END;
        JMP          S4  OUTTXNL    ;   WRITE(TEXT);
        <:PROGRAM ERR AT ADD<0>:>   ;
        MOV   LOCRETURN         R4  ;
        JMP          S5   HEXOUT    ;   WRITE(LOCRETURN);
        JMPI             IINCOMMAND ;   GOTO INCOMMAND;
;###
LOCALL:                             ; SURVIVE ALL:
        MOV          R0  SAVE7      ;   SAVE(R0);
        MOV   RE000             R0  ;
        LDS          R0             ;   CLEAR LOCAL ACTION BIT;
        MOV   CAUSE             R0  ;   IF TIMEOUT OR PAR. ERR. THEN
        IHS          R0  2          ;     GOTO RETURN;
        JMP              LCNX       ;
        JMP              LCNP2      ;   GOTO PROGRAM ERR.;
                                    ;
LOCSP:                              ; NO PAR. ACTION FOR DUMP:
        MOV          R0  SAVE7      ;   SAVE(R0);
        MOV   RE000             R0  ;
        LDS          R0             ;   CLEAR LOCAL ACTION BIT;
        MOV   CAUSE             R0  ;
        IEQ          R0  2          ;   IF CAUSE = 2 THEN
        JMP              LCNX       ;     GOTO RETURN
                                    ;   ELSE CONTINUE;
                                    ;
                                    ;
LOCACT:                             ; NORMAL LOCAL ACTION:
        JMP          S4  OUTTXNL    ;   WRITE(TEXT);
        <:LOCAL ACTION, CAUSE<0>:>  ;
        MOV   CAUSE             R4  ;
        JMP          S5  HEXOUT     ;   WRITE(CAUSE);
        MOV   BAS               R0  ;
        LDN                     R0  ;   RESTART;
                                    ;
EMERGENCY:                          ; EMERGENCY ACTION:
        JMP          S4  OUTTXNL    ;   WRITE(TEXT);
        <:EMERGENCY ACTION<0>:>     ;
        MOVC  BPRG1             R0  ;
        LDN          R0             ;   LOAD RAM TEST PROGRAM;
                                    ;
MREGS:                              ; MREGS:
        SVP   REGSRET               ;   SAVE PROCESS TO CONTINUE
                                    ;       WITH REGSRET;
        MOVC  0                 R3  ;   0 => RE.ADDR;
MR0:                                ; MR0:
        MOV   0.     X3         R4  ;   0.ADR => REGISTER;
        JMP          S5  HEXOUT     ;   OUTPUT REGISTER;
        ADDC  1                 R3  ;   INCR(RE.ADDR);
        INE          R3  9          ;   IF ADDR <> 9 THEN
        JMP              MR0        ;     GOTO MR0;
        JMP          S5  NEXTLIN    ;   NEW LINE;
        MOV   BAS               R0  ;
        LDN          R0             ;   RELOAD PROCESS;
                                    ;
REGSRET:                            ; REGSRET:
        JMP              0.     X7  ;   RETURN;
                                    ;
                                    ;
                                    ;
;###
;----------------------------------------------------------------------
;
;                         S U B R O U T I N E S
;
;----------------------------------------------------------------------

;GETADR - GET ADDRESS
;        CALL          EXIT
;
;R0                    DESTROYED
;R1                    DESTROYED
;R2                    0
;R3                    ADDRESS
;R5      LINK          DESTROYED
;R6                    DESTROYED
;R7                    LINK

GETADR:                             ; GETADR:
        MOV          R5         R7  ;   SAVE(LINK);
G1:                                 ; G1:
        JMP          S5  HEXIN      ;   GET HEX CHAR;
        JMP              G1         ;   NOT HEX, GOTO G1;
        MOV          R1         R3  ;
        MOVC  3                 R2  ;
G0:                                 ; GO:
        JMP          S5  HEXIN      ;   GET HEX CHAR;
        JMP              0.     X7  ;   RETURN(ERROR);
        SLL          R3  4          ;   VALUE*16=>VALUE;
        ADD          R1         R3  ;   CHAR+VALUE=>VALUE;
        SOB          R2  G0         ;   IF DECR(COUNT)<> 0 THEN
                                    ;      GOTO G0;
        JMP              1.     X7  ;   RETURN;


;HEXIN
;        CALL          EXIT
;
;R0                    DESTROYED
;R1                    HEX CHAR
;R5      LINK          LINK
;R6                    DESTROYED

HEXIN:                              ; HEXIN:
        JMP          S6  INCHAR     ;   GET CHAR;
HEXIN1:                             ; HEXIN1:
        ADDC  -<:::>            R1  ;   CHAR-<:::> => CHAR;
        ILTP         R1  <:A:>-<:::>;   IF CHAR < <:A:>-<:::>
        IGE          R1  0          ;      AND CHAR >= 0 THEN
        JMP              0.     X5  ;      RETURN(ERROR);
HEXIN2:                             ;
        ADDC  <:::>-<:A:>+10    R1  ;   CHAR+<:::>-<:A:>+10 =>CHAR;
        ILT          R1  10         ;   IF CHAR<10 THEN
        ADDC  <:A:>-10-<:0:>    R1  ;      CHAR+<:A:>-10-<:0:> =>CHAR;
        SGEP         R1  16         ;   IF CHAR<16 OR
        SLT          R1  0          ;                >=0 THEN
        JMP              1.     X5  ;   RETURN;
        JMP              0.     X5  ;   RETURN(ERROR);
;###
;HEXOUT
;       CALL         EXIT
;
;R0                  DESTROYED
;R1                  DESTROYED
;R2                  DESTROYED
;R4     BIN VALUE    BIN VALUE
;R5     LINK         LINK
;R6                  DESTROYED

HEXOUT:                             ; HEXOUT:
        MOVC  8#40              R1  ;   ASCII(SP) => CHAR;
        JMP          S6  OUTCHAR    ;   OUTPUT CHAR;
        MOVC  4                 R2  ;   4 => COUNT;
H2:     SLC          R4  4          ; H2:
        MOV          R4         R1  ;
        XTR          R1 4           ;   HEX(3:4) => VALUE;
        ILT          R1  10         ;   IF VALUE < 10 THEN
        ADDC <:0:>-<:A:>+10     R1  ;      VALUE+<:0:>-<:A:>+10 =>VALUE
        ADDC       <:A:>-10     R1  ;   VALUE+<:A:>-10 => CHAR;
        JMP          S6  OUTCHAR    ;   OUTPUT CHAR;
        SOB          R2  H2         ;   IF DECR(COUNT)<>0 THEN
                                    ;      GOTO H2;
        JMP              0.     X5  ;   RETURN;


;NEXTLIN
;       CALL         EXIT
;
;R0                  DESTROYED
;R1                  DESTROYED
;R5     LINK         LINK
;R6                  DESTROYED

NEXTLIN:                            ; NEXTLIN:
        MOVC  8#15              R1  ;   ASCII(CR) => CHAR;
        JMP          S6  OUTCHAR    ;   OUTPUT CHAR;
        MOVC  8#12              R1  ;   ASCII(LF) => CHAR;
        JMP          S6  OUTCHAR    ;   OUTPUT CHAR;
        MOVC  0                 R1  ;
        JMP          S6  OUTCHAR    ;   OUTPUT 4 FILLERS;
        JMP          S6  OUTCHAR    ;
        JMP          S6  OUTCHAR    ;
        JMP          S6  OUTCHAR    ;
        JMP              0.     X5  ;   RETURN;
;###
;INCHAR  INPUT A CHAR;
;       CALL         EXIT
;
;R0                  DESTROYED
;R1                  CHAR
;R6     LINK         LINK

INCHAR:                             ; INCHAR:
        MOVC  OC                R0  ;   OC=>DEVICE;
        SIO          R0         R0  ;   WAIT FOR INPUT READY;
        IBZ          R0  BINP       ;
        JMP              INCHAR     ;
        IBN          R0  BPERR      ;   IF <BREAK> THEN
        JMPI            ISTART      ;      GOTO START;
        MOVC  OC                R0  ;   OC=>DEVICE;
        RIO          R1         R0  ;   READ(CHAR,DEVICE);
        XTR          R1  7          ;   CONTINUE WITH OUTCHAR;
                                    ;
                                    ;
;OUTCHAR   OUTPUT A CHAR;
;      CALL      EXIT
;
;R0              DESTROYED
;R1    CHAR      CHAR
;R6    LINK      LINK

OUTCHAR:                            ; OUTCHAR:
        MOVC  OC                R0  ;
        SIO          R0         R0  ;
        IBZ          R0  BOUT       ;
        JMP              OUTCHAR    ;
        MOVC  OC                R0  ;   OC=>DEVICE;
        WIO          R1         R0  ;   WRITE(CHAR,DEVICE);
        JMP              0.     X6  ;   RETURN;
;###
;OUTTEXT   OUTPUT A TEXTSTRING;
;      CALL      EXIT
;
;R0              DESTROYED
;R1              DESTROYED
;R4    ADDR      ADDR(UPDATED) (RETURN)
;R5              DESTROYED
;R6              DESTROYED

OUTTXNL:                            ; OUTTEXT WITH NEWLINE:
        JMP          S5  NEXTLIN    ;   NEWLINE;
OUTTEXT:                            ; NEWCHAR:
        MVP   0.     X4         R1  ;   0.ADDR => CHAR;
        XTR          R1  7          ;   CHAR(6:7) => CHAR;
        JOZ          R1  OUTTEXT1   ;   IF CHAR=0 THEN GOTO RET;
        JMP          S6  OUTCHAR    ;   OUTCHAR;
        MVP   0.     X4         R1  ;   0.ADDR(15:8) =>
        SWP          R1             ;     CHAR;
        XTR          R1  7          ;   CHAR(6:7) => CHAR;
        JOZ          R1  OUTTEXT1   ;   IF CHAR=0THEN GOTO RET;
        JMP          S6  OUTCHAR    ;   OUTCHAR;
        ADDC  1                 R4  ;   ADDR+1 => ADDR;
        JMP              OUTTEXT    ;   GOTO NEWCHAR;
OUTTEXT1:                           ; RET:
        JMP              1.     X4  ;   RETURN;

;CHECKB - CHECK FOR STOP FROM TERMINAL
;      CALL      EXIT
;
;R4              DESTROYED
;R5              DESTROYED
;R6    LINK      LINK

CHECKB:                             ; CHECK FOR STOP:
        MOVC  OC                R4  ;
        SIO          R5         R4  ;   SENSE OC;
        IBZ          R5  BPERR      ;   IF INPUT NOT READY THEN
        JMP              2.     X6  ;     RETURN(NOT STOP);
        MOVC  3                 R5  ;
        CIO          R5         R4  ;   ENABLE INTERFACE;
        JMP              0.     X6  ;   RETURN(STOP);
;###
;DATFAULT
;      CALL      EXIT
;
;R2    COUNT     COUNT
;R3    ACT1      ACT1
;R4    ACT2      ACT2
;R5    LINK      LINK
;R6    ADDR      ADDR
;R7              DESTROYED

DATFAULT:                           ; DATAFAULT:
        MOVC  SAVE0+7           R7  ;
        STC   7                     ;   STACK REGISTERS;
        JMP          S4  OUTTXNL    ;   WRITE(TEXT);
        <:DATA FAULT AT ADR<0>:>    ;
        MOVC  BAS               R3  ;
        MOV   SAVE6             R4  ;   0.SAVER6+
        ADD          X3         R4  ;     0.BAS => ADDR;
        JMP          S5  HEXOUT     ;   WRITE(ADDR);
        JMP          S4  OUTTEXT    ;   WRITE(TEXT)
        <:  FAULT WORDS<0>:>        ;
        MOV   SAVE3             R4  ;
        JMP          S5  HEXOUT     ;   WRITE(R3);
        MOV   SAVE4             R4  ;
        JMP          S5  HEXOUT     ;   WRITE(R4);
        JMP          S6  CHECKB     ;   CHECK FOR STOP;
        MOVC  1                 R2  ; STOP:
        MOV          R2  2.     X7  ;   2 => 0.SAVER2;
        UNS   6                     ; NOT STOP: UNSTACK REGISTERS;
                                    ;   END;
        JMP              0.     X5  ;   RETURN;


;PAGFAULT
;      CALL      EXIT
;
;R1    TPAGE     TPAGE
;R4    PAGE      PAGE
;R5    LINK      LINK
;R7              DESTROYED

PAGFAULT:                           ; PAGEFAULT:
        MOVC  SAVE0+7           R7  ;
        STC   7                     ;   STACK REGISTERS;
        JMP          S4  OUTTXNL    ;   WRITE(TEXT);
        <:PAGE FAULT AT<0>:>        ;
        MOV   SAVE1             R4  ;
        MOV          R4         R3  ;
        IEQ          R3  1          ;
        MOVC  2                 R4  ;
        IEQ          R3  2          ;
        MOVC  1                 R4  ;
        JMP          S5  HEXOUT     ;   WRITE(TPAGE);
        MOV   SAVE4             R4  ;   PAGE => ADDR;
        JMP              ADRF1      ;   GOTO WRITEADDR;
;###
;ADRFAULT
;      CALL      EXIT
;
;R1    COUNT     COUNT
;R5    LINK      LINK
;R6    ADDR      ADDR
;R7              DESTROYED

ADRFAULT:                           ; ADDRESSFAULT:
        MOVC  SAVE0+7           R7  ;
        STC   7                     ;   STACK REGISTERS;
        JMP          S4  OUTTXNL    ;   WRITE(TEXT);
        <:ADR FAULT AT ADR<0>:>     ;
        MOVC  BAS               R3  ;
        MOV   SAVE6             R4  ;   0.SAVER6+
        ADD          X3         R4  ;     0.BAS => ADDR;
ADRF1:                              ; WRITEADDR:
        JMP          S5  HEXOUT     ;   WRITE(ADDR);
        JMP          S6  CHECKB     ;   CHECK FOR STOP;
        MOVC  1                 R1  ; STOP:
        MOV          R1  1.     X7  ;   1 => 0.SAVER1;
        UNS   6                     ; NOT STOP: UNSTACK REGISTERS;
                                    ;   END;
        JMP              0.     X5  ;   RETURN;
                                    ;
                                    ;
;MSWSET
;      CALL      EXIT
;
;R0,R1           DESTROYED
;R2    MSW       MSW
;R3,R4           DESTROYED
;R5    LINK      LINK
;R6,R7           DESTROYED

MSWSET:                             ; MODULE SWITCH SET:
        MOV          R5         R7  ;   SAVE(LINK);
MSWSET1:                            ; SET SWITCH:
        JMP          S4  OUTTXNL    ;   WRITE(TEXT);
        <:SET MSW: <0>:>            ;
        MOVC  7                 R3  ;   FOR BIT:=7 UNTIL 1 DO
MS1:                                ;   BEGIN
        MOVC  <:0:>             R1  ;     <:0:> => CHAR;
        MODN         R3             ;
        MODC  7                     ;
        IBN          R2  0          ;     IF MSW(7-BIT:1)=1 THEN
        ADDC  <:1:>-<:0:>       R1  ;        <:1:> => CHAR;
        JMP          S6  OUTCHAR    ;     OUTCHAR;
        SOB          R3  MS1        ;   END;
        MOVC  <: :>             R1  ;
        JMP          S6  OUTCHAR    ;   WRITE(<: :>);
        JMP          S6  INCHAR     ;   INCHAR;
        INE          R1  <:N:>      ;   IF CHAR <> CR THEN
        JMP              MSWSET1    ;     GOTO SET SWITCH;
        JMP              0.     X7  ;   RETURN;
;###
;ALOAD - LOAD ADDRESS INTO ADDRESS
;      CALL      EXIT
;
;R1              DESTROYED
;R2              0
;R5    LINK      LINK
;R6              DESTROYED

ALOAD:                              ; LOAD ADDRESS INTO ADDRESS:
        MOV   BAS               R6  ;
        NEG          R6             ;   SET ADDR;
        MOVC  0                 R1  ;   0 = W;
        MOV   SIZE              R2  ;   FOR I:=1 UNTIL SIZE DO
ALOAD1:                             ;   BEGIN
        MOV          R1         X6  ;     W => 0.ADDR;
        ADDC  1                 R1  ;     W+1 => W;
        ADDC  1                 R6  ;     ADDR+1 => ADDR;
        SOB          R2  ALOAD1     ;   END;
        JMP              0.     X5  ;   RETURN;


;CHECK - CHECK FOR ADDRESS IN ADDRESS
;      CALL      EXIT
;
;R2              0
;R3              DESTROYED
;R4              DESTROYED
;R5    LINK      DESTROYED
;R6              DESTROYED
;R7              DESTROYED

CHECK:                              ; CHECK FOR ADDRESS:
        MOV          R5  SAVE9      ;   SAVE(LINK);
        MOV   BAS               R6  ;
        NEG          R6             ;   SET ADDR;
        MOVC  0                 R4  ;   0 => EXPW;
        MOV   SIZE              R2  ;   FOR I:=1 UNTIL SIZE DO
CHECK1:                             ;   BEGIN
        MOV          X6         R3  ;     0.ADDR => W;
        INE          R3         R4  ;     IF W <> EXPW THEN
        JMP          S5  DATFAULT   ;        DATAFAULT;
        ADDC  1                 R4  ;     EXPW+1 => EXPW;
        ADDC  1                 R6  ;     ADDR+1 => ADDR;
        SOB          R2  CHECK1     ;   END;
        JMPI             SAVE9      ;   RETURN;
;###
;CLEAR - SET RAM TO ALL ZEROES
;      CALL      EXIT
;
;R2              0
;R3              0
;R5    LINK      LINK
;R6              DESTROYED

CLEAR:                              ; CLEAR RAM:
        MOVC  0                 R2  ;   0 => W;
CLEARX:                             ; SET VALUE:
        MOV   BAS               R6  ;
        NEG          R6             ;   SET ADDR;
        MOV   SIZE              R3  ;   FOR I:=1 UNTIL SIZE DO
CLEAR1:                             ;   BEGIN
        MOV          R2         X6  ;      W => 0.ADDR;
        ADDC  1                 R6  ;      ADDR+1 => ADDR;
        SOB          R3  CLEAR1     ;   END;
        JMP              0.     X5  ;   RETURN;


;STARTW - START TEST MODULE, WRITE
;      CALL      EXIT
;
;R0    MODE      MODE    (MODE = PAUSE AND PAGE)
;R1              DESTROYED
;R5    LINK      LINK
;R6              DESTROYED
;R7              DESTROYED

STARTW:                             ; START TEST MODULE, WRITE:
        MODC -128                   ;   SELECT WRITE;


;STARTR - START TEST MODULE, READ
;      CALL      EXIT
;
;R0    MODE      MODE   (MODE = PAUSE AND PAGE)
;R1              DESTROYED
;R5    LINK      LINK
;R6              DESTROYED
;R7              DESTROYED

STARTR:                             ; START TEST MODULE READ:
        MOVC  128               R7  ;   SELECT READ;
        MOVC  0                 R1  ;   O => ADDR;
        MOVC  ADR<6+RAMTM       R6  ;
        WIO          R1         R6  ;   LOAD *ADDR*;
        MOV   SIZE              R1  ;   0.SIZE
        ADDC -1                 R1  ;     -1 =>
        MOVC  COT<6+RAMTM       R6  ;        *COUNT*;
        WIO          R1         R6  ;
        ADD          R0         R7  ;
        MOVC  CNT<6+RAMTM       R6  ;   LOAD *CONTROL*;
        WIO          R7         R6  ;
        JMP              0.     X5  ;   RETURN;
;###
;CHECKX - CHECK WITH HEADING
;      CALL      EXIT
;
;R0              DESTROYED
;R1              DESTROYED
;R2              0
;R3              DESTROYED
;R4              DESTROYED
;R5    LINK      LINK
;R6              DESTROYED
;R7              DESTROYED

CHECKX:                             ; CHECK WITH HEADING:
        MOV   BAS               R6  ;
        NEG          R6             ;   SET ADDR;
        MOVC  0                 R4  ;   0 => EXPW;
        MOV   SIZE              R2  ;   FOR I:=1 UNTIL SIZE DO
CHKX1:                              ;   BEGIN
        MOV          X6         R3  ;     0.ADDR => W;
        IEQ          R3         R4  ;     IF W <> EXPW THEN
        JMP              CHKX2      ;     BEGIN
        MOV          R5         R3  ;       SAVE(LINK);
        JMP          S6  HEAD       ;       HEADING;
        MOV          R3         R5  ;       RESTORE(LINK);
        JMP              CHECK      ;       GOTO CHECK;
CHKX2:                              ;     END;
        ADDC  1                 R4  ;     EXPW+1 => EXPW;
        ADDC  1                 R6  ;     ADDR+1 => ADDR;
        SOB          R2  CHKX1      ;   END;
        JMP              0.     X5  ;   RETURN;

;READTM - READ ERRORS FROM TEST MODULE
;      CALL      EXIT
;R5    LINK      LINK
;R7              DESTROYED

READTM:                             ; READ TEST MODULE:
        MOVC  SAVE0+7           R7  ;
        STC   7                     ;   STACK REGISTERS;
        MOVC  RAMTM             R6  ;
        RIO          R3         R6  ;   *STATUS* => ERR;
        IBZ          R3  14         ;   IF ERR VALID THEN
        JMP              READTM1    ;   BEGIN
        JMP          S6  HEAD       ;     HEADING;
READTM2:                            ;     WHILE ERR VALID AND
        JMP          S6  CHECKB     ;     NOT STOP FROM OC DO
        JMP              READTM3    ;     BEGIN
        NOP                         ;
        JMP          S4  OUTTXNL    ;       WRITE(TEXT);
        <:RST ERR<0>:>              ;
READTM3:                            ;
        MOV          R3         R4  ;
        JMP          S5  HEXOUT     ;       WRITE(ERR);
        MOVC  RAMTM             R6  ;
        RIO          R3         R6  ;       *STATUS* => ERR;
        SBZ          R3  14         ;
        JMP              READTM2    ;     END;
READTM1:                            ;   END;
        MOVC  SAVE0             R7  ;
        UNS   6                     ;   UNSTACK REGISTERS;
        JMP              0.     X5  ;   RETURN; ;###
;HEAD - HEADING FOR DOUBLE ACCESS TEST
;      CALL      EXIT
;
;R0              DESTROYED
;R1              DESTROYED
;R2              DESTROYED
;R4              DESTROYED
;R5              DESTROYED
;R6    LINK      DESTROYED
;R7              LINK

HEAD:                               ; HEADING:
        MOV          R6         R7  ;   SAVE(LINK);
        JMP          S4  OUTTXNL    ;   WRITE(TEXT);
        <:PAUSE,BLOCK=<0>:>         ;
        MOV   SAVE10            R4  ;
        JMP          S5  HEXOUT     ;   WRITE(PAGE,PAUSE);
        MOV   SAVEWR            R2  ;
        IGE          R2  2          ;   IF 0.SAVEWR < 2 THEN
        JMP              HEAD1      ;   BEGIN
        JMP          S4  OUTTEXT    ;     WRITE(TEXT1);
        <: WR<0>:>                  ;   END
        JMP              HEAD2      ;   ELSE
HEAD1:                              ;   BEGIN
        JMP          S4  OUTTEXT    ;     WRITE(TEXT1A);
        <: RE<0>:>                  ;
HEAD2:                              ;   END;
        IBN          R2  0          ;   IF 0.SAVEWR IS EVEN THEN
        JMP              HEAD3      ;   BEGIN
        JMP          S4  OUTTEXT    ;     WRITE(TEXT2);
        <:/WR<0>:>                  ;   END
        JMP              HEAD4      ;   ELSE
HEAD3:                              ;   BEGIN
        JMP          S4  OUTTEXT    ;     WRITE(TEXT2A);
        <:/RE<0>:>                  ;
HEAD4:                              ;   END;
        JMP              0.     X7  ;   RETURN;
;###
;INPAR - INPUT A PARAMETER
;      CALL      EXIT
;
;R0              DESTROYED
;R1              DESTROYED
;R5    LINK      LINK
;R6              DESTROYED

INPAR:                              ; INPARAMETER:
        JMPI         S6 IINCHAR     ;   INCHAR;
        ADDC -<: :>             R1  ;   IF CHAR = <: :> THEN
        JOZ          R1  INPAR      ;     GOTO INPARAMETER;
        ADDC -<:L:>+<: :>       R1  ;
        IEQ          R1  <:W:>-<:L:>;   IF CHAR = <:W:> THEN
        JMP              1.     X5  ;     RETURN(W);
        IEQ          R1  <:R:>-<:L:>;   IF CHAR = <:R:> THEN
        JMP              0.     X5  ;     RETURN(R);
        JMPI            IERROR      ;   GOTO ERROR;
;###
;WRWR TEST
;      CALL      EXIT
;
;R0-R5           DESTROYED
;R6    LINK      DESTROYED
;R7              DESTROYED

WRWR:                               ; WRITEWRITE:
        MOV          R6  SAVE11     ;   SAVE(LINK);
        MOVC  0                 R0  ;   0 =>
        MOV          R0  SAVEWR     ;     0.SAVEWR;
        MOV   SAVE10            R0  ;   RESTORE(MODE);
        JMPI         S5 ISTARTW     ;   START TEST MODULE WRITE;
        JMPI         S5 IALOAD      ;   FOR I:=1,2 DO
        JMPI         S5 IALOAD      ;     LOAD ADDRESS INTO ADDRESS;
        MOVC  RAMTM             R6  ;
        RIO          R1         R6  ;   STOP TEST MODULE;
        JMPI         S5 ICHECKX     ;   CHECK FOR ADDRESS;
        JMPI             SAVE11     ;   RETURN;

;WRRE TEST
;      CALL      EXIT
;
;R0-R5           DESTROYED
;R6    LINK      DESTROYED
;R7              DESTROYED

WRRE:                               ; WRITEREAD:
        MOV          R6  SAVE11     ;   SAVE(LINK);
        JMPI         S5 ICLEAR      ;   CLEAR RAM;
        MOVC  1                 R0  ;   1 =>
        MOV          R0  SAVEWR     ;     0.SAVEWR;
        MOV   SAVE10            R0  ;   RESTORE(MODE);
        JMPI         S5 ISTARTW     ;   START TEST MODULE WRITE;
        MOVC  2                 R1  ;   FOR I:=1 UNTIL 2 DO
WRRE1:                              ;   BEGIN
        MOV   BAS               R6  ;
        NEG          R6             ;     SET ADDR;
        MOV   SIZE              R2  ;     FOR J:=1 UNTIL SIZE DO
WRRE2:                              ;     BEGIN
        MOV          X6         R3  ;       0.ADDR => W;
        ADDC  1                 R6  ;       ADDR+1 => ADDR;
        SOB          R2  WRRE2      ;     END;
        SOB          R1  WRRE1      ;   END;
        MOVC  RAMTM             R6  ;
        RIO          R1         R6  ;   STOP TEST MODULE;
        JMPI         S5 ICHECKX     ;   CHECK FOR ADDRESS;
        JMPI             SAVE11     ;   RETURN;
;###
;REWR TEST
;      CALL      EXIT
;
;R0-R5           DESTROYED
;R6    LINK      DESTROYED
;R7              DESTROYED

REWR:                               ; READWRITE:
        MOV          R6  SAVE11     ;   SAVE(LINK);
        JMPI         S5 ICLEAR      ;   CLEAR RAM;
        MOVC  2                 R0  ;   2 =>
        MOV          R0  SAVEWR     ;     0.SAVEWR;
        MOV   SAVE10            R0  ;   RESTORE(MODE);
        JMPI         S5 IALOAD      ;   LOAD ADDRESS;
        JMPI         S5 ISTARTR     ;   START TEST MODULE READ;
        JMPI         S5 IALOAD      ;   FOR I:=1,2 DO
        JMPI         S5 IALOAD      ;     LOAD ADDRESS;
        JMPI         S5 IREADTM     ;   READ ERRORS FROM TESTM.;
        JMPI         S5 ICHECKX     ;   CHECK FOR ADDRESS;
        JMPI             SAVE11     ;   RETURN;

;RERE TEST
;      CALL      EXIT
;R0-R5           DESTROYED
;R6    LINK      DESTROYED
;R7              DESTROYED

RERE:                               ; READREAD:
        MOV          R6  SAVE11     ;   SAVE(LINK);
        JMPI         S5 ICLEAR      ;   CLEAR RAM;
        MOVC  3                 R0  ;   3 =>
        MOV          R0  SAVEWR     ;     0.SAVEWR;
        MOV  SAVE10             R0  ;   RESTORE(MODE);
        JMPI         S5 IALOAD      ;   LOAD ADDRESS;
        JMPI         S5 ISTARTR     ;   START TESTMODULE READ;
        JMPI         S5 ICHECKX     ;   FOR I:=1,2 DO
        JMPI         S5 ICHECKX     ;     CHECK FOR ADDRESS;
        JMPI         S5 IREADTM     ;   READ ERRORS FROM TESTM.;
        JMPI             SAVE11     ;   RETURN;
;###
;PAGTST - TEST OF PAGESWITCH;
;      CALL      EXIT
;
;R0-R5           DESTROYED
;R6    LINK      DESTROYED
;R7              DESTROYED

PAGTST:                             ; PAGETEST:
        MOV          R6  SAVE12     ;   SAVE(LINK);
        MOV   BAS               R6  ;
        NEG          R6             ;   RESET ADDR;
        MOVC  0                 R3  ;   0 => PAGE;
PGT1:                               ; NEWPAGE:
        MOV          R3         R2  ;   PAGE => MSW;
        IEQ          R3  1          ;   IF PAGE = 1 THEN
        MOVC  2                 R2  ;     2 => MSW;
        IEQ          R3  2          ;   IF PAGE = 2 THEN
        MOVC  1                 R2  ;     1 => MSW;
        MOV          R2         R4  ;   MSW => CPAGE;
        SLL          R2  5          ;   MSW*32 => MSW;
        MOV   SAVE13            R0  ;   0.FIRSTBIT+MSW
        ADD          R0         R2  ;     => MSW;
        MOV   RE000             R0  ;
        LDS          R0             ;
        MOVC  SAVE0+7           R7  ;
        STC   6                     ;   STACK REGISTERS;
        JMPI         S5 IMSWSET     ;   SET MODULE SWITCH;
        MOVC  SAVE0             R7  ;
        UNS   6                     ;   UNSTACK REGISTERS;
        MOVC  0                 R1  ;   FOR TPAGE:=0 UNTIL 3 DO
PGT2:                               ;   BEGIN
        MOV          R1         R2  ;     TPAGE => PPAGE;
        MOV   RE000             R0  ;     #E000+PPAGE
        SLL          R2  2          ;       *4
        ADD          R2         R0  ;
        LDS          R0             ;        => PSW;
        IEQ          R1         R3  ;     IF PAGE = TPAGE THEN
        JMP              PGT3       ;     GOTO SP;
        MOV          X6         R0  ;     0.ADDR => W;
        JMP              PGT4       ;     IF NOT TIMEOUT PAGEFAULT;
        JMP              PGT5       ;     GOTO OK;
PGT3:                               ; SP:
        MOV          X6         R0  ;     0.ADDR => W;
        JMP              PGT5       ;     IF NOT TIMEOUT GOTO OK;
PGT4:   MOV   RE000             R0  ;
        LDS          R0             ;
        JMPI         S5 IPAGFAULT   ;     PAGEFAULT;
PGT5:                               ; OK:
        ADDC  1                 R1  ;
        ILT          R1  4          ;
        JMP              PGT2       ;   END;
        ADDC  1                 R3  ;   PAGE+1 => PAGE;
        ILT          R3  4          ;   IF PAGE <= 3 THEN
        JMP              PGT1       ;     GOTO NEWPAGE;
        MOV   RE000             R0  ;
        LDS          R0             ;   SET PAGE TO ZERO;
        JMPI             SAVE12     ;   RETURN;
;###
;----------------------------------------------------------------------
;
;                           F U N C T I O N S
;
;----------------------------------------------------------------------

INSERTREGISS:                       ; INSERT REGISTER DUMP:
        MOV   PROGRAM           R0  ;   PROGRAM.CUR
        ADDC  MREGS             R0  ;       +RE.PROCEDURE
        MODN  BAS                   ;
        MOV          R0  REGISS     ;         =>REGISTERS(ABS);
        JMP              START      ;   GOTO START;

;----------------------------------------------------------------------

LOADDATA:                           ; LOADDATA:
        JMPI         S5 IGETADR     ;   GETADDRESS;
        JMP              ERROR      ;   IF ERROR THEN GOTO ERROR;
        SUB         R4          R3  ;
LD0:                                ; LD0:
        JMPI         S6 IINCHAR     ;   GET CHARACTER;
        IEQP         R1  <:L:>      ;   L - DECR(RE.ADDRESS);
        ADDC -1                 R3  ;
        JMP              LD0        ;   GOTO LD0;
        IEQ          R1  <:S:>      ;   S - STOP INPUT;
        JMP              START      ;   GOTO START;
        JMPI         S5 IHEXIN1     ;   CONVERT TO HEX;
        JMP              LD0        ;   NO HEX CHAR: GOTO LD0;
        MOV          R1         R2  ;
        MOVC  3                 R4  ;   3 => COUNT;
LD1:                                ; LD1:
        JMPI         S5 IHEXIN      ;   GET HEX CHAR;
        JMP              ERROR      ;   IF ERROR THEN GOTO ERROR;
        SLL          R2  4          ;   HEX*16 => HEX;
        ADD          R1         R2  ;   CHAR+HEX => HEX;
        SOB          R4  LD1        ;   IF DECR(COUNT) <> 0 THEN
                                    ;   GOTO LD1;
        MOV          R2  0.     X3  ;   SAVE WORD;
        ADDC  1                 R3  ;   INCR(RE.ADDRESS);
        JMP              LD0        ;   GOTO NEW DATA(LD0);

;----------------------------------------------------------------------

FILL:                               ; FILL RAM WITH VALUE:
        JMPI         S5 IGETADR     ;   GET VALUE;
        JMP              ERROR      ; ERROR: GOTO ERROR;
        MOVC  LOCNP             R0  ;   NO PARITY ACTION =>
        MOV          R0  LOCACTION  ;     0.LOCAL ACTION;
        MOV          R3         R2  ;   VALUE => FILLVALUE;
        JMP          S5  CLEARX     ;   FILL WITH FILLVALUE;
        JMP              INCOMMAND  ;   GOTO INCOMMAND;

;----------------------------------------------------------------------

ADRFILL:                            ; FILL RAM WITH ADDRESS:
        MOVC  LOCACP            R0  ;
        MOV          R0  LOCACTION  ;   SET LOCAL ACTION;
        JMPI         S5 IALOAD      ;   FILL WITH ADDRESS;
        JMP              NEWCOM     ;   GOTO NEWCOMMAND;
;###
;----------------------------------------------------------------------

MLIST:                              ; DUMP, NO PAR. CHECK:
        MOVC  LOCSP             R0  ;   NO PAR ACTION =>
        MOV          R0  LOCACTION  ;     0.LOCAL ACTION;

;----------------------------------------------------------------------

MEMDUMP:                            ; MEMDUMP:
        JMPI         S5 IGETADR     ;   GET START ADDRESS;
        JMP              ERROR      ;   IF ERROR;
        MOV          R3  CURADR     ;   ADDRESS => 0.CURADR;
        JMPI         S6 IINCHAR     ;   INCHAR;
        MOVC  #FFFF             R3  ;   #FFFF=>TOP;
        SNEP         R1  <: :>      ;   IF CHAR="SP" THEN
        JMPI         S5 IGETADR     ;     GET TOP ADDRESS;
        JMP              START      ;       ERROR: GOTO START;
        MOV          R3  TOP        ;   TOP=>0.TOP;
                                    ;
;......................................................................
                                    ;
CMEMDUMP:                           ; CONTINUE MEMDUMP:
        JMPI         S5 INEXTLIN    ;   NEW LINE;
        MOV   CURADR            R4  ;   0.0.CURADR => RE.ADR;
        JMPI         S5 IHEXOUT     ;   OUTPUT RE.WORD;
        MOVC  <:L:>             R1  ;
        JMPI         S6 IOUTCHAR    ;
L1:                                 ; NEXT:
        MOV   CURADR            R3  ;   0.CURADR => RE.WORD;
        MOV          R3         R4  ;
        MODN  BAS                   ;
        MOV   0.     X4         R4  ;   0.CURADR => WORD;
        JMPI         S5 IHEXOUT     ;   OUTPUT WORD;
        ADDC  1                 R3  ;   INCR(RE.WORD);
        MOV          R3  CURADR     ;   RE.WORD => 0.CURADR;
        MOV   TOP               R4  ;   0.TOP=>TOP;
        ILO          R4         R3  ;   IF TOP<CURADR THEN
        JMP              START      ;     GOTO START;
        MOVC  OC                R0  ;   OC=>DEVICE;
        SIO          R1         R0  ;   SENSE(STATUS,DEVICE);
        IBN          R1  BPERR      ;   IF STATUS[BREAK] THEN
        JMP              START      ;     GOTO START;
        XTR          R3  3          ;   IF RE.WORD(2:3)<>0
        INE          R3  0          ;      THEN
        JMP              L1         ;      GOTO NEXT;
        JMP              CMEMDUMP   ;   GOTO CONTINUE MEMDUMP;

;----------------------------------------------------------------------

ADRCHECK:                           ; CHECK FOR ADDRESS:
        MOVC  LOCACP            R0  ;
        MOV          R0  LOCACTION  ;   SET LOCAL ACTION;
        JMPI         S5 ICHECK      ;   CHECK FOR ADDRESS;
        JMP             NEWCOM      ;   GOTO NEWCOMMAND;
;###
;----------------------------------------------------------------------

ENTERBASE:                          ; ENTER NEW BASE:
        JMPI         S5 IGETADR     ;   GET BASE ADDRESS;
        JMP              ERROR      ;     ERROR: GOTO ERROR;
        MOV          R3         R5  ;   
        SUB          R4         R5  ;   CHANGE TO BASE REL;
        MOV   PROGPOINTER       R6  ;   GET PROGRAM POINTER;
        SUB          R4         R6  ;   CHANGE TO BASE REL;
        MOVM         X6         X5  ;   MOV PROMBASE TO NEW BASE;
        ADDC -16                R5  ;
        MOV          R3  BAS.   X5  ;   INSERT NEW BASE;
        MOV          R3  BAS+1. X5  ;
        MOV          R3  4.     X5  ;   SETUP R4 IN NEW BASE;
        LDN          R3             ;   LOAD PROCESS(NEW BASE);

;----------------------------------------------------------------------

RUNPROG:                            ; RUNPROG:
        JMPI         S5 IGETADR     ;   GET PROCESS ADDRESS;
        JMP              ERROR      ; ERROR: GOTO ERROR;
        LDN          R3             ;   START PROCESS;

;----------------------------------------------------------------------

BOOT:                               ; ENTER BOOT LOADER:
        MOV   BOOTPOINTER       R0  ;   RE.BOOTBASE(ABS);
        LDN          R0             ;   LOAD BOOT LOADER;

;----------------------------------------------------------------------

TIMEOUT:                            ; TIMOUT TEST:
        MOVC  LOCALL            R0  ;   SURVIVE ALL =>
        MOV          R0  LOCACTION  ;     0.LOCAL ACTION;
        JMPI         S5 IGETADR     ;   GET ADDRESS;
        JMP              ERROR      ; ERROR:  GOTO ERROR;
        SUB          R4         R3  ;   ADDRESS - 0.BASE
        MOV          R3         R4  ;     => ADDRESS;
        JMP          S5  INPAR      ;   INPARAMETER;
        JMP              TIMEOUT4   ; R: GOTO SELECT READ;
                                    ; W: CONTINUE;
        JMPI         S5 IGETADR     ;   GET VALUE;
        JMP              ERROR      ; ERROR: GOTO ERROR;
        MODC  1                     ;   SELECT WRITE;
TIMEO4: MOVC  0                 R2  ; SELECT READ:
        MOV          R4         R1  ;   ADDRESS => ADDR;
TIMEOUT1:                           ; NEWREAD:
        JON          R2  TIMEOUT2   ;   IF READ THEN
        MOV          X1         R3  ;   0.ADDR => W;
        JMP              TIMEOUT3   ;   ELSE
TIMEOUT2:                           ;
        MOV          R3         X1  ;   VALUE => 0.ADDR;
        NOP                         ;
TIMEOUT3:                           ;
        JMPI         S6 ICHECKB     ;   CHECK FOR STOP FROM OC;
        JMP              NEWCOM     ; STOP: GOTO NEWCOMMAND;
        NOP                         ;
        JMP              TIMEOUT1   ; NOT STOP: GOTO NEWREAD;
        JMP              NEWCOM     ;   GOTO NEWCOMMAND;
;###
;----------------------------------------------------------------------

SEARCH:                             ; SEARCH FOR VALUE DIFF:
        JMPI         S5 IGETADR     ;   GET NORM VALUE;
        JMP              ERROR      ; ERROR: GOTO ERROR;
        MOVC  LOCACP            R0  ;   PAR LOC ACTION =>
        MOV          R0  LOCACTION  ;     0.LOCAL ACTION;
        MOV   BAS               R6  ;
        NEG          R6             ;   SET ADDR;
        MOV          R3         R4  ;
        MOV   SIZE              R2  ;   FOR I:=1 UNTIL SIZE DO
SEARCH1:                            ;   BEGIN
        MOV          X6         R3  ;     0.ADDR => VALUE;
        INE          R3         R4  ;     IF VALUE <> NORM VALUE THEN
        JMPI         S5 IDATFAULT   ;       DATAFAULT;
        ADDC  1                 R6  ;     ADDR+1 => ADDR;
        SOB          R2  SEARCH1    ;   END;
        JMP              NEWCOM     ;   GOTO NEWCOMMAND;

;----------------------------------------------------------------------

FIND:                               ; FIND VALUE:
        JMPI         S5 IGETADR     ;   GET VALUE;
        JMP              ERROR      ; ERROR: GOTO ERROR;
        MOVC  LOCNP             R0  ;   NO PAR. ACTION =>
        MOV          R0  LOCACTION  ;     0.LOCAL ACTION;
        MOV   BAS               R6  ;
        NEG          R6             ;   SET ADDR;
        MOV   SIZE              R2  ;   FOR I:=1 UNTIL SIZE DO
FIND1:                              ;   BEGIN
        MOV          X6         R4  ;     0.ADDR => VAL;
        INE          R3         R4  ;     IF VAL = VALUE THEN
        JMP              FIND2      ;     BEGIN
        MOVC  SAVE0+7           R7  ;
        STC   6                     ;       STACK REGISTERS;
        JMPI         S4 IOUTTXNL    ;       WRITE(TEXT);
        <:VALUE FOUND AT ADR<0>:>   ;
        MOV   SAVE6             R4  ;
        MOV   BAS               R3  ;
        ADD          R3         R4  ;       MAKE ADDR ABS;
        JMPI         S5 IHEXOUT     ;       WRITE(ADDR);
        JMPI         S6 ICHECKB     ;       CHECK FOR STOP;
        MOVC  1                 R2  ; STOP:
        MOV          R2  2.     X7  ;       1 => 0.SAVER2;
        UNS   6                     ; NOT STOP: UNSTACK REGISTERS;
FIND2:                              ;     END;
        ADDC  1                 R6  ;     ADDR+1 => ADDR;
        SOB          R2  FIND1      ;   END;
        JMP              NEWCOM     ;   GOTO NEWCOMMAND;
;###
;----------------------------------------------------------------------
;
;                               T E S T S
;
;----------------------------------------------------------------------

TEST1:                              ; READ MODULE TEST:
        JMPI         S4 IOUTTXNL    ;   WRITE(TEXT);
        <:TIMING TEST<0>:>          ;
        MOVC  2#0000001         R2  ;   2#0000001 => MSW;
        JMPI         S5 IMSWSET     ;   SET MODULESWITCH;
        MOVC  LOCNP             R0  ;   NO PARITY CHECK =>
        MOV          R0  LOCACTION  ;    0.LOCAL ACTION;
        JMPI         S5 ICLEAR      ;   CLEAR RAM;
        MOV   TADR              R6  ;   0.TESTADR
        MOVC  BAS               R5  ;     -0.BAS
        SUB          X5         R6  ;     => ADRABS;
TEST1A:                             ; READ:
        MOV          X6         R0  ;   0.ADRABS => W;
        MOVC  OC                R1  ;
        SIO          R1         R1  ;   SENSE TERMINAL;
        IBZ          R1  BPERR      ;   IF NOT "BREAK" THEN
        JMP              TEST1A     ;      GOTO READ;
        JMP              NEWCOM     ;   GOTO INCOMMAND;
;###
;----------------------------------------------------------------------

TEST2:                              ; ADDRESS CHECK:
        JMPI         S4 IOUTTXNL    ;   WRITE(TEXT);
        <:ADDRESS CHECK<0>:>        ;
        MOVC  LOCNP             R0  ;
        MOV          R0  LOCACTION  ;   NO PAR CHECK => 0.LOCAL ACTION;
        JMPI         S5 ICLEAR      ;   CLEAR RAM;
        MOV   BAS               R6  ;
        NEG          R6             ;   SET ADDR;
        MOV   SIZE              R1  ;
        MOVC  0                 R0  ;   0 => DATA;
TEST2A:                             ;   FOR I:=1 UNTIL SIZE DO
                                    ;   BEGIN
        MOV          X6         R2  ;     0.ADDR => W
        INE          R2  0          ;     IF W <> 0 THEN
        JMPI         S5 IADRFAULT   ;       ADDRESSFAULT;
        MOV          R0         X6  ;     DATA => 0.ADDR;
        MOV          X6         R2  ;     0.ADDR => W;
        INE          R2         R0  ;     IF W <> DATA THEN
        JMPI         S5 IADRFAULT   ;       ADDRESSFAULT;
        ADDC  1                 R6  ;     ADDR+1 => ADDR;
        ADDC  1                 R0  ;     DATA+1 => DATA;
        SOB          R1  TEST2A     ;   END;
        JMPI         S5 ICHECK      ;   CHECK FOR ADDRESS IN ADDRESS;
        MOVC  LOCNT             R0  ;
        MOV          R0  LOCACTION  ;   SPEC TIMEOUT => 0.LOCAL ACTION;
        MOV   RE000             R1  ;
        MOV   SIZE              R6  ;
        SUB          R6         R1  ;
        MOV   BAS               R5  ;
        SUB          R5         R6  ;
TEST2B:                             ;   FOR I:=SIZE UNTIL #E000 DO
                                    ;   BEGIN
        MOV          X6         R2  ;     0.ADDR => W;
        JMPI         S5 IADRFAULT   ;     IF NOT TIMEOUT ADDRESSFAULT;
        ADDC  1                 R6  ;     ADDR+1 => ADDR;
        SOB          R1  TEST2B     ;   END;
        JMP              NEWCOM     ;   GOTO NEWCOMMAND;
;###
;----------------------------------------------------------------------

TEST3:                              ; DATATEST:
        JMPI         S4 IOUTTXNL    ;   WRITE(TEXT);
        <:CHECKERBOARD TEST<0>:>    ;
        MOVC  LOCNP             R0  ;   NO PAR. ACTION =>
        MOV          R0  LOCACTION  ;     0.LOCAL ACTION;
        MOV   R5555             R0  ;
        MOV   RAAAA             R1  ;
        MOV   BAS               R6  ;
        NEG          R6             ;   SET ADDR;
        MOV          R6         R7  ;
        MOVC  8                 R2  ;   FOR I:=1 UNTIL 8 DO
TEST3A:                             ;   BEGIN
        MOVL         R01 0.     X7  ;     SET CHECKERBOARD IN
        ADDC  2                 R7  ;      0,1.ADDR;
        SOB          R2  TEST3A     ;   END;
        MOVC  LOCMVM            R3  ;   NO PAR. ACTION FOR MOVM =>
        MOV          R3  LOCACTION  ;     0.LOCAL ACTION;
        MOV   SIZE              R2  ;
        SRL          R2  4          ;
        ADDC -1                 R2  ;   FOR I:=1 UNTIL SIZE/16-1 DO
TEST3C:                             ;   BEGIN
        MOVM         X6         X7  ;     MOV 16 WORDS;
        SOB          R2  TEST3C     ;   END;
        MOV   BAS               R6  ;
        NEG          R6             ;   SET ADDR;
        MOVC  LOCACP            R7  ;   NORM LOC ACTION =>
        MOV          R7  LOCACTION  ;     0.LOCAL ACTION;
        MOV   SIZE2             R2  ;
TEST3B:                             ;   DO FOR ALL EVEN ADDRESSES
                                    ;   BEGIN
        MOVL  0.     X6         R34 ;     GET W0,W1;
        IEQ          R0         R3  ;     IF W0,W1 IS NOT
        INE          R1         R4  ;       CHECKERBOARD THEN
        JMPI         S5 IDATFAULT   ;       DATAFAULT;
        ADDC  2                 R6  ;
        SOB          R2  TEST3B     ;   END;
        JMP              NEWCOM     ;   GOTO NEWCOMMAND;
;###
;----------------------------------------------------------------------

TEST4:                              ; REFRESH TEST:
        JMPI         S4 IOUTTXNL    ;   WRITE(TEXT):
        <:REFRESH TEST<0>:>         ;
        MOVC  LOCACP            R0  ;   NORM LOC ACTION =>
        MOV          R0  LOCACTION  ;     0.LOCAL ACTION;
        MOVC  0                 R0  ;
TEST4A: MOVC  10                R1  ;   WAIT APP. 1 SEC;
TEST4B: SOB          R1  TEST4B     ;
        SOB          R0  TEST4A     ;
        MOV   BAS               R6  ;
        NEG                     R6  ;   SET ADDR;
        MOV   R5555             R0  ;
        MOV   RAAAA             R1  ;
        MOV   SIZE2             R2  ;
TEST4C:                             ;   DO FOR ALL EVEN ADDRESSES
                                    ;   BEGIN
        MOVL  0.     X6         R34 ;     0.ADDR => W0,W1;
        IEQ          R0         R3  ;     IF W0,W1 IS NOT
        INE          R1         R4  ;       CHECKERBOARD THEN
        JMPI         S5 IDATFAULT   ;       DATAFAULT;
        ADDC  2                 R6  ;     ADDR+2 => ADDR;
        SOB          R2  TEST4C     ;   END;
        JMP              NEWCOM     ;   GOTO NEWCOMMAND;
;###
;----------------------------------------------------------------------

MSW04:                              ; MODULE SWITCH TEST, 4K:
        JMPI         S4 IOUTTXNL    ;   WRITE(TEXT);
        <:MSW TEST<0>:>             ;
        MOVC  LOCNT             R0  ;   SPEC TIMEOUT =>
        MOV          R0  LOCACTION  ;     0.LOCAL ACTION;
        MOVC  0                 R2  ;
        MOVC  14                R3  ;   FOR 4KMODULE:=0 UNTIL 13 DO
MSW04A:                             ;   BEGIN
        MOV   BAS               R6  ;
        NEG          R6             ;     SET START ADR;
        MOVC  SAVE0+7           R7  ;
        STC   6                     ;     STACK REGISTERS;
        JMPI         S5 IMSWSET     ;     SET MODULE SWITCH;
        MOVC  SAVE0             R7  ;
        UNS   6                     ;     UNSTACK REGISTERS;
        MOV          R2         R4  ;     MODULE
        SLL          R4  11         ;        *1024 => ADR1;
        ADD          R6         R4  ;     MAKE ADR1 ABS;
        MOVC  14                R1  ;     FOR M:=0 UNTIL 13 DO
MSW04B:                             ;     BEGIN
        INE          R6         R4  ;       IF ADR1=ADDR THEN
        JMP              MSW04C     ;       BEGIN
        MOV          X6         R0  ;         0.ADDR => W;
        JMP              MSW04D     ;         IF TIMEOUT THEN
        JMPI         S5 IADRFAULT   ;          ADDRESSFAULT;
        JMP              MSW04D     ;       END
MSW04C:                             ; ELSE  BEGIN
        MOV          X6         R0  ;         0.ADDR => W;
        JMPI         S5 IADRFAULT   ;         IF NOT TIMEOUT THEN
                                    ;            ADDRESSFAULT;
MSW04D:                             ;       END;
        MOV   R1000             R0  ;
        ADD          R0         R6  ;       ADDR+#1000 => ADDR;
        SOB          R1  MSW04B     ;     END;
        ADDC  2                 R2  ;     MSW+2 => MSW;
        SOB          R3  MSW04A     ;   END;
        MOVC  0                 R2  ;   0 =>
        MOV          R2  SAVE13     ;     0.FIRSTBIT;
        JMPI         S6 IPAGTST     ;   PAGETEST;
        JMP              NEWCOM     ;   GOTO NEWCOMMAND;
;###
;----------------------------------------------------------------------

MSW16:                              ; MODULE SWITCH TEST, 16K:
        JMPI         S4 IOUTTXNL    ;   WRITE(TEXT);
        <:MSW TEST<0>:>             ;
        MOVC  LOCNT             R0  ;   SPEC TIMEOUT =>
        MOV          R0  LOCACTION  ;     0.LOCAL ACTION;
        MOVC  0                 R2  ;
        MOVC  4                 R3  ;   FOR MODULE:=0 UNTIL 3 DO
MSW16A:                             ;   BEGIN
        MOV   BAS               R6  ;
        NEG          R6             ;     SET START ADR;
        MOVC  SAVE0+7           R7  ;
        STC   6                     ;     STACK REGISTERS;
        JMPI         S5 IMSWSET     ;     SET MODULE SWITCH;
        MOVC  SAVE0             R7  ;
        UNS   6                     ;     UNSTACK REGISTERS;
        MOV          R2         R4  ;     MODULE
        SLL          R4  11         ;        *1024 => ADR1;
        ADD          R6         R4  ;     MAKE ADR1 ABS;
        MOVC  4                 R1  ;     FOR M:=0 UNTIL 3 DO
MSW16B:                             ;     BEGIN
        IEQ          R6         R4  ;       IF ADR1<>ADDR THEN
        JMP              MSW16C     ;       BEGIN
        MOV          X6         R0  ;         0.ADDR => W;
        JMP              MSW16D     ;         IF TIMEOUT THEN
        JMPI         S5 IADRFAULT   ;          ADDRESSFAULT;
        JMP              MSW16D     ;       END
MSW16C:                             ; ELSE  BEGIN
        MOV          X6         R0  ;         0.ADDR => W;
        JMPI         S5 IADRFAULT   ;         IF NOT TIMEOUT THEN
                                    ;            ADDRESSFAULT;
MSW16D:                             ;       END;
        MOV   R1000             R0  ;
        ADD          R0         R6  ;       ADDR+#1000 => ADDR;
        SOB          R1  MSW16B     ;     END;
        ADDC  2                 R2  ;     MSW+2 => MSW;
        SOB          R3  MSW16A     ;   END;
;###
        MOVC  0                 R2  ;
        MOVC  3                 R3  ;   FOR 16KMODULE:=0 UNTIL 2 DO
MS16A:                              ;   BEGIN
        MOV   BAS               R6  ;
        NEG          R6             ;     SET START ADR;
        MOVC  SAVE0+7           R7  ;
        STC   6                     ;     STACK REGISTERS;
        ADDC  1                 R2  ;     MSW+1 => MSW;
        JMPI         S5 IMSWSET     ;     SET MODULE SWITCH;
        MOVC  SAVE0             R7  ;
        UNS   6                     ;     UNSTACK REGISTERS;
        MOV          R2         R4  ;     MODULE
        SLL          R4  11         ;        *1024 => ADR1;
        ADD          R6         R4  ;     MAKE ADR1 ABS;
        MOVC  3                 R1  ;     FOR M:=0 UNTIL 2 DO
MS16B:                              ;     BEGIN
        INE          R6         R4  ;       IF ADR1=ADDR THEN
        JMP              MS16C      ;       BEGIN
        MOV          X6         R0  ;         0.ADDR => W;
        JMP              MS16D      ;         IF TIMEOUT THEN
        JMPI         S5 IADRFAULT   ;          ADDRESSFAULT;
        JMP              MS16D      ;       END
MS16C:                              ; ELSE  BEGIN
        MOV          X6         R0  ;         0.ADDR => W;
        JMPI         S5 IADRFAULT   ;         IF NOT TIMEOUT THEN
                                    ;            ADDRESSFAULT;
MS16D:                              ;       END;
        MOV   R4000             R0  ;
        ADD          R0         R6  ;       ADDR+#4000 => ADDR;
        SOB          R1  MS16B      ;     END;
        ADDC  8                 R2  ;     MSW+8 => MSW;
        SOB          R3  MS16A      ;   END;
        MOVC  2#00001           R2  ;   2#00001 =>
        MOV          R2  SAVE13     ;     0.FIRSTBIT;
        JMPI         S6 IPAGTST     ;   PAGETEST;
        JMP             NEWCOM      ;   GOTO NEWCOMMAND;
;###
;----------------------------------------------------------------------

MSW32:                              ; MODULE SWITCH TEST, 32K:
        JMPI         S4 IOUTTXNL    ;   WRITE(TEXT);
        <:MSW TEST<0>:>             ;
        MOVC  LOCNT             R0  ;   SPEC TIMEOUT =>
        MOV          R0  LOCACTION  ;     0.LOCAL ACTION;
        MOVC  0                 R2  ;
        MOVC  8                 R3  ;   FOR MODULE:=0 UNTIL 7 DO
MSW32A:                             ;   BEGIN
        MOV   BAS               R6  ;
        NEG          R6             ;     SET START ADR;
        MOVC  SAVE0+7           R7  ;
        STC   6                     ;     STACK REGISTERS;
        JMPI         S5 IMSWSET     ;     SET MODULE SWITCH;
        MOVC  SAVE0             R7  ;
        UNS   6                     ;     UNSTACK REGISTERS;
        MOV          R2         R4  ;     MODULE
        SLL          R4  11         ;        *1024 => ADR1;
        ADD          R6         R4  ;     MAKE ADR1 ABS;
        MOVC  8                 R1  ;     FOR M:=0 UNTIL 7 DO
MSW32B:                             ;     BEGIN
        IEQ          R6         R4  ;       IF ADR1<>ADDR THEN
        JMP              MSW32C     ;       BEGIN
        MOV          X6         R0  ;         0.ADDR => W;
        JMP              MSW32D     ;         IF TIMEOUT THEN
        JMPI         S5 IADRFAULT   ;          ADDRESSFAULT;
        JMP              MSW32D     ;       END
MSW32C:                             ; ELSE  BEGIN
        MOV          X6         R0  ;         0.ADDR => W;
        JMPI         S5 IADRFAULT   ;         IF NOT TIMEOUT THEN
                                    ;            ADDRESSFAULT;
MSW32D:                             ;       END;
        MOV   R1000             R0  ;
        ADD          R0         R6  ;       ADDR+#1000 => ADDR;
        SOB          R1  MSW32B     ;     END;
        ADDC  2                 R2  ;     MSW+2 => MSW;
        SOB          R3  MSW32A     ;   END;
        MOVC  2#00001           R2  ;   2#00001 =>
        MOV          R2  SAVE13     ;     0.FIRSTBIT;
        JMPI         S6 IPAGTST     ;   PAGETEST;
;###
        MOVC  2#1110001         R2  ;   2#1110001 => MSW;
        JMPI         S5 IMSWSET     ;   SET MODULE SWITCH;
        MOV   R8000             R4  ;
        MOV   BAS               R6  ;
        SUB          R6         R4  ;   SET ADDR1;
        NEG          R6             ;   SET ADDR;
        MOVC  16                R1  ;   FOR I:=1 UNTIL 16 DO
MSW32I:                             ;   BEGIN
        MOV   RE00C             R0  ;
        LDS          R0             ;     3 => PAGE(PSW);
        ILO          R1  9          ;     IF ADDR < ADDR THEN
        JMP              MSW32J     ;     BEGIN
        MOV          X6         R0  ;       0.ADDR => W;
        JMP              MSW32L     ;       IF NOT TIMEOUT ADRFAULT;
        JMP              MSW32K     ;     END ELSE
MSW32J:                             ;     BEGIN
        MOV          X6         R0  ;       0.ADDR => W;
        JMP              MSW32K     ;       IF TIMEOUT THEN
MSW32L:                             ;
        MOV   RE000             R0  ;
        LDS          R0             ;
        JMPI         S5 IADRFAULT   ;        ADRFAULT;
MSW32K:                             ;     END;
        MOV   R1000             R0  ;     ADDR + #1000
        ADD          R0         R6  ;       => ADDR;
        SOB          R1  MSW32I     ;   END;
        MOV   RE000             R0  ;
        LDS          R0             ;   SET TO PAGE ZERO;
        JMP              NEWCOM     ;   GOTO NEWCOMMAND;
;###
;----------------------------------------------------------------------

TEST6:                              ; SPEED TEST:
        JMPI         S4 IOUTTXNL    ;   WRITE(TEXT);
        <:SPEED TEST<0>:>           ;
        MOVC  2#0000001         R2  ;   2#0000001 => MSW;
        JMPI         S5 IMSWSET     ;   SET MODULE SWITCH;
        MOVC  LOCMVMP           R0  ;   PAR.CHECK FOR MOVM =>
        MOV          R0  LOCACTION  ;     0.LOCAL ACTION;
        MOV   SIZE3             R0  ;   FOR I:=1 UNTIL 32M/SIZE DO
TEST6A:                             ;   BEGIN
        MOV   BAS               R6  ;
        MOV   SIZE2             R7  ;
        SUB          R6         R7  ;     SET ADDR1;
        NEG          R6             ;     SET ADDR;
        MOV   SIZE4             R1  ;     FOR J:=1 UNTIL SIZE/512 DO
TEST6B:                             ;     BEGIN
        MOVM         X6         X7  ;       MOV 16 WORDS;
        MOVM         X6         X7  ;       MOV 16 WORDS;
        MOVM         X6         X7  ;       MOV 16 WORDS;
        MOVM         X6         X7  ;       MOV 16 WORDS;
        MOVM         X6         X7  ;       MOV 16 WORDS;
        MOVM         X6         X7  ;       MOV 16 WORDS;
        MOVM         X6         X7  ;       MOV 16 WORDS;
        MOVM         X6         X7  ;       MOV 16 WORDS;
        MOVM         X6         X7  ;       MOV 16 WORDS;
        MOVM         X6         X7  ;       MOV 16 WORDS;
        MOVM         X6         X7  ;       MOV 16 WORDS;
        MOVM         X6         X7  ;       MOV 16 WORDS;
        MOVM         X6         X7  ;       MOV 16 WORDS;
        MOVM         X6         X7  ;       MOV 16 WORDS;
        MOVM         X6         X7  ;       MOV 16 WORDS;
        MOVM         X6         X7  ;       MOV 16 WORDS;
        SOB          R1  TEST6B     ;     END;
        SOB          R0  TEST6A     ;   END;
        MOVC  7                 R1  ;
        JMPI         S6 IOUTCHAR    ;   OUTPUT BELL;
        JMP              NEWCOM     ;   GOTO NEWCOMMAND;
;###
;----------------------------------------------------------------------

TEST7:                              ; FAST ADDR INVERT TEST:
        JMPI         S4 IOUTTXNL    ;   WRITE(TEXT);
        <:FAST ADDR INVERT TEST<0>:>;
        MOVC  LOCACP            R0  ;
        MOV          R0  LOCACTION  ;
        JMPI         S5 IALOAD      ;   SET ADDR IN ADDR;
        MOV   BAS               R6  ;
        MOV   SIZE              R7  ;
        ADDC -1                 R7  ;
        SUB          R6         R7  ;   SET ADDR1;
        NEG          R6             ;   SET ADDR;
        MOV   SIZE2             R1  ;
TEST7A:                             ;   FOR I:=1 UNTIL SIZE/2 DO
                                    ;   BEGIN
        MOV          X6         R4  ;     0.ADDR => W;
        MOV          X6         X7  ;     0.ADDR => 0.ADDR1;
        XCH          R6         R7  ;
        MOV          X6         R3  ;     0.ADDR1 => W1;
        XCH          R6         R7  ;
        INE          R4         R3  ;     IF W <> W1 THEN
        JMPI         S5 IADRFAULT   ;       ADDRESSFAULT;
        ADDC  1                 R6  ;     ADDR+1 => ADDR;
        ADDC -1                 R7  ;     ADDR1-1 => ADDR1;
        SOB          R1  TEST7A     ;   END;
        JMP              NEWCOM     ;   GOTO NEWCOMMAND;
;###
;----------------------------------------------------------------------

TEST8:                              ; BIT EXERCISE:
        JMPI         S4 IOUTTXNL    ;   WRITE(TEXT);
        <:BIT EXERCISE<0>:>         ;
        MOVC  LOCACP            R0  ;
        MOV          R0  LOCACTION  ;
        MOVC  0                 R0  ;   FOR BIT:=0 UNTIL 15 DO
TEST8A:                             ;   BEGIN
        MOV   BAS               R6  ;
        NEG          R6             ;     SET ADDR;
        MOV   SIZE              R2  ;     FOR I:=1 UNTIL SIZE DO
TEST8B:                             ;     BEGIN
        MOVC  0                 R4  ;       0 => W;
        SETS         R4         R0  ;       1 => W(BIT:1);
        MOV          R4         X6  ;       W => 0.ADDR;
        MOV          X6         R3  ;       0.ADDR => W1;
        INE          R3         R4  ;       IF W <> W1 THEN
        JMPI         S5 IDATFAULT   ;         DATAFAULT;
        ADDC  1                 R6  ;       ADDR+1 => ADDR;
        SOB          R2  TEST8B     ;     END;
        ADDC  1                 R0  ;
        IBZ          R0  4          ;
        JMP              TEST8A     ;   END;
        JMP              NEWCOM     ;   GOTO NEWCOMMAND;
;###
;----------------------------------------------------------------------

TEST9:                              ; BYTE ADDRESSSING TEST:
        JMPI         S4 IOUTTXNL    ;   WRITE(TEXT);
        <:BYTE TEST<0>:>            ;
        MOVC  LOCACP            R0  ;
        MOV          R0  LOCACTION  ;
        MOV   BAS               R6  ;
        NEG          R6             ;   SET ADDR;
        MOV   R1234             R0  ;   #1234 => WORD;
        MOVC  0                 R1  ;   0 => BYTEADDR;
        MOV   SIZE              R2  ;   FOR I:=1 UNTIL SIZE DO
TEST9A:                             ;   BEGIN
        MOV          R0         X6  ;     WORD => 0.ADDR;
        MOVC  #AB               R3  ;     #AB => BYTE;
        MOV          R1         R5  ;
        MODN  BAS                   ;
        MOVB         R3  0.     X5  ;     BYTE => 0.BYTEADDR(ABS);
        MOV   R12AB             R4  ;     #12AB => EXPW;
        MOV   0.     X6         R3  ;     0.ADDR => W;
        INE          R4         R3  ;     IF EXPW <> W THEN
        JMPI         S5 IDATFAULT   ;       DATAFAULT;
        MOVC  #CD               R3  ;     #CD => BYTE;
        MOV          R1         R5  ;
        MODN  BAS                   ;
        MOVB         R3  1.     X5  ;     BYTE => 1.BYTEADDR(ABS);
        MOV   RCDAB             R4  ;     #CDAB => EXPW;
        MOV   0.     X6         R3  ;     0.ADDR => W;
        INE          R4         R3  ;     IF EXPW <> W THEN
        JMPI         S5 IDATFAULT   ;       DATAFAULT;
        MOV          R1         R5  ;
        MODN  BAS                   ;
        MOVB  0.     X5         R3  ;     0.BYTEADDR(ABS) => W;
        MOVC  #AB               R4  ;     #AB => EXPW;
        INE          R4         R3  ;     IF EXPW <> W THEN
        JMPI         S5 IDATFAULT   ;       DATAFAULT;
        MOV          R1         R5  ;
        MODN  BAS                   ;
        MOVB  1.     X5         R3  ;     1.BYTEADDR(ABS) => W;
        MOVC  #CD               R4  ;     #CD => EXPW;
        INE          R4         R3  ;     IF EXPW <> W THEN
        JMPI         S5 IDATFAULT   ;       DATAFAULT;
        ADDC  1                 R6  ;     ADDR+1 => ADDR;
        ADDC  2                 R1  ;     BYTEADDR+2 => BYTEADDR;
        SOB          R2  TEST9A     ;   END;
        JMP              NEWCOM     ;   GOTO NEWCOMMAND;
;###
;----------------------------------------------------------------------

TESTD:                              ; TEST DOUBLE ACCESS:
        MOV   SIZE              R2  ;
        IBN          R2  15         ;   IF 0.SIZE >= 32 K THEN
        JMP              ERROR      ;     GOTO ERROR;
        JMPI         S4 IOUTTXNL    ;   WRITE(TEXT);
        <:DOUBLE ACCESS TEST<0>:>   ;
        JMPI         S4 IOUTTXNL    ;   WRITE(TEXT);
        <:RST: SUBBUS, CPU: MAINBUS<0>:>
        MOVC  LOCACP            R0  ;
        MOV          R0  LOCACTION  ;
        IBZ          R2  14         ;   IF 0.SIZE < 16 K THEN
        MODC  #10                   ;   16 => MODE ELSE
        MOVC  0                 R0  ;   0 => MODE;
TESTD1:                             ; NEWMODE:
        MOV          R0  SAVE10     ;   SAVE(MODE);
        JMPI         S6 IWRWR       ;   TEST WRITEWRITE;
        JMPI         S6 IWRRE       ;   TEST WRITEREAD;
        JMPI         S6 IREWR       ;   TEST READWRITE;
        JMPI         S6 IRERE       ;   TEST READ READ;
        MOV   SAVE10            R0  ;   RESTORE(MODE);
        ADDC  2                 R0  ;   MODE+2 => MODE;
        IBZ          R0  7          ;   IF MODE < 128 THEN
        JMP              TESTD1     ;     GOTO NEWMODE;
        JMP              NEWCOM     ;   GOTO NEWCOMMAND;
;###
;----------------------------------------------------------------------

PAGEMODE:                           ; PAGEMODE TEST:
        MOV   SIZE              R1  ;   IF 0.SIZE = 16 K
        IBZ          R1  14         ;   THEN
        JMP              ERROR      ;   GOTO ERROR;
        JMPI         S4 IOUTTXNL    ;   WRITE(TEXT);
        <:BLOCKMODE TEST<0>:>       ;
        MOVC  LOCACP            R0  ;
        MOV          R0  LOCACTION  ;
        MOVC  1                 R0  ;   1 =>
        MOV          R0  SAVE10     ;     0.MODE;
        JMPI         S6 IWRWR       ;   TEST WRITEWRITE;
        JMPI         S6 IWRRE       ;   TEST WRITEREAD;
        JMPI         S6 IREWR       ;   TEST READWRITE;
        JMPI         S6 IRERE       ;   TEST READREAD;
        JMP              NEWCOM     ;   GOTO NEWCOMMAND;

;----------------------------------------------------------------------

BLOCKTIME:                          ; BLOCKMODE TIMING TEST:
        MOV   SIZE              R1  ;   IF 0.SIZE
        IBZ          R1  14         ;     <> 16 K THEN
        JMP              ERROR      ;     GOTO ERROR;
        JMPI         S4 IOUTTXNL    ;   WRITE(TEXT);
        <:BLOCKMODE TIMING TEST<0>:>;
        MOVC  LOCACP            R0  ;
        MOV          R0  LOCACTION  ;
        MOVC  1                 R0  ;   BLOCKMODE => 
        MOV          R0  SAVE10     ;     0.MODE;
        JMPI         S5 ISTARTW     ;   START RST WRITE;
BLKT0:                              ; TEST:
        JMPI         S6 ICHECKB     ;   IF BREAK FROM OC THEN
        JMP              BLKT1      ;     GOTO STOP
        NOP                         ;
        JMP              BLKT0      ;   GOTO TEST;
        JMPI         S5 IREADTM     ;   READ ERRORS FROM RST;
        JMP              NEWCOM     ;   GOTO NEWCOMMAND;
;###
;----------------------------------------------------------------------

PARTDOUBLE:                         ; PART OF DOUBLE ACCESS TEST:
        MOV   SIZE              R0  ;   IF 0.SIZE
        IBN          R0  15         ;     >= 32 K THEN
        JMP              ERROR      ;     GOTO ERROR;
        MOVC  LOCACP            R0  ;
        MOV          R0  LOCACTION  ;
        JMPI         S5 IINPAR      ;   INPARAMETER;
        MODC  2                     ; R:   TEST MODULE READ;
        MOVC  0                 R4  ; W:   TEST MODULE WRITE;
        JMPI         S5 IINPAR      ;   INPARAMETER;
        ADDC  1                 R4  ; R:   CPU READ;
                                    ; W:   CPU WRITE;
        JMPI         S5 IGETADR     ;   GET PAGE,PAUSE;
        JMP              ERROR      ;   ERROR: GOTO ERROR;
        XTR          R3  7          ;
        MOV          R3  SAVE10     ;   SAVE(MODE);
        JMP          S6  PD1        ;   SET RETURN ADDRESS;
        JMP              NEWCOM     ;   GOTO NEWCOMMAND;
PD1:                                ; SELECT TEST:
        MOD          R4             ;
        JMP              LOC+1      ;
        JMPI            IWRWR       ;
        JMPI            IWRRE       ;
        JMPI            IREWR       ;
        JMPI            IRERE       ;
;###
;----------------------------------------------------------------------

TESTCH:                             ; CHANGE ACCESS:
        JMPI         S4 IOUTTXNL    ;   WRITE(TEXT);
        <:CHANGE BUS ACCESS: <0>:>  ;
        JMPI         S6 IINCHAR     ;   INCHAR;
        ADDC  -<:N:>            R1  ;   IF CHAR <> <:N:>
        JON          R1  TESTCH     ;     THEN GOTO CHANGE ACCESS;
        JMP              ON         ;   GOTO NEW TEST;
                                    ;
                                    ;

TESTEND1:                           ; TESTEND:
        JMPI         S4 IOUTTXNL    ;   WRITE(TEXT);
        <:RAM TEST END<0>:>         ;
        JMP              INCOMMAND  ;   GOTO INCOMMAND;
                                    ;
                                    ;
TESTEND2:                           ; TEST END CATCH:
        MOVC  TESTNR            R6  ;   TESTNO => ADDR;
        DEC              0.     X6  ;   0.ADDR-1 => 0.ADDR;
        JMP              INCOMMAND  ;   GOTO INCOMMAND;
                                    ;
                                    ;
ON:                                 ; NEW TEST:
        MOVC  TESTNR            R6  ;
        INC              0.     X6  ;   0.TESTNO+1 => 0.TESTNO;
REP:                                ; SAME TEST:
        MOD   TESTNR                ;
        MOD   TESTOFF               ;
        JMPI             TESTS      ;   GOTO TEST(TESTNO,SIZE);
;###
;----------------------------------------------------------------------
;
;                        I / O   C O M M A N D S
;
;----------------------------------------------------------------------

;DEVSET - SET DEVICE AND COMMAND
;      CALL      EXIT
;
;R0-R1           DESTROYED
;R2              DEVICE AND COMMAND
;R3              DEVICE
;R4    LINK      LINK
;R5-R7           DESTROYED

DEVSET:                             ; SET DEVICECOMMAND;
        JMPI         S5 IGETADR     ;   GET COMMAND;
        JMP              ERR1       ; ERR1: GOTO ERROR;
        SLL          R3  6          ;   COMMAND < 6
        MOV   DEVICE            R2  ;     + 0.DEVICE
        ADD          R3         R2  ;     => DEVICE AND COMMAND;
        JMP              0.     X4  ;   RETURN;

;INTTABLE - INITIATE INTERRUPT TABLE
;      CALL      EXIT
;
;R0-R2           DESTROYED
;R3    IBASE     IBASE
;R4-R5           DESTROYED
;R6    LINK      LINK

INTTABLE:                           ; SET INTERRUPT TABLE:
        MOV   R015C             R0  ;   #015C(JMP LOC) => INTADR;
        MOV   BAS               R4  ;
        MOV          R0         R5  ;   INTADR -
        SUB          R4         R5  ;     0.BASE => RELADR;
        NEG          R4             ;
        MOVC  0                 R1  ;   0 => PROCWORD;
        MOVC  64                R2  ;   FOR I:=1 UNTIL 64 DO
INTTABLE1:                          ;   BEGIN
        MOV          R1  0.     X4  ;     PROCWORD => 0.(I-1-0.BASE);
        MOV          R3  0.     X5  ;     IBASE => 0.RELADR;
        INCD         R4         R5  ;     RELADR+1 => RELADR;
        SOB          R2  INTTABLE1  ;   END;
        ADDC  -64               R4  ;   - 0.BASE => RELADR;
        MOV          R0  0.     X4  ;   JMP LOC => 0.RELADR;
        MOV          R0  1.     X4  ;   JMP LOC => 1.RELADR;
        MOV          R0  2.     X4  ;   JMP LOC => 2.RELADR;
        MOV          R0  3.     X4  ;   JMP LOC => 3.RELADR;
        JMP              0.     X6  ;   RETURN;

;----------------------------------------------------------------------

;###
;----------------------------------------------------------------------

DEV:                                ; ENTER DEVICE NO:
        JMPI         S5 IGETADR     ;   GET DEVICE NO;
        JMP              ERR1       ; ERROR: GOTO ERR1;
        XTR          R3  6          ;   DEVICE NO (5:6) =>
        MOV          R3  DEVICE     ;     0.DEVICE;
        JMP              IO         ;   GOTO IOCOMMANDS;

;----------------------------------------------------------------------

SENSE:                              ; SENSE DEVICE:
        JMP          S4  DEVSET     ;   SET DEVICECOMMAND;
        SIO          R4         R2  ;   GET CONTENT;
        JMPI         S5 IHEXOUT     ;   WRITE(CONTENT);
        JMP             IO          ;   GOTO IOCOMMANDS;

;----------------------------------------------------------------------

READ:                               ; READ DEVICE:
        JMP          S4  DEVSET     ;   SET DEVICECOMMAND;
        RIO          R4         R2  ;   GET CONTENT;
        JMPI         S5 IHEXOUT     ;   WRITE(CONTENT);
        JMP              IO         ;   GOTO IOCOMMANDS;

;----------------------------------------------------------------------

CONTROL:                            ; CONTROL DEVICE:
        JMP          S4  DEVSET     ;   SET DEVICECOMMAND;
        MOV          R2         R4  ;   SAVE (DEVICECOMMAND);
        JMPI         S5 IGETADR     ;   GET WORD;
        JMP              ERR1       ; ERROR: GOTO ERR1;
        CIO          R3         R4  ;   WORD => *DEVICECOMMAND*;
        JMP              IO         ;   GOTO IOCOMMANDS;

;----------------------------------------------------------------------

WRITE:                              ; WRITE DEVICE:
        JMP          S4  DEVSET     ;   SET DEVICECOMMAND;
        MOV          R2         R4  ;   SAVE(DEVICECOMMAND);
        JMPI         S5 IGETADR     ;   GET WORD;
        JMP              ERR1       ; ERROR: GOTO ERR1;
        WIO          R3         R4  ;   WORD => *DEVICECOMMAND*;
        JMP              IO         ;   GOTO IOCOMMANDS;
;###
;----------------------------------------------------------------------

CONTSENSE1:                         ; CONTINUOUS SENSE, NO OUTPUT:
        MODC  1                     ;
CONTREAD1:                          ; CONTINUOUS READ, NO OUTPUT:
        MODC  1                     ;
CONTSENSE:                          ; CONTINUOUS SENSE:
        MODC  1                     ;
CONTREAD:                           ; CONTINUOUS READ:
        MOVC  0                 R0  ;
        MOV          R0  SAVE15     ;
        JMP          S4  DEVSET     ;   SET DEVICECOMMAND;
        MOV          R2         R3  ;
CTR1:                               ;   WHILE NOT "BREAK" DO
                                    ;   BEGIN
        MOV   SAVE15            R0  ;     IF READ
        IBZ          R0  0          ;     THEN
        RIO          R4         R3  ;     READ DEVICE
        IBN          R0  0          ;     ELSE
        SIO          R4         R3  ;     SENSE DEVICE;
        IBZP         R0  1          ;     IF OUTPUT THEN
                                    ;     BEGIN
        JMPI         S5 INEXTLIN    ;       NEWLINE;
        JMPI         S5 IHEXOUT     ;       WRITE(WORD);
                                    ;     END;
        MOVC  OC                R0  ;
        SIO          R0         R0  ;     SENSE OC;
        IBZ          R0  BPERR      ;
        JMP              CTR1       ;   END;
        JMP              IO         ;   GOTO IOCOMMANDS;

;----------------------------------------------------------------------

CONTCONTROL:                        ; CONTINUOUS CONTROL:
        MODC  1                     ;
CONTWRITE:                          ; CONTINUOUS WRITE:
        MOVC  0                 R0  ;
        MOV          R0  SAVE15     ;
        JMP          S4  DEVSET     ;   SET DEVICECOMMAND;
        MOV          R2         R4  ;
        JMPI         S5 IGETADR     ;   GET WORD;
        JMP              ERR1       ; ERROR: GOTO ERR1;
        MOV   SAVE15            R1  ;
CTW1:                               ;   WHILE NOT "BREAK" DO
                                    ;   BEGIN
        IBZ          R1  0          ;     IF WRITE THEN
        WIO          R3         R4  ;     WRITE(WORD,DEVICE)
        IBN          R1  0          ;     ELSE
        CIO          R3         R4  ;     CONTROL(WORD,DEVICE);
        MOVC  OC                R0  ;
        SIO          R0         R0  ;     SENSE OC;
        IBZ          R0  BPERR      ;
        JMP              CTW1       ;   END;
        JMP              IO         ;   GOTO IOCOMMANDS;
;###
;----------------------------------------------------------------------

ALLINT:                             ; GET ALL INTERRUPTS:
        MOD   BAS                   ;
DEVINT:                             ; GET INTERRUPT FROM DEVICE:
        MOVC  0                 R3  ;
INT3:                               ; WAIT:
        JMP          S6  INTTABLE   ;   SET INTERRUPT TABLE;
        MOV   BAS               R0  ;
        MOV   R015C             R5  ;
        SUB          R0         R5  ;
        MOV          R0  OC.    X5  ;   RESERVE INTERRUPT FROM OC;
        MOD   DEVICE                ;
        MOV          R0  0.     X5  ;   RESERVE INTERRUPT FROM DEVICE;
        SVP              INT0       ;
        MOVC  0                 R0  ;
        LDN                     R0  ;   START INTERRUPT WAIT PROCESS;
INT0:                               ; REENTRY FROM INTERRUPT:
        MOV   DEVPR             R2  ;
        JOZ          R2  INT3       ;   IF INTERRUPT = TIMER THEN
                                    ;     GOTO WAIT;
        SRL          R2  2          ;
        INE          R2  OC         ;   IF DEVICE = OC THEN
        JMP              INT1       ;   BEGIN
        SIO          R0         R2  ;     SENSE OC;
        IBZ          R0  BPERR      ;     IF NOT "BREAK" THEN
        JMP              INT3       ;       GOTO WAIT;
        SVP              INT2       ;     SAVE PROCESS FOR LOC. ACTION;
        JMP              IO         ;     GOTO IOCOMMANDS;
INT2:   JMP              START      ;
INT1:                               ;   END;
        JMPI         S4 IOUTTXNL    ;   WRITE (TEXT);
        <:DEV<0>:>                  ;
        MOV          R2         R4  ;
        JMPI         S5 IHEXOUT     ;   WRITE(DEVICE);
        JMPI         S4 IOUTTEXT    ;   WRITE(TEXT);
        <: P <0>:>                  ;
        MOV   DEVPR             R1  ;
        XTR          R1  2          ;
        ADDC  <:0:>             R1  ;
        JMPI         S6 IOUTCHAR    ;   WRITE(PRIORITY);
        JMP              INT3       ;   GOTO WAIT;
;###
;----------------------------------------------------------------------

IO:                                 ; IOCOMMANDS:
        JMPI         S4 IOUTTXNL    ;   WRITE(TEXT);
        <:. <0>:>                   ;
IO1:                                ; COMM:
        JMPI         S6 IINCHAR     ;   INCHAR;
        ADDC  -<: :>            R1  ;
        JOZ          R1  IO1        ;   IF CHAR = <: :> THEN GOTO COMM;
        SVP   IO2                   ;   SAVE PROCESS FOR LOC. ACTION;
        JMP              IO3        ;
IO2:    JMP              IO         ;
IO3:                                ;
        ADDC  -<:L:>+<: :>      R1  ;
        IEQ          R1  <:D:>-<:L:>;   D - SET DEVICE NO;
        JMP              DEV        ;
        IEQ          R1  <:S:>-<:L:>;   S - SENSE DEVICE;
        JMP              SENSE      ;
        IEQ          R1  <:C:>-<:L:>;   C - CONTROL DEVICE;
        JMP              CONTROL    ;
        IEQ          R1  <:R:>-<:L:>;   R - READ DEVICE;
        JMP              READ       ;
        IEQ          R1  <:W:>-<:L:>;   W - WRITE DEVICE;
        JMP              WRITE      ;
        IEQ          R1  <:E:>-<:L:>;   E - CONTINUOUS READ;
        JMP              CONTREAD   ;
        IEQ          R1  <:F:>-<:L:>;   F - CONTINUOUS SENSE;
        JMP              CONTSENSE  ;
        IEQ          R1  <:H:>-<:L:>;   H - CONT. READ, NO OUTPUT;
        JMP              CONTREAD1  ;
        IEQ          R1  <:I:>-<:L:>;   I - CONT SENSE, NO OUTPUT;
        JMP              CONTSENSE1 ;
        IEQ          R1  <:L:>-<:L:>;   L - CONTINUOUS WRITE;
        JMP              CONTWRITE  ;
        IEQ          R1  <:M:>-<:L:>;   M - CONTINUOUS CONTROL;
        JMP              CONTCONTROL;
        IEQ          R1  <:A:>-<:L:>;   A - WAIT FOR ALL INTERRUPTS;
        JMP              ALLINT     ;
        IEQ          R1  <:G:>-<:L:>;   G - WAIT FOR DEVICE INTERR.
        JMP              DEVINT     ;
        IEQ          R1  <:X:>-<:L:>;   X - RETURN TO TESTS;
        JMP              START      ;
                                    ;
ERR1:                               ; ERR1:
        MOVC  <:?:>             R1  ;
        JMPI         S6 IOUTCHAR    ;   WRITE(<:?:>;
        JMP              IO         ;   GOTO IOCOMMANDS;
;###
;----------------------------------------------------------------------
;
;                   C O M M A N D   D E C O D I N G
;
;----------------------------------------------------------------------

NEWCOM:                             ; NEWCOMMAND:
        JMPI         S4 IOUTTXNL    ;   WRITE(TEXT);
        <:TEST END<0>:>             ;
INCOMMAND:                          ; INCOMMAND:
START:                              ; START:
        MOV   BAS               R4  ;   GET BASE;
INIT:                               ; INIT:
        MOVC  OC                R0  ;
        MOVC  3                 R1  ;
        CIO          R1         R0  ;   ENABLE TERMINAL IF;
        JMPI         S5 INEXTLIN    ;   NEWLINE;
        MOVC  <:::>             R1  ;
        JMPI         S6 IOUTCHAR    ;
        MOVC  <: :>             R1  ;
        JMPI         S6 IOUTCHAR    ;   OUTPUT (<:: :>);
;###
STR1:                               ; STR1:
        JMPI         S6 IINCHAR     ;   GET COMMAND;
        ADDC  -27               R1  ;
        IEQ          R1  27-27      ;   ESC - MONITOR CONTROL;
        JMP              BOOT       ;
        IEQ          R1  <: :>-27   ;   SPACE - GOTO STR1;
        JMP              STR1       ;
        ADDC  27-<:L:>          R1  ;
        IEQ          R1  <:B:>-<:L:>;   B - ENTER NEW BASE;
        JMP              ENTERBASE  ;
        IEQ          R1  <:X:>-<:L:>;   X - RUN PROGRAM;
        JMP              RUNPROG    ;
        SVP              STR2       ;   SAVE PROCESS;
        JMP              STR3       ;
STR2:   JMP              INIT       ;
STR3:   MOVC  LOCACT            R0  ;   INSERT LOCAL ACTION ADDRESS;
        MOV          R0  LOCACTION  ;
        IEQ          R1  <:R:>-<:L:>;   R - INSERT REGISTER DUMP;
        JMP              INSERTREGS ;
        IEQ          R1  <:D:>-<:L:>;   D - MEMORY DUMP;
        JMP              MEMDUMP    ;
        IEQ          R1  <:L:>-<:L:>;   L - MEMORY DUMP, NO PAR. CHECK;
        JMP              MLIST      ;
        IEQ          R1  <:C:>-<:L:>;   C - CONTINUE MEMORY DUMP;
        JMP              CMEMDUMP   ;
        IEQ          R1  <:P:>-<:L:>;   P - LOAD DATA;
        JMP              LOADDATA   ;
        IEQ          R1  <:F:>-<:L:>;   F - FILL RAM;
        JMP              FILL       ;
        IEQ          R1  <:E:>-<:L:>;   E - FILL RAM WITH ADDRESS;
        JMP              ADRFILL    ;
        IEQ          R1  <:U:>-<:L:>;   U - CHECK FOR ADDRESS;
        JMP              ADRCHECK   ;
        IEQ          R1  <:S:>-<:L:>;   S - SEARCH FOR DATA;
        JMP              SEARCH     ;
        IEQ          R1  <:G:>-<:L:>;   G - FIND DATA;
        JMP              FIND       ;
        IEQ          R1  <:N:>-<:L:>;   N - NEW TEST;
        JMP              ON         ;
        IEQ          R1  <:V:>-<:L:>;   V - SAME TEST AGAIN;
        JMP              REP        ;
        IEQ          R1  <:Z:>-<:L:>;   Z - START FROM TEST1;
        JMP              MCPT1      ;
        IEQ          R1  <:A:>-<:L:>;   A - TEST DOUBLE ACCESS;
        JMP              TESTD      ;
        IEQ          R1  <:M:>-<:L:>;   M - BLOCKMODE TEST;
        JMP              PAGEMODE   ;
        IEQ          R1  <:K:>-<:L:>;   K - BLOCKMODE TIMING TEST;
        JMP              BLOCKTIME  ;
        IEQ          R1  <:T:>-<:L:>;   T - TIMEOUT TEST;
        JMP              TIMEOUT    ;
        IEQ          R1  <:O:>-<:L:>;   O - PART OF DOUBLE ACCESS;
        JMP              PARTDOUBLE ;
        IEQ          R1  <:I:>-<:L:>;   I - I/O COMMANDS;
        JMP              IO         ;
                                    ;
ERROR:                              ; ERROR:
        MOVC  <:?:>             R1  ;
        JMPI         S6 IOUTCHAR    ;   OUTPUT <:?:>;
        JMP              START      ;   GOTO START; ;###
MCPT:                               ; AFTER MASTERCLEAR:
        MOVC  OC                R0  ;
        MOVC  3                 R1  ;
        CIO          R1         R0  ;   ENABLE INTERFACE;
        SIO          R1         R0  ;   SENSE INTERFACE;
        IBZ          R1  BPERR      ;   IF NOT "BREAK" THEN
        JMP              MCPT       ;     GOTO AFTER MASTERCLEAR;
MCPT1:                              ; READY:
        JMPI         S4 IOUTTXNL    ;   WRITE(TEXT);
        <:RAM TEST START, SIZE: <0>:>
        JMPI         S5 IGETADR     ;   GET SIZE;
        JMP              MCPTER     ; ERROR: GOTO MCERR;
        SLC          R3  4          ;
        IEQ          R3  8          ;
        JMP              T32        ;
        IEQ          R3  4          ;
        JMP              T16        ;
        IEQ          R3  1          ;
        JMP              T04        ;
MCPTER:                             ; MCERR:
        JMPI         S4 IOUTTXNL    ;   WRITE(TEXT);
        <:ILLEGAL<0>:>              ;
        JMP              MCPT1      ;
T32:                                ; 32K RAM TEST:
        MOVC  #FF               R2  ;   #FF => TAD;
        MOVC  TEST32-TESTS      R1  ;   SET TEST;
        MOV   R1024             R0  ;   SET COUNT;
        JMP              TX         ;   GOTO INIT TEST;
T16:                                ; 16K RAM TEST:
        MOVC  #7F               R2  ;   #7F => TAD;
        MOVC  TEST16-TESTS      R1  ;   SET TEST;
        MOV   R2048             R0  ;   SET COUNT;
        JMP              TX         ;   GOTO INIT TEST;
T04:                                ; 4K RAM TEST:
        MOVC  #3F               R2  ;   #3F => TAD;
        MOVC  TEST04-TESTS      R1  ;   SET TEST
        MOV   R2000             R0  ;   SET COUNT;
TX:                                 ; INIT TEST:
        SLC          R3  12         ;
        MOV          R3  SIZE       ;   SET SIZE;
        SRL          R3  1          ;
        MOV          R3  SIZE2      ;   SET HALF SIZE;
        MOV          R0  SIZE3      ;   SET 0.COUNT;
        SWP          R3             ;
        MOV          R3  SIZE4      ;
        MOV          R2  TADR       ;   TAD => 0.TESTADR;
        MOV          R1  TESTOFF    ;   SET TEST;
MCPT2:                              ; START OF TEST:
        JMPI         S4 IOUTTXNL    ;   WRITE(TEXT);
        <:RAM TEST READY<0>:>       ;
        MOVC  0                 R0  ;   0 =>
        MOV          R0  TESTNR     ;      0.TEST NO;
        MOV   BASEPOINTER       R4  ;   SET BASE IN R4;
        JMP              INIT       ;   GOTO INIT;
;###


IF LOC LT (#FFD0 - PRG1) THEN #FFFF,REPEAT #FFD0-PRG1-LOC
ELSE MESSAGE LOC   FI
PBASE:  0,     0,     0,     0,     BS1,   0,     0,     0
        BS1,   BS1,   PRG1,  INITP, 0,     #E000, 0,     LOCACT
MCPOINT:
        0,     0,     0,     BS1,   0,     0,     0,     0
        BS1,   BS1,   PRG1,  MCL,   0,     #E000, 0,     LOCACT
BOOTBASE:
        #0118, #0001, #0001, #0000, #0001, #0001, #FFFF, #002A
        #0000, #0000, #F590, #F6B5, #0000, #E000, EMACT, #FFFF

EMACT:=     EMERGENCY+PRG1
BPRG1:=     PRG1+PBASE
BBOOT:=     PRG1+BOOTBASE

USE BASE
INITP:=     INIT+PRG1
MCL:=       MCPT+PRG1
END ;###
«eof»