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: 70656 (0x11400) Types: TextFile Names: »AMUMRG«
└─⟦381395839⟧ Bits:30005538 8" CR80 Floppy CR80FD_0045 ( AMOS MASTER CLEAR UTILITIES CSS/1395/09 Login under HBA AMUEX FIKS BACKUP ) └─⟦848aae195⟧ └─ ⟦this⟧ »HBA.AMUMRG« └─⟦4e8fa1c0f⟧ Bits:30005163 8" CR80 Floppy CR80FD_0156 ( AMOS MASTERCLEAR UTILITY E.C [MASTER] BACKUP ) └─⟦9a394c66e⟧ └─ ⟦this⟧ »AMU.AMUMRG«
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\f ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; 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 SCMMODE= FALSE 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\f ; 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\f ; 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\f 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\f 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\f 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\f ;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\f ; 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\f ; 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\f 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\f ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; 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\f ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; 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\f ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; 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\f ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; 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\f ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; 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\f ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; 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\f ; 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\f ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; 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\f ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; 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\f ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; 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\f ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; 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\f ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; 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\f ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; 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\f ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; 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\f ; 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\f ; 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\f ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 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\f ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; 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\f NOLIST IF FDSUPPORT THEN LIST ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; PROCEDURE LOAD_BOOT_FILE I:(MODE_OF_OPERATION) ; R(LINK: FAILED, LINK+1 SUCCES); ; LOAD OK ; R0 DRIVE_NUMBER DESTROYED ; R2 TYPE_OF_XFER (-/'X') PSW CORRESPONDING TO BOOT_FILE ; DEVICE STATUS IF FAILED LOAD; ; R3 - BASE OF LOADED FILE ; R6 LINK DESTROYED ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; FDREAD= 2#00010<11 FDRESTORE= 2#01000<11 FDSEEK= 2#00100<11 FDSELECT= 2#00000<11 FDWRITE= 2#00001<11 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; FD1000: ;LOAD_BOOT_FILE: MOV R6 FD10SV ; XTR R0 2 ; ISOLATE DRIVE NUMBER (0_3); MOV R0 FD10DRV ; ; ADDC -<:O:> R2 ; NORMALIZE; MOV R2 FDMODE ; SAVE MODE_OF_OPERATION (FD/DMA); MOV DMAADR R7 ; GET DMA DEVICE_ADR; IEQP R2 <:X:>-<:O:>; IF INDIRECT TRANSFER MODC & DMRESET ; THEN WIO & R7 R7 ; MASTER_CLEAR DMA_DEVICE; ; JMPI S6 SETPARITY ; ; MOVC FDZERO R5 ; POINT TOP OF AREA TO BE INIT'D; MOVC 0 R7 ; MOVC FDEND-FDZERO R3 ; FOR I:=1 UNTIL END_FD_AREA FD1010: ; DO MOV R7 0. X5 ; CLEAR OFF AREA; ADDC 1 R5 ; SOB R3 FD1010 ; MOVC FDBENTRY R5 ; POINT BOOT_ENTRY DESCRIPTOR; INC FDAREASIZE.X5 ; AREASIZE:= 1 SECTOR INC FDSECTORS. X5 ; SECTOR_PER_BLOCK:= 1 INC FDBLOCKS. X5 ; BLOCKS_PER_AREA:= 1 INC FDAREA. X5 ; 1ST_AREA ADDRESS:= 0<8+1 MOD XBASE MOVC FDDIRBUF R4 ; POINT FD_DIRECTORY BUFFER; MOV R4 FDCLOAD ; ; ; NOTE R3:=0 (BLOCK 0) MOVC FDSEEK R2 ; SET-UP TRACK 0 OF LOAD DRIVE; JMPI S6 FDCONTROL ; SEEK_TRACK OF LOAD DRIVE; JMPI S6 FDREADBLOCK; JMPI S6 FDTRANSFER ; TRANSFER LAST SECTOR (ONLY ONE); JMPI S6 FDCOPY ; FDENTRYLENGTH ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; LOAD BOOT_FILE ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MOVC 0 R6 ; MOV R6 FD20CTL ; RISE 1ST TIME FLAG; MOVC FDDIRBUF R5 ; POINT DIRECTORY_ENTRY; MOVL FDLOAD.X5 R01 ; GET LOAD_ADDRESS, PAGE MOVL R01 FDCLOAD.X6 ; INITIALIZE MOVC FDENTRYLENGTH-1 R3 ; FOR I:=1 UNTIL ENTRY_LENGTH FD1020: ; DO ADD 0. X5 R6 ; COMPUTE DIR_ENTRY CHECKSUM; ADDC 1 R5 ; SOB R3 FD1020 ; END SUMMING UP; INE R6 0. X5 ; IF DISCREPANCY JMP FDENTRYERROR ; MOVC FDDIRBUF R5 ; POINT BOOT DIRECTORY BUFFER; FD1040: ; REPEAT MOV R3 FDBLOCKNO ; SAVE BLOCKNO JMPI S6 FDREADBLOCK; GET NEXT BLOCK TO MEM_BUFFER; MOV FDBLOCKNO R3 ; INEP R3 FDHIBLK.X5 ; TEST IF LAST AREA (BLOCK) ADDC 1 R3 ; JMP FD1040 ; UNTIL ALL BLOCKS DONE; ; JMPI S6 FDTRANSFER ; LAST_TRANSFER; JMPI S6 FDCOPY ; REMEMBER COPYING LAST SECTOR; 64 ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; FILE LOADED, VALIDATE CHECKSUM ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MOV XBASE R1 ; SVS R4 ; "OWN" PSW; MOV FDLOAD.X5 R6 ; GET FILE LOAD ADDRESS (START) MOV FDPAGE.X5 R7 ; GET CORRESPONDING PAGE; IOR R4 R7 ; COMPUTE RELEVANT PSW; MOV FDCOUNT.X5 R3 ; FOR I:=1 UNTIL FILE_LENGTH IEQ R3 0 ; JMP FD1060 ; MOVC 0 R0 ; LDS R7 ; FD1050: ; DO MODN R1 ADD 0. X6 R0 ; COMPUTE CHECKSUM; ADDC 1 R6 ; IEQP R6 0 ; IF PAGE BOUNDARY ADDC & 1<2 R7 ; THEN ADJUST (NEGLECT CARRY) LDS & R7 ; TO NEXT MEMORY SECTION; SOB R3 FD1050 ; END COMPUTING CHECK-SUM; ; LDS R4 ; RETURN "OWN" MEMORY SECTION; INE R0 FDCHECKSUM.X5; BEWARE CHECKSUM_ERROR; JMP FDCHECKSUMERROR ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; FILE CHECKED: OK - GET BASE, PAGE ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; FD1060: JMPI S4 OUTSTRING, <:, START=:>, EOT MOV FDLOAD.X5 R2 ; JMPI S6 OUTHEXA ; JMPI S4 OUTSTRING, <:, BASE= :>, EOT MOV FDBASE.X5 R2 ; JMPI S6 OUTHEXA ; MOVL FDPAGE.X5 R23 ; GET PAGE, BASE SVS R7 ; IOR R7 R2 ; COMPUTE RELEVANT PSW; MOV FD10SV R6 ; GET LINK; JMP 1. X6 ; SUCCESSFULL RETURN; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; FDENTRYERROR: JMPI S4 OUTSTRING, <:, ENTRY:>, EOT JMP FD1080 ; FDCHECKSUMERROR: JMPI S4 OUTSTRING, <:, CHECKSUM:>, EOT FD1080: ; JMPI S4 OUTSTRING, <: ERROR:>, EOT JMP FD1099 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; DEVICE ERROR ; R2 DEVICE_STATUS ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DMAERROR: ;DMA_ERROR: JMPI S4 OUTSTRING, <:, DMA:>, EOT JMP FD1090 ; FDDISKERROR: JMPI S4 OUTSTRING, <:, DISK:>, EOT FD1090: ;ERROR_RETURN JMPI S4 OUTSTRING, <: ERROR=:>, EOT JMPI S6 OUTHEXA ; FD1099: JMPI FD10SV ; RETURN CALLER (FAILED LOAD); ;FF\f ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; PROCEDURE FD_READ_BLOCK I:(REF(DIR_ENTRY)); ; ; THIS PROCEDURE SUPPORTS THE CR8062 FD CONTROLLER. THE CONTROLLER ; WORKS WITH A 64 WORD BUFFER. ; THE PROCEDURE COPIES ALL BUT THE LAST SECTOR OF A BLOCK TO THE ; DEDICATED OUTPUT AREA VIA ITS MEMORY_BUFFER. ; ; HIERARCHY: ; FILE/AREA[1:10]/BLOCK[1:-]/SECTOR[1:64]/WORD[1:16]/BIT ; THE RELETION BETWEEN PHYSICAL AND LOGICAL SECTORS ARE: ; TRACK 0: 2, 4,..., 26, 1, 3,..., 25 ; TRACK 1: 14, 16,..,12,13,15,...,11 ; TRACK 2: 26, 1, 3, ... ; TRACK3: 11,13,15,... ; . ; ... UNTIL TRACK 76 ; ; R3 BLOCK_NO DESTROYED ; R5 REF(DIR_ENTRY) KEPT ; R6 LINK DESTROYED ; R0-2,4,7 - DESTROYED ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; FD2000: ;FD_READ_BLOCK: MOV R6 FD20SV ; MOV R5 R6 ; MOV FDBLOCKS.X5 R1 ; GET BLOCKS_PER_AREA; IEQ R1 0 ; JMP S6 FDENTRYERROR; ; MOVC FDAREAS R2 ; FD2010: ; COMPUTE ILT R3 R1 ; OFF_SET:= JMP FD2020 ; SUB R1 R3 ; BLOCK_NO MOD BLOCKS_PER_AREA; ADDC 1 R6 ; ADJUST AREA_REFERENCE; SOB R2 FD2010 ; JMP S6 FDENTRYERROR; TOO HIGH BLOCK_NO: ENTRY)ERR; FD2020: MOV FDSECTORS.X5 R1 ; GET SECTORS_PER_BLOCK; MOV FDAREA.X6 R0 ; GET AREA'S START LOG_SECTOR_NO; IEQ R0 -1 ; IF NOT USED JMP S6 FDENTRYERROR; THEN ENTRY_ERROR; JOZ R3 FD2060 ; IF .NOT. 1ST BLOCK IN AREA MOV R0 R2 ; XTR R2 8 ; ISOLATE LOGICAL_SECTOR_NO; SWP R0 ; POSITION TRACK_NO; FD2030: ; COMPUTE ADD R1 R2 ; 1ST_SEC+BLOCK*SEC'S_PER_BL'K SOB R3 FD2030 ; FD2040: ; COMPUTE ILT R2 27 ; JMP FD2050 ; ADDC 1 R0 ; ADJUST TRACK_NUMBER; ADDC -26 R2 ; ADJUST SECTOR_NO JMP FD2040 ; END ADJUSTING TRACK/SECTOR; FD2050: ; SLL R0 8 ; POSITION TRACK, ZERO SECTOR; IOR R2 R0 ; INSERT LOGICAL_SECTOR_NO; FD2060: ;FD_SEEK_TRACK: ; R0 - TRACK,/LOGICAL_SECTOR_NO ; R1 - SECTORS PER BLOCK ; REPEAT MOV R0 R2 ; TRACK_OFFSET:= SRL R2 7 ; (TRACK_NO*2 MOV R2 R3 ; ADD R2 R3 ; ADD R2 R3 ; *3) FD2070: IGEP R3 26 ; ADDC -26 R3 ; MOD 26; JMP FD2070 ; ; SRL R2 1 ; ISOLATE TRACK_NO; MOV FDTRACK R6 ; IEQ R2 R6 ; IF NEW TRACK .NOT. CURRENT JMP FD2080 ; THEN MOV R2 FDTRACK ; ESTABLISH AS CURRENT TRACK; JMPI S6 FDWAITCMDCOMPLETE; COMPLETE PREVIOUS COMMAND; MOV FDTRACK R2 ; ADDC FDSEEK R2 ; ESTABLISH SEEK; JMPI S6 FDCONTROL ; ; END ESTABLISHING NEW TRACK; FD2080: ; REPEAT JMPI S6 FDTRANSFER ; GET DATA INTO MOMORY_BUFFER; MOV R0 R2 ; XTR R2 8 ; ISOLATE LOGICAL_SECTOR_NO; ADD R3 R2 ; ADJUST FOR TRACK_OFFSET; ; PHYSICAL_SECTOR_NO:= ADD R2 R2 ; ((2*(TRACK_OFFSET_LOG_SECT)) IGE R2 53 ; ADDC -52 R2 ; MOD 53; IGE R2 27 ; ADDC -27 R2 ; MOD 27; ADDC FDREAD R2 ; SET-UP PROPER READ_COMMAND; JMPI S6 FDCONTROL ; CONTROL(READ, SECTOR); MOV FD20CTL R4 ; GET 1ST TIME FLAG; INEP R4 0 ; IF COPY DATA FROM LAST READ JMPI & S6 FDCOPY ; THEN DO SO; 64 ; MOV R6 FD20CTL ; ;NEXT_SEGMENT: ADDC -1 R1 ; SGE R1 1 ; * PERFORM OUTHER LOOP_CONTROL JMPI FD20SV ; * IF DONE RETURN CALLER; ; ADDC 256 -26 R0 ; ADJUST TRACK/SECTOR_NO; IBNP R0 BIT7 ; CHECK IF NEXT TRACK ; ADDC -256 +27 R0 ; JMP FD2080 ; UNTIL SEC'S THIS TRACK DONE; ADDC 1 R0 ; NOTE: START SECTOR 1, NOT 0; JMP FD2060 ; UNTIL AREA DONE (ALL BLOCKS); ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;FF\f ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; PROCEDURE FD_TRANSFER I:(REF(BUFFER)); ; WAIT FOR I/F TO GO READY; ; TRANSFER DATA FROM I/F BUFFER TO MEMORY; ; R2,4,7 - DESTROYED ; R6 LINK KEPT ; USING: XR0(X4), XR2(R2) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ;FD_WAIT_COMMAND_COMPLETE: FD3000: ;FD_TRANSFER: MOV R6 FD30SV ; MOVC 60 R4 ; SOB R4 LOC ; WAIT 60-120 USEC; ; MOV FDMODE R7 ; GET MODE_OF_OPERATION IEQ R7 <:X:>-<:O:>; IF DIRECT TRANSFER JMP FD3050 ; THEN MOV FDADR R7 ; GET FD DEVICE_ADDRESS; FD3010: ; REPEAT MODC 1<15 SIO R2 R7 ; SENSE(ADDITIONAL_STATUS,DEV) IBN R2 BIT6 ; TEST DEVICE STILL BUSY; JMP FD3010 ; UNTIL FORMATTER READY; ; MOVC FDMEMBUF R2 ; POINT DEDICATED MEMORY BUFFER; MOVC 64 R4 ; FOR I:=1 UNTIL BLOCK_SIZE FD3020: ; DO RIO X2 R7 ; READ(BUFFER_WORD, DEVICE); ADDC 1 R2 ; SOB R4 FD3020 ; END_FOR_UNTIL; ; SIO R2 R7 ; SENSE(STATUS, DEVICE); JMP FD3060 ; ELSE FD3050: ; REPEAT JMP S6 DMA ; DMA: SENSE REMOTE FD 2,#8000+FD,DMSMODE,XR0,DMMEMMODE,DMINPUT IBN X4 BIT6 ; TEST REMOTE FORMATTER BUSY; JMP FD3050 ; UNTIL FORMATTER READY JMP S6 DMA ; DMA: READ 64 WORDS FROM REM.FD 128,FD,DMRMODE,FDMEMBUF,DMMEMMODE,DMINPUT JMP S6 DMA ; DMA: SENSE REMOTE FD 2,FD,DMSMODE,XR2,DMMEMMODE,DMINPUT MOV XR2 R2 ; GET PRESENT STATUS; FD3060: ; END TRANSFERING SECTOR; IBN R2 BIT0 ; RESET ADDC #FFFF R2 ; BIT0 ONLY; IEQ R2 0 ; IF TRANSFER COMPLETE JMPI FD30SV ; RETURN CALLER AS DONE; ; ELSE IBZ R2 BIT7 ; IF .NOT. DISK_CHANGE.OR.OVERRUN JMP FDDISKERROR; THEN MOVC FDRESTORE R2 ; SET-UP FD_RESTORE: JMPI S6 FDCONTROL ; STEP DRIVE OUT 79 TIMES TO ; USE TRACK_00 FOR RESYNC; MOV R6 FDTRACK ;* FORCE NEW SEEK; MOVC FDRECOUNT R6 ; INC 0. X6 ; MAINTAIN RESTORE_COUNT; IBZ X6 BIT4 ; CONTINUATION ALLOWED JMP FD2060 ; AS LONG AS BELOW 16; MOVC #FFFF R2 ; SET-UP ERROR FLAG JMP FDDISKERROR; END DISK_ERROR HANDLING; ;FF\f ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; PROCEDURE FD_MEM_COPY ; R6 LINK KEPT ; R7 - DESTROYED ; ; USING: PROCESS_DESCRIPTOR ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; FD3100: ;FD_COPY: SVP ; SVS R2 ; GET OWN PSW; ;NOTE HAS TO BE MEM_SECTION 0; MOV XBASE R4 ; AND BASE; MOVC FDMEMBUF R5 ; POINT FD MEM_BUFFER; MOV FDCPAGE R3 ; GET CURRENT OUTPUT PAGE; IOR R2 R3 ; ESTABLISH NEW PSW THAT SECTION; MOV FDCLOAD R7 ; POINT OUTPUT_AREA; MVP 0. X6 R1 ; FOR I:=1 UNTIL BUFFER_SIZE FD3120: ; DO MOV 0. X5 R0 ; GET NEXT WORD LDS R3 ; SWITCH TO RELEVANT SECTION; MODN R4 MOV R0 0. X7 ; INSERT WORD IN OUTPUT_AREA; LDS R2 ; RETURN OWN PAGE; INCD R5 R7 ; ADJUST POINTERS; IEQ R7 0 ; IF PAGE BOUNDARY ADDC 1<2 R3 ; THEN SWITCH PAGE ; (NEGLECTING CARRY BIT); SOB R1 FD3120 ; UNTIL WHOLE BUFFER COPIED; MOV R7 FDCLOAD ; MOV R3 FDCPAGE ; MOVC XR0 R7 ; RE-ESTABLISH UNS 7 ; ALL REGISTERS; JMP 1. X6 ; RETURN CALLER; ;FF\f ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; PROCEDURE FD_CONTROL I:(COMMAND); ; R2 COMMAND<11+TRACK/SECTOR DESTROYED ; R6 LINK KEPT ; R7 - DESTROYED ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; FD3500: ;FD_CONTROL: MOV FD10DRV R7 ; GET DRIVE NUMBER; SWP R7 ; POSITION IN LEFTMOST BYTE; ADD R7 R2 ; INSERT DRIVE_NO IN COMMAND; MOV FDMODE R7 ; SNE R7 <:X:>-<:O:>; IF DIRECT FD_LOAD JMP FD3580 ; THEN MOV FDADR R7 ; GET DEVICE ADDRESS; CIO R2 R7 ; CONTROL(DATA, DEVICE); JMP X6 ; RETURN CALLER; FD3580: ; ELSE MOV R6 FD30SV ; MOV R2 XR2 ; JMP S6 DMA ; DMA: CONTROL REMOTE DEVICE 2,FD,DMCMODE,XR2,DMMEMMODE,DMOUTPUT JMPI FD30SV ; RETURN CALLER; ; END CONTROLLING FD; ;FF\f ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; PROCEDURE DO_DMA (CNT, REM_ADR,REM_PAGE,LOC_ADR,LOC_PAGE,REQUEST); ; R2 - DESTROYED ; RL LINK DESTROYED ; R7 - DESTROYED ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; DMA IF CHARACTERISTICS ;;;;;;;;;;;;;;;;;;;;;;;;;; ; ;DMA_STATUS: DMRQSNT= BIT3 ; REQUEST SENT DMNTEOB= BIT5 ; NOT_EOB DMERRM1= 1<BIT6 OR %; STOPPED 1<BIT7 OR %; REMOTE TIME-OUT 1<BIT8 OR %; LOCAL TIME-OUT 1<BIT9 ; PARITY ERROR ;DMA_COM'DS: DMLDBC= 0<8 ; LOAD BYTE COUNT DMLDAD= 1<8 ; LOAD ADDRESS DMLDPG= 2<8 ; LOAD PAGE DMSNRQ= 3<8 ; SEND REQUEST DMSTART= 5<8 ; START DMA DMSTOP= 6<8 ; STOP DMA DMRESET= 7<8 ; RESET DMA IF DMRMBC= 8<8 ; LOAD REMOTE BYTE COUNT DMRMAD= 9<8 ; LOAD REMOTE ADDRESS DMRMPG= 10<8 ; LOAD REMOTE PAGE ; DMINPUT= 2#01 ; INPUT REQUEST, TYPE 0 DMOUTPUT= 2#00 ; OUTPUT REQUEST, TYPE 0 DMMEMMODE= #302 ; MEMORY MODE: LOWER BYTE, PAGE 0 DMSMODE= #2 ; SENSE IO MODE DMCMODE= #2 ; CONTROL IO MODE DMRMODE= #6 ; READ IO MODE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DMA: ;DMA: DMA00: ; REPEAT MOV DMAADR R7 ; GET DEVICE ADDRESS; MOVC DMOUTPUT R2 ; SET-UP CONTROL MODC DMSNRQ WIO R2 R7 ; OUTPUT(CMD, CTL, DEVICE); MOVC 0 R2 ; WAIT MOVC 0 R2 ; 2 USEC; RIO R2 R7 ; INPUT(STATUS, DEVICE); IBZ R2 DMRQSNT ; UNTIL REQUEST JMP DMA00 ; ACCEPTED; MVP 0. X6 R2 ; GET COUNT_FIELD; MODC DMRMBC WIO R2 R7 ; OUTPUT(CMD, COUNT, DEVICE); MVP 1. X6 R2 ; GET REMOTE_ADR; MODC DMRMAD WIO R2 R7 ; OUTPUT(CMD, REM_ADR, DEVICE); MVP 2. X6 R2 ; GET REMOTE_PAGE (MODE); MODC DMRMPG WIO R2 R7 ; OUTPUT(CMD, REM_PAGE, DEVICE); MVP 5. X6 R2 ; GET REQUEST_TYPE; MODC DMSNRQ WIO R2 R7 ; OUTPUT(CMD, SEND_REQUEST, DEVICE); MVP 0. X6 R2 ; GET COUNT MODC DMLDBC WIO R2 R7 ; OUTPUT(CMD% COUNT% DEVICE); MVP 3. X6 R2 ; GET POINTER TO OUTPUT_AREA; ADD XBASE R2 ; MODC DMLDAD WIO R2 R7 ; OUTPUT(CMD, LOAD_ADDR, DEVICE); MVP 4. X6 R2 ; GET LOAD_PAGE; MODC DMLDPG WIO R2 R7 ; OUTPUT(CMD, LOAD_PAGE, DEVICE); MODC DMSTART WIO R2 R7 ; OUTPUT(CMD, -, DEVICE); DMA10: ; REPEAT RIO R2 R7 ; INPUT(STATUS, DEVICE); MOVC DMERRM1 R7 ; SET-UP ERROR MASK; AND R2 R7 ; IF RESULT.>0 THEN INE R7 0 ; IF RESULT<>0 THEN JMP DMAERR ;* DMA_ERROR; MOV DMAADR R7 ; IBN R2 DMNTEOB ; UNTIL STATUS.NOT_EOB JMP DMA10 ; GOES LOW (EOB); MODC DMSTOP WIO R2 R7 ; OUTPUT(CMD, -, DEVICE); JMP 6. X6 ; RETURN CALLER; NOLIST FI LIST ;FF\f ; 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\f ; 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\f ; 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 SCMADR R7 ; GET OC'S DEVICE ADDRESS; MODC SCMSTATUS SIO R0 R7 ; SENSE(STATUS, DEVICE); MOVC SCMASYNC R1 ; MODC SCMMR1 CIO R1 R7 ; LOAD MODE REGISTER 1; MOV R0 R2 ; SRL R2 BIT11 ; POSITION FRONT-PANEL SWITCH IBN R2 BIT15-BIT11; IF AUTOMATIC_MODE MOVC 2#0101 R2 ;... THEN FORCE 300 BAUD; 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\f ; 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\f 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\f END «eof»