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

⟦b74ca81d7⟧ TextFile

    Length: 34530 (0x86e2)
    Types: TextFile
    Names: »UTILIS«

Derivation

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

TextFile

;       U T I L I T I E S
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;       DUMP_UTILITY
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                                    ;
UT1500:                             ;DUMP:
        JMPI         S6  GETADDRESS ;   GET START_ADDRESS, NO_OF WORDS;
        ADD          R5         R3  ;   COMPUTE ENDING ADDRESS;
        IEQ          R0  CR         ;   IF END_ADDRESS
        JMP              UT1520     ;   THEN
        JMPI         S6  GETHEXA    ;     GET ENDING ADDRESS
        MOV          R2         R3  ;
        MODN  XBASE
        ADDC  1                 R3  ;     MAKE REL "OWN" BASE;
UT1520:                             ;   END SERVING END_ADDRESS;
        SRL          R5  4          ;
        SLL          R5  4          ;   ROUND START ADDRESS;
        SUB          R5         R3  ;   FOR I:=1 UNTIL NO_OF_WORDS
UT1540:                             ;   DO
        MOV          R5         R0  ;
        XTR          R0  3          ;     COMPUTE MODULO 8;
        IEQP         R0  8          ;     IF (ADDRESS MOD 8) .EQ. 8
        MOVC  <: :>             R0  ;       THEN
        JMPI         S6  OUTCHAR    ;       INSERT XTRA SPACE;
        JON          R0  UT1580     ;     IF (ADDRESS MOD 16) .EQ. 0
        JMPI         S6  OUTNL      ;       WRITE_NEWLINE;
        MOV   XBASE             R2  ;
        ADD          R5         R2  ;       COMPUTE ADDRESS NEXT DUMP;
        JMPI         S6  OUTHEXA    ;       WRITE_HEXADECIMAL (ADDRESS)
UT1580:                             ;     END IF NEW LINE;
        SVS                     R7  ;     SAVE OWN PSW;
        LDS          R4             ;     SWITH TO RELEVANT PAGE;
        MOV   0.     X5         R2  ;     GET NEXT WORD
        LDS          R7             ;     RE-ESTABLISH OWN PSW;
        JMPI         S6  OUTHEXA    ;        WRITEN
        ADDC  1                 R5  ;     ADJUST POINTER;
        SOB          R3  UT1540     ;   END FOR_UNTIL;
        JMP              UT5010     ;   RETURN UTILITIES_MAIN_LINE;
;FF«ff»
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;       PATCH_UTILITY
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                                    ;
UT1600:                             ;PATCH:
        JMPI         S6  GETADDRESS ;   GET START_ADDRESS, NO_OF WORDS;
        IEQ          R3  1          ;   IF MULTIPATCH
        JMP              UT1660     ;   THEN
        JMPI         S6  GETHEXA    ;     GET_HEXA (PATCH_PATTERN);
UT1620:                             ;     FOR I:=1 UNTIL COUNT
        SVS                     R7  ;     SAVE OWN PSW;
        LDS          R4             ;     SWITH TO RELEVANT PAGE;
        IEQ          R1  TRUE       ;     IF VALID PATCH DATA
        MOV          R2  0.     X5  ;       PATCH;
        LDS          R7             ;     RE-ESTABLISH OWN PSW;
        ADDC  1                 R5  ;       ADJUST POINTER;
        SOB          R3  UT1620     ;     END MULTI-PATCH LOOP;
        JMP              UT1690     ;   ELSE
UT1650:                             ;   REPEAT
        JMPI         S6  GETHEXA    ;     GET NEXT PATCH VALUE
        SVS                     R7  ;     SAVE OWN PSW;
        LDS          R4             ;     SWITH TO RELEVANT PAGE;
        IEQ          R1  TRUE       ;     IF PATCH DATA
        MOV          R2  0.     X5  ;     REPLACE OLD VALUE;
        LDS          R7             ;     RE-ESTABLISH OWN PSW;
        ADDC  1                 R5  ;     ADJUST POINTER;
UT1660: INE          R0  CR         ;
        JMP              UT1650     ;   UNTIL LAST_CHAR .EQ. CR/NL;
UT1690: JMP              UT5020     ;   RETURN UTILITIES_MAIN_LINE;
;FF«ff»
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;       SEARCH_UTILITY
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                                    ;
UT1700:                             ;
        JMPI         S6  GETADDRESS ;   GET START_ADDRESS, NO_OF WORDS;
        JMPI         S6  GETHEXA    ;   GET SEARCH PARAMETER;
