ASMB,Q,R,C HED FORMT - SPARE,INITIALIZE,VERIFY,FORMAT (FLOPPY),RE-FORMAT NAM FORMT,3,10 92067-16554 REV.2040 800717 SPC 1 ****************************************************************** * * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1979. ALL RIGHTS * * * RESERVED. NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED, * * * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT* * * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY. * ****************************************************************** SPC 2 ****************************************************************** * * * NAME: FORMT * * SOURCE: 92067-18554 * * RELOC: 92067-16554 * * PGMR: KFH & JJC & WL & BC * * * ****************************************************************** SPC 2 * * TURN - ON SEQUENCE: * * FO,DISC LU, FILL * / VE,DISC LU \ *BC * RU,FORMT [,[OPLU] [,< IN,DISC LU > ]] * \ RE,DISC LU / *BC * SP,DISC LU,TRACK * * WHERE: * * OPLU IS THE LU OF THE OPERATOR'S CONSOLE * FO MEANS FORMAT A FLOPPY DISC * DISC LU LU OF A TYPE 32 DISC SUBCHANNEL * FILL SECTOR FILL VALUE FOR A FLOPPY (=INTERLEAVE-1) * IN MEANS INITIALIZE AN ENTIRE DISC SUBCHANNEL * SP MEANS SPARE ONE TRACK ON A DISC LU * VE MEANS VERIFY A DISC LU (NON-DESTRUCTIVE) *BC * RE MEANS RE-FORMAT A DISC LU (RESET ALL D,S,P BITS) *BC * TRACK BAD LOGICAL TRACK TO BE SPARED, ATTEMPTING TO PRESERVE DATA SKP * * EXTERNAL ENTRY POINTS * EXT RMPAR,EXEC,GETST,PARSE,.MVW EXT ICAPS,LOGLU *BC EXT $DATC,.OPSY,LIMEM,LURQ *WL EXT EQTRQ * * DRIVER LIBRARY ROUTINES * EXT XSEEK, XADRC, XFMSK, XDRED, XEND, XRDOF EXT XRDFS, XDWRT, XINIT, XVRFY, XRCAL, XSTAT EXT XSPAR, XFRMT, XLGAD, XTTBL, XDSJ *WL * SPC 2 A EQU 0 B EQU 1 SUP SKP * * * MAINLINE CODE FOR FORMT * * FORMT STB OPLU JSB RMPAR DEF *+2 DEF OPLU * JSB GETST GET THE RUN STRING-PARSE LATER DEF *+4 DEF RBUFR DEF N64 MAX INPUT (CHARS) DEF TEMP1 XMISSION LOG(CHARS) * * SET UP THE OPERATOR'S LU * LDA OPLU GET PARAMETER 1 SZA,RSS SPECIFIED? ISZ OPLU NO,SO DEFAULT TO LU 1 AND B1774 SZA NUMERIC? CLA,INA,RSS NO,ASCII - USE DEFAULT LU 1 * LDA OPLU SET ECHO BIT IN IOR B400 OPERATOR LU WORD. STA OPLU * * GET MEMORY BOUNDS AND SET \BUFI & \BUFA; TASK PROCESSORS * WILL CHECK FOR THE CORRECT MEMORY REQUIREMENTS * JSB LIMEM *WL DEF *+4 FETCH FREE MEMORY BOUNDS *WL DEF P0 *WL DEF FWA *WL DEF BSIZE NO. OF WORDS AVAILABLE FOR BUFFER *WL LDA FWA *WL STA \BUFI AND SAVE ADA P16 SKIP HPIB COMMAND BUFFER STA \BUFA AND SAVE START OF DATA BUFFER LDA N16 ADJUST THE COMMAND BUFFER ADA BSIZE OUT OF THE MAX BUFFER AVAILABLE STA BSIZE TO MAKE CLRBF SIMPLER * * IN RTE-IV, PERFORM CORE LOCK TO PREVENT SWAP * JSB .OPSY CHECK THE SYSTEM TYPE *WL CPA N29 L20 SYSTEM? *BC LDA N31 YES, MAKE SYS TYPE N31 *BC CPA N17 NO. RTE-6? *BC LDA N9 YES, MAKE SYS TYPE N9 *BC STA \SYST SAVE IT. *WL CPA N9 VALUE FOR RTE-IV *WL RSS *WL JMP PRSE SKIP IF RTE-L *WL LDB .DATC,I ALSO CHECK *BC ADB N2001 OP SYS DATE-NEED CURRENT DRIVERS SSB,RSS MUST BE 2001 OR LATER *WL JMP DATOK DATE OK- CONTINUE * LDB P26 GET PTR FOR "OUTDATED..SOFTWARE" JSB PROMT NOT LATEST DRIVERS,& EQT LOCK SOFTWARE JMP \XOUT ABORT-OUTDATED SYS SOFTWARE * DATOK LDA P12 STA PTCH7 SET MS07 LENGTH FOR RTE-IV * JSB EXEC DEF *+3 DEF P22 DEF P1 * * * PARSE THE RUN PARAMETERS * PRSE JSB PARSE GET TYPE OF RUN PARAMETERS... DEF *+4 DEF RBUFR BUFFER TO PARSE DEF TEMP1 XMISSION LOG FROM GETST DEF PSBUF 33 WORD RESULT BUFF * CLB TYPE CODE: 0/1/2=NULL/NUM/ASCII LDA PTYP2 TYPE OF "TASK" PARM CPA P2 IS IT ASCII? INB YEP - WHAT WE WANTED! RUPM3 RBL SAVE THAT BIT LDA PTYP3 GET TYPE OF "DISC LU" CPA P1 IS IT NUMERIC?? INB YEP-NUMERIC IS OKAY RUPM4 RBL SAVE BIT LDA PTYP4 GET TYPE OF TRK#,#FILL PARM CPA P1 IS IT NUMERIC?? INB YEP- OK SAVEB RSS SKIP THE CLB SKP * * INITIALIZE ALL PARAMETERS BEFORE NEXT TASK * ITASK CLB STB BATCH CLEAR/SAVE BATCH FLAG CLA STA INDEX STA \MODE STA PHASE STA \DTYP STA LEN ********ANY MORE? ******************************************************* * * CLB LDA BATCH ISSUE PROMT? AND P4 SZA JMP SET2 NO JSB PROMT ASK "TASK?" CLE TASK? JSB PTASK PARSE & BRANCH TO APPROPRIATE PROCESSOR JMP EXIT EN OR /E JMP FPROC FORMAT JMP IPROC INIT JMP SPROC SPARE JMP VPROC VERIFY *BC JMP RPROC RE-FORMAT *BC * SET2 LDA PARM2 MOVE 2ND RUN PARAMETER TO STA RBUFR PROPER BUFFER CCE DISABLE CALL TO TARGT BY PTASK JMP TASK? AND CONTINUE * * COME HERE AT END OF FPROC,IPROC,VPROC,SPROC,RPROC TO SEE * WHATS NEXT * DONE? JSB UNLOK UNLOCK \DLU'S EQT IF IT'S LOCKED JSB ULKLU UNLOCK DISC LU'S IF PREVIOUSLY LOCKED * ONLY 'FO' COMMAND LOCKS FLOPPY LU'S LDB BATCH DONE WITH FORMT OR TRY ANOTHER TASK? CPB P7 JMP EXIT ONLY ONE TIME AROUND JMP ITASK ASK FOR MORE * .DATC DEF $DATC+0 SKP ********************************************************************** ********************************************************************** ** FPROC ** SPC 1 * FPROC MAKES 4 PASSES OVER THE FLOPPY DISC WITH BIT PATTERNS * C6,63,6D,& 88 (HEX), EACH PASS WITH AN INTERLEAVE VALUE OF * OF 1, TYPE 2, AND OVERRIDING ANY OLD FORMAT. A SEEK TO CYL 0, * HEAD 0 IS DONE FIRST, FOLLOWED BY THE FORMAT COMMAND TO THE * CONTROLLER (15-20 SECS), AND A VERIFY COMMAND FOR 4620 SECTORS * (30 SECS). ON VERIFY ERRORS, THE OFFENDING CYL/HEAD IS SAVED * IN TABLE BFTBL, AND THE VERIFY IS CONTINUED WITH THE NEXT * TRACK UNTIL THE ENTIRE FLOPPY IS DONE. THIS IS REPEATED FOR * EACH BYTE PATTERN. * * RETRIEVING THE BAD TRACK ADDRESSES FROM BFTBL, A WRITE INITIALIZE * IS DONE TO EACH BAD TRACK WITH THE D-BIT SET. (DATA BYTE =0) * * THE FIFTH AND FINAL FORMAT/VERIFY COMBINATION (9 MINS?) IS DONE * WITH BYTE PATTERN = 0, THE INTERLEAVE VALUE \FILL SPECIFIED BY * THE USER , TYPE = 2, AND THE OVERRIDE OLD FORMAT BIT OFF. ANY * ERRORS ON THE VERIFY CAUSE THE WARNING MESSAGE MES23 TO BE ISSUED * AT THE END OF THE TASK. ONLY THE # GOOD TRACKS ARE VERIFIED. * * THE NUMBER OF GOOD TRACKS IS ALWAYS DISPLAYED AT THE END OF FPROC. * FPROC CLA SPECIFY FLOPPY DISC ONLY JSB LU? AND RETRIEVE \DLU * LDB P2 STB INDEX SET FOR EXPLN LDA BATCH PROMT WITH WARNING? CPA P7 JMP FPR2 NO JSB PROMT ASK "DO YOU REALLY WANT TO FORMAT THIS DISC?" * FPR1 JSB PRESP PARSE RESPONSE JMP YNERR INVALID ANSWER NOP EN OR /E JMP DONE? NO JMP FPR2 YES NOP " ",CR YNERR JSB EXPLN ?? - TELL 'EM WHAT WE WANT JMP FPR1 AND GET AGAIN * FPR2 LDB P3 SET INDEX FOR EXPLN STB INDEX CLA LDB P128 SET DATA XFER SIZE FOR INIT CMD. STB LEN NOTE- INIT ONLY SUPPORTS 1 SECTOR. LDB P145 WANT 16WD CMD+145WD DATA BUFFER FOR * THE TRACK MAP TABLE(161 WDS)FOR "LKLUS". JSB CLRBF CLEAR BUFFER & CHECK ITS SIZE * LDB BATCH WAS THE SECTOR INTERLEAVE VALUE SPECIFIED SLB,RSS IN THE RUN STRING? JMP FPR3 NO, SO PROMT LDA PARM4 ELSE GET IT AND JMP SAVEF SAVE THE FILL VALUE * FPR3 LDB P3 DISPLAY: JSB PROMT "# OF FILL SECTORS?" * FPR4 JSB PRESP PARSE RESPONSE JMP FPR5 POSSIBLY NUMERIC JMP DONE? EN OR /E NOP NO NOP YES NOP " ",CR FLERR JSB EXPLN ?? - SEND "ENTER SECTOR INTERLEAVE VALUE... JMP FPR4 AND GET AGAIN * FPR5 JSB BIDEC CONVERT RESPONSE TO BINARY JMP FLERR INVALID DIGIT SAVEF INA CONVERT #FILL SECS TO INTERLEAVE VALUE STA \FILL SAVE THE INTERLEAVE # ADA N30 MUST BE <=29 FOR HP FORMAT SSA,RSS IS IT? JMP FLERR NOPE! * LDA \DLU GET THE FLOPPY LU TO FORMAT LDB \SYST GET OP SYS TYPE CPB N9 IS IT RTE-IV?? JMP LOKLU YES-GO LOCK ALL LU'S OF FLOPPY JSB ELOCK CALL (DUMMY) EQT LOCK FOR RTE-L RSS WHICH CHECKS FORMAT FOR STAND ALONE PROG LOKLU JSB LKLUS RTE-IV:DON'T LOCK EQT-LOCK ALL FLOPPY LU'S * WARNING-THE LKLUS ROUTINE IS FOR RTE-IV ONLY. IT REFERENCES * THE DEVICE REFERENCE TABLE DIRECTLY AND TRACK MAP TBL DIRECTLY. CCB STB WARNG NO WARNING NECESSARY YET LDA P6 SET MODE STA \MODE CLE JSB DISKD SSA ANY PROBLEMS? JMP BADFL TELL 'EM TO RETRY OR CHUCK THE DISC * LDA BADFT DETERMINE THE # OF GOOD TRACKS CMA,INA BY GETTING TOTAL# & SUBTRACTING # BAD ADA \DNTR ONES DETECTED JSB ASDEC CONVERT THAT # TO ASCII LDB MS06. AND STORE IN MESSAGE JSB .MVW DEF P2 NOP * LDB P6 DISPLAY JSB PROMT "# OF GOOD TRACKS = XXXX" JMP DONE? * BADFL LDB P24 DISPLAY: JSB PROMT "MAX OF 20 BAD TRACKS EXCEEDED" JMP DONE? * ** END FPROC BLOCK ** ********************************************************************** ********************************************************************** SKP ********************************************************************** ********************************************************************** ** IPROC ** SPC 1 * IPROC - ASKS IF OK TO DESTROY DATA ON SUBCHANNEL (NON-BATCH MODE) * INITIALIZES THE HARD-DISC SUBCHANNEL \DLU * CLEANS UP SPARES AT THE END FIRST * DISPLAYS THE LOGICAL TRACK # BEING INIT'D IN THE SWREG * IPROC CLA,INA SPECIFY HARD DISCS ONLY JSB LU? * LDA \SYST SEE RTE-L:OK TO INIT LU2 THERE *BC CPA N31 JMP IPR0 * LDA \DLU CPA P2 IS IT THE SYS DISC?? JMP LUERR DON'T ALLOW INIT OF LU2 CPA P3 LU3? *BC JMP LUERR DON'T ALLOW INIT OF LU3 *BC * IPR0 LDA P6 ARE WE IN BATCH? CPA BATCH (CONVERT 6 TO 7 FOR INIT MODE) ISZ BATCH INA CPA BATCH WHERE NO OPERATOR INTERVENTION JMP IPR2 IS DESIRED? YES * LDB P2 OTHERWISE ASK FIRST STB INDEX SAVE FOR EXPLN IF NECESSARY LDB P5 DISPLAY: JSB PROMT "DATA WILL BE DESTROYED, OK TO PROCEED?" IPR1 JSB PRESP PARSE RESPONSE JMP IPERR INVALID RESPONSE NOP EN OR /E JMP DONE? NO JMP IPR2 YES NOP " ",CR IPERR JSB EXPLN ?? AND ERRORS JMP IPR1 TRY AGAIN * * * IPR2 CLA LDB \D#WT AND BUFFER SIZE STB LEN SAVE I/O TRANSFER LENGTH JSB CLRBF CLEAR BUFFER WITH SIZE CHECKS * CCA STA \BADH SIGNAL NO BAD TRACK HEADER YET JSB SPINT SPARE CLEANUP-LOCK EQT EACH TIME SSA ERROR IN INIT SPARES?? JMP DONE? YES, SO REQUEST NEW TASK LDA \DNTR GET THE # OF TRACKS CMA,INA FOR THIS SUBCHANNEL STA SLOOP AND SET AS THE LOOP COUNTER CLA SET THE STARTING TRACK # STA \TRAK TO INITIALIZE LDA P3 STA \MODE SET DRIVER IN INIT. TRACKS MODE * IPR4 LDA \TRAK DISPLAY TRACK # OTA 1 IN SW REG JSB ELOCK LOCK THE EQT CLE SET TO WRITE JSB DISKD WRITE INIT THE TRACK JSB UNLOK UNLOCK THE EQT LDA \RET GET THE RETURN STATUS FROM DRVR SSA CHECK \RET STATUS JMP DONE? ERROR * ISZ \TRAK INCREMENT THE TRACK # ISZ SLOOP AND THE LOOP COUNTER JMP IPR4 CONTINUE * LDA USED# GET # OF SPARES USED OR DEF. CMA,INA TRACKS REMAINING ON SUBCHANNEL ADA \DNSP JSB SPSAV AND DISPLAY * JMP DONE? DONE WITH FORMT OR TRY A NEW TASK? * ** END IPROC BLOCK ** ********************************************************************** ********************************************************************** SKP ********************************************************************** ********************************************************************** ** SPROC ** SPC 1 * * SPROC SPARES ONE TRACK ON SUBCHANNEL \DLU * ATTEMPTS TO PRESERVE ALL DATA ON THE DEFECTIVE TRACK BY * READING ONE SECTOR AT A TIME * ISSUES READ WITH OFFSET REQUESTS AT +(0,10,20,30,40,50,60) * AND -(10,20,30,40,50,60) IN ORDER TO RETRIEVE THE DATA * SPROC CLA,INA INDICATE A HARD DISC JSB LU? AND GET THE DISC LU WITH CHECKING DONE * CLA LDB \D#WT GET TRACK SIZE STB LEN AND SAVE AS TRANSFER LENGTH JSB CLRBF CHECK BUFFER SIZE & CLEAR * LDA \DNSP GET # SPARES ALLOCATED SZA JMP SP0 CONTINUE LDB P12 ELSE TELL 'EM THAT THE DISC LU IS OUT OF SPARES JSB PROMT SPARES JMP DONE? AND TRY AGAIN * SP0 CCA ADA \DNTR GET LAST TRK# ON THIS SUBCHANNEL JSB ASDEC AND CONVERT TO ASCII LDB XP04. JSB .MVW NOW MOVE INTO EXPL'N MESSAGE IN CASE OF ?? DEF P2 NOP * CCA STA \BADH SIGNAL NO BAD TRACK HEADER YET STA WARNG AND NO WARNING MESSAGE YET LDA P4 STA INDEX SET FOR EXPLN MESSAGES * LDB BATCH ALL PARM'S SPECIFIED? SLB,RSS JMP SP1 NO, SO PROMT * LDA PARM4 ELSE GET RUN PARAMETER JMP SAVE4 AND SAVE * SP1 LDB P4 JSB PROMT DISPLAY "TRACK TO BE SPARED?" * SP2 JSB PRESP PARSE RESPONSE JMP SP3 POSSIBLY NUMERIC JMP DONE? /E OR EN NOP NO NOP YE TRKER JSB ERR13 " ",CR - ISSUE ERROR MESSAGE JSB EXPLN ?? - ISSUE MESSAGE JMP SP2 AND TRY AGAIN * SP3 JSB BIDEC CONVERT RESPONSE TO NUMERIC JMP TRKER INVALID NUMBER SAVE4 STA \TRAK SAVE IT CMA CHECK IF IT LIES WITHIN ADA \DNTR THE SUBCHANNEL BOUNDS SSA JMP TRKER NOPE! * * JSB ELOCK LOCK THE EQT OF \DLU * * * LDA P5 STA \MODE SET THE PROPER MODE CCE JSB DISKD SSA CHECK \RET STATUS JMP DONE? NOT GOOD * LDA STRAK GET THE # OF THE SPARE THAT WAS USED INA CMA,INA ADA \DNTR AND DETERMINE THE # SPARES LEFT ADA \DNSP ON THIS SUBCHANNEL JSB SPSAV DISPLAY IT * JMP DONE? ALL DONE? * ERR13 NOP LDB P13 DISPLAY: JSB PROMT "INVALID TRACK #" JMP ERR13,I * ** END SPROC BLOCK ** ********************************************************************** ********************************************************************** SKP ********************************************************************** ********************************************************************** ** RPROC ** * *BC * RE-FORMAT A DISC LU, CLEAN OFF ALL S,D,P BITS *BC * IF IN RTE IVB AND LU 2,3 IS TO BE ACCESSED, USER MUST BE *BC * LU1 (NON-SESSION) OR CAPABILITY 60 (SESSION) *BC * AND IN INTERACTIVE MODE *BC * *BC * RTE-L ACCESS IS NOT RESTRAINED AT ALL *BC * *BC * *BC RPROC CLA,INA HARD DISC ONLY *BC JSB LU? *BC * *BC LDB BATCH *BC CPB P6 *BC ISZ BATCH IF 6,MAKE IT 7 *BC * *BC * *BC LDB BATCH IF BATCH GO AROUND *BC CPB P7 *BC JMP RPR3 *BC * *BC LDB P2 *BC STB INDEX *BC LDB P5 PRINT... *BC JSB PROMT "DATA WILL BE DESTROYED, OK TO *BC * PROCEED?" *BC RPR1 JSB PRESP GET RESPONSE *BC JMP RPR2 INVALID ANSWER *BC NOP *BC JMP DONE? NO *BC JMP RPR3 YES *BC NOP *BC RPR2 JSB EXPLN EXPLAIN POSSIBLE ANSWERS *BC JMP RPR1 GO BACK *BC * *BC RPR3 LDA \SYST RTE-L ? *BC CPA N31 *BC JMP ROK YES - GO AROUND CHECKS *BC * *BC LDA \DLU WHAT DISC LU ARE WE TALKING TO? *BC CPA P2 LU2 ? *BC JMP MGR.S YES - CHECK FOR A CAPABILITY 60 *BC CPA P3 LU3? *BC RSS YES *BC JMP ROK NO - SKIP FURTHER CHECKS *BC * *BC MGR.S LDB BATCH *BC CPB P7 *BC JMP BNC YES - LU2,3 ALTERATION *BC * *BC JSB ICAPS CHECK SESSION CAPABILITY LEVEL *BC DEF RTN *BC DEF IDUMY *BC RTN STA ICPSE *BC CPA P60 QUALIFIED USER? (CAP =60) *BC JMP MOK YES - NO MORE CHECKS NEEDED *BC SZA 0 MEANS NON-SESSION *BC JMP BNC YES, WRONG CAPABILITY LEVEL *BC * *BC JSB LOGLU NO, CHECK FOR LU1 ONLY *BC DEF RTN1 *BC DEF IDUMY *BC RTN1 CPA P1 LU1? *BC JMP MOK YES *BC * *BC BNC LDB P27 *BC JSB PROMT PRINT... *BC JMP DONE? UNAUTHORIZED LU2,3 ALTERATION *BC * MOK LDB P28 PRINT.... *BC JSB PROMT "DO YOU REALLY WANT TO *BC * RE-FORMAT THE SYSTEM DISC?" *BC LDB P2 *BC STB INDEX *BC M.1 JSB PRESP PARSE RESPONSE *BC JMP M.2 NUMERIC RESPONSE *BC NOP EN OR /E *BC JMP DONE? NO *BC JMP ROK YE *BC NOP " "CR *BC M.2 JSB EXPLN ?? *BC JMP M.1 TRY AGAIN *BC * *BC * *BC * ALL CHECKS HAVE BEEN MADE FOR AUTHORIZED ACCESS. NOW IT'S OK *BC * TO GO AHEAD *BC * *BC ROK CLA *BC LDB \D#WT GET THE # OF WORDS/TRACK *BC STB LEN SET LENGTH TO THAT *BC JSB CLRBF CLEAR THE BUFFER *BC * *BC CCA ALLOW FOR HEDDER ON 1ST ERROR *BC STA \BADH *BC * *BC LDA \DNTR GET # OF TRACKS *BC ADA \DNSP ADD THE # OF SPARES *BC CMA,INA *BC STA LPCTR SET THE LOOP COUNTER *BC * *BC CLA SET LOGICAL TRACK TO 0 *BC STA \TRAK *BC LDA P7 SET MODE NUMBER TO 7 *BC STA \MODE *BC * *BC RPR7 LDA \TRAK DISPLAY LOGICAL TRK # IN S.R. *BC OTA 1 *BC JSB ELOCK LOCK THE EQT *BC CLE *BC JSB DISKD RE-FORMAT THE TRACK *BC JSB UNLOK UNLOCK THE EQT *BC ISZ \TRAK BUMP TRACK # *BC ISZ LPCTR DONE YET? *BC JMP RPR7 NO. DO NEXT TRACK *BC JMP DONE? YES *BC * *BC * CONSTANTS *BC * *BC IDUMY BSS 1 *BC ICPSE BSS 1 *BC LPCTR BSS 1 *BC P60 DEC 60 *BC P27 DEC 27 *BC P28 DEC 28 *BC P29 DEC 29 *BC * *BC ** END RPROC BLOCK ** ********************************************************************** ********************************************************************** SKP ********************************************************************** ********************************************************************** ** VPROC ** * *BC * VERIFY (NON-DESTRUCTIVLY) A DISC LU *BC * *BC VPROC CCA INDICATE DON'T CARE *BC JSB LU? SO FAR AS HARD OR FLOPPY DISC *BC * *BC LDB BATCH *BC CPB P6 IF 6, MAKE IT 7 *BC ISZ BATCH *BC * *BC CLA *BC LDB \D#WT SET BUFFER FOR A FULL TRACK *BC STB LEN *BC JSB CLRBF CLEAR THE BUFFER *BC CCA ALLOW FOR MESSAGE HEDDER *BC STA \BADH *BC LDA \DNTR GET THE NUMBER OF TRACKS *BC CMA,INA AND SET THE LOOP COUNTER *BC STA LPCTR *BC CLA SET FOR LOGICAL TRACK 0 *BC STA \TRAK *BC LDA P8 *BC STA \MODE SET MODE # TO 8 *BC * *BC LDA \D#ST GET # OF SECTORS PER TRACK *BC CPA P30 FLOPPY? *BC JMP VFL YES SO GO AROUND *BC * *BC VPR1 LDA \TRAK HARD DISC.. *BC OTA 1 SHOW LOGICAL TR# IN S.R. *BC JSB ELOCK LOCK THE EQT *BC CCE *BC JSB DISKD VERIFY A TRACK *BC JSB UNLOK UNLOCK THE EQT *BC ISZ \TRAK BUMP THE TRACK # *BC ISZ LPCTR DONE YET? *BC JMP VPR1 NO , GO DO THE NEXT TRACK *BC JMP DONE? YES *BC * *BC * FLOPPY VERIFY *BC * *BC VFL LDA \DLU ONLY USE LU LOCK FOR RTEIVB *BC LDB \SYST *BC CPB N9 *BC JMP LK *BC JSB ELOCK *BC RSS *BC * *BC LK JSB LKLUS *BC LK1 LDA \TRAK *BC OTA 1 S.R. SHOWS LOGICAL TR # *BC CCE *BC JSB DISKD VERIFY THE FLOPPY TRACK *BC ISZ \TRAK BUMP THE TRACK # *BC ISZ LPCTR DONE YET? *BC JMP LK1 NO. GO DO NEXT ONE *BC JMP DONE? YES *BC * *BC * *BC * *BC * *BC * *BC * *BC * *BC ** END VPROC BLOCK ** ********************************************************************** ********************************************************************** SKP ********************************************************************** ********************************************************************** ** TERMINATE FORMT ** SPC 1 EXIT CLB,RSS SET FOR PROPER MESSAGE * * ABNORMAL TERMINATION EXIT * \XOUT CLB,INB ADB P15 JSB PROMT DISPLAY "FORMT -------" * LDA \SYST CHECK FOR AN RTE-IV *BC CPA N9 RSS JMP TERM * JSB EXEC REMOVE CORE LOCK DEF *+3 DEF P22 DEF P0 * TERM JSB EXEC DEF *+2 DEF P6 HED FORMT SUBROUTINES. ******************************** ********************************************************************** ********************************************************************** ** LU? ** SPC 1 * LU?: PROMPT "DISC LU?", UNLESS SPECIFIED IN A RU PARAMETER * DOES VALIDITY CHECKS ON THE LU - TYPE 32 WITH #SECTORS/ * TRACK = 30,32,48,OR 64 * GETS THE SUBCHANNEL DEF'N FOR \DLU (CALLS \SETD) * ISSUES AN ERROR MESSAGE ON AN ILLEGAL RESPONSE OR LU * ISSUES AN EXPLANATION MESSAGE AFTER A ?? RESPONSE OR ERROR * * A-REG ON ENTRY = 0/1 FOR FLOPPY DISC/HARD DISC * -1 FOR DON'T CARE *BC * LU? NOP STA \DTYP SAVE DISC REQUEST TYPE CLB,INB SET FOR EXPLN STB INDEX * LDB BATCH RBR SLB,RSS JMP LU1? ISSUE PROMPT NOW LDA PARM3 ELSE GET 3RD RUN JMP SAVE3 * LU1? CLB,INB JSB PROMT "DISC LU?" * LU2? JSB PRESP READ & PARSE REPSONSE JMP LU3? POSSIBLY NUMERIC JMP ITASK EN OR /E NOP NO NOP YE LUERR JSB ERR14 " ",CR JSB EXPLN ?? - PRINT EXPLANATION (WITH ERR14 ALSO) JMP LU2? AND TRY AGAIN * LU3? JSB BIDEC CONVERT ASCII # JMP LUERR INVALID DIGIT SAVE3 STA \DLU SAVE VALUE AND B7700 MASK OFF LOWEST 6 BITS TO SZA MAKE SURE LU < 64 JMP LUERR IT ISN'T * JSB EXEC EXEC CALL-NO ABORT: GET DRVR DEF *+6 TYPE CODE AND DEF P13NA AND SUBCHANNEL DEF \DLU BASE ON LU DEF IEQT5 DEF IEQT4 DEF \DSUB JMP LUERR ERROR RETURN * LDA \DSUB GET THE SUBCH AND B37 MASK ONLY THE SUBCH(SIGN MEANS UP\DN) STA \DSUB SET IT LDA IEQT5 EXTRACT TYPE ALF,ALF AND B77 LDB \SYST IS IT RTE-L? *WL CPB N31 *WL JMP RTL YES *WL CPA B32 CORRECT TYPE FOR RTE-4? *WL JMP LUOK YES, CONTINUE. *WL JMP LUERR NO,ASK AGAIN. *WL RTL ADA M30 *WL SSA LESS THAN 30B? *WL JMP LUERR YES, TRY AGAIN. *WL ADA M10 *WL SSA,RSS GREATER THAN 37B? *WL JMP LUERR YES, ASK AGAIN. *WL * LUOK JSB \SETD GET SUBCHANNEL DEF'N & EXTRACT PARAM'S*WL LDA \DNTR GET TRACK SIZE SZA,RSS IF ZERO JMP LUERR THEN ISSUE ERROR LDA \D#ST GET # SECTORS/TRACK LDB \DTYP AND DISC TYPE REQUIRED SSB SIGN NEGATIVE FOR DON'T CARE? *BC JMP DC YES *BC SLB JMP HARDD HARD TYPE REQUIRED FOR TASK REQUESTED CPA P30 CORRECT # FOR A FLOPPY? JMP LU?,I YES JMP LUERR NO,TRY AGAIN * HARDD CPA P32 7910 SIZE? RSS CPA P48 7905/06/20 SIZE? RSS CPA P64 7925 SIZE? JMP LU?,I OK,RETURN FOR FURTHER CHECKS JMP LUERR ELSE TRY AGAIN * ERR14 NOP LDB P14 DISPLAY: JSB PROMT "INVALID DISC LU" JMP ERR14,I * *BC DC NOP DON'T CARE ABOUT HARD/FLOPPY *BC CPA P30 FLOPPY? *BC RSS YES *BC CPA P32 7910? *BC RSS YES *BC CPA P48 7905/6/20? *BC RSS YES *BC CPA P64 7925? *BC RSS YES *BC JMP LUERR NONE OF THE ABOVE. INVALID LU *BC JMP LU?,I OK. IT'S ONE OF THE ABOVE *BC * P13NA OCT 100015 OPCODE FOR EXEC 13+NO ABORT * ** END LU? ** ********************************************************************** ********************************************************************** SKP ********************************************************************** ********************************************************************** ** PTASK ** SPC 1 * PTASK READS AND PARSES RESPONSES TO THE TASK? QUERY * FOR ?? OR INVALID RESPONSES, THE EXPLANATION MESSAGE * IS DISPLAYED AND THE RESPONSE OBTAINED & REPARSED * CHECKS ONLY THE FIRST 2 CHARACTERS OF A RESPONSE, * WHICH MUST BE LEFT-JUSTIFIED * E-REG = 0/1 FOR ENABLING/DISABLING TARGT CALL - DEPENDS ON * PRESENCE OF PARM2 IN RUN STRING * * RETURN POINTS: (P+1) EN OR /E * (P+2) FO * (P+3) IN * (P+4) SP * (P+5) VE *BC * (P+6) RE *BC * PTASK NOP SEZ,RSS IF E=1 THEN SKIP TARGT CALL * PTAS0 JSB TARGT READ RESPONSE INTO RBUFR CLB LDA RBUFR CHECK FOR VALID RESPONSES TO TASK? PROMPT CPA "EN" RSS CPA "EX" RSS CPA "/E" JMP EANS EN OR /E OR EX CPA "FO" JMP FANS FO(RMAT) CPA "IN" JMP IANS IN(ITIALIZE) CPA "SP" JMP SANS SP(ARE) CPA "VE" *BC JMP VANS VERIFY *BC CPA "RE" *BC JMP RANS RE-FORMAT *BC * * FOR ?? OR ANY OTHER REPOSNSE ASIDE FROM THE ABOVE, DISPLAY * JSB EXPLN "ENTER FO(RMAT),"IN(ITIALIZE),SP(ARE),EN" JMP PTAS0 AND TRY AGAIN * RANS ISZ PTASK SET APPROPRIATE RETURN POINTS *BC VANS ISZ PTASK *BC SANS ISZ PTASK IANS ISZ PTASK FANS ISZ PTASK EANS JMP PTASK,I * "EN" ASC 1,EN "EX" ASC 1,EX "/E" ASC 1,/E "FO" ASC 1,FO "IN" ASC 1,IN "SP" ASC 1,SP "VE" ASC 1,VE *BC "RE" ASC 1,RE *BC * ** END PTASK ** ********************************************************************** ********************************************************************** SKP ********************************************************************** ********************************************************************** ** PRESP ** SPC 1 * PRESP READS AND PARSES RESPONSES TO THE VARIOUS QUERIES * INTERCEPTS EN,/E,NO,YE," "CR,AND ?? RESPONSES WITH * THE FOLLOWING RETURN POINTS: (P+1) NUMERIC, OR ERROR * (P+2) EN OR /E * (P+3) NO * (P+4) YE * (P+5) " ",CR * (P+6) ?? * PRESP NOP JSB TARGT READ RESPONSE INTO RBUFR * LDA RBUFR CHECK FOR VALID KNOWN RESPONSES CPA "/E" RSS CPA "EX" RSS CPA "EN" JMP ERES /E OR EN CPA "NO" JMP NRES NO CPA "YE" JMP YRES YE CPA "??" JMP ?RES ?? * JSB DFLT JMP PRESP,I NONE OF THE ABOVE - EITHER NUMERIC OR ERRONEOUS RSS " ",CR * ?RES ISZ PRESP SET THE APPROPRIATE RETURN POINTS ISZ PRESP YRES ISZ PRESP NRES ISZ PRESP ERES ISZ PRESP JMP PRESP,I * "NO" ASC 1,NO "YE" ASC 1,YE "??" ASC 1,?? * ** END PRESP ** ********************************************************************** ********************************************************************** SKP ********************************************************************** ********************************************************************** ** SPINT ** SPC 1 * SPINT CALLS THE TYPE32 DRIVER TO INITIALIZE ALL THE SPARES ON * THE CURRENT SUBCHANNEL PRIOR TO WRITING ANY DATA TO THEM. * SPINT NOP LDA P4 STA \MODE SET DRIVER INTO SPARE CLEANUP MODE * CLA STA \SEC# STA USED# INIT # SPARES USED LDA \DNTR STA \TRAK GET FIRST SPARE ON THIS SUBCHANNEL * LDB \DNSP SZB,RSS RETURN IF NO JMP SPINT,I SPARES ALLOCATED * CMB,INB STB N#SP SET LOOP COUNTER * NXTSP LDA \TRAK OTA 1 DISPLAY IN SWITCH REG JSB ELOCK LOCK THE EQT CLE JSB DISKD GO INIT THIS TRACK JSB UNLOK UNLOCK THE EQT ISZ \TRAK NEXT TRACK LDA \RET GET THE DRIVER'S STATUS RET SSA A=\RET STATUS FROM DRIVER JMP SPINT,I RETURN W/ ERROR * ISZ N#SP JMP NXTSP NOT DONE * JMP SPINT,I RETRUN * ** END SPINT ** ********************************************************************** ********************************************************************** SKP ********************************************************************** ********************************************************************** ** PROMT ** SPC 1 * PRINTS ALL PROMPTS AND MESSAGES BASED ON AN INDEX CONTAINED * IN THE B-REG ON ENTRY - IF NEGATIVE, THEN DON'T CALL \BLIN * PROMT NOP CLE,SSB PRINT A BLANK LINE? CMB,CCE,INB NO AND SET B POSITIVE STB IDXPR SAVE MESSAGE INDEX SEZ,RSS SKIP IF NEGATIVE JSB \BLIN PRINT A BLANK LINE FIRST * LDB IDXPR GET INDEX AGAIN LDA PRMLN GET WORD LENGTH OF MESSAGE ADA B BY OFFSETTING INTO TABLE LDA A,I ADB PRMA AND NOW GET THE ADDRESS LDB B,I IN THE SAME FASHION * JSB \DSPL AND DISPLAY IT JMP PROMT,I RETURN * IDXPR NOP PRMLN DEF *+1 MESSAGE LENGTH TABLE P3 DEC 3 P4 DEC 4,20 P9 DEC 9,10 P19 DEC 19 P12 DEC 12 PTCH7 DEC 5 WARNING-SET TO 12 FOR RTE-IV DEC 19 P16 DEC 16 DEC 14 P32 DEC 32,16 P8 DEC 8,8 P7 DEC 7,7 P26 DEC 26,18,13 P15 DEC 15,16,11 P35 DEC 35,15,8,12 DEC 23,24 *BC P21 DEC 21 *BC * PRMA DEF *+1 MESSAGE ADDRESS TABLE DEF MES00 DEF MES01 DEF MES02 DEF MES03 DEF MES04 DEF MES05 DEF MES06 DEF MES07 DEF MES08 MS09. DEF MES09 MS10. DEF MES10 DEF MES11 DEF MES12 DEF MES13 DEF MES14 DEF MES15 DEF MES16 DEF MES17 DEF MES18 DEF MES19 DEF MES20 DEF MES21 DEF MES22 DEF MES23 DEF MES24 DEF MES25 DEF MES26 DEF MES27 *BC DEF MES28 *BC DEF MES29 *BC * ** END PROMT ** ********************************************************************** ********************************************************************** SPC 3 SKP ********************************************************************** ********************************************************************** ** EXPLN ** SPC 1 * PRINTS THE EXPLANATIONS MESSAGES SPECIFIED BY THE * CURRENT VALUE OF INDEX * EXPLN NOP JSB \BLIN PRINT A BLANK LINE * LDB INDEX GET INDEX LDA MSGLN ADA B FIRST GET THE WORD LDA A,I LENGTH OF THE MESSAGE ADB MSGA LDB B,I NOW ITS ADDRESS JSB \DSPL AND DISPLAY IT JMP EXPLN,I RETURN * MSGLN DEF *+1 MESSAGE LENGTH TABLE P33 DEC 33 *BC DEC 9 P6 DEC 6 P14 DEC 14 P13 DEC 13,6 * MSGA DEF *+1 EXPLANATION ADDRESS TABLE DEF XPL00 DEF XPL01 DEF XPL02 DEF XPL03 DEF XPL04 (ASSUMES TRACK # ALREADY STUFFED IN MESSAGE) DEF XPL02 ** END EXPLN ** ********************************************************************** ********************************************************************** SKP ********************************************************************** ********************************************************************** ** SPSAV,CLRBF,\BLIN,\DSPL,\RDIN,TARGT,\DFLT ** SPC 1 * * PRINTS THE REMAINING SPARE TRACKS ON A GIVEN LU * A-REG ON ENTRY = # * SPSAV NOP JSB ASDEC CONVERT # TO ASCII LDB MS10. JSB .MVW STORE IN MESSAGE DEF P2 NOP LDB P10 JSB PROMT DISPLAY "XXXX SPARE TRACKS AVAILABLE" JMP SPSAV,I SPC 4 * * SET B-REG NUMBER OF WORDS AT \BUFA TO A-REG, AND CHECK THAT * BUFFER SIZE >= TRACK SIZE FOR \DLU * CLRBF NOP CMB,INB STB TEMP3 AND SAVE ADB BSIZE SSB IF BUFFER TOO SMALL JMP TOOSM THEN GIVE ERROR * LDB \BUFA CLEAR STA B,I INB BUMP BUFFER ADDRESS ISZ TEMP3 AND LOOP COUNTER JMP CLEAR CONTINUE JMP CLRBF,I DONE * TOOSM LDB P21 DISPLAY JSB PROMT "NOT ENOUGH ROOM FOR TRACK BUFFER" JMP \XOUT AND TERMINATE SPC 4 * * \BLIN NOP OUTPUT A BLANK LINE. LDB DBLNK CLA,INA JSB \DSPL JMP \BLIN,I SPC 4 * * \DSPL NOP DISPLAY MESSAGE ON OPERATOR CONSOLE STA DSPL STB DSPB JSB EXEC DEF *+5 DEF P2 DEF OPLU DSPB NOP DEF DSPL JMP \DSPL,I TO RETURN * DSPL NOP SPC 4 * * READS OPERATOR RESPONSE INTO RBUFR AND REISSUES EXEC * CALL IN CASE OF CONSOLE TIME-OUTS. * \RDIN NOP READS FROM OPERATOR CONSOLE STA DSPL INPUT LENGTH: +/- = WORDS/CHARS INPT JSB EXEC DEF *+5 DEF P1 DEF OPLU RBUFA DEF RBUFR DEF DSPL MAXIMUM INPUT LENGTH SZB,RSS CHECK TRANS. LOG JMP INPT TRY AGAIN FOR ANSWER LDA B GET TRANS. LOG CMA STA \NLNG SAVE NEG. OF TRANS. LOG LESS 1(FOR BIDEC) JMP \RDIN,I RETURN * \NLNG NOP NEG OF TRANSMISSION LOG -1 SPC 4 * * TARGT NOP LDA N8 MAX INPUT LENGTH JSB \RDIN GET RESPONSE JMP TARGT,I YES, RETURN SPC 4 * * CHECKS FOR A SPACE (PSEUDO CARRIAGE RETURN) FROM * THE OPERATOR. (B) IS THE LENGTH OF INPUT IN CHARACTERS * RETURN: (P+1) NOT A SPACE * (P+2) A SPACE (SO MAY USE DEFAULT VALUES) * DFLT NOP CPB P1 ONE CHARACTER RETURNED? RSS JMP DFLT,I NO, SO DON'T BOTHER CHECKING LDA RBUFR AND B1774 CPA LBLNK ISZ DFLT GOT ONE JMP DFLT,I * LBLNK OCT 20000 SKP * ********************************************************************** ********************************************************************** ** ASDEC ** SPC 1 * * THE ASDEC SUBROUTINE CONVERTS THE CONTENTS OF A TO DECIMAL ASCII * AND STORES THE RESULT IN ITS OWN BUFFER @ CURAT. THE CALLER OF * ASDEC IS RESPONSIBLE FOR MOVING THE APPROPRIATE # WORDS TO ITS * OWN BUFFER. * * CALLING SEQUENCE: * A = DECIMAL # TO BE CONVERTED * * RETURN: A = BUFFER ADDRESS OF CURAT * ASDEC NOP CMA,INA MAKE IT NEGATIVE *WL LDB DPWRS GET ADDRESS OF DECIMAL POWERS STB RANAD SET LOWER RANGE ADDRESS LDB N2 ALSO SET LOOP COUNT STB TCNT LDB CURAT *WL STB TEMP5 *WL LDB A NUMBER INTO B *WL NEXTD JSB GETD GET NEXT DIGIT ALF,ALF ROTATE TO UPPER STA TEMP5,I SAVE UPPER CHARACTER JSB GETD GET NEXT DIGIT IOR TEMP5,I ADD UPPER CHAR *WL STA TEMP5,I SAVE NEXT 2 CHARACTERS *WL ISZ TEMP5 INCR MESSAGE ADDRESS *WL ISZ TCNT SKIP - 5 DIGITS IN JMP NEXTD NO - CONTINUE WITH NEXT DIGIT LDA CURAT JMP ASDEC,I YES - RETURN * * DPWRS DEF *+1 DEC 1000 DEC 100 P10 DEC 10 P1 DEC 1 * CURAT DEF *+1 BUFFER ADDRESS BSS 2 TCNT NOP TEMPORARY LOOP COUNTER CTEMP NOP SPC 6 * * GET DIGIT FOR \CVAS * * GETD PROVIDES THE ASCII CHARACTERS FOR \CVAS. * * CALLING SEQUENCE: * A = IGNORED * B = REMAINDER * JSB GETD * * RETURN: * A = ASCII DIGIT * B = IGNORED * GETD NOP CLA INCRA ADB RANAD,I ADD POWER CMB,SSB,INB,SZB SKIP - TRY NEXT HIGHER DIGIT JMP GET2 DIGIT FOUND INA INCR DIGIT CMB,INB RESTORE REMAINDER TO NEGATIVE JMP INCRA TRY HIGHER DIGIT GET2 ADB RANAD,I ADD POWER CMB,INB RESTORE REMAINDER ISZ RANAD INCR POWER LIST ADDRESS IOR B60 CONVERT TO ASCII JMP GETD,I RETURN WITH DIGIT IN A * RANAD NOP SKP ********************************************************************** ********************************************************************** ** BIDEC ** SPC 1 * * THE BIDEC SUBROUTINE CONVERTS THE NEXT CHARACTERS IN BUFR FROM * DECIMAL ASCII TO THEIR BINARY VALUE. * * CALLING SEQUENCE: * A & B ARE IGNORED * * RETURN: * (N+1): INVALID DIGIT OR OVERFLOW IN CONVERSION * (N+2): A = CONVERTED NO. * B = DESTROYED * BIDEC NOP LDB P10 GET DECIMAL BASE STB BASE1 SET THE DESIRED BASE * * CMB,INB SET NEG STB DRANG SET DIGIT RANGE * CCB SET FOR HIGH CHAR STB BUFUL LDA RBUFA STA TEMP4 CLA STA NUM# CLEAR ACCUMULATOR GETNX LDB BUFUL GET UPPER-LOWER FLAG IGNOR ISZ \NLNG OUT OF CHARACTERS?? RSS NO-CONTINUE JMP GDONE YES-RETURN LDA TEMP4,I GET CHAR FROM BUFFER SZB SKIP IF LOWER CHAR ALF,ALF ROTATE TO LOWER AND B377 ISOLATE LOWER CHAR CMB,SZB RESET U/L, SKIP IF UPPER CHAR ISZ TEMP4 INCR BUFFER ADDRESS STB BUFUL SAVE U/L FLAG CPA BLANK CHAR = BLANK? JMP IGNOR YES ADA L60 SUBTRACT 60B FROM CHAR STA TCHAR SAVE CHAR ADA DRANG IS THIS DIGIT INRANGE SSA,RSS YES IF RESULT IS NEG JMP DGERR SORRY - BAD DIGIT LDA NUM# GET PREVIOUS ACCUMULATOR MPY BASE1 MULTIPLY NEW DIGIT BY BASE ADA TCHAR SET A = NEW OCTAL NO. STA NUM# SAVE ACCUMULATOR SZB TEST FOR OVERFLOW RSS SSA TEST FOR OVERFLOW JMP DGERR INVALID NUMBER JMP GETNX GET NEXT DECIMAL DIGIT * GDONE ISZ BIDEC INCR RETURN ADDRESS LDA NUM# GET THE RESULT FROM ACCUMULATOR DGERR JMP BIDEC,I RETURN * TCHAR NOP TEMP CHAR SAVE AREA. DRANG NOP NEG ACCEPTABLE DIGIT RANGE NUM# NOP ACCUMULATOR FOR CONVERSION BLANK OCT 40 BUFUL NOP UPPER/LOWER CHARACTER = -1/0 MAXC NOP MAXIMUM # DIGITS IN CONVERSION L60 OCT -60 BASE1 NOP SKP HED FORMT - TYPE 32 DISC DRIVER ROUTINES ********************************************************************** ********************************************************************** ** \SETD ** * * DETERMINE SUBCHANNEL SPECIFICATIONS, USING INFORMATION * RETRIEVED FROM THE \TMT ENTRY FOR \DLU * \SETD NOP JSB XTTBL GET THE TMT ENTRY *WL DEF *+3 CORRESPONDING TO \DLU *WL DEF \DLU *WL DEF \TMT+1 * LDA N8 8 PARAMETERS *WL STA TEMP4 *WL LDB \TMT *WL LDA DPAD WHERE WE'RE GOING TO PUT THEM*WL STA TEMP5 *WL SET.1 LDA B,I *WL STA TEMP5,I *WL ISZ TEMP5 *WL INB *WL ISZ TEMP4 *WL JMP SET.1 *WL LDA \DUNT FETCH UNIT # *WL ALF,ALF MOVE IT TO HIGH BYTE *WL IOR \DADD ADD HP-IB ADDRESS *WL STA \DUNT *WL LDA \D#ST FETCH SECTORS/TRACK *WL ALF,RAL AND MULTIPLY BY 128 *WL RAL,RAL TO GET WORDS/TRACK *WL STA \D#WT AND SAVE IT. *WL CLA SET CURRENT SPARE TO ZERO STA CRSP# JMP \SETD,I * SPC 1 * DISC SUBCHANNNEL SPECIFICATIONS * DPAD DEF \DADD ADDRESS OF DISC SPECS. *WL \DLU NOP CURRENT TYPE 32 DISC LU \DSUB NOP DISC SUBCHANNEL FOR \DLU \DADD NOP HP-IB ADDRESS *WL \DUNT NOP UNIT/ADDRESS *WL \DSHD NOP STARTING HEAD *WL \DFTR NOP STARTING CYLINDER *WL \DNSP NOP NUMBER OF SPARES *WL \DNTR NOP NUMBER OF TRACKS *WL \D#ST NOP NUMBER OF PHYSICAL SECTORS/TRACK *WL \DNSU NOP NUMBER OF SURFACES *WL \D#WT NOP WORDS/TRACK \DNSD NOP SECTORS/FLOPPY \TRAK NOP CURRENT TRACK # \SEC# NOP CURRENT SECTOR # \DTYP NOP DISC TYPE = 0/1 FOR FLOPPY/HARD DISC * ** END \SETD ** ********************************************************************** ********************************************************************** SPC 3 ********************************************************************** ********************************************************************** ** ELOCK ROUTINE ** SPC 1 ELOCK NOP LDA LKFLG SZA JMP ELOCK,I IMMEDIATE RETURN-ALREADY LOCKED INA STA LKFLG SET LOCK FLAG FOR SAFETY VALVE JSB EQTRQ LOCK THE EQT FOR \DLU DEF *+3 DEF P1 DEF \DLU * JMP ELOCK,I RETURN SPC 1 LKFLG NOP 0/1=NOT LOCKED/LOCKED SPC 1 ** END ELOCK ** ********************************************************************** ********************************************************************** SPC 3 ********************************************************************** ********************************************************************** ** UNLOK ROUTINE ** SPC 1 UNLOK NOP LDB LKFLG IS THE LOCK FLAG SET?? SZB,RSS JMP UNLOK,I RETURN-WE DIDN'T HAVE IT CLB RESET LOCK FLAG STB LKFLG JSB EQTRQ DEF *+3 DEF MSIGN DEF \DLU * JMP UNLOK,I RETURN * MSIGN OCT 100000 SPC 1 ** END UNLOK ** ********************************************************************** ********************************************************************** SPC 3 ********************************************************************** ********************************************************************** ** LKLUS ROUTINE ** SPC 1 * LOCKS ALL DISC LU'S WHICH POINT TO THE SAME HPIB ADDRESS * OF THE DISC LU PASSED IN THE A-REG.(ONLY WORKS FOR RTE-IV) * THIS ROUTINE IS CALLED FOR THE FO[RMAT] OPTION TO LOCK LU'S * OF BOTH FLOPPY DISC DRIVES FOR THE DURATION OF THE FORMAT * PROCESS(7-19 MINUTES FOR DOUBLE SIDED),SO THAT THE EQT * DOES NOT HAVE TO BE LOCKED. * A=LU OF THE DISC WHO WE'RE GOING TO LOCK * RETURN: (P+1) * LKLUS NOP CLB,INB STB TEMP2 INIT CURRENT LU TO INVESTIGATE * STA RBUFR SET KEY LU IN THE LOCK TABLE ADA B2200 SET BITS FOR SPECIAL DRIVER CALL STA TEMP3 TO GET THE TRACK MAP TABLE * JSB EXEC DEF *+7 DEF P1 READ DEF TEMP3 LU+SPECIAL FUNCTION CODE DEF \BUFI,I ADDRESS OF TRACK MAP BUFFER DEF P161 #WORDS TO GET(WHOLE TABLE) DEF P0 DEF P5 * LDA RBUFR GET KEY DISC LU JSB GTEQT RETURN A=SUBCHAN, B=EQT# STB KEQT SAVE THE KEY EQT TO SEARCH FOR JSB GTADR PASS A=SUBCH; RET A=HPIB ADDR OF DISC STA KADDR SAVE HPIB ADDRESS FOR LATER SEARCH * LDB ARBUF GET ADDR OF LU LOCK TABLE STB TEMP1 SAVE FOR LATER LDA LUMAX GET #LU'S IN DRT OFF BASE PG. CMA,INA SET LOOP COUNTER STA TEMP3 FOR EXHAUSTIVE SEARCH THRU ALL LU'S * CHKLU LDA TEMP2 GET CURRENT LU TO ASK ABOUT JSB GTEQT RET A=SUBCH, B=EQT# OF CURR LU CPB KEQT IS IT THE RIGHT EQT?? RSS YES-CHECK HPIB ADDRESS JMP NXTLU NO -GO ASK ABOUT NEXT LU * JSB GTADR GET HPIB ADDR OF LU IN A.REG CPA KADDR IS IT THE SAME AS TARGET DISC?? RSS YES-GO ENTER IN THE LU LOCK TBL JMP NXTLU NO -GO ASK ABOUT NEXT LU * MATCH LDA TEMP2 GET THE LU THAT MATCHED STA TEMP1,I SALT IT AWAY IN LOCK TABLE ISZ LK#LU INCREMENT # OF LU'S NEED TO LOCK ISZ TEMP1 ADVANCE TO NEXT FREE LOCK TABLE SLOT * NXTLU ISZ TEMP2 STEP TO NEXT LU IN SEARCH ISZ TEMP3 SEARCHED ALL LU'S IN DRT?? JMP CHKLU NOPE-SEARCH ANOTHER * JSB LURQ NOW LOCK ALL THE LU'S DEF *+4 THAT POINT TO THE DISC DEF LKOPT THAT WE'RE FORMATTING ARBUF DEF RBUFR TABLE OF THE LOCKEE'S DEF LK#LU NUMBER OF LOCKEE'S * NOP ERROR RETURN JMP LKLUS,I RETURN-ALL FLOPPY LU'S LOCKED * LKOPT OCT 054001 OPTIONS:NO ABORT,IGNORE SST,W/ WAIT,DISCS OK LK#LU NOP NUMBER OF LU'S TO LOCK KEQT NOP EQT# OF DISC TO FORMAT KADDR NOP HPIB ADDR OF DISC TO FORMAT DRT EQU 1652B BASE PAGE-1ST WORD OF DRT LUMAX EQU 1653B BASE PAGE-LENGTH OF DRT * * GTEQT NOP SUBROUTINE TO GET EQT&SUBCH CCB OF LU PASSED IN A REG. ADB A (LU-1) IS OFFSET INTO DRT ADB DRT ADD 1ST WORD ADDR OF DRT LDA B,I GET DRT WORD 1 FOR THIS LU AND B77 MASK OFF EQT NUMBER SWP & GIVE TO B.REG * LDA A,I GET DRT WORD AGAIN ALF,RAL ROTATE SUBCH TO LOW 5 BITS AND B37 MASK OFF SUBCHANNEL OF LU JMP GTEQT,I RET: A=SUBCHANNEL,B=EQT# * * * SUBROUTINE TO GET THE HPIB ADDRESS OF THE DISC SUBCHANNEL * SPECIFIED IN THE A.REG. (ACCESSES THE TRACK MAP TABLE) * GTADR NOP MPY P5 OFFSET 5 WORDS PER SUBCH INTO TABLE ADA P3 OFFSET TO HEAD\ADDR WORD ADA \BUFI ADD TABLE'S BASE ADDR LDA A,I GET THE HEAD\HPIB ADDR WORD AND B17 MASK OFF THE HPIB SELECT ADDRESS JMP GTADR,I RETURN A=HPIB ADDR OF DISC SUBCHANNEL * ** END LKLUS ROUTINE ** ********************************************************************** ********************************************************************** SPC 3 ********************************************************************** ********************************************************************** ** ULKLU ROUTINE ** * * ULKLU-UNLOCKS ALL LU'S THAT ARE LOCKED TO FORMAT * BY THE LKLUS ROUTINE * ULKLU NOP LDA LK#LU GET # OF LU'S CURRENTLY LOCKED SZA,RSS JMP ULKLU,I NONE LOCKED-RETURN JSB LURQ DEF *+4 DEF ULKOP UNLOCK OPTION DEF RBUFR LU BUFFER DEF LK#LU # LU'S LOCKED NOP ERROR RETURN CLA STA LK#LU SET # LOCKED TO ZERO JMP ULKLU,I RETURN * ULKOP OCT 154000 UNLOCK ALL DISC LU'S,IGNORE SST,NO ABORT * ** END ULKLU ROUTINE ** ********************************************************************** ********************************************************************** SKP ********************************************************************** ********************************************************************** ** ** SPC 1 * THE DISKD SUBROUTINE IS THE MAIN DISC INPUT/OUTPUT DRIVER. * IT SETS UP THE COMPLETE TRANSFER OF READS OR WRITES * * CALLING SEQUENCE * LEN = # WORDS TO TRANSMIT * E = 1 FOR READ * E = 0 FOR WRITE * * * DISKD HAS FOUR MODES OF OPERATION: * MODE 3 : INITIALIZING AN ENTIRE SUBCHANNEL * MODE 4 : INITIALIZING SPARE TRACKS PRIOR TO MODE 3 * MODE 5 : SPARING ONE TRACK ON A SUBCHANNEL * MODE 6 : FORMATTING A FLOPPY DISC * MODE 7 : RE-FORMAT A HARD DISC TRACK *BC * MODE 8 : VERIFY A TRACK (HARD OR FLOPPY) *BC * * THE FORMT PROGRAM CALLS DISKD IN MODE4 FOR EACH SUBCHANNEL BEFORE * IT BEGINS ANY WRITING OR INITIALIZING IN MODE3. THIS IS DONE SO * THAT ALL THE SPARES FOR A GIVEN SUBCHANNEL CAN BE CLEANED UP. * * DISKD NOP CLA ELA SHIFT E INTO LSB OF A REG. STA \R/W SAVE E IN \R/W * LDA N10 STA ERCNT INITIALIZE ERROR COUNTER * * CLA STA \RET CLEAR RETURN STATUS FLAG STA SPD CLEAR INIT WRITE FLAG STA \SEC# AND SET TO SECTOR 0 * LDA \TRAK LOGICAL TRACK ADDRESS ON CURRENT SUBCHANNEL JSB DADTR CONVERT LOGICAL \TRAK TO PHYSICAL DISC ADDR DST SKCYL SET CYL/HEAD FOR SEEK COMMAND DST ARCYL SET CYLINDER/HEAD FOR ADDRESS RECORD COMMAND * SPC 3 ********************************************************************** * BEGIN INCASE(\MODE): * SPC 1 LDA TBL01 ADA \MODE JMP A,I * TBL01 DEF * NOP N/A NOP N/A JMP MOD03 JMP MOD04 JMP MOD05 JMP MOD06 JMP MOD07 *BC JMP MOD08 *BC * SPC 3 * * MODE=3: INITIALIZING TRACKS * MOD03 CLA STA FLMSK SET FILE MASK FOR NO AUTO SEEK TO SPARE LDA A067 GET ACTION: SEEK,ADRC,FLMSK,RDFS,CALL STFIX STA \ACTN SET FOR READ FULL SECTOR FOR STATUS LDA P1 STA PHASE SET PHASE FOR STATUS READ TO INIT TRACK JMP DSGO SPC 3 * * MODE=4: INITIALIZE SPARES - SPARE CLEANUP MODE * MOD04 CLA STA FLMSK SET FILE MASK FOR NO AUTO SEEK LDA A067 GET ACTION: SEEK,ADRC,FLMSK,RDFS,STFIX STA \ACTN SET FOR READ FULL SEC FOR TRACK'S STATUS LDA P3 STA PHASE SET PHASE FOR STATUS READ TO SPARE JMP DSGO SPC 3 * * MODE=5: SPARE ONE TRACK * MOD05 CLA STA FLMSK SET FILE MASK FOR NO AUTO SEEK TO SPARE LDA \D#ST CMA,INA STA SLOOP SET LOOP COUNTER = # SECTORS/TRACK CLA STA PHASE PHASE = 0 FOR READ W/ OFFSETS STA OFSET START WITH OFFSET = 0 LDA A2007 RESET ACTION WORD TO STA \ACTN READ W/ OFFSET RATHER THAN WRITE LDB \BUFA SET BUFFER ADDRESS FOR STB BPTR MOVING EACH SECTOR TO TRACK BUFFER JMP DSGO SPC 3 * * MODE=6: FORMAT A FLOPPY * MOD06 CLA SET # BAD TRACKS TO 0 STA BADFT STA PASSX INIT FOR DISPLAY RTN PASS# CLB DST SKCYL FIRST SEEK TO CYL 0/HEAD 0 INA STA INTLV WITH INTERLEAVE =1 (FASTEST) LDA A4000 SET ACTION WORD TO FORMAT ONLY STA \ACTN -SEEK ILLEGAL UNLESS FORMATTED JSB ONLY1 SET ERCNT TO 1 TRY LDB BFTBL INITIALIZE POINTER TO BAD STB BPTR TRACK TABLE FOR PHASE 8 * * DO A STATUS REQUEST TO THE FLOPPY TO DETERMINE WHAT TYPE OF * DISC MEDIA WE'RE TALKING TO. IF THE FLOPPY IS UNFORMATTED OR * AN UNRECOGNIZABLE FORMAT, THE HARDWARE MAY TAKE UP TO 10 SEC. * TO COMPLETE THE 1ST STATUS REQUEST,WHILE IT TRIES TO MAKE SENSE OF * THE MEDIA. TO GUARANTEE THAT WE HAVE A LEGITIMATE STATUS REPORT, * THE 1ST STATUS IS IGNORED(INCASE THE DRIVER TIMED OUT),AND A * 2ND STATUS REQUEST IS ISSUED AT REQ6+5. * REQ6 JSB REQST **NOTE-FIRST STATUS CMD MAY TAKE UP TO CLB,INB SLEEP FOR 1 SEC. BEFORE POLLING LDA P2 2 POLLS MAX. WAIT=10 SEC. JSB SLEEP WAIT FOR DRIVE READY INCASE LONG STATUS. JMP NODSC TIMEOUT RET-NOT RDY IF>11 SEC. JSB REQST DO A 2ND STATUS FOR REAL NOW LDA STAT2 ALF ALF,RAR *WL AND B17 CAN BE DETERMINED SZA,RSS JMP NODSC NO DISC IN SPECIFIED DRIVE CLB,INB SET AT LEAST ONE SURFACE CPA P5 BLANK OR UNKNOWN FORMAT OF A RSS DOUBLE-SIDED CPA P6 OR HP FORMAT DOUBLE-SIDED INB STB \DNSU SET #SURFACES BASED ON DISC LDA B MPY P77 SET TOTAL # OF TRACKS ON DISC STA \DNTR MPY P30 NOW SET THE # SECTORS PER DISC STA \DNSD FOR THE VERIFY COMMAND * LDB BPAT1 START WITH FIRST BIT PATTERN STB BPATT JSB PASS# DISPLAY THE PASS #1 MESSAGE LDA YOVRD AND YES TO OVERRIDE OLD STA FTYP FORMAT BIT WITH TYPE = 2 LDB P7 SET PHASE STB PHASE TO 7 FOR FORMAT/VERIFY COMBO JMP DSGO * NODSC JSB NRDER ISSUE NOT READY MESSAGE IF JMP REQ6 NO FLOPPY IN DRIVE * *BC * *BC * *BC MOD07 LDA A207 SET ACTION WORD FOR.. *BC STA \ACTN INITIALIZE *BC LDA P13 SET PHASE TO 13 *BC STA PHASE *BC CLA SET FILE MASK FOR NO AUTO *BC STA FLMSK SEEK TO SPARE *BC JMP DSGO *BC * *BC * *BC * *BC MOD08 LDA A407 SET ACTION WORD FOR... *BC STA \ACTN VERIFY *BC LDA P4 SET FILE MASK FOR.. *BC STA FLMSK AUTO SEEK TO SPARE *BC CCA SET ERROR COUNT *BC STA ERCNT FOR ONLY ONE TRY *BC LDA \D#ST GET THE # OF SECTORS PER TRACK *BC CPA P30 FLOPPY? *BC JMP FL YES *BC LDB P14 NO - HARD DISC *BC RSS *BC FL LDB P15 SET PHASE NUMBER *BC STB PHASE *BC JMP DSGO GO DO IT *BC SPC 1 * END INCASE(\MODE): * ********************************************************************** SKP ********************************************************************** ********************************************************************** ** MAIN DRIVER LOOP ** SPC 1 * THE MAIN DRIVER LOOP REPEATEDLY CALLS XFER TO PERFORM DISC * COMMANDS AND THEN EXAMINES STATUS WORD 1 RETURNED BY XFER. * THE APPROPRIATE PROCESSING BLOCK IS BRANCHED TO BY THE INCASE * CONSTRUCT. ALL THE PROCESSING BLOCKS RETURN TO THE COMMON * RETURN POINT: "ENDBR". WE CONTINUE IN THIS LOOP UNTIL ONE OF THE * PROCESSING BLOCKS SETS \RET TO A +1 FOR A SUCCESSFUL COMPLETION * OF A COMMAND SEQUENCE OR -1 FOR AN UNSUCCESSFUL RETURN TO THE * CALLING PROGRAM. SPC 2 DSGO JSB XFER WE'ER LOOPING AGAIN:CALL ACTION ROUTINE * RET W/ A=STAT1 WORD; B=STAT2 SPC 3 * BEGIN INCASE(STAT1): (RETURNED IN A REG BY XFER) * SPC 1 ADA TBL02 GET (ADDRESS OF BRANCH TABLE + STAT1) JMP A,I BRANCH TO THE PROCESSING BLOCK * TBL02 DEF *+1 CODE ERROR PROCESSING JMP ENDOK 00 NO ERROR - GO ENTER NEXT PHASE JMP FAULT 01 ILLEGAL OP - PROGRAM FAULT JMP FAULT 02 UNIT AVAIL. PROGRAM FAULT JMP FAULT 03 UNIMPLEMENTED ERROR CODE - FAULT JMP FAULT 04 " " " " JMP FAULT 05 " " " " JMP FAULT 06 " " " " JMP RECAL 07 CYL COMPARE TRY TO RECAL. JMP DSKER 10 PARITY ERROR TRY AGAIN JMP EOCYL 11 HEAD/SECTOR? RESTART ERR43 JMP FAULT 12 I/O PROGRAM (WHO? ME?) PROGRAM FAULT JMP FAULT 13 UNIMPLEMENTED ERROR CODE - FAULT JMP EOCYL 14 END OF CYL. BAD # SECT/TRK ERR43,RESTART JMP FAULT 15 UNIMPLEMENTED ERROR CODE - FAULT JMP DSKER 16 OVER RUN JUST RETRY JMP DSKER 17 CORRECTABLE ERROR RETRY JMP ILSPR 20 ILLEGAL SPARE JMP DEFTR 21 DEFECTIVE TRACK JMP ST2ER 22 ACCESS NOT READY - STATUS 2 ERROR JMP ST2ER 23 STATUS 2 GO CHECK JMP FAULT 24 UNIMPLEMENTED ERROR CODE - FAULT JMP FAULT 25 " " " " JMP FRMSW 26 WRITE WITH P BIT SET&FORMAT SW OFF JMP UWAIT 27 WAIT FOR THE UNIT. SPC 1 * END INCASE (STAT1); SPC 2 ENDBR LDA \RET CHECK THE DRIVER'S STATUS SZA,RSS LOOP AGAIN IF \RET=0 JMP DSGO * LDA A1004 GET ACTION WORD FOR END WITH/FILEMASK LDB \MODE NO FILEMASK COMMAND IF A CPB P6 FLOPPY DISC LDA A1000 END ONLY LDB PHASE *BC CPB P15 *BC LDA A1000 *BC STA \ACTN AND SAVE FOR XFER LDA P4 STA FLMSK SET FOR AUTO-SEEK REGARDLESS IF APPLICABLE LDA ST1 SAVE ST1 FOR C78? BEFORE XFER *BC STA ST.1 CHANGES IT *BC JSB XFER SEND IT. * JSB C78? CHECK FOR FORMT ABORT *BC LDA \RET RETURN THE NEWS: -1= ERROR JMP DISKD,I RETURN TO MAIN SPC 2 ** END DRIVER MAIN LOOP ** ********************************************************************** ********************************************************************** SPC 2 ********************************************************************** ********************************************************************** ** THE FOLLOWING VARIABLES DETERMINE THE STATE OF THE MAIN DRVR LOOP** SPC 1 * \MODE - FOR COMMUNICATING TO DRIVER FROM MAIN. * * =1 - REGULAR READ/WRITE * =2 - WRITE SYSTEM TRACKS (WITH PROTECT) * =3 - WRITE INITIALIZE TRACKS-ALSO FOR 7910 SYSTEM BECAUSE * 7910 HAS NO FORMAT SWITCH * =4 - INITIALIZE SPARES - CLEANUP MODE. * =5 - * =6 - * =7 - RE-FORMAT *BC * =8 - VERIFY *BC * * PHASE - FOR REMEMBERING PRESENT STATE WHILE LOOPING THRU DRIVER. * * =1 - STATUS READ TO SYSTEM/INIT TRACK. * =2 - WRITE INITIALIZE TO SYSTEM/INIT TRACK. * =3 - STATUS READ TO SPARE. * =4 - WRITE INITIALIZE TO SPARE. * =5 - WRITE INITIALIZE FIXUP TO SYSTEM TRACK. * =6 - WRITE INITIALIZE TO SPARE - FLAGGING DEFECTIVE. * =7 - * =8 - * =13- RE-FORMAT A HARD DISC TRACK *BC * =14- VERIFY A HARD DISC TRACK *BC * =15- VERIFY A FLOPPY TRACK *BC SPC 1 ** ** ********************************************************************** ********************************************************************** SKP ********************************************************************** ********************************************************************** ** ENDOK ** SPC 1 * A SUCCESSFUL DISC OPERATION HAS JUST BEEN COMPLETED. ENDOK * DETERMINES WHAT PHASE THE DRIVER JUST FINISHED AND SETS UP * THE NEXT PHASE BY ALTERING "PHASE" AND "\ACTN" FLAGS. SPC 2 ********************************************************************** ** BEGIN INCASE(\MODE): ** ENDOK LDA TBL03 GET ADDRESS OF BRANCH TABLE ADA \MODE JMP A,I BRANCH TO APPROPRIATE BLOCK * TBL03 DEF * NOP NOP JMP EOK3 JMP EOK4 JMP EOK5 JMP EOK6 JMP EOK78 *BC JMP EOK78 *BC * SPC 3 EOK78 CLA,INA *BC STA \RET *BC JMP ENDBR *BC * *BC * * MODE=3 INITIALIZING TRACKS MODE * EOK3 LDA TBL04 ADA PHASE JMP A,I * TBL04 DEF * JMP PHA1 JUST FINISHED STATUS READ TO INIT TRACK JMP PHA2 JUST FINISHED WRITE INITIALIZE TO INIT TRACK JMP PHA3 JUST FINISHED STATUS READ TO POTENTIAL SPARE JMP PHA4 JUST FINISHED WRITE INITIALIZE TO SPARE JMP PHA5 JUST FINISHED WRITE INIT ON BAD TRACK-FOR FIXUP JMP * MAYBE 6***DEBUG ONLY...SHOULDN'T GET HERE!!!! * SPC 3 * * PHASE=1: FINISHED STATUS READ. OK-SO NOW DO WRITE INIT TO TRACK * PHA1 CLB MODE3- SO DON'T WRITE PROTECT. STB SPD SAVE IN FLAG WORD - FOR WRITE INITIALIZE * ISZ PHASE ADVANCE TO PHASE2- WRITE INITIALIZE. LDA A207 SET ACTION:WRITE INIT STA \ACTN JMP ENDBR SPC 3 * * PHASE=2:JUST DID WRITE INIT.-NOW VERIFY THE TRACK * PHA2 LDA A407 SEEK,VERIFY,CHECK STATUS STA \ACTN JSB XFER GO VERIFY & RETURN WT STATUS SZA ANY TYPE OF ERROR IS BAD NEWS. JMP VFAIL VERIFY FAILED- GET FIRST SPARE * CLA,INA STA \RET SUCCESSFUL VERIFY-SIGNAL MAIN & RETURN STATUS JMP ENDBR * VFAIL CLA STA IDXPR SET FOR RPORT DLD CYL# VERIFY FAILED- SAVE BAD TRK DST BDCYL FOR LATER. JSB RPORT REPORT:"BAD TRACK... " JSB NIXSP GET NEXT POTENTIAL SPARE JMP ENDBR ERROR RETURN FOR NIXSP-IE. OUT OF SPARES!! DST SKCYL SET SEEK ADDRESS TO SPARE DST ARCYL SET ADDR RECORD CLA STA FLMSK FILE MASK - NO AUTO SEEK TO SPARE * ISZ PHASE SET PHASE3: STATUS READ TO POTENTIAL SPARE LDA A067 ACTION: SEEK,FMSK,RDFS,STFIX FOR TRACK STATUS STA \ACTN JMP ENDBR SPC 3 * * PHASE=3: STATUS WRT TO POTENTIAL SPARE WAS OK - NOW DO A WRT * INITIALIZE TO SPARE & POINT IT TO THE BAD TRACK * PHA3 DLD BDCYL GET DEFECTIVE TRACK ADDRESS & SET IT DST ARCYL IN SPARE WITH AN ADDRESS RECORD COMMAND CLB STB FLMSK NO AUTO SEEK LDB S100 MODE3: SET SPARE , NO PROTECT STB SPD SET IT. * ISZ PHASE SET PHASE4: WRITE INITIALIZE A SPARE. LDA A207 SET ACTION WORD: WRT INIT STA \ACTN JMP ENDBR SPC 3 * * PHASE=4: WRITE INITIALIZE TO SPARE WAS SUCCESSFUL - NOW FIXUP * ORIGINAL BAD TRACK WITH SPARE'S ADDRESS. * PHA4 DLD BDCYL GET ADDRESS OF ORIGINAL BAD TRACK & SET DST SKCYL UP TO SEEK TO IT. DLD CYL# GET ADDR OF THE CHOSEN SPARE AND DST ARCYL SET IT IN THE BAD TRACK W/ AN ADDRESS REC'D COMMAND. * CLB STB FLMSK DISABLE SPARING FEATURE LDB S001 MODE3: DEFECTIVE, NO PROTECT STB SPD SET IT. * ISZ PHASE ADVANCE TO PHASE5: WRT INIT FOR FIXUP TO DEF. TRACK LDA A207 SET ACTION WORD TO WRITE INIT.,W/ SEEK STA \ACTN JMP ENDBR SPC 3 * * PHASE5: WRITE INIT FOR FIXUP DONE-NOW VERIFY THE BAD TRACK * THAT WAS SPARED. WE'RE GOING TO DO A SEEK TO THE BAD * TRACK WITH SPARING ENABLED, AND VERIFY IT. * PHA5 DLD BDCYL GET ADDR OF THE ORIGINAL BAD TRACK DST ARCYL AND SET UP TO SEEK TO IT. LDA P4 STA FLMSK ENABLE SPARING-SO WE'LL RESEEK TO THE SPARE TRACK. * LDA A407 SEEK,ENABL SPR'ING,VERIFY,GET STATUS STA \ACTN JSB XFER GO VERIFY THIS BAD TRACK,SEEKING TO ITS SPARE SZA JMP FAILV ANY ERROR IS BAD NEWS. * CLA,INA SIGNAL RPORT TO SEND STA IDXPR "SPARED TO..." DLD CYL# GET ADDR OF SPARED USED JSB RPORT SEND "SPARED TO XXXX YYYY .... * CLA,INA STA \RET SIGNAL MAIN THAT WE'RE DONE & RETURN OK STATUS. JMP ENDBR * * MAYBE SETUP A PHASE 6 FOR MARKING SPARE DEFECTIVE? **************** * FAILV JSB NIXSP BAD NEWS- GET NEXT POTENTIAL SPARE & WRT FOR STATUS. JMP ENDBR ERROR RETURN FOR NIXSP- IE. OUT OF SPARES! DST SKCYL SET UP TO SEEK TO NEXT SPARE  DST ARCYL AND CHECK ITS STATUS. * CLB STB FLMSK DISABLE AUTO-SEEK TO SPARE * LDA P3 STA PHASE SET PHASE3: STATUS READ TO POTENTIAL SPARE. LDA A067 ACTION: SEEK,RDFS FOR STATUS,STFIX STA \ACTN JMP ENDBR SPC 3 * * MODE=4: SPARE CLEANUP/INITIALIZATION MODE. * EOK4 LDA PHASE CPA P3 ARE WE IN PHASE3? - (STATUS READ TO SPARE)? RSS YES - STATUS WRT WAS OK - NOW DO WRT INIT TO SPARE. JMP PHB4 NOT IN PHASE3 - GO CHECK IF IN 4. * * PHASE3: * CLB GET READY TO DO A WRITE INIT TO THE SPARE. STB FLMSK DISABLE AUTO-SEEK TO SPARE. * ISZ PHASE ADVANCE TO PHASE4- WRITE INITIALIZE TO SPARE. LDA A207 ACTION:ADRC,WRITE INIT STA \ACTN JMP ENDBR * * PHASE4: * PHB4 CPA P4 ARE WE IN PHASE4?- (WRT INIT TO SPARE)? RSS YES - WRT INIT WENT OK- NOW VERIFY THE SPARE. JMP PHB6 NOT IN PHASE4 - GO CHECK IF IN 6. * LDA A407 SEEK,VERIFY & RET STATUS STA \ACTN SET ACTION WORD FOR XFER JSB XFER GO VERIFY THE SPARE SZA IF STATUS=0, WE'RE OK. JMP FAIL ANY ERROR IS BAD NEWS. * CLA,INA VERIFY WENT OK - SIGNAL SUCCESS & RETURN TO MAIN. STA \RET JMP ENDBR * FAIL LDA A207 SET ACTION FOR INIT AGAIN STA \ACTN * LDA S001 SET SPD BITS FOR FLAGGIN A DEFECTIVE SPARE. STA SPD SET 'EM. ISZ PHASE ADVANCE TO PHASE6: FLAG THAT DEFECTIVE SPARE. ISZ PHASE JMP ENDBR GO AROUND DRIVER LOOP AGAIN-SAME OLD PHASE4:INIT SPARE * * PHASE 6: REPORT BAD SPARE & RETURN TO LOOP * PHB6 LDA P2 SIGNAL RPORT TO SEND STA IDXPR "BAD SPARE..." DLD SKCYL GET SET TO REPORT BAD SPARE JSB RPORT "BAD TRACK ..... " * CLA,INA WE'RE ALL DONE-SPARE HAS BEEN FLAGGED DEFECTIVE. STA \RET SIGNAL THE MAIN & RETURN. JMP ENDBR SPC 3 * * MODE=5: SPARE ONE TRACK * EOK5 LDA PHASE WHERE ARE WE? CPA P4 JMP PHA4 SAME ACTION AS IN PHASES 4 & 5 CPA P5 FOR MODE 3 JMP PHA5 CPA P6 JUST MARKED A SPARE DEFECTIVE JMP PHAS6 NOW GET ANOTHER * * * PHASE=0: DONE READING THIS SECTOR, MOVE ON TO NEXT UNLESS * ALL ON TRACK READ * PHAS0 LDA RBUFA MOVE CONTENTS OF READ W/OFFSET ADA P16 BUFFER TO BIG TRACK BUFFER \BUFA LDB BPTR GET CURRENT POSITION IN \BUFA JSB .MVW MOVE 'EM OVER! DEF P128 NOP STB BPTR UPDATE FOR NEXT TIME * ISZ SLOOP DONE WITH LOOP - IE, ALL SECTORS ON TRACK? RSS NO JMP DONES YES - ON TO NEXT PHASE ISZ \SEC# BUMP TO NEXT SECTOR CLA RESET OFFSET STA OFSET LDA N10 AND THE RETRY COUNTER STA ERCNT JMP ENDBR AND CONTINUE SPC 3 * * DO A WRITE INIT OF SPARE TRACK W/ DATA & ADDR OF DEFECTIVE TRACK * DONES CLA SIGNAL RPORT TO SEND* STA IDXPR "BAD TRACK..." DLD CYL# SAVE BAD TRACK ADDRESS DST BDCYL FOR SPARE'S WRITE INIT JSB RPORT "BAD TRACK ..." JMP NEWSP * PHAS6 LDA P2 STA IDXPR SEND "BAD SPARE..." MESSAGE DLD SKCYL FOR BAD SPARE ENCOUNTERED JSB RPORT * NEWSP JSB XSPAR NOW GET THE NEXT AVAILABLE DEF *+4 DEF \DLU DEF STRAK DEF IER LDA IER WAS ONE AVAILABLE? SZA JMP NOSP NO! * LDA STRAK GET PHYSICAL ADDRESS JSB DADTR OF SPARE DST SKCYL AND SAVE FOR THE SEEK DLD BDCYL GET ADDRESS OF DEFECTIVE DST ARCYL TRACK AGAIN FOR ADDRESS REC CLB STB \SEC# RESET SECTOR POINTER *WL STB FLMSK CLEAR FILE MASK TO DISABLE AUTOSEEK ADB S100 STB SPD SET TO SPARE, NO PROTECT * LDA P4 INDICATE STA PHASE NEW PHASE LDA A207 SET ACTION:SEEK,INIT STA \ACTN WRITE INIT WITH SEEK JMP ENDBR * * OUT OF SPARES FOR THIS LU * NOSP LDB P12 SEND MESSAGE: JSB PROMT "OUT OF SPARE TRACKS FOR THIS LU" CCA STA \RET JMP ENDBR AND ABORT TASK SPC 3 * * MODE=6: FORMATTING A FLOPPY * EOK6 JSB ONLY1 SET ERCNT TO 1 TRY ONLY LDA PHASE CPA P7 RSS JMP PHAS8 * * PHASE 7 = FORMAT COMMAND DONE, NOW ISSUE VERIFY TO * GET ANY BAD TRACKS * ISZ PHASE SET TO PHASE 8 CLB CLA DST SKCYL START W/ A SEEK TO CYL 0, HEAD 0 LDA A401 ACTION: SEEK,VERIFY STA \ACTN SET FOR A VERIFY W/ SEEK * CLA GET MAX # SECTORS/DISC LDB BPATT IF PASS 5 THEN SZB,RSS LDA BADFT VERIFY ONLY THE GOOD TRACKS MPY P30 CMA,INA AND SUBTRACT FROM TOTAL# ADA \DNSD FOR THE DISC STA \D#ST ***NOTE THAT OLD VALUE WAS DESTROYED! JMP ENDBR AND CONTINUE * * PHASE 8 - VERIFY COMPLETE, SO SET UP THE NEXT BYTE * PATTERN FOR THE FORMAT CALL. IF BPAT5, * MEANING THE FINAL PASS, THEN EXIT * PHAS8 CPA P9 JMP PHAS9 GO PROCESS THE NEXT BAD TRACK IN BFTBL * LDB BPATT FINAL PASS JUST DONE? CPB BPAT5 JMP DONE6 YES CPB BPAT4 IF PASS 4 JUST COMPLETED, JMP LOOPB GO DO THE WRITE INIT'S * CPB BPAT3 ELSE UPDATE THE BYTE PATTERN LDB BPAT4 CPB BPAT2 LDB BPAT3 CPB BPAT1 LDB BPAT2 STB BPATT AND SAVE JSB PASS# DISPLAY THE PASS #X MESSAGE * CLA CLB DST SKCYL ANOTHER SEEK TO CYL 0/HEAD 0 LDA A4001 SEEK,FORMAT STA \ACTN SEEK AND FORMAT LDB P7 STB PHASE RESET TO 7 AGAIN JMP ENDBR * * FIRST 4 PASSES COMPLETED - NOW DO THE WRITE INIT'S * WITH D-BITS SET TO BAD TRACKS IN BFTBL * LOOPB LDA BADFT IF NO BAD TRACKS ENCOUNTERED SZA,RSS THEN JMP PASS5 TO 5TH FORMAT/VERIFY COMBO * CMA ELSE SET #BAD TRACKS,LESS 1 (ISZ @PHAS9) STA SLOOP AS LOOP COUNTER LDB BFTBL POINT TO FIRST ADDRESS STB BPTR PAIR IN TABLE ISZ PHASE PHASE 9 (CLRBF ALREADY SET BUFFER=0) * * PHASE 9: DO A WRITE INIT W/D-BIT SET TO THE NEXT BAD * TRACK IN BFTBL UNTIL BADFT TRACKS DONE * INIT COMMAND ONLY SUPPORTS INIT OF ONE * SECTOR AT A TIME,BUT MARKS THE D BIT IN * WHOLE TRACK EVEN IF ONLY ONE SECTOR IS * INITIALIZED. SO DO ONLY 1 TO SAVE TIME. * SET LEN UP TO 128 AT FPR2+4 IN FPROC. * PHAS9 ISZ SLOOP DONE WITH 'EM ALL? RSS NO, KEEP ON GOING JMP PASS5 YES, GO DO LAST FORMAT/VERIFY PASS * DLD BPTR,I GET THE BAD CYL # AND HEAD # DST SKCYL SET FOR SEEK ISZ BPTR ISZ BPTR POINT TO NEXT ADDRESS PAIR LDB S001 SET D-BIT ONLY STB SPD LDA A201 SEEK, WRITE INIT STA \ACTN JMP ENDBR CONTINUE * * INITIATE 5TH AND FINAL FORMAT/VERIFY PASS WITH: * DATA BYTE=0, TYPE=2, OVERRIDE FORMAT=OFF, AND * INTERLEAVE=\FILL * PASS5 JSB PASS# DISPLAY THE PASS #X MESSAGE LDB BPAT5 EQUALS 0 STB BPATT CLA DST SKCYL START OVER AGAIN LDB \FILL GET USER-SPECIFIED INTERLEAVE VALUE STB INTLV AND SET LDA A4001 SET FOR A STA \ACTN FORMAT W/ SEEK LDB NOVRD DO NOT OVERRIDE THE PRESENT FORMATTING STB FTYP ON DISC. TYPE =2 FOR HP LDA P7 STA PHASE START IT UP AGAIN! JMP ENDBR * * DONE WITH MODE 6, ALL PHASES * DONE6 ISZ WARNG WILL BE >=0 ONLY IF BAD TRACKS JSB RFFLP DURING PASS 5 - ISSUE WARNING CLA,INA STA \RET SIGNAL OK COMPLETION JMP ENDBR * RFFLP NOP LDB P23 DISPLAY: JSB PROMT "WARNING! POSSIBLE BAD FLOPPY MEDIA..." JMP RFFLP,I SPC 1 ** END ENDOK BLOCK ** ********************************************************************** ********************************************************************** SPC 6 ********************************************************************** ********************************************************************** ** NEWOF ** SPC 1 * INCREMENTS THE OFFSET VALUE FOR READ WITH OFFSET IN THIS * ORDER: 0,10,20,30,40,50,60,-10,-20,-30,-40,-50,-60. (THE * VALUES ARE STORED IN THE LOWER BYTE OF OFSET, IN SIGN/ * MANGITUDE FORM). * A WARNING MESSAGE IS ISSUED IF AN ERROR STILL OCCURS AFTER * AN OFFSET OF -60 WAS USED FOR THIS SECTOR, UNLESS THE MESSAGE * WAS ALREADY ISSUED FOR THIS TRACK. * NEWOF LDB ST1 IF ALREADY MARKED DEFECTIVE CPB B21 THEN DON'T BOTHER WITH ALL THE JMP RDWRN THESE OFFSET VALUES * LDA OFSET WAS THIS THE LAST TRY? CPA N60B JMP RDWRN YES - MAY ISSUE WARNING * LDB N3 STB ERCNT ELSE RESET RETRY COUNTER ADA P10 BUMP BY 10 * 25 MICRO-INCHES CPA P70 LAST POSITIVE VALUE? LDA N10B YES, START AT NEG 10 STA OFSET JMP ENDBR AND CONTINUE * RDWRN ISZ WARNG HAS MESSAGE BEEN ISSUED YET? JMP PHAS0 YUP! LDB P11 DISPLAY JSB PROMT "WARNING! ALL INFORMATION ON ..." JMP PHAS0 GO TO NEXT SECTOR * ** END NEWOF BLOCK ** ********************************************************************** ********************************************************************** SKP ********************************************************************** ********************************************************************** ** C78? ** * *BC * *BC * SUBROUTINE C78? CHECKS FOR CERTAIN FATAL COMBINATIONS OF *BC * ERROR STATUS NUMBERS, MODES, PHASES AND NUMBER OF RETRYS *BC * NORMAL RETURN IS AT P+1 *BC * OTHERWISE ABORT THE TASK *BC * *BC C78? NOP *BC LDA \RET *BC CCB *BC CPA B *BC RSS *BC JMP C78?,I NO ERROR. EXIT *BC LDB \MODE *BC CPB P7 *BC RSS *BC CPB P8 *BC RSS *BC JMP C78?,I * *BC LDA PHASE ABORT IF PHASE 13, ERROR 16 AND *BC CPA P13 ERROR COUNT = 0 *BC RSS *BC JMP C78.1 *BC LDA ST.1 GET ERROR STATUS # *BC CPA B16 *BC RSS OVER-RUN AFTER 10 RETRYS ON *BC * HARD DISC "RE" COMMAND *BC JMP C78.1 *BC LDA ERCNT *BC SZA *BC RSS *BC JMP DONE? *BC * *BC C78.1 LDA ST.1 ALSO, ABORT IF ERROR 14,11,1 *BC CPA B11 2,12,3,4,5,6,13,15,24 *BC RSS OR 25 IN MODES 7 OR 8 *BC CPA P1 *BC RSS *BC CPA P2 *BC RSS *BC CPA B27 *BC RSS *BC CPA B12 *BC RSS *BC CPA P3 *BC RSS *BC CPA P4 *BC RSS *BC CPA P5 *BC RSS *BC CPA B6 *BC RSS *BC CPA B13 *BC RSS *BC CPA B15 *BC RSS *BC CPA B24 *BC RSS *BC CPA B25 *BC RSS *BC CPA B14 *BC RSS *BC JMP C78.2 *BC LDA \MODE *BC CPA P7 *BC JMP DONE? *BC CPA P8 *BC JMP DONE? *BC * *BC C78.2 LDA ST.1 *BC CPA B22 *BC RSS ALSO ABORT IF ERROR 22,23 AND *BC CPA B23 AB.B HAS BEEN SET TO 1 *BC RSS *BC CPA B27 *BC RSS *BC JMP C78.3 *BC LDA AB.B *BC CPA P1 *BC RSS *BC JMP C78.3 *BC CLA *BC STA AB.B *BC JMP DONE? *BC * *BC C78.3 JMP C78?,I RETURN *BC ** END C78? ** ********************************************************************** ********************************************************************** SKP ********************************************************************** ********************************************************************** ** PASS # ** SPC 1 * DISPLAYS THE CURRENT FORMAT PASS # CONTAINED IN PASSX * PASS# NOP ISZ PASSX BUMP TO CURRENT PASS LDA PASSX AND GET IT JSB ASDEC CONVERT TO ASCII INA MOVE THE CONVERTED VALUE LDB MS25. JSB .MVW DEF P1 NOP * LDB P25 GET PROMT MESSAGE INDEX LDA PASSX CPA P1 IF PASS 1 RSS THEN SEND A BLANK LINE CMB,INB OTHERWISE SIGNAL PROMT NOT TO JSB PROMT JMP PASS#,I * PASSX NOP * ********************************************************************** ********************************************************************** SKP ********************************************************************** ********************************************************************** ** PHS8? AND SAVBD BLOCK ** SPC 1 * * MODE 6 ERROR CONDITIONS: STATUS 7,10,11,21, & INVALID STATUS 2 * IF VERIFYING IN PHASE 8, THEN ENTER THE BAD TRACK IN * BDTBL AND SET TARGET ADDRESS FOR NEXT SEEK TO FOLLOWING * TRACK. IN ALL PHASES, RE-SEEK AND TRY OPERATION AGAIN. * PHS8? LDB PHASE ARE WE VERIFYING? CPB P8 JSB SAVBD YES - GO ENTER BAD TRACK # IN BDTBL * LDA \ACTN INSURE THAT A IOR P1 RE-SEEK IS DONE STA \ACTN JSB ONLY1 SET ERCNT TO 1 TRY ONLY JMP ENDBR AND CONTINUE SPC 3 * * SAVBD REQUESTS THE LOGICAL ADDRESS OF THE OFFENDING TRACK * AND CHECKS TO SEE IF THE END OF THE DISC WAS REACHED. * IF SO, PHASE 8 COMPLETES SUCCESSFULLY AND THE NEXT * STEP DETERMINED BY BRANCHING TO PHAS8. * IF PASS 1 THRU 4 OF PHASE 8 THEN THE OFFENDING TRACK'S * CYL/HEAD ADDRESS IS ENTERED IN BDTBL(IF NOT ALREADY * THERE). # BAD TRACKS CANNOT EXCEED 20 (RANDOM CHOICE), * ELSE AN ERROR IS SENT AND FPROC TERMINATED. * IF PASS 5 THEN A FLAG IS SIMPLY SET SO THAT THE WARNING * MESSAGE IS DISPLAYED AT THE END OF FPROC. * SAVBD NOP XLOVR JSB XLGAD REQUEST THE LOGICAL DISC ADDRESS DEF *+7 OF THE BAD TRACK DEF \DLU DEF \DUNT DEF LGCYL DEF LGHD DEF LGSCT DEF IER JSB CKST1 JMP XLOVR PWR FAIL-TRY OVER AFTER NRDY MSG NOP ERROR RTN-NOT APPLICABLE**DON'T MOVE * LDA LGCYL END OF DISC? (JUST CHECKING CPA P76 THE CYL SHOULD BE ENOUGH) JMP PHAS8 YES, GO SET UP NEXT PASS * LDB BPATT IF FINAL VERIFY PASS, THEN SZB,RSS SET WARNING FLAG SO JMP SETWF MESSAGE WILL BE PRINTED * LDA BADFT SCAN BAD TRACK TABLE FOR CMA A MATCHING ADDRESS STA TEMP2 SET LOOP COUNTER LDB BFTBL AND TABLE POINTER STB TEMP3 * DLD LGCYL GET DEFECTIVE ADDRESS ALOOP ISZ TEMP2 DONE WITH THE SEARCH? RSS CONTINUE JMP ENTER NO MORE ADDRESS PAIRS CPA TEMP3,I SAME CYL? RSS JMP NEXTP TRY NEXT PAIR ISZ TEMP3 CPB TEMP3,I SAME HEAD? JMP SETSK YES, SO JUST RESET SEEK BEFORE CONTINUING RSS NO NEXTP ISZ TEMP3 POSTION TO NEXT ISZ TEMP3 ADDRESS PAIR JMP ALOOP * ENTER LDA BADFT LIMIT OF 20 EXCEEDED? CPA P20 JMP BMEDA YES! ISZ BADFT BUMP COUNT DLD LGCYL ELSE SAVE BAD TRACK DST TEMP3,I IN NEXT POSITION OF BDTBL * SETSK JSB CVLOG CONVERT THAT ADDR TO LOGICAL TRACK # INA SET SEEK TO NEXT TRACK AFTER DEFECT. STA TEMP2 SAVE FOR SETTING SECTOR COUNT JSB DADTR RECONVERT TO CYL/HEAD ADDR DST SKCYL AND SET FOR NEXT SEEK CPA P77 END OF DISC?-DON'T SEEK IF SO JMP PHAS8 YES, GO ON TO NEXT STEP * LDA TEMP2 GET # TRACKS VERIFIED SO FAR. MPY P30 CONVERT TO SECTORS. CMA,INA MAKE NEGATIVE & SUBTRACT FROM ADA \DNSD DISC TOTAL-GET # LEFT TO VERIFY STA \D#ST AND SAVE FOR VERIFY COMMAND JMP SAVBD,I CONTINUE * SETWF ISZ WARNG SET FLAG BECAUSE ENCOUNTERED STILL NOP ANOTHER BAD TRACK DURING PASS 5 DLD LGCYL GET BAD ADDRESS SO CAN BUMP IT JMP SETSK FOR THE NEXT SEEK * BMEDA LDB P24 DISPLAY: JSB PROMT "WARNING! POSSIBLE BAD FLOPPY MEDIA..." CCA IF >20 BAD ONES STA \RET ABNORMAL TERMINATON JMP ENDBR * SPC 2 * ONLY1 NOP CCB SET ERCNT TO -1 FOR FLOPPY DISC STB ERCNT SO ONLY 1 TRY MADE BY S/W JMP ONLY1,I * ** END PHS8?/SAVBD BLOCK ** ********************************************************************** ********************************************************************** SPC 3 ********************************************************************** ********************************************************************** ** FAULT ** SPC 1 * ENTRY CONDITIONS: (PROGRAM ERRORS - SHOULDN'T HAPPEN!) * STATUS ERRORS 1,2,12 * UNIMPLEMENTED STATUS ERRORS 3,4,5,6,13,15,24,25 * FAULT CCA HAVE NO CHOICE BUT TO ABORT THIS TASK STA \RET JMP ENDBR SPC 1 ** END FAULT BLOCK ** ********************************************************************** ********************************************************************** SKP ********************************************************************** ********************************************************************** ** RECAL ** SPC 1 * RECAL RECALIBRATE THE DISC ON CYLINDER COMPARE ERRORS * RECAL LDA \MODE IF FORMATTING A FLOPPY CANNOT CPA P6 ISSUE A RECALIBRATE COMMAND JMP PHS8? CORRECTIVE ACTION IF PHASE 8 OF MODE 6 ISZ ERCNT UP THE ERROR COUNT: FATAL YET?? JMP AGAIN NO: SEND RECALIBRATE COMMAND AND TRY AGAIN CPA P5 IF MODE 5 THEN WE'RE READING W/OFFSET JMP NEWOF EACH SECTOR SO TRY NEXT OFFSET * JSB CYLER DISPLAY "CYLINDER COMPARE ERROR" AND ETC. CCA STA \RET SET RETURN STATUS FOR ABORT JMP ENDBR * * KLUDGE FOR 7910 DISCS * AGAIN LDA \D#ST GET SEC/TRK CPA P32 JMP SEEK0 * JSB XRCAL SEND A RECAL COMMAND DIRECTLY TO DRIVER LIBRARY. DEF *+4 DEF \DLU+0 DEF \DUNT+0 DEF IER JMP RCOUT * SEEK0 JSB XSEEK SIMULATE A RECALIBRATE FOR 7910 DEF *+9 DEF \DLU+0 DEF \DUNT+0 DEF P0 CYLINDER DEF P0 HEAD DEF P0 SECTOR DEF STAT1 DEF STAT2 DEF IER * * RCOUT LDA \ACTN GET \ACTN WORD FOR FIXUP IOR P1 SET \ACTN(1) -FORCE A SEEK ! JMP ENDBR GO TRY AGAIN-SAME PHASE,SAME COMMAND,W/ SEEK SPC 1 ** END RECAL BLOCK ** ********************************************************************** ********************************************************************** SKP ********************************************************************** ********************************************************************** ** DSKER/DEFTR ** SPC 1 * DSKER ENTRY CONDITIONS (DATA ERRORS): * STATUS 10,16,17 ERRORS * INVALID STATUS 2 ERROR * * DEFTR ENTRY CONDITIONS: * STATUS 21 ERROR * DSKER ISZ ERCNT STEP THE ERROR COUNTER: FATAL # ERRORS YET?? JMP ENDBR NO: GO TRY THE SAME THING AGAIN * * YES: CHECK WHICH MODE WE'RE IN AND DO SOMETHING * SPC 1 ********************************************************************** * BEGIN INCASE(\MODE): DEFTR * SPC 1 DEFTR LDA TBL05 ADA \MODE JMP A,I * TBL05 DEF * NOP N/A JMP ENDBR N/A JMP DSK03 JMP DSK04 JMP DSK05 JMP PHS8? ACTION IF PHASE 8 (VERIFY) JMP DSK78 ACTION IF MODE 7 OR 8 *BC JMP DSK78 " " " " " " *BC * SPC 1 * * MODE=3: WRITE INIT TRACK - SET UP FOR STATUS READ TO NEXT SPARE * DSK03 LDA PHASE CHECK TO SEE WHICH PHASE WE'RE IN ADA N3 SEPARATE PHASE 1,2 FROM PHASE 3,4,5,6 SSA,RSS FOR PHASE 1,2: SAVE PHYSICAL ADDR OF BAD TRACK JMP GTSPR FOR PHASE 3,4,5,6 WE'VE ALREADY SAVED BAD TRACK ****** IGNORE ERROR IF PHASE 5? IF PHASE4, GOTO PHASE6?? *********** * CLA SIGNAL RPORT TO SEND: STA IDXPR "BAD TRACK..." DLD CYL# SAVE ADDRESS OF BAD TRACK DST BDCYL JSB RPORT GO REPORT BAD TRACK-ALSO PRINT HEADER IF FIRST TIME * GTSPR JSB NIXSP GET THE NEXT POTENTIAL SPARE FOR THIS SUBCHANNEL JMP ENDBR ERROR RETURN FOR NIXSP - IE. OUT OF SPARES! DST SKCYL SEEK TO THE SPARE-WE'RE GOING FOR ITS STATUS DST ARCYL SET UP ADDRESS RECORD * CLB STB FLMSK TURN OFF AUTO-SEEK TO SPARE * LDA P3 STA PHASE SET PHASE3: STATUS READ TO POTENTIAL SPARE LDA A067 SET THE ACTION WORD FOR STA \ACTN SEEK,RDFS,STFIX, TO GET TRACK'S STATUS JMP ENDBR SPC 1 * * MODE=4: SPARE INITIALIZATION/CLEANUP MODE. * DSK04 LDA PHASE WHICH PHASE ARE WE IN?? CPA P6 DID WE JUST GET DONE FLAGGIN IT DEFECTIVE?? JMP DSKRT YES: RETURN "OK" STATUS TO MAIN & CLEAN UP NEXT SPARE * ALSO REPORT BAD TRACK * LDA S001 NO: LET'S GO INIT THE SPARE & FLAG IT DEFECTIVE STA SPD SET DEFECTIVE BIT(0) LDA P6 STA PHASE SET PHASE6: WRITE INIT. A SPARE-FLAG DEFECTIVE * DLD SKCYL MAKE SURE THAT THE ADDRESS IS THERE DST ARCYL ESPECIALLY FOR MODE 5 LDA A207 SET ACTION FLAG: ADRC,WRIT INIT STA \ACTN JMP ENDBR ALL SET?? OK-AROUND WE GO AGAIN. * DSKRT LDA P2 SIGNAL RPORT TO SEND: STA IDXPR "BAD SPARE..." DLD SKCYL GET CYL/HEAD OF THIS BAD SPARE JSB RPORT GO REPORT SPARE AS BAD TRACK CLA,INA STA \RET RETURN TO MAIN WITH OK STATUS- WE'RE DONE W/ THIS ONE JMP ENDBR SPC 1 * * MODE=5: SPARING ONE TRACK * DSK05 LDA PHASE SZA,RSS IF STILL READING SECTORS JMP NEWOF THEN TRY A NEW OFFSET * CPA P5 IF PHASE 5 THEN JMP PHA5 IGNORE ERROR ON BAD TRACK CPA P4 IF A WRITE INIT JMP DSK04 TO SPARE THEN MARK IT DEFECTIVE JMP PHAS6 GET THE NEXT SPARE SINCE THIS WAS DEF SPC 1 * END INCASE(\MODE); * ********************************************************************** SPC 1 ** END DSKER/DEFTR BLOCK ** ********************************************************************** ********************************************************************** SKP ********************************************************************** ********************************************************************** ** DSK78 - DISC DRIVER ROUTINE ** * *BC * ENTERED IN THE EVENT OF AN ERROR STATUS 10,16,17,21 AFTER *BC * 10 RE-TRYS IF "RE" COMMAND OR 0 RE-TRYS IF "VE" COMMAND *BC * *BC DSK78 LDA ST1 GET THE STATUS WORD *BC CPA B10 DATA ERROR? *BC RSS YES. SAY "BAD TRACK" *BC CPA B17 DATA ERROR? *BC RSS YES *BC CPA B21 DEFECTIVE TRACK? *BC RSS YES *BC CPA B22 *BC RSS *BC CPA B23 *BC RSS *BC JMP E16 *BC * *BC CLA PRINT "BAD TRACK" *BC STA IDXPR *BC DLD CYL# *BC DST BDCYL *BC JSB RPORT *BC EEX CCA *BC STA \RET *BC JMP ENDBR RETURN TO MAIN *BC * *BC E16 LDB P29 PRINT... *BC JSB PROMT "UNEXPECTED HARDWARE FAILURE" *BC JMP EEX *BC * *BC * CONSTANTS *BC * *BC B11 OCT 11 *BC B16 OCT 16 *BC B10 OCT 10 *BC AB.B NOP *BC B12 OCT 12 *BC B6 OCT 6 *BC B13 OCT 13 *BC B15 OCT 15 *BC B14 OCT 14 *BC B24 OCT 24 *BC B25 OCT 25 *BC B27 OCT 27 *BC B22 OCT 22 *BC ** END DSK78 ** ********************************************************************** ********************************************************************** SKP ********************************************************************** ********************************************************************** ** EOCYL ** SPC 1 * * EOCYL ENTRY CONDITIONS: * STATUS ERRORS 11 AND 14 * SEEK CHECK FROM ST2ER * EOCYL LDA \MODE IF MODE 5 CPA P5 THEN TRY A NEW OFFSET VALUE JMP NEWOF CPA P6 IF MODE 6 THEN JMP PHS8? DETERMINE APPROPRIATE ACTION TO TAKE * LDA ST1 *BC CPA B22 *BC RSS *BC CPA B23 *BC RSS *BC JMP SP *BC CLA,INA *BC STA AB.B *BC * *BC * *BC SP JSB SPECR SEND ERR MSG:"INVALID DISC SPECIFICATIONS XX" CCA STA \RET RETURN ABORT STATUS TO MAIN JMP ENDBR SPC 1 ** END EOCYL BLOCK ** ********************************************************************** ********************************************************************** SKP ********************************************************************** ********************************************************************** ** ILSPR ** SPC 1 * ILLEGAL SPARE (STATUS 20 ERROR) * APPARENTLY DID A SEEK TO A TRACK W/ ITS SPARE BIT SET * SPC 1 ********************************************************************** * BEGIN INCASE(\MODE): * SPC 1 ILSPR LDA TBL06 ADA \MODE JMP A,I * TBL06 DEF * NOP N/A JMP ENDBR N/A JMP ILS03 CHECK WHICH PHASE WE'RE IN. JMP ILS04 MODE4: SPARE INITIALIZE/CLEANUP MODE. JMP NEWOF NEW OFFSET VALUE - WILL EVENTUALLY GET TO NUSEC JMP ENDBR N/A JMP MD78 *BC JMP MD78 *BC * MD78 LDA P2 *BC STA IDXPR *BC DLD CYL# PRINT... *BC DST BDCYL "BAD SPARE" *BC JSB RPORT *BC CCA *BC STA \RET *BC JMP ENDBR *BC SPC 1 * * MODE=3: * ILS03 LDA PHASE WHICH PHASE ARE WE IN?? CPA P3 PHASE3&1 ARE THE ONLY LEGAL PHASES FOR THIS MODE JMP ILPH3 PHASE3: WE WERE CHECKING THE STATUS OF A SPARE. * * PHASE=1: WE JUST DID A STATUS READ TO INIT TRACK & FOUND ITS SPARE * BIT SET-RECLAIM IT AND USE IT. * ILPH1 CLB PRESET SPD BITS FOR MODE3 STB SPD SET IT. * ISZ PHASE SET PHASE2: WRITE INITIALIZE THE TRACK LDA A207 SET ACTION WORD FOR WRT INIT STA \ACTN JMP ENDBR AROUND WE GO AGAIN..RECLAIM THIS OLD SPARE FOR DATA. * * PHASE=3: WE JUST DID A STATUS READ TO A POTENTIAL SPARE. ITS SPARE * BIT WAS SET-INDICATING IT IS ALREADY IN USE. GO GET THE * NEXT POTENTIAL SPARE & CHECK ITS STATUS. * ILPH3 JSB NIXSP GET NEXT SPARE JMP ENDBR ERROR RETURN FOR NIXSP - IE. OUT OF SPARES! DST SKCYL DST ARCYL SET UP SEEK AND ADDR REC'D COMMANDS W/ ADDR JMP ENDBR SAME PHASE & \ACTN AS LAST TIME-STATUS WRT TO SPARE SPC 1 * * MODE=4: SPARE INIT/CLEANUP MODE * WE JUST DID A STATUS READ TO SPARE AREA, AND FOUND THE TRACK * ALREADY IN USE AS A SPARE, BUT REUSE IT. * ILS04 CLA STA SPD CLEAN SPD BITS * ISZ PHASE STEP INTO PHASE4- WRITE INITIALIZE SPARE LDA A207 STA \ACTN SET ACTION WORD FOR INIT JMP ENDBR GO AROUND AGAIN SPC 1 * END INCASE(\MODE); * ********************************************************************** SPC 1 ** END ILSPR BLOCK ** ********************************************************************** ********************************************************************** SKP ********************************************************************** ********************************************************************** ** ST2ER ** SPC 1 * STATUS-2 ERROR POSSIBLE CONDITIONS ARE: * NOT READY SEND MESSAGE TO READY DISC * FORMAT SW OFF SEND MESSAGE TO TURN ON FORMAT SW * PROTECTED SEND MESSAGE TO TURN OFF PROTECT * NONE OF ABOVE GO TO DSKER & PROCESS AS DATA ERROR * * INPUTS: * A=STAT1 * B=STAT2 * ST2ER SSB,RSS JMP NST2 * * ASSUME NOT READY OR SEEK CHECK ERROR * LDA B AND P4 IS SEEK CHECK BIT SET?? SZA JMP EOCYL YES- "INVALD DISC SPEC'NS" ERROR * NRERR JSB NRDER NO- NOT RDY ERR- TELL OPERATOR JMP RETRY GIVE 'EM ANOTHER CHANCE * * * CHECK IF FORMAT SW OR PROTECT SW ERR * NST2 LDA \R/W SZA JMP DSKER READ- SO CHAULK IT UP AS ANY OTHER ERROR * LDA B GET STAT2 AND B100 MASK WRT PROTECT BIT SZA PROTECT SWTCH SET?? JMP PRTSW YEP- SEND THE ERROR-TURN OF WRT PROT... * LDA B GET STAT2 WORD AGAIN AND B40 FORMAT BIT SET?? SZA JMP DSKER YES- COUNT AS SOME UNKNOWN ST2 ERR FRMSW JSB FRMER NO- TELL 'EM-TURN ON FORMAT SWITCH JMP RETRY START FRESH * PRTSW JSB PROTR TELL 'EM-DISABLE WRITE PROTECT\RD ONLY * RETRY LDA N10 NORMALLY GET 10 RETRIES, BUT LDB \MODE CPB P6 IF A FLOPPY THEN CCA SET TO ONLY ONE TRY LDB PHASE *BC CPB P15 *BC CCA *BC STA ERCNT GIVE THEM MORE TRIES TO DO THE OPERATION LDB \MODE JUST TO BE SURE *BC JMP ENDBR SPC 1 ** END ST2ER BLOCK ** ********************************************************************** ********************************************************************** SPC 4 ********************************************************************** ********************************************************************** ** UWAIT ** SPC 1 * * UWAIT BRANCHED TO ON STATUS 27 ERROR * * IF UNIT/ADDR >7, FLOPPY UNIT >3, OR RETRY 10 TIMES, THEN CALL * SPECR TO ISSUE: "INVALID DISC SPECIFICATONS XX" * UWAIT LDB \MODE IF MODE=6 THEN LDA \DUNT CPB P6 CHECK FLOPPY UNIT JMP UFLOP LDA PHASE *BC CPA P15 *BC JMP UFLOP *BC * CMA,INA IF UNIT/ADDR OUT OF RANGE ADA P7 SSA JMP USPEC THEN ISSUE ERROR ISZ ERCNT ELSE BUMP ERROR COUNTER JMP ENDBR AND TRY AGAIN * USPEC JSB SPECR CCA STA \RET CLA,INA *BC STA AB.B *BC JMP ENDBR * UFLOP ALF,ALF LOOK AT UNIT# AND NOT<3 SZA,RSS IF >=3 JMP ENDBR (CONTINUE) JMP USPEC ERROR * NOT<3 OCT 177774 SPC 1 ** END UWAIT ** ********************************************************************** ********************************************************************** SPC 3 ********************************************************************** ********************************************************************** ** END OF BRANCH TABLE BLOCKS. ** ** ** ********************************************************************** ********************************************************************** SKP ********************************************************************** ********************************************************************** ** ** * BEGIN DISC DRIVER SUBROUTINES ** ** ********************************************************************** ********************************************************************** SPC 5 ********************************************************************** * XFER ROUTINE * SPC 1 * * XFER PROVIDES THE INTERFACE BETWEEN THE SWITCH DRIVER AND THE * DRIVER LIBRARY ROUTINES. IT TAKES THE FLAG WORD "\ACTN" AS * INPUT, AND CALLS THE APPROPRIATE LIBRARY ROUTINES IF THEIR * CORRESPONDING BIT IN \ACTN IS SET. * * * BIT MEANING * * 0 - SEEK - CALL XSEEK * 1 - ADDRESS RECORD - CALL XADRC * 2 - FILE MASK - CALL XFMSK * * 3 - REGULAR READ - CALL XDRED * 4 - READ FULL SECTOR - CALL XRDFS * 5 - STATUS WORD FIXUP - CALL STFIX(GETS SPD BITS AFTER XRDFS) * * 6 - REGULAR WRITE - CALL XDWRT * 7 - WRITE INITIALIZE - CALL XINIT * 8 - VERIFY - CALL XVRFY * * 9 - SEND END COMMAND - CALL XEND * 10 - READ WITH OFFSET - CALL XRDOF * 11 - FORMAT COMMAND - CALL XFRMT * * 12 - * 13 - * 14 - * 15 - * * XFER NOP * XFOVR LDA \ACTN STA TEMP1 SAVE \ACTN WORD * JSB REQST GET STATUS BEFORE ANYTHING JSB CKST1 CHECK IT JMP XFOVR PWR FAIL - TRY WHOLE THING OVER JMP XEXIT ERROR CASE * JSB SKIP? SKIP IF TEMP1(0)=1 & ROTATE RIGHT JMP ADRC? TRY NEXT BIT * SEEK? JSB XSEEK DEF *+9 DEF \DLU+0 DEF \DUNT+0 DEF SKCYL DEF SKHD DEF \SEC# DEF STAT1 DEF STAT2 DEF IER * LDA \D#ST 7910H PATCH-IGNORE ERRONEOUS SEEK ERRS CPA P32 IS IT A 10H (32 SEC/TRACK) ISZ SK10H YEP-SET FLAG FOR CKST1 ROUTINE * JSB CKST1 JMP XFOVR PWR FAIL - TRY WHOLE THING OVER JMP XEXIT ERROR RETURN * ADRC? JSB SKIP? SKIP IF TEMP1(0)=1 & ROTATE RIGHT JMP FMSK? TRY NEXT BIT * JSB XADRC SEND ADDRESS RECORD COMMAND DEF *+7 DEF \DLU+0 DEF \DUNT+0 DEF ARCYL DEF ARHD DEF \SEC# DEF IER * FMSK? JSB SKIP? SKIP IF TEMP1(0)=1 & ROTATE RIGHT JMP READ? TRY NEXT BIT * LDA \D#ST * 7910H PATCH-FLMSK ILLEGAL COMMMAND CPA P32 IS IT A 10H? (32 SEC/TRK) JMP READ? YEP- DON'T SEND IT * JSB XFMSK SEND FILE MASK COMMAND DEF *+5 DEF \DLU+0 DEF \DUNT+0 DEF FLMSK DEF IER * READ? JSB SKIP? SKIP IF TEMP1(0)=1 & ROTATE RIGHT JMP RDFS? GO TRY NEXT BIT * JSB XDRED SEND REGULAR READ COMMAND DEF *+8 DEF \DLU+0 DEF \DUNT+0 DEF \BUFI,I BUFFER ADDRESS DEF LEN POS. # OF WORDS/TRACK DEF STAT1 DEF STAT2 DEF IER JSB CKST1 JMP XFOVR PWR FAIL - TRY WHOLE THING OVER JMP XEXIT ERROR RETURN * RDFS? JSB SKIP? JMP RDFS! TRY NEXT BIT * JSB XRDFS SEND READ FULL SECTOR COMMAND DEF *+8 DEF \DLU+0 DEF \DUNT+0 DEF DPBUF DEF P3 DEF STAT1 DEF STAT2 DEF IER JSB CKST1 JMP XFOVR PWR FAIL - TRY WHOLE THING OVER JMP XEXIT ERROR RETURN * RDFS! JSB SKIP? SKIP IF TEMP1(0)=1 & ROTATE RIGHT JMP WRIT? * JSB STFIX FIX UP ST1 WORD TO REFLECT SPD BITS JMP XEXIT ERROR-EITHER S OR D WAS SET * WRIT? JSB SKIP? SKIP IF TEMP1(0)=1 & ROTATE RIGHT JMP INIT? TRY NEXT BIT * JSB XDWRT SEND REGULAR WRITE COMMAND DEF *+8 DEF \DLU DEF \DUNT DEF \BUFI,I DEF LEN DEF STAT1 DEF STAT2 DEF IER JSB CKST1 JMP XFOVR PWR FAIL - TRY WHOLE THING OVER JMP XEXIT ERROR RETURN * INIT? JSB SKIP? SKIP IF TEMP1(0)=1 & ROTATE RIGHT JMP VRFY? * JSB XINIT DEF *+9 DEF \DLU+0 DEF \DUNT+0 DEF \BUFI,I DEF LEN DEF SPD DEF STAT1 DEF STAT2 DEF IER JSB CKST1 JMP XFOVR PWR FAIL - TRY WHOLE THING OVER JMP XEXIT ERROR RETURN * VRFY? JSB SKIP? SKIP IF TEMP1(0)=1 & ROTATE RIGHT JMP ENDX? * JSB XVRFY SEND A VERIFY COMMAND DEF *+7 DEF \DLU+0 DEF \DUNT+0 DEF \D#ST+0 DEF STAT1 DEF STAT2 DEF IER * LDA IER CHECK FOR TIMEOUT CPA P4 IS IT ?? RSS YES-MUST BE A FLOPPY,SO WAIT JMP NFLOP NO-CONTINUE-STAT1,STAT2 IS VALID * * IF THIS IS A FLOPPY VERIFY,IT MAY TAKE UP TO 6.5 MINUTES, * DEPENDING ON THE FILL VALUE,AND THE # SECTORS TO VERIFY. * A SINGLE-SIDED DISC WITH FILL=0(INTLV=1), 77 TRACK VERIFY, * REQUIRES 15 SEC. TO COMPLETE. EXECUTION TIME IS PROPORTIONAL * TO THE INTERLEAVE VALUE, SO FORMAT USES THIS FORMULA TO COMPUTE * A MAXIMUM REASONABLE EXECUTION TIME BEFORE IT REPORTS "NOT READY" * TO THE OPERATOR: EXEC TIME= 15*INTLV (SEC.) THE SLEEP ROUTINE * INTERPRETS THE A.REG AS THE # OF 5 SEC. POLLS TO ALLOW BEFORE * TAKING THE "NOT READY" RETURN. A 33% SAFETY MARGIN IS ADDED TO * THE ABOVE FORMULA, SO THE FORMULA IS: * # OF 5 SEC.POLLS = INTLV * 4 , WHICH IS MULTIPLIED BY 2 FOR * DOUBLE-SIDED FLOPPIES. * LDA INTLV GET THE INTERLEAVE VALUE MPY P4 X 20 SEC. (5 SEC PER POLL) LDB \DNSU GET NUMBER OF SURFACES(1 OR 2) SLB,RSS IS IT DOUBLE SIDED?? CLE,ELA YES-MULTIPLY EXECUTION TIME BY 2 CLB SET INITIAL SLEEP=0,POLL IMMEDIATELY. * 'CAUSE MAY RETURN WITH VRFY ERR ANY TIME. * JSB SLEEP POLL WITH A "DSJ" EVERY 5 SEC. JMP NFLOP TIMEOUT RET-SEND "READY DISC ..." JSB REQST OK RET-GET VALID STAT&CONTINUE * NFLOP JSB CKST1 JMP XFOVR PWR FAIL - TRY WHOLE THING OVER JMP XEXIT ERROR RETURN * ENDX? JSB SKIP? SKIP IF TEMP1(0)=1 & ROTATE RIGHT JMP RDOF? * JSB XEND SEND END COMMAND DEF *+3 DEF \DLU+0 DEF \DUNT * RDOF? JSB SKIP? SKIP IF TEMP1(0)=1 & ROTATE RIGHT JMP FRMT? TRY NEXT BIT * LDA \D#ST KLUDGE FOR 7910H(CAN'T RD W/ OFFSET) CPA P32 JMP RDF10 YES-IT'S A 10H-DO SPCL THING JSB XRDOF SEND A READ WITH OFFSET COMMAND DEF *+9 DEF \DLU DEF \DUNT DEF RBUFR USE REPONSE BUFFER, THEN MOVE DEF P128 TO \BUFA VIA BPTR DEF OFSET DEF STAT1 DEF STAT2 DEF IER JMP CKROF CHECK STATUS * RDF10 JSB XDRED GO DO REG READ FOR 7910H DEF *+8 DEF \DLU+0 DEF \DUNT+0 DEF RBUFR USE RESPONSE BUFR, THEN MOVE DEF P128 DEF STAT1 DEF STAT2 DEF IER * CKROF JSB CKST1 JMP XFOVR PWR FAIL - TRY WHOLE THING OVER JMP XEXIT ERROR RETURN * FRMT? JSB SKIP? JMP XEXIT * JSB XFRMT SEND FORMAT COMMAND TO FLOPPY DEF *+7 DEF \DLU DEF \DUNT DEF BPATT DEF FTYP DEF INTLV DEF IER * * WORST CASE EXECUTION TIMES FOR THE 88020 FORMAT COMMAND * ARE AS FOLLOWS: * SINGLE SIDED: 39 SEC. * DOUBLE SIDED: 77 SEC. * * THE FOLLOWING CODE CALLS THE SLEEP ROUTINE AND WAITS FOR * A "REASONABLE" LENGTH OF TIME BEFORE SENDING THE "READY DISC..." * MESSAGE. "REASONABLE" IS DEFINED AS FOLLOWS: * * SINGLE SIDED: 70 SEC. (30 SEC. INITIAL WAIT + 40 SEC. POLLING) * DOUBLE SIDED: 100 SEC. (60 SEC. INITIAL WAIT + 40 SEC. POLLING) * * THESE VALUES ARE CHOSEN VERY CONSERVATIVELY IN HOPES THAT THEY * WILL WORK FOR THE 9895A FLOPPY WHEN IT IS AVAILABLE. JJC 790917 * LDB P30 SLEEP FOR 30 SEC INITIALLY(SNGL SIDED) LDA \DNSU GET # OF SURFACES SLA,RSS CLE,ELB SLEEPX2 =70 SEC FOR DOUBLE SIDED LDA P8 WAIT (8X5)=40SEC MORE(POLL EVERY 5 SEC) JSB SLEEP GO TO SLEEP WHILE XFRMT FINISHES RSS TIMEOUT-SEND "NOT RDY..."/ JMP FMTOK OK RETURN-GO GET STATUS * JSB NRDER SEND "READY DISC.." JMP XFOVR TRY THE WHOLE THING OVER * FMTOK JSB REQST GET STATUS FROM FORMAT JSB CKST1 JMP XFOVR PWR FAIL - TRY WHOLE THING OVER NOP ERROR RETURN * * XEXIT LDA ST1 GET 5 BIT FIELD FROM STAT1 WORD LDB STAT2 GET STAT2 WORD IN B FOR THE RETURN JMP XFER,I RETURN TO DRIVER W/ STATUS IN A&B * SPC 1 * END XFER ROUTINE * ********************************************************************** SPC 3 ********************************************************************** * SLEEP ROUTINE-FOR UNUSUALLY LONG FLOPPY OPERATIONS * SPC 1 * "SLEEP" DOES A DSJ COMMAND TO THE FLOPPY CONTROLLER TO FIND * OUT IF THE DISC HAS COMPLETED THE PREVIOUS OPERATION. IF THE * RETURNED DSJ=4, THIS IS A TIME-OUT AND WE KNOW THE CONTROLLER IS * STILL BUSY. IF DSJ=0 OR 1,WE KNOW THE OPERATION IS COMPLETE AND * RETURN. IF THE CONTROLLER IS BUSY ON ENTRY TO "SLEEP",WE SUSPEND * FORMT FOR THE NUMBER OF SECONDS IN THE B.REG. AFTER THE 1ST * INITIAL SLEEP (FOR B.REG SECS.) REPEATEDLY SLEEP FOR 5 SEC. AND * DO ANOTHER DSJ TO SEE IF THE CONTROLLER IS DONE. THIS 5 SEC POLLING * CONTINUES FOR A MAX. OF (A.REG) POLLS. AFTER THIS THE "NOT READY" * RETURN IS TAKEN. * * B.REG=NUMBER OF SECONDS TO SUSPEND FORMT BEFORE POLLING BEGINS * A.REG=NUMBER OF 5 SEC. POLLS ALLOWED BEFORE "NOT READY" RETURN * * RETURNS: * (P+1): DISC NOT READY-OPERATION TOOK LONGER THAN ALLOWED * (P+2): SUCCESSFUL COMPLETION ( IN ALLOWED TIME) * SLEEP NOP CMA SET # 5 SEC POLLS NEGATIVE STA WTCNT SAVE FOR LOOP COUNTER CMB,INB MAKE INITIAL WAIT NEG FOR EXEC. STB WTSEC * POLL JSB XDSJ ISSUE DSJ-SEE IF CONTROLLER IS TALKING DEF *+4 DEF \DLU+0 DEF \DUNT+0 DEF IER EXPECT IER=4 UNTIL OPERATION COMPLETE * LDA IER CPA P4 JMP SNOOZ SUSPEND FORMT FOR (-WTSEC) SECS. ISZ SLEEP INCR RET TO (P+2)-NORMAL RET JMP SLEEP,I TAKE NORMAL COMPLETION * SNOOZ LDB WTSEC GET SLEEP TIME FOR EXEC SZB,RSS JMP GOPOL DON'T DO EXEC SLEEP IF TIME=0 JSB EXEC SUSPEND FORMT FOR -WTSEC SECONDS DEF *+6 DEF P12 OPCODE DEF P0 PROG NAME=0 (SAVE PT. OF SUSPEND) DEF P2 UNITS=2=SECONDS DEF P0 EXECUTION MULTIPLE (ONCE) DEF WTSEC SUSPEND TIME * GOPOL ISZ WTCNT BUMP WAIT LOOP COUNTER RSS HASN'T ROLLED OVER-WAIT AGAIN JMP SLEEP,I OUT OF TIME-(P+1) NRDY RETURN * LDA N5 POLL TIME= 5 SEC. STA WTSEC SET POLL JMP POLL DO DSJ AGAIN-WAIT 5 AGAIN * WTSEC NOP NEG # SEC TO SUSPEND WTCNT NOP # 5 SEC POLLS AFTER 1ST WAIT * SPC 1 * END SLEEP ROUTINE * ********************************************************************** SPC 3 ********************************************************************** * SKIP? ROUTINE-TEST & ROTATES TEMP1 * SPC 1 * RETURN: (P+1) - IF BIT0 TEMP1=0 * (P+2) - IF BIT0 TEMP1=1 * ALSO ROTATES TEMP1 RIGHT BEFORE RETURNING * SKIP? NOP LDA TEMP1 SLA,RAR ISZ SKIP? INCREMENT RETURN ADDRESS STA TEMP1 JMP SKIP?,I RETURN SPC 1 * * ********************************************************************** SPC 4 ********************************************************************** * CKST1 ROUTINE * SPC 1 * CKST1: 1) CHECKS IER TO SEE IF PWR. FAIL,DSJ^=0,OR TIME OUT IN LAST * DRIVER LIBRARY REQUEST. * -IF TIMEOUT(IERR=4):SEND NOT RDY ERROR&TAKE PWR FAIL RETURN * -IF PWR FAIL,DO STATUS TO CLR DSJ&TAKE PWR FAIL RETURN. * 2) SIFTS OUT THE 5 BIT S1 FIELD FROM STAT1 * 3) IF S1=37 (ATTENTION), REQUEST STATUS AGAIN UNTIL S1^=37. * * RETURN: (P+1): POWER FAIL/NOT READY RETURN * (P+2): STATUS ERROR RETURN-(ST1 NOT = 0) * (P+3): NORMAL RETURN- ST1=0 * CKST1 NOP STOVR LDA IER CPA P4 IS IT A TIMEOUT?? JMP PFAIL YEP. * CPA P2 IS IT A POWER FAIL?? JMP PFAIL YEP. * LDA STAT1 ALF,ALF AND B37 MASK S1 OFF STAT1 WORD CPA B37 ATTENTION?? RSS YES-ASK FOR STATUS AGAIN JMP RTNST NO-RETURN THE CURRENT STATUS * JSB REQST REQUEST STATUS JMP STOVR EXAMINE STATUS AGAIN * PFAIL JSB NRDER SEND "READY DISC ..ENTER " "RET" JSB REQST CLEAR DSJ WITH A REQ. STATUS COMMAND JMP CKST1,I TAKE POWER FAIL RETURN (P+1) * RTNST ISZ CKST1 STEP RETURN ADDR-INDICATES VALID STATUS LDB SK10H IS THIS A 7910H SEEK OPERATION?? SZB,RSS JMP NOT10 RETURN STANDARD STATUS * CLA LDB STAT2 CHECK STATUS 2 BEFORE IGNORING SSB LDA B23 FAKE A STATUS 2 ERR IN ST1 CLB STB SK10H RESET THE KLUDGE FLAG * NOT10 STA ST1 RETURN THE STATUS IN ST1 SZA,RSS ISZ CKST1 SET (P+2) RETURN- NORMAL JMP CKST1,I * SK10H NOP FLAG TO INDICATE 7910H SEEK- * IGNORE STATUS 1 WORD IN THIS CASE SPC 1 * END CKST1 * ********************************************************************** SPC 3 ********************************************************************** * STFIX ROUTINE * * * STFIX -IS CALLED AFTER A READ FULL SECTOR IN ORDER TO * DETERMINE IF THE S OR D BIT IS SET ON THE CURRENT TRACK. * THIS USED TO BE DETERMINED BY DOING A FAKE WRITE FOR STATUS * IN RTEIVA SWTCH.SOME DISCS DO NOT SUPPORT FILE MASK,SO A * READ FULL SECTOR & JSB STFIX REPLACES THE OLD FAKE WRITE. * STFIX NOP CLB LDA HDSSP GET THE SPD/HEAD/SECTOR WORD RAL,SLA,RAL FROM THE PREAMBLE RETURNED BY XRDFS LDB ST20 FAKE A STATUS 20-ILLEGAL ACCESS TO SPARE RAL,SLA NOW TEST D BIT LDB ST21 FAKE A STATUS 21-DEFECTIVE TRACK STB ST1 SAVE IT AWAY AS JSB CKST1 WOULD DO * SZB,RSS ISZ STFIX INCR RETURN ADDR IF NO S OR D ERROR JMP STFIX,I RETURN SPC 1 * * ********************************************************************** SPC 4 ********************************************************************** * REQST ROUTINE * SPC 1 * REQST CALL THE DRIVER LIBRARY TO GET THE STATUS OF THE DISC DRIVE * REQST NOP JSB XSTAT DEF *+6 DEF \DLU+0 DEF \DUNT+0 DEF STAT1 DEF STAT2 DEF IER JMP REQST,I * SPC 1 * END REQST * ********************************************************************** SKP ********************************************************************** * NIXSP ROUTINE * SPC 1 * * NIXSP FINDS THE NEXT POTENTIAL SPARE ON THE CURRENT SUBCHANNEL * AND CONVERTS ITS LOGICAL ADDRESS TO PHYSICAL AND STORES * IT IN CYL#,HEAD#, AND UNIT#. * * CALLING SEQUENCE: * * * JSB NIXSP * A = IGNORED * B = IGNORED * * RETURN: * (P+1): ERROR RETURN - IE. OUT OF SPARES! * (P+2): NORMAL RETURN - NEXT POTENTIAL SPARE ADDR IN A&B * A = CYL# OF NEXT POTENTIAL SPARE * A = -1 IF OUT OF SPARES * B = HEAD# OF NEXT POTENTIAL SPARE * * NIXSP NOP LDA \DNSP GET NUMBER OF SPARES FOR THIS SUBCHANNEL CPA CRSP# ARE THERE NO MORE SPARES?? JMP NMORE NOPE- THEY'RE ALL GONE- SEND BAD SPEC MESSAGE. * LDA \DNTR GET LAST TRACK ON THIS SUBCHANNEL ADA CRSP# COMPUTE LOGICAL ADDRESS OF NEXT POTENTIAL SPARE * JSB DADTR GO SET UP PHYSICAL ADDRESS OF NEXT SPARE:CYL,HEAD,UNIT ISZ CRSP# ADVANCE CURRENT SPARE COUNTER ISZ NIXSP SET NORMAL RETURN ADDRESS : (P+2) JMP NIXSP,I RETURN WITH SUCCESSFUL STATUS * NMORE LDB P12 SEND MESSAGE: JSB PROMT "OUT OF SPARE TRACKS FOR THIS LU" CCA SEND ERROR FLAG TO CALLING ROUTINE. STA \RET SET ABORT FLAG SO MAIN KNOWS WHATS HAPPENING JMP NIXSP,I ERROR RETURN SPC 1 * END NIXSP * ********************************************************************** SKP ********************************************************************** * DADTR * SPC 1 * DADTR ROUTINE TO TRANSLATE A LOGICAL TRACK ADDRESS INTO * PHYSICAL CYL,HEAD,UNIT/ADDR ON THE DISC. * * CYL AT: CYL# * HEAD AT: HEAD# * UNIT AT: UNIT# * * CALLING SEQUENCE: * * LDA TRACK SET LOGICAL TRACK ADDRESS IN A. * JSB DADTR CALL * * RETURN: * * (P+1) * A = CYL# * B = HEAD# * * DADTR NOP CLB DIVIDE # TRACKS BY DIV \DNSU NUMBER OF HEADS/CYL ADA \DFTR ADD BASE CYLINDER ADDRESS STA CYL# SET THE CYLINDER ADDRESS * ADB \DSHD ADD THE BASE HEAD ADDRESS STB HEAD# STORE IT AS PROMISED * JMP DADTR,I RETURN A= UNIT, B=HEAD * CYL# NOP HEAD# NOP * SPC 1 * * ********************************************************************** SPC 4 ********************************************************************** * CVLOG * SPC 1 * CVLOG CONVERTS PHYSICAL DISC ADDR IN A&B TO * A LOGICAL TRACK # IN REG. A * INPUTS: * A = PHYSICAL CYLINDER # * B = PHYSICAL HEAD# * * RETURN: * (P+1) * A = LOGICAL TRACK ON CURRENT SUBCHANNEL * CVLOG NOP STB TEMP1 SAVE HEAD # * LDB \DFTR FIRST CYLINDER # CMB,INB MAKE NEGATIVE ADA B COMPUTE LOGICAL CYL# MPY \DNSU MULT. BY # OF HEADS * LDB \DSHD GET STARTING HEAD CMB,INB MAKE NEG ADB TEMP1 GET LOGICAL HEAD# * ADA B ADD IT TO (CYL# X #HEADS) JMP CVLOG,I RETURN A=LOGICAL TRACK# SPC 1 * * ********************************************************************** SPC 5 ********************************************************************** * RPORT ROUTINE * SPC 1 * * RPORT SENDS THE MESSAGES: * FOR IDXPR=0: "BAD TRACK XXXX YYYY HH ZZZZ" * FOR IDXPR=1: "SPARED TO XXXX YYYY HH ZZZZ" * FOR IDXPR=2: "BAD SPARE XXXX YYYY HH ZZZZ" * FOR IDXPR=3: "TARGT TRACK XXXX YYYY HH ZZZZ" * * WHERE: * XXXX IS THE LOGICAL TRACK # OF THE CURRENT SUBCHANNEL * YYYY IS THE PHYSICAL CYLINDER # * HH IS THE HEAD# * ZZ IS THE UNIT#/ADDRESS SELECT# * * INPUTS: * A = PHYSICAL CYLINDER # * B = PHYSICAL HEAD# * RPCYL - PHYSICAL CYLINDER TO REPORT * RPHD - PHYSICAL HEAD TO REPORT * * USED# - I.E. THE NUMBER OF SPARES IS BUMPED IF BAD TRACK * IT ALSO SENDS A HEADER IF THIS IS THE FIRST BAD TRACK ON THIS * SUBCHANNEL: * LU XX LOGICAL CYL HEAD ADDR/UNIT * SPC 1 RPORT NOP DST RPCYL SAVE THE DISC ADDR FOR LATER * JSB CVLOG CONVERT ADDR TO LOGICAL TRACK# JSB ASDEC CONVERT TRACK # TO ASCII LDB MSA9. AND STORE IN MESSAGE JSB .MVW DEF P2 NOP * LDA IDXPR IF REPORTING A ... SZA BAD TRACK OR.. CPA P2 BAD SPARE .. ISZ USED# THEN BUMP # SPARES USED * * A REG. HAS MESSAGE TYPE ADA MEFGH "BAD TRACK", "SPARED TO", LDA A,I "BAD SPARE", OR "TARGT TRACK" TO MSG LDB MS09. GET DESTINATION FOR PREAMBLE-WHATEVER IT MAY BE JSB .MVW STUFF THE PREAMBLE IN THE MESSAGE DEF P6 NOP * LDA RPCYL NOW CONVERT JSB ASDEC CONVERT CYLINDER TO ASCII LDB MSB9. JSB .MVW DEF P2 NOP * LDA RPHD CONVERT THE HEAD# TO ASCII AND JSB ASDEC STUFF IT IN MESSAGE INA LDB MSC9. JSB .MVW DEF P1 NOP * LDA \DUNT NOW THE UNIT JSB ASDEC INA LDB MSD9. JSB .MVW DEF P1 NOP * LDA IDXPR IF TARGT TRACK MODE THEN CPA P3 DON'T PRINT THAT JMP NOHD FIRST HEADING * ISZ \BADH HAVE WE OUTPUT THE HEADER YET? JMP RPRT YES...GO OUPUT MESSAGE: XXXXXXXXXX XXXX YYYY HH ZZ * LDA \DSUB INSERT THE SUBCHANNEL # JSB ASDEC IN THE MESSAGE INA LDB MS07. JSB .MVW DEF P1 NOP * LDB P7 JSB PROMT "BAD TRACKS SUBCHANNEL XX" * NOHD LDA \DLU NOW CONVERT AND STUFF JSB ASDEC THE LU # IN THE MESSAGE INA LDB MS08. JSB .MVW DEF P1 NOP * LDB P8 SEND THE MESSAGE: JSB PROMT LU XX LOGICAL CY HD UNIT" AND PRINT IT JSB \BLIN BLANK LINE HERE SINCE NOT DONE AT RPRT * RPRT LDB N9 NEGATIVE SO NO \BLIN CALL JSB PROMT SEND "(BAD TRACK/SPARED) TO XXXX YYYY HH ZZ" * JMP RPORT,I RETURN SPC 1 * END RPORT * ********************************************************************** SPC 5 ********************************************************************** * SPECR ROUTINE * SPC 1 * * SPECR SENDS THE MESSAGE: "INVALID DISC SPECIFICATIONS XX" * * ENTRY CONDITIONS (EXCEPT MODE 5): * STATUS ERRORS 2 (SEEK CHECK ONLY),11,& 14 FROM EOCYL * STATUS ERROR 27 FROM UWAIT * SPECR NOP LDA \DSUB STUFF THE MESSAGE WITH SUBCHANNEL # JSB ASDEC INA LDB MS20. JSB .MVW DEF P1 NOP LDB P20 SEND THE MESSAGE: JSB PROMT "INVALID DISC SPECIFICATIONS XX" JMP SPECR,I RETURN SPC 1 * END SPECR * ********************************************************************** SPC 5 ********************************************************************** * CYLER ROUTINE * SPC 1 * * CYLER SENDS THE MESSAGE: "CYLINDER COMPARE ERROR" * LU XX LOGICAL CYL HEAD ADDR/UNIT * TARGT TRACK XXXX YYYY HH ZZ * * (SEE RPORT FOR EXPLANATIONS) * CYLER NOP LDB P22 DISPLAY MESSAGE JSB PROMT LDA P3 STA IDXPR SET FLAG FOR RPORT TO MOVE "TARGT TRACK" * DLD ARCYL GET SUSPECTED ADDRESS JSB RPORT JMP CYLER,I SPC 1 * END CYLER * ********************************************************************** SPC 5 ********************************************************************** * NRDER ROUTINE * SPC 1 * NRDER SENDS THE MESSAGE: "READY DISC - ENTER " ",CR" * NRDER NOP NROVR LDB P19 JSB PROMT JSB INBLK WAIT FOR THEIR RESPONSE JMP NROVR BAD RESPONSE-PROMT 'EM AGAIN JMP NRDER,I " "CR RESPONSE OK SPC 1 * END NRDER * ********************************************************************** SPC 5 ********************************************************************** * FRMER ROUTINE * SPC 1 * * FRMER SENDS THE MESSAGE: "TURN ON FORMAT SWITCH - ENTER " ",CR" * FRMER NOP FROVR LDB P18 JSB PROMT JSB INBLK JMP FROVR BAD RESPONSE-PROMPT AGAIN JMP FRMER,I " "CR RESPONSE OK SPC 1 * END FRMER * ********************************************************************** SPC 5 ********************************************************************** * PROTR ROUTINE * SPC 1 * * PROTR SENDS THE MESSAGE: "TURN OFF DISC PROTECT - ENTER " ",CR" * PROTR NOP PROVR LDB P17 JSB PROMT JSB INBLK WAIT FOR THEIR RESPONSE JMP PROVR BAD RESPONSE- REPROMPT JMP PROTR,I " "CR RESPONSE OK SPC 1 * END PROTR * ********************************************************************** SPC 5 ********************************************************************** * INBLK * SPC 1 * INBLK CALLS \RDIN TO INPUT A MAX OF ONE WORD, SO THAT THE * OPERATOR CAN SIGNAL SWITCH WHEN THEY ARE READY,AFTER THEY * FLIPPED A SWITCH ON THE DRIVE OR WHATEVER. SPC 1 * RETURNS: (P+1): ERROR RETURN- " "CR RESPONSE WAS NOT GIVEN * (P+2): NORMAL RETURN- VALID " "CR RESPONSE * (JMP DONE?): ABORT TASK AND CLEANUP LOCKS, ETC. SPC 1 INBLK NOP JSB PRESP CHECK RESPONSE JMP INBLK,I NUMERIC-ERROR RETURN JMP DONE? /E,EN,EX JMP INBLK,I "NO"- ERROR RETURN JMP INBLK,I "YES"- ERROR RETURN ISZ INBLK " "CR-- NORM RETURN-INCR TO (P+2) JMP INBLK,I "??"- ERROR RETURN SPC 1 * END INBLK * ********************************************************************** SPC 5 ********************************************************************** ********************************************************************** ** ** * END DRIVER SUBROUTINES * ** ** ********************************************************************** ********************************************************************** SKP ********************************************************************** ********************************************************************** **  VARIABLES,CONSTANTS,MESSAGES,BUFFERS ** SPC 2 BATCH NOP =7 IF BATCH MODE; BITS 210 = PARM2/PARM3/PARM4 BSIZE NOP BUFFER SIZE BASED ON AVAILABLE MEMORY N#SP NOP NEG # OF SPARES FOR CURRENT SUBCHANNEL BPTR NOP BUFR POINTER SLOOP NOP LOOP COUNTER WARNG NOP WARNING FLAG WHEN SPARING ONE TRACK INDEX NOP PROMPT/EXPLANATION MODE INDEX TEMP1 NOP TEMPORARY TEMP2 NOP " TEMP3 NOP " TEMP4 NOP " TEMP5 NOP " * IEQT4 NOP IEQT5 NOP * SKP DBLNK DEF BLNK BLNK OCT 20040 * * \TMT DEF *+1 BSS 8 * * CONSTANTS * N2 DEC -2 N3 DEC -3 N5 DEC -5 N8 DEC -8 N9 DEC -9 N10 DEC -10 N10B DEC 138 NEGATIVE 10: SIGN/MAGNITUDE FORM IN LOW BYTE N60B DEC 188 NEGATIVE 60: SIGN/MAGNITUDE FORM IN LOW BYTE N16 DEC -16 N30 DEC -30 N17 DEC -17 N29 DEC -29 N31 DEC -31 N2001 DEC -2001 * P0 DEC 0 P2 DEC 2 P5 DEC 5 P11 DEC 11 P17 DEC 17 P18 DEC 18 P20 DEC 20 P22 DEC 22 P23 DEC 23 P24 DEC 24 P25 DEC 25 P30 DEC 30 P48 DEC 48 P70 DEC 70 P76 DEC 76 P77 DEC 77 P64 DEC 64 P128 DEC 128 P145 DEC 145 P161 DEC 161 * B17 OCT 17 ST20 OCT 20 FAKE STATUS1 WORD ST21 OCT 21 FAKE STATUS1 WORD B21 EQU P17 B23 OCT 23 B32 OCT 32 B37 OCT 37 B40 EQU BLANK B60 EQU P48 B77 OCT 77 B100 EQU P64 B377 OCT 377 ST.1 NOP *BC B400 OCT 400 B1774 OCT 177400 B2200 OCT 2200 B7700 OCT 177700 M10 OCT 177770 *WL M30 OCT 177750 *WL N64 EQU B7700 DEC -64 * * \ACTN VALUES AND THEIR MEANINGS: * A017 EQU B17 XDRED, XFMSK, XADRC, XSEEK A024 EQU P20 XRDFS, XFMSK A067 OCT 67 STFIX, XRDFS, XFMSK, XADRC, XSEEK A201 OCT 201 XINIT, XSEEK A207 OCT 207 XINIT, XFMSK, XADRC, XSEEK A401 OCT 401 XVRFY, XSEEK A407 OCT 407 XVRFY, XFMSK, XADRC, XSEEK A1000 OCT 1000 XEND A1004 OCT 1004 XEND , XFMSK A2007 OCT 2007 XRDOF, XFMSK, XADRC, XSEEK A4000 OCT 4000 XFRMT ONLY A4001 OCT 4001 XFRMT, XSEEK * S001 EQU P1 D-BIT ONLY S100 EQU P4 S-BIT ONLY * FWA NOP * \SYST NOP SYSTEM TYPE FLAG *WL \ACTN NOP ACTION FLAG WORD TO DRIVE XFER ROUTINE \RET NOP STATUS RETURNED TO MAIN -1/0/1: * -1=ERROR; 0=LOOP DRIVER AGAIN; 1=OK \R/W NOP 0/1 = WRITE/READ \MODE NOP R/W MODE PASSED FROM MAIN MADDR NOP BUFFER ADDRESS FOR DATA PHASE NOP CURRENT PHASE FLAG FOR LOOPING THRU DRIVER CRSP# NOP CURRENT SPARE NUMBER (RANGE= 0 TO \DNSP) USED# NOP # SPARES CONSUMED ON THIS SUBCH ERCNT NOP DISC OPERATION ERROR COUNTER (RANGE:-10 TO 0) OFSET NOP OFFSET VALUE OF READ W/ OFFSETS (-60 TO 60) STRAK NOP SPARE TRACK RETRIEVED FROM XSPAR CALL FLMSK NOP FILE MASK BITS: 4/0 = AUTO-SEEK TO SPARE/NO AUTO SEEK SKCYL NOP PHYSICAL CYLINDER # FOR SEEK COMMAND SKHD NOP PHYSICAL HEAD# FOR SEEK COMMAND ARCYL NOP PHYSICAL CYLINDER # FOR ADDRESS RECORD COMMAND ARHD NOP PHYSICAL HEAD# FOR ADDRESS RECORD COMMAND BDCYL NOP PHYSICAL CYLINDER # FOR CURRENT DEFECTIVE TRACK BDHD NOP PHYSICAL HEAD # FOR CURRENT DEFECTIVE TRACK RPCYL NOP PHYSICAL CYLINDER # FOR REPORT ROUTINE RPHD NOP PHYSICAL HEAD# FOR REPORT ROUTINE ST1 NOP 5-BIT S1 FIELD FROM STAT1 STAT1 NOP STATUS WORD 1 RETURNED FROM DRIVER LIBRARY STAT2 NOP STATUS WORD 2 RETURNED FROM DRIVER LIBRARY IER NOP ERROR INDICATOR FOR DRIVER LIBRARY CALLS SPD NOP INITIALIZE FLAG BITS SPARE/PROTECT/DEFECTIVE LEN NOP POSITIVE # OF WORDS TO TRANSFER * BPATT NOP CURRENT FORMAT BIT PATTERN BPAT1 OCT 0306 PATTERN C6H BPAT2 OCT 0143 PATTERN 63H BPAT3 OCT 0155 PATTERN 6DH BPAT4 OCT 0210 PATTERN 88H BPAT5 EQU P0 PATTERN 00H FTYP NOP HP TYPE=2, BIT7=0/1 FOR NO/YES FORMAT OVERRIDE INTLV NOP SECTOR INTERLEAVE VALUE, 1-29 LGCYL NOP CYLINDER# FOR REQUEST LOGICAL ADDR LGHD NOP HEAD# FOR REQUEST LOGICAL ADDR LGSCT NOP SECTOR# FOR REQUEST LOGICAL ADDR \FILL NOP USER REQUESTED FILL VALUE YOVRD OCT 202 NEW FORMAT (YES=OVERRIDE), WITH TYPE= 2 NOVRD EQU P2 PRESERVE OLD FORMAT (NO=OVERRIDE),TYPE=2 BADFT NOP # BAD TRACKS ENCOUNTERED BFTBL DEF *+1 ALLOW A MAXIMUM OF 20 BAD TRACKS BSS 40 FOR A FLOPPY DISC (SAVE CYL & HEAD) * \BADH DEC -1 BAD TRACKS HEADER FLAG * SKP ********************************************************************** ********************************************************************** ** FORMT MESSAGES AS DISPLAYED BY PROMT ** SPC 1 * MES00 ASC 3,TASK? MES01 ASC 4,DISC LU? MES02 ASC 20,DO YOU REALLY WANT TO FORMAT THIS DISC? MES03 ASC 9,# OF FILL SECTORS? MES04 ASC 10,TRACK TO BE SPARED? MES05 ASC 19,DATA WILL BE DESTROYED, OK TO PROCEED? MES06 ASC 12,# OF GOOD TRACKS = XXXX MS06. DEF MES06+10 MES07 ASC 12,BAD TRACKS SUBCHANNEL XX IFN,IFZ??? *WL MS07. DEF MES07+11 MES08 ASC 5,LU ASC 14, LOGICAL CYL HEAD UNIT/ADDR MES09 ASC 6, STORAGE FOR "BAD TRACK/SPARED TO" MESA9 ASC 3, " TRACK MESB9 ASC 3, " CYL MESC9 ASC 3, " HEAD MESD9 ASC 1, " UNIT/ADDR MESE9 ASC 6,BAD TRACK MESF9 ASC 6,SPARED TO MESG9 ASC 6,BAD SPARE MESH9 ASC 6,TARGT TRACK * MS08. DEF MES08+2 LOCATION OF LU MSA9. DEF MESA9 " TRACK MSB9. DEF MESB9 " CYL MSC9. DEF MESC9 " HEAD MSD9. DEF MESD9 " UNIT/ADDR MEFGH DEF *+1 DEF MESE9 DEF MESF9 DEF MESG9 DEF MESH9 * MES10 ASC 14,XXXX SPARE TRACKS AVAILABLE MES11 ASC 19,WARNING! ALL INFORMATION ON TRACK NOT ASC 13,SUCCESSFULLY RECOVERED MES12 ASC 16,OUT OF SPARE TRACKS FOR THIS LU MES13 ASC 8,INVALID TRACK # MES14 ASC 8,INVALID DISC LU MES15 ASC 7,FORMT FINISHED MES16 ASC 7,FORMT ABORTED MES17 ASC 18,TURN OFF PROTECT OR READ-ONLY SWITCH ASC 8, - ENTER " ",CR MES18 ASC 18,TURN ON FORMAT SWITCH - ENTER " ",CR MES19 ASC 13,READY DISC - ENTER " ",CR MES20 ASC 15,INVALID DISC SPECIFICATIONS XX MS20. DEF MES20+14 MES21 ASC 16,NOT ENOUGH ROOM FOR TRACK BUFFER *WL MES22 ASC 11,CYLINDER COMPARE ERROR  MES23 ASC 17,WARNING! POSSIBLE BAD FLOPPY MEDIA ASC 18, RETRY FORMT OR DISCARD FLOPPY DISC MES24 ASC 15,MAX OF 20 BAD TRACKS EXCEEDED MES25 ASC 8,FORMAT PASS # XX MS25. DEF MES25+7 MES26 ASC 12,OUTDATED SYSTEM SOFTWARE MES27 ASC 13,UNAUTHORIZED LU2,3 ACCESS *BC ASC 10,- (COMMAND IGNORED) *BC MES28 ASC 16,DO YOU REALLY WANT TO RE-FORMAT *BC ASC 8,THE SYSTEM DISC? *BC MES29 ASC 14,UNEXPECTED HARDWARE FAILURE *BC ASC 7,- TASK ABORTED *BC * XPL00 ASC 19,ENTER FO(RMAT), IN(ITIALIZE), SP(ARE), *BC ASC 14, VE(RIFY), RE(FORMAT), EN(D) *BC XPL01 ASC 9,ENTER DISC LU < 64 XPL02 ASC 6,ENTER YE,NO XPL03 ASC 14,ENTER FILL SECTOR VALUE 0-28 XPL04 ASC 13,ENTER BAD TRACK # 0 - XXXX XP04. DEF XPL04+11 * * * BUFFERS * \BUFI NOP ADDR HPIB COMMAND BUFFER PRECEEDING \BUFA \BUFA NOP ADDRESS OF TRACK BUFFER FOR I/O WITH DISC * RBUFR BSS 144 RESP BUFFER,RD WITH OFFSET,& GETST BUFF PSBUF EQU RBUFR+80 33 WORD PARAM BUFF FOR PARSE PTYP2 EQU PSBUF+4 TYPE WORD FOR PARM2 PTYP3 EQU PSBUF+8 TYPE WORD- PARM3 PTYP4 EQU PSBUF+12 TYPE WORD- PARM4 0/1/2=NULL/NUM/ASCII * OPLU DEC 1 DEFAULT OPERATOR LU PARM2 BSS 1 TASK PARAMETER- IN,SP,FO PARM3 BSS 1 DISC LU PARAMETER- < 64 REQ'D PARM4 BSS 1 FILL OR TRACK# TO SPARE PARAMETER PARM5 BSS 1 SPARE PARAM FOR RMPAR TO FILLETER * DPBUF EQU RBUFR HPIB COMMAND BUFFER FOR READ FULL SECT CYLSP EQU RBUFR+17 CYLINDER ADDRESS STORED IN SPARE HDSSP EQU RBUFR+18 HEAD/SECTOR ADDRESS STORED IN SPARE * ********************************************************************** ********************************************************************** END EQU * END FORMT