;TIMDGN.S07 ;27-JAN-72 ;TIMDGN.S04 ; ************* T I M D G N . P A L ************************** ; 26-JAN-72 ; 20-JAN-72 ; TIMER MODULE DIAGNOSTIC ROUTINE - TEST #1 OF 4 ; THIS ROUTINE SETS UP THE INTERRUPT VECTORS, ; CLEARS CORE UP TO THE LOADERS, SETS CPU LEVEL TO 7, ; ENABLES THE MODULE INTERRUPTS, AND DELAYS FOR ; FIVE SECONDS. THEN IT DROPS THE CPU PRIORITY BY ONE ; LEVEL, AND COUNTS THE INTERRUPTS AND THE ORDER ; IN WHICH THEY COME IN. IF THE INTERRUPTS0 :*  P t*$P < e %*H  b:5wn7 X7 *lV7 XE7  E *BEw5 wX  wN a*7 7  -*Kd x* U  U U5X* 7Atp!  X*De E7 ;18-MAY-72 ;24-NOV-71 ; MAG TAPE DIAGNOSTIC EXERCISER R0 = %0 ;REGISTER DEFS R1 = %1 R2 = %2 R3 = %3 R4 = %4 R5 = %5 SP = %6 ;STACK POINTER PC = %7 ;PROGRAM COUNTER PS = 177776 ;CPU STATUS SWR = 177570 ;CONSOLE SWITCHES TKS = 177560 ;TTY KB STATUS TKB = 177562 ;TTY KB BUFFER TKI = 60 ;TTY KB VECTOR TPS = 177564 ;TTY STATU0 :*  P DF(*$02@p` :77F*H77 *  ĥ *l7 ? =* GLRFNCDAMSPEXXx*J:xEwB7M:,) Z*,  x+%  6!*xEE2BP w x, * 5xw DONE  5*D FAIL TO ; COME IN IN THE PROPER ORDER, OR FAIL TO COME IN ; AT ALL, THE TEST WILL HALT WITH THE ERROR NUMBER ; DISPLAYED IN THE "DATA" LIGHTS. ; ; R0 = %0 R1 = %1 R2 = %2 R3 = %3 R4 = %4 R5 = %5 SP = %6 PC = %7 PS = 177776 SWR = 177570 ; ; ; INIT ALL VECTORS BELOW 400 WITH "HALTS" ; .ASECT .=16000 TIMA00: MOV #.,SP  ;INIT STACK CLR R0 CLR R1 TIMA10: TST (R1)+ MOV R1,(R0)+ CLR (R1)+ TST (R0)+ TSTB R0 BNE TIMA10 M 8 6 4]00*h7!, 5@xw*'w * :."V*P @XwVa*7 7 7 7 7 hE7@]*H     (@  p7 - S TPB = 177566 ;TTY BUFFER MTN = 167540 ;MAG TAPE WORD COUNT MTS = 167542 ;MAG TAPE STATUS MTC = 167544 ;MAG TAPE COMMAND MTA = 167546 ;MAG TAPE ADDRESS MTI = 104 ;MAG TAPE VECTOR BELL = 7 CR = 15 SPCE = 40 WRITBF = 1000 ;WRITE BUFFER BUFLTH = 5000 ;BYTE LENGTH OF EACH BUFFER READBF = WRITBF+BUFLTH ;READ BUFFER .ASECT .PAGE w  5$57*hx  R$ D~* D   " P5*H5@ L5 25@x *$EU7w 5;  * AEw \7d 5*@bo5bj55ba@p*@5 5  _f_"*d`@E bd 65~*5b{sb`=PZO*&5@b  OV VECTOR,R0 MOV #340,R1 MOV #6,R2 TIMA20: MOV INTADS(R2),(R0)+ ;INIT PC VECTOR MOV R1,(R0)+  ;INIT PS DEC R2 DEC R2 BNE TIMA20   ;LAST TABLE LOC = 0 ; ; MOV #TIMB20,4  ;FIND HOW MUCH CORE CLR R0 TIMB10: TST (R0)  ;WILL TRAP ON NO CORE ADD #20000,R0 ;NEXT BAY BR TIMB10 TIMB20: MOV #6,4   ;TRAP HERE:RESET VECTOR CMP (SP)+,(SP)+  ;RESET STACK SUB #300,R0   ;BACK OFF BELOW LOADERS TIMB30: CLR -(R0)   ;CLEA .=14000 MTEXER: ;BEGIN OF EXERCISER MOV #.,SP ;SET STACK POINTER CLR R0 ;PREPARE FOR SETTING VECTORS CLR R1 INITV: TST (R1)+ ;BUMP TO POINT TO STATUS WORD MOV R1,(R0)+ ;ALL VECTORS POINT TO .+2 CLR (R1)+ ;PUT HALT IN VECTOR+2 TST (R0)+ ;KEEP UP WITH R1 TSTB R0 ;LOW BYTE WILL CLEAR AT 400 BNE INITV MOV #MINT,@#MTI ;INIT MA5@bAP*@EEwp* e0 w hw |*$ ERR w dFw *<w ?: 7 D*`7ee 7 7|*ĝt 7lt 7lm*w7a< l74I*Z "db`f *ĕ =  N%W*%Bw@Zw@w@lwPLwPR ALL CORE CMP R0,#PGMEND  ;...DOWN TO THIS PGM BHI TIMB30 ;------------------------- MOV ENBAD,R3 BIT #4000,SWR ;RUN CALIBRATE? BEQ TIMC05 JMP CALIBRATE TIMC05: MOV #TIMA00,SP TIMC10: RESET   ;CLEAR EVERYTHING, INCLUDING STALL CLR CONTA1 CLR CONTA2 CLR COUNTC MOV SWR,R0 MOV R0,R1 BIC #-34-1,R0 MOV R0,R2 MOV R0,ENBPAT ; ;VERSION 001 ; REVISION 004 ; DATE: 24-APR-72 ;THIS IS THE LINE PRINTER DIAGNOSTIC ROUTINE ;SEE THE WRITEUP OF THE ROUTINE FOR OPERATING INSTRUCTIONS R0 = %0 R1 = %1 R2 = %2 R3 = %3 R4 = %4 R5 = %5 SP = %6 PC = %7 PS = 177776 SWR = 177570 ;CONSOLE SWITCH REGISTER SCOPE = EMT  ;USED AS CALL TO ERROR ROUTINE ;THE FOLLOWING ARE REGISTER ADDRESSG TAPE INTERRUPT MOV #300,@#MTI+2;INIT VECTOR STATUS:LVL #6 MOV #TTYINT,@#TKI ;INIT TTY KBD INTERRUPT MOV #200,@#TKI+2;TTY LEVEL #4 .PAGE HALT: RESET ;FORCES STOP OF TAPE ON DEMAND ; ; DIALOG = . ;BEGIN OF DIALOGUE WITH OPERATOR MOV #100,@#TKS;ENABLE TTY KBD INTERRUPT MOV #MTEXER,SP;RESET STACK POINTER MOV #140,@#PS ;RELEASE LOCKOUT JSR PC,CRLF ;BEGIN OF DIALOG W/OPR CLRB CHRFG wP^7*8 ĥ:ĥ ĥ w rg*\&    !* w  D 0 ^E D*E   T! ކe*& D  D D D e*0 * ׭ *  bߋtvrŀ"*4H5xw7`*X7ĝ!   *|& 7@fA | CLR R5 MOV #5,R4 TIMC11: ASR R2 ADC R5 DEC R4 BNE TIMC11 MOV R5,R2 BIC #-340-1,R1 MOV R1,LEVEL BIT #20000,SWR BNE TIMC12 MOV R1,PS MOV R0,(R3) BR TIMC13 TIMC12: MOV R0,(R3) MOV R1,PS TIMC13: CLR R4 MOV #2,BITFLG CLR INTFLG CLR INTCNT MOV MSECS,R5 ;ES FOR THE LINE PRINTER CONTROLLER R.AD = 165010 ;MEMORY ADDRESS R.LF = 165012 ;LINE-FEED CONTROL R.WC = 165014 ;WORD COUNT (2'S COMPLEMENT) R.CM = 165016 ;COMMAND (OUTPUT ONLY) R.ST = 165016 ;STATUS (INPUT ONLY) ; FIRST PUT HALTS IN ALL INTERRUPT LOCATIONS LP.DGN: MOV #.,SP ;INIT STACK CLR R0 ;POINTER TO VECTOR CLR R1 ;POINTER TO VE CLRB MINTFG ;INIT TAPE INTERRUPT FLAG CLRB PPOS ;INIT FORMAT FLAG MOV #BELL,R4 INAGN1:CLRB MCODE ;INIT MNEMONIC SAVE LOC JSR PC,OCH MOV #'*,R4 JSR PC,OCH ;PRINT "*":REQUEST INPUT INAGN2:JSR PC,ICH ;GET MNEMONIC CHAR CMPB #CR,R4 ;RETURN? BEQ DOACT ;YES:GO DO FUNCTION MOVB R4,MCODE ;SAVE CHAR BR INAGN2 DOACT: MOV #LSIZE-1,R1 ;INIT INDEX TSTB MCODE * @fA Ax*    - 8*/0!7  a* W  ?*05 >   w+*T   E  6*x C X BD < B*a  . ԕ0 _*dd w @@BQ *CRCC =  +DELAY FOR "MSECS" MILLISECONDS JSR PC,DELAY ;///////////////////////////////////////////////////////////////////// SUB #40,@#PS  ;DROP CPU STATUS TO LET ;     INTERRUPTS COME IN. ;///////////////////////////////////////////////////////////////////// BR .+2 BR .+2 BR .+2 CMP INTCNT,R2 BEQ TIMC20   ;YES MOV INTFLG,R0 BR SCOPE   ;TOO FEW OR TOO MANY TIMC20: RESET MOV #7,177566 MOV #100.,R5 JSR CTOR+2 LPDA10: TST (R1)+ ;BUMP TO VECTOR+2 MOV R1,(R0)+ ;PUT #VECTOR+2 IN VECTROR CLR (R1)+ ;PUT A HALT IN VECTOR+2 TST (R0)+ ;KEEP UP WITH R1 TSTB R0 ;AT 400 YET? BNE LPDA10 ;LO BYTE CLEARS FIRST AT 400 ;------------------------------- MOV #LPDI10,200 ;INIT INTERRUPT TO ERROR LOC'N MOV #340,202 ;INTERRUPT STATUS MOV #SCOPEI,30  ;WAS CR FIRST CHAR? BNE DCMP ;NO ILEGAL:MOV #'?,R4 ;ILLEGAL CHAR BR INAGN1 ;GO BACK AND TRY AGAIN DCMP: CMPB MCODE,MNETAB(R1);IS THIS CHAR IN TABLE? BEQ FOUND ;YES: GO TO RTNE DEC R1 ;MORE? BGE DCMP ;KEEP LOOKING BR ILEGAL ;CHAR NOT IN TABLE FOUND: ASL R1 ;*2 TO INDEX WORDS MOV RTNETB(R1),PC;GO TO PROPER ROUTINE MNETAB: .ASCII "LRFNCDAMSPEX" ;LIST OF MNEMONICSPC,DELAY TST @#SWR BMI TIMC10   ;DO IT AGAIN MOV #177777,R0 HALT    ;SUCCESSFUL FINISH BR TIMC10   ;AFTER "CONTINUE" SWITCH ;--------------------------------------------------------------------- INTA: INC CONTA1 BIS #4,R4 BR INTSVC INTB: INC CONTB1 BIS #10,R4 BR INTSVC INTC: INC COUNTC BIS #20,R4 INTSVC: BIT #10000,SWR BEQ INTS ;INIT EMT VECTOR ; SET UP TO READ IN THE FIVE OPTIONS MOV #BYTLST,R0 ;TOP OF BYTE LIST MOV #5,R1 ;FIVE OPTIONS STOP00: HALT ;STOP HERE FOR FIRST PARAMETER LPDA15: BITB #177,@#SWR+1 ;IS BYPASS OPTION ELECTED? BNE LPDB10 ;YES: SKIP ALL INPUTTING TST @#SWR ;IS BIT #15 SET? BMI LPDA20 ;SWITCH SET TO BYPASS THIS ONE ONLY MOVB @#SWR,(R0) ;LOAD PARAM ENDTAB:.EVEN LSIZE = ENDTAB-MNETAB ;SIZE OF MNEMONIC TABLE RTNETB:.WORD LOC,RECNT,FILECT,WORDCT,COMMND,DATAIN .WORD AUTO,MANUAL,STATUS,PARAMS,ERRSET .WORD CRCPRT .PAGE AUTO: MOV @#SWR,R1 ;AUTOMATIC WRITE AND READ CHECK BIC #146777,R1;GET UNIT # & INT. ABLE BITS MOV R1,UNITNO ;SAVE IT CLRB WRTCTR ;INIT COUNTER REWIND:MOV UNITNO,EXCOM INCB EXCOM+1 ;FORM REWIND COMMAND JSR PC,EXEC ;DO IT !V1 BIC R4,ENBPAT MOV ENBPAT,(R3) INTSV1: CMP SP,#TIMA00-4 ;CHECK FOR PROPER PUSH BEQ INTS10   ;O.K. MOV #400,R0 BR SCOPE   ;STACK INCORRECT INTS10: TST DLYCTR BEQ INTS20   ;DELAY HAS COMPLETED MOV #1000,R0 BR SCOPE INTS20: MOV 2(SP),R0 ;CHECK LEVEL OF CPU @ TIME OF INT ADD #40,R0 BIC #177437,R0 CMP R0,LEVEL BEQ INTS30 MOV #1400,R0 BR SCOPE INTS30: "ETER (LOW BYTE) LPDA20: TSTB (R0)+ ;BUMP HERE IN CASE OF BYPASS STOP01: HALT ;WAIT FOR OPERATOR TO SET UP SWITCHES DEC R1 ;ANY MORE? BGT LPDA15 ;YES LPDB10: JSR PC,LPD.ST ;CHECK STATUS ERR010: SCOPE ;ERROR RETURN:BAD STATUS BIT #4,@#R.ST ;IS READY SET? BNE .+4 ;YES ERR020: SCOPE ;READY NOT SET MOVB #40,SCHAR ;INIT S# MOV UNITNO,EXCOM INC EXCOM ;FORM READ COMMAND TST @#SWR ;IS READ-ONLY BIT SET? BPL EXECAL ;YES DECB WRTCTR ;NO BITB #1,WRTCTR ;IS THIS A WRITE CYCLE BEQ EXECAL ;NO INC EXCOM ;SET TO WRITE EXECAL:JSR PC,EXEC ;GO READ OR WRITE BR REWIND ;NOW REWIND .PAGE MANUAL:MOV @#SWR,R1 ;DO ONE COMMAND SEQUENCE BIC #146777,R1;GET UNIT # & INT. ABLE BITS MOV COMAND$` :,  P fb"*&>ߵy  xȗxЋ *J l5 BN*n6 xB*5  ȝ2@5*$vxof*BÝ^E X J*   _ B ]*"E?UL A *F5@A % INC INTCNT ASL BITFLG BIS BITFLG,INTFLG CMP R4,INTFLG BEQ INTS40 MOV #2000,R0 BR SCOPE INTS40: RTI  ;RETURN AND IMMEDIATELY PROCESS ANOTHER INT ;   ...UNLESS THIS IS LAST ONE, IN WHICH CASE ;   ...MAIN PROGRAM WILL MAKE FINAL CHECKS. ;---------------------------------------------------------------- SCOPE: CLR (R3) ;DISABLE ALL INTS BIT #40000,@#SWR BNE C05JMP HALT &YNTHETIC CHAR MOVB #66.,WDCNT ;INIT PAGING PARAMETERS MOVB PAGE,LINENO BNE LPDB15 ;INIT PAGE SIZE IF SPECIFIED... MOVB #66,LINENO ;...ELSE SET FOR FULL PAGE LPDB15: JSR PC,LPDC  ;BUILD FIRST BUFFER ; ; NOW WE ARE READY TO COMMAND PRINT OF THE LINE ; ; THIS IS ENTRY POINT TO PRINT ANOTHER LINE ; ; NOW COMPUTE WORD- AND LINE-COUNTS LPDD: MOV @#SWR,CONSOL MOV CURBUF,R0 ;BUFFER S',R2 ;GET COMMAND BITS BIC #31000,R2 ;MASK OUT UNIT & INT ENABLE BITS BIS R1,R2 ;PUT IN UNIT # MOV R2,EXCOM ;LOAD EXEC COMMAND WORD JSR PC,EXEC ;EXECUTE COMMAND JSR R5,ONCH ;GOOD EXIT: PRINT "DONE" ;NO RETURN IF ERROR .WORD DONE .WORD 6 DMPSTA:BIT #1,@#SWR ;TEST STATUS DUMP OPTION BEQ DIALOG ;NOT SELECTED JMP STATUS ;GO DUMP STATUS FIRST ; DONE: .ASCII / (5  5@*j   65*@ @ m&@ @ m@ @ 7E* L w wzvE 0w*wf %!*`5@26*e*-& *BE ׭` U*f& hŀ5 5 `u* w 胦6 e* `@5@) MOV R4,R0 HALT C05JMP: JMP TIMC05 LEVEL: 0 VECTOR: 320 ENBAD: 167002 MSECS: 10.*1000.+1 DLYCTR: 0 INTCNT: 0 BITFLG: 0 INTFLG: .WORD 0 ENBPAT: 0 INTADS: .WORD 0,INTC,INTB,INTA ;ADDRESSES OF INT RTNES ; DELAY: MOV R5,DLYCTR DLOOP1: MOV #202.,R5  ;1 MSEC LOOP DEC R5 BNE .-2 DEC DLYCTR BNE DLOOP1 RTS PC INTRAD: INTRC,INTRB,INTRA MINSET: 1 MINS: 0 CONTA1: 0 CONTA2: 0 CONTB1: 0 CONTB2: 0 COUNTC: 0 COUNTD: 0 CALIBRATE*TART: NO P/F CHARACTER MOVB COUNT,R1 ;LINE WIDTH: NO P/F CHAR BNE LPDD20 ;WILL USE 'COUNT' SPECIFIED DECB WDCNT ;USE AUTOMATIC LINE WIDTH BNE LPDD10 ;STILL SHRINKING MOVB #66.,WDCNT ;FULL LINE AGAIN LPDD10: MOVB WDCNT,R1 ;TMP'Y HOLD LPDD20: BIT #1,CONSOL ;AUTO MODE? BNE LPDD30 ;YES: NO P/F CHAR INC R1 ;IN P/F MODE: ONE EXTRA WORD +DONE / .PAGE EXEC = . ;THIS IS THE EXECUTIVE SUBROUTINE MOVB NFILES,XFILES ;INIT FILE CTR MOV #WRITAD,XADDR;SET FOR WRITE BUFFER BIT #1,EXCOM ;READ? BEQ NEWFILE ;NO: WRITE MOV #READAD,XADDR;NOW POINT TO READ NEWFIL:MOV NRECS,XRECS ;INIT RECORDS CTR CALDRV:JSR R5,MDRIVE ;CALL DRIVER BR EXEC02 .WORD EXCOM ;COMMAND SET UP PRIOR XADDR: .WORD 0 ;WRITE OR READ BUFR .,5e * f7awWT ?*7G6 * %%54wHG>J -: MOV VECTOR,R0 MOV #4,R2 CALB00: MOV INTRAD(R2),(R0)+ MOV R1,(R0)+ DEC R2 DEC R2 BGE CALB00 MOV #WALL,100 MOV R1,102 LOOP: MOV #60.*60.,COUNTD ;INIT MINUTE TIMER MOV MINSET,MINS CLR CONTA1 CLR CONTA2 CLR CONTB1 CLR CONTB2 CLR COUNTC MOV SWR,R0 BIC #-34-1,R0 MOV R. TST -(R0) ;AND ONE WORD SOONER IN BUFFER MOVB PFCHAR,(R0) ;LOAD FIRST BUFF WORD W/P/F CHAR BR LPDE20 ;GO SET UP PRINTER REGISTER... ;BYPASS AUTO PAGE COUNT LPDE90: MOVB HOMECH,R2 ;USE VFU TO SKIP TO TOP-OF-FORM BISB #100,R2 ;COMBINE CHANNEL # AND VFU COMD BIT BR LPDE10 ;GO PUT IT OUT LPDD30: BIT #2,CONSOL ;DOUBLE SPACE? BEQ LPDD40 /WORD XCOUNT ;HOLDS #WDS/RECORD EXEC02:BIT #1,EXCOM ;WAS IT READ? BEQ MORECS ;NO: NO TEST BIT #4,@#SWR ;BYPASS PRINTOUT? BNE MORECS ;YES MOV WRITAD,R1 ;YES: COMPARE BUFFERS MOV READAD,R2 MOV XCOUNT,R5 ;# OF WORDS IN RECORD TO COMPAR .PAGE XLOOP1:DEC R5 ;REACHED END? BMI MORECS ;YES CMP (R1)+,(R2)+ ;COMPARE LIST ENTRY BEQ XLOOP1 ;A10,167002 MOV #100,177546 WAIT BR .-2 INTRA: INC CONTA1 BNE AEXIT INC CONTA2 AEXIT: RTI INTRB: INC CONTB1 BNE BEXIT INC CONTB2 BEXIT: RTI INTRC: INC COUNTC RTI WALL: DEC COUNTD BNE WEXIT MOV #60.*60.,COUNTD DEC MINS BNE WEXIT CLR 167002 MOV #7,177566 HALT BR LOO2 ;NO DECB LINENO ;YES:COUNT TWO LINES LPDD40: DECB LINENO BGE LPDE20 ;NOT END OF PAGE YET MOVB PAGE,LINENO ;REACHED END: RESET BICB #340,HOMECH ;IS VFU OPTION SELECTED? BNE LPDE90 ;YES ;NO: WILL TRY TO SKIP 'N' LINES TSTB PFCHAR ;ALLOWED TO DO A P/F COMMAND? BEQ LPDE20 ;NO: FILL ENTIRE PAGE MOV #66.,R2 ;YES: 3GREE JSR PC,CRLF ;BEGIN NEW LINE FOR PRINTOUT MOV R1,R4 ;CURRENT ADDRESS + 2 SUB WRITAD,R4 ;GET OFFSET + 2 TST -(R4) ;GET CURRENT OFFSET JSR PC,PRINT MOV -2(R1),R4 ;GET CONTENTS OF WRITE BUFFER JSR PC,PRINT MOV -2(R2),R4 ;GET CONTENTS OF READ BUFFER JSR PC,PRINT BR XLOOP1 ; PRINT: JSR PC,PRTNUM JSR PC,FORMAT RTS PC .PAGE MORECS = 4; UPDATE 12/6/72 DSCTST.S08 ; UPDATE 7/6/72 DSCTST.S07 ; UPDATE 6/28/72 DSCTST.S06 ; UPDATE 4/5/72 DSCTST.S05 ; UPDATE 2/10/72 DCSTST.S04 ; UPDATE 1/17/72 DCSTST.S03 ; UPDATE 12/20/71 DCSTST.S02 ; UPDATE 12/17/71 DCSTST.S01 .TITLE DSCTST ;*********************************************************************** ;* 5P WEXIT: RTI PGMEND = . .END 6CALC # OF LINES TO SKIP MOVB PAGE,R3 ;NO SUCH THING AS A BYTE SUBTRACT SUB R3,R2 BIC #-77-1,R2 ;INSURE SKIP-LINE COMMAND LPDE10: MOV R2,-(SP) JSR PC,GETPTY ;GET EVEN PARITY(IF ALLOWED) MOVB (SP)+,PFWORD ;NOW HAVE EITHER SKIP-LINE... ;...OR SKIP-TO-CHANNEL COMMAND ; ; NOW OUTPUT THIS ONE-WORD P/F COMMAND AND WAIT FOR FINISH CLR @#R.LF ;SET MODE TO P/F MO7 . ;HERE AFTER COMPLETION OF COMMAND BIT #4,EXCOM ;CHECK FOR FILE MARK COMMAND BNE FILMRK ;YES: ALREADY DID IT BIT #313,EXCOM;CHECK FOR PER-RECORD COMMAND BEQ MOREFILES;NOT A PER-RECORD COMMAND DEC XRECS ;ANY MORE RECORDS? BNE CALDRV ;YES: GO DO THEM BIT #12,EXCOM ;WAS LAST COMMAND WRITE? BEQ MOREFILES ;NO:DON'T WRITE E-O-F BIT #40000,@#SWR;IS E-O-F OPTION SELECTED ? BEQ MORG * ;* DISC TEST PROGRAM * ;* * ;* START PROGRAM: * ;* COMPUTER HALTS- ENTER START SECTOR IN SWITCHES * ;* AND CONTINUE. * ;* COMPUTER HALTS- ENTER NO. OF WORDS IN XFER * ;* AND CONTINUE. FDE MOV #PFWORD,@#R.AD ;ADDRESS OF LINE/CHANNEL COMMAND WORD MOV #-1,@#R.WC ;ONLY ONE WORD MOV #4000,@#R.CM ;!!!!!COMMAND PRINT!!!!!! TST @#R.ST ;WAIT FOR DONE BEQ .-4 LPDE20: MOV R0,@#R.AD ;BUFFER START ADDRESS NEG R1 ;WORD COUNT IS NEGATIVE MOV R1,@#R.WC ;OUTPUT WORD COUNT MOV CONSOL,R0 ;GET SWITCH OPTIONS MOV R0,@#R.LF ;SET UP AEEFILES ;NO:NO WRITE E-O-F MOV EXCOM,R0 ;CURRENT COMMAND BIC #146777,R0 ;LEAVE INTRT ABLE & UNIT SELECT BIS #4,R0 ;SET WRITE FILE MARK MOV R0,EOFCOM ;CREATE CORRECT E-O-F COMMAND WRTEOF:JSR R5,MDRIVE ;WRITE FILE MARK BR MOREFILES .WORD EOFCOM ; MOREFI = . ;CHECK FOR MORE NON-SPACE ;RECORD OR FILE COMMANDS BIT #73,EXCOM BEQ EXRTN ;NOT RECORD OR FI"""""""D """"""""""""""""""@DDDDD@DDDDDDDDDDDDDDDDDDDADDB (B Cu~&{' 5u~&K'  dTo8{' 4dTo8K' Mo84d' &Mo8K' , {' 0 K' HP&{' T*&K' <HK $DwwwWa ͋,L w:B8 ` 5 &  E >w   f5eU@  [*   & * G &( 8L'4e Q$ BBB"   U@ U e  "U%Gef. U U Bb 0 * B.&0 M &0 & ILE COMMAND FILMRK: ;DONE WRITING FILE MARK DECB XFILES ;MORE FILES? BNE NEWFILE ;YES EXRTN: RTS PC ;EXIT EXEC ROUTINE .PAGE ; MAG TAPE DRIVER ; ; CALLING SEQUENCE ; JSR R5,MDRIVE ; BR NEXT ; .WORD A(COMMAND) ; .WORD A(MEM ADDR) ; .WORD A(COUNT) ; ;THIS IS THE MAG TAPE DRIVER ROUTINE MDRIVE:CLR R3 ;RESET ERROR NUMBER MOV @2(R5),R1 ;COMMAND BIJUTO OR P/F MODE SWAB R0 BIC #37777,R0 ;GET INTERRUPT ENABLE BITS BIS #4000,R0 ;SET 'START' BIT ;////////////////////////////////////////////////////////// MOV R0,@#R.CM ;!!!!!!!P R I N T!!!!!!!! ;////////////////////////////////////////////////////////// ; MOV #LPDI20,200 ;SET INTERRUPT VECTOR TO THE ROUTINE JSR PC,LPDC ;USE THIS TIME TO CREATE NEXT BUFFER ; ;------------------------------- ; K * ;* NOTE: MAX. OF 3072 WORDS. * ;* COMPUTER HALTS- ENTER FUNCTION AS FOLLOWS * ;* AND CONTINUE: * ;* BIT 15: = 0, WILL USE DATA GIVEN * ;* TO SET UP AND COMPARE BUFFER * ;* BIT 15: = 1, USER RESPONSIBLE FOR * ;* BUFFER. L0 .,zv7,  77 nED,    \EUH_,2@50rp,Xl5 Xa`7X55@,~D BE76,&$7 ,б@   7Є ^U ,@7 7  O %, 5@ MC #147777,R1 ;UNIT # CMP R1,CURUNT ;SAME AS PREVIOUS? BNE MDRV02 ;NO MDRV01:CLRB EXSWCH ;NORM EXIT SWITCH MOV CURUNT,@#MTC;SELECT UNIT IN CASE RESET JSR PC,DELAY ;MUST WAIT BEFORE STATUS CHECK BIT #100,@#MTS ;CTRLR BUSY? BNE ERR2 ;YES BIT #200,@#MTS ;READY? BEQ ERR3 ;NO BIT #16,@2(R5) ;WRITE REQUEST? BEQ MDRV06 ;NO: NO FPT CHECK BIT #1,@#MTS ;WRIN ; NOW WE WAIT HERE UNTIL EITHER THE INTERRUPT COMES (IF ENABLED) ; ..OR UNTIL 'DONE' COMES UP (IF INTERRUPT NOT ENABLED). ; ERROR STOPS ARE PROVIDED FOR STATUS ERRORS, UNEXPECTED INTERRUPTS, ; OR NO RESPONSE AFTER A MAXIMUM ALLOWED TIME INTERVAL. LPDF10: MOV TIMOUT,TIMER ;SET MAXIMUM TIMER LPDF12: MOV @#R.ST,R1 ;FETCH STATUS BMI LPDF20 ;'DONE' IS UP!! COM R1 ;INVERT ALL BITS THAT SHOULD BE SET BIT #4000O * ;* BIT 14: = 0, IF 15=0 THEN USE * ;* DATA BUFFER FILLED WITH DATA * ;* BIT 14: = 1, IF 15=0 THEN DATA BUFFER * ;* FILLED WITH DATA,DATA+1,DATA+2,... * ;* BIT 13: = 1, INCREMENT DATA AFTER * ;* EACH CYCLE SO DATA BUFFER WILL CHANGE * ;* EACHP,6 5EUEUs,<5~ t-p~zf5d,b5 Z 5Pw Hw5:,w 0QTE PROTECT? BNE ERR4 ;YES .PAGE MDRV06: MOV #100,@#TKS ;RESET CONTROLLER (CLEAR STAT & COMMAND) BIT #13,@2(R5) ;IS IT EITHER READ OR WRITE? BEQ MDRV03 ;NO: NOT BUFFER COMMAND BIT #1,@2(R5) ;IS IT READ? BEQ MDRV07 ;NO: SKIP BUFFER CLEAR MOV READAD,R0 ;CURRENT READ BUFFER BEGIN MDRV08: CLR (R0)+ ;CLEAR READ BUFFER CMP R0,#READBF+BUFLTH-2 ;REACR2,R1 ;TEST BUSY AND ON-LINE FOR SET BEQ LPDF70 ;ALL ARE SET ERR030: SCOPE ;ERROR: ONE OF THEM WAS NOT SET LPDF70: COM R1 ;BACK TO NORMAL BIT #31,R1 ;TEST FOR ERRORS BEQ LPDF80 ;GOOD: NONE IS SET ERR040: SCOPE ;ERROR:AT LEAST ONE OF ABOVE IS SET LPDF80: DEC TIMER ;WAIT FOR 'DONE' OR INTERRUPT BNE LPDF12 ;KEEP LOOPING CLR @#R.CM S CYCLE. * ;* BIT 12: = 1, INCREMENT SECTOR AFTER * ;* EACH CYCLE. * ;* BIT 11: = 1, HALT AFTER END SECTOR * ;* REACHED, OTHERWISE LOOP BACK TO * ;* BEGIN SECTOR. * ;* BIT 9: = 0, IF ERROR OCCURS-HALT * ;* UHED BUFFER LIMIT? BLOS MDRV08 ;NOT YET MDRV07: ;CONTINUE MOV @4(R5),@#MTA ;LOAD MEM ADDR REG MOV @6(R5),@#MTN ;LOAD COUNTER REG MDRV03:MOV @2(R5),R0 ;FETCH COMMAND WORD FROM LIST MDRV3A:MOV R0,R2 ;TEMPORARY SWAB R2 BIC #177775,R2;GET INT ABLE BIT MOVB R2,MINTFG ;SAVE (EITHER 10 OR 0) CLR @#MTS ;STATUS REG RESET ;****************************************************** MOV R0,@#MTC ;LOV ;DISABLE INTERRUPT: TIMER IS ZERO ERR050: SCOPE ;ERROR: TIME'S UP: NO FINISH ; LPDF20: BIT #40031,R1 ;TEST BUSY AND ERRORS BEQ LPDF40 ;NONE UP: O.K. ERR060: SCOPE ;STATUS ERROR WITH 'DONE' LPDF40: TSTB CONSOL ;WAS THE "DONE" INTERRUPT ENABLED? BPL LPDG00 ;NO: THIS IS THE CORRECT SEQUENCE MOV DONDLY,R3 ;ENABLED: WAIT FOR INTERRUPT... DEC R3 ;...FOR AW BIT 9: = 1, IF ERROR OCCURS-CLEAR * ;* DISC AND RETRY(ERROR LOOP). * ;* BIT 8: = 0, WILL HALT AND WAIT FOR * ;* DATA RESPONSE AFTER EACH I/O COMPLETE. * ;* BIT 8: = 1, WILL CONTINUALLY REPEAT * ;* XFER UNTIL ERROR OCCURS (LOOP MODE). * ;* BIT 7: = 0, XFER WITHOUT DISC * ;* X ; UPDATE 10/26/72 CALDGN.S10 ; UPADTE 10/26/72 CALDGN.S09 ; UPDATE 10/25/72 CALDGN.S08 ; UPDATE 10/24/72 CALDGN.S07 ; UPDATE 10/4/72 CALDGN.S06 ; UPDATE 9/20/72 ADD WRAP AROUND CHECK ; UPDATE 9/12/72 CALDGN.S04 ; UPDATE 9/6/72 CALDGN.S03 ; UPDATE 9/6/72 CALDGN.S02 .TITLE CALDGN ;*********************************************************************** ;*YAD COMMAND REGISTER: ;INITIATES TAPE OPERATION ;****************************************************** JSR PC,DELAY ;MUST WAIT BEFORE CHECKING STATUS .PAGE MDRV05: BIT #1000,@2(R5) ;INTRPT ABLED? BEQ BUSYCK ;NO: CHECK BUSY LOADCK: ;LOAD-POINT CHECK BIT #2,@#MTS ;AT LOAD POINT? BNE BUSYCK ;YES: WAIT FOR BUSY TO CLEAR TSTB MINTFG ;ZDDITIONAL DELAY... BNE .-2 ;...BETWEEN 'DONE' AND INTERRUPT CLR @#R.CM ;DISABLE INTERRUPT ERR070: SCOPE ;SHUCKS, INTERRUPT NEVER CAME ; ; ENTER HERE AFTER A SUCCESSFUL 'DONE' WITHOUT INTERRUPT ENABLED ; LPDG00: JSR PC,LPD.ST ;GO MAKE A COMPLETE STATUS CHECK FIRST ERR080: SCOPE ;STATUS ERROR RETURN BIT #4,CONSOL ;IS "STALL" SELECTED OUT FRONT? BEQ LPDG50 ;NOT TO[ INTERRUPT. * ;* BIT 7: = 1, USE DISC INTERRUPT. * ;* BITS 2:0 = I/O FUNCTION * ;* 0 = NOP * ;* 1 = WRITE * ;* 2 = READ * ;* 3 = WRITE CHECK * ;* \ * ;* STORAGE ALLOCATOR DIAGNOSTIC * ;* * ;* START AT 12000 - COMPUTER HALTS AT: ;* FOR INPUT FUNCTION ;* FOR SB/NOB IF REQUIRED. ;* FOR ERROR INDICATIONS WHICH ARE: ;* 100000 IF TIME OUT ]INTRPT ABLED: WATCH FLAG BNE LOADCK ;NO INTRPT YET: CHECK LOAD POINT AGAIN EXIT: TSTB EXSWCH ;EXIT OR RETURN? BNE MDRV01 ;BACK AFTER NEW UNIT SELECT MOV @#MTS,STAT;SAVE STATUS BIT ERRPAT,STAT;SEE IF ANY ACTIVE ERRORS BNE ERR5 ;YES:OPERATOR MUST DUMP STATUS RTS R5 ;EXIT DRIVER ; BUSYCK:BIT #100,@#MTS;CHECK "BUSY" BIT BNE BUSYCK ;STILL BUSY BR EXIT ;BUSY BIT IS CLE^DAY ; STALL FOR A RANDOM # OF M-SECS BETWEEN 8 AND 1023. MOV SEED,R0 ;SEED (=RNUM(N-1)) ROL R0 ROL R0 ; X4 ADD DAMP,R0 MOV R0,-(SP) ;RNUM(N)=4*RNUM(N-1)+DAMP(N-1) ROL R0 ROL R0 ADD DAMP,R0 ROL R0 ROL R0 MOV R0,DAMP ;DAMP(N)=64*RNUM(N-1)+20*DAMP(N-1) ; RANDOM NUMBER NOW GENERATED AND ROUTINE READIED FOR NEXT TIME _ 4 = WRITE THEN READ * ;* NOTE: A CYCLE IS THE WRITE * ;* THEN READ. * ;* COMPUTER HALTS- DATA REQUEST HALT: * ;* IF FCN BIT 15 IS SET USER MAY NOW * ;* SET OR CHECK DATA BUFFER, OTHERWISE, * ;* DATA IN SWITCHES WILL BE USED. * ;* `ON HARDWARE ;* 040000 FOR OTHER HARDWARE ERROR ;* 1 AFTER A DEALLOCATE * ;* 2 AFTER AN ALLOCATE * ;* 3 BIT MAP COMPARE AFTER * ;* ANY SEARCH * ;* 4 FR COMPARE AFTER ANY SR* ;* 5 AR COMaARED ; DELAY: MOV #20,R0 ;MUST WAIT SHORT TIME BEFORE DEC R0 ;MAKING FIRST CHECK ON STATUS BNE .-2 RTS PC ; MDRV02:BIT #100,@#MTS;TEST CTRLR STATUS "BUSY" FLAG BNE ERR1 ;OLD UNIT STILL BUSY INCB EXSWCH ;SET SWITCH TO RE-ENTER ROUTINE MOV @2(R5),R0 ;AFTER NEW SELECT BIC #146777,R0 ;GET NEW UNIT # & INT ABLE MOV R0,R1 BIC #147777,R1 MOV R1,CURUNT ;SAVE NEW UNIT # b BIC #177007,(SP)+ ;MASK 10 BR LPDC70 ;GO SEE IF BUF IS FULL ; ;------------------------------- ; THIS IS THE ERROR STATUS A BUFFER WITH PATTERN CLR R3 ; NO-CLEAR DATA BUFFER FOR READ TST016: MOV #BUF,R2 ; BUFFER ADDRESS MOV WORDCT,R4 ADD R4,R4 ADD R2,R4 ; TO THIS ADDRESS MOV R4,EXTENT ; SAVE FOR FUTURE USE TST020: MOV R3,(R2)+ BIT #1.,R0 ; WRITE OR WRITE CHECK? BEQ TST025 ; NO BIT #40000,FCN ; YES-INCREMENTAL DATA PATTERN? BEQ TST025LOCATION TABLE ALRR = 162020 ; ALLOCATOR REQUEST REGISTER ALAR = 162022 ; ALLOCATOR ANSWER REGISTER ALFR = 162024 ; ALLOCATOR FUNCTION REGISTER ; ; FLD1: .WORD 0 ; START TYPE FLD2: .WORD 0 ; SINGLE OR LOOP FLD3: .WORD 0 ; SB/NOB FLD4: .WORD 0 ; FUNCTION FLD5: .WORD 0 ; USE SOFTWARE ALLOC. TO CHECK OUT ; A: .WORD 0 ; WORK WORDSNY DATA ENTERED? BNE DLIST ;YES: GO LOAD IT ;FILL LIST WITH INTEGER SEQUENCE: 1,2,3....N MOVINS:MOV R3,(R4)+ ;LOAD WORD (OR BYTE) INC R3 ;EACH ONE INCREMENTING CMP R4,#WRITBF+BUFLTH ;REACHED END? BLO MOVINS ;NOT YET DLGRTN:JMP DIALOG ;COMMON EXIT TO BEGIN DIALOGUE DDUMP: TST R3 ;ANY ADDRESS? BNE ADRSPC ;YES MOV #WRITBF,R1 ;NO:USE WRITE BUFFER MOV #WRITBF+BUFLTH-2,RCHECK MADE @ BEGIN AND AFTER EACH LINE LPD.ST: MOV @#R.ST,-(SP) ;PUSH STATUS ONTO STACK BIT #40031,(SP) ;ANY ERROR BITS SET? BNE LPDS50 ;YESSIR: GO FOR ERROR RETURN BIT #2,(SP) ;TEST ON-LINE BEQ LPDS50 ;ON-LINE NOT SET ADD #2,2(SP) ;BUMP RETURN ADDRESS FOR GOOD EXIT LPDS50: TST (SP)+ ;POP STATUS OFF STACK RTS PC ;TAKE EITHER ERROR OR GOOD RETURN ; ; NO INC R3 ; YES TST025: CMP R2,EXTENT ; FINISHED? BLT TST020 ; NO SIO: BIC #177774,R0 ; ISOLATE I/O FDN REQUESTED MOV R0,FCNSW ; SAVE FOR LATER USE MOV #BUF,CMA ; SET UP CURRENT MEMORY ADDRESS MOV WORDCT,WCR ; SET UP WORD NEG WCR ; COUNT REGISTER MOV SECTOR,DAR ; SET UP START SECTOR SEC B: .WORD 0 ; USED FOR C: .WORD 0 ; EXCLUSIVE OR ; ; STORAGE FOR OLD TABLE AND REGISTERS PRESTR: .BLKW 16.+3.+2. ; LALAR: .WORD 0 ; LAST HARDWARE AR AFTER A SEARCH ; SBNOB: .WORD 0 ; DELAY: .WORD 150 ; FOR DELAY DURING CHECKOUT ; SMASK: .WORD 3400 ; MASK OUT UNWANTED SEARCH SBS ; NERROR: .WORD 0 ; # OF ERRORS ; NLOOP: .WORD 0 ; NUMBER5 ;SET BUFFER END POINTER PRTDAT:MOV (R1)+,R4 ;FETCH WORD (BYTE) JSR PC,PRTNUM ;PRINT IT JSR PC,FORMAT ;,CAN BE STOPPED BY "HALT" CMP R1,R5 ;REACHED END OF BUFFE? BLOS PRTDAT ;KEEP GOING BR DLGRTN ;YES ADRSPC:MOV (SP)+,R1 ;SET LOW ADDR (IF ONLY ONE LIMIT MOV R1,R5 ;SET HIGH ADDR LIMIT SETHI: TST -(R3) TST R3 ;ONLY ONE DATUM? BEQ PRTDAT ;YES MOV (SP .PAGE ; THIS IS THE 'GET PARITY' SUBROUTINE. IT SETS/CLEARS THE PARITY ; BIT IN THE 7-BIT CHARACTER WHICH IS ON TOP OF THE STACK ON ENTRY, ; BUT ONLY IF BIT SWITCH #15 ON THE CONSOLE IS SET. OTHERWISE ALL ; PARITY BITS WILL BE CLEAR, WHICH IS CORRECT FOR ABOUT HALF OF THEM GETPTY: TST CONSOL ;IS PARITY OPTION SELECTED? BPL GETPEX ;OPTION NOT SELECTED MOVB #7,PTYCNT ;WILL TEST SEVEN BITS CLRB PARITY ;WILL ; FOR GO BIT ROL R0 ; SET FUNCTION AND GO BITS CLR R4 ; USE TO COUNT DELAY TSTB FCN ; INTERRUPT MODE REQUESTED? BMI TST040 ; YES MOV R0,DCS ; START I/O FUNCTION TST030: INC R4 ; DELAY A LONG TIME BNE TST030 TSTB DCS ; CONTROLLER READY BMI IOCOMP ; YES-I/O COMPLETE TST035: MOV #1.,R0 ; NO-SHO OF LOOPS ; OSBNOB: .WORD 0 ; LAST SB/NOB USED TO START A FUNCTION. ; .PAGE ; ; ; START = . ; HERE IS THE REAL BEGINNING. CLR NERROR CLR NLOOP MOV #CALDGN,SP ; SET STACK POINTER MOV #-1.,SBNOB ; INITIALIZE CALDG1: HALT ; WAIT FOR TEST INFORMATION CALDG2: MOV SWR,R0 SWAB R0 ASR R0 ASR R0 ASR R0 BI)+,R1 ;SET LOW LIMIT BR SETHI ;GO CHECK FOR EMPTY STACK DLIST: MOV SP,DNDEX ;INIT INDEX TO POINT AT STACK DLIST1:MOV R3,R5 ;INIT STACK INDEXER TST -(R5) ;LESS ONE SINCE 1ST WD INDEX=0 TST R5 BLT DLIST1 ;LIST DEPLETED:BEGIN AGAIN DMOVE: MOV 0(R5),(R4)+;TRANSFER WORD (OR BYTE) TO BUFF DNDEX = .-2;LABEL FOR INDEX IN "DMOVE":REF'D @ DLIST CMP R4,#WRITBF+BUFLTH BHIS DLGRTN ;BUFFER FULL: EXIT ACCUMULATE BIT COUNT HERE MOVB 2(SP),-(SP) ;CREATE WORKING CHARACTER GETP10: RORB (SP) ;SHIFT OFF LOW BIT ADCB PARITY ;ACCUMULATE DECB PTYCNT ;MORE BITS? BNE GETP10 ;MORE! TST (SP)+ ;;POP WORKING CHAR OFF STACK ASLB 2(SP) ;;POSITION CHAR TO ACCEPT PARITY BIT RORB PARITY ;LOAD 'C' WITH PARITY BIT RORB 2(SP) ;SHIFT PARITY BIT IULD HAVE COME IN BY NOW BR ERROR ; ERROR ; ; SIO WITH INTERRUPT REQUEST PROCESSOR ; TST040 = . BIS #100,R0 ; SET INTERRUPT ENABLE CLR INTSW ; RESET INTERRUPT SWITCH MOV R0,DCS ; START I/O FUNCTION TST050: TST INTSW ; RECEIVE INTERRUPT? BNE IOCOMP ; YES-I/O COMPLETE INC R4 ; DELAY A LONG TIME BNE TST050 BR C #177761,R0 ; ISOLATE FIELD 1 - WORD INDEX MOV R0,FLD1 MOV SWR,R0 SWAB R0 BIC #177761,R0 ; ISOLATE FIELD 2 - WORD INDEX MOV R0,FLD2 MOV SWR,R0 ASR R0 ASR R0 ASR R0 ASR R0 ASR R0 BIC #177761,R0 ; ISOLATE FIELD 3 - WORD INDEX MOV R0,FLD3 MOV SWR,R0 ASR R0 ASR R0 BIC #1BR DLIST1+2 ;CONTINUE FILLING BUFFER ; ; PRTNUM = . ;PRINT NUMBER SUBROUTINE MOV R0,-(SP) ;SAVE USED REGISTERS MOV R3,-(SP) MOV #6,R0 ;DIGIT COUNT FOR "PRINT A NUMBER" MOV R4,R3 ;# TO PRINT CLR R4 ;1ST DIG ASL R3 ROL R4 BR PRT020 PRT010:CLR R4 ;NEXT 5 DIGS ASL R3 ROL R4 ASL R3 ROL R4 ASL R3 ROL R4 PRT020:ADD NTO CHARACTER GETPEX: RTS PC ;BACK WITH CHARACTER ON TOP OF STACK ; ; ; THE FOLLOWING SUBROUTINE IS A BASIC 1-MILLISECOND DELAY. ; IT LOOPS FOR 'N' MILLISECONDS, WHERE 'N' IS THE NUMBER ON TOP ; OF THE STACK ON ENTRY. THE STACK IS CLEARED BEFORE EXIT. ; DELAY: MOV 2(SP),-(SP) ;PUT 'N' FORWARD MOV 2(SP),4(SP) ;PUT RETURN ADDRESS BACK ONE WORD DELAY1: MOV #132.,2(SP) ;BASIC DELAY FOR 1 M-SEC DELAY2: DEC 2(SP) ;COUNT ITST035 ; TOO LONG-ERROR ; ; I/O COMPLETE-READY OR INTERRUPT ; IOCOMP = . MOV DCS,R0 ; GET ERROR INFO. BMI ERROR ; WHOOPS-ERROR TST FCN ; USER BUFFER SET-UP BMI RSTART ; YES-RESTART CMP #2.,FCNSW ; WAS IT A READ FUNCTION? BNE RSTART ; NO MOV #BUF,R2 ; COMPARE DATA IN BUFFER MOV DATA,R3 TST060: CMP R3,(R277761,R0 ; ISOLATE FIELD 4 - WORD INDEX MOV R0,FLD4 MOV SWR,R0 BIC #177770,R0 ; ISOLATE FILED 5 MOV R0,FLD5 JSR PC,SAVE ; SAVE OLD TABLE AND REGISTERS MOV FLD1,R5 ; GET READY TO INITIALIZE BIT MAP JMP @INIT(R5) ; DO IT INIT = . .WORD INIT0 ; CLEAR ALLOCATION TABLE .WORD INIT1 ; SET ALLOCATION TABLE .WORD INIT2 #60,R4 ;MAKE TTY CHR JSR PC,OCH ;PRINT CHAR DEC R0 ;DONE? BGT PRT010 ;NO MOV (SP)+,R3 ;RESTORE REGISTERS MOV (SP)+,R0 RTS PC ;RETURN ; ; FORMAT:INCB PPOS ;POSITION POINTER CMPB PPOS,#10 ;8 POS PRINTED? BGE FOR020 ;YES:NEW LINE MOV #40,R4 ;NO:OUTPUT 2 SPACES JSR PC,OCH JSR PC,OCH RTS PC FOR020:JSR PC,CRLF ;DO RETURN &LFT, MAN BNE DELAY2 ;KEEP GOING... DEC (SP) ;THIS IS THE # OF M-SECS TO DELAY BNE DELAY1 ;OUTER LOOP STILL HOT CMP (SP)+,(SP)+ ;POP 'N' AND LOCAL COUNTER OFF STACK RTS PC ;GO BACK ; ; ; THIS IS THE SCOPE ROUTINE. IF BIT SWITCH #3 IS NOT SET, ANY ; ERROR WILL CAUSE STOP HERE, WITH STATUS DISPLAYED IN "DATA" LIGHTS. ; IF THE SWITCH IS SET, ALL ERRORS WILL FALL THROUGH HERE, AND ; T)+ BNE TST070 ; UH-OH BIT #40000,FCN ; INCREMENTAL PATTERN? BEQ TST065 ; NO INC R3 ; YES TST065: CMP R2,EXTENT ; FINISHED BLT TST060 ; NO BR RSTART ; YES-RESTART TST070: MOV #2.,R0 ; ERROR-DID'NT READ EXPECTED DATA BR ERROR ; ; RESTART TEST AS DEFINED IN FCN ; RSTART = . TST RDWTSW ; READ W ; USE PRESENT TABLE CONDITION .WORD INIT3 ; SET UP 101010.... INIT0 = . CLR R0 ; SB/NOB = 0 JSR PC,DALLO ; DEALLOCATE WHOE THING BR GETADR INIT1 = . CLR R0 JSR PC,ALLO ; ALLOCATE WHOLE THING BR GETADR INIT2 = . TST FLD5 ; SOFTWARE TOO? BEQ GETADR ; NO MOV #-32.,R5 ; YES INIT RTS PC ; ; ; OUTPUT A CHARACTER ; OCH: TSTB @#TPS ;TTY READY? BPL OCH ;NO MOVB R4,@#TPB ;YES:OUTPUT CHAR RTS PC ; ; TTYINT:MOVB @#TKB,TTYTMP ;TTY KB INTERRUPT BICB #600,TTYTMP;CLEAR CHANNEL EIGHT CMPB #'H,TTYTMP ;IS CHAR HALT CHAR "H"? BNE FLGTST ;NO BIT #2,@#SWR ;CHECK FOR "RESET" OPTION BEQ DLGRTN ;NOT SELECTED: NO RESET JMP HALT ;YES:GO STOP UNITS HE DIAGNOSTIC WILL CONTINUE IN SPITE OF THEM ; SCOPEI: CMP (SP)+,(SP)+ ;IT IS ENTERED BY EMT: POP STACK BIT #10,CONSOL ;IS "SCOPE" BIT SET? BEQ SCOPE1 ;NO: THEN HALT SCOPE2: JMP LPDD ;IS SET: THEN CONTINUE SCOPE1: MOV @#R.ST,R0 ;DISPLAY STATUS IN LIGHTS STOP03: HALT ;FIRST HALT TO DISPLAY STATUS MOV -4(SP),R0 ;NOW SHOW THE ADDRESS OF THE ERROR STOP04: HALT ;...DURING THE RITE REQUEST? BEQ RST020 ; NO BIT #2,FCN ; FINISHED A READ? BNE RST010 ; YES BIC #7,FCN ; NO BIS #2,FCN ; SET TO READ BR TST015 RST010: BIC #7,FCN BIS #1,FCN ; SET TO WRITE AND START NEW CYCLE RST020 = . BIT #10000,FCN ; SECTOR INCREMENT? BEQ RST030 ; NO INC SECTOR CMP SECTOR,END21: MOV ALLTBL+32.(R5),A MOV #-1.,B MOV A,C BIC B,C BIC A,B BIS C,B ; PERFORM EXCLUSIVE OR MOV B,BITTBL+32.(R5) ; SET UP SOFTWARE TABLE ADD #2,R5 ; BUMP BLT INIT21 BR GETADR INIT3 = . MOV #125252,R0 ; ALTERNATE 1'S AND 0'S MOV #-32.,R5 INIT31: MOV R0,ALLTBL+32.(R5) ; SET IN ALLOCATOR TABLE ADFIRST FLGTST:TSTB REQFLG ;REQUEST PENDING? BEQ TYEXIT ;NO CLRB REQFLG INCB CHRFG ;INDICATE CHAR READY TYEXIT:RTI ; ; ICH: INCB REQFLG ;INPUT A CHARACTER & ECHO IT TSTCH: TSTB CHRFG ;IS ONE AVAILABLE BEQ TSTCH ;NO CLRB CHRFG ;CLEAR READY FOR NEXT TIME MOVB TTYTMP,R4 ;YES CMP R4,#CR ;IS THIS A CARRIAGE RETURN? BNE ECHO ;NO: GO ECHO IT JSR PC,CRLF ;YES: OUSECOND HALT BR SCOPE2 ;GO AGAIN AFTER 'CONTINUE' ; ; BYTLST = . ;LIST OF PARAMETER BYTES... ; ...LOADED AT BEGIN OF RUN PFCHAR: .BYTE 0 ;HOLDS PAPER-FEED CHARACTER, IF ANY COUNT: .BYTE 0 ;HOLDS WORD COUNT FOR LINE WIDTH PAGE: .BYTE 0 ;HOLDS NUMBER OF LINES PER PAGE HOMECH: .BYTE 0 ;HOLDS CHANNEL # FOR TOP-OF-FORM, SPEED: .BYTE 0 ;HOLDS MINIMUSCT ; END? BLOS RST030 ; NOT YES MOV STSCT,SECTOR ; RE-PRIME START SECTOR BIT #4000,FCN ; HALT OR CONTINUE BEQ RST030 ; GO HALT ; WAIT RST030: BIT #20000,FCN ; INCREMENT DATA FOR CHANGE? BNE RST200 ; YES RST100: CLR R0 ; SIGNIFY NO ERROR BIT #400,FCN ; LOOP REQUEST? BNE RST300 JMP TST012 RST200: INC DATA D #2,R5 ; BUMP BLT INIT31 ; NOT DONE YET BR INIT2 ; CHECK FOR SOFTWARE CHECK ; GETADR = . JSR PC,GETSB ; GO GET SB/NOB BR FCTN GETSB = . MOV FLD3,R5 ; GET SB/NOB FIELD JMP @SB(R5) ; DO IT SB = . .WORD SB0 ; SET BY OPERATOR .WORD SB1 ; SET BY INCREMENT FROM 0 .WORD SB2 ; TPUT LF, TOO RTS PC ; ECHO: JSR PC,OCH ;ECHO ON TTY RTS PC ;CHAR IS IN R4 ; ; CRLF: MOV R4,-(SP) ;SAVE MOV #5015,R4 ;CR & LF JSR PC,OCH ;PRINT LOW BYTE SWAB R4 JSR PC,OCH CLRB PPOS ;RESET FOR POSSIBLE FORMAT MOV (SP)+,R4 ;RESTORE RTS PC ; ; ; OUTPUT N CHARS ; CALLING SEQUENCE: ; JSR R5,ONCH ; .WORD BUFADR ADDRESS OF FIRST (LOW) CHARACTER M DELAY AFTER PRINT CNTR16: .BYTE 0 ;COUNTER FOR OPTIMUM SET LINENO: .BYTE 0 ;CURRENT LINE NUMBER PARITY: .BYTE 0 ;USED TO CALC CHARACTER PARITY PTYCNT: .BYTE 0 ;...ALSO SCHAR: .BYTE 0 ;SYNTHETIC FIRST CHARACTER WDCNT: .BYTE 0 ;WORD COUNT (LINE WIDTH) .EVEN PFWORD: .WORD 0 ;HOLDS P/F CHAR FOR T-O-F IN AUTO MODE BOUNDL: .WORD 377 ;LOWER BUFFER BOUNDARY BOUNDH: .W BR RST100 RST300: JMP TST015 ; ; ERROR ERROR ERROR ; ERROR = . BIT #1000,FCN ; CLEAR AND RETRY REQUEST? BNE ERR1 ; YES HALT ERR1: MOV #400,DCS ; CLEAR DISC JMP RST300 ; ; DISC INTERRUPT HANDLER DSCINT = . INC INTSW ; BUMP INTERRUPT RECEIVED FLAG RTI ; .END SET BY RANDOM NUMBER GENERATOR .WORD SB2 ; 3 LOOKS LIKE 2 SB0 = . HALT ; WAIT FOR SWITCH SET WITH SB/NOB MOV SWR,SBNOB ; SET IT RTS PC SB1 = . INC SBNOB ; INCREMENT RTS PC SB2 = . JSR PC,RANDOM ; GENERATE RANDOM NUMBER RTS PC ; FCTN = . INC NLOOP MOV SBNOB,R0 ; GET START SB ; .WORD NCHAR # OF CHARS ; ONCH: MOV (R5)+,R0 ;BUF ADR MOV R1,-(SP) ;SAVE IT MOV (R5)+,R1 ;# CHARS ONC010:MOVB (R0)+,R4 ;OUTPUT CHAR JSR PC,OCH DEC R1 ;DONE? BGT ONC010 ;NO MOV (SP)+,R1 ;RESTORE RTS R5 ; INPUT CHARS FROM TTY UNTIL CR ; CALLING SEQUENCE -- ; JSR R5,INCH ; .WORD BUFADR LOW BUF ADR ; .BYTE MAXCH MAX # CHARS ; .BYTE # CHARSORD LP.DGN-37 ;UPPER BUFFER BOUNDARY CURBUF: .WORD 0 ;BEGINNING OF CURRENT BUFFER CURBND: .WORD 377  ;END OF CURRENT BUFFER TIMOUT: .WORD 3200. ;# OF 31-MICROSEC WAIT-LOOPS FOR INT TIMER: .WORD 0 ;USED TO TIME IT OUT DONDLY: .WORD 202. ;WAIT AFTER 'DONE' FOR INT: 1 MILLISEC DAMP: .WORD 1233 ;FIRST TERM FOR RANDOM # GENERATOR SEED: .WORD 7622 ;FIRST SEED FOR ABOVE CONSOL: 0 /NOB FOR ALL MOV R0,OSBNOB ; AND SAVE FOR A REPEAT (LOOP #4) MOV FLD4,R5 ; GET FUNCTION TYPE JMP @FCTNP(R5) ; FUNCTION PROCESSOR FCTNP = . .WORD FCTN0 ; SEARCH .WORD FCTN1 ; SEARCH MIN. .WORD FCTN2 ; ALLOCATE .WORD FCTN3 ; DEALLOCATE .WORD FCTN4 ; ALLOCATE-DEALLOCATE .WORD FCTN5 ; SEARCH-ALLOCATE-SWAB-DEALLLOCA READ INCH: MOV (R5)+,R0 ;GET BUF ADR MOV R1,-(SP) ;SAVE IT MOVB (R5)+,R1 ;GET MAX CHAR CNT CLRB (R5) ;INIT COUNT INC010:JSR PC,ICH ;GET A CHAR CMPB R4,#215 ;CR? BEQ INC020 ;YES INCB (R5) ;CHR CNT CMPB (R5),R1 ;TOO MANY? BGT INC010 ;YES: IGNORE UNTIL CR MOVB R4,(R0)+ ;PUT IN BUF BR INC010 ;NEXT INC020:INC R5 ;BUMP TO RETURN MOV (S ;HOLDS CONSOLE OPTIONS .END &$,<h7 7 ,b E7E7 , E7p E7bE,7X FH} B, r,( 0%w@&"MM,] De 5@e1,  }4<FLL6,F b 7}fv|,lTE .WORD FCTN6 ; SEARCH MIN.-ALLOC-SWAB-DEALLO .WORD FCTN7 ; MIN SEARCH,ALL,NEW SB/NOB,DEALL. FCTN0 = . JSR PC,SRCH ; SEARCH BR RSTART FCTN1 = . JSR PC,MSRCH ; MINIMUM SEARCH BR RSTART FCTN2 = . JSR PC,ALLO ; ALLOCATE BR RSTART FCTN3 = . JSR PC,DALLO ; DEALLOCATE BR RSTART FCTN4 = P)+,R1 ;RESTORE RTS R5 ;EXIT ; INPUT A POSITIVE OR NEGATIVE OCTAL NUMBER FROM TTY; ; A CR IS EXPECTED AS A DELIMITER AFTER THE LAST DIGIT ; ; CALLING SEQUENCE -- ; ; JSR R5,INN ; .BYTE 0 -1,0,1 ON RETURN IF NEG, ERROR, POS ; .BYTE 0 NO OF DIGITS READ ; NUMBER RETURNED IN R4, 2'S COMP IF NEG ; INN: CLR (R5)+ MOV R3,-(SP) CLR R3 INN010: JSR PC,ICH  : d7 4 1 }, x, 5r&j \ ,,5VN ~ @ 5: ,2 b DR }     , wRwP 7 5x ,*7 j ,m 7,P P5\ 7  ,v TM7 5~@vr* h7U , 15F5t,-4h*M5 . JSR PC,ALLO ; ALLOCATE JSR PC,DALLO ; DEALLOCATE BR RSTART FCTN5 = . JSR PC,SRCH BIT #1,ALFR ; GET SOMETHING? BNE RSTART ; NO MOV ALAR,R0 JSR PC,ALLO ; ALLOCATE IT SWAB R0 JSR PC,DALLO ; DEALLOCATE THIS BR RSTART FCTN6 = . JSR PC,MSRCH BIT #1,ALFR ; GET SO ;GET A CHAR TO R4 CMPB R4,#' ;IGNORE BLANKS BEQ INN010 CMPB R4,#'- ;IS IT A MINUS SIGN '(*) BEQ INN020 ;YES CMPB R4,#CR ;NO, IS IT A CR BEQ INN030 ;YES CMPB R4,#'/ BEQ INN030 ;SLASH COUNTS SAME AS RETURN CMPB R4,#60 ;IS IT A VALID OCTAL DIGIT BLT INN060 ;NO CMPB R4,#67 ;MAYBE BGT INN060 ;NO ASL R3 "  0 H? "*  : 7 7  @ e  wE@Hw w w    ww E77 vw   Y N \w    7 95w 027 * @=5w ^07 w,Z7$0" 5 8 , 7604 ,2U@ }JVVd^fV ,Xw wwD ,~MM~~]|x-t@e,   `@` , @`7f  BA e!,B@Ї><:hQ@e,$,METHING? BNE RSTART ; NO MOV ALAR,R0 JSR PC,ALLO ; ALLOCATE IT SWAB R0 JSR PC,DALLO ; DEALLOCATE THIS BR RSTART ; FCTN7 = . JSR PC,MSRCH BIT #1,ALFR ; GOT SOMETHING BNE RSTART MOV ALAR,R0 ; YES JSR PC,ALLO JSR PC,GETSB MOV SBNOB,R0 JSR PC,DALLO ; RSTART = ;YES, MOVE DIGIT INTO NUMBER ASL R3 BCS INN060 ;GT 177777? ASL R3 BCS INN060 ;GT 177777? BICB #370,R4 ADD R4,R3 INCB -1(R5) ;INCREMENT DIGIT CNT BR INN010 ;GET NEXT DIGIT INN020: MOVB #-1,-2(R5) ;SET FLAG TO NEG NUMBER BR INN010 ;GET NEXT DIGIT INN030: CMPB -1(R5),#6 ;EXCEED 6 DIGITS? BGT INN060 ;YES, ERROR MOV R3,R RH @ E O ww 0X  H  L ww j  Y@ N wemmm~wxw w epkw w E7Fw w E7> w w |7$ *U@*"7!w 87 @ 1  W  @ @l 7 5v 5@fw 7 TR,w w  W /3*   *w 7B0@ , -   *"   w  /J5 7 EV,pU0EUE ErU,PlEjUd EXU@REPUJ,Jw ~7 x7tl   J,D$   5q$ W 95,5 8  (  ,& ,.E 5 '  8,TE  5q$w L5 ,zU   ݜ' . MOV FLD2,R5 ; GET RESTART PROCEDURE JMP @RST(R5) ; DO IT RST = . .WORD RST0 ; SINGLE CYCLE .WORD RST1 ; LOOP .WORD RST1 ; LOOP .WORD RST1 ; LOOP .WORD RST1 ; ON RESTART SAME AS OTHER LOOPS .WORD RST1 ; LOOP RST0 = . CLR R0 ; NO ERROR JMP CALDG1 ; START AGAI4 ;NO TSTB -2(R5) ;IS NUMBER NEG. BEQ INN050 ;NOT NEG NEG R4 ;YES, TWO'S COMP NUMBER INN040: MOV (SP)+,R3 ;RESTORE R3 RTS R5 ;EXIT W/RESULT IN R4 INN050: MOVB #1,-2(R5) ;SET FLAG TO POS NUMBER BR INN040 INN060: CLRB -2(R5) ;SET FLAG TO ERROR BR INN040 .PAGE ;******* SYSTEM SUBPROGRAM TO PRINT WRITE AND READ CRCC'S********* CRCPRT: JSR PC,CRLF **DATUM MAG. TAPE DIAG.** !UNIT NUMBER !PHASE-ENCODED (Y OR N) !# TRACKS (7,9) !WRONG # TRACKS SENSED !PARITY (E,O) !DENSITY (H , L) !CORE DUMP MODE (Y , N) !DATA PATTERN (0-7) !DATA VALUE !BYTE COUNT !SELECT TESTS: !??!TEST TERMINATED !_H^v87 7 NUER ~EU n 7 d T X 7 N V B27 X ( "\7 Z 7 T L5 @w 8w .w D&f&MD N AT FRIST HALT RST1 = . JMP CALDG2 ; START FROM SWR PICKUP ; ; ; NOTE: R0 HAS SB/NOB FOR REQUEST ; DALLO = . JSR PC,WRAP ; CHECK FOR WRAP AROUND MOV R0,ALRR MOV #4,ALFR ; START DEALLOCATION JSR PC,TIMOUT ; TIME OUT APPRPRPIATELY BIT #2,ALFR ; MAKE IT IN TIME? BNE TIMERR ; NO TST FLD5 ; SOFTWARE TOO? MOV WRITAD,R0 JSR PC,CRCCHK JSR PC,FORMAT MOV READAD,R0 JSR PC,CRCCHK JMP DIALOG ;********** ROUTINE TO CALCULATE CRCC FROM WRITE AND READ BUFFERS... ; ...AND PRINT EACH OUT IN BINARY: [7 6 5 4 3 2 1 0 P] CRCCHK: MOV XCOUNT,R1 ;WORDS ASL R1 ;BYTES CLR R2 ;CRCC CRC100: MOVB (R0)+,R3 ;WORK REG MOV R3,-(SP) ; 7 &ADDR ERR XXXXXX ZZZZZZ !7 7 HD^7 > R  BM  -3  7 \\\\\7 ^@w @w ~w  7 t XXXXXX ****** ! 7D7 <w : 707 (w &    \w 7 Tw  UtD F & N w * xw $ E@hw  ^ewPw wHw  @w  2w  w w w  w w vE75w  Vew 5w ~ BNE DALL1 ; YES RTS PC ; NO DALL1: MOV R0,B3RR MOV #4,B3FR JSR PC,DALLOC JSR PC,SOFTCP ; COMPARE SOFTWARE TABLE BNE HDER1 RTS PC ; ALLO = . JSR PC,WRAP ; CHECK FOR WRAP AROUND MOV R0,ALRR MOV #10,ALFR ; START ALLOCATION JSR PC,TIMOUT ; TIME OUT APPROPRIATELY BIT #2,ALFR ; ALSO WORK MOV #8.,R4 CLR R5 ;PARITY CRC110: ASR (SP) ;SHIFT OFF NTH BIT ADC R5 ;ACCUM SET BIT COUNT DEC R4 BNE CRC110 SWAB R3 CLRB R3 TST (SP)+ INC R5 ;MAKE PARITY ODD ASR R5 ;SHIFT PARITY TO CARRY ADCB R3 SWAB R3 ;PARITY BIT NOW IN BIT #8 JSR PC,EOR ; w |5w l>EU7 5@ w < w 2 w 5jw  w * ewL5Dw w  52w w w 5 w w 5 w w hw 5@w Pw Uww 5@w x w n "w v w Z 5@w R w H w T 5@w 6 w , 0w & w . w (w & UwHw & 5<w w 5*w ID  j N7 w 2 w 6  w " w  w MAKE IT IN TIME? BNE TIMERR ; NO TST FLD5 ; SOFTWARE TOO? BNE ALL1 ; YES RTS PC ; NO ALL1: MOV R0,B3RR MOV #10,B3FR JSR PC,ALLOC JSR PC,SOFTCP ; COMPARE SOFTWARE TABLE BNE HDER2 RTS PC ; SRCH = . BIC SMASK,R0 ; MASK OUT BAD SEARCH ADRESSES MOV R0,ALRR MOV #20,ALFR EOR NEW DATA WORD INTO CRC CLR R4 MOV R2,R3 ;NEW CRCC SWAB R3 ASRB R3 ;P TO C FOR FOLLOWING SHIFT TO BIT #0 ROLB R2 ;THIS IS THE CRC SHIFT (P TO 0, ETC.) ADC R4 ;SAVE NEW PARITY BIT BEQ CRC120 ;NOT SET: BYPASS SELECTIVE INVERSIONS MOV #74,R3 JSR PC,EOR ;INVERT BITS 2,3,4 & 5 IN NEW CRCC CRC120: SWAB R2 ;PRw   -(w w - tw (jnw w w Rw (Hw Hw w 0w (&w f &w h w h w b (w D w P   w : w B w ,   w  w  w w :  w w e-]w vw w w w e`-\X(Fw  7 (UU@7w \ r5w f $ w J7 Lw > vnUU@7\w  $5r; START SEARCH JSR PC,TIMOUT ; TIME OUT APPROPRIATELY BIT #2,ALFR ; MAKE IT IN TIME? BNE TIMERR ; NO MOV ALAR,LALAR ; SAVE AR TST FLD5 ; SOFTWARE TOO? BNE SRCH1 ; YES RTS PC ; NO ; ALL SEACHES END UP HERE SRCH1: MOV R0,B3RR MOV #20,B3FR SRCH2: MOV BITTBL+30.,-(SP) ; SAVE OLD SOFTWARE LAST WORD BIS #100000,ESERVE LOW 8 BITS CLRB R2 ;PREPARE FOR PARITY BIT ADD R4,R2 ;PUT 0 OR 1 FOR PARITY SWAB R2 ;***NEW CRCC WITH PARITY AND INVERSIONS* DEC R1 ;ANY MORE DATA BYTES? BNE CRC100 ;YES MOV #753,R3 ;NO: PREPARE TO DO FINAL INVERSION JSR PC,EOR ;INVERT ALL FINAL BITS BUT #2 & 4 ;******* NOW PRINT THE COMPUTED CRCC IN BINARY***** MOV #9.w  :w  z T26- NO WRITE INT. !T26- NO READ INT. !|xjfw w   ?Nw w @w L  w :w . f w  R  @~ 7 v z x5v2 5@J -\   Ý 5@"EE w w w  w @Uww *w ~ w `ݷMMGuuBITTBL+30. ; FORCE LIKE HARDWARE FOR SRCH. JSR PC,SEARCH MOV (SP)+,BITTBL+30. JSR PC,SOFTCP ; COMPAR WITH SOFTWARE TABLE BNE HDER3 BIT #1,ALFR ; FIND AREA? BEQ SRCH3 ; YES BIT #1,B3FR BEQ HDER4 BR SRCH4 SRCH3: CMP ALAR,B3AR ; SAME AREA? BNE HDER5 SRCH4: RTS PC ; OK ; MSRCH = . BIC SMAS,R5 MOV #CRCBUF,R4 CRC130: MOVB #60,(R4)+ ;INIT PRINT BUFFER TO ALL ZEROS DEC R5 BNE CRC130 SWAB R2 ;PARITY FIRST ASRB R2 ADCB -(R4) SWAB R2 MOV #8.,R5 CRC150: ASRB R2 ADCB -(R4) DEC R5 BNE CRC150 JSR R5,ONCH ;PRINT THE NINE BITS .WORD CRCMSG .WORD CRBFLN RTS PC EOR: ;SU:CRC-LPC ERR; EXP ** *** ***, REC. ** *** *** !?w w  E <8U7(U *5w  5 w  ?hw 5w  5w  ׭ w z 5w lw $w ^w vUww r5w d7 w F w $RDY FOR EOT TEST !END- EOT TEST !FB\ @@B@w Nw BnEEw w ,8w  5Hw PLSE REMOVE WRITE RING, THEN RESTART !KINDLY INSERT W.R., THEN RESTART K,R0 ; MASK OUT BAD SEARCH ADRESSES MOV R0,ALRR MOV #60,ALFR ; START MIN SEARCH JSR PC,TIMOUT ; TIME OUT APPROPRIATELY BIT #2,ALFR ; MAKE IT IN TIME? BNE TIMERR ; NO MOV ALAR,LALAR TST FLD5 ; SOFTWARE TOO? BNE MSRCH1 ; YES RTS PC ; NO MSRCH1: MOV R0,B3RR MOV #60,B3FR BR SRCH2 ; TIBROUTINE TO EOR R3 INTO R2 MOV R3,R5 BIC R2,R5 BIC R3,R2 BIS R5,R2 RTS PC CRCMSG: .ASCII "CRCC = " CRCBUF: .BYTE 0,0,0,0,0,0,0,0,0 CRBFLN = .-CRCMSG .PAGE COMAND:.WORD 0 CURUNT:.WORD 0 EOFCOM:.WORD 4 ;END-OF-FILE BIT ERRPAT:.WORD 0 EXCOM: .WORD 0 NFILES:.WORD 0 NRECS: .WORD 0 OFFSET:.WORD 0 READAD: .WORD READBF ;CURRENT READ BUFFER BEGIN ADDR STAT: .WORD 0 UNITNO:.WOR ! x? t<XtEP l5w  U8 T5w h E w tw fU ?w fUww f5|w *?w (w ?w    `\w 56 w 5( 84 W  > ]5w |w rTIMER ERR XXXXXX !w x8E75w d 5w V 5w H Uw|5v5lw  5^w 5T 5Hw  5:w 5. 5&w  5w vrw w w MERR = . MOV #100000,R0 ; SET TIME OUT ERROR BIT BR ERROR ; HDER1: MOV #1,R0 BR HDERR HDER2: MOV #2,R0 BR HDERR HDER3: MOV #3,R0 BR HDERR HDER4: MOV #4,R0 BR HDERR HDER5: MOV #5,R0 HDERR: BIS #40000,R0 ERROR = . INC NERROR MOV FLD2,R5 JMP @ERR(R5) ERR = . .WORD ERR0 ; SINGLE CYCLED 0 WRITAD: .WORD WRITBF ;CURRENT WRITE BUFFER BEGIN XCOUNT:.WORD 0 XRECS: .WORD 0 CHRFG: .BYTE 0 EXSWCH:.BYTE 0 MCODE: .BYTE 0 MINTFG:.BYTE 0 PPOS: .BYTE 0 REQFLG:.BYTE 0 TTYTMP:.BYTE 0 WRTCTR:.BYTE 0 XFILES:.BYTE 0 $COLON:.BYTE 0 .END Uww 555 >8w 0w Fw 7 >w vw rw Vw Lw @w Lw XUwzw X5n 5@fw Hw w w8wFwXw^wlwwwwwwwww ww EUw߅w Uww w w Uw Uww w Uww 5@Uw w ~Uw tU ww tw `Uw~w \5r w *w @7 w *UwHw &w U w6w .ރ& w7 5-TRY AGAIN .WORD ERR0 ; LOOP BUT HALT ON ERROR, THEN RETRY. .WORD ERR2 ; IGNORE .WORD ERR1 ; LOOP RETRY FUNCTION WITHOUT HALTING .WORD ERR3 ; RESET SB/NOB IF ERROR .WORD ERR0 ; SAME AS 1 ERR0 = . TST (SP)+ ; POP OFF RETURN PC HALT JMP FCTN ; RETRY FUNCTION ERR1 = . TST (SP)+ ; POP OFF RETURN P7 5 zw 7. n5Ew ~w 7 zT **, S.E. STATUS !!Xw wFwwwwDwww&5Lw 7w @ TEST ** !&f5w 72w 7,w w w ERR: XX YY STATUS COMMND !7 VD@ @ @ @ @ Ew @@ Ew (@Ew 7 fE8e0 e0@`7  V S 7SA 7 U7 f` P E 6C JMP FCTN ; RETRY FUNCTION ERR2 = . RTS PC ; INGORE ERR3 = . MOV OSBNOB,SBNOB ; RESTORE SB/NOB FOR RETRY. RTS PC ; SOFTCP = . MOV #-32.,R5 SOFC1: MOV BITTBL+32.(R5),A MOV #-1.,B MOV A,C BIC B,C BIC A,B BIS C,B ; PERFORM EXCLUSIVE OR CMP B,ALLTBL+32.(R5) ; SAME AS HARDWARE 5W!UU̢ w nw fw h  7 @D.E.: O= ** *** *** I= ** *** *** !7 P 7 7 Dw w w 7 0A  Ԑ  V<w(w2w@wNwTw\wxwwww& fw & w f&L  E7  x% 7f \% w ^E ` @ 0 7 w 7 A@ !r7n7  ! w E BNE SOFC2 ADD #2,R5 BLT SOFC1 ; NOT DONE YET CLR R5 ; OK-SET C.C = 0 SOFC2: RTS PC ; ; ; NOTE: DELAY = 2 FOR 23 USEC-11/20 ; ; JSR PC,TIMOUT 7.0 ; MOV DELAY,R5 5.0 ; DEC R5 2.3 ; BNE .-2 2.6 OR 1.7 ; RTS PC 3.5 ; TOTALS 24.4 FOR DELAY = 2 ; TIMOUT = . MOV DELAY,R5 X: `&@ DEC R5 BNE X RTS PC ; ; ; SBNOB CONTAINS OLD NUMBER ON ENTRY ; NEW RANDOM NUMBER ON EXIT ; ; USES (2**9+3)RN AS ALGORITHM ; USES R0 AND R1 ; RANDOM = . MOV SBNOB,R0 BNE RAND01 INC R0 ; MAKE SURE DON'T START ON ZERO RAND01: MOV R0,R1 ADD R0,R0 ADD R1,R0 ; TIMES THREE ASL R1 ASL R1 ASL R1 ASL R1 ASL R1 ASL R1 ASL R1 ASL R1 ASL R1 ADD R1,R0 MOV R0,SBNOB ; NEW NUMBER RTS PC ; WRAP = . ; MOV R0,R1 ; R0 HAS THE SO/NOB ON ENTRY TSTB R1 ; NOB = 0 BNE WRAP2 ; NO CLR R0 ; YES - FORCE SB TO BE ZERO ALSO. RTS PC ; RETURN TO CALLER. WRAP2: CLR R2 ; CLEAR R2 FOR BISB BISB R1,R2 ; PUT NOB INTO R2 CLRB R1 ; CLEAR NOB IN R1 SWAB R1 ; PUT SB INTO LOW BYTE COM R1 ; GET NEG VALUE OF SB ADD #256.,R1 ; FIND OUT HOW MUCH ROOM LEFT. CMPB R1,R2 ; HAVE WE ASKED FOR TO MUCH. BHIS WRAP3 ; NO - GO HOME. CLRB R0 ; YES - RESET TO MAX AVAILABLE IN R0 BISB R1,R0 ; WRAP3: RTS PC ; ; SAVE = . ; SAVE OLD INFO MOV #PRESTR,R1 MOV #-32.,R5 MOV B3RR,(R1)+ MOV B3AR,(R1)+ MOV B3FR,(R1)+ MOV ALAR,(R1)+ MOV ALFR,(R1)+ SAV1: MOV ALLTBL+32.(R5),(R1)+ ADD #2,R5 BLT SAV1 RTS PC .END