UT1720:                             ;   REPEAT
        SVS                     R7  ;     SAVE OWN PSW;
        LDS          R4             ;     SWITH TO RELEVANT PAGE;
        SEQP         X5         R2  ;     IF MATCH
        LDS          R7             ;   RE-ESTABLISH OWN PAGE;
        JMP              UT1740     ;     THEN
        LDS          R7             ;     RE-ESTABLISH OWN PSW;
        SVP                         ;   SAVE REGISTERS DURING PRINT-OUT;
        JMPI  S4     OUTSTRING,         <:MATCH AT :>, EOT
        MOV   XBASE             R2  ;
        ADD          R5         R2  ;       COMPUTE PATTERN_ADDRESS;
        JMPI         S6  OUTHEXA    ;
        JMPI         S6  OUTNL      ;
        MOVC  XR0               R7  ;   POINT TOP REG_STACK (PROC_DESC);
        UNS              6          ;
UT1740:                             ;     END SERVING MATCH;
        ADDC  1                 R5  ;     ADJUST POINTER
        SOB          R3  UT1720     ;   UNTIL FILE END
        JMP              UT5020     ;   RETURN UTILITIES_MAIN_LINE;





;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;       XECUTE_UTILITY
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                                    ;
UT1800:                             ;
        JMPI         S6  GETADDRESS ;   GET PAGE/BASE OF PROCESS
        ADD   XBASE             R5  ;   COMPUTE BASE_ADDRESS;
        LDS          R4             ;   SWITCH TO RELEVANT PAGE;
        LDN          R5             ;   ACTIVETE PROCESS
;FF«ff»
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;       COPY
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                                    ;
UT1900:                             ;COPY_MOMORY
        JMPI         S6  GETADDRESS ;   GET PAGE/SOURCE_ADDRESS/COUNT
        JMPI         S6  GETHEXA    ;   GET OBJECT_ADDRESS
        SUB   XBASE             R2  ;   ADJUST FOR OWN BASE
        IEQ          R0  <:/:>      ;   IF PAGE TO BE SPECIFIED
        JMPI         S6  INCHAR     ;     GET SPECIFIED PAGE;
        ADDC -<:0:>             R0  ;
        JMP          S6  SB1900     ;   COPY SOURCE TO OBJECT_AREA;
        JMP              UT5010     ;   RETURN UTILITIES_MAIN_LINE;


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; PROCEDURE COPY   I:(REF(SOURCE), REF(OBJECT), PAGE);
; R0    OBJECT MEMORY_SECTION       DESTR
; R1    -                           DESTR
; R2    REF(START OBJECT_AREA)      DESTR
; R3    WORDS TO COPY               DESTR
; R4    PSW FOR SOURCE_AREA         KEPT
; R5    REF(START SOURCE_AREA)      DESTR
; R6    LINK                        KEPT
; R7    -                           DESTR
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                                    ;
SB1900:                             ;   COPY
        SHS          R0  4          ;   IF VALID SPECIFIED PAGE
        MOD          R0             ;     USE IT
        MOV   SB16PAGE          R0  ;   SET-UP RELEVANT PSW_PATTERN;
        SVS                     R7  ;   SAVE OWN PSW;
UT1950:                             ;   REPEAT
        LDS          R4             ;     SWITCH TO SOURCE SECTION;
        MOV   0.     X5         R1  ;     GET WORD;
        LDS          R0             ;     SWITCH TO ALTERNATIVE PAGE;
        MOV          R1         X2  ;
        INCD         R5         R2  ;     ADJUST ADDRESSES;
        SOB          R3  UT1950     ;   UNTIL SOURCE_AREA COPIED;
        LDS          R7             ;   RE-ESTABLISH "OWN" MEM_SECTION;
        JMP                     X6  ;   RETURN CALLER;
;FF«ff»
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;       IO_UTILITIES
;
; USING:   UT20SV, PGMLOOP[0:1]
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                                    ;
UT2000:                             ;IO:
        MOVC  0                 R3  ;
        MOV          R3  UT20SV+1   ;   DEFAULT NO MODIFICATION;
        MOV          R3  PGMLOOP+1  ;   RESET LOOP_COUNT (LONG_INTEGER);
        JMPI         S4  OUTSTRING
              <:O::>, EOT
        JMPI         S6  INCHAR     ;   GET IO_TYPE;
        ADDC -<:O:>             R0  ;
        MOV          R0  UT20SV     ;
                                    ;
        JMPI         S6  GETADDRESS ;
        SEQ          R0  <:):>      ;   IF MODIFICATION ACTIVE
        JMP              UT2010     ;   THEN
        ADD   XBASE             R5  ;     RE-ESTABLISH ENTERED DATA;
        MOV          R5  UT20SV+1   ;
        JMPI         S6  GETADDRESS ;     GET DEVICE_ADDRESS, REPEATS;
