|
|
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: 37632 (0x9300)
Types: TextFile
Names: »AMUSRC«
└─⟦381395839⟧ Bits:30005538 8" CR80 Floppy CR80FD_0045 ( AMOS MASTER CLEAR UTILITIES CSS/1395/09 Login under HBA AMUEX FIKS BACKUP )
└─⟦848aae195⟧
└─⟦this⟧ »HBA.AMUSRC«
└─⟦4e8fa1c0f⟧ Bits:30005163 8" CR80 Floppy CR80FD_0156 ( AMOS MASTERCLEAR UTILITY E.C [MASTER] BACKUP )
└─⟦9a394c66e⟧
└─⟦this⟧ »AMU.AMUSRC«
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
$OC
CPUPROM= #F800
USE BASE
BIT0=0, BIT1=1, BIT2=2, BIT3=3, BIT4=4, BIT5=5, BIT6=6
BIT7=7, BIT8=8, BIT9=9, BIT10=10, BIT11=11, BIT12=12,
BIT13=13, BIT14=14, BIT15=15
;FF\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
$UTILITIES
NOLIST IF FDSUPPORT THEN LIST
$FDLOAD
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»