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

⟦338437ce8⟧ TextFile

    Length: 59528 (0xe888)
    Types: TextFile
    Notes: UNREAD_DATA_SECTOR
    Names: »AMUSRC«

Derivation

└─⟦af8db8df8⟧ Bits:30005566 8" CR80 Floppy CR80FD_0245 ( CR/D/1242 )
    └─⟦ce5288cf7⟧ 
        └─ ⟦this⟧ »AMUSRC« 

TextFile

LIST;   A M O S   M A S T E R C L E A R   U T I L I T I E S   FR/791101
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; IDENTIFICATION:    CSS/395/PGM
; VERSION:    02
; DATED:      791101/FR
;
;   THE AMOS_MASTERCLEAR_UTILITIES PROGRAM (AMU) RESIDING IN THE UPPER
;2K_WORDS PROM OF MEMORY SECTION 0 WILL SERVE THE USER OF THE CR80 WITH
;A RANGE OF UTILITIES.  THIS AIM NOT ONLY AT PROGRAMMERS BUT ALSO AT
;MAINTENANCE PERSONNEL.
;   ONLY MEMORY LOCATIONS:
;                         #200-#221 INCL
;WILL BE DESTROYED UPON EITHER MASTER CLEAR OR EMERGENCY ACTION, THOUGH
;ONLY AS LONG AS THE USER RESTRICT HIMSELF TO THE FOLLOWING UTILITIES:
;       COPY, DUMP, IO_UTILITIES, MEMORY_CHECK, PATCH, SEARCH
;       XECUTE, SET_PARITY (,AND OPTIONS).
;   HOWEVER THE AMU_PROGRAM WILL NEVER CLAIM BUT THE LOWER #247 WORDS OF
;MEMORY EXCEPT FOR THE CPU_TEST WHICH REQUIRES AN ADDITIONAL 4K_RAM
;STARTING AT #1000.
;THIS IMPLIES THAT FD_BOOT_FILES CAN HAVE THEIR LOADING ADDRESS (START)
;FROM #0248 AND UPWARDS. (CROSSING PAGE_BOUNDARIES DURING FD_LOAD WILL
;RESULT IN A PAGE SHIFT AND CONTINUATION FROM #0000 THAT PAGE).
;
; U S E R ' S   M A N U A L
; -------------------------
;
;UTILITIES
;---------
;
;   BOOT_LOAD:
;       B F/X <DRIVE_NO>        (F= FD, X= DMA)
;   COPY_MEMORY:
;       C* <SOURCE>[.<REL_OFFSET>][+<COUNT>]     <OBJECT>[/<PAGE>]
;   DUMP:
;       D* <START_ADDRESS>[.<REL_OFFSET>]  <END_ADDRESS>
;       D* <START_ADDRESS>[.<REL_OFFSET>][+<NO_OF_WORDS>]
;   DOWNLOAD LTU-PROGRAM:
;       F  <LTU_PGM_CTL_BLOCK_ADDRESS>.<PGM_NUMBER>  <LTU_ADDRESSES>
;   IO:
;       I S  (<MOD_BY>)  <DEV_ADDRESS>[+<REPEATS>]
;       I R  (<MOD_BY>)  <DEV_ADDRESS>[+<REPEATS>]
;       I C  (<MOD_BY>)  <DEV_ADDRESS>[+<REPEATS>]    <OUTPUT_WORD>
;       I K  (<MOD_BY>)  <DEV_ADDRESS>[+<REPEATS>]    <OUTPUT_WORD>,....
;       I W  (<MOD_BY>)  <DEV_ADDRESS>[+<REPEATS>]    <OUTPUT_WORD>
;       I V  (<MOD_BY>)  <DEV_ADDRESS>[+<REPEATS>]    <OUTPUT_WORD>,....
;   LOAD_FILE:
;       L F/X <DRIVE_NO>        (F= FD, X= DMA)
;   MEMORY_CHECK:
;       M* <START_ADDRESS>[.<REL_OFFSET>][+<NO_OF_WORDS>]  [<PATTERN>]
;   PATCH:
;       P* <START_ADDRESS>[.<REL_OFFSET>]                [<PATCH_DATA>]
;   MULTI_PATCH:
;       P* <START_ADDRESS>[.<REL_OFFSET>][+<NO_OF_WORDS>]  <PATTERN>
;   SWITCH_CPU:
;       Q  <CPU_NO>
;   RETURN_CALLING_PROCESS:
;       R
;   SEARCH:
;       S* <START_ADDRESS>[.<REL_OFFSET>][+<NO_OF_WORDS>]  <PATTERN>
;   TEST_CPU:
;       T* <CPU_PROM_ADDRESS>
;   UNIT_MAPPER:
;       U
;   WAIT_INTERRUPT:
;       W  [<DEVICE_ADDRESS>]
;   XECUTE:
;       X* <PROCESS_BASE_ADDRESS>
;   SET_PARITY:
;       Z
;
;   OPTIONS:
;       O
;          PRINT_CONTROL
;          LOOP_CONTROL (CPU TEST)
;
;
;
;LEGEND:
;-------
;   BREAK
;       BREAK FROM THE OPERATOR'S CONSOLE WILL IMMEDIATELY STOP ANY
;       PRINT-OUT ON THE OC AND RETURN TO THE MAIN_LINE SELECTION MODE.
;
;   MEMORY_SECTION
;       IF A PAGE OTHER THAN PAGE 0 IS DESIRED, IT MUST FOLLOW IMMEDI-
;       ATELY AFTER THE COMMAND, I.E.
;             <COMMAND><PAGE>  <....
;       ONLY COMMANDS MARKED WITH '*' CAN HAVE PAGE SELECTION.
;
;   <---> HEXADECIMAL DATA_WORD:
;       AN ENTERED HEXADECIMAL DATA WORD CAN BE ANY COMBINATION OF
;       HEXA-DECIMAL CHARACTERS. THOUGH ONLY THE LAST ENTERED FOUR ARE
;       ACCEPTED. ZEROES WILL AUTOMATICALLY BE FILLED IN IF LESS THAN
;       FOUR HEX CHARACTERS HAVE BEEN ENTERED.
;       HEX DATA_WORDS ARE SEPARATED BY ANYTHING BUT '0123456789ABCDEF'
;       AND CARRIAGE RETURN <CR>.
;       <CR> FLAGS END_OF_DATA.
;       <---><DEL> IMPLIES THAT THE ENTERED HEXADECIMAL (WORD (ONE) IS
;       REJECTED.
;       NOTE THAT +0 ALWAYS IS INTERPRETED AS 64K (ONE PAGE).
;
;   [----] OPTIONAL FIELD.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;FF«ff»
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;                                                             CPU TEST ;
; INSTRUCTION SET KERNEL
; ----------------------
; 0   - UNTIL TEXT TO BE WRITTEN ON OC
;  1  - DURING WRITE-OUT
;   2 - REST OF INITIALIZATION BEFORE '>'
;    3  ESSENTIAL TO CPU_TEST PROGRAMS
;
;MOV
; 0     MOVC  [M] C[N]8         R3
;  1    MOV          R3         R3
;   2   MOV       B8            R3
; 0     MOV          R3      B8
;    3  MOV       B6.X2         R3
;    3  MOV          R2      B6.X2
; 0     MOVL      B6.X2         R22
; 0     MOVL         R22     B6.X2
; 0     MOV       P8            R3
;  1    MVP      P6.X2          R2
;JUMP
;  1    JMP          S2      L[N]8
; 0     JMP                  L[N]10
;  1    JMP                  B6.X2
;  1    JMPI                 B6
; 0     JMPI        [S2]     P6
; 0     SOB          R3      LN8
;ARIT/LOG
; 0     ADDC   C[N]8            R3
;    3  ADD          R3         R3
;    3  SUB          R3         R3
;  1    SBN/Z        R3      C4
;  1    SBZP         R3      C4
;    3  SLC          R3      C4
;  1    XTR          R3      C4
;  1    SWP                     R3
;    3  INE          R3         R3
;    3  INE          X3         X3
;  1    IEQ/INE      R3  [M] C4
;    3  SHS/SLO      R2      C4
;I/O
;    3  CIO          R3         R3
;  1    SIO          R3         R3
;    3  RIO          R3         R3
;  1    WIO          R3         R3
;SPECIAL
; 0     SVP                  L4
; 0     RESS         X3      C4
;   2   SVS                     R3
;    3  LDS          R3
;
;NOTE THIS PROGRAM INTERFACE THE CPU_TEST_PROGRAM CSM/100. IT ASSUMES:
;       - THE CPU_TEST_PROGRAM STARTS WITH '#0158'='JMP LOC'
;       - IT REPLACES THE FIRST LOCATION OF THE CPU_TEST
;             'JMP  S4 OUTSTRING'
;         WHEREUPON CONTROL IS LEFT OVER TO THE CPU_TEST,
;       - THE KEY TO RE-INITIALIZATION IS MEM[B5555, BAAAA], WHICH ARE
;         TO BE INITIALIZED PROPERLY BY THE CPU_TEST_PROGRAM,
;       - NOTE THAT THE NAMES FILES BEING GENERATED BY THIS PROGRAM
;         IS USED BY THE CPU_TEST_PROGRAM. THUS THESE ENTRIES MUST NOT
;         BE CHANGED IN ORDER TO HAVE THE CPU_TEST WOTK PROPERLY.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;



BEGIN   MODULE CPUPROM
AREASWITCH= 1

FDSUPPORT= TRUE
SCMMODE=   TRUE
$OC

CPUPROM=   #F800

USE BASE
BIT0=0,   BIT1=1,   BIT2=2,   BIT3=3,   BIT4=4,   BIT5=5,   BIT6=6
          BIT7=7,   BIT8=8,   BIT9=9,   BIT10=10, BIT11=11, BIT12=12,
          BIT13=13, BIT14=14, BIT15=15
;FF«ff»
                         ; MEMORY LAY-OUT (ABS)
           LOC= 0        ; --------------------
CPUMEM:
CPUIVT:    LOC= LOC+4    ;   INTERRUPT VECTOR TABLE INDEX - PRIORITY
CPUIVR:    LOC= LOC+1    ;   RESET BASE, INTERRUPT SERVE PROCESS
           LOC= LOC+2    ;
CPUMSG:    LOC= LOC+1    ;   USED FOR "OTHER'S" MESSAGE (ADDREESS DUMMY)
CPUCPU:    LOC= LOC+8    ;   CPU MESSAGE AREA
           LOC= LOC+#10  ;
CPUDUMMY:  LOC= LOC+#1F  ;   BASE LOOSER'S DUMMY PROCESS.
                         ;   USED FOR SVP FROM OTHER CPUS UPON FIRST
                         ;   CPU_INTERRUPT;
           LOC= LOC+1    ;   SPECIAL MON_CALL CASE (0-63)
CPUMON:    LOC= LOC+192  ;   MONITOR TABLE (ABS PROGRAM ADDRESS
           LOC= LOC+128  ;   RESERVED PROGRAM AREA (MON 0-63)
CPUIVB:    LOC= LOC+64   ;   INTERRUPT VECTOR TABLE (PROCESS BASE)
           LOC= LOC+32   ;   BASE DUMMY INTERRUPT PROCESS
           LOC= LOC+32   ;
CPUBASE:   LOC= LOC+256  ;   PROCESS AREA CPU TEST PROGRAM
CPUWORK:                 ;   WORK AREA


MASTERCLEARBASE:=#FFE0   ;


                         ; ASCII CHARACTERS
                         ; ----------------
NIL=    0                ;   NIL CHARACTER
LF=     <:<10>:>         ;   LINE_FEED
CR=     <:<13>:>         ;   CARRIAGE_RETURN
YES=    <:Y:>            ;
DEL=    #7F              ;   DELETE
EOT=    #FF              ;   END_OF_TEXT (PROCEDURE OUT_STRING)
;FF«ff»
                         ; PROCESS DESCRIPTOR
        LOC= 0           ; ------------------
XR0:    ABSMCE50         ;
XR1:    CPUDUMMY         ;
XR2:    0-0              ;
XR3:    CPUBASE          ;
XR4:    0-0              ;
XR5:    RELPROMBASE      ;
XR6:    0-0
XR7:    0-0
XBASE:  CPUBASE          ;   PROCESS BASE CPU TEST PROGRAM
XMOD:   CPUBASE          ;   MODIFY REGISTER NORMAL STATE
XPROG:  PROGRAMSTART     ;
XPRPC:  PROGRAMGO        ;
XTIMER: #7FFF            ;   TIMER REGISTER
XPSW:   #E000            ;   PROGRAM STATUS WORD (PSW)
;******************* END OF PROCESS DESCRIPTOR *************************
XOLDPRC:MASTERCLEARBASE  ;   PROCESS LINK ADDRESS (ABS)
XLOCACT:LOCALACT         ;   LOCAL INTERRUPT ACTION PROCEDURE ADDRESS
XLOCRET:0-0              ;      LOCAL INTER'T RETURN ADDRESS
XCAUSE: #FFFF            ;      CAUSE:
                         ;      0 - LOCAL TIMER
                         ;      1 - TRAP
                         ;      2 - PARITY ERROR
                         ;      3 - TIME OUT
XDEVICE:0-0              ;   IF INTERRUPT THEN DEV_ADDR ELSE #FFFF
XTIMRS: #8000            ;   FAST TIMER PRESET VALUE
XMONRET:0-0              ;


;NOTE THAT THE FD_UTILITIES USES 256 WORDS BELOW OWN BASE AS DEDICATED
;     MEMORY BUFFER;

                         ; WORK AREA
                         ; ---------
PGMEVALUATE:             ;  TRUE => EVALUATE TEST RESULTS AND PRINT
                         ;   MISMATCHES ON THE OC.
PRINTOUT:  TRUE          ;

PGMLOOP:   0, 0          ;   NO_OF_LOOPS_LEFT-1 (LONG_INTEGER);
                         ;
TCBASE:    #1000         ;   START CPU_TEST PROGRAM (RAM_COPY)
                         ;NOTE HAS TO BE WITHIN 32 K FROM "OWN" BASE.
XABS=   (LOC+1-XR0)/2

ENDOFDATA:
;FF«ff»


SB12SV: LOC= LOC+1       ;   DEDICATED SB1200 (WRITE_NEWLINE)
SB14SV: LOC= LOC+1       ;   DEDICATED SB1400 (IN_HEXA)
SB15SV: LOC= LOC+1       ;   DEDICATED SB1500 (WRITE_HEXA)
SB16SV: LOC= LOC+1       ;   DEDICATED SB1600 (GET_ADDRESS)
SB17SV: LOC= LOC+2       ;   DEDICATED SB1700 (SET_PARITY)

UT50SV: LOC= LOC+1       ;
UT13PATTERN:             ;   2  (MEMORY_CHECK)
UT17SV:                  ;   1  (SEARCH)
UT20SV:                  ;   2  ((IO_UTILITIES)
UT60SV:                  ;   1  (DOWNLOAD LOU'S)
           LOC= LOC+2
;**************  END OF DUMP/PATCH/SEARCH UTILITIES  *******************
                         ;
                         ;CPU_TEST PROGRAMS
                         ;-----------------
           LOC= LOC+(#24-LOC)
TCREFWORK:
REFWORK:   LOC= LOC+1    ;   REFERENCE CPU_TEST PROGRAM WORK_AREA.
MAISV:  LOC= LOC+2       ;   DEDICATED MAIN LINE

B5555:  LOC= LOC+1       ;
BAAAA:  LOC= LOC+1       ;

CP06:
CP20INS:
CPWORK: LOC= LOC+4       ;   WORK AREA FOR CPU_TEST PROGRAMS

CP46P:     LOC= LOC+1    ;
CP46:      LOC= LOC+1    ;


PGMNEXT:LOC= LOC+1       ;   REF TABLE PGMPOOL - CURRENT TEST PGM REF
                         ;
TCPOOL:                  ;   REF(TEST_PROGRAM), REF(DATA_AREA)
           LOC=0
TCPPROG:   LOC= LOC+1    ;
TCPDATA:   LOC= LOC+1    ;
           LOC= LOC+TCPOOL
                         ;
;FF«ff»
        LOC=TCREFWORK
                         ;FD_UTILITIES WORK
                         ;-----------------
FDMEMBUF:= XR0-256       ;   I/O BUFFER 256 POSITIONS BELOW OWN BASE
                         ;
FDMODE:    LOC= LOC+1    ;   MODE_OF_OPERATION:
FD10SV:    LOC= LOC+1    ;   DEDICATED FD1000 (FD_BOOT)
                         ;      'F'-'O' - FD
                         ;      'X'-'O' REMOTE FD VIA DMA
FD10DRV:   LOC= LOC+1    ;   FD DRIVE_NO (0-3)
FDZERO:                  ;
FDTRACK:   LOC= LOC+1    ;   CURRENT TRACK POSITION OF FD_HEAD
FD20SV:    LOC= LOC+1    ;   DEDICATED FD2000 (FD_READ_BLOCK)
FD20CTL:   LOC= LOC+1    ;
FD30SV:    LOC= LOC+1    ;   DEDICATED FD3000 (FD_TRANSFER)
FDRECOUNT: LOC= LOC+1    ;   NO OF RESTORE_ATTEMPTS ON FD (<16).
                         ;
FDCLOAD:   LOC= LOC+1    ;   CURRENT LOAD ADDRESS (OUTPUT_AREA)
FDCPAGE:   LOC= LOC+1    ;   CURRENT MEMORY SECTION
                         ;
FDBLOCKNO: LOC= LOC+1    ;   CURRENT BLOCK NO
                         ;
FDAREAS=10               ;   MAX AREAS PER FILE
FDBENTRY:                ;   FD BOOT_FILE DIR ENTRY
              LOC= 0
  FDAREASIZE: LOC= LOC+1 ;   AREA_SIZE
  FDSECTORS:  LOC= LOC+1 ;   SECTORS PER BLOCK
  FDHIBLOCK:  LOC= LOC+1 ;   HIGHEST BLOCK ALLOCATED
  FDBLOCKS:   LOC= LOC+1 ;   BLOCKING_FACTOR: BLOCKS PER AREA
  FDAREA:     LOC= LOC+FDAREAS; 1ST AREA ADDRESS (-1 IF NON-ALLOCATED)
  FDLOAD:     LOC= LOC+1 ;   FIRST ADDRESS (LOAD ADDRESS)
  FDPAGE:     LOC= LOC+1 ;   MEMORY SECTION (PAGE)
  FDBASE:     LOC= LOC+1 ;   BASE ADDRESS
  FDCOUNT:    LOC= LOC+1 ;   WORD COUNT OF FILE
  FDCHECKSUM: LOC= LOC+1 ;   CHECKSUM OF BOOT FILE
  FDCHECK:    LOC= LOC+1 ;   CHECK_SUM OF DIRECTORY ENTRY
  FDENTRYLENGTH:         ;
           LOC= FDBENTRY+FDAREA+1
FDDIRBUF:  LOC= LOC+FDENTRYLENGTH
FDEND:                   ;
;******************* END OF DESTROYED AREA *****************************

;FF«ff»
USE PROG
PROGSTART:
                                    ;CPU_TEST PROGRAM CONSTANTS
        MODC  -1
P5555:  #5555            ;
PAAAA:  #AAAA            ;
                         ;
MAINLINE:  MAINLOOP      ;   RETURN LINK FROM CPU_TEST SEQUENCES.

OC=     1                ;
SCM=    OC
SCMADR:
OCADR:        OC         ;   ADDRESS OF OPERATOR'S CONSOLE (OC)
                         ;
FD=     2
FDADR:        FD         ; DISKETTE (DEFAULT) IO ADDRESS


DMAADR:       7          ;   DMA IO ADDRESS


DISKADR:      0-0        ;



SB16PAGE:  #E000, #E004, #E008, #E00C

MSEC:   500                         ;
;FF«ff»
                         ;SUBROUTINES:
BREAKCHECK:   SB1350     ;   BREAK_CHECK         R:(LINK/LINK+1);

COPY:         SB1900     ;   COPY                I:(SOURCE, OBJECT);

GETADDRESS:   SB1600     ;   GET_ADDRESS         O:(REF(LOWER, UPPER));
GETHEXA:      SB1400     ;   GET_HEXADECIMAL     O:(DELIMITER, BINARY);

INCHAR:       SB1100     ;   READ_SINGLE_CHAR    O:(CHAR);

OUTCHAR:      SB1250     ;   WRITE_SINGLE_CHAR   I:(CHAR);
OUTHEXA:      SB1500     ;   WRITE_HEXADECIMAL   U:(BINARY);
OUTNL:        SB1200     ;   WRITE_NEWLINE;
OUTSTRING:    SB1300     ;   OUT_STRING          I:(REF(STRING));

SETPARITY:    SB1700     ;
                         ;
UTILITIES:    UT5000     ;UTILITIES:
  BOOTLOAD:   UT3000     ;
  COPYMEMORY: UT1900     ;
  DUMP:       UT1500     ;
  DOWNLOADLTU:UT6000     ;      F
  IO:         UT2000     ;
  LOADFILE:   UT3100     ;
  MEMCHECK:   UT1300     ;
  OPTIONS:    OPT00      ;
  PATCH:      UT1600     ;
  SWITCHCPU:  UT2800     ;      Q
  RETURNCALLER:MCE90     ;
  SEARCH:     UT1700     ;
  TESTCPU:    TEC00      ;
  UNITS:      UT2900     ;
  WAITINTERRUPT:UT2500   ;
  XECUTE:     UT1800     ;
                         ;
ERROR:        UT5090     ;

NOLIST  IF FDSUPPORT THEN LIST
  FDBLOAD:    FD1000     ;
  FDREADBLOCK:FD2000     ;   FD_READ_BLOCK       I:(REF(DIR_ENTRY));
  FDWAITCMDCOMPLETE:
  FDTRANSFER: FD3000     ;   FD_TRANSFER         I:(REF(BUFFER));
  FDCOPY:     FD3100     ;   FD_MEM_COPY
  FDCONTROL:  FD3500     ;   FD_CONTROL_IO       I:(COMMAND);
NOLIST ELSE LIST
  FDBLOAD:= ERROR        ;
NOLIST  FI LIST
              0, REPEAT (#30-LOC)
;FF«ff»
;   C O M M O N   L O C A L   A C T I O N
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; PROCEDURE SERVE_LOCAL_INTERRUPT;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                                    ;
LOCALACT:                           ;NORMAL_LOCAL_ACTION:
        SVP                         ;
        MOV   XLOCRET           R0  ;   GET CAUSING POSITION;
        MOVC  #FFFF             R2  ;   PRESET CAUSE_VALUE;
        MOVC  XCAUSE            R7  ;
        XCH          X7         R2  ;   GET CAUSE AND RESET FIELD;
        MOVC  XPSW              R7  ;   POINT PROCESS_PSW;
        RELS         X7  BIT11      ;     RESET LOCAL_INTERRUPT FLAG;
                                    ;
        JMP              LOC10      ;***BY-PASS LOCAL TIMER_INTERRUPT***
        SNE          R2  0          ;   IT .NOT. TIMER_INTERRUPT
        JMP              LOC40      ;   THEN
LOC10:  MOV   XPSW              R7  ;
        SETS         R7  BIT15      ;   DISABLE TIMER_INTERRUPTS;
        LDS                     R7  ;   RE-ESTABLISH PSW;
        JMPI  S4     OUTSTRING,     <:<13>LOCAL INTERRUPT, CAUSE=:>, EOT
        JMPI         S6  OUTHEXA    ;
        JMPI         S6  UTILITIES  ;
                                    ;RETURN:
        JMPI         S6  GETHEXA    ;   GET REUTNR_OFFSET;
        MOV   XLOCRET           R0  ;
        ADD          R2         R0  ;   COMPUTE NEW START LOCATION
LOC40:                              ;RETURN_CAUSING_LOCATION:
        MOVC  XBASE             R4  ;   POINT "OWN" BASE;
        ADD   XPROG-XBASE.X4    R0  ;   ADJUST WAKE-UP LOCATION;
        MOV          R0  XPRPC      ;
        LDN                     X4  ;   RETURN INTERRUPTED LOCATION;
;///////////////////////////////////;
;FF«ff»
; E M E R G E N C Y   A C T I O N   E N T R Y   P O I N T
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
EMERGENCY:
        SVP                         ;
        MODN  XBASE
        MOVC  MASTERCLEARBASE   R4  ;   POINT PROMMED AMU_BASE;
        MOV   XBASE             R0  ;
        MOVC  #E000             R7  ;   FORCE
        LDS          R7             ;     MEMORY SECTION 0;
        MOV   XBASE. X4         R6  ;   GET BASE THAT PROCESS;
        SUB          R0         R6  ;   SET-UP POINTER TO RAM_BASE;
        MOVM         X4         X6  ;   CREATE
        MOVM         X4         X6  ;      AMU_PROCESS;
        ADDC  -2*16             R6  ;   POINT START PROCESS_DESCRIPTOR;
        MOVC  LOC50             R0  ;
        ADD   XPROG. X6         R0  ;   COMPUTE START_ADDRESS;
        MOV          R0  XPRPC. X6  ;
        MOV   XBASE. X6         R7  ;   GET BASE RAM_RESIDENT AMU_PROC;
        LDP                     R7  ;   LEAVE CAUSING PROCESS
                                    ;***  BY ACTIVATING AMU_PROCESS;
;************** ENTRY POINT UPON EMERGENCY WAKE UP *********************
LOC50:                              ;ENTRY_POINT FROM EMERGENCY:
        JMPI  S4     OUTSTRING,     <:<13>EMERGENCY ACTION BY :>, EOT
        MOV   XOLDPRC           R2  ;   GET CAUSING PROCESS_BASE;
        JMPI         S6  OUTHEXA    ;
LOC90:  JMPI         S6  UTILITIES  ;   ACTIVATE UTILITIES;
        JMP              LOC90      ;   ENSURE NO RETURN;
;FF«ff»
NOLIST  IF SCMMODE THEN LIST
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;  OC SCM CHARACTERISTICS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                         ;COMMAND_REGISTERS:
SCMMR1=    2#010<BIT8    ;MODE_REG_1:
  SCMASYNC=             %;
           2#11<BIT0 OR %;   ASYNCHRONEOUS
           2#10<BIT2 OR %;   7 BITS
              1<BIT4 OR %;   PARITY ENABLED
              1<BIT5 OR %;   EVEN PARITY
           2#01<BIT6     ;   1 STOP BIT
SCMMR2=    2#110<BIT8    ;MODE_REG_2:
  SCMBAUD=              %;
             #0<BIT0 OR %;   BAUD RATE (ASYNC)
           2#11<BIT4 OR %;   INTERNAL CLOCK
              1<BIT6     ;   SLOT 2
SCMCMD=    2#011<BIT8    ;COMMANDS:
   SCMENB=              %;
              1<BIT0 OR %;   ENABLE TX CONTROL
              1<BIT1 OR %;   FORCE DTR LOW
              1<BIT2 OR %;   ENABLE RX
              0<BIT3 OR %;   NORMAL
              0<BIT4 OR %;   KEEP ERROR FLAGS
              1<BIT5 OR %;   FORCE RTS LOW
           2#00<BIT6     ;   NORMAL OPERATION
   SCMRESET=            %;
              1<BIT0 OR %;   ENABLE TX CONTROL
              1<BIT1 OR %;   FORCE DTR LOW
              1<BIT2 OR %;   ENABLE RX
              0<BIT3 OR %;   NORMAL
              1<BIT4 OR %;   RESET ERROR FLAGS IN STATUS
              1<BIT5 OR %;   FORCE RTS LOW
           2#00<BIT6     ;   NORMAL OPERATION

SCMSTATUS= 2#001<BIT8    ;STATUS_BITS:
  SCMORDY=    BIT0       ;   TRANSMIT HOLDING REG EMPTY (HIGH)
  SCMIRDY=    BIT1       ;   RECEIVE HOLDING REG HAS DATA (INPUT READY)
  SCMPARITY=  BIT3       ;   PARITY ERROR (HIGH)
  SCMOVERRUN= BIT4       ;   OVERRUN ERROR (HIGH)
  SCMFRAME=   BIT5       ;   FRAMING ERROR (HIGH)
  SCMDSR=     BIT7       ;   DATA_SET_READY (HIGH - RECEIVER READY)
;FF«ff»
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; PROCEDURE READ_CHAR           O:(CHAR);
; R0    -                       CHAR (LEAST SIGN 7 BITS)
; R6    LINK                    DESTROYED
; R7    -                       DESTROYED
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                                    ;IN_CHAR:
SB1100:                             ;   REPEAT
        MOV   SCMADR            R7  ;     GET DEVICE ADDRESS;
        MOVC  SCMENB            R0  ;
        MODC             SCMCMD
        CIO          R0         R7  ;     ENABLE OC;
        MODC             SCMSTATUS
        SIO          R0         R7  ;     SENSE(STATUS, DEVICE);
        SBN          R0  SCMIRDY    ;   UNTIL INPUT_READY HIGH;
        JMP              SB1100     ;
        RIO          R0         R7  ;   GET CHAR FROM OC;
        XTR          R0  7          ;   STRIP OFF PARITY;
        JMP              SB1250     ;   ECHOE CHARACTER;


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; PROCEDURE NEW_LINE;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                                    ;WRITE_NEWLINE:
SB1200:                             ;
        MOVC  CR                R0  ;
                                    ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; PROCEDURE WRITE_SINGLE_CHAR   I:(CHAR);
; R0 CHAR                       KEPT
; R6    LINK                    DESTROYED
; R7    -                       DESTROYED
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                                    ;OUT_CHAR:
SB1250:                             ;   REPEAT
        MOV   SCMADR            R7  ;     GET DEVICE ADDRESS;
        MODC             SCMSTATUS
        SIO          R7         R7  ;     SENSE(STATUS, DEVICE);
        IBNP         R7  SCMFRAME   ;     IF FRAMING ERROR
        IBN &        R7  SCMIRDY    ;        .AND. INPUT_READY
        JMP &            SB1290     ;***  THEN BREAK-POINT;
        SBN          R7  SCMORDY    ;   UNTIL OUTPUT_READY HIGH;
        JMP              SB1250     ;
                                    ;
        MOV   SCMADR            R7  ;   RE-ESTABLISH DEVICE ADDRESS;
        WIO          R0         R7  ;   WRITE TO OC;
        MOV          R0         R7  ;
        XTR          R7  8          ;   ISOLATE CHAR;
        INE          R0  CR         ;   IF .NOT. CARRIAGE_RETURN
        JMP                     X6  ;     RETURN
                                    ;   ELSE
        MOV          R6  SB12SV     ;     ESTABLISH RETURN LINKAGE;
        ADDC  LF-CR             R0  ;
        JMP          S6  SB1250     ;     OUTCHAR (<LF>);
        ADDC  NIL-LF            R0  ;
        JMP          S6  SB1250     ;     OUTCHAR (<NIL>);
        JMP          S6  SB1250     ;     OUTCHAR (<NIL>);
        JMP          S6  SB1250     ;     OUTCHAR (<NIL>);
        JMP          S6  SB1250     ;     OUTCHAR (<NIL>);
        JMP          S6  SB1250     ;     OUTCHAR (<NIL>);
        ADDC  CR-NIL            R0  ;
        JMPI             SB12SV     ;   RETURN CALLER;


SB1290:                             ;BREAK_POINT:
        MOV   SCMADR            R7  ;   GET DEVICE ADDRESS;
        MOVC  SCMRESET          R0  ;
        MODC             SCMCMD
        CIO          R0         R7  ;   RESET ERROR FLAGS;
        RIO          R0         R7  ;
        JMP              UT5010     ;
NOLIST  ELSE LIST
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;  OC AV24 CHARACTERISTICS
;;;;;;;;;;;;;;;;;;;;;;;;;;
OCIRDY:=   10            ;      OC INPUT READY
OCORDY:=   11            ;      OC OUTPUT READY
OCBREAK:=  13            ;
OCPARITY:= 14            ;
OCENB:=    3             ;      ENABLE (USED BY CIO)



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; PROCEDURE READ_CHAR        O:(CHAR);
; R0    -                       CHAR (LEAST SIGN 7 BITS)
; R6    LINK                    DESTROYED
; R7    -                       DESTROYED
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                                    ;IN_CHAR:
SB1100:                             ;   REPEAT
        MOV   OCADR             R7  ;     GET DEVICE ADDRESS
        MOVC  OCENB             R0  ;
        CIO          R0         R7  ;     ENABLE OC;
        SIO          R0         R7  ;     GET STATUS OF OC-DEVICE;
        SBN          R0  OCIRDY     ;   UNTIL INPUT_FLAG HIGH;
        JMP              SB1100     ;
        RIO          R0         R7  ;   GET CHAR FROM OC;
        XTR          R0  7          ;   ISOLATE CHAR, REMOVE PARITY;
                                    ;
        JMP              SB1250     ;   ECHOE CHARACTER;



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; PROCEDURE NEW_LINE;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                                    ;
SB1200:                             ;WRITE_NEWLINE:
        MOVC  CR                R0  ;
                                    ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; PROCEDURE WRITE_SINGLE_CHAR I:(CHAR);
; R0    CHAR                        KEPT
; R6    LINK                        KEPT
; R7    -                           DESTROYED
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                                    ;OUT_CHAR:
SB1250:                             ;   REPEAT
        MOV   OCADR             R7  ;   GET DEVICE ADDRESS;
        SIO          R7         R7  ;   SENSE(STATUS, DEVICE);
        IBNP         R7  OCBREAK    ;     IF FRAMING ERROR
        IBN &        R7  OCIRDY     ;        .AND. INPUT_READY
        JMP &            UT5010     ;***  THEN BREAK-POINT;
        SBN          R7  OCORDY     ;   UNTIL OUTPUT_FLAG=READY
        JMP              SB1250     ;
                                    ;
        MOV   OCADR             R7  ;   RE-ESTABLISH DEVICE ADDRESS
        WIO          R0         R7  ;   WRITE ON OC;
        MOV          R0         R7  ;
        XTR          R7  8          ;   ISOLATE CHAR;
        INE          R7  CR         ;   IF NOT CARRIAGE_RETURN
                                    ;   THEN
        JMP                     X6  ;     RETURN
                                    ;   ELSE
        MOV          R6  SB12SV     ;     ESTABLISH RETURN LINK;
        ADDC  LF-CR             R0  ;
        JMP          S6  SB1250     ;   OUT_CHAR (<LF>);
        ADDC  NIL-LF            R0  ;
        JMP          S6  SB1250     ;   OUT_CHAR (<NIL>);
        JMP          S6  SB1250     ;   OUT_CHAR (<NIL>);
        JMP          S6  SB1250     ;   OUT_CHAR (<NIL>);
        JMP          S6  SB1250     ;   OUT_CHAR (<NIL>);
        JMP          S6  SB1250     ;   OUT_CHAR (<NIL>);
        ADDC  CR-NIL            R0  ;
        JMPI             SB12SV     ;   RETURN CALLER;
NOLIST  FI   LIST
;FF«ff»
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; PROCEDURE WRITE_STRING I:(REF(STRING));
; R1-3,5   -                        KEPT
; R4    LINK                        DESTROYED
; R0,6,7   -                        DESTROYED
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                                    ;OUT_STRING:
SB1300:                             ;   REPEAT
        MVP   0.     X4         R0  ;     GET NEXT SET OF CHARS
        IEQ          R0  EOT        ;     IF END_OF_TEXT
        JMP              1.     X4  ;       THEN RETURN CALLER;
        JMPI         S6  OUTCHAR    ;     WRITE_CHAR (CHAR);
        SWP                     R0  ;     POSITION 2ND CHAR;
        JMPI         S6  OUTCHAR    ;     WRITE_CHAR (CHAR);
        ADDC  1                 R4  ;     ADJUST POINTER;
        JMP              SB1300     ;   UNTIL END_OF_TEXT;


NOLIST  IF SCMMODE THEN LIST
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; PROCEDURE BREAK_POINT  R:(LINK/LINK+1);
; R0    -                       DESTROYED (IF BREAK ACTIVE)
; R1-5  -                       KEPT
; R6    LINK                    KEPT
; R7    -                       DESTROYED
; RETURN:
;       LINK   BREAK DETECTED
;       LINK+1 NO BREAK DETECTED
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                                    ;
SB1350:                             ;BREAK_POINT:
        MOV   SCMADR            R7  ;   GET DEVICE_ADDRESS;
        MODC             SCMSTATUS
        SIO          R7         R7  ;   SENSE(STATUS, DEVICE);
        SBZ          R7  SCMFRAME   ;   IF FRAMING ERROR
        SBN          R7  SCMIRDY    ;      .AND. INPUT_READY HIGH
        JMP              1.     X6  ;   THEN
        MOV   SCMADR            R7  ;     RE-ESTABLISH DEVICE ADDRESS;
        MOVC  SCMRESET          R0  ;
        MODC             SCMCMD
        CIO          R0         R7  ;     RESET ERROR FLAGS;
        RIO          R0         R7  ;     EMPTY RECEIVE BUUFER;
        JMP              0.     X6  ;   RETURN CELLER (ERROR);
NOLIST  ELSE LIST
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; PROCEDURE BREAK_CHECK         R:(LINK/LINK+1);
;
; R0    -                           DESTROYED IF BREAK
; R1-5  -                           KEPT
; R6    LINK                    KEPT
; R7    -                       STATUS OF OC
; RETURN:
;       LINK    BREAK DETECTED
;       LINK+1  NO BREAK DETECTED
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                                    ;
SB1350:                             ;BREAK_CHECK:
        MOV   OCADR             R7  ;   GET DEVICE ADDRESS;
        SIO          R7         R7  ;   SENSE(STATUS, DEVICE);
        SBZ          R7  OCBREAK    ;   IF FRAMING ERROR
        SBN          R7  OCIRDY     ;      .AND. INPUT READY
        JMP              1.     X6  ;   THEN
        MOV   OCADR             R7  ;     GET DEVICE ADDRESS
        RIO          R7         R7  ;     READ ERRONEOUS CHAR;
        JMP              0.     X6  ;   END;
NOLIST  FI   LIST
;FF«ff»
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;       MEMORY_CHECK UTILITY
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
UT1300:                             ;MEMORY:
        MOV   P5555             R0  ;   INITIALIZE TEST PATTERN
        MOV          R0  UT13PATTERN ;
        MOV   PAAAA             R0  ;
        MOV          R0  UT13PATTERN+1
        JMPI         S6  GETADDRESS ;   GET START_ADDRESS;
        SNE          R0  CR         ;   IF PATTERN
        JMP              UT1310     ;   THEN
        JMPI         S6  GETHEXA    ;     GET PATTERN
        MOV          R2  UT13PATTERN
        INE          R0  CR         ;     IF 2ND PATTERN_PARAM
        JMPI         S6  GETHEXA    ;       GET 2ND PATTERN;
        MOV          R2  UT13PATTERN+1
UT1310:                             ;   END GETTING PARAMETERS;
        MOV          R3         R6  ;
        MOVC  UT1350            R0  ;*
        MOV          R0  XLOCACT    ;   REPLACE TO LOCAL ACTION PROCESS;
UT1320:                             ;   REPEAT
        MOV   UT13PATTERN       R0  ;     GET TEST PATTERN;
        MOV   UT13PATTERN+1     R1  ;
        MOV   XPROG             R2  ;     GET OWN PROG_ADDRESS;
        MODN  XBASE
        ADDC  UT1330            R2  ;*    COMPUTE BASE_REL OFFSET;
        SVS                     R7  ;     SAVE OWN PSW;
        LDS          R4             ;     SWITCH TO OTHER PAGE
        SHS          R5         R2  ;     IF UPPER PART OF MEMORY
        JMP              UT1335     ;     THEN
        MOVL  0.     X5         R23 ;       SAVE CONTENT DURING TEST;
        MOVL         R01 0.     X5  ;       INSERT TEST PATTERN;
        MOVC  4096/2            R0  ;       REPEAT
        SOB          R0  LOC        ;       UNTIL 2-4 MSEC ELAPSED;
        MOVL  0.     X5         R01 ;       GET PATTERN FROM RAM;
        MOVL         R23 0.     X5  ;       RE-ESTABLISH CONTENT;
        JMP              UT1340     ;     ELSE
UT1330: NOP                         ;
UT1335: MOVL  0.     X5         R23 ;       SAVE CONTENT DURING TEST;
        MOVL         R01 0.     X5  ;       INSERT TEST PATTERN;
        MOVC  4096/2            R0  ;       REPEAT
        SOB          R0  LOC        ;       UNTIL 2-4 MSEC ELAPSED;
        MOVL  0.     X5         R01 ;       GET PATTERN FROM RAM;
        MOVL         R23 0.     X5  ;       RE-ESTABLISH CONTENT;
UT1340:                             ;     END PERFORMING TEST;
        LDS          R7             ;     RETURN OWN PAGE;
        MOV   UT13PATTERN       R2  ;
        MOV   UT13PATTERN+1     R3  ;
        SNEP         R0         R2  ;     IF MISMATCH IN 1ST
        SNE          R1         R3  ;        .OR. 2ND WORD
        JMP              UT1390     ;
UT1350:                             ;        .OR. LOCAL_INTERRUPT
                                    ;     THEN
        LDS          R7             ;       RESET LOCAL_INT'PT FLAG;
        MOV   PRINTOUT          R2  ;
        SEQ          R2  TRUE       ;     IF PRINT_OUT
        JMP              UT1390     ;     THEN
        SVP                         ;       SAVE REGISTERS DURING PRINT;
        MOVC  XCAUSE            R2  ;
        IEQ          X2  -1         ;       IF LOCAL INTERRUPT
        JMP              UT1370     ;       THEN
        SEQP         X2  2          ;         IF PARITY_ERROR
        SEQ          X2  3          ;            .OR. TIME-OUT
        JMP              LOCALACT   ;         THEN
        MOVC  -1                R0  ;
        XCH          R0         X2  ;
        SEQ          R0  2          ;
        JMP              UT1360     ;
        JMPI  S4     OUTSTRING,         <:PARITY ERROR:>, EOT
        JMP              UT1380     ;
UT1360:                             ;
        JMPI  S4     OUTSTRING,         <:TIME-OUT:>, EOT
        JMP              UT1380     ;
UT1370:                             ;       ELSE
        JMPI  S4     OUTSTRING,         <:MISMATCH:>, EOT
UT1380:                             ;
        JMPI  S4     OUTSTRING,         <: AT :>, EOT
        MOV   XBASE             R2  ;
        ADD          R5         R2  ;
        JMPI         S6  OUTHEXA    ;
        JMPI         S6  OUTNL      ;
        MOVC  XR0               R7  ;       POINT TOP SAVED REG_STACK;
        UNS              6          ;     RE-ESTABLISH REGS CONTENT;
UT1390:                             ;     END SERVING MISMATCH;
        ADDC  2                 R5  ;     ADJUST POINTER NEXT SEQUENCE;
        ADDC -1                 R6  ;
        INE          R6  0          ;
        SOB          R6  UT1320     ;   UNTIL WHOLE MEMORY AREA CHECKED;
        JMP              UT5020     ;   RETURN UTILITIES_MAIN_LINE;
;FF«ff»
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; PROCEDURE GET_HEXADECIMAL     O:(DELIMITER, BINARY_NUMBER);
;
; R0    -                           LAST ENTERED CHARACTER (DELIMITER)
; R1    -                           TRUE IF DATA ENTERED ELSE FALSE
; R2    -                           ENTERED BINARY_NUMBER (DEFAULT 0)
; R3-5  -                           KEPT
; R6    LINK                        DESTROYED
; R7    -                           DESTROYED
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                                    ;
SB1400:                             ;GET_HEXA:
        MOV          R6  SB14SV     ;   SAVE LINK;
        MOVC  FALSE             R1  ;   RISE NO_HEXA_YET FLAG;
        MOVC  0                 R2  ;   RESET VALUE;
SB1410:                             ;   REPEAT
        JMPI         S6  INCHAR     ;     GET NEXT CHARACTER;
        SEQ          R0  DEL        ;     IF CHAR = 'DELETE'
        JMP              SB1450     ;     THEN
        MOVC  <:*:>             R0  ;
        JMPI         S6  OUTCHAR    ;       FLAG DELETED;
        JMP              SB1400+1   ;       ALLOWE RE-ENTERING DATA;
SB1450:                             ;     ELSE
        MOV          R0         R6  ;
        ADDC  -(1+<:9:>)        R6  ;
        SHS          R6  <:A:>-(1+<:9:>); IF .NOT. '9' < CHAR < 'A'
        JMP              SB1490     ;     THEN
        ADDC  (1+<:9:>)+10-<:A:> R6 ;       ADJUST AS IF 'A'-'F';
        ILT          R6  10         ;       IF CHAR < <:A:>
        ADDC  -(10-<:A:>)-<:0:> R6  ;         ADJUST AS IF '0'-'9';
        IHS          R6  16         ;         ENSURE '0' <= CHAR <= 'F';
        JMP              SB1490     ;     END GETTING VALID HEXA;
        SLL          R2  4          ;     INSERT
        ADD          R6         R2  ;        NEWLY HEXA;
        MOVC  TRUE              R1  ;     FLAG HEX CHAR ENTERED;
        JMP              SB1410     ;
SB1490:                             ;   UNTIL SEPARATOR MET;
        INEP         R0  CR         ;
        INE          R1  TRUE       ;
        JMP              SB1410     ;
        JMPI             SB14SV     ;   RETURN CALLER;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; PROCEDURE WRITE_HEXADECIMAL I:(BINARY );
;
; R0-1,7 -                      DESTROYED
; R2    BINARY                  KEPT
; R3-5  -                       KEPT
; R6    LINK                    DESTROYED
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                                    ;
SB1500:                             ;WRITE_HEXA:
        MOV          R6  SB15SV     ;     ESTABLISH RETURN LINK;
        MOVC  4                 R1  ;   FOR I:=1 UNTIL 4
SB1510:                             ;   DO
        SLC          R2  4          ;     POSITION LEFT-MOST 4-BIT;
        MOV          R2         R0  ;
        XTR          R0  4          ;     ISOLATE PATTERN;
        IGE          R0  10         ;     IF ABOVE 10
        ADDC  <:A:>-<:0:>-10    R0  ;       THEN ADJUST;
        ADDC  <:0:>             R0  ;     MAKE HEXADECIMAL
        JMPI         S6  OUTCHAR    ;     WRITE_SINGLE_CHAR (CHAR);
        SOB          R1  SB1510     ;   END FOR_UNTIL;
        MOVC  <: :>             R0  ;   FORCE SPACE BETWEEN WORDS;
        JMPI         S6  OUTCHAR    ;
        JMPI             SB15SV     ;   RETURN CALLER;
;FF«ff»
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; PROCEDURE GET_ADDRESS
;
; R0-2,7 -                      DESTROYED
; R3    -                       '+'-FIELD (DEFAULT 1)
; R4    -                       PSW FOR SPECIFIED PAGE (DEFAULT 0)
; R5    -                       REF(FIRST_ADDRESS)
; R6    LINK                    DESTROYED
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                                    ;
SB1600:                             ;GET_ADDRESS:
        MOV          R6  SB16SV     ;
        JMPI         S6  INCHAR     ;   GET PAGE (IF ANY)
        ADDC  0-<:0:>           R0  ;   MAKE DECIMAL
        SHS          R0  4          ;   IF -1 < PAGE < 4
        MOD          R0             ;     THEN ADJUST FOR PAGE:
        MOV   SB16PAGE          R4  ;   GET MASKED PSW WITH PAGE BITS;
                                    ;
        JMPI         S6  GETHEXA    ;   GET START ADDRESS;
        MOV          R2         R5  ;
        SUB   XBASE             R5  ;   COMPENSATE OWN BASE;
        MOVC  0                 R2  ;
        IEQ          R0  <:.:>      ;   IF OFF_SET DESIRED
        JMPI         S6  GETHEXA    ;   THEN
        ADD          R2         R5  ;     ADJUST START_ADDRESS;
        MOVC  1                 R2  ;   PRESET OPTIONAL '+'-FIELD;
        IEQ          R0  <:+:>      ;   IF '+'-FIELD
        JMPI         S6  GETHEXA    ;     THEN GET VALUE;
        MOV          R2         R3  ;     SET UP LOOP_CONTROL;
        JMPI             SB16SV     ;   RETURN CALLER
;FF«ff»
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; PROCEDURE SET_PARITY
;
; R0-5,7   -                    DESTROYED
; R6    LINK                    DESTROYED
;
; NOTE - OWN BASE HAS TO BE MULTIPLA 512.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                                    ;
SB1700:                             ;SET_PARITY:
        MOV          R6  SB17SV     ;
        MOV          R6  SB17SV+1   ;   RESET PARITY ERROR FLAG;
        JMP          S4  SB1710     ;   BY-PASS LOCAL INTERRUPT ROUTINE;
;-----------------------------------;LOCAL_INTERRUPT:
        LDS          R7             ;   RESET BIT_11 (LOCAL INTERRUPT)
        MOV   XCAUSE            R1  ;   GET INTERRUPTING CAUSE;
        SEQ          R1  2          ;   IF PARITY ERROR
        JMP              SB1705     ;   THEN
        MOV          R1  SB17SV+1   ;
        LDS          R6             ;
        JMP              SB1750     ;     RETURN MAIN LINE FROM INTER'T;
SB1705:                             ;   END SERVING PARITY_ERROR;
        IEQ          R1  3          ;   IF TIME_OUT
        JMP              SB1760     ;     THEN CONTINUE NEXT SECTION;
        JMP              LOCALACT   ;   CAUSE NEITHER 2/3
                                    ;
;-----------------------------------;
SB1710:                             ;
        MOV          R4  XLOCACT    ;   SET-UP OWN LOCAL_ACTION;
                                    ;
        MOVC  4                 R2  ;   FOR I:=0 UNTIL PAGE 3
SB1720:                             ;   DO
        MOD          R2
        MOV   SB16PAGE-1        R6  ;     GET CURRENT PSW;
        MOVC  128               R3  ;     FOR I:=1 UNTIL 128 BLOCKS
        SVS                     R7  ;     DO
SB1730: MOV          R3         R5  ;
        SLL          R5  9          ;       ESTABLISH CORRECT START;
        MOVC  512               R4  ;       FOR I:=1 UNTIL 512 WORDS
        LDS          R6             ;       DO
SB1740: MOV   0.     X5         R0  ;         RE-ESTABLISH
SB1750: MOV          R0  0.     X5  ;            PARITY;
        ADDC  1                 R5  ;         ADJUST POINTER;
        SOB          R4  SB1740     ;       UNTIL ALL 1024 WORDS DONE;
SB1760: SOB          R3  SB1730     ;     UNTIL ALL 64 MODULES DONE;
        LDS          R7             ;     RETURN "OWN" PAGE;
        SOB          R2  SB1720     ;   UNTIL ALL PAGES DONE;
        MOVC  LOCALACT          R0  ;
        MOV          R0  XLOCACT    ;   RE-ESTABLISH;
        MOV   SB17SV+1          R0  ;
        SEQ          R0  2          ;   IF PARITY ERROR
        JMPI             SB17SV     ;   THEN
        JMPI         S4  OUTSTRING,     <:, MEM PARITY ERROR:>, EOT;
        JMPI             SB17SV     ;   RETURN CALLER;
                                    ;
;FF«ff»
$UTILITIES
NOLIST  IF FDSUPPORT THEN LIST
$FDLOAD
NOLIST  FI LIST
;FF«ff»
; I N I T I A L I Z E   C P U   T E S T   P R O G R A M
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Q;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                                    ;
TEC00:                              ;TEST_CPU:
        MOVC  B5555      R5         ;
        MOVL  0.     X5         R23 ;
        MOV   P5555             R0  ;
        MOV   PAAAA             R1  ;
        INE          R0         R2  ;   IF B5555_FIELD NOT CORRECT
        JMP              TEC10      ;      .OR.
        SNE          R1         R3  ;      BAAAA_FIELD NOT CORRECT
        JMP              TEC90      ;   THEN
TEC10:                              ;
                                    ;
        JMPI         S6  GETADDRESS ;   GET POSITION OF (PROMMED)
                                    ;      CPU_TEST SEQUENCES;
        MOVC  #1000             R3  ;   SET-UP COUNT (4K PROM);
        MOVC  0                 R0  ;   OBJECT_SECTION 0;
        MOV   TCBASE            R2  ;   GET "BASE" CPU_TEST PROGRAMS;
        MOV   XBASE             R7  ;
        SUB          R7         R2  ;   MAKE REL "OWN" BASE;
        JMPI         S6  COPY       ;   COPY CPU_TEST PROGRAMS
                                    ;   TO MEMORY #1000 UPWARDS;
        MOV   XBASE             R3  ;
        MOV   TCBASE            R1  ;   GET START OF CPU_TEST_PROGRAMS;
        SUB          R3         R1  ;   SET-UP CPU-TEST-"OWN=_BASE;
        MOV   TCBASE            R2  ;
        MOV   XPROG             R7  ;
        SUB          R7         R2  ;   SET-UP CPU_TEST-"OWN"_PROG;
        MOV          R1         R7  ;
        MOV   0.     X7         R0  ;   GET FIRST STATEMENT;
        INE          R0  #0158      ;   IF NOT 'JMP   LOC'
        JMPI             ERROR      ;     THEN ERRORONEOUS MODULE;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;  RAM RESIDENT VERSION ACCEPTED    ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        JMP          S4  LOC+2      ;   BY-PASS INSTRUCTION;
        JMPI         S4  OUTSTRING
        MVP   0.     X4         R0  ;   GET INSTRUCTION
        MOV          R0  0.     X7  ;      INSERTED AS FIRST OF AREA;
        MOV          R2         R6  ;
        JMP          S5  LOC+1      ;   ESTABLISH LINK BACK;
        JMP                     X6  ;   ACTIVATE RAM_RESIDING PART;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                                    ;RETURN_FROM_CUP_TEST:
                                    ;   R0,4,6,7 DESTROYED
                                    ;   R4 REF CPU_TEST PROGRAM_TABLE
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;  SET-UP CPU_TEST CONTROL          ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        ADD          R1         R4  ;   ADJUST REF(CPU_TEST_PGMS);
        MOV          R1         R7  ;
        MOVC  TCPOOL            R6  ;
TEC20:                              ;   REPEAT
        MOVL  0.     X4         R01 ;
        IEQ          R0  #BE        ;     IF TEST UNDEFINED (TRAP)
        SUB          R0         R0  ;       THEN FORCE DUMMY TEST;
        IEQ          R0  0          ;     IF DUMMY TEST
        JMP              TEC30      ;     THEN
        INE          R0  #8000      ;       IF NOT END_OF_TEST_FILE
        ADD          R2         R0  ;       ADJUST TO REL "ACTUAL" PROG;
TEC30:                              ;     END ADJUSTING PROG_REL;
        ADD          R7         R1  ;     ADJUST TO REL "ACTUAL" BASE;
        MOVL         R01 0.     X6  ;     MAKE
        ADDC  2                 R4  ;      REFERENCES
        ADDC  2                 R6  ;      RELATIVE;
        IBZ          R0  BIT15      ;
        JMP              TEC20      ;   UNTIL CPU_TEST AREA INITIALIZED;

                                    ;
        MOVC  0                 R7  ;
        MOV          R7  PGMLOOP    ;   INITIALIZE COUNTERS
        MOV          R7  PGMLOOP+1  ;
        MOV          R7  PGMNEXT    ;      AND CURRENT TEST PGM POINTER;
TEC90:  JMPI         S6  OUTNL      ;
                                    ;CONTINUE WITH CPU_TEST MAIN_LINE:
;FF«ff»
; C P U   T E S T   P R O G R A M   -   M A I N   L I N E
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
USE BASE                 ;
                         ; CPU_TEST_CONTROL_BLOCK LAY-OUT
        LOC= 0           ; ------------------------------
CTCBID: LOC= LOC+1       ;      IDENTIFICATION OF TEST
CTCBCNT:LOC= LOC+1       ;   NUMBER OF DATA IN TEST RUN
CTCBRST:LOC= LOC+1       ;   RESET VALUE (IF 0 THEN FIRST AREA COPIED)
CTCBDATA:LOC=LOC+1       ;   DATA AREA:
                         ;      1ST AREA (CNT) WORDS, EXPECTED DATA
                         ;      2ND AREA, INPUT DATA AREA
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
USE PROG                            ;   FOR I:=1 UNTIL TEST_LOOP_COUNT
                                    ;   DO
                                    ;     REPEAT UNTIL TABLE SCANNED
MAINLOOP:
        MOV   PGMEVALUATE       R0  ;   GET CHECK/PRINT-OUT FLAG
        MOV   PGMNEXT           R6  ;       GET REF(CUR'T TEST_PGM_NDX);
        MOV   TCPOOL+TCPPROG.X6  R4 ;       GET REF(CUR'T TEST_PGM_ADR);
        SNE          R0  TRUE       ;   IF EVALUATION
        IEQ          R4  0          ;      .AND. VALID TEST_PROGRAM
        JMP              MAI50      ;       THEN
;-----------------------------------;
;       EVALUATE TEST RESULTS       ;
;-----------------------------------;
        MOV   TCPOOL+TCPDATA.X6  R4 ;     GET REF(ASSOCIATED DATA_AREA)
        MOVC  CTCBDATA          R5  ;   OFF-SET TO EXPECTED DATA;
        ADD          R4         R5  ;     REF (EXPECTED_DATA_AREA);
        MOV   REFWORK           R7  ;     POINT WORK AREA;
        MOV   CTCBCNT.X4        R3  ;     FORI:=1 UNTIL NO_WORDS
MAI10:                              ;     DO
        IEQ          X5         X7  ;     IF DISCREPANCY
        JMP              MAI20      ;   THEN
        MOV          R7  MAISV      ;
        MOV          R4  MAISV+1    ;
        JMPI         S4  OUTSTRING,     <:TEST :>, EOT
        MOV   MAISV+1           R4  ;
        MOV   CTCBID.X4         R2  ;       GET TEST IDENTIFICATION
        JMPI         S6  OUTHEXA    ;
        JMPI         S4  OUTSTRING,     <: WORD :>, EOT
        MOV   MAISV+1           R4  ;
        MOV   CTCBCNT.X4        R2  ;       COMPUTE WORD
        SUB          R3         R2  ;          NUMBER;
        JMPI         S6  OUTHEXA    ;
        JMPI         S4  OUTSTRING,     <: TO BE :>, EOT
        MOV          X5         R2  ;       GET ACTUAL RESULT
        JMPI         S6  OUTHEXA
        JMPI         S4  OUTSTRING,     <:- WAS :>, EOT
        MOV   MAISV             R7  ;
        MOV          X7         R2  ;       GET EXPECTED
        JMPI         S6  OUTHEXA    ;       GET EXPECTED
        JMPI         S6  OUTNL      ;       WRITE_NEWLINE;
        MOV   MAISV+1           R4  ;
        MOV   MAISV             R7  ;       RE-ESTABLISH POINTER;
MAI20:                              ;     END DISCREPANCY;
        ADDC  1  R5,  ADDC  1   R7  ;
        SOB          R3  MAI10      ;     END FOR_UNTIL;
;-----------------------------------;
;  CHECK IF BREAK OCCURED           ;
;-----------------------------------;
MAI50:
        JMPI         S6  BREAKCHECK ;   BREAK_CHECK
        JMPI &       S6  UTILITIES  ;***   R:(BREAK OCCURED);
;-----------------------------------;
;       SEARCH NEXT TEST SEQUENCE   ;
;-----------------------------------;
        MOV   PGMNEXT           R6  ;   GET REF(TEST_PGM TABLE INDEX);
MAI55:                              ;   REPEAT
        ADDC  2                 R6  ;     POINT NEXT TEST_RECORD;
        MOV   TCPOOL+TCPPROG.X6  R7 ;     GET REF(TEST_PROGRAM);
        IEQ          R7  0          ;   IF VALID TEST
        JMP              MAI55      ;   THEN
        MOV          R6  PGMNEXT    ;     SAVE REFERENCE;
        SNE          R7  #8000      ;     IF STILL TEST PROGRAMS LEFT
        JMP              MAI80      ;     THEN
        MOV   TCPOOL+TCPDATA.X6  R4 ;       GET REF(ASSOCIATED DATA);
        MOVL  CTCBCNT.X4        R01 ;       GET NO_WORDS, RESET VALUE;
        ADD          R0         R4  ;        ADJUST FOR EXPECTED_AREA;
        MOV          R4         R5  ;
        MOV   REFWORK           R6  ;       POINT WORK AREA;
        IEQ          R1  0          ;       IF WHOLE AREA EQUAL 'R1'
        JMP              MAI65      ;       THEN
MAI60:                              ;       REPEAT
        MOV          R1         X6  ;         INITIALIZE AREA;
        ADDC  1                 R6  ;         ADJUST POINTER;
        SOB          R0  MAI60      ;       UNTIL AREA COVERED;
        JMP              MAI70      ;       ELSE
MAI65:                              ;       REPEAT
        MOV   CTCBDATA.X4       R2  ;         GET NEXT WORD
        MOV          R2         X6  ;            COPIED;
        ADDC  1  R4,   ADDC  1  R6  ;         ADJUST POINTERS;
        SOB          R0  MAI65      ;       END COPYING AREA;
MAI70:                              ;
        ADDC  CTCBDATA          R5  ;       ADJUST POINTER TO INPUT;
        MOVL  0.     X5         R01 ;
        MOVL  2.     X5         R23 ;
        MOV   4.     X5         R4  ;
        MOV   REFWORK           R6  ;       POINT WORK AREA;
        JMP                     X7  ;       EXECUTE TEST PROGRAM;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;  EXECUTE TEST SEQUENCE            ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                                    ;TEST_PROGRAM_ENTRY:
                                    ;   R0-4:FIRST 5 WORK_WORDS
                                    ;   R5 - REF(WORK_AREA)
                                    ;   R6 - REF(OUTPUT_AREA)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;       MAINTAIN LONG_INTEGER       ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MAI80:                              ;     END TABLE_SCAN;
        MOVC  0                 R6  ;     RE-ADJUST TO TOP
        MOV          R6  PGMNEXT    ;        PROGRAM_INDEX;
        MOVC  PGMLOOP           R6  ;     REF(TEST_LOOP_COUNT);
        MOVL  0.     X6         R01 ;     GET NO_TEST LEFT (LONG INT);
        ADDC  -1                R0  ;     ADJUST LEAST SIGNIFICANT;
        IEQ          R0  -1         ;     IF LEAST_SIGN'T BELOW
        ADDC  -1                R1  ;        THEN ADJUST MOST_SIGNIFI'T;
        SNEP         R0  -1         ;
        IEQ          R1  -1         ;     CPU_LOOP_TEST
        JMP              TESTEND    ;
                                    ;
        MOVL         R01 0.     X6  ;     SAVE;
        JMPI             MAINLINE   ;   END CPU_TEST_LOOP;




; E N D   P R O G R A M
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TESTEND:
        MOVC  <:*:>             R0  ;
        MOVC  44                R3  ;   FOR I:=1 UNTIL 44
END10:                              ;   DO
        JMPI         S6  OUTCHAR    ;     WRITE_CHAR;
        SOB          R3  END10      ;   END FOR_UNTIL;

        JMP              UT5010     ;   RETURN UTILITIES_MAIN_LINE;

;-----------------------------------------------------------------------
;FF«ff»
; M A S T E R   C L E A R   E N T R Y   P O I N T
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ENTRY POINT UPON MASTER CLEAR
;
; R2    POINTER PROMMED PROGRAM
; R4    PROG_REL ADDRESS OF AUTOMATIC SERVICE PROGRAM
; R5    POINTER PROMMED PROCESS_DESCRIPTOR
; R7    DEVICE ADDRESS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                                    ;
MCENTRYPOINT:                       ;ENTRY_POINT UPON MASTER CLEAR:
        SVP              MCWAITCPU  ;
        MOVC  0                 R6  ;
        MOV          R6  XR0        ;   RESET MEMORY CLAIM SEMAPHORE;
        MOVC  100               R6  ;
        SOB          R6  LOC        ;   WAIT 100-200 USEC;
        RESS         X6  BIT0       ;   RESERVE MEMORY
        JMP              MCE10      ;     (LOST: WAIT FOR CPU_INTERRUPT,
                                    ;      WON:  CONTINUE);
        MOV   MSEC              R6  ;
        SOB          R6  LOC        ;   WAIT 1 MSEC;
        JMP              MCE20      ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;  WAIT FOR WINNER'S CPU INTERRUPT  ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MCE10:                              ;LOOSER'S_FAITH:
        MOV          R1  XBASE      ;
        MOV          R1  XMOD       ;
        LDN                     R3  ;***ACTIVATE CPU WITH DUMMY PROCESS;
MCWAITCPU:
        LDM              2#101      ;   OPEN FOR CPU_INTERRUPTS ONLY;
        JMP              LOC        ;   WAIT FOR INTERRUPT;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;  INITIALIZE WINNING PROCESS       ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MCE20:                              ;INITIALIZE:
        MOVC  XABS              R7  ;   FOR I:=1 UNTIL COUNT
MCE30:                              ;   DO
        MOVL  0.     X5         R01 ;
        MOVL         R01 0.     X6  ;     COPY
        ADDC  2                 R5  ;        PROCESS
        ADDC  2                 R6  ;        DESCRIPTOR;
        SOB          R7  MCE30      ;   END FOR_UNTIL;

NOLIST  IF SCMMODE THEN LIST
MCE40:                              ;RETRY_AUTO_BOOT:
        MOV  _UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD__UNREAD_       XTR          R2  4          ;   ISOLATE SWITCH SETTING (BAUD);
        ADDC  SCMBAUD           R2  ;   SET-UP PROPER MODE REG 2;
        MODC             SCMMR2
        CIO          R2         R7  ;   LOAD MODE_REGISTER 2;
                                    ;
        SBZ          R0  BIT15      ;   IF MANUAL MODE
        JMP              MCE70      ;   THEN
NOLIST  ELSE  LIST
        MOV   OCADR             R7  ;   GET OC DEVICE ADDRESS
        MOVC  OCENB             R0  ;
        CIO          R0         R7  ;   ENABLE AV24;
        RIO          R0         R7  ;     STATUS FLAGS;
        SIO          R0         R7  ;   RESET
NOLIST  FI   LIST
                                    ;
        JMPI         S4  OUTSTRING,     <:<13>CSS/395/02  791101:>, EOT
        JMPI         S4  OUTSTRING,     <:<13>CPU :>, EOT
        SVS                     R0  ;   GET CURRENT PSW
        SWP                     R0  ;   POSITION CPU-NO AS RIGHTMOST;
        XTR          R0  3          ;   ISOLATE CPU NO;
        ADDC  <:0:>             R0  ;   CONVERT TO ASCII;
        JMPI         S6  OUTCHAR    ;   WRITE_CHAR;

MCE50:  JMPI         S6  UTILITIES  ;
        JMP              MCE50      ;

NOLIST  IF SCMMODE THEN LIST
;FF«ff»
;  A U T O M A T I C   M O D E
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;  AUTO MODE
; R0    SCM STATUS WORD
;       BIT12,11 DRIVE IDENTIFICATION
;       BIT13    TYPE OF DEVICE: 0=FD, 1=CDC-DISK
;       BIT14    BOOT INDIRECT VIA DMA-CHANNEL
;       BIT15    AUTO MODE FLAG (HIGH)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                                    ;
MCE70:                              ;AUTO_MODE:
        SBZ          R0  BIT13      ;   IF AUTO LOAD FROM FLOPPY
        JMP              MCE80      ;   THEN
        MOV          R0         R2  ;     FORCE DIRECT LOAD AS DEFAULT;
        IBN          R2  BIT14      ;     IF REQUEST FOR VIA DMA
        MOVC  <:X:>             R2  ;     THEN PREPARE INDIRECT LOAD;
        SRL          R0  BIT11      ;     POSITION DRIVE NUMBER;
        JMPI         S6  FDBLOAD    ;   LOAD_FILE FROM FD
        JMP &            MCE40      ;       FAILED:(RETRY),
        LDN                     R3  ;***  ACTIVATE LOADED PROCESS;
MCE80:                              ;   ELSE
        TRP              0          ;   INVALID SETTING

NOLIST  FI   LIST


;///////////////////////////////////;   END BASIC_INTITIALIZATION;
MCE90:                              ;RETURN_CALLER:
        MOV   XOLDPRC           R7  ;   GET BASE CALLING PROCESS
        LDN                     R7  ;   RE-ACTIVATE CALLING PROCESS;
ENDOFPGM:
;FF«ff»
PROGRAMSTART:= CPUPROM+PROGSTART
PROGRAMGO:=   PROGRAMSTART+MCENTRYPOINT
ABSMCE50:=    PROGRAMSTART+MCE50


IF LOC LT #0FE0
   THEN #0000, REPEAT (#FE0-LOC) AN #7FF
   ELSE MESSAGE LOC FI

RELPROMBASE=  PROGRAMSTART+LOC-CPUBASE
USE BASE
LOC= ENDOFDATA
IF LOC LT #1E
   #0000
    IF LOC LT #1E
        REPEAT (#1E-LOC)
    FI
FI
        PROGRAMSTART+EMERGENCY      ;   EMERGENCY ACTION SERVICE PROGRAM
        #0000            ;   PROM CHECK-SUM
BEGIN
    EXTERNAL  EOT
    EXTERNAL  BIT0, BIT1, BIT2, BIT3, BIT4, BIT5, BIT6, BIT7,
    EXTERNAL  BIT8, BIT9, BIT10, BIT11, BIT12, BIT13, BIT14, BIT15
  USE BASE
    EXTERNAL  CPUMON
    EXTERNAL  XBASE, XPROG
    EXTERNAL  TCBASE, TCREFWORK
    EXTERNAL  B5555, BAAAA, CP06, CP20INS, CPWORK
    EXTERNAL  CP46P, CP46
  USE PROG
    EXTERNAL  MAINLINE, P5555, PAAAA
    NAMES
END
;FF«ff»
END