UT2010:                             ;   END GETTING MODIFICATION;
        ADD   XBASE             R5  ;     BEWARE WAS BASE_REL;
        SEQ          R0  <:_:>      ;   IF LONG_INTEGER
        JMP              UT2020     ;   THEN
        JMPI         S6  GETHEXA    ;
        IEQ          R2  0          ;     IF LEAST SIGNIFICANT PART 0
        ADDC  -1                R3  ;        THEN ADJUST MOST SIGN;
        MOV          R3  PGMLOOP+1  ;     PREPARE MOST SIGNIFICANT PART;
        MOV          R2         R3  ;     SET UP LEAST SIGNIFICANT PART;
UT2020:                             ;   END GETTING LONG INTEGER;
        MOV   UT20SV            R4  ;
                                    ;   CASE IO_TYPE OF
        IEQ   R4     <:S:>-<:O:>, JMP     UT2050
        IEQ   R4     <:R:>-<:O:>, JMP     UT2060
        JMPI         S6  GETHEXA    ;   GET ADDITIONAL PARAMETER;
        IEQ   R4     <:C:>-<:O:>, JMP     UT2070
        IEQ   R4     <:K:>-<:O:>, JMP     UT2075
        IEQ   R4     <:W:>-<:O:>, JMP     UT2080
        IEQ   R4     <:V:>-<:O:>, JMP     UT2085
        JMPI             ERROR      ;
                                    ;
UT2050:                             ;SIO:
        JMP          S6  UT2090     ;
        MOD                     R7  ;
        SIO          R2         R5  ;
        JMP              UT2140     ;
UT2060:                             ;RIO:
        JMP          S6  UT2090     ;
        MOD                     R7  ;
        RIO          R2         R5  ;
        JMP              UT2140     ;
UT2070:                             ;CIO:
        MOD                     R7  ;
        CIO          R2         R5  ;
        JMP              UT2180     ;
UT2075:                             ;CIO:  SINGLE_STEP
        JMP          S6  UT2090     ;
        MOD                     R7  ;
        CIO          R2         R5  ;
        JMP              UT2160     ;
UT2080:                             ;WIO:
        JMP          S6  UT2090     ;
        MOD                     R7  ;
        WIO          R2         R5  ;
        JMP              UT2180     ;
UT2085:                             ;WIO:  SINGLE_STEP
        JMP          S6  UT2090     ;
        MOD                     R7  ;
        WIO          R2         R5  ;
        JMP              UT2160     ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
UT2090:                             ;COMMON_INITIALIZATION:
        MOVC  0                 R4  ;
        MOV   UT20SV+1          R7  ;
        SNE          R7  0          ;   IF NO MODIFICATION
        ADDC  1                 R6  ;     THEN ADJUST POINTER;
        MOV          R6  UT20SV     ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
UT2100:                             ;   REPEAT
        MOV   UT20SV+1          R7  ;   GET MODIFICATION REGISTER;
        JMPI             UT20SV     ;     EXECUTE RELEVANT IO_INSTR;
                                    ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
UT2140:                             ;WRITE_IO_RESULTS:
        MOV   PRINTOUT          R7  ;
        SEQ          R7  TRUE       ;   IF PRINT_OUT
        JMP              UT2180     ;   THEN
        JMPI         S6  OUTHEXA    ;     DUMP STATUS
        ADDC  1                 R4  ;   MAINTAIN DATA COUNT
        MOV          R4         R0  ;
        XTR          R0  3          ;     ISOLATE BUT LOWER 3;
        IEQ          R0  0          ;     IF (COUNT MOD 8) EQ 0
        JMPI         S6  OUTNL      ;       THEN TIME FOR NEW LINE;
        JMP              UT2180     ;
UT2160:                             ;GET_NEXT_PARAMETER:
        JMPI         S6  GETHEXA    ;
UT2180:                             ;
        SOB          R3  UT2100     ;   PERFORM LEAST_SIGN LOOP_CONTROL;
        JMPI         S6  BREAKCHECK ;     BREAK_CHECK
        JMP              UT2190     ;       R:(BREAK OCCURED);
        MOV   PGMLOOP+1         R6  ;   GET MOST SIGNIFICANT PART
        ADDC  -1                R6  ;   MAINTAIN COUNTER;
        INEP         R6  #FFFF      ;
        MOV          R6  PGMLOOP+1  ;
        JMP              UT2100     ;   UNTIL LONG_INTER ZEROED; (-1);
UT2190:                             ;END_OF_IO_UTILITY:
        JMP              UT5010     ;   RETURN UTILITIES_MAIN_LINE;
;FF«ff»
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;       WAIT_INTERRUPT
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                                    ;
UT2500:                             ;WAIT_INTERRUPT:
        JMPI         S6  GETHEXA    ;   GET_HEXA) DEVICE);
        XTR          R2  6          ;     ISOLATE DEVICE_NO;
        MOV   XBASE             R5  ;   "OWN" PROCESS BASE;
        SVP              UT2520     ;
        JMP              UT2540     ;   CONTINU PROCESSING;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;  WAIT DUMMY INTERRUPT             ;
