FAA N=0 BIT0=1 BIT1=2 BIT2=4 BIT3=10 BIT4=20 BIT5=40 BIT6=100 BIT7=200 BIT8=400 BIT9=1000 BIT10=2000 BIT11=4000 BIT12=10000 BIT13=20000 BIT14=40000 BIT15=100000 SCOPE=IOT ; ; ; WRITE=TRAP+3 WRCHECK=TRAP+7 READ=TRAP+5 .=0 ;MACRO FOR SETTING UP ERROR COUNT .MACR ERROR X ERR'X': MOV #X,ERCOUNT ;SET UP ERROR COUNT X N=N+1 .ENDM .REPT 100 .+2 HALT .ENDR .=200 JMP START ;STATIC ROUTINES .=300 JMP STAI1 ;TEST RESET TO CONTROL REGISTER JMP STAI2 ;TEST RESET TO CU BIT0=1 BIT1=2 BIT2=4 BIT3=10 BIT4=20 BIT5=40 BIT6=100 BIT7=200 BIT8=400 BIT9=1000 BIT10=2000 BIT11=4000 BIT12=10000 BIT13=20000 BIT14=40000 BIT15=100000 ; ; ; WRITE=TRAP+3 WRCHECK=TRAP+7 READ=TRAP+5 .=0 .REPT 100 .+2 HALT .ENDR .=20 XWAIT ;BACKGROUND TEST VECTOR 0 .=30 EMTRP ;TTY VECTOR 340 DISK ;DISK CALLING VECTOR 340 .=200 JMP START DKINT ;DISK INTERRUPT VECTOR 200 ;DISK PRIORITY ;STATIC ROUTINES .=300 .=600 JMP ADT2 ;CHECK THAT WHEN A  IDENTIFICATION PRODUCT CODE: MAINDEC 11-D5AA PRODUCT NAME: RF11 MULTI DISK DATE CREATED: 1 N0VEMBER 1970 MAINTAINER: DIAGNOSTIC GROUP AUTHOR: E. HAIGHT 1. ABSTRACT MULTI DISK IS A HIGH SPEED CONFIDENCE TEST THAT ASSURES THE USER THAT HE CAN TRANSFER DATA CORRECTLY, WITHOUT DESTROYING THE DATA ON THE DISK. MULTI DISK USES ALL EXISTING MEMORY ON THE SYSTEM AS BUFFER AREAS. 2. REQUIREMENTS A. PDP-11 4K TO 28K OF MEMORY TE BIT0=1 BIT1=2 BIT2=4 BIT3=10 BIT4=20 BIT5=40 BIT6=100 BIT7=200 BIT8=400 BIT9=1000 BIT10=2000 BIT11=4000 BIT12=10000 BIT13=20000 BIT14=40000 BIT15=100000 ; ; ; WRITE=TRAP+3 WRCHECK=TRAP+7 READ=TRAP+5 .=200 JMP START ;STATIC ROUTINES .=300 ; ; ; ; ; ; ;RF11 DATA TEST ;VECTORS USED IN PROGRAM ;#1 LOC 204 DISK INTERRUPT ;#2 LOC 30 EMT (TELETYPE OUTPUT) ;#3 LOC 34 TRAP (DISK HANDLERS) ;#4 LOC 14 TRACE TRAP (USED IN BACKGROUND TEST) ;#5 LOC 20 IOT TRAP (USED IN CAL RRENT ADDRESS REGISTER JMP STAI3 ;TEST RESET TO WORD COUNT REGISTER JMP STAI4 ;TEST RESET TO DISK ADDRESS REGISTER JMP STAI5 ;TEST RESET TO DISK EXT. ADDRESS REGISTER JMP STAI6 ;TEST RESET TO DATE BUFFER REGISTER JMP STAI7 ;TEST RESET TO MAINTENANCE REGISTER JMP STAI10 ;CAN WE SET W/R BITS IN DCS REGISTER JMP STAI11 ;CAN WE CLEAR THE DCS REGISTER ;USING DISK CLEAR. JMP STAI12 ;CAN WE SET ALL CMA BITS JMP STAI13 ;CAN WE CLEAR ALL CMA BITS ;USING DISK CLEAR JMP STAI14 ;WORD IS WRITTEN IT ;DOES NOT ALTER ADJACENT ;WORDS ; ; JMP ADT3 ;WRITE EACH WORD ADDR ON ITSELF AND ;READ BACK TO COMPARE ; ; JMP ADT4 ;TRACK SELECTION TEST ; ; JMP ADT5 ;LOOK AHEAD TEST ; ; JMP SPIRAL ;SPIRAL TEST ; ; JMP XSPIRAL ;SPIRAL TEST EXTENSION ; ; JMP RANEX ;RANDOM ADDRESS, DATA AND ;WORD COUNT TEST ; ; JMP EXTMEN ;WRITE/WRITE CHECK DISK WITH ;EXTENDED MEMORY ; ; LETYPE B. RF11 AND RS11 PLUS UP TO SEVEN ADDITIONAL RS11'S 2.2 STORAGE THE MAIN BODY OF THE PROGRAM OCCUPIES THE FIRST 5K OCTAL (BYTES) OF MEMORY. THREE DATA BUFFERS OCCUPY THE REST OF EXISTING MEMORY. BUFFER ORDER OUT BUFFER = RANDOM DATA TO BE WRITTEN ON THE DISK. IN BUFFER = AREA FOR RANDOM DATA WHEN READ FROM THE DISK. SAVE BUFFER = AREA TO SAVE DISK WHEN EXERCISING. 3. LOADING PROCEDURE 3.1 METHOD PROGRAM FORMAT ABSOLUTE A. VERIFY THE BOOT LOADER IS I LING BACKGROUND TEST) .=1000 .EVEN ; ;I/O ADDRESS POINTERS SR: 177570 ;SWITCH REGISTER CSR: 177776 ;PROCESSOR STATUS REGISTER TPB: 177566 ;TELETYPE REGISTERS TKB: 177562 TPS: 177564 TKS: 177560 ; ;DISK I/O REGISTERS ; DCS: 177460 ;DISK CONTROL REGISTER WC: 177462 ;WORD COUNT REGISTER CMA: 177464 ;CURRENT ADDRESS REGISTER DAR: 177466 ;LOWER 16 BITS OF DISK ADDRESS DAE: 177470 ;EXTENSION ADDRESS REGISTER DBR: 177472 ;DATA BUFFER REGISTER MA: 177474 ;MAINTENANCE R ;CAN WE SET ALL WC BITS JMP STAI15 ;CAN WE CLEAR ALL WC BITS ;USING DISK CLEAR JMP STAI16 ;CAN WE SET ALL THE DAR BITS JMP STAI17 ;CAN WE CLEAR ALL THE DAR BITS ;USING DISK CLEAR JMP STAI20 ;CAN WE SET ALL THE DAE BITS JMP STAI21 ;CAN WE CLEAR ALL THE DAE BITS, USING DISK CLEAR JMP STAI22 ;EXECUTE A ONE WORD WRITE ;FOLLOWED BY A ONE WORD WRITE CONTINUE JMP STAI40 ;EXECUTE A ONE WORD WRITE CHECK ;FOLLOWED BY A ONE WORD WRITE CHECK CONTINUE JMP STAI56 ;EXECUTE JMP PFT1 ;DISK WRITE POWER FAIL TEST ; ; JMP PFT2 ;DISK WRITE CHECK POWER FAIL TEST ; ; ;***MAINTENANCE ROUTINES*** ; ; JMP SELWC ;LOAD WORD COUNT REG. ;WITH SWITCH REGISTER ; ; JMP SELCMA ;LOAD CURRENT MEMORY ADDR ;REG. WITH SWITCH REGISTER ; ; JMP SELDAR ;LOAD DISK ADDR. REGISTER ;WITH SWITCH REGISTER ; ; JMP SELDAE ;LOAD DISK ADDR. EXT. ;WITH SWITCH REGISTER ; ; JMP SELDBR ;LOAD DATA BUFFER REGISTEN MEMORY. B. LOAD TAPE INTO READER. C. SET SWITCH REGISTER EQUAL TO *750 MEMORY SIZE * 4K 17 8K 37 12K 57 16K 77 20K 117 24K 137 28K 157 D. DEPRESS LOAD ADDRESS. E. DEPRESS START. 4. STARTING PROCEDURE A. SET SWITCH REGISTER EQUAT TO 200. B. DEPRESS LOAD ADDRESS. C. DEPRESS START. D. THE PROGRAM AT THIS POINT WILL DETERMINE THE AMOUNT OF EXISTING CORE MEMORY, AND SET UP THE WORD COUNT AND BUFFER AREAS FOR THE PROGREGISTER ADS: 177476 ;LOOK AHEAD REGISTER VECTOR: 204 ;INTERRUPT VECTOR ADDRESS STATUS: 206 ;DISK INTERRUPT STATUS PRIORITY:BIT7 ;DISK PRIORITY LEVEL ; ; ; ; ; ; ;RF11DEDICATE REGISTERS (MEMORY) ; FLAG: 0 ;INTERNAL PROGRAM FLAG RANNU: 146723 ;RANDOM NUMBER PRIME WRDCT: 0 ;WORKING WORD COUNT TRACK: 0 ;WORKING DAE DMA: 0 ;WORKING DATA BUFFER (OUT-IN) PATNU: 0 ;DATA PATTERN INDEX BUF: 0 ;WORKING DATA BUFFER (OUT-IN) TWRDCT: 0 ;TEMP WORD COUNT TDMA: 0 ;TEMP DAR A ONE WORD READ ;FOLLOWED BY A ONE WORD READ CONTINUE JMP STAI74 ;TEST TRACK INCREMENT JMP STAI77 ;TEST DISK INCREMENT JMP STA103 ;TEST THAT NED RAISES ERROR FLAG JMP ST105X ;CHECK CMA INHIBIT JMP NXMTSM ;TEST NON-EXISTENT MEMORY ERROR JMP STA106 ;TEST THAT THE DISK WILL NOT TRAP ;AT PRIORITY 7 JMP STA110 ;TEST THAT THE DISK WILL NOT TRAP ;AT PRIORITY 6 JMP STA112 ;TEST THAT THE DISK WILL NOT TRAP ;AT PRIORITY 5 JMP STA114 ;TEAST THAT THE DISK WILL TRAP R ;WITH SWITCH REGISTER ; ; JMP MOVLK ;MOVE CONTENTS OF LOOK ;AHEAD REGISTER INTO DATA LIGHTS ; ; JMP SELDCS ;LOAD DISK CONTROL REGISTER ;WITH SWITCH REGISTER ; ; JMP STAMP ;ENABLE READ AMPLIFIERS ;TO TRACK SELECTED ;FROM SWITCH REGISTER ; ; ; ; ; ; ; ; ;RF11 DATA TEST ;VECTORS USED IN PROGRAM ;#1 LOC 204 DISK INTERRUPT ;#2 LOC 30 EMT (TELETYPE OUTPUT) ;#3 LOC 34 TRAP (DISK HANDLERS) ;#4 LOC 14 TRACE TRAP (USED IN BACKGRAM. E. THE PROGRAM WILL NEXT REPORT THE NUMBER OF EXISTING DISK(S) WHICH WHICH ARE ON THE SYSTEM. THE NUMBER WILL RANGE FROM 1 - 10 OCTAL. THE DISK SELECTION LINES MUST BE IN SEQUENTIAL ORDER RANGING FROM 0 TO 7. 06 EXISTENT DISK(S) 5. OPERATING PROCEDURE 5.1 OPERATIONAL SWITCH SETTINGS THE SWITCH REGISTER HAS NO CONTROL OVER THE OPERATION OF THIS PROGRAM. 5.2 STOPPING THE PROGRAM MULTI DISK MUST ONLY BE STOPPED BY TYPING CONTROL C. IF THE USER STOPS TH SWRDCT: 0 ;STANDARD WORD COUNT ERCOUNT:0 ;ERROR COUNT FOR MESSATES. SAVE: 0 SAV1: 0 PASS: 0 DSKNOR: 0 HRDER: 0 ;POINTER FOR HARD ERROR HIGH: 0 LIMIT: 0 TTRACK: 0 ;TEMP TRACK NO. TDSKNO: 0 ;TEMP DISK NO. OUTBUF: BUFFER INBUF: 0 SAVBUF: 0 ; ;RF11 WORK REGISTERS ;(CAN BE CHANGED IN ANY ROUTINE) WORK: 0 WORK1: 0 WORK2: 0 START: RESET ;CLEAR THE WORLD MOV #1000,%6 ;SET UP STACK MOV #6,4 CLR 6 MOV #DKINT,@VECTOR ;SET UP DISK POINTER MOV #340,@STATUS ;LOCK UP INTERRUP;AT PRIORITY 4 JMP ADT1 ;ADDRESS TEST 1 ;CHECK TIMING BY EXECUTING ;A ONE WORD WRITE JMP ADT2X ;ADDRESS TEST 2 ;CHECK TIMING BY EXECUTING ;A ONE WORD READ .=650 ; ;MAINTENANCE ROUTINES ; JMP SELWC ;LOAD WORD COUNT REG WITH SR JMP SELCMA ;LOAD CURRENT ADDRESS REG WITH SR JMP SELDAR ;LOAD DISK ADDRESS REG WITH SR JMP SELDAE ;LOAD DISK EXT. ADDRESS REG WITH SR JMP SELDBR ;LOAD DATA BUFFER REG WITH SR JMP MOVLK ;MOVE LOOK AHEAD INTO LIGHTS JMP SELDCS ;LOAD FUOUND TEST) ;#5 LOC 20 IOT TRAP (USED IN CALLING BACKGROUND TEST) .=1000 .EVEN ; ;I/O ADDRESS POINTERS SR: 177570 ;SWITCH REGIISTER CSR: 177776 ;PROCESSOR STATUS REGISTER TPB: 177566 ;TELETYPE REGISTERS TKB: 177562 TPS: 177564 TKS: 177560 ; ;DISK I/O REGISTERS ; DCS: 177460 ;DISK CONTROL REGISTER WC: 177462 ;WORD COUNT REGISTER CMA: 177464 ;CURRENT ADDRESS REGISTER DAR: 177466 ;LOWER 16 BITS OF DISK ADDRESS DAE: 177470 ;EXTENSION ADDRESS REGISTER DBR: 177472 ;DATAE PROGRAM BY DEPRESSING CONSOLE HALT, THE DISK SURFACE MAY NOT BE RESTORED. 5.3 PROGRAM ABSTRACT MULTI DISK WAS DESIGNED TO INSURE THE USER THAT THE DISK SYSTEM IS CAPABLE OF TRANSFERRING DATA CORRECTLY WHILE NOT DESTROYING THE USERS PROGRAMS ON THE DISK SURFACE. THE PROGRAM FIRST READS FROM THE DISK, THE LENGTH OF THE TRANSFER IS DETERMINED BY THE SIZE OF MEMORY. IF AN ERROR OCCURS WHILE READING, THE PROGRAM WILL MAKE UP TO THREE ATTEMPTS AT READING THE DATA. IF THE ERROR STILL EXTS MOV #EMTRP,30 ;SET UP TTY POINTER MOV #340,32 ;LOCK UP INTERRUPTS MOV #DISK,34 ;SET UP DISK HANDLER POINTER MOV #340,36 ;LOCK UP INTERRUPTS MOV #340,@CSR ;LOCK UP INTERRUPT LEVELS CLR FLAG ;CLEAR PROGRAM FLAG CLR TRACK ;CLEAR TRACK REGISTERS CLR DMA ;CLEAR DAR REGISTERS CLR PATNU ;CLEAR PATTER COUNT MOV #XWAIT,20 CLR 22 ;THIS ROUTINE DETERMINES HOW MUCH MEMORY IS ON THE SYSTEM ; ; EXTMEM: MOV #340,@CSR ;LOCK UP PRIORITY LEVELS MOV #MAXREF,4 ;SET UP PROCESSOR TRAP MOVNCTION REG WITH SR ; ; JMP STAMP ;SELECT TRACKS STATICLY ; ; ; ; ; ; ;RF11 DATA TEST ;VECTORS USED IN PROGRAM ;#1 LOC 204 DISK INTERRUPT ;#2 LOC 30 EMT (TELETYPE OUTPUT) ;#3 LOC 34 TRAP (DISK HANDLERS) ; .=1000 .EVEN ; ;I/O ADDRESS POINTERS SR: 177570 ;SWITCH REGIISTER CSR: 177776 ;PROCESSOR STATUS REGISTER TPB: 177566 ;TELETYPE REGISTERS TKB: 177562 TPS: 177564 TKS: 177560 ; ;DISK I/O REGISTERS ; DCS: 177460 ;DISK CONTROL REGISTER WC: 177462 ;WORD COUNT REGI BUFFER REGISTER MA: 177474 ;MAINTENANCE REGISTER ADS: 177476 ;LOOK AHEAD REGISTER VECTOR: 204 ;INTERRUPT VECTOR ADDRESS STATUS: 206 ;DISK INTERRUPT STATUS PRIORITY:BIT7 ;DISK PRIORITY LEVEL ; ; ; ; ; ; ;RF11 DEDICATE REGISTERS (MEMORY) ; FLAG: 0 ;INTERNAL PROGRAM FLAG RANNU: 146723 ;RANDOM NUMBER PRIME WRDCT: 0 ;WORKING WORD COUNT TRACK: 0 ;WORKING DAE DMA: 0 ;WORKING DAR PATNU: 0 ;DATA PATTERN INDEX BUF: 0 ;WORKING DATA BUFFER (OUT-IN) TWRDCT: 0 ;TEMP WORISTS, THE PROGRAM WILL THEN HALT. IF THE PROGRAM SUCCESSFULLY READS FROM THE DISK WITHIN THE THREE ATTEMPTS, IT WILL THEN GENERATE A RANDOM BUFFER, WRITE IT ON THE DISK, AND READ IT BACK AND VERIFY IT. AFTER COMPARING THE DATA, THE PROGRAM THEN WRITES THE ORIGINAL DATA BACK ON THE DISK, MAKING UP TO THREE ATTEMPTS TO TRANSFER IF AN ERROR IS ENCOUNTERED, BEFORE HALTING. IF THE DATA WAS SUCCESSFULY TRANSFERRED, THE PROGRAM WILL GO TO THE NEXT DISK BUFFER UNTIL THE COMPLETE DISK SYSTEM IS E #340,6 MOV #17446,SAVE ;SET UP REFERENCE TO 4K EXREF: TST @SAVE ;REFERENCE MEMORY CMP #177446,SAVE ;TEST FOR GREATER THAN 28K BNE .+6 HALT ;PROCESSOR ERROR WITH BUSS TRAP BR . ADD #20000,SAVE ;SET UP FOR NEXT REFERENCE BR EXREF ;REFERENCE NEXT BANK MAXREF: MOV #1000,%6 ;RESET STACK SUB #20000,SAVE ; BIT #BIT10,FLAG ;ROUTINE TO REPORT THE NUMBER OF EXISTENT DISK(S) ;ON THE SYSTEM. REPON: CLR WORK INDSK: MOV WORK,@DAE ;LOAD DISK EXT. ADDR.BITS BIT #BIT11,@DCS ;TEST FOR NON-EXISTER CMA: 177464 ;CURRENT MEMORY ADDRESS REGISTER DAR: 177466 ;LOWER 16 BITS OF DISK ADDRESS DAE: 177470 ;EXTENSION ADDRESS REGISTER DBR: 177472 ;DATA BUFFER REGISTER MA: 177474 ;MAINTENANCE REGISTER ADS: 177476 ;LOOK AHEAD REGISTER ; ; ; ; ; ; ;RF11 DEDICATE REGISTERS (MEMORY) ; FLAG: 0 ;INTERNAL PROGRAM FLAG RANNU: 146723 ;RANDOM NUMBER PRIME WRDCT: 0 ;WORKING WORD COUNT TRACK: 0 ;WORKING DAE DMA: 0 ;WORKING DAR PATNU: 0 ;DATA PATTERN INDEX BUF: 0 ;WORKING D COUNT TDMA: 0 ;TEMP DAR SWRDCT: 0 ;STANDARD WORD COUNT ERCOUNT:0 ;ERROR COUNT FOR MESSAGES. SAVE: 0 SAV1: 0 PASS: 0 DSKNOR: 0 HRDER: 0 ;POINTER FOR HARD ERROR PASSC: 0 ; ;RF11 WORK REGISTERS ;(CAN BE CHANGED IN ANY ROUTINE) WORK: 0 WORK1: 0 WORK2: 0 WORK3: 0 START: RESET ;CLEAR THE WORLD MOV #1000,%6 ;SET UP STACK MOV #340,@CSR ;LOCK UP INTERRUPT LEVELS CLR FLAG ;CLEAR PROGRAM FLAG CLR TRACK ;CLEAR TRACK REGISTERS CLR DMA ;CLEAR DAR REGISTERS CLR PATNU ;CXERCISED. NOTE: EACH WRITE IS FOLLOWED BY A WRITE CHECK. 6. ERRORS 6.1 ERROR HALTS THE PROCESSOR HALTED AT LOC. 1316. CAUSE OF HALT, NO BUS ERROR OCCURRED WHEN ADDRESSING NON-EXISTENT MEMORY. THE PROCESSOR HALTED AT LOC. 1434. CAUSE OF HALT NO SELECTED DISK ON THE SYSTEM, OR DISKS NOT SELECTED IN SEQUENTIAL ORDER STARTING WITH DISK 0. THE PROCESSOR HALTED AT LOC. 1750. THE CAUSE OF THE HALT, UNABLE TO READ FROM THE DISK FOR THE SAVE BUFFER. THREE ATTEMPTS WERE MADE. STENT DISK BNE NEDST ;BRANCH IF NON EXISTENT DISK SET ADD #4,WORK ;SET UP NEXT DISK NO. CMP #40,WORK ;CHECK FOR 8 DISKS BEQ .+4 ;BRANCH IF 8 DISKS BR INDSK NEDST: ROR WORK ROR WORK BIT #17,WORK BNE .+6 HALT BR . JSR %5,CONV WORK MES11 2 EMT +0 HED5A MES11 -1 DEC WORK ROL WORK ROL WORK MOV WORK,DSKNOR ;ROUTINE TO SET UP WRITE/READ BUFFERS ; ; SUB OUTBUF,SAVE CLR WORK SETBUF: SUB #3,SAVE ;DIVIDE MEMORY BY 3 CMP #3,SAVE BHI OVERFLO ;BRANCH IF NO!DATA BUFFER (OUT-IN) TWRDCT: 0 ;TEMP WORD COUNT TDMA: 0 ;TEMP DAR SWRDCT: 0 ;STANDARD WORD COUNT ERCOUNT:0 ;ERROR COUNT FOR MESSAGES. SAVE: 0 SAV1: 0 PASS: 0 ; ;RF11 WORK REGISTERS ;(CAN BE CHANGED IN ANY ROUTINE) WORK: 0 WORK1: 0 WORK2: 0 START: RESET ;CLEAR THE WORLD MOV #1000,%6 ;SET UP STACK MOV #6,4 CLR 6 MOV #340,206 ;LOCK UP INTERRUPTS MOV #EMTRP,30 ;SET UP TTY POINTER MOV #340,32 ;LOCK UP INTERRUPTS MOV #DISK,34 ;SET UP DISK HANDLER POINTER MOV #340,36 ;"LEAR PATTER COUNT MOV #1000,SWRDCT ;SET UP STANDARD WORD COUNT MOV SWRDCT,WRDCT TST @SR BMI CONM ;OPERATE UNDER PROGRAM CONTROL BIS #70000,FLAG JMP ADTST ;ENTER OPERATOR CONVERSATION MODE CONM: EMT +1 ;ASK ABOUT DATA TEST ONLY CON1 JSR %7,ALPHA ;GO WAIT FOR ANSWER CMP #153,TEXBUF ;TEST FOR YES BNE .+10 ;BRANCH IF NO BIS #BIT10,FLAG EMT +1 CON2 ;ASK ABOUT MULTI DISK MODE JSR %7,ALPHA ;GO WAIT FOR ANSWER CMP #153,TEXBUF ;TEST FOR YES BNE DATTES ;DO NOT ENTER STATIC TE# THE PROCESSOR HALTED AT LOC. 2142. THE CAUSE OF THE HALT, UNABLE TO RESTORE THE DISK SURFACE. THREE ATTEMPTS WERE MADE. 6.2 ERROR REPORTS STATUS ERROR STATUS ERROR XXDAE XXXXXXDAR XXXXXXDCS A B C A=THE DISK NUMBER AND EXTENDED DISK ADDRESS BITS. B=THE DISK ADDRESS REGISTER C=THE DISK CONTROL REGISTER LAYOUT OF DISK ADDRESS BITS DAE DAR XXX XXX XXX XXX XXX XXX XXX DISK NO. TRACK ADDRESS WORD ADDRESS BIT LAYOUT OF D$ REMAINDER INC WORK ;+1 COUNT BR SETBUF OVERFLO:BIC #BIT0,WORK MOV OUTBUF,INBUF ;SET UP IN-BUFFER ADD WORK,INBUF ; MOV INBUF,SAVBUF ;SET UP SAVE BUFFER ADD WORK,SAVBUF MOV WORK,SWRDCT ;SET UP WORD COUNT CLC ROR SWRDCT ;DIVIDE BYTESX2 MOV #CNTLC,60 ;SET UP TTY VECTOR MOV #340,62 BIS #BIT6,@TKS ;ENABLE TTY INTERRUPT ; DATAT: MOV SWRDCT,WRDCT ;SET UP WORD COUNT MOV #DATAT,HRDER ;SET UP FOR HARD ERROR CLR DMA CLR TRACK RDSAV: MOV #340,@CSR ;LOCK UP PROCESSOR PRIORITY MOV %LOCK UP INTERRRUPTS MOV #340,@CSR ;LOCK UP INTERRUPT LEVELS MOV #LOOP,20 ;SET UP FOR SCOPE LOOP MOV #340,22 ;LOCK UP PRIORITY CLR TRACK ;CLEAR TRACK REGISTERS CLR DMA ;CLEAR DAR REGISTERS ;WE ARE NOW ENTERING THE STATIC TEST ;IF THE OPERATOR WOULD LIKE TO CHECK ;THE DISK REGISTERS PRIOR TO ENTERING THIS ;TEST WE HAVE SOME HANDY ROUTINES ;WHICH WOULD ALLOW YOU TO LOAD THESE ;REGISTERS UNDER SWITCH REGISTER CONTROL ;PLEASE REFERENCE THE STARTING ADDRESS ;TO SEE WHICH ROUTINE BEST SUIT&ST BIS #BIT11,FLAG ;SET FLAG TO ENTER STATIC TEST DSKDR: EMT +1 CON3 JSR %7,NOCHA SUB #1,TEXBUF CMP #10,TEXBUF BLOS DSKDR MOV TEXBUF,DSKNOR ROL DSKNOR ROL DSKNOR BR ASKWC DATTES: EMT +1 CON4 ;ASK UNIT NUMBER JSR %7,NOCHA ;WAIT FOR NO. CMP #10,TEXBUF ;IS NO = O>10 BLOS DATTES ;NO CLC ROL TEXBUF ROL TEXBUF BIS TEXBUF,FLAG ASKWC: EMT +1 CON5 ;ASK ABOUT OPTIONAL WORD COUNT JSR %7,ALPHA ;WAIT FOR ANSWER CMP #153,TEXBUF BNE OPDAR ;ASK ABOUT OPTIONAL DAR WCCO'CS REGISTER BIT15= ERROR BIT14= DISK FREEZE BIT13= WRITE CHECK ERROR BIT12= DATA PARITY ERROR BIT11= NON-EXISTENT DISK BIT10= WRITE LOCKOUT BIT9= MISSED TRANSFER BIT8= DISK CLEAR BIT7= READY BIT6= INTERRUPT ENABLE BIT5= EXTENDED MEMORY 1 (XM1) BIT4= EXTENDED MEMORY 0 (XM0) BIT3= MAINTENANCE BIT2-1= FUNCTION REGISTER BIT 2 BIT 1 OPERATION 0 0 NOP 1 0 READ 0(SAVBUF,BUF ;SET UP CURRENT ADDR BIC #3,FLAG LDAT: BIC #BIT9,FLAG INC FLAG READ +100 IOT ;WAIT FOR FLAG IN BACKGROUND TEST BIT #BIT9,FLAG ;CHECK FOR ERROR BEQ WRDAT ;WRITE RANDOM DATE MOV FLAG,WORK ;TRY TO READ 3 TIMES BIC #177774,WORK CMP #3,WORK BNE LDAT HALT ;UNABLE TO READ FROM BR . ;DISK WRDAT: MOV #WRSAV,HRDER ;SET UP FOR HARD ERROR MOV OUTBUF,BUF ;SET UP RANDOM BUFFER WRITE +100 IOT ;WAIT FOR FLAG IN BACK GROUND BIC #3,FLAG MOV INBUF,BUF ;SET UP CORRENT )S YOUR ;PROBLEM. ; ;THIS TEST IS DESIGNED TO TEST THE ABILITY OF RESET ;TO CLEAR ALL THE DISK REGISTERS ;TEST CONTROL REGISTER STAI1: RESET ;CLEAR THE WORLD MOV @DCS,WORK ;FETCH CONTROL REGISTER BIT #177577,WORK ;IS IT CLEARED BEQ XSTAI1 ;REGISTER OK (TEST READY) ERROR \N JSR %5,STAER ;REPORT STATIC ERROR XSTAI1: TSTB WORK ;TEST FOR READY BNE LPST1 ;BRANCH IF READY ERROR \N JSR %5,STAER ;REPORT READY NOT SET LPST1: SCOPE ;ENTER SCOPE LOOP STAI1 ;TEST CURRENT ADDRESS REGIS*N: EMT +1 CON6 ;ASK LENGTH OF WC JSR %7,NOCHA TST TEXBUF BEQ WCCON CMP #1001,TEXBUF ;IS WORD COUNT>1000 BLOS WCCON ;YES ASK FOR COUNT AGAIN MOV TEXBUF,SWRDCT ;OPERATING WORD COUNT MOV SWRDCT,WRDCT OPDAR: EMT +1 CON7 ;ASK ABOUT OPTIONAL DAR JSR %7,NOCHA CMP #4000,TEXBUF ;3777 MAX DAR ADDR BLOS OPDAR MOV TEXBUF, DMA ;TEMP DAR REGISTER OPPAT: EMT +1 CON8 ;ASK ABOUT DATA PATTERNS JSR %7,NOCHA CMP #23,TEXBUF ;TEST FOR CORRECT NO BLOS OPPAT ;ASK AGAIN CMP #22,TEXB+ 1 WRITE 1 1 WRITE CHECK BIT0= GO (WRITE ONLY BIT) NOTE: WHEN A FREEZE ERROR OCCURS AN ADDITIONAL ERROR MESSAGE WILL BE REPORTED, AS FOLLOWS. XXX HARD ERROR LAYOUT OF BITS 0 - 7 BIT0= CMA INH. (NOT AN ERROR CONDITION) BIT1= UNUSED BIT2= NON-EXISTENT MEMORY ERROR BIT3= UNUSED BIT4= TRACK C TIMING ERROR BIT5= TRACK B TIMING ERROR BIT6= TRACK A TIMING ERROR BIT7= ADDRESS PARITY ERROR 6.3 DATA ERRORS DATA ,ADDR RANRD: BIC #BIT9,FLAG INC FLAG READ +100 IOT ;WAIT FOR FLAG IN BACKGROUND JSR %5,COMPARE ;COMPARE DATA BIT #BIT9,FLAG ;CHECK FOR ERROR BEQ WRSAV ;RESTORE DISK BUFFER MOV FLAG,WORK ;CHECK FOR 3 RE-READS BIC #177774,WORK CMP #3,WORK BNE RANRD ;GO RE-READ DATE BIC #3,FLAG WRSAV: BIC #BIT9,FLAG ;CLEAR PROGRAM ERROR FLAG MOV SAVBUF,BUF ;SET UP CURRENT ADDRESS WRITE +100 IOT ;WAIT IN BACKGROUND TEST WRCHECK +100 IOT ;WAIT FOR FLAG BIT #BIT9,FLAG ;CHECK FOR ERROR -TER ; STAI2: RESET ;CLEAR THE WORLD MOV @CMA,WORK ;FETCH CMA REGISTER BEQ LPST2 ;REGISTER OK ERROR \N JSR %5,STAER ;REPORT ERROR LPST2: SCOPE ;ENTER SCOPE LOOP STAI2 ; ;TEST WORD COUNT REGISTER ; STAI3: RESET ;CLEAR THE WORLD MOV @WC,WORK ;FETCH WC REG. BEQ LPST3 ;REGISTER OK ERROR \N JSR %5,STAER ;REPORT ERROR LPST3: SCOPE ;ENTER SCOPE LOOP STAI3 ; ;TEST DISK ADDRESS REGISTER ; STAI4: RESET ;CLEAR THE WORLD MOV @DAR,WORK ;FETCH DAR REGISTER BEQ LPST4 ;R.UF BEQ OPWRT ;DATA PATTERN UNDER PROGRAM CONTROL BIS #BIT15,FLAG ;SET PROGRAM FLAG MOV TEXBUF, PATNU ;OPERATOR WANTS TO SELECT DATA CLC ROL PATNU BIC #70000,FLAG ;CLEAR OP MODE BITS IN FLAG OPWRT: EMT +1 CON9 ;ASK ABOUT WRITE JSR %7,ALPHA CMP #153,TEXBUF ;TEST FOR YES BNE OPWCK ;ASK ABOUT WRITE CHECK BIS #BIT14,FLAG ;YES SET FLAG BIT OPWCK: EMT +1 CON10 ;ASK ABOUT WRITE CHECK JSR %7,ALPHA CMP #153,TEXBUF ;TEST FOR YES ANSWER BNE OPRD ;GO ASK ABOUT READ BIS #BIT13,F/ERROR XXDAE XXXXXXDAR XXXXXXGOOD DATA XXXXXXBAD DATA A B C D A=THE DISK NUMBER AND EXTENDED DISK ADDRESS BITS B=THE DISK ADDRESS REGISTER C=THE DATA WRITTEN ON THE DISK D=THE DATA READ FROM THE DISK 6.4 DISK ADDRESS ERROR DISK ADDRESS ERROR XXDAEXXXXXXDAR THE TERMINATING DISK ADDRESS AFTER THE TRANSFER WAS NOT CORRECT THE DAE AND DAR SHOULD EQUAL WHAT WAS REPORTED. CHECK THE RF11 PANEL FOR THE ERROR ADDRESS. 6.5 PROCESSOR TIME OUT 0 BEQ STORBU MOV FLAG,WORK BIC #177774,WORK CMP #3,WORK BNE WRSAV HALT STORBU: TST FLAG BMI RESTORE ;RESTORE DISK AND EXIT JSR %7,DISBUF ;SET UP NEXT DISK BUFFER JMP RDSAV ;READ NEXT BUFFER EMT +1 ;REPORT END. END JMP DATAT ;RECYCLE TEST RESTORE: HALT BR . ;DO NOT RESTORE MEM ; ;ENTER DISK HANDLER BY THE TRAP INSTRUCTION ;ARGUMENT TO TRAP INSTRUCTION IS TWO ORDER ;BYTE OF THE CONTROL REGISTER. ; DISK: MOV DBR,%5 ;SET UP TO LOAD DISK REG MOV TRACK,-(5) ;LOAD TRACK 1EGISTER CLEARED ERROR \N JSR %5,STAER ;REPORT ERROR LPST4: SCOPE ;ENTER SCOPE LOOP STAI4 ; ;TEST DISK EXT. ADDRESS REGISTER ; STAI5: RESET ;CLEAR THE WORLD MOV @DAE,WORK ;FETCH DAE REGISTERS BEQ LPST5 ;DAE CLEARED ERROR \N JSR %5,STAER ;REPORT ERROR LPST5: SCOPE ;ENTER SCOPE LOOP STAI5 ; ;TEST DATA BUFFER REGISTER ; STAI6: RESET ;CLEAR THE WORLD MOV @DBR,WORK ;FETCH DBR REGISTER BEQ LPST6 ;DBR CLEARED ERROR \N JSR %5,STAER ;REPORT ERROR LPST6: SCOPE ;ENTER SC2LAG ;YES SET FLAG BIT OPRD: EMT +1 CON11 ;ASK ABOUT READ JSR %7,ALPHA CMP #153,TEXBUF ;TEST FOR YES ANSWER BNE CHKFLG BIS #BIT12,FLAG ;SET FLAG TO READ CHKFLG: BIT #70000,FLAG BEQ OPWRT ; ; ; ADTST: BIT #BIT11,FLAG ;ARE WE IN MULTI DISK MODE BEQ EXMFLG ;BRANCH IF NO. EMT +1 MES11 MOV FLAG,ACNVX ROR ACNVX ROR ACNVX BIC #177770,ACNVX ;FETCH DISK # JSR %5,CONV ACNVX MES12 1 EMT +1 MES12 EXMFLG: BIT #BIT10,FLAG ;TEST FOR DATA TEST ONLY BEQ .+6 ;DO COMPLETE TE3 PROCESSOR BACKGROUND TIMED OUT. THIS MESSAGE WILL BE REPORTED IF THE DISK FAILS TO RAISE A BR REQUEST AFTER EXTENDED PERIOD OF TIME. 6.6 END END THIS MESSAGE IS REPORTED AT THE END OF ONE COMPLETE PASS OF THE DISK SYSTEM. 7. RESTRICTIONS THE DISKS MUST BE IN SEQUENTIAL ORDER RANGING FROM DISK SELECT 0 - 7. 8. PROGRAM DESCRIPTION MULTI DISK IS NOT A DIAGNOSTIC - IT IS MERELY A CONFIDENCE TEST. IF THE USER ENCOUNTERS ANY PROBLEMS WITH THE SYSTEM WHILE OPERATING M4NUMBER MOV DMA,-(5) ;LOAD WORD ADDRESS MOV BUF,-(5) ;SET UP CURRENT ADDRESS MOV WRDCT,-(5) ;LOAD WORD COUNT COM (5) ;SET UP TWO'S COMPLEMENT INC (5) MOV (6),%4 MOV -(4),WORK ; BIC #177600,WORK ;MASK FUNCTION BITS MOV WORK,-(5) ;LOAD FUNCTION REG. RTI ;RETURN FROM TRAP ; ; ; ; ; ; ; ;RF11 DISK INTERRUPT HANDLER ;ROUTINE CONTINUES ON ERRORS ; DKINT: BIC #BIT4,@CSR ;CLEAR TRACE BIT TST @DCS ;TEST FOR ERROR BPL INTEXT ;BRANCH IF NO ERROR BIS #BIT9,FLAG ;SET ERROR BIT 5OPE LOOP STAI6 ; ;TEST MAINTENANCE REGISTER ; STAI7: RESET ;CLEAR THE WORLD MOV @MA,WORK ;FETCH MAINTENANCE REG BEQ LPST7 ;MA CLEARED ERROR \N JSR %5,STAER ;REPORT ERROR LPST7: SCOPE ;ENTER SCOPE LOOP STAI7 ; ;CAN WE SET THE FUNCTION BITS IN THE DCS REG. ;BITS 7,6,5,4,3,2&1 ; STAI10: MOV #176,@DCS ;SET DISK FUNCTION BITS MOV @DCS,WORK ;FETCH FUNCTION BITS CMP #376,WORK ;ARE THE FUNCTION BITS SET BEQ LPST10 ;FUNCTION BITS SET MOV #376,WORK1 ;SET UP FOR ERROR REPORT ERR6ST JMP DATAT ;DO DATA TEST ONLY ;***ADDRESS ADT2*** ; ;IN THIS TEST WRITE TRACK ZERO WITH ZERO'S ;THEN WRITE ALL ONES IN AN ADDRESS ;CHECK IF WRITING ONES IN THAT ADDRESS ALTERED ;ANY OTHER ADDRESS IN THE TRACK ;FOLLOW THIS PROCEDURE FOR ADDRESSES 0 TO 3777 ; ; ADT2: MOV #1000,%6 ;SET UP STACK MOV #2000,WRDCT ;SET UP WORD COUNT MOV #OUTBUF,BUF ;SET UP CURRENT ADDRESS MOV PATNU,SAVE CLR PATNU CLR TRACK CLR DMA JSR %5,PASEL ;SET UP DATA BUFFER MOV SAVE,PATNU ;****WRITEULTI DISK, HE SHOULD NOT TRY TO DIAGNOSE THE PROBLEM USING THIS PROGRAM. IF PROBLEMS ARE ENCOUNTERED, IT IS SUGGESTED THAT THE USER REVERTS TO DISK DATA AS A MEANS OF DIAGNOSING HIS PROBLEM. G MOV @DAE,WORK ;REPORT ERROR BIC #177700,WORK ;MASK ADDRESS EXT. BITS. JSR %5,CONV ;CONVERT TO ASCII WORK MES1A 2 EMT+1 HED2 DELMES: MOV @DAR,WORK ;SET UP LOWER 16 BITS OF ADDR. DEC WORK JSR %5,CONV ;CONVERT TO ASCII WORK MES1 6 EMT+0 MES1A MES1 -1 MOV @DCS,WORK ;SET UP STATUS JSR %5,CONV WORK MES2 6 EMT+1 MES2 BIT #BIT14,@DCS BEQ SOFTER ;GO AND CONTINUE SOFT ERROR MOV @DAE,WORK ;FETCH ERROR EXT. BITS SWAB WORK BIC #177400,WORK JSR %5,CONV EOR \N JSR %5,STAER1 ;REPORT ERROR (ERROR IN FUNCTION BITS) LPST10: SCOPE ;ENTER SCOPE LOOP STAI10 ; ;WILL DISK CLEAR CLEAR THE FUNCTION BITS ; STAI11: MOV #176,@DCS ;SET DISK FUNCTION BITS BIS #BIT8,@DCS ;EXECUTE DISK CLEAR MOV @DCS,WORK ;FETCH CONTROL REG CMP #200,WORK ;IS ONLY READY SET BEQ LPST11 ;REGISTER CLEARED ERROR \N JSR %5,STAER ;REPORT ERROR LPST11: SCOPE ;ENTER SCOPE LOOP STAI11 ; ;CAN WE SET ALL THE CMA BITS ; STAI12: MOV #177777,WORK1 ;SET UP CURRENT ADDR.F DISK ADDR. 0 TO 1777 WITH ZEROES **** RFADT: BIS #BIT8,@DCS WRITE TSTB @DCS ;TEST FOR READY BPL .-4 TST @DCS ;TEST FOR ERROR BPL RFADTX-6 MOV #1,ERCOUNT ;ERROR OCCURRED MOV @DCS,WORK1 ;FETCH DCS REGISTER MOV @DAR,WORK DEC WORK ER1: JSR %5,STAER1 ;REPORT ERROR OCURRED ;****WRD1=CONTROL STATUS REG. AT THE THE TIME OF THE ERROR **** ;****WRD2=DISK ADDR. AT THE TIME OF THE ERROR **** BR RFADT ;LOOP ON ERROR MOV #2000,DMA ;****WRITE DISK ADDR. 2000 TO 3777 WITH ZEROES **** RFADTH IDENTIFICATION -------------- PRODUCT CODE: MAINDEC-11-DZRFA-A-D SUPERSEDES D50A PRODUCT NAME: RF11 DISK DATA DATE CREATED: 1 JUNE 1972 MAINTAINER: DIAGNOSTIC GROUP AUTHOR: EARL HAIGHT TABLE OF CONTENTS ----------------- SECTION CONTENTS ------- -------- 1. ABSTRACT 2. REQUIREMENTS 2.1 EQUIPMENT 2.2 STORAGE 3. LOADING PROCEDURE 3.1 METHOD 4. STARTING P""""""" """""""""""""""""""""""""""""""""DDDDDDD@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDˆˆˆˆˆˆ€ˆˆˆˆˆˆˆ€€ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆUADDB CqРСz,QM›qРС8Ч,Zr›y@[' 3›qРСV:ƒ›"Љ%[n7'м›˜€ їhњ ‡Zы›"б%їhњ рZ:›$Dџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџнннн™™™™™™™™™™™™™™UџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџI OF ALL ONES MOV WORK1,@CMA ;LOAD CMA MOV @CMA,WORK ;FETCH CMA CMP WORK1,WORK ;COMPARE FOR ALL BITS SET BEQ LPST12 ;ALL BITS SET? ERROR \N JSR %5,STAER1 ;REPORT ERROR LPST12: SCOPE ;ENTER SCOPE LOOP STAI12 ; ;WILL DISK CLEAR - CLEAR THE CMA REGISTER ; STAI13: MOV #177777,@CMA ;SET CMA EQUAL TO ALL ONES BIS #BIT8,@DCS ;EXECUTE DISK CLEAR TST @CMA ;TEST FOR BIT0 SET IN CMA (READ ONLY BIT) BEQ LPST13 ;WAS THE REST OF CMA CLEARED? MOV @DCS,WORK ;NO! FETCH CMA REG. ERROR \N JX: BIS #BIT8,@DCS ;CLEAR THE DISK WRITE TSTB @DCS ;TEST FOR READY BPL .-4 TST @DCS ;TEST FOR ERROR BPL RFRD-4 MOV @DAR,WORK DEC WORK MOV @DCS,WORK1 ;FETCH DCS REGISTER MOV #2,ERCOUNT ;SETUP ERROR COUNT ER2: JSR %5,STAER1 ;REPORT DISK ERROR ;****WRD1=DISK CONTROL STATUS REG. AT THE TIME OF THE ERROR **** ;****WRD2=DISK ADDR. REG AT THE TIME OF THE ERROR **** BR RFADTX ;LOOP ON ERROR CLR SAV1 RFRD: CLR SAVE WONWD: MOV #-1,#-1 MOV #WONWD+4,BUF MOV #1,WRDCT MOV SAV1,DMK;CONVERT TO ASCII WORK MES2A 3 EMT+0 HED5A MES2A -1 BIS #BIT8,@DCS ;CLEAR THE DISK MOV #1000,%6 JMP @HRDER ;EXIT HARD ERROR SOFTER: TST @WC ;CHECK FOR X-FER DONE BEQ INTEXT ;EXIT FROM ROUTINE BIS #BIT0,@DCS ;SET GO AND CONTINUE RTI ;RETURN TO WAIT INSTR. INTEXT: MOV #774,%6 ;RESET STACK RTI ;EXIT ; ;ROUTINE TO SETUP DISK BUFFERS ;ADD WORD COUNT TO STARTING DISK ADDRESSES ;COMPARE CALCULATED ADDRESS TO TERMINATING ADDRESS ; DISBUF: ADD WRDCT,DMA ;ADD WORD COUNT TLROCEDURE 4.1 WORST CASE OPERATION 4.2 OPERATOR INTERVENTION 4.2.1 CHANGE DISK OPERATING PARAMETERS 4.3 SCOPE LOOP ENTRY POINTS 5. OPERATING PROCEDURE 5.1 CONTROL SWITCH SETTINGS 5.2 CONVERSATION MODE 5.3 SUBROUTINE ABSTRACT 6. ERROR REPORTS 1. ABSTRACT THE RF11 DISK DATA TEST IS A SERIES OF STATIC, ADDRESS AND DATA RELIABILITY ROUTINES WHICH VERIFY TO THE USER THE DISK CONTROL (RF11) AND DSIK (RS11) ARE OPERATING CORRECTLY. THIS TEST USED MJSR %5,STAER ;REPORT ERROR LPST13: SCOPE ;ENTER SCOPE LOOP STAI13 ; ;CAN WE SET ALL BITS IN WC REGISTER ; STAI14: MOV #177777,WORK1 ;SET UP MAX. WORD COUNT MOV WORK1,@WC ;LOAD WC REGISTER CMP WORK1,@WC ;ARE ALL BITS SET BEQ LPST14 ;YES! EXIT MOV @WC,WORK ;NO! FETCH WC REG. ERROR \N JSR %5,STAER1 ;REPORT ERROR LPST14: SCOPE ;ENTER SCOPE LOOP STAI14 ; ;WILL DISK CLEAR-CLEAR THE WORD COUNT REGISTER ; STAI15: MOV #177777,@WC ;SET WC REGISTER EQUAL TO ALL ONES BIS #BIT8,@DCSNA BIS #BIT8,@DCS WRITE TSTB @DCS ;TEST FOR READY BPL .-4 TST @DCS ;TEST FOR ERROR BPL SUADB ;BRANCH IF NO CONTROL ERROR MOV @DCS,WORK1 MOV SAV1,WORK MOV #3,ERCOUNT ;SETUP ERROR COUNT ER3: JSR %5,STAER1 ;REPORT ERROR ;****WRD1=DISK CONTROL STATUS AT THE TIME OF THE ERROR**** ;****WRD2=DISK ADDR. IN ERROR WHEN TRYING TO WRITE ALL ONES **** BR WONWD ;RE-WRITE WORD SUADB: TST SAVE BEQ CHKZER CMP #2000,SAV1 BHI WRCADT BUFIND: MOV SAV1,%0 ROL %0 BIC #174001,%0 MOV #-1,OUOO LOWER 16 BITS BCC COMDAR INC TRACK ;OVERFLOW ADD ONE TO TRACK COMDAR: CMP DMA,@DAR ;COMPARE LOWER 16 BITS BEQ CMDAE BIS #BIT6,FLAG ; CMDAE: MOV @DAE,WORK1 ;FETCH EXT. ADDR BITS BIC #177740,WORK1 ;MASK TRACK AND DISK ADDR BIC #177740,TRACK CMP TRACK,WORK1 ;ARE THEY EQUAL BNE ERADR ;ERROR IN DAE REG TSTB FLAG ;CHECK FOR LAST DISK BUFFER BPL EXTCME CLR DMA ;CLEAR LOWER 16 BITS CLR TRACK ;CLEAR EXT. ADDR. BITS. BIC #200,FLAG ADD #4,(6) ;INC STOCK POINTER MOV SWRDCT,WRDPIN CONJUNCTION WITH THE RF11 DISKLESS AND RF11 MULTI DISK ASSURES THE USER OF AN ERROR FREE SYSTEM, WHEN USED IN ITS ENTIRETY. 2. REQUIREMENTS 2.1 EQUIPMENT PDP-11 RF11 AND RS11 2.2 STORAGE STATIC TEST PROGRAM OCCUPIES FROM 0 TO 11134 DATA TEST MAIN BODY OF PROGRAM OCCUPIES FROM LOC 0 TO 13476 WRITE OUTPUT BUFFER OCCUPIES FROM LOC 13500 TO 15476 READ INPUT BUFFER OCCUPIES FROM LOC 15500 TO 17476 3. LOADING PROCEDURE 3.1 METHOD OF LOADING BOTH STATIC AND DATA TEST TQ ;EXECUTE DISK CLEAR MOV @WC,WORK ;FETCH WORD COUNT REGISTER BEQ LPST15 ;YES! EXIT ERROR \N JSR %5,STAER ;REPORT ERROR LPST15: SCOPE ;ENTER SCOPE LOOP STAI15 ; ;CAN WE SET ALL THE BITS IN THE DAR REGISTER. ; STAI16: MOV #177777,WORK1 MOV WORK1,@DAR ;SET DAR TO ALL ONES MOV @DAR,WORK ;FETCH DAR REGISTER CMP WORK1,WORK ;ARE ALL BITS SET BEQ LPST16 ;YES! EXIT ERROR \N JSR %5,STAER1 ;NOT ALL BITS SET REPORT ERROR LPST16: SCOPE ;ENTER SCOPE LOOP STAI16 ; ;CAN WE CLEAR THE RTBUF(0) BR WRCADT CHKZER: CMP #2000,SAV1 BHI BUFIND WRCADT: BIS #BIT8,@DCS MOV #2000,WRDCT ;SETUP WORD COUNT MOV #OUTBUF,BUF ;SETUP CURRENT ADDR MOV SAVE,DMA ;SETUP DISK ADDRESS WRCHECK TSTB @DCS ;CHECK FOR READY BPL .-4 TST @DCS ;TEST FOR ERROR BPL CHKBUF ;BRANCH NO DISK ERROR MOV @DCS,WORK1 MOV SAV1,WORK DEC WORK MOV #4,ERCOUNT ;SET UP ERCOUNT ER4: JSR %5,STAER1 ;REPORT ERROR MOV @DAR,ACNVX ;SET UP DISK ADDR. FOR REPORT JSR %5,CONV ACNVX MES4 6 EMT +1 MES4SCT BR EXTDR ;EXIT EXTCME: BIC #177774,WORK1 ;MASK EXT. TRACK BITS CMP #3,WORK1 ;COMPARE FOR LAST TRACK BNE AKH ;NOT LAST TRACK EXIT MOV @DAE,WORK BIC #177743,WORK CMP WORK,DSKNOR BNE AKH MOV @DAR,WORK ;FETCH LOWER 16 BITS OF ADDRESS ADD WRDCT,WORK ;WILL DISK OVERFLOW BCC AKH BIS #200,FLAG MOV @DAR,WRDCT ;DISK WILL OVERFLOW COM WRDCT ;SET UP NEW WORD COUNT INC WRDCT ; AKH: MOV @DAE,TRACK BIC #177740,TRACK ;MASK TRACK BITS MOV @DAR,DMA ;LOWER 16 BITS OF ADDRESS BIT TAPES PROGRAM FORMAT ABSOLUTE A. VERIFY THE BOOT LOADER IS IN MEMORY. B. SET SWITCH REGISTER EQUAL TO *500 MEMORY SIZE * 4K 17 8K 37 12K 57 16K 77 20K 117 24K 137 28K 157 C. DEPRESS LOAD ADDRESS. D. DEPRESS START. 4. STARTING PROCEDURE 4.1 WORST CASE DISK TEST UNIT ZERO FOR BOTH STATIC AND DATA TEST A) SET SWITCH REGISTER EQUAL TO 200 B) DEPRESS LOAD ADDRESS C) SET SWITCH REGISTER EQUAL TO ZERO D) DEPRESS START 4.2 OPERATOR UDAR REG. WITH DISK CLEAR. ; STAI17: MOV #177777,@DAR ;SET DAR TO ALL ONES BIS #BIT8,@DCS ;EXECUTE DISK CLEAR TST @DAR ;TEST FOR ZERO DAR BEQ LPST17 ;YES EXIT MOV @DAR,WORK ;NO BITS SET IN DAR ERROR \N JSR %5,STAER ;REPORT ERROR LPST17: SCOPE ;ENTER SCOPE LOOP STAI17 ; ;CAN WE SET THE EXT. ADDRESS BITS IN THE DAE REGISTER ; STAI20: MOV #37,WORK1 ; MOV WORK1,@DAE ;SET EXT. ADDRESS BITS MOV @DAE,WORK ;FETCH CONTENTS OF DAE REG. CMP WORK1,WORK ;ARE ALL EXT. ADDRESS BITS SET BEV ;****WRD1=DISK CONTROL STATUS REG. AT THE TIME OF THE ERROR **** ;****WRD2=DISK ADDR. IN ERROR DURING WRITE CHECK **** ;****WRD ADDR.=ADDR. WHICH CONTAINS ALL ONES **** BR WRCADT CHKBUF: MOV SAV1,%0 ROL %0 BIC #174001,%0 CLR OUTBUF(0) TST SAVE BNE ZEROAD ;RE-WRITE ADDRESS TO ZERO MOV #2000,SAVE BR SUADB ZEROAD: CLR SAVE ; MOV SAV1,DMA ;SETUP DISK ADDRESS CLR #0 ;SET UP DATA MOV #.-2,BUF ;SETUP CURRENT ADDRESS MOV #1,WRDCT ;SETUP WORD COUNT WRITE TSTB @DCS ;CHECK W#BIT6,FLAG BNE .+4 EXTDR: RTS %7 ;EXIT ERADR: JSR %5,CONV ;CONVERT DMA REG COUNT TO ASCII DMA MES1 6 JSR %5,CONV ;CONVERT TRACK REG COUNT TO ASCII TRACK MES1A 2 EMT +0 ;REPORT ERROR HED4 MES1A MES1 -1 CLR DMA ;DISK ADDRESS ERROR RE-START PROG. CLR TRACK HALT ; ; ; ;ROUTINE TO FILL BUFFERS WITH RANDOM DATA ; ; ; ;ENTER FROM JSR %7,RANEX ; RANEX: MOV WRDCT,WORK ;SET UP WORK MOV #OUTBUF,%5 ;LOC. OF OUTBUFFER ; ; ; ;RANDOM DATA GENERATOR SUBROUTINE DXINTERVENTION FOR DATA TEST ONLY. A) SET SWITCH REGISTER EQUAL TO 200 B) DEPRESS LOAD ADDRESS C) SET SWITCH REGISTER EQUAL TO MODE OF OPERATION (REF. SEC5.) D) DEPRESS START. 4.3 ADDRESS ENTRY POINTS FOR TEST ROUTINES ***STATIC ROUTINES*** ***ROUTINES IN STATIC TEST ONLY*** 300 JMP STAI1 TEST RESET TO CONTROL REGISTER 304 JMP STAI2 TEST RESET TO CURRENT ADDRESS REGISTER 310 JMP STAI3 TEST RESET TO WORD COUNT REGISTER 314 JMP STAI4 TEST RESET TO DISK ADDRESS REGISTER 32YQ LPST20 ;YES! EXIT ERROR \N JSR %5,STAER1 ;REPORT ERROR LPST20: SCOPE ;ENTER SCOPE LOOP STAI20 ; ;CAN WE CLEAR THE EXT ADDRESS BITS IN THE DAE REG. ;USING DISK CLEAR ; STAI21: MOV #37,@DAE ;SET EXT. ADDRESS BITS BIS #BIT8,@DCS ;EXECUTE DISK CLEAR MOV @DAE,WORK ;FETCH CONTENTS OF DAE REG BEQ LPST21 ;YES! EXIT ERROR \N JSR %5,STAER ;REPORT ERROR LPST21: SCOPE ;ENTER SCOPE LOOP STAI21 ; ;DO ONE WORD WRITE FOLLOWED BY ONE WORD WRITE CONTINUE ;EROR1=BUSY FAILED TO SETZFOR READY BPL .-4 TST @DCS ;TEST FOR ERROR BPL INDADT MOV #5,ERCOUNT MOV @DCS,WORK1 MOV @DAR,WORK ER5: JSR %5,STAER1 ;****WRD1=CONTROL STATUS REG. AT THE TIME OF THE ERROR **** ;****WRD2=DISK ADDR. AT THE TIME OF THE ERROR **** BR ZEROAD ;LOOP ON ERROR INDADT: CMP #3777,SAV1 BEQ LP2ADT ;LAST ADDR. CHECKED INC SAV1 JMP RFRD ;CHECK NEXT ADDRESS LP2ADT: BIT #BIT11,@SR ;IS BIT 11 SET IN SR BEQ .+6 JMP ADT2 ;BIT 11 SET LOOP ON TEST ; ; ; ; ;***** ADDRESS TEST **[AYGEN: MOV LONUM,%0 ;SET UP R0 WITH 5 DIGITS LOW MOV HINUM,%1 ;SET UP R1 WITH 5 DIGITS HIGH MOV #7,%3 ;SET UP SHIFT COUNT CLR %2 ;CLEAR R2 SHIFT: ASL %0 ;SHIFT R0 LEFT AND ROL %1 ;ROTATE CARRY INTO LSB OF R1 INTO ROL %2 ;ROTATE CARRY OUT OF R1 INTO R2 DEC %3 ;DECREMENT R3 BNE SHIFT ;CONTINUE SHIFT LOOP ADD LONUM,%0 ;ADDN IN NUMBER TO MAKE X 129 ADC %1 ;PROPOGATE CARRY ADD HINUM,%1 ;ADDN IN NUMBER TO MAKE X 129 ADC %2 ;PROPOGATE CARRY ADD #1057,%0 ;ADDN LOW CONSTANT ADC \0 JMP STAI5 TEST RESET TO DISK EXT. ADDRESS REGISTER 324 JMP STAI6 TEST RESET TO DATE BUFFER REGISTER 330 JMP STAI7 TEST RESET TO MAINTENANCE REGISTER 334 JMP STAI10 CAN WE SET W/R BITS IN DCS REGISTER 340 JMP STAI11 CAN WE CLEAR THE DCS REGISTER USING DISK CLEAR. 344 JMP STAI12 CAN WE SET ALL CMA BITS 350 JMP STAI13 CAN WE CLEAR ALL CMA BITS USING DISK CLEAR 354 JMP STAI14 CAN WE SET ALL WC BITS 360 JMP STAI15 CAN WE CLEAR ALL WC BITS USING DISK CLEAR 364 JMP ] ;EROR2=BUSY FAILED TO CLEAR ;EROR3=CONTROL ERROR WHEN X-FERING DATA ;EROR4=DAE INCREMENTED WHEN X-FERING DATA ;EROR5=DAR FAILED TO INCREMENT WHEN X-FERING DATA ;EROR6=WORD COUNT FAILED TO OVERFLOW ;EROR7=CMA FAILED TO INCREMENT ; ; ;* * * EXECUTE THE ONE WORD WRITE* * * STAI22: BIS #BIT8,@DCS ;CLEAR THE DISK WORLD MOV #177777,OUTBUF ;DATA TO BE X-FERED MOV #OUTBUF,@CMA ;SET UP CURRENT ADDRESS MOV #-1,@WC ;SET WORD COUNT TO -1 BIS #3,@DCS ;GO WRITE TSTB @DCS ;TEST FOR RDY=0 BPL ST^*** ; ;WRITE EACH UNIQUE ADDRESS ON ITSELF FOR TRACK 0 ;THEN READ IT BACK AND COMPARE FOR THE ;CORRECT DATA ; ; ADT3: CLR DMA ;CLEAR ACTIVE REG CLR TRACK CLR WORK CLR WORK1 MOV #1000,%6 ;SETUP STACK MOV #OUTBUF,BUF ;SET UP CURRENT ADDRESS MOV #2000,WRDCT ;SET UP WORD COUNT MOV #OUTBUF,%0 ;FILL BUFFER WITH COUNT INADB: MOV WORK,(0)+ INC WORK ;+1 COUNT CMP #OUTBUF+4000,%0 BNE INADB ;SET UP NEXT WORD MOV WORK,SAVE WRABF: BIS #BIT8,@DCS ;CLEAR THE DISK WORLD WRITE ;WRITE _%1 ;PROPOGATE CARRIES ADC %2 ;PROPOGATE AGAIN ADD #47401,%1 ;ADDN HIGH CONSTANT ADC %2 ;PROPOGATE CARRY ADD #6,%2 ;ADDN HIGHEST CONSTANT ADD %2,%0 ;REPRIME R0 WITH HIGH DIGIT ADC %1 ;PROPOGATE CARRY MOV %0,LONUM ;PUT R0 BACK IN LONUM MOV %0,(5)+ ;HOLD LONUM FOR PROGRAM DEC WORK BEQ EXGEN MOV %1,HINUM ;PUT R1 BACK IN HINUM MOV %1,(5)+ ;HOLD HINUM FOR PROGRAM DEC WORK BNE DAYGEN EXGEN: RTS %7 ;RETURN TO PROGRAM LONUM: 0 HINUM: 0 ; ; ;DATA COMPARISON ROUTINE ;IF `STAI16 CAN WE SET ALL THE DAR BITS 370 JMP STAI17 CAN WE CLEAR ALL THE DAR BITS USING DISK CLEAR 374 JMP STAI20 CAN WE SET ALL THE DAE BITS 400 JMP STAI21 CAN WE CLEAR ALL THE DAE BITS, USING DISK CLEAR 404 JMP STAI22 EXECUTE A ONE WORD WRITE FOLLOWED BY A ONE WORD WRITE CONTINUE 410 JMP STAI40 EXECUTE A ONE WORD WRITE CHECK FOLLOWED BY A ONE WORD WRITE CHECK CONTINUE 414 JMP STAI56 EXECUTE A ONE WORD READ FOLLOWED BY A ONE WORD READ CONTINUE 420 JMP STAIaAI23 ;RDY=0 MOV @DCS,WORK ;BUSY NOT SET! FETCH DCS EROR1: ERROR \N JSR %5,STAER ;REPORT ERROR BR STAI22 ;RESTART TEST STAI23: CLR WORK INCWAT: INC WORK ;WAIT FOR BUSY=0 TSTB @DCS ;IS BUSY CLEARED BMI STAI24 ;FLAG CLEARED TST WORK ;HAVE WE WAITED LONG ENOUGH BNE INCWAT ;RDY FAILED TO SET MOV @DCS,WORK ;FETCH CONTENTS OF DCS REG BIS #2,WORK1 ;WANT DCS SHOULD CONTAIN EROR2: ERROR \N JSR %5,STAER1 ;REPORT ERROR BR STAI22 ;RESTART TEST STAI24: MOV @DCS,WORK ;FETCH CONTENTS OFb TSTB @DCS ;IS THE CONTROL READY BPL .-4 ;CONTROL READY TST @DCS ;IS THERE AN ERROR BPL TFBL ;NO ERROR MOV @DCS,WORK ;FETCH CONTENTS OF CONTROL REG MOV #6,ERCOUNT ;SET UP ERROR COUNT ER6: JSR %5,STAER ;REPORT CONTROL ERROR ;****WRD1=DISK CONTROL STATUS REG. AT THE TIME OF THE ERROR **** BR WRABF ;RE-WRITE DATA TFBL: MOV SAVE,WORK ADD #2000,DMA CMP #4000,WORK ;HAVE WE WRITTEN ALL OF TRACK 0 BNE INADB-4 CLR WORK CLR DMA CLR WORK1 RDTDN: BIS #BIT8,@DCS ;CLEAR THE DISK READcAN ERROR OCCURS BETWEEN THE OUT-BUFFER AND ;THE IN-BUFFER AN ERROR WILL BE REPORTED IN THE ;FOLLOWING MANNER ;DATA ERROR XX DAE XXXXXX DAR XXXXXX GOOD DATA XXXXXX BAD DATA ; ; COMPARE:CLR WORK2 ;WORD COUNT MOV OUTBUF,SAVE ;SET UP OUTBUFFER POINTER MOV INBUF,SAV1 ;SET UP IN BUFFER POINTER WRDCMP: CMP @SAVE,@SAV1 ;COMPARE BUFFERS BNE WDERR ;WORD IN ERROR WRDINC: INC WORK2 ;+1 WORD COUNT CMP WRDCT,WORK2 ;IS COMPLETE BUFFER CHECKED BEQ ADAM ;EXIT ROUTINE ADD #2,SAVE ADD #2,SAV1 BR d74 TEST TRACK INCREMENT 424 JMP STAI77 TEST DISK INCREMENT 430 JMP STA103 TEST THAT NED RAISES ERROR FLAG 434 JMP ST105X CHECK CMA INHIBIT 440 JMP NXMTSM TEST NON-EXISTENT MEMORY ERROR 444 JMP STA106 TEST THAT THE DISK WILL NOT TRAP AT PRIORITY 7 450 JMP STA110 TEST THAT THE DISK WILL NOT TRAP AT PRIORITY 6 454 JMP STA112 TEST THAT THE DISK WILL NOT TRAP AT PRIORITY 5 460 JMP STA114 TEST THAT THE DISK WILL TRAP AT PRIORITY 4 464 JMP ADT1 ADDRESS TEST 1 e DCS REG TST WORK ;IS ERROR FLAG SET BPL STAI25 ;NO! X-FER OK MOV #202,WORK1 ;WHAT DCS SHOULD CONTAIN EROR3: ERROR \N JSR %5,STAER1 ;REPORT ERROR JMP STAI22 ;RESTART TEST STAI25: MOV @DAE,WORK ;IS EXT. ADDRESS CLEAR BEQ STAI26 ;DAE OK EROR4: ERROR \N JSR %5,STAER ;REPORT ERROR JMP STAI22 ;RESTART TEST STAI26: MOV @DAR,WORK ;WAS DAR INCREMENTED BY 1 CMP #BIT0,WORK ;IS DAR CORRECT BEQ STAI27 ;DAR OK MOV #BIT0,WORK1 ;WHAT DAR SHOULD CONTAIN EROR5: ERROR \N JSR %5,STAER1 ;REf TSTB @DCS ;IS THE CONTROL READY BPL .-4 ;YES THE CONTROL IS READY TST @DCS ;IS THERE AN ERROR BPL ADRCMP ;NO ERROR MOV #7,ERCOUNT ;SET UP ERROR COUNT MOV @DCS,WORK ;FETCH CONTROL REG. ER7: JSR %5,STAER ;REPORT CONTROL ERROR ;****WRD1=DISK CONTROL STATUS REG. AT THE TIME OF THE ERROR **** BR RDTDN ;RE-READ ADRCMP: MOV #OUTBUF,SAVE CMPNEX: CMP @SAVE,WORK1 ;IS THE ADDRESS CORRECT BEQ INCCMP ;COMPARE NEXT WORD MOV @SAVE,WORK ;FETCH LOAD ADDRESS MOV #10,ERCOUNT ;SET UP ERROR CgWRDCMP ;COMPARE NEXT WORD ADAM: RTS %5 ;EXIT THIS ROUTINE ; WDERR: BIS #BIT9,FLAG ;SET ERROR BIT MOV DMA,WORK ;FETCH STARTING DISK ADDR MOV TRACK,WORK1 ; ADD WORK2,WORK ;CALCULATE FAILING ADDR BCC .+6 ;SHOULD DAE BE INCREMENTED INC WORK1 JSR %5,CONV ;CONVERT WORD ADDR TO ASCII WORK MES1 6 JSR %5,CONV ;CONVERT TRACK ADDR TO ASCII WORK1 MES1A 2 MOV @SAVE,WORK ;FETCH GOOD DATA JSR %5,CONV ;CONVERT GOOD DATA TO ASCII WORK MES5 6 MOV @SAV1,WORK ;FETCH BAD DATA Jh CHECK TIMING BY EXECUTING A ONE WORD WRITE 470 JMP ADT2X ADDRESS TEST 2 CHECK TIMING BY EXECUTING A ONE WORD READ ***ROUTINES IN DATA TEST ONLY*** 600 JMP ADT2 CHECK THAT WHEN A WORD IS WRITTEN IT DOES NOT ALTER ADJACENT WORDS 604 JMP ADT3 WRITE EACH WORD ADDR ON ITSELF AND READ BACK TO COMPARE 610 JMP ADT4 TRACK SELECTION TEST 614 JMP ADT5 LOOK AHEAD TEST 620 JMP SPIRAL SPIRAL TEST 624 JMP XSPIRAL SPIRAL TEST EXTENSION iPORT ERROR JMP STAI22 ;RESTART TEST STAI27: MOV @WC,WORK ;FETCH WORD COUNT BEQ STAI30 ;WORD COUNT DID OVERFLOW EROR6: ERROR \N JSR %5,STAER ;WORD COUNT FAILED TO OVERFLOW JMP STAI22 ;RESTART TEST STAI30: MOV @CMA,WORK ;FETCH CURRENT ADDRESS MOV #OUTBUF+2,WORK1 ;WHAT CMA SHOULD EQUAL CMP WORK1,WORK ;IS CMA CORRECT BEQ STAI31 ;YES EXECUTE CONTINUE EROR7: ERROR \N JSR %5,STAER1 ;REPORT ERROR IN CMA JMP STAI22 ;ERROR RESTART TEST ;TAPE 2 ; TEST WRITE ;A WRITE CONTINUE WILL BEjOUNT ER10: JSR %5,STAER1 ;REPORT COMPARISON ERROR ;****WRD1=DISK ADDR. WANTED **** ;****WRD2=DISK ADDR. RECEIVED **** INCCMP: ADD #2,SAVE INC WORK1 CMP #OUTBUF+4000,SAVE ;IS IT THE LAST ADDR INBUF BNE CMPNEX ;COMPARE NEXT WORD CMP #4000,WORK1 ;IS IT THE LAST ADDR. OF TRACK BEQ LPADT3 ADD #2000,DMA ;SET UP FOR NEXT BUFFER BR RDTDN ;GO READ BUFFER LPADT3: BIT #BIT11,@SR ;LOOP ON TEST? BNE ADT3 ;YES BIT 11 SET IN SR ; ; ; ; ; ;RF11 TRACK SELECTION TEST ; ;WRITE THE FIRST AND LkSR %5,CONV ;CONVERT TO ASCII WORK MES6 6 EMT +0 ;PRINT MESSAGE HED1 MES1A MES1 MES5 MES6 -1 BR WRDINC ;GO COMPARE NEXT WORD ; ; ; ; ; ; ; ;BACKGROUND TEST FOR INTERRUPTS ; XWAIT: MOV #RTIX,14 ;SET UP TRACE TRAP CLR 16 CLR PASS ;SET UP TIME BASE BIS #BIT4,@CSR ;SET TRACE BIT CLR #0 XINCW: INC XINCW-2 TSTB XINCW-2 BPL XINCW INC PASS BEQ .+4 BR XINCW-4 ;REPORT BACKGROUND TEST TIMED OUT BIC #BIT4,@CSR ;CLEAR TRACE BIT EMT+1 TIMO HALT RTIX: RTI l 630 JMP RANEX RANDOM ADDRESS, DATA AND WORD COUNT TEST 634 JMP EXTMEN DISK EXT. MEMORY EXERCISER 640 JMP PFT1 DISK WRITE POWER FAIL TEST 644 JMP PFT2 DISK WRITE CHECK POWER FAIL TEST ***MAINTENANCE ROUTINES*** ROUTINES IN STATIC AND DATA TEST BOTH 650 JMP SELWC LOAD WORD COUNT REG. WITH SWITCH REGISTER 654 JMP SELCMA LOAD CURRENT MEMORY ADDR REG. WITH SWITCH REGISTER 660 JMP SELDAR LOAD DISK ADDR. REGISTER WITH SWITCH REGISTER 664 JMP SELDAm EXECUTED NOW ;WORD COUNT WILL BE SET TO -1 AGAIN ; ;EROR10=BUSY NOT SET BY GO ;EROR11=BUSY NOT CLEARED BY OVERFLOW ;EROR12=DISK ERROR OCCURED WHILE X-FERING ;EROR13=DAE INCREMENTED WHEN CONTINUE WAS EXECUTED ;EROR14=DAR DID NOT EQUAL 2 AFTER SECOND X-FER ;EROR15=WC DID NOT OVERFLOW AT THE END OF X-FER ;EROR16=CMA DID NOT EQUAL OUTBUF+2 AT END OF X-FER ; ; STAI31: MOV #177777,@WC ;SET WC TO -1 BIS #BIT0,@DCS ;SET GO TO CONTINUE TSTB @DCS ;TEST FOR RDY SET BPL STAI32 ;BUSY WAS SET BY GOnAST ADDRESS OF EACH TRACK ;WITH THE OCTAL VALUE OF EACH TRACK ;BITS 0 THRU 6 EQUAL THE TRACK NUMBER ;BIT 15 RESET EQUALS ADDR 0 OF THE TRACK ;BIT 15 SET EQUALS ADDR 3777 OF THE TRACK ; ;AFTER WRITING THE DISK READ EACH ADDRESS ;AND COMPARE DATA FOR THE CORRECT VALUE ; ADT4: CLR DMA ;CLEAR WORK REGISTERS CLR TRACK CLR OUTBUF MOV #1000,%6 ;SETUP STACK BIS #BIT8,@DCS ;CLEAR THE DISK WORLD MOV #OUTBUF,BUF ;SET CURRENT ADDRESS MOV #1,WRDCT ;SET UP WORD COUNT INSWT: WRITE ;GO WRITE TSo ; ; ;TEST FOR CONTROL "C" ;UPON RECEIPT OF CNTLC SET FLAG BIT ; CNTLC: MOV @TKB,WORK ;FETCH KEYBOARD BUFFER BIC #BIT7,WORK ;MASK FOR 33 CMP #3,WORK ;TEST FOR CNTLC BNE .+10 ;NOT CNTLC EXIT BIS #BIT15,FLAG ;SET FLAG BIT RTI ;EXIT ROUTINE ; ; ;ROUTINE TO DECODE EMT CALLS ;EMT+1=TYPE ONE LINE OF TEXT ;EMT+0=TYPE A SERIED OF LINES EMTRP: MOV (6),%0 CMP #EMT+1,-(0) ;WAS THE CALL EMT+1 BNE TYPS ;NO! TYPE A SERIES BR TYP ;TYPE ONE LINE ;SUBROUTINE TO OUTPUT ASCII MESSAGE ON TpE LOAD DISK ADDR. EXT. WITH SWITCH REGISTER 670 JMP SELDBR LOAD DATA BUFFER REGISTER WITH SWITCH REGISTER 674 JMP MOVLK MOVE CONTENTS OF LOOK AHEAD REGISTER INTO DATA LIGHTS 700 JMP SELDCS LOAD DISK CONTROL REGISTER WITH SWITCH REGISTER 704 JMP STAMP ENABLE READ AMPLIFIERS TO TRACK SELECTED 5. OPERATING PROCEDURE 5.1 CONTROL SWITCH SETTINGS PROGRAM CONVERSATION * SR15 SET ENTER PROGRAM CONVERSATION MODE REF. SEC. 5.2 RESET OPERATE Wq MOV @DCS,WORK ;FETCH CONTENTS OF DCS EROR10: ERROR \N JSR %5,STAER ;REPORT BUSY NOT SET JMP STAI22 STAI32: CLR WORK INCBUSY:TSTB @DCS ;TST FOR RDY SET BY OVERFLO BMI STAI33 ;READY SET CONTINUE INC WORK ;WAIT FOR RDY=1 BNE INCBUSY ;GO WAIT FOR RDY MOV @DCS,WORK ;FETCH CONTENTS OF DCS EROR11: ERROR \N JSR %5,STAER ;REPORT BUSY NOT CLEARED JMP STAI22 ;RESTART ROUTINE STAI33: TST @DCS ;DID AN ERROR OCCUR WHILE X-FERING BPL STAI34 ;NO CONTINUE MOV @DCS,WORK ;YES! CONTENTS OF rTB @DCS ;IS READY SET BPL .-4 ;YES! WAIT FOR NOT BUSY TST @DCS ;TEST FOR ERROR BPL TSTTK ;NO ERROR GO ON MOV #11,ERCOUNT ;SET UP ERROR COUNT MOV @DCS,WORK ;REPORT CONTENTS OF DCS REG ER11: JSR %5,STAER ;REPORT ERROR OCCURRED ;****WRD1=DISK CONTROL STATUS REG. AT THE TIME OF THE ERROR **** BR INSWT ;GO RE-WRITE TSTTK: CMP #100177,OUTBUF ;TEST FOR LAST ADDR. BEQ INSRD ;GO READ THE DATA BIT #BIT15,OUTBUF ;IS IT ADDR ZERO BNE MVNEM ;NO BIS #BIT15,OUTBUF ;YES! SET UP FOR LAST ADDRsELETYPE PRINTER. TYP: MOV @%6,%0 ;GET ADDRESS THAT CONTAINS MESSAGE ADDRESS ADD #2,@%6 ;SET UP EXIT. MOV @%0,%0 ;ADDRESS OF MESSAGE TO R0. TYPA: MOVB (0)+,TYPDAT ;GET CHARACTER CMPB #100,TYPDAT ;CHECK FOR "@" CHARACTER BNE TYPC ;CRANCH IF NOT "@". RTI ;TERMINATOR CHAR. DONE. EXIT. TYPC: CMPB #45,TYPDAT ;CHECK FOR "%". BEQ TYPF ;BRANCH IF "%". CMPB #42,TYPDAT ;NOT "%". CHECK FOR "#". BEQ TYPG ;BRANCH IF "#" JSR %7,TYPD ;TYPE CHAR IN TYPDAT BR TYPA TYPD: MOVB TYPDAT,@TPB ;OUtORSE CASE DISK ZERO DELETE TYPEOUT SR14 SET DELETE TYPEOUTS RESET REPORT MESSAGE HALT ON COMPLETION FLAG * SR13 SET HALT ON FLAG (READY) RESET EXECUTE NEXT OPERATION DELETE COMPARISIONS * SR12 SET DELETE DATA COMPARISONS RESET COMPARE DATA BUFFERS LOOP ON TEST SR11 SET LOOP ON TEST RESET CONTINUE TO NEXT TEST HALT ON ERROR SR10 SET HALT AFTER ERROR REPORT RESET CONTINUE AFTER ERROR REPORT ENTER INTERRUPT BACKGROUND TEST * uDCS MOV @DAE,WORK1 ;EXT ERROR BITS EROR12: ERROR \N JSR %5,STAER1 ;REPORT ERROR OCCURRED. JMP STAI22 ;RESTART ROUTINE STAI34: TST @DAE ;DID DAE INC. BY DATA WAS X-FERRED BEQ STAI35 ;OK IT DID NOT INC MOV @DAE,WORK ;ERROR IT INCREMENTED EROR13: ERROR \N JSR %5,STAER ;REPORT DAE INCREMENTED JMP STAI22 STAI35: MOV @DAR,WORK ;DID DAR INCREMENT ON CONTINUE MOV #2,WORK1 ;WHAT DAR SHOULD CONTAIN CMP WORK1,WORK ;IS DAR CORRECT BEQ STAI36 ;DAR OK EROR14: ERROR \N JSR %5,STAER1 ;REPORv ADD #3777,DMA ;SET UP FOR LAST ADDR BR INSWT ;GO WRITE MVNEM: BIC #BIT15,OUTBUF ;SET UP FOR ADDR ZERO INC OUTBUF ;INC. TO NEXT TRACK ADD #1,DMA ;INC. BAR BCC INSWT ;GO WRITE NO CARRY TO DAE INC TRACK ;INC. DAE REG. BR INSWT ;GO WRITE ; ;READ THE FIRST AND LAST ADDRESS OF EACH TRACK ;AND VERIFY IT HAS THE CORRECT DATA INSRD: CLR DMA ;CLEAR WORK REG. CLR TRACK CLR SAVE BIS #BIT8,@DCS ;CLEAR THE DISK WORLD MOV #INBUF,BUF ;SET UP CURRENT ADDR MOV #1,WRDCT ;SET UP WORD wTPUT CHARACTER TO PRINTER TSTB @TPS ;WAIT FOR DONE FLAG. BPL .-4 TYEXIT: RTS %7 ;EXIT TYPF: MOVB #15,TYPDAT ;MOVE CARRIAGE RETURN CODE TO TYPDAT JSR %7,TYPD ;GO TYPE CHAR. TYPG: MOVB #12,TYPDAT ;MOVE LF CODE TO TYPDAT. JSR %7,TYPD ;GO TYPE CHAR. BR TYPA TYPDAT: 0 ;SUBROUTINE TO OUTPUT A SERIES OF ASCII MESSAGES ON TELETYPE PRINTER TYPS: MOV @%6,%0 ;GET ADDRESS THAT CONTAINS MESSAGE ADDRESS ADD #2,@%6 ;UPDATE TO NEXT MESSAGE ADDRESS MOV @%0,TYPSB ;ADDRESS OF MESSAGE TO TYPSB CMPx SR9 SET WAIT FOR INTERRUPTS USING WAIT INSTRUCTION RESET WAIT FOR INTERRUPTS WITH BACKGROUND TEST LOOP ON DISK ADDRESS * SR8 SET LOOP ON DISK ADDRESS (SPECIFIED BY WORD COUNT AND DAR) RESET CONTINUE TO NEXT DISK BUFFER AREA. SELECT TRACK FROM SR (DURING DYNAMIC TESTING) SR7 SET SELECT TRACK FROM SR RESET SELECT TRACK UNDER PROGRAM CONTROL TRACK SELECTION 6 5 4 3 2 1 0 SELECT ONE OF 177(8) TRACKS NOTE: * SWITCH SETTING APPLICABLE ONLY IN yT DAR INCORRECT JMP STAI22 ;RE-START ROUTINE STAI36: MOV @WC,WORK ;FETCH WORD COUNT BEQ STAI37 ;WORD COUNT OVERFLOWED EROR15: ERROR \N JSR %5,STAER ;REPORT WORD COUNT FAILED TO CLEAR JMP STAI22 ;RESTART ROUTINE STAI37: MOV @CMA,WORK ;FETCH CMA MOV #OUTBUF+4,WORK1 ;WHAT CMA SHOULD EQUAL CMP WORK1,WORK ;IS CMA CORRECT BEQ LPST22 ;CMA WAS CORRECT EROR16: ERROR \N JSR %5,STAER1 ;REPORT CMA INCORRECT JMP STAI22 ;RESTART ROUTINE LPST22: SCOPE ;ENTER SCOPE LOOP STAI22 ; TEST zCOUNT RDTKS: READ ;READ DATA TSTB @DCS ;CHECK FOR READY BPL .-4 ;CONTROL NOT READY TST @DCS ;IS THERE AN ERROR BPL CMPDTK ;NO ERROR MOV #12,ERCOUNT ;SET UP ERROR COUNT MOV @DCS,WORK ;FETCH CONTENTS OF DCS ER12: JSR %5,STAER ;REPORT CONTROL ERROR ;****WRD1=DISK CONTROL STATUS REG. AT THE TIME OF THE ERROR **** BR RDTKS ;GO RE-READ CMPDTK: CMP SAVE,INBUF ;IS DATA CORRECT BEQ CMNETK ;YES SETUP FOR NEXT WORD MOV SAVE,WORK1 ;CORRECT ADDRESS MOV INBUF,WORK ;INCORRECT DATA MOV { #-1,TYPSB ;CHECK FOR TERMINATOR BNE TYPSA ;BRANCH IF NOT TERMINATOR. RTI ;TERMINATOR. EXIT TYPSA: EMT +1 ;CALL ON TYP SUB TO TYPE MESSAGE TYPSB: 0 ;ADDRESS OF MESSAGE GOES HERE BR TYPS ;GO PROCESS NEXT MESSAGE ; ; ; ; ;OCTAL TO ASCII CONVERT ROUTINE ; ;ENTER ROUTINE AS FOLLOWS ;JSR%5,CONV ;ADDR#=ADDRESS OF NUMBER TO BE CONVERTED ;ADDR BYTE=LSB OF WHERE ASCII IS GOING ;ASCII#=THE NUMBER OF ASCII CHAR. TO BE CONVERTED ; ; CONV: MOV @(5)+,ACNVX ;VALUE OF # TO BE CONVERTED MO|DATA TEST 5.2 CONVERSATION MODE FOR PROGRAM PARAMETERS FOR DATA TEST ONLY IN THE PROGRAM CONVERSATION MODE THE OPERATOR CAN SPECIFY ANY ONE OR ALL OF THE PROGRAM PARAMETERS. PROGRAM CONVERSATION DATA TEST ONLY? IF THE OPERATOR ANSWER YES THE PROGRAM WILL ENTER ONLY THE DATA PORTION OF TEST. MULTL DK MODE? MULTI DISK MODE IS A MODE IN THE PROGRAM WHICH ALLOWS THE OPERATOR TO EXECISE, ALL THE DISKS ON THE SYSTEM WITHOUT RE-STARTING THE PROGRAM. THE PROGRAM AFTER EX}WRITE CHECK ;DO A ONE WORD WRITE CHECK FOLLOWED BY ;A ONE WORD WRITE CHECK CONTINUE ; ;EROR17=BUSY FAILED TO SET ;EROR20=BUSY FAILED TO CLEAR ;EROR21=DISK ERROR WHEN X-FERING DATA ;EROR22=DAE INCREMENTED WHEN X-FERING DATA ;EROR23=DAR FAILED TO INCREMENT WHEN X-FERING DATA ;EROR24=WORD COUNT FAILED TO OVERFLOW ;EROR25=CMA FAILED TO INCREMENT ; ; ;* * *EXECUTE THE ONE WORD WRITE CHECK* * * STAI40: BIS #BIT8,@DCS ;CLEAR THE DISK WORLD MOV #177777,OUTBUF ;DATA TO BE X-FERED MOV #OUTBUF,@CMA~#13,ERCOUNT ;SET UP ERROR COUNT ER13: JSR %5,STAER1 ;REPORT SELECTION ERROR ;****WRD1=TRACK ADDR. WANTED **** ;****WRD2=TRACK ADDR. RECEIVED **** CMNETK: CMP #100177,SAVE ;IS IT THE LAST ADDR BEQ LPTSK ;END OF TEST BIT #BIT15,SAVE ;IS IT ADDR 0 OF THE TRACK BEQ ZRBIT ;NO! SETUP FOR LAST ADDR BIC #BIT15,SAVE ;SET UP FOR ADDR ZERO INC SAVE ;INC FOR TRACK NO. ADD #1,DMA ;SET UP DAR BCC RDTKS ;GO READ NEXT TRACK ADDR INC TRACK ;INC TRACK BR RDTKS ;GO READ ZRBIT: BIS #BIT15,SAVE ;V (5)+,%1 ;ASCII ADDR MOV (5)+,%2 ;# OF ASCII CHAR ADD %2,%1 ACVN: MOV ACNVX,%3 BIC #177770,%3 ;ISOLATE LEAST SIGNIFICANT OCTAL# ADD #60,%3 ;SET UP ASCII# MOVB %3,-(1) ;STORE ASCII CHAR BIC #7,ACNVX ROR ACNVX ;ROTATE OCTAL# ROR ACNVX ROR ACNVX DEC %2 ;-1 FROM ASCII CHAR COUNT BNE ACVN RTS %5 ;EXIT # CONVERTED ACNVX: 0 ;WORK REGISTER ; ; ; ; ; ; ; ; ; ;ERROR MESSAGE HEADERS ; .EVEN HED1: .ASCII /%DATA ERROR @/ ; ; HED2: .ASCII /%STATUS ERROR @/ ; ; H€ERCISING ONE DISK WILL REPORT A MESSAGE TELLING THE OPERATOR WHICH DISK WILL BE SELECTED NEXT, AND THEN THE PROGRAM WILL EXERCISE THAT DISK. WHEN A COMPLETE PASS IS ACCOMPLISHED, A PASS COMPLETE WILL BE REPORTED AND THE TEST WILL RECYCLE. IF THE OPERATOR ANSWERS "YES" TO THIS QUESTION, HE WILL THEN BE ASKED HOW MANY DISKS ARE ON THE SYSTEM, AND THEN THE PRECEDING QUESTION WILL BE SKIPPED. IF THE OPERATOR ANSWERS "NO" TO THIS QUESTION, THE NEXT QUESTION WILL BE SKIPPED, AND HE WILL TH ;SET UP CURRENT ADDRESS MOV #-1,@WC ;SET WORD COUNT TO -1 BIS #7,@DCS ;GO WRITE CHECK TSTB @DCS ;TEST FOR READY BPL STAI41 ;NOT READY MOV @DCS,WORK ;SET! FETCH DCS EROR17: ERROR \N JSR %5,STAER ;REPORT ERROR BR STAI40 ;RESTART TEST STAI41: CLR WORK WCWAT: INC WORK ;WAIT FOR READY TSTB @DCS BMI STAI42 ;FLAG SET TST WORK ;HAVE WE WAITED LONG ENOUGH BNE WCWAT ;READY FAILED TO SET MOV @DCS,WORK ;FETCH CONTENTS OF DCS REG BIS #6,WORK1 ;WANT DCS SHOULD CONTAIN EROR20: ERR‚SET UP FOR LAST ADDR ADD #3777,DMA ;SET UP FOR LAST WORD BR RDTKS ;GO READ LAST ADDR OF TK LPTSK: BIT #BIT11,@SR ;IS BIT 11 SET IN SR BEQ .+6 ;YES LOOP ON TEST JMP ADT4 ; ;RF11 LOOK AHEAD TEST ;WRITE ONE WORD UPON RECEIPT OF ;NOT READY READ THE LOOK AHEAD ;REGISTER IT SHOULD CONTAIN THE ;ADDRESS +1 ; ADT5: CLR DMA ;CLEAR REGISTERS CLR TRACK CLR SAVE MOV #1000,%6 ;SETUP STACK MOV #1,WRDCT ;SET UP FOR ONE WORD X-FER MOV #OUTBUF,BUF ;SET UP CURRENT ADDRESS WRADT5: BIS #BIT8,@ƒED3: .ASCII /%OVERFLO X-FER ERROR @/ ; HED4: .ASCII /%DISK ADDRESS ERROR @/ ; ; HED5A: .ASCII /%@/ ; ; ; ; ; ;MESSAGE TRAILERS ; ; MES1: .ASCII / DAR @/ ; ; ; MES1A: .ASCII / DAE @/ ; ; ; MES2: .ASCII / DCS @/ ; MES2A: .ASCII / HARD ERROR@/ ; ; MES3: .ASCII / WORD COUNT@/ ; ; ; MES4: .ASCII / WORD ADR.@/ ; ; ; MES5: .ASCII / GOOD DATA @/ ; ; ; MES6: .ASCII / BAD DATA @/ ; ; MES11: .ASCII / EXISTENT DISK(S).@/ ; ; MES12: „EN BE ASKED WHICH DISK IS TO BE EXERCISED. # OF DKS 1 TO 10 OCTAL? X TYPE THE NUMBER OF DISKS ON THE SYSTEM, FOR MULTI DISK MODE. EX. DK? X WHEN NOT IN THE MULTI DISK MODE THE OPERATOR WILL HAVE TO SPECIFY WHAT DISK IS TO BE USED. OPT. WRD CNT? IF THE OPERATOR ANSWERS "NO" TO THIS QUESTION THE NEXT TWO QUESTIONS WILL BE DELETED FROM THE CONVERSATION. LENGTH (1 TO 1000)? XXX THE OPERATOR CAN SPECIFY ANY LENGTH TRANSFER FROM 1(8) TO 1000(8) WORDS. THE NORMAL TRAN…OR \N JSR %5,STAER1 ;REPORT ERROR BR STAI40 ;RESTART TEST STAI42: MOV @DCS,WORK ;FETCH CONTENTS OF DCS REG BPL STAI43 ;NO! X-FER OK CMP WORK,#120006 ;DID WCE OCCUR BNE .+6 ; MOV #120000,WORK1 ;YES WCE OCCURRED BIS #6,WORK1 ;WHAT DCS SHOULD CONTAIN EROR21: ERROR \N JSR %5,STAER1 ;REPORT ERROR JMP STAI40 ;RESTART TEST STAI43: MOV @DAE,WORK ;IS EXT. ADDRESS CLEAR BEQ STAI44 ;DAE OK EROR22: ERROR \N JSR %5,STAER ;REPORT ERROR JMP STAI40 ;RESTART TEST STAI44: MOV @DAR,WORK ;W†DCS ;CLEAR THE DISK WRITE ;WRITE MOV @ADS,WORK ;FETCH LOOK AHEAD TSTB @DCS ;IS THE CONTROL BUSY BPL .-12 ;CONTROL STILL BUSY TST @DCS ;IS THERE AN ERROR BPL LPADT5 ;NO DISK ERRORS MOV #14,ERCOUNT ;SET UP ERROR COUNT MOV @DCS,WORK ;FETCH DCS FOR REPORT ER14: JSR %5,STAER ;REPROT CONTROL ERROR ;****WRD1=DISK CONTROL REG AT THE TIME OF THE ERROR **** BR WRADT5 ;LOOP ON ERROR LPADT5: MOV DMA,WORK1 ;IS LOOK AHEAD CORRECT CMP WORK1,WORK BEQ INCADS ;LOOK AHEAD OK DEC WORK ;COM.ASCII / @/ ; ; TIMO: .ASCII /%PROCESSOR BACKGROUND TIMED OUT@/ ; ; END: .ASCII /%END@/ .EVEN BUFFER: 0 .END ˆSFER LENGTH IS 1000(8) WORDS UNDER PROGRAM CONTROL. WRD ADDR? XXXX THE OPERATOR MUST NOW SPECIFY THE STARTING WORD ADDRESS-THIS BEING ONE OF 2048(10). ADDRESS ENTRY MUST BE MADE IN OCTAL (0 TO 3777(8)). (5.2 CONT'D) OPT. DATA PAT. #? IF NO OPTIONAL DATA PATTERN IS REQUESTED THE PROGRAM WILL EXECUTE THE FOLLOWING LIST OF DATA PATTERNS. PATTERN 0 = 000000 " 1 = 177777 " 2 = 134510 " 3 = 043267 " 4 = 100000 " 5 = 107070 " ‰AS DAR INCREMENTED BY 1 CMP #BIT0,WORK ;IS DAR CORRECT BEQ STAI45 ;DAR OK MOV #BIT0,WORK1 ;WHAT DAR SHOULD CONTAIN EROR23: ERROR \N JSR %5,STAER1 ;REPORT ERROR JMP STAI40 ;RESTART TEST STAI45: MOV @WC,WORK ;FETCH WORD COUNT BEQ STAI46 ;WORD COUNT DID OVERFLOW EROR24: ERROR \N JSR %5,STAER ;WORD COUNT FAILED TO OVERFLOW JMP STAI40 ;RESTART TEST STAI46: MOV @CMA,WORK ;FETCH CURRENT ADDRESS MOV #OUTBUF+2,WORK1 ;WHAT CMA SHOULD EQUAL CMP WORK1,WORK ;IS CMA CORRECT BEQ STAI47 ;YEŠPARE FOR ADDRESS+1 CMP WORK1,WORK ; BEQ INCADS ;BRANCH IF EQUAL INC WORK MOV #15,ERCOUNT ER15: JSR %5,STAER1 ;REPORT LOOK AHEAD INCORRECT ;****WRD1=DISK ADDR. WANTED FROM LOOK AHEAD REG. **** ;****WRD2=DISK ADDR. RECEIVED FROM DISK LOOK AHEAD REG. **** BR WRADT5 ;LOOP ON ERROR INCADS: CMP #3777,DMA ;IS IT THE LAST ADDR. BEQ XLPADT5 ;LAST ADDRESS EXIT INC DMA ;+1 DMA BR WRADT5 ;CHECK NEXT ADDRESS XLPADT5:BIT #BIT11,@SR ;LOOP ON TEST BNE ADT5 ;YES LOOP ON TEST BIT 11 SET ; SPI‹ .ENABLE ABS BIT0=1 BIT1=2 BIT2=4 BIT3=10 BIT4=20 BIT5=40 BIT6=100 BIT7=200 BIT8=400 BIT9=1000 BIT10=2000 BIT11=4000 BIT12=10000 BIT13=20000 BIT14=40000 BIT15=100000 ; ; ; WRITE=TRAP+3 WRCHECK=TRAP+7 READ=TRAP+5 .=0 .REPT 100 .+2 HALT .ENDR .=20 XWAIT ;BACKGROUND TEST VECTOR 0 .=30 EMTRP ;TTY VECTOR 340 DISK ;DISK CALLING VECTOR 340 .=200 JMP START DKINT ;DISK INTERRUPT VECTOR 200 ;DISK PRIORITY ;STATIC ROUTINES .=300 .=600 JMP ADT2 ;CHECKŒ 6 = 070707 " 7 = 052525 " 10 = 125252 " 11 = 177737 " 12 = 004102 " 13 = 136363 " 14 = 063636 " 15 = 000001 " 16 = 100005 " 17 = 000520 " 20 = 030303 " 21 = RANDOM DATA " 22 = RUN ALL DATA PATTERNS UNDER PROGRAM CONTROL IF THE OPERATOR DECIDES TO OPERATE UNDER PROGRAM CONTROL, THE NEXT QUESTION WILL BE SKIPPED. THE OPERATOR BY REQUESTING AN OPTIONAL DATA PATTERN HAS THE ABILITY OF SELECTING ANY ONE OF THE 21(8) DATA PATTERNS. DATA PS EXECUTE CONTINUE EROR25: ERROR \N JSR %5,STAER1 ;REPORT ERROR IN CMA JMP STAI40 ;ERROR RESTART TEST ; ;A WRITE CHECK CONTINUE CONTINUE WILL BE EXECUTED NOW ;WORD COUNT WILL BE SET TO -1 AGAIN ; ;EROR26=BUSY WAS NOT SET BY GO ;EROR27=BUSY NOT CLEARED BY OVERFLOW ;EROR30=DISK ERROR OCCURRED WHILE X-FERING ;EROR31=DAE INCREMENTED WHEN CONTINUE WAS EXECUTED ;EROR32=DAR DID NOT EQUAL 2 AFTER SECOND X-FER ;EROR33=WC DID NOT=0 AFTER X-FER ;EROR34=CMA DID NOT=OUTBUF+2 AT END OF X-FER ; ; SŽRAL TESTS ; ;WRITE THE LAST WORD OF TRACK ZERO ;AND THE FIRST WORD OF TRACK ONE ;USING ONE WORD X-FERS ;DATE = 52525 SPIRAL: BIS #BIT8,@DCS ;CLEAR THE DISK MOV #340,@CSR ;LOCK UP PROCESSING MOV #1000,%6 ;SETUP STACK MOV #1,WRDCT ;SET WORD COUNT TO 1 CLR TRACK MOV #3777,DMA ;LAST WORD OF TRACK ZERO MOV #52525,OUTBUF ;SET UP DATA MOV #OUTBUF,BUF WRITE ;WRITE LAST ADDR TK ZERO TSTB @DCS ;TEST FOR READY BPL .-4 ;CONTROL STILL BUSY TST @DCS BPL SPIL1 MOV #16,ERCOUNT MOV @D THAT WHEN A ;WORD IS WRITTEN IT ;DOES NOT ALTER ADJACENT ;WORDS ; ; JMP ADT3 ;WRITE EACH WORD ADDR ON ITSELF AND ;READ BACK TO COMPARE ; ; JMP ADT4 ;TRACK SELECTION TEST ; ; JMP ADT5 ;LOOK AHEAD TEST ; ; JMP SPIRAL ;SPIRAL TEST ; ; JMP XSPIRAL ;SPIRAL TEST EXTENSION ; ; JMP RANEX ;RANDOM ADDRESS, DATA AND ;WORD COUNT TEST ; ; JMP EXTMEN ;WRITE/WRITE CHECK DISK WITH ;EXTENDED MEMORY ATTERN NO. XX DISK PROGRAM FUNCTION PARAMETERS IN THIS SECTION OF THE PROGRAM PARAMETER CONVERSATION MODE, THE OPERATOR CAN SELECT ANYONE OR ALL THREE OF THE CONTROL FUNCTIONS TO BE EXECUTED. THE NORMAL SEQUENCE OF DISK FUNCTIONS UNDER PROGRAM CONTROL IS WRITE, WRITE CHECK, AND THEN READ. BY ENTERING THE CONVERSATION MODE THE OPERATOR HAS GAINED COMPLETE CONTROL OVER THE DISK FUNCTIONS. HE MUST SPECIFY YES OR NO TO ALL OF THE FOLLOWING QUESTIONS. WRITE? (YES - NO) WRITE ‘TAI47: MOV #177777,@WC ;SET WC TO -1 BIS #BIT0,@DCS ;SET GO TO CONTINUE TSTB @DCS ;TEST FOR READY BPL STAI50 ; MOV @DCS,WORK ;FETCH CONTENTS OF DCS EROR26: ERROR \N JSR %5,STAER ;REPORT BUSY NOT SET JMP STAI40 STAI50: CLR WORK WCBUSI: TSTB @DCS ;TST FOR RDY SET BY OVERFLOW BMI STAI51 ;BRANCH IF READY SET INC WORK ;WAIT FOR BUSY=0 BNE WCBUSI ;GO WAIT FOR RDY MOV @DCS,WORK ;FETCH CONTENTS OF DCS EROR27: ERROR \N JSR %5,STAER ;REPORT RDY NOT SET JMP STAI40 ;RESTART ROUTINE ’CS,WORK ER16: JSR %5,STAER ;****WRD1=DISK CONTROL STATUS REG. AT THE TIME OF THE ERROR **** BR SPIRAL SPIL1: INC DMA WRITE ;WRITE FIRST ADDR. TK 1 TSTB @DCS ;WAIT FOR READY BPL .-4 ;CONTROL STILL BUSY TST @DCS BPL SPIL2 MOV #17,ERCOUNT MOV @DCS,WORK ER17: JSR %5,STAER ;****WRD1=DISK CONTROL STATUS REG. AT THE TIME OF THE ERROR **** BR SPIRAL SPIL2: INC WRDCT ;SET UP FOR TWO WORD X-FER MOV #3777,DMA ;START AT ADDR 3777 MOV #INBUF,BUF ; READ ;READ DATA TSTB @DCS ;TEST“ ; ; JMP PFT1 ;DISK WRITE POWER FAIL TEST ; ; JMP PFT2 ;DISK WRITE CHECK POWER FAIL TEST ; ; ;***MAINTENANCE ROUTINES*** ; ; JMP SELWC ;LOAD WORD COUNT REG. ;WITH SWITCH REGISTER ; ; JMP SELCMA ;LOAD CURRENT MEMORY ADDR ;REG. WITH SWITCH REGISTER ; ; JMP SELDAR ;LOAD DISK ADDR. REGISTER ;WITH SWITCH REGISTER ; ; JMP SELDAE ;LOAD DISK ADDR. EXT. ;WITH SWITCH REGISTER ; ; JMP SELDBR ;LOAD DATA B”CHECK? (YES - NO) READ? (YES - NO) TO PERFORM A WRITE CHECK ONLY, THE OPERATOR MUST FIRST WRITE SOME KNOWN DATA ON THE DISK. THIS COURSE OF ACTION ALSO PREVAILS FOR A READ ONLY OPERATION. * IF AN ERROR OCCURS IN THE LINE THE OPERATOR IS TYPING, DEPRESS THE RUB-OUT. THIS CAUSES THE QUESTION TO BE RETYPED AND ALLOWS THE OPERATOR TO PROPERLY ANSWER THE QUESTION. * INDICATES TO THE OPERATOR THAT THE CARRIAGE-RETURN SHOULD BE TYPED AT THE INDICATED PLACE TO TERMINATE THE• STAI51: TST @DCS ;DID AN ERROR OCCUR WHILE X-FERING BPL STAI52 ;NO CONTINUE MOV @DCS,WORK ;YES! CONTENTS OF DCS CMP WORK,#120006 BNE .+6 MOV #120000,WORK1 BIS #6,WORK1 ;EXT ERROR BITS EROR30: ERROR \N JSR %5,STAER1 ;REPORT ERROR OCCURRED JMP STAI40 ;RESTART ROUTINE STAI52: TST @DAE ;DID DAE INC. BY DATA WAS X-FERED BEQ STAI53 ;OK IT DID NOT INC MOV @DAE,WORK ;ERROR IT INCREMENTED EROR31: ERROR \N JSR %5,STAER ;REPORT DAE INCREMENTED JMP STAI40 STAI53: MOV @DAR,WORK ;DID D– FOR READY BPL .-4 ;CONTROL STILL BUSY TST @DCS BPL SPIL3 MOV #20,ERCOUNT MOV @DCS,WORK ER20: JSR %5,STAER ;****WRD1=DISK CONTROL STATUS REG. AT THE TIME OF THE ERROR **** BR SPIRAL SPIL3: CMP #52525,INBUF ;CMP ADDR DAR 3777 BEQ CMPX1 ;COMPARE SECOND WORD MOV #21,ERCOUNT ;SETUP ERROR COUNT MOV INBUF,WORK ;INCORRECT DATA MOV #52525,WORK1 ;CORRECT DATA ER21: JSR %5,STAER1 ;REPORT ADDR 377 HAE BAD DATA ;****WRD1=THE DATA THAT SHOULD HAVE BEEN IN ADDR. 3777**** ;****WRD2=THE DATA R—UFFER REGISTER ;WITH SWITCH REGISTER ; ; JMP MOVLK ;MOVE CONTENTS OF LOOK ;AHEAD REGISTER INTO DATA LIGHTS ; ; JMP SELDCS ;LOAD DISK CONTROL REGISTER ;WITH SWITCH REGISTER ; ; JMP STAMP ;ENABLE READ AMPLIFIERS ;TO TRACK SELECTED ;FROM SWITCH REGISTER ; ; ; ; ; ; ; ; ;RF11 DATA TEST ;VECTORS USED IN PROGRAM ;#1 LOC 204 DISK INTERRUPT ;#2 LOC 30 EMT (TELETYPE OUTPUT) ;#3 LOC 34 TRAP (DISK HANDLERS) ;#4 LOC 14 TRACE TRAP (U˜ LINE OF TYPED CHARACTERS. 5.3 SUBROUTINE ABSTRACTS STATIC TEST ABSTRACTS FOR THE LOGIC TESTS IN THE STATIC TEST ARE NOT INCLUDED IN THIS WRITE-UP. EACH SMALL TEST HAS A DESCRIP- TION WITH IT IN THE ASSEMBLY. (5.3 CONT'D) ADDRESS TESTS IN STATIC TEST ONLY ADT1 - TEST WORD ACCESS DURING A WRITE IN THIS TEST A ONE WORD WRITE IS ATTEMPTED ON EACH ADDRESS OF TRACK ZERO. IF NO ACCESS IS ACCOMPLISHED WITHIN 100 MILLI- SECONDS THE ERROR CONDITION MISSED TRANSFER (MXF) SHOU™AR INCREMENT ON CONTINUE MOV #2,WORK1 ;WHAT DAR SHOULD CONTAIN CMP WORK1,WORK ;IS DAR CORRECT BEQ STAI54 ;DAR OK EROR32: ERROR \N JSR %5,STAER1 ;REPORT DAR INCORRECT JMP STAI40 ;RE-START ROUTINE STAI54: MOV @WC,WORK ;FETCH WORD COUNT BEQ STAI55 ;WORD COUNT OVERFLOWED EROR33: ERROR \N JSR %5,STAER ;REPORT WORD COUNT FAILED TO CLEAR JMP STAI40 ;RESTART ROUTINE STAI55: MOV @CMA,WORK ;FETCH CMA MOV #OUTBUF+4,WORK1 ;WHAT CMA CHOULD EQUAL CMP WORK1,WORK ;IS CMA CORRECT BEQ LPST40 šEAD FROM ADDR. 3777**** BR SPIRAL ;LOOP ON ERROR CMPX1: CMP #52525,INBUF+2 ;COMPARE NEXT WORD BEQ LPSPI1 ;BRANCH IF DATA OK MOV #22,ERCOUNT ;SETUP ERROR COUNT MOV #52525,WORK1 ;CORRECT DATA MOV INBUF+2,WORK ;DATA READ FROM ADDR0 TK1 ER22: JSR %5,STAER1 ;REPORT ERROR ;****WRD1=THE DATA THAT SHOULD BE IN ADDR. 0 OF TRACK 1 **** ;****WDR2=THE DATA READ FROMADDR.0 OF TRACK 1 **** BR SPIRAL ;LOOP ON ERROR LPSPI1: BIT #BIT11,@SR ;LOOP ON TEST? BNE SPIRAL ;YES BIT 11 SET IN SR ; ; ; ›SED IN BACKGROUND TEST) ;#5 LOC 20 IOT TRAP (USED IN CALLING BACKGROUND TEST) .=1000 .EVEN ; ;I/O ADDRESS POINTERS SR: 177570 ;SWITCH REGIISTER CSR: 177776 ;PROCESSOR STATUS REGISTER TPB: 177566 ;TELETYPE REGISTERS TKB: 177562 TPS: 177564 TKS: 177560 ; ;DISK I/O REGISTERS ; DCS: 177460 ;DISK CONTROL REGISTER WC: 177462 ;WORD COUNT REGISTER CMA: 177464 ;CURRENT ADDRESS REGISTER DAR: 177466 ;LOWER 16 BITS OF DISK ADDRESS DAE: 177470 ;EXTENSION ADDRESS REGISTER DBR: 1œLD SET. IF THIS FLAG SHOULD FAIL TO SET, A PROGRAM TIME OUT WILL BE REPORTED. IF NO CONTROL ERROR OCCURS AND ADDRESS CONFIRMED TAKES PLACE. THE ROUTINE THEN CHECKS THE ADDRESS POINTER FOR THE CORRECT TERMINATING ADDRESS. ADT2X - TEST WORD ACCESS DURING A READ IN THIS TEST A ONE WORD READ IS ATTEMPTED ON EACH ADDRESS OF TRACK ZERO. IF NO ACCESS IS ACCOMPLISHED WITHIN 100 MILLI- SECONDS THE ERROR CONDITION MISSED TRANSFER (MXF) SHOULD SET. IF THIS FLAG SHOULD FAIL TO SET A PROGRAM T ;CMA WAS CORRECT EROR34: ERROR \N JSR %5,STAER1 ;REPORT CMA INCORRECT JMP STAI40 ;RESTART ROUTINE LPST40: SCOPE ;ENTER SCOPE LOOP STAI40 ; TEST READ ;ONE WORD READ FOLLOWED BY A ONE WORD ;READ CONTINUE. ; ;EROR35=BUSY WAS NOT SET BY GO ;EROR36=BUSY NOT CLEARED BY OVERFLOW ;EROR37=DISK ERROR OCCURRED WHILE X-FERING DATA ;EROR40=DAE INCREMENTED WHEN X-FERING DATA ;EROR41=DAR FAILED TO INCREMENT WHEN X-FERING DATA ;EROR42=WORD COUNT FAILED TO OVERFLOW ;EROR43=CMA FAILED TO INCREMENTž; ; ; ; SPIRAL TEST EXT. ; ;WRITE TWO WORDS OF DATA ;STARTING WITH THE LAST ADDRESS OF TRACK0 ;DATA PATTERN = 25252 ;THEN READ THE DATA DOING ONE WORD ;X-FERS XSPIRAL: BIS #BIT8,@DCS ;CLEAR THE DISK MOV #340,@CSR ;LOCK UP PROCESSING MOV #1000,%6 ;SET UP STACK MOV #25252,OUTBUF ;SET UP DATA WORD 1 MOV #25252,OUTBUF+2 ;SET UP DATA WORD 2 MOV #2,WRDCT ;SET UP WORD COUNT MOV #OUTBUF,BUF ;SET UP CMA CLR TRACK ;SET UP DISK ADDR. MOV #3777,DMA WRITE ;WRITE DATA TSTB @DCS ;TEST FŸ77472 ;DATA BUFFER REGISTER MA: 177474 ;MAINTENANCE REGISTER ADS: 177476 ;LOOK AHEAD REGISTER VECTOR: 204 ;INTERRUPT VECTOR ADDRESS STATUS: 206 ;DISK INTERRUPT STATUS PRIORITY:BIT7 ;DISK PRIORITY LEVEL ; ; ; ; ; ; ;RF11 DEDICATE REGISTERS (MEMORY) ; FLAG: 0 ;INTERNAL PROGRAM FLAG RANNU: 146723 ;RANDOM NUMBER PRIME WRDCT: 0 ;WORKING WORD COUNT TRACK: 0 ;WORKING DAE DMA: 0 ;WORKING DAR PATNU: 0 ;DATA PATTERN INDEX BUF: 0 ;WORKING DATA BUFFER (OUT-IN) TWRDCT:  IME OUT WILL BE REPORTED. IF NO CONTROL ERROR OCCURES AND ADDRESS CONFIRMED TAKES PLACE, THE ROUTINE THEN CHECKS THE ADDRESS POINTER REGISTER FOR THE CORRECT TERMINATING ADDRESS. ADDRESS TEST IN DATA TEST ONLY ADT2 - TEST FOR ALTERATION OF WORD ADDRESS IN THIS ADDRESS TEST, TRACK ZERO IS LOADED WITH ALL ONES IN BLOCK OF 2K. THEN THE TEST STARTING WITH ADDRESS 0 AND PR0- GRESSING UP THROUGH AND INCLUDING ADDRESS 3777(8), THE OCTAL VALUE OF THE ADDRESS, IS WRITTEN ON ITSELF AND ALLЁ ; ; ;* * *EXECUTE THE ONE WORD READ* * * STAI56: BIS #BIT8,@DCS ;CLEAR THE DISK WORLD MOV #177777,OUTBUF ;DATA TO BE X-FERED MOV #OUTBUF,@CMA ;SET UP CURRENT ADDRESS MOV #-1,@WC ;SET WORD COUNT TO -1 BIS #5,@DCS ;GO READ TSTB @DCS ;TEST FOR BUSY=1 BPL STAI57 ;BUSY SET MOV @DCS,WORK ;BUSY NOT SET! FETCH DCS EROR35: ERROR \N JSR %5,STAER ;REPORT ERROR BR STAI56 ;RESTART TEST STAI57: CLR WORK RDWAT: INC WORK ;WAIT FOR BUSY=0 TSTB @DCS ;IS BUSY CLEARED BMI STAI60 ;FLAG CLЂOR READY BPL .-4 ;CONTROL STILL BUSY TST @DCS ;TEST FOR ERROR BPL X1SPIL ;BRANCH IF NO ERROR MOV @DCS,WORK MOV #23,ERCOUNT ;SET UP ERROR COUNT ER23: JSR %5,STAER ;REPORT CONTROL ERROR ;****WRD1=DISK CONTROL STATUS REG. AT THE TIME OF THE ERROR **** BR XSPIRAL X1SPIL: DEC WRDCT ;SET UP FOR 1 WORD X-FER MOV #3777,DMA ;SET UP DAR MOV #INBUF,BUF ;SET UP CMA READ ;READ DAR 3777 TSTB @DCS ;TEST FOR NOT READY BPL .-4 ;CONTROL STILL BUSY TST @DCS ;TEST FOR ERROR BPL X2SPIL ;Ѓ0 ;TEMP WORD COUNT TDMA: 0 ;TEMP DAR SWRDCT: 0 ;STANDARD WORD COUNT ERCOUNT:0 ;ERROR COUNT FOR MESSAGES. SAVE: 0 SAV1: 0 PASS: 0 DSKNOR: 0 HRDER: 0 ;POINTER FOR HARD ERROR PASSC: 0 ; ;RF11 WORK REGISTERS ;(CAN BE CHANGED IN ANY ROUTINE) WORK: 0 WORK1: 0 WORK2: 0 WORK3: 0 START: RESET ;CLEAR THE WORLD MOV #1000,%6 ;SET UP STACK MOV #340,@CSR ;LOCK UP INTERRUPT LEVELS CLR FLAG ;CLEAR PROGRAM FLAG CLR TRACK ;CLEAR TRACK REGISTERS CLR DMA ;CLEAR DAR REGISTERS Є OTHER ADDRESSES ARE CHECKED FOR MODIFICATION. THEY SHOULD EQUAL ALL ONES. AFTER CHECK IS COMPLETED AND ALL ERRORS ARE REPORTED IF ANY, THE ROUTINE THEN RE-WRITES THE ADDRESS WITH ALL ONES AND THEN CONTINUES ON WITH THE NEXT ADDRESS. ADT3 - VERIFY THAT ALL ADDRESSES EXIST ON DISK SURFACE TRACK IN THIS ROUTINE THE OCTAL VALUE OF EACH ADDRESS IS WRITTEN ON ITSELF IN 2K WORD BLOCKS. THE ROUTINE THEN READS THE DISK AND VERIFIES THAT ALL ADDRESSES CAN BE ACCESSED. ERRORS MAY BE REPORTЅEARED TST WORK ;HAVE WE WAITED LONG ENOUGH BNE RDWAT ;BUSY FAILED TO CLEAR MOV @DCS,WORK ;FETCH CONTENTS OF DCS REG BIS #5,WORK1 ;WANT DCS SHOULD CONTAIN EROR36: ERROR \N JSR %5,STAER1 ;REPORT ERROR BR STAI56 ;RESTART TEST STAI60: MOV @DCS,WORK ;FETCH CONTENTS OF DCS REG TST WORK ;IS ERROR FLAG SET BPL STAI61 ;NO! X-FER OK MOV #3,WORK1 ;WHAT DCS SHOULD CONTAIN EROR37: ERROR \N JSR %5,STAER1 ;REPORT ERROR JMP STAI56 ;RESTART TEST STAI61: MOV @DAE,WORK ;IS EXT. ADDRESS CLEAR ІBRANCH IF NO ERROR MOV #24,ERCOUNT ;SET UP ERROR COUNT MOV @DCS,WORK ;REPORT CONTROL REG ER24: JSR %5,STAER ;****WRD1=DISK CONTROL STATUS REG. AT THE TIME OF THE THE ERROR **** BR XSPIRAL ;LOOP ON ERROR X2SPIL: CMP #25252,INBUF ;IS ADDR 3777 CORRECT BEQ X3SPIL ;BRANCH IF NOT EQUAL MOV #25,ERCOUNT ;SET UP ERROR COUNT MOV #25252,WORK1 ;GOOD DATA MOV OUTBUF,WORK ;DATA DATA ER25: JSR %5,STAER1 ;REPORT ERROR ;****WRD1=THE DATA THAT SHOULD BE IN ADDR.3777 OF TRACK 0 **** ;****WRD2=THE DATAЇCLR PATNU ;CLEAR PATTER COUNT MOV #1000,SWRDCT ;SET UP STANDARD WORD COUNT MOV SWRDCT,WRDCT TST @SR BMI CONM ;OPERATE UNDER PROGRAM CONTROL BIS #70000,FLAG JMP ADTST ;ENTER OPERATOR CONVERSATION MODE CONM: EMT +1 ;ASK ABOUT DATA TEST ONLY CON1 JSR %7,ALPHA ;GO WAIT FOR ANSWER CMP #153,TEXBUF ;TEST FOR YES BNE .+10 ;BRANCH IF NO BIS #BIT10,FLAG EMT +1 CON2 ;ASK ABOUT MULTI DISK MODE JSR %7,ALPHA ;GO WAIT FOR ANSWER CMP #153,TEXBUF ;TEST FOR YES BNE DATTES ;DO NOT ENЈED IN THIS TEST WHICH ARE NOT ADDRESS ERRORS BUT DATA ERRORS. THE OPERATOR IS CAUTIONED TO CAREFULLY EXAMINE THE ERRORS TO DISTINGUISH BETWEEN THE ADDRESS AND DATA ERRORS. ADT4 - TEST TRACK "X" AND "Y" MATRIX THIS ROUTINE WAS DESIGNED TO ENABLE THE OPERATOR AN EASY AND SURE METHOD OF DETECTING DEFECTIVE MATRIX SWITCHES. IN THIS ROUTINE THE FIRST AND LAST LOCATION OF EACH TRACK (0 AND 3777(8)) ARE WRITTEN WITH ALL ONES. AFTER THE INITIAL WRITE HAS TAKEN PLACE, THE ROUTINE THEN STARTSЉ TST WORK ;DAE SHOULD NOT HAVE INC. BEQ STAI62 ;DAE OK EROR40: ERROR \N JSR %5,STAER ;REPORT ERROR JMP STAI56 ;RESTART TEST STAI62: MOV @DAR,WORK ;WAS DAR INCREMENTED BY 1 CMP #BIT0,WORK ;IS DAR CORRECT BEQ STAI63 ;DAR OK MOV #BIT0,WORK1 ;WHAT DAR SHOULD CONTAIN EROR41: ERROR \N JSR %5,STAER1 ;REPORT ERROR JMP STAI56 ;RESTART TEST STAI63: MOV @WC,WORK ;FETCH WORD COUNT BEQ STAI64 ;WORD COUNT DID OVERFLOW EROR42: ERROR \N JSR %5,STAER ;WORD COUNT FAILED TO OVERFLOW JMP SЊ THAT WAS READ FROM ADDR. 3777 OF TRACK 0 **** BR XSPIRAL ;LOOP ON ERROR X3SPIL: INC DMA ;SET UP TO READ ADDR 4000 READ ;READ DATA TSTB @DCS ;TEST FOR READY BPL .-4 ;CONTROL STILL BUSY TST @DCS ;TEST FOR ERROR BPL X4SPIL ;BRANCH IF NO ERROR MOV #26,ERCOUNT ;SET UP ERROR COUNT MOV @DCS,WORK ;REPORT CONTROL REG. ER26: JSR %5,STAER ;REPORT ERROR ;****WRD1=DISK CONTROL STATUS REG. AT THE TIME OF THE ERROR **** BR XSPIRAL ;LOOP ON ERROR X4SPIL: CMP #25252,INBUF ;CMP DATA BEQЋTER STATIC TEST BIS #BIT11,FLAG ;SET FLAG TO ENTER STATIC TEST DSKDR: EMT +1 CON3 JSR %7,NOCHA SUB #1,TEXBUF CMP #10,TEXBUF BLOS DSKDR MOV TEXBUF,DSKNOR ROL DSKNOR ROL DSKNOR BR ASKWC DATTES: EMT +1 CON4 ;ASK UNIT NUMBER JSR %7,NOCHA ;WAIT FOR NO. CMP #10,TEXBUF ;IS NO = O>10 BLOS DATTES ;NO CLC ROL TEXBUF ROL TEXBUF BIS TEXBUF,FLAG ASKWC: EMT +1 CON5 ;ASK ABOUT OPTIONAL WORD COUNT JSR %7,ALPHA ;WAIT FOR ANSWER CMP #153,TEXBUF BNE OPDAR ;ASK ABOUT OPTIOЌ WITH THE FIRST WORD OF THE ABOVE INDICATED LOCATION AND WRITES THE ADDRESS ON ITSELF. THE NEXT STEP OF THE ROUTINE IS TO CHECK ALL OTHER ADDRESSES TO SEE IF THEY HAVE BEEN ALTERED. AFTER ALL ERRORS HAVE BEEN REPORTED, IF ANY, THE ROUTINE RE-WRITES THE ADDRESS WITH ALL ONES AND CONTINUES ON WITH THE NEXT ADDRESS. ADT5 - TEST LOOK AHEAD FEATURE THE DISK LOOK AHEAD FEATURE WAS DESIGNED FOR THE USER WHO WANTED OPTIMUM USE OF THE DISK, BY KNOWING AT WHAT ADDRESS THE DISK READ HEADS ARE­TAI56 ;RESTART TEST STAI64: MOV @CMA,WORK ;FETCH CURRENT ADDRESS MOV #OUTBUF+2,WORK1 ;WHAT CMA SHOULD EQUAL CMP WORK1,WORK ;IS CMA CORRECT BEQ STAI65 ;YES EXECUTE CONTINUE EROR43: ERROR \N JSR %5,STAER1 ;REPORT ERROR IN CMA JMP STAI56 ;ERROR RESTART TEST ;A READ CONTINUE WILL BE EXECUTED NOW ;WORD COUNT WILL BE SET TO -1 AGAIN ; ;EROR44=BUSY NOT SET BY GO ;EBOR45=BUSY NOT CLEARED BY OVERFLOW ;EROR46=DISK ERROR OCCURRED WHILE X-FERING ;EROR47=DAE INCREMENTED WHEN CONTINUE WAS EXECUTЎ LPXSPIL ;BRANCH IF DATA OK MOV #27,ERCOUNT ;SET UP ERROR COUNT MOV #25252,WORK1 ;GOOD DATA MOV INBUF,WORK ;DATA DATA ER27: JSR %5,STAER1 ;REPORT ERROR ;****WRD1=THE DATA THAT SHOULD BE IN ADDR. 0 OF TRACK 1 **** ;****WRD2=THE DATA THAT WAS READ FROM ADDR. 0 OF TRACK 1 **** BR XSPIRAL ;LOOP ON ERROR LPXSPIL:BIT #BIT11,@SR ;LOOP ON TEST? BNE XSPIRAL ;YES BIT11 SET IN SR, CLRREG: CLR DMA ;CLEAR WORD ADDRESS CLR TRACK ;CLEAR TRACK ADDRESS ; ; ; ; ; ; ; ; ; ; DATAT: MOV SWRDCTЏNAL DAR WCCON: EMT +1 CON6 ;ASK LENGTH OF WC JSR %7,NOCHA TST TEXBUF BEQ WCCON CMP #1001,TEXBUF ;IS WORD COUNT>1000 BLOS WCCON ;YES ASK FOR COUNT AGAIN MOV TEXBUF,SWRDCT ;OPERATING WORD COUNT MOV SWRDCT,WRDCT OPDAR: EMT +1 CON7 ;ASK ABOUT OPTIONAL DAR JSR %7,NOCHA CMP #4000,TEXBUF ;3777 MAX DAR ADDR BLOS OPDAR MOV TEXBUF, DMA ;TEMP DAR REGISTER OPPAT: EMT +1 CON8 ;ASK ABOUT DATA PATTERNS JSR %7,NOCHA CMP #23,TEXBUF ;TEST FOR CORRECT NO BLOS OPPAT ;ASK AGAIN А LOCATED AT ALL TIMES. THE ADDRESS LOADED INTO THE ADS REGISTER IS THE PHYSICAL ADDRESS OF THE DISK. THE PROGRAM LOCATES THE PHYSICAL ADDRESS BY WRITE A WORD AND UPON RECEIVING THE COMPLETION FLAG THE PROGRAM READS THE ADS REGISTER. THE ADDRESS MAY BE UP TO 2 ADDRESSES OFF. (5.3 CONT'D) SPIRAL - TEST DISK TRACK SPIRAL IN THIS ROUTINE THE ABILITY OF THE CONTROL (RF09/15) TO SPIRAL FROM ONE TRACK TO ANOTHER DURING A READ AND A WRITE. IN ORDER TO CHECK THE READ SPIRAL, THE LAST AБED ;EROR50=DAR DID NOT EQUAL 2 AFTER SECOND X-FER ;EROR51=WC FAILED TO OVERFLOW ON READ CONTINUE ;EROR52=CMA DID NOT EQUAL OUTBUF+2 AFTER READ CONTINUE ; ; STAI65: MOV #177777,@WC ;SET WC TO -1 BIS #BIT0,@DCS ;SET GO TO CONTINUE TSTB @DCS ;TEST FOR RDY=0 BPL STAI66 ;RDY SET MOV @DCS,WORK ;FETCH CONTENTS OF DCS EROR44: ERROR \N JSR %5,STAER ;REPORT BUSY NOT SET JMP STAI56 STAI66: CLR WORK INCRD: TSTB @DCS ;TST FOR RDY SET BY OVERFLOW BMI STAI67 ;RDY SET CONTINUE INC WORK ;WAITВ,WRDCT MOV #LDAT,HRDER ;SETUP FOR HARD ERROR MOV #340,@CSR ;LOCK UP PROCESSOR PRIORITY JSR %5,PASEL ;SET UP DATA BUFFERS LDAT: JSR %5,OPDSEL ;SET UP DISK ADDRESS BIT #BIT14,FLAG ;TEST FOR WRITE BEQ SLH ;TEST FOR WRITE CHECK MOV #OUTBUF,BUF ;SETUP OUTPUT BUFFER WRITE +100 ;WRITE WITH INT. ENABLED BIT #BIT9,@SR ;FIND OUT HOW TO WAIT FOR INT BNE WRWAIT ;WAIT WITH WAIT INSTRUCTION IOT ;WAIT IN BACKGROUND TEST BR SLH WRWAIT: MOV PRIORITY,@CSR WAIT ;WAIT FOR FLAG SLH: BIT #BIT1Г CMP #22,TEXBUF BEQ OPWRT ;DATA PATTERN UNDER PROGRAM CONTROL BIS #BIT15,FLAG ;SET PROGRAM FLAG MOV TEXBUF, PATNU ;OPERATOR WANTS TO SELECT DATA CLC ROL PATNU BIC #70000,FLAG ;CLEAR OP MODE BITS IN FLAG OPWRT: EMT +1 CON9 ;ASK ABOUT WRITE JSR %7,ALPHA CMP #153,TEXBUF ;TEST FOR YES BNE OPWCK ;ASK ABOUT WRITE CHECK BIS #BIT14,FLAG ;YES SET FLAG BIT OPWCK: EMT +1 CON10 ;ASK ABOUT WRITE CHECK JSR %7,ALPHA CMP #153,TEXBUF ;TEST FOR YES ANSWER BNE OPRD ;GO ASK ABOUT READ ДDDRESS (3777(8)) OF TRACK ZERO IS WRITTEN WITH PRE-DETERMINED DATA AND THE FIRST ADDRESS (0) OF TRACK ONE, IS ALSO WRITTEN WITH PRE-DETERMINED DATA. THEN A TWO WORD READ STARTING AT LOCATION 3777(8) OF TRACK ZERO IS ACCOMPLISHED. THE TWO WORDS THEN ARE COMPARED TO THE DATA WRITTEN AND ANY ERRORS ARE REPORTED. TO CHECK WRITE SPIRAL, THE ROUTINE WRITES TWO WORDS STARTING AT ADDRESS 3777(8) OF TRACK ZERO AND TERMINATES AT LOCATION 0 OF TRACK ONE. THE ROUTINE THEN READS THE TWO LOCATIONS WЕ FOR BUSY=0 BNE INCRD ;GO WAIT FOR BUSY MOV @DCS,WORK ;FETCH CONTENTS OF DCS EROR45: ERROR \N JSR %5,STAER ;REPORT BUSY NOT CLEARED JMP STAI56 ;RESTART ROUTINE STAI67: TST @DCS ;DID AN ERROR OCCUR WHILE X-FERING BPL STAI70 ;NO CONTINUE MOV @DCS,WORK ;YES! CONTENTS OF DCS MOV @DAE,WORK1 ;EXT ERROR BITS EROR46: ERROR \N JSR %5,STAER1 ;REPORT ERROR OCCURRED JMP STAI22 ;RESTART ROUTINE STAI70: TST @DAE ;DID DAE INC. BY DATA WAS X-FERED BEQ STAI71 ;OK IT DID NOT INC MOV @DAE,WOЖ3,FLAG ;TEST FOR WRITE CHECK BEQ ESH ;TEST FOR READ MOV #OUTBUF,BUF ;SETUP OUTPUT BUFFER MOV #340,@CSR WRCHECK +100 ;WRITE CHECK WITH INT. ENABLE BIT #BIT9,@SR ;FINDOUT HOW TO WAIT FOR INT. BNE WCWAIT ;WAIT WITH WAIT INSTRUCTION IOT ;WAIT IN BACKGROUND TEST BR ESH WCWAIT: MOV PRIORITY,@CSR WAIT ;WAIT FOR FLAG ESH: BIT #BIT12,FLAG ;TEST FOR READ BEQ REH ;CHECK BUFFER MOV #INBUF,BUF ;SETUP OUTPUT BUFFER BIC #3,FLAG ;CLEAR RE-READ COUNT DSKRD: MOV #340,@CSR JSR %5,ZBЗ BIS #BIT13,FLAG ;YES SET FLAG BIT OPRD: EMT +1 CON11 ;ASK ABOUT READ JSR %7,ALPHA CMP #153,TEXBUF ;TEST FOR YES ANSWER BNE CHKFLG BIS #BIT12,FLAG ;SET FLAG TO READ CHKFLG: BIT #70000,FLAG BEQ OPWRT ; ; ; ADTST: BIT #BIT11,FLAG ;ARE WE IN MULTI DISK MODE BEQ EXMFLG ;BRANCH IF NO. EMT +1 MES11 MOV FLAG,ACNVX ROR ACNVX ROR ACNVX BIC #177770,ACNVX ;FETCH DISK # JSR %5,CONV ACNVX MES12 1 EMT +1 MES12 EXMFLG: BIT #BIT10,FLAG ;TEST FOR DATA TEST ONLY BEQ .+6 ;DИITH ONE WORD TRANSFERS, AND VERIFIES THE CORRECT DATA WAS STORED IN EACH LOCATION. DATA TESTS RANEX - RANDOM DATA, RANDOM ADDRESS RANDOM WORD COUNT TEST THIS ROUTINES TESTS THE ABILITY OF THE SYSTEM TO ACCESS RANDOM ADDRESS WITH RANDOM DATA AND AN INCREMENTAL WORD COUNT. THE DATA IS FIRST WRITTEN ON THE DISK AND THEN DATA IS WRITE- CHECKED. ALL ERRORS ARE REPORTED. THE WORD COUNT RUNS FROM 1 TO 1000(8) WORDS. DATA RELIABILITY - DATA PATTERN TEST IN THIS PORTION OF THE ЙRK ;ERROR IT INCREMENTED EROR47: ERROR \N JSR %5,STAER ;REPORT DAE INCREMENTED JMP STAI56 STAI71: MOV @DAR,WORK ;DID DAR INCREMENT ON CONTINUE MOV #2,WORK1 ;WHAT DAR SHOULD CONTAIN CMP WORK1,WORK ;IS DAR CORRECT BEQ STAI72 ;DAR OK EROR50: ERROR \N JSR %5,STAER1 ;REPORT DAR INCORRECT JMP STAI56 ;RESTART ROUTINE STAI72: MOV @WC,WORK ;FETCH WORD COUNT BEQ STAI73 ;WORD COUNT OVERFLOWED EROR51: ERROR \N JSR %5,STAER ;REPORT WORD COUNT FAILED TO CLEAR JMP STAI56 ;RESTART ROUTINE STКUF ;CLEAR BUFFER INC FLAG READ +100 ;READ + INT ENABLE BIT #BIT9,@SR ;FIND OUT HOW TO WAIT FOR INT. BNE RDWAIT ;WAIT WITH WAIT INSTRUCTION IOT BR ELH RDWAIT: MOV PRIORITY,@CSR ;SET UP PRIORITY WAIT ;WAIT FOR FLAG ELH: BIT #BIT12,@SR BNE ADRD JSR %5,COMPARE ;COMPARE OUTBUFFER TO INBUFFER ADRD: JSR %5,OVRFLO ;TEST FOR EXTRA DATE BREAKS MOV FLAG,WORK ;CHECK DISK RE-READ COUNT BIC #177774,WORK ;DO 3 RE-READS. CMP #3,WORK BNE DSKRD ;DO ANOTHER RE-READ REH: BIT #BIT8,@SR BNЛO COMPLETE TEST JMP DATAT ;DO DATA TEST ONLY ;***ADDRESS ADT2*** ; ;IN THIS TEST WRITE TRACK ZERO WITH ZERO'S ;THEN WRITE ALL ONES IN AN ADDRESS ;CHECK IF WRITING ONES IN THAT ADDRESS ALTERED ;ANY OTHER ADDRESS IN THE TRACK ;FOLLOW THIS PROCEDURE FOR ADDRESSES 0 TO 3777 ; ; ADT2: MOV #1000,%6 ;SET UP STACK MOV #2000,WRDCT ;SET UP WORD COUNT MOV #OUTBUF,BUF ;SET UP CURRENT ADDRESS MOV PATNU,SAVE CLR PATNU CLR TRACK CLR DMA JSR %5,PASEL ;SET UP DATA BUFFER MOV SAVE,PATNМTEST, THE ABILITY OF THE COMPLETE DISK SURFACE TO WRITE, WRITE-CHECK, AND READ DATA IS TESTED. THE ROUTINE FIRST WRITES THE COMPLETE SURFACE WITH A SET DATA PATTERN, THEN A WRITE CHECK OF THE COMPLETE SURFACE IS ACCOM- PLISHED, THUS REPORTING ALL ERRORS BETWEEN THE DATA WRITTEN AND THE DATA IN MEMORY. THREE READS ARE ACCOMPLISHED FOR EACH BUFFER AREA ON THE DISK. THE OPERATOR AT THIS POINT HAS SEVERAL OPTIONS AS TO WHAT COURSE OF ACTION THE PROGRAM WILL TAKE NEXT. (REF. SEC. 5.1) IНAI73: MOV @CMA,WORK ;FETCH CMA MOV #OUTBUF+4,WORK1 ;WHAT CMA SHOULD EQUAL CMP WORK1,WORK ;IS CMA CORRECT BEQ LPST56 ;CMA WAS CORRECT EROR52: ERROR \N JSR %5,STAER1 ;REPORT CMA INCORRECT JMP STAI56 ;RESTART ROUTINE LPST56: SCOPE ;ENTER SCOPE LOOP STAI56 ; ;IN THIS STATIC TEST THE ABILITY OF THE DISK CONTROL ;TO INCREMENT THE TRACK REGIST WILL BE TESTED. ; ;A ONE WORD WRITE WILL BE EXECUTED ;DAE=0 ;DAR=177777 ;WC=-1 ;CMA=OUTBUF ; ;AT THE COMPLETION OF THE WRITE ;DAR=0 ;DAE=ОE DATAT JSR %7,DISBUF ;GO SET UP DISK BUFFER. BR LDAT MSTR: TST FLAG BPL .+6 ;UNDER PROGRAM CONTROL JMP EXTPP ;OPERATOR SELECTED PATTERN ADD #2,PATNU ;INC PATTERN INDEX CMP #44,PATNU BNE DATAT ;NOT LAST PATTERN EXIT CLR PATNU ;LAST PATTERN EXIT ; ;THIS IS A RANDOM DATA, RANDOM ADDRESS ;AND RANDOM WORD COUNT ; ;WORD COUNT CAN BE EQUAL TO OR LESS THAN 1000 WORDS ; RANEX: MOV #-1000,PASSC MOV #1000,%6 BIC #BIT9,FLAG MOV #RANER,HRDER ;SET UP FOR HARD ERROR MOV PRIORITY,@CПU ;****WRITE DISK ADDR. 0 TO 1777 WITH ZEROES **** RFADT: BIS #BIT8,@DCS WRITE TSTB @DCS ;TEST FOR READY BPL .-4 TST @DCS ;TEST FOR ERROR BPL RFADTX-6 MOV #1,ERCOUNT ;ERROR OCCURRED MOV @DCS,WORK1 ;FETCH DCS REGISTER MOV @DAR,WORK DEC WORK ER1: JSR %5,STAER1 ;REPORT ERROR OCURRED ;****WRD1=CONTROL STATUS REG. AT THE THE TIME OF THE ERROR **** ;****WRD2=DISK ADDR. AT THE TIME OF THE ERROR **** BR RFADT ;LOOP ON ERROR MOV #2000,DMA ;****WRITE DISK ADDR. 2000 TO 3777 WITH ZEROEРN THE DATA RELIABILITY, ALL PROGRAM PARAMETERS CAN BE CHANGED. REF. SEC. 5.2 MAINTENANCE TOOL STAMP - STATIC TRACK SELECTION THIS ROUTINE WAS DESIGNED TO ENABLE THE OPERATOR TO HAVE A QUICK METHOD OF SELECTING TRACKS FOR AMPLITUDE ADJUSTMENTS. (5.3 CONT'D) STAMP - OPERATING PROCEDURE STEP A. SET SWITCH REGISTER EQUAL TO 704 STEP B. DEPRESS LOAD ADDRESS STEP C. SET SWITCH REGISTER 9 THRU 7 EQUAL TO DISK #0 THRU 7 STEP D. DEPRESS START STEP E. SET SWITCH REGISTС1 ; STAI74: BIS #BIT8,@DCS ;CLEAR THE DISK MOV #177777,@WC ;SET WORD COUNT TO -1 MOV #OUTBUF,@CMA ;SET UP CURRENT ADDRESS CLR @DAE ;CLEAR EXT. ADDR BITS MOV #177777,@DAR ;SET DAR TO ALL ONES MOV #3,@DCS ;GO WRITE ONE WORD CLR WORK ;LET'S WAIT FOR COMPLETION LTSWT: TSTB @DCS ;TEST FOR NOT BUSY BMI STAI75 ;X-FER COMPLETE INC WORK ;+1 WAIT REG. BNE LTSWT ;GO WAIT FOR NOT BUSY MOV @DCS,WORK ;FETCH CONTENTS OF DCS ERROR \N JSR %5,STAER ;REPORT ERROR X-FER NEVER COMPLETED BR ТSR ;SET PRIORITY TO LEVEL 5 WRLG: MOV #3,WORK ;GENERATE RANDOM WORD MOV #OUTBUF,%1 JSR %5,RANDOM BIC #177000,OUTBUF ;MASK FOR WORD LENGTH=1K BEQ WRLG MOV OUTBUF,WRDCT ;SET UP WORD COUNT MOV OUTBUF+2,DMA ;SET UP DAR ADD WRDCT,DMA BCS WRLG MOV OUTBUF+2,DMA BIC #177774,OUTBUF+4 MOV OUTBUF+4,TRACK ;SET UP DAE MOV WRDCT,WORK ;GENERATE RANDOM MOV #OUTBUF,%1 ;DATA BUFFER JSR %5,RANDOM MOV #OUTBUF,BUF BIS #BIT8,@DCS ;CLEAR THE DISK WRITE +100 ;WRITE DATA BIT #BIT9,@SR BNE УS **** RFADTX: BIS #BIT8,@DCS ;CLEAR THE DISK WRITE TSTB @DCS ;TEST FOR READY BPL .-4 TST @DCS ;TEST FOR ERROR BPL RFRD-4 MOV @DAR,WORK DEC WORK MOV @DCS,WORK1 ;FETCH DCS REGISTER MOV #2,ERCOUNT ;SETUP ERROR COUNT ER2: JSR %5,STAER1 ;REPORT DISK ERROR ;****WRD1=DISK CONTROL STATUS REG. AT THE TIME OF THE ERROR **** ;****WRD2=DISK ADDR. REG AT THE TIME OF THE ERROR **** BR RFADTX ;LOOP ON ERROR CLR SAV1 RFRD: CLR SAVE WONWD: MOV #-1,#-1 MOV #WONWD+4,BUF MOV #1,WRDCT ФER 6 THRU 0 EQUAL TO TRACK # STEP F. DEPRESS CONTINUE 6 5 4 3 2 1 0 TRACK NUMBER (0 THRU 177(8)) STEP G. TRACK NUMBER CAN BE CHANGED ARBITRARILY. 6. ERROR REPORTS 6.1 STATIC AND ADDRESS REPORT. XX ERR CNT XXXXXXWRD1XXXXWRD2 ERRCNT = IS THE TAG FOR THE LISTING WRD1 = WHAT WAS EXPECTED WRD2 = WHAT WAS RECEIVED WHEN A REPORT ONLY CONTAINS ONE WORD THE PROGRAM WAS EXPECTING ZEROS BUT RECEIVED WHAT WAS REPORTED. 6.2 ERROR REPORTS STATUS ERROR ХSTAI74 ;RESTART ROUTINE STAI75: TST @DAR ;DOES DAR=0 BEQ STAI76 ;DAR OK MOV @DAR,WORK ;FETCH DAR ERROR \N JSR %5,STAER ;REPORT DAR DID NOT INC TO 0 JMP STAI74 ;ERROR RE-START ROUTINE STAI76: MOV @DAE,WORK ;FETCH DAE BIC #177774,WORK ;CLEAR DISK AND ERROR BITS CMP #1,WORK ;DID DAE INC BEQ LPST74 ;DAE SHOULD EQUAL 1 MOV #1,WORK1 ;WHAT DAE SHOULD CONTAIN ERROR \N JSR %5,STAER1 ;REPORT DAE NOT CORRECT LPST74: SCOPE ;ENTER SCOPE LOOP STAI74 ; ;IN THIS ROUTINE THE ABILITYЦ.+6 IOT BR .+12 MOV PRIORITY,@CSR WAIT WRCHECK +100 ;WRITE CHECK DATA BIT #BIT9,@SR BNE .+6 IOT BR .+12 MOV PRIORITY,@CSR WAIT MOV #INBUF,BUF ;SET UP BUFFER JSR %5,ZBUF ;CLEAR BUFFER AREA READ +100 ;READ DATA BIT #BIT9,@SR BNE .+6 IOT BR .+12 MOV PRIORITY,@CSR WAIT JSR %5,COMPARE ;COMPARE OUT BUFFER TO IN BUFFER JSR %5,OVRFLO ;TEST FOR EXTRA DATA BREAKS RANER: BIT #BIT9,FLAG ;CHECK FOR ERROR BEQ EXRAX BIC #BIT9,FLAG JSR %5,CONV DMA MES1 6 JSR %Ч MOV SAV1,DMA BIS #BIT8,@DCS WRITE TSTB @DCS ;TEST FOR READY BPL .-4 TST @DCS ;TEST FOR ERROR BPL SUADB ;BRANCH IF NO CONTROL ERROR MOV @DCS,WORK1 MOV SAV1,WORK MOV #3,ERCOUNT ;SETUP ERROR COUNT ER3: JSR %5,STAER1 ;REPORT ERROR ;****WRD1=DISK CONTROL STATUS AT THE TIME OF THE ERROR**** ;****WRD2=DISK ADDR. IN ERROR WHEN TRYING TO WRITE ALL ONES **** BR WONWD ;RE-WRITE WORD SUADB: TST SAVE BEQ CHKZER CMP #2000,SAV1 BHI WRCADT BUFIND: MOV SAV1,%0 ROL %0 BIC #174001,%0Ш STATUS ERROR XXDAE XXXXXXDAR XXXXXXDCS A B C A=THE DISK NUMBER AND EXTENDED DISK ADDRESS BITS. B=THE DISK ADDRESS REGISTER C=THE DISK CONTROL REGISTER LAYOUT OF DISK ADDRESS BITS DAE DAR XXX XXX XXX XXX XXX XXX XXX DISK NO. TRACK ADDRESS WORD ADDRESS BIT LAYOUT OF DCS REGISTER BIT15= ERROR BIT14= DISK FREEZE BIT13= WRITE CHECK ERROR BIT12= DATA PARITY ERROR BIT11= NON-EXISTENT DISK BIT10= WRITE LOCKOUTЩ OF THE CONTROL ;TO INCREMENT THE DISK NO. IS CHECKED ; ;ROUTINE PARAMETERS AT START ;DAE=0000X3 (X=EXISTING DISK NO) ;DAR=177777 ;WC=-1 ;CMA=#OUTBUF ;DCS=#3 ; ;PARAMETERS AT THE END OF ROUTINE ;DAE=X+1 ;DAR=0 ;WC=0 ;CMA=OUTBUF+2 ;DCS=0 ; ; STAI77: MOV FLAG,WORK1 ;FETCH PROGRAM FLAG BIC #177743,WORK1 ;MASK DISK NO. BIS #3,WORK1 ;SET ADDR EXT. BITS MOV WORK1,@DAE ;SET DAE REG MOV #177777,@DAR ;DAR EQUALS ALL ONES MOV #177777,@WC ;WORD COUNT SET FOR ONE WORD MOV #OUTBUF,@CMA ;CЪ5,CONV TRACK MES1A 2 JSR %5,CONV WRDCT MES3 4 EMT+0 HED6 MES1A MES1 MES3 -1 EXRAX: INC PASSC ;HAVE WE DONE IT 1000 TIMES BNE WRLG ;BRANCH IF NO BIT #BIT11,@SR ;LOOP ON TEST BEQ .+6 ;BRANCH IF YES JMP RANEX ; ;CHECK FOR MULTI DISK MODE ;IF IN MULTI DISK MODE REPORT "END" ;IF LAST DISK ON SYSTEM HAS BEEN ;EXERCISED. ; ; CLR DMA CLR TRACK BIT #BIT11,FLAG ;ARE WE IN MULTI DISK MODE BEQ REPOEN ;REPORT "END" MOV FLAG,WORK ;WHAT DISK ARE WE ON BIC #17774Ы MOV #-1,OUTBUF(0) BR WRCADT CHKZER: CMP #2000,SAV1 BHI BUFIND WRCADT: BIS #BIT8,@DCS MOV #2000,WRDCT ;SETUP WORD COUNT MOV #OUTBUF,BUF ;SETUP CURRENT ADDR MOV SAVE,DMA ;SETUP DISK ADDRESS WRCHECK TSTB @DCS ;CHECK FOR READY BPL .-4 TST @DCS ;TEST FOR ERROR BPL CHKBUF ;BRANCH NO DISK ERROR MOV @DCS,WORK1 MOV SAV1,WORK DEC WORK MOV #4,ERCOUNT ;SET UP ERCOUNT ER4: JSR %5,STAER1 ;REPORT ERROR MOV @DAR,ACNVX ;SET UP DISK ADDR. FOR REPORT JSR %5,CONV ACNVX MES4 6 Ь BIT9= MISSED TRANSFER BIT8= DISK CLEAR BIT7= READY BIT6= INTERRUPT ENABLE BIT5= EXTENDED MEMORY 1 (XM1) BIT4= EXTENDED MEMORY 0 (XM0) BIT3= MAINTENANCE BIT2-1= FUNCTION REGISTER BIT 2 BIT 1 OPERATION 0 0 NOP 1 0 READ 0 1 WRITE 1 1 WRITE CHECK IF THE ERROR OCCURRED WHEN READING THE PROGRAM WILL REPORT WHICH READ. NOTE: WHEN A FREEZE ERROR OCCURS AN ADDITIONAL ERROR MESSAGE WЭURRENT ADDRESS SET UP BIS #3,@DCS ;GO WRITE TSTB @DCS ;IS RDY CLEARED BPL STA100 ; MOV @DCS,WORK ;FETCH CONTROL RUG ERROR \N JSR %5,STAER ;REPORT BUSY NOT SET BR STAI77 ;RESTART ROUTINE STA100: CLR WORK INXDSK: TSTB @DCS ;IS X-FER COMPLETE BMI STA101 INC WORK ;TEST READY SHOULD BE SET BNE INXDSK ;GO CHECK AGAIN MOV @DCS,WORK ;FETCH CONTENTS OF DCS ERROR \N JSR %5,STAER ;REPORT X-FER NOT COMPLETE JMP STAI77 ;RESTART ROUTINE STA101: TST @DAR ;IS DAR CLEARED BEQ STA1Ю3,WORK ;IF LAST DISK ON SYSTEM CMP WORK,DSKNOR ;REPORT END BEQ REPOEN ;REPORT "END" LAST DISK ADD #4,FLAG ;INC. DISK NO. BR EXTPP ;EXERCISE DISK REPOEN: EMT +1 END ;REPORT END OF PASS BIC #34,FLAG EXTPP: JMP ADTST ;RECYCLE ; ;ENTER DISK HANDLER BY THE TRAP INSTRUCTION ;ARGUMENT TO TRAP INSTRUCTION IS TWO ORDER ;BYTE OF THE CONTROL REGISTER. ; DISK: MOV DBR,%5 ;SET UP TO LOAD DISK REG MOV TRACK,-(5) ;LOAD TRACK NUMBER MOV FLAG,WORK ;SET UP DISK NO. BIC #177743,WORK ;MASK FOЯEMT +1 MES4 ;****WRD1=DISK CONTROL STATUS REG. AT THE TIME OF THE ERROR **** ;****WRD2=DISK ADDR. IN ERROR DURING WRITE CHECK **** ;****WRD ADDR.=ADDR. WHICH CONTAINS ALL ONES **** BR WRCADT CHKBUF: MOV SAV1,%0 ROL %0 BIC #174001,%0 CLR OUTBUF(0) TST SAVE BNE ZEROAD ;RE-WRITE ADDRESS TO ZERO MOV #2000,SAVE BR SUADB ZEROAD: CLR SAVE ; MOV SAV1,DMA ;SETUP DISK ADDRESS CLR #0 ;SET UP DATA MOV #.-2,BUF ;SETUP CURRENT ADDRESS MOV #1,WRDCT ;SETUP WORD COUNT WRITE TSTB аILL BE REPORTED, AS FOLLOWS: XXX HRD ERR LAYOUT OF BITS 0 - 7 BIT0= CMA INH. (NOT AN ERROR CONDITION) BIT1= UNUSED BIT2= NON-EXISTENT MEMORY ERROR BIT3= UNUSED BIT4= TRACK C TIMING ERROR BIT5= TRACK B TIMING ERROR BIT6= TRACK A TIMING ERROR BIT7= ADDRESS PARITY ERROR 6.3 DATA ERRORS DATA ERR 1 READ XXDAE XXXXXXDAR XXXXXXGD DATA XXXXXXBD DATA A B C D E A=WHICH READ THE ERROR OCCURRED B=THE DISK NUMBER AND EXTENDED DISK ADDб02 ;YES MOV @DAR,WORK ;FETCH DAR ITS NOT CLEAR ERROR \N JSR %5,STAER ;REPORT DAR NOT CLEAR. JMP STAI77 ;RESTART ROUTINE STA102: INC WORK1 ;DAE SHOULD=THIS AT END X-FER CMP WORK1,@DAE ;IS DAE CORRECT BEQ LPST77 ;DAE IS CORRECT MOV @DAE,WORK ;FETCH CONTENTS OF DAE ERROR \N JSR %5,STAER1 ;REPORT DAE INCORRECT JMP STAI77 ;RESTART ROUTINE LPST77: SCOPE ;ENTER SCOPE LOOP STAI77 ; ; ;IN THIS ROUTINE THE PROGRAM WILL GENERATE A ;NON-EXISTENT DISK ERROR THIS WILL BE DONE ;BY вRM PROGRAM FLAG BIS WORK,(5) ;LOAD UNIT INTO DAE MOV DMA,-(5) ;LOAD WORD ADDRESS MOV BUF,-(5) ;SET UP CURRENT ADDRESS MOV WRDCT,-(5) ;LOAD WORD COUNT COM (5) ;SET UP TWO'S COMPLEMENT INC (5) MOV (6),%4 MOV -(4),WORK ; BIC #177600,WORK ;MASK FUNCTION BITS MOV WORK,-(5) ;LOAD FUNCTION REG. RTI ;RETURN FROM TRAP ; ; ; ; ; ; ; ;RF11 DISK INTERRUPT HANDLER ;ROUTINE CONTINUES ON ERRORS ; DKINT: BIC #BIT4,@CSR ;CLEAR TRACE BIT TST @DCS ;TEST FOR ERROR BPL INTEXT ;BRANCH г@DCS ;CHECK FOR READY BPL .-4 TST @DCS ;TEST FOR ERROR BPL INDADT MOV #5,ERCOUNT MOV @DCS,WORK1 MOV @DAR,WORK ER5: JSR %5,STAER1 ;****WRD1=CONTROL STATUS REG. AT THE TIME OF THE ERROR **** ;****WRD2=DISK ADDR. AT THE TIME OF THE ERROR **** BR ZEROAD ;LOOP ON ERROR INDADT: CMP #3777,SAV1 BEQ LP2ADT ;LAST ADDR. CHECKED INC SAV1 JMP RFRD ;CHECK NEXT ADDRESS LP2ADT: BIT #BIT11,@SR ;IS BIT 11 SET IN SR BEQ .+6 JMP ADT2 ;BIT 11 SET LOOP ON TEST ; ; ; ; ;***** ADдRESS BITS C=THE DISK ADDRESS REGISTER D=THE DATA WRITTEN ON THE DISK E=THE DATA READ FROM THE DISK 6.4 RANEX ERRORS ERRORS WHICH OCCUR IN RANEX ALSO HAVE THE WORD COUNT REPORT WITH THE ERROR MESSAGE IN THE FOLLOWING MANNER. RANEX ERR XXDAE XXXXXXDAR XXXXWRD CNT. A B C A=STARTING DAE OF TRANSFER B=STARTING DAR OF TRANSFER C=WORD COUNT OF TRANSFER 6.5 OVERFLOW ERROR WHEN THE DISK TRANSFERS MORE WORDS THEN ITS WORD COUNT WAS EQUAL TO, THE PROGRAM FLAGSеATTEMPING A 2 WORD WRITE ON DISK 7 ;THE LAST TRACK AND THE LAST WORD ON THE ;LAST TRACK ; ;IF DISK 7 IS THERE WE WILL RECEIVE ;A NON-EXISTENT DISK ERROR WITH OVERFLOW ;SET ; ;IF DISK 7 IS NOT THERE WE WILL ;JUST RECEIVE A NON-EXISTENT DISK ERROR ; ; ; ; STA103: BIS #BIT8,@DCS ;CLEAR THE DISK MOV #37,@DAE ;SET ALL EXT ADDR. BITS MOV #177777,@DAR ;SET DAR=TO ALL ONES MOV #177776,@WC ;WORD COUNT=-2 MOV #OUTBUF,@CMA ;CURRENT ADDRESS=OUTBUF BIS #3,@DCS ;GO WRITE CLR WORK WAFBUS: TSTжIF NO ERROR BIS #BIT9,FLAG ;SET ERROR BIT MOV @DAE,WORK ;REPORT ERROR BIC #177700,WORK ;MASK ADDRESS EXT. BITS. JSR %5,CONV ;CONVERT TO ASCII WORK MES1A 2 EMT+1 HED2 MOV @DCS,WORK ;TEST FOR READ BIC #177770,WORK CMP #4,WORK BNE DELMES ;IF READING REPORT WHICH READ MOV FLAG,WORK BIC #177774,WORK JSR %5,CONV WORK MES13 1 EMT+1 MES13 DELMES: MOV @DAR,WORK ;SET UP LOWER 16 BITS OF ADDR. DEC WORK JSR %5,CONV ;CONVERT TO ASCII WORK MES1 6 EMT+0 MES1зDRESS TEST ***** ; ;WRITE EACH UNIQUE ADDRESS ON ITSELF FOR TRACK 0 ;THEN READ IT BACK AND COMPARE FOR THE ;CORRECT DATA ; ; ADT3: CLR DMA ;CLEAR ACTIVE REG CLR TRACK CLR WORK CLR WORK1 MOV #1000,%6 ;SETUP STACK MOV #OUTBUF,BUF ;SET UP CURRENT ADDRESS MOV #2000,WRDCT ;SET UP WORD COUNT MOV #OUTBUF,%0 ;FILL BUFFER WITH COUNT INADB: MOV WORK,(0)+ INC WORK ;+1 COUNT CMP #OUTBUF+4000,%0 BNE INADB ;SET UP NEXT WORD MOV WORK,SAVE WRABF: BIS #BIT8,@DCS ;CLEAR THE DISK WORLD WRи IT. EXTRA BKS XXXXXX WRD ADDR XXXXXX BD DATA A B A=THE LOCATION IN MEMORY WHERE THE DATA WAS TRANSFERRED B=THE DATA THAT WAS TRANSFERRED 6.6 DISK ADDRESS ERROR DK ADDR ERR XXDAEXXXXXXDAR THE TERMINATING DISK ADDRESS AFTER THE TRANSFER WAS NOT CORRECT THE DAE AND DAR SHOULD EQUAL WHAT WAS REPORTED. CHECK THE RF11 PANEL FOR THE ERROR ADDRESS. 6.7 PROCESSOR TIME OUT CPU BKGRND TIMED OUT THIS MESSAGE WILL BE REPORTED IF THE DISK FAILS TO RAISE A BR REQйB @DCS ;IS RDY SET BMI STA104 ;YES EXIT INC WORK ;NO BUSY STILL SET BNE WAFBUS ;GO WAIT FOR BUSY=0 MOV @DCS,WORK ;FETCH CONTENTS OF DCS ERROR \N JSR %5,STAER ;REPORT BUSY SET BR STA103 ;RESTART ROUTINE STA104: BIT #BIT11,@DCS ;IS NCD SET BNE STA105 ;YES! IS ERROR SET MOV @DCS,WORK ;FETCH DCS ERROR \N JSR %5,STAER ;REPORT NEED NOT SET BR STA103 ;RESTART ROUTINE STA105: TST @DCS ;IS ERROR FLAG SET BMI LPSX103 ;ERROR IS SET MOV @DCS,WORK ;FETCH CONTENTS OF DCS ERROR \кA MES1 -1 MOV @DCS,WORK ;SET UP STATUS JSR %5,CONV WORK MES2 6 EMT+1 MES2 BIT #BIT14,@DCS ;TEST FOR HARD ERROR BEQ SOFTER ;GO AND CONTINUE SOFT ERROR MOV @DAE,WORK ;FETCH ERROR EXT. BITS SWAB WORK BIC #177400,WORK JSR %5,CONV ;CONVERT TO ASCII WORK MES2A 3 EMT+0 HED5A MES2A -1 BIS #BIT8,@DCS ;CLEAR THE DISK MOV #1000,%6 BIT #BIT10,@SR ;HALT ON ERROR BEQ .+4 HALT ;YES HALT BIT 10 SET IN SR JMP @HRDER ;EXIT HARD ERROR SOFTER: TST @WC ;CHECK FOлITE ;WRITE TSTB @DCS ;IS THE CONTROL READY BPL .-4 ;CONTROL READY TST @DCS ;IS THERE AN ERROR BPL TFBL ;NO ERROR MOV @DCS,WORK ;FETCH CONTENTS OF CONTROL REG MOV #6,ERCOUNT ;SET UP ERROR COUNT ER6: JSR %5,STAER ;REPORT CONTROL ERROR ;****WRD1=DISK CONTROL STATUS REG. AT THE TIME OF THE ERROR **** BR WRABF ;RE-WRITE DATA TFBL: MOV SAVE,WORK ADD #2000,DMA CMP #4000,WORK ;HAVE WE WRITTEN ALL OF TRACK 0 BNE INADB-4 CLR WORK CLR DMA CLR WORK1 RDTDN: BIS #BIT8,@DCS ;CLEAR THмUEST AFTER EXTENDED PERIOD OF TIME. 6.8 END END THIS MESSAGE IS REPORTED AT THE END OF ONE COMPLETE PASS OF THE DISK SYSTEM. 8. MISCELLANEOUS IN SOME ADDRESS TESTS THE PROGRAM DEPENS ON WRITTING AND READING DATA CORRECTLY FROM THE DISK,AND IF IT DOES NOT IT MAY REPORT AN ADDRESS FAILURE. WHEN IN FACT IT WAS A DATA FAILURE. 8.1 SUGGESTED POWER FAIL TEST THIS TEST IS SUGGESTED SO THAT THE ABILITY OF THE DISK TO RETAIN DATA AFTER A POWER FAILURE HAS OCCURRED MAY BE TESTED. нN JSR %5,STAER ;REPORT ERROR NOT SET BR STA103 ;RESTART ROUTINE LPSX103:SCOPE ;ENTER SCOPE LOOP STA103 ; ;IN THIS TEST THE FEATURE OF CURRENT ;ADDRESS INHIBIT IS TESTED ; ;DO A ONE WORD WRITE AND SEE ;IF CMA INCREMENTED AFTER THE X-FER ; ; ST105X: BIS #BIT8,@DCS ;CLEAR THE DISK MOV #OUTBUF,@CMA ;SET UP CURRENT ADDR MOV #-1,@WC ;SET WORD COUNT TO -1 BIS #BIT8,@DAE ;SET CURRENT ADDR. INHIBIT TSTB @DCS ;TEST FOR READY BMI LPX105 ;BRANCH IF READY SET ERROR \N JSR %5,STAER оR X-FER DONE BEQ INTEXT ;EXIT FROM ROUTINE BIT #BIT9,@SR BEQ .+6 SUB #2,(6) ;X-FER NOT DONE SET UP FOR RETURN BIT #BIT10,@SR ;HALT ON ERROR BEQ .+4 HALT ;YES HALT BIT10 SET IN SR BIS #BIT0,@DCS ;SET GO AND CONTINUE RTI ;RETURN TO WAIT INSTR. ; ; INTEXT: BIT #BIT13,@SR ;HALT ON COMPLETION FLAG BEQ .+4 HALT ;YES BIT 13 SET IN SR HALT BIT #BIT9,@SR BNE .+6 MOV #774,%6 ;RESET STACK RTI ;EXIT ; ; ; ; ;ROUTINE TO SET UP DAR AND DAE ;FROM SR AND CONVERSATION пE DISK READ TSTB @DCS ;IS THE CONTROL READY BPL .-4 ;YES THE CONTROL IS READY TST @DCS ;IS THERE AN ERROR BPL ADRCMP ;NO ERROR MOV #7,ERCOUNT ;SET UP ERROR COUNT MOV @DCS,WORK ;FETCH CONTROL REG. ER7: JSR %5,STAER ;REPORT CONTROL ERROR ;****WRD1=DISK CONTROL STATUS REG. AT THE TIME OF THE ERROR **** BR RDTDN ;RE-READ ADRCMP: MOV #OUTBUF,SAVE CMPNEX: CMP @SAVE,WORK1 ;IS THE ADDRESS CORRECT BEQ INCCMP ;COMPARE NEXT WORD MOV @SAVE,WORK ;FETCH LOAD ADDRESS MOV #10,ERCOUNT ;S FOLLOW THESE STEPS IF NO ERROR OCCURS, ONE PASS SHOULD BE SUFFICIENT: A) LOAD AND START PFT1 B) UPON RECEIVING "OK" FROM THE PROGRAM TURN OFF THE POWER TO THE MACHINE AND THEN BACK ON AGAIN. C) THERE SHOULD BE ATMOST ONE ERROR. ANY MORE IS CONSIDERED UNRELIABLE. D) PERFORM THE SAME STEPS WITH PFT2. THIS TIME THERE SHOULD BE NO ERRORS. с;REPORT READY NOT SET BR ST105X ;TRY AGAIN LPX105: MOV #3,@DCS ;GO WRITE TSTB @DCS ;TEST FOR NOT RDY BPL LPX106 ;BRANCH IF RDY=0 ERROR \N JSR %5,STAER ;REPORT RDY NOT CLEARED BY CMD. BR ST105X ;LOOP ON ERROR LPX106: CLR WORK WATRDY: TSTB @DCS BMI LPX107 ;BRANCH IF RDY SET INC WORK ;WAIT FOR RDY BNE WATRDY ERROR \N JSR %5,STAER ;READY NEVER SET AFTER X-FER BR ST105X ;LOOP ON ERROR LPX107: MOV #OUTBUF,WORK1 ;WHAT CMA SHOULD BE MOV @CMA,WORK ;WHAT CMA IS CMP WORK,WORK1т;ENTER FROM JSR %5,OPDSEL OPDSEL: BIT #BIT7,@SR ;DOES SR CONTAIN TRACK # BNE .+4 RTS %5 MOV @SR,WORK ;FETCH SR ROR WORK ROR WORK ROR WORK ROR WORK ROR WORK BIC #177774,WORK ;MASK AIGL ORDER 2 BITS MOV WORK,TRACK MOV @SR,WORK ROL WORK ROL WORK ROL WORK ROL WORK ROL WORK ROL WORK ROL WORK ROL WORK ROL WORK ROL WORK ROL WORK BIC #003777,WORK BIC #174000,DMA ADD WORK,DMA ;SET UP LOWER 16 BITS OF ADDRESS RTS %5 ;EXIT ; ;ROUTINE TO SETUP DISK BUFFERS ;уET UP ERROR COUNT ER10: JSR %5,STAER1 ;REPORT COMPARISON ERROR ;****WRD1=DISK ADDR. WANTED **** ;****WRD2=DISK ADDR. RECEIVED **** INCCMP: ADD #2,SAVE INC WORK1 CMP #OUTBUF+4000,SAVE ;IS IT THE LAST ADDR INBUF BNE CMPNEX ;COMPARE NEXT WORD CMP #4000,WORK1 ;IS IT THE LAST ADDR. OF TRACK BEQ LPADT3 ADD #2000,DMA ;SET UP FOR NEXT BUFFER BR RDTDN ;GO READ BUFFER LPADT3: BIT #BIT11,@SR ;LOOP ON TEST? BNE ADT3 ;YES BIT 11 SET IN SR ; ; ; ; ; ;RF11 TRACK SELECTION TEST ; ;WRITE THф .ENABLE ABS BIT0=1 BIT1=2 BIT2=4 BIT3=10 BIT4=20 BIT5=40 BIT6=100 BIT7=200 BIT8=400 BIT9=1000 BIT10=2000 BIT11=4000 BIT12=10000 BIT13=20000 BIT14=40000 BIT15=100000 ; ; ; WRITE=TRAP+3 WRCHECK=TRAP+7 READ=TRAP+5 .=0 .REPT 100 .+2 HALT .ENDR .=20 XWAIT ;BACKGROUND TEST VECTOR 0 .=30 EMTRP ;TTY VECTOR 340 DISK ;DISK CALLING VECTOR 340 .=200 JMP START DKINT ;DISK INTERRUPT VECTOR 200 ;DISK PRIORITY ;STATIC ROUTINES .=300 .=600 JMP ADT2 ;CHECKх ;COMPARE BEQ LPX108 ;BRANCH IF EQUAL ERROR \N JSR %5,STAER1 ;REPORT THEY DID NOT CMP BR ST105X ;LOOP ON ERROR LPX108: SCOPE ;ENTER SCOPE LOOP ST105X ; ;IN THIS ROUTINE THE ABILITY OF NON-EXISTENT ;MEMORY ERROR IS CHECK. ; ;TRANSFER TWO WORDS STARTING WITH THE ;LARGEST ADDRESSABLE MEMORY LOCATION IN THE ;PDP-11/20 ; ; NXMTSM: BIS #BIT8,@DCS ;CLEAR THE DISK MOV #340,@CSR ;LOCK UP PROCESSOR MOV #-2,@WC ;SET UP WORD COUNT MOV #177776,@CMA ;SET UP CURRENT ADDRESS BIS #63,@DцADD WORD COUNT TO STARTING DISK ADDRESSES ;COMPARE CALCULATED ADDRESS TO TERMINATING ADDRESS ; DISBUF: ADD WRDCT,DMA ;ADD WORD COUNT TO LOWER 16 BITS BCC COMDAR INC TRACK ;OVERFLOW ADD ONE TO TRACK COMDAR: CMP DMA,@DAR ;COMPARE LOWER 16 BITS BEQ CMDAE BIS #BIT6,FLAG ; CMDAE: MOV @DAE,WORK1 ;FETCH EXT. ADDR BITS BIC #177740,WORK1 ;MASK TRACK AND DISK ADDR MOV FLAG,WORK ;SET UP DISK ADDRESS BIC #177743,WORK ADD TRACK,WORK BIC #177740,WORK CMP WORK,WORK1 ;ARE THEY EQUAL BNE ERADRчE FIRST AND LAST ADDRESS OF EACH TRACK ;WITH THE OCTAL VALUE OF EACH TRACK ;BITS 0 THRU 6 EQUAL THE TRACK NUMBER ;BIT 15 RESET EQUALS ADDR 0 OF THE TRACK ;BIT 15 SET EQUALS ADDR 3777 OF THE TRACK ; ;AFTER WRITING THE DISK READ EACH ADDRESS ;AND COMPARE DATA FOR THE CORRECT VALUE ; ADT4: CLR DMA ;CLEAR WORK REGISTERS CLR TRACK CLR OUTBUF MOV #1000,%6 ;SETUP STACK BIS #BIT8,@DCS ;CLEAR THE DISK WORLD MOV #OUTBUF,BUF ;SET CURRENT ADDRESS MOV #1,WRDCT ;SET UP WORD COUNT INSWT: WRITE ;ш THAT WHEN A ;WORD IS WRITTEN IT ;DOES NOT ALTER ADJACENT ;WORDS ; ; JMP ADT3 ;WRITE EACH WORD ADDR ON ITSELF AND ;READ BACK TO COMPARE ; ; JMP ADT4 ;TRACK SELECTION TEST ; ; JMP ADT5 ;LOOK AHEAD TEST ; ; JMP SPIRAL ;SPIRAL TEST ; ; JMP XSPIRAL ;SPIRAL TEST EXTENSION ; ; JMP RANEX ;RANDOM ADDRESS, DATA AND ;WORD COUNT TEST ; ; JMP EXTMEN ;WRITE/WRITE CHECK DISK WITH ;EXTENDED MEMORY щCS ;ISSUE WRITE CLR WORK INCNEM: TST @DCS ;TEST FOR ERROR BMI TSTNEM ;BRANCH IF ERROR SET TSTB @DCS ;TEST FOR ERROR BMI RDYERX ;REPORT NEM NOT SET INC WORK ;WAIT FOR ERROR BNE INCNEM ERROR \N ;REPORT ERROR OR BUSY NOT SET MOV @DCS,WORK ;FETCH DCS FOR REPORT JSR %5,STAER ;REPORT ERROR BR NXMTSM ;LOOP ON ERROR RDYERX: ERROR \N MOV @DCS,WORK ;REPORT TIME OUT JSR %5,STAER ;CONTROL NEVER COMPLETED WRITE BR NXMTSM ;LOOP ON ERROR TSTNEM: BIT #BIT14,@DCS BNE HWDOK ;BRANCH Iъ ;ERROR IN DAE REG TSTB FLAG ;CHECK FOR LAST DISK BUFFER BPL EXTCME CLR DMA ;CLEAR LOWER 16 BITS CLR TRACK ;CLEAR EXT. ADDR. BITS. BIC #200,FLAG ADD #2,(6) ;INC STOCK POINTER MOV SWRDCT,WRDCT BR EXTDR ;EXIT EXTCME: BIC #177774,WORK1 ;MASK EXT. TRACK BITS CMP #3,WORK1 ;COMPARE FOR LAST TRACK BNE AKH ;NOT LAST TRACK EXIT MOV @DAR,WORK ;FETCH LOWER 16 BITS OF ADDRESS ADD WRDCT,WORK ;WILL DISK OVERFLOW BCC AKH BIS #200,FLAG MOV @DAR,WRDCT ;DISK WILL OVERFLOW COM WRDCT ыGO WRITE TSTB @DCS ;IS READY SET BPL .-4 ;YES! WAIT FOR NOT BUSY TST @DCS ;TEST FOR ERROR BPL TSTTK ;NO ERROR GO ON MOV #11,ERCOUNT ;SET UP ERROR COUNT MOV @DCS,WORK ;REPORT CONTENTS OF DCS REG ER11: JSR %5,STAER ;REPORT ERROR OCCURRED ;****WRD1=DISK CONTROL STATUS REG. AT THE TIME OF THE ERROR **** BR INSWT ;GO RE-WRITE TSTTK: CMP #100177,OUTBUF ;TEST FOR LAST ADDR. BEQ INSRD ;GO READ THE DATA BIT #BIT15,OUTBUF ;IS IT ADDR ZERO BNE MVNEM ;NO BIS #BIT15,OUTBUF ;YES! SET UP ь ; ; JMP PFT1 ;DISK WRITE POWER FAIL TEST ; ; JMP PFT2 ;DISK WRITE CHECK POWER FAIL TEST ; ; ;***MAINTENANCE ROUTINES*** ; ; JMP SELWC ;LOAD WORD COUNT REG. ;WITH SWITCH REGISTER ; ; JMP SELCMA ;LOAD CURRENT MEMORY ADDR ;REG. WITH SWITCH REGISTER ; ; JMP SELDAR ;LOAD DISK ADDR. REGISTER ;WITH SWITCH REGISTER ; ; JMP SELDAE ;LOAD DISK ADDR. EXT. ;WITH SWITCH REGISTER ; ; JMP SELDBR ;LOAD DATA BэF HARD ERROR SET ERROR \N MOV @DCS,WORK ;REPORT HWD NOT SET BY NEM JSR %5,STAER ;REPORT HWD NOT SET BR NXMTSM ;LOOP ON ERROR HWDOK: BIT #BIT10,@DAE ;TEST FOR NEM SET BNE CLRNEM ;NEM SET BE X-FER OK ERROR \N MOV @DAE,WORK ;REPORT HARD ERROR REGISTER JSR %5,STAER ;REPORT NEM NOT SET BY X-FER BR NXMTSM ;LOOP ON ERROR CLRNEM: BIS #BIT8,@DCS ;CLEAR THE DISK CMP #200,@DCS ;IS ERROR CLEARED BEQ CKHWD ;ERROR FLAG CLEARED ERROR \N MOV @DCS,WORK ;ERROR NOT CLEARED BY DISK CLEAR JSRю;SET UP NEW WORD COUNT INC WRDCT ;MAKE TWO'S COMP. AKH: MOV @DAE,TRACK BIC #177774,TRACK ;MASK TRACK BITS MOV @DAR,DMA ;LOWER 16 BITS OF ADDRESS BIT #BIT6,FLAG ;REPORT ADDRESS ERROR BNE .+4 EXTDR: RTS %7 ;EXIT ERADR: JSR %5,CONV ;CONVERT DMA REG COUNT TO ASCII DMA MES1 6 JSR %5,CONV ;CONVERT TRACK REG COUNT TO ASCII WORK1 MES1A 2 EMT +0 ;REPORT ERROR HED4 MES1A MES1 -1 BIC #BIT6,FLAG CLR DMA ;DISK ADDRESS ERROR RE-START PROG. CLR TRACK BIT #BIT10,@SR ;HALяFOR LAST ADDR ADD #3777,DMA ;SET UP FOR LAST ADDR BR INSWT ;GO WRITE MVNEM: BIC #BIT15,OUTBUF ;SET UP FOR ADDR ZERO INC OUTBUF ;INC. TO NEXT TRACK ADD #1,DMA ;INC. BAR BCC INSWT ;GO WRITE NO CARRY TO DAE INC TRACK ;INC. DAE REG. BR INSWT ;GO WRITE ; ;READ THE FIRST AND LAST ADDRESS OF EACH TRACK ;AND VERIFY IT HAS THE CORRECT DATA INSRD: CLR DMA ;CLEAR WORK REG. CLR TRACK CLR SAVE BIS #BIT8,@DCS ;CLEAR THE DISK WORLD MOV #INBUF,BUF ;SET UP CURRENT ADDR MOV #1,WRDCT №UFFER REGISTER ;WITH SWITCH REGISTER ; ; JMP MOVLK ;MOVE CONTENTS OF LOOK ;AHEAD REGISTER INTO DATA LIGHTS ; ; JMP SELDCS ;LOAD DISK CONTROL REGISTER ;WITH SWITCH REGISTER ; ; JMP STAMP ;ENABLE READ AMPLIFIERS ;TO TRACK SELECTED ;FROM SWITCH REGISTER ; ; ; ; ; ; ; ; ;RF11 DATA TEST ;VECTORS USED IN PROGRAM ;#1 LOC 204 DISK INTERRUPT ;#2 LOC 30 EMT (TELETYPE OUTPUT) ;#3 LOC 34 TRAP (DISK HANDLERS) ;#4 LOC 14 TRACE TRAP (Uё %5,STAER ;REPORT ERROR JMP NXMTSM ;LOOP ON ERROR CKHWD: BIT #BIT14,@DCS ;IS HARD ERROR SET BEQ CKNEM ;HWD CLEARED BY DISK CLEAR ERROR \N MOV @DCS,WORK ;REPORT HWD NOT CLEARED JSR %5,STAER ; JMP NXMTSM ;LOOP ON ERROR CKNEM: BIT #BIT10,@DAE ;IS NEM CLEARED BY DISK CLEAR BEQ LPNEM ;NEM CLEARED BY DISK CLEAR ERROR \N MOV @DAE,WORK ;REPORT NEM NOT CLEARED BY DISK CLEAR JMP NXMTSM ;LOOP ON ERROR LPNEM: SCOPE ;ENTER SCOPE LOOP NXMTSM ; ;IN THIS ROUTINE THE PROGRAM WILL TEST ђT ON ERROR BEQ .+4 HALT ;SWITCH 10 SET IN SR HALT RTS %7 ; ; ; ; ; ; ;ROUTINE TO SELECT DATA PATTERNS FOR TEST ; ;ENTER FROM JSR %5 PASEL ; PASEL: MOV PATNU,%0 ;SET UP PATTERN NUMBER MOV WRDCT,WORK ;SET UP WORK MOV #OUTBUF,%1 ;LOC. OF OUTBUFFER CMP #42,%0 ;TEST FOR RANDOM DATA NUMBER BEQ RANDOM ;GO GENERATE RANDOM DATA FILDAT: MOV PAT0(0),(1)+ ;FILL BUFFER DEC WORK ;DEC. WORK COUNT TST WORK ;TEST FOR LAST WORK BNE FILDAT ;LOAD NEXT WORD RTS %5 ;BUFFER FULL ; ѓ;SET UP WORD COUNT RDTKS: READ ;READ DATA TSTB @DCS ;CHECK FOR READY BPL .-4 ;CONTROL NOT READY TST @DCS ;IS THERE AN ERROR BPL CMPDTK ;NO ERROR MOV #12,ERCOUNT ;SET UP ERROR COUNT MOV @DCS,WORK ;FETCH CONTENTS OF DCS ER12: JSR %5,STAER ;REPORT CONTROL ERROR ;****WRD1=DISK CONTROL STATUS REG. AT THE TIME OF THE ERROR **** BR RDTKS ;GO RE-READ CMPDTK: CMP SAVE,INBUF ;IS DATA CORRECT BEQ CMNETK ;YES SETUP FOR NEXT WORD MOV SAVE,WORK1 ;CORRECT ADDRESS MOV INBUF,WORK ;INCORRECєSED IN BACKGROUND TEST) ;#5 LOC 20 IOT TRAP (USED IN CALLING BACKGROUND TEST) .=1000 .EVEN ; ;I/O ADDRESS POINTERS SR: 177570 ;SWITCH REGIISTER CSR: 177776 ;PROCESSOR STATUS REGISTER TPB: 177566 ;TELETYPE REGISTERS TKB: 177562 TPS: 177564 TKS: 177560 ; ;DISK I/O REGISTERS ; DCS: 177460 ;DISK CONTROL REGISTER WC: 177462 ;WORD COUNT REGISTER CMA: 177464 ;CURRENT ADDRESS REGISTER DAR: 177466 ;LOWER 16 BITS OF DISK ADDRESS DAE: 177470 ;EXTENSION ADDRESS REGISTER DBR: 1ѕ ;THAT THE DISK WILL ONLY TRAP ;AT BR5 ONLY WHEN A INTERRUPT IS GENERATED ;BY CLEARING THE DONE ;PROCESSOR OPERATING AT PRIORITY7 ; STA106: MOV #INT106,204 ;SET UP INTERRUPT VECTOR MOV #340,@CSR ;LOCK OUT ALL INTERRUPTS CLR @DAE ;CLEAR ADDRESS REGISTERS CLR @DAR MOV #177777,@WC ;SET WORD COUNT TO -1 MOV #OUTBUF,@CMA ;LOAD CURRENT ADDRESS BIS #103,@DCS ;GO WRITE (INTERRUPT ENABLED) CLR %0 ;WAIT FOR RDY INC %0 BNE .-2 TSTB @DCS ;IS CONTROL STILL NOT RDY BMI LP106 ;NO MOV @DCі;RANDOM DATA ; ; ; ; ;RANDOM DATA GENERATOR SUBROUTINE RANDOM: MOV LONUM,%0 ;SET UP R0 WITH 5 DIGITS LOW MOV HINUM,%4 ;SET UP R1 WITH 5 DIGITS HIGH MOV #7,%3 ;SET UP SHIFT COUNT CLR %2 ;CLEAR R2 SHIFT: ASL %0 ;SHIFT R0 LEFT AND ROL %4 ;ROTATE CARRY INTO LSB OF R1 INTO ROL %2 ;ROTATE CARRY OUT OF R1 INTO R2 DEC %3 ;DECREMENT R3 BNE SHIFT ;CONTINUE SHIFT LOOP ADD LONUM,%0 ;ADDN IN NUMBER TO MAKE X 129 ADC %4 ;PROPOGATE CARRY ADD HINUM,%4 ;ADDN IN NUMBER TO MAKE X 129 ADCїT DATA MOV #13,ERCOUNT ;SET UP ERROR COUNT ER13: JSR %5,STAER1 ;REPORT SELECTION ERROR ;****WRD1=TRACK ADDR. WANTED **** ;****WRD2=TRACK ADDR. RECEIVED **** CMNETK: CMP #100177,SAVE ;IS IT THE LAST ADDR BEQ LPTSK ;END OF TEST BIT #BIT15,SAVE ;IS IT ADDR 0 OF THE TRACK BEQ ZRBIT ;NO! SETUP FOR LAST ADDR BIC #BIT15,SAVE ;SET UP FOR ADDR ZERO INC SAVE ;INC FOR TRACK NO. ADD #1,DMA ;SET UP DAR BCC RDTKS ;GO READ NEXT TRACK ADDR INC TRACK ;INC TRACK BR RDTKS ;GO READ ZRBIT: BIS ј77472 ;DATA BUFFER REGISTER MA: 177474 ;MAINTENANCE REGISTER ADS: 177476 ;LOOK AHEAD REGISTER VECTOR: 204 ;INTERRUPT VECTOR ADDRESS STATUS: 206 ;DISK INTERRUPT STATUS PRIORITY:BIT7 ;DISK PRIORITY LEVEL ; ; ; ; ; ; ;RF11 DEDICATE REGISTERS (MEMORY) ; FLAG: 0 ;INTERNAL PROGRAM FLAG RANNU: 146723 ;RANDOM NUMBER PRIME WRDCT: 0 ;WORKING WORD COUNT TRACK: 0 ;WORKING DAE DMA: 0 ;WORKING DAR PATNU: 0 ;DATA PATTERN INDEX BUF: 0 ;WORKING DATA BUFFER (OUT-IN) TWRDCT: љS,WORK ;YES! ERROR \N JSR %5,STAER ;REPORT CONTROL STILL BUSY BR STA106 ;RESTART ROUTINE ; ;PROCESSOR SHOULD NOT TRAP TO INT106 ;PROCESSOR PRIORITY IS LOCKED AT 7 ; INT106: ERROR \N MOV @CSR,WORK ;FETCH PROCESSOR PRIORITY CMP (6)+,(6)+ JSR %5,STAER ;REPORT DISK INTERRUPTED BR STA106 LP106: SCOPE ;ENTER SCOPE LOOP STA106 ; ;IN THIS ROUTINE THE PROGRAM WILL TEST ;THAT THE DISK WILL ONLY TRAP ;AT BR5 ONLY WHEN A INTERRUPT IS GENERATED ;BY CLEARING THE DONE ;PROCESSOR OPERATIњ %2 ;PROPOGATE CARRY ADD #1057,%0 ;ADDN LOW CONSTANT ADC %4 ;PROPOGATE CARRIES ADC %2 ;PROPOGATE AGAN ADD #47401,%4 ;ADDN HIGH CONSTANT ADC %2 ;PROPOGATE CARRY ADD #6,%2 ;ADDN HIGHEST CONSTANT ADD %2,%0 ;REPRIME R0 WITH HIGH DIGIT ADC %4 ;PROPOGATE CARRY MOV %0,LONUM ;PUT R0 BACK IN LONUM MOV %0,(1)+ ;HOLD LONUM FOR PROGRAM DEC WORK BEQ EXGEN MOV %4,HINUM ;PUT R1 BACK IN HINUM MOV %4,(1)+ ;HOLD HINUM FOR PROGRAM DEC WORK BNE RANDOM EXGEN: RTS %5 ;RETURN T PROGRћ#BIT15,SAVE ;SET UP FOR LAST ADDR ADD #3777,DMA ;SET UP FOR LAST WORD BR RDTKS ;GO READ LAST ADDR OF TK LPTSK: BIT #BIT11,@SR ;IS BIT 11 SET IN SR BEQ .+6 ;YES LOOP ON TEST JMP ADT4 ; ;RF11 LOOK AHEAD TEST ;WRITE ONE WORD UPON RECEIPT OF ;NOT READY READ THE LOOK AHEAD ;REGISTER IT SHOULD CONTAIN THE ;ADDRESS +1 ; ADT5: CLR DMA ;CLEAR REGISTERS CLR TRACK CLR SAVE MOV #1000,%6 ;SETUP STACK MOV #1,WRDCT ;SET UP FOR ONE WORD X-FER MOV #OUTBUF,BUF ;SET UP CURRENT ADDRESS WRADT5ќ0 ;TEMP WORD COUNT TDMA: 0 ;TEMP DAR SWRDCT: 0 ;STANDARD WORD COUNT ERCOUNT:0 ;ERROR COUNT FOR MESSAGES. SAVE: 0 SAV1: 0 PASS: 0 DSKNOR: 0 HRDER: 0 ;POINTER FOR HARD ERROR PASSC: 0 ; ;RF11 WORK REGISTERS ;(CAN BE CHANGED IN ANY ROUTINE) WORK: 0 WORK1: 0 WORK2: 0 WORK3: 0 START: RESET ;CLEAR THE WORLD MOV #1000,%6 ;SET UP STACK MOV #340,@CSR ;LOCK UP INTERRUPT LEVELS CLR FLAG ;CLEAR PROGRAM FLAG CLR TRACK ;CLEAR TRACK REGISTERS CLR DMA ;CLEAR DAR REGISTERS §NG AT PRIORITY6 ; STA110: MOV #INT110,204 ;SET UP INTERRUPT VECTOR MOV #300,@CSR ;LOCK OUT ALL INTERRUPTS ABOVE CLR @DAE ;CLEAR ADDRESS REGISTERS CLR @DAR MOV #177777,@WC ;SET WORD COUNT TO -1 MOV #OUTBUF,@CMA ;LOAD CURRENT ADDRESS BIS #103,@DCS ;GO WRITE (INTERRUPT ENABLED) CLR %0 ;WAIT FOR NOT BUSY INC %0 BNE .-2 TSTB @DCS ;IS CONTROL STILL BUSY BMI LP110 ;NO MOV @DCS,WORK ;YES! ERROR \N JSR %5,STAER ;REPORT CONTROL STILL BUSY BR STA110 ;RESTART ROUTINE ; ;PROCESSOўAM LONUM: 0 HINUM: 0 ; ; ; ; ; ; ; .EVEN ; ;RF11 DATA PATTERNS ; PAT0: 0 PAT1: 177777 PAT2: 134510 PAT3: 043267 PAT4: 100000 PAT5: 107070 PAT6: 070707 PAT7: 052525 PAT10: 125252 PAT11: 177737 PAT12: 004102 PAT13: 136363 PAT14: 063636 PAT15: 000001 PAT16: 100005 PAT17: 000520 PAT20: 030303 ;PAT21 RANDOM DATA ; ; ; ;DATA COMPARISON ROUTINE ;IF AN ERROR OCCURS BETWEEN THE OUT-BUFFER AND ;THE IN-BUFFER AN ERROR WILL BE REPORTED IN THE ;FOLLOWING MANNER ;DATA ERROR Xџ: MOV #177476,%0 BIS #BIT8,@DCS ;CLEAR THE DISK WRITE ;WRITE 1$: MOV (%0),@#WORK ;FETCH LOOK AHEAD TSTB @#177460 ;IS THE CONTROL BUSY BPL 1$ ;CONTROL STILL BUSY TST @DCS ;IS THERE AN ERROR BPL LPADT5 ;NO DISK ERRORS MOV #14,ERCOUNT ;SET UP ERROR COUNT MOV @DCS,WORK ;FETCH DCS FOR REPORT ER14: JSR %5,STAER ;REPROT CONTROL ERROR ;****WRD1=DISK CONTROL REG AT THE TIME OF THE ERROR **** BR WRADT5 ;LOOP ON ERROR LPADT5: MOV DMA,WORK1 ;IS LOOK AHEAD CORRECT CMP WORK1,WORK BEQ INCCLR PATNU ;CLEAR PATTER COUNT MOV #1000,SWRDCT ;SET UP STANDARD WORD COUNT MOV SWRDCT,WRDCT TST @SR BMI CONM ;OPERATE UNDER PROGRAM CONTROL BIS #70000,FLAG JMP ADTST ;ENTER OPERATOR CONVERSATION MODE CONM: EMT +1 ;ASK ABOUT DATA TEST ONLY CON1 JSR %7,ALPHA ;GO WAIT FOR ANSWER CMP #153,TEXBUF ;TEST FOR YES BNE .+10 ;BRANCH IF NO BIS #BIT10,FLAG EMT +1 CON2 ;ASK ABOUT MULTI DISK MODE JSR %7,ALPHA ;GO WAIT FOR ANSWER CMP #153,TEXBUF ;TEST FOR YES BNE DATTES ;DO NOT ENR SHOULD NOT TRAP TO INT106 ;PROCESSOR PRIORITY IS LOCKED AT 6 ; INT110: ERROR \N MOV @CSR,WORK ;FETCH PROCESSOR PRIORITY CMP (6)+,(6)+ JSR %5,STAER ;REPORT DISK INTERRUPTED BR STA110 ; LP110: SCOPE ;ENTER SCOPE LOOP STA110 ; ;IN THIS ROUTINE THE PROGRAM WILL TEST ;THAT THE DISK WILL ONLY TRAP ;AT BR5 ONLY WHEN A INTERRUPT IS GENERATED ;BY CLEARING THE DONE ;PROCESSOR OPERATING AT PRIORITY5 ; STA112: MOV #INT112,204 ;SET UP INTERRUPT VECTOR MOV #240,@CSR ;LOCK OUT ALL INTERRUPTSX DAE XXXXXX DAR XXXXXX GOOD DATA XXXXXX BAD DATA ; ; COMPARE:CLR WORK2 ;WORD COUNT MOV #OUTBUF,SAVE ;SET UP OUTBUFFER POINTER MOV #INBUF,SAV1 ;SET UP IN BUFFER POINTER WRDCMP: CMP @SAVE,@SAV1 ;COMPARE BUFFERS BNE WDERR ;WORD IN ERROR WRDINC: INC WORK2 ;+1 WORD COUNT CMP WRDCT,WORK2 ;IS COMPLETE BUFFER CHECKED BEQ ADAM ;EXIT ROUTINE ADD #2,SAVE ADD #2,SAV1 BR WRDCMP ;COMPARE NEXT WORD ADAM: RTS %5 ;EXIT THIS ROUTINE ; WDERR: BIS #BIT9,FLAG ;SET ERROR BIT MOV DMA,WORK ;FETADS ;LOOK AHEAD OK DEC WORK ;COMPARE FOR ADDRESS+1 CMP WORK1,WORK ; BEQ INCADS ;BRANCH IF EQUAL INC WORK MOV #15,ERCOUNT ER15: JSR %5,STAER1 ;REPORT LOOK AHEAD INCORRECT ;****WRD1=DISK ADDR. WANTED FROM LOOK AHEAD REG. **** ;****WRD2=DISK ADDR. RECEIVED FROM DISK LOOK AHEAD REG. **** BR WRADT5 ;LOOP ON ERROR INCADS: CMP #3777,DMA ;IS IT THE LAST ADDR. BEQ XLPADT5 ;LAST ADDRESS EXIT INC DMA ;+1 DMA BR WRADT5 ;CHECK NEXT ADDRESS XLPADT5:BIT #BIT11,@SR ;LOOP ON TEST BNE ADT5 TER STATIC TEST BIS #BIT11,FLAG ;SET FLAG TO ENTER STATIC TEST DSKDR: EMT +1 CON3 JSR %7,NOCHA SUB #1,TEXBUF CMP #10,TEXBUF BLOS DSKDR MOV TEXBUF,DSKNOR ROL DSKNOR ROL DSKNOR BR ASKWC DATTES: EMT +1 CON4 ;ASK UNIT NUMBER JSR %7,NOCHA ;WAIT FOR NO. CMP #10,TEXBUF ;IS NO = O>10 BLOS DATTES ;NO CLC ROL TEXBUF ROL TEXBUF BIS TEXBUF,FLAG ASKWC: EMT +1 CON5 ;ASK ABOUT OPTIONAL WORD COUNT JSR %7,ALPHA ;WAIT FOR ANSWER CMP #153,TEXBUF BNE OPDAR ;ASK ABOUT OPTIO ABOVE CLR @DAE ;CLEAR ADDRESS REGISTERS CLR @DAR MOV #177777,@WC ;SET WORD COUNT TO -1 MOV #OUTBUF,@CMA ;LOAD CURRENT ADDRESS BIS #103,@DCS ;GO WRITE (INTERRUPT ENABLED) CLR %0 ;WAIT FOR NOT BUSY INC %0 BNE .-2 TSTB @DCS ;IS CONTROL STILL BUSY BMI LP112 ;NO MOV @DCS,WORK ;YES! ERROR \N JSR %5,STAER ;REPORT CONTROL STILL BUSY BR STA112 ;RESTART ROUTINE ; ;PROCESSOR SHOULD NOT TRAP TO INT106 ;PROCESSOR PRIORITY IS LOCKED AT 7 ; INT112: ERROR \N MOV @CSR,WORK ;FETCHCH STARTING DISK ADDR MOV TRACK,WORK1 ; ADD WORK2,WORK ;CALCULATE FAILING ADDR BCC .+6 ;SHOULD DAE BE INCREMENTED INC WORK1 MOV FLAG,WORK3 BIC #177743,WORK3 BIS WORK3,WORK1 JSR %5,CONV ;CONVERT WORD ADDR TO ASCII WORK MES1 6 JSR %5,CONV ;CONVERT TRACK ADDR TO ASCII WORK1 MES1A 2 MOV @SAVE,WORK ;FETCH GOOD DATA JSR %5,CONV ;CONVERT GOOD DATA TO ASCII WORK MES5 6 MOV @SAV1,WORK ;FETCH BAD DATA JSR %5,CONV ;CONVERT TO ASCII WORK MES6 6 MOV FLAG,WORK ;W;YES LOOP ON TEST BIT 11 SET ; SPIRAL TESTS ; ;WRITE THE LAST WORD OF TRACK ZERO ;AND THE FIRST WORD OF TRACK ONE ;USING ONE WORD X-FERS ;DATE = 52525 SPIRAL: BIS #BIT8,@DCS ;CLEAR THE DISK MOV #340,@CSR ;LOCK UP PROCESSING MOV #1000,%6 ;SETUP STACK MOV #1,WRDCT ;SET WORD COUNT TO 1 CLR TRACK MOV #3777,DMA ;LAST WORD OF TRACK ZERO MOV #52525,OUTBUF ;SET UP DATA MOV #OUTBUF,BUF WRITE ;WRITE LAST ADDR TK ZERO TSTB @DCS ;TEST FOR READY BPL .-4 ;CONTROL STILL BUSY TST @DCS NAL DAR WCCON: EMT +1 CON6 ;ASK LENGTH OF WC JSR %7,NOCHA TST TEXBUF BEQ WCCON CMP #1001,TEXBUF ;IS WORD COUNT>1000 BLOS WCCON ;YES ASK FOR COUNT AGAIN MOV TEXBUF,SWRDCT ;OPERATING WORD COUNT MOV SWRDCT,WRDCT OPDAR: EMT +1 CON7 ;ASK ABOUT OPTIONAL DAR JSR %7,NOCHA CMP #4000,TEXBUF ;3777 MAX DAR ADDR BLOS OPDAR MOV TEXBUF, DMA ;TEMP DAR REGISTER OPPAT: EMT +1 CON8 ;ASK ABOUT DATA PATTERNS JSR %7,NOCHA CMP #23,TEXBUF ;TEST FOR CORRECT NO BLOS OPPAT ;ASK AGAIN  PROCESSOR PRIORITY CMP (6)+,(6)+ JSR %5,STAER ;REPORT DISK INTERRUPTED BR STA112 ; LP112: SCOPE ;ENTER SCOPE LOOP STA112 ; ; ; ;THIS ROUTINE WILL TEST THE ABILITY OF THE DISK CONTROL ;TO TRAP AT BR5 WHEN THE DONE FLAG IS SET. ; STA114: BIS #BIT8,@DCS ;CLEAR THE DISK MOV #INT114,204 ;SET UP DISK TRAP VECTOR MOV #200,@CSR ;SET PROCESSOR TO PRIORITY 4 CLR @DAE ;CLEAR EXT ADDRESS BITS CLR @DAR ;CLEAR LOW ORDER ADDRESS BITS MOV #177777,@WC ;SET WORD COUNT TO -1 MOV #OUTBUF,@CM HICH READ THE BIC #177774,WORK ;ERROR OCCURRED ON JSR %5,CONV WORK MES13 1 EMT +0 ;PRINT MESSAGE HED1 MES13 MES1A MES1 MES5 MES6 -1 BIT #BIT10,@SR ;HALT ON ERROR BEQ .+4 HALT ;YES HALT BIT 10 SET IN SR BR WRDINC ;GO COMPARE NEXT WORD ; ; ; ; ; ; ; ;ROUTINE TO ZERO DATA INPUT BUFFER ;ZERO BUFFER BEFORE READING ; ; ZBUF: MOV #INBUF,%4 ;FETCH START OF INBUFFER NZUF: CMP %4,#INBUF+2000 ;IS THE ROUTINE COMPLETE BNE CLEAR ;ZERO NEXT WORD RTS %5 ;EXIT R BPL SPIL1 MOV #16,ERCOUNT MOV @DCS,WORK ER16: JSR %5,STAER ;****WRD1=DISK CONTROL STATUS REG. AT THE TIME OF THE ERROR **** BR SPIRAL SPIL1: INC DMA WRITE ;WRITE FIRST ADDR. TK 1 TSTB @DCS ;WAIT FOR READY BPL .-4 ;CONTROL STILL BUSY TST @DCS BPL SPIL2 MOV #17,ERCOUNT MOV @DCS,WORK ER17: JSR %5,STAER ;****WRD1=DISK CONTROL STATUS REG. AT THE TIME OF THE ERROR **** BR SPIRAL SPIL2: INC WRDCT ;SET UP FOR TWO WORD X-FER MOV #3777,DMA ;START AT ADDR 3777 MOV #INBUF,BUF ;  CMP #22,TEXBUF BEQ OPWRT ;DATA PATTERN UNDER PROGRAM CONTROL BIS #BIT15,FLAG ;SET PROGRAM FLAG MOV TEXBUF, PATNU ;OPERATOR WANTS TO SELECT DATA CLC ROL PATNU BIC #70000,FLAG ;CLEAR OP MODE BITS IN FLAG OPWRT: EMT +1 CON9 ;ASK ABOUT WRITE JSR %7,ALPHA CMP #153,TEXBUF ;TEST FOR YES BNE OPWCK ;ASK ABOUT WRITE CHECK BIS #BIT14,FLAG ;YES SET FLAG BIT OPWCK: EMT +1 CON10 ;ASK ABOUT WRITE CHECK JSR %7,ALPHA CMP #153,TEXBUF ;TEST FOR YES ANSWER BNE OPRD ;GO ASK ABOUT READ A ;LOAD CURRENT ADDRESS BIS #103,@DCS ;WRITE (INTERRUPT ENABLE CLR %0 INC %0 ;WAIT FOR INTERRUPT TO OCCUR BNE .-2 ERROR \N MOV @DCS,WORK ;FETCH CONTENTS OF DCS JSR %5,STAER ;REPORT INTERRUPT NO INTERRUPT BR STA114 ;RESTART ROUTINE ; ; ; INT114: CMP (6)+,(6)+ ;TRAP OK SCOPE ;ENTER SCOPE LOOP STA114 ;* * * ADDRESS TEST 1 * * * ;EXECUTE A ONE WORD WRITE ;IF THE TIMING ON THE DISK IS CORRECT ;THE TERMINATING ADDRESS IN THE DAR REGISTER ;WILL EQUAL THE ADDRESS +1 OF THE WORD ;OUTINE CLEAR: CLR (4)+ ;CLEAR THE WORD BR NZUF ; ; ; ; ;ROUTINE TO TEST FOR ADDITIONAL DATA TRANSFERS ;ANY DATA TRANSFERRED AFTER WORD COUNT OVERFLOW IS AN ERROR ; ; OVRFLO: MOV WRDCT,%4 ;ADD WORD COUNT ROL %4 ADD #INBUF,%4 CHWRD: CMP %4,#INBUF+2000 ;IS TEST COMPLETE BNE CKNEX ;CHECK NEXT WORD RTS %5 ;TEST IS COMPLETE CKNEX: TST (4)+ ;TEST FOR ZERO WORD BEQ CHWRD ;WORD IS ZERO BIS #BIT9,FLAG ;SET ERROR BIT MOV %4,ACNVX SUB #2,ACNVX JSR %5,CONV ;CONVERT 1 OCTAL TO ASCIREAD ;READ DATA TSTB @DCS ;TEST FOR READY BPL .-4 ;CONTROL STILL BUSY TST @DCS BPL SPIL3 MOV #20,ERCOUNT MOV @DCS,WORK ER20: JSR %5,STAER ;****WRD1=DISK CONTROL STATUS REG. AT THE TIME OF THE ERROR **** BR SPIRAL SPIL3: CMP #52525,INBUF ;CMP ADDR DAR 3777 BEQ CMPX1 ;COMPARE SECOND WORD MOV #21,ERCOUNT ;SETUP ERROR COUNT MOV INBUF,WORK ;INCORRECT DATA MOV #52525,WORK1 ;CORRECT DATA ER21: JSR %5,STAER1 ;REPORT ADDR 377 HAE BAD DATA ;****WRD1=THE DATA THAT SHOULD HAVE BEEN IN  BIS #BIT13,FLAG ;YES SET FLAG BIT OPRD: EMT +1 CON11 ;ASK ABOUT READ JSR %7,ALPHA CMP #153,TEXBUF ;TEST FOR YES ANSWER BNE CHKFLG BIS #BIT12,FLAG ;SET FLAG TO READ CHKFLG: BIT #70000,FLAG BEQ OPWRT ; ; ; ADTST: BIT #BIT11,FLAG ;ARE WE IN MULTI DISK MODE BEQ EXMFLG ;BRANCH IF NO. EMT +1 MES11 MOV FLAG,ACNVX ROR ACNVX ROR ACNVX BIC #177770,ACNVX ;FETCH DISK # JSR %5,CONV ACNVX MES12 1 EMT +1 MES12 EXMFLG: BIT #BIT10,FLAG ;TEST FOR DATA TEST ONLY BEQ .+6 ;DTHAT WAS WRITTEN ; ;NOTE: DATA IS NOT CHECKED IN THIS TEST. ; ADT1: MOV #1000,%6 ;SET UP STACK MOV #1,WRDCT ;SET UP WORD COUNT MOV #OUTBUF,BUF ;SET UP CURRENT ADDRESS CLR DMA CLR TRACK WRADT: BIS #BIT8,@DCS ;CLEAR THE DISK WRITE TSTB @DCS ;CHECK FOR READY BPL .-4 TST @DCS ;CHECK FOR ERROR BPL CHKADT ;BRANCH IF NO ERROR MOV @DCS,WORK ERROR \N JSR %5,STAER ;REPORT ERROR BR WRADT ;LOOP ON ERROR CHKADT: MOV DMA,WORK1 INC WORK1 ;WHAT DAR SHOULD CONTAIN MOV @DAR,WORK CI ACNVX ;ADDRESS MES4 6 MOV %4,ACNVX SUB #2,ACNVX MOV @ACNVX,ACNVX JSR %5,CONV ;CONVERT OCTAL TO ASCII ACNVX ;DATA MES6 6 EMT +0 ;CALL TYPE OUT ROUTINE HED3 MES4 MES6 -1 BR CHWRD ;FETCH NEXT WORD ; ; ; ; ; ; ;EXTENDED MEMORY EXERCISER ;THE PROGRAM DETERMINES HOW MUCH MEMORY ;IS ON THE SYSTEM THEN IT ;GENERATES A RANDOM BUFFER THAT SIZE ;AND WRITES AND WRITE CHECKS THE DATA ; EXTMEN: BIS #BIT8,@DCS ;CLEAR THE DISK MOV #340,@CSR ;LOCK UP PRIORITY LEVEADDR. 3777**** ;****WRD2=THE DATA READ FROM ADDR. 3777**** BR SPIRAL ;LOOP ON ERROR CMPX1: CMP #52525,INBUF+2 ;COMPARE NEXT WORD BEQ LPSPI1 ;BRANCH IF DATA OK MOV #22,ERCOUNT ;SETUP ERROR COUNT MOV #52525,WORK1 ;CORRECT DATA MOV INBUF+2,WORK ;DATA READ FROM ADDR0 TK1 ER22: JSR %5,STAER1 ;REPORT ERROR ;****WRD1=THE DATA THAT SHOULD BE IN ADDR. 0 OF TRACK 1 **** ;****WDR2=THE DATA READ FROMADDR.0 OF TRACK 1 **** BR SPIRAL ;LOOP ON ERROR LPSPI1: BIT #BIT11,@SR ;LOOP ON TEST? BNE SPIRALO COMPLETE TEST JMP DATAT ;DO DATA TEST ONLY ;***ADDRESS ADT2*** ; ;IN THIS TEST WRITE TRACK ZERO WITH ZERO'S ;THEN WRITE ALL ONES IN AN ADDRESS ;CHECK IF WRITING ONES IN THAT ADDRESS ALTERED ;ANY OTHER ADDRESS IN THE TRACK ;FOLLOW THIS PROCEDURE FOR ADDRESSES 0 TO 3777 ; ; ADT2: MOV #1000,%6 ;SET UP STACK MOV #2000,WRDCT ;SET UP WORD COUNT MOV #OUTBUF,BUF ;SET UP CURRENT ADDRESS MOV PATNU,SAVE CLR PATNU CLR TRACK CLR DMA JSR %5,PASEL ;SET UP DATA BUFFER MOV SAVE,PATNMP WORK1,WORK ;IS DAR CORRECT BEQ INCDAR ;YES DAR IS CORRECT ERROR \N JSR %5,STAER1 ;REPORT DAR NOT CORRECT BR WRADT ;LOOP ON ERROR INCDAR: CMP #4000,WORK1 ;IS IT THE LAST ADDR. BEQ LPADT ;LAST ADDRESS EXIT MOV WORK1,DMA ;SET UP FOR NEXT ADDR. JMP WRADT ;CHECK NEXT ADDRESS LPADT: BIT #BIT11,@SR ;LOOP ON TEST BEQ .+6 ;NO: JMP ADT1 ;YES! BIT11 SET IN SR ; ; ; ; ; ;* * * ADDRESS TEST 2X * * * ;EXECUTE A ONE WORD READ ;IF THE TIMING ON THE DISK IS CORRECT ;THE TERMINATING ALS MOV #1000,%6 MOV #MAXREF,4 ;SET UP I/O BUS TRAP MOV #340,6 MOV #17446,SAVE ;SET UP FOR 4K EXREF: TST @SAVE ;REFERENCE MEMORY CMP #177446,SAVE ;TEST FOR GREATER THAN 28K BNE .+6 ;BRANCH IF LESS THAN 32K HALT BR MAXREF ;LAST REFERENCE MADE TO I/O REG. ADD #20000,SAVE ;SET UP FOR NEXT MEMORY REF. BR EXREF ;GO REFERENCE MEMORY ; ;ENTER HERE WHEN I/O BUS ERROR OCCURS ; MAXREF: MOV #6,4 ;RESTORE I/O BUS TRAP CLR 6 MOV #1000,%6 SUB #20000,SAVE ; SUB #OUTBUF,SAVE ;SET UP N ;YES BIT 11 SET IN SR ; ; ; ; ; ; ; SPIRAL TEST EXT. ; ;WRITE TWO WORDS OF DATA ;STARTING WITH THE LAST ADDRESS OF TRACK0 ;DATA PATTERN = 25252 ;THEN READ THE DATA DOING ONE WORD ;X-FERS XSPIRAL: BIS #BIT8,@DCS ;CLEAR THE DISK MOV #340,@CSR ;LOCK UP PROCESSING MOV #1000,%6 ;SET UP STACK MOV #25252,OUTBUF ;SET UP DATA WORD 1 MOV #25252,OUTBUF+2 ;SET UP DATA WORD 2 MOV #2,WRDCT ;SET UP WORD COUNT MOV #OUTBUF,BUF ;SET UP CMA CLR TRACK ;SET UP DISK ADDR. MOV #3777,DMA WRITEU ;****WRITE DISK ADDR. 0 TO 1777 WITH ZEROES **** RFADT: BIS #BIT8,@DCS WRITE TSTB @DCS ;TEST FOR READY BPL .-4 TST @DCS ;TEST FOR ERROR BPL RFADTX-6 MOV #1,ERCOUNT ;ERROR OCCURRED MOV @DCS,WORK1 ;FETCH DCS REGISTER MOV @DAR,WORK DEC WORK ER1: JSR %5,STAER1 ;REPORT ERROR OCURRED ;****WRD1=CONTROL STATUS REG. AT THE THE TIME OF THE ERROR **** ;****WRD2=DISK ADDR. AT THE TIME OF THE ERROR **** BR RFADT ;LOOP ON ERROR MOV #2000,DMA ;****WRITE DISK ADDR. 2000 TO 3777 WITH ZEROEDDRESS IN THE DAR REGISTER ;WILL EQUAL THE ADDRESS +1 OF THE WORD ;THAT WAS READ ;NOTE: DATA IS NOT CHECK IN THIS TEST. ; ADT2X: MOV #1000,%6 ;SET UP STACK MOV #1,WRDCT ;SET UP WORD COUNT MOV #INBUF,BUF ;SET UP CURRENT ADDRESS CLR DMA CLR TRACK ROADT: BIS #BIT8,@DCS ;CLEAR THE DISK READ TSTB @DCS ;CHECK FOR READY BPL .-4 TST @DCS ;CHECK FOR ERROR BPL XCHKDT ;BRANCH IF NO ERROR MOV @DCS,WORK ERROR \N JSR %5,STAER ;REPORT ERROR BR ROADT ;LOOP ON ERROR XCHKDT: MOV DMA,WOREW WORD COUNT MOV SAVE,SWRDCT ROR SWRDCT MOV SWRDCT,WRDCT MOV #BIT7,@CSR ;SET UP PRIORITY LEVEL MOV #NEWBUF,HRDER ;SET UP FOR HARD ERROR CLR DMA CLR TRACK NEWBUF: MOV WRDCT,WORK ;SET UP FOR RANDOM BUFFER MOV #OUTBUF,%1 JSR %5,RANDOM ;NEW DATA BUFFER GENERATED MOV #OUTBUF,BUF WRITE+100 ;WRITE BUFFER BIT #BIT9,@SR BNE .+6 IOT BR .+12 MOV PRIORITY,@CSR WAIT WRCHECK+100 ;WRITE CHECK DATA BIT #BIT9,@SR BNE .+6 IOT BR .+12 MOV PRIORITY,@CSR WAIT JSR %7,DISBUF ;WRITE DATA TSTB @DCS ;TEST FOR READY BPL .-4 ;CONTROL STILL BUSY TST @DCS ;TEST FOR ERROR BPL X1SPIL ;BRANCH IF NO ERROR MOV @DCS,WORK MOV #23,ERCOUNT ;SET UP ERROR COUNT ER23: JSR %5,STAER ;REPORT CONTROL ERROR ;****WRD1=DISK CONTROL STATUS REG. AT THE TIME OF THE ERROR **** BR XSPIRAL X1SPIL: DEC WRDCT ;SET UP FOR 1 WORD X-FER MOV #3777,DMA ;SET UP DAR MOV #INBUF,BUF ;SET UP CMA READ ;READ DAR 3777 TSTB @DCS ;TEST FOR NOT READY BPL .-4 ;CONTROL STILL BUSY TST @DS **** RFADTX: BIS #BIT8,@DCS ;CLEAR THE DISK WRITE TSTB @DCS ;TEST FOR READY BPL .-4 TST @DCS ;TEST FOR ERROR BPL RFRD-4 MOV @DAR,WORK DEC WORK MOV @DCS,WORK1 ;FETCH DCS REGISTER MOV #2,ERCOUNT ;SETUP ERROR COUNT ER2: JSR %5,STAER1 ;REPORT DISK ERROR ;****WRD1=DISK CONTROL STATUS REG. AT THE TIME OF THE ERROR **** ;****WRD2=DISK ADDR. REG AT THE TIME OF THE ERROR **** BR RFADTX ;LOOP ON ERROR CLR SAV1 RFRD: CLR SAVE WONWD: MOV #-1,#-1 MOV #WONWD+4,BUF MOV #1,WRDCT K1 INC WORK1 ;WHAT DAR SHOULD CONTAIN MOV @DAR,WORK CMP WORK1,WORK ;IS DAR CORRECT BEQ ADDAR ;YES DAR IS CORRECT ERROR \N JSR %5,STAER1 ;REPORT DAR NOT CORRECT BR ROADT ;LOOP ON ERROR ADDAR: CMP #4000,WORK1 ;IS IT THE LAST ADDR. BEQ LPADT2 ;LAST ADDRESS EXIT MOV WORK1,DMA ;SET UP FOR NEXT ADDR JMP ROADT ;CHECK NEXT ADDRESS LPADT2: BIT #BIT11,@SR ;LOOP ON TEST BEQ .+6 ;NO: JMP ADT2X ;YES! BIT11 SET IN SR ; ; ; ; ; EMT+1 ;REPORT END END JMP STAI1 ;RESTART T ;SET UP NEW DISK BUFFER BR NEWBUF ;GO WRITE NEW BUFFER BR NEWBUF-10 ;DISK COMPLETE START AGAIN ; ;BACKGROUND TEST FOR INTERRUPTS ; XWAIT: MOV #RTIX,14 ;SET UP TRACE TRAP CLR 16 MOV #-1000,PASS ;SET UP TIME BASE BIS #BIT4,@CSR ;SET TRACE BIT CLR #0 XINCW: INC XINCW-2 TSTB XINCW-2 BPL XINCW INC PASS BEQ .+4 BR XINCW-4 ;REPORT BACKGROUND TEST TIMED OUT MOV #340,@CSR BIC #BIT4,@CSR ;CLEAR TRACE BIT EMT+1 TIMO HALT ; RTIX: RTI ;RF11 POWER FAIL TEST "1 ; DISK ZECS ;TEST FOR ERROR BPL X2SPIL ;BRANCH IF NO ERROR MOV #24,ERCOUNT ;SET UP ERROR COUNT MOV @DCS,WORK ;REPORT CONTROL REG ER24: JSR %5,STAER ;****WRD1=DISK CONTROL STATUS REG. AT THE TIME OF THE THE ERROR **** BR XSPIRAL ;LOOP ON ERROR X2SPIL: CMP #25252,INBUF ;IS ADDR 3777 CORRECT BEQ X3SPIL ;BRANCH IF NOT EQUAL MOV #25,ERCOUNT ;SET UP ERROR COUNT MOV #25252,WORK1 ;GOOD DATA MOV OUTBUF,WORK ;DATA DATA ER25: JSR %5,STAER1 ;REPORT ERROR ;****WRD1=THE DATA THAT SHOULD BE IN ADDR.3777  MOV SAV1,DMA BIS #BIT8,@DCS WRITE TSTB @DCS ;TEST FOR READY BPL .-4 TST @DCS ;TEST FOR ERROR BPL SUADB ;BRANCH IF NO CONTROL ERROR MOV @DCS,WORK1 MOV SAV1,WORK MOV #3,ERCOUNT ;SETUP ERROR COUNT ER3: JSR %5,STAER1 ;REPORT ERROR ;****WRD1=DISK CONTROL STATUS AT THE TIME OF THE ERROR**** ;****WRD2=DISK ADDR. IN ERROR WHEN TRYING TO WRITE ALL ONES **** BR WONWD ;RE-WRITE WORD SUADB: TST SAVE BEQ CHKZER CMP #2000,SAV1 BHI WRCADT BUFIND: MOV SAV1,%0 ROL %0 BIC #174001,%0!EST ; ;SCOPE LOOP ROUTINE ;IF BIT 11 SET LOOP ON TEST ; LOOP: BIT #BIT11,@SR ;TST FOR BIT 11 BEQ .+6 ;BIT 11 NOT SET MOV @(6)+,-(6) RTI ;BIT 11 SET! LOOP ON TEST TST PASS ;TEST TO SET UP PASS COUNT BNE .+10 ;PASS COUNT SET MOV #25,PASS ;SET UP PASS COUNT DEC PASS ;SUB. -1 EACH PASS BEQ .+6 MOV @(6)+,-(6) RTI ;LOOP ON TEST ADD #2,(6) ;INDEX POINTER FOR NEXT TEST RTI ;EXIT TO NEXT TEST ; ; ; ; ; ;ENTER DISK HANDLER BY THE TRAP INSTRUCTION ;ARGUMENT TO TRAP I"RO ; WRITE COMPLETE DISK WITH 125252 PATTERN ; REPORT "OK" ;START WRITING THE SAME PATTERN ;WHEN POWER FAIL OCCURS ABORT TRANSFER ;SETUP NEW ENTRY POINT AND HALT ; ;POWER UP AND WRITE CHECK THE DISK FOR ERRORS ; ;***ONLY ONE ERROR IS CONSIDERED ACCEPTABLE*** ; ; PFT1: MOV #1000,%6 ;SET UP STACK JSR %7,POWFAL ;WRITE 125252 ON DISK PFWAT: BIS #BIT8,@DCS ;CLEAR DISK CLR DMA CLR TRACK MOV #PFWAT,HRDER ;SET UP FOR HARD ERROR MOV #DOWN,24 ;SET UP POWER FAIL VEC. MOV #340,26 MYBYWR: WRI#OF TRACK 0 **** ;****WRD2=THE DATA THAT WAS READ FROM ADDR. 3777 OF TRACK 0 **** BR XSPIRAL ;LOOP ON ERROR X3SPIL: INC DMA ;SET UP TO READ ADDR 4000 READ ;READ DATA TSTB @DCS ;TEST FOR READY BPL .-4 ;CONTROL STILL BUSY TST @DCS ;TEST FOR ERROR BPL X4SPIL ;BRANCH IF NO ERROR MOV #26,ERCOUNT ;SET UP ERROR COUNT MOV @DCS,WORK ;REPORT CONTROL REG. ER26: JSR %5,STAER ;REPORT ERROR ;****WRD1=DISK CONTROL STATUS REG. AT THE TIME OF THE ERROR **** BR XSPIRAL ;LOOP ON ERROR X4SPI$ MOV #-1,OUTBUF(0) BR WRCADT CHKZER: CMP #2000,SAV1 BHI BUFIND WRCADT: BIS #BIT8,@DCS MOV #2000,WRDCT ;SETUP WORD COUNT MOV #OUTBUF,BUF ;SETUP CURRENT ADDR MOV SAVE,DMA ;SETUP DISK ADDRESS WRCHECK TSTB @DCS ;CHECK FOR READY BPL .-4 TST @DCS ;TEST FOR ERROR BPL CHKBUF ;BRANCH NO DISK ERROR MOV @DCS,WORK1 MOV SAV1,WORK DEC WORK MOV #4,ERCOUNT ;SET UP ERCOUNT ER4: JSR %5,STAER1 ;REPORT ERROR MOV @DAR,ACNVX ;SET UP DISK ADDR. FOR REPORT JSR %5,CONV ACNVX MES4 6 %NSTRUCTION IS TWO ORDER ;BYTE OF THE CONTROL REGISTER. ; DISK: MOV DBR,%5 ;SET UP TO LOAD DISK REG MOV TRACK,-(5) ;LOAD TRACK NUMBER MOV DMA,-(5) ;LOAD WORD ADDRESS MOV BUF,-(5) ;SET UP CURRENT ADDRESS MOV WRDCT,-(5) ;LOAD WORD COUNT COM (5) ;SET UP TWO'S COMPLEMENT INC (5) MOV (6),%4 MOV -(4),WORK ; BIC #177600,WORK ;MASK FUNCTION BITS MOV WORK,-(5) ;LOAD FUNCTION REG. RTI ;RETURN FROM TRAP ; ; ; ; ; ; ; ; ; ; ; ; ; ;ROUTINE TO ALLOW THE OPERATOR TO SET BITS &TE +100 BIT #BIT9,@SR BNE .+6 IOT BR .+12 MOV PRIORITY,@CSR WAIT JSR %7,DISBUF ;SET UP NEW DISK BUFFER BR MYBYWR BR PFWAT ;ROUTINE TO CHECK DATA AFTER POWER FAIL ; UPCHK: BIS #BIT8,@DCS ;CLEAR THE DISK CLR DMA CLR TRACK MOV #UPCHK,HRDER ;SET UP FOR HARD ERROR CHKDAT: WRCHECK +100 BIT #BIT9,@SR BNE .+6 IOT BR .+12 MOV PRIORITY,@CSR WAIT JSR %7,DISBUF ;SET UP NEW DISK BUFFER BR CHKDAT JMP PFWAT ;GO WAIT FOR ANOTHER ;POWER FAIL ; ;POWER DOWN ROUTINE ;'L: CMP #25252,INBUF ;CMP DATA BEQ LPXSPIL ;BRANCH IF DATA OK MOV #27,ERCOUNT ;SET UP ERROR COUNT MOV #25252,WORK1 ;GOOD DATA MOV INBUF,WORK ;DATA DATA ER27: JSR %5,STAER1 ;REPORT ERROR ;****WRD1=THE DATA THAT SHOULD BE IN ADDR. 0 OF TRACK 1 **** ;****WRD2=THE DATA THAT WAS READ FROM ADDR. 0 OF TRACK 1 **** BR XSPIRAL ;LOOP ON ERROR LPXSPIL:BIT #BIT11,@SR ;LOOP ON TEST? BNE XSPIRAL ;YES BIT11 SET IN SR, CLRREG: CLR DMA ;CLEAR WORD ADDRESS CLR TRACK ;CLEAR TRACK ADDRESS ; ; ; ; (EMT +1 MES4 ;****WRD1=DISK CONTROL STATUS REG. AT THE TIME OF THE ERROR **** ;****WRD2=DISK ADDR. IN ERROR DURING WRITE CHECK **** ;****WRD ADDR.=ADDR. WHICH CONTAINS ALL ONES **** BR WRCADT CHKBUF: MOV SAV1,%0 ROL %0 BIC #174001,%0 CLR OUTBUF(0) TST SAVE BNE ZEROAD ;RE-WRITE ADDRESS TO ZERO MOV #2000,SAVE BR SUADB ZEROAD: CLR SAVE ; MOV SAV1,DMA ;SETUP DISK ADDRESS CLR #0 ;SET UP DATA MOV #.-2,BUF ;SETUP CURRENT ADDRESS MOV #1,WRDCT ;SETUP WORD COUNT WRITE TSTB );IN THE I/O REGISTERS VIA THE SWITCH REGISTER ; ;WORD COUNT REGISTER SELWC: MOV @SR,@WC ;MOV SR INTO WORD COUNT REG BR SELWC ; ;CURRENT ADDRESS REGISTER SELCMA: MOV @SR,@CMA ;MOV SR INTO CURRENT ADDR REG BR SELCMA ; ;DISK ADDRESS REGISTER SELDAR: MOV @SR,@DAR ;MOV SR INTO DISK ADDR REG BR SELDAR ; ;DISK ADDRESS EXT AND ERROR REGISTER SELDAE: MOV @SR,@DAE ;MOV SR INTO DISK ADDR EXT REG BR SELDAE ; ;DATA BUFFER REGISTER SELDBR: MOV @SR,@DBR ; MOV SR INTO DATA BUFFER BR SELDBR ; *ABORT DISK AND HALT ; ; DOWN: BIS #BIT8,@DCS ;ABORT DISK MOV #UP,24 ;SET POWER FAIL VECTOR HALT ; UP: MOV #DOWN,24 MOV #1000,%6 MOV #-300.,WORK ;SET UP TWENTY SECOND TIMER TIMCNT: RESET INC WORK ;+1 TIMER BNE TIMCNT ;TWO SECONDS NOT UP GO WAIT JMP UPCHK ;GO CHECK DISK ; ; ; ; ; ; ;POWER FAIL TEST #2 ;DISK ZERO ;WRITE COMPLETE DISK WITH 125252 PATTERN ;REPORT "OK" ;WRITE CHECK DISK AND WAIT FOR POWER FAIL ;WHEN POWER COMES BACK WRITE CHECK DISK AGAIN ;AND CHECK FOR ERR+; ; ; ; ; ; DATAT: MOV SWRDCT,WRDCT MOV #LDAT,HRDER ;SETUP FOR HARD ERROR MOV #340,@CSR ;LOCK UP PROCESSOR PRIORITY JSR %5,PASEL ;SET UP DATA BUFFERS LDAT: JSR %5,OPDSEL ;SET UP DISK ADDRESS BIT #BIT14,FLAG ;TEST FOR WRITE BEQ SLH ;TEST FOR WRITE CHECK MOV #OUTBUF,BUF ;SETUP OUTPUT BUFFER WRITE +100 ;WRITE WITH INT. ENABLED BIT #BIT9,@SR ;FIND OUT HOW TO WAIT FOR INT BNE WRWAIT ;WAIT WITH WAIT INSTRUCTION IOT ;WAIT IN BACKGROUND TEST BR SLH WRWAIT: MOV PRIORITY,@CSR WA,@DCS ;CHECK FOR READY BPL .-4 TST @DCS ;TEST FOR ERROR BPL INDADT MOV #5,ERCOUNT MOV @DCS,WORK1 MOV @DAR,WORK ER5: JSR %5,STAER1 ;****WRD1=CONTROL STATUS REG. AT THE TIME OF THE ERROR **** ;****WRD2=DISK ADDR. AT THE TIME OF THE ERROR **** BR ZEROAD ;LOOP ON ERROR INDADT: CMP #3777,SAV1 BEQ LP2ADT ;LAST ADDR. CHECKED INC SAV1 JMP RFRD ;CHECK NEXT ADDRESS LP2ADT: BIT #BIT11,@SR ;IS BIT 11 SET IN SR BEQ .+6 JMP ADT2 ;BIT 11 SET LOOP ON TEST ; ; ; ; ;***** AD-; ;LOOK AHEAD REGISTER MOVLK: MOV @ADS,%0 ;FETCH LOOK AHEAD RESET ;DISPLAY IN LIGHTS RESET ; BR MOVLK ; ;DISK CONTROL STATUS REGISTER SELDCS: MOV #340,@CSR ;LOCK UP INTERRUPTS MOV #177777,@WC ;SET WORD COUNT -1 WORD MOV #OUTBUF,@CMA ;SET UP CURRENT ADDRESS MOV @SR,@DCS ;MOV SR INTO CONTROL REG BIT #BIT0,@DCS ;IS FUNCTION BITS SET BEQ SELDCS ;FUNCTION BITS NOT SET DKBUSY: TSTB @DCS ;TEST FOR DISK READY BPL DKBUSY ;DISK STILL NOT READY BR SELDCS ;DISK NOT BUSY SELECT NEW C.ORS ;***NO ERRORS SHOULD OCCUR.*** ; ;DO NOT CREATE ANOTHER POWER FAIL UNTIL ;THE ADDRESS REGISTER HAS COMPLETELY CYCLED ;THROUGH. ; PFT2: MOV #1000,%6 ;SET UP STACK JSR %7,POWFAL ;WRITE 125252 ON DISK PWRFL: CLR DMA CLR TRACK MOV #PWRFL,HRDER ;SET UP HARD ERROR MOV #PWRDN,24 ;SET UP POWER FAIL VEC. MOV #340,26 CHKDSK: WRCHECK +100 BIT #BIT9,@SR BNE .+6 IOT ;WAIT IN BACKGROUND BR .+12 MOV PRIORITY,@CSR WAIT JSR %7,DISBUF ;CHECK NEXT BUFFER BR CHKDSK BR PWRFL ; ;/IT ;WAIT FOR FLAG SLH: BIT #BIT13,FLAG ;TEST FOR WRITE CHECK BEQ ESH ;TEST FOR READ MOV #OUTBUF,BUF ;SETUP OUTPUT BUFFER MOV #340,@CSR WRCHECK +100 ;WRITE CHECK WITH INT. ENABLE BIT #BIT9,@SR ;FINDOUT HOW TO WAIT FOR INT. BNE WCWAIT ;WAIT WITH WAIT INSTRUCTION IOT ;WAIT IN BACKGROUND TEST BR ESH WCWAIT: MOV PRIORITY,@CSR WAIT ;WAIT FOR FLAG ESH: BIT #BIT12,FLAG ;TEST FOR READ BEQ REH ;CHECK BUFFER MOV #INBUF,BUF ;SETUP OUTPUT BUFFER BIC #3,FLAG ;CLEAR RE-READ COUNT 0DRESS TEST ***** ; ;WRITE EACH UNIQUE ADDRESS ON ITSELF FOR TRACK 0 ;THEN READ IT BACK AND COMPARE FOR THE ;CORRECT DATA ; ; ADT3: CLR DMA ;CLEAR ACTIVE REG CLR TRACK CLR WORK CLR WORK1 MOV #1000,%6 ;SETUP STACK MOV #OUTBUF,BUF ;SET UP CURRENT ADDRESS MOV #2000,WRDCT ;SET UP WORD COUNT MOV #OUTBUF,%0 ;FILL BUFFER WITH COUNT INADB: MOV WORK,(0)+ INC WORK ;+1 COUNT CMP #OUTBUF+4000,%0 BNE INADB ;SET UP NEXT WORD MOV WORK,SAVE WRABF: BIS #BIT8,@DCS ;CLEAR THE DISK WORLD WR1R ; ; ; ; ; ; ; ; ;THIS ROUTINE ENABLES THE OPERATOR TO SELECT A TRACK STATICLY ;THE ROUTINE DOES A ONE WORD READ TO SELECT THE TRACK ;THE OPERATOR MAY CHANGE THE SWITCH REGISTER AT ANY TIME ;SR6-0 EQUALS THE TRACK NUMBER ;SR9-7 EQUALS THE DISK NUMBER ; STAMP: BIS #BIT8,@DCS MOV @SR,WORK1 ;FETCH SR MOV WORK1,WORK BIC #176000,WORK ;MASK DISK AND TRACK NO. ROR WORK ROR WORK ROR WORK ROR WORK ROR WORK MOV WORK,@DAE ;DISK EXT. ADDR. REG. LOADED MOV @SR,WORK SWAB WORK R2ROUTINE TO ABORT DISK DURING POWER FAIL ; PWRDN: BIS #BIT8,@DCS ;CLEAR THE DISK MOV #PWRUP,24 ;SET UP RESTART HALT ; PWRUP: MOV #PWRDN,24 ;RESET POWER FAIL VECTOR MOV #1000,%6 MOV #-300.,WORK ;SET UP TWENTY SECOND TIMER XTIMCNT: RESET INC WORK ;+1 TIMER BNE XTIMCNT ;TWO SECONDS NOT UP GO WAIT BR PWRFL ;GO CHECK DISK ; ; ; ; ; ;ROUTINE TO WRITE THE COMPLETE DISK ;WITH 125252 PATTERN ;WRITE CHECK AND REPORT ERRORS IF THEY ;OCCUR ;REPORT "OK" AT COMPLETION POWFAL: BIS #BIT83 DSKRD: MOV #340,@CSR JSR %5,ZBUF ;CLEAR BUFFER INC FLAG READ +100 ;READ + INT ENABLE BIT #BIT9,@SR ;FIND OUT HOW TO WAIT FOR INT. BNE RDWAIT ;WAIT WITH WAIT INSTRUCTION IOT BR ELH RDWAIT: MOV PRIORITY,@CSR ;SET UP PRIORITY WAIT ;WAIT FOR FLAG ELH: BIT #BIT12,@SR BNE ADRD JSR %5,COMPARE ;COMPARE OUTBUFFER TO INBUFFER ADRD: JSR %5,OVRFLO ;TEST FOR EXTRA DATE BREAKS MOV FLAG,WORK ;CHECK DISK RE-READ COUNT BIC #177774,WORK ;DO 3 RE-READS. CMP #3,WORK BNE DSKRD ;DO ANOTH4ITE ;WRITE TSTB @DCS ;IS THE CONTROL READY BPL .-4 ;CONTROL READY TST @DCS ;IS THERE AN ERROR BPL TFBL ;NO ERROR MOV @DCS,WORK ;FETCH CONTENTS OF CONTROL REG MOV #6,ERCOUNT ;SET UP ERROR COUNT ER6: JSR %5,STAER ;REPORT CONTROL ERROR ;****WRD1=DISK CONTROL STATUS REG. AT THE TIME OF THE ERROR **** BR WRABF ;RE-WRITE DATA TFBL: MOV SAVE,WORK ADD #2000,DMA CMP #4000,WORK ;HAVE WE WRITTEN ALL OF TRACK 0 BNE INADB-4 CLR WORK CLR DMA CLR WORK1 RDTDN: BIS #BIT8,@DCS ;CLEAR TH5OL WORK ROL WORK ROL WORK BIC #3777,WORK MOV WORK,@DAR ;DISK ADDRESS REG LOADED MOV #INBUF,@CMA ;LOAD CURRENT ADDRESS MOV #177777,@WC ;LOAD WORD COUNT BIS #5,@DCS ;GO AND READ CTBUSY: TSTB @DCS ;TEST FOR CONTROL READY BPL CTBUSY ;WAIT FOR CONTROL READY SRCHG: CMP WORK1,@SR BNE STAMP ;SR HAS CHANGED BR SRCHG ;SR HAS NOT CHANGED ; ; ; ; ; ; ; ;ROUTINE TO REPORT ERROR COUNT AND CONTENTS OF ONE REGISTER ; STAER: JSR %5,CONV ;CONVERT OCTAL TO ASCII WORK ;DATA TO BE C6,@DCS ;CLEAR THE DISK MOV (6),PASSC MOV #1000,%6 MOV #20,PATNU ;SET UP PATTERN CLR DMA CLR TRACK MOV #2000,SWRDCT ;SETUP WORD COUNT MOV SWRDCT,WRDCT JSR %5,PASEL ;GENERATE DATA BUFFER MOV #OUTBUF,BUF ;SET UP CURRENT ADDRESS MOV #POWFAL,HRDER WRDNW: WRITE +100 BIT #BIT9,@SR ;CHECK ON HOW TO WAIT BNE .+6 IOT ;BACKGROUND TEST BR .+12 MOV PRIORITY,@CSR WAIT WRCHECK +100 BIT #BIT9,@SR ; BNE .+6 IOT BR .+12 MOV PRIORITY,@CSR WAIT JSR %7,DISBUF ;SET UP NEW DISK 7ER RE-READ REH: BIT #BIT8,@SR BNE DATAT JSR %7,DISBUF ;GO SET UP DISK BUFFER. BR LDAT MSTR: TST FLAG BPL .+6 ;UNDER PROGRAM CONTROL JMP EXTPP ;OPERATOR SELECTED PATTERN ADD #2,PATNU ;INC PATTERN INDEX CMP #44,PATNU BNE DATAT ;NOT LAST PATTERN EXIT CLR PATNU ;LAST PATTERN EXIT ; ;THIS IS A RANDOM DATA, RANDOM ADDRESS ;AND RANDOM WORD COUNT ; ;WORD COUNT CAN BE EQUAL TO OR LESS THAN 1000 WORDS ; RANEX: MOV #-1000,PASSC MOV #1000,%6 BIC #BIT9,FLAG MOV #RANER,HRDER ;SET 8E DISK READ TSTB @DCS ;IS THE CONTROL READY BPL .-4 ;YES THE CONTROL IS READY TST @DCS ;IS THERE AN ERROR BPL ADRCMP ;NO ERROR MOV #7,ERCOUNT ;SET UP ERROR COUNT MOV @DCS,WORK ;FETCH CONTROL REG. ER7: JSR %5,STAER ;REPORT CONTROL ERROR ;****WRD1=DISK CONTROL STATUS REG. AT THE TIME OF THE ERROR **** BR RDTDN ;RE-READ ADRCMP: MOV #OUTBUF,SAVE CMPNEX: CMP @SAVE,WORK1 ;IS THE ADDRESS CORRECT BEQ INCCMP ;COMPARE NEXT WORD MOV @SAVE,WORK ;FETCH LOAD ADDRESS MOV #10,ERCOUNT ;S9ONVERTED MES6 ;ADDRESS OF MESSAGE 6 JSR %5,CONV ;CONVERT OCTAL TO ASCII ERCOUNT ;ERROR COUNT TO BE CONVERTED HED5 ;ADDRESS OF MESSAGE 3 EMT +0 ;REPORT MESSAGE HED5A HED5 MES6 -1 BIT #BIT10,@SR BEQ .+4 HALT RTS %5 ;EXIT ROUTINE ; ;ROUTINE TO REPORT ERROR COUNT AND THE CONTENTS OF TWO REGISTERS ; ; ; STAER1: JSR %5,CONV ;CONVERT OCTAL TO ASCII WORK ;DATA TO BE CONVERTED MES6 ;ADDRESS OF MESSAGE 6 JSR %5,CONV ;CONVERT OCTAL TO ASCII WORK1 ;DATA T:BUFFER BR WRDNW ;WRITE NEW BUFFER EMT +1 OK JMP @PASSC ;ROUTINE TO ALLOW THE OPERATOR TO SET BITS ;IN THE I/O REGISTERS VIA THE SWITCH REGISTER ; ;WORD COUNT REGISTER SELWC: MOV @SR,@WC ;MOV SR INTO WORD COUNT REG BR SELWC ; ;CURRENT ADDRESS REGISTER SELCMA: MOV @SR,@CMA ;MOV SR INTO CURRENT ADDR REG BR SELCMA ; ;DISK ADDRESS REGISTER SELDAR: MOV @SR,@DAR ;MOV SR INTO DISK ADDR REG BR SELDAR ; ;DISK ADDRESS EXT AND ERROR REGISTER SELDAE: MOV @SR,@DAE ;MOV SR INTO DISK ADDR;UP FOR HARD ERROR MOV PRIORITY,@CSR ;SET PRIORITY TO LEVEL 5 WRLG: MOV #3,WORK ;GENERATE RANDOM WORD MOV #OUTBUF,%1 JSR %5,RANDOM BIC #177000,OUTBUF ;MASK FOR WORD LENGTH=1K BEQ WRLG MOV OUTBUF,WRDCT ;SET UP WORD COUNT MOV OUTBUF+2,DMA ;SET UP DAR ADD WRDCT,DMA BCS WRLG MOV OUTBUF+2,DMA BIC #177774,OUTBUF+4 MOV OUTBUF+4,TRACK ;SET UP DAE MOV WRDCT,WORK ;GENERATE RANDOM MOV #OUTBUF,%1 ;DATA BUFFER JSR %5,RANDOM MOV #OUTBUF,BUF BIS #BIT8,@DCS ;CLEAR THE DISK WRITE +100 <ET UP ERROR COUNT ER10: JSR %5,STAER1 ;REPORT COMPARISON ERROR ;****WRD1=DISK ADDR. WANTED **** ;****WRD2=DISK ADDR. RECEIVED **** INCCMP: ADD #2,SAVE INC WORK1 CMP #OUTBUF+4000,SAVE ;IS IT THE LAST ADDR INBUF BNE CMPNEX ;COMPARE NEXT WORD CMP #4000,WORK1 ;IS IT THE LAST ADDR. OF TRACK BEQ LPADT3 ADD #2000,DMA ;SET UP FOR NEXT BUFFER BR RDTDN ;GO READ BUFFER LPADT3: BIT #BIT11,@SR ;LOOP ON TEST? BNE ADT3 ;YES BIT 11 SET IN SR ; ; ; ; ; ;RF11 TRACK SELECTION TEST ; ;WRITE TH=O BE CONVERT MES5 ;ADDRESS OF MESSAGE 6 JSR %5,CONV ;CONVERT OCTAL TO ASCII ERCOUNT ;ERROR COUNT TO BE CONVERTED HED5 ;ADDRESS OF MESSAGE 3 EMT +0 ;REPORT MESSAGE HED5A HED5 MES5 MES6 -1 BIT #BIT10,@SR BEQ .+4 HALT RTS %5 ;EXIT ROUTINE ; ; ;ROUTINE TO DECODE EMT CALLS ;EMT+1=TYPE ONE LINE OF TEXT ;EMT+0=TYPE A SERIES OF LINES EMTRP: MOV (6),%0 CMP #EMT+1,-(0) ;WAS THE CALL EMT+1 BNE TYPS ;NO! TYPE A SERIES OF LINES OF TEXT BR TYP ;YES TYPE ONE LINE OF> EXT REG BR SELDAE ; ;DATA BUFFER REGISTER SELDBR: MOV @SR,@DBR ; MOV SR INTO DATA BUFFER BR SELDBR ; ; ;LOOK AHEAD REGISTER MOVLK: MOV @ADS,%0 ;MOVE LOOK AHEAD RESET RESET BR MOVLK ;INTO REGISTER 0 ; ; ;DISK CONTROL STATUS REGISTER SELDCS: MOV #340,@CSR ;LOCK UP INTERRUPTS MOV #177777,@WC ;SET WORD COUNT -1 WORD MOV #OUTBUF,@CMA ;SET UP CURRENT ADDRESS MOV @SR,@DCS ;MOV SR INTO CONTROL REG BIT #BIT0,@DCS ;IS FUNCTION BITS SET BEQ SELDCS ;FUNCTION BITS NOT SET DKBUSY: T? ;WRITE DATA BIT #BIT9,@SR BNE .+6 IOT BR .+12 MOV PRIORITY,@CSR WAIT WRCHECK +100 ;WRITE CHECK DATA BIT #BIT9,@SR BNE .+6 IOT BR .+12 MOV PRIORITY,@CSR WAIT MOV #INBUF,BUF ;SET UP BUFFER JSR %5,ZBUF ;CLEAR BUFFER AREA READ +100 ;READ DATA BIT #BIT9,@SR BNE .+6 IOT BR .+12 MOV PRIORITY,@CSR WAIT JSR %5,COMPARE ;COMPARE OUT BUFFER TO IN BUFFER JSR %5,OVRFLO ;TEST FOR EXTRA DATA BREAKS RANER: BIT #BIT9,FLAG ;CHECK FOR ERROR BEQ EXRAX BIC #BIT9,FLAG J@E FIRST AND LAST ADDRESS OF EACH TRACK ;WITH THE OCTAL VALUE OF EACH TRACK ;BITS 0 THRU 6 EQUAL THE TRACK NUMBER ;BIT 15 RESET EQUALS ADDR 0 OF THE TRACK ;BIT 15 SET EQUALS ADDR 3777 OF THE TRACK ; ;AFTER WRITING THE DISK READ EACH ADDRESS ;AND COMPARE DATA FOR THE CORRECT VALUE ; ADT4: CLR DMA ;CLEAR WORK REGISTERS CLR TRACK CLR OUTBUF MOV #1000,%6 ;SETUP STACK BIS #BIT8,@DCS ;CLEAR THE DISK WORLD MOV #OUTBUF,BUF ;SET CURRENT ADDRESS MOV #1,WRDCT ;SET UP WORD COUNT INSWT: WRITE ;A TEXT ;SUBROUTINE TO OUTPUT ASCII MESSAGE ON TELETYPE PRINTER. TYP: MOV @%6,%0 ;GET ADDRESS THAT CONTAINS MESSAGE ADDRESS ADD #2,@%6 ;SET UP EXIT. MOV @%0,%0 ;ADDRESS OF MESSAGE TO R0. TYPA: MOVB (0)+,TYPDAT ;GET CHARACTER CMPB #100,TYPDAT ;CHECK FOR "@" CHARACTER BNE TYPC ;CRANCH IF NOT "@". RTI ;TERMINATOR CHAR. DONE. EXIT. TYPC: CMPB #45,TYPDAT ;CHECK FOR "%". BEQ TYPF ;BRANCH IF "%". CMPB #42,TYPDAT ;NOT "%". CHECK FOR "#". BEQ TYPG ;BRANCH IF "#" JSR %7,TYPD ;TYPE CHABSTB @DCS ;TEST FOR DISK NOT READY BPL DKBUSY ;DISK STILL READY BR SELDCS ;DISK NOT BUSY SELECT NEW CR ; ; ; ; ; ; ; ; ;THIS ROUTINE ENABLES THE OPERATOR TO SELECT A TRACK STATICLY ;THE ROUTINE DOES A ONE WORD READ TO SELECT THE TRACK ;THE OPERATOR MAY CHANGE THE SWITCH REGISTER AT ANY TIME ;SR6-0 EQUALS THE TRACK NUMBER ;SR9-7 EQUALS THE DISK NUMBER ; STAMP: BIS #BIT8,@DCS MOV @SR,WORK1 ;FETCH SR MOV WORK1,WORK BIC #176000,WORK ;MASK THE TRACK AND DISK NO. ROR WORK ROR WOCSR %5,CONV DMA MES1 6 JSR %5,CONV TRACK MES1A 2 JSR %5,CONV WRDCT MES3 4 EMT+0 HED6 MES1A MES1 MES3 -1 EXRAX: INC PASSC ;HAVE WE DONE IT 1000 TIMES BNE WRLG ;BRANCH IF NO BIT #BIT11,@SR ;LOOP ON TEST BEQ .+6 ;BRANCH IF YES JMP RANEX ; ;CHECK FOR MULTI DISK MODE ;IF IN MULTI DISK MODE REPORT "END" ;IF LAST DISK ON SYSTEM HAS BEEN ;EXERCISED. ; ; CLR DMA CLR TRACK BIT #BIT11,FLAG ;ARE WE IN MULTI DISK MODE BEQ REPOEN ;REPORT "END" MOV FLAG,WORDGO WRITE TSTB @DCS ;IS READY SET BPL .-4 ;YES! WAIT FOR NOT BUSY TST @DCS ;TEST FOR ERROR BPL TSTTK ;NO ERROR GO ON MOV #11,ERCOUNT ;SET UP ERROR COUNT MOV @DCS,WORK ;REPORT CONTENTS OF DCS REG ER11: JSR %5,STAER ;REPORT ERROR OCCURRED ;****WRD1=DISK CONTROL STATUS REG. AT THE TIME OF THE ERROR **** BR INSWT ;GO RE-WRITE TSTTK: CMP #100177,OUTBUF ;TEST FOR LAST ADDR. BEQ INSRD ;GO READ THE DATA BIT #BIT15,OUTBUF ;IS IT ADDR ZERO BNE MVNEM ;NO BIS #BIT15,OUTBUF ;YES! SET UP ER IN TYPDAT BR TYPA TYPD: BIT #BIT14,@SR BNE TYEXIT MOVB TYPDAT,@TPB ;OUTPUT CHARACTER TO PRINTER TSTB @TPS ;WAIT FOR DONE FLAG. BPL .-4 TYEXIT: RTS %7 ;EXIT TYPF: MOVB #15,TYPDAT ;MOVE CARRIAGE RETURN CODE TO TYPDAT JSR %7,TYPD ;GO TYPE CHAR. TYPG: MOVB #12,TYPDAT ;MOVE LF CODE TO TYPDAT. JSR %7,TYPD ;GO TYPE CHAR. BR TYPA TYPDAT: 0 ;SUBROUTINE TO OUTPUT A SERIES OF ASCII MESSAGES ON TELETYPE PRINTER TYPS: MOV @%6,%0 ;GET ADDRESS THAT CONTAINS MESSAGE ADDRESS ADD #2,@%6 ;UPFRK ROR WORK ROR WORK ROR WORK MOV WORK,@DAE ;DISK EXT. ADDR. REG. LOADED MOV @SR,WORK SWAB WORK ROL WORK ROL WORK ROL WORK BIC #3777,WORK MOV WORK,@DAR ;DISK ADDRESS REG LOADED MOV #INBUF,@CMA ;LOAD CURRENT ADDRESS MOV #177777,@WC ;LOAD WORD COUNT BIS #5,@DCS ;GO AND READ CTBUSY: TSTB @DCS ;TEST FOR CONTROL NOT READY BPL CTBUSY ;WAIT FOR CONTROL NOT READY SRCHG: CMP WORK1,@SR BNE STAMP ;SR HAS CHANGED BR SRCHG ;SR HAS NOT CHANGED ; ; ; ; ; ; ; ;ROUTINE TOGK ;WHAT DISK ARE WE ON BIC #177743,WORK ;IF LAST DISK ON SYSTEM CMP WORK,DSKNOR ;REPORT END BEQ REPOEN ;REPORT "END" LAST DISK ADD #4,FLAG ;INC. DISK NO. BR EXTPP ;EXERCISE DISK REPOEN: EMT +1 END ;REPORT END OF PASS BIC #34,FLAG EXTPP: JMP ADTST ;RECYCLE ; ;ENTER DISK HANDLER BY THE TRAP INSTRUCTION ;ARGUMENT TO TRAP INSTRUCTION IS TWO ORDER ;BYTE OF THE CONTROL REGISTER. ; DISK: MOV DBR,%5 ;SET UP TO LOAD DISK REG MOV TRACK,-(5) ;LOAD TRACK NUMBER MOV FLAG,WORK ;SET UP DHFOR LAST ADDR ADD #3777,DMA ;SET UP FOR LAST ADDR BR INSWT ;GO WRITE MVNEM: BIC #BIT15,OUTBUF ;SET UP FOR ADDR ZERO INC OUTBUF ;INC. TO NEXT TRACK ADD #1,DMA ;INC. BAR BCC INSWT ;GO WRITE NO CARRY TO DAE INC TRACK ;INC. DAE REG. BR INSWT ;GO WRITE ; ;READ THE FIRST AND LAST ADDRESS OF EACH TRACK ;AND VERIFY IT HAS THE CORRECT DATA INSRD: CLR DMA ;CLEAR WORK REG. CLR TRACK CLR SAVE BIS #BIT8,@DCS ;CLEAR THE DISK WORLD MOV #INBUF,BUF ;SET UP CURRENT ADDR MOV #1,WRDCT IDATE TO NEXT MESSAGE ADDRESS MOV @%0,TYPSB ;ADDRESS OF MESSAGE TO TYPSB CMP #-1,TYPSB ;CHECK FOR TERMINATOR BNE TYPSA ;BRANCH IF NOT TERMINATOR. RTI ;TERMINATOR. EXIT TYPSA: EMT +1 ;CALL ON TYP SUB TO TYPE MESSAGE TYPSB: 0 ;ADDRESS OF MESSAGE GOES HERE BR TYPS ;GO PROCESS NEXT MESSAGE ; ; ; ; ;OCTAL TO ASCII CONVERT ROUTINE ; ;ENTER ROUTINE AS FOLLOWS ;JSR%5,CONV ;ADDR#=ADDRESS OF NUMBER TO BE CONVERTED ;ADDR BYTE=LSB OF WHERE ASCII IS GOING ;ASCII#=THE NUMBER OF ASCII CHAR. J REPORT ERROR COUNT AND CONTENTS OF ONE REGISTER ; STAER: JSR %5,CONV ;CONVERT OCTAL TO ASCII WORK ;DATA TO BE CONVERTED MES10 ;ADDRESS OF MESSAGE 6 JSR %5,CONV ;CONVERT OCTAL TO ASCII ERCOUNT ;ERROR COUNT TO BE CONVERTED HED5 ;ADDRESS OF MESSAGE 3 EMT +0 ;REPORT MESSAGE HED5A HED5 MES10 -1 RTS %5 ;EXIT ROUTINE ; ;ROUTINE TO REPORT ERROR COUNT AND THE CONTENTS OF TWO REGISTERS ; ; ; STAER1: JSR %5,CONV ;CONVERT OCTAL TO ASCII WORK ;DATA TO BE CONVERTED KISK NO. BIC #177743,WORK ;MASK FORM PROGRAM FLAG BIS WORK,(5) ;LOAD UNIT INTO DAE MOV DMA,-(5) ;LOAD WORD ADDRESS MOV BUF,-(5) ;SET UP CURRENT ADDRESS MOV WRDCT,-(5) ;LOAD WORD COUNT COM (5) ;SET UP TWO'S COMPLEMENT INC (5) MOV (6),%4 MOV -(4),WORK ; BIC #177600,WORK ;MASK FUNCTION BITS MOV WORK,-(5) ;LOAD FUNCTION REG. RTI ;RETURN FROM TRAP ; ; ; ; ; ; ; ;RF11 DISK INTERRUPT HANDLER ;ROUTINE CONTINUES ON ERRORS ; DKINT: BIC #BIT4,@CSR ;CLEAR TRACE BIT TST @DCS ;TEL;SET UP WORD COUNT RDTKS: READ ;READ DATA TSTB @DCS ;CHECK FOR READY BPL .-4 ;CONTROL NOT READY TST @DCS ;IS THERE AN ERROR BPL CMPDTK ;NO ERROR MOV #12,ERCOUNT ;SET UP ERROR COUNT MOV @DCS,WORK ;FETCH CONTENTS OF DCS ER12: JSR %5,STAER ;REPORT CONTROL ERROR ;****WRD1=DISK CONTROL STATUS REG. AT THE TIME OF THE ERROR **** BR RDTKS ;GO RE-READ CMPDTK: CMP SAVE,INBUF ;IS DATA CORRECT BEQ CMNETK ;YES SETUP FOR NEXT WORD MOV SAVE,WORK1 ;CORRECT ADDRESS MOV INBUF,WORK ;INCORRECMTO BE CONVERTED ; ; CONV: MOV @(5)+,ACNVX ;VALUE OF # TO BE CONVERTED MOV (5)+,%1 ;ASCII ADDR MOV (5)+,%2 ;# OF ASCII CHAR ADD %2,%1 ACVN: MOV ACNVX,%3 BIC #177770,%3 ;ISOLATE LEAST SIGNIFICANT OCTAL# ADD #60,%3 ;SET UP ASCII# MOVB %3,-(1) ;STORE ASCII CHAR BIC #7,ACNVX ROR ACNVX ;ROTATE OCTAL# ROR ACNVX ROR ACNVX DEC %2 ;-1 FROM ASCII CHAR COUNT BNE ACVN RTS %5 ;EXIT # CONVERTED ACNVX: 0 ;WORK REGISTER ; ; ; ; TEXBUF: 0 TSTCH: 0 ; ; ; ; ; ;ERROR MENMES10 ;ADDRESS OF MESSAGE 6 JSR %5,CONV ;CONVERT OCTAL TO ASCII WORK1 ;DATA TO BE CONVERT MES10A ;ADDRESS OF MESSAGE 6 JSR %5,CONV ;CONVERT OCTAL TO ASCII ERCOUNT ;ERROR COUNT TO BE CONVERTED HED5 ;ADDRESS OF MESSAGE 3 EMT +0 ;REPORT MESSAGE HED5A HED5 MES10 MES10A -1 RTS %5 ;EXIT ROUTINE ; ; ;ROUTINE TO DECODE EMT CALLS ;EMT+1=TYPE ONE LINE OF TEXT ;EMT+0=TYPE A SERIES OF LINES EMTRP: MOV (6),%0 CMP #EMT+1,-(0) ;WAS THE CALL EMT+1 BNE TYPS ;NO! TYPOST FOR ERROR BPL INTEXT ;BRANCH IF NO ERROR BIS #BIT9,FLAG ;SET ERROR BIT MOV @DAE,WORK ;REPORT ERROR BIC #177700,WORK ;MASK ADDRESS EXT. BITS. JSR %5,CONV ;CONVERT TO ASCII WORK MES1A 2 EMT+1 HED2 MOV @DCS,WORK ;TEST FOR READ BIC #177770,WORK CMP #4,WORK BNE DELMES ;IF READING REPORT WHICH READ MOV FLAG,WORK BIC #177774,WORK JSR %5,CONV WORK MES13 1 EMT+1 MES13 DELMES: MOV @DAR,WORK ;SET UP LOWER 16 BITS OF ADDR. DEC WORK JSR %5,CONV ;CONVERT TO ASCPT DATA MOV #13,ERCOUNT ;SET UP ERROR COUNT ER13: JSR %5,STAER1 ;REPORT SELECTION ERROR ;****WRD1=TRACK ADDR. WANTED **** ;****WRD2=TRACK ADDR. RECEIVED **** CMNETK: CMP #100177,SAVE ;IS IT THE LAST ADDR BEQ LPTSK ;END OF TEST BIT #BIT15,SAVE ;IS IT ADDR 0 OF THE TRACK BEQ ZRBIT ;NO! SETUP FOR LAST ADDR BIC #BIT15,SAVE ;SET UP FOR ADDR ZERO INC SAVE ;INC FOR TRACK NO. ADD #1,DMA ;SET UP DAR BCC RDTKS ;GO READ NEXT TRACK ADDR INC TRACK ;INC TRACK BR RDTKS ;GO READ ZRBIT: BIS SSAGE HEADERS ; .EVEN HED5A: .ASCII /%@/ HED5: .ASCII / ERROR COUNT @/ ; ; ;MESSAGE TRAILERS ; ; ; ; MES5: .ASCII / GOOD DATA @/ ; ; ; MES6: .ASCII / BAD DATA@/ ; ; ; END: .ASCII /%END@/ .EVEN ; ; ; OUTBUF: .WORD 0,0,0,0 ; ; INBUF: .WORD 0,0,0,0 ; ; ; ; .END RE A SERIES OF LINES OF TEXT BR TYP ;YES TYPE ONE LINE OF TEXT ;SUBROUTINE TO OUTPUT ASCII MESSAGE ON TELETYPE PRINTER. TYP: MOV @%6,%0 ;GET ADDRESS THAT CONTAINS MESSAGE ADDRESS ADD #2,@%6 ;SET UP EXIT. MOV @%0,%0 ;ADDRESS OF MESSAGE TO R0. TYPA: MOVB (0)+,TYPDAT ;GET CHARACTER CMPB #100,TYPDAT ;CHECK FOR "@" CHARACTER BNE TYPC ;CRANCH IF NOT "@". RTI ;TERMINATOR CHAR. DONE. EXIT. TYPC: CMPB #45,TYPDAT ;CHECK FOR "%". BEQ TYPF ;BRANCH IF "%". CMPB #42,TYPDAT ;NOT "%". CHECK FSII WORK MES1 6 EMT+0 MES1A MES1 -1 MOV @DCS,WORK ;SET UP STATUS JSR %5,CONV WORK MES2 6 EMT+1 MES2 BIT #BIT14,@DCS ;TEST FOR HARD ERROR BEQ SOFTER ;GO AND CONTINUE SOFT ERROR MOV @DAE,WORK ;FETCH ERROR EXT. BITS SWAB WORK BIC #177400,WORK JSR %5,CONV ;CONVERT TO ASCII WORK MES2A 3 EMT+0 HED5A MES2A -1 BIS #BIT8,@DCS ;CLEAR THE DISK MOV #1000,%6 BIT #BIT10,@SR ;HALT ON ERROR BEQ .+4 HALT ;YES HALT BIT 10 SET IN SR JMP @HRDER ;EXIT HART#BIT15,SAVE ;SET UP FOR LAST ADDR ADD #3777,DMA ;SET UP FOR LAST WORD BR RDTKS ;GO READ LAST ADDR OF TK LPTSK: BIT #BIT11,@SR ;IS BIT 11 SET IN SR BEQ .+6 ;YES LOOP ON TEST JMP ADT4 ; ;RF11 LOOK AHEAD TEST ;WRITE ONE WORD UPON RECEIPT OF ;NOT READY READ THE LOOK AHEAD ;REGISTER IT SHOULD CONTAIN THE ;ADDRESS +1 ; ADT5: CLR DMA ;CLEAR REGISTERS CLR TRACK CLR SAVE MOV #1000,%6 ;SETUP STACK MOV #1,WRDCT ;SET UP FOR ONE WORD X-FER MOV #OUTBUF,BUF ;SET UP CURRENT ADDRESS WRADT5VOR "#". BEQ TYPG ;BRANCH IF "#" JSR %7,TYPD ;TYPE CHAR IN TYPDAT BR TYPA TYPD: BIT #BIT14,@SR BNE TYEXIT MOVB TYPDAT,@TPB ;OUTPUT CHARACTER TO PRINTER TSTB @TPS ;WAIT FOR DONE FLAG. BPL .-4 TYEXIT: RTS %7 ;EXIT TYPF: MOVB #15,TYPDAT ;MOVE CARRIAGE RETURN CODE TO TYPDAT JSR %7,TYPD ;GO TYPE CHAR. TYPG: MOVB #12,TYPDAT ;MOVE LF CODE TO TYPDAT. JSR %7,TYPD ;GO TYPE CHAR. BR TYPA TYPDAT: 0 ;SUBROUTINE TO OUTPUT A SERIES OF ASCII MESSAGES ON TELETYPE PRINTER TYPS: MOV @%6,%0 ;WD ERROR SOFTER: TST @WC ;CHECK FOR X-FER DONE BEQ INTEXT ;EXIT FROM ROUTINE BIT #BIT9,@SR BEQ .+6 SUB #2,(6) ;X-FER NOT DONE SET UP FOR RETURN BIT #BIT10,@SR ;HALT ON ERROR BEQ .+4 HALT ;YES HALT BIT10 SET IN SR BIS #BIT0,@DCS ;SET GO AND CONTINUE RTI ;RETURN TO WAIT INSTR. ; ; INTEXT: BIT #BIT13,@SR ;HALT ON COMPLETION FLAG BEQ .+4 HALT ;YES BIT 13 SET IN SR HALT BIT #BIT9,@SR BNE .+6 MOV #774,%6 ;RESET STACK RTI ;EXIT ; ; ; ; ;ROUTINE TO SET UP DAR AX: MOV #177476,%0 BIS #BIT8,@DCS ;CLEAR THE DISK WRITE ;WRITE 1$: MOV (%0),@#WORK ;FETCH LOOK AHEAD TSTB @#177460 ;IS THE CONTROL BUSY BPL 1$ ;CONTROL STILL BUSY TST @DCS ;IS THERE AN ERROR BPL LPADT5 ;NO DISK ERRORS MOV #14,ERCOUNT ;SET UP ERROR COUNT MOV @DCS,WORK ;FETCH DCS FOR REPORT ER14: JSR %5,STAER ;REPROT CONTROL ERROR ;****WRD1=DISK CONTROL REG AT THE TIME OF THE ERROR **** BR WRADT5 ;LOOP ON ERROR LPADT5: MOV DMA,WORK1 ;IS LOOK AHEAD CORRECT CMP WORK1,WORK BEQ INCZGET ADDRESS THAT CONTAINS MESSAGE ADDRESS ADD #2,@%6 ;UPDATE TO NEXT MESSAGE ADDRESS MOV @%0,TYPSB ;ADDRESS OF MESSAGE TO TYPSB CMP #-1,TYPSB ;CHECK FOR TERMINATOR BNE TYPSA ;BRANCH IF NOT TERMINATOR. RTI ;TERMINATOR. EXIT TYPSA: EMT +1 ;CALL ON TYP SUB TO TYPE MESSAGE TYPSB: 0 ;ADDRESS OF MESSAGE GOES HERE BR TYPS ;GO PROCESS NEXT MESSAGE ; ; ; ; ;OCTAL TO ASCII CONVERT ROUTINE ; ;ENTER ROUTINE AS FOLLOWS ;JSR%5,CONV ;ADDR#=ADDRESS OF NUMBER TO BE CONVERTED ;ADDR BYTE=LSB [ND DAE ;FROM SR AND CONVERSATION ;ENTER FROM JSR %5,OPDSEL OPDSEL: BIT #BIT7,@SR ;DOES SR CONTAIN TRACK # BNE .+4 RTS %5 MOV @SR,WORK ;FETCH SR ROR WORK ROR WORK ROR WORK ROR WORK ROR WORK BIC #177774,WORK ;MASK AIGL ORDER 2 BITS MOV WORK,TRACK MOV @SR,WORK ROL WORK ROL WORK ROL WORK ROL WORK ROL WORK ROL WORK ROL WORK ROL WORK ROL WORK ROL WORK ROL WORK BIC #003777,WORK BIC #174000,DMA ADD WORK,DMA ;SET UP LOWER 16 BITS OF ADDRESS RTS %5 ;EXIT ;\ADS ;LOOK AHEAD OK DEC WORK ;COMPARE FOR ADDRESS+1 CMP WORK1,WORK ; BEQ INCADS ;BRANCH IF EQUAL INC WORK MOV #15,ERCOUNT ER15: JSR %5,STAER1 ;REPORT LOOK AHEAD INCORRECT ;****WRD1=DISK ADDR. WANTED FROM LOOK AHEAD REG. **** ;****WRD2=DISK ADDR. RECEIVED FROM DISK LOOK AHEAD REG. **** BR WRADT5 ;LOOP ON ERROR INCADS: CMP #3777,DMA ;IS IT THE LAST ADDR. BEQ XLPADT5 ;LAST ADDRESS EXIT INC DMA ;+1 DMA BR WRADT5 ;CHECK NEXT ADDRESS XLPADT5:BIT #BIT11,@SR ;LOOP ON TEST BNE ADT5 ^OF WHERE ASCII IS GOING ;ASCII#=THE NUMBER OF ASCII CHAR. TO BE CONVERTED ; ; CONV: MOV @(5)+,ACNVX ;VALUE OF # TO BE CONVERTED MOV (5)+,%1 ;ASCII ADDR MOV (5)+,%2 ;# OF ASCII CHAR ADD %2,%1 ACVN: MOV ACNVX,%3 BIC #177770,%3 ;ISOLATE LEAST SIGNIFICANT OCTAL# ADD #60,%3 ;SET UP ASCII# MOVB %3,-(1) ;STORE ASCII CHAR BIC #7,ACNVX ROR ACNVX ;ROTATE OCTAL# ROR ACNVX ROR ACNVX DEC %2 ;-1 FROM ASCII CHAR COUNT BNE ACVN RTS %5 ;EXIT # CONVERTED ACNVX: 0 ;WORK REGISTER ; _ ;ROUTINE TO SETUP DISK BUFFERS ;ADD WORD COUNT TO STARTING DISK ADDRESSES ;COMPARE CALCULATED ADDRESS TO TERMINATING ADDRESS ; DISBUF: ADD WRDCT,DMA ;ADD WORD COUNT TO LOWER 16 BITS BCC COMDAR INC TRACK ;OVERFLOW ADD ONE TO TRACK COMDAR: CMP DMA,@DAR ;COMPARE LOWER 16 BITS BEQ CMDAE BIS #BIT6,FLAG ; CMDAE: MOV @DAE,WORK1 ;FETCH EXT. ADDR BITS BIC #177740,WORK1 ;MASK TRACK AND DISK ADDR MOV FLAG,WORK ;SET UP DISK ADDRESS BIC #177743,WORK ADD TRACK,WORK BIC #177740,WORK CMP WOR`;YES LOOP ON TEST BIT 11 SET ; SPIRAL TESTS ; ;WRITE THE LAST WORD OF TRACK ZERO ;AND THE FIRST WORD OF TRACK ONE ;USING ONE WORD X-FERS ;DATE = 52525 SPIRAL: BIS #BIT8,@DCS ;CLEAR THE DISK MOV #340,@CSR ;LOCK UP PROCESSING MOV #1000,%6 ;SETUP STACK MOV #1,WRDCT ;SET WORD COUNT TO 1 CLR TRACK MOV #3777,DMA ;LAST WORD OF TRACK ZERO MOV #52525,OUTBUF ;SET UP DATA MOV #OUTBUF,BUF WRITE ;WRITE LAST ADDR TK ZERO TSTB @DCS ;TEST FOR READY BPL .-4 ;CONTROL STILL BUSY TST @DCS b; ; ; ;ROUTINE TO HANDLE KEYBOARD CONVERSATION ;ROUTINE ACCEPTS NUM. OR ALPHA CHARACTERS ; NOCHA: MOV #40,TSTCH ;SET UP FOR NUM. CHAR. BR TYST ALPHA: MOV #100,TSTCH ;SET UP FOR ALPHA CHAR TYST: MOV #340,@CSR ;LOCK UP INTERRUPTS CLR TEXBUF ;CLEAR TEXT BUFFER REG TSTFLG: TSTB @TKS ;CHECK FOR FLAG BPL TSTFLG ; MOV @TKB,@TPB ;CHARACTER IN BUFFER TSTB @TPS ;ECHO CHARACTER BPL .-4 CMP #377,@TKB ;CHECK FOR RUB-OUT BNE CKCH ;EXIT IF NOT RUB-OUT EMT +1 MES8 ;REPORT RUB-OUT ACKNOcK,WORK1 ;ARE THEY EQUAL BNE ERADR ;ERROR IN DAE REG TSTB FLAG ;CHECK FOR LAST DISK BUFFER BPL EXTCME CLR DMA ;CLEAR LOWER 16 BITS CLR TRACK ;CLEAR EXT. ADDR. BITS. BIC #200,FLAG ADD #2,(6) ;INC STOCK POINTER MOV SWRDCT,WRDCT BR EXTDR ;EXIT EXTCME: BIC #177774,WORK1 ;MASK EXT. TRACK BITS CMP #3,WORK1 ;COMPARE FOR LAST TRACK BNE AKH ;NOT LAST TRACK EXIT MOV @DAR,WORK ;FETCH LOWER 16 BITS OF ADDRESS ADD WRDCT,WORK ;WILL DISK OVERFLOW BCC AKH BIS #200,FLAG MOV @DAR,WRDCdBPL SPIL1 MOV #16,ERCOUNT MOV @DCS,WORK ER16: JSR %5,STAER ;****WRD1=DISK CONTROL STATUS REG. AT THE TIME OF THE ERROR **** BR SPIRAL SPIL1: INC DMA WRITE ;WRITE FIRST ADDR. TK 1 TSTB @DCS ;WAIT FOR READY BPL .-4 ;CONTROL STILL BUSY TST @DCS BPL SPIL2 MOV #17,ERCOUNT MOV @DCS,WORK ER17: JSR %5,STAER ;****WRD1=DISK CONTROL STATUS REG. AT THE TIME OF THE ERROR **** BR SPIRAL SPIL2: INC WRDCT ;SET UP FOR TWO WORD X-FER MOV #3777,DMA ;START AT ADDR 3777 MOV #INBUF,BUF ; fWLEDGED BIC #7,TEXBUF ROR TEXBUF ROR TEXBUF ROR TEXBUF BR TSTFLG ;GO WAIT FOR NEW CHAR. CKCH: CMP #215,@TKB ;CHECK FOR CARRIAGE RETURN BNE .+4 RTS %7 ;EXIT DELIMITER TYPED BIT TSTCH,@TKB BNE CHOK EMT +1 ;REPORT QUESTION MARK MES7 BR TSTFLG ;WAIT FOR CORRECT CHAR. CHOK: MOV @TKB,WORK BIC #177770,WORK CLC ROL TEXBUF CLC ROL TEXBUF CLC ROL TEXBUF ADD WORK,TEXBUF ;ADD CHARACTER BR TSTFLG ;WAIT FOR NEW CHARACTER TEXBUF: 0 TSTCH: 0 ; ; ; ; ; ;ERROR MESSAGgT ;DISK WILL OVERFLOW COM WRDCT ;SET UP NEW WORD COUNT INC WRDCT ;MAKE TWO'S COMP. AKH: MOV @DAE,TRACK BIC #177774,TRACK ;MASK TRACK BITS MOV @DAR,DMA ;LOWER 16 BITS OF ADDRESS BIT #BIT6,FLAG ;REPORT ADDRESS ERROR BNE .+4 EXTDR: RTS %7 ;EXIT ERADR: JSR %5,CONV ;CONVERT DMA REG COUNT TO ASCII DMA MES1 6 JSR %5,CONV ;CONVERT TRACK REG COUNT TO ASCII WORK1 MES1A 2 EMT +0 ;REPORT ERROR HED4 MES1A MES1 -1 BIC #BIT6,FLAG CLR DMA ;DISK ADDRESS ERROR RE-START PROGhREAD ;READ DATA TSTB @DCS ;TEST FOR READY BPL .-4 ;CONTROL STILL BUSY TST @DCS BPL SPIL3 MOV #20,ERCOUNT MOV @DCS,WORK ER20: JSR %5,STAER ;****WRD1=DISK CONTROL STATUS REG. AT THE TIME OF THE ERROR **** BR SPIRAL SPIL3: CMP #52525,INBUF ;CMP ADDR DAR 3777 BEQ CMPX1 ;COMPARE SECOND WORD MOV #21,ERCOUNT ;SETUP ERROR COUNT MOV INBUF,WORK ;INCORRECT DATA MOV #52525,WORK1 ;CORRECT DATA ER21: JSR %5,STAER1 ;REPORT ADDR 377 HAE BAD DATA ;****WRD1=THE DATA THAT SHOULD HAVE BEEN IN jE HEADERS ; .EVEN HED1: .ASCII /%DATA ERR @/ ; ; HED2: .ASCII /%STATUS ERR @/ ; ; HED3: .ASCII /%EXTRA BKS @/ ; HED4: .ASCII /%DK ADDR ERR @/ ; ; HED5A: .ASCII /%@/ ; ; HED5: .ASCII / ERR CNT @/ ; ; HED6: .ASCII /%RANEX ERR @/ ; ; ;MESSAGE TRAILERS ; ; MES1: .ASCII / DAR @/ ; ; ; MES1A: .ASCII / DAE @/ ; ; ; MES2: .ASCII / DCS @/ ; MES2A: .ASCII / HRD ERR@/ ; ; MES3: .ASCII / WRD CNT@/ ; ; ; MES4: .ASCII / WRD ADDR.@/ ; ; ; k. CLR TRACK BIT #BIT10,@SR ;HALT ON ERROR BEQ .+4 HALT ;SWITCH 10 SET IN SR HALT RTS %7 ; ; ; ; ; ; ;ROUTINE TO SELECT DATA PATTERNS FOR TEST ; ;ENTER FROM JSR %5 PASEL ; PASEL: MOV PATNU,%0 ;SET UP PATTERN NUMBER MOV WRDCT,WORK ;SET UP WORK MOV #OUTBUF,%1 ;LOC. OF OUTBUFFER CMP #42,%0 ;TEST FOR RANDOM DATA NUMBER BEQ RANDOM ;GO GENERATE RANDOM DATA FILDAT: MOV PAT0(0),(1)+ ;FILL BUFFER DEC WORK ;DEC. WORK COUNT TST WORK ;TEST FOR LAST WORK BNE FILDAT ;LOAD NElADDR. 3777**** ;****WRD2=THE DATA READ FROM ADDR. 3777**** BR SPIRAL ;LOOP ON ERROR CMPX1: CMP #52525,INBUF+2 ;COMPARE NEXT WORD BEQ LPSPI1 ;BRANCH IF DATA OK MOV #22,ERCOUNT ;SETUP ERROR COUNT MOV #52525,WORK1 ;CORRECT DATA MOV INBUF+2,WORK ;DATA READ FROM ADDR0 TK1 ER22: JSR %5,STAER1 ;REPORT ERROR ;****WRD1=THE DATA THAT SHOULD BE IN ADDR. 0 OF TRACK 1 **** ;****WDR2=THE DATA READ FROMADDR.0 OF TRACK 1 **** BR SPIRAL ;LOOP ON ERROR LPSPI1: BIT #BIT11,@SR ;LOOP ON TEST? BNE SPIRALn MES5: .ASCII / GD DATA @/ ; ; ; MES6: .ASCII / BD DATA @/ ; ; ; M0: MES7: .ASCII /?@/ ; ; ; ; MES8: .ASCII '/@' ; ; MES10: .ASCII / WRD1 @/ ; ; MES10A: .ASCII / WRD2 @/ ; MES11: .ASCII /%UNIT NO.@/ ; ; MES12: .ASCII / @/ ; ; MES13: .ASCII / READ @/ ; ; TIMO: .ASCII /%CPU BKGRND TIMED OUT@/ ; ; OK: .ASCII /%OK!@/ ;CONVERSATION TEXT ; ; CON1: .ASCII /%DATA TEST ONLY? @/ ; ; ; CON2: .ASCII /%MULTI DK MODE?@/ ; ; CON3: .ASCII /%# OF DoXT WORD RTS %5 ;BUFFER FULL ; ;RANDOM DATA ; ; ; ; ;RANDOM DATA GENERATOR SUBROUTINE RANDOM: MOV LONUM,%0 ;SET UP R0 WITH 5 DIGITS LOW MOV HINUM,%4 ;SET UP R1 WITH 5 DIGITS HIGH MOV #7,%3 ;SET UP SHIFT COUNT CLR %2 ;CLEAR R2 SHIFT: ASL %0 ;SHIFT R0 LEFT AND ROL %4 ;ROTATE CARRY INTO LSB OF R1 INTO ROL %2 ;ROTATE CARRY OUT OF R1 INTO R2 DEC %3 ;DECREMENT R3 BNE SHIFT ;CONTINUE SHIFT LOOP ADD LONUM,%0 ;ADDN IN NUMBER TO MAKE X 129 ADC %4 ;PROPOGATE CARRY ADD HINUM,%4 p ;YES BIT 11 SET IN SR ; ; ; ; ; ; ; SPIRAL TEST EXT. ; ;WRITE TWO WORDS OF DATA ;STARTING WITH THE LAST ADDRESS OF TRACK0 ;DATA PATTERN = 25252 ;THEN READ THE DATA DOING ONE WORD ;X-FERS XSPIRAL: BIS #BIT8,@DCS ;CLEAR THE DISK MOV #340,@CSR ;LOCK UP PROCESSING MOV #1000,%6 ;SET UP STACK MOV #25252,OUTBUF ;SET UP DATA WORD 1 MOV #25252,OUTBUF+2 ;SET UP DATA WORD 2 MOV #2,WRDCT ;SET UP WORD COUNT MOV #OUTBUF,BUF ;SET UP CMA CLR TRACK ;SET UP DISK ADDR. MOV #3777,DMA WRITErKS 1 TO 10 OCTAL?@/ ; ; CON4: .ASCII /%EX. DK?@/ ; ; CON5: .ASCII /%OPT WRD CNT? @/ ; ; CON6: .ASCII /%LENGTH (1 TO 1000)?@/ ; ; CON7: .ASCII /%WRD ADDR?@/ ; ; CON8: .ASCII /%OPT. DATA PAT. #?@/ ; ; CON9: .ASCII /%WRITE?@/ ; ; CON10: .ASCII /%WRITE CHECK?@/ ; ; CON11: .ASCII /%READ?@/ ; ; ; END: .ASCII /%END@/ .EVEN ; ; ; ; .MACR OUTPUT N 0 ;OUTPUT DATA WORD N (DATA WRITTEN) .ENDM N=0 OUTBUF: .REPT 1000 OUTPUT \N N=N+1 .ENDR .MACR INPUT N 0 ;INPs;ADDN IN NUMBER TO MAKE X 129 ADC %2 ;PROPOGATE CARRY ADD #1057,%0 ;ADDN LOW CONSTANT ADC %4 ;PROPOGATE CARRIES ADC %2 ;PROPOGATE AGAN ADD #47401,%4 ;ADDN HIGH CONSTANT ADC %2 ;PROPOGATE CARRY ADD #6,%2 ;ADDN HIGHEST CONSTANT ADD %2,%0 ;REPRIME R0 WITH HIGH DIGIT ADC %4 ;PROPOGATE CARRY MOV %0,LONUM ;PUT R0 BACK IN LONUM MOV %0,(1)+ ;HOLD LONUM FOR PROGRAM DEC WORK BEQ EXGEN MOV %4,HINUM ;PUT R1 BACK IN HINUM MOV %4,(1)+ ;HOLD HINUM FOR PROGRAM DEC WORK BNE RANt ;WRITE DATA TSTB @DCS ;TEST FOR READY BPL .-4 ;CONTROL STILL BUSY TST @DCS ;TEST FOR ERROR BPL X1SPIL ;BRANCH IF NO ERROR MOV @DCS,WORK MOV #23,ERCOUNT ;SET UP ERROR COUNT ER23: JSR %5,STAER ;REPORT CONTROL ERROR ;****WRD1=DISK CONTROL STATUS REG. AT THE TIME OF THE ERROR **** BR XSPIRAL X1SPIL: DEC WRDCT ;SET UP FOR 1 WORD X-FER MOV #3777,DMA ;SET UP DAR MOV #INBUF,BUF ;SET UP CMA READ ;READ DAR 3777 TSTB @DCS ;TEST FOR NOT READY BPL .-4 ;CONTROL STILL BUSY TST @DUT DATA WORD N (DATA READ) .ENDM N=0 INBUF: .REPT 1000 INPUT \N N=N+1 .ENDR .END wDOM EXGEN: RTS %5 ;RETURN T PROGRAM LONUM: 0 HINUM: 0 ; ; ; ; ; ; ; .EVEN ; ;RF11 DATA PATTERNS ; PAT0: 0 PAT1: 177777 PAT2: 134510 PAT3: 043267 PAT4: 100000 PAT5: 107070 PAT6: 070707 PAT7: 052525 PAT10: 125252 PAT11: 177737 PAT12: 004102 PAT13: 136363 PAT14: 063636 PAT15: 000001 PAT16: 100005 PAT17: 000520 PAT20: 030303 ;PAT21 RANDOM DATA ; ; ; ;DATA COMPARISON ROUTINE ;IF AN ERROR OCCURS BETWEEN THE OUT-BUFFER AND ;THE IN-BUFFER AN ERROR WILL BE REPORTED IN THExCS ;TEST FOR ERROR BPL X2SPIL ;BRANCH IF NO ERROR MOV #24,ERCOUNT ;SET UP ERROR COUNT MOV @DCS,WORK ;REPORT CONTROL REG ER24: JSR %5,STAER ;****WRD1=DISK CONTROL STATUS REG. AT THE TIME OF THE THE ERROR **** BR XSPIRAL ;LOOP ON ERROR X2SPIL: CMP #25252,INBUF ;IS ADDR 3777 CORRECT BEQ X3SPIL ;BRANCH IF NOT EQUAL MOV #25,ERCOUNT ;SET UP ERROR COUNT MOV #25252,WORK1 ;GOOD DATA MOV OUTBUF,WORK ;DATA DATA ER25: JSR %5,STAER1 ;REPORT ERROR ;****WRD1=THE DATA THAT SHOULD BE IN ADDR.3777 { ;FOLLOWING MANNER ;DATA ERROR XX DAE XXXXXX DAR XXXXXX GOOD DATA XXXXXX BAD DATA ; ; COMPARE:CLR WORK2 ;WORD COUNT MOV #OUTBUF,SAVE ;SET UP OUTBUFFER POINTER MOV #INBUF,SAV1 ;SET UP IN BUFFER POINTER WRDCMP: CMP @SAVE,@SAV1 ;COMPARE BUFFERS BNE WDERR ;WORD IN ERROR WRDINC: INC WORK2 ;+1 WORD COUNT CMP WRDCT,WORK2 ;IS COMPLETE BUFFER CHECKED BEQ ADAM ;EXIT ROUTINE ADD #2,SAVE ADD #2,SAV1 BR WRDCMP ;COMPARE NEXT WORD ADAM: RTS %5 ;EXIT THIS ROUTINE ; WDERR: BIS #BIT9,FLAG|OF TRACK 0 **** ;****WRD2=THE DATA THAT WAS READ FROM ADDR. 3777 OF TRACK 0 **** BR XSPIRAL ;LOOP ON ERROR X3SPIL: INC DMA ;SET UP TO READ ADDR 4000 READ ;READ DATA TSTB @DCS ;TEST FOR READY BPL .-4 ;CONTROL STILL BUSY TST @DCS ;TEST FOR ERROR BPL X4SPIL ;BRANCH IF NO ERROR MOV #26,ERCOUNT ;SET UP ERROR COUNT MOV @DCS,WORK ;REPORT CONTROL REG. ER26: JSR %5,STAER ;REPORT ERROR ;****WRD1=DISK CONTROL STATUS REG. AT THE TIME OF THE ERROR **** BR XSPIRAL ;LOOP ON ERROR X4SPI ;SET ERROR BIT MOV DMA,WORK ;FETCH STARTING DISK ADDR MOV TRACK,WORK1 ; ADD WORK2,WORK ;CALCULATE FAILING ADDR BCC .+6 ;SHOULD DAE BE INCREMENTED INC WORK1 MOV FLAG,WORK3 BIC #177743,WORK3 BIS WORK3,WORK1 JSR %5,CONV ;CONVERT WORD ADDR TO ASCII WORK MES1 6 JSR %5,CONV ;CONVERT TRACK ADDR TO ASCII WORK1 MES1A 2 MOV @SAVE,WORK ;FETCH GOOD DATA JSR %5,CONV ;CONVERT GOOD DATA TO ASCII WORK MES5 6 MOV @SAV1,WORK ;FETCH BAD DATA JSR %5,CONV ;CONVERT TO ASCII €L: CMP #25252,INBUF ;CMP DATA BEQ LPXSPIL ;BRANCH IF DATA OK MOV #27,ERCOUNT ;SET UP ERROR COUNT MOV #25252,WORK1 ;GOOD DATA MOV INBUF,WORK ;DATA DATA ER27: JSR %5,STAER1 ;REPORT ERROR ;****WRD1=THE DATA THAT SHOULD BE IN ADDR. 0 OF TRACK 1 **** ;****WRD2=THE DATA THAT WAS READ FROM ADDR. 0 OF TRACK 1 **** BR XSPIRAL ;LOOP ON ERROR LPXSPIL:BIT #BIT11,@SR ;LOOP ON TEST? BNE XSPIRAL ;YES BIT11 SET IN SR, CLRREG: CLR DMA ;CLEAR WORD ADDRESS CLR TRACK ;CLEAR TRACK ADDRESS ; ; ; ; ƒ WORK MES6 6 MOV FLAG,WORK ;WHICH READ THE BIC #177774,WORK ;ERROR OCCURRED ON JSR %5,CONV WORK MES13 1 EMT +0 ;PRINT MESSAGE HED1 MES13 MES1A MES1 MES5 MES6 -1 BIT #BIT10,@SR ;HALT ON ERROR BEQ .+4 HALT ;YES HALT BIT 10 SET IN SR BR WRDINC ;GO COMPARE NEXT WORD ; ; ; ; ; ; ; ;ROUTINE TO ZERO DATA INPUT BUFFER ;ZERO BUFFER BEFORE READING ; ; ZBUF: MOV #INBUF,%4 ;FETCH START OF INBUFFER NZUF: CMP %4,#INBUF+2000 ;IS THE ROUTINE COMPLETE BNE CLEAR„; ; ; ; ; ; DATAT: MOV SWRDCT,WRDCT MOV #LDAT,HRDER ;SETUP FOR HARD ERROR MOV #340,@CSR ;LOCK UP PROCESSOR PRIORITY JSR %5,PASEL ;SET UP DATA BUFFERS LDAT: JSR %5,OPDSEL ;SET UP DISK ADDRESS BIT #BIT14,FLAG ;TEST FOR WRITE BEQ SLH ;TEST FOR WRITE CHECK MOV #OUTBUF,BUF ;SETUP OUTPUT BUFFER WRITE +100 ;WRITE WITH INT. ENABLED BIT #BIT9,@SR ;FIND OUT HOW TO WAIT FOR INT BNE WRWAIT ;WAIT WITH WAIT INSTRUCTION IOT ;WAIT IN BACKGROUND TEST BR SLH WRWAIT: MOV PRIORITY,@CSR WA‡ ;ZERO NEXT WORD RTS %5 ;EXIT ROUTINE CLEAR: CLR (4)+ ;CLEAR THE WORD BR NZUF ; ; ; ; ;ROUTINE TO TEST FOR ADDITIONAL DATA TRANSFERS ;ANY DATA TRANSFERRED AFTER WORD COUNT OVERFLOW IS AN ERROR ; ; OVRFLO: MOV WRDCT,%4 ;ADD WORD COUNT ROL %4 ADD #INBUF,%4 CHWRD: CMP %4,#INBUF+2000 ;IS TEST COMPLETE BNE CKNEX ;CHECK NEXT WORD RTS %5 ;TEST IS COMPLETE CKNEX: TST (4)+ ;TEST FOR ZERO WORD BEQ CHWRD ;WORD IS ZERO BIS #BIT9,FLAG ;SET ERROR BIT MOV %4,ACNVX SUB #2,ACNVX JSˆIT ;WAIT FOR FLAG SLH: BIT #BIT13,FLAG ;TEST FOR WRITE CHECK BEQ ESH ;TEST FOR READ MOV #OUTBUF,BUF ;SETUP OUTPUT BUFFER MOV #340,@CSR WRCHECK +100 ;WRITE CHECK WITH INT. ENABLE BIT #BIT9,@SR ;FINDOUT HOW TO WAIT FOR INT. BNE WCWAIT ;WAIT WITH WAIT INSTRUCTION IOT ;WAIT IN BACKGROUND TEST BR ESH WCWAIT: MOV PRIORITY,@CSR WAIT ;WAIT FOR FLAG ESH: BIT #BIT12,FLAG ;TEST FOR READ BEQ REH ;CHECK BUFFER MOV #INBUF,BUF ;SETUP OUTPUT BUFFER BIC #3,FLAG ;CLEAR RE-READ COUNT ‹R %5,CONV ;CONVERT 1 OCTAL TO ASCII ACNVX ;ADDRESS MES4 6 MOV %4,ACNVX SUB #2,ACNVX MOV @ACNVX,ACNVX JSR %5,CONV ;CONVERT OCTAL TO ASCII ACNVX ;DATA MES6 6 EMT +0 ;CALL TYPE OUT ROUTINE HED3 MES4 MES6 -1 BR CHWRD ;FETCH NEXT WORD ; ; ; ; ; ; ;EXTENDED MEMORY EXERCISER ;THE PROGRAM DETERMINES HOW MUCH MEMORY ;IS ON THE SYSTEM THEN IT ;GENERATES A RANDOM BUFFER THAT SIZE ;AND WRITES AND WRITE CHECKS THE DATA ; EXTMEN: BIS #BIT8,@DCS ;CLEAR THE DISK MŒ DSKRD: MOV #340,@CSR JSR %5,ZBUF ;CLEAR BUFFER INC FLAG READ +100 ;READ + INT ENABLE BIT #BIT9,@SR ;FIND OUT HOW TO WAIT FOR INT. BNE RDWAIT ;WAIT WITH WAIT INSTRUCTION IOT BR ELH RDWAIT: MOV PRIORITY,@CSR ;SET UP PRIORITY WAIT ;WAIT FOR FLAG ELH: BIT #BIT12,@SR BNE ADRD JSR %5,COMPARE ;COMPARE OUTBUFFER TO INBUFFER ADRD: JSR %5,OVRFLO ;TEST FOR EXTRA DATE BREAKS MOV FLAG,WORK ;CHECK DISK RE-READ COUNT BIC #177774,WORK ;DO 3 RE-READS. CMP #3,WORK BNE DSKRD ;DO ANOTHOV #340,@CSR ;LOCK UP PRIORITY LEVELS MOV #1000,%6 MOV #MAXREF,4 ;SET UP I/O BUS TRAP MOV #340,6 MOV #17446,SAVE ;SET UP FOR 4K EXREF: TST @SAVE ;REFERENCE MEMORY CMP #177446,SAVE ;TEST FOR GREATER THAN 28K BNE .+6 ;BRANCH IF LESS THAN 32K HALT BR MAXREF ;LAST REFERENCE MADE TO I/O REG. ADD #20000,SAVE ;SET UP FOR NEXT MEMORY REF. BR EXREF ;GO REFERENCE MEMORY ; ;ENTER HERE WHEN I/O BUS ERROR OCCURS ; MAXREF: MOV #6,4 ;RESTORE I/O BUS TRAP CLR 6 MOV #1000,%6 SUB #20000,ER RE-READ REH: BIT #BIT8,@SR BNE DATAT JSR %7,DISBUF ;GO SET UP DISK BUFFER. BR LDAT MSTR: TST FLAG BPL .+6 ;UNDER PROGRAM CONTROL JMP EXTPP ;OPERATOR SELECTED PATTERN ADD #2,PATNU ;INC PATTERN INDEX CMP #44,PATNU BNE DATAT ;NOT LAST PATTERN EXIT CLR PATNU ;LAST PATTERN EXIT ; ;THIS IS A RANDOM DATA, RANDOM ADDRESS ;AND RANDOM WORD COUNT ; ;WORD COUNT CAN BE EQUAL TO OR LESS THAN 1000 WORDS ; RANEX: MOV #-1000,PASSC MOV #1000,%6 BIC #BIT9,FLAG MOV #RANER,HRDER ;SET “SAVE ; SUB #OUTBUF,SAVE ;SET UP NEW WORD COUNT MOV SAVE,SWRDCT ROR SWRDCT MOV SWRDCT,WRDCT MOV #BIT7,@CSR ;SET UP PRIORITY LEVEL MOV #NEWBUF,HRDER ;SET UP FOR HARD ERROR CLR DMA CLR TRACK NEWBUF: MOV WRDCT,WORK ;SET UP FOR RANDOM BUFFER MOV #OUTBUF,%1 JSR %5,RANDOM ;NEW DATA BUFFER GENERATED MOV #OUTBUF,BUF WRITE+100 ;WRITE BUFFER BIT #BIT9,@SR BNE .+6 IOT BR .+12 MOV PRIORITY,@CSR WAIT WRCHECK+100 ;WRITE CHECK DATA BIT #BIT9,@SR BNE .+6 IOT BR .+12 MOV P”UP FOR HARD ERROR MOV PRIORITY,@CSR ;SET PRIORITY TO LEVEL 5 WRLG: MOV #3,WORK ;GENERATE RANDOM WORD MOV #OUTBUF,%1 JSR %5,RANDOM BIC #177000,OUTBUF ;MASK FOR WORD LENGTH=1K BEQ WRLG MOV OUTBUF,WRDCT ;SET UP WORD COUNT MOV OUTBUF+2,DMA ;SET UP DAR ADD WRDCT,DMA BCS WRLG MOV OUTBUF+2,DMA BIC #177774,OUTBUF+4 MOV OUTBUF+4,TRACK ;SET UP DAE MOV WRDCT,WORK ;GENERATE RANDOM MOV #OUTBUF,%1 ;DATA BUFFER JSR %5,RANDOM MOV #OUTBUF,BUF BIS #BIT8,@DCS ;CLEAR THE DISK WRITE +100 —RIORITY,@CSR WAIT JSR %7,DISBUF ;SET UP NEW DISK BUFFER BR NEWBUF ;GO WRITE NEW BUFFER BR NEWBUF-10 ;DISK COMPLETE START AGAIN ; ;BACKGROUND TEST FOR INTERRUPTS ; XWAIT: MOV #RTIX,14 ;SET UP TRACE TRAP CLR 16 MOV #-1000,PASS ;SET UP TIME BASE BIS #BIT4,@CSR ;SET TRACE BIT CLR #0 XINCW: INC XINCW-2 TSTB XINCW-2 BPL XINCW INC PASS BEQ .+4 BR XINCW-4 ;REPORT BACKGROUND TEST TIMED OUT MOV #340,@CSR BIC #BIT4,@CSR ;CLEAR TRACE BIT EMT+1 TIMO HALT ; RTIX: RTI ˜ ;WRITE DATA BIT #BIT9,@SR BNE .+6 IOT BR .+12 MOV PRIORITY,@CSR WAIT WRCHECK +100 ;WRITE CHECK DATA BIT #BIT9,@SR BNE .+6 IOT BR .+12 MOV PRIORITY,@CSR WAIT MOV #INBUF,BUF ;SET UP BUFFER JSR %5,ZBUF ;CLEAR BUFFER AREA READ +100 ;READ DATA BIT #BIT9,@SR BNE .+6 IOT BR .+12 MOV PRIORITY,@CSR WAIT JSR %5,COMPARE ;COMPARE OUT BUFFER TO IN BUFFER JSR %5,OVRFLO ;TEST FOR EXTRA DATA BREAKS RANER: BIT #BIT9,FLAG ;CHECK FOR ERROR BEQ EXRAX BIC #BIT9,FLAG J›;RF11 POWER FAIL TEST "1 ; DISK ZERO ; WRITE COMPLETE DISK WITH 125252 PATTERN ; REPORT "OK" ;START WRITING THE SAME PATTERN ;WHEN POWER FAIL OCCURS ABORT TRANSFER ;SETUP NEW ENTRY POINT AND HALT ; ;POWER UP AND WRITE CHECK THE DISK FOR ERRORS ; ;***ONLY ONE ERROR IS CONSIDERED ACCEPTABLE*** ; ; PFT1: MOV #1000,%6 ;SET UP STACK JSR %7,POWFAL ;WRITE 125252 ON DISK PFWAT: BIS #BIT8,@DCS ;CLEAR DISK CLR DMA CLR TRACK MOV #PFWAT,HRDER ;SET UP FOR HARD ERROR MOV #DOWN,24 ;SET UP POWER FœSR %5,CONV DMA MES1 6 JSR %5,CONV TRACK MES1A 2 JSR %5,CONV WRDCT MES3 4 EMT+0 HED6 MES1A MES1 MES3 -1 EXRAX: INC PASSC ;HAVE WE DONE IT 1000 TIMES BNE WRLG ;BRANCH IF NO BIT #BIT11,@SR ;LOOP ON TEST BEQ .+6 ;BRANCH IF YES JMP RANEX ; ;CHECK FOR MULTI DISK MODE ;IF IN MULTI DISK MODE REPORT "END" ;IF LAST DISK ON SYSTEM HAS BEEN ;EXERCISED. ; ; CLR DMA CLR TRACK BIT #BIT11,FLAG ;ARE WE IN MULTI DISK MODE BEQ REPOEN ;REPORT "END" MOV FLAG,WORŸAIL VEC. MOV #340,26 MYBYWR: WRITE +100 BIT #BIT9,@SR BNE .+6 IOT BR .+12 MOV PRIORITY,@CSR WAIT JSR %7,DISBUF ;SET UP NEW DISK BUFFER BR MYBYWR BR PFWAT ;ROUTINE TO CHECK DATA AFTER POWER FAIL ; UPCHK: BIS #BIT8,@DCS ;CLEAR THE DISK CLR DMA CLR TRACK MOV #UPCHK,HRDER ;SET UP FOR HARD ERROR CHKDAT: WRCHECK +100 BIT #BIT9,@SR BNE .+6 IOT BR .+12 MOV PRIORITY,@CSR WAIT JSR %7,DISBUF ;SET UP NEW DISK BUFFER BR CHKDAT JMP PFWAT ;GO WAIT FOR ANOTHER ;POWER K ;WHAT DISK ARE WE ON BIC #177743,WORK ;IF LAST DISK ON SYSTEM CMP WORK,DSKNOR ;REPORT END BEQ REPOEN ;REPORT "END" LAST DISK ADD #4,FLAG ;INC. DISK NO. BR EXTPP ;EXERCISE DISK REPOEN: EMT +1 END ;REPORT END OF PASS BIC #34,FLAG EXTPP: JMP ADTST ;RECYCLE ; ;ENTER DISK HANDLER BY THE TRAP INSTRUCTION ;ARGUMENT TO TRAP INSTRUCTION IS TWO ORDER ;BYTE OF THE CONTROL REGISTER. ; DISK: MOV DBR,%5 ;SET UP TO LOAD DISK REG MOV TRACK,-(5) ;LOAD TRACK NUMBER MOV FLAG,WORK ;SET UP DЃ FAIL ; ;POWER DOWN ROUTINE ;ABORT DISK AND HALT ; ; DOWN: BIS #BIT8,@DCS ;ABORT DISK MOV #UP,24 ;SET POWER FAIL VECTOR HALT ; UP: MOV #DOWN,24 MOV #1000,%6 MOV #-300.,WORK ;SET UP TWENTY SECOND TIMER TIMCNT: RESET INC WORK ;+1 TIMER BNE TIMCNT ;TWO SECONDS NOT UP GO WAIT JMP UPCHK ;GO CHECK DISK ; ; ; ; ; ; ;POWER FAIL TEST #2 ;DISK ZERO ;WRITE COMPLETE DISK WITH 125252 PATTERN ;REPORT "OK" ;WRITE CHECK DISK AND WAIT FOR POWER FAIL ;WHEN POWER COMES BACK WRITE CЄISK NO. BIC #177743,WORK ;MASK FORM PROGRAM FLAG BIS WORK,(5) ;LOAD UNIT INTO DAE MOV DMA,-(5) ;LOAD WORD ADDRESS MOV BUF,-(5) ;SET UP CURRENT ADDRESS MOV WRDCT,-(5) ;LOAD WORD COUNT COM (5) ;SET UP TWO'S COMPLEMENT INC (5) MOV (6),%4 MOV -(4),WORK ; BIC #177600,WORK ;MASK FUNCTION BITS MOV WORK,-(5) ;LOAD FUNCTION REG. RTI ;RETURN FROM TRAP ; ; ; ; ; ; ; ;RF11 DISK INTERRUPT HANDLER ;ROUTINE CONTINUES ON ERRORS ; DKINT: BIC #BIT4,@CSR ;CLEAR TRACE BIT TST @DCS ;TEЇHECK DISK AGAIN ;AND CHECK FOR ERRORS ;***NO ERRORS SHOULD OCCUR.*** ; ;DO NOT CREATE ANOTHER POWER FAIL UNTIL ;THE ADDRESS REGISTER HAS COMPLETELY CYCLED ;THROUGH. ; PFT2: MOV #1000,%6 ;SET UP STACK JSR %7,POWFAL ;WRITE 125252 ON DISK PWRFL: CLR DMA CLR TRACK MOV #PWRFL,HRDER ;SET UP HARD ERROR MOV #PWRDN,24 ;SET UP POWER FAIL VEC. MOV #340,26 CHKDSK: WRCHECK +100 BIT #BIT9,@SR BNE .+6 IOT ;WAIT IN BACKGROUND BR .+12 MOV PRIORITY,@CSR WAIT JSR %7,DISBUF ;CHECK NEXT BUFЈST FOR ERROR BPL INTEXT ;BRANCH IF NO ERROR BIS #BIT9,FLAG ;SET ERROR BIT MOV @DAE,WORK ;REPORT ERROR BIC #177700,WORK ;MASK ADDRESS EXT. BITS. JSR %5,CONV ;CONVERT TO ASCII WORK MES1A 2 EMT+1 HED2 MOV @DCS,WORK ;TEST FOR READ BIC #177770,WORK CMP #4,WORK BNE DELMES ;IF READING REPORT WHICH READ MOV FLAG,WORK BIC #177774,WORK JSR %5,CONV WORK MES13 1 EMT+1 MES13 DELMES: MOV @DAR,WORK ;SET UP LOWER 16 BITS OF ADDR. DEC WORK JSR %5,CONV ;CONVERT TO ASCЋFER BR CHKDSK BR PWRFL ; ;ROUTINE TO ABORT DISK DURING POWER FAIL ; PWRDN: BIS #BIT8,@DCS ;CLEAR THE DISK MOV #PWRUP,24 ;SET UP RESTART HALT ; PWRUP: MOV #PWRDN,24 ;RESET POWER FAIL VECTOR MOV #1000,%6 MOV #-300.,WORK ;SET UP TWENTY SECOND TIMER XTIMCNT: RESET INC WORK ;+1 TIMER BNE XTIMCNT ;TWO SECONDS NOT UP GO WAIT BR PWRFL ;GO CHECK DISK ; ; ; ; ; ;ROUTINE TO WRITE THE COMPLETE DISK ;WITH 125252 PATTERN ;WRITE CHECK AND REPORT ERRORS IF THEY ;OCCUR ;REPORT "OЌII WORK MES1 6 EMT+0 MES1A MES1 -1 MOV @DCS,WORK ;SET UP STATUS JSR %5,CONV WORK MES2 6 EMT+1 MES2 BIT #BIT14,@DCS ;TEST FOR HARD ERROR BEQ SOFTER ;GO AND CONTINUE SOFT ERROR MOV @DAE,WORK ;FETCH ERROR EXT. BITS SWAB WORK BIC #177400,WORK JSR %5,CONV ;CONVERT TO ASCII WORK MES2A 3 EMT+0 HED5A MES2A -1 BIS #BIT8,@DCS ;CLEAR THE DISK MOV #1000,%6 BIT #BIT10,@SR ;HALT ON ERROR BEQ .+4 HALT ;YES HALT BIT 10 SET IN SR JMP @HRDER ;EXIT HARЏK" AT COMPLETION POWFAL: BIS #BIT8,@DCS ;CLEAR THE DISK MOV (6),PASSC MOV #1000,%6 MOV #20,PATNU ;SET UP PATTERN CLR DMA CLR TRACK MOV #2000,SWRDCT ;SETUP WORD COUNT MOV SWRDCT,WRDCT JSR %5,PASEL ;GENERATE DATA BUFFER MOV #OUTBUF,BUF ;SET UP CURRENT ADDRESS MOV #POWFAL,HRDER WRDNW: WRITE +100 BIT #BIT9,@SR ;CHECK ON HOW TO WAIT BNE .+6 IOT ;BACKGROUND TEST BR .+12 MOV PRIORITY,@CSR WAIT WRCHECK +100 BIT #BIT9,@SR ; BNE .+6 IOT BR .+12 MOV PRIORITY,@CSR WAIАD ERROR SOFTER: TST @WC ;CHECK FOR X-FER DONE BEQ INTEXT ;EXIT FROM ROUTINE BIT #BIT9,@SR BEQ .+6 SUB #2,(6) ;X-FER NOT DONE SET UP FOR RETURN BIT #BIT10,@SR ;HALT ON ERROR BEQ .+4 HALT ;YES HALT BIT10 SET IN SR BIS #BIT0,@DCS ;SET GO AND CONTINUE RTI ;RETURN TO WAIT INSTR. ; ; INTEXT: BIT #BIT13,@SR ;HALT ON COMPLETION FLAG BEQ .+4 HALT ;YES BIT 13 SET IN SR HALT BIT #BIT9,@SR BNE .+6 MOV #774,%6 ;RESET STACK RTI ;EXIT ; ; ; ; ;ROUTINE TO SET UP DAR AГT JSR %7,DISBUF ;SET UP NEW DISK BUFFER BR WRDNW ;WRITE NEW BUFFER EMT +1 OK JMP @PASSC ;ROUTINE TO ALLOW THE OPERATOR TO SET BITS ;IN THE I/O REGISTERS VIA THE SWITCH REGISTER ; ;WORD COUNT REGISTER SELWC: MOV @SR,@WC ;MOV SR INTO WORD COUNT REG BR SELWC ; ;CURRENT ADDRESS REGISTER SELCMA: MOV @SR,@CMA ;MOV SR INTO CURRENT ADDR REG BR SELCMA ; ;DISK ADDRESS REGISTER SELDAR: MOV @SR,@DAR ;MOV SR INTO DISK ADDR REG BR SELDAR ; ;DISK ADDRESS EXT AND ERROR REGISTER SELDAE: ДND DAE ;FROM SR AND CONVERSATION ;ENTER FROM JSR %5,OPDSEL OPDSEL: BIT #BIT7,@SR ;DOES SR CONTAIN TRACK # BNE .+4 RTS %5 MOV @SR,WORK ;FETCH SR ROR WORK ROR WORK ROR WORK ROR WORK ROR WORK BIC #177774,WORK ;MASK AIGL ORDER 2 BITS MOV WORK,TRACK MOV @SR,WORK ROL WORK ROL WORK ROL WORK ROL WORK ROL WORK ROL WORK ROL WORK ROL WORK ROL WORK ROL WORK ROL WORK BIC #003777,WORK BIC #174000,DMA ADD WORK,DMA ;SET UP LOWER 16 BITS OF ADDRESS RTS %5 ;EXIT ;ЗMOV @SR,@DAE ;MOV SR INTO DISK ADDR EXT REG BR SELDAE ; ;DATA BUFFER REGISTER SELDBR: MOV @SR,@DBR ; MOV SR INTO DATA BUFFER BR SELDBR ; ; ;LOOK AHEAD REGISTER MOVLK: MOV @ADS,%0 ;MOVE LOOK AHEAD RESET RESET BR MOVLK ;INTO REGISTER 0 ; ; ;DISK CONTROL STATUS REGISTER SELDCS: MOV #340,@CSR ;LOCK UP INTERRUPTS MOV #177777,@WC ;SET WORD COUNT -1 WORD MOV #OUTBUF,@CMA ;SET UP CURRENT ADDRESS MOV @SR,@DCS ;MOV SR INTO CONTROL REG BIT #BIT0,@DCS ;IS FUNCTION BITS SET BEQ SELDCSИ ;ROUTINE TO SETUP DISK BUFFERS ;ADD WORD COUNT TO STARTING DISK ADDRESSES ;COMPARE CALCULATED ADDRESS TO TERMINATING ADDRESS ; DISBUF: ADD WRDCT,DMA ;ADD WORD COUNT TO LOWER 16 BITS BCC COMDAR INC TRACK ;OVERFLOW ADD ONE TO TRACK COMDAR: CMP DMA,@DAR ;COMPARE LOWER 16 BITS BEQ CMDAE BIS #BIT6,FLAG ; CMDAE: MOV @DAE,WORK1 ;FETCH EXT. ADDR BITS BIC #177740,WORK1 ;MASK TRACK AND DISK ADDR MOV FLAG,WORK ;SET UP DISK ADDRESS BIC #177743,WORK ADD TRACK,WORK BIC #177740,WORK CMP WORЛ ;FUNCTION BITS NOT SET DKBUSY: TSTB @DCS ;TEST FOR DISK NOT READY BPL DKBUSY ;DISK STILL READY BR SELDCS ;DISK NOT BUSY SELECT NEW CR ; ; ; ; ; ; ; ; ;THIS ROUTINE ENABLES THE OPERATOR TO SELECT A TRACK STATICLY ;THE ROUTINE DOES A ONE WORD READ TO SELECT THE TRACK ;THE OPERATOR MAY CHANGE THE SWITCH REGISTER AT ANY TIME ;SR6-0 EQUALS THE TRACK NUMBER ;SR9-7 EQUALS THE DISK NUMBER ; STAMP: BIS #BIT8,@DCS MOV @SR,WORK1 ;FETCH SR MOV WORK1,WORK BIC #176000,WORK ;MASK THE TRAМK,WORK1 ;ARE THEY EQUAL BNE ERADR ;ERROR IN DAE REG TSTB FLAG ;CHECK FOR LAST DISK BUFFER BPL EXTCME CLR DMA ;CLEAR LOWER 16 BITS CLR TRACK ;CLEAR EXT. ADDR. BITS. BIC #200,FLAG ADD #2,(6) ;INC STOCK POINTER MOV SWRDCT,WRDCT BR EXTDR ;EXIT EXTCME: BIC #177774,WORK1 ;MASK EXT. TRACK BITS CMP #3,WORK1 ;COMPARE FOR LAST TRACK BNE AKH ;NOT LAST TRACK EXIT MOV @DAR,WORK ;FETCH LOWER 16 BITS OF ADDRESS ADD WRDCT,WORK ;WILL DISK OVERFLOW BCC AKH BIS #200,FLAG MOV @DAR,WRDCПCK AND DISK NO. ROR WORK ROR WORK ROR WORK ROR WORK ROR WORK MOV WORK,@DAE ;DISK EXT. ADDR. REG. LOADED MOV @SR,WORK SWAB WORK ROL WORK ROL WORK ROL WORK BIC #3777,WORK MOV WORK,@DAR ;DISK ADDRESS REG LOADED MOV #INBUF,@CMA ;LOAD CURRENT ADDRESS MOV #177777,@WC ;LOAD WORD COUNT BIS #5,@DCS ;GO AND READ CTBUSY: TSTB @DCS ;TEST FOR CONTROL NOT READY BPL CTBUSY ;WAIT FOR CONTROL NOT READY SRCHG: CMP WORK1,@SR BNE STAMP ;SR HAS CHANGED BR SRCHG ;SR HAS NOT CHANGED РT ;DISK WILL OVERFLOW COM WRDCT ;SET UP NEW WORD COUNT INC WRDCT ;MAKE TWO'S COMP. AKH: MOV @DAE,TRACK BIC #177774,TRACK ;MASK TRACK BITS MOV @DAR,DMA ;LOWER 16 BITS OF ADDRESS BIT #BIT6,FLAG ;REPORT ADDRESS ERROR BNE .+4 EXTDR: RTS %7 ;EXIT ERADR: JSR %5,CONV ;CONVERT DMA REG COUNT TO ASCII DMA MES1 6 JSR %5,CONV ;CONVERT TRACK REG COUNT TO ASCII WORK1 MES1A 2 EMT +0 ;REPORT ERROR HED4 MES1A MES1 -1 BIC #BIT6,FLAG CLR DMA ;DISK ADDRESS ERROR RE-START PROGУ ; ; ; ; ; ; ; ;ROUTINE TO REPORT ERROR COUNT AND CONTENTS OF ONE REGISTER ; STAER: JSR %5,CONV ;CONVERT OCTAL TO ASCII WORK ;DATA TO BE CONVERTED MES10 ;ADDRESS OF MESSAGE 6 JSR %5,CONV ;CONVERT OCTAL TO ASCII ERCOUNT ;ERROR COUNT TO BE CONVERTED HED5 ;ADDRESS OF MESSAGE 3 EMT +0 ;REPORT MESSAGE HED5A HED5 MES10 -1 RTS %5 ;EXIT ROUTINE ; ;ROUTINE TO REPORT ERROR COUNT AND THE CONTENTS OF TWO REGISTERS ; ; ; STAER1: JSR %5,CONV ;CONVERT OCTAL TO ASCIФ. CLR TRACK BIT #BIT10,@SR ;HALT ON ERROR BEQ .+4 HALT ;SWITCH 10 SET IN SR HALT RTS %7 ; ; ; ; ; ; ;ROUTINE TO SELECT DATA PATTERNS FOR TEST ; ;ENTER FROM JSR %5 PASEL ; PASEL: MOV PATNU,%0 ;SET UP PATTERN NUMBER MOV WRDCT,WORK ;SET UP WORK MOV #OUTBUF,%1 ;LOC. OF OUTBUFFER CMP #42,%0 ;TEST FOR RANDOM DATA NUMBER BEQ RANDOM ;GO GENERATE RANDOM DATA FILDAT: MOV PAT0(0),(1)+ ;FILL BUFFER DEC WORK ;DEC. WORK COUNT TST WORK ;TEST FOR LAST WORK BNE FILDAT ;LOAD NEЧI WORK ;DATA TO BE CONVERTED MES10 ;ADDRESS OF MESSAGE 6 JSR %5,CONV ;CONVERT OCTAL TO ASCII WORK1 ;DATA TO BE CONVERT MES10A ;ADDRESS OF MESSAGE 6 JSR %5,CONV ;CONVERT OCTAL TO ASCII ERCOUNT ;ERROR COUNT TO BE CONVERTED HED5 ;ADDRESS OF MESSAGE 3 EMT +0 ;REPORT MESSAGE HED5A HED5 MES10 MES10A -1 RTS %5 ;EXIT ROUTINE ; ; ;ROUTINE TO DECODE EMT CALLS ;EMT+1=TYPE ONE LINE OF TEXT ;EMT+0=TYPE A SERIES OF LINES EMTRP: MOV (6),%0 CMP #EMT+1,-(0) ;WAS ШXT WORD RTS %5 ;BUFFER FULL ; ;RANDOM DATA ; ; ; ; ;RANDOM DATA GENERATOR SUBROUTINE RANDOM: MOV LONUM,%0 ;SET UP R0 WITH 5 DIGITS LOW MOV HINUM,%4 ;SET UP R1 WITH 5 DIGITS HIGH MOV #7,%3 ;SET UP SHIFT COUNT CLR %2 ;CLEAR R2 SHIFT: ASL %0 ;SHIFT R0 LEFT AND ROL %4 ;ROTATE CARRY INTO LSB OF R1 INTO ROL %2 ;ROTATE CARRY OUT OF R1 INTO R2 DEC %3 ;DECREMENT R3 BNE SHIFT ;CONTINUE SHIFT LOOP ADD LONUM,%0 ;ADDN IN NUMBER TO MAKE X 129 ADC %4 ;PROPOGATE CARRY ADD HINUM,%4 ЫTHE CALL EMT+1 BNE TYPS ;NO! TYPE A SERIES OF LINES OF TEXT BR TYP ;YES TYPE ONE LINE OF TEXT ;SUBROUTINE TO OUTPUT ASCII MESSAGE ON TELETYPE PRINTER. TYP: MOV @%6,%0 ;GET ADDRESS THAT CONTAINS MESSAGE ADDRESS ADD #2,@%6 ;SET UP EXIT. MOV @%0,%0 ;ADDRESS OF MESSAGE TO R0. TYPA: MOVB (0)+,TYPDAT ;GET CHARACTER CMPB #100,TYPDAT ;CHECK FOR "@" CHARACTER BNE TYPC ;CRANCH IF NOT "@". RTI ;TERMINATOR CHAR. DONE. EXIT. TYPC: CMPB #45,TYPDAT ;CHECK FOR "%". BEQ TYPF ;BRANCH IF "%". Ь;ADDN IN NUMBER TO MAKE X 129 ADC %2 ;PROPOGATE CARRY ADD #1057,%0 ;ADDN LOW CONSTANT ADC %4 ;PROPOGATE CARRIES ADC %2 ;PROPOGATE AGAN ADD #47401,%4 ;ADDN HIGH CONSTANT ADC %2 ;PROPOGATE CARRY ADD #6,%2 ;ADDN HIGHEST CONSTANT ADD %2,%0 ;REPRIME R0 WITH HIGH DIGIT ADC %4 ;PROPOGATE CARRY MOV %0,LONUM ;PUT R0 BACK IN LONUM MOV %0,(1)+ ;HOLD LONUM FOR PROGRAM DEC WORK BEQ EXGEN MOV %4,HINUM ;PUT R1 BACK IN HINUM MOV %4,(1)+ ;HOLD HINUM FOR PROGRAM DEC WORK BNE RANЯ CMPB #42,TYPDAT ;NOT "%". CHECK FOR "#". BEQ TYPG ;BRANCH IF "#" JSR %7,TYPD ;TYPE CHAR IN TYPDAT BR TYPA TYPD: BIT #BIT14,@SR BNE TYEXIT MOVB TYPDAT,@TPB ;OUTPUT CHARACTER TO PRINTER TSTB @TPS ;WAIT FOR DONE FLAG. BPL .-4 TYEXIT: RTS %7 ;EXIT TYPF: MOVB #15,TYPDAT ;MOVE CARRIAGE RETURN CODE TO TYPDAT JSR %7,TYPD ;GO TYPE CHAR. TYPG: MOVB #12,TYPDAT ;MOVE LF CODE TO TYPDAT. JSR %7,TYPD ;GO TYPE CHAR. BR TYPA TYPDAT: 0 ;SUBROUTINE TO OUTPUT A SERIES OF ASCII MESSAGES ON TEаDOM EXGEN: RTS %5 ;RETURN T PROGRAM LONUM: 0 HINUM: 0 ; ; ; ; ; ; ; .EVEN ; ;RF11 DATA PATTERNS ; PAT0: 0 PAT1: 177777 PAT2: 134510 PAT3: 043267 PAT4: 100000 PAT5: 107070 PAT6: 070707 PAT7: 052525 PAT10: 125252 PAT11: 177737 PAT12: 004102 PAT13: 136363 PAT14: 063636 PAT15: 000001 PAT16: 100005 PAT17: 000520 PAT20: 030303 ;PAT21 RANDOM DATA ; ; ; ;DATA COMPARISON ROUTINE ;IF AN ERROR OCCURS BETWEEN THE OUT-BUFFER AND ;THE IN-BUFFER AN ERROR WILL BE REPORTED IN THEгLETYPE PRINTER TYPS: MOV @%6,%0 ;GET ADDRESS THAT CONTAINS MESSAGE ADDRESS ADD #2,@%6 ;UPDATE TO NEXT MESSAGE ADDRESS MOV @%0,TYPSB ;ADDRESS OF MESSAGE TO TYPSB CMP #-1,TYPSB ;CHECK FOR TERMINATOR BNE TYPSA ;BRANCH IF NOT TERMINATOR. RTI ;TERMINATOR. EXIT TYPSA: EMT +1 ;CALL ON TYP SUB TO TYPE MESSAGE TYPSB: 0 ;ADDRESS OF MESSAGE GOES HERE BR TYPS ;GO PROCESS NEXT MESSAGE ; ; ; ; ;OCTAL TO ASCII CONVERT ROUTINE ; ;ENTER ROUTINE AS FOLLOWS ;JSR%5,CONV ;ADDR#=ADDRESS OF NUMBд ;FOLLOWING MANNER ;DATA ERROR XX DAE XXXXXX DAR XXXXXX GOOD DATA XXXXXX BAD DATA ; ; COMPARE:CLR WORK2 ;WORD COUNT MOV #OUTBUF,SAVE ;SET UP OUTBUFFER POINTER MOV #INBUF,SAV1 ;SET UP IN BUFFER POINTER WRDCMP: CMP @SAVE,@SAV1 ;COMPARE BUFFERS BNE WDERR ;WORD IN ERROR WRDINC: INC WORK2 ;+1 WORD COUNT CMP WRDCT,WORK2 ;IS COMPLETE BUFFER CHECKED BEQ ADAM ;EXIT ROUTINE ADD #2,SAVE ADD #2,SAV1 BR WRDCMP ;COMPARE NEXT WORD ADAM: RTS %5 ;EXIT THIS ROUTINE ; WDERR: BIS #BIT9,FLAGзER TO BE CONVERTED ;ADDR BYTE=LSB OF WHERE ASCII IS GOING ;ASCII#=THE NUMBER OF ASCII CHAR. TO BE CONVERTED ; ; CONV: MOV @(5)+,ACNVX ;VALUE OF # TO BE CONVERTED MOV (5)+,%1 ;ASCII ADDR MOV (5)+,%2 ;# OF ASCII CHAR ADD %2,%1 ACVN: MOV ACNVX,%3 BIC #177770,%3 ;ISOLATE LEAST SIGNIFICANT OCTAL# ADD #60,%3 ;SET UP ASCII# MOVB %3,-(1) ;STORE ASCII CHAR BIC #7,ACNVX ROR ACNVX ;ROTATE OCTAL# ROR ACNVX ROR ACNVX DEC %2 ;-1 FROM ASCII CHAR COUNT BNE ACVN RTS %5 ;EXIT # CONVERи ;SET ERROR BIT MOV DMA,WORK ;FETCH STARTING DISK ADDR MOV TRACK,WORK1 ; ADD WORK2,WORK ;CALCULATE FAILING ADDR BCC .+6 ;SHOULD DAE BE INCREMENTED INC WORK1 MOV FLAG,WORK3 BIC #177743,WORK3 BIS WORK3,WORK1 JSR %5,CONV ;CONVERT WORD ADDR TO ASCII WORK MES1 6 JSR %5,CONV ;CONVERT TRACK ADDR TO ASCII WORK1 MES1A 2 MOV @SAVE,WORK ;FETCH GOOD DATA JSR %5,CONV ;CONVERT GOOD DATA TO ASCII WORK MES5 6 MOV @SAV1,WORK ;FETCH BAD DATA JSR %5,CONV ;CONVERT TO ASCII лTED ACNVX: 0 ;WORK REGISTER ; ; ; ; ;ROUTINE TO HANDLE KEYBOARD CONVERSATION ;ROUTINE ACCEPTS NUM. OR ALPHA CHARACTERS ; NOCHA: MOV #40,TSTCH ;SET UP FOR NUM. CHAR. BR TYST ALPHA: MOV #100,TSTCH ;SET UP FOR ALPHA CHAR TYST: MOV #340,@CSR ;LOCK UP INTERRUPTS CLR TEXBUF ;CLEAR TEXT BUFFER REG TSTFLG: TSTB @TKS ;CHECK FOR FLAG BPL TSTFLG ; MOV @TKB,@TPB ;CHARACTER IN BUFFER TSTB @TPS ;ECHO CHARACTER BPL .-4 CMP #377,@TKB ;CHECK FOR RUB-OUT BNE CKCH ;EXIT IF NOT RUB-OUT EMм WORK MES6 6 MOV FLAG,WORK ;WHICH READ THE BIC #177774,WORK ;ERROR OCCURRED ON JSR %5,CONV WORK MES13 1 EMT +0 ;PRINT MESSAGE HED1 MES13 MES1A MES1 MES5 MES6 -1 BIT #BIT10,@SR ;HALT ON ERROR BEQ .+4 HALT ;YES HALT BIT 10 SET IN SR BR WRDINC ;GO COMPARE NEXT WORD ; ; ; ; ; ; ; ;ROUTINE TO ZERO DATA INPUT BUFFER ;ZERO BUFFER BEFORE READING ; ; ZBUF: MOV #INBUF,%4 ;FETCH START OF INBUFFER NZUF: CMP %4,#INBUF+2000 ;IS THE ROUTINE COMPLETE BNE CLEARпT +1 MES8 ;REPORT RUB-OUT ACKNOWLEDGED BIC #7,TEXBUF ROR TEXBUF ROR TEXBUF ROR TEXBUF BR TSTFLG ;GO WAIT FOR NEW CHAR. CKCH: CMP #215,@TKB ;CHECK FOR CARRIAGE RETURN BNE .+4 RTS %7 ;EXIT DELIMITER TYPED BIT TSTCH,@TKB BNE CHOK EMT +1 ;REPORT QUESTION MARK MES7 BR TSTFLG ;WAIT FOR CORRECT CHAR. CHOK: MOV @TKB,WORK BIC #177770,WORK CLC ROL TEXBUF CLC ROL TEXBUF CLC ROL TEXBUF ADD WORK,TEXBUF ;ADD CHARACTER BR TSTFLG ;WAIT FOR NEW CHARACTER TEXBUF: 0 TSTр ;ZERO NEXT WORD RTS %5 ;EXIT ROUTINE CLEAR: CLR (4)+ ;CLEAR THE WORD BR NZUF ; ; ; ; ;ROUTINE TO TEST FOR ADDITIONAL DATA TRANSFERS ;ANY DATA TRANSFERRED AFTER WORD COUNT OVERFLOW IS AN ERROR ; ; OVRFLO: MOV WRDCT,%4 ;ADD WORD COUNT ROL %4 ADD #INBUF,%4 CHWRD: CMP %4,#INBUF+2000 ;IS TEST COMPLETE BNE CKNEX ;CHECK NEXT WORD RTS %5 ;TEST IS COMPLETE CKNEX: TST (4)+ ;TEST FOR ZERO WORD BEQ CHWRD ;WORD IS ZERO BIS #BIT9,FLAG ;SET ERROR BIT MOV %4,ACNVX SUB #2,ACNVX JSуCH: 0 ; ; ; ; ; ;ERROR MESSAGE HEADERS ; .EVEN HED1: .ASCII /%DATA ERR @/ ; ; HED2: .ASCII /%STATUS ERR @/ ; ; HED3: .ASCII /%EXTRA BKS @/ ; HED4: .ASCII /%DK ADDR ERR @/ ; ; HED5A: .ASCII /%@/ ; ; HED5: .ASCII / ERR CNT @/ ; ; HED6: .ASCII /%RANEX ERR @/ ; ; ;MESSAGE TRAILERS ; ; MES1: .ASCII / DAR @/ ; ; ; MES1A: .ASCII / DAE @/ ; ; ; MES2: .ASCII / DCS @/ ; MES2A: .ASCII / HRD ERR@/ ; ; MES3: .ASCII / WRD CNT@/ ; ; ; MES4: .фR %5,CONV ;CONVERT 1 OCTAL TO ASCII ACNVX ;ADDRESS MES4 6 MOV %4,ACNVX SUB #2,ACNVX MOV @ACNVX,ACNVX JSR %5,CONV ;CONVERT OCTAL TO ASCII ACNVX ;DATA MES6 6 EMT +0 ;CALL TYPE OUT ROUTINE HED3 MES4 MES6 -1 BR CHWRD ;FETCH NEXT WORD ; ; ; ; ; ; ;EXTENDED MEMORY EXERCISER ;THE PROGRAM DETERMINES HOW MUCH MEMORY ;IS ON THE SYSTEM THEN IT ;GENERATES A RANDOM BUFFER THAT SIZE ;AND WRITES AND WRITE CHECKS THE DATA ; EXTMEN: BIS #BIT8,@DCS ;CLEAR THE DISK MчASCII / WRD ADDR.@/ ; ; ; MES5: .ASCII / GD DATA @/ ; ; ; MES6: .ASCII / BD DATA @/ ; ; ;M0: MES7: .ASCII /?@/ ; ; ; ; MES8: .ASCII '/@' ; ; MES10: .ASCII / WRD1 @/ ; ; MES10A: .ASCII / WRD2 @/ ; MES11: .ASCII /%UNIT NO.@/ ; ; MES12: .ASCII / @/ ; ; MES13: .ASCII / READ @/ ; ; TIMO: .ASCII /%CPU BKGRND TIMED OUT@/ ; ; OK: .ASCII /%OK!@/ ;CONVERSATION TEXT ; ; CON1: .ASCII /%DATA TEST ONLY? @/ ; ; ; CON2: .ASCII /%MULTI DK MOшOV #340,@CSR ;LOCK UP PRIORITY LEVELS MOV #1000,%6 MOV #MAXREF,4 ;SET UP I/O BUS TRAP MOV #340,6 MOV #17446,SAVE ;SET UP FOR 4K EXREF: TST @SAVE ;REFERENCE MEMORY CMP #177446,SAVE ;TEST FOR GREATER THAN 28K BNE .+6 ;BRANCH IF LESS THAN 32K HALT BR MAXREF ;LAST REFERENCE MADE TO I/O REG. ADD #20000,SAVE ;SET UP FOR NEXT MEMORY REF. BR EXREF ;GO REFERENCE MEMORY ; ;ENTER HERE WHEN I/O BUS ERROR OCCURS ; MAXREF: MOV #6,4 ;RESTORE I/O BUS TRAP CLR 6 MOV #1000,%6 SUB #20000,ыDE?@/ ; ; CON3: .ASCII /%# OF DKS 1 TO 10 OCTAL?@/ ; ; CON4: .ASCII /%EX. DK?@/ ; ; CON5: .ASCII /%OPT WRD CNT? @/ ; ; CON6: .ASCII /%LENGTH (1 TO 1000)?@/ ; ; CON7: .ASCII /%WRD ADDR?@/ ; ; CON8: .ASCII /%OPT. DATA PAT. #?@/ ; ; CON9: .ASCII /%WRITE?@/ ; ; CON10: .ASCII /%WRITE CHECK?@/ ; ; CON11: .ASCII /%READ?@/ ; ; ; END: .ASCII /%END@/ .EVEN ; ; ; ; .MACR OUTPUT N 0 ;OUTPUT DATA WORD N (DATA WRITTEN) .ENDM N=0 OUTBUF: .REPT 1000 OUTPUT \N N=N+1 ьSAVE ; SUB #OUTBUF,SAVE ;SET UP NEW WORD COUNT MOV SAVE,SWRDCT ROR SWRDCT MOV SWRDCT,WRDCT MOV #BIT7,@CSR ;SET UP PRIORITY LEVEL MOV #NEWBUF,HRDER ;SET UP FOR HARD ERROR CLR DMA CLR TRACK NEWBUF: MOV WRDCT,WORK ;SET UP FOR RANDOM BUFFER MOV #OUTBUF,%1 JSR %5,RANDOM ;NEW DATA BUFFER GENERATED MOV #OUTBUF,BUF WRITE+100 ;WRITE BUFFER BIT #BIT9,@SR BNE .+6 IOT BR .+12 MOV PRIORITY,@CSR WAIT WRCHECK+100 ;WRITE CHECK DATA BIT #BIT9,@SR BNE .+6 IOT BR .+12 MOV P .ENDR .MACR INPUT N 0 ;INPUT DATA WORD N (DATA READ) .ENDM N=0 INBUF: .REPT 1000 INPUT \N N=N+1 .ENDR .END №RIORITY,@CSR WAIT JSR %7,DISBUF ;SET UP NEW DISK BUFFER BR NEWBUF ;GO WRITE NEW BUFFER BR NEWBUF-10 ;DISK COMPLETE START AGAIN ; ;BACKGROUND TEST FOR INTERRUPTS ; XWAIT: MOV #RTIX,14 ;SET UP TRACE TRAP CLR 16 MOV #-1000,PASS ;SET UP TIME BASE BIS #BIT4,@CSR ;SET TRACE BIT CLR #0 XINCW: INC XINCW-2 TSTB XINCW-2 BPL XINCW INC PASS BEQ .+4 BR XINCW-4 ;REPORT BACKGROUND TEST TIMED OUT MOV #340,@CSR BIC #BIT4,@CSR ;CLEAR TRACE BIT EMT+1 TIMO HALT ; RTIX: RTI є;RF11 POWER FAIL TEST "1 ; DISK ZERO ; WRITE COMPLETE DISK WITH 125252 PATTERN ; REPORT "OK" ;START WRITING THE SAME PATTERN ;WHEN POWER FAIL OCCURS ABORT TRANSFER ;SETUP NEW ENTRY POINT AND HALT ; ;POWER UP AND WRITE CHECK THE DISK FOR ERRORS ; ;***ONLY ONE ERROR IS CONSIDERED ACCEPTABLE*** ; ; PFT1: MOV #1000,%6 ;SET UP STACK JSR %7,POWFAL ;WRITE 125252 ON DISK PFWAT: BIS #BIT8,@DCS ;CLEAR DISK CLR DMA CLR TRACK MOV #PFWAT,HRDER ;SET UP FOR HARD ERROR MOV #DOWN,24 ;SET UP POWER FјAIL VEC. MOV #340,26 MYBYWR: WRITE +100 BIT #BIT9,@SR BNE .+6 IOT BR .+12 MOV PRIORITY,@CSR WAIT JSR %7,DISBUF ;SET UP NEW DISK BUFFER BR MYBYWR BR PFWAT ;ROUTINE TO CHECK DATA AFTER POWER FAIL ; UPCHK: BIS #BIT8,@DCS ;CLEAR THE DISK CLR DMA CLR TRACK MOV #UPCHK,HRDER ;SET UP FOR HARD ERROR CHKDAT: WRCHECK +100 BIT #BIT9,@SR BNE .+6 IOT BR .+12 MOV PRIORITY,@CSR WAIT JSR %7,DISBUF ;SET UP NEW DISK BUFFER BR CHKDAT JMP PFWAT ;GO WAIT FOR ANOTHER ;POWERќ FAIL ; ;POWER DOWN ROUTINE ;ABORT DISK AND HALT ; ; DOWN: BIS #BIT8,@DCS ;ABORT DISK MOV #UP,24 ;SET POWER FAIL VECTOR HALT ; UP: MOV #DOWN,24 MOV #1000,%6 MOV #-300.,WORK ;SET UP TWENTY SECOND TIMER TIMCNT: RESET INC WORK ;+1 TIMER BNE TIMCNT ;TWO SECONDS NOT UP GO WAIT JMP UPCHK ;GO CHECK DISK ; ; ; ; ; ; ;POWER FAIL TEST #2 ;DISK ZERO ;WRITE COMPLETE DISK WITH 125252 PATTERN ;REPORT "OK" ;WRITE CHECK DISK AND WAIT FOR POWER FAIL ;WHEN POWER COMES BACK WRITE CHECK DISK AGAIN ;AND CHECK FOR ERRORS ;***NO ERRORS SHOULD OCCUR.*** ; ;DO NOT CREATE ANOTHER POWER FAIL UNTIL ;THE ADDRESS REGISTER HAS COMPLETELY CYCLED ;THROUGH. ; PFT2: MOV #1000,%6 ;SET UP STACK JSR %7,POWFAL ;WRITE 125252 ON DISK PWRFL: CLR DMA CLR TRACK MOV #PWRFL,HRDER ;SET UP HARD ERROR MOV #PWRDN,24 ;SET UP POWER FAIL VEC. MOV #340,26 CHKDSK: WRCHECK +100 BIT #BIT9,@SR BNE .+6 IOT ;WAIT IN BACKGROUND BR .+12 MOV PRIORITY,@CSR WAIT JSR %7,DISBUF ;CHECK NEXT BUFFER BR CHKDSK BR PWRFL ; ;ROUTINE TO ABORT DISK DURING POWER FAIL ; PWRDN: BIS #BIT8,@DCS ;CLEAR THE DISK MOV #PWRUP,24 ;SET UP RESTART HALT ; PWRUP: MOV #PWRDN,24 ;RESET POWER FAIL VECTOR MOV #1000,%6 MOV #-300.,WORK ;SET UP TWENTY SECOND TIMER XTIMCNT: RESET INC WORK ;+1 TIMER BNE XTIMCNT ;TWO SECONDS NOT UP GO WAIT BR PWRFL ;GO CHECK DISK ; ; ; ; ; ;ROUTINE TO WRITE THE COMPLETE DISK ;WITH 125252 PATTERN ;WRITE CHECK AND REPORT ERRORS IF THEY ;OCCUR ;REPORT "OK" AT COMPLETION POWFAL: BIS #BIT8,@DCS ;CLEAR THE DISK MOV (6),PASSC MOV #1000,%6 MOV #20,PATNU ;SET UP PATTERN CLR DMA CLR TRACK MOV #2000,SWRDCT ;SETUP WORD COUNT MOV SWRDCT,WRDCT JSR %5,PASEL ;GENERATE DATA BUFFER MOV #OUTBUF,BUF ;SET UP CURRENT ADDRESS MOV #POWFAL,HRDER WRDNW: WRITE +100 BIT #BIT9,@SR ;CHECK ON HOW TO WAIT BNE .+6 IOT ;BACKGROUND TEST BR .+12 MOV PRIORITY,@CSR WAIT WRCHECK +100 BIT #BIT9,@SR ; BNE .+6 IOT BR .+12 MOV PRIORITY,@CSR WAI T JSR %7,DISBUF ;SET UP NEW DISK BUFFER BR WRDNW ;WRITE NEW BUFFER EMT +1 OK JMP @PASSC ;ROUTINE TO ALLOW THE OPERATOR TO SET BITS ;IN THE I/O REGISTERS VIA THE SWITCH REGISTER ; ;WORD COUNT REGISTER SELWC: MOV @SR,@WC ;MOV SR INTO WORD COUNT REG BR SELWC ; ;CURRENT ADDRESS REGISTER SELCMA: MOV @SR,@CMA ;MOV SR INTO CURRENT ADDR REG BR SELCMA ; ;DISK ADDRESS REGISTER SELDAR: MOV @SR,@DAR ;MOV SR INTO DISK ADDR REG BR SELDAR ; ;DISK ADDRESS EXT AND ERROR REGISTER SELDAE: MOV @SR,@DAE ;MOV SR INTO DISK ADDR EXT REG BR SELDAE ; ;DATA BUFFER REGISTER SELDBR: MOV @SR,@DBR ; MOV SR INTO DATA BUFFER BR SELDBR ; ; ;LOOK AHEAD REGISTER MOVLK: MOV @ADS,%0 ;MOVE LOOK AHEAD RESET RESET BR MOVLK ;INTO REGISTER 0 ; ; ;DISK CONTROL STATUS REGISTER SELDCS: MOV #340,@CSR ;LOCK UP INTERRUPTS MOV #177777,@WC ;SET WORD COUNT -1 WORD MOV #OUTBUF,@CMA ;SET UP CURRENT ADDRESS MOV @SR,@DCS ;MOV SR INTO CONTROL REG BIT #BIT0,@DCS ;IS FUNCTION BITS SET BEQ SELDCS ;FUNCTION BITS NOT SET DKBUSY: TSTB @DCS ;TEST FOR DISK NOT READY BPL DKBUSY ;DISK STILL READY BR SELDCS ;DISK NOT BUSY SELECT NEW CR ; ; ; ; ; ; ; ; ;THIS ROUTINE ENABLES THE OPERATOR TO SELECT A TRACK STATICLY ;THE ROUTINE DOES A ONE WORD READ TO SELECT THE TRACK ;THE OPERATOR MAY CHANGE THE SWITCH REGISTER AT ANY TIME ;SR6-0 EQUALS THE TRACK NUMBER ;SR9-7 EQUALS THE DISK NUMBER ; STAMP: BIS #BIT8,@DCS MOV @SR,WORK1 ;FETCH SR MOV WORK1,WORK BIC #176000,WORK ;MASK THE TRACK AND DISK NO. ROR WORK ROR WORK ROR WORK ROR WORK ROR WORK MOV WORK,@DAE ;DISK EXT. ADDR. REG. LOADED MOV @SR,WORK SWAB WORK ROL WORK ROL WORK ROL WORK BIC #3777,WORK MOV WORK,@DAR ;DISK ADDRESS REG LOADED MOV #INBUF,@CMA ;LOAD CURRENT ADDRESS MOV #177777,@WC ;LOAD WORD COUNT BIS #5,@DCS ;GO AND READ CTBUSY: TSTB @DCS ;TEST FOR CONTROL NOT READY BPL CTBUSY ;WAIT FOR CONTROL NOT READY SRCHG: CMP WORK1,@SR BNE STAMP ;SR HAS CHANGED BR SRCHG ;SR HAS NOT CHANGED  ; ; ; ; ; ; ; ;ROUTINE TO REPORT ERROR COUNT AND CONTENTS OF ONE REGISTER ; STAER: JSR %5,CONV ;CONVERT OCTAL TO ASCII WORK ;DATA TO BE CONVERTED MES10 ;ADDRESS OF MESSAGE 6 JSR %5,CONV ;CONVERT OCTAL TO ASCII ERCOUNT ;ERROR COUNT TO BE CONVERTED HED5 ;ADDRESS OF MESSAGE 3 EMT +0 ;REPORT MESSAGE HED5A HED5 MES10 -1 RTS %5 ;EXIT ROUTINE ; ;ROUTINE TO REPORT ERROR COUNT AND THE CONTENTS OF TWO REGISTERS ; ; ; STAER1: JSR %5,CONV ;CONVERT OCTAL TO ASCI I WORK ;DATA TO BE CONVERTED MES10 ;ADDRESS OF MESSAGE 6 JSR %5,CONV ;CONVERT OCTAL TO ASCII WORK1 ;DATA TO BE CONVERT MES10A ;ADDRESS OF MESSAGE 6 JSR %5,CONV ;CONVERT OCTAL TO ASCII ERCOUNT ;ERROR COUNT TO BE CONVERTED HED5 ;ADDRESS OF MESSAGE 3 EMT +0 ;REPORT MESSAGE HED5A HED5 MES10 MES10A -1 RTS %5 ;EXIT ROUTINE ; ; ;ROUTINE TO DECODE EMT CALLS ;EMT+1=TYPE ONE LINE OF TEXT ;EMT+0=TYPE A SERIES OF LINES EMTRP: MOV (6),%0 CMP #EMT+1,-(0) ;WAS $THE CALL EMT+1 BNE TYPS ;NO! TYPE A SERIES OF LINES OF TEXT BR TYP ;YES TYPE ONE LINE OF TEXT ;SUBROUTINE TO OUTPUT ASCII MESSAGE ON TELETYPE PRINTER. TYP: MOV @%6,%0 ;GET ADDRESS THAT CONTAINS MESSAGE ADDRESS ADD #2,@%6 ;SET UP EXIT. MOV @%0,%0 ;ADDRESS OF MESSAGE TO R0. TYPA: MOVB (0)+,TYPDAT ;GET CHARACTER CMPB #100,TYPDAT ;CHECK FOR "@" CHARACTER BNE TYPC ;CRANCH IF NOT "@". RTI ;TERMINATOR CHAR. DONE. EXIT. TYPC: CMPB #45,TYPDAT ;CHECK FOR "%". BEQ TYPF ;BRANCH IF "%". ( CMPB #42,TYPDAT ;NOT "%". CHECK FOR "#". BEQ TYPG ;BRANCH IF "#" JSR %7,TYPD ;TYPE CHAR IN TYPDAT BR TYPA TYPD: BIT #BIT14,@SR BNE TYEXIT MOVB TYPDAT,@TPB ;OUTPUT CHARACTER TO PRINTER TSTB @TPS ;WAIT FOR DONE FLAG. BPL .-4 TYEXIT: RTS %7 ;EXIT TYPF: MOVB #15,TYPDAT ;MOVE CARRIAGE RETURN CODE TO TYPDAT JSR %7,TYPD ;GO TYPE CHAR. TYPG: MOVB #12,TYPDAT ;MOVE LF CODE TO TYPDAT. JSR %7,TYPD ;GO TYPE CHAR. BR TYPA TYPDAT: 0 ;SUBROUTINE TO OUTPUT A SERIES OF ASCII MESSAGES ON TE,LETYPE PRINTER TYPS: MOV @%6,%0 ;GET ADDRESS THAT CONTAINS MESSAGE ADDRESS ADD #2,@%6 ;UPDATE TO NEXT MESSAGE ADDRESS MOV @%0,TYPSB ;ADDRESS OF MESSAGE TO TYPSB CMP #-1,TYPSB ;CHECK FOR TERMINATOR BNE TYPSA ;BRANCH IF NOT TERMINATOR. RTI ;TERMINATOR. EXIT TYPSA: EMT +1 ;CALL ON TYP SUB TO TYPE MESSAGE TYPSB: 0 ;ADDRESS OF MESSAGE GOES HERE BR TYPS ;GO PROCESS NEXT MESSAGE ; ; ; ; ;OCTAL TO ASCII CONVERT ROUTINE ; ;ENTER ROUTINE AS FOLLOWS ;JSR%5,CONV ;ADDR#=ADDRESS OF NUMB0ER TO BE CONVERTED ;ADDR BYTE=LSB OF WHERE ASCII IS GOING ;ASCII#=THE NUMBER OF ASCII CHAR. TO BE CONVERTED ; ; CONV: MOV @(5)+,ACNVX ;VALUE OF # TO BE CONVERTED MOV (5)+,%1 ;ASCII ADDR MOV (5)+,%2 ;# OF ASCII CHAR ADD %2,%1 ACVN: MOV ACNVX,%3 BIC #177770,%3 ;ISOLATE LEAST SIGNIFICANT OCTAL# ADD #60,%3 ;SET UP ASCII# MOVB %3,-(1) ;STORE ASCII CHAR BIC #7,ACNVX ROR ACNVX ;ROTATE OCTAL# ROR ACNVX ROR ACNVX DEC %2 ;-1 FROM ASCII CHAR COUNT BNE ACVN RTS %5 ;EXIT # CONVER4TED ACNVX: 0 ;WORK REGISTER ; ; ; ; ;ROUTINE TO HANDLE KEYBOARD CONVERSATION ;ROUTINE ACCEPTS NUM. OR ALPHA CHARACTERS ; NOCHA: MOV #40,TSTCH ;SET UP FOR NUM. CHAR. BR TYST ALPHA: MOV #100,TSTCH ;SET UP FOR ALPHA CHAR TYST: MOV #340,@CSR ;LOCK UP INTERRUPTS CLR TEXBUF ;CLEAR TEXT BUFFER REG TSTFLG: TSTB @TKS ;CHECK FOR FLAG BPL TSTFLG ; MOV @TKB,@TPB ;CHARACTER IN BUFFER TSTB @TPS ;ECHO CHARACTER BPL .-4 CMP #377,@TKB ;CHECK FOR RUB-OUT BNE CKCH ;EXIT IF NOT RUB-OUT EM8T +1 MES8 ;REPORT RUB-OUT ACKNOWLEDGED BIC #7,TEXBUF ROR TEXBUF ROR TEXBUF ROR TEXBUF BR TSTFLG ;GO WAIT FOR NEW CHAR. CKCH: CMP #215,@TKB ;CHECK FOR CARRIAGE RETURN BNE .+4 RTS %7 ;EXIT DELIMITER TYPED BIT TSTCH,@TKB BNE CHOK EMT +1 ;REPORT QUESTION MARK MES7 BR TSTFLG ;WAIT FOR CORRECT CHAR. CHOK: MOV @TKB,WORK BIC #177770,WORK CLC ROL TEXBUF CLC ROL TEXBUF CLC ROL TEXBUF ADD WORK,TEXBUF ;ADD CHARACTER BR TSTFLG ;WAIT FOR NEW CHARACTER TEXBUF: 0 TST<CH: 0 ; ; ; ; ; ;ERROR MESSAGE HEADERS ; .EVEN HED1: .ASCII /%DATA ERR @/ ; ; HED2: .ASCII /%STATUS ERR @/ ; ; HED3: .ASCII /%EXTRA BKS @/ ; HED4: .ASCII /%DK ADDR ERR @/ ; ; HED5A: .ASCII /%@/ ; ; HED5: .ASCII / ERR CNT @/ ; ; HED6: .ASCII /%RANEX ERR @/ ; ; ;MESSAGE TRAILERS ; ; MES1: .ASCII / DAR @/ ; ; ; MES1A: .ASCII / DAE @/ ; ; ; MES2: .ASCII / DCS @/ ; MES2A: .ASCII / HRD ERR@/ ; ; MES3: .ASCII / WRD CNT@/ ; ; ; MES4: . D EN . DREN . +1=N N \NT PUIN 0 00 1PTRE .F:BUIN =0 N DMEN . D)EA RTADA ( NRDWOA AT DUTNP;I0 N T PUINR AC.M R ND.E >ASCII / WRD ADDR.@/ ; ; ; MES5: .ASCII / GD DATA @/ ; ; ; MES6: .ASCII / BD DATA @/ ; ; ;M0: MES7: .ASCII /?@/ ; ; ; ; MES8: .ASCII '/@' ; ; MES10: .ASCII / WRD1 @/ ; ; MES10A: .ASCII / WRD2 @/ ; MES11: .ASCII /%UNIT NO.@/ ; ; MES12: .ASCII / @/ ; ; MES13: .ASCII / READ @/ ; ; TIMO: .ASCII /%CPU BKGRND TIMED OUT@/ ; ; OK: .ASCII /%OK!@/ ;CONVERSATION TEXT ; ; CON1: .ASCII /%DATA TEST ONLY? @/ ; ; ; CON2: .ASCII /%MULTI DK MOЦ§DE?@/ ; ; CON3: .ASCII /%# OF DKS 1 TO 10 OCTAL?@/ ; ; CON4: .ASCII /%EX. DK?@/ ; ; CON5: .ASCII /%OPT WRD CNT? @/ ; ; CON6: .ASCII /%LENGTH (1 TO 1000)?@/ ; ; CON7: .ASCII /%WRD ADDR?@/ ; ; CON8: .ASCII /%OPT. DATA PAT. #?@/ ; ; CON9: .ASCII /%WRITE?@/ ; ; CON10: .ASCII /%WRITE CHECK?@/ ; ; CON11: .ASCII /%READ?@/ ; ; ; END: .ASCII /%END@/ .EVEN ; ; ; ; .MACR OUTPUT N 0 ;OUTPUT DATA WORD N (DATA WRITTEN) .ENDM N=0 OUTBUF: .REPT 1000 OUTPUT \N N=N+1