|
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 - 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