;       EXECUTED BY DUMMY PROCESS   ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
NOLIST  IF SCMMODE THEN LIST
                                    ;WAIT_DUMMY_INTERRUPTS:
UT2520:                             ;   REPEAT
        LDM   2#110                 ;     OPEN FOR I/O UNTERRUPTS;
        MOV   SCMADR            R7  ;     GET DEVICE ADDRESS;
        MODC             SCMSTATUS
        SIO          R0         R7  ;     SENSE(STATUS, DEVICE);
        SBZ          R0  SCMIRDY    ;     CHECK IF BREAK OCCURED
        IBZ          R0  SCMFRAME   ;        SINCE LAST CHECK
        JMP              UT2520     ;   UNTIL BREAK OCCURED;
        LDM              2#111      ;   CLOSE I/O WINDOW;
        JMPI         S4  OUTSTRING,     <:MISSING INTERRUPT<13>:>, EOT
        LDN                     R5  ;   ACTIVATE MASTER PROCESS;
NOLIST  ELSE LIST
UT2520:                             ;WAIT_DUMMY_INTERRUPT:
                                    ;   REPEAT
        LDM   2#110                 ;     OPEN FOR I/O INTERRUPTS;
        MOV   OCADR             R7  ;
        SIO          R0         R7  ;     SENSE(STATUS, DEVICE);
        SBZ          R0  OCIRDY     ;     CHECK IF FRAMING ERROR
        IBZ          R0  OCBREAK    ;     SINCE LAST CHECK
        JMP              UT2520     ;   UNTIL BREAK OCCURED;
        LDM              2#111      ;   CLOSE WINDOW AGAIN;
        JMPI         S4  OUTSTRING,     <:MISSING INTERRUPT<13>:>, EOT
        LDN                     R5  ;   ACTIVATE MASTER PROCESS
NOLIST  FI   LIST
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;  INITIALIZE INTERRUPT TABLES      ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
UT2540:                             ;CONTINUATION:
        IEQP         R1  TRUE       ;   IF DATA ENTERED THEN
        MODC & CPUIVB+64
        MODN & XBASE                ;     COMPENSATE FOR DEFAULT ALL;
        MOD   XBASE
        MOVC  0                 R0  ;   SET UP PROCESS EXPECTING INT'PT;
        NEG                     R5  ;   POINT TOP OF MEMORY SECTION 0;
        MOVC  CPUIVB            R4  ;   POINT INTERUPT_VECTOR_TABLE;
        ADD          R5         R4  ;
        MOVC  64                R7  ;   FOR I:=1 UNTIL MAX_DEVICES
UT2550:                             ;   DO
        MOV          R0  0.     X4  ;     INSERT BASE IN INTER_RUPT_TAB;
        ADDC  1                 R4  ;     ADJUST POINTER;
        SOB          R7  UT2550     ;   UNTIL TABLE PREPARED;
                                    ;
        MOVC  CPUIVB            R3  ;   PREPARE ALL PRIORITY LEVEL2
        MOV          R3  CPUIVT+0.X5;     WITH
        MOV          R3  CPUIVT+1.X5;     ADDRESS OF SAME
        MOV          R3  CPUIVT+2.X5;     INTERRUPT
        MOV          R3  CPUIVT+3.X5;     VECTOR TABLE;
        ADDC  64                R3  ;   BASE DUMMY PROCESS;
        MOV          R3  CPUIVR.X5  ;   PREPARE SYSTEM BASE WITH "OWN";
                                    ;
       ;MOVC  XR0               R7  ;   POINT TOP OWN PROCESS;
        MOVM         X7         X4  ;   CREATE
        MOVM         X7         X4  ;      DUMMY PROCESS;
        ADDC -2*16              R4  ;      DUMMY PROCESS;
        MOV          R3  XBASE. X4  ;   PREPARE BASE
        MOV          R3  XMOD.  X4  ;      AND MOD REGISTER;
                                    ;
UT2560:                             ;
                                    ;REARM_INTERRUPT_TABLE:
        MODN  XBASE
        MOVC  CPUIVB            R5  ;   POINT START INTERRUPT TABLE;
        MOV   XBASE             R1  ;
        MOV          R1  0.     X5  ;   PREPARE FOR TIMER;
        MOD              OCADR
        MOV          R1  0.     X5  ;      OPERATOR'S CONSOLE
        MOD                     R2  ;  SELECTED DEVICE;
        MOV          R1  0.     X5  ;
                                    ;
        SVP              UT2580     ;
        LDN          R3             ;   ACTIVATE DUMMY INTERRUPT_PROC;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;  INTERRUPT OCCURED                ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
UT2580:                             ;WAKE_UP:
NOLIST  IF SCMMODE THEN LIST
        JMPI         S6  BREAKCHECK ;   PERFORM BREAK-CHECK;
        JMP              UT5020     ;***  RETURN(BREAK ACTIVATED);
