IMD 1.16: 30/08/2008 22:55:36 84-96120-01 b000 f12001 winchester diag./formatter source diskette (nm4) 9-mar-83    @0|)wwЀЀtQql)  " }gA ` MIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIOS4 MF081092915313900810929153139 810929153139-F12001 VOLWINCHESTER DIAGNOSTIC/FORMATTER   IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII M@jjggg@ o G`k_C# b# }B u[ ]e JRiCCp@<;: F8P@ G;NPCHC C GTqE'ɞ * Cϟx @0DAJL )‘ЀЀΎQBx"  i+ fEB)3 `jmBBI,v  BI,m  @EEFF)D^EF% jH@pOğv g7g4]X] PhV+s=胾c_N GF֞ؾ “@ALS)"$ C k1/j-h p vRw ppwp ki 15 !^\d X %'+Ns愾Q)s ED|{ @$ o O m J K i g. V tsFn`"FED) E`Cnrgy w"N{Rq1H }L2`0tG- Bc (>= START. CYL. NO. AND * MUST BE < TOTAL NO. OF CYLS. * DEFAULT IS THE SELECTED DRIVE PARAMETERS * * CALLS: * MOVE * MSGA * IDEC * CHRIN * ****************************** * QUERY50 EQU $ COPY =0,A SET A TO ZERO COPY A,TEMP2 RESET INPUT FLAG COPY SHORTX,A SET SHORT TEST FLAG TO COPY A,SHORT DEFAULT VALUE COPY DISK,A GET DRIVE PARAMETER TABLE ADDRESS COPY A,QUERY51 STORE FOR MOVE COPY =HCP-EHCP,A PARAMETER TABLE SIZE -(EHCP-HCP) JST MOVE RESET DRIVE PARAMETERS QUERY51 WORD 0 WORD HCP JST MSGA OUTPUT QUERY WORD QUERYM50 JST IDEC GET INPUT JEQ X,QUERY53 TERMINATOR OR ZERO INPUT IMS TEMP2 SET INPUT FLAG COPY X,CYLS STORE INPUT COPY =0,A STORE 0 IN STARTING CYL. COPY A,SCYL TENTATIVELY SUB =1,X SET TOTAL-1 IN ENDING CYL. COPY X,ECYL TENTATIVELY COPY IDCTM2,A GET TERMINATOR CHAR. CLSN =',',A WAS IT A COMMA? JMP QUERY54 IF SO, GET STARTING CYL. NO. QUERY52 JST CHRIN CHECK TERMINATOR JMP QUERY60 CR JMP QUERY57 # JMP QUERY50 BACK ARROW JMP QUERY55 UP ARROW JMP QUERY50 COMMA JMP QUERY50 ANYTHING ELSE IS ILLEGAL QUERY53 COPY IDCTM3,A GET ACTUAL INPUT COUNT JEQ A,QUERY52 IF ZERO, CHECK TERMINATOR JMP QUERY50 OTHERWISE, ERROR QUERY54 IMS SHORT BUMP SHORT TEST FLAG JST IDEC GET STARTING CYL. NO. COPY X,A CSK A,ECYL DO RANG CHECK JMP $+2 MUST BE 0 - (TOTAL CYLS.-1) JMP QUERY50 OUT OF RANGE COPY A,SCYL STORE STARTING CYLINDER NO. COPY A,ECYL ASSUME IT'S ALSO ENDING CYL. NO. COPY IDCTM2,A GET TERMINATOR   CLSN =',',A IS IT A COMMA? JMP QUERY56 YES, GET ENDING CYL. NO. JMP QUERY52 NO, CHECK FOR TERMINATOR QUERY55 COPY TEMP2,A GET INPUT FLAG JNE A,QUERY50 ILLEGAL TO JUMP BACK IF INPUT COPY MODE,A GET FUNCTION CLSN ='D',A DIAGNOSTIC? JMP QUERY40 IF SO, ASK FOR TESTS JMP QUERY30 OTHERWISE, ASK FOR DEVICE ADDRESS QUERY56 JST IDEC GET ENDING CYL. NO. COPY X,A CSK A,CYLS MUST BE LESS THAN TOTAL CYLS. JMP $+3 IF SO, CONTINUE NOP NOP NOP NOP NOP NOP NOP NOP NOP JMP QUERY50 OTHERWISE, ERROR CSK A,SCYL MUST BE GREATER THAN STARTING CYL. NO. JMP QUERY50 IF NOT, ERROR NOP COPY X,ECYL STORE ENDING CYL. NO. JMP QUERY52 CHECK TERMINATOR QUERY57 COPY TEMP2,A GET INPUT FLAG JEQ A,$+2 OK TO DO SO JMP QUERY50 ILLEGAL TO DEFAULT IF INPUT JMP QRY42 * LPOOL TITL QUERIES (WRITE PRE COMP) ****************************** * * WRITE PRE COMPENSATION * * QUERY: * * WRITE PRE COMP CYL? * * SELECTION: * STARTING CYLINDER FOR WRITE PRE- * COMPENSATION - MUST BE > START. CYL. NO. AND * MUST BE < END. CYL. NO. * DEFAULT IS THE SELECTED DRIVE PARAMETERS * * CALLS: * MSGA * IDEC * CHRIN * ****************************** * QUERY60 EQU $ COPY =0,A SET A TO ZERO COPY A,TEMP2 RESET INPUT FLAG COPY DISK,X COPY PCMP-HCP(X),A COPY A,PCMP JST MSGA OUTPUT QUERY WORD QUERYM60 JST IDEC GET RESPONSE JEQ X,QUERY64 IF ZERO, SEE WHY IMS TEMP2 SET INPUT FLAG COPY X,A CSK A,SCYL MUST BE BETWEEN SCYL AND ECYL JMP QUERY60 MUST BE GREATER THAN SCYL NOP CSK A,ECYL MUST BE LESS THAN ECYL JMP $+2 JMP QUERY60 ERROR IF GREATER COPY A,PCMP STORE WRITE PRE COMP CYL QUERY61 JST CHRIN CHECK TERMINATOR JMP QUERYS0 CR JMP QUERY62 # JMP QUERY60 BACK ARROW JMP QUERY63 UP ARROW JMP QUERY60 COMMA JMP QUERY60 ANYTHING ELSE IS BAD QUERY62 COPY TEMP2,A GET INPUT FLAG JNE A,QUERY60 CAN'T IF INPUT JMP QRY42 DEFAULT QUERY63 COPY TEMP2,A GET INPUT FLAG JNE A,QUERY60 CAN'T IF INPUT JMP QUERY50 GO BACK QUERY64 COPY IDCTM3,A GET INPUT COUNT JEQ A,QUERY61 CHECK TERMINATOR JMP QUERY60 ILLEGAL NUMBER * LPOOL TITL QUERIES (SHORT TEST-CYLINDERS) ****************************** * * SHORT TEST - CYLINDERS * * QUERY: * * SHORT TEST-CYLS? * * SELECTION: * * NUMBER OF CYLINDERS TO - MUST BE <1/2 OF TOTAL NO. OF CYLS. * BE TESTED AT BEGINING * AND END OF DISK FOR SHORT * TESTING. * * DEFAULT IS 0 * * CALLS: * MSGA * IDEC * CHRIN * ****************************** * QUERYS0 EQU $ COPY =0,A SET A TO ZERO COPY A,TEMP2 RESET INPUT FLAG COPY SHORTCX,A GET DEFAULT VALUE COPY A,SHORTC STORE IT COPY MODE,A GET FUNCTION CLSN ='D',A DIAGNOSTIC? JMP $+2 YES, CONTINUE JMP QUERY70 NO, JUMP TO NEXT ONE JST MSGA OUTPUT QUERY WORD QUERYMS0 JST IDEC GET RESPONSE JEQ X,QUERYS3 IF ZERO, SEE WHY COPY X,SHORTC STORE RESULT SUB =1,X DECREMENT NUMBER COPY ECYL,A GET ENDING CYLINDER NUMBER SUB SCYL,A GET TOTAL NUMBER OF CYLINDERS SHIFT A,RO,1 DIVIDE TOTAL BY HALF CSK A,X COMPARE TO SHORT TEST CYLINDER JMP QUERYS0 CAN'T DO NOP CAN DO QUERYS1 IMS TEMP2 SET INPUT FLAG QUERYS2 JST CHRIN CHECK TERMINATOR JMP QUERY70 CR JMP QUERYS4 # JMP QUERYS0 BACK ARROW JMP QUERYS5 UP ARROW JMP QUERYS0 COMMA JMP QUERYS0 ANYT HING ELSE QUERYS3 COPY IDCTM3,A GET INPUT COUNT JEQ A,QUERYS2 CHECK TERMINATOR JMP QUERYS1 OTHERWISE, INPUT = 0 QUERYS4 COPY TEMP2,A GET INPUT FLAG JNE A,QUERYS0 CAN'T DO JMP QRY42 DEFAULT QUERYS5 COPY TEMP2,A GET INPUT FLAG JNE A,QUERYS0 CAN'T DO JMP QUERY60 GO BACK * LPOOL TITL QUERIES (NUMBER OF HEADS) ****************************** * * NUMBER OF HEADS * * QUERY: * *  HDS? * * SELECTION: * TOTAL NUMBER OF HEADS, * STARTING HEAD NUMBER, - MUST BE < TOTAL HEAD NO. * ENDING HEAD NUMBER - MUST BE > START. HEAD NO. AND * MUST BE < END. HEAD NO. * DEFAULT IS THE SELECTED DRIVE PARAMETERS * * CALLS: * MOVE * MSGA * IDEC * CHRIN * ****************************** * QUERY70 EQU $ COPY =0,A SET A TO ZERO COPY A,TEMP1 RESET INTERMIDIATE SHORT TEST FLAG COPY A,TEMP2 RESET INPUT FLAG COPY DISK,A GET ADDRESS OF PARAMETER TABLE ADD =HDS-HCP,A ADD 'HEAD PARAMETERS' OFFSET COPY A,QUERY71 STORE FOR MOVE COPY =HDS-EHD-1,A SET MOVE COUNT -(EHD-HDS+1) JST MOVE RESET HEAD PARAMETERS TO DEFAULT QUERY71 WORD 0 WORD HDS JST MSGA OUTPUT QUERY WORD QUERYM70 JST IDEC GET INPUT JEQ X,QUERY73 TERMINATOR OR ZERO INPUT? IMS TEMP2 SET INPUT FLAG  COPY X,HDS STORE NUMBER OF HEADS COPY =0,A SET STARTING HEAD TO COPY A,SHD ZERO, TENTATIVELY SUB =1,X SET ENDING HEAD TO (HDS-1) COPY X,EHD TENTATIVELY COPY IDCTM2,A GET TERMINATOR CLSN =',',A IS IT A COMMA? JMP QUERY74 YES, GET STARTING HEAD NUMBER QUERY72 JST CHRIN CHECK TERMINATOR JMP QUERY78 CR JMP QUERY75 # JMP QUERY70 BACK ARROW JMP QUERY76 UP ARROW JMP QUERY70 COMMA JMP QUERY70 ANYTHING ELSE IS BAD QUERY73 COPY IDCTM3,A GET ACTUAL INPUT COUNT JEQ A,QUERY72 IF ZERO, CHECK TERMINATOR JMP QUERY70 ELSE INPUT = 0 (ERROR) QUERY74 IMS TEMP1 BUMP SHORT TEST FLAG JST IDEC GET STARTING HEAD NUMBER COPY X,A DO RANGE CHECK CSK A,EHD MUST BE BETWEEN 0 AND (HDS-1) JMP $+2 JMP QUERY70 RANGE ERROR COPY A,SHD STORE STARTING HEAD NUMBER COPY A,EHD ASSUME ENDING HEAD ALSO COPY IDCTM2,A CHECK TERMINATOR CLSN =',',A IS IT A COMMA? JMP QUERY77 YES, GET ENDING HEAD NUMBER JMP QUERY72 NO, CHECK TERMINATOR QUERY75 COPY TEMP2,A GET INPUT FLAG JNE A,QUERY70 CAN'T DO IT JMP QRY42 YES, WE CAN QUERY76 COPY TEMP2,A GET INPUT FLAG JNE A,QUERY70 CAN'T DO IT COPY MODE,A GET FUNCTION CLSN ='D',A DIAGNOSTIC? JMP QUERYS0 YES, GO BACK 1 JMP QUERY60 NO, GO BACK 2 QUERY77 JST IDEC GET ENDING HEAD NUMBER COPY X,A DO RANGE CHECK CSK A,HDS MUST BE LESS THAN TOTAL JMP $+3 NOP JMP QUERY70 RANGE ERROR CSK A,SHD MUST NOT BE LESS THAN JMP QUERY70 STARTING HEAD NUMBER NOP COPY A,EHD STORE ENDING HEAD NUMBER JMP QUERY72 CHECK TERMINATOR QUERY78 COPY TEMP1,A GET INTERMIDIATE SHORT TEST FLAG ADD SHORT,A ADD SHORT TEST FLAG COPY A,SHORT STORE NEW SHORT TEST FLAG JMP QUERY80 NEXT QUERY * LPOOL TITL QUERIES (SECTORS PER TRACK) ****************************** * * SECTORS PER TRACK * * QUERY: * * SECTORS/TRACKS (16)? * * SELECTION: * TOTAL NUMBER OF SECTORS PER TRACK * DEFAULT IS '16' * * CALLS: * MOVE * MSGA * IDEC * CHRIN * ****************************** * QUERY80 EQU $ COPY =0,A SET A TO ZERO COPY A,TEMP2 RESET INPUT FLAG COPY DISK,A GET ADDRESS O  F PARAMETER TABLE ADD =SECS-HCP,A ADD SECTOR PARAMETERS OFFSET COPY A,QUERY81 STORE FOR MOVE COPY =SECS-ESEC-1,A SET MOVE COUNT -(ESEC-SECS+1) JST MOVE RESET SECTOR PARAMETERS TO DEFAULT QUERY81 WORD 0 WORD SECS JST MSGA OUTPUT QUERY WORD QUERYM80 JST IDEC GET INPUT JEQ X,QUERY83 TERMINATOR OR ZERO INPUT? IMS TEMP2 SET INPUT FLAG COPY X,SECS SAVE SECTORS/TRACKS COPY =0,A FIRST SECTOR = 0 COPY A,SSEC SUB =1,X COPY X,ESEC LAST SECTOR = (SECS-1) QUERY82 JST CHRIN CHECK TERMINATOR JMP QUERY90 CR JMP QUERY84 # JMP QUERY80 BACK ARROW JMP QUERY85 UP ARROW JMP QUERY80 COMMA JMP QUERY80 ANYTHING ELSE IS ILLEGAL QUERY83 COPY IDCTM3,A GET ACTUAL INPUT COUNT JEQ A,QUERY82 IF ZERO, CHECK TERMINATOR JMP QUERY80 ELSE, INPUT = 0 (ERROR) QUERY84 COPY TEMP2,A GET INPUT FLAG JNE A,QUERY80 CAN'T DO IT JMP QRY42 CAN DO QUERY85 COPY TEMP2,A GET INPUT FLAG JNE A,QUERY80 CAN'T DO IT JMP QUERY70 CAN DO * LPOOL TITL QUERIES (WORDS PER SECTOR) ****************************** * * WORDS PER SECTOR * * QUERY: * * WORDS/SECTOR (256)? * * SELECTION: * TOTAL NUMBER OF WORDS PER SECTOR * DEFAULT IS '256' * *  CALLS: * MSGA * IDEC * CHRIN * ****************************** * QUERY90 EQU $ COPY =0,A SET A TO ZERO COPY A,TEMP2 RESET INPUT FLAG COPY DISK,X GET ADDRESS OF PARAMETER TABLE COPY WDS-HCP(X),A GET DEFAULT WORDS PER SECTOR COPY A,WDS STORE DEFAULT WORDS PER SECTOR JST MSGA OUTPUT QUERY WORD QUERYM90 JST IDEC GET INPUT JEQ X,QUERY92 TERMINATOR OR ZERO INPUT? IMS TEMP2 SET INPUT FLAG COPY X,WDS STORE INPUT QUERY91 JST CHRIN CHECK TERMINATOR JMP QUERYA0 CR JMP QUERY93 # JMP QUERY90 BACK ARROW JMP QUERY94 UP ARROW JMP QUERY90 COMMA JMP QUERY90 ANYTHING ELSE IS BAD QUERY92 COPY IDCTM3,A GET ACTUAL INPUT COUNT JEQ A,QUERY91 IF ZERO, CHECK TERMINATOR JMP QUERY90 ELSE, INPUT = 0 (ERROR) QUERY93 COPY TEMP2,A GET INPUT FLAG JNE A,QUERY90 CAN'T DO JMP QRY42 CAN DO QUERY94 COPY TEMP2,A GET INPUT FLAG JNE A,QUERY90 CAN'T DO JMP QUERY80 CAN DO * LPOOL TITL QUERIES (USER'S PATTERN) ****************************** * * USER'S PATTERN * * QUERY: * * PATN (:6DB6)?: * * SELECTION: * :0000 TO :FFFF * DEFAULT IS ':6DB6' * * CALLS: * MSGA * IHEX * CHRIN * ****************************** * QUERYA0 EQU $ COPY MODE,A GET FUNCTION CLSN ='F',A FORMAT? JMP QUERYE0 YES, JUMP CLSN ='T',A TECH TEST? JMP QUERND YES, JUMP COPY =0,A SET A TO ZERO COPY A,TEMP2 RESET INPUT FLAG COPY WCPATX,A GET DEFAULT PATTERN COPY A,WCPAT STORE AS USER PATTERN JST MSGA OUTPUT QUERY WORD QUERYMA0 JST IHEX GET INPUT JEQ X,QUERYA3 IF ZERO, SEE WHY QUERYA1 IMS TEMP2 SET INPUT FLAG COPY X,WCPAT STORE PATTERN QUERYA2 JST CHRIN CHECK TERMINATOR JMP QUERYB0 CR JMP QUERYA4 # JMP QUERYA0 BACK ARROW JMP QUERYA5 UP ARROW JMP QUERYA0 COMMA JMP QUERYA0 ANYTHING ELSE IS BAD QUERYA3 COPY IDCTM3,A LOOK AT ACTUAL INPUT COUNT JEQ A,QUERYA2 IF ZERO, CHECK TERMINATOR JMP QUERYA1 ELSE STORE INPUT QUERYA4 COPY TEMP2,A GET INPUT FLAG JNE A,QUERYA0 CAN'T DO JMP QRY42 CAN DO QUERYA5 COPY TEMP2,A GET INPUT FLAG JNE A,QUERYA0 CAN'T DO JMP QUERY90 CAN DO * LPOOL TITL QUERIES (UNIT NUMBERS) ****************************** * * UNIT NUMBERS * * QUERY: * * UNITS (0-'MAX. NUMBER OF UNITS')?  * * SELECTION: * 0 TO MAXIMUM NUMBER OF TESTABLE * UNITS (SEE 'UNITS' EQUATE) * DEFAULT IS '0' * * CALLS: * MOVE * MSGA * IDEC * CHRIN * ****************************** * QUERYB0 EQU $ COPY =-UNITS-1,A GET MOVE COUNT -(UNITS+1) JST MOVE SET UNIT SELECTION TO DEFAULT VALUES WORD UNX WORD UN JST MSGA OUTPUT QUERY WORD QUERYMB0 COPY =0,A SET A TO ZERO COPY A,TEMP1 RESET COUNT OF INPUTS QUERYB1 JST IDEC GET INPUT JEQ X,QUERYB4 IF ZERO, SEE WHY COPY X,A DO RANGE CHECK CSK A,=UNITS-1 MUST BE 0 - (UNITS-1) JMP $+2 JMP QUERYB0 NOT OK QUERYB2 COPY TEMP1,A CHECK COUNT  CLSN =UNITS,A MAX. UNITS? JMP QUERYB0 YES, ERROR ADD =UN,A EXCH A,X X = ADDRESS OF UNIT TABLE IN PARAMETER TABLE COPY A,0(X) STORE UNIT NUMBER IN TABLE COPY =-1,A STORE DELIMITER COPY A,1(X) AT NEXT LOCATION IN TABLE IMS TEMP1 BUMP COUNT QUERYB3 JST CHRIN CHECK TERMINATOR JMP QUERYC0 CR JMP QUERYB5 # JMP QUERYB0 BACK ARROW JMP QUERYB6 UP ARROW JMP QUERYB1 COMMA JMP QUERYB0 ANYTHING ELSE IS BAD QUERYB4 COPY IDCTM3,A LOOK AT ACTUAL INPUT COUNT JEQ A,QUERYB3 IF ZERO, CHECK TERMINATOR JMP QUERYB2 ELSE, STORE IT QUERYB5 COPY TEMP1,A GET INPUT COUNT JNE A,QUERYB0 CAN'T DO JMP QRY42 CAN DO QUERYB6 COPY TEMP1,A GET INPUT FLAG JNE A,QUERYB0 CAN'T DO JMP QUERYA0 CAN DO * LPOOL TITL QUERIES (DESTRUCTIVE MODE) ****************************** * * DESTRUCTIVE MODE * * QUERY: * * SAVE DATA (Y OR N)? * * SELECTION: * Y - YES, SAVE DATA ON THE DISK *  N - NO, DON'T SAVE DATA ON THE DISK * DEFAULT IS 'N' * * CALLS: * MSGA * IDEC * CHRIN *  IKB * ****************************** * QUERYC0 EQU $ COPY =0,A SET A TO ZERO COPY A,TEMP2 RESET INPUT FLAG COPY NONDEX,A GET DEFAULT VALUE COPY A,NONDES STORE AS RESULT JST MSGA OUTPUT QUERY WORD QUERYMC0 JST IDEC GET RESPONSE JNE X,QUERYC0 IF DECIMAL ERROR COPY IDCTM3,A GET INPUT COUNT JNE A,QUERYC0 A ZERO IS BAD QUERYC1 JST CHRIN CHECK TERMINATOR JMP QUERYD0 CR JMP QUERYC4 # JMP QUERYC0 BACK ARROW JMP QUERYC5 UP ARROW JMP QUERYC0 COMMA CLSN ='Y',A IS IT YES? JMP QUERYC2 OK CLSN ='N',A IS IT NO? JMP QUERYC3 OK JMP QUERYC0 ANYTHING ELSE IS BAD QUERYC2 ADD =1,X SET FLAG QUERYC3 COPY X,NONDES STORE FLAG IMS TEMP2 SET INPUT FLAG JST IKB GET TERMINATOR COPY A,IDCTM2 STORE TERMINATOR JMP QUERYC1 CHECK TERMINATOR QUERYC4 COPY TEMP2,A GET INPUT FLAG JNE A,QUERYC0 CAN'T DO JMP QRY42 CAN DO QUERYC5 COPY TEMP2,A GET INPUT FLAG JNE A,QUERYC0 CAN'T DO JMP QUERYB0 CAN DO * LPOOL TITL QUERIES (RUN OPTIONS) ****************************** * * RUN OPTIONS * * QUERY: * * RUN OPTIONS (:00)?: * * SELECTION: * :00 TO :1F * DEFAULT IS ':00' * * BIT HEX OPTION * --- --- ------ * 0 :01 INCLUDE BUFFER DUMP IN ERROR REPORTS * WHERE APPLICABLE * *  1 :02 SUPPRESS ERROR REPORTS * * 2 :04 OUTPUT ERROR TALLIES AT END OF EACH TEST * * 3 :08 RUN CONTINUOUSLY * * 4 :10 HALT ON HARD ERROR * * 5 :20 LINE PRINTER AND CRT/TTY * * *  CALLS: * MSGA * IHEX * CHRIN * ****************************** * QUERYD0 EQU $ COPY =0,A SET A TO ZERO CO  PY A,TEMP2 RESET INPUT FLAG COPY CARX,A GET DEFAULT VALUE COPY A,CAR STORE VALUE JST MSGA OUTPUT QUERY WORD QUERYMD0 JST IHEX GET RESPONSE JEQ X,QUERYD3 IF ZERO, SEE WHY QUERYD1 IMS TEMP2 SET INPUT FLAG COPY X,A RANGE CHECK SHIFT A,RO,6 :00 - :3F JNE A,QUERYD0 COPY X,CAR STORE VALUE QUERYD2 JST CHRIN CHECK TERMINATOR JMP QRY40 CR JMP QUERYD4 # JMP QUERYD0 BACK ARROW JMP QUERYD5 UP ARROW JMP QUERYD0 COMMA JMP QUERYD0 ANYTHING ELSE IS BAD QUERYD3 COPY IDCTM3,A GET ACTUAL INPUT COUNT JEQ A,QUERYD2 IF ZERO, CHECK TERMINATOR JMP QUERYD1 ELSE, INPUT = 0 QUERYD4 COPY TEMP2,A GET INPUT FLAG JNE A,QUERYD0 CAN'T DO JMP QRY42 CAN DO QUERYD5 COPY TEMP2,A GET INPUT FLAG JNE A,QUERYD0 CAN'T DO JMP QUERYC0 CAN DO * LPOOL TITL QUERIES (UNIT TO FORMAT) ****************************** * * UNIT TO FORMAT * * QUERY: * * UNIT TO FORMAT (0-MAX. UNITS)? * * SELECTION: *  0 TO MAXIMUM NUMBER OF UNITS * (SEE 'UNITS' EQUATE) * DEFAULT IS '0' * * CALLS: * MSGA *  IDEC * CHRIN * ****************************** * QUERYE0 EQU $ COPY =0,A SET A TO ZERO COPY A,TEMP2 RESET INPUT FLAG COPY A,UCUR SET UNIT TO DEFAULT JST MSGA OUTPUT QUERY WORD QUERYME0 JST IDEC GET RESPONSE JEQ X,QUERYE3 IF ZERO, SEE WHY QUERYE1 IMS TEMP2 SET INPUT FLAG COPY X,A CSK A,=UNITS-1 DO RANGE CHECK JMP $+2 OK JMP QUERYE0 NOT OK COPY X,UCUR SAVE UNIT NUMBER QUERYE2 JST CHRIN CHECK TERMINATOR JMP QUERYE10 CR JMP QUERYE4 # JMP QUERYE0 BACK ARROW JMP QUERYE5 UP ARROW JMP QUERYE0 COMMA JMP QUERYE0 ANYTHING ELSE IS BAD QUERYE3 COPY IDCTM3,A GET ACTUAL INPUT COUNT JEQ A,QUERYE2 IF ZERO, CHECK TERMINATOR JMP QUERYE1 ELSE, GOOD INPUT QUERYE4 COPY TEMP2,A GET INPUT FLAG JNE A,QUERYE0 CAN'T DO JMP QRY42 CAN DO QUERYE5 COPY TEMP2,A GET INPUT FLAG JNE A,QUERYE0 CAN'T DO JMP QUERY90 CAN DO * LPOOL TITL QUERIES (FORMATTER LINE PRINTER OPTION?) ******************************* * * FORMATTER LINE PRINTER OPTION? * * QUERY: * * LINE PRINTER OPTION (Y/[N])? * * DEFAULT IS NO * * CALLS: * CHRIN * IDEC * MSGA * ****************************** * QUERYE10 EQU $ COPY =:00,A CLEAR LP OPTION COPY A,CAR STORE OPTION JST MSGA OUTPUT QUERY-'LINE PRINTER?' WORD LPOT MESSAGE ADDR JST IDEC INPUT CHAR JNE X,QUERYE10 NUMERIC RESPONSE IS BANNED QUERYE15 JST CHRIN CHECK IT JMP QUERYE40 CR JMP QRY42 # JMP QUERYE10 BACK ARROW JMP QUERYE0 UP ARROW JMP QUERYE0 , CLSN A,='Y' LP? YES JMP QUERYE20 OK JUMP CLSN A,='N' LP? NO JMP QUERYE30 OK, JUMP JMP QUERYE10 ANYTHING ELSE IS NO GOOD QUERYE20 COPY =:20,A SET LP OPTION COPY A,CAR STORE IT QUERYE30 JST IDEC GET TERMINATOR JMP QUERYE15 CHECK TERMINATOR QUERYE40 JMP QRY40 GO TO NEXT QUERT * LPOOL TITL QUERIES (ECHO MANUFACTURER'S BAD TRACKS) ******************************* * * ECHO MANUFACTURER'S BAD TRACKS LIST * * QUERY: * * ECHO MANUFACTURER'S BAD TRACKS LIST (Y/[N])? * * DEFAULT IS NO * * CALLS: * CHRIN * IDEC * MSGA * ******************************* * QRY40 EQU $ COPY =0,A SET A TO ZERO COPY A,ECHO RESET ECHO FLAG COPY ECHOFL,A GET FLAG JEQ A,QRY42 NO MFR'S BAD TRACK INPUT, NO QUERY, NO ECHO JST MSGA OUTPUT 'ECHO BAD LIST?' QUERY WORD QRYM5 COPY CAR,A GET RUN OPTIONS COPY =0,X SET FOR NO LP TBIT 5,A LINE PRI  NTER? JF OV,$+2 IF NO, JUMP COPY =1,X YES, SET FLAG COPY X,ERLPFL STORE IT RBIT 8,S DISABLE INTERRUPT COPY ERLPFL,A GET FLAG EXCH A,LPFLAG CHANGE WITH LP FLAG COPY A,ERLPFL SAVE LP FLAG JST IDEC GET RESPONSE JNE X,QRY40 NUMERIC REPONSE IS NO-NO JST CHRIN CHECK TERMINATOR JMP QRY42 CR-DEFAULT, DON'T ECHO JMP QRY42 #-DEFAULT, DON'T ECHO JMP QRY40 BACK ARROW JMP QUERYE0 UP ARROW JMP QRY40 COMMA CLSN A,='Y' ECHO-YES? JMP QRY41 GO FOR IT CLSN A,='N' ECHO-NO? JMP QRY42 DO NOTHING JMP QRY40 ANYTHING ELSE IS NO-NO QRY41 COPY =1,A SET ECHO FLAG COPY A,ECHO QRY42 JMP PMBLR OUTPUT MFR BAD LIST? * ECHO RES 1,0 * LPOOL TITL PMBLR (ECHO MANUFACTURER'S BAD TRACK LIST?) ****************************** * * PMBLR: PRINT MANUFACTUERR'S BAD TRACKS LIST * * CALLS: * MSGA * ODEC * ****************************** * PMBLR EQU $ COPY ECHO,A PRINT? JEQ A,FIN NO JST MSGA YES, DO HEADING WORD PMFRL COPY =BADBUF2,A SETUP BUFFER POINTER COPY A,BUFPTR REPEAT COPY *BUFPTR,A GET BAD CLY & HEAD NUMBER ADD =1,A IS IT END OF BUFFER? JNE A,$+2 NO, SKIP NEXT INSTRUCTION JMP EDLT YES, PRINT END LIST JST MSGA PRINT BAD TRKS WORD BADTRK COPY *BUFPTR,A GET CYL NUMBER AND =:FFF0,A ISOLATE CYL NUMBER SHIFT A,RO,4 JST ODEC PRINT IT JST MSGA PRINT BAD HEAD WORD BADTK1 COPY *BUFPTR,A GET HEAD NUMBER AND =:000F,A ISOLATE HEAD NUMBER JST ODEC PRINT IT IMS BUFPTR BUMP BUFFER POINTER NOP NOP JMP REPEAT DO IT AGAIN EDLT JST MSGA PRINT END MESSAGE WORD ENDMFR FIN COPY ERLPFL,A GET LP FLAG EXCH A,LPFLAG CHANGE WITH ERROR FLAG COPY A,ERLPFL RESTORE ERROR AND LP FLAGS JMP QUERND FINISHED * LPOOL TITL TEST CONTROL (DEVICE ADDRESS MODIFICATION) ****************************** * * DEVICE ADDRESS MODIFICATION * FUNCTION EXECUTION * * CALLS: * NONE * ****************************** * QUERND EQU $ COPY CAR,A GET RUN OPTIONS COPY =0,X SET FOR NO LP TBIT 5,A LINE PRINTER? JF OV,$+2 IF NO, JUMP COPY =1,X YES, SET LP COPY X,LPFLAG STORE FLAG COPY DEVAD,Q GET DEVICE ADDRESS SHIFT Q,LO,3 SHIFT INTO CORRECT POSITION COPY =-DASIZ,A GET TOTAL NUMBER OF I/O ADDRESSES COPY A,TEMP1 STORE AS COUNT COPY =DAFRST,Y GET TABLE ADDRESS DAADO COPY 0(Y),X GET AN I/O INSTRUCTION ADDRESS COPY =-:F9,A 'AND' OUT THE AND 0(X),A OLD DEVICE ADDRESS OR Q,A 'OR' IN THE NEW DEVICE ADDRESS COPY A,0(X) REPLACE THE INSTRUCTION ADD =1,Y INCREMENT TABLE POINTER IMS TEMP1 AND THE ADDRESS COUNTER JMP DAADO GO FOR MORE COPY MODE,A GET FUNCTION CLSN ='F',A FORMATTER? JMP FMATTR YES, JUMP CLSN ='T',A TECH TEST? JMP TECH YES, JUMP JMP REPASS CONTINUE * LPOOL TITL TEST CONTROL (TEST EXECUTION) ****************************** * * INCREMENT AND PRINT PASS NUMBER * INCREMENT AND PRINT UNIT NUMBER * EXECUTE TESTS * * CALLS: * MSGA * ODEC * ****************************** * REPASS EQU $ COPY PASCTR,A GET PASS NUMBER CSK A,=10000 GREATER THAN 10,000? IMS PASCTR NO, INCREMENT PASS NUMBER NOP YES, DON'T INCREMENT JT SS,REUNIT SKIP OUTPUT IF SENSE SWITCH IS SET JST MSGA PRINT 'PASS' MESSAGE WORD PASSMG COPY PASCTR,A GET PASS NUMBER JST ODEC PRINT IT OR '****' REUNIT COPY =UN-1,A PRESET UNIT NUMBER POINTER COPY A,UPTR * NUUNIT IMS UPTR BUMP TO NEXT REQUESTED UNIT COPY UPTR,X SET UNIT POINTER COPY 0(X),A GET UNIT NUMBER JGE A,PRTUNIT PRINT UNIT COPY CAR,  A GET RUN OPTIONS SHIFT A,RO,4 CONTINUOUS TESTING? (BIT 3 SET) JF OV,$+2 NO, JUMP JMP REPASS YES, DON'T STOP AT PASS END SHIFT A,RO,2 LP? (BIT 5 SET) JF OV,$+3 NO,JUMP COPY =1,A SET AR COPY A,LPFLAG SET LP FLAG JST MSGA PRINT 'END OF TEST' MESSAGE  WORD EOT JST SPACE PRINT SOME BLANKS JMP ENT1A GO TO QUERIES PRTUNIT COPY A,UCUR STORE UNIT NUMBER ADD =SPACE:%8+'0',A SET UNIT NUMBER TO ASCII COPY A,PRUNIT STORE ASCII UNIT NUMBER JT SS,RETEST SKIP OUTPUT IF SENSE SWITCH IS SET JST MSGA PRINT 'UNIT' MESSAGE WORD UNITMG RETEST COPY =TESTS-1,A PRESET TEST TABLE POINTER COPY A,TPTR STORE POINTER * NUTEST IMS TPTR BUMP POINTER TO NEXT TEST COPY TPTR,X GET POINTER COPY 0(X),X GET TEST NUMBER JLT X,NUUNIT GET NEXT UNIT IF END OF TABLE SBIT 4,S ENABLE CONSOLE INTERRUPT SBIT 8,S ENABLE INTERRUPTS JMP 0(X) DO TEST * LPOOL TITL TEST CONTROL (END OF TESTING) ****************************** * * END OF TEST * OUTPUT ERROR TALLIES * FOR EACH UNIT * * CALLS: * MSGA * ODEC * ****************************** * TSTEND EQU $ COPY CAR,A GET RUN OPTIONS SHIFT A,RO,3 TALLIES WANTED? (BIT 2 SET) JF OV,NUTEST NO, JUMP JST MSGA YES, PRINT TALLY MESSAGES WORD TALTTL COPY =0,A COPY A,TEMP1 START WITH UNIT 0 TALLY1 COPY =UN,X SET UNIT TABLE POINTER TALLY2 COPY 0(X),A GET UNIT ADD =1,X INCREMENT TABLE POINTER JLT A,TALLY3 JUMP IF END OF TABLE XOR TEMP1,A DOES TABLE ENTRY MATCH SCANNER? JNE A,TALLY2 NO, TRY AGAIN COPY =SPACE:%8+'0',A GET ASCII OFFSET ADD TEMP1,A ADD IN UNIT COPY A,PRUNIT STORE ASCII UNIT NUMBER JST MSGA PRINT UNIT NUMBER WORD UNITMG JST MSGA PRINT 'SOFT ERRORS' MESSAGE WORD SOFTMS COPY TEMP1,X GET UNIT NUMBER ADD =ERR0,X ADD IN ERROR TABLE ADDRESS COPY SOFT0-ERR0(X),A GET SOFT ERROR COUNT JST ODEC PRINT SOFT ERRORS JST MSGA PRINT 'FIRM ERRORS' MESSAGE WORD FIRMS COPY FIRM0-ERR0(X),A GET FIRM ERROR COUNT JST ODEC PRINT ERRORS JST MSGA PRINT 'HARD ERRORS' MESSAGE WORD HARDMS COPY HARD0-ERR0(X),A GET HARD ERROR COUNT JST ODEC PRINT ERRORS JST MSGA PRINT 'TOTAL ERRORS' MESSAGE WORD ALLMS COPY ERR0-ERR0(X),A GET TOTAL ERROR COUNT JST ODEC PRINT ERRORS TALLY3 IMS TEMP1 DO NEXT UNIT COPY TEMP1,A CLSN =UNITS,A DONE ALL UNITS YET? JMP $+2 YES, EXIT JMP TALLY1 NO, DO NEXT ONE JST MSGA PRINT 'PASS' MESSAGE WORD PASSMG COPY PASCTR,A GET PASS NUMBER JST ODEC PRINT PASS NUMBER JMP NUTEST LOOP FOR MORE * LPOOL TITL TEST A - TESTS BASIC STATUS ****************************** * * TEST A - TESTS BASIC STATUS * * TEST A TESTS BASIC STATUS USING THE *  TIO OPCODE WITH AND WITHOUT * INTERRUPTS * * CALLS: CALLED BY: * TSTITL  TEST CONTROL (TEST EXECUTION) * PREP * RYINIT * MKIOB * DOIO * STATUS * RETRY * ******************************* * TESTA EQU $ TEST A - BASIC STATUS TEST COPY ='A',A PRINT TEST A TITLE JST TSTITL JST PREP INITIALIZE COPY =TAIOB,X INDEX IOB COPY =TIO,A STORE OPCODE COPY A,OP(X) COPY =0,A NO INTERRUPTS COPY A,IN(X) JST RYINIT RESET RETRIES WORD TESTA1 WORD TESTA2 JST MKIOB SET UP IOB JST DOIO DO I/O TESTA1 JST MKIOB SET UP IOB AGAIN JST DOIO DO I/O AGAIN JST STATUS CHECK STATUS AFTER SECOND TIO JST R ETRY RETRY IF ERROR TESTA2 COPY =INTLOC,A SET UP INT LOC TO IOB COPY A,IN(X) JST RYINIT RESET RETRIES WORD TESTA3 WORD TESTA4 TESTA3 JST MKIOB SET UP IOB JST DOIO DO I/O JST STATUS CHECK STATUS JST RETRY RETRY ON ERROR TESTA4 JMP TSTEND EXIT * TAIOB WORD TIO TEST A IOB RES 4,0 WORD 0,BUF RES 5,0 * LPOOL TITL TEST B - TESTS SEEK AND READ REGARDLESS ****************************** * * TEST B - TESTS SEEK AND READ REGARDLESS FUNCTIONS * *  TEST B TESTS THE BASIC FUNCTION OF THE * SEEK AND READ REGARDLESS * FUNCTIONS. ALSO TESTS CASE SEEKS, * 'SEEK ERROR' TESTING, OVERLAPPED * SEEKS. * * CALLS: CALLED BY: * TSTITL  TEST CONTROL (TEST EXECUTION) * PREP * MKIOB * TESTB1 * RANDOM * RYINIT * DOIO * OTA * SENRDY * TB5J * RETRY * DINIT * ERROR * STATUS * NXTHDR *  CRC * ERSET * MSGA * TSTB1F * OHEX * OTTY * DUMP * ****************************** * TMP:B1 RES 1,0 TEMPORARY CELL * TESTB EQU $ COPY ='B',A PRINT TEST B TITLE JST TSTITL JST PREP RESET DMA ADDRESS, DISK COPY =TBIOB1,X INDEX IOB COPY =RDRG,A SET RD REG FC COPY A,OP(X) COPY =0,A COPY A,CS(X) CLEAR CYL COPY A,HS(X) AND HEAD COPY A,SSS(X) AND SECTOR COPY WDS,A ADD =7,A DATA+ID+HEADER+CRCS COPY A,WC(X) RDRG WORD COUNT COPY =TBIOB2,X SET UP SEEK IOB COPY =SEEK,A SET SEEK FC COPY A,OP(X) JST MKIOB COPY =0,A TO CYL 0 JST TESTB1 DO I/O COPY CYLS,A SEEK TO LAST CYL SUB =1,A JST TESTB1 DO SEEK, READ REG COPY =-400,X PRESET FOR 400 RANDOM SEEKS COPY SHORTC,A GET SHORT TEST CYL. JEQ A,$+2 NO, SHORT TESTING NEG A,X NEGATE COPY X,TEMP1 STORE RANDOM SEEK NUMBER COPY =1,A INITIALIZE RANDOM RTNE COPY A,SEED TESTB3 COPY TEMP1,A SET RUN INDICATOR NEG A,A OR =:2000,A SELP A,4 COPY =-1,X GET A RANDOM NO JST RANDOM FOR CYL NO CSK A,CYLS WITHIN RANGE? JMP TESTB2 YES, USE IT NOP JMP TESTB3 NO, GETANOTHERONE TESTB2 JST TESTB1 DO SEEK, READ IMS TEMP1 BUMP 400 COUNTER JMP TESTB3 DO NEXT SEEK TB2B COPY =0,A COPY A,TEMP1 SET UP WORST CASE SEEK COPY CYLS,A TEMP1=UP COUNT SUB =1,A COPY A,TEMP2 TEMP2=DOWN COUNT ADD =1,A RESTORE NUMBER COPY SHORTC,X GET SHORT TEST CYLS. JEQ X,$+2 IF NONE, JUMP COPY X,A PUT INTO X NEG A NEGATE COPY A,TMP:B1 STORE CYLINDER COUNT TESTB4 COPY TEMP1,A SET RUN IND OR =:2000,A SELP A,4 COPY TEMP1,A SEEK TO OUTSIDE JST TESTB1 COPY TEMP2,A SEEK TO INSIDE  JST TESTB1 IMS TEMP1 BUMP UP COUNTER COPY TEMP2,A BUMP DOWN COUNTER SUB =1,A COPY A,TEMP2 IMS TMP:B1 INCREMENT CYLINDER COUNT JMP TESTB4 IF NOT DONE, GO BACK FOR MORE COPY =:2000,A SELP A,4 SET RUN INDICATOR TBD COPY =0,A SEE WHAT UNITS ARE AVAILABLE COPY A,TBU0 COPY =-UNITS+1,A JST MOVE WORD TBU0 WORD TBU0+1 COPY =UN,Y COPY =1,A TSTB5A COPY 0(Y),X JLT X,TSTB5B ADD =TBU0,X COPY A,0(X) ADD =1,Y JMP TSTB5A TSTB5B COPY =0,A SEE IF MORE THAN ONE COPY =TBU 0,X UNIT REQUESTED COPY =UNITS-1,Q TSTB5B1 ADD 0(X),A ADD =1,X JNED Q,TSTB5B1 SUB =1,A COPY UCUR,Y CURRENT UNIT IS UNIT A COPY Y,TBUNA JGT A,TSTB5E USE SAME UNIT COPY Y,TBUNB JMP TSTB5M TSTB5E ADD =TBU0,Y NEXT HIGHER NUMBERED UNIT TSTB5C ADD =1,Y IF NO HIGHER NUMBERED UNIT, COPY 0(Y),A THEN LOWEST REQUESTED UNIT JEQ A,TSTB5C JGT A,TSTB5D COPY =TBU0-1,Y JMP TSTB5C * LPOOL TITL TSTB5D SUB =TBU0,Y COPY Y,TBUNB FOUND UNIT B TSTB5M EQU $ COPY =TBIOB2,X SET SEEK IOB COPY =SEEK,A SET SEEK FC COPY A,OP(X) COPY =-100,A DO THIS 100 TIMES COPY A,TEMP3 TB5H EQU $ JST RYINIT INIT FOR RETRIES WORD TB5F WORD TB5G TB5F EQU $ COPY TBUNA,A COPY A,US(X) COPY =0,A COPY A,CS(X) SEEK TO CYL 0 FIRST COPY =INTLOC,A WITH INTERRUPTS COPY A,IN(X) JST DOIO SEEK UNIT A TO CYL 0 COPY TBUNB,A SET UP UNIT B COPY A,US(X) JST DOIO SEEK UNIT B TO CYL 0 TOO COPY CYLS,A NOW SET UP FOR INSIDE CYL SUB =1,A COPY A,TBIOBB+CS SHIFT A,RO,1 COPY A,TBIOBA+CS COPY TBUNA,A XOR TBUNB,A SAME UNIT? JNE A,$+2  NO COPY A,TBIOBB+CS YES SEEK TO CYL 0 COPY =-24,A ALLOW 191 MSEC COPY A,RTCCNT COPY =TBINTR,A STORE RETURN ADDRESS COPY A,RTCRTN TO CLOCK INT LOC RBIT 5,S RESET CLOCK SBIT 8,S ENABLE INTS COPY =TBIOBA,A GET READY TO SELECT UNIT A COPY A,ADRIOB COPY =TBIOBB,X AND UNIT B SBIT 5,S STARTIT UP JST OTA SEEK UNIT A JST SENRDY WAIT FOR IDLE JMP $-1 JST OTX SEEK UNIT B JMP $ WAIT FOR SOMETHING TO HAPPEN TBINT1 EQU $ FIRST INTERRUPT POINT JST $+1 SERVICE INT NOP COPY TBUNA,A XOR TBUNB,A SAME UNIT JEQ A,TBINT2 YES, DONT DO TIO COPY =TBIOBC,A NOW DO A TIO FOR 2ND INT COPY A,ADRIOB SBIT 8,S JST OTA SELECT FOR SECOND INTERRUPT JMP $ WAIT FOR INTERRUPT TBINT2 EQU $ MADE IT!! JST $+1 SERVICE INTERRUPT NOP RBIT 5,S STOP THE CLOCK TB5J EQU $ COPY TBUNA,A SET UP MASKS SHIFT A,LO,2 ADD TBUNB,A SHIFT A,LO,2 ADD =SIMTAB,A TO GET EXPECTED STATUS COPY A,TEMP1 COPY =TBIOBA,X COPY =1,A JST TB5JA CHECK 1ST IOB STATUS COPY  =TBIOBB,X COPY =2,A JST TB5JA CHECK 2ND IOB STATUS COPY TBUNA,A XOR TBUNB,A SAME UNIT JEQ A,TSTB5P  YES COPY =TBIOBC,X COPY =3,A JST TB5JA CHECK TIO IOB STATUS TSTB5P EQU $ COPY =TBIOB2,X RESTORE ORIG IOB ADDRESS COPY X,ADRIOB JST RETRY RETRY ANY ERRORS TB5G IMS TEMP3 BUMP 100 COUNT JMP TB5H JMP TSTEND EXIT TBINTR ENT BAD NEWS.CLOCK RAN OUT. JST DINIT STOP THE DISK COPY =23,A PRINT ERROR JST ERROR JMP TB5J CHECK STATUSES * LPOOL TITL TEST B SUBROUTINES (TB5JA) ****************************** * * TB5JA - CHECK STATUS * * THIS SUBROUTINE IS USED BY TEST B * TO CHECK THE RETURNED STATUS AND * RETURNED DRIVE STATUS FOR ERRORS. * * CALLING SEQUENCE: * COPY =IOB ADDRESS,X * COPY =TABLE OFFSET,A * JST TB5JA * * CALLS: CALLED BY: * ERROR TESTB * ****************************** * TB5JA ENT STATUS CHECK ROUTINE COPY A, TEMP2 SAVE OFFSET INTO TABLE COPY X,ADRIOB SAVE IOBADDR COPY CST(X),A LOOK AT CONTROLLER STATUX XOR =:400,A  GOOD? JNE A,TB5JB NO, OUTPUT ERROR COPY DST(X),A GET DRIVE STATUS AND =:FF00,A MASK OFF LSB COPY A,TCTEMP ONLY CONCERNED WITH BITS 15-8 COPY TEMP1,Y AND OFF OTHER UNITS COPY 0(Y),A AND TCTEMP,A COPY A,TEMP4 FROM DRIVE STATUS COPY TEMP1,A GET COMPARISON STATUS ADD TEMP2,A FROM TABLE COPY A,X COPY 0(X),A COMPARE STATUS XOR TEMP4,A JNE A,TB5JB ERROR. BAD STATUS JMP *TB5JA OK DRIVE STATUS TB5JB COPY ADRIOB,X GET ADDR OF IOB  COPY =23,A SET ERROR NO ADD TEMP2,A JST ERROR CALL ERROR ROUTINE JMP *TB5JA EXIT * LPOOL TITL TEST B SUBROUTINES (TESTB1) ****************************** * * TESTB1 - SEEK I/O * * THIS SUBROUTINE IS USED BY TEST B *  TO DO THE SEEK TESTING. * * CALLING SEQUENCE: * COPY =SEEK CYLINDER,A * JST TESTB1 * * CALLS:  CALLED BY: * RYINIT TESTB * MKIOB * DOIO * STATUS * RETRY * FILCON * NXTHDR * CRC * ERROR * ERSET * MSGA * TSTB1F * ****************************** * TESTB1 ENT TEST B I/O CALLER COPY A,CCUR STORE REQUESTED SEEK CYL COPY =TBIOB2,X SET UP SEEK IOB COPY =SEEK,A  SET SEEK FC COPY A,OP(X) JST RYINIT RESET RETRIES WORD TSTB11 WORD TSTB12 TSTB11 EQU $ JST MKIOB  JST DOIO DO THE SEEK JST STATUS JST RETRY RETRY TSTB12 EQU $ COPY =0,A FILL BUF WITH ZERO JST FILCON  COPY =TBIOB1,X SET UP RD REGARD IOB COPY =RDRG,A SET READ REG FC COPY A,OP(X) COPY WDS,A ADD =8,A DATA+HEADER+CRCS COPY A,WC(X) RDRG WORD COUNT JST RYINIT RESET RETRIES WORD TSTB13 WORD TSTB1E TSTB13 EQU $ JST MKIOB JST DOIO DO REGARDLESS READ JST STATUS CHECK STATUS COPY BUF+1,A GET ACTUAL SECTOR READ FROM  SHIFT A,RO,8 GET RID OF HEAD NO COPY A,SCUR SAVE IT FOR NXTHDR ROUTINE JST NXTHDR CALCULATE WHAT NEXT ADDR COPY =CMPBUF,X SHOULD BE COPY CCUR,A BUILD COMPARE HEADER BUFFER COPY A,1(X) COPY SCUR,A STORE CYL, SECTOR SHIFT A,LO,8 OR HCUR,A AND HEAD COPY A,2(X) COPY CNEXT,A GET NEXT CYL NO COPY A,3(X) COPY SNEXT,A NEXT SECTOR SHIFT A,LO,8 OR HNEXT,A AND NEXT HEAD COPY A,4(X) TSTB1A COPY WDS,A STORE LENGTH * * WRITE PRE COMPENSATION * COPY 1(X),Q GET CURRENT CYLINDER CSK Q,PCMP CHECK AGAINST WRITE PRE COMP. CYL. JMP $+3 LESS THAN NOP GREATER THAN OR =:8000,A SET BIT * COPY A,5(X) COPY =6,A CALCULATE ID CRC JST CRC COPY A,6(X) STORE IT  COPY =-6,A NOW COMPARE THE HEADERS COPY A,TEMP3 6 WORDS COPY =BUF,A POINT TO ACTUAL BUF COPY A,TEMP4  COPY =CMPBUF1,X INDEX COMPARATOR BUF TSTB1B COPY TEMP4,Y GET ACTUAL HEADER WORD COPY 0(Y),A XOR 0(X),A COMPARE IT TO EPXPECTED WD JNE A,TSTB1C ID CRC MISCOMPARE IMS TEMP4 ADD =1,X KEEP CHECKING IMS TEMP3 JMP TSTB1B COPY =BUF+6,A NOW CALCULATE WORD CRC COPY A,X ADD WDS,A ADD =1,A COPY A,TCTEMP COPY WDS,A ADD =1,A  JST CRC COPY A,TSBCRC SAVE CRC COPY TCTEMP,Y COMPARE IT TO ACTUAL WORD CRC XOR 0(Y),A JNE A,TSTEMP WORD CRC MISCOMPARE TSTB14 JST RETRY RETRY ON ERROR TSTB1E EQU $ COPY =0,A COPY A,SCUR JMP *TESTB1 RETURN TSTB1C EQU $ COPY =20,A ID CRC MISCOMPARE JST ERROR PRINT ERROR MSG JST ERSET JMP TSTB14 COPY ESF,A ERROR SUPPRESSION FLAG SET? JNE A,TSTB14 YES, DON'T PRINT COPY CAR,A SEE IF ERROR REPORTS WANTED SHIFT A,RO,2 JT OV,TSTB1E NO, FORGET IT  JST MSGA YES, DISPLAY ACTUAL HEADER WORD ACTHDM COPY =BUF,A JST TSTB1F CALL HEADER PRINT RTNE JST MSGA NOW DISPLAY EXPECTED HDR WORD EXPHDM COPY =CMPBUF1,A JST TSTB1F CALL HEADER DISPLAY RTNE JMP TSTB14 TSTEMP JMP TSTB1D * LPOOL TITL TEST B SUBROUTINES (TSTB1F) ****************************** * * TSTB1F - HEADER DISPLAY * *  THIS SUBROUTINES IS USED BY TEST B * TO DISPALY ACTUAL AND EXPECTED * HEADER INFORMATION. * * CALLING SEQUENCE: * COPY =HEADER ADDRESS,A * JST TSTB1F * * CALLS: CALLED BY: * OHEX  TESTB * OTTY * ERROR * ERSET * MSGA * DUMP * ****************************** * TSTB1F ENT HDR DISPLAY ROUTINE COPY A,TEMP3 SAVE HEADER ADDRESS COPY =-6,A 6 CHARS COPY A,TEMP4 TSTB1G COPY TEMP3,Y GET A CHAR COPY 0(Y),A JST OHEX DUMP WORD IN HEX COPY =' ',A JST OTTY IMS TEMP3 BUMP PTR IMS TEMP4 BUMP COUNT JMP TSTB1G DO NEXT WORD JMP *TSTB1F RETURN TSTB1D EQU $ COPY =21,A WORDC RC MISCOMPARE JST ERROR JST ERSET JMP TSTB14 COPY CAR,A SEE IF ERRORS WANTED SHIFT A,RO,2 JT OV,TSTB1410 NO JST MSGA YES PRINT CRC WORD ACCRCM COPY TCTEMP,Y COPY 0(Y),A JST OHEX JST MSGA AND EXPECTED CRC WORD XPCRCM COPY TSBCRC,A JST OHEX COPY WDS,A GO DUMP BUFFER ADD =2,A NEG A,A COPY =BUF+6,X IF WANTED JST DUMP TSTB1410 JMP TSTB14 * LPOOL TITL TEST B TABLES AND IOBS * TSBCRC WORD 0 SAVE CRC CHAR * TBU0 RES UNITS,0 WORD -1 * TBIOB1 WORD RDRG,0,0,0,0 WORD 0,BUF,INTLOC RES 4,0 * TBIOB2 WORD SEEK RES 6,0 WORD INTLOC RES 4,0 * TBIOBA WORD SEEK TBUNA WORD 0 RES 5,0 WORD TBINT1,0,0,0,0 * TBIOBB WORD SEEK TBUNB WORD 0 RES 5,0  WORD TBINT1,0,0,0,0 * TBIOBC WORD TIO RES 6,0 WORD TBINT2,0,0,0,0 * CMPBUF WORD 1 HEADER ID CMPBUF1 RES 9,0 * SIMTAB EQU $ SIMULATANEOUS SEEK WORD :8000,:8000,0,0 WORD :C000,:8000,:4000,0 STATUS COMP- WORD :A000,:8000,:2000,0 ARISON TABLE WORD :9000,:8000,:1000,0 WORD :C000,:4000,:8000,0 WORD :4000,:4000,0,0 WORD :6000,:4000,:2000,0 WORD :5000,:4000,:1000,0 WORD :A000,:2000,:8000,0 WORD :6000,:2000,:4000,0 WORD :2000,:2000,0,0 WORD :3000,:2000,:1000,0 WORD :9000,:1000,:8000,0 WORD :5000,:1000,:4000,0 WORD :3000,:1000,:2000,0 WORD :1000,:1000,0,0 TITL TEST C - FORMAT FUNCTION TESTING ****************************** * * TEST C - FORMAT FUNCTION TESTING * * FORMAT 1 SECTOR - SHOULD COMPLETE WITHOUT ERROR * TEST SECTOR OVERRUN -  SHOULD GET FORMAT ERROR * TEST TRACK OVERRUN - SHOULD GET FORMAT ERROR * * FORMAT TESTING IS DONE ON EACH TRACK AS FOLLOWS: * A FORMAT FUNCTION IS ISSUED TO EACH TRACK IN * STANDARD CAI FORMAT, FOR A LENGTH OF TWO TRACKS. * THEN A READ REGARDLESS IS DONE TO THE SECOND * TRACK, TO READ IN THE HEAD, ID, AND ONE DATA WORD * FROM EACH TRACK. THEN A READ REGARDLESS IS DONE * TO A FULL SECTOR (HEADER+ID+DATA+CRC) ON THE *  FIRST TRACK. THEN A READ VERIFY OPERATION IS * DONE TO THE FIRST TRACK, FOR A LENGTH OF TWO * TRACKS. CORRECT HEADER, ID, AND DATA TRANSFER * IS VERIFIED FOR EACH READ OPERATION. * * OVERRUN TESTING USERS 4094 WORDS IN 3 SECTORS. * * THIS TEST IS NOT RUN IF NONDESTRUCTIVE TESTING * IS REQUESTED. * * CALLS:  CALLED BY: * TSTITL TEST CONTROL (TEST EXECUTION) * PREP * RYINIT * MKIOB *  DOIO * STATUS * RETRY * ERROR * INCRH * FMBLDC * MOVE * TESTC4 * COMPAR * CRC * ERSET * DUMP * ****************************** * TMP:C1 RES 1,0 TEMPORARY CELL TMP:C2 RES 1,0 TEMPORARY CELL * TESTC EQU $ TEST C - FORMAT TEST COPY ='C',A PRINT TEST C TITLE JST TSTITL COPY NONDES,A NONDESTRUCTIVE? JEQ A,$+2 NO JMP TSTEND YES, DONT RUN IT COPY SHORTC,A GET SHORT TEST CYLS. JNE A,$+3 IF SHORT TESTING, JUMP JST TEST:C DO TEST C OVER FULL RANGE JMP TSTEND EXIT TEST COPY ECYL,A GET ENDING CYL. NUMBER COPY A,TMP:C1 SAVE IT COPY SCYL,A GET STARTING CYL. NUMBER COPY A,TMP:C2 SAVE IT ADD SHORTC,A ADD IN SHORT TEST CYLS. SUB =1,A DECREMENT ONCE COPY A,ECYL STORE NEW ENDING CYL. NUMBER JST TEST:C DO TEST C COPY TMP:C1,A GET ENDING CYL. NUMBER COPY A,ECYL STORE ENDING CYL. NUMBER SUB SHORTC,A GENERATE STARTING CYL. NUMBER ADD =1,A INCREMENT ONCE COPY A,SCYL STORE NEW STARTING CYL. NUMBER JST TEST:C DO TEST C COPY TMP:C2,A GET OLD STARTING CYL. NUMBER COPY A,SCYL STORE VALUE JMP TSTEND * LPOOL TITL * TEST:C ENT START OF TEST C COPY WDS,A COPY SECS,X TC60A COPY A,TCWDS COPY X,TCSECS JST PREP INITIALIZE DISK COPY TCIOB5+MA,X GET SECTOR BLOCK ADDRESS COPY 0(X),A GET CURRENT CYLINDER NUMBER AND =:F000,A MASK OFF CYLINDER NUMBER OR SCYL,A 'OR' IN STARTING CYLINDER NUMBER COPY A,0(X) STORE NEW CURRENT CYLINDER NUMBER COPY A,5(X) DITTO FOR NEXT BLOCK COPY A,10(X) DITTO FOR THIRD BLOCK COPY 1(X),A GET CURRENT HEAD NUMBER AND =:FFE0,A MASK OFF HEAD NUMBER OR SHD,A 'OR' IN STARTING HEAD NUMBER COPY A,1(X) STORE NEW CURRENT HEAD NUMBER COPY A,6(X) DITTO FOR NEXT BLOCK COPY A,11(X) DITTO FOR THIRD BLOCK TC69 COPY =TCIOB5,X INDEX OVERRUN IOB JST RYINIT INITIALIZE WORD TC70 WORD TC71 TC70 COPY =FRMT,A STORE FORMAT OP  COPY A,OP(X) COPY =1,A ONE SECTOR COPY A,WC(X) JST MKIOB SET UP IOB JST DOIO DO FORMAT JST STATUS CHECK STATUS JST RETRY RETRY ON ERROR TC71 JST RYINIT REINITIALIZE WORD TC72 WORD TC73 TC72 COPY =FRMT,A SET FORMAT OP COPY A,OP(X) COPY =3,A 3 SECTORS COPY A,WC(X) JST MKIOB JST DOIO DO OVERRUN FOR MAT COPY CST(X),A GET STATUS XOR =:8500,A IS IT FORMAT ERROR? JEQ A,TC72A YES COPY =32,A NO, ERROR JST ERROR NO FORMAT ERROR ON * * OVERRUN LENGTH * TC72A JST RETRY RETRY ON ERROR TC73 EQU $ COPY SECS,A COPY  A,TCSECS COPY UCUR,A STORE UNIT NO COPY A,TCIOB1+US COPY A,TCIOB2+US COPY A,TCIOB3+US COPY A,TCIOB4+US TESTC1 COPY =-2,A COUNT 2 TRACKS COPY A,TEMP1 COPY =TCIOB1,X INDEX IOB COPY CCUR,A COPY A,CS(X)  OR =:3000,A OUTPUT A RUN INDICATOR SELP A,4 COPY HCUR,A GET CURRENT HEAD COPY A,HS(X) COPY TCSECS,A GET SECTORS/TRACK SHIFT A,LO,1 DOUBLE IT COPY A,WC(X) TO FORMAT 2 TRACKS COPY TCSECS,A GET SECTORS/TRACK SHIFT A,LO,2 TIMES 4 ADD TCSECS,A TIMES 5--EACH SECTOR BLOCK COPY A,TEMP3 REQUIRES FIVE WORDS TSTC1X COPY CCUR,A BUILD  COPY A,FMCS FORMAT BUFFER COPY A,FMCN COPY HCUR,A COPY A,FMHS COPY A,FMHN JST INCRH BUMP HEAD/CYL JMP TSTC2X CONTINUE JMP *TEST:C EXIT TEST * LPOOL TITL TSTC2X COPY CCUR,A COPY A,FMCL COPY HCUR,A COPY A,FMHL COPY TEMP1,X SET UP BUF PTR NEG X,X COPY =BUF,A BUF FOR FIRST TRACK ADD TEMP3,A BUF+TEMP3 FOR SECOND TRACK CLSN =2,X SUB TEMP3,A FIRST TRACK COPY A,X JST FMBLDC BUILD FORMAT BUFFER * * ALTERNATE ENTRY POINT * IMS TEMP1 BUMP 2-TRACK COUNTER JMP TSTC1X DO SECOND TRACK COPY =TCIOB1,X INDEX IOB JST RYINIT RESET RETRIES WORD TESTC7 TESTC7 DATA GOES HERE WORD TESTC8 TESTC8 DATA GOES HERE TESTC7 EQU $ JST DOIO DO FORMAT 2 TRACKS JST STATUS CHECK STATUS JST RETRY RETRIES TESTC8 EQU $ COPY FMCS,A GET TRACK 2 PTRS COPY  A,TCIOB2+CS COPY FMHS,A FOR VERIFY COPY A,TCIOB2+HS COPY =-4,A JST MOVE WORD TCIOB1+US WORD  TCIOB3+US AND TO SINGLE SECTOR RD IOB COPY =-4,A JST MOVE AND TO VERIFY IOB WORD TCIOB1+US WORD TCIOB4+US COPY =SAVBUF,A BUILD COMPARE BUFFER COPY A,TEMP2 FOR RD REGARDLESS COPY TCSECS,A SUB =1,A NEG A,A COPY A,TEMP1 NEG NUMBER OF WORD CHAIN IOBS COPY =TCLINK-1,X GET WORD CHAIN IOB TABLE ADD-1 JMP TESTC3 * LPOOL TITL TESTC3 COPY =7,A 5 HEADER WORDS+1 CRC WORD+1 WORD WORD COPY A,1(X) TO WORD COUNT ADD TEMP2,A ADD SAVEBUF ADDR COPY A,TEMP2 COPY A,2(X) ADDR WHERE THE 7 WORDS/SECTOR FOUND COPY =0,A COPY A,3(X) NEXT WORD IS RESERVED COPY X,A ADD =5,A BUMP TCLINK PTR COPY A,4(X) TO GET NEXT DC IOB ADDRESS ADD =4,X NOW REALLY BUMP TCLINK PTR IMS TEMP1 DONE YET JMP TESTC3 NO COPY =0,A YES LAST IOB PTR OUT COPY A,0(X) COPY =TCIOB2,X JST RYINIT RESET RETRIES WORD TC3A WORD TC3B TC3A EQU $ COPY =-1,A SPREAD :FFFF COPY A,SAVBUF INTO BUFFER COPY =-519,A 519 WORDS JST MOVE WORD SAVBUF WORD SAVBUF+1 JST DOIO READ TRACK HEADERS JST STATUS CK STATUS COPY TCSECS,A COMPARE 7 WORDSIN EACH SECTOR NEG A,A COPY A,TEMP1 COPY =BUF,A ADD TEMP3,A COPY A,X COMPARE SECOND TRACK BUFFER JST TESTC4 GO COMPARE INPUT JST RETRY RETRY ON  ERROR TC3B EQU $ COPY =TCIOB3,X INDEX IOB COPY TCWDS,A GET WDS/SECTOR ADD =8,A MAKE IT A FULL SECTOR COPY A,WC(X) TO IOB WORD COUNT JST RYINIT RESET RETRIES WORD TC3C WORD TC3D TC3C EQU $ JST DOIO READ ONE SECTOR JST STATUS CK STATUS COPY =-1,A COPY A,TEMP1 COPY =BUF,X INDEX FIRST TRACK BUF JST TESTC4 COMPARE INPUT COPY =SAVBUF+7,A NOW COMPARE WORD COPY A,MISCAD EACH WORD WORD COPY =TSTCEPAT,A GET TEST C PATTERN  COPY A,EXP COPY TCWDS,A NEG A,A JST COMPAR COMPARE THEM JMP TESTC5 ERROR COPY =SAVBUF+6,A COPY A,X ADD TCWDS,A WORD CRC CHAR ADDRESS ADD =1,A COPY A,TCTEMP STORE IT COPY TCWDS,A NOW CALCULATE CRC ADD =1,A JST CRC AND COMPARE CALCULATED CRC COPY TCTEMP,Y WITH INPUT CRC XOR 0(Y),A JEQ A,TESTC6 COMPARE CRC TO INPUT CRC TESTC5 EQU $ COPY =31,A NO, PRINT IT JST ERROR MISCOMPARE ON WORD JST ERSET JMP TESTC6 COPY CAR,A  SEE IF ERRORS WANTED SHIFT A,RO,2 JT OV,TESTC6 NO COPY =SAVBUF,X YES PREPARE FOR BUF DUMP COPY TCWDS,A  ADD =8,A GET FULL SECTOR NEG A,A JST DUMP DUMP IT TESTC6 JST RETRY RETRY ON ERROR TC3D EQU $ COPY =TCIOB4,X INDEX VERIFY IOB COPY TCSECS,A NEG A,A COPY A,TCTEMP NEG NUMBER OF SECTORS/TRACK COPY =0,A TC3G ADD TCWDS,A SECTORS/TRACK IMS TCTEMP TIMES WDS/SECTOR JMP TC3G GIVES WDS/TRACK SHIFT A,LO,1 DOUBLE IT FOR 2 TRACKS  COPY A,WC(X) TO IOB WORD COUNT JST RYINIT RESET RETRIES WORD TC3E WORD TC3F TC3E EQU $ JST DOIO VERIFY 2 TRACKS JST STATUS CK STATUS JST RETRY RETRY TC3F JMP TESTC1 DO NEXT TRACK * LPOOL TITL TEST C SUBROUTINES (TESTC4) ****************************** * * TESTC4 - COMPARE INPUT BUFFER * * THIS SUBROUTINE IS USED BY TEST C *  TO COMPARE BUFFERS FOR A MISMATCH IN * DATA. * * CALLING SEQUENCE: * COPY =BUFFER ADDRESS,X *  JST TESTC4 * * CALLS: CALLED BY: * CRC TESTC * ERROR * ERSET *  DUMP * ****************************** * TESTC4 ENT COMPARE INPUT BUFFER COPY X,TCTEMP SAVE BUF PTR COPY =SAVBUF,X INDEX INPUT TSTC4B COPY 1(X),A GET SECTOR NUMBER SHIFT A,RO,8 TO USE AS INDEX COPY A,TEMP3 SHIFT A,LO,2 INTO COMPARISON BUFFER ADD TEMP3,A ADD TCTEMP,A ADD IN BUF PTR COPY A,TEMP2 COPY =-5,A COMPARE 5 WORDS COPY A,TEMP3 TSTC4A COPY 0(X),A COMPARE A WORD COPY TEMP2,Y XOR 0(Y),A JNE A,TSTC4C MISCOMPARE ADD =1,X BUMP PTRS IMS TEMP2 IMS TEMP3 AND COUNT JMP TSTC4A COMPARENEXT WORD SUB =6,X NOW CALCULATE CRC COPY =1,A COPY A,0(X) COPY =6,A JST CRC XOR 6(X),A COMPARE IT TO INPUT CRC JNE A,TSTC4C MISCOMPARE COPY =8,A CHECK THAT FIRST DATA WORD IS COOL XOR 7(X),A JNE A,TSTC4C MISCOMPARE ADD =8,X TO NEXT HEADER IMS TEMP1 CHECK WORDS IN NEXT SECTOR JMP TSTC4B TSTC4D EQU $ JMP *TESTC4 EXIT TSTC4C EQU $ COPY =30,A NO, PRINT IT JST ERROR WORD MISCOMPARE JST ERSET JMP TSTC4D COPY CAR,A SEE IF ERRORS WANTED SHIFT A,RO,2 JT OV,TSTC4D NO CO PY ADRIOB,X COPY WC(X),A CLSN =7,A JMP TSTC4E JMP TSTC4G TSTC4E COPY TCSECS,X SUB =1,X NEG X,X  COPY X,TEMP4 COPY ADRIOB,X TSTC4F ADD WC(X),A NO. WDS TO DUMP IN A IMS TEMP4 JMP TSTC4F TSTC4G NEG A,A COPY =SAVBUF,X YES, DUMP BUFFER JST DUMP JMP TSTC4D * LPOOL TITL TEST C TABLES AND IOBS * TCWDS WORD 0 WDS/SECTOR TCSECS WORD 0 SECTORS/TRACK * TCIOB1 WORD FRMT TWO TRACK FORMAT IOB RES 5,0 WORD BUF,INTLOC RES 4,0 * TCIOB2 WORD RDRG SECOND TRACK RES 4,0 READ REGARDLESS IOB WORD 7,SAVBUF FOR 7 WDS/SECTOR WORD INTLOC,TCLINK RES 3,0 * TCIOB3 WORD RDRG FIRST TRACK RES 5,0 READ REGARDLESS IOB FOR WORD SAVBUF 1-FULL SECTOR WORD INTLOC RES 4,0 * TCIOB4 WORD RDVER READ VERIFY IOB FOR RES 6,0 2 TRACKS WORD INTLOC RES 4,0 * TCLINK RES 220,0 WORD CHAIN IOB TABLE * TCIOB5 RES 5,0 OVERRUN IOB WORD 1,TCBUF,INTLOC RES 4,0 * TCBUF WORD 0,0,0,:100,4094 WORD 0,:100,0,:200,4094 WORD 0,:200,0,0,4094 TITL TEST D - SHORT WORD TRANSFER TEST ****************************** * * TEST D - SHORT WORD TRANSFER TEST * * TEST D PERFORMS WRITE/READ/VERIFY OPERATIONS IN * SEQUENTIAL SECTOR ORDER, USING THE WORST * CASE PATTERN AS DATA ON THE FIRST AND LAST * 10 CYLINDERS ONLY. THE LENGTH OF EACH I/O * IS ONE SECTOR FOR THE OUTSIDE CYLINDERS AND * TWO SECTORS FOR THE INSIDE CYLINDERS. * * THE TWO-SECTOR I/O IS PERFORMED WITH THESE * DATA-CHAINED WORD COUNTS: * * CIOB (WDS * 2) * .75 (MORE THAN 1 SECTOR) * DCIOB (WDS * 2) * .25 (LESS THAN 1 SECTOR) * * CALLS: CALLED BY: *  TSTITL TEST CONTROL (TEST EXECUTION) * PREP * TESTD1 * INCR * ****************************** * TMP:D1 RES 1,0 TEMPORARY CELL TMP:D2 RES 1,0 TEMPORARY CELL * TESTD EQU $ COPY ='D',A PRINT TITLE JST TSTITL COPY SHORTC,A GET SHORT TEST CYLS. JEQ A,TESTDA IF NONE, JUMP COPY ECYL,A GET ENDING CYL. NUMBER COPY A,TMP:D1 STORE VALUE  COPY SCYL,A GET STARTING CYL. NUMBER COPY A,TMP:D2 SAVE NUMBER ADD SHORTC,A ADD IN SHORT TEST CYL. OFFSET SUB =1,A DECREMENT ONCE COPY A,ECYL STORE NEW ENDING CYL. NUMBER JST PREP SET UP DISK TEST:D1 JST TESTD1 DO TEST JST INCR INCREMENT CYLINDER NUMBER JMP TEST:D1 IF NOT DONE, DO MORE COPY TMP:D1,A GET OLD ENDING CYL. NUMBER COPY A,ECYL RESTORE VALUE SUB SHORTC,A GENERATE NEW STARTING CYL. NUMBER ADD =1,A INCREMENT ONCE COPY A,SCYL STORE NEW STARTING CYL. NUMBER COPY A,CCUR SET STARTING CYLINDER TEST:D2 JST TESTD1 DO TEST JST INCR INCREMENT CYLINDER NUMBER JMP TEST:D2 IF NOT DONE, DO MORE COPY TMP:D2,A GET STARTING CYL. NUMBER COPY A,SCYL RESTORE NUMBER JMP TSTEND EXIT TEST * TESTDA JST PREP SET UP DISK JST TESTD1 TEST ONE SECTOR JST INCR BUMP DMA ADDR JMP $+2 NOT DONE YET JMP TSTEND DONE, EXIT COPY =10,A SEE IF TESTING CYL 10 CSK A,CCUR JMP TESTDA+1 NO JMP TESTDA+1 NO COPY =-9,A YES, DO LAST 10 NOW ADD ECYL,A COPY A,CCUR JMP TESTDA+1 CONTINUE TITL TEST I - SAME AS TEST D,EXCEPT ALL CYLS ****************************** * * TEST I - LONG WORD TRANSFER TE ST * * TEST I IS THE SAME AS TEST D, EXCEPT * ALL REQUESTED CYLINDERS ARE TESTED. * * CALLS: CALLED BY: * TSTITL TEST CONTROL (TEST EXECUTION) * PREP * TESTD1 * INCR * ******************************* * TESTI EQU $ COPY ='I',A PRINT TEST TITLE JST TSTITL TESTI1 JST PREP INITIALIZE STUFF  JST TESTD1 CALL SECTOR TEST ROUTINE JST INCR BUMP DMA ADDR JMP $-2 CONTINUE JMP TSTEND EXIT * LPOOL TITL  TEST D1 - SINGLE SECTOR TEST ROUTINE ****************************** * * TEST D1 - SINGLE SECTOR TEST ROUTINE. * * COMMON TO BOTH TEST D AND TEST I. * * CALLS: CALLED BY: * NXTHDR TESTD * TESTD4  TESTI * FILCON * RYINIT * TD4C * COMPAR * ERROR * ERSET * DUMP * RETRY * MKIOB * DOIO * STATUS * ******************************* * TESTD1 ENT COPY TCUR,A OUTPUT TEST NO TO LIGHTS SHIFT A,LO,8 SHIFT A,LO,4 OR CCUR,A ALSO CURRENT CYL NO SELP A,4 COPY WDS,A  SHIFT A,LO,1 DOUBLE WORD COUNT COPY A,TEMP1 SHIFT A,LO,1 DOUBLE THIS QUABTITY ADD WDS,A TIMES 3 SHIFT A,RO,2 DIVIDE BY 4 COPY A,WC1 CIOB WORD COUNT COPY TEMP1,A DIFFERENCE BETWEEN DOUBLE WC SUB WC1,A AND CIOB WC  COPY A,WC2 IS DCIOB WORD COUNT JST NXTHDR CALCULATE NEXT DMAADDR COPY CNEXT,A IF NEGATIVE, JGE A,$+2 JMP *TESTD1 THEN WERE DONE COPY ECYL,A CALCULATE WHETHER ITS SUB SCYL,A INSIDE OR OUTSIDE CYL COPY A,TEMP1 COPY CCUR,A SHIFT A,LO,1 MULT BY TWO SUB TEMP1,A DETERMINE WHICH SIDE JGE A,TESTD7 OF THE DISK WE'RE ON COPY WDS,A OUTSIDE. 1 SECTOR COPY A,TDIOB1+WC COPY A,TDIOBS+WC COPY =0,A COPY A,TDIOB1+NB AND NO WORD CHAIN JMP TESTD8 CONTINUE TESTD7 COPY WC1,A INSIDE. 2 SECTORS COPY A,TDIOB1+WC COPY WDS,A SHIFT A,LO,1 DOUBLE WORD COUNT COPY A,TDIOBS+WC TO SAVE 2 SECTORS COPY WC2,A COPY A,TDIOB2 DCIOB WD CNT COPY =TDIOB2,A WORD CHAINING COPY A,TDIOB1+NB COPY =TDIOB2,X COPY =BUF,A ADD WC1,A GET MEM ADDR COPY A,1(X) FOR DCIOB TESTD8 COPY NONDES,A SAVE USER AREA? JEQ A,TESTD3 NO COPY =TDIOBS,X YES, SAVE IT COPY =RDDAT,A READ IT IN JST TESTD4 PERFORM THE I/O TESTD3 COPY WCPAT,A SPREAD PATTERN FOR WRITE JST FILCON COPY =TDIOB1,X INDEX WRITE IOB COPY =WRTDAT,A JST TESTD4 DO THE WRITE COPY =RDVER,A JST TESTD4 DO THE VERIFY COPY =0,A CLEAR THE BUFFER FOR READ JST FILCON COPY =RDDAT,A COPY A,OP(X) STORE OPCODE JST RYINIT RESET RETRIES WORD  TD3A WORD TD3B TD3A JST TD4C COPY =BUF,A DO WORD COMPARE NOW COPY A,MISCAD SET COMPARE ADDR COPY WCPAT,A AND EXPECTED DAT COPY A,EXP COPY TDIOBS+WC,A GET LENGTH NEG A,A JST COMPAR JMP TESTD5 MISCOMPARE JMP TESTD6 CONTINUE TESTD5 EQU $ COPY =40,A PRINT MISCOMP ERROR JST ERROR JST ERSET JMP TESTD6 COPY  =BUF,X DO BUFFER DUMP IF WANTED COPY TDIOBS+WC,A NEG A,A SET LENGTH JST DUMP TESTD6 JST RETRY RETRY ON ERROR  TD3B COPY NONDES,A SEE IF SAVING JEQ A,TSTD6A NO COPY =TDIOBS,X YES, RESTORE IT TO DISK COPY =WRTDAT,A  JST TESTD4 DO THE WRITE TSTD6A JMP *TESTD1 EXIT * LPOOL TITL TEST D1 SUBROUTINES (TESTD4) ****************************** * * TESTD4 - RETRY I/O * * THIS SUBROUTINE WILL RESET RETRY * ADDRESSES AND RETRY THE I/O OPERATION. * * CALLING SEQUENCE: * COPY =OP CODE,A * JST TESTD4 * * CALLS: CALLED BY: * RYINIT  TESTD1 * TD4C * RETRY * ****************************** * TESTD4 ENT COPY A,OP(X) STORE OPCODE  JST RYINIT RESET RETRIES WORD TD4A WORD TD4B TD4A JST TD4C DO I/O JST RETRY RETRY ON ERROR TD4B JMP *TESTD4 EXIT TITL TEST D1 SUBROUTINES (TD4C) ****************************** * * TD4C - DO TEST D1 I/O * * THIS SUBROUTINE IS USED TO * DO TEST D1 I/O OPERATIONS. * * CALLING SEQUENCE: * JST TD4C * * CALLS: CALLED BY: * MKIOB TESTD4 * DOIO TESTD1 * STATUS * ERROR * ****************************** * TD4C ENT I/O ROUTINE JST MKIOB BUILD IOB JST DOIO DO THE I/O JST STATUS CHECK STATUS  COPY CCUR,A SEE IF IOB DMA ADDR XOR CS(X),A HAS CHANGED JNE A,TSTD4D YES, ERROR COPY HCUR,A XOR HS(X),A  JNE A,TSTD4D COPY SCUR,A XOR SSS(X),A JEQ A,TSTD4C OK TSTD4D EQU $ COPY =41,A JST ERROR DMA ADDR CHANGED TSTD4C JMP *TD4C EXIT * LPOOL TITL TEST D1 IOBS * TDIOB1 RES 5,0 TEST D I/B WORD 0 WORD COUNT WORD BUF WORD INTLOC WORD TDIOB2 CHAINED TO TDIOB2 RES 3,0 * TDIOB2 WORD 0 WORD CHAIN IOB WORD 0 WORD 0,0 * TDIOBS RES 5,0 USER SAVE IOB WORD 0 WD COUNT WORD SAVBUF INTO SAVBUF WORD INTLOC RES 4,0 * WC1 WORD 0 FIRST WD COUNT WC2 WORD 0 SECOND WD COUNT TITL TEST E - RANDOM I-O TEST ****************************** * * TEST E - RANDOM I/O TEST * * THE RANDOM NUMBER GENERATOR IS USED TO * DETERMINE THE CYLINDER, HEAD, SECTOR *  AND DATA LENGTH TO BE USED IN THE * TEST. THE DATA WRITTEN IS AN INCREMENTING * PATTERN WITH THE FIRST WORD EQUAL TO THE * CYLINDER NUMBER. USING THIS PATTERN AND * DMA ADDRESS, WRITE AND READ/VERIFY FUNCTIONS * ARE PERFORMED. THEN A READ IS PERFORMED FOR * THE RANDOM DATA LENGTH. A SECOND READ IS * PERFORMED FOR A FULL SECTOR TO VERIFY UNUSED * SECTOR (FILLED WITH :6DB6). THIS READ * CONSISTS OF A TEN WORD SKIP FUNCTION CHAINED * TO A DATA-CHAIN IOB CONTAINING THE REMAINDER * WORD COUNT. EACH I/O FUNCTION IS ISSUED USING * THE 'RETURN NEXT DMA ADDRESS' FEATURE, WHICH * IS VERIFIED. * * THIS IS DONE FOR ALL REQUESTED CYLINDERS. * * CALLS: CALLED BY: * TSTITL TEST CONTROL (TEST EXECUTION) * PREP * MASK * RANDOM * TESTE4 * FILINC * TESTEC * FILCON * RYINIT * TE4C * COMPAR * RETRY * ERROR * ERSET * DUMP * MKIOB * DOIO * STATUS *   NXTHDR * ***************************** * TESTE EQU $ COPY ='E',A PRINT TEST E TITLE JST TSTITL COPY SCYL,A CALCULATE PASSES SUB ECYL,A THROUGH THIS SUB =1,A COPY SHORTC,X GET SHORT TEST CYLS. JEQ X,$+2 IF NO, JUMP NEG X,A NEGATE COPY A,TEMP1 JST PREP SET DISK, DMA ADDR COPY =1,A PRESET RANDOM COPY A,SEED NO.GENERATOR TESTE1 COPY TEMP1,A SET RUN INDICATOR NEG A,A OR =:5000,A SELP A,4 COPY CYLS,A JST MASK GET CYLINDER MASK  COPY X,TEMP2 TESTEF JST RANDOM GET CYL NO AND TEMP2,A MASK OFF UNWANTED BITS CSK A,CYLS JMP CHECK1 MAKE RANGE CHECK SUB CYLS,A DECREASE SUB =1,A SIZE CHECK1 CSK A,ECYL WITHIN RANGE? CSK A,SCYL JMP TESTEF NO, TRY AGAIN  NOP COPY A,CCUR STORE CURRENTCYL COPY HDS,A JST MASK GET HEAD MASK COPY X,TEMP2 TESTE2 JST RANDOM GET HEAD NO AND TEMP2,A MASK OFF UNWANTED BITS CSK A,HDS JMP CHECK2 MAKE RANGE CHECK SUB HDS,A DECREASE SUB =1,A SIZE CHECK2 CSK A,EHD WITHIN RANGE? CSK A,SHD JMP TESTE2 NO NOP COPY A,HCUR YES, SAVE IT COPY SECS,A JST MASK GET SECTOR MASK COPY X,TEMP2 TESTE3 JST RANDOM GET SECTOR NO AND TEMP2,A MASK OFF UNWANTED BITS CSK A,SECS JMP CHECK3 MAKE RANGE CHECK SUB SECS,A DECREASE SUB =1,A SIZE CHECK3 CSK A,ESEC WITHIN RANGE CSK A,SSEC JMP TESTE3 NO NOP COPY A,SCUR OK COPY NONDES,A SAVE USER STUFF? JEQ A,TESTE5 NO COPY =TEIOBS,X YES, READ IT IN COPY WDS,A COPY A,WC(X) COPY =RDDAT;UPDATE,A JST TESTE4 TESTE5 COPY X,TEMP5 COPY =BUF,A COPY A,TTBUF ADD =2,A COPY A,TTBUF+1 COPY =1,X COPY CCUR,A THE FIRST WORD WORD OF A SECTOR COPY A,TEMP2 IS THE CYLINDER NUMBER JST FILINC SPREAD THE PATTERN COPY TEMP5,X COPY WDS,A JST MASK GET WORD MASK COPY X,TCTEMP TESTE7 JST RANDOM GET WORD LENGTH AND TCTEMP,A MASK OFF UNWANTED BITS JEQ A,TESTE7 CAUTION: DON'T USE 0 WORD CT CSK A,WDS WITHIN RANGE? JMP TESTE8 YES JMP TESTE7 NO TESTE8 COPY =TEIOB1,X INDEX IOB COPY A,TEMP3 SAVE WORD LENGTH COPY A,WC(X) COPY =WRTDAT;UPDATE,A JST TESTE4 DO WRITE OP COPY =RDVER;UPDATE,A  JST TESTE4 DO VERIFY OP JST TESTEC DO READ OP, PARTIAL SEC COPY =TEIOB3,X INDEX 4-WORD WORD CHAIN COPY WDS,A  SUB =10,A COPY A,TEMP4 COPY A,0(X) STORE WORD COUNT (WORD 0) COPY =TEIOB2,X INDEX CHAINED IOB JST TESTEC NOW ODO FULL SECTOR READ COPY NONDES,A SAVE USER STUFF? JEQ A,TESTE6 NO COPY =TEIOBS,X YES COPY =WRTDAT;UPDATE,A JST TESTE4 WRITE IT BACK OUT TESTE6 IMS TEMP1 BUMP COUNTER JMP TESTE1 JMP TSTEND EXIT * LPOOL TITL TEST E SUBROUTINES (TESTEC) ****************************** * * TESTEC - READ/DATA COMPARE * * THIS SUBROUTINE IS USED BY TEST E * TO DO A READ OPERATION THEN * COMPARE THE DATA FOR A MISMATCH. * * CALLING SEQUENCE: *  COPY =IOB ADDRESS,X * JST TESTEC * * CALLS: CALLED BY: * FILCON TESTE *  RYINIT * TE4C * COMPAR * RETRY * DUMP * ****************************** * TESTEC ENT READ/ WORD COMP ROUTINE COPY =0,A CLEAR BUF JST FILCON COPY =RDDAT;UPDATE,A COPY A,OP(X) STORE OPCODE JST RYINIT RESET RETRIOES WORD TE4E WORD TE4F TE4E JST TE4C DO READ COPY WC(X),A IF SKIP BIT NOT ON, JGE A,TE4G ITS PARTIAL READ COPY =BUF,A ELSE ITS A FULL READ COPY A,MISCAD FOR WHICH THE FIRST TEN COPY =0,A WORDS ARE ZERO COPY A,EXP COPY =-10,A COMPARE FIRST TEN WORDS JST COMPAR FOR ZERO JMP TESTEE MISCOMPARE COPY =10,A IS RANDOM LENGTH 10 SUB TEMP3,A OR LESS? JLT A,TE4J NO COPY TEMP4,X YES,NEXT TEMP4 WORDS SHOULD BE NEG X,X JMP TE4H 4294 TE4J COPY =10,A COMPARE RANDOM PATTERN ADD TEMP2,A PLUS 10 COPY A,EXP COPY TEMP3,A FOR A LENGTH OF SUB =10,A TEMP3-10 JST COMPAR JMP TESTEE MISCOMPARE COPY TEMP4,A NOW COMPARE THE NEXT NEG A,A ADD TEMP3,A TEMP4-(TEMP3-10) WORDS SUB =10,A FOR 4294 JEQ A,TESTED COPY A,X JMP TE4H TE4G COPY =BUF,A PARTIAL READ COMPARE. COPY A,MISCAD COMPARE FIRST TEMP3 WDS COPY TEMP2,A OF TEMP2 PATTERN COPY A,EXP COPY TEMP3,A JST COMPAR JMP TESTEE MISCOMPARE COPY =0,A NOW COMPARE REMAINEDER COPY  A,EXP SHOULD BE ZERO. COPY WDS,A NEG A,A ADD TEMP3,A JEQ A,TESTED JMP TE4M TE4H COPY =TSTCEPAT,A SET EXP PATTERN COPY A,EXP COPY X,A SET LENGTH COPY ADRIOB,X RESTORE IOB ADDR TE4M EQU $ JST COMPAR  JMP TESTEE MISCOMPARE TESTED JST RETRY RETRY ON ERROR TE4F JMP *TESTEC EXIT TESTEE EQU $ COPY =50,A WORD MISCOMPARE  JST ERROR JST ERSET JMP TESTED COPY =BUF,X COPY WDS,A DO BUFF DUMP NEG A,A JST DUMP JMP TESTED * LPOOL TITL TEST E SUBROUTINES (TESTE4) ****************************** * * TESTE4 - RETRY I/O * * THIS SUBROUTINE IS USED BY TEST E * TO RETRY AN I/O OPERATION. * * CALLING SEQUENCE: * COPY =OP CODE,A * JST TESTE4 * * CALLS: CALLED BY: * RYINIT TESTE * TE4C * RETRY * ****************************** * TESTE4 ENT COPY A,OP(X) STORE OPCODE JST RYINIT RESET RETRIES WORD TE4A WORD TE4B TE4A JST TE4C DO I/O JST RETRY RETRY ON ERROR TE4B JMP *TESTE4 EXIT TITL TEST E SUBROUTINES (TE4C) ****************************** * * TE4C - DO I/O * * THIS SUBROUTINE IS USED BY TEST E * TO DO THE I/O OPERATION. * * CALLING SEQUENCE: * COPY =IOB ADDRESS,X * JST TE4C * * CALLS: CALLED BY: * MKIOB TESTE * DOIO TESTEC * STATUS TESTE4 * NXTHDR * ERROR * ****************************** * TE4C ENT JST MKIOB BUILD IOB JST DOIO DO I/O JST STATUS CK STATUS JST NXTHDR SEE WHAT NEXT DMA ADDR COPY CNEXT,A SHOULD BE, THEN COMPARE XOR CS(X),A IT TO THE IOB JNE A,TSTE4A MISCOMPARE COPY =:FF,A AND HNEXT,A NOW DO THE HEAD NO XOR HS(X),A JNE A,TSTE4A MISCOMPARE COPY =:FF,A NOW DO SECTOR NO XOR SSS(X),A AND SNEXT,A JEQ A,TSTE4B OK TSTE4A COPY =51,A IOB NOT UPDATED JST ERROR CORRECTLY TSTE4B JMP  *TE4C EXIT * LPOOL TITL TEST E IOBS * TEIOB1 RES 6,0 TEST E IOB WORD BUF WORD INTLOC RES 4,0 * TEIOBS RES 6,0 TEST E SAVE IOB WORD SAVBUF WORD INTLOC RES 4,0 * TEIOB2 RES 5,0 CHAINED READ IOB WORD :800A SKIP TEN WORDS WORD BUF WORD INTLOC WORD TEIOB3 RES 3,0 * TEIOB3 WORD 0 WORD CHAIN IOB WORD BUF+10 WORD 0,0 TITL TEST F - INITALIZE TESTING/ ****************************** * * TEST F - INITIALIZE TEST * *  THIS TEST VERIFIES THAT AN INITIALIZE (SELP R,DA;4) * FUNCTION, ISSUED BEFORE A PREVIOUS OPERATION * HAS TERMINATED, WILL ABORT THE OPER- * ATION AND RESET THE I/O INTERRUPT. * * THIS IS DONE AS FOLLOW: * *  THIS IS DONE BY ISSUING A READ REGARDLESS * FUNCTION TO THE INSIDE CYLINDER. AN * INITIALIZE IS ISSUED BEFORE THE READ HAS * COMPLETED. THEN A TIMEOUT IS ENTERED TO * ALLOW SUFFICIENT TIME TO TERMINATE. AN *  ERROR IS REPORTED IF AN I/O INTERRUPT * SUBSEQUENTLY OCCURS, OR IF THE INPUT BUFFER * IS ALTERED. * * CALLS: CALLED BY: * TSTITL TEST CONTROL (TEST EXECUTION) * PREP * RYINIT *  MKIOB * FILCON * TIMER * OTX * SEL * TIME * ERROR * ERSET * TSTB1F * RETRY * ****************************** * TESTF EQU $ TEST F - INITIALIZE TEST COPY ='F',A PRINT TEST F TITLE JST TSTITL JST PREP RESET DMA ADDR, DRIVE COPY =TFIOB,X INDEX RD REG IOB JST RYINIT RESET RETRIES WORD TF3 WORD TF6 TF3 EQU $ SBIT 8,S COPY =RDRG,A COPY A,OP(X) JST MKIOB SET UP RESTOF IOB COPY  =-1,A FILL BUF WITH FFFF JST FILCON JST TIMER RESET TIME CONSTANTS JST OTX SELECT RD REGARDLESS JST SEL  INITIALIZE JST TIME TIME OUT JMP $-1 JMP TF5 OK, NO INTERRUPT TFINT EQU $ RD REGARDLESS INT PT JST $+1  SERVICE INTERRUPT NOP COPY =60,A INTERRUPTED AFTER INIT JST ERROR TF5 EQU $ COPY CST(X),A GET STATUS  ADD =1,A SHOULD BE UNCHANGED JEQ A,TF1 (FFFF) COPY =61,A ERROR. STATUS CHANGED JST ERROR SAY SO TF1 COPY =BUF,X CHECK BUFFER. SHOULD BE COPY 0(X),A UNCHANGTED (FFFF) AND 1(X),A AND 2(X),A AND 3(X),A AND 4(X),A  ADD =1,A JEQ A,TESTF2 OK COPY =62,A ERROR. BUF ALTERED JST ERROR JST ERSET JMP TESTF2 COPY CAR,A SEE IF ERRORS WANTED SHIFT A,RO,2 JT OV,TESTF2 NO JST MSGA YES, DISPLAY ACTUAL HDR WORD ACTHDM COPY =BUF,A INDEX HDR BUFFER JST TSTB1F PRINT ITOUT TESTF2 JST RETRY RETRY ON ERROR TF6 JMP *$+1 WORD TSTEND EXIT * TFIOB RES 5,0 RD REGARDLESS IOB WORD 5 LENGTH OF HEADER WORD BUF WORD TFINT INT LOC RES 4,0 * LPOOL TITL TEST G - FORCED ERRORS TEST ****************************** * * TEST G - FORCED ERRORS TEST. * * THE FOLLOWING ERRORS ARE FORCED: * * RATE ERROR (TWO CHAINED IOBS IN A CLOSED LOOP) * NO ID COMPARE (CYL FLAG BITS ON) * ILLEGAL OPERATION (:7FFF) * END OF MEDIA (NOT RUN IF SHORT TEST REQUESTED) * * CALLS:   CALLED BY: * TSTITL TEST CONTROL (TEST EXECUTION) * PREP * RYINIT * MKIOB * DOIO * ERROR * RETRY * ****************************** * TESTG EQU $ TEST G - FORCED ERRORS COPY ='G',A PRINT TEST G TITLE JST TSTITL JST PREP RESET DISK, DMA ADDR COPY =TGIOB1,X INDEX IOB COPY =RDDAT,A READ FUNC COPY A,OP(X) COPY =1,A WORD LENGTH =1 COPY A,WC(X) COPY =TGIOB2,A CHAIN THE IOBS COPY A,NB(X) JST PREP RESET STUFF JST RYINIT RESET RETRIES WORD TG3 WORD TG4 TG3 EQU $ JST MKIOB SET UP REST OF IOB JST DOIO COPY CST(X),A GET STATUS XOR =:8402,A IS IT RATE ERROR? JEQ A,TESTG2 YES, OK COPY =72,A ERROR. NO RATE ERROR STATUS JST ERROR OCCURRED. TESTG2 EQU $ NOW DO NO ID COMPARE JST RETRY RETRY ON ERROR TG4 EQU $ COPY =0,A RESET CHAINED STUFF COPY A,NB(X) COPY =:C000,A SET FLAG BITS IN CYL NO COPY A,CS(X) JST RYINIT RESET RETRIES WORD TG5 WORD TG6 TG5 EQU $ JST DOIO DO IT COPY CST(X),A GET STATUS  XOR =:8410,A IS IT NO ID COMP? JEQ A,TESTG3 YES, OK COPY =73,A ERROR. DIDNT GET A JST ERROR NO ID COMPARE STATUS TESTG3 EQU $ NOW DO ILLEGAL OP CODE JST RETRY RETYR ON ERROR TG6 EQU $ COPY =:7FFF,A COPY A,OP(X) JST RYINIT RESET RETRIES WORD TG7 WORD TG8 TG7 EQU $ JST MKIOB JST DOIO DO IT COPY CST(X),A GET STATUS XOR =:8400,A RIGHT STATUS? JEQ A,TESTG4 YES, OK COPY =74,A ERROR. DIDNT GET JST ERROR ILLEGAL OP CODE STATUS TESTG4 EQU $ JST RETRY RETRY ON ERROR TG8 EQU $ COPY SHORT,A DON'T RUN END OF MEDIA TEST JNE A,TG10 IF SHORT TEST SPECIFIED COPY =TGIOB3,X INDEX IOB COPY =RDDAT,A READ FUNC COPY A,OP(X) COPY UCUR,A GET UNIT  COPY A,US(X) COPY CYLS,A DO LAST CYL SUB =1,A COPY A,CS(X) COPY EHD,A GET LAST HEAD COPY A,HS(X) TO IOB WORD 3 COPY SECS,A SUB =1,A LAST SECTOR COPY A,SSS(X) TO IOB WORD 4 COPY WDS,A ADD =1,A  EXCESS WORD COUNT COPY A,WC(X) TO IOB WORD 5 TG8B JST RYINIT RETRY RESET WORD TG9 WORD TG10 TG9 EQU $ JST DOIO READ PAST LAST SEC COPY CST(X),A GET STATUS XOR =:8C00,A SHD BE END OF MEDIA JEQ A,TESTG5 OK COPY =75,A NO END OF MEDIA STATUS JST ERROR TESTG5 EQU $ JST RETRY RETRY ON ERROR TG10 JMP *$+1 WORD TSTEND EXIT * LPOOL TITL TEST G IOBS * TGIOB1 EQU $ TEST G IOB RES 5,0 WORD 1 WORD LENGTH WORD BUF BUFFER AD WORD INTLOC INT LOC RES 4,0 * TGIOB2 WORD 1 CHAINED IOB FOR RATE ERR WORD BUF WORD 0 WORD TGIOB2 * TGIOB3 EQU $ WORD RDDAT,0,0,0,0,0 WORD BUF,INTLOC,0,0,0,0 TITL TEST H - RETURN NEXT ADDRESS TEST ****************************** * * TEST H - RETURN NEXT ADDRESS TEST * * THIS TEST VERIFIES THE OPERATION OF * THE 'RETURN NEXT ADDRESS' FEATURE FOR * SEEK, TIO, AND READ-REGARDLESS * FUNCTIONS. * * THESE FUNCTIONS ARE EACH EXECUTED WITHOUT * THE UPDATE BIT ON IN THE OPCODE. THEN THEY * ARE EXECUTED A SECOND TIME, THIS TIME WITH  * THE UPDATE BIT ON. IN EVERY CASE, IT IS * EXPECTED THAT THE ADDRESS IN THE IOB WILL * REMAIN UNCHANGED. * * PART 2 OF THEST H IS THE HIGH MEMORY TEST. * THE HIGHEST READ/WRITE LOCATION IS FOUND. *  AN INCREMENTING PATTERN IS WRITTEN FOR 1 * SECTOR, THEN READ INTO THE ORIGINAL OUTPUT * BUFFER TO MAKE SURE THAT WHAT WAS READ EQUALS * WHAT WAS WRITTEN. THIS IS PERFORMED UNDER * THREE CONDITIONS: * * 1) IOB AT END-OF-MEMORY, DATA BUFFER IN LOW MEMORY, * 2) IOB IN LOW MEMORY, DATA BUFFER AT END-OF-MEMORY, * 3) IOB AND DATA BUFFER AT END-OF-MEMORY. * * PART 3 OF TEST H IS THE INTERRUPT LEVELS TEST. A TIO * OPERATION IS PERFORMED WITH AN INTERRUPT ADDRESS IN * IOB WORD 7. FOUR I/O'S ARE PERFORMED WITH BITS 12 AND * 13 OF THE PSW SET AS FOLLOWS: * * PASS PSW BIT 13 PSW BIT 12 ACTION * ---- ---------- ---------- ------ * 1 OFF ON SUPPRESS INT. TIME OUT * 2 ON  ON SUPPRESS INT. TINE OUT * 3 OFF OFF SHOULD REACH INT. ADDR. * 4  ON OFF SHOULD REACH INT. ADDR. * * CALLS: CALLED BY: * TSTITL TEST CONTROL (TEST EXECUTION) * PREP * MKIOB * RYINIT * DOIO * STATUS * ERROR * RETRY * TSTHR3 * TSTHR1 * TSTHR2 * TSTHR4 * DUMP * SEL * TIMER * TIME *  OTX * ****************************** * TESTH EQU $ COPY ='H',A OUTPUT TEST TITLE JST TSTITL COPY =:8001,A OUTPUT RUN INDICATOR SELP A,4 JST PREP RESET DISK, ADDRESSES COPY =THIOB2,X INDEX IOB COPY X,ADRIOB JST MKIOB SET UP ADDRESS COPY =THIOB1,X NOW SET UP ADDRESS FOR COPY X,ADRIOB JST MKIOB REAL IOB. COPY =-6,A (THIOB1 IS ACTUAL IOB, COPY A,TEMP1 THIOB2 IS COMPARATOR IOB. TESTH1 COPY TEMP1,A FIND OPCODE IN TABLE ADD =THTBL+6,A COPY A,TEMP2 COPY TEMP2,Y COPY 0(Y),A COPY A,OP(X) STORE OPCODE JST RYINIT RESET RETRIES WORD TH1 WORD TH2 TH1 EQU $ JST DOIO DO OPERATION JST STATUS CHECK STATUS COPY THIOB2+CS,A COMPARE CYL NO XOR THIOB1+CS,A JNE A,TESTH2 MISCOMPARE COPY THIOB2+HS,A COMPARE HEADNO XOR THIOB1+HS,A JNE A,TESTH2 MISCOMPARE COPY THIOB2+SSS,A XOR THIOB1+SSS,A COMPARE SECTOR NO JEQ A,TESTH3 OK TESTH2 COPY =80,A MISCOMPARE JST ERROR TESTH3 EQU $ JST RETRY RETRY ON ERROIR TH2 EQU $ IMS TEMP1 DO NEXT OPCODE JMP TESTH1 JMP TESTH4 THIS PART OF TEST FINISHED * * HIGH MEMORY TEST *FIND END OF MEMORY--- STORE IN EOMPTR * TESTH4 EQU $ COPY =TESTH5:,A COPY A,UNMET+3  SBIT 6,S ALLOW 64K ADDRESSING COPY =:8002,A OUTPUT RUN INDICATOR SELP A,4 COPY FLBTOP,X MAX MEMORY +1K-1 JMP $+2 TESTH5: ENT TESTH5 SUB FLBDEC,X SUBTRACT MEMORY INCREMENT COPY =:55,A GET PATTERN EXCH 0(X),A WRITE IT OUT EXCH 0(X),A AND READ IT BACK IN SUB =:55,A IS IT THE SAME? JNE A,TESTH5 NO--KEEP TRYING EXCH 0(X) ,A IF SO, TRY THE SAME THING EXCH 0(X),A WITH A ZERO JNE A,TESTH5 KEEP TRYING IF NOT ZERO * * EOM FOUND *  COPY X,EOMPTR PTR TO LAST READ/WRITE CELL COPY =UNMET:,A COPY A,UNMET+3 SBIT 8,S * *IOB IN HIGH MEMORY--WORD BUFFER IN LOW MEMORY * TESTH6 COPY =0,A COPY A,TEMP1 ERROR INCREMENT COPY EOMPTR,A SUB =11,A ALLOW 12 HIGH MEM WORDS COPY A,EOMIOB IOB IN HIGH MEMORY JST PREP RESET DISK ADDRESSES COPY =BUF,X BUFFER ADDRESS JST TSTHR1 SET UP OUTPUT BUFFER COPY EOMIOB,X COPY =BUF,A GET BUFF ADDR COPY A,MA(X) STORE IT IN IOB COPY EOMIOB,X  JST TSTHR3 BUILD PART OF IOB JST RYINIT RESET RETRIES WORD TEST6H WORD TESTH7 TEST6H COPY EOMIOB,X JST MKIOB BUILD REST OF IOB FOR WRITE JST DOIO DO I/O JST STATUS GET STATUS JST RETRY RETRY IF ERROR TESTH7 COPY EOMIOB,X COPY =RDDAT,A READ WORD BACK INTO BUFF COPY A,OP(X) JST RYINIT RESET RETRIES WORD TEST77 WORD  TESTHA TEST77 COPY EOMIOB,X JST MKIOB SET UP I/O FOR READ JST DOIO DO I/O JST STATUS GET STATUS COPY =BUF,X JST TSTHR2 SEE IF WE READ WHAT WE WROTE JST TSTHR4 NO--OUTPUT ERROR MESSAGE JST RETRY RETRY ON ERROR JMP TESTHA * LPOOL TITL * *IOB IN LOW MEMORY--WORD BUFFER IN HIGH MEMORY * TESTHA COPY =1,A COPY A,TEMP1 ERROR INCREMENT COPY EOMPTR,A SUB WDS,A ADD =1,A COPY A,EOMBUF WORD BUFF IN HIGH MEMORY COPY EOMBUF,X GET WORD BUF ADDRESS JST TSTHR1 SET UP OUTPUT BUFFER COPY =THIOB3,X COPY EOMBUF,A COPY A,MA(X) PUT BUFFER ADDR IN IOB JST TSTHR3 BUILD PART OF IOB JST RYINIT RESET RETRIES WORD TESTHB WORD TESTHC TESTHB JST MKIOB SET UP REST OF IOB FOR WRITE JST DOIO DO I/O JST STATUS GET STATUS JST RETRY RETRY ON ERROR TESTHC COPY =THIOB3,X COPY =RDDAT,A READ WORD BACK INTO BUFFER COPY A,OP(X) JST RYINIT RESET RETRIES WORD TESTHD WORD TESTHF TESTHD JST MKIOB SET UPIOB FOR READ JST DOIO DO I/O JST STATUS GET STATUS COPY EOMBUF,X GET BUFF ADDRESS JST TSTHR2 SEE IF WE READ WHAT WE WROTE JST TSTHR4 NO--OUTPUT ERROR MESSAGE JST RETRY RETRY ON ERROR JMP TESTHF * *BOTH IOB AND BUFF IN HIGH MEMORY * TESTHF COPY =2,A COPY A,TEMP1 ERROR INCREMENT COPY EOMPTR,A SUB WDS,A ADD =1,A COPY A,EOMBUF WORD BUFF IN HIGH MEMORY SUB =12,A COPY A,EOMIOB IOB IN HIGH MEMORY COPY EOMBUF,X  JST TSTHR1 SET UP OUTPUT BUFFER COPY EOMIOB,X COPY EOMBUF,A GET BUFF ADDR COPY A,MA(X) STORE IT IN IOB  JST TSTHR3 BUILD PART OF IOB JST RYINIT RESET RETRIES WORD TESTHG WORD TESTHH TESTHG COPY EOMIOB,X JST MKIOB BUILD REST OF IOB FOR WRITE JST DOIO DO I/O JST STATUS GET STATUS JST RETRY RETRY ON ERROR TESTHH COPY EOMIOB,X COPY =RDDAT,A READ WORD BACK INTO BUFFER COPY A,OP(X) JST RYINIT RESET RETRIES WORD TESTHI WORD TESTHJ TESTHI JST MKIOB SET UP I/O FOR READ JST DOIO DO I/O JST STATUS GET STATUS COPY EOMBUF,X GET BUFF ADDR JST TSTHR2 SEE IF WE READ IN WHAT WE WROTE JST TSTHR4 NO--OUTPUT ERROR MESSAGE JST RETRY RETRY IF ERROR TESTHJ R BIT 6,S END 64K TEST JMP TESTHK THIS PART OF TEST FINISHED * LPOOL TITL TEST H - SUBROUTINES (TSTHR1) ****************************** * * TSTHR1 - SET UP OUTPUT BUFFER * * THIS SUBROUTINE WILL SET UP THE * OUTPUT BUFFER CONTAINING THE * INCREMENTING PATTERN, * * ENTER WITH XR = BUFFER ADDRESS. * * CALLING SEQUENCE: * COPY =BUFFER ADDRESS,X * JST TSTHR1 * * CALLS: CALLED BY: * NONE TESTH * ****************************** * TSTHR1 ENT COPY X,TCTEMP SAVE X COPY WDS,A NEG A,A COPY A,TEMP2 NEG WD COUNT COPY =0,A H6 COPY A,0(X) ADD =1,X BUMP BUFFER INDEX ADD =1,A BUMP PATTERN IMS TEMP2 BUMP WD COUNT  JMP H6 COPY TCTEMP,X RESTORE X JMP *TSTHR1 TITL TEST H - SUBROUTINES (TSTHR2) ****************************** * * TSTHR2 - EXAMINE INPUT BUFFER * * THIS SUBROUTINE WILL EXAMINE * THE INPUT BUFFER AFTER A * READ OPERATION. * * ENTER WITH XR = BUFFER ADDRESS. * RETURN TO CALL+1 IF MISCOMPARE * OTHERWISE CALL+2. * * CALLIN SEQUENCE: * COPY =BUFFER ADDRESS,X * JST TSTHR2 * JMP ? MISCOMPARE R *  JMP ? GOOD R+1 * * CALLS: CALLED BY: * NONE TESTH * ****************************** * TSTHR2 ENT COPY X,TCTEMP SAVE X COPY WDS,A NEG A,A COPY A,TEMP2 NEG WD COUNT COPY =0,A COPY A,TEMP3 H7 COPY 0(X),A CSK A,TEMP3 JMP H8 MISCOMPARE JMP H8 MISCOMPARE IMS TEMP3 BUMP PATTERN ADD =1,X BUMP BUFFER INDEX IMS TEMP2 BUMP WD COUNT JMP H7 IMS TSTHR2 MADE IT! H8 COPY TCTEMP,X RESTORE X JMP *TSTHR2 TITL TEST H - SUBROUTINES (TSTHR3) ****************************** * * TSTHR3 - BUILD IOB * *  THIS SUBROUTINES BUILDS WORDS 0, 5, 7, * AND 8 OF THE IOB FOR A WRITE OPERATION. * * ENTER WITH XR = IOB ADDRESS * * CALLING SEQUENCE: * COPY =IOB ADDRESS,X * JST TSTHR3 * * CALLS: CALLED BY: *  NONE TESTH * ****************************** * TSTHR3 ENT COPY =WRTDAT,A COPY A,OP(X) WRITE WORD OP CODE COPY WDS,A COPY A,WC(X) WRITE 1 SECTOR COPY =0,A COPY A,IN(X) NO INTERRUPTS COPY A,NB(X) NO WORD CHAINING JMP *TSTHR3 TITL TEST H - SUBROUTINES (TSTHR4) ****************************** * * TSTHR4 - OUTPUT ERROR MESSAGE * * THIS SUBROUTINE WILL OUTPUT AN * ERROR MESSAGE 'TEMP1+81'. IT WILL * DUMP THE BUFFER. * * CALLING SEQUENCE: * JST TSTHR4 * * CALLS: CALLED BY: * DUMP TESTH * ****************************** * TSTHR4 ENT COPY =81,A DIDN'T READ IN WHAT WE WROTE OUT ADD TEMP1,A JST ERROR  COPY ADRIOB,X COPY MA(X),A GET BUFF ADDR COPY A,X TO X COPY WDS,A NEG A,A NEG WD COUNT TO A  JST DUMP DUMP BUFFER H9 JMP *TSTHR4 * LPOOL TITL TEST H - INTERRUPT LEVELS TEST ****************************** * * TEST H - INTERRUPT LEVELS TEST * * THIS IS THE SECOND PART OF TEST H * ****************************** * *BIT 12 OF PSW ON . THIS SHOULD SUPPRESS INTERRUPTS + CAUSE TIME OUT * TESTHK COPY =:8003,A SET RUN INDICATOR SELP A,4 COPY =-2,A TWO-PASS COUNTER COPY A,TEMP1 RBIT 8,S JST SEL RESET THE DISK COPY =:1000,A PASS 1: PSW BIT 12 ON; BIT 13 OFF TSTHK COPY A,BITMSK COPY =THIOB4,X JST RYINIT SET UP RETRIES WORD TESTHL WORD TESTHM TESTHL COPY S,A UPDATE PSW OR BITMSK,A COPY A,S UIS SBIT 8,S ENABLE INTERRUPTS JST TIMER RESET TIME COPY =THIOB4,X JST OTX INITIATE THE I/O JST TIME TIME THE I/O JMP $-1 3-SECOND DELAY RBIT 8,S TIMER EXPIRED. GOOD JST SEL RESET THE DISK JMP TESTHM PERFORM NEXT PASS THINT1 EQU $ OOPS! GOT AN INTERRUPT JST $+1 SERVICE IT NOP COPY =85,A GOT AN INTERRUPT WHEN PSW BIT 12 ON JST ERROR JST RETRY RETRY THE I/O TESTHM IMS TEMP1 BUMP PASS COUNTER JMP TESTHN DO PASS 2 JMP TESTHO GO TO PASS 3 TESTHN COPY =:3000,A PASS 2: PSW BIT 12 ON; BIT 13 ON JMP TSTHK * *BIT 12 OF PSW OFF. THIS SHOULD ALLOW INTERRUPTS. * TESTHO EQU $ COPY =-2,A TWO-PASS COUNTER  COPY A,TEMP1 RBIT 8,S JST SEL RESET THE DISK COPY =:EFFF,A PASS 3: PSW BIT 12 OFF;BIT 13 ON TESTHP COPY//AS LO=TV //MACRO UF.WINDIAG(ERR) //LINK UF.OS::.SYS=UF.WINDIAG(AB=0)+SF.DEBUGS(AB=2500) 810929153139810929153139810929153139JG:0 O0SEGMENTBLANK oKDEBUG4 im MACRO (F400) @m WINDIAG - REV.m B0it&159O;?CGKg ̿ 0 @E  ۇӿ1AοϞ tsrqLJ̧̿ ʃƣ-c ؿX1xR v Y Nq1 Ὶ ῖ  1   EWkCI0 lm m fdnd31N` s[n$l k7oOAG KEA[F V@ 31Nߟ  sonlk 7o &1Bߎ  |kWC  trq1n rp F D Ti ]nYV ? JH 1LC-tAo mld7i4a19  )T D ʿ! 1l x  e  ߊgX/ 1Ekj  vȇȃoؿ 1Pi * , ecb7_ߪ  Y ,jJ D  GE Y9A?WC s %n lk1V hsf ocjhg ] 1^  N DD#C1P*A ? +mߐ;ge d`7u26k  LJy  -1Pm * , ecb57  _ߧ  Y ,jN K D"  DBVE j ' k߿1 i1M *i gf7c S  WC  sq=@1Iߑl qonf7k. 8k( F T v OH1IoJm kjD7tc `C #/Q  1T r o  ߒekb 7m4j *Yt1 rp Y Nk+ o^ 3C  d 1Lߖ Ylʞom ld7qރ;W k {xo+1Mu  tJomlB 7pebp  YY_ 11vUT Y No Hq  [@=)_6) n1j2h Y Nc  n0zX  σ9ك ߊn aa_ )_6)SÔN! ①@Gk߈x F TjrD{ ߧD񃢿O ߤLg96m6  鿗B ߑ3EW 0 'qpo@)6q  ;+ٛ6h3g db- \ XT  ^KH? A  ƿ4o 84W Btt   g ڃ ע׃ A  (ϻ v߾s  1A J ߪ >s   @3Īkz  I+U B獞k @=U⒞zj pS HkEp opj Ͽ_f ̈́ǃ`ăY   ŃWWW U~BB EW76 0  ++C !߇7  claWR '{  i΀㔀@ lW  Vghmkj  EBB  60տ3ԃy տբՃ˄qфЄ q΄˞Ʉ  ćB@@<+ x 3 . @ֿ . x 64j R{Wb4 pgheۀq ouWo  @ ߙߙxs UU: T6NR㐀@MȂ D Z(lmh# o     @  @@@ `@ P@  ` @ 0  P@0  CA¾s r l g { ٣ ʧʿף׀ַo фο T \   ǿ _ k   B    2 Wj b elEF8   4Rp 0GH  ed_ !`,^  WGVP ¿NNNS R   ; =oEkIJ  ut  +$s ٿ  bԿ_V  ؿ ǃ  1 Fʂ  㡘@L 6E,   ߋ} > AjhqR{ # fmc  YW  r f! y _㮘@+ ߪߨx*  P  +Gb^ FF{E68 * !߉ }4glkamo    DWxw  }n } f yx t I} b8{ q1 tԃ̏҇ ҃AlbbÃaF ȇ Ǟ C ǃ    > Q ( C  &j RWi h  o  f cY{#  ^ | ~]x  ƃÃB )Lpbeg4o  E 1A! ؿֻ ػ֞w>ۿاʿ Ȼ֞ ӻӞw1п ɗ˞ ȻȞw$ Eă  )= z   C ߢ" kolm8S P,H  nh j{   I |Ѐ[S  LãK ! CD A> V 845 . .G D  2zu  WR{fcYma# r px    B 3^m4ho o  y F&   F~ < B = K >6D{o  8WoWd Grr  ˄j 4<B H`  CJB IR OWB J Eڢ   ls B K){4R po oo HJ GӃҊՇЀ@= ȿ<ʃڛƃٛÃ؛ B P1߻gчe Ϟ U  ć   & jkW>?p 4}8a    AB5o \_ ¢ ݿY59WWNN  O?GMMDӿA  ;>  :7 6X]033**+  +cj)) g @ y +  {s l  ߝ+ߜxpn  Y w Q LujRhlk a#u 00 ~  U]Z dT𢥿0 0 ~ V ?:e C W0,{o  oo  )_6)L    ߠ| ƒen0WE GFHMo8a4 IJLh1 gkqH `qCߜw◞QσQM كONN:BU >><  ޕvt )މp‚u(ih  ۶℀ qׄڂնڄqф ֙+ފf* ĶDŽqW ~S Sۀ     yd¿fed" o 9oa pp` , .9o3 8k  _)^g߆hZ baE   ǿ{Ň  k êÈ ,  ,  O,  ,  *, ᅬ Y N , .E&2 W)<h  k_f  a [ [ ,  , ,, ,+,-,.B >, :, 6 1, -,,"! +$#({*'%us ,j1A  h1  ) ) )   ˂  Ԃop E238490 0 잂 +n* 㞂 ܗ B܂  + - .ق ƿ4oq !%%% E.俬M ~Qp 6qH gvBz`  '{kjۀ ,'   ,,{, y^ 6Ă‚)6Ă O    |{ #yx _vu ^sr ,po n# ㏀@ Ȃߊ߆ރtnm f`c   6 ޯy +ޯr6ޣ {+ޠs6  ޒy+ޓr 6 ރy@  z  { ̂ Ǟ  [U  a'R"  qoQ k~e Ÿn`i fYbX{ ]  T6S ނ򆖃 T ލ ދaމrn   6{{W  @0 1 kqP`qCߊw i烟jcop0@g [NS F ܀P CHgޣ܃D6iB ]̓; F:8 B͞4 1, F+ ÿ&Ń F ȃ175= ;  Ӏ ܀ 倀   W paki lw ) 3ee f퀃``aYY ZTTUOQ MKLHFGC ( 2=Ͽ978 ˿423 ǿ/D- ) ) 3# X# - 3 F HފhO6  0@㑜@ gbefc`aR  ߌ{z opy oE v +ރzr   Jޑ ņpi ?g  wxu     J jh1 gefm wa_d . 96" .n { rߒ jgf ~c hgeb P}  "P} Tz T }|{ P}|{ )D  .{x YT Pqap } {zxޅޅނzq  }.{%'  +xq (#   ޓ kތ c^  (  0 6 ފw ޅq )ße  $ )/@+=@ ߌߌsd'd  y   .ދ|   : ރrgk " I6=I6"l  6߿{ ] %'#  S+xN X". 1@ 8F  wg eb 'T'UuT 5  ȂȔ QޢŠ ȴ ޘ ޖޔ H߁ |   a {}X{zV x TTTs z  | a Z Y6Y 6YҀC.  | N΀ˣH ɞ         1â뿐迍 ;  ~5 5R ޅ}ބ{zy  {zz q1E ȂȿtW /  0u  ?t  ?p   ?j ? f ?b ?^ ? Z  0Y 8Janx  #(   &  * 5  & Dm    & Dm        WINCHESTE R DIAGNOSTIC/FORMATTER  96120-B0 ANY BAD TR ACKS FROM MANUFACTURER ( Y/[N])? ENTER CYLIN DER NUMBER (DECIMAL)  ENTER HEAD NUMBER (DE CIMAL) *** EXCESSIVE  BAD TRACKS (MAX=30) EC HO BAD TRACKS LIST FROM  MANUFACTURER (Y/[N])?  SA1002 - 0  SA1004 - 1 Q2010 - 2 Q202 0 - 3 Q2030 - 4  Q2040 - 5 SELECT DRIVE (0)? DIAG, FMATTER OR TECH TEST (D,F,T)? DE V AD (:0A)?: TSTS (A- H)? CYLS? WRITE PRE  COMP CYL? SHORT TEST-C YLS? HDS? SECTORS/ TRACKS (16)? WORDS/SE CTOR (256)? PATN (:6DB 6)?: UNITS (0-3)?  SAVE DATA (Y OR N)? RU N OPTIONS (:00)?:  UNIT TO FORMAT (0-3)? ENTE R: FC,U,C,H,S,IN,LN,DP, OP,CL,CP (TEST I/O) (FORMAT) (WRITE) (RE AD) (RD REG) (VERIFY) (SEEK) ER (FORMAT TER) ER AD :PASS UN IT TEST IOB ADDRESS  : STATUS : DR IVE STATUS : FUNC :  CYL HEAD SECT BUF  :LEN :WDS XFRD : WD IN ERROR :EXP :ACT : INT LOC : SECTOR ADD RESS AFTER I/O WOR D CHAIN IOB :WD COUNT : BUF AD : UNIMPLEME NTED INSTRUCTION TRAP  UNINSTALLED MEMORY TR AP POWER FAIL  CHAR./NUM. EXCEPTION  STACK OVERFLOW U SER TRAP SYSTEM TR AP ARITHMETIC TRAP ERROR TOTALS UN IT SOFT FIRM  HARD ALL ACT HEAD ER: EXP HEADER:  ACT CRC: EXP CRC:  BAD TRACK: CYL  HEAD BUFFER DUMP,  AT : END OF TEST  PASS **** BAD TRACK S LIST FROM MANUFACTURER : END OF BAD TRACKS L IST FROM MANUFACTURER.  LINE PRINTER TIMED O UT!!! GET PRINTER READ Y KEY IN ANY CHAR TO R ESUME... FORMATTING ... DISK FORMATTED.  LINE PRINTER OPTION (Y/[N])? :: ERROR TOTALS UN IT SOFT FIRM  HARD ALL ACT HEAD ER: EXP HEADER:  ACT CRC: EXP CRC:  BAD TRACK: CYL  HEAD BUFFER DUMP,  AT : END OF TEST  PASS **** BAD TRACK$ IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII% IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII& IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIe;810929153139810929153139830209094620e@810929153139810929153139830209094618e:' 810929153139810929153139810929153139e810929153139810929153139810929153139810929153139810929153139810929153139e>8302080957317583020809590675830209094401eZ8302090938285083020909382925830209094601e9 8302011332152583020411434150830209094501( ) * + , - . / 0 ?. WINDIAG ASMWINDIAG JCLWINDIAG OBJ A,BITMSK COPY =THIOB5,X JST RYINIT SET UP RETRIES WORD TESTHQ WORD TESTHR TESTHQ COPY S,A UPDATE PSW AND BITMSK,A COPY A,S UIS SBIT 8,S ENABLE INTERRUPTS JST TIMER RESET TIME COPY =THIOB5,X 1  JST OTX INITIATE THE I/O JST TIME TIME THE I/O JMP $-1 3-SECOND DELAY RBIT 8,S TIMED OUT. ERROR JST SEL RESET THE DISK COPY =86,A NO INTERRUPT WHEN PSW BIT 12 OFF JST ERROR JST RETRY THINT2 EQU $ GOOD. INTERRUPT OCCURRED JST $+1 SERVICE IT NOP TESTHR IMS TEMP1 JMP TESTHS DO PASS 4 JMP TSTEND EXIT TESTHS COPY =:CFFF,A PASS 4: PSW BIT 12 OFF; BIT 13 OFF JMP TESTHP * LPOOL TITL TEST H IOBS * THIOB1 RES 5,0 WORD 6,BUF,INTLOC RES 4,0 * THIOB2 RES 12,0 * THIOB3 RES 12,0 * THIOB4 RES 6,0 TIO IOB WORD BUF FOR PSW BIT 12 ON WORD THINT1 RES 4,0 * THIOB5 RES 6,0 TIO IOB WORD BUF FOR PSW BIT 12 OFF WORD THINT2 RES 4,0 * THTBL WORD SEEK WORD TIO WORD RDRG WORD SEEK;UPDATE WORD TIO;UPDATE WORD RDRG;UPDATE * EOMPTR WORD 0 POINTER TO END OF MEMORY EOMIOB WORD 0 POINTER TO EOM IOB EOMBUF WORD 0 POINTER TO EOM WORD BUFFER FLBTOP WORD MEMINC-1 START SEARCHING FOR EOM HERE FLBDEC WORD MEMINC BITMSK WORD 0 PSW MASK TITL FORMATTER ****************************** * * FORMATTER - THIS IS THE FORMATTING ROUTINE * * IT FORMATS THE ENTIRE DISK (OR PART * OF A DISK) IN STANDARD CAI FORMAT. * * EACH SECTOR IS SEQUENTIALLY LINKED TO THE * NEXT SECTOR AND WHEN ALL HEADS ARE EXHAUSTED, * LINKAGE CONTINUES WITH THE NEXT CYLINDER. THE * LAST SECTOR OF THE LAST SPECIFIED TRACK IS * FLAGGED 'END OF MEDIA' (SECTOR BLOCK WORDS 2 * AND 3 = :FFFF). * * BAD TRACKS HAVE :F000 OR'ED INTO THE UPPER * FOUR BITS OF WORDS 0 AND 2 OF EACH SECTOR * BLOCK. SEQUENTIAL LINKING WILL CONTINUE. THE * BAD CYLINDER AND HEAD ARE OUTPUT ON THE * CRT/TTY. * * CALLS: CALLED BY: * PREP TEST CONTROL (FUNCTION EXECUTION) * MKIOB * DOIO * STALT * FMBUMP * FMBLD * FMWRIT * MSGA * ODEC * ****************************** * FMATTR EQU $ COPY CAR,A GET RUN OPTION COPY =0,X SET FOR NO LP TBIT 5,A LINE PRINTER? JF OV,$+2 IF NO, JUMP COPY =1,X SET FLAG COPY X,ERLPFL STORE IT COPY ERLPFL,A GET FLAG EXCH A,LPFLAG CHANGE WITH LP FLAG COPY A,ERLPFL SAVE LP FLAG JST MSGA OUTPUT 'FORMATTING'MESSAGE WORD FORMSG MESSAGE ADDR FMTR2A JST PREP INITIALIZE COPY =TAIOB,X INDEX TEST A IOB COPY X,ADRIOB COPY =TIO,A COPY A,OP(X) COPY =0,A COPY A,IN(X) NO INTERRUPTS JST MKIOB SET UP IOB JST DOIO JST MKIOB SET UP IOB AGAIN JST DOIO DO I/O AGAIN JST STALT CHECK STATUS FMATR3 EQU $ COPY ECYL,A GET ENDING CYLINDER ADD =1,A  COPY A,FMAT3B SET UP LAST CYL+1 COPY SCYL,A GET STARTING CYLINDER COPY SHD,X GET STARTING HEAD * FMAT3A COPY A,FMCS SAVE CURRENT CYLINDER SELP A,4 COPY A,FMCN WHICH IS ALSO NEXT CYLINDER COPY X,FMHS SAVE CURRENT HEAD COPY X,FMHN WHICH IS ALSO NEXT HEAD JST FMBUMP BUMP TO FIND LAST CYL/HD FMAT3B WORD $-$ CYL LIMIT COPY A,FMCL STORE NEW LAST CYL COPY X,FMHL STORE NEW LAST HEAD COPY =-5,A FIVE RETRIES ALLOWED COPY A,FMRET BEFORE 2 BAD TRACK FLAGGED COPY =0,A COPY A,FMFLAG FLAG=0=NORMAL FMAT COPY =BUF,X INDEX BUFFER JST FMBLD BUILD TRACK HDR FMATB3 JST FMWRIT FORMAT A TRACK JMP FMAT3L GOOD WRITE. CONTINUE IMS FMRET BAD FORMAT. BUMP RETRY COUNT JMP FMATB3 AND TRY AGAIN JMP FMATNG BAD TRACK--FLAG IT FMAT3L COPY FMCL,A SEE IF LAST CYL REACHED ADD =1,A IS FMCL=:FFFF? JNE A,$+2 NO JMP FMAT3Z YES--RESTART PROGRAM COPY FMCL,A UPDATE FMCL AND FMHL COPY FMHL,X JMP FMAT3A CONTINUE WITH NEXT TRACK * LPOOL FMATNG EQU $ BAD TRACK FOUND COPY FMCS,A GET CURRENT CYL NUMBER SHIFT A,LO,4 ISOLATE CYL NUMBER COPY A,FTEMP SAVE IT COPY FMHS,A GET CURRENT HEAD NUMBER AND =:000F,A ISOLATE HEAD NUMBER OR FTEMP,A FORM CYL/HD PAIR COPY A,FTEMP SAVE PAIR COPY Y,CELLY SAVE YR COPY =BADBUF2,Y GET BUFFER ADDR COPY Y,BUFPTR INIT POINTER DOAGAIN COPY *BUFPTR,Y GET MFR'S BAD TRACK ADD =1,Y END OF BUFFER? JEQ Y,FMATNG1 YES EXIT COPY *BUFPTR,Y NO, RESTORE BAD TRACK XOR A,Y BAD TRACK MATCH? JEQ Y,SFR YES, SUPPRESS FORMAT REPORT IMS BUFPTR NO, BUMP POINTER NOP NOP JMP DOAGAIN REPEAT IT SFR COPY CELLY,Y RESTORE YR JMP FMATNG2 CONTINUE FMATNG1 JST MSGA SAY SO WORD BADTRK COPY FMCS,A PRINT CYL NO JST ODEC JST MSGA WORD BADTK1 AND HEAD NO COPY FMHS,A JST ODEC COPY =:F000,A SET BAD TRK FLAG COPY A,FMFLAG COPY =BUF,X INDEX BUFFER JST FMBLD BUILD BAD TRACK HEADER JST FMWRIT WRITE BAD TRACK HEADER NOP IGNORE STATUS--WE KNOW ITS BAD FMATNG2 JMP FMAT3L CONTINUE * FMAT3Z JST MSGA OUTPUT 'FORMATTED' MESSAGE WORD FORDMSG MESSAGE ADDR COPY ERLPFL,A GET LP FLAG EXCH A,LPFLAG CHANGE WITH ERROR FLAG COPY A,ERLPFL RESTORE BOTH FLAGS JMP ENT1A RESTORT PROGRAM * FTEMP WORD 0 TEMP CELL CELLY WORD 0 SAVE YR CELL * LPOOL TITL FORMATTER - SUBROUTINES (FMBUMP) ****************************** * * FMBUMP - INCREMENT PARAMETERS * * THIS SUBROUTINE WILL INCREMENT * THE CURRENT CYLINDER, HEAD TO * NEXT VALUE. * * ENTER WITH * AR = CURRENT CYLINDER * XR = CURRENT HEAD * EXIT WITH * AR = CURRENT CYLINDER, OR IF HEADS OVERFLOW, * NEXT HIGHEST CYLINDER * XR = HEXT HIGHEST HEAD, IF CYLINDER IS INCREMENTED. * OTHERWISE, THE INITIAL HEAD NUMBER. * * IF CYLINDER NUMBER REACHES LAST LEGAL CYLINDER, THEN * AR AND XR ARE RETURNED WITH :FFFF. * * CALLING SEQUENCE: * COPY =CURRENT CYLINDER,A * COPY =CURRENT HEAD,X * JST FMBUMP * WORD (LAST LEGAL CYLINDER NUMBER) * * CALLS:  CALLED BY: * NONE FMATTR * ****************************** * FMBUMP ENT COPY A,FMBMPC SAVE CURRENT CYL COPY X,FMBMPH SAVE CURRENT HEAD IMS FMBMPH BUMP HEAD FIRST COPY FMBMPH,A CSK A,EHD HAS HEAD OVERFLOWED? JMP FMBMP0 NO JMP FMBMP2 YES IT HAS FMBMP0 COPY FMBMPH,X RESTORE X WITH NEW HEAD FMBMP1 IMS FMBUMP BUMP PAST DELIMITER COPY FMBMPC,A JMP *FMBUMP AND RETURN WITH BUMPED HEAD FMBMP2 COPY SHD,X RESTORE STARTING HEAD COPY X,FMBMPH IMS FMBMPC NOW BUMP CYL COPY *FMBUMP,A COMPARE IT TO DELIMITER SUB FMBMPC,A JLE A,FMBMP3 ALLC3 YLINDERS USED UP COPY FMBMPC,A NOT AT END YET JMP FMBMP1 RETURN WITH BUMPED CYL FMBMP3 COPY =-1,A FLAG END OF MEDIA COPY =-1,X IMS FMBUMP JMP *FMBUMP * FMBMPC WORD 0 CYL SAVE CELL FMBMPH WORD 0 HEAD SAVE CELL * LPOOL TITL FORMATTER - SUBROUTINES (FMBLD) ****************************** * * FMBLD - BUILDS THE HEADERS * * THIS SUBROUTINE BUILDS THE HEADERS * NEEDED TO FORMAT ONE TRACK. IT * REQUIRES THE FOLLOWING UPON ENTRY: * * XR = HEADER ADDRESS * FMCS = HEADER WORD 0 (CURRENT CYLINDER) * FMHS = HEADER WORD 1 (CURRENT HEAD) * FMCN = HEADER WORD 2 (NEXT CYLINDER) * FMHN = HEADER WORD 3 (NEXT HEAD) * WDS = HEADER WORD 4 (NUMBER OF WORDS PER SECTOR) * FMCL = * FMHL = NEXT CYLINDER AND HEAD, TO BE USED AS * WORDS 2 AND 3 OF LAST SECTOR OF THE * HEADER. * FMFLAG = SETTING OF FLAG BITS FOR CYLINDER NUMBER. * :F000 = BAD TRACK * :0000 = NORMAL TRACK * * CALLING SEQUENCE: * COPY =HEADER ADDRESS,X * JST FMBLD * * CALLS: CALLED BY: * NONE TESTC * FMATTR * ****************************** * FMBLD ENT COPY SECS,A HEADERS=NO OF SECT/TRACK FMBLD0 NEG A,A COPY A,FMBLDA COPY SSEC,A  COPY A,FMS STARTING SECTOR FMBLD1 COPY FMCS,A GET CURRENT CYL OR FMFLAG,A OR IN FLAG COPY A,0(X) TO SECTOR BLOCK WORD 0 COPY FMS,A GET SECTOR NUMBER SHIFT A,LO,8 MOVE TO MS BYTE OR FMHS,A OR IN CURRENT HEAD COPY A,1(X) TO SECTOR BLOCK WORD 1 IMS FMS BUMP SECTOR NO. COPY FMCN,A GET NEXT CYLINDER OR FMFLAG,A OR IN FLAG  COPY A,2(X) TO SECTOR BLOCK WORD 2 COPY FMS,A GET NEXT SECTOR SHIFT A,LO,8 MOVE TO MS BYTE OR FMHN,A OR IN CURRENT HEAD COPY A,3(X) TO SECTOR BLOCK WORD 3 FMBLD2 COPY WDS,A GET WDS PER SECTOR * * WRITE PRE COMPENSATION * COPY 0(X),Q GET CURRENT CYLINDER NUMBER AND =:FFF,Q MASK OFF FLAGS CSK Q,PCMP COMPARE THE TWO VALUES JMP $+3 CURRENT CYL. IS LESS THEN WRITE PRE. COMP. CYL. NOP CURRENT CYL. IS => WRITE PRE. COMP. CYL. OR =:8000,A SET WRITE PRE. COMP. BIT IN DATA WORD * COPY A,4(X) TO SECTOR BLOCK WORD 4 ADD =5,X MOVE BUF PTR TO NEXT SECTOR BLOCK IMS FMBLDA INC SECTOR COUNT JMP FMBLD1 DO NEXT HEADER SUB =5,X OTHERWISE,THIS IS LAST HEADER COPY FMCL,A SO USE FMCL/FMHL STUFF OR FMFLAG,A COPY A,2(X) COPY SSEC,A ALSO GET STARTING SECTOR SHIFT A,LO,8 OR FMHL,A COPY A,3(X) FMBLD3 JMP *FMBLD EXIT * FMBLDA WORD 0 SECTOR NUMBER * * FMBLDC - ALTERNATE ENTRY POINT INTO FORMATTER * SUBROUTINE 'FMBLD' USED IN TEST C. * FMBLDC ENT COPY FMBLDC,A COPY A,FMBLD COPY TCSECS,A GET SECTORS/ TRACK JMP FMBLD0 *  LPOOL TITL FORMATTER - SUBROUTINES (FMWRIT) ****************************** * * FMWRIT - BUILD IOB * * THIS SUBROUTINE BUILDS THE IOB * TO BE USED IN A FORMAT OPERATION. * THE FORMAT FUNCTION WILL FORMAT * ONE TRACK. * * CALLING SEQUENCE: * JST FMWRIT * * CALLS: CALLED BY: * DOIO FMATT4 R * STALT * ****************************** * FMWRIT ENT WRITE FORMAT ROUTINE COPY =FMTIOB,X INDEX THE IOB COPY X,ADRIOB COPY =FRMT,A SET UP FORMAT FC COPY A,OP(X) COPY UCUR,A STORE UNIT NO COPY A,US(X) COPY BUF,A STORE CYL NO COPY A,CS(X) COPY =:FF,A AND HEAD NO AND BUF+1,A COPY A,HS(X) COPY =:FF00,A AND BUF+1,A AND SECTOR NO SHIFT A,RO,8 COPY A,SSS(X) COPY SECS,A GET SECTOR BLOCK COUNT COPY A,WC(X) STORE IN IOB WORD 5 JST FMCHK SEE IF IT'S A MFR BAD TRK JMP FMWRT1 JUMP IF IT'S BAD JST DOIO ELSE DO THE I/O  COPY CST(X),A GET STATUS AND =:160,A CRC/FORMAT ERROR? JNE A,FMWRT1 YES, BAD TRACK JST STALT NO, CHECK NORMAL STATUS JMP *FMWRIT EXIT GOOD FMWRT1 IMS FMWRIT BUMP RETURN JMP *FMWRIT BAD RETURN * FMTIOB WORD FRMT FORMAT IOB  RES 5,0 WORD BUF WORD INTLOC RES 4,0 * FMCS WORD 0 CURRENT CYL FMHS WORD 0 CURRENT HEAD FMCN WORD 0 NEXT CYL FMHN WORD 0 NEXT HEAD FMCL WORD 0 LAST CYL FMHL WORD 0 LAST HEAD FMS WORD 0 SECTOR NO FMRET WORD 0 RETRY COUNTER FMFLAG WORD 0 MODE FLAG: - :F000 (BAD), :0000 (GOOD) * LPOOL TITL FORMATTER - SUBROUTINES (FMCHK) ****************************** * * FMCHK - FORMAT CHECK * * DURING THE QUERIES, THE USER MAY ENTER BAD TRACK #'S * FROM THE MANUFACTURER. THEY ARE KEPT IN A TABLE * CALLED 'BADBUF' IN THE FORM OF A CYL/HD PAIR. * * AS EACH TRACK IS ABOUT TO BE FORMATTED, IT IS COMPARED * AGAINST THE ENTRIES IN THE TABLE. IF IT'S THERE IT * IS FORMATTED AS A BAD TRACK, OTHERWISE, THE PROGRAM * CONTINUES AS NORMAL. * * CALLING SEQUENCE:  CALLED BY: * * JST FMCHK FMWRIT * BAD RETURN * GOOD RETURN * ****************************** * FMCHK ENT COPY =BADBUF,A GET ADDR OF BUFFER COPY A,BUFPTR INIT POINTER FMCHK1 COPY *BUFPTR,X GET CYL/HD PAIR CLSN X,=:FF END OF BUFFER YET? JMP FMCHK3 YES, EXIT SHIFT X,RO,4 ISOLATE BAD CYL# COPY BUF,A GET CURRENT CYL AND =:0FFF,A IGNORE FLAGS IN UPPER NIBBLE CSK X,A BAD TRK ON THIS CYL? NOP NO JMP FMCHK2 NO COPY *BUFPTR,X POSSIBLY, SO GET HEAD AND =:000F,X ISOLATE HEAD # COPY BUF+1,A GET CURRENT HEAD# AND =:001F,A JUST NEED LS 5 BITS CSK X,A BAD TRACK? NOP NO JMP FMCHK2 NO COPY =-1,A YEP, A BAD ONE COPY A,FMRET COPY =0,X DELETE BAD TRK FROM BUFFER COPY X,*BUFPTR COPY =FMTIOB,X RESTORE X JMP *FMCHK FORMAT AS BAD FMCHK2 IMS BUFPTR BUMP BUFFER POINTER JMP FMCHK1 CHECK REST OF BUFFER FMCHK3 COPY =FMTIOB,X RESTORE X-REG. COPY SECS,A RESTORE A REG BEFORE RETURN IMS FMCHK BUMP FOR GOOD RETURN JMP *FMCHK 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 * OR TIMEOUT LOOPS. AS SOON AS AN * OPERATION COMPLETES, IT IS REPEATED. * * ESCAPE IS VIA THE CONSOLE INTERRUPT WHICH * RETURNS TO THE QUERIES. * * CALLS: CALLED BY: * SEL 5  TEST CONTROL (FUNCTION EXECUTION) * SENRDY * MOVE * MSGA * GNF * IKB * OTA *  IHEX * ****************************** * TECH EQU $ TECH1 EQU $ RBIT 8,S JST SEL KILL ANY DISK INTS SBIT  8,S NEED INTERRUPTS SBIT 4,S FOR CONSOLE TOO COPY =0,A COPY A,TTFC CLEAR PARAMETER TABLE COPY =-15,A JST MOVE WORD TTFC WORD TTFC+1 COPY WDS,A GET WD COUNT SHIFT A,LO,1 DOUBLE IT COPY A,TTLT FOR MAX WORD LENGTH JST MSGA REQUEST PARAMETERS WORD TTMS JST GNF GET NEXT FIELD COPY A,TTFC SAVE FC  AND =:7F7F,A 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 QUERIES JST GNF GET UNIT NO COPY A,TTU SAVE UNIT NO JLT A,TECH1 MUST BE 0-MAX. UNITS-1 SUB =UNITS-1,A JGT A,TECH1 NO, START OVER CLSN =CR:,X DONE? JMP TECH2 YES COPY CYLS,A SUB =1,A COPY A,TCTEMP HIGHEST CYLINDER NO JST GNF NO, GET CYL NO COPY A,TTC SAVE CYL NO COPY =:FFF,A MUST BE WITHIN RANGE AND TTC,A CSK A,TCTEMP  JMP $+2 OK TOTT1 JMP TECH1 BAD.START OVER CLSN =CR:,X DONE? JMP TECH2 YES COPY HDS,A SUB =1,A COPY A,TCTEMP HIGHEST HEAD NO JST GNF NO, GET HEAD NO COPY A,TTH SAVE HEAD NO JLT A,TECH1 MUST BE WITHIN RANGE AND =:FF1F,A SUB TCTEMP,A JGT A,TECH1 ERROR. START OVER CLSN =CR:,X DONE? JMP TECH2 YES COPY  SECS,A SUB =1,A COPY A,TCTEMP HIGHEST SECTOR NO JST GNF NO, GET SECTOR NO COPY A,TTS SAVE SECTOR NO  JLT A,TOTT1 MUST BE WITHIN RANGE SUB TCTEMP,A JGT A,TOTT1 NO, SGART OVER CLSN =CR:,X DONE? JMP TECH2 YES JST IKB GET INTERRUPT REQUEST CLSN ='Y',A Y OR N JMP TECH1A CLSN ='N',A JMP TECH1A TECH1B CLSN =',',A COMMA OK JMP TECH1C CLSN =CR:,A CARRIAGE RETURN OK TOO JMP TECH2 JMP TECH1 ELSE ILLEGAL * LPOOL TITL * TECH1A SUB ='Y',A SET FLAG 0=YES 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 OR LESS JMP $+2 JMP TECH1 BAD COPY =:F,A AND IF FORMAT, AND TTFC,A CLSN =1,A JMP $+2 JMP TECH1D COPY TTLN,A THEN IT MUST BE .LE. SECS CSK A,SECS JMP TECH1D OK 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 CLSN =',',X JMP TECH2A CLSN ='+',X JMP BUFPAT CLSN ='-',X JMP BUFPAT CLSN ='.',X JMP BUFSET  JMP TECH1 BUFPAT COPY X,PATFLG JST GNF COPY A,INCCNT JMP TECH2A BUFSET COPY X,PATFLG JST GNF COPY A,TTDP1 TECH2A CLSN =CR:,X JMP TECH2 JST GNF INPUT THE OPTION COPY A,TOPT STORE IT CLSN =CR:,X JMP TECH2 YES JST GNF GET CHAINED LENGTH IF ANY COPY A,TTCL SAVE IT ADD TTLN,A THIS LENGTH JLT A,TECH1X PLUS OTHER LENGTH C6 SK A,TTLT MUST BE 1-512 OR 1-256 JMP $+2 JMP TECH1 BAD CLSN =CR:,X DONE? JMP TECH2 YES JST GNF GET CHAIN WORD PATTERN COPY A,TTCP SAVE INPUT CLSN =',',X COMMA ILLEGAL HERE JMP TECH1 JMP TECH2 * LPOOL TITL TECH2 COPY TTLN,A LENGTH MUST BE AT LEAST 1 JNE A,$+2 IMS TTLN COPY =-6,A FILL IOB WITH ADDRESS JST MOVE WORD TTFC WORD TTIOB1 COPY TTBUF,A STORE BUF AD COPY A,TTIOB1+MA COPY =TTINTL,A STORE INTERRUPT AD 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 =SAVBUF,A AND CHAINED BUF AD 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 COPY X,TTIOB1+NB CLSN =FRMT,A FORMAT? COPY X,TTIOB1+SSS YES FIRST SECTOR IS 0 CLSN =FRMT,A IF FORMAT? JMP TECH3 BUILD FORMAT BUFFER  CLSN =WRTDAT,A IF WRITE, JMP TECH4 PUT WORD IN 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 BUF WORD BUF+1 JMP TECH5 ELSEDO I/O LPOOL TECH3 COPY TTH,A BUILD FORMAT BUFFER COPY A,TEMP2 COPY TTLN,A SET COUNT OF HEADERS NEG A,A COPY A,TEMP1 COPY TTBUF,X INDEX BUFFER TECH3A COPY TTC,A PUT CYLINDER NO COPY A,0(X) IN WORD 1 COPY A,2(X) AND WORD 3 COPY TEMP2,A PUT SECTOR/HD COPY A,1(X) IN WORD 2 ADD =:100,A AND SECTOR+1 COPY A,3(X) IN WORD 4 COPY A,TEMP2 COPY WDS,A PUT SECTOR WD COUNT * * WRITE PRE COMPENSATION * COPY 0(X),Q GET CYLINDER NUMBER CSK Q,PCMP IS >= WRITE PRE COMP. CYL.? JMP $+3 NO, JUMP NOP YES, CONTINUE OR =:8000,A YES, SET WRITE PRE COMP. BIT * COPY A,4(X) IN WORD 5 ADD =5,X BUMP TO NEXT HEADER IMS TEMP1 BUMP COUNT JMP TECH3A DO NEXT HEADER SUB =5,X LAST HEADER IS SPECIAL COPY TTH,A BUMP HEAD NO ADD =1,A CSK A,HDS IF HEAD OV,DO NEXT CYL JMP TECHBB NOP JMP TECH3B TECHBB COPY A,3(X) ELSE PUT HEAD+1 IN WD 4 JMP TECH5 TO I/O TECH3B COPY =0,A SECTOR/HEAD=0 COPY A,3(X) COPY =:FFF,A BUMP CYL NO AND TTC,A ADD =1,A XOR CYLS,A LAST CYL ALREADY JEQ A,TECH3C YES IMS 2(X) ELSE BUMP CYL NO JMP TECH5 TO I/O TECH3C COPY =-1,A SET EOMFLAG COPY A,2(X) IN CYL COPY A,3(X) AND SECTOR/HD JMP TECH5 TO I/O TECH4 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 BUF WORD BUF+2 JMP TECH5 TTBFI COPY TTDP,A COPY INCCNT,X JST FILINC JMP TECH5 TTBFD COPY TTDP,A COPY INCCNT,X NEG X,X JST FILINC COPY TTCP,A PUT CHAINED WORD COPY A,SAVBUF COPY =-511,A INTO CH7 AIN BUFFER JST MOVE WORD SAVBUF WORD SAVBUF+1 JMP TECH5 TOTTT JMP TOTT TECH5 JST SEL RESET DISK SBIT 8,S I/O ROUTINE SBIT 4,S ENABLE CONSOLE FOR EXIT COPY =-3,A RESTORE CYL/HD/SECTOR JST MOVE IN CASE UPDATE BIT IS USED WORD TTC WORD TTIOB1+CS JST TIMER RESET TIME COPY =TTIOB1,X GET IOB ADDRESS COPY TTIOB1+IN,A INTERRUPTS? JST OTX DO I/O JEQ A,TECH6 NO JST TIME TIME THE I/O JMP $-1 JT SS,TOTT JMP TECH5 NO INTERRUPT TTINTL EQU $ INTERRUPT PT JST $+1 FOR INTERRUPTS NOP TECH51 COPY TTIOB1+CST,A SELP A,4 COPY TOPT,A SHIFT A,RO,1  JT OV,TTDMP1 JT SS,TOTT JMP TECH5 DO IT AGAIN TECH6 JST SENRDY WAIT UNTIL DONE JMP $+2 NOT 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 JMP TECH1 * LPOOL * * GNF - INPUTS PARAMETES FOR THE * TECH TEST TO BUILD AN * IOB FROM * GNF ENT  GET NEXT FIELD ROUTINE JST IHEX INPUT VALUE EXCH A,X CLSN =',',X COMMA? JMP *GNF YES, OK CLSN =CR:,X CARRIAGE RETURN? JMP *GNF YES, OK JMP TECH1 ILLEGAL. 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 =SAVBUF,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 WORD 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 CHAINED IOB OPCODE WORD 0,1,2,4,6,8,9 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 CL8 SN =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 'COMPAR' SUBROUTINE ****************************** * * COMPAR - DATA COMPARE ROUTINE * * THE DATA LENGTH FOR THE COMPARISON * IS IN THE A REGISTER UPON ENTRY. * IF THE A REGISTER IS NEGATIVE, THE * VALUE IN 'EXP' IS COMPARED AGAINST * EACH WORD IN THE BUFFER (POINTED TO BY * 'MISCAD'). * IF THE A REGISTER IS POSITIVE, 'EXP' IS * INCREMENTED AFTER EACH SUCCESSFUL COMPARE. * * THE FOLLOWING IS REQUIRED UPON ENTRY: *  AR = DATA LENGTH * EXP = EXPECTED VALUE * MISCAD = POINTER TO BUFFER * * CALLING SEQUENCE: *  COPY =DATA LENGTH,A * JST COMPAR * JMP ? MISCOMPARE R * JMP ? GOOD COMPARE  R+1 * * CALLS: CALLED BY: * NONE TESTC * TESTD1 *  TESTE * ****************************** * COMPAR ENT COPY A,COMPFG SAVE INCREMENTFLAG JLT A,$+2 DONT INCREMENT PATTERN NEG A,A NEGATE COUNT COPY A,COMPCT STORE COUNT CMPAR1 COPY MISCAD,Y GET A WORD COPY 0(Y),A COPY A,ACT SAVE IT FOR ERROR ROUTINE XOR EXP,A COMPARE IT JNE A,CMPAR2 MISCOMPARE COPY COMPFG,A  SEE IF INCREMENTING PATTERN JLT A,CMPAR3 NO IMS EXP YES, BUMP PATTERN NOP CMPAR3 IMS MISCAD BUMP ADDR PTR IMS COMPCT AND COUNT JMP CMPAR1 CONTINUE IMS COMPAR GOOD RETURN CMPAR2 JMP *COMPAR BAD RETURN * COMPCT WORD 0 WORD COUNT COMPFG WORD 0 INCREMENT FLAG * LPOOL TITL 'CRC' SUBROUTINE ****************************** * * CRC - GENERATES CRC CHARACTER * * THIS SUBROUTINE WILL COMPUTE THE * CRC FOR A GIVEN DATA REGION VIA THE * FOLLOWING POLYNOMIAL: * * X**16 + X**15 + X**13 + X**7 + X**4 + X**2 + X**1 + X**0 * * UPON ENTRY XR SHOULD CONTAIN THE ADDRESS OF THE * DATA REGION AND AR SHOULD CONTAIN THE DATA LENGTH * IN WORDS. * * UPON EXIT AR WILL CONTAIN THE COMPUTED CRC AND * LOCATION 'CRCC' WILL ALSO CONTAIN THE COMPUTED * CRC. * * CALLING SEQUENCE: * COPY =DATA ADDRESS,X * COPY =DATA LENGTH,A * JST CRC * * CALLS: CALLED BY: * NONE TESTB * TESTC * ******************************** * CRC ENT ENTRY/EXIT. COPY X,CRCX: SAVE 'X' REGISTER. NEG A,A - SIZE OF WORD ZONE. COPY A,CRCN BIND LENGTH COUNTER. COPY A,CRCN1 FIRST SWAP COUNT COPY A,CRCN2 SECOND SWAP COUNT COPY =0,A COPY A,CCRC INITIALIZE CRC ACCUMLATOR. * * FIRST SWAP * CRC99 COPY =-8,A COPY A,SHFTCNT COPY 0(X),A GET WORD CRC98 ROTATE A,LO,1 SHIFT MS. BIT OF A TO OV JF OV,$+3 RESET BIT 0 OF A SBIT 0,A SET LS. BIT OF A  JMP $+2 CONTINUE RBIT 0,A RESET LS. BIT OF A IMS SHFTCNT INCREMENT SHIFT COUNT JMP CRC98 LOOP FOR MORE COPY A,0(X) STORE WORD ADD =1,X INCREMENT POINTER IMS CRCN1 INCREMENT COUNT JMP CRC99 LOOP FOR MORE COPY CRCX:,X RESTORE 'X' REG. * CRC2 EQU $9  COPY =-16,A COMPUTATIONAL CONSTANT. COPY A,CRCX BIND COUNTER. COPY CCRC,A FETCH CRC ACCUMLATOR. XOR 0(X),A INITATE MODULUS COMPUTATION. CRC1 EQU $ SHIFT A,LO,1 SAMPLE JF OV,$+2 CONTINUE MODULUS COMPUTATION. XOR CRCP,A APPLY CRC POLYNOMIAL AND CONTINUE COMPUTATION. IMS CRCX BUMP COMPUTATIONAL STEP COUNT. JMP CRC1 CONTIUE COMPUTATION. COPY A,CCRC BIND FINALIZE CRC COMPUTATION. ADD =1,X BUMP INDEX TO WORD REGION. IMS CRCN TEST FOR WORD REGION EXPIRATION. JMP CRC2 CONTINUE CRC COMPUTATION FOR REMAINING WORD REG COPY CRCX:,X REFRESH 'X' REGISTER. * * SECOND SWAP * CRC100 COPY =-8,A SET SHIFT COUNT COPY A,SHFTCNT STORE SHIFT COUNT COPY 0(X),A GET WORD CRC101 ROTATE A,LO,1 ROTATE A 1 BIT JF OV,$+3 RESET BIT 0 OF A SBIT 0,A SET LS. BIT OF A JMP $+2 CONTINUE RBIT 0,A RESET LS. BIT OF A IMS SHFTCNT INCREMENT SHIFT COUNT JMP CRC101 LOOP FOR MORE COPY A,0(X) STORE WORD ADD =1,X INCREMENT POINTER IMS CRCN2 INCREMENT COUNT JMP CRC100 LOOP FOR MORE COPY CRCX:,X RESTORE 'X' REG. * * SWAP CRC CHARACTER * COPY =-8,A SET SHIFT COUNT COPY A,SHFTCNT STORE SHIFT COUNT COPY CCRC,A REFRESH 'A' REGISTER CRC102 ROTATE A,LO,1 SHIFT MS. BIT OF A TO OV JF OV,$+3 RESET BIT 0 OF A SBIT 0,A SET LS. BIT OF A JMP $+2 CONTINUE RBIT 0,A RESET LS. BIT OF A IMS SHFTCNT INCREMENT SHIFT COUNT JMP CRC102 LOOP FOR MORE *  COPY A,CCRC STORE CRC CHARACTER JMP *CRC BACK TO CALLER. * SHFTCNT RES 1 SHIFT COUNT CRCP WORD :A097 CRC POLYNOMIAL MASK CRCX RES 1 -16 UP COUNTER. CRCN RES 1 - WORD REGION LENGTH KEEPER, IN WORDS. CRCN1 RES 1 FIRST SWAP COUNT CRCN2 RES 1 SECOND SWAP COUNT CCRC RES 1 CRC ACCUMALTOR. CRCX: RES 1 'X' KEEPER. 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 'DINIT' SUBROUTINE ****************************** * * DINIT - INITIALIZE DISK * * THIS SUBROUTINE WILL RESET THE DISK, * SENSE FOR PRESENCE OF THE DISK, * SENSE FOR THE DISK READY, PERFORM * MICRODIAGNOSTIC, AND STATUS * VERIFICATION. * * CALLING SEQUENCE: * JST DINIT * * CALLS: CALLED BY: * SEL PREP *  SENHIM TESTB * SENRDY * OTA * TIMER * TIME * ERROR * ****************************** * DINIT ENT COPY =MUIOB,A INDEX IOB EXCH ADRIOB,A SAVE ADRIOB COPY A,DINIOB JST SEL INITIALIZE JST SENHIM SENSE PRESENCE JMP DINIT1 ERROR JST SENRDY SENSE READY JMP DINIT2 ERROR COPY ADRIOB,A JST OTA DO IT JST TIMER RESET TIMER DINIT0 JST TIME TIME OUT MICRODIAG JMP $+2 JMP DINIT3 TIMER EXPIRED. ERROR JST SENRDY DONE YET? JMP DINIT0 NO, KEEP TRYING COPY =:400,A YES CHECK STATUS XOR MUIOB+CST,A JNE:  A,DINIT4 BAD STATUS. ERROR COPY MUIOB+DST,A CHECK DRIVE STATUS NEG A,A SHOULD BE COMPLEMENT OF SUB =1,A XOR MUIOB+OP,A FC FIELD JNE A,DINIT4 IT ISNT. ERROR JMP DINIT6 NO ERROR DINIT1 COPY =0,A CONTROLLER NOT PRESENT JMP DINIT5 DINIT2 COPY =1,A CONTROLLER NOT IDLE JMP DINIT5 DINIT3 COPY =11,A MUDIAG TIMER EXPIRED JMP DINIT5 DINIT4 COPY =12,A STATUS ERROR DINIT5 JST ERROR PRINT ERROR DINIT6 COPY DINIOB,A RESTORE ADRIOB COPY A,ADRIOB JMP *DINIT EXIT * DINIOB WORD 0 ADRIOB HOLDER MUIOB WORD :AA55 MU-DIAG IOB RES 11,0 * LPOOL TITL 'DOIO' SUBROUTINE ****************************** * * DOIO - PERFORM I/O * * THIS SUBROUTINE WILL PERFORM * AN I/O OPERATION TO THE DISK, * WITH OR WITHOUT INTERRUPTS. * * CALLING SEQUENCE: * JST DOIO * * CALLS: CALLED BY: *  TIMER TESTA * OTX TESTB * TIME TESTC * SEL TESTD1 * ERROR TESTE * SENRDY TESTG *  TESTH * FMATTR * FMWRIT * ****************************** * DOIO ENT COPY ADRIOB,X SAVE IOB ADDR COPY =-1,A COPY A,XF(X) PRESET WDS XFRRED COPY A,CST(X) AND STATUS COPY A,DST(X) JST TIMER RESET TIME COPY IN(X),A INTERRUPTS BEING USED JEQ A,DOIO1 NO SBIT 8,S YES JST OTX SELECT DISK JST TIME TIME THE I/O JMP $-1 RBIT 8,S ERROR JST SEL RESET DISK COPY =2,A JST ERROR NO INTERRUPT JMP *DOIO EXIT INTLOC EQU $ I/O INTERRUPT LOC JST $+1 SERVICE INTERRUPT NOP JST SENRDY SEE IF IDLE JMP $+2 JMP *DOIO OK EXIT COPY =3,A NOT IDLE AFTERINTERRUPT JST ERROR JMP *DOIO DOIO1 JST OTX SELECT DISK DOIO2 JST SENRDY SENSE FOR COMPLETION JMP DOIO3 NOT DONE JMP *DOIO EXIT DOIO3 JST TIME TIME THE I/O JMP DOIO2 COPY =4,A TIME EXPIRED, DISK NOTREADY JST ERROR TO ERROR SUB  JMP *DOIO EXIT * LPOOL TITL 'DUMP' SUBROUTINE ****************************** * * DUMP - DISPLAYS I/O BUFFER * *  THIS SUBROUTINE WILL DISPLAY * THE I/O BUFFER TO THE CRT/TTY * WITH 14 WORDS PER LINE. * * ENTER WITH AR = NEGATIVE WORD LENTH TO DUMP * AND XR = BUFFER ADDRESS * * CALLING SEQUENCE: * COPY =-WORD LENGTH,A *  COPY =BUFFER ADDRESS,X * JST DUMP * * CALLS: CALLED BY: * ERSET TESTB *  DUMPND TESTC * MSGA TESTD1 * OHEX TESTE * CRLF TSTHR4 * OTTY * ****************************** * DUMP ENT BUFFER DUMP ROUTINE COPY A,DUMPLN SAVE LENGT COPY X,DUMPAD AND ADDRESS COPY MODE,A CLSN ='T',A JMP DUMP5 JST ERSET 6 JMP DUMP4  COPY CAR,A ERROR MESS AGE? (BIT 1 SET) SHIFT A,RO,2 JT OV,DUMP3 YES, SKIP IT JST DUMPND SEE IF DUMP SUPRESSED DUMP5 JST MSGA PRINT "DUMP" WORD DUMPMG COPY DUMPAD,A GET ADDRESS JST OHEX PRINT IT DUMP1 JST CRLF ; COPY =-14,A 14 WDS/LINE COPY A,DUMPCT DUMP2 COPY MODE,A CLSN ='T',A JMP $+2 JST DUMPND EXIT IF DUMP SUPRESSED COPY *DUMPAD,A GET A WORD JST OHEX PRINT IT IMS DUMPAD BUMP PTR COPY =' ',A PRINT SPACE JST OTTY IMS DUMPLN BUMP COUNT JMP $+2 DUMP3 JMP *DUMP EXIT IF DONE IMS DUMPCT BUMP WDS PERLINE COUNT JMP DUMP2 PRINT NEXT WORD JMP DUMP1 PRINT NEXT LINE DUMPND ENT SEE IF COPY CAR,A DUMP WANTED? (BIT 0 SET?) SHIFT A,RO,1 JF  OV,DUMP3 NO, EXIT DUMP4 EQU $ JMP *DUMPND YES,CONTINUE * DUMPAD WORD 0 BUF PTR DUMPLN WORD 0 TOTAL COUNT DUMPCT WORD 0 WDS PER LINE COUNT * LPOOL TITL 'ERROR' SUBROUTINE ****************************** * * ERROR - PRINTS ERROR REPORT * * THIS SUBROUTINE WILL PRINT * AN ERROR REPORT IN THE FOLLOWING * FORMAT: * * ER XXXX * ER AD :XXXX PASS XXXX UNIT XXXX TEST X * IOB ADDRESS :XXXX * STATUS :XXXX ( XXXX XXXX XXXX XXXX ) * DRIVE STATUS :XXXX ( XXXX XXXX XXXX XXXX ) * FUNC :XXXX (FUNCTION) CYL XXXX HEAD XXXX SECT XXXX * BUF :XXXX LEN :XXXX WDS XFRD :XXXX * INT LOC :XXXX * * CALLING SEQUENCE: * COPY =ERROR NUMBER,A * JST ERROR * * CALLS: CALLED BY: * ERSET TESTB * MSGA TESTC * ODEC TESTD1 * OHEX TESTE * SPACE TESTF * OTTY TESTG *  OBIN TESTH * DINIT * DOIO *  STATUS * ****************************** * ERROR ENT COPY S,Q SAVE PSW COPY A,ERT1 SAVE ERROR NO COPY =0,A CLEAR ERROR SUPPRESSION FLAG COPY A,ESF DO IT COPY ADRIOB,X GET IOB ADDR COPY CS(X),A INDEX TO CURRENT CYL SHIFT A,LO,4 ISOLATE CYL NUMBER COPY A,TEMP6 SAVE IT COPY HS(X),A INDEX TO CURRENT HEAD AND =:000F,A ISOLATE HEAD NUMBER OR TEMP6,A FORM CYL/HEAD PAIR COPY A,TEMP6 SAVE IT COPY =BADBUF2,Y GET BUFFER ADDR COPY Y,BUFPTR INIT POINTER AGAIN COPY *BUFPTR,Y GET MFR'S BAD TRACK ADD =1,Y END OF BUFFER? JEQ Y,E2 YES,EXIT COPY *BUFPTR,Y NO, RESTORE BAD TRACK XOR A,Y BAD TRACK SPECIFIED BY MFR? JEQ Y,SEM YES, SUPPRESS ERROR MESSAGE IMS BUFPTR NO, BUMP POINTER NOP NOP JMP AGAIN REPEAT IT SEM COPY =1,Y SET UP ERROR SUPPRESSION FLAG COPY Y,ESF SET IT JMP ER3A EXIT * LPOOL * * E2 COPY Q,S RESTORE PSW IN S REG  RBIT 6,S XA-BIT MUST BE OFF COPY ERROR,A DONT CALL ERSET IF SUB =STAT8,A STALT CALL JEQ A,ERRO20 COPY MODE,A OR IF FORMATTER CLSN ='F',A JMP ERRO20 COPY =ERR0,A BUMP TOTAL ERROR COUNT ADD UCUR,A COPY  A,X IMS 0(X) NOP COPY ERROR,A SUB =DINIT6,A OR DINIT CALL JEQ A,ERRO20 COPY ADRIOB,X INDEX IOB  JST ERSET JMP ER3A EXIT ERRO20 EQU $ COPY =-5,A ALLOW FIVE NEXT DIB'S COPY A,ERT2 COPY ADRIOB,X GET IOB ADDR COPY CAR,A ERROR MESSAGE? (BIT 1 SET) SHIFT A,RO,2 JT OV,ERRTT NO, EXIT JST MSGA PRINT ERRORNO  WORD ERMS1 COPY ERT1,A JST ODEC COPY MODE,A CLSN ='F',A FORMATTING? JMP $+2 YES JMP ERROR< 6 NO JST MSGA YES, SAY SO WORD ERMS2 ERROR6 JST MSGA PRINT ERROR ADDR WORD ERMS3 COPY STATER,A DID ERROR OCCUR IN STATUS ROUTINE? JEQ A,ERRR6A COPY STATAD,A YES JMP ERRR6B ERRR6A COPY ERROR,A NO ERRR6B SUB =1,A JST OHEX COPY MODE,A CLSN ='F',A FORMAT? JMP ERROR5 YES, DONT PRINT PASS JST SPACE JST MSGA PRINT PASS NO WORD ERMS4 COPY PASCTR,A JST ODEC ERROR5 JST SPACE JST MSGA PRINT UNIT NO WORD ERMS5 COPY UCUR,A JST ODEC COPY MODE,A CLSN ='F',A FORMAT? JMP ERROR7 YES DONT PRINT TEST NO JST SPACE JST MSGA PRINT CURRENT TEST NO WORD ERMS6 COPY TCUR,A JST OTTY ERROR7 JNE X,$+2 EXIT IF NO IOB ADDRESS ERRTT JMP ER3A EXIT COPY ERT1,A ALSO EXIT IF JEQ A,ERRTT ERROR #0 SUB =1,A OR ERROR #1 JEQ A,ERRTT JST MSGA PRINT IOB ADDR WORD ERMS7 COPY X,A JST OHEX JST MSGA PRINT CONTROLLER STATUS WORD ERMS8 COPY  CST(X),A JST OHEX COPY CST(X),A JST OBIN ALSO IN BINARY JST MSGA WORD ERMS9 PRINT DRIVE STATUS COPY DST(X),A JST OHEX COPY DST(X),A JST OBIN ALSO IN BINARY JST MSGA PRINT FUNCTION WORD ERMS10  COPY OP(X),A OUTPUT OPCODE JST OHEX COPY =:F,A AND OP(X),A COPY A,ERT3 COPY =ERFCTB,A ADD ERT3,A FIND FUNCTION IN TABLE COPY A,X COPY 0(X),A COPY ADRIOB,X COPY A,$+2 STORE ADDR IN PRINT CALL JST MSGA PRINT FUNC WORD $-$ ADDR OF FUNCMSG GOES HERE JST SPACE JST MSGA PRINT CYL WORD ERMS11 JMP ERRO13 LPOOL ERRO13 EQU $ COPY ERT1,A GET ERROR NO CLSN =41,A IF 41 JMP ERRO11 CLSN =51,A OR 51  JMP ERRO11 THEN PRINT ORIGINAL ADDR COPY CS(X),A AND =:FFF,A JST ODEC JST SPACE JST MSGA PRINT HEAD  WORD ERMS12 COPY HS(X),A JST ODEC JST SPACE JST MSGA PRINT SECTOR WORD ERMS13 COPY SSS(X),A JMP ERRO10 ERRO11 COPY CCUR,A SHOW ORIGINAL CYL JST ODEC JST SPACE JST MSGA WORD ERMS12 COPY HCUR,A ORIGINAL HEAD JST ODEC JST SPACE JST MSGA WORD ERMS13 COPY SCUR,A AND ORIG SECTOR NOS ERRO10 JST ODEC JST MSGA PRINT BUFFER ADDR WORD ERMS14 COPY MA(X),A JST OHEX JST SPACE JST MSGA PRINT REQUESTED LENGTH WORD ERMS15 COPY WC(X),A JST OHEX JST SPACE JST MSGA PRINT WDS ACTUALLY XFERRED WORD ERMS16 COPY XF(X),A JST OHEX COPY ERT1,A SEE IF WORD MISCOMP ERROR CLSN =40,A JMP ERRO12 CLSN =50,A JMP ERRO12 JMP ERROR1 NO, SKIP NEXT INFO ERRO12 JST MSGA YES PRINT MISCOMP STUFF WORD ERMS17 COPY MISCAD,A JST OHEX JST SPACE JST MSGA PRINT EXPECTED WORD WORD ERMS18 COPY EXP,A JST OHEX JST SPACE  JST MSGA PRINT ACTUAL WORD WORD ERMS19 COPY ACT,A JST OHEX ERROR1 COPY IN(X),A JEQ A,ERROR9 NO, SKIP NEXT JST MSGA YES, PRINT INT LOC WORD ERMS20 COPY IN(X),A JST OHEX ERROR9 COPY ERT1,A SEE IF ERROR NO IS CLSN =41,A 41 JMP ERROR8 CLSN =51,A OR 51 JMP ERROR8 IF SO, PRINT JMP ERROR2 ERROR8 JST MSGA CHANGE= D CYL/HD/SECTOR STUFF WORD ERMS21 COPY CS(X),A PRINT NEW CYL NO AND =:FFF,A JST ODEC JST SPACE COPY HS(X),A NEW HEAD, JST ODEC JST SPACE COPY SSS(X),A AND NEW SECTOR NO JST ODEC ERROR2 COPY NB(X),A JEQ A,ERROR3 NO, SKIP IT ERROR4 COPY A,ERT4 SAVE CHAINED IOB ADDR JST MSGA PRINT WORD CHAINED IOB WORD ERMS22 COPY ERT4,A JST OHEX PRINT ADDRESS JST SPACE JST MSGA PRINT WORD COUNT WORD ERMS23 COPY ERT4,X COPY 0(X),A JST OHEX JST SPACE JST MSGA PRINT BUF ADDR WORD ERMS24 COPY 1(X),A JST OHEX COPY 3(X),A ANOTHER CHAINED IOB JEQ A,ERROR3 NO, SKIP IT COPY ERT1,A GET ERROR NO CLSN =72,A IF 72,EXIT JMP ERROR3 COPY 3(X),A IMS ERT2 YES BUMP COUNT OF 5 JMP ERROR4 PRINT NEXT CHAINED IOB ERROR3 COPY ADRIOB,X RESTORE IOB ADDRESS ER3A EQU $ COPY CAR,A GET RUN OPTIONS TBIT 4,A HALT ON HARD ERROR? JF OV,$+2 IF NOT, JUMP HLT OTHERWISE HALT COPY Q,S RESTORE STATUS REGISTER COPY ERROR,Y JMP 0(Y) AND EXIT * ERT1 WORD 0 SAVED ERROR NO. ERT2 WORD 0 COUNT OF 5 IOB'S ERT3 WORD 0 FUNC CODE (0-9) ERT4 WORD 0 NEXT DIOB ADDRESS ERLPFL WORD 0 ERROR LP FLAG ESF RES 1,1 ERROR SUPPRESSION FLAG TEMP6 WORD 0 SAVED CYL/HD NUMBER FROM BAD TRK BUFFER * LPOOL TITL 'ERSET' SUBROUTINE ****************************** * * ERSET - CHECK 'ERFLAG' * * THIS SUBROUTINE IS CALLED PRIOR TO * AN ERROR PRINTOUT, TO SEE IF WE ARE * IN THE MIDDLE OF A RETRY SEQUENCE. * IF SO, THE ERROR SHOULD NOT BE * DISPLAYED. THIS SUBROUTINE ALSO * INCREMENTS 'ERFLAG' FOR RETRY. * * CALLING SEQUENCE: * JST ERSET * JMP ? SKIP ERROR REPORT R * JMP ? PRINT ERROR REPORT R+1 * * CALLS: CALLED BY: * NONE  TESTB * TESTC * TESTD1 *  TESTE * TESTF * DUMP * ERROR * ****************************** * ERSET ENT IMS ERFLAG BUMP ERROR FLAG COPY ERCT1,A IS THIS FIRST ERROR JNE A,$+2 NO, SKIP ERROR PRINT IMS ERSET YES PRINT ERROR JMP *ERSET RETURN TITL 'FILCON' SUBROUTINE ****************************** * * FILCON - FILL I/O BUFFER * * THIS SUBROUTINE FILLS THE 520 WORD * I/O BUFFER WITH THE CONTENTS OF THE * A REGISTER. THE A REGISTER MUST * BE LOADED WITH THE FILL CHARACTER * PRIOR TO ENTERING THIS ROUTINE. * * CALLING SEQUENCE: * COPY =FILL CHARACTER,A * JST FILCON * * CALLS: CALLED BY: * MOVE TESTB * TESTD1 * TESTE * TESTF * ****************************** * FILCON ENT SPREAD A CONSTANT COPY A,BUF TO BUFFER COPY =-519,A 519 WORDS JST MOVE MOVE IT WORD BUF WORD BUF+1 JMP *FILCON EXIT * LPOOL TITL 'FILINC' SUBROUTINE ****************************** * * FILINC - FILL I/O BUFFER * * THIS SUBROUTINE WILL SPRE> AD * AN INCREMENTING PATTERN INTO THE * 520 WORD BUFFER. * * ENTER WITH THE STARTING VALUE IN *  THE A REGISTER. * * CALLING SEQUENCE: * COPY =STARTING VALUE,A * JST FILINC * * CALLS:  CALLED BY: * NONE TESTE * ****************************** * 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 RESTORE 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: * JST 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 COPY IKBTMP,X RESTORE XR JMP *IKB * IKBTMP WORD 0 XR SAVE CELL IKBTM2 WORD 0 OV SAVE CELL * LPOOL TITL 'INCR' SUBROUTINE ****************************** * * INCR - INCREMENT CURRENT SECTOR, HEAD, CYLINDER * * THIS SUBROUTINE WILL INCREMENT THE CURRENT * SECTOR NUMBER. WHEN ALL SECTORS ARE DONE, * IT WILL INCREMENT THE CURRENT HEAD NUMBER. * WHEN ALL HEADS ARE DONE, IT WILL INCREMENT * THE CURRENT CYLINDER NUMBER. WHEN ALL * CYLINDER ARE DONE, IT WILL RETURN TO *  RETURN ADDRESS + 1. * * CALLING SEQUENCE: * JST INCR * JMP ? STILL INCREMENTING R * JMP ? ALL CYLINDERS ARE DONE R+1 * * CALLS: CALLED BY: * NONE TESTD *  TESTI * ****************************** * INCR ENT BUMPSECTOR NO IMS SCUR COPY SCUR,A LAST SECTOR? CSK A,SECS JMP *INCR NO, EXIT NOP INCR2 COPY =0,A RESET SECTOR NO COPY A,SCUR IMS HCUR COPY EHD,A NO CSK A,HCUR LAST HEAD JMP INCR6 YES, RESET HEAD NO NOP NO JMP *INCR INCR6 COPY SHD,A RESET HEAD NO COPY A,HCUR IMS CCUR COPY ECYL,A IS THIS LAST CYL CSK A,CCUR JMP INCR3 YES NOP NO  JMP *INCR NO, RETURN INCR3 COPY SCYL,A RESET CYL COPY A,CCUR IMS INCR SPECIAL RETURN JMP *INCR * * INCRH - SAME AS 'INCR' EXCEPT THE * HEAD AND CYLINDER NUMBERS * ONLY ARE INCREMENTED. * * SECTOR = 0 * INCRH ENT COPY INCRH,A SAVE RETURN AD COPY A,INCR JMP INCR2 SKIP SECTOR UPDATE * LPOOL TITL I/O SUBROUTINES ****************************** * * OTA * OTX * SEL * SENHIM * SENRDY - I/O SUBROUTINES * * THESE SUBROUTINES PERFORM THE * ACTUAL I/O TO THE CONTROLLER. * * OTA - OUPUT A REGISTER FC. = 0 * * OTX - OUPU@ T 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 * * SENRDY - JST SENRDY * JMP ? CONTROLLER NOT READY R * JMP ? CONTROLLER READY R+1 * * CALLS: CALLED BY: * NONE TESTB *  TECH TEST * DINIT * TESTF * TESTH * DOIO * PROGRAM START UP * TRAP SERVICE ROUTINES * CONSOLE SERVICE ROUTINE * ****************************** * OTA ENT DA1 EQU $ OUT A,SMDA*8+0 OUTPUT A-REG JMP *OTA * OTX ENT DA2 EQU $ OUT X,SMDA*8+0 OUTPUT X-R 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  JMP *SENRDY IMS SENRDY JMP *SENRDY * TITL 'MASK' SUBROUTINE ****************************** * * MASK - MASK UNWANTED BITS * * THIS SUBROUTINE IS USED * TO MASK OUT UNWANTED BITS AFTER * A RANDOM NUMBER IS GENERATED. * *  ENTER WITH HIGHEST POSSIBLE VALUE IN A REGISTER * EXIT WITH NUMBER IN X REGISTER. * * CALLING SEQUENCE: *  COPY =HIGHEST POSSIBLE VALUE,A * JST MASK * * CALLS: CALLED BY: * NONE TESTE * ****************************** * MASK ENT COPY =0,X MASK1 JEQ A,MASK2 IF A=0, MASK COMPLETE SHIFT A,RO,1 SBIT 1,S ROTATE X,LO,1 SHIFT "1" BIT INTO X JMP MASK1 MASK2 JMP *MASK TITL 'MKIOB' SUBROUTINE ****************************** * * MKIOB - UPDATE IOB * * THIS SUBROUTINE IS USED * TO UPDATE THE FOLLOWING * PARAMETERS IN THE IOB: * * UNIT * CYLINDER * HEAD * SECTOR * * IT ALSO PRESETS THE WORDS TRANSFERRED, * RETURNED STATUS, AND RETURNED DRIVE STATUS * TO :FFFF. * * CALLING SEQUENCE: * JST MKIOB * * CALLS: CALLED BY: * NONE TESTA * TESTB *  TESTC * TD4C * TE4C *  TESTF * TESTG * TESTH *  FMATTR * ******************************** * MKIOB ENT COPY ADRIOB,X INDEX IOB COPY UCUR,A SET CURRENT UNIT COPY A,US(X) STORE UNIT COPY CCUR,A SET CURRENT CYL COPY A,CS(X) STORE CYL COPY HCUR,A SET CURRENT HEAD A  COPY A,HS(X) STORE HEAD COPY SCUR,A SET CURRENT SECTOR COPY A,SSS(X) STORE SECTOR COPY =-1,A COPY A,XF(X) PRESET WDS XFRRED COPY A,CST(X) AND STATA COPY A,DST(X) JMP *MKIOB BACK TO CALLER. * 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 QUERIES * TEST CONTROL *  TESTB * TESTF * FMATTR *  TECH TEST * DUMP * ERROR *  ODEC * TSTITL * TRAP SERVICE ROUTINES * ****************************** * MSGA ENT PRINT A MSG ROUTINE COPY X,MSGA3 SAVE X REG COPY *MSGA,X GET MSG ADRESS SHIFT X,LO,1 IMS MSGA BUMP FOR RTN 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 XREG CELL * LPOOL TITL 'NXTHDR' SUBROUTINE ****************************** * * NXTHDR - GENERATE NEXT PARAMETERS * * THIS SUBROUTINE WILL GENERATE * THE NEXT VALUES FOR THE FOLLWING * PARAMETERS: * * CYLINDER * HEAD * SECTOR * * IF END-OF-MEDIA OCCURS IN THE GENERATION, * A :FFFF IS STORED. * * CALLING SEQUENCE: * JST NXTHDR * * CALLS: CALLED BY: * NONE TESTB * TESTD1 * TE4C * *B ***************************** * NXTHDR ENT CALC NEXT HDR ADDR COPY CCUR,A UPDATE PTRS COPY A,CNEXT COPY HCUR,A COPY A,HNEXT COPY SCUR,A LOOK AT CURRENT SECTOR COPY A,SNEXT ADD =1,A SUB SECS,A JLT A,$+3 LAST COPY =0,A YES JMP $+2 ADD SECS,A NO COPY A,SNEXT STORE IT JNE A,NXT1 LAST SECT? IMS HNEXT YES. LOOK AT NEXT HEAD COPY EHD,A CSK A,HNEXT LAST HEAD? JMP NXT0 YES NOP JMP *NXTHDR NXT0 COPY SHD,A RESET HEAD NO. COPY A,HNEXT IMS CNEXT BUMP CYL NO COPY ECYL,A CSK A,CNEXT LAST CYL? JMP NXT2 YES NOP NXT1 JMP *NXTHDR RETURN NXT2 COPY =-1,A SET EOM FLAG COPY A,SNEXT COPY A,HNEXT COPY A,CNEXT  JMP *NXTHDR RETURN * SNEXT WORD 0 NEXT SECTOR HNEXT WORD 0 NEXT HEAD CNEXT WORD 0 NEXT CYL 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' SUBROUTINE ****************************** * * ODEC - PRINT DECIMAL NUMBER * * THIS SUBROUTINE WILL CONVERT THE * A REGISTER 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 REGISTER * * CALLING SEQUENCE: * COPY =NUMBER,A * JST ODEC * * CALLS: CALLED BY: * MSGA TEST CONTROL * OTTY FMATTR *  ERROR * ****************************** * ODEC ENT OUTPUT A 5-DIGIT DECIMAL NO COPY X,ODECX SAVE X-REG COPY  A,IDCTM1 SAVE BINARY VALUE CSK A,ODCTBL+1 IS IT GREATER THAN 10,000? JMP ODEC0 NO, CONTINUE NOP JST MSGA YES, PRINT '****' WORD STARS JMP ODEC2 EXIT ODEC0 COPY ODCTBL,A GET TABLE COPY A,IDCTM2 COPY =-5,A COUNT 5 DIGITS COPY A,IDCTM3 ODEC1 COPY IDCTM1,A GET REMAINDER COPY IDCTM2,Y COPY ='0'-1,X SUB 0(Y),A DIVIDE INDECIMAL ADD =1,X ADD TO OUTPUT VALUE JGE A,$-2 ADD 0(Y),A ADD BACK IN IF GONE NEG COPY A,IDCTM1 STORE REMAINDER COPY X,A C JST OTTY PRINT CALCULATED DIGIT IMS IDCTM2 BUMP TABLE PTR IMS IDCTM3 AND COUNT JMP ODEC1 DO NEXT DIGIT ODEC2 COPY ODECX,X RESTORE X-REG JMP *ODEC EXIT AFTER 5 * ODCTBL WORD $+1,10000,1000,100,10,1 ODECX WORD 0 X-REG SAVE *  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 CRT/TTY. * * ENTER WITH NUMBER IN THE A REGISTER * * CALLING SEQUENCE: * COPY =NUMBER,A * JST OHEX * * CALLS: CALLED BY: * OTTY TESTB * DUMP * ERROR * ****************************** * OHEX ENT OUTPUT 4 HEX DIGITS COPY X,ODECX SAVE X-REG COPY A,X SAVE NO 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 COUNTINUE 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 AND EXIT * OHEXC1 WORD 0 4-DIGIT COUNTER OHEXC WORD 0 4-BIT SHIFT COUNT TITL 'OTTY' SUBROUTINE ****************************** * * OTTY - PRINT ASCII CHARACTER * * THIS SUBROUTINE WILL PRINT AN * ASCII CHARACTER IN THE LS. BYTE * OF THE A REGISTER TO THE CRT/TTY * AND LINE PRINTER. * * ENTER WITH CHARACTER IN LS. BYTE OF * THE A REGISTER * * CALLING SEQUENCE: * COPY =CHARACTER,A * JST OTTY * * CALLS: CALLED BY: * NONE  TESTB * CRLF * DUMP *  ERROR * IDEC * MSGA * OBIN *  ODEC * OHEX * SPACE * ****************************** * 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 IN DTTYDA%1;1,A INPUT STATUS SHIFT A,RO,5 TREMPTY TO OV JT 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,AD  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' SUBROUTINE ****************************** * * PREP - PREPARE DISK * * THIS SUBROUTINE WILL PREPARE THE DISK * FOR A NEW TEST. IT WILL RESET THE *  CURRENT CYLINDER, CURRENT HEAD AND CURRENT * SECTOR TO THE STARTING VALUES. * * CALLING SEQUENCE: * JST PREP * * CALLS: CALLED BY: * DINIT TESTA * TESTB *  TESTC * TESTD * TESTI *  TESTE * TESTF * TESTG *  TESTH * FMATTR * ****************************** * PREP ENT INITALIZE CYL/HD/SECTOR NOS COPY SSEC,A RESET SECTOR NO COPY A,SCUR COPY SHD,A RESET HD NO COPY A,HCUR COPY SCYL,A RESET CYL NO COPY A,CCUR JST DINIT RESET THE DISK JMP *PREP EXIT * LPOOL TITL 'RANDOM' SUBROUTINE ****************************** * * RANDOM - RANDOM NUMBER GENERATOR * * THIS SUBROUTINE WILL GENERATE * A PSEDUO RANDOM NUMBER USING THE * FOLLOWING 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 TESTB * TESTE * ****************************** * RANDOM ENT ENTRY/EXIT. COPY X,RMD:X SAVE 'X' REGISTER. COPY =0,A CLEAR A-REG COPY SEED,X SET C(I) --> 'X'. * * 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 REFRESH 'X' REGISTER. JMP *RANDOM BACK TO CALLER. * SEED RES 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' REGISTER KEEPER FOR RANDOM ROUTINE. TITL 'RETRY' SUBROUTINE ********E ********************** * * RETRY - RETRY I/O * * THIS SUBROUTINE WILL RETRY THE I/O * FUNCTION USING NEXT OFFSET BITS, IF THE * ERFLAG HAS BEEN SET TO A NON ZERO VALUE * (BY 'ERSET'), AND GOING TO "RLOOP" (SET *  UP BY 'RYINT'). OTHERWISE, IT WILL GO TO * "*RLOOPX" TO EXIT THE RETRY LOOP. * * THIS SUBROUTINE WILL ALSO INCREMENT THE * SOFT, FIRM, AND HARD ERROR COUNTS. * * CALLING SEQUENCE: * JST RETRY * * CALLS:  CALLED BY: * NONE TESTA * TESTB * TESTC * TESTD1 * TESTE * TESTF *  TESTG * TESTH * ****************************** * RETRY ENT COPY ADRIOB,X INDEX IOB COPY =:F0FF,A CLEAR OFFSETS FROM FC AND OP(X),A COPY A,OP(X) COPY =0,A GET ERFLAG EXCH ERFLAG,A AND CLEAR IT TO ZERO JEQ A,RETRY2 IF NO ERRORS, EXIT IMS ERCT1 ELSE BUMP ERROR COUNT COPY =ERTABL-1,A GET OFFSET MASK ADD ERCT1,A COPY A,RETRYA COPY *RETRYA,A GET NEXT OFFSET RETRY RETRY0 COPY ADRIOB,X INDEX IOB JLT A,RETRY1 IF NEG,ALL OFFSETS IN TABLE DONE OR OP(X),A ELSE PUT IT IN OPCODE COPY A,OP(X)  COPY ERCT1,A IF FIRST ERROR, CLSN =1,A IMS ERCT2 BUMP SOFT COUNT CLSN =4,A IF FIRST OFFSET IMS ERCT2 BUMP FIRM COUNT JMP *RLOOP GO RETRY RETRY1 IMS ERCT2 BUMP HARD COUNT JMP RETRY3 GO TALLY ERRORS RETRY2 EXCH ERCT1,A ANY PREVIOUS ERRORS? JEQ A,RETRY4 NO, EXIT RETRY3 COPY SFHTBL,A FIND ERROR ADDR IN TBL COPY ADRIOB,X ADD ERCT2,A COPY A,RETRYA COPY *RETRYA,A ADD US(X),A ADD IN UNIT NO FOR COPY A,RETRYA TABLE ENTRY IMS *RETRYA BUMP ACTUAL ERR COUNT RETRY4 JMP *RLOOPX EXIT * RETRYA WORD 0 TEMP SFHTBL WORD $,SOFT0,FIRM0,HARD0 RLOOP WORD 0 RETRY ADDREDS RLOOPX WORD 0 END RETRY ADDR ERCT1 WORD 0 PRIMARY ERROR COUNT ERCT2 WORD 0 SOFT/FIRM/HARD FLAG ERFLAG WORD 0 ERROR INDICATOR * ERTABL WORD 0,0,0 OFFSET MASK TABLE WORD :100,:100,:100 WORD :200,:200,:200  WORD :300,:300,:300 WORD :400,:400,:400 WORD :500,:500,:500 WORD :600,:600,:600 WORD :700,:700,:700  WORD :800,:800,:800 WORD -1 * LPOOL TITL 'RYINIT' SUBROUTINE ****************************** * * RYINIT - INITIALIZE ERROR RETRY COUNTERS * * THIS SUBROUTINE WILL INITIALIZE THE * ERROR RETRY COUNTERS, RETRY AND END *  RETRY ADDRESSES. * * ENTER WITH IOB ADDRESS IN X REGISTER * * CALLING SEQUENCE: * COPY =IOB ADDRESS,X * JST RYINIT * WORD ADDRESS1 RETRY ADDRESS * WORD ADDRESS2 END RETRY ADDRESS * * CALLS: CALLED BY: * NONE TESTA * TESTB *  TESTC * TESTD1 * TESTE *  TESTF * TESTG * TESTH * ****************************** F * RYINIT ENT COPY X,ADRIOB STORE IOB COPY *RYINIT,A GET RETRY ADDRESS COPY A,RLOOP IMS RYINIT BUMP FOR END RETRY ADDR COPY *RYINIT,A GET IT COPY A,RLOOPX IMS RYINIT BUMP FOR RETURN COPY =0,A RESET ERROR COUNTERS COPY A,ERCT1 COPY A,ERCT2 COPY A,ERFLAG JMP *RYINIT EXIT TITL 'SPACE' SUBROUTINE ****************************** * * SPACE - PRINT SPACES * * THIS SUBROUTINE WILL PRINT * THREE ASCII SPACES TO THE * CRT/TTY. * * CALLING SEQUENCE: * JST SPACE * * CALLS: CALLED BY: * OTTY ERROR *  OBIN * TEST CONTROL * ****************************** * SPACE ENT PRINT 3 SPACES COPY =' ',A FOR ERROR REPORT JST OTTY JST OTTY JST OTTY JMP *SPACE EXIT * LPOOL TITL 'STATUS' SUBROUTINE ****************************** * * STATUS - STATUS CHECK * * THIS SUBROUTINE WILL CHECK *  THE RETURNED STATUS FROM AN * I/O OPERATION. IF A BAD STATUS * IS RETURNED IT WILL CALL 'ERROR'. * * CALLING SEQUENCE: * JST STATUS * * CALLS: CALLED BY: * ERROR TESTA *  TESTB * TESTC * TESTD1 *  TESTE * TESTH * ****************************** * STATUS ENT COPY =0,A  CLEAR STALT FLAG STATS COPY A,STFG COPY STATUS,A COPY A,STATAD SAVE STATUS CALLING ADDR COPY =1,A LET ERROR ROUTINE KNOW COPY A,STATER WE'RE IN STATUS ROUTINE COPY ADRIOB,X INDEX IOB COPY CST(X),A LOOK AT STATUS ADD =1,A ALL FFFF'S? JEQ A,STAT1 YES, NO STATUS AT ALL SUB =1,A SHIFT A,RO,6 ID CRC? JT OV,STAT2 YES SHIFT A,RO,1 WORD CRC? JT OV,STAT3 YES COPY CST(X),A ELSE XOR =:400,A GOOD STATUS? JNE A,STAT1 NO  COPY US(X),A GET UNIT COPY =:8000,X STAT1B JEQ A,STAT1A MASK OFF OTHER UNITS SHIFT X,RO,1 SUB =1,A JMP STAT1B STAT1A COPY X,A COPY ADRIOB,X AND DST(X),A CHECK DRIVE STATUS (BITS 12-15) JNE A,STAT4 BAD DRIVE STATUS COPY DST(X),A GET DRIVE STATUS AGAIN AND =:FF,A MASK OFF HIGH ORDER BITS STAT1C JNE A,STAT4 BAD STATUS COPY  ADRIOB,X COPY XF(X),A SEE IF REQUESTED LENGTH SUB WC(X),A =ACTUAL LENGTH JNE A,STAT5 NO, SEE WHY NOT JMP STAT8 ALL OK,EXIT STAT1 COPY =5,A STATUS ERROR JMP STAT6 STAT2 COPY =7,A ID CRC ERROR JMP STAT6 STAT3 COPY  =8,A WORD CRC ERROR JMP STAT6 STAT4 COPY =6,A DRIVE STATUS ERROR JMP STAT6 STAT5 COPY =:F,A LENGTH BAD. AND OP(X),A IS THIS A CLSN =SEEK,A SEEK? JMP STAT5A YES, SHD BE ZERO CLSN =TIO,A IS IT A TIO? JMP STAT5A YES, SHD BE ZERO COPY NB(X),A IS IT WORD CHAINED? JNE A,STAT8 OH, THAT EXPLAINS IT. COPY =9,A NO, JUST BAD LENGTH JMP STAT6 STAT5A COPY XF(X),A LENGTH = 0? JNE A,$+2 NO, ERROR JMP STAT8 YES,OK COPY =10,A ERROR STAT6 COPY STFG,X IS THIS STALT CALL? JNE X,STAT7 YES, USE SPECIAL ERR CALL COPY ADRIOB,X RESTORE IOB ADDR JSG T ERROR CALL ERROR JMP STAT8 EXIT STAT7 COPY ADRIOB,X STALT ERROR CALL. JST ERROR (ERROR WONT CALL ERSET) STAT8 COPY =0,A COPY A,STATER RESET ERROR ROUTINE FLAG JMP *STATUS EXIT * STFG WORD 0 STALT FLAG STATAD WORD 0 CALLING ADDRESS STATER WORD 0 FLAG FOR JST ERROR * * STALT - ALTERNATE ENTRY POINT TO STATUS. * THIS SUBROUTINE DOESN'T CALL * ERSET TO INCREMENT ERROR FLAG. * STALT ENT STALT STUFF COPY STALT,A MOVE RETURN ADDRESS COPY A,STATUS COPY =1,A SET STALT FLAG JMP STATS CONTINUE * 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 TESTF *  TESTH * DINIT * DOIO * ******************************* * 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 TITL 'TIMER' SUBROUTINE ******************************* * * TIMER - INITIALIZES TIMING CELLS * FOR 'TIME' * * CALLING SEQUENCE: * JST TIMER * * CALLS: CALLED BY: * NONE TESTF * TESTH * DINIT * DOIO * ******************************* * TIMER ENT  COPY =0,A SET LOW WORD COPY A,TC1 COPY =-7,A SET HIGH WORD COPY A,TC2 JMP *TIMER TITL 'TSTITL' SUBROUTINE ******************************* * * TSTITL - PRINTS TEST TITLE * * CALLING SEQUENCE: * COPY =TEST LETTER,A *  JST TSTITL * * CALLS: CALLED BY: * CRLF TESTA * MSGA  TESTB * OTTY TESTC * TESTD * TESTE * TESTF * TESTG * TESTH *  TESTI * ******************************* * TSTITL ENT PRINT TEST TITLE COPY A,TCUR STORE TEST NO SHIFT A,LO,8 IN BITS 12-15 OF THE CDR SHIFT A,LO,4 SELP A,4 JT SS,TSTTL1 SEE IF WANTED JST CRLF  JST MSGA PRINT TITLE WORD ERMS6 COPY TCUR,A JST OTTY TSTTL1 JMP *TSTITL ESXIT * LPOOL TITL TRAP/EXCEPTION SERVICE ROUTINES ****************************** * * TRAP EXCEPTION SERVICE ROUTINES * * CONSOLE INTERRUPT SERVICE ROUTINE * * CALLS: * SEL * MSGA * ****************************** * * POWER UP * PWRUP: ENT POWER UP SERVICE ROUTINE SIN 3 STATUS INHIBIT COPY =PFMSG,X GET MESSAGE ADDRESS SERVR EQU $ COPY =0,A SET A TO ZERO COPY A,S SET PSW TO ZERO JST SEL RESET/INITIALIZE CONTROLLER COPY X,$+2 STORE MESSAGE ADDRESS JST MSGA DISPLAY TRAP/EXCEPTION MESSAGE WORD 0 MESSAGE ADDRESS HLTH  WAIT HERE JMP ENT1A TO TO QUERIES * * UNIMPLEMENTED INSTRUCTION TRAP * UNINT: ENT UNI. INSTR. SERVICE ROUTINE SIN 4 STATUS INHIBIT COPY =INMSG,X GET MESSAGE ADDRESS JMP SERVR DISPLAY MESSAGE * * UNINSTALLED MEMORY TRAP * UNMET: ENT UNI. MEM. TRAP SERVICE ROUTINE SIN 4 STATUS INHIBIT COPY =MEMSG,X GET MESSAGE ADDRESS JMP SERVR DISPLAY MESSAGE * * POWER FAIL * PWRFL: ENT POWER FAIL SERVICE ROUTINE HLT WAIT FOR POWER * * CHAR./NUM. EXCEPTION * CHNUE: ENT CHAR./NUM. EXCEP. SERVICE ROUTINE SIN 4 STATUS INHIBIT COPY =CHMSG,X GET MESSAGE ADDRESS JMP SERVR DISPALY MESSAGE * * STACK OVERFLOW * STKOV: ENT STK. OVR. TRAP SERVICE ROUTINE SIN 4 STATUS INHIBIT COPY =STMSG,X GET MESSAGE ADDRESS JMP SERVR DISPLAY MESSAGE * * USER TRAP * USETR: ENT USER TRAP SERVICE ROUTINE SIN 4 STATUS INHIBIT COPY =USMSG,X GET MESSAGE ADDRESS JMP SERVR DISPLAY MESSAGE * * SYSTEM TRAP * SYSTR: ENT SYSTEM TRAP SERVICE ROUTINE SIN 4 STATUS INHIBIT COPY =SYMSG,X GET MESSAGE ADDRESS JMP SERVR DISPLAY MESSAGE * * ARITHMETIC ERROR * ARIER: ENT ARIT. ERROR SERVICE ROUTINE SIN 4 STATUS IHNIBIT COPY =ARMSG,X GET MESSAGE ADDRESS JMP SERVR DISPLAY MESSAGE * * CONSOLE INTERRUPT * CNINT: ENT CONSOLE INTERRUPT SERVICE ROUTINE 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 JMP ENT1A GO TO QUERIES * LPOOL TITL TABLES (GLOBAL VARIABLES) ****************************** * * GLOBAL VARIABLES * * USED THROUGH OUT THE PROGRAM * ****************************** * OPTIONS +:20 * ACT WORD 0 ACTUAL WORD * ADRIOB WORD 0 CURRENT IOB ADDRESS * CCUR WORD 0 CURRENT CYL NUMBER * EXP WORD 0 EXPECTED WORD * EOM WORD 0 END OF MEDIA FLAG * HCUR WORD 0 CURRENT HEAD NUMBER * MISCAD WORD 0 WORD IN ERROR * SCUR WORD 0 CURRENT SECTOR NUMBER * TCTEMP WORD 0 BUFFER POINTER * TCUR WORD SPACE: CURRENT TEST NUMBER (A-I) * TEMP1 WORD 0 TEMP. CELL * TEMP2 WORD 0 TEMP. CELL * TEMP3 WORD 0 TEMP. CELL * TEMP4 WORD 0 TEMP. CELL * TEMP5 WORD 0 TEMP. CELL * TPTR WORD 0 POINTER TO TEST NUMBER * UCUR WORD 0 CURRENT UNIT NUMBER * UPTR WORD 0 POINTER TO UNIT NUMBER * TITL TABLES (I/O INSTRUCTION ADDRESSES) ****************************** * * I/O INSTRUCTION ADDRESSES * * TABLE OF I/O INSTRUCTION ADDRESSES * WHICH REQUIRE MODIFICATION WHEN THE * DEVICE ADDRESS IS CHANGED. * * TABLE MUST BE KEPT CONTIGUOUS * ****************************** * DAFRST EQU $ START OF DEVICE ADDRESSES TABLE * WORD DA1 'OTA' I/O SUBROUTINE * WORD DA2 'OTX' I/O SUBROUTINE * WORD DA3 'SEL' I/O SUBROUTINE * WORD DA4 'SENHIM' I/O SUBROUTINE * WORD DA5 'SENRDY' I/O SUBROUTINE * DASIZ EQU $-DAFRST DEVICE ADDRESSES TABLE SIZE TITL TABLES (FC. ERROR MSGS. ADDRESSES) ****************************** * * TABLE OF FUNCTION CODE ERROR MESSAGE ADDRESSES * * TABLE MUST BE KEPT CONTIGUOUS * ****************************** * ERFCTB EQU $ POINTER TO FUNCTION MESSAGES * WORD ERFC0 * WORD ERFC1 * WORD ERFC2 * WORD ERFC3 * WORD ERFC4 * WORD ERFC5 * WORD ERFC6 * WORD ERFC7 * WORD ERFC8 * WORD ERFC9 * WORD ERFCA * WORD ERFCB * WORD ERFCC * WORD ERFCD * WORD ERFCE * WORD ERFCF * TITL TABLES (TEST ADDRESSES) ****************************** * * TABLE OF TEST ADDRESSES * * TABLE MUST BE KEPT CONTIGUOUS * ***************I *************** * TSTABL WORD TESTA * WORD TESTB * WORD TESTC * WORD TESTD * WORD TESTE * WORD TESTF * WORD TESTG * WORD TESTH * WORD TESTI * TITL TABLES (DRIVE PARAMETER ADDRESSES) ****************************** * * TABLE OF DRIVE PARAMETER ADDRESSES * * TABLE MUST BE KEPT CONTIGUOUS * ****************************** * DRTBL EQU $ START OF DRIVE PARAMETER ADDRESSES * WORD SA1002 SHUGART 1002 * WORD SA1004 SHUGART 1004 * WORD Q2010 QUANTUM 2010 * WORD Q2020 QUANTUM 2020 * WORD Q2030 QUANTUM 2030 * WORD Q2040 QUANTUM 2040 * * ADD NEW DRIVE PARAMETER TABLE ADDRESSES HERE * DRTBLZ EQU $-DRTBL-1 NUMBER OF DRIVES-1 TITL TABLES (RESET-PARAMETER TABLE) ****************************** * * RESET-PARAMETER TABLE * * THESE ARE THE DEFAULT PARAMETERS. * TABLE MUST BE KEPT IN ORDER * ****************************** * PRAMSX EQU $ START OF RESET-PARAMETER TABLE * TESTSX WORD TESTA WORD TESTB WORD TESTC WORD TESTD WORD TESTE WORD TESTF WORD TESTG WORD TESTH WORD -1 TESTI WORD -1 TERMINATOR WORD -1 * DISKX WORD SA1002 DRIVE PARAMETER TABLE ADDRESS (DEFAULT) * MODEX WORD 'D' DIAGNOSTIC FLAG * NONDEX WORD 0 DESTRUCTIVE FLAG * HCPX EQU $ * SA1002 PARAMETERS ******** CYLSX WORD 256 * NUMBER OF CYLS. * SCYLX WORD 0 * STARTING CYL. NUMBER * ECYLX WORD 255 * ENDING CYL. NUMBER * PCMPX WORD 128 * WRITE PRE. COMP. CYL. * HDSX WORD 2 * NUMBER OF HEADS * SHDX WORD 0 * STARTING HEAD NUMBER * EHDX WORD 1 * ENDING HEAD NUMBER * SECSX WORD 16 * NUMBER OF SECTORS * SSECX WORD 0 * STARTING SECTOR NUMBER * ESECX WORD 15 * ENDING SECTOR NUMBER * WDSX WORD 256 * WORDS PER SECTOR * EHCPX EQU $ **************************** * WCPATX WORD PAT PATTERN DEFAULT * UNX WORD 0,-1 UNIT TABLE RES UNITS-1,0 * DEVADX WORD SMDA DEVICE ADDRESS * SHORTX WORD 0 SHORT TEST FLAG * SHORTCX WORD 0 SHORT TEST CYLINDERS * CARX WORD 0 RUN OPTION SETTING * PASCTX WORD 0 PASS ZERO FIRST * ERR0X RES UNITS,0 TOTAL ERRORS * SOFT0X RES UNITS,0 SOFT ERRORS * FIRM0X RES UNITS,0 FIRM ERRORS * HARD0X RES UNITS,0 HARD ERRORS * TITL TABLES (WORKING-PARAMETER TABLE) ****************************** * * WORKING-PARAMETER TABLE * * THIS IS THE ACTUAL WORKING * PARAMETER TABLE. TABLE MUST * BE KEPT IN ORDER * ****************************** * PRAMS EQU $ START OF WORKING-PARAMETER TABLE * TESTS WORD TESTA WORD TESTB WORD TESTC WORD TESTD WORD TESTE WORD TESTF WORD TESTG WORD TESTH WORD -1 TESTI WORD -1 TERMINATOR TSTSIZ EQU $-TESTS TEST TABLE SIZE * WORD -1 * DISK WORD SA1002 DRIVE PARAMETER TABLE ADDRESS * MODE WORD 'D' DIAGNOSTIC FLAG * NONDES WORD 0 DESTRUCTIVE FLAG * HCP EQU $ * DRIVE PARAMETERS ********* CYLS WORD 256 * NUMBER OF CYLINDERS * SCYL WORD 0 * STARTING CYLINDER NUMBER * ECYL WORD 255 * ENDING CYLINDER NUMBER * PCMP WORD 128 * WRITE PRE. COMP. CYL. * HDS WORD 2 * NUMBER OF HEADS * SHD WORD 0 * STARTING HEAD NUMBER * EHD WORD 1 * ENDING HEAD NUMBER * SECS WORD 16 * NUMBER OF SECTORS * SSEC WORD 0 * STARTING SECTOR NUMBER * ESEC WORD 15 * ENDING SECTOR NUMBER * WDS WORD 256 * WORDS PER SECTOR * EHCP EQU $ **************************** * WCPAT WORD PAT PATTERN * UN WORD 0,-1 UNIT J TABLE RES UNITS-1,0 * DEVAD WORD SMDA DEVICE ADDRESS * SHORT WORD 0 SHORT TEST FLAG * SHORTC WORD 0 SHORT TEST CYLINDERS * CAR WORD 0 RUN OPTION SETTING * PASCTR WORD 0 PASS COUNT AT FIRST * ERR0 RES UNITS,0 TOTAL ERRORS * SOFT0 RES UNITS,0 SOFT ERRORS * FIRM0 RES UNITS,0 FIRM ERRORS * HARD0 RES UNITS,0 HARD ERRORS * PRMSIZ EQU $-PRAMS SIZE OF PARAMETER TABLE TITL TABLES (SA1002 PARAMETERS) ****************************** * * SHUGART 1002 DEFAULT PARAMETER TABLE * * TABLE MUST BE KEPT IN ORDER * ****************************** * SA1002 EQU $ START OF TABLE * WORD 256 NUMBER OF CYLINDERS * WORD 0 STARTING CYLINDER NUMBER * WORD 255 ENDING CYLINDER NUMBER * WORD 128 WRITE PRE COMPENSATION CYLINDER * WORD 2 NUMBER OF HEADS * WORD 0 STARTING HEAD NUMBER * WORD 1 ENDING HEAD NUMBER * WORD 16 NUMBER OF SECTORS * WORD 0 STARTING SECTOR NUMBER * WORD 15 ENDING SECTOR NUMBER * WORD 256 WORDS PER SECTOR * TITL TABLES (SA1004 PARAMETERS) ****************************** * * SHUGART 1004 DEFAULT PARAMETER TABLE * * TABLE MUST BE KEPT IN ORDER * ****************************** * SA1004 EQU $ START OF TABLE * WORD 256 NUMBER OF CYLINDERS * WORD 0 STARTING CYLINDER NUMBER * WORD 255 ENDING CYLINDER NUMBER * WORD 128 WRITE PRE COMPENSATION CYLINDER * WORD 4 NUMBER OF HEADS * WORD 0 STARTING HEAD NUMBER * WORD 3 ENDING HEAD NUMBER * WORD 16 NUMBER OF SECTORS * WORD 0 STARTING SECTOR NUMBER * WORD 15 ENDING SECTOR NUMBER * WORD 256 WORDS PER SECTOR * TITL TABLES (Q2010 PARAMETERS) ****************************** * * QUANTUM 2010 DEFAULT PARAMETER TABLE * * TABLE MUST BE KEPT IN ORDER * ****************************** * Q2010 EQU $ START OF TABLE * WORD 512 NUMBER OF CYLINDERS * WORD 0 STARTING CYLINDER NUMBER * WORD 511 ENDING CYLINDER NUMBER * WORD 256 WRITE PRE COMPENSATION CYLINDER * WORD 2 NUMBER OF HEADS * WORD 0 STARTING HEAD NUMBER * WORD 1 ENDING HEAD NUMBER * WORD 16 NUMBER OF SECTORS * WORD 0 STARTING SECTOR NUMBER * WORD 15 ENDING SECTOR NUMBER * WORD 256 WORD PER SECTOR * TITL TABLES (Q2020 PARAMETERS) ****************************** * * QUANTUM 2020 DEFAULT PARAMETER TABLE * * TABLE MUST BE KEPT IN ORDER * ****************************** * Q2020 EQU $ START OF TABLE * WORD 512 NUMBER OF CYLINDERS * WORD 0 STARTING CYLINDER NUMBER * WORD 511 ENDING CYLINDER NUMBER * WORD 256 WRITE PRE COMPENSATION CYLINDER * WORD 4 NUMBER OF HEADS * WORD 0 STARTING HEAD NUMBER * WORD 3 ENDING HEAD NUMBER * WORD 16 NUMBER OF SECTORS * WORD 0 STARTING SECTOR NUMBER * WORD 15 ENDING SECTOR NUMBER * WORD 256 WORD PER SECTOR * TITL TABLES (Q2030 PARAMETERS) ****************************** * * QUANTUM 2030 DEFAULT PARAMETER TABLE * * TABLE MUST BE KEPT IN ORDER * ****************************** * Q2030 EQU $ START OF TABLE * WORD 512 NUMBER OF CYLINDERS * WORD 0 STARTING CYLINDER NUMBER * WORD 511 ENDING CYLINDER NUMBER * WORD 256 WRITE PRE COMPENSTAION CYLINDER * WORD 6 NUMBER OF HEADS * WORD 0 STARTING HEAD NUMBER * WORD 5 ENDING HEAD NUMBER * WORD 16 NUMBER OF SECTORS * WORD 0 STARTING SECTOR NUMBER * WORD 15 ENDING SECTOR NUMBER * WORD 256 WORD PER SECTOR * TITL TABLES (Q2040 PARAMETERS) ****************************** * * QUANTUM 2040 DEFAULT PARAMETER TABLE * * TABLE MUST BE KEPT IN ORDER * ****************************** * Q2040 K EQU $ START OF TABLE * WORD 512 NUMBER OF CYLINDERS * WORD 0 STARTING CYLINDER NUMBER * WORD 511 ENDING CYLINDER NUMBER * WORD 256 WRITE PRE COMPENSATION CYLINDER * WORD 8 NUMBER OF HEADS * WORD 0 STARTING HEAD NUMBER * WORD 7 ENDING HEAD NUMBER * WORD 16 NUMBER OF SECTORS * WORD 0 STARTING SECTOR NUMBER * WORD 15 ENDING SECTOR NUMBER * WORD 256 WORDS PER SECTOR * TITL CRT/TTY MESSAGES (QUERIES) ****************************** * * QUERY MESSAGES * ****************************** * TITLE BYTE CR:,LF:,LF:,'WINCHESTER DIAGNOSTIC/FORMATTER 96120-' WORD REV:,CRLF:,-1 * 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=30)',:FF * QRYM5 BYTE CR:,LF:,'ECHO BAD TRACKS LIST FROM MANUFACTURER (Y/[N])?',:FF * QUERYM10 BYTE CR:,LF:,' SA1002 - 0' SHUGART 1002 DRIVE BYTE CR:,LF:,' SA1004 - 1' SHUGART 1004 DRIVE BYTE CR:,LF:,' Q2010 - 2' QUANTUM 2010 DRIVE BYTE CR:,LF:,' Q2020 - 3' QUANTUM 2020 DRIVE BYTE CR:,LF:,' Q2030 - 4' QUANTUM 2030 DRIVE BYTE CR:,LF:,' Q2040 - 5' QUANTUM 2040 DRIVE * * ADD NEW DRIVE MESSAGES HERE * BYTE CR:,LF:,'SELECT DRIVE (0)?',:FF * QUERYM20 BYTE CR:,LF:,'DIAG, FMATTER OR TECH TEST (D,F,T)?',:FF * QUERYM30 BYTE CR:,LF:,'DEV AD (:0A)?:',:FF * QUERYM40 BYTE CR:,LF:,'TSTS (A-H)?',:FF * QUERYM50 BYTE CR:,LF:,'CYLS?',:FF * QUERYM60 BYTE CR:,LF:,'WRITE PRE COMP CYL?',:FF * QUERYMS0 BYTE CR:,LF:,'SHORT TEST-CYLS?',:FF * QUERYM70 BYTE CR:,LF:,'HDS?',:FF * QUERYM80 BYTE CR:,LF:,'SECTORS/TRACKS (16)?',:FF * QUERYM90 BYTE CR:,LF:,'WORDS/SECTOR (256)?',:FF * QUERYMA0 BYTE CR:,LF:,'PATN (:6DB6)?:',:FF * QUERYMB0 BYTE CR:,LF:,'UNITS (0-',UNITS+'0'-1,')?',:FF * QUERYMC0 BYTE CR:,LF:,'SAVE DATA (Y OR N)?',:FF * QUERYMD0 BYTE CR:,LF:,'RUN OPTIONS (:00)?:',:FF * QUERYME0 BYTE CR:,LF:,'UNIT TO FORMAT (0-',UNITS+'0'-1,')?',:FF * TTMS BYTE CR:,LF:,'ENTER:',CR:,LF: TECH TEST QUERY BYTE 'FC,U,C,H,S,IN,LN,DP,OP,CL,CP',CR:,LF:,:FF * TITL CRT/TTY MESSAGES (ERROR FUNC. CODES) ****************************** * * ERROR FUNCTION CODE MESSAGES * ****************************** * ERFC0 BYTE ' (TEST I/O)',:FF * ERFC1 BYTE ' (FORMAT)',:FF * ERFC2 BYTE ' (WRITE)',:FF * ERFC3 EQU $ RESERVED * ERFC4 BYTE ' (READ)',:FF * ERFC5 EQU $ RESERVED * ERFC6 BYTE ' (RD REG)',:FF * ERFC7 EQU $ RESERVED * ERFC8 BYTE ' (VERIFY)',:FF * ERFC9 BYTE ' (SEEK)',:FF * ERFCA EQU $ RESERVED * ERFCB EQU $ RESERVED * ERFCC EQU $ RESERVED * ERFCD EQU $ RESERVED * ERFCE EQU $ RESERVED * ERFCF EQU $ RESERVED * TITL CRT/TTY MESSAGES (ERROR REPORT) ****************************** * * ERROR REPORT MESSAGES * ****************************** * ERMS1 BYTE CR:,LF:,LF:,'ER ',:FF * ERMS2 BYTE ' (FORMATTER)',:FF * ERMS3 BYTE CR:,LF:,'ER AD :',:FF * ERMS4 BYTE 'PASS ',:FF * ERMS5 BYTE 'UNIT ',:FF * ERMS6 BYTE 'TEST ',:FF * ERMS7 BYTE CR:,LF:,'IOB ADDRESS :',:FF * ERMS8 BYTE CR:,LF:,'STATUS :',:FF * ERMS9 BYTE CR:,LF:,'DRIVE STATUS :',:FF * ERMS10 BYTE CR:,LF:,'FUNC :',:FF * ERMS11 BYTE 'CYL ',:FF * ERMS12 BYTE 'HEAD ',:FF * ERMS13 BYTE 'SECT ',:FF * ERMS14 BYTE CR:,LF:,'BUF :',:FF * ERMS15 BYTE 'LEN :',:FF * ERMS16 BYTE 'WDS XFRD :',:FF * ERMS17 BYTE CR:,LF:,'WD IN ERROR :',:FF * ERMS18 BYTE 'EXP :',:FF * L ERMS19 BYTE 'ACT :',:FF * ERMS20 BYTE CR:,LF:,'INT LOC :',:FF * ERMS21 BYTE CR:,LF:,'SECTOR ADDRESS AFTER I/O ',:FF * ERMS22 BYTE CR:,LF:,LF:,'WORD CHAIN IOB :',:FF * ERMS23 BYTE 'WD COUNT :',:FF * ERMS24 BYTE 'BUF AD :',:FF * TITL CRT/TTY MESSAGES (TRAPS) ***************************** * * TRAP 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 * TITL CRT/TTY MESSAGES (MISCELLANEOUS) ****************************** * * MISCELLANEOUS MESSAGES * ****************************** * TALTTL BYTE CR:,LF:,LF:,'ERROR TOTALS',:FF * UNITMG BYTE CR:,LF:,'UNIT' PRUNIT BYTE ' ',:FF * SOFTMS BYTE ' SOFT ',:FF * FIRMS BYTE ' FIRM ',:FF * HARDMS BYTE ' HARD ',:FF * ALLMS BYTE ' ALL ',:FF * ACTHDM BYTE CR:,LF:,'ACT HEADER: ',:FF * EXPHDM BYTE CR:,LF:,'EXP HEADER: ',:FF * ACCRCM BYTE CR:,LF:,'ACT CRC: ',:FF * XPCRCM BYTE CR:,LF:,'EXP CRC: ',:FF * BADTRK BYTE CR:,LF:,LF:,'BAD TRACK: CYL ',:FF * BADTK1 BYTE ' HEAD ',:FF * DUMPMG BYTE CR:,LF:,LF:,'BUFFER DUMP, AT :',:FF * EOT BYTE CR:,LF:,'END OF TEST',CR:,LF:,:FF * PASSMG BYTE CR:,LF:,'PASS ',:FF * STARS BYTE '****',:FF * PMFRL BYTE CR:,LF:,LF:,'BAD TRACKS LIST FROM MANUFACTURER:',:FF * ENDMFR BYTE CR:,LF:,LF:,'END OF BAD TRACKS LIST FROM MANUFACTURER.' BYTE CR:,LF:,: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 * FORMSG BYTE CR:,LF:,'FORMATTING...',CR:,LF:,:FF * FORDMSG BYTE CR:,LF:,'DISK FORMATTED.',CR:,LF:,:FF * LPOT BYTE CR:,LF:,'LINE PRINTER OPTION (Y/[N])?',:FF * TITL I/O BUFFERS ****************************** * * I/O BUFFERS * * BUF - STANDARD BUFFER * * SAVBUF - USER'S SAVE BUFFER * ****************************** * BUF RES 570,0 STANDARD BUFFER * SAVBUF RES 570,0 USER'S SAVE BUFFER * ENDPROG EQU $ THAT'S ALL FOLKES !!!! END SMD PRINTER READY' BYTE CR:,LF:,'KEY IN ANY CHAR TO RESUME...',CR:,LF:,:FF * FORMSG BYTE CR:,LF:,'FORMATTING...',CR:,LF:,:FF * FORDMSG BYTE CR:,LF:,'DISK FORMATTED.',CR:,LF:,:FF * LPOT BYTE CR:,LF:,'LINE PRINTER OPTION (Y/[N])?',:FF * TITL I/O BUFFERS ****************************** * * I/O BUFFERS * * BUFIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII