IMD 1.16: 30/08/2008 22:04:34 84-96009-20 b023 s00920 wtc diagnostic /formatter source    @0{)vvЀЀsQpk)p " }fA __M@IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIICARTOSMB086022614170095860110113824 860110113824IS00920 VOLWTC DIAGNOSTIC/FORMATTER SOURCE DISKETTE 84-96009-20 B023   IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII_M@qGyy GGG`HX@ b G`^Y e GQ @@p@987 85P@ G:پN 8)0. * C'xC# b# }BK9 @0DAJL w+™ЀЀΖQA1"   i  ž} š} @EEFF)DEۄF8 џ} ԟ} ̟} * `jUBBI,v BI, # @ G7H@pܾrCHC C GTq` Lg gEXC P+s=胾P+c fQN p $Rxnj  ޔniZ ތ⊞ } }HGž Ÿ@ALS)"$ C k20j.h( +$`%ꂜ\1 !M' y %'+os慾)sY ed|{ @8 o O m J K i gN )V% t%sLn`"E F. F„ D>) =`;nrgy w"G,{Kq1 A&}E*`(t@% ;c  765y342(.OS:: SYSG @ @G6BDāCGDĀ# BC @E OB**************** TTESTF ENT JST MSGA WORD TTSTF COPY =:6001,A SELP A,4 JST MSGA WORD BOTMSG JST BOT JST ERCHCKT JST MSGA WORD WRDTBK CONTWR COPY =:7FFF,A COPY A,NDBK JST WRBLKS JST ERCHCKT CHECK FOR ERRORS COPY ERRCOUN,A GET ERROR COUNT CSK A,=1 CHECK FOR ERROR HOPEFULLY IT'S END OF MEDIA JMP CONTWR NO ERROR KEEP ON WRITING JMP TESTFND COPY ENDMFLG,A GET FLAG ADD =1,A JNE A,TESTFND JUMP IF NOT ZERO JST MSGA OUTPUT TEST PASSED WORD PASSF TESTFND JMP *TTESTF * LPOOL TITL TESTG-TEST G MEDIA TEST ****************************************************** * * TESTG-TEST G SUBROUTINE * THIS SUBROUTINE WILL DO: * WRITE 4K OF PREDEFINED PATTERN OF DATA ON THE TAPE * RETURN TO THE BEGINNING OF THE TAPE AND READ THE * DATA BACK TO CHECK THE INTEGRITY OF THE DATA * ************************************************************* * TTESTG ENT JST MSGA WORD TTSTG COPY =:7001,A SELP A,4 JST MSGA WORD BOTMSG JST BOT JST ERCHCKT * JST MSGA WORD WRDTBK COPY PATN,A * COPY A,WBUF INITIALIZE WRITE BUFFER DATA COPY =-4096,A SET UP WRITE BUFFER SIZE JST MOVE FILL WRITE BUFFER WITH PATTERN WORD WBUF WORD WBUF+1 FILL UNTIL DONE COPY =16,A COPY A,NDBK JST WRBLKS  JST ERCHCKT CHECK FOR ERRORS * JST MSGA WORD WRFMSG JST WRFM JST ERCHCKT CHECK FOR ERRORS * JST MSGA WORD BOTMSG JST BOT JST ERCHCKT CHECK FOR ERRORS * JST MSGA EXPECT READ FILE MARK SHORTLY WORD RDFMK1 THIS IS THE MESSAGE COPY =0,A CLEAR THE READ BUFFERS COPY A,RBUF INITIALIZE COPY =-4096,A SET COUNT JST MOVE WORD RBUF WORD RBUF+1 CLEAR UNTIL COUNT EXPIRES COPY =16,A COPY A,NDBK JST RDBLKS READ THE SAME EIGHT BLOCKS BACK JST ERCHCKT CHECK FOR ERRORS * COPY =4095,Q NOW CHECK THE DATA INTEGRITY COPY =RBUF,X COPY 0(X),A SUB PATN,A JNE A,WRRDER ADD =1,X JNED Q,$-4 JMP TTESTG2 GO DO PART TWO WRRDER JST MSGA SEND DATA MIS COMPARE MSG WORD MISCOMP JMP DEBUG4 LPOOL * * **************************************************** * * TEST G PART TWO CHECK DATA INTEGRITY BY * WRITING 16 SECTORS (512 BYTES EACH) TO THE * DISK STARTING AT SECTOR 0,0,8 USING THE SPECIFIED * DATA PATTERN. A BACKUP OPERATION IS THEN PERFORMED * A NEW DATA PATTERN IS THEN WRITTEN TO THE DISK (ALL ZEROS) * A RESTORE OPERATION IS THE EXECUTED TO REPLACE THE ORIGINAL * PATTERN. ONCE COMPLETED A DISK READ IS PERFORMED AT 0,0,8 * OF LENGTH 16 SECTORS AND THE DATA IS VERIFIED ON A WORD-BY * WORD BASIS IF GOOD STATUS IS RETURNED * * THIS TEST WILL NOT EXECUTE IF NON-DESTRUCTIVE MODE IS SELECTED * * * ************************************************************ * * TTESTG2 EQU $ COPY CAR,A GET RUN OPTIONS TBIT 6,A IS IT NON-DEST? JF OV,$+2 IF NO JMP *TTESTG IF YES EXIT COPY =DIOB,A GET CIOB ADDRESS JST CIOB CLEAR CIOB COPY =DIOB,A GET CIOB ADDRES COPY A,X FOR INDEX COPY =WRTSTG2,A INT AZDDRESS COPY A,IN(X) INTO CIOB COPY PATN,A DATA PATTERN * * G2WRITE EQU $ COPY A,WBUF INITIALIZE BUFFER COPY =-4096,A 16 SECTORS WORTH JST MOVE DO IT WORD WBUF START ADDRESS WORD WBUF+1 TO ADDRESS * COPY =DIOB,X FOR INDEX COPY =WBUF,A INTO CIOB COPY A,MA(X) BUFF ADDRRESS * COPY =WRTDAT,A OPCODE COPY A,OP(X) INTO CIOB * COPY =0,A COPY A,US(X) UNIT SELECT * COPY =8,A SECTOR COPY A,SSS(X) INTO CIOB * COPY =4096,A BLOCK COUNT COPY A,WC(X) INTO CIOB * G2SENDIT EQU $ COPY =DIOB,A SBIT 8,S TURN ON INTERRUPTS JST OTA SEND IT * JMP $ WAIT FOR INTERRUPT * LPOOL * * WRTSTG2 EQU $ JST $+1 NOP INTERRUPT LOCATION JST RETSTAT DO STATUS CHECK JMP $+2 GOOD CONTINUE JMP *TTESTG BAD EXIT * * BKPTIN EQU $ BACKUP ROUTINE JST MSGA WORD BOTMSG JST BOT GO DO BEG OF TAPE JST ERCHCKT STATUS CHECK * JST CIOB CLEA IT COPY =BACKUP,A get opcode COPY =DIOB,X INDEX CIOB COPY A,OP(X) INTO CIOB COPY =0,A COPY A,US(X) UNIT 0 * COPY =8,A START AT 0,0,8 COPY A,SSS(X) INTO CIOB * COPY =16,A BLOCK LENGTH 165 SECTORS COPY A,WC(X) INTO CIOB * COPY =G2BKINT,A INTERRUPT ADDRESS COPY A,IN(X) JMP G2SENDIT GO SEND IT * * G2BKINT EQU $ JST $+1 NOP JST ERCHCKT GO CHECK FOR ERRORS * JST MSGA WORD WRFMSG JST WRFM   GO WRITE FILE MARK JST ERCHCKT GO CHECK FOR ERRORS * * * NOW ERASE THE DATA ON THE DISK * JST CIOB COPY =G2WRT2,A  INTERRUPT ADDRESS COPY =DIOB,X COPY A,IN(X) INTO CIOB] COPY =0,A NEW DATA PATTERN (ERASE) JMP G2WRITE  GO TO WRITE ROUTINE * * G2WRT2 EQU $ JST $+1 NOP JST RETSTAT GO DO STATUS CHECK JMP $+2 GOOD JMP *TTESTG BAD * * * NOW WE HAVE TO RESTORE THE DATA AND CHECK IT * * G2RESTR EQU $ JST MSGA WORD BOTMSG JST BOT GO DO BEG OF TAPE JST ERCHCKT STATUS CHECK * JST MSGA WE EXPECT FILE MARK SOON WORD RDFMK1 JUST ONE JST CIOB COPY =RESTOR,A GET OPCODE COPY =DIOB,X COPY A,OP(X) INTO CIOB * COPY =0,A COPY A,US(X) * COPY =8,A START AT 0,0,8 COPY A,SSS(X) * COPY =16,A FOR 16 SECTORS COPY A,WC(X) * COPY =G2RDINT,A INTERRUPT ADDRESS COPY A,IN(X) * JMP G2SENDIT GO DO IT * G2RDINT EQU $ JST $+1 NOP JST ERCHCKT GO CHECK FOR ERRORS * * * NOW CLEAR THE READ BUFFERS AND READ IN THE DATA * * G2READIT EQU $ JST CIOB COPY =RDDAT,A OPCODE COPY =DIOB,X COPY A,OP(X) * COPY =0,A COPY A,US(X) * COPY =8,A START AT 0,0,8 COPY A,SSS(X) * COPY =4096,A BLOCK COUNT COPY A,WC(X) * COPY =RBUF,A  BUFFER ADDRESS COPY A,MA(X) * COPY =G2R2INT,A INTERRUPT ADDRESS COPY A,IN(X) * JMP G2SENDIT GO DO IT * * G2R2INT EQU $ JST $+1 NOP JST RETSTAT MAKE SURE NO ERRORS JMP $+2 NONE JMP *TTESTG ERRORS EXIT * * * NOW DO THE HARD TEST WORD-BY WORD COMPARE * COPY =4095,Q 0 TO 4095 =8KBYTES COPY =RBUF,X COPY 0(X),A GET DATA INTO A REGISTER SUB PATN,A COMPARE TO SELECTED PATTERN JNE A,RDWRER READ/WRITE ERROR ADD =1,A DO NEXT  JNED Q,$-4 DECREMENT Q IF NOT ZERO DO THE NEXT * JMP *TTESTG ALL DONE NO ERRORS !!!!!!! * * RDWRER EQU $  READ WRITE ERRORS DETECTED JST MSGA WORD MISCOMP JMP DEBUG TEMP FATAL ERROR * * LPOOL TITL TAPE TECH TEST ****************************************************** * * TAPE TECH TEST * * THE TECH TEST WILL ISSUE THE SELECTED COMMAND OVER & OVER * SO THAT A SCOPE MAY BE USED TO LOOK AT THE BOARD. THE ERROR * CHECKING THAT'S IS TO LOOK FOR END-OF-MEDIA OCCURING DURING * THE READ & WRITE COMMANDS. * THE COMMANDS THAT ARE IMPLEMENTED ARE BOT, READ STATUS, WRITE & * READ. * ***************************************************** * TTECH EQU $ JST SENRDY MAKE SURE THE CONTROLLER IS READY TO GO JMP TTECH1 IT'S OK JST MSGA "ERROR * - UNIT NOT READY" WORD UNRDY TTECH1 EQU $ JST MSGA "ENTER TAPE TECH FUNCTION (1/[2]/3/4), INTS ([Y]/N)" WORD TPTMSG JST IHEX GET THE FUNCTION CODE JNE X,TTECH2 JUMP IF THEY DIDNT DEFAULT SUB =CR:,A JEQ  A,TTECH4 THEY DEFAULTED JMP TTECH1 INVALID TTECH2 EQU $ CSK X,=4 CSK X,=1 JMP TTECH1 INVALID NOP CLSN A,=CR: JMP TTECH3 JMP TTECH1 TTECH3 EQU $ ADD =OPC,X ADD ADDR OF TABLE TO OFFSET SUB =1,X ADJUST IT TO POINT TO CORRECT ENTRY IN OPCODE TABLE COPY 0(X),A GETTHE ACTUAL FUNCTION CODE COPY A,TFC PUT IT IN THE CIOB COPY A,SAVETFC SAVE IT FOR LATER TTECH4 EQU $ JST MSGA "TAPE TECH TEST RUNNING ..." WORD TPTMSG2 TTECH5 EQU $ SBIT 8,S WE NEED  INTERRUPTS SBIT 4,S ENABLE CONSOLE INTERRUPT COPY =TPCIOB,A JST OTA START THE COMMAND TTECH6 EQU $ COPY =0,A WAIT HERE FOR INT TO HAPPEN ADD =1,A JNE A,$-1 JT SS,TTECH8 JUMP IF THEY IT CONSOLE INT JMP TTECH6 ELSE, KEEP WAITING TTECH8 EQU $ COPY =0,A RESET THE CONSOLE AND START OVER ADD =1,A JNE A,$-1 OUT A,0 COPY A,TCOUNT RESET THE COUNT FOR THE CDR JMP TTECH1 TTECH9 EQU $ JST $+1 INT LOCATION NOP COPY TSTAT,A TBIT 3,A JF OV,TTECH10 JUMP IF WE STILL HAVEN'T HIT END OF MEDIA JST MSGA "ISSUING BEGINNING OF TAPE COMMAND" WORD BOTMSG COPY TFC,A SAVE THE ORIGINAL OPCODE COPY A,SAVETFC " COPY OPC,A GET THE BOT OPCODE COPY A,TFC JST MSGA "TAPE TECH TEST RUNNING...." WORD TPTMSG2 JMP TTECH5 DO SOME MORE TTECH10 EQU $ COPY SAVETFC,A GET THE ORIGINAL OPCODE COPY A,TFC COPY TCOUNT,A ADD =1,A COPY A,TCOUNT SELP A,4 JT SS,TTECH8 JMP TTECH5 LPOOL * SAVETFC WORD :C00E DEFAULT IS READ STATUS TCOUNT WORD 0 * OPC EQU $ WORD :210E BOT WORD :C00E READ STATUS WORD :400E WRITE WORD :800E READ * TPCIOB EQU $ TFC WORD :C00E OPCODE RES 4,0 RESERVED TCNT WORD :A0 BLOCK COUNT TBUF WORD :6000 BUFFER TINT WORD TTECH9 INT LOC  RES 2,0 RESERVED TCS WORD 0 CONTROLLER STATUS WORD 0 RESERVED TSTAT WORD 0 TAPE STAUS WORD 0 DATA ERROR COUNTER WORD 0 TAPE UNDERRUN COUNTER TITL DAREAD-READ DATA BLOCK SUBROUTINE ****************************************************** * * DAREAD - READ DATA BLOCKS SUBROUTINE * * THIS SUB WILL READ DATA BLOCKS ACCORDING * TO NDBK (# DATA BLK) SPECIFIED * * AT PRESENT IT CAN NOT BE OVER 6K TEMPORARY ! * ********************************************************** * RDBLKS ENT COPY =UCUR,Y COPY =DIOB,X * SET UP THE IO BLOCK JST CIOB COPY =DIOB,X COPY =TREAD,A SHIFT A,LO,8 OR =TAPEONLY,A COPY A,OP(X) STORE IT IN DIOB COPY =RBUF,A READ BUFFER ADDRESS COPY A,MA(X) STORE IT COPY =ENDRDBLK,A INTERRUPT RETURN ADDRESS COPY A,IN(X) COPY NDBK,A COPY A,WC(X) SBIT 8,S ENABLE THE INTERRUPT COPY =DIOB,A JST OTA SEND THE ADDRESS OF IOB JMP $ WAIT LPOOL ENDRDBLK EQU $ RETURN TO HERE JST $+1 NOP JMP *RDBLKS LPOOL TITL WRBLKS-WRITE DATA BLOCKS ROUTINE ***************************************************** * * WRBLKS - WRITE DATA BLOCKS (512 BYTES/BLOCK) ONTO * THE STREAMING TAPE ACCORDING TO NDBK * CALLS: AIOBMOD CALLED BY: TESTD *  MAIO TESTF * RDSTR TESTG * WRITER * ****************************************************** * WRBLKS ENT COPY =UCUR,Y COPY =DIOB,X * SET UP THE IO BLOCK JST CIOB CLEAR THE IOBLOCK COPY =DIOB,X COPY =TWRITE,A OPCODE FOR TAPE WRITE OPERATION SHIFT A,LO,8 COPY =TAPEONLY,Q OR Q,A COPY A,OP(X) OPERATION CODE  COPY =WBUF,A GET THE WRITE BUFFER ADDRESS COPY A,MA(X) SAVE IT COPY =ENDWRBLK,A INTERRUPT RETURN ADDRESS COPY A,IN(X) SAVE IT COPY NDBK,A COPY A,WC(X) NO OF BLOCK COUNT IN THIS CASE SBIT 8,S ENABLE INTERRUPT COPY =DIOB,A JST OTA SEND THE STARTING ADDRESS OF CIOB JMP $ WAIT ENDWRBLK EQU $ RETURN HERE FROM INTERRUPT JST $+1 NOP JMP *WRBLKS * LPOOL TITL EET-ERASE ENTIRE  TAPE ROUTINE ******************************** * * EET - ERASE ENTIRE TAPE * * THIS ROUTINE ERASE THE ENTIRE CARTRIDGE * ************************************************************** * ERASET ENT COPY =ENDERASE,A SET INTERRUPT RETURN ADDRESS  COPY A,IN(X) RETURN ADDRESS COPY =TERASE,A THE COMAND FOR THE ERASE TAPE SHIFT A,LO,8 TRANSFER IT TO HIGHER BYTE OR =TAPEONLY,A COPY A,OP(X) COPY =:110,A ENABLE ALL INTERRUPTS COPY A,S COPY =-14,A JST MOVE SAVE SIOB WORD DIOB WORD SIOB COPY =DIOB,A SEND THE COMMAND JST OTA JMP $ WAIT UNTILL INTERRUPTED ENDERASE EQU $ JST $+1 INTERRUPT ENTRY POINT NOP JMP *ERASET LPOOL TITL EOB-END OF BLOCK ROUTINE ******************************** * * EOB - END OF BLOCK * ******************************** * EOB ENT END OF BLOCK ROUTINE JMP *EOB EXIT EOBFLAG WORD 0 EOB FLAG CELL LPOOL LPOOL TITL FILLBUF SUBROUTINE *********************************** * * FILLBUF - THIS SUBROUTINE FILL UP * THE WRITE BUFFER (BUFFERW) * WITH THE CONTENT OF THE A * REGISTER. * * * CALLING SEQUENCE: COPY =DATA PATTERN,A * JST FILLBUF * * * CALLS: NONE CALLED BY: QURY40 * * ************************************* * FILLBUF ENT COPY X,FIBX SAVE X-REG COPY Q,FIBQ SAVE Q-REG COPY =TMPBUF,X INDEX WRITE BUFFER COPY =256,Q GET BUFFER LENGTH COUNT COPY A,0(X) STORE WORD ADD =1,X BUMP BUFFER POINTER JNED Q,$-2 LOOP BACK FOR MORE COPY FIBX,X RESTORE X-REG COPY FIBQ,Q RESTORE Q-REG JMP *FILLBUF EXIT, RETURN TO CALLER FIBQ WORD 0 Q-SAVE CELL FIBX WORD 0 X-SAVE CELL * LPOOL TITL FMR-READ FILE MARK ROUTINE ******************************** * * FMR - READ FILE MARK * ******************************** * RDFM1 ENT READ FILE MARK ROUTINE * * COPY =UCUR,Y COPY =DIOB,X * SET UP THE IO BLOCK JST CIOB COPY =DIOB,X COPY =TRDFM,A SHIFT A,LO,8 COPY =TAPEONLY,Q OR Q,A THE TAPE READ FILE MARK TAPE FUNCTION CODE IN A COPY A,OP(X) STORE IT IN DIOB COPY =ENDRDFM,A INTERRUPT RETURN ADDRESS COPY A,IN(X) SBIT 8,S ENABLE THE INTERRUPT COPY =DIOB,A JST OTA SEND THE ADDRESS OF IOB JMP $ WAIT ENDRDFM EQU $ RETURN TO HERE JST $+1 NOP JMP *RDFM1 FINISHED RETURN LPOOL TITL FMW-WRITE FILE MARK ROUTINE ******************************** * * WRFM - WRITE FILE MARK * ******************************** * WRFM ENT WRITE FILE MARK ROUTINE COPY =UCUR,Y COPY =DIOB,X * SET UP THE IO BLOCK JST CIOB CLEAR THE IOBLOCK COPY =DIOB,X COPY =TWRFM,A OPCODE FOR TAPE RTFM OPERATION SHIFT A,LO,8 COPY =TAPEONLY,Q  OR Q,A COPY A,OP(X) OPERATION CODE COPY =ENDWRFM,A INTERRUPT RETURN ADDRESS COPY A,IN(X) SAVE IT SBIT 8,S ENABLE INTERRUPT  COPY =DIOB,A JST OTA SEND THE STARTING ADDRESS OF CIOB JMP $ WAIT ENDWRFM EQU $ RETURN HERE FROM INTERRUPT JST $+1 NOP JMP *WRFM LPOOL * * TITL SELECT TAPE- SELECTION THE PROPER TAPE DRIVE ************************************************************* * * SUBROUTINE SELECTTP TO SELECT THE TAPE DRIVE REQUESTED DURING * QUARYS ************************************************************** * SELECTTP ENT *SET UP IO BLOCK COPY =UCUR,Y INDEX UNIT # TABLE JST CIOB CLEAR IOB COPY =DIOB,X INDEX IOB  COPY 0(Y),A GET CURRENT UNIT # SUB =:FFFF,A IS IT END OF THE TABLE JNE A,$+2 NO JMP *SELECTTP PREMATUR RETURN COPY 0(Y),A R ESTORE UNIT # COPY A,UNIT SAVE IT JNE A,NOTDRV1 IF UNIT IS NOT ZERO SOIT IS NOT DRIVE 1 COPY =01,A COPY A,UNIT IT IS DRIVE ONE TO BE SELECTED JMP ENDTRANS GO TO END OF TRANSLATION TABLE NOTDRV1 SUB =01,A JNE A,NOTDRV2 COPY =02,A COPY A,UNIT JMP ENDTRANS NOTDRV2 COPY UNIT,A SUB =02,A JNE A,NOTDRV3 COPY =04,A COPY A,UNIT JMP ENDTRANS NOTDRV3 COPY UNIT,A COPY =08,A COPY A,UNIT ENDTRANS EQU $ SHIFT A,LO,8 LINE UP FOR PROPER DRIV SELECT COPY =TAPEONLY,Q GET THE OPCODE OR Q,A SELECT THE DRIVE COPY A,OP(X) COPY =SELECDON,A COPY A,IN(X) INTERRUPT RETURN ADDRESS *INITLIZATION COPY =:110,A ENABLE ALL INTERRUPT COPY A,S COPY =-14,A JST MOVE WORD DIOB WORD SIOB COPY =DIOB,A GET IOB ADDRESS JST OTA SEND IT COPY =0,A COPY A,TC1 COPY =-499,A COPY A,TC2 JST TIME TIME IT FOR NINETY NINE SECONDS JMP $-1 JST MSGA WORD NOEOB JMP PSU+24 SELECDON EQU $ JST $+1 NOP JMP *SELECTTP LPOOL TITL INITTAPE-INITIALIZATION ROUTINE ******************************** * * INITTAPE - INITIALIZATION * SUBROUTINE TO INITILIZE THE SELCTED DRIVE, WHICH ALSO POSITION THE * THE TAPE TO BEGINNING OF THE TAPE (REWIND) * ******************************************************************** * INITTAPE ENT COPY =ENDINIT,A SET INTERRUPT RETURN ADDRESS COPY A,IN(X) RETURN ADDRESS COPY =TINITIL,A THE COMAND FOR THE RETENSION BOT, EOT, BOT SHIFT A,LO,8 TRANSFER IT TO HIGHER BYTE COPY =TAPEONLY,Q OR Q,A COMBIE THE TWO COMMANDS COPY A,OP(X) COPY =:110,A ENABLE ALL INTERRUPTS COPY A,S COPY =-14,A JST MOVE SAVE SIOB WORD DIOB WORD SIOB COPY =DIOB,A SEND THE COMMAND JST OTA JMP $ WAIT UNTILL INTERRUPTED ENDINIT EQU $ JST $+1 INTERRUPT ENTRY POINT NOP JMP *INITTAPE LPOOL ************************************************************************* * SUBROUTINE TO POSITION THE TAPE TO BOT * BOT ENT COPY =DIOB,X SET UP CIOB INDEX COPY =ENDBOT,A SET INTERRUPT COPY A,IN(X) COPY =POSBOOT,A OP CODE FOR BOT OPERATION SHIFT A,LO,8 TRANSFER IT TO THE HIGHER BYTE COPY =TAPEONLY,Q OR Q,A COMBINE TWO BYTE COPY A,OP(X) COPY =:110,A ENABLE ALL INTERRUPTS COPY A,S COPY =-14,A JST MOVE WORD DIOB WORD SIOB COPY =DIOB,A SEND THE COMMAND JST OTA JMP $ WAIT FOR INTERRUPT ENDBOT EQU $ JST $+1 INTERRPT ENTRY ROUTINE NOP JMP *BOT RETURN * LPOOL TITL SUBROUTINE TO CHECK FOR ERRORS ************************************************************** * * * ERCHCKT - CHECKS FOR ALL ERRORS FROM THE RETURNED * TAPE STATUS * * * * **************************************************************** ERCHCKT ENT ERROR CHECK START COPY TEMP7,X GET TEST WE ARE DOING COPY 0(X),A " CLSN A,='B' CHECK DISK STATUS ON TAPE-TEST B ONLY (A901) JMP ERR1 JMP ERR2 ERR1 EQU $ COPY =DIOB,X INDEX ON THE DIOB JST RETSTAT GO CHECK DISK STATUS NOP GOOD DISK STATUS RETURNED NOP BAD STATUS * * NOW CHECK THE TAPE STATUS * ERR2 EQU $ COPY =DIOB,X TAKE NO CHANCES COPY TST1(X),A GET THE STATUS COPY A,Q SAVE IN Q ERRMAC NODR CHECK FOR NO DRIVE ERRMAC NOCA  CHECK FOR NO CARTRIDGE ERRMAC WRPR CHECK FOR WRITE PROTECTED ERRMAC ENDM CHECK FOR END OF MEDIA ERRMAC RWAB CHECK FOR READ WRITE ABORT ERRMAC REBA CHECK FOR READ ERROR - BAD BLOCK XFER ERRMAC REFI CHECK FOR READ ERROR - BAD FILLER  XFER ERRMAC RENO CHECK FOR READ ERROR - NO DATA ERRMAC REND CHECK FOR READ ERROR - NO DATA AND END OF MEDIA ERRMAC RDFM CHECK FOR READ FILE MARK ERRMAC ILLC CHECK FOR ILLEGAL COMMAND ERRMAC POWE CHECK FOR POWER ON/RESET ERRMAC MARG CHECK FOR MARGINAL BLOCK DETECTION JST MSGA OTUPUT STATUS WORD MESSAGE WORD STWD COPY Q,A REPLACE STATUS JST OHEX SEND IT JST CRLF COPY ERRCOUN,A GET ERROR FLAG JNE A,ERCHCKND JUMP IF NOT ZERO ERCHCKND JMP *ERCHCKT RETURN ALL FINISHED LPOOL * * TITL 'CHRIN' SUBROUTINE ****************************** * * CHRIN - CHECK TERMINATOR * * THIS SUBROUTINE WILL CHECK THE * TERMINATOR CHARACTER FOR INPUT THROUGH * THE 'IHEX' OR 'IDEC' SUBROUTINE IS ONE *  OF THE FOLLOWING: * * CARRIAGE RETURN - RETURN TO STANDARD RETURN ADDRESS * POUND SIGN (#)  - RETURN TO RETURN ADDRESS + 1 * BACK ARROW - RETURN TO RETURN ADDRESS + 2 * UP ARROW  - RETURN TO RETURN ADDRESS + 3 * COMMA (,) - RETURN TO RETURN ADDRESS + 4 * ANYTHING ELSE  - RETURN TO RETURN ADDRESS + 5 * * CALLING SEQUENCE: * JST CHRIN * JMP ? CARRIAGE RETURN R * JMP ? POUND SIGN R+1 * JMP ? BACK ARROW R+2 * JMP ? UP ARROW  R+3 * JMP ? COMMA R+4 * JMP ? ANYTHING ELSE R+5 * * CALLS:  CALLED BY: * NONE QUERIES * ****************************** * CHRIN ENT TERMINATOR CHECK ROUTINE COPY IDCTM2,A GET TTY INPUT CHAR CLSN =CR:,A IS IT C/R JMP *CHRIN YES IMS CHRIN CLSN ='#',A IS IT '#' JMP *CHRIN YES IMS CHRIN CLSN =BCKAR:,A IS IT BACK ARROW JMP *CHRIN YES IMS CHRIN CLSN =UPARR:,A IS IT UP ARROW JMP *CHRIN YES IMS CHRIN CLSN =',',A IS IT COMMA JMP *CHRIN YES IMS CHRIN ITS SOMETHING ELSE JMP *CHRIN * LPOOL TITL CIOB-CLEAR I/O BLACK *********************************** * * CIOB - CLEAR I/O BLOCK * *  THIS ROUTINE CLEAR ALL 15 WORDS OF THE I/O BLOCK * * CALLING SEQUENCE: JST CIOB * * * CALLS:  CALLED BY: * NONE TESTA * * ********************************** * CIOB ENT CLEAR I/O BLOCK ENTRY POINT COPY A,CIOB1 SAVE A-REG COPY Q,CIOB2 SAVE Q-REG COPY X,CIOB3 SAVE X-REG COPY =14,Q GET COUNTER COPY =DIOB,X INDEX IOB COPY =0,A CLEAR A REG XNX Q COPY A,0(X) CLEAR IOB JNED Q,$-2 LOOP BACK UNTIL ALL DONE COPY CIOB1,A RESTORE A-REG COPY CIOB2,Q RESTORE Q-REG COPY CIOB3,X RESTORE X-REG JMP *CIOB EXIT CIOB1 WORD 0 A-REG CELL CIOB2 WORD 0 Q-REG CELL CIOB3 WORD 0 X-REG CELL * LPOOL * BUFLNG WORD 0 BUFFER LENGHT LESS ONE CELL * LPOOL TITL 'CRLF' SUBROUTINE ****************************** * * CRLF - OUTPUT CR/LF * * THIS SUBROUTINE WILL OUTPUT * AN ASCII CARRIAGE RETURN FOLLOWED * BY AN ASCII LINE FEED TO THE * CRT/TTY. * * CALLING SEQUENCE: * JST CRLF * * CALLS: CALLED BY: *  OTTY DUMP * TSTITL * ****************************** * CRLF ENT COPY   =CR:,A OUTPUT CR JST OTTY COPY =LF:,A OUTPUT LF JST OTTY JMP *CRLF * LPOOL TITL DECHEX - SUBROUTINE CONVERT DECIMAL TO HEX ************************************ * * * DECHEX - THIS SUBROUTINE CONVERT DECIMAL * TO HEXADECIMAL * * * CALLING SEQUENCE: COPY DECIMAL,A * JST DECHEX * * NOTE: UPON RETURN, A-REG CONTENT THE DESIRE * HEXADECIMAL NUMBER. THE ORIGINAL DECIMAL * NUMBER IS DESTROYED. * * * CALLS: CALLED BY: * NONE MFRBTFT * * ************************************ * DECHEX EQU $ ENT COPY Y,CKY STORE Y-REG COPY Q,CKQ STORE Q-REG COPY A,VALDEC SAVE ORIGINAL DECIMAL NUMBER COPY =-3,A COPY A,CNT INITIALIZATE COUNT COPY VALDEC,A GET DEC VALUE AND =:F,A MASK DON'T CARE BITS COPY A,VALHEX SAVE IN HEX COPY VALTAB,Y GET TABLE DHLOOP EQU $ COPY VALDEC,A GET DEC NUMBER ROTATE A,RO,4 TOSS IT COPY A,VALDEC AND SAVE AND =:F,A MASK OUT DON'T CARE BITS JEQ A,DHLOOP1 IF ZERO, GET NEXT DIGIT COPY VALHEX,Q GET HEX VALUE ADD 0(Y),Q ADD TO IT COPY Q,VALHEX AND SAVE SUB =1,A DECREMENT VALUE JEQ A,DHLOOP1 IF ZERO GET NEXT DIGIT JMP $-5 ELSE, CONTINUE TO ADD DHLOOP1 EQU $  IMS CNT BUMP COUNT JMP $+2 IF NOT EXPIRE GO ON JMP $+3 ELSE, EXIT ADD =1,Y BUMP TABLE POINTER JMP DHLOOP AND GO BACK COPY VALHEX,A GET HEX IN A-REG JMP *DECHEX AND EXIT * CNT WORD 0 COUNTER VALDEC WORD 0 DECMIAL CELL VALHEX WORD 0 HEX CELL VALTAB WORD $+1,10,100,1000 * LPOOL TITL DUMP SUBROUTINE ***************************************** * * DUMP-THIS SUBROUTINE WILL DUMP * MEMORY TO CRT/TTY WITH 8 * WORDS PER LINE. * * CALLING SEQUENCE: * COPY =-WORD COUNT,A *  COPY =BUFF ADR, X * JST DUMP * * CALLS: MSGA CALLED BY: ERROR * OHEX * CRLF *  OTTY * SPACE * ***************************************** * DUMP ENT COPY A,DUMPLN SAVE LENGTH COPY X,DUMPAD AND ADDRESS DUMP1 JST CRLF JST SPACE PRINT 3 SPACES COPY =-8,A 8 WORDS PER LINE COPY A,DUMPCT DUMP2 COPY *DUMPAD,A GET A WORD JST OHEX PRINT IT IMS DUMPAD BUMP POINTER COPY =' ',A PRINT SPACE JST OTTY IMS DUMPLN BUMP COUNT JMP $+2 JMP *DUMP EXIT IF DONE IMS DUMPCT BUMP WDS PER LINE COUNT JMP DUMP2 PRINT NEXT WORD JMP DUMP1 PRINT NEXT LINE * DUMPAD WORD 0 BUFFER PTR DUMPLN WORD 0 TOTAL COUNT DUMPCT WORD 0 WDS PER LINE COUNT * LPOOL TITL ERRCK -CHECK MANUF BAD TK TO SUSPRESS ERR ROUTINE ****************************************************** * * ERRCK -THIS ROUTINE WILL CHECK MANUFACTURER BAD TRACK * TABLE WHEN ERROR OCCURS. IF THE BAD TRACK COMPARED * WITH THE TABLE, ERROR REPORT WILL BE SUSPRESSED * * CALLING SEQUENCE: JST ERRCK * R+1 MACTHED RETURN (NO ERR REPORT) * R+2 UNMACHED RETURN (ERR REPORT) * * CALLS: CALLED BY: * ERROR * FORMAT * ****************************************************** * ERRCK ENT COPY DIOB,A GET OPCODE AND =:F,A CLSN A,=:1 FORMATTER? JMP $+4 CLSN A,=:B DIRECT READ? JMP $+2 JMP ERRCK1 COPY SECTOR,A COPY A,ERTSC COPY CYL,A GET CYLINDER # COPY HEAD,Q GET HEAD # JMP ERRCK2 ERRCK1 EQU  $ COPY DIOB+SSS,A COPY A,ERTSC COPY DIOB+CS,A GET CYLINDER # COPY DIOB+HS,Q GET HEAD # ERRCK2 EQU $ COPY A,ERTCY COPY Q,ERTHD SHIFT A,LO,4 PUT IN UPPER 3 NIBBLES OR A,Q FORM CYL/HD PAIR COPY =BADBUF2,Y INDEX BAD TRACK BUFFER ERRCKLP EQU $ COPY 0(Y),A GET MFR'S BAD TRACK SUB =-1,A IS IT END OF TABLE JEQ A,ERRCKEND YES, EXIT COPY 0(Y),A NO, RESTORE BAD TRACK SUB Q,A SAME AS ERROR TRACK? JEQ A,ERRCKEX YES, GO TO ERRCKEX ADD =1,Y NO, BUMP BAD TRACK TABLE JMP ERRCKLP LOOP BACK FOR MORE ERRCKEX EQU $ JMP *ERRCK EXIT ERRCKEND IMS ERRCK BUMP RETURN ADDR JMP *ERRCK EXIT * ERTCY WORD 0 PHYSICAL CYLINDER ERTHD WORD 0 HEAD AND ERTSC WORD 0 SECTOR TITL EROTAL -ERROR TALLIES SUBROUTINE ***************************************************** * * EROTAL -ERROR TALLY SUBROUTINE * THIS SUBROUTINE WILL PRINT ERROR TALLY * AT THE END OF EACH TEST IF OPTION IS ON. * * TALLY -ERRORS IN THIS TEST: NNNN * * CALLS: NONE CALLED BY: ALL TESTS EXCEPT TECH TEST * ******************************************************* * EROTAL ENT COPY CAR,Q GET RUN OPTION TBIT 2,Q IS ERR TALLY BIT ON? JF OV,EROTND NO, EXIT ADD =EROTAB,A ADD IN THE START ADDRESS COPY X,ERRTEMP SAVE X IN TEMP LOCATION COPY A,X JST MSGA OUTPUT WORD EROTMSG COPY 0(X),A GET THE ERROR CELL COPY A,Q JST ODEC PRINT IT ADD EROTOL,Q ADD IN THE TOTAL ERRORS JST MSGA OUTPUT MESSAGE WORD TOTLERR TOTAL ERRORS ALL TESTS COPY Q,A JST ODEC OUTPUT A JST CRLF PRINT A LINE COPY Q,EROTOL SAVE THE TOTAL COPY ERRTEMP,X RESTORE X EROTND JMP *EROTAL EXIT * EROTT WORD 0 OFFSET CELL EROTAB EQU $ COUNT TABLE ERORA WORD 0 ERR CNT TEST A ERORB WORD 0 ... ERORC WORD 0 ERORD WORD 0 ERORE WORD 0 ERORF WORD 0 ERFORM WORD 0 EROTOL WORD 0 TOTAL ERR CNT FOR ALL TESTS ERRTEMP WORD 0 TEMP LOCATION * LPOOL TITL 'FILINC' SUBROUTINE ***************************************************** * * FILINC - FILL I/O BUFFER * * THIS SUBROUTINE WILL SPREAD AN INCREMENTING * PATTERN INTO THE 520 WORD BUFFER. * *  ENTER WITH THE STARTING VALUE IN THE A-REG * * CALLING SEQUENCE: * COPY =STARTING VALUE,A * COPY =INCREASE VALUE,X * JST FILINC * * CALLS: CALLED BY: * NONE TECH TEST * * **************************************************** * FILINC ENT COPY X,FILNCX SAVE X-REG COPY TTBUF,X PTR TO BUFFER COPY A,0(X) STORE FIRST VALUE COPY =-519,A SET COUNT COPY A,FILNCT FILNC1 COPY 0(X),A SPREAD TO NEXT WORD ADD FILNCX,A BUMP IT COPY A,1(X) ADD =1,X BUMP POINTER IMS FILNCT AND COUNT JMP FILNC1 CONTINUE COPY FILNCX,X RESTROE X-REG JMP *FILINC RETURN * FILNCT WORD 0 COUNT FILNCX WORD 0 X-REG SAVER TITL 'IDEC' SUBROUTINE ****************************** * * IDEC - INPUT DECIMAL NUMBER * * THIS SUBROUTINE WILL INPUT, FROM * THE CRT/TTY, AN ASCII-DECIMAL VALUE * WHICH IT WILL CONVERT TO BINARY AND * RETURN IT IN THE X REGISTER. * * THIS SUBROUTINE IS EXITED UPON INPUT OF * THE FIRST NON ASCII-DECIMAL CHARACTER, WHICH * IT WILL RETURN IN THE A REGISTER. * * DURING THIS SUBROUTINE, A QUESTION MARK IS *  OUTPUT IF THE INPUT VALUE BECOMES GREATER * THAN 32768 AND RESTARTS THE INPUT. * * CALLING SEQUENCE: * JS  T IDEC * * CALLS: CALLED BY: * IKB QUERIES * OTTY * ****************************** * IDEC ENT INPUT A DECIMAL VALUE IDEC4 COPY =0,A CLEAR VALUE CELL COPY A,IDCTM1 COPY A,IDCTM3 AND COUNT IDEC3 JST IKB GET A CHAR COPY A,IDCTM2 SAVE IT SUB ='0',A SEE IF ASCII 0-9 JLT A,IDEC1 TERMINATOR  SUB =10,A JGE A,IDEC1 TERMINATOR IMS IDCTM3 BUMP COUNT COPY IDCTM1,A ADD TO VALUE SHIFT A,LO,2 TIMES 4  ADD IDCTM1,A TIMES 5 SHIFT A,LO,1 TIMES 10 ADD IDCTM2,A ADD NEW VALUE SUB ='0',A LESS ASCII PART JLT A,IDEC2 MINUS IS BAD COPY A,IDCTM1 STORE NEW VALUE JMP IDEC3 GET NEXT INPUT IDEC1 COPY IDCTM2,A GET TERMINATOR IN A COPY IDCTM1,X GET VALUE IN X JMP *IDEC EXIT IDEC2 COPY ='?',A ERROR JST OTTY OUTPUT "?" JMP IDEC4 START AGAIN * IDCTM1 WORD 0 VALUE CELL IDCTM2 WORD 0 ASCII CHAR CELL IDCTM3 WORD 0 COUNT * LPOOL TITL 'IHEX' SUBROUTINE ****************************** * * IHEX - INPUT HEXADECIMAL NUMBER * * THIS SUBROUTINE WILL INPUT, THROUGH *  THE CRT/TTY, AN ASCII-HEX VALUE WHICH * IT WILL CONVERT TO BINARY AND RETURN IT * IN THE X REGISTER. * *  THIS SUBROUTINE IS EXITED UPON INPUT OF THE * FIRST NON ASCII-HEX CHARACTER WHICH IT * RETURNS IN THE A REGISTER * * CALLING SEQUENCE: * JST IHEX * * CALLS: CALLED BY: * IKB QUERIES * ****************************** * IHEX ENT INPUT HEX VALUE (4-DIGIT) COPY =0,A CLEAR VALUE AREA COPY A,IDCTM1  COPY A,IDCTM3 AND COUNT IHEX3 JST IKB GET A CHAR COPY A,IDCTM2 SAVE IT SUB ='0',A CHECK FOR HEX JLT A,IHEX4 TERMINATOR SUB =9,A ITS 0-9 JLE A,IHEX1 ITS 0-9 SUB =9,A ADD =1,A JLT A,IHEX4 TERMINATOR  SUB =5,A JGT A,IHEX4 TERMINATOR ADD =:F,A ITS A-F IHEX2 COPY A,IDCTM2 SAVE HEX CHAR COPY IDCTM1,A INCLUDE IT IN VALUE SHIFT A,LO,4 OR IDCTM2,A 6 COPY A,IDCTM1 IMS IDCTM3 BUMP COUNT JMP IHEX3 GET NEXT CHAR IHEX1 ADD =9,A HEX 0-9 JMP IHEX2 IHEX4 COPY IDCTM2,A LOAD TERMINATOR IN 4 COPY IDCTM1,X LOAD VALUE IN X JMP *IHEX RETURN TITL 'IKB' SUBROUTINE ****************************** * * IKB - INPUT CHARACTER FROM CRT/TTY * * THIS SUBROUTINE WILL INPUT AN * ASCII CHARACTER FROM THE CRT/TTY * AND RETURN IT IN THE A REGISTER. * * CALLING SEQUENCE: * JST IKB * * CALLS: CALLED BY: * NONE TECH TEST *  QUERIES * IDEC * IHEX * ****************************** * IKB ENT INPUT TTY CHAR ROUTINE COPY X,IKBTMP SAVE XR ROTATE X,LO,16 SAVE OV COPY X,IKBTM2 RBIT 8,S  COPY =:8618,A START ECHO,NO INTERRUPT OUT A,DTTYDA%1;1 OUTPUT START & MODES COPY =:100,X RESET CODE IN DTTYDA%1;1,A INPUT STATUS SHIFT A,RO,4 WORD READY TO OV JF OV,$-2 IF WORD NOT READY IN DTTYDA%1,A GET WORD  OUT X,DTTYDA%1;1 RESET TTY AND =:7F,A INPUT CHAR AS 7-BIT ASCII COPY IKBTM2,X RESTORE XR ROTATE X,LO,1 CO  PY IKBTMP,X RESTORE XR JMP *IKB * IKBTMP WORD 0 XR SAVE CELL IKBTM2 WORD 0 OV SAVE CELL * LPOOL TITL I/O SUBROUTINES *********************************** * * OTA * OTX * SEL * SENHIM * SENRDY - I/O SUBROUTINES * *  THESE SUBROUTINES PERFORM THE ACTUAL I/O TO * THE CONTROLLER. * * OTA - OUTPUT A REGISTER FC.=0 * OTX - OUTPUT X REGISTER FC.=0 * SEL - SELECT AND PRESENT A FC.=4 * SENHIM - SENSE PRESENCE FC.=4 * SENRDY - SENSE READY FC.=0 * * CALLING SEQUENCE: * OTA - COPY =IOB ADDRESS,A * JST OTA * * OTX - COPY =IOB ADDRESS,X * JST OTX * *  SEL - JST SEL * * SENHIM - JST SENHIM * JMP ? CONTROLLER NOT PRESENT R *  JMP ? CONTROLLER PRESENT R+1 * * SENRDT - JST SENRDY * JMP ? CONTROLLER NOT READY R * JMP ? CONTROLLER READY R+1 * * CALLS: CALLED BY: * NONE * * *********************************** * OTA ENT DA1 EQU $ OUT A,SMDA*8+0 OUTPUT A REGISTER JMP *OTA * OTX ENT DA2 EQU $ OUT X,SMDA*8+0 OUTPUT X REGISTER JMP *OTX * SEL ENT COPY A,SEL1 COPY =0,A DA3 SELP A,SMDA*8+4 COPY SEL1,A JMP *SEL SEL1 WORD 0 * SENHIM ENT DA4 EQU $ SST SMDA*8+4 SENSE PRESENCE JMP *SENHIM IMS SENHIM JMP *SENHIM * SENRDY ENT DA5 EQU $ SST SMDA*8+0 SENSE IDLE IMS SENRDY JMP *SENRDY * RSTBD ENT COPY =0,A CLEAR A DA6 SELP A,SMDA*8+4 JST TIMER SET TIMER FOR 7 SECONDS JST TIME GET IT GOING JMP $-1 LST TIME EXPIRE JMP *RSTBD * * LPOOL TITL 'MOVE' SUBROUTINE ****************************** * * MOVE - MOVE A BLOCK OF DATA * * THIS SUBROUTINE IS USED * TO MOVE A BLOCK OF DATA FROM * ONE AREA OF MEMORY TO ANOTHER. * * ENTER WITH NEGATIVE DATA LENGTH IN * A REGISTER * * CALLING SEQUENCE: * COPY =-DATA LENGTH,A * JST MOVE * WORD AREA1 ADDRESS OF 'FROM AREA' * WORD AREA2 ADDRESS OF 'TO AREA' * * CALLS: CALLED BY: * NONE QUERIES * TESTB *  TESTC * TECH TEST * FILCON * ****************************** * MOVE ENT MOVE WORD ROUTINE COPY A,MOVECT SAVE LENGTH COPY *MOVE,A GET "FROM" ADRESS COPY A,MOVEFM IMS MOVE COPY *MOVE,A GET "TO" ADRESS COPY A,MOVETO IMS MOVE BUMP FOR RTN MOVE1 COPY *MOVEFM,A GET A WORD COPY A,*MOVETO MOVE IT IMS MOVEFM BUMP FROM IMS MOVETO BUMP TO IMS MOVECT BUMP COUNT JMP MOVE1 MOVE NEXT WORD JMP *MOVE EXIT * MOVECT WORD 0 COUNT MOVEFM WORD 0 FROM AD MOVETO WORD 0 TO AD  TITL MSGA SUBROUTINE *********************************** * * MSGA - PRINT ASCII MESSAGE * * THIS SUBROUTINE WILL PRINT AN * ASCII MESSAGE TO THE CRT/TTY. * THE LAST CHARACTER OF THE MESSAGE * MUST BE :FF. * * * CALLING SEQUENCE: JST MSGA * WORD MESSAGE ADDRESS * * * CALLS: CALLED BY: *   OTTY * * *********************************** * MSGA ENT COPY X,MSGA3 SAVE X-REG COPY *MSGA,X GET MSG ADDR SHIFT X,LO,1 IMS MSGA BUMP FOR RETURN MSGA1 SBIT 2,S COPYB 0(X),A GET A CHAR RBIT 2,S CLSN =:FF,A IS IT END OF MSG JMP MSGA2 YES EXIT JST OTTY PRINT A CHAR ADD =1,X BUMP PTR JMP MSGA1 GET NEXT CHAR MSGA2 COPY MSGA3,X RESTORE X-REG JMP *MSGA EXIT * MSGA3 WORD 0 SAVE X-REG CELL * LPOOL TITL 'OBIN' SUBROUTINE ****************************** * * OBIN - PRINT BINARY NUMBER * * THIS SUBROUTINE WILL PRINT A * BINARY NUMBER TO THE CRT/TTY. * * ENTER WITH THE NUMBER IN THE A * REGISTER * * CALLING SEQUENCE: * COPY =BINARY NUMBER,A * JST OBIN * * CALLS: CALLED BY: * SPACE  ERROR * OTTY * ****************************** * OBIN ENT COPY A,OBINA SAVE VALUE JST SPACE  COPY ='(',A JST OTTY PRINT OPEN PAREN COPY =' ',A JST OTTY COPY =-4,A COPY A,OBINB SET NIBBLE COUNT OBIN1 COPY =-4,A COPY A,OBINC SET 4-BIT COUNT OBIN2 COPY OBINA,A SHIFT A,LO,1 PICK OFF NEXT BIT COPY A,OBINA COPY ='0',A ITS EITHER A ZERO JF OV,$+2 ADD =1,A OR A '1' JST OTTY PRINT IT IMS OBINC BUMP 4-BIT COUNTER JMP OBIN2 PRINT NEXT BIT COPY =' ',A PRINT SPACE EACH 4 BITS JST OTTY IMS OBINB BUMP NIBBLE COUNT JMP OBIN1 GET NEXT NIBBLE COPY =')',A ALL DONE JST OTTY PRINT CLOSE PAREN JMP *OBIN EXIT * OBINA  WORD 0 VALUE OBINB WORD 0 NIBBLE COUNT OBINC WORD 0 4-BIT COUNT * LPOOL TITL ODEC-OUTPUT DECIMAL NUMBER SUBROUTINE *********************************** * * ODEC - PRINT DECIMAL NUMBER * * THIS SUBROUTINE WILL CONVERT THE *  A-REG TO AN EQUIVALENT DECIMAL * NUMBER AND PRINT IT TO THE CRT/TTY * IF IT IS LESS THAN 10000. IF IT IS * GREATER THAN 10000 IT WILL PRINT * '****'. * * ENTER WITH NUMBER IN THE A-REG * * * CALLING SEQUENCE: COPY =NUMBER,A * JST ODEC * * * CALLS: CALLED BY: * MSGA FORMAT * OTTY * * ************************************ * ODEC ENT COPY X,ODECX SAVE X-REG COPY Y,ODECY SAVE Y-REG COPY A,IDCTM1 SAVE BINARY VALUE CSK A,ODECTBL+1 IS IT GREATER THAN 10,000? JMP ODECO NO, CONTINUE NOP JST MSGA YES, PRINT '****' WORD STARS JMP ODEC2 EXIT ODECO COPY ODECTBL,A GET TABLE COPY A,IDCTM2 COPY =-5,A COUNT 5 DIGITS COPY A,IDCTM3 ODEC1 COPY IDCTM1,A GET REMINDER COPY IDCTM2,Y COPY ='0'-1,X SUB 0(Y),A DIVIDE IN DECIMAL ADD =1,X ADD TO OUTPUT VALUE JGE A,$-2 ADD 0(Y),A ADD BACK IN IF GONE NEGATIVE COPY A,IDCTM1 STORE REMINDER COPY X,A JST OTTY PRINT CALCULATED DIGIT IMS IDCTM2 BUMP TABLE POINTER IMS IDCTM3 AND COUNT JMP ODEC1 DO NEXT DIGIT ODEC2 COPY ODECX,X RESTORE X-REG COPY ODECY,Y RESTORE Y-REG JMP *ODEC EXIT AFTER 5 * ODECTBL WORD $+1,10000,1000,100,10,1 ODECX WORD 0 X-REG CELL ODECY WORD 0 Y-REG CELL * LPOOL TITL OHEX SUBROUTINE *********************************** * * OHEX - PRINT HEX NUMBER * * THIS SUBROUTINE WILL CONVERT THE * A REGISTER TO AN EQUIVALENT ASCII * HEX NUMBER AND PRINT IT TO THE * C  RT/TTY. * * * CALLING SEQUENCE: COPY =NUMBER,A * JST OHEX * * * CALLS: CALLED BY: * OTTY TESTA * * *********************************** * OHEX ENT COPY X,ODECX SAVE X-REG COPY A,X SAVE FOR OUTPUT COPY =-4,A COPY A,OHEXC1 OUTPUT 4 HEX DIGITS OHEX1 COPY =-4,A COPY A,OHEXC SHIFT COUNT=4 COPY =0,A CLEAR OUT A-REG OHEX2 ROTATE X,LO,1 MS. BIT OF X ROTATE A,LO,1 BECOMES LS. BIT OF A IMS OHEXC BUMP SHIFT COUNT JMP OHEX2 AND CONTINUE SUB =10,A FIX TO ASCII JLT A,$+2 NUMERIC? ADD =7,A ADD ='9'+1,A NO, ITS A-F JST OTTY OUTPUT THE DIGIT IMS OHEXC1 4 DIGITS YET? JMP OHEX1 NO, DO ANOTHER COPY ODECX,X YES, RESTORE X JMP *OHEX EXIT * OHEXC1 WORD 0 4-DIGIT COUNTER OHEXC WORD 0 4-BIT SHIFT COUNT * LPOOL TITL OTTY SUBROUTINE *********************************** * * OTTY - PRINT ASCII CHARACTER * * THIS SUBROUTINE WILL PRINT AN ASCII CHARACTER * IN THE LS BYTE OF THE A REGISTER TO CRT/TTY * * *  ENTER WITH CHARACTER IN LS BYTE OF THE A REGSITER * * * CALLING SEQUENCE: COPY =CHARACTER,A * JST OTTY * * * CALLS: CALLED BY: * * ************************************ * OTTY ENT COPY A,OTTMP1 SAVE AR COPY X,OTTMP2 SAVE XR RBIT 8,S COPY =:8612,X START, REQUEST TO SEND, DON'T INTERRUPT OUT X,DTTYDA%1;1 START PICO OUT A,DTTYDA%1 SEND WORD COPY =:100,X RESET CODE * NOP THIS IS FOR TIME DELAY BEFORE TRE (ACC NEEDS IT) * IN DTTYDA%1;1,A INPUT STATUS SHIFT A,RO,5 TREMPTY TO OV JF OV,$-2 IF STILL SET IN DTTYDA%1;1,A INPUT STATUS SHIFT A,RO,5 TREMPTY TO OV JF OV,$-2 IF STILL FULL OUT X,DTTYDA%1;1 RESET PICO COPY LPFLAG,A GET LP FLAG JEQ A,OTTY6 IF ZERO, EXIT OTTY1 JST TIMER SET TIME COPY OTTMP1,A RESTORE AR OUT A,DLPDA%1 START IT COPY =:8610,A LP START UP COMMAND OUT A,DLPDA%1;1 START IT OUT A,DLPDA%1;1 DITTO OTTY2 IN DLPDA%1;1,A INPUT STATUS SHIFT A,RO,1 SHIFT 'BUSY BIT' TO OV JF OV,OTTY5 IF NOT BUSY, EXIT JST TIME DO DELAY JMP OTTY2 LOOP BACK IF NOT DONE COPY OTTMP1,A GET ORIGINAL AR CONTENTS COPY A,OTTMP3 SAVE IT COPY LPFLAG,A GET LP FLAG COPY A,OTTMP4 SAVE IT COPY OTTMP2,A GET ORIGINAL XR CONTENTS COPY A,OTTMP5 SAVE IT COPY OTTY,A GET RETURN ADDRESS COPY A,OTTMP6 SAVE IT  COPY =0,A SET NEW LP FLAG COPY A,LPFLAG STORE NEW LP FLAG COPY =LPMSG*2,X GET ERROR MESSAGE ADDRESS-'LP TIMEOUT' OTTY3 SBIT 2,S SET BYTE MODE COPYB 0(X),A GET CHAR RBIT 2,S SET WORD MODE CLSN A,=:FF IF END OF MESSAGE, EXIT JMP OTTY4 JST OTTY DISPLAY ON CRT/TTY ADD =1,X INC. MESSAGE ADDRESS JMP OTTY3 LOOP FOR MORE OTTY4 JST IKB INPUT CHAR FROM KEYBOARD COPY OTTMP6,A GET RETURN ADDR COPY A,OTTY SET IT COPY OTTMP4,A GET ORIGINAL LP FLAG COPY A,LPFLAG SET IT COPY OTTMP5,A GET ORIGINAL XR COPY A,OTTMP2 SET IT COPY OTTMP3,A GET ORIGINAL AR COPY A,OTTMP1 SET IT JMP OTTY1 OTTY5 COPY =:100,X GET LP RESET COMMAND OUT X,DLPDA%1;1 RESET LP SHIFT X,RO,1 WAST SOME TIME JNE X,$-1 DITTO OTTY6 COPY OTTMP1,A RESTORE AR COPY OTTMP2,X RESTORE XR JMP *OTTY RETURN TO CALLER * OTTMP1 WORD 0 AR SAVE CELL OTTMP2 WORD 0 XR SAVE CELL OTTMP3 WORD 0 SAVE AR OTTMP4 WORD 0 SAVE LP FLAG OTTMP5 WORD 0 SAVE XR OTTMP6 WORD 0 SAVE RETURN ADDRESS LPFLAG WORD 0 LP FLAG * LPOOL TITL PREP - PERPARE DISK PHYSICAL ADDRESS SU  BROUTINE *********************************** * * * PERP - PERPARE DISK PHYSICAL ADDRESS SUBROUTINE * * THIS SUBROUTINE WILL GENERATE CYLINDER NUMBER, * HEAD NUMBER, AND SECTOR NUMBER BY MEANS OF * THE RANDOM NUMBER GENERATOR. * * * CALL SEQUENCE: JST PREP * * * CALLS: CALLED BY: * RANDOM  TESTC * TESTD * * ************************************* * PREP EQU $ ENT COPY A,CKA SAVE A-REG COPY X,CKX AND X-REG JST RANDOM GET A RANDOM NUMBER COPY A,TEMP5 SAVE IT COPY A,X COPY =0,A DIV MAXCYL,AX GENERATE CYLINDER # COPY A,CYL SAVE IT COPY TEMP5,X RESTORE RANDOM NUMBER COPY =0,A 0 -> A DIV INITBK+1,AX CALQLATE HEAD # (B020) * CSK A,INITBK+2 MAKE SURE NEW HEAD# IS NOT < LOGICAL MIN HEAD (B021) COPY INITBK+2,A USE LOG MIN HEAD IF NEW HEAD# IS TOO LOW (B021) NOP * COPY A,HEAD SAVE IT COPY MAXSCTOR,A GET READY TO CALCULATE SECTOR # SUB =4,A COPY A,TEMP6 COPY TEMP5,X RESTORE RANDOM NUMBER COPY =0,A DIV TEMP6,AX CALCULATE SECTOR # COPY A,SECTOR SAVE IT COPY CKA,A RESTORE A-REG COPY CKX,X AND X-REG JMP *PREP EXIT * LPOOL TITL RANDOM SUBROUTINE ********************************** * * * RANDOM - RANDOM NUMBER SUBROUTINE * * * THIS SUBROUTINE WILL GENERATE A PSEDUO * RANDOM NUMBER USING THE FOLLING EQUATION: * * C(I+1) = C(C(I)*Y+U)MOD(P)) * * WHERE * * C(I) = SEED VALUE * C(I+1) = PSEUDO RANDOM NUMBER *  U = 0 * Y = 5**(2K+1) K = 2 * P = 983 * * THE PERIOD FOR THE ABOVE RANDOM SEQUENCE IS 983. * * EXIT WITH THE RANDOM NUMBER IN THE A REGISTER. * * CALLING SEQUENCE: JST RANDOM * * * CALLS: CALLED BY: * NONE TESTC * * *********************************** * RANDOM ENT COPY X,RMD:X SAVE X-REG COPY =0,A CLEAR A-REG COPY SEED,X SET C(I) --> X-REG * * NOW CALC C(I)*YYYYYY * MUL YYYYYY,AX * * NOW CALC (C(I)*YYYYYY)MOD(PPPPPP) * DIV PPPPPP,AX COPY A,SEED SET NEXT SEED COPY RMD:X,X RESTORE X-REG JMP *RANDOM EXIT * SEED RES 1,1 C(I) VALUE YYYYYY WORD 3125 5**(2K+1) FOR K=2 PPPPPP WORD 983 CAREFULLY CHOOSEN MODULUS RMD:X RES 1,0 X-REG KEEPER FOR THIS ROUTINE * LPOOL TITL SAVER SUBROUTINE *********************************** * * * SAVER - THIS SUBROUTINE READS THE WINCHESTER * DISK ON WHICH THE TRACK(S) WILL BE * PERFORM A WRITE OPERATION. * * * COMMAND IOB FOR THE WRITE OPERATION MUST BE * SET UP BEFORE THIS SUBROUTINE IS INVOKED. * THIS SPECIFICED THE ADDRESS TO BE READ. * * * NOTE: TRANSFER DATA LENGTH CANNOT BE GREATER * THAN 1024. * * * CALLING SEQUENCE: JST SAVER * * * CALLS: CALLED BY: * ERROR TESTC * MOVE *  MSGA * * *********************************** * SAVER ENT ENTRY POINT FOR NON-DESTRUCTIVE TEST SUBROUTINE COPY A,ASAVE SAVE A-REG COPY X,XSAVE SAVE X-REG COPY CAR,A GET RUN OPTION TBIT 6,A IS NON DESTRUCTIVE SET? JF OV,SREND NO, EXIT COPY =-12,A GE T NEGATIVE WORD COUNT JST MOVE COPY ORIGINAL IOB WORD DIOB FROM DIOB WORD SIOB TO SIOB COPY =0,A COPY A,NB+SIOB NO NEXT BLOCK * SET UP IOB TO SAVE ORIGINAL DATA COPY =SIOB,X INDEX SAVE IOB COPY =RDDAT,A GET READ DATA COMMAND COPY A,OP(X) SAVE IT COPY =TMPBUF,A GET TEMP BUFFER ADDRESS COPY A,MA(X) SAVE IT COPY =SRINT,A GET INT ADDRESS COPY A,IN(X) SAVE IT * READ AND SAVE DATA SBIT 8,S ENABLE INT COPY =SIOB,A GET SAVE IOB ADDRESS JST OTA SEND IT JMP $ WAIT FOR INT * SRINT EQU $ JST $+1 MUST BE A JST/JSK NOP COPY =SIOB,X INDEX SAVE IOB JST RETSTAT CHECK THE STATUS JMP SAVERA YES, EVERYTHING IS AOK JST MSGA PRINT ADDITIONAL MESSAGE WORD SMSGA1 SAVERA COPY =-12,A GET NEGATIVE WORD COUNT JST MOVE RESTORE ORIGINAL IOB WORD DIOB FROM DIOB WORD SIOB TO SIOB COPY =0,A COPY A,NB+SIOB NO NEXT BLOCK SREND COPY ASAVE,A RESTORE A-REG COPY XSAVE,X RESTORE X-REG JMP *SAVER EXIT * ASAVE WORD 0 A SAVE CELL XSAVE WORD 0 X SAVE CELL SIOB RES 15,0 SAVE IOB BUFFER (A600) * LPOOL TITL SAVEW SUBROUTINE ************************************ * * * SAVEW - THIS SUBROUTINE WRITES BACK THE * ORIGINAL DATA EXTRACT FORM THE * DISK. * * * CONSTRAINS: SAME AS SAVER * * * CALLING SEQUENCE: JST SAVEW * * * CALLS:  CALLED BY: * ERROR TESTC * MSGA * * *********************************** * SAVEW ENT ENTRY POINT COPY A,ASAVE SAVE A-REG COPY X,XSAVE SAVE X-REG COPY CAR,A GET RUN OPTION TBIT 6,A IS NON DESTRUCTIVE ON? JF OV,SWEND NO, EXIT * SET UP IOB TO RESTORE DATA COPY =SIOB,X INDEX IOB COPY =WRTDAT,A GET WRITE DATA COMMAND COPY A,OP(X) SAVE IT COPY =TMPBUF,A GET TEMP BUFFER ADDRESS COPY A,MA(X) SAVE IT COPY =SWINT1,A GET INT ADDRESS COPY A,IN(X) SAVE IT * WRITE BACK ORIGINAL DATA SBIT 8,S ENABLE INT COPY =SIOB,A GET SAVE IOB ADDRESS JST OTA SEND IT JMP $ WAIT FOR INT * SWINT1 EQU $ JST $+1 MUST BE A JST/JSK NOP COPY =SIOB,X INDEX SAVE IOB JST RETSTAT CHECK THE STATUS JMP SAVERV GOOD STATUS JST MSGA PRINT ADDITIONAL MSSAGE WORD SMSGA2 JMP SWEND EXIT * LPOOL SAVERV EQU $ * SET UP READ VERIFY IOB COPY =SIOB,X INDEX SAVE IOB (B023) COPY =RDVER,A GET READ VERIFY COMMAND COPY A,OP(X) SAVE IT COPY =SWINT2,A GET INT ADDRESS COPY A,IN(X) SAVE IT * READ VERIFT ORIGINAL DATA SBIT 8,S ENABLE INT COPY =SIOB,A GET SAVE IOB ADDRESS JST OTA SEND IT JMP $ WAIT FOR INT * SWINT2 EQU $ JST $+1 MUST BE A JST/JSK NOP COPY =SIOB,X INDEX SAVE IOB JST RETSTAT CHECK THE STATUS JMP SWEND OK EXIT JST MSGA PRINT MESSAGE WORD SMSGA3 SWEND COPY ASAVE,A RESTORE A-REGISTER COPY XSAVE,X RESTORE X-REGISTER JMP *SAVEW EXIT * LPOOL TITL SPACE SUBROUTINE *********************************** * * * SPACE - PRINT SPACES * * THIS SUBROUTINE WIL PRINT THREE * ASCII SPACES TO THE CRT/TTY. * CALLING SEQUENCE: JST SPACE * * * CALLS:  CALLED BY: * OTTY OBIN * * *********************************** * SPACE ENT COPY A,SPTEMP SAVE A-REG COPY =' ',A PRINT 3 SPACES JST OTTY DO IT JST OTTY AGAIN JST OTTY ONE MORE TIME COPY SPTEMP,A RESTORE A-REG JMP *SPACE EXIT * SPTEMP WORD 0 A-REG CELL * LPOOL TITL TIME SUBROUTINE *********************************** * * * TIME  - TIME DELAY ROUTINE, TAKES * APPROXIMATELY 7 SECONDS IF * TIMING CELLS ARE INITIALIZED BY * 'TIMER'. * * * CALLING SEQUENCE: JST TIME * JMP ? TIME NOT FULLY EXPIRED R * JMP ? TIME FULLY EXPIRED R+1 * * * CALLS: CALLED BY: * NONE OTTY * * *********************************** * TIME ENT IMS TC1 BUMP LSP TIMING CONSTANT JMP *TIME EXIT IMS TC2 BUMP MSP TIMING CONSTANT JMP *TIME EXIT TO CALL + 1 IMS TIME SPECIAL RETURN..EXPIRED JMP *TIME EXIT * TC1 RES 1,0 TC2 RES 1,0 * LPOOL TITL TIMER SUBROUTINE *********************************** * * * TIMER - INITIALIZES TIMING CELLS * FOR 'TIME'. * * * CALLING SEQUENCE: JST TIMER * * * CALLS: CALLED BY: * NONE OTTY * * *********************************** * TIMER ENT COPY =0,A SET LOW WORD COPY A,TC1 COPY =-7,A SET HIGH WORD COPY A,TC2 JMP *TIMER EXIT * LPOOL TITL TRAP/EXCEPTION SERVICE ROUTINES ************************************ * * TRAP/EXCEPTION SERVICE ROUTINES * * CONSOLE INTERRUPT SERVICE ROUTINE * * CALLS: * SEL * MSGA * * *********************************** * * POEWR UP * PWRUP: ENT POWER UP SERVICE ROUTINE SIN 3 STATUS INHIBIT COPY =PFMSG,X GET MESSAGE ADDRESS SERVR EQU $ COPY =0,A CLEAR A-REG COPY A,S SET PSW TO ZERO JST SEL RESET/INITIALIZE CONTROLLER COPY X,$+2 STORE MESSAGE ADDRESS JST MSGA PRINT MESSAGE WORD 0 HLT WAIT HERE JMP EXEC * * UNIMPLEMENTED INSTRUCTION TRAP * UNINT: ENT UNI. INSTR. SERVICE ROUTINE SIN 4 STATUS INHIBIT COPY =INMSG,X GET ARRESS JMP SERVR PRINT IT * * UNINSTALLED MEMORY TRAP * UNMET: ENT UNI. MEM. TRAP ROUTINE SIN 4 STATUS INHIBIT COPY =MEMSG,X GET MESSAGE ADDRESS JMP SERVR PRINT IT * * POWER FAIL * PWRFL: ENT POWER FAIL ROUTINE HLT WAIT FOR POWER * * CHAR./NUM. EXCEPTIONS * CHNUE: ENT SIN 4 STATUS INHIBIT COPY =CHMSG,X GET MESSAGE ADDRESS JMP SERVR PRINT IT * * STACK OVERFLOW * STKOV: ENT SIN 4 STATUS INHIBIT COPY =STMSG,X GET MESSAGE ADDRESS JMP SERVR PRINT IT * * USER TRAP * USETR: ENT SIN 4 STATUS INHIBIT COPY =USMSG,X GET MESSAGE ADDRESS JMP SERVR PRINT IT * * SYSTEM TRAP * SYSTR: ENT SIN 4 STATUS INHIBIT COPY =SYMSG,X GET MESSAGE ADDRESS JMP SERVR PRINT IT * * ARITHMETIC ERROR * ARIER: ENT SIN 4 STATUS INHIBIT COPY =ARMSG,X GET MESSAGE ADDRESS JMP SERVR PRINT IT * * CONSOLE INTERRUPT * CNINT: ENT SIN 2 STATUS INHIBIT COPY =0,A SET A TO ZERO COPY A,S SET PSW TO ZERO OUT A,1 RESET CONSOLE INT LIGHT JST SEL RESET/INITIALIZE CONTROLLER JST RSTBD SOFTWARE RESET COPY =0,A SET UP TIMER COPY A,TC1 DO IT COPY =-28,A ALLOW TIME COPY A,TC2 DO IT JST TIME CALL TIMER JMP $+3 TIME NOT EXPIRED NOP EXPIRED JMP PSU JST SENRDY IS CONTROLLER READY? JMP $-2 YES, READY JMP $-6 NO, NOT READY NOP TIME EXPIRED JST *0 GO TO DEBUG *JMP PSU GO TO QUERRIES * LPOOL TITL DISK SYSTEM BUFFERS AND CELLS *********************************** * * * DISK SYSTEM BUFFERS, IOB, DATA CELLS * * *********************************** * OPTIONS +:0020 BADBUF RES BADBUFSZ,-1 MFR'S BAD TRACKS BUFFER FOR FMTTR BADBUF1 RES BADBUFSZ,-1 LIST OF BAD TRACK FOUND DURING FORMATTING * BADBUF2 RES BADBU FSZ,-1 MFR'S BAD TRACKS BUFFER FOR DIAG * BADCYL RES 1,0 BAD CYLINDER CELL * BADHEAD RES 1,0 BAD HEAD CELL * BUFCLR RES BADBUFSZ,-1 CLEAN BAD BUFFER BUFFER * BUFPTR RES 1,0 BUFFER POINTER BUFPTR1 RES 1,0 BUFFER POINTER1 POINTING TO BADBUF1 AREA * BUFFLAG WORD :FFFF BAD BUFFER FLAG * CKA WORD 0 A-REG CELL * CKQ WORD 0 Q-REG CELL * CKX WORD 0 X-REG CELL * CKY WORD 0 Y-REG CELL * CTL WORD :100 OPERATION COUNT CONTROL * CYL WORD 0 SAVE CYLINDER CELL * DIOB RES 15,0 IOB LOCATION * DCIOB RES 4,0 DATA CHAIN IOB LOCATION * DCIOB1 RES 4,0 ANOTHER DATA CHAIN IOB LOCATION * ECHO RES 1,0 ANOTHER FLAG * ECHOFL WORD 0 ECHO FLAG CELL * ERADFL WORD 0 ERR ADDR FLAG (FOR ERR ADDR PRINT) * ERLPFL WORD 0 ERROR LP FLAG * HEAD WORD 0 SAVE HEAD CELL * HPD WORD 0 HEADS PER DRIVE CELL * LIMIT WORD =BADBUF+BADBUFSZ-1 ADDRESS OF LAST WORD IN BADFUF * LIMIT1 WORD =BADBUF1+BADBUFSZ-1 ADDRESS OF LAST WORD IN BADFUF1 * LOGADDR RES 2,0 DISK LOGICAL ADDRESS CELLS * PAMTR RES 5,0 INITIALIZATION PARAMETER TABLE * MFRFLG WORD 0 MFR FLAG * PASS WORD 0 PASS COUNTER CELL * PATN WORD :6DB6 WORD PATTERN CELL * SEEDSAVE WORD 0 CELL FOR RANDOM NUMBER GENERATOR SEED * SECTOR WORD 0 SAVE SECTOR CELL * SPT WORD 0 SECTORS PER TRACK CELL * UCUR RES 5,:FFFF UNIT NUMBER TABLE * UNIT WORD 0 UNIT NUMBER CELL * WBUF RES 260,:6DB6 WRITE BUFFER INITIALIZED TO 6DB6 * WBUF1 RES 260,:6DB6 2ND WRITE BUFFER * WBUF2 RES 260,:6DB6 3RD WRITE BUFFER * RBUF RES 260,:0 READ BUFFER INITIALIZED TO 0 * RBUF1 RES 260,:0 2ND READ BUFFER * RBUF2 RES 260,:0 3RD READ BUFFER * TMPBUF RES :1030,:0 TEMP BUFFER * TEMP1 WORD 0 USED BY TEST SEL, EXEC * TEMP2 WORD 0 TEMP CELL USED AS INPUT FLAG * TEMP3 WORD 0 TEMP CELL * TEMP4 WORD 0 TEMP CELL * TEMP5 WORD 0 TEMP CELL * TEMP6 WORD 0 TEMP CELL * TEMP7 WORD 0 TEMP CELL * TSTBUF1 WORD :41,:42,:43,:44,:45,:46,-1 TEST SELECTION TABLE * TSTBUF2 WORD :41,:42,:43,:44,:45,:46,-1 DEFAULT TEST TABLE * CAR WORD 0 RUN OPTION CELL * IPCOUNT WORD 0 INPUT COUNT CELL * IPFLAG WORD 0 INPUT FLAG CELL * PERSEL WORD 0 PERIPHERAL SELECT LOCATION * FUNCTION WORD 0 FUNCTION SELECT LOCATION * ALTCYL WORD :0 ALT CYLINDER LOCATION * ALTHEAD WORD :0 ALT HEAD LOCATION * MINALT WORD :0 MIN ALT LOCATION * MINALTC WORD :0 MIN ALT CYL LOCATION * INTRLVF WORD :0 INTERLEAVE FACTOR * SEEKSZ WORD 1 DISK TEST B - SEEK (1=LONG, 2=SHORT) * WDCOUNT WORD 0 WORD COUNT FOR DISK TEST C * PSIOFLG WORD 0 PARTIAL-SECTOR I/O FLAG (DISK TEST C) * INTLNK WORD 0 INTERRUPT LINK CELL (DISK TEST C) * TSTC20 WORD 0 TEMP CELL USED IN 'TSTCVERI' * TSTC21 WORD 0 TEMP CELL USED IN 'TSTCVERI' * TITL TAPE SYSTEM BUFFERS AND DATA CELLS ******************************************************* * * * TAPE SYSTEM BUFFERS AND DATA CELLS * * * *************************************************** * NOCAFLG WORD 0 NO CARTRIDGE FLAG * NODRFLG WORD 0 NO DRIVE FLAG * WRPRFLG WORD 0 WRITE PROTECT FLAG * ENDMFLG WORD 0 END OF MEDIA FLAG * RWABFLG WORD 0 READ WRITE ABORT FLAG * REBAFLG WORD 0 BAD BLOCK FLAG * REFIFLG WORD 0 FILLER BLOCK FLAG * RENOFLG WORD 0 NO RECORDED DATA FLAG * RENDFLG WORD 0 NO DATA, END OF MEDIA FLAG * RDFMFLG WORD 0 FILE MARK FLAG * ILLCFLG WORD 0 ILLEGAL COMMAND FLAG * POWEFLG WORD 0 POWER ON AND RESET * MARGFLG WORD 0 MARGINAL BLOCK DETECTED FLAG * TPASS WORD 0 TAPE PASS NUMBER CELL * INFLAG WORD 0 INPUT FLAG CELL * TTSTBUF 1 WORD 'A','B','C','D','E','F','G',-1 TEST SELECTION TABLE * TTSTBUF2 WORD 'A','B','C','D','E','F','G',-1 DEFAULT TEST TABLE * ERRCOUN WORD :0 ERROR COUNT LOCATION * BKCNT WORD 0 DATA BLOCK COUNT CELL * CNTDAB WORD 0 BKCNT DISABLE FLAG CELL * NDBKD WORD :5 NUMBER OF DATA BLOCK TO BE TRANSFER CELL * NDBK WORD 0 SAME AS NDBKD, BUT USED BY PROGRAM * NDBLK WORD :3FFF NO. OF DAA BLOCK TO BE TRANSFERED FOR TEST D * BLKCNT WORD :200 BLOCK COUNT FOR TAPE TEST B (A901) * BUFFERS RES 4,:FFFF STATUS BUFFER * BUFFERW RES 260,PATN WRITE BUFFER * RWBUFCEL RES 1,0 READ/WRITE CELL * TBUFPTR RES 1,0 BUFFER POINTER CELL * BUFFERR RES 260,0 READ BUFFER * * TITL I/O INSTRUCTION ADDRESS TABLE ******************************************** * * I/O INSTRUCTION ADDRESS TABLE * ******************************************** * IOTAB EQU $ WORD DA1 OUT A-REG INSTRUCTION WORD DA2 OUT X-REG INSTRUCTION WORD DA3 OUT SELP INSTRUCTION WORD DA4 SENSE PRESENCE WORD DA5 SENSE IDLE WORD DA6 SEND RESET * TITL TABLES - DRIVE PARAMETER ADDRESSES) ************************************ * * TABLE OF DRIVE PARAMETER ADDRESSES * * TABLE MUST BE KEPT CONTIGUOUS * * *********************************** * DRTBL EQU $ START OF DRIVE PARAMETER ADDRESSES * * WORD XT1065 MAXTOR 1065 * WORD XT1085 MAXTOR 1085 * WORD XT1140 MAXTOR 1140 * WORD AT3046 ATASI 3046 * WORD RO204 RODIME MODEL 204 * WORD CM5412 CMI 12 MBYTE DRIVE * WORD TSTDRV GENNED FOR SHORT TEST * * ADD NEW DRIVE PARAMETER TABLE ADDRESSES HERE * DRTBLZ EQU $-DRTBL-1 NUMBER OF DRIVE-1 * TITL TABLES - DRIVE PARAMETER TABLE *********************************** * * * DEFALT DRIVE PARAMETER TABLE * * MSUT BE KEPT CONTIGUOUS * * ********************************** * PRAMSX EQU $ * DISKX WORD XT1065 DEFAULT DRIVE PARAMETER TABLE ADDRESS * HCPX EQU $ MAXTOR 1065 PARAMETERS CYLX WORD :38B MAX CYL ADDR SCTORX WORD :F MAX SECTOR ADDR HEADX WORD 6 MAX HEAD ADDR INITBKX WORD :200 BYTES/SECTOR WORD 6 LOGICAL MAX HEAD ADDR WORD 0  LOGICAL MIN HEAD ADDR WORD 0 REDUCE WRITE CURRENT CYLINDER WORD 0 WRITE PRE-COMPENSATION EHCPX EQU $ END OF TABLE TITL TABLES - WORKING PARAMETER TABLE **************************************** * * * WORKING PARAMETER TABLE * * MUST BE KEPT IN ORDER * * *************************************** * PRAMS EQU $ WORKING PARAMETER TABLE * DISK WORD CM5412 DRIVE PARAMETER TABLE ADDRESS * HCP EQU $ MAXCYL WORD :38B MAX CYL ADDR MAXSCTOR WORD :F MAX SECTOR ADDR MAXHEAD WORD :6 MAX HEAD ADDR INITBK EQU $ WORKING INITIALIZATION BLOCK * WORD :200 BYTES PER SECTOR * WORD 6 LOGICAL MAX HEAD ADDR * WORD 0 LOGICAL MIN HEAD ADDR * WORD 0 REDUCE WRITE CURRENT CYL * WORD 0 WRITE PRE-COMPENSATION CYL EHCP EQU $ END OF TABLE * PRMSIZ EQU $-PRAMS SIZE OF TABLE TITL TABLE - CM5412 ************************************* * * * COMPUTER MEMORIES, INC. CM5412 * * DEFAULT DRIVE SELECTION * * TABLE MUST BE KEPT IN ORDER * * ************************************ * CM5412 EQU $ START OF TABLE * WORD :120 MAX CYLINDER ADDRESS * WORD :F MAX SECTOR ADDRESS * WORD :3 MAX HEAD ADDRESS * WORD :200 BYTES/SECTOR * WORD 3 LOGICAL MAX HEAD ADDR * WORD 0   LOGICAL MIN HEAD ADDR * WORD 0 REDUCE WRITE CURRENT CYL * WORD :0 WRITE PRE-COMPENSATION CYL * TITL TABLES - MAXTOR XT1065 TABLE ************************************ * * * MAXTOR XT1065 PARAMETER TABLE * * TABLE MUST BE KEPT IN ORDER * * *********************************** * XT1065 EQU $ * WORD :38B MAX CYLINDER ADDRESS * WORD :F MAX SECTOR ADDRESS * WORD :6 MAX HEAD ADDRESS * WORD :200 BYTES/SECTOR * WORD :6 LOGICAL MAX CYL ADDR * WORD 0 LOGICAL MIN HEAD ADDR * WORD 0 REDUCE WRITE CURRENT CYL * WORD 0 WRITE PRE-COMPENSATION CYL * TITL TABLE - MAXTOR XT1085 ************************************ * XT1085 EQU $ WORD :3F6 MAX CYL ADDR * WORD :F MAX SECTOR ADDR * WORD :7 MAX HEAD ADDR * WORD :200 BYTES/SECTOR * WORD 7 LOGICAL MAX HEAD ADDR * WORD 0 LOGICAL MIN HEAD ADDR * WORD 0 REDUCE WRITE CURRENT CYL * WORD 0  WRITE PRECOMPENSATION CYL * * TITL TABLE - MAXTOR XT1140 TABLE ************************************ * * * MAXTOR XT1140 DRIVE PARAMETER TABLE * * MUST BE KEPT IN ORDER * * *********************************** * XT1140 EQU $ START OF TABLE * WORD :38B MAX CYLINDER ADDRESS * WORD :F MAX SECTOR ADDRESS * WORD :E MAX HEAD ADDRESS * WORD :200 BYTES/SECTOR * WORD :E LOGICAL MAX HEAD ADDR * WORD 0 LOGICAL MIN HEAD ADDR * WORD 0 REDUCE WRITE CURRENT CYL * WORD 0 WRITE PRE-COMPENSATION CYL * TITL TABLE - RODIME RO204 TABLE *********************************** * * * RODIME RO204 DRIVE PARAMETER TABLE * * MUST BE KEPT IN ORDER * * *********************************** * RO204 EQU $ START OF TABLE * WORD :136 NUMBFR OF CYLINDFRS * WORD :F MAX SECTOR ADDRESS * WORD :7 MAX HEAD ADDRESS * WORD :200 BYTES/SECTOR * WORD 7 LOGICAL MAX HEAD ADDR * WORD 0 LOGICAL MIN HEAD ADDR * WORD 0 REDUCE WRITE CURRENT CYL * WORD 0 WRITE PRE-COMPENSATION CYL * * TITL ATASI AT-3046 TABLE ***************************************** * * * ATASI AT-3046 DRIVE PARAMETER TABLE * * MUST BE KEPT IN ORDER * * ***************************************** * AT3046 EQU $ START OF TABLE * WORD :283 MAX CYLINDER ADDRESS * WORD :F MAX SECTOR ADDRESS * WORD :6 MAX HEAD ADDRESS * WORD :200 BYTES/SECTOR * WORD 6 LOGICAL MAX HEAD ADDR * WORD 0 LOGICAL MIN HEAD ADDR * WORD 0 REDUCE WRITE CURRENT CYL * WORD 0 WRITE PRE-COMPENSATION CYL * **************************************** * * PREGENNED FOR SHORT DISK * * *************************************** * * TSTDRV EQU $ * WORD :30 MAX CYLINDER ADDRESS * WORD :F  MAX HEAD ADDRESS * WORD :4 MAX HEAD ADDRESS * WORD :200 SECTOR SIZE * WORD 4 LOGICAL MAX HEAD ADDR * WORD 0 LOGICAL MIN HEAD ADDR * WORD 0 REDUCE WRITE CURRENT CYL * WORD 0 WRITE PRE-COMPENSATION CYL * *  ADD NEW DRIVE PARAMETER TABLE HERE * * TITL QUERIES MESSAGES ***************************************** * * QURY'S MESSAGES * ***************************************** * BADTK1 BYTE ' HEAD ',:FF * BADTRK BYTE CR:,LF:,'BAD TRACKS: CYLINDER ',:FF * DEVMSG BYTE CR:,LF:,'DEVICE ADDRESS (:01-:1F[:14])?',:FF * * FSMSG BYTE CR:,LF:,'SELECT FUNCTION: DIAGNOSTIC,FORMATTER,TECH.' BYTE ' OR EXIT ([D],F,T,X)?',:FF * TFSMSG BYTE CR:,LF:,'SELECT FUNCTION: DIAGNOSTIC OR TECH. TESTS' BYTE ' ([D],T)?',:FF * PERS ELMS BYTE CR:,LF:,'SELECT PERIPHERAL: DISK OR TAPE ([D],T)?' BYTE :FF * NDMSG BYTE CR:,LF:,'DESTRUCTIVE MODE ([Y]/N)?',:FF * PAMTRMSG BYTE CR:,LF:,'ENTER INITIALIZATION PARAMETERS IN HEX',CR: BYTE LF:,:FF * * QRYD1 BYTE CR:,LF: BYTE CR:,LF:,' XT1065 - 0 MAXTOR 1065 DRIVE' BYTE CR:,LF:,' XT1085 - 1 MAXTOR 1085 DRIVE' BYTE CR:,LF:,' XT1140 - 2 MAXTOR 1140 DRIVE' BYTE CR:,LF:,' AT3046 - 3 ATASI 3046 DRIVE' BYTE CR:,LF:,' RO204 - 4 RODIME 204 DRIVE' BYTE CR:,LF:,' CM5412 - 5 COMPUTER MEMORIES 5412 DRIVE' BYTE CR:,LF:,' TEST - 6 CYL(:30),HDS(4) TECH ONLY ! ' * * ADD NEW DRIVE MESSAGES HERE * BYTE CR:,LF:,'USER DEFINE - 7' USER DEFINE BYTE CR:,LF:,'SELECT DISK DRIVE-TYPE ([0]-7)?',:FF * QRYK BYTE CR:,LF:  BYTE CR:,LF:,' 1. MAXIMUM CYLINDER ADDRESS' BYTE CR:,LF:,' 2. MAXIMUM SECTOR ADDRESS' BYTE CR:,LF:,' 3. MAXIMUM HEAD ADDRESS' BYTE CR:,LF:,' 4. BYTES/SECTOR' BYTE CR:,LF:,' 5. LOGICAL MAXIMUM HEAD ADDRESS' BYTE CR:,LF:,' 6. LOGICAL MINIMUM HEAD ADDRESS' BYTE CR:,LF:,' 7. REDUCE WRITE CURRENT CYLINDER' BYTE CR:,LF:,' 8. WRITE-PRECOMPENSATION CYLINDER' BYTE CR:,LF:,'ALL ENTRIES IN HEX AND IN ABOVE ORDER? ',:FF * QRYM1 BYTE CR:,LF:,'ANY BAD TRACKS FROM MANUFACTURER (Y/[N])?',:FF * QRYM2 BYTE CR:,LF:,'ENTER CYLINDER NUMBER (DECIMAL)',:FF * QRYM3 BYTE CR:,LF:,'ENTER HEAD NUMBER (DECIMAL)',:FF * QRYM4 BYTE CR:,LF:,'*** EXCESSIVE BAD TRACKS (MAX=150) ***',:FF * ROMSG BYTE CR:,LF:,'RUN OPTIONS ([:00]-:3F)?',:FF * USEMSG BYTE CR:,LF:,'SELECT DISK UNIT(S) ([0]-3)?',:FF * UPMSG BYTE CR:,LF:,'PATTERN (:0001-:FFFF[:6DB6])?',:FF * TSTMSG EQU $ (B022) BYTE CR:,LF: BYTE CR:,LF:,' TEST A - INITIALIZE' BYTE CR:,LF:,' TEST B - TEST I/O AND SEEK' BYTE CR:,LF:,'  TEST C - WRITE, READ & VERIFY 200 RANDOM SECTORS' BYTE CR:,LF:,' TEST D - WRITE, READ & VERIFY EVERY SECTOR' BYTE CR:,LF:,' TEST E - WRITE, READ & VERIFY SECTOR ZERO' BYTE CR:,LF:,' TEST F - WRITE, READ & VERIFY EVERY TRACK' BYTE CR:,LF:,' DISK TESTS [A,B,C,D,E,F]?',:FF * BYTE 'FC,U,C,H,S,IN,LN,DP,OP,CL,CP',CR:,LF:,:FF * SKMES BYTE CR:,LF:,'TEST B : LONG (ALL CYLS) OR SHORT (EVERY ' BYTE 'OTHER CYL) ([L]/S)?',:FF * PSIOMSG BYTE CR:,LF:,'TEST C : DO PARTIAL-SECTOR I/O (Y/[N])?',:FF * INTRLV BYTE CR:,LF:,'ENTER INTERLEAVE FACTOR [:0]?',:FF * TITLE BYTE CR:,LF:,'WIN/TAPE DIAGNOSTIC 84-96009 B023',CR:,LF:,CR:,LF: BYTE CR:,LF: BYTE 'THE CONTENTS HEREOF ARE PROPRIETARY',CR:,LF: BYTE 'TO COMPUTER AUTOMATION, INC. "CA"',CR:,LF: BYTE 'AND SHALL NOT BE REPRODUCED OR USED',CR:,LF: BYTE 'WITHOUT CA"S PRIOR WRITTEN CONSENT.',CR:,LF: BYTE CR:,LF:,'(C) COMPUTER AUTOMATION INC., 1985.' BYTE CR:,LF:,:FF * * * * NDBKMSG BYTE CR:,LF:,'NUMBER OF BLOCKS FOR TAPE TEST B (MUST' BYTE CR:,LF:,' NOT EXCEED TAPE CAPACITY) [:200]?',:FF * TTSTMSG EQU $ BYTE CR:,LF: BYTE CR:,LF:,' TEST A - SELECT, INITIALIZE, REWIND' BYTE CR:,LF:,' TEST B - BACKUP/RESTORE' BYTE CR:,LF:,' TEST C - WRITE DATA-FM-DATA-2 FMS, READ 3 FMS' BYTE CR:,LF:,' TEST D - WRITE DATA, FM; READ DATA, FM' BYTE CR:,LF:,' TEST E - ERASE TAPE, READ 1 BLOCK TO GET NO-DATA ERROR' BYTE CR:,LF:,' TEST F - WRITE INFINITE DATA, EXPECTS END-MEDIA ERROR' BYTE CR:,LF:,' TEST G - WRITE 4K DATA, REWIND, READ 4K, VERIFY' BYTE CR:,LF:,'TA PE TESTS (A,B,C,D,E,F,G)?',:FF * TTMSG BYTE CR:,LF:,'ENTER: ' TECH TEST QURY BYTE 'FC,U,C,H,S,IN,LN,DP,OP,CL,CP',CR:,LF:,'?',:FF TPTMSG BYTE CR:,LF: BYTE CR:,LF:,' 1 - BEGINNING OF TAPE' BYTE CR:,LF:,' 2 - READ STAUS' BYTE CR:,LF:,' 3 - TAPE-ONLY WRITE' BYTE CR:,LF:,' 4 - TAPE-ONLY READ' BYTE CR:,LF:,'ENTER TAPE-TECH FUNCTION (1,[2],3, OR 4)',:FF TPTMSG2 BYTE CR:,LF:,'TAPE TECH TEST RUNNING....',:FF * TITL TEST MESSAGES ********************************** * * TEST MESSAGES * ********************************** * FWREV BYTE CR:,LF:,'WTC UNDER TEST HAS FIRMAWRE REV LEVEL = ',:FF * ACTWD BYTE ' ACTUAL WORD: ',:FF * OPCD1 BYTE 'OPCODE:',:FF * ADRCYL BYTE ' CYL:',:FF ADRHD BYTE ' HEAD:',:FF ADRSEC BYTE ' SECT:',:FF * CRST BYTE CR:,LF:,'CONTROLLER STATUS:',:FF * DRST BYTE ' DRIVE STATUS:',:FF * EROACC BYTE CR:,LF:,'ACCUMULATED ERRORS: ',:FF * EROTMSG BYTE 'ERRORS IN THIS TEST: ',:FF * TOTLERR BYTE ' TOTAL ERRORS ALL TESTS: ',:FF * ERR BYTE CR:,LF:,'ERROR: ',:FF * ERRADD BYTE CR:,LF:,'ER AD: ',:FF * ERFOMG BYTE ' (FORMATTER)',:FF * EXWD BYTE CR:,LF:,'EXPECTED WORD: ',:FF * FORMDES BYTE CR:,LF:,'CANNOT SAVE DATA IN FORMATTING!',:FF * RETRY BYTE CR:,LF:,'**** RETRYING LAST OPERATION ****',:FF * FMTM BYTE CR:,LF:,'FORMATTING...',:FF * FMTM1 BYTE CR:,LF:,LF:,'DISK VERIFY IN PROGRESS...',:FF * CNTCYL BYTE CR:,LF:,'CURRENT CYLINDER (DECIMAL)',CR:,LF:,:FF * HD BYTE ' HEAD: ',:FF * HLTERR BYTE CR:,LF:,'ERROR, PRESS OPER. CNSL. RUN/STOP SW TWICE TO CONT.',:FF * LPMSG BYTE CR:,LF:,'LINE PRINTER TIMED OUT!!!' BYTE CR:,LF:,'GET PRINTER READY...' BYTE CR:,LF:,'KEY IN ANY CHAR TO RESUME...',CR:,LF:,:FF * NOEOB BYTE CR:,LF:,'NO EOB AFTER INITIALIZATION. ',:FF * NOGOOD BYTE CR:,LF:,'ERROR: FFFF UNIMPLEMENTED ERROR CODE',CR:,LF:,:FF * PASSMSG BYTE ' PASS ',:FF * STARS BYTE '****',:FF * SKERRO BYTE 'SEEK ERROR WITH NO ERROR REPORT YET !',CR:,LF:,:FF * BDTRKMP BYTE CR:,LF:,'*** BAD TRACK (DECIMAL) *** MAPPED TO ' BYTE '*** ALTERNATE TRACK (DECIMAL) ***',CR:,LF:,:FF * * * NULSTAT BYTE 'ERROR * - NO STATUS OR ZERO STATUS RETURNED',CR:,LF:,:FF * DIAGFAL BYTE CR:,LF:,' FAILURE - STATUS AS FOLLOWS',CR:,LF:,:FF * UNRDY BYTE 'ERROR * - UNIT NOT READY',CR:,LF:,:FF * RATE BYTE 'ERROR * - RATE ERROR',CR:,LF:,:FF * FAULT BYTE 'ERROR * - FAULT',CR:,LF:,:FF * RESERV BYTE 'ERROR * - RESERVED',CR:,LF:,:FF * NOID BYTE 'ERROR * - NO ID COMPARE',CR:,LF:,:FF * IDECC BYTE 'ERROR * - ID ECC ERROR',CR:,LF:,:FF * DATECC BYTE 'ERROR * - DATA ECC ERROR',CR:,LF:,:FF * SYNC BYTE 'ERROR * - SYNC ERROR',CR:,LF:,:FF * FMTERR BYTE 'ERROR * - FORMAT ERROR',CR:,LF:,:FF * SEEKE BYTE 'ERROR * - SEEK ERROR',CR:,LF:,:FF * OPCOM BYTE 'STATUS - OPERATION COMPLETE ',CR:,LF:,:FF * RESV1 BYTE 'ERROR * - RESERVED BIT',CR:,LF:,:FF * HARDP BYTE 'ERROR * - HARDWARE/PARAMETER ERROR',CR:,LF:,:FF * DIAGN BYTE 'ERROR * - CONTROLLER DIAGNOSTIC ERROR',CR:,LF:,:FF * ERROSUM BYTE 'ERROR SUMMARY',CR:,LF:,:FF * MISCOMP BYTE ' ERROR * - DATA MISCOMPARE',CR:,LF:,:FF * MISCOMP2 BYTE ' ERROR * - DATA MISCOMPARE AT CYL :',:FF MISCOMP3 BYTE ' HEAD :',:FF MISCOMP4 BYTE ' SECTOR :',:FF MISCOMP5 BYTE ' WORD :',:FF MISCOMP6 BYTE CR:,LF:,' EXPECTED :',:FF MISCOMP7 BYTE ' ACTUAL :',:FF * TSTA BYTE CR:,LF:,'TEST A - DISK INITIALIZATION ',CR:,LF:,:FF * TSTB BYTE CR:,LF:,'TES T B - TEST I/O AND SEEK',CR:,LF:,:FF * * TSTC BYTE CR:,LF:,'TEST C - WRITE/READ/VERIFY 200 RANDOM SECTORS' BYTE CR:,LF:,:FF * * TSTDMSG BYTE CR:,LF:,'TEST D - SECTOR WRITE/READ/VERIFY ENTIRE DISK' BYTE CR:,LF:,:FF * TSTEMSG BYTE CR:,LF:,'TEST E - DATA BLOCK COMPARE',CR:,LF:,:FF * TSTF BYTE CR:,LF:,'TEST F - TRACK READ/WRITE/VERIFY ENTIRE DISK' BYTE CR:,LF:,:FF * TSTFF BYTE CR:,LF:,:FF EMPTY TEST MES FOR FORMATTER * TSTA1M BYTE CR:,LF:,'INCORRECT CONTROLLER DEVICE ADDRESS',CR:,LF:,:FF * TSTA1M1 BYTE CR:,LF:,'CONTROLLER NOT READY',CR:,LF:,:FF * TSTA2M BYTE CR:,LF:,'INITIALIZATION COMPLETED',CR:,LF:,:FF * SMSGA1 BYTE CR:,LF:,'NON-DESTRUCTIVE MODE NOT POSSIBLE,' BYTE ' READ ORIGINAL DATA FAILED.',CR:,LF:,:FF * SMSGA2 BYTE CR:,LF:,'NON-DESTRUCTIVE MODE NOT POSSIBLE,' BYTE ' WRITE ORIGINAL DATA FAILED.',CR:,LF:,:FF * SMSGA3 BYTE CR:,LF:,'NON-DESTRUCTIVE MODE NOT POSSIBLE,' BYTE ' READ VERIFY ORIGINAL DATA FAILED.',CR:,LF:,:FF * SMGA4 BYTE 'CANNOT RUN NON-DESTRUCTIVE ON ' BYTE 'TEST D (SKIPPED)',CR:,LF:,:FF * TITL TAPE TEST MESSAGES *************************************************************** * * TAPE TEST MESSAGES * * ************************************************************ * TTSTA BYTE CR:,LF:,'TEST A - TAPE INTIALIZATION',CR:,LF:,:FF * TTSTB BYTE CR:,LF:,'TEST B - BACKUP/RESTORE TEST',CR:,LF: BYTE '*** TESTS THE FIRST DISK-UNIT SELECTED ONLY.',CR:,LF:,:FF * TTSTC BYTE CR:,LF:,'TEST C - READ/WRITE FILE MARK TEST',CR:,LF:,:FF * TTSTD BYTE CR:,LF:,'TEST D - READ/WRITE DATA BLOCK TEST',CR:,LF:,:FF * TTSTE BYTE CR:,LF:,'TEST E - CHECK FOR NO-DATA READ ERROR',CR:,LF:,:FF * TTSTF BYTE CR:,LF:,'TEST F - END OF MEDIA CHECK',CR:,LF:,:FF * TTSTG BYTE CR:,LF:,'TEST G - READ/WRITE DATA INTEGRITY CHECK',CR:,LF:,:FF * NOCAMSG BYTE CR:,LF:,'ERROR - NO CARTRIDGE IN SELECTED DRIVE',:FF * NODRMSG BYTE CR:,LF:,'ERROR - SELECTED DRIVE IS NOT PRESENT',:FF * WRPRMSG BYTE CR:,LF:,'ERROR - SELECTED DRIVE IS WRITE PROTECTED',:FF * ENDMMSG BYTE CR:,LF:,'ERROR - END OF MEDIA REACHED',:FF * RWABMSG BYTE CR:,LF:,'ERROR - READ OR WRITE ABORT',:FF * REBAMSG BYTE CR:,LF:,'ERROR - READ ERROR BAD BLOCK TRANSFER',:FF * REFIMSG BYTE CR:,LF:,'ERROR - FILLER BLOCK TRANSFER',:FF * RENOMSG BYTE CR:,LF:,'ERROR - READ ERROR, NO RECORDED DATA FOUND ',:FF * RENDMSG BYTE CR:,LF:,'ERROR - READ ERROR, NO DATA/END OF MEDIA ',:FF * RDFMMSG BYTE CR:,LF:,'A FILE MARK BLOCK WAS READ ',:FF BYTE CR:,CR:,CR:,CR:,CR:,CR:,CR:,:FF * ILLCMSG BYTE CR:,LF:,'ERROR - ILLEGAL COMMAND',:FF * POWEMSG BYTE CR:,LF:,'A POWER ON OR A RESET HAS OCCURED',:FF * MARGMSG BYTE CR:,LF:,'ERROR -MARGINAL DATA BLOCK DETECTED BY DEVICE',:FF * PASSF BYTE 'TEST F - PASSED END OF MEDIA REACHED',:FF * NODAT BYTE 'TESTE - FAILED TO GIVE NO DATA ERROR AFTER' BYTE 'READING ERASED TAPE',:FF * DECWD BYTE CR:,LF:,'  DATA ERROR COUNTER: ',:FF * EOT BYTE CR:,LF:,'END OF TEST',:FF * HLTADR BYTE CR:,LF:,'HALT ON ERROR; CALLER ADDR: ',:FF * IOBADR BYTE ' IOB ADDRESS: ',:FF * STWD BYTE ' TAPE STATUS WORD: ',:FF * TPASSMSG BYTE ' TAPE PASS NO.: ',:FF * URCWD BYTE '  UNDERRUN COUNTER: ',:FF * BYTE CR:,LF:,'GET LINE PRINTER READY...' BYTE CR:,LF:,'KEY IN ANY CHAR TO RESUME...',CR:,LF:,:FF * UNITMSG BYTE CR:,LF:,'UNIT: ',:FF * SELTP BYTE CR:,LF:,' ISSUING SELECT TAPE COMMAND ',:FF * INITP BYTE CR:,LF:,' IS SUING INITIALIZE TAPE COMMAND ',:FF * BOTMSG BYTE CR:,LF:,' ISSUING BEGINNING OF TAPE COMMAND ',:FF * RESTR BYTE CR:,LF:,' ISSUING RESTORE COMMAND ',:FF * BKPMSG BYTE CR:,LF:,' ISSUING BACKUP COMMAND ',:FF * RDFMK BYTE CR:,LF:,' EXPECTING 3 FILE MARKS (STATUS :0081)',CR:,LF:,:FF * RDFMK1 BYTE CR:,LF:,' EXPECTING ONE FILE MARK (STATUS :0081)',CR:,LF:,:FF * WRFMSG BYTE CR:,LF:,' ISSUING WRITE FILE MARK COMMAND ',:FF * WRDTBK BYTE CR:,LF:,' ISSUING WRITE DATA BLOCK COMMAND  ',:FF TITL CRT/TTY TRAP MESSAGES *********************************** * * TRAPS MESSAGES * *********************************** * INMSG BYTE CR:,LF:,LF:,'UNIMPLEMENTED INSTRUCTION TRAP',CR:,LF:,:FF * MEMSG BYTE CR:,LF:,LF:,'UNINSTALLED MEMORY TRAP',CR:,LF:,:FF * PFMSG BYTE CR:,LF:,LF:,'POWER FAIL',CR:,LF:,:FF * CHMSG BYTE CR:,LF:,LF:,'CHAR./NUM. EXCEPTION',CR:,LF:,:FF * STMSG BYTE CR:,LF:,LF:,'STACK OVERFLOW',CR:,LF:,:FF * USMSG BYTE CR:,LF:,LF:,'USER TRAP',CR:,LF:,:FF * SYMSG BYTE CR:,LF:,LF:,'SYSTEM TRAP',CR:,LF:,:FF * ARMSG BYTE CR:,LF:,LF:,'ARITHMETIC TRAP',CR:,LF:,:FF * END  JST CIOB 0905 A24E 08D4 2661 COPY =DIOB,X 0906 E291 0918 2662 COPY =UCUR,Y INDEX SOME TABLE 0907 8040 0000 2663 COPY 0(Y),A 0908 8481 0001 2664 COPY A,US(X)  2665 * 0909 0904 2666 COPY =RDDAT,A 090A 8480 0000 2667 COPY A,OP(X) 090B 835D 0DEL ERRORS.DOC CRE ERRORS.DOC AS UL=ERRORS.DOC MACRO WTC.ASM(L=) DAS UL PAUSE EDIT ERRORS.DOC 2 CHECK 4 ERRORS. DEL WTC.MAP CRE WTC.MAP AS LO=WTC.MAP LINK WTC.OBJ+SD/OS4/DEBUGS.OBJ(AB=4000,UL) AS LO=UC PAUSE DELETE OLD OS::.SYS? DEL OS::.SYS RENAME OS::.SYS=WTC.BIN T,A 0912 8487 0007 2675 COPY A,IN(X) 2676 * 00000913 2677 DOREAD EQU $ 09OVicEdDanoG@CNRVlX\`dh 忓5O 0pPE !  胷 D T D F T B C+x+u+r TG/Dh//q?W_6 ’N!⒠@Gkވx\ D T/y16 DM2{xwu D Tp>qj D;2>xavu D F T Xl(mf=vzX D{2`ttxAvu D Tp jjqj -d2]1Aߨ[tsrq11ك*1a-`1ڃߏߎO/k/l/m111 1*3]p⥿@kkrqn,p^Q  e``___^  1^Y 31 Y No1 j2Qj.Q 1 TPN LK IH=vi{ t4 s31Mߣ2 tko\ml(7pAjA\U WS/kO xC4B1Mr t:po=ml7pb'b1aZBX-#4*|1PY @ 5?31L vsqpoj7qi^1/ 2-u1Nߔ-u-rmlkjK7gb/vi w@As4M3K  o@Aߐkdcdja` \\/=X MN4?)1JH Ho7s;=8e cb `__]/ *+2T( Y NoEpB Ydbl`` A^ \Z XW UTz/j "#4]1 s "#fddb `_ ]\"^v w/x/q⤿t4mH1pox F Aj@ k7n4 _ÈQB@YX VU//q=i  wH5 Futsr L Smg pbE L _/X U&5*w$vu"s Y NnEhp@E N `/z/j D F TpP8T=6䀀 F+ ݞẁ֢ Z Aƀ BТ€ C͢ Dʢ EǢ FĢ+b6⿀@ID ùBk@r7S?6Aߜ+8T?6Aߋr/ K 2<c#//q  M &  uh9̿||V:LOS:`L!=4 G@ :7 4ji .xx@ @Rk 0[<<~8-11111113I$ #  9ݿ7  11@ @ k  UI @QB߃o] T Ā ,y2I @QBUD IQRϘRƝ›Ă ,ːC’Ă "  /1 o6{G 97 8¼AIǺp -@ f@k   Ā Ϟ///! "/fvJ I H Gl-  \ZTL̀JʀHǿd?;A:5 E.) #o6{:7 #m ➀@ X@k   RU1vC  >b {d7 ,^@ Y " BM6 h.往<%]w) 11 1ڇc܃+܂Ā ܄y2 o6{:!7 ֿK Ҁ@ ,@΄k  DŽĄÄ S R,߬J +߭| ^ߖ `@K+kߐw E!/!1S ;.i"p9n7j7 @f7`] `:1^7 Yo6Ңc^+Z|N@M  GN =0r$11 V Ā Ly2 P./NN⑀@ ]G? .-v2 r(m./':7  V :Ā8 7L )1 =6 E π@Ξ̿!˃ 6Ͽ7 @+@8ßR@k  ×N1G ,޿7i! /k/ r / l7ÿj7҃nlnj ❀@Ā  P1# 1y2?Hl܃d܂eLYId1OBM[ 1@ U M 5 ǃ2 1kĿ¾ . ‚‡#i#$@   ߣ@֥N;ĂA?3ÓčG8ߝ // / !/ /s B߅Z?  a] YPP J؞mk@  KV KQU;@ ǒIt+ ECwk)h`# ۘ B+zv m& B{h G v[)X@+ K|_  1@G)CF B+xpo// 6g8q@KQ@7.@X;72@7.@X;72@߄>XP* E  ւɇɿj6LJ  m ,  , OR, I, ), 濞 Y N , ݞ0/   1/j 1 11 z z_i d ,  , ,,,+,-,.NJ, F, B=, 9,, ^ N ރus" ㇫j1A n1  ) ) ), )   †  "# e :  x ޣއ ݞ܇܃܇҃ۇփڇ]ه_؇؞ + - .قʿX"$Ğ !AII:;C E= 忭翬QM~Pq 6tGhwB{b  11111 -= 4 N ,,{, yw6Ăӂ)6Ăο̟hB   @D x88̿9 ^: @yt8 s@oj8 i@e`8 @[V8 @LG8 @B=8 @839 ̀ @@*%9 @9% @힂92 @ߞ9N @ @˞9[ @9n ߏO6ÿ7  /j/ @ @ AkjAfeZAa`A\[@ T6BAzy [H7*D7. ( ):7267727<.7G^2 J+UǢ9*m9%h9 c 9 ^9Z9)SV// //⧿v51ox G Aj×QG@ kߑkËQB@ZY WV TS///j=vi y B+z o>5Ŀ1kjr6pof/^ T ۇۿۿۿ۞~ڞ!:`׿׿=̿Կ 0EB̀ ^ Aԣƀ B€ C D E F G+^6@ID ×Bk@ r7S?6C<֟߄3// =4/p )/ |:hv:Les=;n=Oj=chB, \o6{[; Y=curU= 1h/N0=˿I,=cHE(=wjj hi愇c_b01 ;5=c*'  п=߿ο=˿¿ ƿ=߿Ŀ=˿ =˿=c=M ;I=c=߃=˿=c==c=Z0 /l@B/,/Q q;]o=cvso jqk ¿`B!@ `h ③ qVi/e vvvt @qIGmg:i" "q0R%m ~ ƈ‰+Uu: 5553 qIG*m  `qIGpm @ x@      qIG 0ႏA ~8-J! ; <4 $qIG0jl& ` !qIGt0rRk> BEA@ ߑ?;<<@ @/p /*t/ @u#;s <@ppo @/ p`;¿^ <@[[Z @o/M xK;ؿI<@FFE @/R6x;4u<@110 @/= |!c;`<@ @/) z O< L<@ @/ߏ;<8<@ @/*t/u!<2s<@pp @/{ _ 6=>>>)>3>;>D>O>Pm m<KABCDEFABCDEFABCDEFGABCDEFG? 1112 21211 60 HEAD BAD TRACKS: CYLINDER DEVICE ADDRESS (:01-:1F[:14])? SELECT FUNCTION: DIAGNOSTIC,FORMATTER,TECH. OR EXIT ([D],F,T,X)? SELECT FUNCTION: DIAGNOSTIC OR TECH . TESTS ([D],T)? SELECT PERIPHERAL: DISK OR TAPE ([D],T)? DESTRUCTIVE MODE ([Y]/N)? ENTER INITIALIZATION PARAMETERS IN HEX XT1065 - 0 MAXTOR 1065 DRIVE XT1085 - 1 MAXTOR 1085 DRIVE XT1140 - 2 MAXTOR 1140 DRIVE AT3046 - 3 ATASI 3046 DRIVE RO204 - 4 RODIME 204 DRIVE CM5412 - 5 COMPUTER MEMORIES 5412 DRIVE TEST -  6 CYL(:30),HDS(4) TECH ONLY ! USER DEFINE - 7 SELECT DISK DRIVE-TYPE ([0]-7)? 1. MAXIMUM CYLINDER ADDRESS 2. MAXIMUM SECTOR ADDRESS 3. MAXIMUM HEAD ADDRESS 4. BYTES/SECTOR 5. LOGICAL MAXIMUM HEAD ADDRESS 6. LOGICAL MINIMUM HEAD ADDRESS 7. REDUCE WRITE CURRENT CYLINDER 8. WRITE-PRECOMPENSATION CYLINDER ALL ENTRIES IN HEX AND IN ABOVE ORDER? ANY BAD TRACKS FROM MANUFACTURER (Y/[N])? ENTER CYLINDER NUMBER (DECIMAL) ENTER HEAD NUMBER (DECIMAL) *** EXCESSIVE BAD TRACKS (MAX=150) *** RUN OPTIONS ([:00]-:3F)? SELECT DISK UNIT(S) ([0]-3)? PATTERN (:0001-:FFFF[:6DB6])? TEST A - INITIALIZE TEST B - TEST I/O AND SEEK TEST C - WRITE, READ & VERIFY 200 RANDOM SECTORS TEST D - WRITE, READ & VERIFY EVERY SECTOR TEST E - WRITE, READ & VERIFY SECTOR ZERO TEST F - WRITE, READ & VERIFY EVERY TRACK DISK TESTS [A,B,C,D,E,F]? FC,U,C,H,S,IN,LN,DP,OP,CL,CP TEST B : LONG (ALL CYLS) OR SHORT (EVERY OTHER CYL) ([L]/S)? TEST C : DO PARTIAL-SECTOR I/O (Y/[N])? ENTER INTERLEAVE FACTOR [:0]? WIN/TAPE DIAGNOSTIC 84-96009 B023 THE CONTENTS HEREOF ARE PROPRIETARY TO COMPUTER AUTOMATION, INC. "CA" AND SHALL NOT BE REPRODUCED OR USED WITHOUT CA"S PRIOR WRITTEN CONSENT. (C) COMPUTER AUTOMATION INC., 1985. NUMBER OF BLOCKS FOR TAPE TEST B (MUST NOT EXCEED TAPE CAPACITY) [:200]? TEST A - SELECT, INITIALIZE, REWIND TEST B - BACKUP/RESTORE TEST C - WRITE DATA-FM-DATA-2 FMS, READ 3 FMS TEST D - WRITE DATA, FM; READ DATA, FM TEST E - ERASE TAPE, READ 1 BLOCK TO GET NO-DATA ERRO TEST F - WRITE INFINITE DATA, EXPECTS END-MEDIA ERROR TEST G - WRITE 4K DATA, REWIND, READ 4K, VERIFY TAPE TESTS (A,B,C,D,E,F,G)? ENTER: FC,U,C,H,S,IN,LN,DP,OP,CL,CP ? 1 - BEGINNING OF TAPE 2 - READ STAUS 3 - TAPE-ONLY WRITE 4 - TAPE-ONLY READ ENTER TAPE-TECH FUNCTION (1,[2],3, OR 4) TAPE TECH TEST RUNNING.... WTC UNDER TEST HAS FIRMAWRE REV LEVEL = ACTUAL WORD: OPCODE: CYL:  HEAD: SECT: CONTROLLER STATUS: DRIVE STATUS: ACCUMULATED ERRORS: ERRORS IN THIS TEST: TOTAL ERRORS ALL TESTS: ERROR: ER AD: (FORMATTER) EXPECTED WORD: CANNOT SAVE DATA IN FORMATTING! **** RETRYING LAST OPERATION **** FORMATTING... DISK VERIFY IN PROGRESS... CURRENT CYLINDER (DECIMAL) HEAD: ERROR, PRESS OPER. CNSL. RUN/STOP SW TWICE TO CONT. LINE PRINTER TIMED OUT!!! GET PRINTER READY... KEY IN ANY CHAR TO RESUME... NO EOB AFTER INITIALIZATION. ERROR: FFFF UNIMPLEMENTED ERROR CODE PASS **** SEEK ERROR WITH NO ERROR REPORT YET ! *** BAD TRACK (DECIMAL) *** MAPPED TO *** ALTERNATE TRACK (DECIMAL) *** ERROR * - NO STATUS OR ZERO STATUS RETURNED  FAILURE - STATUS AS FOLLOWS ERROR * - UNIT NOT READY ERROR * - RATE ERROR ERROR * - FAULT ERROR * - RESERVED ERR OR * - NO ID COMPARE ERROR * - ID ECC ERROR ERROR * - DATA ECC ERROR ERROR * - SYNC ERROR ERROR * - FORMAT ERROR ERROR * - SEEK ERROR STATUS - OPERATION COMPLETE ERROR * - RESERVED BIT ERROR * - HARDWARE/PARAMETER ERROR ERROR * - CONTROLLER DIAGNOSTIC ERROR ERROR SUMMARY ERROR * - DATA MISCOMPARE ERROR * - DATA MISCOMPARE AT CYL : HEAD : SECTOR : WORD : EXPECTED : ACTUAL : TEST A - DISK INITIALIZATION TEST B - TEST I/O AND SEEK TEST C - WRITE/READ/VERIFY 200 RANDOM SECTORS TEST D - SECTOR WRITE/READ/VERIFY ENTIRE DISK TEST E - DATA BLOCK COMPARE TEST F - TRACK READ/WRITE/VERIFY ENTIRE DISK INCORRECT CONTROLLER DEVICE ADDRESS CONTROLLER NOT READY INITIALIZATION COMPLETED NON-DESTRUCTIVE MODE NOT POSSIBLE, READ ORIGINAL DATA FAILED. NON-DESTRUCTIVE MODE NOT POSSIBLE, WRITE ORIGINAL DATA FAILED. NON-DESTRUCTIVE MODE NOT POSSIBLE, READ VERIFY ORIGINAL DATA FAILED. CANNOT RUN NON-DESTRUCTIVE ON TEST D (SKIPPED) TEST A - TAPE INTIALIZATION TEST B - BACKUP/RESTORE TEST *** TESTS THE FIRST DISK-UNIT SELECTED ONLY. TEST C - READ/WRITE FILE MARK TEST TEST D - READ/WRITE DATA BLOCK TEST TEST E - CHECK FOR NO-DATA READ ERROR  TEST F - END OF MEDIA CHECK TEST G - READ/WRITE DATA INTEGRITY CHECK ERROR - NO CARTRIDGE IN SELECTED DRIVE ERROR - SELECTED DRIVE IS NOT PRESENT ERROR - SELECTED DRIVE IS WRITE PROTECTED ERROR - END OF MEDIA REACHED ERROR - READ OR WRITE ABORT ERROR - READ ERROR BAD BLOCK TRANSFER ERROR - FILLER BLOCK TRANSFER ERROR - READ ERROR, NO RECORDED DATA FOUND  ERROR - READ ERROR, NO DATA/END OF MEDIA A FILE MARK BLOCK WAS READ ERROR - ILLEGAL COMMAND A POWER ON OR A RESET HAS OCCURED ERROR -MARGINAL DATA BLOCK DETECTED BY DEVICETEST F - PASSED END OF MEDIA REACHED TESTE - FAILED TO GIVE NO DATA ERROR AFTERREADING ERASED TAPE DATA ERROR COUNTER: END OF TEST HALT ON ERROR; CALLER ADDR: IOB ADDRESS: TAPE STATUS WORD: TAPE PASS NO.: UNDERRUN COUNTER: GET LINE PRINTER READY... KEY IN ANY CHAR TO RESUME... UNIT: ISSUING SELECT TAPE COMMAND ISSUING INITIALIZE TAPE COMMAND ISSUING BEGINNING OF TAPE COMMAND ISSUING RESTORE COMMAND ISSUING BACKUP COMMAND EXPECTING 3 FILE MARKS (STATUS :0081) EXPECTING ONE FILE MARK (STATUS :0081) ISSUING WRITE FILE MARK COMMAND ISSUING WRITE DATA BLOCK COMMAND  UNIMPLEMENTED INSTRUCTION TRAP UNINSTALLED MEMORY TRAP POWER FAIL CHAR./NUM. EXCEPTION STACK OVERFLOW  USER TRAP SYSTEM TRAP ARITHMETIC TRAP "@ ~֞8O]&Ea3x_|l*| }~gҡ# A `Q T ( :ӂ< - :ӂ" )   pP0 @0B բ` h } c= ¢‚pP0/o X)C $ `)C ")PC ")C " `m D E B U G 4 E 8 0 0 ӟe } ӂzӾ P AC Q@ X= Y:ԽѾ K3 L0 S- D* C' ԟK =ӟ{ } ӟ| @)C ")PC ")C " `r" *ٽ҆ Y Q A Gҽ؆ R Ƥ D V Wƚ›LBLCLFLLLSLJLILGLRLZߝ Ǟ< !}҆{҆u łt P Lłj T P BŁ P ӂY T H TŅ Ğ|QEF , , `솂՟ _ٞ0 6} ` J B YK QJfւ cޡ @ޟޝ `@E ;߽RA@EN@Aޏǎ Qފ ,^:FB& o*| x` D `랞oY*Qd Ѐ_Ѐ āZ@AĄ܃T B `ǁ D임*L_U3 `Ģ1*/) 'r "Bƽу۽ֽˁC凑ā / XŃ ѽ۞i Ğ]с䆫@ڃ۽ցBǢ ,ž[ + - * X /KJƎ^[{ xނZ ,ş| ֽL ΁ P ޽с۽۽޺{ ӽўq kɆȂGާ}yޠ}y E ~  .Ӄ E ~  .ޣރfN ,Žֆs@FC kqLL (w{u ^|JQBZy L S TўNM  Isľˆ_]]| IƎ> ,ŽƇ ,ƂpIưk , ,Htr Hm -ņց -ņ('\\ÂF -tтڃԞx ’@"Fz@ Ό F ō l#䆠.bƝޙޖJQ!’ފދJQĽ %ӂԞu U B * ӂGo h fe "cIaM K Y&V&RR `QKL$kK N =ӂDD GӂA   :Ӟ ӟL ӟ{ y9u    :ӂw @0ƵQ¾ˢ̂C C 96C C " z a ࢜0 `a ´C /6 C C 6 C C 6C h Q¾{”C "C C I6 qj D;2>xa vu D F T Xl( mf=vzX D {2`ttxAvu D Tp jjqj - d2]1Aߨ[tsrq 11ك* 1a-` 1ڃߏߎO/k/l/m 111 1*3] p⥿@kkr qn,p^Q  e``___^   1^Y 3 1 Y N o1 j2Qj.Q  1  TPN LK IH=vi{ t4 s31M2  tko\ml(7p AjA \U WS/kO xC4B1Mr  t:po=ml7 pb'b1aZBX-#4*|1PY t  5?31L v sqpoj7qi^ 1/  2-u1Nߔ -u-rmlk jK7gb/v i w@As4M 3K o@Aߐ kdcdja`  \\/=X MN 4?)1JH H o7s;=8e c b `__]/ *+2 T( Y N oEpB Ydb l`` A^ \Z XW UTz/j "# 4]1 s " #fddb  `_ ]\"^v  w/x/q⤿t4mH 1pox F Aj @ k7n4 _ÈQB @YX VU//q=i   wH5 Fut sr L Smg p bE L _/X  U&5*w$vu"s Y NnEhp@E N `/z/j D F TpP 8T=6䀀 F+ ݞẁ֢ Z A ƀ BТ€ C͢ D EǢ FĢ+b 6⿀@ID ùB k@r7S ?6Aߜ+8T ?6Aߋr / K 2 <c#//q  M &  uh9̿ || V:LOS:`L!=4  G@  :7 4j i .xx@  @Rk   0[<<~8-11 111113 I$ #  9ݿ7  11@  @ k   UI @QB߃ o]  T  Ā ,y 2I @QBU D IQRϘRƝ ›Ă ,ːCƒ’Ă "  /1  o6{ G 97 8¼ AIǺp -  @ f@k    Ā  Ϟ/ //! " /fvJ I H Gl-    \ZTL̀ JʀHǿd?;A: 5 E.)  #o6{:7  #m ➀@ X@k    RU 1vC  >b { d7 ,^@  Y  "  BM6  h. <%]w)  11  1ڇc܃+܂ Ā ܄y 2 o6{:!7  ֿK Ҁ@ ,@΄ k  DŽĄ Ä S R, ߬J  +߭| ^ ߖ ` @K+kߐw E !/!1S  ;.i"p9n7j 7 @f7`] `:1^ 7 Yo6Ңc^ +Z|N@M   GN  = 0r $11 V Ā  Ly2 P./N N⑀@ ]G ? . -v2 r( m./':7  V : Ā8 7L )1  =6 E π@Ξ ̿!˃ 6Ͽ7 @+ @8ßR @k   ×N1G  ,޿7 i! /k/ r  / l7ÿj7 nlnj ❀@   P 1# 1y2 ?Hl ܃d܂eL YId1 OBM[ 1t U M 5 ǃ2 1kĿ¾  . ‚‡#i#$ @    ߣ @֥N;ĂA? 3ÓčG8ߝ  // / !/ / s B߅Z?  a] Y PP J؞mkt  KV KQU ;@ ǒIt+  ECwk)h`#   B+zv  m& B{h  G v[) X@+ K|_   1@G)CF B+xpo// 6 g8q@KQ@7.@ X;72@ 7.@X; 72@߄>XP * E   ւɇɿj6LJ  m ,   ,  OR,  I,  ), 濞 Y N , ݞ0/    1/j 1 11  z z_i d  ,  ,  ,,,+,-,.N J, F, B =, 9,, ^ N  ރu s" ㇫j1A  n1  ) ) ), )   †  " # e  :   x ޣ އ ݞ܇܃܇҃ۇ ڇ]ه_؇؞ + - .قʿX"$ Ğ !AI I:;C E = 忭翬QM~Pq  6tGhw B{b    11111  -= 4 N ,,{, yw 6Ăӂ)6Ă ̟h     @D  x88 ̿9 ^:  @yt8 s @oj8 i@ e`8 @ [V8 @ LG8 @ B=8 @8 39 ̀ @@ *%9 @ 9% @힂 92 @ 9N @ @˞9[  @9n ߏ O6ÿ7   /j/ @  @  AkjAfeZ Aa`A\[@  T6BAzy [H7* D7. ( ):72 67727<.7G ^2 J +UǢ9*m 9%h9 c 9  ^9Z9) SV// / /⧿v51o x G Aj×QG@ k ߑkËQB@ZY WV TS///j=vi y  B+z o>5 1kjr6pof /^ T ۇۿۿۿ ~ڞ!:`׿=̿ 0EB̀ ^ Aԣƀ B€ C D E F G+^6@ID ×Bk@ r 7S?6C<֟߄3 // =4 /p )/  |:hv:Le s=;n=Oj=c hB, \o6{ [; Y=curU=   1 h/N0=˿I, =cHE(=wjj hi 愇c_b0 1 ;5=c*'   п=߿ο= ¿ ƿ=߿Ŀ=˿  =˿=c= M ;I=c =߃=˿ =c==c =Z0 /l@B/,/Q  q;]o=cvso j qk ¿`B!@`  ③ q V i/e vvv t @qIGm g:i"  "q0R% m ~  ƈ‰+Uu:  5553 qIG *m   `qIG pm @  x@      qI G 0ႏA ~8-J ! ; <4  $qIG0j l& ` !qIGt0rR k> B EA@ ߑ? ;<<@ @ /p /*t/ @u#;s <@pp o @  / p` ;¿^ <@[[Z  @o/M xK;ؿI <@FFE @ /R6x;4u<@ 110 @/= |!c;`<@  @/) z O < L<@ @ /ߏ;<8< @ @/* t/u!<2s <@pp @ /{ _ 6=>>>)>3>;>D>O>Pmmmm0 ABCDE FABCDEF   ABCDEFG ABCDEFG? 1112 21 211     6 0 HEAD BAD TR ACKS: CYLINDER DE VICE ADDRESS (:01-:1F[:1 4])? SELECT FUNCTION: DIAGNOSTIC,FORMATTER,TE CH. OR EXIT ([D],F,T,X) ? SELECT FUNCTION: DIA GNOSTIC OR TECH. TESTS ( [D],T)? SELECT PERIPHE RAL: DISK OR TAPE ([D],T )? DESTRUCTIVE MODE ( [Y]/N)? ENTER INITIALI ZATION PARAMETERS IN HEX XT1065 - 0  MAXTOR 1065 DRIVE  XT1085 - 1 MAXTOR 1 085 DRIVE XT1! 140 - 2 MAXTOR 1140 DRIVE  AT3046 - 3 ATAS I 3046 DRIVE RO204  - 4 RODIME 204 DRIVE CM5412 - 5 COMP UTER MEMORIES 5412 DRIVE TEST - 6 CYL( :30),HDS(4) TECH ONLY !  USER DEFINE - 7 SELE CT DISK DRIVE-TYPE ([0]- 7)? 1. MAXIMUM CY LINDER ADDRESS 2. MA XIMUM SECTOR ADDRESS  3. MAXIMUM HEAD ADDRESS 4. BYTES/SECTOR  5. LOGICAL MAXIMUM HEAD ADDRESS 6. LOGICAL  MINIMUM HEAD ADDRESS  7. REDUCE WRITE CURRENT CYLINDER 8. WRITE- PRECOMPENSATION CYLINDER ALL ENTRIES IN HEX AND IN ABOVE ORDER? ANY  BAD TRACKS FROM MANUFACT URER (Y/[N])? ENTER CY LINDER NUMBER (DECIMAL) ENTER HEAD NUMBER (DEC IMAL) *** EXCESSIVE BA D T. WTC ASMWTC JCLWTC BINWTC OBJe860226141700860226141700860110113919e@860226141700860226141700860110113918" e860226141700860226141700860226141700e860226141700860226141700860226141700860226141700860226141700860226141700eN860226151423860218155145860226151540e 860226152026851212100502860226152027e*Sd860226152303860219081903860226152313 e# 6860226152408860226152416860226152416$ % & ' ( ) * +  TITL NM-4 WINCHESTER/TAPE CNTRL. DIAGNOSTIC/FORMATTER 84-96009-10 B023 * * * * * WINCHESTER/TAPE CONTROLLER * *  DIAGNOSTIC/FORMATTER * * 84-96009-10 B023 * * * * * THE CONTENTS HEREOF ARE PROPRIETARY * TO COMPUTER AUTOMATION, INC. ("CA") * AND SHALL NOT BE REPRODUCED OR USED * WITHOUT CA'S PRIOR WRITTEN CONSENT. * * (C) COMPUTER AUTOMATION, INC. 1985. * * * * TITL REVISION HISTORY *********************************** * * REVISION HISTORY * *********************************** * * * REVISION ISSUE DATE COMMENTS * -------- ---------- -------- * * B023 18/FEB/86 FIXED BUG IN 'SAVEW' & 'RETSTAT'. * MARK HAYES. * * B022 12/DEC/85 EXPANDED DISK-TEST QUERY TO EXPLAIN WHAT * EACH TEST DOES. * MARK HAYES * * B021 14/OCT/85 RANDOM # GENERATOR ROUTINE ('PREP') NOW * CHECKS TO MAKE SURE THE NEW HEAD NUMBER IS * NOT LESS THAN THE LOGICAL MINIMUM HEAD. * FIXED RELATED BUG IN DISK TEST F. * MARK HAYES. * * B020 11 OCT 85 TESTS WERE USING HEAD #'S GREATER THAN THE *  LOGICAL MAXIMUM HEAD #. * MARK HAYES * * B010 30 SEP 85 ENHANCED ERROR CHECKING ON DISK TEST F. * REPORTS CYL, HEAD, & SECTOR OF DATA MISCOMPARE. * M, ARK HAYES. * * B000 22 AUG 85 BUMP REV TO B000. NO CODE CHANGES. * MARK HAYES * * A909  20 AUG 85 CAN NOW FORMAT & DO BACKUP/RESTORES ON * LOGICAL HEADS. (LOGICAL HEADS ARE ANY GROUP *  OF 1 OR MORE CONTIGUOUS, PHYSICAL HEADS). * MARK HAYES * * A908 19 AUG 85 ADDED MAX/MIN LOGICAL HEAD PARAMETERS TO THE * DISK INITIALIZE COMMANDS. *  INITIALIZE COMMAND FOR THE DISK TECH TEST * WAS COMPLETELY SCREWED UP. * MARK HAYES * * A907 16 AUG 85 DISK TEST D & F NOW VERIFY THE DATA. * DISK TEST C NOW DOES PARTIAL-SECTOR I/O. * MARK HAYES. * * A906 15 AUG 85 DISK TEST C NOW VERIFIES THE DATA. *  MARK HAYES. * * A905 12 AUG 85 ADDED TAPE TECH TEST. MARK HAYES. * * A904 09 AUG 85 DURING FORMAT-CHECK (VERIFY), MAXCYL WAS * POINTING AT MAX PHYSICAL CYL INSTEAD OF MAX *  LOGICAL CYL. * MARK HAYES * * A903 08 AUG 85 FIXED ASSORTED BUGS IN FORMATTER AND IN THE * DISK TEST SELECT QUERY. * MARK HAYES * * A902 06 AUG 85 TAPE TEST E (ERASE TAPE) WAS COMPLETELY * SCREWED UP. NOW WORKING. * ADDED QUERY TO SELECT A LONG OR SHORT * VERSION OF DISK TEST B. (SEEK) * CAN NOW RUN FORMATTER CONTINUOUSLY. * MARK HAYES * * A901 06 AUG 85 FIXED PROBLEM WITH 'ERROR' :A00E SHOWING UP *  ON TAPE TESTS C,D,E,F. * BLOCK COUNT IS NOW USER-SELECTABLE FOR TAPE *  TEST B - BACKUP/RESTORE. * MARK HAYES. * * A900 26 JUN 85 BEFORE DOING ANY DIAGNOSTIC TESTS ON * EITHER THE DISK OR THE TAPE, INITIAL- * IZE THE DISK (TESTA) JUST ONCE INSTEAD * OF ON EVERY PASS. * FIXED PASS COUNTER ON TAPE SIDE. *  MARK HAYES. * * A800 02 MAY 85 ALWAYS DO TEST A ON THE DISK SIDE. * ADDED DISK-TESTA TO THE TAPE SIDE. * FIXED DISK-INITIALIZE TABLE PARAM- * TERS. * MARK HAYES. * * A700 25 APR 85 ADDED DRIVE SELECT QUERY TO THE *  TAPE SIDE. * MARK HAYES. * * A600 24 APR 85 FIXED TAPE TEST B. * UNIT # IN THE CIOB WAS MESSED UP. * EXTENDED SIOB FROM 12 TO 15 WORDS. * MARK HAYES * * A500 22 APR 85 FIXED UNIT DISPLAY ON FORMAT TEST. * CAN NOW DO TAPE TESTB TO ANY UNIT, * NOT JUST UNIT 0. * MARK HAYES. * * A400 14 MAR 85 CHANGED OPCODE FOR THE CHECK FORMAT * ROUTINE FROM READ-DATE TO READ- * VERIFY. * -  MARK HAYES. * * A300 11 MAR 85 FIXED PROBLEM WITH RUNNING MUL- * TIPLE TESTS CONTINUOUSLY. * MARK HAYES. * * A200 13 FEB 85 ADD DECIMAL CYL, TO ERROR *  REPORT, BOT AT START OF TEST * FIX DATA PATTERN QUERY * ADD DISK TEST F * ADD TEST A F/W REV MSG * BY BRIAN BENNETT * * A100 10 JAN 85 FIXES AND ENHANCEMENTS * BY BRIAN BENNETT * * A000 20 NOV 84 ORIGINAL RELEASE *  BY BRIAN BENNETT * * * REV: EQU 'A9' LATEST REVISION TITL LINKER INFORMATION * * EXTR DEBUG4 LINK TO DEBUG NAM G:0 LINK ADDRESS * * OPTIONS +:000A OPTIONS -:1000 OBJNOTE ' *** WTC DIAG/FORMATER *** - REV. ',REV:%-8,REV:&:FF TITL EQUATES *********************************** * * EQUATES * *********************************** * * CIOB EQUATES * OP EQU 0 OP CODE, CIOB US EQU 1 UNIT SELECT CS EQU 2 CYLINDER SELECT HS EQU 3 HEAD SELECT SSS EQU 4 SECTOR SELECT WC EQU 5 TRANSFER WORD COUNT MA EQU 6 MEMORY(BUFFER) ADDRESS (BIT 15 MUST BE 0) IN EQU 7 INTERRUPT LOCATION (BIT 15 MUST BE 0) NB EQU 8 NEXT IOB ADDRESS WP EQU 9 WORD PROCESSED CST EQU 10 CONTROLLER STATUS DST EQU 11 DRIVE STATUS * TST1 EQU 12 TAPE STATUS BYTE 0 AND 1 TST3 EQU 13 TAPE STATUS BYTE 2 AND 3 TST5 EQU 14 TAPE STATUS BYTE 4 AND 5 * DATA CHAIN IOB EQUATES * * DCWC EQU 0 TRANSFER WORD COUNT DCMA EQU 1 MEMORY ADDRESS( BIT 15 MUST BE 0) DCRS EQU 2 RESERVED DCAD EQU 3 DATA CHAIN IOB ADDRESS * TITL OP-CODE EQUATES ************************************************** * * OP CODE EQUATES * ******************************************** * * TIO EQU :0 TEST I/O FRMT EQU :1 FORMAT WRTDAT EQU :2 WRITE DATA RDDAT EQU :4 READ DATA RDVER EQU :8 READ VERIFY SEEK EQU :9 SEEK ONLY INIT EQU :A INITIALIZE BACKUP EQU :C DISK TO TAPE BACKUP DISKCOPY EQU :B DISK TO DISK COPY RESTOR EQU :D TAPE TO DISK COPY TAPEONLY EQU :E TAPE ONLY OPERATIONS DIAGNOST EQU :F DIAGNOSTIC OPERATION * TITL SUB OP-CODE EQUATES **************************************************** * * SUB OP-CODE EQUATES * **************************************** * * TAPE ONLY * SELTAPE1 EQU :01 SELTAPE2 EQU :02 SELTAPE3 EQU :03 SELTAPE4 EQU :04 POSBOOT EQU :21 POSITION THE TAPE TO BEGINING TERASE EQU :22 TAPE ERASE COMMAND TINITIL EQU :24 TAPE INITILIZATION COMMAND TWRITE EQU :40 TAPE WRITE COMMAND TWRFM EQU :60 TAPE WRITE FILE MARK COMMAND TREAD EQU :80 TAPE READ COMMAND TRDFM EQU :A0 TAPE READ FILE MARK COMMAND TRDST EQU :C0 TAPE READ STATUS COMMAND ********************************************************************* * * * FORMAT SUB-OPCODE EQUATES * FMAB EQU :04 FORMAT ALL BLOCKS WITH ID AND DATA FIELDS FMCK EQU :05 CHECK FORMAT ON SPECIFICED TRACK FOR CORRECT ID AND INTERLEVE FMCF EQU :06 FORMAT SPECIFICED TRACK WITH ALL FLAGS CLEARED FMAL EQU :07 FORMAT BAD TRACK AND ASSIGN ALTERNATE * * *********************************************************************** * * DIAGNOSTIC SUB-OPCODE EQUATES * DUBUF EQU :00 DUMP BUFFER TO HOST DUSCR EQU :01 DUMP SCRATCH RAM TO HOST RAMTE EQU :02 ON BOARD R/W MEMORY TEST FWSUB EQU :03 RETURN F/W REVISION LEVEL IN DRIVE STATUS * **********************************. ************************************ * * DISK DIAGNOSTIC OPCODE EQUATES * DRWV EQU :000C DESTRUCTIVE WRITE AND READ VERIFY NDRWV EQU :010C NON-DESTRUCTIVE WRITE AND READ VERIFY DRV EQU :020C DIAGNOSTIC READ VERIFY DWO EQU :030C DESTRUCTIVE WRITE ONLY NDW EQU :040C NON-DESTRUCTIVE WRITE DSKO EQU :050C DIAGNOSTIC SEEK ONLY STR EQU :070C STATUS REPORT * TITL TAPE EQUATES TABLE ********************************************************** * * * TAPE EQUATES TABLE * * *************************************************** * NOCA EQU :00C0 NO CARTRIDGE IN THE DRIVE NOCAMASK EQU :FFEF NO CARTRIDGE MASK NODR EQU :00F0 NO DRIVE NODRMASK EQU :FFFF NO DRIVE MASK WRPR EQU :0090 WRITE PROTECT WRPRMASK EQU :6FFF PROTECT MASK ENDM EQU :0088 END OF MEDIA ENDMMASK EQU :FFFF RWAB EQU :9084 READ OR WRITE ABORT RWABMASK EQU :FFEF READ OR WRITE MASK REBA EQU :0084 READ ERROR BAD BLOCK XFER REBAMASK EQU :FFEF REFI EQU :0086 READ ERROR BAD FILLER XFER REFIMASK EQU :FFEF RENO EQU :A086 READ ERROR NO DATA READ RENOMASK EQU :FFEF REND EQU :A08E READ ERROR NO DATA AND END OF MEDIA RENDMASK EQU :FFEF RDFM EQU :0081 READ A FILE MARK RDFMMASK EQU :FFEF ILLC EQU :C000 ILLEGAL ILLCMASK EQU :FB0F POWE EQU :8100 POWER ON/RESET POWEMASK EQU :F70F MARG EQU :1081 MARGINAL BLOCK DETECTED MARGMASK EQU :FFEF * * BROT EQU :0290 BRANCH TO OTHERS BRRW EQU :0210 BRANCH TO READ/WRITE FOR COMMAND AND DATA BRRWDO EQU :0250 BRANCH TO READ/WRITE FOR DATA ONLY BYKNT EQU :100 BYTE COUNT ERASE EQU :0422 ERASE THE ENTIRE TAPE TINIT EQU :0424 TINITIALIZE CARTRIDGE RDST EQU :04C0 READ STATUS READ EQU :0480 READ RFM EQU :04A0 READ FILE MARK RSOL EQU :0400 RESET ONLINE SELDR1 EQU :0401 SELECT DRIVE 1 RESYS EQU :0100 SYSTEM RESET SELDR2 EQU :0402 SELECT DRIVE 2 SELDR3 EQU :0404 SELECT DRIVE 3 SELDR4 EQU :0408 SELECT DRIVE 4 WFM EQU :0460 WRITE FILE MARK WRITE EQU :0440 WRITE TITL GENERAL EQUATES ****************************************** * * * GENERAL EQUATES * BADBUFSZ EQU 150 BAD BUFFER SIZE BCKAR: EQU :5F ASCII BACK ARROW CR: EQU 13 ASCII CARRIAGE RETURN CRLF: EQU :0D0A ASCII CARRIAGE ETURN AND LINE FEED DLPDA EQU :7F LP DEVICE ADDRESS (DIO) DTTYDA EQU :7C CRT/TTY DEVICE ADDRESS (SHIFTED RIGHT) LF: EQU 10 ASCII LINE FEED SMDA EQU :14 STD DEVICE ADDRESS SPACE: EQU :20 ASCII SPACE UPARR: EQU :5E ASCII UP ARROW TITL STANDARD NM-4 TRAP/EXCEPTION LOCATIONS *********************************** * * * STANDARD NM-4 TRAP/EXCEPTION LOCATIONS * * * CONSOLE INTERRUPT AND * REAL-TIME-CLOCK INTERRUPT LOCATIONS * * *********************************** * ABS 0 DEBUG JUMP DEBUG JST *$+1 JUMP TO DEBUG WORD DEBUG4 DEBUG ADDRESS * ABS :80 POWER UP TRAP PWRUP JST *$+1 JUMP TO POWER UP ROUTINE WORD PWRUP: ADDRESS OF ROUTINE * ABS :84 UNIMPLEMENTED INSTRUCTION TRAP UNINT RES 2,0 ADDRESS AND INSTRUCTION JST *$+1 JUMP TO SERVICE ROUTINE WORD UNINT: ADDRESS OF ROUTINE * UNMET RES 2,0 UNINSTALLED MENORY TRAP JST *$+1 JUMP TO SERVICE ROUTINE WORD UNMET: ADDRESS OF ROUTINE * PWRFL RES 2,0 POWER FAIL JST *$+1 JUMP TO SERVICE ROUTINE WORD PWRFL: ADDRESS OF ROUTINE * ABS :91 REAL-TIME-CLOCK RTCCNT RES 1,0 RTC TICKS JST *$+1 JUMP TO SERVICE ROUTINE RTCRTN RES 1,0 ADDRESS OF SERVICE ROUTINE * CNINT JST *$+1 CONSOLE INTERRUPT LOCATION WORD CNINT: ADDRESS OF SERVICE ROUTINE * A/ BS :98 CHAR./NUM. EXCEPTION CHNUE RES 2,0 ADDRESS AND INSTRUCTION JST *$+1 JUMP TO SERVICE ROUTINE WORD CHNUE: ADDRESS OF ROUTINE * STKOV RES 2,0 STACK OVERFLOW JST *$+1 JUMP TO SERVICE ROUTINE WORD STKOV: ADDRESS OF ROUTINE * USETR RES 2,0 USER TRAP JST *$+1 JUMP TO ROUTINE WORD USETR: ADDRESS OF ROUTINE * STSTR RES 2,0 SYSTEM TRAP JST *$+1 JUMP TO SERVICE ROUTINE WORD SYSTR: ADDRESS OF ROUTINE * ARIER RES 2,0 ARITHMETIC ERROR JST *$+1 JUMP TO SERVICE ROUTINE WORD ARIER: ADDRESS OF ROUTINE TITL MACRO QURY ********************************** * * * MACRO QURY - THIS MACRO REPLACE THE * REDUNDANT CODES DURING * QUARIES. * * *********************************** * MACRO QURY QURY#1 EQU $ JST CHRIN CHECK TERMINATOR JMP QURY#2 CARRIAGE RETURN JMP QURY#3 POUND SIGN JMP QURY#4 BACK ARROW JMP QURY#5 UPARROW JMP QURY#6 COMMA IFT 6<#7 ANYTHING ELSE ENDC ENDM * DCRM MACRO COPY #1,A SUB =1,A COPY A,#1 ENDM * TITL TAPE ERROR CHECKING MACRO ****************************************************************** * * * THIS MACRO CHECKS THE TAPE STATUS AND LOOKS FOR THE REQUESTED ERROR * * * *********************************************\ MACRO ERRMAC AND =#1MASK,A MASK IT SUB =#1,A COMPARE JNE A,$+12 IMS ERRCOUN ADD TO THE ERROR COUNT JST MSGA WORD #1MSG JST SPACE OUTPUT THREE SPACES JST MSGA WORD STWD OUTPUT STATUS WORD MESSAGE COPY Q,A RESTORE A FOR OUTPUT JST OHEX OUTPUT STATUS JST CRLF COPY =:FFFF,A JMP ERCHCKND FOUND AN ERROR GO TO END #1NOER COPY =0,A COPY A,#1FLG COPY Q,A RESTORE A JMP #1RM MAKE ROOM FOR LPOOL LPOOL #1RM EQU $ ENDM * TITL PROGRAM START UP *********************************** * * * PROGRAM START UP * * ************************************* * ABS :200 PSU EQU $ PROGRAM START UP G:0 EQU $ DEBUG LINK * JST MSGA PRINT TITLE WORD TITLE JST CRLF PRINT A BLANK LINE JST CRLF ONE MORE COPY =0,A ZERO A-REG  COPY A,EROTOL RESET ACCUMULATED ERRORS COUNT COPY A,S RESET STATUS REGISTER OUT A,0 RESET SENSE SWITCH OUT A,1 RESET CONSOLE INT SELP A,4 RESET CDR DISPLAY COPY A,UNIT CLEAR UNIT # COPY A,PASS CLEAR PASS # COPY =:180,A INITIALIZE STACK COPY A,K COPY =:120,A COPY A,L SBIT 4,S ENABLE CONSOLE INT SBIT 8,S ENABLE INTS JST GETQRY JMP QURYND LPOOL * * TITL THE GETQRY-TO GET THE REQUIERED QURIES ***************************************** * * GETQURY TO SELECT THE DESIRED FUNCTION * AND TEST TO RUN THE DIAGNOSTIC PACKAGE * ************************************ * GETQRY ENT JST DEVADRR SET THE DEVICE ADDRESS STANDAR :14 JST PERSELEC GO SELECT THE PERIPHERAL COPY PERSEL,A GET THE PERIPHERAL SELECTED CLSN A,='D' JMP DISKSTUF DISK QURY ROUTINE CLSN A,='T' TO CHECK IF IN TAPE MODE JMP TAPESTUF TAPE QURY ROUTINE * DISKSTUF EQU $ JST UNITSEL UNIT SELECT JST FUNSEL FUNCTION SELECT JST DRSEL * COPY FUNCTION,A DIAGNOSTIC, FORMAT OR TECH TEST CLSN A,='D' JMP DIAGDISK CLSN A,='F' JMP FMATDISK CLSN A,='T' JMP TECHDISK JMP DIAGDISK JUMP TO IT ANYWAY DEFAULT * DIAGDISK JST RUNOPT DIFFERENT RUN OPTIONS JST NONDES NONDESTRUCTIVE OPERATION JST DATAPATN DATA PATTERN JST TESTSEL TEST SELECTION COPY =TSTBUF1,X SEE IF THEY REQUESTED TEST B OR C DIAG1 EQU $ COPY 0(X),A JLT A,DIAG4 JUM IF END OF TABLE CLSN A,='B' JMP DIAG2 CLSN A,='C' JMP DIAG3 ADD =1,X JM0 P DIAG1 TRY NEXT ENTRY DIAG2 EQU $ JST SEEKSEL LONG OS SHORT SEEK TEST? ADD =1,X JMP DIAG1 DIAG3 EQU $ JST PSIOSEL DO PARTIAL-SECTOR I/O? ADD =1,X JMP DIAG1 DIAG4 EQU $ JMP ENDQRY THATS ALL FOR DIAGNOSTIC DISK ONLY QURY GO BACK * FMATDISK JST RUNOPT JST MFRBADTK JST INTERLV GET THE INTERLEAVE FACTOR JMP ENDQRY THATS ALL THE QUESTION FOR THE FORMAT DISK QURY * TECHDISK NOP ??? JST TFUNCT FUNCTION SELECTION JMP ENDQRY THAT IS ALL THE QUESTION FOR THE TECH TEST * * * NOW HERE COMES THE TAPE QUERY ROUTINES * TAPESTUF EQU $ JST TFUNSEL IS IT TAPE-DIAGNOSTIC OR TAPE-TECH? COPY FUNCTION,A CLSN A,='T' JMP TAPETECH TAPEDIAG EQU $ JST UNITSEL JST DRSEL DRIVE-SELECT QUERY (A700) JST RUNOPT JST DATAPATN JST TTESTSEL JST TBLKCNT GET BLOCK COUNT (A901) JMP ENDQRY * TAPETECH EQU $ ENDQRY JMP *GETQRY RETURN TO EXECUTIVE TO EXECUTE DIFFERENT TESTS * LPOOL * * TITL QUERIES-DEVICE ADDR MODIFICATION ************************************************ * * DEVICE ADDRESS MODIFICATION * ************************************************ * QURYND EQU $ COPY CAR,A GET RUN OPT TBIT 5,A LP OPTION ON? JF OV,$+3 NO, BY PASS NXT 2 INST COPY =1,A YES, SET LPFLAG COPY A,LPFLAG * COPY DEVAD,Q GET DIVICE ADDRESS SHIFT Q,LO,3 SHIFT TO CORRECT POSITION COPY =-6,A NUMBER OF I/O ADDRESS COPY A,QTMP SAVE IT AS COUNT COPY =IOTAB,Y GET TABLE ADDRESS DAADO COPY 0(Y),X GET I/O INSTRUCTION ADDRESS COPY =-:F9,A AND 0(X),A 'AND' OUT THE OLD ADDRESS OR Q,A 'OR' IN THE NEW ADDRESS COPY A,0(X) REPLACE THE OLD INSTRUCTION ADD =1,Y BUMP TABLE POINTER IMS QTMP AND THE TABLE COUNTER JMP DAADO GO FOR MORE COPY PERSEL,A CLSN A,='D' JMP EXEC GO TO DISK EXECUTING ROUTINE CLSN A,='T' JMP TEXEC GOTO TAPE EXECUTING ROUTINE JMP EXEC DEFAULT DISK * DEVAD WORD :14 DEVICE ADDRESS CELL (00-1F) QTMP WORD 0 TEMPERY CELL * LPOOL TITL PERIPHERAL SELECT SUBROUTINE *************************************************** * * * * PERSELEC - PERIPHERAL SELECTION * * QUERY: * SELECT PERIPHERAL: DISK OR TAPE ([D],T)? * * RETURN ANSWER IN 'PERSEL' * ************************************************** PERSELEC ENT QURYPSQ1 EQU $ COPY ='D',A GET THE DEFAULT COPY A,PERSEL AND SAVE JST MSGA OUTPUT WORD PERSELMS THE MESSAGE JST IDEC INPUT THE RESPONCE QURY PSQ2,PSQ3,PSQ1,PSQ1,1,PSQ1 CLSN ='D',A CHECK THE INPUT JMP PSQ2 CLSN ='T',A JMP PSQ2 JMP QURYPSQ1 ON GOOD PSQ2 EQU $ COPY A,PERSEL SAVE THE INPUT JST IKB GET THE TERMINATOR COPY A,IDCTM2 STORE IT FOR CHRIN CHECK JMP QURYPSQ2 AND CHECK IT QURYPSQ3 EQU $ JMP *PERSELEC AND RETURN TITL FUNCTION SELECT SUBROUTINE *************************************************** * * * FUNSEL - FUNCTION SELECT SUB * * QUERY: * SELECT FUNCTION ([D],F,T)? * * ******************************************** FUNSEL ENT QURYFUN1 EQU $ COPY ='D',A GET THE DEFAULT COPY A,FUNCTION AND SAVE JST MSGA OUTPUT WORD FSMSG THE MESSAGE JST IDEC INPUT THE RESPONCE QURY FUN2,FUN3,FUN1,PSQ1,FUN1,FUN1 CLSN ='D',A CHECK THE INPUT JMP FUN2 CLSN ='F',A JMP FUN2 CLSN ='T',A JMP FUN2 CLSN ='X',A GO TO DEBUG JST *0 GONE JMP QURYFUN1 ON GOOD FUN2 EQU $ COPY A,FUNCTION SAVE THE INPUT JST IKB GET THE TERMINATOR COPY A,IDCTM2 SAVE IT FOR CHRIN JMP QURYFUN2 AND CHECK IT QURYFUN3 EQU $ JMP *FUNSEL AN1 D RETURN LPOOL TITL TAPE FUNCTION SELECT ************************************************ * * TAPE FUNCTION SELECT * *  - SELECT DIAGNOSTIC OR TECH FUNCTION * * QUERY: * FUNCTION SELECT ([D],T)? * * ************************************************ TFUNSEL ENT QURYTFU1 EQU $ COPY ='D',A GET THE DEFAULT COPY A,FUNCTION AND SAVE JST MSGA OUTPUT WORD TFSMSG THE MESSAGE JST IDEC INPUT THE RESPONCE QURY TFU2,TFU3,TFU1,PSQ1,TFU1,TFU1 CLSN ='D',A CHECK THE INPUT JMP TFU2 CLSN ='T',A  JMP TFU2 JMP QURYTFU1 ON GOOD TFU2 EQU $ COPY A,FUNCTION SAVE THE INPUT JST IKB GET THE TERMINATOR COPY A,IDCTM2 STORE IT FOR CHRIN CHECK JMP QURYTFU2 AND CHECK IT QURYTFU3 EQU $ JMP *TFUNSEL AND RETURN TITL QUERIES SUBROUTINE - DRSEL ********************************** * * * DRSEL - DRIVE SELECTION * * QUERY: * XT-1065 : 0 * XT-1085 : 1 *  XT-1140 : 2 * AT3046 : 3 * RO-204 : 4 * CM5412 : 5 * TEST : 6 * USER DEFINE : 7 * SELECT DRIVE (0)? * * * CALLS: * CHRIN * IDEC * MOVE *  MSGA * * *********************************** * DRSEL ENT QURYD4 EQU $ COPY =0,A SET A TO ZERO COPY A,LPFLAG RESET LP FLAG TO ZERO COPY A,TEMP2 RESET INPUT FLAG JST MSGA OUTPUT QUERY WORD QRYD1 JST IDEC GET INPUT JEQ X,$+2 IF ZERO CHECK TERMINATOR IMS TEMP2 SET INPUT FLAG QURY D1,D2,D3,D4,D4,D4 JMP DRSEL+1 ANYTHING ELSE IS BAD QURYD3 COPY TEMP2,A GET INPUT FLAG JNE A,DRSEL+1 ILLEGAL THERE IS AN INPUT JMP QURYND DEFAULT QURYD2 COPY A,TEMP3 COPY X,TEMP4 COPY =-PRMSIZ,A JST MOVE WORD PRAMSX WORD PRAMS COPY TEMP3,A COPY TEMP4,X SUB =7,X IS IT USER DEFINE? JEQ X,QURYK YES, GOTO QURYK COPY TEMP4,X RESTORE X-REG CSK X,=DRTBLZ CHECK SELECTION JMP $+2 IF LESS THAN, A OK JMP DRSEL+1 IF MORE THAN, ERROR ADD =DRTBL,X ADD IN TABLE OFFSET  COPY 0(X),X GET ADDRESS OF PARAMETER TABLE COPY X,QURYD13 STORE FOR MOVE COPY X,DISK SET DRIVE PARAMETER TABLE ADDRESS COPY =HCP-EHCP,A PARAMETER TABLE SIZE -(EHCP-HCP) JST MOVE SET NEW DISK PARAMETER QURYD13 WORD 0 WORD HCP COPY MAXHEAD,A GET MAXIMUM HEAD NO. COPY A,HPD SAVE IT HERE IMS HPD ADJUSTED TO HEADS PER DRIVE COPY MAXSCTOR,A GET MAXIMUM SECTOR NO. COPY A,SPT SAVE IT HERE IMS SPT ADJUSTED TO SECTOR PER TRACK NOP JMP *DRSEL NEXT QUERY * LPOOL TITL QUERIES - USER DEFINE PARAMETER QUERY (PART OF DRSEL SUBROUTINE) *********************************** * * * QURYK - USER-DEFINED PARAMETER QUERY * * THIS QUERY ENABLES THE USER TO DEFINE DRIVE PARAMETERS. * NO RANGE CHECKING IS DONE. * * PARAMETERS : 1. MAXIMUM CYLINDER ADDRESS * 2. MAXIMUM SECTOR ADDRESS * 3. MAXIMUM HEAS ADDRESS * 4. BYTES/SECTOR * 5. LOGICAL MAXIMUM CYLINDER ADDRESS * 6. LOGICAL MINIMUM CYLINDER ADDRESS *  7. REDUCE WRITE CURRENT CYLINDER * 8. WRITE PRECOMPENSATION * ********************************** * QURYK EQU $ JST MSGA PRINT MESSAGE WORD QRYK COPY =-8,A GET INPUT COUNT COPY A,TEMP3 SAVE IT COPY =HCP,Y INDEX WORKING PARAMETER TABLE QURYK5 JST IHEX GET RESPONSE COPY X,0(Y) SAVE RESPONSE ADD =1,Y BUMP TABLE IMS TEMP3 BUMP INPUT COUNT JMP $+2 STI2 LL GOOD JMP QURYK30 END OF INPUT, NEXT QUERY QURY K10,K30,K,K,K40,K20 JMP QURYK ANYTHING ESLE IS BAD QURYK20 COPY IDCTM3,A GET INPUT COUNT JEQ A,QURYK IF NO INPUT JMP QURYK5 ELSE * QURYK30 EQU $ COPY TEMP3,Q GET INPUT COUNT JNE Q,QURYK NOT ENOUGH INPUT, RESTART COPY IDCTM2,A GET TERMINATOR CLSN =CR:,A CARRIAGE RET ? JMP $+2 YES, GO ON JMP QURYK NO, TRY AGAIN  COPY MAXHEAD,A GET MAXIMUM HEAD # COPY A,HPD SAVE IT HERE IMS HPD ADJUSTED TO HEADS PER DRIVE COPY MAXSCTOR,A GET MAXIMUM SECTOR # COPY A,SPT SAVE IT HERE IMS SPT ADJUSTED TO SECTORS PER TRACK NOP JMP *DRSEL GO NEXT QUERY QURYK40 DCRM DRSEL DECREMENT RETURN ADDRESS DCRM DRSEL JMP *DRSEL RETURN * LPOOL TITL QUERIES SUBROUTINE - MFRBADTK *********************************** * * * MFRBADTK - MANUFACTURER'S BAD TRACKS * * * WINCHESTER DRIVES ARE AN IMPERFECT MEDIA. WHEN THE * DRIVE IS RECEIVED FROM THE MANUFACTURER, A LIST OF * BAD TRACKS IS INCLUDED IN THE FORM OF CYLINDER/HEAD * PAIRS. * * THEY ARE STORED IN TWO TABLES. 'BADBUF' IS USED DURING * FORMATTER AND 'BADBUF2' IS USED DURING THE DIAGNOSTIC. * * TRACKS THAT ARE FOUND TO BE IN 'BADBUF' WILL BE FORMATTED * AS BAD (ALL 18 SECTORS). * * DURING THE DIAGNOSTIC, ERRORS AGAINST THE BAD TRACKS IN * 'BADBUF2' WILL NOT BE DISPLAY. * * * QUERY: ANY BAD TRACK FROM MANUFACTURER (Y/[N])? * * * DEFAULT IS NO. * * * CALLS: * MSGA * IDEC * CHRIN * * *********************************** * MFRBADTK ENT COPY =0,A RESET MFR'S BAD TRACK FLAG COPY A,MFRFLG DO IT JST MSGA OUTPUT QUERY WORD QRYM1 JST IDEC GET RESPONSE JNE X,MFRBADTK+1 NUMERIC RESPONSE IS NO GOOD QURY M11,M14,M15,M16,M17,M16 CLSN A,='Y' BAD TRACKS - YES? JMP QURYM12 GO ASK FOR BAD ONES CLSN A,='N' BAD TRACKS - NO? JMP QURYM13 NO BAD ONES JMP MFRBADTK+1 ANYTHING ELSE IN NO NO QURYM12 JST IDEC GET TERMINATOR JNE X,MFRBADTK+1 NUMERIC RESPONSE IS NO GOOD SUB =:0D,A CR? JNE A,MFRBADTK+1 NO, TRY AGAIN COPY =-BADBUFSZ,A JST MOVE CLEAR OUT FMTTR BUFFER WORD BUFCLR WORD BADBUF COPY =-BADBUFSZ,A JST MOVE CLEAR OUT DIAG BUFFER WORD BUFCLR WORD BADBUF2 COPY =-1,A COPY A,BADBUF TERMINATOR FOR FMTTR BUFFER COPY A,BADBUF2 TERMINATOR FOR DIAG BUFFER COPY =1,A SET MFR FLAG COPY A,MFRFLG  JMP QURYM20 'Y'+CR, NOW GET CYL #'S QURYM13 JST IDEC GET TERMINATOR JNE X,MFRBADTK+1 NUMERIC REPONSE IS NO GOOD SUB =:0D,A CR? JNE A,MFRBADTK+1 NO, TRY AGAIN QURYM14 COPY =-1,A NO BAD TRACKS FORM MANUFACTURER COPY A,BADBUF TERMINATOR FOR FMTTR BUFFER COPY A,BADBUF2 TERMINATOR FOR DIAG BUFFER JMP *MFRBADTK NO BAD TRACKS FROM MFR QURYM15 COPY =-1,A NO BAD TRACKS FROM MFR COPY A,BADBUF TERMINATOR FOR FMTTR BUFFER COPY A,BADBUF2 TERMINATOR FOR DIAG BUFFER JMP QURYND QURYM16 JMP MFRBADTK+1 BACK ARROW OR COMMA, TRY AGAIN QURYM17 DCRM MFRBADTK DECREMENT RETURN ADDRESS DCRM MFRBADTK JMP *MFRBADTK EXIT * LPOOL TITL QURIES - MFR'S BAD CYLINDER NUMBERS (PART OF MFRBADTK SUBROUTINE) *********************************** * * * MANUFACTURER'S BAD CYLINDER NUMBERS * * * QUERY: ENTER CYLINDER NUMBER (DECIMAL) * * DEFAULT: CR, WHICH INDICATES NO MORE DAB ONES. * * * CALLS: * MOVE * MSGA * IDEC * CHRIN * * *********************************** * QURYM20 EQU $ COPY =B3 ADBUF,A GET BUFFER ADDR COPY A,BUFPTR INIT BUFFER POINTER QURYM21 COPY =0,A SET A TO ZERO COPY A,TEMP2 RESET INPUT FLAG JST MSGA OUTPUT QUERY WORD QRYM2 JST IDEC GET RESPONSE JLT X,QURYM21 NEG NO. IS NO GOOD JEQ X,QURYM24 IF ZERO, SEE WHY QURYM22 IMS TEMP2 SET INPUT FLAG COPY MAXCYL,A GET MAX NO OF CYL ALLOWED CSK X,A CHECK RANGE JMP $+2 OK JMP QURYM21 TOO LARGE COPY X,BADCYL SAVE BAD CYL # QURY M23,M25,M26,M21,M16,M21 JMP QURYM21 ANYTHING ESLE IS BAD QURYM24 COPY IDCTM3,A SEE WHY IDEC VALUE IS ZERO JEQ A,QURYM23 ITS A TERMINATOR JMP QURYM22 MUST BE CYL #0 QURYM25 COPY TEMP2,A ITS A CR JEQ A,$+2 JUST CR, ALL DONE JMP QURYM30 CYL# + CR, GO GET BAD HEAD COPY =-1,A END OF BAD TRACK BUFFER COPY A,*BUFPTR SAVE IT COPY =-BADBUFSZ,A JST MOVE COPY BADBUF O BADBUF2 WORD BADBUF WORD BADBUF2 JMP *MFRBADTK ALL BAD TRACKS ENTERED, EXIT QURYM26 COPY TEMP2,A # TERMINATOR JEQ A,$+2 DEFAULT JMP QURYM21 CYL# + # IS NO NO COPY =BADBUF,A GET ADDR OF BAD BUF COPY BUFPTR,X SET POINTER CSK X,A SEE IF ANY BAD TRACKS ENTERED YET NOP JMP QURYM21 CAN'T DEFAULT AFTER ENTERING SOME BAD TRACKS JMP QURYND OK * LPOOL TITL QUERIES - MFR'S BAD HEAD NUMBERS (PART OF MFRBADTK SUBROUTINE) *********************************** * * * MANUFACTURER'S BAD HEAD NUMBERS * * * QUERY: ENTER BAD HEADS (DECIMAL) * * * CALLS: * MSGA * IDEC * CHRIN * * *********************************** * QURYM30 EQU $ COPY =0,A SET A TO ZERO COPY A,TEMP2 RESET INPUT FLAG JST MSGA PRINT 'BAD HEADS?' WORD QRYM3 JST IDEC GET RESPONSE JLT A,QURYM30 -VE # IS NO GOOD JEQ X,QURYM33 IF ZERO, SEE WHY QURYM31 IMS TEMP2 SET INPUT FLAG  COPY INITBK+1,A GET MAX # OF HEADS (B020) CSK X,A CHECK RANGE JMP $+2 OK JMP QURYM30 OUT OF RANGE COPY X,BADHEAD SAVE BAD HEAD QURY M32,M34,M30,M30,M21,M30 JMP QURYM30 ANYTHING ELSE IS BAD QURYM33 COPY IDCTM3,A SEE WHY IT'S ZERO JEQ A,QURYM32 JUST A TERMINATOR JMP QURYM31 MUT BE HEAD ZERO QURYM34 COPY TEMP2,A JUST A CR JEQ A,QURYM30 NOT GOOD ENOUGH QURYM35 COPY BADCYL,A GET BAD CYL SHIFT A,LO,4 PUT IN UPPER 3 NIBBLES OR BADHEAD,A PUT HEAD IN LOWER NIBBLE COPY A,*BUFPTR PUT CYL/HD IN TABLE COPY *LIMIT,A GET POINTER TO END OF TABLE SUB BUFPTR,A BUFFER FULL YET? JEQ A,QURYM36 YES, PRINT ERROR MESSAGE IMS BUFPTR NO, SO BUMP POINTER JMP QURYM21 GET NEXT BAD CYLINDER # QURYM36 JST MSGA EXCESSAVE BAD TRACKS WORD QRYM4 JMP DEBUG4 QUIT JMP $-3 * LPOOL * TITL INTERLEAVE FACTOR * ****************************************** * * * INPUT INTERLEAVE FACTOR * * *  QUERY: ENTER INTERLEAVE FACTOR ([0] TO MAXSECTOR-1) * * * CALLS: * MSGA * IDEC * CHRIN * *************************************************** * * INTERLV ENT QURYI10 JST MSGA OUTPUT QUERY WORD INTRLV JST IHEX GET RESPONSE JLT X,QURYI10 NEGATIVE VALUE NO GOOD JEQ X,QURYI11 IF ZERO SEE WHY QURYI12 COPY MAXSCTOR,A GET MAX SECTOR SUB =1,A SUBTRACT ONE CSK X,A COMPARE INPUT TO MAX INTERLEAVE JMP $+2 OK JMP QURYI10 ERROR RETURN QUERY QURY I20,I30,I10,M21,I10,I10 JMP QURYI10 ANYTHING ELSE IS WRONG QURYI11 COPY IDCTM3,A SEE WHY IT'S ZERO JEQ A,QURYI20 JUST A TERMINATOR JMP QURYI12 QURYI30 COPY X,INTRLVF SAVE VALUE IN INTERLEAVE LOCATION JMP *INTERLV RETURN LPOOL TITL QUERIES ************************************ * * * 4  QUERIES - QUERY SECTION * * DEVICE ADDRESS QUERY - THIS QUREY WILL CAUSE * THE MODIFICATION OF THE * DEVICE ADDRESS IF NON- * STANDARH DEVICE ADDRESS *  KEYED IN. * * STANDARD DEVICE ADDRESS - :14 * * QUREY: DEVICE ADDRESS (01-1F[14])? * * SELECTION-:01 TO :1F *  DEFAULT IS :14 * * ************************************ * DEVADRR ENT QURY1 EQU $ COPY =0,A COPY A,IPFLAG RESET INPUT FLAG COPY =:14,A GET DEFAULT DEVICE ADDRESS COPY A,DEVAD SAVE IT JST MSGA OUTPUT QUREY WORD DEVMSG JST IHEX GET RESPONSE JEQ X,QURY3 IF ZERO, SEE WHY IMS IPFLAG SET INPUT FALG CSK X,=0 DO RANGE CHECK JMP QURY1 BAD INPUT (LESS THAN 0) CSK  X,=:1F JMP $+2 WITHIN RANGE JMP QURY1 BAD INPUT (LARGER THAN :1F) COPY X,DEVAD STORE INPUT QURY 2,5,4,1,1,1 JMP QURY1 ANYTHING ELSE IS BAD QURY3 EQU $ COPY IDCTM3,A GET INPUT COUNT JEQ A,QURY2 IF ZERO, DEFAULT JMP QURY1 QURY4 EQU $ COPY IPFLAG,A GET INPUT FLAG JNE A,QURY1 IF INPUT, THEN IT IS ILLEGAL JMP QURYND QURY5 EQU $ JMP *DEVADRR GOTO NEXT QUERY * LPOOL * TITL QUERIES SUBROUTINE - UNITSEL ************************************ * * * UNITSEL - DISK-UNIT SELECTION * * QUERY: DISK-UNIT SELECT ([0]-3)? * DEFAULT IS 0 * * * ************************************* * UNITSEL ENT QURYU1 EQU $ COPY =UCUR,Y INDEX UNIT SELECTION TABLE COPY =0,A ZERO A-REG COPY A,IPFLAG RESET INPUT FLAG COPY A,0(Y) SAVE DEFAULT UNIT COPY =-1,A GET DELIMITER COPY A,1(Y) SAVE IT COPY =-4,A SET INPUT COUNT COPY A,IPCOUNT AND INPUT COUNT QURYU2 JST MSGA PRINT QUERY WORD USEMSG QURYU3 JST IDEC GET RESPONSE COPY IDCTM3,A GET INPUT COUNT JEQ A,QURYU4 IF 0, CHECK TERMINATOR COPY X,A DO RANGE CHECK CSK A,=3 MUST BE < 3 JMP $+2 OK JMP QURYU1 OUT OF RANGE COPY A,0(Y) SAVE UNIT SELECTED COPY =-1,A GET TERMINATOR COPY A,1(Y) SAVE IT IMS IPCOUNT BUMP COUNTER JMP $+2 STILL GOOD JMP QURYU5 MAX. UNIT SELECTED, NEXT QUERY ADD =1,Y BUMP UNIT TABLE POINTER QURY U4,U5,ND,U1,PSQ1,U2 JMP QURYU1 JMP QURYU1 ANYTHING ELSE IS BAD QURYU5 COPY IDCTM2,A CLSN =CR:,A IS TERMINATOR CR ? QURYU7 JMP *UNITSEL EXIT JMP QURYU1 * LPOOL TITL QUERIES SUBROUTINE - RUNOPT ****************************************************** * * RUNOPT -THIS QUERY DETERMINATES * HOW THE DIAGNOSTIC PROGRAM * IS BEING RAN. * *  QUERY: RUN OPTIONS [:00]? * * SELECTION- :00 TO :?? * DEFAULT IS ':00' * * BIT HEX OPTION * --- --- ------ * 0 :01 ACCUMULATED ERRORS OF ALL PASSES * 1 :02 SUPPRESS ERROR REPORTS * 2 :04 OUTPUT ERROR TALLIES @ END OF EA. TEST * 3 :08 RUN CONTINUOUSLY *  4 :10 HALT ON ERROR * 5 :20 LINE PRINTER ON * ***************************************************** * RUNOPT ENT COPY =0,A COPY A,CAR SET RUN OPTION TO DEFAULT COPY A,IPFLAG CLEAR INPUT FLAG JST MSGA OUTPUT QURY WORD ROMSG JST IHEX GET RESPONSE JEQ X,QURYR3 IF ZERO, SEE WHY QURYR1 IMS IPFLAG SET INPUT FLAG COPY X,A DO RANGE CHECK COPY X,CAR ELSE, STORE VALUE QURY R2,R7,R4,R6,R5,R6 JMP RUNOPT+1 ANYTHING ELSE QURYR3 COPY IDCTM3,A GET ACTUAL INPUT COUNT JEQ A,QURYR2 IF ZERO,5  CHECK TERMINATOR JMP QURYR1 ELSE, INPUT=0 QURYR4 COPY IPFLAG,A GET INPUT FLAG JNE A,RUNOPT+1 CAN'T DO JMP QURYND CAN DO QURYR5 COPY IPFLAG,A GET INPUT FLAG JNE A,RUNOPT+1 CAN'T DO DCRM RUNOPT OK DCRM RUNOPT JMP *RUNOPT RETURN QURYR6 JMP RUNOPT+1 BACK ARROW QURYR7 JMP *RUNOPT EXIT * LPOOL TITL QUERIES SUBROUTINE - NON-DESTRUCTION MODE ***************************************************** * * NONDES - DESTRUCTIVE MODE OPTION * * QUERY: DESTRUCTIVE MODE ([Y]/N)? * * N = NON-DESTRUCTIVE, SAVE DATA ON THE DISK * Y = DO NOT SAVE DATA ON THE DISK * * DEFAULT IS 'Y' * ***************************************************** * NONDES ENT COPY =0,A COPY A,IPFLAG RESET INPUT FLAG JST MSGA OUTPUT QUERY WORD NDMSG JST IKB GET RESPONSE COPY A,IDCTM2 SAVE QURY N1,N2,N3,N4,N5,N4 CLSN A,='Y' YES? JMP $+4 CLSN A,='N' JMP $+2 JMP NONDES+1 ANYTHING ELSE IS BAD IMS IPFLAG COPY A,TEMP1 SAVE Y/N OPTION JST IKB GET TERMINATOR COPY A,IDCTM2 SAVE JMP QURYN1 QURYN2 EQU $ COPY IPFLAG,A GET INPUT FLAG JEQ A,$+3 IF NO INPUT GO AHEAD COPY TEMP1,A GET Y/N OPTION CLSN A,='Y' JMP *NONDES COPY CAR,A SBIT 6,A TURN IT ON IN ORDER TO SAVE THE DATA COPY A,CAR JMP *NONDES QURYN3 EQU $ COPY IPFLAG,A GET INPUT FLAG JEQ A,$+2 CAN DO JMP NONDES+1 CANNOT DO JMP QURYND QURYN4 EQU $ JMP NONDES+1 QURYN5 EQU $ DCRM NONDES DECREMENT RETURN ADDRESS DCRM NONDES JMP *NONDES * LPOOL TITL QUERIES SUBROUTINE - DATAPATN ***************************************************** * * DATAPATN - USER DATA PATTERN QUERY * * QUERY - PATTERN [:6DB6]? * * DEFAULT - :6DB6 * * RESPONSE - 4 HEX DIGITS DECEPT ALL ZEROS * ****************************************************** * DATAPATN ENT COPY PATN,A GET DEFAULT PATTERN (:6DB6) COPY A,WBUF PUT INTO WRITE BUF COPY =-776,A GET 3 BUFFS' -VE BYTE COUNT JST MOVE PUT INTO BUFFER WORD WBUF WORD WBUF+1 * JST MSGA OUTPUT MESSAGE WORD UPMSG JST IHEX JNE X,$+3 HEX INPUT, GOOD CLSN A,=:0D JMP *DATAPATN YES, NEXT COPY X,A COPY A,PATN CHANGE THE DEFAULT PATTERN TO BE USER DEFINE COPY A,WBUF COPY =-776,A JST MOVE WORD WBUF  WORD WBUF+1 QURY DP1,DP2,DP2,DP3,DP4,DP3 JMP DATAPATN+1 ANYTHING ELSE IS BAD QURYDP2 JMP *DATAPATN EXIT QURYDP3 JMP DATAPATN+1 REPEAT QUERY QURYDP4 DCRM DATAPATN DECREMENT RETURN ADDR DCRM DATAPATN JMP *DATAPATN EXIT * LPOOL TITL QUERIES SUBROUTINE - TESTSEL ************************************************* * * TESTSEL - TEST SELECTION * * DEFAULT IS ALL TESTS * ************************************************ * TESTSEL ENT QURY60 EQU $ COPY =0,A COPY A,IPFLAG CLEAR INPUT FLAG COPY =-6,A GET DATA LENGTH JST MOVE MOVE IN TEST PARAMETERS WORD TSTBUF2 FROM HERE WORD TSTBUF1 TO HERE COPY =TSTBUF1,Y INDEX TEST TABLE JST MSGA PRINT QUERY WORD TSTMSG COPY =-6,A GET INPUT COUNT COPY A,TEMP1 SAVE IT QURY61 EQU $ JST IDEC GET INPUT JNE X,QURY60 NUMERIC IS NO GOOD QURY 63,65,ND,60,40,61,60 CSK A,='F' DO RANGE CHECK CSK A,='A' 'A' TO 'F' JMP QURY60 BAD ENTRY  NOP COPY A,0(Y) SAVE IT COPY =1,A COPY A,IPFLAG THERE IS INPUT, SET FLAG ADD =1,Y BUMP TABLE ADDRESS IMS TEMP1 AND INPUT COUNT JMP QURY61 COUNT NOT EXPIRED JST IKB GET TERMINATOR CLSN =CR:,A IS IT CR ? JMP QURY65 YES JMP QURY60 NO QURY65 EQU $ 6 COPY IPFLAG,Q GET INPUT FLAG JEQ Q,$+3 NOT SET=DEFAULT COPY =-1,A GET TEST TABLE TERMINATOR COPY A,0(Y) STORE TABLE TERMINATOR JMP *TESTSEL (A903) QURY40 DCRM TESTSEL JMP *TESTSEL * JMP QURY70 NEXT QUERY * LPOOL TITL LONG OR SHORT SEEK SELECT ********************************************************** * * SEEKSEL - SEEK SELECT * * TEST B, LONG (ALL CYLS) OR SHORT (EVERY OTHER CYL) ([L]/S)?" ********************************************************* * SEEKSEL ENT QURYS1 EQU $ COPY =1,A  DEFAULT IS EVERY CYLINDER COPY A,SEEKSZ COPY =0,A COPY A,IPFLAG RESET INPUT FLAG JST MSGA "TEST B, LONG OR SHORT ([L]/S)?" WORD SKMES JST IKB GET RESPONSE COPY A,IDCTM2 SAVE IT QURY S2,S4,S1,S1,S1,S1 CLSN A,='L' JMP QURYS3 CLSN A,='S' JMP QURYS3 JMP QURYS1 ELSE, TRY AGAIN QURYS3 EQU $ IMS IPFLAG COPY A,TEMP1 JST IKB GET TERMINATOR COPY A,IDCTM2 JMP QURYS2 QURYS4 EQU $ COPY IPFLAG,A JEQ A,QURYS5 THEY DEFAULTED TO LONG COPY TEMP1,A CLSN A,='L' JMP QURYS5 COPY =2,A SET IT UP FOR THE SHORT TEST COPY A,SEEKSZ QURYS5 EQU $ JMP *SEEKSEL LPOOL TITL PARTIAL-SECTOR I/O QUERY ************************************************************* * * PSIOSEL - PARTIAL-SECTOR I/O SELECT * * DISK TEST C DOES A WRITE/READ/VERIFY TO 200 RANDOM SECTORS. * THE DEFAULT WORD COUNT IS :100 (1 SECTOR). IF PARTIAL-SECTOR * I/O IS SELECTED, THE WORD COUNT INCREMENTS FROM 1 TO 200 * AS EACH SECTOR IS PROCESSED. * ************************************************************* * PSIOSEL ENT QURYPS1 EQU $ COPY =0,A DEFAULT IS FULL-SECTOR I/O COPY A,PSIOFLG COPY A,IPFLAG JST MSGA "DO PARTIAL-SECTOR I/O DURING TEST C (Y/[N])?" WORD PSIOMSG JST IKB COPY A,IDCTM2 QURY PS2,PS4,PS1,PS1,60,PS1 CLSN A,='Y' JMP QURYPS3 CLSN A,='N' JMP QURYPS3 JMP QURYPS1 QURYPS3 EQU $ IMS IPFLAG COPY A,TEMP1 JST IKB COPY A,IDCTM2 JMP QURYPS2 QURYPS4 EQU $ COPY IPFLAG,A JEQ A,QURYPS5 COPY TEMP1,A CLSN A,='N' JMP QURYPS5 COPY =1,A COPY A,PSIOFLG QURYPS5 EQU $ JMP *PSIOSEL LPOOL TITL EXEC-TEST EXECUTIVE *********************************** * * EXEC - TEST EXECUTIVE * THIS IS THE TEST CONTROL SECTION * * * CALLS: CALLED BY: * FORMAT TESTC NONE *  TESTA TESTD * TESTB TESE * * *********************************** * EXEC EQU $ COPY FUNCTION,A GET FUNCTION FUNCTION CLSN A,='D' DIAGNOSTIC? JMP EXECD YES CLSN A,='F' FORMATTER? JMP EXECF YES CLSN A,='T' TECH? JMP TECH YES, GO TO TECH TEST JMP PSU+2 NONE OF THE ABOVE, RESTART EXECD EQU $ JSK TSTAA1 INITIALIZE DISK BUT DON'T TELL USER (A900) EXECD4 EQU $ COPY =:180,A INITIALIZE STACKS COPY A,K COPY =:120,A COPY A,L JST CRLF NEXT LINE JST MSGA PRINT 'PASS' WORD PASSMSG  COPY PASS,A GET PASS # JST ODEC PRINT IT JST MSGA PRINT 'UNIT' WORD UNITMSG COPY =UCUR,X INDEX UNIT TABLE EXECD5 EQU $ COPY 0(X),A SUB =:FFFF,A END OF TABLE? JEQ A,EXECD0 YES COPY 0(X),A NO, RESTORE UNIT # ADD =1,X BUMP POINTER JST ODEC OUTPUT # COPY =' ',A PRINT SPACE JST OTTY JMP EXECD5 GO BACK FOR MORE EXECD0 JST CRLF PRINT A BLANK LINE COPY =TSTBUF1,X INDEX TEST SELECTION BUF EXECD1 EQU $ COPY X,TEMP0 SAVE TEST POINTER COPY 0(X),A GET TABLE CONTENT SUB =-1,A IS IT END OF TABLE? JEQ A7 ,EXEAE YES, GO EXEAE COPY 0(X),A RESTORE A-REG CLSN A,='A' JSK TESTA TEST A COPY TEMP0,X RESTORE TABLE PTR COPY 0(X),A CLSN A,='B' JST TESTB TEST B COPY TEMP0,X COPY 0(X),A CLSN A,='C' JST TESTC TEST C COPY TEMP0,X COPY 0(X),A CLSN A,='D' JST TESTD COPY TEMP0,X COPY 0(X),A CLSN A,='E' TEST E JST TESTE COPY TEMP0,X COPY 0(X),A CLSN A,='F' TEST F JST TESTF EXECD3 COPY TEMP0,X ADD =1,X BUMP TABLE POINTER JMP EXECD1 LOOP BACK EXEAE EQU $ COPY CAR,A GET RUN OPTION TBIT 0,A IS ACCUM. ERR. BIT ON? JF OV,EXECD2 NEXT, IF 'N' OPTION COPY =TSTBUF1,Y INDEX TSET TABLE COPY 0(Y),A GET CONTENT EXEAE1 EQU $ COPY =:0F,Q GET MASK WORD AND Q,A MASK OUT UNWANTED BITS SUB =1,A LESS 1 COPY =EROTAB,X GET ERR TAB ADD A,X OFFSET INTO ERR TAB COPY 0(X),A GET # OF ERRORS COPY EROTOL,Q GET TOTAL # OF ERR ADD Q,A UPDATE COPY A,EROTOL UPDATE ADD =1,Y BUMP INDEX TEST TABLE COPY 0(Y),A GET NEXT CONTENT CSK A,=-1 END OF TABLE? NOP JMP EXEAE1 NO, GO BACK. ELSE, GO ON JST MSGA WORD EROACC 'ACCUMULATED ERRORS: ' COPY EROTOL,A GET TOTAL # OF ERR OF PASS JST ODEC AND OUTPUT JST CRLF EXECD2 EQU $ COPY CAR,A GET RUN OPTION TBIT 3,A IS RUN CONT. BIT ON? JT OV,$+2 YES, CONTINUE JMP PSU+4 ELSE, RESTART IMS PASS BUMP PASS JMP $+2 PASS STILL GOOD JMP PSU+2 MAX. PASS REACHED, RESTART JMP EXECD4 GO ON * EXECF EQU $ JSK TSTAA1 INITIALIZE DISK, BUT DONT TELL USER EXECF1 EQU $ JST CRLF JST MSGA WORD PASSMSG COPY PASS,A JST ODEC * JST FORMAT GO FORMAT JST ASSALT ASSIGN THE ALTERNATE TRACKS JST PRBDTRK PRINT THE BAD TRACK MAP * COPY CAR,A CONTINUOUSLY? TBIT 3,A JT OV,$+2 YES JMP PSU+4 NO  IMS PASS JMP EXECF1 DO IT AGAIN JMP PSU+2 RESTART * TEMP0 WORD 0 TEMP CELL * LPOOL TITL TESTA-TEST A SUBROUTINE *********************************** * * TESTA - TEST A SUBROUTINE * * THIS ROUTINE PERFORM THE FOLLOWING DIAGNOSTICS: * (1) SENSE CONTROLLER PRESENCE AND READY, * (2) INITIALIZE THE DISK. * * * CALLING SEQUENCE: NONE * *  CALLS: CALLED BY: * CIOB EXEC * ERROR * MSGA *  OTA * RSTBD * SENHIM * SENRDY * TIME * * *********************************** * TESTA EQU $ COPY =0,A ZERO UNIT # COPY A,UNIT DO IT COPY A,ERORA CLEAR ERROR CNT CELL JST MSGA OUTPUT TEST HEADING WORD TSTA TSTAA1 EQU $ JST RSTBD DO A SOFTWARE RESET * JST TIMER SET 7 SEC TIMER JST TIME GET IT GOING JST SENRDY SEE IF DONE JMP $+2 SOME ONE DONE JMP $-3 LET TIME EXPIRE * JST TIMER SET FOR ANOTHER 7 SEC JST TIME GET IT GOINT JST SENRDY SENSE READY JMP $+2 DONE GO JMP $-3 * JST SENHIM DEVICE PRESENCE? JMP TSTA1A NO, SAY NO JST SENRDY DEVICE REDY? JMP TSTA2 OK, GO TO NEXT TEST JMP TSTA1B NO, SAY SO TSTA1A EQU $ JST MSGA PRINT 'CONTROLLER NOT PRESENT' WORD TSTA1M JMP PSU+2 RETURN TO BEGINING TSTA1B EQU $ JST MSGA PRINT 'CONTROLLER NOT READY' WORD TSTA1M1 JMP PSU+2 RETURN TO BEGINING * LPOOL * TSTA3 EQU $ JST CIOB CLEAR CIOB COPY =DIOB,X INDEX IOB COPY =DIAGNOST,A GET OP CODE COPY A,OP(X) INTO IOB COPY =UCUR,Y COPY 0(Y),A GET UNIT COPY A,US(X) COPY =DIAGDN,A INTERRUPT ADDRESS COPY A,IN(X) INTO IOB COPY =FWSUB,A8  F/W REV SUB OPCODE COPY A,NB(X) INTO DATA CHIAN SPOT * JMP TSTA2L GO SEND IT * DIAGDN EQU $ DONE JST $+1 NOP JST MSGA SEND F/W REVISION MSG WORD FWREV COPY =DIOB,X COPY DST(X),A GET REVISION LEVEL JST OHEX SEND TO CRT JST CRLF * JST RETSTAT JMP TSTA3 JMP TSTA3 BAD * LPOOL * * SET UP IOB TSTA2 EQU $ COPY =UCUR,Y INDEX UNIT # TABLE JST CIOB CLEAR IOB COPY =DIOB,X INDEX IOB COPY 0(Y),A GET CURENT UNIT # SUB =:FFFF,A IS IT END OF TABLE? JNE A,$+2 NO, DO NOT EXIT JMP TSTAND COPY 0(Y),A NO, RESTORE UNIT # COPY A,UNIT SAVE IT COPY A,US(X) SAVE IT ADD =1,Y BUMP TABLE POINTER * COPY =INIT,A INITIALIZATION COMMAND COPY A,OP(X) COPY MAXCYL,A MAX CYLNDER ADDR COPY A,CS(X) COPY MAXHEAD,A MAX HEAD ADDR COPY A,HS(X) COPY INITBK,A BYTES/SECTOR COPY A,SSS(X) COPY INITBK+1,A LOGICAL MAXIMUM CYLINDER ADDRESS COPY A,WC(X) COPY INITBK+2,A LOGICAL MINIMUM CYLINDER ADDRESS COPY A,MA(X) COPY INITBK+3,A REDUCE WRITE CURRENT CYLINDER COPY A,NB(X) COPY INITBK+4,A WRITE PRECOMPENSATION COPY A,WP(X) COPY =TSTA2CK,A INTERRUPT ADDRESS COPY A,IN(X) * * INITIALIZATION * TSTA2L EQU $ COPY =:110,A COPY A,S ENABLE ALL INTERRUPTS COPY =DIOB,A GET THE IO BLOCK ADDRESS JST OTA SEND IT JST TIMER SET UP TIMER FOR 7 SECONDS JST TIME TIME IT JMP $-1 TIME NOT EXPIRED YET JST MSGA WORD NOEOB 'NO EOB AFTER INITIALIZATION.' JMP PSU+2 GO TO BEGINING * LPOOL TSTA2CK EQU $ JST $+1 INTRRUPT ENTRY POINT MUST BE A JST OR JSK NOP JST RETSTAT GO CHECK STATUS JMP $+2 GOOD IMS ERORA ADD TO THE ERROR TOTAL * TSTAND EQU $ COPY =0,A ADDRESS OF THE ERROR CELL JST EROTAL RSK LPOOL TITL TESTB-TEST B SUBROUTINE *********************************** * * TESTB - TEST B SUBROUTINE * * THIS TEST PERFORM THE FOLLOWING: * (1) TEST I/O, * (2) SEEK ONLY. * * * CALLS: CALLED BY: * CIOB EXEC * ERROR * MSGA * OTA * * *********************************** * TESTB EQU $ TEST B ENTRY POINT ENT JST MSGA PRINT TEST HEADING WORD TSTB JST MSGA SEND NEXT MESSAGE WORD CNTCYL CURRENT CYLINDER COPY =0,A COPY A,ERORB CLEAR ERR CNT CELL COPY =UCUR,Y INDEX UNIT # TABLE COPY =0,A ZERO UNIT # COPY A,UNIT DO IT TSTB1 EQU $ COPY =1,A COPY A,SKFLG SET FIRST TIME THROUGH FLAG * SET UP IOB JST CIOB CLEAR IOB COPY =DIOB,X INDEX IOB COPY 0(Y),A GET CURRENT UNIT # SUB =:FFFF,A IS IT END OF TABLE? JNE A,TBCON JUMP NOT ZERO JMP TSTBEND TBCON COPY 0(Y),A NO, RESTORE UNIT # COPY A,UNIT SAVE IT COPY A,US(X) SAVE IT ADD =1,Y BUMP TABLE POINTER SKENT COPY =TIO,A GET TEST I/O COMMAND COPY A,OP(X) SAVE IT COPY =TB1INT,A GET INT ADDR COPY A,IN(X) SAVE IT * TEST I/O ************************************** IORE SBIT 8,S ENABLE INTS COPY =0,A CLEAR A COPY A,CST(X) CLEAR CONTROLLER STATUS COPY A,DST(X) CLEAR DRIVE STATUS COPY =DIOB,A INDEX IOB JST OTA SEND IT JMP $ WAIT FOR INTERRUPT * * TB1INT EQU $ JST $+1 INT ENTRY MUST BE JST/JSK NOP JST RETSTAT GO CHECK STATUS JMP TSTB2 COPY =:C,Q GET CODE FOR SEEK IN PROGRESS SUB A,Q CHECK FOR IT JEQ Q,TSTBRET JUMP ZERO IMS ERORB ADD TO THE ERROR TOTAL JMP TSTB2 OK NOW GO ON TSTBRET 9 JMP IORE RETRY * * * LPOOL * TSTB2 EQU $ COPY SKFLG,A GET THE FLAG ADD =1,A CHECK FOR FINISHED JNE A,SKNOFI JUMP IF NOT ZERO JMP TSTB1 * SKNOFI COPY =DIOB,X INDEX WITH X COPY =SEEK,A GET THE SEEK COMMAND COPY A,OP(X) PUT IN IOB COPY =SKEINT,A GET INTERRUT LOCATION COPY A,IN(X) PUT IN IOB COPY =0,A CLEAR A COPY A,CST(X) CLEAR CONTROLLER STATUA COPY A,DST(X) CLEAR DRIVE STATUS COPY CS(X),A GET THE CYLINDER SELP A,4 DISPLAY IN THE CDR COPY LPFLAG,A GET LPFLAG JNE A,$+5 FI LP ON JIMP COPY CS(X),A JST ODEC SEND TO CRT COPY =:0D,A AND CARRIAGE RETURN JST OTTY TO CRT SBIT 8,S ENABLE INTERRUPTS COPY =DIOB,A GET IOB ADDR JST OTA SEND IT JMP $ WAIT FOR INTERRUPT LPOOL * * SKEINT EQU $ JST $+1 INTERRUPT RETURN NOP JST RETSTAT CHECK STATUS JMP SKCYL NO ERRORS GO ON COPY =:C,Q GET CODE FOR SEEK IN PROG. SUB A,Q CHECK IT JEQ Q,SKCYL SEEK IN PROGRESS GO TO TEST I/O IMS ERORB ADD TO THE ERROR TOTAL JMP SKCYL GO ON TO TEST IO SKCYL COPY SKFLG,A GET FIRST TIME FLAG JEQ A,CKCYLN JUMP IF CLEARED * COPY MAXCYL,A GET MAX CYL COPY A,SKHI PUT IN SEEK HIGH COPY =0,A CLEAR A COPY A,SKFLG CLEAR THE FLAG CKCYLN EQU $ COPY CS(X),Q GET CURRENT CYL COPY SKTEMP,A GET TEMP FLG JEQ A,SKADD JUMP IF ZERO JEQ Q,SKEND IF ZERO FINISHED SUB SEEKSZ,Q SUBTRACT FROM SKHI JLE Q,SKEND COPY Q,SKHI AND SAVE IT COPY SKLOW,Q GET LOW SEEK COPY Q,CS(X) PUT IN IOB COPY =0,A COPY A,SKTEMP CLEAR THE FLAG JMP SKENT RETURN SKADD EQU $ ADD SEEKSZ,Q ADD TO SKLOW COPY MAXCYL,A SEE IF THE LOW CYL HAS HIT THE MAX SUB Q,A JLE A,SKEND COPY Q,SKLOW AND SAVE IT COPY SKHI,Q GET THE HIGH SEEK COPY Q,CS(X) PUT IN IOB COPY =1,A COPY A,SKTEMP SET THE FLG JMP SKENT SKEND EQU $ COPY =:FFFF,A COPY A,SKFLG SET THE FINISHED FLAG JMP SKENT GO TO TEST I/O TO WAIT FOR SEEK TO COMPLETE TSTBEND EQU $ COPY =1,A ADDRESS OF THE ERROR CELL JST EROTAL GO TALLY ERRORS JMP *TESTB RETURN LPOOL SKTEMP WORD 0 TEMP LOCATION FOR SEEK SKLOW WORD 0 LOW SEEK LOCATION SKHI WORD 0 HIGH SEEK LOCATION SKFLG WORD 0 FIRST TIME FLAG TITL TESTC-TEST C SUBROUTINE *********************************** * * TESTC - TEST C SUBROUTINE * * THIS ROUTINE PERFORM THE FOLLOWING: * * (1) WRITE 256 WORDS OF DATA (@ RANDOM CYL, HEAD, SECTOR) *  (2) READ THE ABOVE DATA * (3) VERIFY THAT THE DATA-READ = DATA-WRITTEN * * THIS TEST IS NORMALLY RUN AGAINST 200 RANDOM SECTORS WITH A * WORD COUNT OF :100. IF PARTIAL-SECTOR I/O IS SELECTED, THE * WORD COUNT IS INCREMENTED FROM 1 TO 200 AS THE TEST LOOPS * THRU THE 200 SECTORS. * *********************************** * TESTC EQU $ ENT COPY CAR,A GET RUN OPTION TBIT 6,A IS NON-DEST ON? JF OV,$+2 NO JMP *TESTC YES RBIT 4,S DISABLE CONSOLE INT JST MSGA PRITN TEST HEADING WORD TSTC JST MSGA SEND CURRENT CYL MSG WORD CNTCYL COPY =0,A COPY A,ERORC CLEAR ERR CNT CELL COPY SEED,A GET SEED COPY A,SEEDSAVE SAVE SEED FOR TEST D COPY =-200,A GET NUMBER OF OPERATIONS COPY A,CTL SAVE IT COPY =:100,Q DEFAUT IS FULL-SECTOR I/O COPY PSIOFLG,A DO THEY WANT PARTIAL-SECTOR I/O? JEQ A,TESTC2 NO COPY =1,Q  YES TESTC2 EQU $ COPY Q,WDCOUNT UPDATE WORD COUNT TSTC0 EQU $ COPY CTL,A GET NUMBER OF OPERATION JEQ A,TCGEXLNK DONE, EX: IT JST PREP PERPARE DISK PHYSICAL ADDRESS COPY =UCUR,Y INDEX UNIT # TABLE COPY =0,A ZERO UNIT # COPY A,UNIT DO IT TSTC1 EQU $ * SET UP IOB JST CIOB CLEAR IOB COPY =DIOB,X INDEX IOB COPY 0(Y),A GET CURENT UNIT # SUB =:FFFF,A IS IT END OF TABLE? JEQ A,TCEXLNK YES EXIT COPY 0(Y),A NO, RESTORE UNIT # COPY A,UNIT SAVE IT COPY A,US(X) SAVE IT ADD =1,Y BUMP TABLE POINTER COPY =WRTDAT,A GET WRITE DATA (WITHOUT FILE LINK) COMMAND COPY A,OP(X) SAVE IT COPY CYL,A GET CYL NO. COPY A,CS(X) SAVE IT COPY HEAD,A GET HEAD # COPY A,HS(X) SAVE IT COPY SECTOR,A GET SECTOR # COPY A,SSS(X) DO IT COPY =WBUF,A GET WRITE BUFFER ADDRESS COPY A,MA(X) SAVE IT COPY =TC1INT,A GET INT ADDR COPY A,IN(X) SAVE IT COPY =:200,A SAVE 2 SECTORS COPY A,WC(X) JST SAVER CHECK IF NON-DESTRUCTIVE MODE REQUIRED COPY WDCOUNT,A GET TRANSFER WORD COUNT COPY A,WC(X) SAVE IT COPY =0,A CLEAR INT LINK * * COPY A,INTLNK SAVE IT TSTC1A EQU $ COPY =0,A COPY A,CST(X) CLEAR CONTROLLER STATUS COPY A,DST(X) CLEAR DRIVE STATUS COPY CS(X),A GEET CURRENT CYLINDER SELP A,4 SEND TO CDR COPY LPFLAG,A JNE A,TSTC1B COPY CS(X),A JST ODEC SEND TO CRT COPY =:0D,A CR JST OTTY SEND TO CRT TSTC1B EQU $ COPY =DIOB,A GET IOB ADDR SBIT 8,S ENABLE INTERRUPTS  JST OTA SEND IT JMP $ WAIT FOR INT * TCEXLNK JMP TSTC6 LINK TO EXIT TCGEXLNK JMP TSTC7 LINK TO GRAND EXIT * LPOOL TC1INT EQU $ JST $+1 MUST BE A JST/JSK NOP JST RETSTAT RETURN STATUS JMP TST1CK STATUS OK IMS ERORC ADD TO ERROR TOTAL TST1CK EQU $ COPY INTLNK,A GET INT LINK JEQ A,INTEX EXIT TO TSTC2 IF INT LINK=0 SUB =1,A IS IT=1? JEQ A,INTEX1 YES, EXIT TO TSTC3 SUB =1,A IS IT=2? JEQ A,INTEX2 YES, EXIT TO TSTC5 SUB =1,A IS IT=3? JEQ A,INTEX3 YES, EXIT TO TSTC5 COPY =:200,A WRITE 2 SECTORS BACK COPY A,WC(X) JST SAVEW CHECK IF NON-DESTRUCTIVE MODE REQUIRED JMP TSTC1+1 EXIT INTEX JMP TSTC2 INTEX1 JMP TSTC3 INTEX2 JMP TSTC5 INTEX3 JMP TSTC5 * LPOOL TSTC2 EQU $ * SET UP IOB COPY =DIOB,X INDEX IOB COPY =RDDAT,A GET READ (NO FILE LINK) COMMAND COPY A,OP(X) SAVE IT COPY =RBUF,A COPY A,MA(X) COPY =3,A SELECT INT LINK COPY A,INTLNK SAVE IT TSTC2A EQU $ SBIT 8,S ENABLE INT COPY =DIOB,A GET IOB ADDR JST OTA SEND IT JMP $ WAIT FOR INT * TSTC3 EQU $ TSTC5 EQU $ COPY =DIOB,X INDEX IOB COPY =:200,A GET 2 SECTORS IN WD CNT COPY A,WC(X) COPY CS(X),A GET CYL # SUB CYL,A IS IT ZERO? JNE A,TST5C NO, ERROR OCCURED COPY HS(X),A GET HEAD NUMBER SUB HEAD,A IS IT ZERO? JNE A,TST5C IF IT IS NOT 0 IMPLIES ERROR COPY SSS(X),A GET SECTOR # SUB SECTOR,A GET RID OF OFFSET JNE A,TST5C NO, ERROR RESULTED JST SAVEW CHECK IF NON-DESTRUCTIVE MODE REQUIRED COPY WDCOUNT,Q LENGTH OF BUFFER COPY =RBUF,X ADDR OF BUFFER JST TSTCVERI VERIFY THE DATA (A906) COPY PSIOFLG,A ARE WE DOING PARTIAL-SECTOR I/O? JEQ A,TST5C NO IMS WDCOUNT YES, BUMP WORD COUNT FOR NEXT SECTOR-WRITE TST5C EQU $ JMP TSTC1+1 DO NEXT SECTOR-WRITE TSTC6 IMS CTL BUMP CTL NOP JMP TSTC0 LOOP FOR MORE TSTC7 COPY =2,A ADDRESS OF THE ERROR CELL JST EROTAL GO ERR TALLY SUB SBIT 4,S ENABLE CONSOLE INT JMP *TESTC EXIT LPOOL TITL TEST D ******************************************* * * DISK TECH TEST D - * * WRITE TO SECTOR ZERO; READ FROM SECTOR ONE * ************************************************** * TESTD EQU;  $ ENT LOOPD COPY CAR,A GET RUN OPTIONS TBIT 6,A IS IT NON-DEST MODE? JF OV,$+2 NO JMP JMP *TESTD YES THEN DON'T RUN TEST JST MSGA PRINT TEST HEADING WORD TSTDMSG JST MSGA SEND CURRENT CYLINDER MESSAGE WORD CNTCYL COPY =0,A COPY A,ERORD CLEAR ERROR COUNT * JST CIOB CLEAR CIOB COPY =DIOB,X COPY =0,A COPY =UCUR,Y GET TABLE INDEX COPY 0(Y),A GET CURRENT UNIT SUB =:FFFF,A SEE IF END OF TABLE JEQ A,TSTDND YES EXIT TEST COPY 0(Y),A RESTOR CURRENT UNIT COPY A,UNIT COPY A,US(X) INTO CIOB ADD =1,Y INCREMENT POINTER * COPY =WRTDAT,A WRITE OPCODE COPY A,OP(X) IN CIOB COPY =0,A COPY A,CS(X) COPY A,SSS(X) WRITE COPY INITBK+2,A START WITH MINIMUM LOGICAL HEAD COPY A,HS(X) COPY =WBUF,A BUFFERADDRESS COPY A,MA(X) IN CIOB COPY =BELOW,A INTERRUPT ADDRESS COPY A,IN(X) IN CIOB COPY =:100,A ONE SECTOR COPY A,WC(X) IN CIOB * CLRNGO EQU $ SBIT 8,S ENABLE INTERRUPT COPY =0,A COPY A,CST(X) CLEAR STATUS COPY A,DST(X) DRV STAT COPY =DIOB,A JST OTA JMP $ WAIT FOR INTERRUPT * TSTDND JMP *TESTD EXIT * LPOOL * BELOW EQU $ JST $+1 NOP WRITE INTERRUPT LOC JST RETSTAT RETURN STATUS JMP AHEAD STATUS OK IMS ERORD ADD TO ERROR TOTAL * *READ NEXT SECTOR * AHEAD EQU $ COPY =DIOB,X COPY =4,A COPY A,OP(X) REAZD OPCODE COPY SSS(X),A GET WRITE SECTOR ADD =1,A INCREMENT COPY A,SSS(X) RETURN COPY =RBUF,A READ BUFFER COPY A,MA(X) COPY =FINAL,A COPY A,IN(X) INTERRUPT LOC JMP CLRNGO * LPOOL * FINAL EQU $ JST $+1 NOP JST RETSTAT DO STATUS CHECK JMP TESTD1 STATUS OK IMS ERORD BUMP ERROR COUNT JMP TESTD1 CONTINUE * JMP LOOPD FOR LOOPING (TECH TESTING) * LPOOL * TITL TESTD1 WRITE AND READ ALL ******************************************* * * * * THIS TEST WILL WRITE AND READ ALL * * SECTORS ON THE DISK * * ******************************************** * * * TESTD1 EQU $ COPY =0,A JST CIOB CLEAR IOB COPY =DIOB,X INDEX IOB * COPY =UCUR,Y INDEX UNIT TABLE COPY 0(Y),A GET IT COPY A,US(X) INTO CIOB COPY =0,A INITIALIZE CYL.HD AND SECT COPY A,CS(X) INTO IOB COPY A,SSS(X) INTO IOB COPY INITBK+2,A START WITH MINIMUM LOGICAL HEAD COPY A,HS(X) INTO IOB COPY =WBUF,A BUFFER ADD COPY A,MA(X) SAVE IT COPY =:100,A WRITE DESIRED SECTOR SIZE COPY A,WC(X) WORD COUNT * WRRTIN EQU $ COPY =DIOB,X INDEX IOB COPY =WRTDAT,A WRITE OPCODE COPY A,OP(X) INTO IOB COPY =WRTINT,A INTERRUPT LOCATION COPY A,IN(X) INTO IOB COPY =WBUF,A GET WRITE BUFFER COPY A,MA(X) INTO MEMORY ADDRESS POINTER JMP SENDIT LPOOL * * SENDIT EQU $ COPY =0,A COPY A,CST(X) CLEAR STATUS COPY A,DST(X) DRIVE STAT TOO COPY =DIOB,A CIOB ADDRESS SBIT 8,S TURN ON ITERRUPTS JST OTA SEND IT JMP $ LPOOL * * WRTINT EQU $ * JST $+1 INTERRUPT LOCATION NOP COPY CS(X),A GET CLY ADDRESS COPY A,CS(X) WILL BE INCORRECT FOR WRITE ERROR REPORT JST RETSTAT GO CHECK STATUS JMP RDRTIN GOOD STAT GO TO READ ROUTINE * * POSSIBLE CHANGE * IMS ERORD INCREMENT ERROR COUNT JMP RDRTIN  BAD STATUS GO DO READ FOR NOW * LPOOL * * READ ROUTINE * RDRTIN EQU $ COPY =DIOB,X INDEX IOB COPY =RDDAT,A GET READ O< PCODE COPY A,OP(X) INTO IOB COPY =RBUF,A GET READ BUFFER ADDRESS COPY A,MA(X) IN IOB COPY =RDINT,A READ ROUTINE INTERRUPT ADDRESS COPY A,IN(X) JMP SENDIT LPOOL * * READ EOB ROUTINE * RDINT EQU $ INTERRUPT LOCATION JST $+1 NOP JST RETSTAT JMP RDINT2 GOOD STATUS IMS ERORD BAD STAT INCREMENT ERROR COUNT RDINT2 EQU $ COPY =:100,Q LENGTH OF BUFFER COPY =RBUF,X ADDR OF BUFFER JST TSTCVERI VERIFY THE DATA JMP NEXTONE ALL DONE GO GET NEXT LPOOL TITL * * INCREMENT THE CIOB ADDRESS CLY,SEC,HED * NEXTONE EQU $ COPY =DIOB,X INDEX THE IOB COPY SSS(X),A GET CURRENT SECTOR CSK A,MAXSCTOR LAST SECTOR? JMP INCSEC NO, INCREMENT SECTOR JMP DEBUG SHOULD NEVER BE GREATER * BMPHED EQU $ COPY =0,A COPY A,SSS(X) START AT SECTOR ZERO COPY HS(X),A GET CURRENT HEAD CSK A,INITBK+1 COMPARE TO MAX (B020) JMP INCHEAD NOT YET MAX INCREMENT N' GO JMP DEBUG SHOULD NEVER BE GREATER JMP BMPCLY MAX HEAD GO INC CYL LPOOL * * * BMPCLY EQU $ COPY INITBK+2,A RESET IT TO THE MINIMUM LOGICAL HEAD COPY A,HS(X) COPY CS(X),A GET CURRENT CS CSK A,MAXCYL COMPARE TO MAX VALUE JMP INCCYL LESS. INCREMENT CYL N' GO JMP DEBUG GREATER SHOULD NEVER OCCUR * * COPY =3,A FOR RROR CELL 3 (ERRORD CELL) JST EROTAL GO TALLY ERRORS * * JMP *TESTD EQUAL MUST BE ALL DONE. EXIT LPOOL * * INCHEAD EQU $ IMS HS(X) INCREMENT HEAD ADDRESS JMP WRRTIN GO DO NEXT OPERATION * INCCYL EQU $ IMS CS(X) INCREMENT CYLINDER ADDRESS NOP COPY CS(X),A SELP A,4 SEND TO CDR COPY LPFLAG,A JNE A,INCCYL2 COPY CS(X),A JST ODEC AND TO CRT COPY =:0D,A JST OTTY INCCYL2 EQU $ JMP WRRTIN NEXT * INCSEC EQU $ IMS SSS(X) INCREMENT SECTOR ADDRESS JMP WRRTIN GO WRITE NEXT SECTOR LPOOL TITL DISK TEST E * ****************************************************** * * TEST E * * * * THIS TEST WRITES AND READS TO 0,0,0 ON THE DISK * THE STATUS IS CHECKED AND IF OK THE DATA * IS CHECKED ON A WORD BY WORD BASIS * * * *************************************** * TSTEND JMP *TESTE TEST E EXIT * TESTE ENT COPY CAR,A GET RUN OPTIONS TBIT 6,A IS IT NON-DEST MODE ? JF OV,$+2 NO JMP *TESTE YES EXIT, NO MESSAGE JST MSGA WORD TSTEMSG SEND MESSAGE JST MSGA SEND CURRENT CYLINDER MESSAGE WORD CNTCYL COPY =0,A COPY A,ERORE ZERO EROR CELL JST CIOB  CLEAR CIOB COPY =WBUF,A GET WRITE BUFFER ADDRESS COPY =DIOB,X GET CIOB INDEX COPY =0,A COPY =UCUR,Y GET TABLE INDEX COPY 0(Y),A GET CURRENT UNIT SUB =:FFFF,A SEE IF END OF TABLE JEQ A,TSTEND EXIT IF DONE COPY 0(Y),A RESTORE CURRENT NIT COPY A,UNIT COPY A,US(X) INTO CIOB ADD =1,Y INCREMENT POINTER COPY =WRTDAT,A WRITE OPCODE COPY A,OP(X) INTO CIOB COPY =0,A COPY A,CS(X) CYLINDER COPY A,SSS(X) SECTOR COPY INITBK+2,A START WITH MINIMUM LOGICAL HEAD COPY A,HS(X) HEAD COPY =WBUF,A BUFFER ADDRESS COPY A,MA(X) MEMORY ADDRESS COPY =WTINT,A INTERRUPT ADDRESS COPY A,IN(X) INTO CIOB COPY =:100,A COPY A,WC(X) WORD COUNT * * SENDE EQU $ COPY =0,A CLEAR STAT COPY A,CST(X) CONT STAT COPY A,DST(X) DRV STAT COPY CS(X),A GET CURRENT CYLINDER SELP A,4 SEND TO CDR JST ODEC =  SEND TO CRT COPY =:0D,A CR CHARACTER JST OTTY TO CRT COPY =DIOB,A SBIT 8,S ENABLE INTERRUPTS JST OTA GO SEND IT * JMP $ WAIT FOR INT * * WTINT EQU $ JST $+1 WRITE INTERRUPT LOCATION NOP JST RETSTAT GO CHECK STATUS JMP RDAHD OK GO DO READ IMS ERORE ERROR * * JMP *TESTE EXIT ?? * ************************************************** * RDAHD EQU $ COPY =RBUF,X GET BUFFER ADDRESS COPY =-519,A NUMBER OF BYTES COPY A,FILNCT INTO COUNTER LOCATION COPY =0,A * * KPGNG COPY A,0(X) WRITE INTO INDEXED BUFFER ADD =1,X INCREMENT POINTER IMS FILNCT INCREMENT COUNTER JMP KPGNG KEEP GOING * * DONE * COPY =DIOB,X INDEX CIOB COPY =RDDAT,A READ OPCODE COPY A,OP(X) INTO CIOB COPY =RBUF,A COPY A,MA(X) BUFFER ADDRESS COPY =RDEINT,A INTERRUPT COPY A,IN(X) INTO CIOB * * JMP SENDE IT * RDEINT EQU $ READ INTERRUPT ADDRESS * JST $+1 NOP JST RETSTAT GO CHECK STATUS JMP CHKDAT GOOD STATUS GO CHECK STATUS IMS ERORE BAD STATUS INC COUNTER JMP TSEXIT EXIT TEST * * CHKDAT EQU $ COPY =WBUF,A WRITE BUFFER ADDRESS COPY A,X X IS INDEX TO WRITE BUFFER COPY =RBUF,A READ BUFFER COPY A,Y Y IS INDEX TO READ BUFFER * COPY =-256,A SET UP FOR ONE SECTOR WORD COUNT COPY A,FILNCT LOCATION TO BE INCREMENTED * * THE POINTERS ARE NOW INITIALIZED * CMPAGN COPY 0(X),A A REG IS WRITE DATA COPY 0(Y),Q Q REG IS READ DATA CSK A,Q COMPARE THEM NOP LESS THAN JMP MISCMP MISS COMPARE ADD =1,X DATA COMPARES DO NEXT ADD =1,Y DITTO IMS FILNCT SEE IF ALL DONE JMP CMPAGN NO GO COMPARE AGAIN * * TSEXIT COPY =4,A INDEX ERROR CELL JST EROTAL GO TOTAL ERRORS SBIT 4,S  ENABLE CONSOLE INT JMP *TESTE EXIT LPOOL * * MISCMP EQU $ JST MSGA WORD MISCOMP OUTPUT DATA MISCOMPARE MESSAGE JST MSGA WORD EXWD OUTPUT EXPECTED WORD COPY 0(X),A JST OHEX JST MSGA WORD ACTWD OUTPUT ACTUAL WORD COPY 0(Y),A  JST OHEX JST MSGA WORD ERRADD ERROR ADDRESS COPY Y,A JST OHEX * JMP TSEXIT TITL DISK TEST F ****************************************************** * * TEST F - * * 1) DO TRACK WRITES FOR THE ENTIRE DISK. * 2) READ & VERIFY (BYTE BY BYTE) EVERY TRACK * ****************************************************** * TESTF EQU $ ENT JST MSGA WORD TSTF  SEND TEST MESSAGE JST MSGA SEND CURRENT CYL MSG WORD CNTCYL COPY =0,A COPY A,ERORF CLEAR ERROR CELL COPY CAR,A TBIT 6,A IS IT NON-DEST? JF OV,$+2 IF NO JUMP JMP RDONLY MUST BE IN NON-DEST MODE * * INITIALIZE WRITE BUFFERS * COPY =WBUF,X COPY =-4096,A COPY A,FILNCT COPY PATN,A TESTF1 EQU $ COPY A,0(X) ADD =1,X IMS FILNCT JMP TESTF1 * JST CIOB COPY =DIOB,X COPY =UCUR,Y COPY 0(Y),A COPY A,UNIT COPY A,US(X) * COPY =WRTDAT,A COPY A,OP(X) COPY =0,A COPY A,CS(X) COPY A,SSS(X) COPY INITBK+2,A START WITH MINIMUM LOGICAL HEAD COPY A,HS(X) * COPY =WBUF,A COPY A,MA(X) COPY =WRDUN,A COPY A,IN(X) COPY =:1000,A COPY A,WC(X) * DOWRT EQU $ SBIT 8,S TUREN ON INTERRUPTS COPY =0,A COPY A,CST(X) COPY A,DST(X) COPY =DIOB,A JST OTA * JMP $ * LPOOL * WRDUN EQU $ JST $+1 NOP JST R> ETSTAT JMP $+2 STATUS OK IMS ERORF INCREMENT ERROR TOTAL NOP COPY HS(X),A CSK A,INITBK+1 SEE IF MAX HEAD (B020) JMP GOINC1 LESS GO INCREMENT * JMP DEBUG GREATER SHOULD NEVER OCCUR * * THE HEAD ADDRESS HAS MAXED GO CHECK CYLINDER * COPY INITBK+2,A RESET HEAD TO MINIMUM LOGICAL HEAD COPY A,HS(X) COPY CS(X),A GET CYL CSK A,MAXCYL COMPARE TO MAX JMP GOINC2 LESS GO INCREMENT JMP DEBUG GREATER SHOULD NEVER OCCUR JMP RDONLY MAX GO DO READ ROUTINE * LPOOL * GOINC1 EQU $ ADD =1,A INCREMENT HEAD COPY A,HS(X) JMP DOWRT GO SEND IT * LPOOL * GOINC2 EQU $ ADD =1,A INCREMENT CYL COPY A,CS(X) SELP A,4 SEND CYL TO CDR COPY LPFLAG,A JNE A,GOINC3  COPY CS(X),A JST ODEC AND TO CRT COPY =:0D,A JST OTTY GOINC3 EQU $ JMP DOWRT * LPOOL * * * RDONLY EQU $ COPY =0,A COPY A,RBUF INITIALIZE BUFFER COPY =-:1000,A JST MOVE WORD RBUF WORD RBUF+1 * JST CIOB COPY =DIOB,X COPY =UCUR,Y INDEX SOME TABLE COPY 0(Y),A COPY A,US(X) * COPY =RDDAT,A COPY A,OP(X) COPY INITBK+1,A START WITH LOGICAL MINIMUM HEAD# (B021) COPY A,HS(X) COPY =RBUF,A COPY A,MA(X) COPY =:1000,A COPY A,WC(X) COPY =FRDINT,A COPY A,IN(X) * DOREAD EQU $ SBIT 8,S COPY =DIOB,A JST OTA JMP $ * LPOOL * FRDINT EQU $ JST $+1 NOP JST RETSTAT JMP $+3 GOOD STATUS, VERIFY THE DATA IMS ERORF BAD JMP DONEXT DONT CHECK DATA , ADVANCE HEAD COPY =RBUF,X BUFFER ADDRESS (B010)  COPY =:1000,Q BUFFER LENGTH (B010) JST TSTCVERI VERIFY THE DATA (B010) * DONEXT EQU $ COPY =0,A COPY A,RBUF ZERO OUT BUFFER COPY =-:1000,A JST MOVE WORD RBUF WORD RBUF+1 INITIALIZE IT COPY =DIOB,X COPY HS(X),A CSK A,INITBK+1 SEE IF MAX HEAD (B020) JMP DONEXT2 LESS, GO DO MORE JMP DEBUG GREATER ERROR * * COPY INITBK+2,A RESET TO MINIMUM LOGICAL HEAD COPY A,HS(X) * COPY CS(X),A CSK A,MAXCYL JMP DONEXT3 JMP DEBUG * COPY =5,A INDEX ERROR CELL FOR TEST F JST EROTAL GO TALLY ERRORS JMP *TESTF ALL DONE * DONEXT2 EQU $ ADD =1,A BUMP THE HEAD & DO NEXT READ COPY A,HS(X) JMP DOREAD * DONEXT3 EQU $ ADD =1,A BUMP THE CYLINDER & DO NEXT READ COPY A,CS(X) SELP A,4 COPY LPFLAG,A JNE A,DONEXT4 COPY CS(X),A JST ODEC COPY =:0D,A JST OTTY DONEXT4 EQU $ JMP DOREAD LPOOL TITL FORMAT ROUTINE *********************************** * * FORMAT - FORMAT ROUTINE * * THIS ROUTINE WILL * (1) FORMAT THE DISK, * (2) CHECK FORMAT, * * * CALLING SEQUENCE: JST FORMAT * * * CALLS: CALLED BY: * CIOB EXEC * ERROR * FMTBT * MSGA * ODEC *  OTA * * *********************************** * FORMAT ENT JST MSGA PRINT 'UNIT' WORD UNITMSG COPY =0,A COPY A,ERFORM CLEAR ERROR CELL COPY =UCUR,Y INDEX UNIT # TABLE COPY =0,A CLEAR UNIT # COPY A,UNIT DO IT FORMNU EQU $ FORMAT NEW UNIT COPY 0(Y),A GET CURENT UNIT # CSK A,=:FFFF IS IT END OF TABLE? JMP $+3 NOT END OF TABLE JMP $+2 NOT END OF TABLE JMP FMTEND JST ODEC PRINT IT COPY Y,TEMP2 SAVE Y COPY MAXCYL,A GET MAX CYL ADD =10,A INCREMENT TO MAX PHYSICAL-CYL ADDR COPY A,MAXC? YL NOW DO FORMAT * COPY CAR,A TBIT 15,A VERIFY ONLY? JF OV,$+2 JMP CKFORMAT * JST MSGA PRINT FORMAT HEADING WORD FMTM COPY TEMP2,Y RESTORE Y * * * TEST TO SEE IF DRIVE ON LINE * * COPY =DIOB,X INDEX IOB COPY =0,A TEST I/O OPCODE COPY A,OP(X) PUT IN IOB COPY A,DST(X) CLEAR DRIVE STATUS COPY 0(Y),A GET UNIT TO BE FORMATTED COPY A,US(X) PUT IN IOB COPY =TSTIO1,A INTERRUPT ADDRESS COPY A,IN(X) PUT IN IOB SBIT 8,S ENABLE INTERRUPTS COPY =DIOB,A JST OTA SEND IT JMP $ WAIT FOR INTERRUPT * * * TSTIO1 EQU $ JST $+1 INTERRUPT LOCATION NOP COPY US(X),A COPY A,Q PUT UNIT # IN Q REG JST RETDST GO CHECK DRIVE STATUS JMP FMTIOB IF ON-LINE THEN FORMAT JST MSGA ELSE SEND MESSAGE WORD UNRDY JMP *FORMAT EXIT FORMAT ROUTINE * * SET UP IOB FMTIOB JST CIOB CLEAR IOB COPY =DIOB,X INDEX IOB COPY 0(Y),A GET UNIT # COPY A,UNIT SAVE IT COPY A,US(X) SAVE IT ADD =1,Y BUMP TABLE POINTER COPY =FRMT,A GET FORMAT COMMAND COPY A,OP(X) SAVE IT COPY =FMAB,A GET FORMAT SUB-OPCODE COPY A,WC(X) SAVE COPY =FORMAT1,A GET INT ADDR COPY A,IN(X) SAVE IT COPY INTRLVF,A GET INTERLEAVE FACTOR COPY A,SSS(X) PUT IN IOB COPY =-2,A SET UP RETRY COUNTS COPY A,COUNT SAVE IT * FORMAT ALL BLOCKS FORMATL EQU $  COPY =:FF01,A GET CDR CONTENT COPY UNIT,Q GET UNIT # SHIFT Q,LO,4 LINE IT UP OR Q,A OR IN UNIT # SELP A,4 DISPLAY CDR SBIT 8,S ENABLE INTS COPY =0,A COPY A,CST(X) CLEAR CONTROLLER STATUS COPY A,DST(X) CLEAR DRIVE STATUS COPY =DIOB,A GET IOB ADDR JST OTA SEND IT JMP $ WAIT FOR INT * * FORMAT1 EQU $ JST $+1 INT ENTRY MUST BE A JST/JSK NOP COPY =DIOB,X INDEX IOB JST RETSTAT CHECK THE STATUS JMP CKFORMAT STATUS OK GO TO CHECK FORMAT IMS COUNT BUMP THE RETRY COUNT JMP FRMTRY RETRY JMP PSU+4 DISK CANNOT FORMAT * FRMTRY JST MSGA OUTPUT MESSAGE WORD RETRY RETRYING FORMAT JMP FORMATL RETRY LPOOL * TITL CHECK FORMAT ***************************************************************** * * CHECK FORMAT ROUTINE * * DO THE READ-VERIFY ON THE LOGICAL CYLINDERS ONLY. * * THE ACTUAL FORMAT-ALL COMMAND WAS FOR ALL THE PHYSICAL CYLINDERS * BUT SINCE THE DISK IS INITIALIZED TO PHYSICAL-10, JUST VERIFY * THE LOGICAL CYLINDERS. * ***************************************************************** * CKFORMAT EQU $ COPY MAXCYL,A DO THE CHECK ON THE LOGICAL, NOT PHYSICAL, CYL'S SUB =10,A COPY A,MAXCYL JST MSGA PRINT CHECK MESSAGE WORD FMTM1 JST MSGA SEND CURRENT CYLINDER MESSAGE WORD CNTCYL COPY CAR,A NOP THESE THREE LOCATIONS SBIT 1,A IF ERROR REPORTS DESIRED COPY A,CAR DURING FORMAT COPY =BADBUF1,A COPY A,BUFPTR1 * SET UP IOB JST CIOB CLEAR THE IOB COPY =DIOB,X COPY =RDVER,A COPY A,OP(X) COPY =UCUR,Y COPY 0(Y),A COPY A,US(X) COPY =:1000,A COPY A,WC(X) COPY =CKFM1,A COPY A,IN(X) COPY INITBK+2,A START WITH THE LOGICL MINIMUM HEAD COPY A,HS(X) COPY =-1,A GET RETRY COUNTS COPY A,COUNT SAVE IT * FORMAT CHECK CKFML EQU $ COPY CS(X),A GET THE CURRENT CYLINDER SELP A,4 OUTPUT TO CDR COPY LPFLAG,A JNE A,CKFML2 COPY CS(X),A JST ODEC OUTPUT TO CRT COPY =:0D,A GET CARRIAGE RETURN CHARACTER JST OTTY OUTPUT CKFML2 EQU $  SBIT 8,S ENABLE INT COPY =0,A COPY A,CST(X) CLEAR CONTROLLER STATUS COPY A,DST(X) CLEAR DRIVE STATUS COPY =DIOB,A GET IOB @ ADDR JST OTA SEND IT JMP $ WAIT FOR INT * COUNT WORD 0 COUNTER CELL LPOOL * CKFM1 EQU $ JST $+1 MUST BE A JST/JSK NOP COPY =DIOB,X INDEX IOB JST RETSTAT CHECK THE STATUS JMP CKNTS OK, GO ON JMP CKFMRT GO TO RETRY CKNTS EQU $ COPY =-3,Q RESET THE COUNTER COPY Q,COUNT COPY HS(X),A CSK A,INITBK+1 GOT TO MAXHEAD YET (B020) JMP INCHD NO CONTINUE JMP DEBUG4 ERROR JMP NXCYL NEXT CYLINDER INCHD IMS HS(X) JMP CKNTS1 INCREMENT THE HEAD NUMBER NXCYL COPY CS(X),A CSK A,MAXCYL CHECK TO SEE IF GOT TO LAST CYL JMP BUMPCYL NO INCREMENT THE CYLINDER NO & CONTINUE JMP DEBUG4 ERROR JMP FMTEND EXIT BUMPCYL IMS CS(X) INCREMENT CYLINDER COPY INITBK+2,A RESET TO MINIMUM LOGICAL HEAD COPY A,HS(X) JMP CKNTS1 CKNTS1 JMP CKFML CHECK NEXT TRACK * FORLNK JMP FORMNU LINK TO NEXT UNIT * CKFMRT EQU $ IMS COUNT BUMP COUNT JMP CKFML CHECK AGAIN ******************************** * *  SAVE THE BAD TRACK * COPY HS(X),A GET BAD HEAD COPY A,HEAD SAVE IT COPY CS(X),A GET BAD CYL COPY A,CYL SAVE IT LGBADTR JST ERRCK SEE IF IN MANU. BAD SPOTS JMP CKNTS YES, DO NOT LOG AGAIN COPY CS(X),A GET BAD CYL SHIFT A,LO,4 PUT IN UPPER 3 NIBBLES  OR HS(X),A PUT HEAD IN LOWER NIBBLE COPY A,*BUFPTR1 PUT CYL/HD IN TABLE COPY *LIMIT1,A GET POINTER TO END OF TABLE SUB BUFPTR1,A BUFFER FULL YET? JEQ A,BTERR YES, PRINT ERROR MESSAGE IMS BUFPTR1 NO, SO BUMP POINTER CKFMTEN JMP CKNTS OK, CHECK NEXT TRACK BTERR JMP QURYM36 BUFFER FULL ERROR MESSAGE FMTEND EQU $ JST EROTAL GO ERR TALLY SUB COPY CAR,A GET THE OPTIONS RBIT 1,A RESET THE SUPPRESS REPORT BIT COPY A,CAR JMP *FORMAT * LPOOL TITL ASSALT - ASSIGN ALTERNATE TRACKS FOR THE BAD TRACKS *********************************** * * ASSALT - SUBROUTINE TO ASSIGN ALTERNATE TRACKS * * * * CALLING SEQUENCE - JST ASSALT * * * CALLS: CALLED BY: * ERROR EXEC * OTA * ODEC * MSGA * ASANOTH * * ********************************** * ASSALT EQU $ ENT * * * * COPY MAXCYL,A ADD =10,A THE MAXIMUM ALTERNATE CYLINDER IS INIT +10 COPY A,ALTCYL SET THE ALTERNATE CYLINDER COPY MAXCYL,A RESTORE ADD =1,A  THE MINIMUM ALTERNATE IN INIT MAX PLUS 1 COPY A,MINALTC SAVE IN MIN ALT CYLINDER SHIFT A,LO,4 SHIFT LEFT THE CYLINDER NUMBER OR INITBK+1,A OR IN THE MAX HEAD (B020) COPY A,MINALT SAVE IN MIN ALT JST COMBUFF REDUCE TO ONE BUFFER JST CKFORDUP ELIMINATE DUPLICATION COPY =1,A SET FLAG FOR ERR COPY A,ERADFL COPY INITBK+2,A START WITH THE LOGICAL MINIMUM HEAD SUB  =1,A THIS TAKES CARE OF THE 1ST TIME THRU 'ASANOTH' COPY A,ALTHEAD SET THE ALTERNATE HEAD COPY =BADBUF,A GET BAD BUFFER ADDRESS COPY A,BUFPTR SAVE IT IN BUFFER POINTER * COPY =-1,A RE-INITIALIZE BUFFER IN CASE WE'RE IN CONTINUOUS MODE COPY A,BADBUF1 COPY =-BADBUFSZ-1,A JST MOVE WORD BADBUF1 FROM BUFFER WORD BADBUF1+1 TO BUFFER * COPY =BADBUF1,A GET THE ALTERNATE BUFFER ADDRESS COPY A,BUFPTR1 FOR THE BAD TRACK MAP....... **** * SET UP THE IOB STNXIOB JST CIOB CLEAR THE IOB COPY =UCUR,Y GET CURRENT UNIT # COPY 0(Y),A GET UNIT # COPY A,UNIT SAVE IT COPY =DIOB,X INDEX ON THE IOB COPY =FRMT,A GET FORMAT OP CODE COPY A,OP(X) SAVE IN IOB COPY UNIT,A GET CURRENT UNIT COPY A,US(X) PUT IN IOB COPY =FMAL,A GET ALT TRACK OP CODE CA OPY A,WC(X) PUT IN IOB COPY =ALTINT,A INTERRUPT ADDRESS COPY A,IN(X) PUT IN IOB COPY INTRLVF,A GET THE INTERLEAVE FACTOR COPY A,SSS(X) AND PUT IT INTO THE IOB STNXT EQU $ COPY =-2,A COPY A,COUNT SET THE ERROR COUNT COPY *BUFPTR,A GET CYL/HD PAIR CSK A,=-1 END OF THE TABLE JMP $+3 NO CONTINUE JMP $+2 NO CONTINUE JMP ALTFEN OK FINISHED IMS BUFPTR INCREMENT THE POINTER COPY A,Q AND =:F,A ISOLATE HEAD NUMBER AND =:FFF0,Q ISOLATE THE CYLINDER NUMBER ROTATE Q,RO,4 PUT IN THE LOWER NIBBLE COPY Q,CS(X) PUT CYLINDER IN IOB COPY Q,CYL COPY A,HEAD SAVE THE HEAD THE CYL COPY A,HS(X) PUT HEAD IN IOB JST ASANOTH ASSIGN A PAIR OF ALTERNATES COPY =DIOB,X RESTORE THE INDEX COPY ALTCYL,A GET CURRENT ALTERNATE CYLINDER COPY A,TST1(X) PUT ALTCYL IN WORD 12 OF IOB ROTATE A,LO,4 SHIFT IT LEFT FOUR COPY ALTHEAD,Q GET ALT HEAD COPY Q,TST3(X) PUT IN WORD 13 OF IOB OR Q,A OR IN THE HEAD COPY A,*BUFPTR1 SAVE IN THE ALT BUFFER IMS BUFPTR1 INCREMENT THE POINTER * DO ALT ASSIGNMENT REALTAS SBIT 8,S ENABLE INTERRUPTS COPY =0,A COPY A,CST(X) CLEAR CONTROLLER STATUS COPY A,DST(X) CLEAR DRIVE STATUS COPY =DIOB,A GET IOB ADDR JST OTA SEND IT JMP $ WAIT FOR INTERRUPT LPOOL * ALTINT EQU $ JST $+1 NOP COPY =DIOB,X INDEX ON IOB JST RETSTAT CHECK THE STATUS JMP STNXT IMS COUNT INCREMENT THE ERROR COUNT JMP REALTAS TRY AGAIN JMP STNXT NO GOOD ?> ALTFEN EQU $ COPY =-1,A COPY A,*BUFPTR1 SET THE LAST ENTRY MARK JMP *ASSALT AND RETURN LPOOL TITL SUBROUTINE TO ASSIGN THE ALTERNATE PAIR ****************************************************** * * * ASANOTH - WILL ASSIGN A HEAD AND CYLINDER * ALTERNATE PAIR FOR A BAD TRACK * * IT ALSO CALLS CKBDALT TO CHECK * IF THE ALTERNATE PAIR IS IN THE * ALTERNATE AREA OF THE DISK * * * CALLED BY - ASSALT CALLS - CKBDALT * * * ********************************************************* * ASANOTH ENT $ REASS EQU $ COPY INITBK+1,A GET MAX HEAD NUMBER (B020) CSK A,ALTHEAD CHECK IF AT MAX JMP DEBUG4 ERROR EXIT JMP INCALTHD INCREMENT THE ALTERNATE HEAD JMP CKCYL LAST HEAD INC THE CYLINDER # INCALTHD EQU $ IMS ALTHEAD NOP 1ST TIME THRU HERE ALTHEAD COULD EQUAL -1 B4 THE IMS JMP NXBADTR START NEXT BAD TRACK CKCYL COPY =0,A CLEAR THE HEAD # COPY A,ALTHEAD DO IT COPY ALTCYL,A GET CYLINDER NUMBER CSK A,MINALTC CHECK IF LAST JMP DEBUG4 ERROR EXIT JMP DECCYL DECREMENT ALT CYL JMP DEBUG4 DECREMENT ALT CYL DECCYL SUB =1,A COPY A,ALTCYL SAVE NEXT ALT CYLINDER NXBADTR JST CKBDALT CHECK IF BAD ALT PAIR JMP REASS BAD PAIR REASSIGN JMP *ASANOTH RETURN LPOOL TITL CHECK FOR DUPLICATE BUFFER ENTRIES * * ************************************************************** * * * * * CKFORDUP - SUBROUTINE TO FIND AND ELIMINATE DUPLICATE ENTRIES  * IN THE BAD BUFFERS * * REMOVE ANY BAD TRACK THAT IS IN THE * ALTERNATE TRACK AREA * * CALLING SEQUENCE - JST CKFORDUP * * * CALLS - PCKBUFF * * *************************************************************** * * * * CKFORDUP ENT $ COPY =BADBUF,Y SET UP INDEX ON BUFFER ADDRESS COPY =BADBUF1,A GET BAD ALT BUFF COPY A,BUFPTR1 SET UP POINTER COPY =0,A COPY A,TMPLOC CLEAR TEMP LOCATION COPY A,X CLEAR OTHER INDEX CKFRDUP COPY 0(X,Y),Q GET LOCATION TO CHECKB  ADD =1,Q CHECK FOR END JEQ Q,CKBUEND JUMP TO END IF ZERO COPY 0(X,Y),Q RESTORE Q COPY MINALT,A GET THE LIMIT CSK Q,A CHECK FOR OUTSIDE LIMIT JMP NXDUPCK OK OUTSIDE THE ALT TRACK RANGE NOP INSIDE THE ALT TRACK RANGE COPY Q,*BUFPTR1 SAVE IN OTHER BUFFER IMS BUFPTR1 INCREMENT POINTER JST PCKBUFF DELETE THE ENTRY JMP CKFRDUP TRY AGAIN NXDUPCK ADD =1,X BUMP ADDRESS COPY 0(X,Y),A GET LOCATION ADD =1,A CHECK FOR END JEQ A,CKNXLOC ZERO, CHECK NEXT DUP. COPY 0(X,Y),A RESTORE A SUB Q,A CHECK FOR DUPLICATION JNE A,NOPCKB IF NOT ZERO DO NOT PACK JST PCKBUFF JUMP TO PACK BUFFER NOPCKB JMP NXDUPCK CKNXLOC ADD =1,Y BUMP Y COPY =0,X RESET X JMP CKFRDUP GO TO NEXT CHECK CKBUEND JMP *CKFORDUP RETURN TO CALLER LPOOL * * TITL PACK THE BUFFER **************************************************** * * * PCKBUFF - PACK BUFFER * * CALLING SEQUENCE - JST PCKBUFF * *  ADDRESS OF BUFFER START IN Y-REG * ADDRESS OF LOCATION TO BE PACKED IN X-REG * *************************************************** * * PCKBUFF ENT $ COPY X,TMPLOC SAVE X BMPCKMK COPY 1(X,Y),A GET NEXT LOC. COPY A,0(X,Y) SAVE IN PREVIOUS LOC. ADD =1,A CHECK FOR END JEQ A,RESTX JUMP IF THE END ADD =1,X BUMP X JMP BMPCKMK CONTINUE RESTX COPY TMPLOC,X RESTORE X JMP *PCKBUFF RETURN TO CALLER TMPLOC WORD :0 TEMP LOCATION TITL COMBINE BAD BUFFERS ******************************************************** * * * * COMBUFF - SUBROUTINE TO COMBINE THE TO BAD * BUFFERS INTO ONE: BADBUF * * * CALLING SEQUENCE - JST COMBUFF * * * CALLS - NONE * ********************************************************* * COMBUFF ENT COPY =BADBUF,A GET LOCATION OF ONE BUFFER COPY A,BUFPTR SAVE IN POINTER COPY =BADBUF1,A GET LOCATION OF SECOND BUFFER COPY A,BUFPTR1 SAVE IN POINTER COMB2 COPY *BUFPTR,A GET A LOCATION ADD =1,A CHECK FOR THE END JEQ A,COMB1 JUMP IF END IMS BUFPTR INCREMENT BUFFER POINTER JMP COMB2 COMB1 COPY *BUFPTR1,A GET A LOCATION IN SECOND BUFFER COPY A,*BUFPTR SAVE IN FIRST BUFFER ADD =1,A CHECK FOR END JEQ A,COMB3 JUMP IF END IMS BUFPTR1 IMS BUFPTR INCREMENT BOTH POINTERS COPY LIMIT,A GET BUFFER LIMIT CSK A,BUFPTR COMPARE TO BUFFER POINTER JMP $+2 ERROR EXCESSIVE BAD SPOTS JMP COMB1 DO THE NEXT JMP QURYM36 COMB3 COPY =BADBUF1,Y SET THE INDEX COPY =0,X CLEAR INDEX COPY BUFPTR1,A SET UP LIMIT SUB =BADBUF1,A SUBTRACT BUFFER LOCATION COPY A,Q SAVE IN Q COPY =-1,A SET FILLER VALUE COMB4 COPY A,0(X,Y) CLEAR LOCATION ADD =1,X INCREMENT INDEX CSK X,Q COMPARE TO BUFFER POINTER JMP COMB4 GO ON NOP JMP *COMBUFF RETURN TO CALLER LPOOL TITL CHECK FOR BAD ALTERNATE CYL HEAD PAIR ********************************************************* * * * CKBDALT - SUBROUTINE TO CHECK IF THE CURENT CYLINDER * AND HEAD TO ASSGINED AS ALTERNATES ARE BAD * * * CALLED BY - ASSALT * ********************************************************** * CKBDALT ENT COPY ALTCYL,A GET CURRENT ALTERNATE SHIFT A,LO,4 SHIFT LEFT OR ALTHEAD,A OR CURRENT ALT HEAD COPY A,Q SAVE IN Q COPY =BADBUF1,Y SET INDEX COPY =0,X SET INDEX CKBDALT1 COPY 0(X,Y),A GET LOCATION SUB Q,A CHECK IF EQUAL JEQ A,CKBDALT2 JUMP IF ZERO COPY 0(X,Y),A RESTORE A ADD =1,A CHECK FOR END JEQ A,CKBDALT3 JUMP IF ZERO ADD =1,X INCREMENT INDEX JMP CKBDALT1 CKBDALC T3 IMS CKBDALT RETURN ONE LOCATION FURTHER IF OK CKBDALT2 JMP *CKBDALT RETURN LPOOL TITL PRINT THE BAD TRACK MAP ******************************************************* * * PRBDTRK - PRINT THE BAD TRACKS * * * * * ******************************************************* PRBDTRK ENT COPY =BADBUF,A GET BAD TRACK BUFFER ADDRESS COPY A,BUFPTR PUT IN THE BUFFER POINTER COPY =BADBUF1,A GET THE ALTERNATE TRACK BUFFER ADDRESS COPY A,BUFPTR1 PUT IN THE POINTER JST MSGA OUTPUT MESAGE WORD BDTRKMP 'BAD TRACK MAPPED TO' PRBDRET COPY *BUFPTR,A GET THE BAD TRACK COPY A,Q ADD =1,Q CHECK FOR THE END JNE Q,PRBDCON JUMP IF ZERO JMP PRBDEND OK, FININSHED.....?/? PRBDCON EQU $ COPY A,Q JST MSGA OUTPUT WORD ADRCYL CYL: COPY Q,A AND =:F,Q ISOLATE THE HEAD ROTATE A,RO,4 PUT IN THE LOWER NIBBLE AND =:0FFF,A AND ISOLATE THE CYLINDER JST ODEC OUTPUT THE CYLINDER JST MSGA OUTPUT WORD ADRHD HEAD: COPY Q,A GET THE HEAD JST ODEC OUTPUT THE HEAD JST SPACE GIVE SOME SPACE JST SPACE JST SPACE JST SPACE JST SPACE JST SPACE JST SPACE JST MSGA OUTPUT WORD ADRCYL CYL: COPY *BUFPTR1,A GET THE ALT TRACK COPY A,Q AND =:000F,Q ISOLATE THE HEAD ROTATE A,RO,4 PUT IN THE LOWER NIBBLE AND =:0FFF,A AND THE CYLINDER JST ODEC AND THE CYLINDER JST MSGA OUTPUT WORD ADRHD HEAD: COPY Q,A JST ODEC OUTPUT THE HEAD JST CRLF IMS BUFPTR INCREMENT THE POINTERS IMS BUFPTR1 JMP PRBDRET GO ON PRBDEND EQU $ JMP *PRBDTRK RETURN LPOOL TITL TECH TEST ***************************************************** * * TECH - TECH TEST * * THE TECH TEST WILL REQUEST INPUTS FOR PARAMETERS * FOR WHICH AN IOB WILL BE BUILT. THEN THE TECH * TEST WILL REPEATEDLY PERFORM THE REQUESTED * FUNCTION, WITH NO STATUS CHECKING OF TIMEOUT * LOOPS. AS SOON AS AN OPERATION COMPLETES, IT * IS THEN REPEATED. * * ESCAPE IS VIA THE CONSOLE INTERRUPT WHICH * RETURNS TO THE QUERIES. * * CALLS: CALLED BY: * DUMP * FILINC * GNF TEST CONTROL * IHEX * IKB * MOVE * MSGA * OTA * SEL * SENRDY * ****************************************************** * TECH EQU $ COPY CAR,A GET RUN OPTION AND =:20,A MASK OUT OPTIONS EXCEPT LP COPY A,CAR PUT IT BACK TECH1 EQU $ RBIT 8,S JST SEL KILL ANY DISK INTS SBIT 8,S NEED INTERRUPTS SBIT 4,S ALSO FOR CONSOLE TOO COPY =0,A COPY A,TTFC CLEAR PARAMETER TABLE COPY =-15,A JST MOVE WORD TTFC WORD TTFC+1 COPY =:100,A MAX WORD LENGTH COPY A,TTLT JST MSGA REQUEST PARAMETERS WORD TTMSG JST GNF GET NEXT FIELD COPY A,TTFC SAVE FC CSK A,=6 CSK A,=0 JMP TECH1 NOP COPY X,TTMP COPY A,X COPY TTFC,A AND =:FFF0,A ADD =OPCODE,X ADD 0(X),A COPY A,TTFC COPY TTMP,X CLSN =CR:,X DONE? JMP TECH2 YES, SKIP NEXT QURIES JST GNF GET UNIT NO COPY A,TTU SAVE IT JLT A,TECH1 MUST 0-MAX, SUB =3,A JGT A,TECH1 CLSN =CR:,X DONE? JMP TECH2 YES COPY MAXCYL,A COPY A,TEMP1 HIGHEST CYL # JST GNF NO, GET CYL # COPY A,TTC SAVE IT COPY =:FFF,A MUST BE W/ IN RANGE AND TTC,A CSK A,TEMP1 JMP $+2 OKAY TOTT1 JMP TECH1 BAD, START OVER CLSN =CR:,X DONE? JMP TECH2 YES COPY INITBK+1,A (B020) COPY A,TEMP1 HIGHEST HEAD # JST GNF NO, GET HEAD # COPY A,TTH SAVE IT JLT A,D TECH1 MUST BE W/ IN RANGE CSK A,INITBK+2 COMPARE HEAD # TO MINIMUM LOGICAL HEAD # JMP TECH1 INVALID NOP  OK AND =:FF1F,A SUB TEMP1,A JGT A,TECH1 ERROR, START OVER CLSN =CR:,X DONE? JMP TECH2 YES COPY MAXSCTOR,A COPY A,TEMP1 HIGHEST SECTOR # JST GNF NO, GET SECTOR # COPY A,TTS AND SAVE IT JLT A,TOTT1 MUST BE W/ IN RANGE SUB TEMP1,A JGT A,TOTT1 NO, START OVER CLSN =CR:,X JMP TECH2 IF DONE JST IKB GET INTERRUPT REQUEST CLSN ='Y',A Y OF N JMP TECH1A CLSN ='N',A JMP TECH1A TECH1B CLSN =',',A COMMA IS OK JMP TECH1C CLSN =CR:,A CARRIAGE RET IS OK TOO JMP TECH2 JMP TECH1 ELSE, ILLEGAL * LPOOL TECH1A SUB ='Y',A SET FLAG COPY A,TTIN JST IKB GET TERMINATOR JMP TECH1B TECH1C JST GNF GET LENGTH JNE A,$+2 ZERO=1 COPY =1,A COPY A,TTLN CSK A,TTLT MUST BE TWO SECTORS OF LESS JMP $+2 TECH1X JMP TECH1 TRY AGAIN TECH1D CLSN =CR:,X DONE? JMP TECH2 YES JST IHEX NO, GET WORD PATTERN EXCH A,X COPY A,TTDP COPY A,TTDP1 COPY =0,A COPY A,PATFLG CLSN =CR:,X DONE? JMP TECH2 YES CLSN =',',X JMP TECH2A CLSN ='+',X JMP BUFPAT CLSN ='-',X JMP BUFPAT CLSN ='.',X JMP BUFSET JMP TECH1 ELSE, IT IS BAD BUFPAT COPY X,PATFLG JST GNF COPY A,INCCNT JMP TECH2A BUFSET COPY X,PATFLG JST GNF COPY A,TTDP1 TECH2A CLSN =CR:,X DONE? JMP TECH2 YES JST GNF INPUT OPTION COPY A,TOPT AND STORE IT CLSN =CR:,X DONE? JMP TECH2 YES JST GNF GET CHAINED LENGTH IF ANY COPY A,TTCL AND SAVE IT ADD TTLN,A THIS LENGTH JLT A,TECH1X PLUS OTHER LENGTH CSK A,TTLT MUST BE 1-512 OR 1-256 JMP $+2 JMP TECH1 BAD CLSN =CR:,X DONE? JMP TECH2 YES JST GNF GET CHAINED WORD PATTERN COPY A,TTCP CLSN =',',X COMMA IS ILLEGAL HERE JMP TECH1 JMP TECH2 * LPOOL TECH2 COPY TTLN,A LENGTH MUST BE AT LEASE 1 JNE A,$+2 IMS TTLN COPY =-6,A FILL IOB W/ ADDRESS JST MOVE WORD TTFC WORD TTIOB1 COPY TTBUF,A STORE BUF ADDR COPY A,TTIOB1+MA COPY =TTINTL,A STORE INT ADDR COPY TTIN,X UNLESS NOT WANTED JEQ X,$+2 COPY =0,A COPY A,TTIOB1+IN COPY =TTIOB2,A INDEX CHAINED IOB COPY TTCL,X ANY CHAINING? JNE X,$+2 YES COPY =0,A NO, NO CHAIN ADDR COPY A,TTIOB1+NB STORE CHAIN ADDR COPY X,TTIOB2 STORE LENGTH IN CHAINED IOB COPY =TMPBUF,A AND CHAINED BUF ADDR COPY A,TTIOB2+1 COPY =:F,A CERTAIN FUNCTIONS AND TTFC,A CAN'T BE CHAINED COPY TTIOB1+NB,X CLSN =FRMT,A FORMAT = NO CHAIN COPY =0,X CLSN =SEEK,A SEEK = NO CHAIN COPY =0,X CLSN =TIO,A TIO = NO CHAIN COPY =0,X CLSN =INIT,X INIT = NO CHAIN COPY =0,X COPY X,TTIOB1+NB CLSN =FRMT,A FORMAT ? JMP TECH3 YES, BUILD FORMAT BUFFER CLSN =WRTDAT,A WRITE DATA ? JMP TECH4 YES, PUT WORD IN BUFFER CLSN =INIT,A INITIALIZE ? JMP TECHI YES, BUILD INITILIZE BUFFER COPY TTBUF,A COPY A,CLEAR1 ADD =1,A COPY A,CLEAR1+1 COPY =0,A COPY A,*TTBUF COPY =-511,A JST MOVE CLEAR1 WORD WBUF WORD WBUF+1 JMP TECH5A * LPOOL * * BUILD FORMAT BUFFER * * TECH3 EQU $ COPY =0,A COPY A,TTIOB1+SSS COPY TTC,Q CONVERT TO LOGICAL ADDR COPY TTS,X COPY TTH,Y COPY A,TTIOB1+CS SAVE MSB OF LOGIC ADDR COPY Q,TTIOB1+HS SAVE LSW OF LOGIC ADDR COPY =FMCF,A GET FORMAT 1 TRACK SUB OPCODE COPY A,TTIOB1+5 SAVE IT JMP TECH5A * * BUILD INITIALIZE BUFFER * * TECHI EQU $ COPY TTU,A  UNIT # COPY A,TTIOB1+1 COPY INITBK,A BYTES/SECTOR COPY A,TTIOB1+SSS COPY INITBK+1,A LOGICAL MAX CYL ADDR COPE Y A,TTIOB1+WC COPY INITBK+2,A LOGICAL MIN CYL ADDR COPY A,TTIOB1+MA COPY INITBK+3,A REDUCE WRITE CURRENT CYLINDER COPY A,TTIOB1+NB COPY INITBK+4,A WRITE PRE-COMPENSATION COPY A,TTIOB1+WP JMP TECH5A * * PUT WORD IN BUFFER FOR WRITE OPER * * TECH4 EQU $ COPY PATFLG,A CLSN ='+',A JMP TTBFI CLSN ='-',A JMP TTBFD CLSN ='.',A JMP TTBFC JNE A,TOTTT TTBFC COPY TTDP,A COPY TTBUF,X COPY A,0(X) COPY TTDP1,A COPY A,1(X) COPY =-510,A JST MOVE TTBUF WORD WBUF WORD WBUF+2 JMP TECH5A TTBFI COPY TTDP,A COPY INCCNT,X JST FILINC JMP TECH5A TTBFD COPY TTDP,A COPY INCCNT,X NEG X,X JST FILINC COPY TTCP,A PUT CHAINED WORD COPY A,TMPBUF COPY =-511,A JST MOVE WORD TMPBUF WORD TMPBUF+1 JMP TECH5A * TOTTT JMP TOTT * * OUTPUTTING ROUTINE * * TECH5A COPY =-12,A SAVE TTIOB JST MOVE FOR RETRIVEAL WORD TTIOB1 WORD TTIOBSAV TECH5 EQU $ SEL RESET DISK SBIT 8,S SBIT 4,S ENABLE CONSOLE INT COPY =-12,A RESTORE IOB INFROMATION JST MOVE WORD TTIOBSAV WORD TTIOB1 JST TIMER RESET TIME COPY =TTIOB1,A GET IOB ADDR COPY TTIOB1+IN,Q INTERRUPTS? JST OTA DO I/O JEQ Q,TECH6 NO JST TIME TIME THE I/O JMP $-1 JT SS,TOTT IF SENSE SWITCH IN ON JMP TECH5 NO INTERRUPT TTINTL EQU $ INTERRUPT POINT JST $+1 NOP TECH51 COPY TTIOB1+CST,A SELP A,4 OUTPUT CONTORLLER STATUS TO CDR COPY TOPT,A GET OPTION SHIFT A,RO,1 JT OV,TTDMP1 JT SS,TOTT JMP TECH5 DO IT AGAIN TECH6 JST SENRDY WAIT UNITL DONE JMP TECH51 DONE JST TIME TIME THE I/O JT SS,TOTT JMP TECH6 FINISHED JMP TECH5 TIME OUT, NOT READY TOTT COPY =0,A ADD =1,A JNE A,$-1 OUT A,0 RESET SENSE SWITCH JMP TECH1 * LPOOL * * GNF - INPUT PAR TO BUILD IOB * * GNF ENT JST IHEX INPUT VALUE EXCH A,X CLSN =',',X COMMA ? JMP *GNF YES, OK CLSN =CR:,X CARRIAGE RET ?  JMP *GNF YES, OK JMP TECH1 ELSE, START OVER * * TTDMP1 COPY TOPT,A SHIFT A,RO,2 JF OV,TTDMP2 COPY TTLN,A NEG A,A COPY TTBUF,X JST DUMP TTDMP2 COPY TOPT,A SHIFT A,RO,3 JF OV,TTDMP3 COPY TTLN,A NEG A,A COPY =TMPBUF,X JST DUMP TTDMP3 JMP TECH1 * TTFC WORD 0 FC TTU WORD 0 UNIT TTC WORD 0 CYLINDER TTH WORD 0 HEAD TTS WORD 0 SECTOR TTLN WORD 0 LENGTH TTIN WORD 0 INTERRUPTS FLAG TTDP WORD 0 WORD PATTERN TTCL WORD 0 CHAINED IOB LENGTH TTCP WORD 0 CHAINED IOB WORD PATTERN TTLT WORD 0 MAX WD CNT/2 SECTORS TOPT WORD 0 OPTION TTDP1 WORD 0 SECOND DATA PATTERN WD TTMP WORD 0 TEMP CELL INCCNT WORD 0 INCREMENT COUNT PATFLG WORD 0 PATTERN FLAG TTIOB1 RES 12,0 MAIN IOB TTIOB2 RES 4,0 CAHINED IOB TTIOBSAV RES 12,0 IOB SAVER OPCODE WORD 0,:A,1,2,4,8,9 I/O, INIT, FORM, WRITE, READ, RDVER, SEEK * TITL DETERMINE THE STATUS SUBROUTINE ***************************************************************** * * * RETSTAT - RETURN STATUS * * THIS ROUTINE WILL RETURN IN THE A REG THE NUMBER * FOR EACH STATUS BIT EG. * * ERROR 0 - UNIT NOT READY - BIT 0 * ERROR 1 - RATE ERROR - BIT 1 * ERROR 2 - FAULT - BIT 2 * ERROR 3 - RESERVED - BIT 3 * ERROR 4 - NO ID COMPARE - BIT 4 *  ERROR 5 - ID ECC ERROR - BIT 5 * ERROR 6 - DATA ECC ERROR - BIT 6 * ERROR 7 - SYNC ERROR  - BIT 7 * ERROR 8 - FORMAT ERROR - BIT 8 * ERROR 9 - SEEK ERROR - BIT 9 * ERROR A - F OPERATION COMP.- BIT A * ERROR B - RESERVED - BIT B * ERROR C - SEEK IN PROG. - BIT C *  ERROR D - HARDWARE/PARA - BIT D * ERROR E - DIAGNOSTIC - BIT E * ERROR F - ERROR SUMMARY - BIT F * ******************************************************** * RETSTAT ENT COPY CST(X),Q GET THE STATUS COPY Q,A PUT Q IN A JEQ A,NOSTAT ERROR NO STATUS OR ZERO STATUS RETURNED RBIT 10,A RESET OPERTION COMPLETE BIT JNE A,CKSTERR JUMP IF NOT ZERO - EG. ERRORS COPY =:A,A PUT STATUS IN A REG JMP *RETSTAT RETURN * NOSTAT EQU $ JST MSGA WORD NULSTAT NULL STATUS JST OUTTRCK OUTPUT ERROR STATUS JMP STERR ERROR RETURN * CKSTERR EQU $ JST CHCKOPT CHECK FOR ERROR REPORT OR NOT JMP CKUNRDY NO REPORT PLEASE JST MSGA OUT PUT FAILURE MESSAGE WORD DIAGFAL DIAGNOSTIC FAILURE JST OUTTRCK OUTPUT CIOB INF0 RBIT 15,A RESET ERROR SUMMARY BIT JNE A,CKUNRDY JUMP IF NOT ZERO JST MSGA OUTPUT MESSAGE WORD ERROSUM ERROR SUMMARY COPY =:F,A PUT ERROR CODE IN A JMP STERR ERROR RETURN LPOOL CKUNRDY EQU $ COPY Q,A CSK A,=:8001 CHECK FOR UNIT NOT READY NOP NO MATCH JMP CKRATE NO ERROR JST CHCKOPT ERROR - CHECK ERROR REPORT BIT JMP CKRATE NO REPORT JST MSGA OUTPUT MESSAGE WORD UNRDY ERROR *JST OUTTRCK SEND REPORT COPY =:0,A JMP STERR ERROR RETURN CKRATE EQU $ COPY Q,A  CSK A,=:8002 CHECK FOR RATE ERROR NOP NO MATCH JMP CKFAULT NO ERROR JST CHCKOPT CHECK FOR REPORT OR NOT JMP RATENR NO REPORT PLEASE JST MSGA WORD RATE OUTPUT RATE ERROR *JST OUTTRCK OUTPUT CYL,HD,SEC AND STATUS RATENR COPY =:1,A JMP STERR ERROR RETURN CKFAULT EQU $ COPY Q,A CSK A,=:8004 CHECK FOR FAULT NOP NO MATCH JMP CKRESERV NO ERROR JST CHCKOPT CHECK FOR REPORT OR NOT JMP FAULTNR NO REPORT PLEASE JST MSGA WORD FAULT OUTPUT FAULT ERROR *JST OUTTRCK OUTPUT CYL,HD,SEC, AND STAT FAULTNR COPY =:2,A JMP STERR ERROR RETURN CKRESERV EQU $ COPY Q,A CSK A,=:8008 CHECK FOR RESERVED ERROR NOP  NO MATCH JMP CKNOID NO ERROR JST CHCKOPT CHECK FOR REPORT OR NOT JMP RESVNR NO REPORT PLEASE JST MSGA WORD RESERV OUTPUT RESERV ERROR *JST OUTTRCK RESVNR COPY =:3,A JMP STERR ERROR RETURN LPOOL CKNOID EQU $ COPY Q,A CSK A,=:8010 CHECK FOR NO ID COMPARE NOP NO MATCH JMP CKIDECC NO ERROR JST CHCKOPT CHECK FOR REPORT OR NOT JMP NOIDNR NO REPORT PLEASE JST MSGA WORD NOID OUTPUT NOID ERROR *JST OUTTRCK OUTPUT CYL,HD,SEC AND STATUS NOIDNR COPY =:4,A JMP STERR ERROR RETURN CKIDECC EQU $ COPY Q,A CSK A,=:8020 CHECK FOR ID ECC NOP NO MATCH JMP CKDATECC NEXT JST CHCKOPT CHECK FOR REPORT OR NOT JMP IDECCNR NO REPORT PLEASE JST MSGA WORD IDECC OUTPUT IDECC ERROR *JST OUTTRCK OUTPUT CYL,HD,SEC AND STATUS IDECCNR COPY =:5,A JMP STERR ERROR RETURN CKDATECC EQU $ COPY Q,A CSK A,=:8040 CHECK FOR DATA ECC NOP NO MATCH JMP CKSYNC NEXT JST CHCKOPT CHECK FOR REPORT OR NOT JMP DATECCNR NO REPORT PLEASE JST MSGA WORD DATECC OUTPUT DATECC ERROR *JST OUTTRCK OUTPUT CYL,HD,SEC AND STATUS DATECCNR COPY =:6,A JMP STERR ERROR RETURN LPOOL CKSYNC EQU $ COPY Q,A CSK A,=:8080 CHECK FOR SYNC ERROR NOP NO MATCH JMP CKFMTERR NEXT JST CHCKOPT CHECK FOR REPORT OR NOT JMP SYNCNR NO REPORT PLEASE JG ST MSGA WORD SYNC OUTPUT SYNC ERROR *JST OUTTRCK SYNCNR COPY =:7,A JMP STERR ERROR RETURN CKFMTERR EQU $ COPY Q,A CSK A,=:8100 CHECK FOR FORMAT ERROR NOP NO MATCH JMP CKSEEKE NEXT JST CHCKOPT CHECK FOR REPORT OR NOT JMP FMTERRNR NO REPORT PLEASE JST MSGA WORD FMTERR OUTPUT FMTERR ERROR *JST OUTTRCK OUTPUT CYL,HD,SEC AND STATUS FMTERRNR COPY =:8,A JMP STERR ERROR RETURN CKSEEKE EQU $ COPY Q,A CSK A,=:8200 CHECK FOR SEEK ERROR NOP NO MATCH JMP CKRESV1 NEXT JST CHCKOPT CHECK FOR REPORT OR NOT JMP SEEKENR NO REPORT PLEASE JST MSGA WORD SEEKE OUTPUT SEEKE ERROR *JST OUTTRCK OUTPUT CYL,HD,SEC AND STATUS SEEKENR COPY =:9,A JMP STERR ERROR RETURN LPOOL CKRESV1 EQU $ COPY Q,A CSK A,=:8800 CHECK FOR RESERVED ERROR TWO  NOP NO MATCH JMP CKSEEKIN NEXT JST CHCKOPT CHECK FOR REPORT OR NOT JMP RESV1NR NO REPORT PLEASE JST MSGA WORD RESV1 OUTPUT RESV1 ERROR *JST OUTTRCK RESV1NR COPY =:B,A JMP STERR (B023) LPOOL * CKSEEKIN EQU $ COPY Q,A CSK A,=:9000 CHECK FOR SEEK IN PROGRESS NOP NO MATCH JMP CKHARDPA NEXT COPY =:C,A JMP STERR ERROR RETURN CKHARDPA EQU $ COPY Q,A AND =:2000,A CHECK FOR HARDWARE PARAMETER ERROR CSK A,=:A000 CHECK FOR H/W PARAMETER ERROR NOP NO MATCH JMP CKDIAGN  NEXT JST CHCKOPT CHECK FOR REPORT OR NOT JMP HARDPANR NO REPORT PLEASE JST MSGA WORD HARDP OUTPUT HARDPA ERROR *JST OUTTRCK HARDPANR COPY =:D,A JMP STERR ERROR RETURN CKDIAGN EQU $ COPY Q,A CSK A,=:C000 CHECK FOR DIAGNOSTIC ERROR NOP NO MATCH JMP STERR NEXT JST CHCKOPT CHECK FOR REPORT OR NOT JMP DIAGNNR NO REPORT PLEASE JST MSGA WORD DIAGN OUTPUT DIAGN ERROR *JST OUTTRCK DIAGNNR COPY =:E,A STERR EQU $ IMS RETSTAT INCREMENT RETURN ADDRESS COPY A,TEMP1 STORE ERROR CODE COPY CAR,A GET THE OPTIONS TBIT 4,A TRANSFER BIT 4 TO OV JF OV,NOHLTERR JUMP IF NOT SET JST MSGA OUTPUT WORD HLTERR HALT ON ERROR HLT NOHLTERR COPY TEMP1,A REPLACE ERROR CODE JMP *RETSTAT RETURN JMP *RETSTAT RETURN LPOOL * TITL RETURN DRIVE STATUS ******************************************************* * * * RETDST - RETURN DRIVE STATUS * * CALLING SEQUENCE: JST RETDST * * WITH REQUESTED UNIT # IN Q * * * RETURN SEQUENCE: NORMAL RETURN IF DRIVE READY * NORMAL+1 IF NOT READY * ******************************************************** * RETDST ENT COPY =DIOB,X INDEX ON X COPY =1,A CSK Q,A DETERMINE WHICH UNIT IS NEEDED JMP CKUN0 CHECK UNIT 0  JMP CKNXU GO ON JMP CKUN1 CHECK UNIT ONE CKNXU COPY =3,A CSK Q,A IS IT 3 OR 4 JMP CKUN2 CHECK UNIT 2 NOP SHOULD BE NO UNIT GREATER THAN 3 JMP CKUN3 CHECK UNIT 3 LPOOL CKUN0 COPY DST(X),A GET DRIVE STATUS AND =:8000,A CHECK FOR READY JEQ A,UN0RDY JUMP ZERO UNIT READY IMS RETDST INCREMENT RETURN UN0RDY JMP *RETDST RETURN CKUN1 COPY DST(X),A GET DRIVE STATUS AND =:4000,A CHECK FOR READY JEQ A,UN1RDY JUMP ZERO UNIT READY IMS RETDST INCREMENT RETURN UN1RDY JMP *RETDST RETURN CKUN2 COPY DST(X),A GET DRIVE STATUS AND =:2000,A CHECK FOR READY JEQ A,UN2RDY JUMP ZERO UNIT READY IMS RETDST INCREMENT RETURN UN2RDY JMP *RETDST RETURN CKUN3 COPY DST(X),A GET DRIVE STATUS AND =:1000,A CHECK FOR READY JEQ A,UN3RDY JUMP ZERO UNIT READY IMS RETDST INCREMENTH  RETURN UN3RDY JMP *RETDST RETURN LPOOL * TITL CHECK THE OPTIONS ******************************************************* * * CHCKOPT - CHECK FOR ERROR REPORT OR NOT SUBROUTINE * * NORMAL RETURN - SUPPRESS THE ERROR REPORT * RETURN +1 - OUTPUT THE ERROR MESSAGE * * **************************************************** CHCKOPT ENT COPY CAR,A GET THE OPTIONS TBIT 1,A CHECK FOR SUSPRESS ERRORS JT OV,SUPERR JUMP IF TRUE JT SS,SUPERR JUMP IF SENSE IS SET ALSO IMS CHCKOPT NORMAL RETURN OUTPUT THE ERROR MESSAGE SUPERR JMP *CHCKOPT AND RETURN TITL OUTPUT CYL,HD,SEC AND CONTROLLER,DRIVE STATUS ***************************************************** * * * OUTTRCK - OUTPUT CYLINDER, HEAD AND SECTOR * AND CONTROLLER AND DRIVE STATUS * * * ERROR # - DESCRIPTION * CYL: XXXX HEAD: XXXX SECT: XXXX * CONTROLLER STATUS: XXXX * DRIVE STATUS: XXXX * * * * * * ***************************************************** OUTTRCK ENT COPY =DIOB,X INDEX ON X JST MSGA OUTPUT MESSAGE WORD OPCD1 COPY OP(X),A GET OPCODE JST OHEX SEND T JST MSGA OUT PUT MESSAGE WORD ADRCYL CYL: COPY CS(X),A GET CURRENT CYLINDER JST OHEX OUTPUT IT COPY =:28,A JST OTTY SEND LEFT PAREN COPY CS(X),A GET CYL AGAIN JST ODEC  SEND AS DECIMAL COPY =:29,A GET RIGHT PAREN JST OTTY JST MSGA WORD ADRHD HEAD: COPY HS(X),A GET CURRENT HEAD JST OHEX OUTPUT IT JST MSGA OUTPUT WORD ADRSEC SECT: COPY SSS(X),A GET CURRENT SECTOR JST OHEX OUTPUT IT JST MSGA WORD CRST OUTPUT CONTROLLER STATUS COPY CST(X),A GET STATUS JST OHEX OUTPUT IT JST MSGA WORD DRST DRIVE STATUS COPY DST(X),A GET DRIVE STATUS JST OHEX OUTPUT IT JST CRLF JMP *OUTTRCK LPOOL TITL VERIFY DATA FOR DISK TEST C ****************************************************************** * * TSTCVERI - DISK TEST C VERIFY * * VERIFY THAT THE DATA-READ IS THE SAME AS THE DATA-WRITTEN. * * INPUT: X = BUFFER ADDRESS * Q = BUFFR LENGTH * ****************************************************************** * TSTCVERI ENT COPY X,TSTC21 SAVE THE BUFFER ADDR FOR LATER SUB =1,Q Use words 0 --> n-1, instead of 1 --> n TSTC8 EQU $ COPY 0(X),A SUB PATN,A JNE A,TSTC9 JUMP IF MISCOMPARE ADD =1,X JNED Q,TSTC8 JMP TSTC10 EXIT TSTC9 EQU $ COPY Q,TSTC20 SAVE THE OFFSET INTO THE TABLE OF THE BAD WORD JST MSGA WORD MISCOMP2 TELL 'EM THE CYL # COPY =DIOB,X COPY CS(X),A JST OHEX JST MSGA WORD MISCOMP3 TELL 'EM THE HEAD # COPY =DIOB,X COPY HS(X),A JST OHEX JST MSGA  WORD MISCOMP4 TELL 'EM THE SECTOR # COPY =DIOB,X COPY SSS(X),A JST OHEX JST MSGA WORD MISCOMP5 TELL 'EM THE WORD # COPY =:FF,A CALQULATE THE # OF THE BAD WORD SUB TSTC20,A MINUS THE # OF VERIFIED WORDS JST OHEX JST MSGA "EXPECTED DATA :XXXX" WORD MISCOMP6 COPY PATN,A JST OHEX JST MSGA "ACTUAL DATA :XXXX" WORD MISCOMP7 COPY =:FF,X GET THE BAD WORD FROM THE BUFFER SUB TSTC20,X X NOW HAS THE OFFSET INTO THE BUFFER ADD TSTC21,X ADD THE BUFFER ADDRESS TO OFFSET  COPY 0(X),A JST OHEX TSTC10 EQU $ JMP *TSTCVERI LPOOL TITL TAPE START **************************************************************** * * * START OF TAPE ROUTINES * * * * * * ****************************************************************I ** * * TITL TAPE TEST SELECTION ********************************** * * TAPE TEST SELECTION - THIS QUERY ALLOW THE *  USER TO SELECT ALL OR * SOME OF THE TESTS. * * DEFAULT: ALL 5 TESTS * * TESTA-BASIC CONTROLLER FUNCTION CHECK * TESTB-SYSTEM RESET, TAPE REWIND, RETENSION * TESTC-WRITE DATA FM, DATA FM FM AND READ FILE MARKS * TESTD-WRITE/READ DATA * TESTE-ERASE TAPE * TESTF-RESET ONLINE COMMAND * TESTG-END OF MEDIA * * ********************************** * TTESTSEL ENT QURYT20 EQU $ COPY =0,A ZERO A-REG COPY A,INFLAG CLEAR INPUT FLAG COPY =-7,A GET DATA LENGTH JST MOVE MOVE IN TEST PARAMETERS WORD TTSTBUF2 FROM HERE WORD TTSTBUF1 TO THERE COPY =TTSTBUF1,Y INDEX TEST TABLE JST MSGA PRINT QUERY WORD TTSTMSG COPY =-7,A GET INPUT COUNT COPY A,TEMP1 SAVE IT QURYT21 EQU $ JST IDEC GET INPUT JNE X,QURYT20 NUMERIC IS NO GOOD QURY T23,T25,ND,T20,T10,T21 CSK A,='G' DO RANGE CHECK CSK A,='A' 'A' TO 'G'? JMP QURYT20 BAD NOP COPY TEMP1,Q GET INPUT COUNT JEQ Q,QURYT25 IF ZERO GOTO QURYT25 COPY A,0(Y) SAVE IT COPY =1,A COPY A,INFLAG THERE IS INPUT, SET FLAG ADD =1,Y BUMP TABLE ADDRESS IMS TEMP1 BUMP INPUT COUNT NOP JMP QURYT21 CHECK TERMINATOR QURYT25 EQU $ COPY INFLAG,Q GET INPUT FLAG JEQ Q,$+3 NOT SET=DEFAULT COPY =-1,A GET TEST TABLE TERMINATOR COPY A,0(Y) STORE TABLE TERMINATOR JMP *TTESTSEL * QURYT10 DCRM TTESTSEL DCRM TTESTSEL JMP *TTESTSEL LPOOL TITL TAPE BLOCK COUNT QUERY *********************************** * * TAPE BLOCK COUNT QUERY: * PROMPTS FOR THE NUMBER OF BLOCKS TO BE USED IN * TAPE TEST B - BACKUP/RESTORE. * * DEFAULT: :200 BLOCKS * * RANGE ALLOW: 1 TO 64K BLOCKS * * ********************************** * TBLKCNT ENT (A901) QURYT30 EQU $ COPY =TTSTBUF1,X ASK THIS QUERY FOR TAPE TEST B ONLY (A902) QURYT31 EQU $ COPY 0(X),A SCAN THE TEST-LETTER BUFFER TO CHECK FOR 'B' JLT A,QURYT35  END OF BUFFER, SO SHINE THIS QUERY SUB ='B',A JEQ A,QURYT32 OK, ASK THE QUERY ADD =1,X JMP QURYT31 QURYT32 EQU $ COPY =0,A ZERO A-REG COPY A,INFLAG CLEAR INPUT FLAG COPY =:200,A GET DEFAULT NUMBER OF DATA BLOCKS COPY A,BLKCNT SAVE IT JST MSGA PRINT QUERY WORD NDBKMSG QURYT33 EQU $ JST IHEX GET INPUT JNE X,$+2 HEX INPUT, GOOD JMP QURYT34  NO, CHECK TERMINATOR COPY X,BLKCNT SAVE IT QURY T34,T35,ND,T32,T20,T32 JMP QURYT32 ANYTHING ELSE QURYT35 EQU $ JMP *TBLKCNT GOTO NEXT QUERY * LPOOL TITL EXEC-TEST EXECUTIVE ******************************** * * TAPE EXECUTIVE TEST * EXEC - TEST EXECUTIVE * * TEST EXECUTIVE CONTROLS THE FLOWS OF THE PROGRAM * WHICH INVOKES VARIES SUBROUTINES AT TIMES OF NEED. * ********************************* * TEXEC EQU $ PROGRAM STARTUP-TEST CONTROL COPY FUNCTION,A SEE IF THEY WANT TO RUN THE TECH TEST. (A905) CLSN A,='T' JMP TTECH GO DO TAPE TECH TEST COPY =0,A CLEAR A-REG COPY A,TPASS RESET PASS # COPY A,EROTOL CLEAR ACCUM. ERR. CELL JST RSTBD RESET THE BOARD JST TIMER 7 SEC TIMER ? JST TIME JMP $-1 WAIT JST SENRDY READY ? JMP TEXEC0 YES JST MSGA NO SAY SO WORD TSTA1M1 JMP PSU+2 RETURN TO BEGINING * TEXEC0 EQU $ JSK TJ STAA1 INITIALIZE THE DISK (A900) TEXEC1 EQU $ JST CRLF PRINT A BLANK LINE JST MSGA PRINT 'PASS' WORD TPASSMSG COPY TPASS,A GET TPASS # JST ODEC PRINT IT JST CRLF GO TO NEXT LINE COPY =0,A COPY A,S RESET STATUS REGISTER SELP A,4 RESET CDR DISPLAY SBIT 4,S ENABLE CONSOLE INT SBIT 8,S ENABLE INT COPY =TTSTBUF1,X INDEX TEST SELECTION BUFFER TEXEC1L EQU $ COPY X,TEMP7 SAVE TEST POINTER COPY 0(X),A GET TABLE CONTENT ADD =1,A IS IT END OF TABLE? JEQ A,TEXEC2 YES, GO TEXEC2 COPY 0(X),A RESTORE A-REG CLSN A,='A' IS IT TEST A? JST TTESTA NOW INITIALIZE THE TAPE COPY TEMP7,X RESTORE TABLE POINTER IN CASE IT GOT CHANGED COPY 0(X),A GET TABLE CONTENT CLSN A,='B' IS IT TEST B? JST TTESTB CALL TTEST B COPY TEMP7,X RESTORE TABLE POINTER IN CASE IT GOT CHANGED COPY 0(X),A GET TABLE CONTENT CLSN A,='C' IS IT TEST C? JST TTESTC CALL TTEST C COPY TEMP7,X RESTORE TABLE POINTER IN CASE IT GOT CHANGED COPY 0(X),A GET TABLE CONTENT CLSN A,='D' IS IT TEST D? JST TTESTD CALL TTEST D COPY TEMP7,X RESTORE TABLE POINTER IN CASE IT GOT CHANGED COPY 0(X),A GET TABLE CONTENT CLSN A,='E' IS IT TEST E? JST TTESTE CALL TTEST E COPY TEMP7,X COPY 0(X),A CLSN A,='F' IS IT TEST F? JST TTESTF CALL TTEST F COPY TEMP7,X COPY 0(X),A CLSN A,='G' IS IT TEST G?  JST TTESTG CALL TTEST G COPY TEMP7,X RESTORE TABLE POINTER ADD =1,X BUMP TABLE POINTER JMP TEXEC1L LOP BACK TEXEC2 EQU $ COPY CAR,A GET RUN OPTION TBIT 0,A IS ACCUM. ERR. BIT ON? JF OV,TEXEC2L NEXT, IF NO OPTION * COPY =TTSTBUF1,Y INDEX TEST TABLE  COPY 0(Y),A GET CONTENT TEXEC2A EQU $ COPY =:0F,Q GET MASK WORD AND Q,A MASK OUT UNWANTED BITS SUB =1,A LESS 1 COPY =EROTAB,X GET ERR TAB ADD A,X OFFSET INTO ERR TAB COPY 0(X),A GET # OF ERROR COPY EROTOL,Q GET TOTAL # OF ERR ADD Q,A ADD TOGETHER  COPY A,EROTOL AND UPDATE ADD =1,Y BUMP INDEX TEST TABLE COPY 0(Y),A GET NEXT CONTENT CSK A,=-1 END OF TABLE? HLT (IMPOSSIBLE FOR CONT < 1) JMP TEXEC2A NO, GO BACK. ELSE, GO ON JST MSGA WORD EROACC COPY EROTOL,A GET TOTAL # OF PASS JST ODEC AND OUTPUT TEXEC2L EQU $ COPY CAR,A GET RUN OPTION TBIT 3,A IS RUN CONT. BIT ON? JT OV,TEXEC3 IF SO, PLEASE DON'T...STOP! JST MSGA ELSE, 'END OF TEST' WORD EOT JMP PSU+4 RESTART QUERIES TEXEC3 EQU $ IMS TPASS BUMP PASS JMP TEXEC1 PASS STILL GOOD, LOOP BACK JST *0 PASS EXPIRED * LPOOL TITL TESTA-TEST A SUBROUTINE *********************************** * * TESTA - TEST A SUBROUTINE * THIS ROUTINE PERFORMES THE FOLLOWING TESTS: 1) SELECT AND INITIALIZE * THE TAPE DRIVE. 2) REWIND (BOT) * * * * *********************************** * TTESTA ENT TTEST A ENTRY POINT JST MSGA WORD TTSTA (A800) COPY =:1001,A SELP A,4 * JST SENRDY CHECK FOR CONTROLLER READY JMP TTSTRDY OK JST MSGA NOT READY SEND MESSAGE WORD TSTA1M JMP PSU+2 RETURN TO BEGINING * TTSTRDY EQU $ JST MSGA WORD SELTP SELECT TAPE MSG JST SELECTTP JST SELECTTP ISSUE TWICE TO CLEAR STATUS JST ERCHCKT CHECK FOR ERRORS JST MSGA WORD INITP INITIALIZE TAPE MSG JST INITTAPE JST ERCHCKT CHECK FOR ERRORS JST MSGA WORD BOTMSG BEGINING OF TAPE MSG JST BOT JST ERCHCKT CHECK FOR ERRORS JMP *TTESTA RETURN LPOOL TITL TTEST B - SUBROUTINE ********************************** * * * TAPE TEST B - ISSUE BACK-UP COMMAND AND THEN RESTORE COMMAND * * *******K ****************************** TTESTB ENT COPY CAR,A GET RUN OPTIONS TBIT 6,A IS IT NON-DESTRUCTIVE MODE? JF OV,$+2 NO THEN CONTINUE JMP *TTESTB YES THEN DONT RUN THIS TEST JST MSGA WORD TTSTB * JST MSGA WORD BOTMSG SEND BEGINING OF TAPE MSG * JST BOT JST ERCHCKT NOW DO IT AND CHECK IT * JST MSGA WORD BKPMSG SEND BACK UP MESSAGE * JST CIOB  CLEAR CIOB COPY =DIOB,X INDEX IOB COPY =BACKUP,A GET BACKUP OPCODE COPY A,OP(X) PUT IN IOB COPY UCUR,A UNIT # (A500) COPY A,US(X) PUT IN UNIT NUMBER COPY INITBK+2,A START WITH THE MINIMUM LOGICAL HEAD COPY A,HS(X) COPY =0,A  (A600) COPY A,CS(X) START AT CYLINDER ZERO COPY A,SSS(X) SECTOR ZERO COPY A,CST(X) CLEAR STATUS COPY A,DST(X) AND DRIVE STAT COPY A,MA(X) NO BUFFER ADDRESS NECESSARY COPY A,WP(X) CLEAR WORDS PROCESSED COPY A,NB(X) AND DATA CHAIN IOB * COPY =BAKINT,A INTERRUPT ADDRESS COPY A,IN(X) INTO IOB * COPY BLKCNT,A SECTORS TO BE XFERED (A901) COPY A,WC(X) INTO BLOCK COUNT * COPY =DIOB,A GET ADDRESS SBIT 8,S TURN ON INTERRUPTS JST OTA SEND IT * * JMP $ WAIT FOR INTERRUPT * LPOOL * BAKINT EQU $ * JST $+1 INTERRUPT LOCATION NOP JST ERCHCKT CHECK FOR ERRORS NOP * * WRITE FILE MARK * JST MSGA WORD WRFMSG JST WRFM JST ERCHCKT * * * ISSUE RESTORE COMMAND * JST MSGA SEND BOT MSG WORD BOTMSG  BEGIN OF TAPE MSG JST BOT START AT BEGIN OF TAPE JST ERCHCKT CHECK FOR ERRORS JST MSGA SEND RESTORE MESSAGE WORD RESTR RESTOR JST CIOB CLEAR CIOB COPY =DIOB,X INDEX CIOB COPY =RESTOR,A GET RESTORE COMMAND COPY A,OP(X) PUT INTO CIOB COPY UCUR,A GET UNIT NUMBER (A600) COPY A,US(X) (A600) COPY BLKCNT,A GET BLOCK COUNT (A901) COPY A,WC(X) INTO CIOB COPY =RSTINT,A GET RESTORE INTERRUPT LOCATION COPY A,IN(X) INTO CIOB COPY INITBK+2,A START WITH THE LOGICAL MINIMUM HEAD COPY A,HS(X) * COPY =DIOB,A GET CIOB ADDRESS SBIT 8,S TURN ON INTERRUPTS JST OTA SEND IT * JMP $ WAIT FOR INTERRUPT * * RSTINT EQU $ EOB INTERRUPTS HERE JST $+1 NOP JST ERCHCKT CHECK FOR ERRORS NOP JMP *TTESTB RETURN TO EXEC * TITL TTESTC - SUBROUTINE ************************************************* * TESTC - TEST C SUBROUTINE * THIS ROUTINE CHECKS THE READ/WRITE * FILE MARK ABILITY. * (1) WRITE 5 DATA BLK 1 FM, AND 5 BLK 2 FM * (2) AND THAN REWIND THE TAPE, FOLLOWED BY *  3 FILE MARKS READ OPERATION. ********************************** TTESTC ENT JST MSGA WORD TTSTC JST MSGA WORD BOTMSG SEND BOT MSG JST BOT DO BOT OPERATION JST ERCHCKT CHECK FOR ERRORS COPY 0,A COPY A,ERORC COPY =3,A TESTC COPY =:3001,A SELP A,4 SEND IT TO DATA REGISTER COPY =-2,A COPY A,COUNT * WRITE FIVE DATA BLOCKS ON THE TAPE COPY =5,A COPY A,NDBK JST MSGA WORD WRDTBK SEND WRITE DATA BLOCK MSG JST WRBLKS JST ERCHCKT CHECK FOR ERRORS JST MSGA WORD WRFMSG JST WRFM AND ONE FILE MARK JST ERCHCKT CHECK FOR ERRORS * ANOTHER FIVE DATA BLOCKS COPY =5,A COPY A,NDBK JST MSGA WORD WRDTBK JST WRBLKS JST ERCHCKT CHECK FOR ERRORS JST MSGA WORD WRFMSG JST WRFM JST ERCHCKT CHECK FOL R ERRORS JST MSGA WORD WRFMSG JST WRFM WRITE TWO FILE MARK THIS TIME JST ERCHCKT CHECK FOR ERRORS JST MSGA WORD BOTMSG JST BOT JST ERCHCKT CHECK FOR ERRORS JST MSGA SEND EXPECTING READ FILE MARK MESSAGE WORD RDFMK JST RDFM1 JST ERCHCKT CHECK FOR ERRORS JST RDFM1 JST ERCHCKT CHECK FOR ERRORS JST RDFM1 JST ERCHCKT CHECK FOR ERRORS JMP *TTESTC RETURN *LPOOL TITL TTESTD - SUBROUTINE **************************************************** * TESTD - TEST D SUBROUTINE * * THIS ROUTINE TEST OUT THE WRITE AND READ * FUNCTIONS OF THE CONTROLLER BY PERFORMING * THE FOLLOWING: * (1) WRITE DATA BLOCKS AND TERMINATE WRITE * WITH A FILE MARK, * (2) READ DATA BLOCKS AND FILE MARK. * DEFAULT: READ/WRITE 16,384 BLOCKS. * ***************************************************** * TTESTD ENT JST MSGA WORD TTSTD COPY =:4001,A SELP A,4 END TO DATA REGISTER JST MSGA WORD BOTMSG JST BOT JST ERCHCKT  CHECK FOR ERRORS * JST MSGA WORD WRDTBK COPY NDBKD,A COPY A,NDBK JST WRBLKS JST ERCHCKT CHECK FOR ERRORS * JST MSGA WORD WRFMSG JST WRFM JST ERCHCKT CHECK FOR ERRORS * JST MSGA WORD BOTMSG JST BOT JST ERCHCKT CHECK FOR ERRORS *  JST MSGA WORD RDFMK1 COPY NDBLK,A COPY A,NDBK JST RDBLKS JST ERCHCKT CHECK FOR ERRORS * JST MSGA WORD BOTMSG JST BOT BOT WITH NO ERROR CHECK JST ERCHCKT * JST MSGA WORD RDFMK1 JST RDFM1 JST ERCHCKT CHECK FOR ERRORS * * JMP *TTESTD EXIT * LPOOL TITL TTESTE-TEST E SUBROUTINE **************************************************** * * TESTE - TEST E SUBROUTINE * * (1) ERASE THE ENTIRE TAPE * * (2) READ 1 BLOCK TO GENERATE A NO-DATA ERROR * **************************************************** TTESTE ENT JST MSGA WORD TTSTE JST MSGA WORD BOTMSG JST BOT JST ERCHCKT COPY =:5001,A SELP A,4 * JST ERASET JST ERCHCKT CHECK FOR ERRORS COPY =1,A BLOCK COUNT (A902) COPY A,NDBK JST RDBLKS READ ONE BLOCK OF DATA SHOULD GIVE READ NO DATA ERRORS JST ERCHCKT CHECK FOR ERRORS COPY RENOFLG,A GET NO DATA ERROR FLAG ADD =1,A JNE A,TTESTEND JUMP IF NOT ZERO JST MSGA OUTPUT MESSAGE WORD NODAT FAILED TO GIVE NO DATA ERROR TTESTEND JMP *TTESTE EXIT * LPOOL * TITL TTESTF - TEST F SUBROUTINE ********************************************************* * TAPE TEST F: * THIS TEST WRITES INFINITE DATA BLOCKS ON TAPE AND * EXPECTS AN END OF MEDIA ERROR *****************************************IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIICARTOSMB086022614170095860226141700 860226141700=F00900 VOLNM4 WTC DIAGNOSTIC FORMATTER 84-96009-10 B022