NOLIST  ELSE LIST
        MOV   OCADR             R7  ;
        SIO          R0         R7  ;   SENSE(STATUS, DEVICE);
        IBNP         R0  OCBREAK    ;   TEST WAS INTERRUPTED BY BREAK
        RIO &        R0         R7  ;       EMPTY OC_RX_BUFFER;
        JMP &            UT5020     ;       TERMINATE TEST;
                                    ;   ELSE
NOLIST  FI   LIST
                                    ;
        MOV   XDEVICE           R2  ;
        IEQ          R2  #FFFF      ;   IF CPU_INTERRUPT OR LDP
        JMPI             ERROR      ;   THEN ERROR
                                    ;   ELSE
        MOV   PRINTOUT          R0  ;
        SNE          R0  TRUE       ;   IF PRINT-OUT
        IEQ          R2  0          ;      .AND.NOT. TIMER_INTERRUPT
        JMP              UT2590     ;   THEN
        MOV   OCADR             R7  ;
        SRL          R2  2          ;     ISOLATE DEVICE_NO;
        SNE          R2         R7  ;     IF .NOT. OC_INTERRUPT
        JMP              UT2590     ;     THEN
        JMPI         S4  OUTSTRING,     <:IO INTERRUPT, DEV=:>, EOT
        JMPI         S6  OUTHEXA    ;
        JMPI         S4  OUTSTRING,     <:, PRIO=:>, EOT
        MOV   XDEVICE           R0  ;
        XTR          R0  2          ;   ISOLATE PRIORITY;
        ADDC  <:0:>             R0  ;     CONVERT TO ASCII
        JMPI         S6  OUTCHAR    ;
        JMPI         S6  OUTNL      ;
UT2590:                             ;   END PRINTING;
        JMP              UT2560     ;   UNTIL BREAK OCCURED;
;FF«ff»
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;       SWITCH_CPU
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                                    ;
UT2800:                             ;SWITCH_CPU:
        JMPI         S6  INCHAR     ;   GET NEW MASTER CPU_NO;
        ADDC -<:0:>             R0  ;
        IHS          R0  8          ;   IF INVALID
        JMPI             ERROR      ;     THEN FLAG SO;
        JMP          S6  SB2800     ;   SEND_CPU_MESSAGE;
        JMP              UT5010     ;   RETURN UTILITIES_MAIN_LINE;



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; PROCEDURE SEND_CPU_MESSAGE    I:(CPU_NO);
; THE PROCEDURE WILL PREPARE THE CPU_MESSAGE_AREA SUCH THAT THE
; SPECIFIED CPU WILL CONTINUE WHILE CURRENT ONE GOES ASLEEP.
; THE SPECIFIED CPU IS AWAKENED BY A CPU_INTERRUPT.
; N O T E  NO CHECK IS PERPORMED TO VERIFY THE EXISTANCE OF THE OTHER.
;
; R0    CPU TO BE ACTIVATED     DESTROYED
; R2,3,7 -                      DESTROYED
; R4    -                       POINTER TO TOP OF PAGE 0
; R6    LINK                    KEPT
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                                    ;
SB2800:                             ;SEND_CPU_MESSAGE:
        MODN  XBASE
        MOVC  #0000             R4  ;   POINT TOP OF MEMORY "OWN" PAGE;
        MOVC  CPUDUMMY          R7  ;
        MOVC  CPUMSG            R2  ;   OTHER'S CPU'S MESSAGE;
        MOD                     R2
        MOV          R7  0.     X4  ;   INSERT DUMMY_BASE IN MESSAGE;
        SETS         R2  BIT15      ;   FORCE MESSAGE RESERVED;
        MOVC  8                 R3  ;   FOR U:=1 UNTIL 8 CPU'S
SB2810:                             ;   DO
        MOV          R2  CPUCPU.X4  ;     INSERT POINTER;
        ADDC  1                 R4  ;     ADJUST ADDRESS;
        SOB          R3  SB2810     ;   UNTIL CPU MESSAGE_AREA DONE;
        ADDC  -8                R4  ;   RE-ESTABLISH POINTER
                                    ;
        MOV   XBASE             R2  ;   USE "OWN" BASE_REGISTER
        ADDC  XBASE             R2  ;      AS POINTER;
        MOD                     R0
        MOV          R2  CPUCPU.X4  ;
                                    ;
        SVP              SB2820     ;   PREPARE OTHER CPU'S PROCESS;
        JMP              SB2825     ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;  OTHER CPU'S FAITH                ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SB2820:                             ;OTHER'S_FAITH:
        LDM   2#101
        JMP              LOC        ;   WAIT FOR CPU_&NTERRUPT;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;  CREATE LOOSER'S SLEEPING PROCESS ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SB2825:                             ;MASTER_PROCESS_CONTINUATION:
        ADD          R7         R4  ;   POINT DUMMY CPU_PROCESS;
       ;MOVC  XR0               R3  ;
        MOVM         X3         X4  ;   CREATE DUMMY
        MOVM         X3         X4  ;      CPU_INTERRUPT SERVICE PROCES;
        ADDC  -32               R4  ;
        MOV          R7  XBASE. X4  ;   PREPARE BASE
        MOV          R7  XMOD.  X4  ;      AND MOD_REGISTERS;
        SUB          R7         R4  ;
                                    ;
        SVS                     R2  ;
        LDM   2#101                 ;
        CPU                         ;   ACTIVATE ALL CPU'S
        MOV   MSEC              R7  ;
        SOB          R7  LOC        ;   WAIT  1 MSEC;
        LDS          R2             ;   RE-ESTABLISH OLD PSW;
        JMP                     X6  ;   RETURN CALLER;
