|
|
DataMuseum.dkPresents historical artifacts from the history of: CR80 Hard and Floppy Disks |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about CR80 Hard and Floppy Disks Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 34530 (0x86e2)
Types: TextFile
Names: »UTILIS«
└─⟦af8db8df8⟧ Bits:30005566 8" CR80 Floppy CR80FD_0245 ( CR/D/1242 )
└─⟦ce5288cf7⟧
└─⟦this⟧ »UTILIS«
; 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