;FF«ff»
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;       UNIT_MAPPER
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                                    ;
UT2900:                             ;MAP_CPU'S:
        JMPI         S4  OUTSTRING,     <:<13>CPU: :>, EOT
        SVS                     R5  ;
        MOV          R5         R0  ;
        SWP                     R0  ;
        XTR          R0  3          ;   ISOLATE "OWN" CPU_NO;
        JMP          S6  SB2800     ;   SEND_CPU_MESSAGE("OWN"_CPU);
                                    ;
        MOVC  8                 R3  ;   FOR I:=1 UNTIL 8 CPU'S
UT2930:                             ;   DO
        MOVC  <:1:>             R0  ;     CPU EXIST BY DEFAULT;
        SOZ   CPUCPU.X4             ;     IF NO_MESSAGE ACCEPTED
        MOVC  <:.:>             R0  ;       THEN FLAG SO;
        JMPI         S6  OUTCHAR    ;
        ADDC  1                 R4  ;
        SOB          R3  UT2930     ;   END MAPPING CPU'S;

        JMP          S4  UT2950     ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;  SERVE MISSING MODULE/TIME_OUT    ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
                                    ;TIME_OUT:
        MOV   XCAUSE            R6  ;
        IEQ          R6  2          ;   IF PARITY_ERROR
        JMP              UT2940     ;     THEN OK;
        INE          R6  3          ;   IF TIME_OUT
        JMP              LOCALINT   ;***  THEN IT DESERVES SPECIAL CARE;
        MOVC  <:.:>             R0  ;   FLAG MISSING 4K_RAM/IO_MODULE;
UT2940:                             ;PRINT_RESULT:
        LDS          R5             ;   RE-ESTAB "OWN" PSW, LOWER BIT11;
        MOV          R3         R6  ;
        XTR          R6  4          ;   IF (COUNT MOD 16) .EQ. 0
        IEQ          R6  7          ;   IF (COUNT MOD 16) .EQ. 7
        ADDC  <: :><8           R0  ;     THEN INSERT EXTRA SPACE;
        IEQ          R6  15         ;   IF (COUNT MOF 16) .EQ. 15
        ADDC  <:/:><8           R0  ;     THEN ADJUST;
        JMPI         S6  OUTCHAR    ;   PRINT CURRENT CHAR;
        SRL          R0  8          ;   POSITION EVENTUAL SECOND CHAR;
        INE          R0  0          ;   IF ANY 2ND CHAR
        JMPI         S6  OUTCHAR    ;     THEN PRINT AS WELL;
        ADDC  1                 R3  ;   MAINTAIN CURRENT MODULE_NO;
        SHS          R3  64         ;   IF STILL MODULES LEFT
        JMP              1.     X4  ;     THEN RETURN SERVE
        JMP              0.     X4  ;     ELSE DONE WITH THIS SECTION;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;       MAP RAM'S                   ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
UT2950:                             ;MAP_RAM'>:
        MOV          R4  XLOCACT    ;   SET_UP OWN LOCAL_ACTION;
        JMPI         S4  OUTSTRING,     <:<13>RAM: :>, EOT
        MOVC  0                 R3  ;   FOR I:=1 UNTIL 4*16 4K_RAM'S
        JMP          S4  UT2960     ;   DO
        JMP              UT2970     ;   **EXIT WHEN RAM'S TESTED;
UT2960: MOVC  <:1:>             R0  ;     SET-UP UNIT_EXIST;
        MOV          R3         R6  ;
        SRL          R6  4          ;     POSITION MEMORY_SECTION;
        MOD          R6
        MOV   SB16PAGE          R6  ;   SET-UP PAGE;
        MOV          R3         R7  ;
        SLL          R7  12         ;     COMPUTE CORRECT ADDRESS;
        SUB   XBASE             R7  ;
        LDS          R6             ;     SWITCH TO RELEVANT PAGE;
        MOV   0.     X7         R6  ;     TEST RELEVANT 4K_RAM;
        JMP              UT2940     ;   UNTIL ALL MODULES SERVED;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;       MAP IO_MODULES              ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
UT2970:                             ;MAP IO_MODULES:
        JMPI         S4  OUTSTRING,     <:<13>IO:  :>, EOT
        MOVC  0                 R3  ;   FOR I:=0 UNTIL 63 IO_MODULES
        JMP          S4  UT2980     ;   DO
        JMP              UT2990     ;   **EXIT WHEN ALL IO_MODULES DONE;
UT2980: MOVC  <:1:>             R0  ;     DEFAULT EXESTING MODULE;
        SIO          R6         R3  ;     SENSE(STATUS, DEVICE);
        JMP              UT2940     ;   UNTIL ALL MODULES SERVED;
                                    ;
UT2990:                             ;
        JMP              UT5010     ;   RETURN UTILITIES_MAIN_LINE;
;FF«ff»
; E X E R C I Z E   O P T I O N S
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
OPT00:                              ;OPTIONS:
        JMPI         S6  OUTNL      ;
        JMPI  S4     OUTSTRING,         <:PRINT-OUT  ?<62>:>, EOT
        JMPI         S6  INCHAR     ;
        ADDC  TRUE-YES          R0  ;
        MOV          R0  PRINTOUT   ;
                                    ;
        MOVC  0                 R0  ;
        MOV          R0  PGMNEXT    ;       RESET TEST_PGM_CONTROL;
                                    ;
        JMPI         S6  OUTNL      ;
        JMPI  S4     OUTSTRING,         <:NO OF TESTS <62>:>, EOT
        JMPI         S6  GETHEXA    ;   GET FIRST PART OF COUNT
        MOV          R2         R3  ;
        MOVC  0                 R2  ;   PRESET MOST SIGNIFICANT
        INEP         R0  CR         ;   IF LEAST SIGNIFICANT TOO
        JMPI &       S6  GETHEXA    ;
        XCH  &       R3         R2  ;     POSITION;
        ADDC  -1                R3  ;   ADJUST LEAST SIGNIFICANT PART;
        IEQ          R3  -1         ;   IF LOWER PART OVERFLOW
        ADDC  -1                R2  ;     THEN ADJUST MOST SIGNIFICANT;
        MOV          R2  PGMLOOP+1  ;   SAVE MOST  SIGNIFICANT PART
        MOV          R3  PGMLOOP    ;     LEAST SIGNIFICANT AS WELL;
        JMP              UT5020     ;   RETURN UTILITIES MAIN LINE;
;FF«ff»
; B O O T   U T I L I T I E S
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;       BOOT_UTILITIES
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
UT3000:                             ;BOOT_LOAD:
        JMPI         S4  OUTSTRING,     <:OOT :>, EOT
        JMPI         S6  INCHAR     ;   GET TRANSFER TYPE
        MOV          R0         R2  ;
        JMPI         S4  OUTSTRING,     <:D: :>, EOT
        JMPI         S6  INCHAR     ;   GET FD DRIVE_NO;
        JMPI         S6  FDBLOAD    ;   LOAD_FILE FROM FD
        JMP &            UT5010     ;***  FAILED: RETURN_MAIN_LINE;
                                    ;      R:(FILE OK);
        JMPI         S6  OUTNL      ;
        LDS          R2             ;   CHANGE TO RELEVANT PAGE;
        LDN          R3             ;   ACTIVATE BOOT FILE;



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;       LOAD_UTILITIES
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
UT3100:                             ;LOAD_FILE:
        JMPI         S4  OUTSTRING,     <:OAD :>, EOT
        JMPI         S6  INCHAR     ;   GET DEVICE IDENTIFICATION
        MOV          R0         R2  ;
        JMPI         S4  OUTSTRING,     <:D: :>, EOT
        JMPI         S6  INCHAR     ;   GET FD DRIVE_NO;
        JMPI         S6  FDBLOAD    ;   LOAD_FILE FROM FD;
        JMP &            UT5010     ;***  FAILED: RETURN_MAIN_LINE;
        JMP              UT5010     ;   RETURN UTILITIES_MAIN_LINE;
;FF«ff»
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
UT5000:                             ;UTILITIES:
        MOV          R6  UT50SV     ;   SAVE RETURN ADDRESS;
UT5010:                             ;
        JMPI         S6  OUTNL      ;
UT5020:                             ;
        MOVC  LOCALACT          R0  ;
        MOV          R0  XLOCACT    ;   RE-ESTABLISH TO COMMON LOCAL
                                    ;
        MOVC  <:<62>:>          R0  ;
        JMPI         S6  OUTCHAR    ;   WRITE '>'
        JMPI         S6  INCHAR
        ADDC -<:O:>             R0  ;
        JMP          S6  UT5050     ;   ESTABLISH LINK
        JMP              UT5010     ;
UT5050:                             ;
                                    ;   CASE CHAR OF
        IEQ      R0  <:B:>-<:O:>, JMPI    BOOTLOAD
        IEQ      R0  <:C:>-<:O:>, JMPI    COPYMEMORY
        IEQ      R0  <:D:>-<:O:>, JMPI    DUMP
        IEQ      R0  <:F:>-<:O:>, JMPI    DOWNLOADLTU
        IEQ      R0  <:I:>-<:O:>, JMPI    IO
        IEQ      R0  <:L:>-<:O:>, JMPI    LOADFILE
        IEQ      R0  <:M:>-<:O:>, JMPI    MEMCHECK
        IEQ      R0  <:O:>-<:O:>, JMPI    OPTIONS
        IEQ      R0  <:P:>-<:O:>, JMPI    PATCH
        IEQ      R0  <:Q:>-<:O:>, JMPI    SWITCHCPU
        IEQ      R0  <:R:>-<:O:>, JMPI    RETURNCALLER
        IEQ      R0  <:S:>-<:O:>, JMPI    SEARCH
        IEQ      R0  <:T:>-<:O:>, JMPI    TESTCPU
        IEQ      R0  <:U:>-<:O:>, JMPI    UNITS
        IEQ      R0  <:W:>-<:O:>, JMPI    WAITINTERRUPT
        IEQ      R0  <:U:>-<:O:>, JMPI    UNITS
        IEQ      R0  <:X:>-<:O:>, JMPI    XECUTE
        IEQ      R0  <:Z:>-<:O:>, JMPI    SETPARITY
        IEQ      R0  <:<:>-<:O:>, JMPI    UT50SV
UT5090:                             ;ERROR:
        MOVC  <:?:>             R0  ;
        JMPI         S6  OUTCHAR    ;
        JMP              UT5010     ;
;FF«ff»
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;       DOWN_LOAD LTU UTILITY
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
USE BASE                            ;
                         ;LTU DOWN-LOAD CONTROL BLOCK
        LOC= 0           ;---------------------------
LTUID:  LOC= LOC+3       ;   LTU DOWNLOAD PROGRAM IDENTIFICATION
                         ;   HAS TO START WITH 'LTU<0>'
LTUPGMS:LOC= LOC+1       ;   NUMBER OF DLTU_DOWN-LOAD PROGRAMS
LTUPGM: LOC= LOC+1       ;   ADDRESS LTU DOWNLOAD PROGRAM(S)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
USE PROG                            ;
                                    ;
UT6000:                             ;DOWN-LOAD_LTU:
        JMPI         S6  GETHEXA    ;   GET LTU_PGM_CONTROL_BLOACK ADDR;
        MOV          R2         R5  ;
        MOV   XBASE             R3  ;
        SUB          R3         R5  ;
        MOVL  LTUID. X5         R12 ;   GET MODULE IDENTIFICATION;
        ADDC -<:LT:>            R1  ;
        ADDC -<:U<0>:>          R2  ;
        IEQ          R1  0          ;   IF IDENTIFICATION .EQ.
        SEQ          R2  0          ;     'LTU<0>'
        JMPI             ERROR      ;   THEN
        MOVC  0                 R2  ;     DEFAULT PGM_NO 0;
        IEQ          R0  <:.:>      ;
        JMPI         S6  GETHEXA    ;       GET LTU_PGM_NUMBER;
        IHS          R2  LTUPGMS.X5 ;     IF WITHIN VALID RANGE
        JMPI             ERROR      ;     THEN
        MOD          R2
        MOV   LTUPGM.X5         R5  ;       GET ADDRESS LTU_PROGRAM
        SUB          R3         R5  ;         ADJUST FOR OWN BASE;
UT6020:                             ;       REPEAT
        JMPI         S6  GETHEXA    ;         GET DEVICE ADDRESS;
        MOV          R0  UT60SV     ;         SAVE LAST ENTERED CHAR;
        SNE          R1  TRUE       ;
        JMP              UT6080     ;
        XTR          R2  6          ;         ISOLATE DEVICE ADDRESS
; ///////////////////
                                    ;R2 - DEVICE ADDRESS
                                    ;R5 - POINTER LTU PROGRAM    KEPT
;       YOUR CODE                   ;
; ///////////////////
UT6080:                             ;
        MOV   UT60SV            R0  ;
        INE          R0  CR         ;       UNTIL END_OF_COMMAND;
        JMP              UT6020     ;   END DOWN_LOADING LTO'S;
        JMP              UT5020     ;   RETURN UTILITIES MAIN_LINE;

UT6090:                             ;LTU_ERROR:
        JMPI         S4  OUTSTRING,     <:, LTU ERROR=:>, EOT
        JMPI         S6  OUTHEXA    ;
        JMP              UT5010     ;   RETURN UTILITIES_NEW_LINE;
;FF«ff» O