ASMB,Q,R,C HED SWTCH - SWSG2, 7905 DISK DRIVER SEGMENT NAM SWSG2,5,10 92067-16327 REV.1903 790321 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: SWSG2 * SOURCE: 92067-18327 * BINARY: 92067-16325 * WRITTEN BY: KFH * ******************************************************************* * * * ENTRY POINTS * ENT \DSK5,\STD5,\BADH ENT \INP5,\INT5,\SETD * * * EXTERNAL ENTRY POINTS * EXT \SWTM EXT $LIBR,$LIBX EXT \DFTR,\DNTR,\DSHD,\DNSU,\DNSP EXT \TCH,\TUNT,\DSUB,\DUNT,\TSUB,\D#ST,\D#WT EXT \CVAS,\CLEN,\DSPL,\BLIN EXT \LNTH,\XOUT EXT \INIT,\BOOT,\SAVE EXT \TRAK,\SECT EXT \TMT EXT \FFMP,\STRK * * A EQU 0 B EQU 1 SUP SKP BEG5 JSB \SETD SEGMENT'S ENTRY POINT JMP \SWTM RETURN TO MAIN * * \INP5 OCT 041400 INITIALIZE ,WRITE PROTECT COMMAND BITS \INT5 OCT 001400 " " " FLGPT EQU \INP5 FLGDF OCT 021400 FLGSP OCT 101400 * \BADH NOP BAD TRACKS HEADER FLAG * M17 OCT 17 M37 OCT 37 M177 OCT 177 M174C OCT 17400 M7700 OCT 177700 M1776 OCT 177600 * N10 DEC -10 * P1 DEC 1 P2 DEC 2 P4 DEC 4 P5 DEC 5 P12 DEC 12 P14 DEC 14 P15 DEC 15 P16 DEC 16 P18 DEC 18 SKP * * DETERMINE SUBCHANNEL SPECIFICATIONS, USING INFORMATION * RETRIEVED FROM THE \TMT ENTRY FOR \DSUB. * \SETD NOP LDA \DSUB GET DESTINATION SUBCHANNEL MPY P5 CONVERT TO 5 WORD PER ENTRY OFFSET LDB A ADB \TMT INTO THE \TMT BUFFER LDA B,I GET WORD 0 STA \D#ST AND SET THE SECTORS/TRACK ALF,RAL RAL STA \D#WT SET # WORDS/TRACK INB LDA B,I GET WORD 1 OF ENTRY STA \DFTR AND SAVE STARTING TRACK OF SUBCH INB LDA B,I GET WORD 2 OF ENTRY AND M17 ISOLATE THE UNIT # STA \DUNT AND SAVE LDA B,I NOW GET ALF,ALF AND MASK ALF AND M77 THE STA \DSHD STARTING HEAD LDA B,I ALF,RAL NOW ISOLATE RAL AND M77 THE STA \DNSU NUMBER OF SURFACES INB LDA B,I GET WORD 3 OF ENTRY CLE SET NO-INIT FLAG SSA CCE INIT WANTED FOR THIS SUBCH AND M7777 REMOVE SIGN BIT STA \DNTR SET THE # OF TRACKS INB LDA B,I AND FINALLY STA \DNSP SET THE # OF SPARES RESERVED CLA BUT CLEAR STA UBADC THE NUMBER USED JMP \SETD,I * M7777 OCT 77777 M77 OCT 77 SKP * * INSERT CHNL NO. IN INSTRUCTION * * THE \STD5 SUBROUTINE SETS THE CURRENT DISK CHANNEL * NOS. IN THE I/O INSTRUCTIONS. * * \STD5 NOP LDB HPDSK GET ADDR OF INSTRUCTION ADDR LIST LDA #DATA GET # INSTRUCTIONS TO CONFIGURE STA TEMP1 STDS1 LDA B,I GET INSTRUCTION AND M7700 ISOLATE INSTRUCTION CODE IOR \TCH INSERT CHANNEL NO. STA B,I SET INSTRUCTION IN CODE INB INCR INSTRUCTION ADDRESS ISZ TEMP1 SKIP - ALL INSTRUCTIONS CONFIG. JMP STDS1 CONFIGURE NEXT INSTRUCTION * CCA SET NO HEADER STA \BADH FOR BAD TRACKS JMP \STD5,I RETURN * #DATA ABS I/OTB-I/OTC # DATA I/O INSTRUCTIONS HPDSK DEF I/OTB,I ADDRESS OF INSTRUCTIONS TEMP1 NOP SKP * * THE DRIVER ENTERS HERE AFTER 10 TRIES HAVE FAILED TO * INITIALIZE A TRACK. * SPC 2 * EOCYL ENTRY CONDITIONS: * STATUS ERRORS 11 AND 14 * SEEK CHECK ON A STATUS 2 ERROR * OUT OF SPARES * EOCYL JSB INTON LDB ER43A STORE SUBCHANNEL # IN MESSAGE JSB ESUB LDB ERR43 ELSE SEND BAD SPECIFICATION LDA P15 JSB \DSPL MESSAGE AND JMP \XOUT TERMINATE SPC 2 * * BAD TRACK ENCOUNTERED - MARK IT DEFECTIVE AND SPARE IT * * INIER ENTRY CONDITIONS: FROM ERRDS, STWRT, & DEFTR * INIER ISZ \BADH BAD TRACK HEADER PRINTED YET JMP INIES YES - SKIP * JSB \BLIN LDA \DSUB CONVERT THE SUBCHANNEL TO ASCII CMA,INA LDB P1 STB \CLEN LDB EMES1 JSB \CVAS LDA P12 LDB EMES2 SEND THE JSB \DSPL MESSAGE LDA P16 SEND THE SECOND LINE: LDB EMES3 " LOGICAL CYL HD UNIT" JSB \DSPL AND AWAY IT GOES. INIES LDA \TRAK GET TRACK ADDRESS STA BTRAK AND SAVE IT * INBSP LDB ABTMS ADDRSS OF BAD TRACK JSB TRKMS SEND THE BAD TRACK NUMBERS * * TRACK IS NOW REPORTED TO THE OPERATOR * FLAGD LDA \DNSP GET THE # SPARES CPA UBADC OUT OF SPARES?? JMP EOCYL+1 YES GO SEND ERROR 43 AND TERMINATE * LDA FLGDF SET TO FLAG DEFECTIVE STA \INIT LDA \DNTR GET BASE SPARE TRACK ADDRESS ADA UBADC ADD NUMBER USED SO FAR STA \TRAK SAVE FOR DISK5 JSB DADTR GO TRANSLATE TO DISC ADDRESSES LDA PT#TR PICK UP THE CYL (B= HEAD) DST CYLA2 SET THE SPARE'S ADDR IN DEFECTIVE TRACK LDB MADDR GET BUFFER ADDRESS CLE SET TO WRITE JMP DISK5 FLAG THE TRACK DEFECTIVE * * DO A STATUS-WRITE TO THE NEXT SPARE TRACK TO SEE IF IT IS: * - AVAIABLE FOR USE * - BEING USED AS A FMGR TRACK SPARE * - DEFECTIVE * INISS DLD CYLAD SET THE ADDR OF BAD TRACK IN DST CYLBD TEMPORARY STORAGE OF INIFS CLA RESET THE INIT FLAG STA \INIT FOR THE STATUS WRITE INA AND SET SKFLG TO INDICATE THIS MODE JMP SETSK * * INIFS IS BRANCHED TO WHEN A SPARE TRACK HAS BEEN FOUND * TO BE AVAILABLE FOR USE * INIFS LDA FLGSP SET IOR CHEKS POSSIBLY THE WRITE PROTECT BIT STA \INIT THE SPARING FLAG DLD CYLBD SET THE ADDRESS OF THE BAD TRACK DST CYLA2 IN THE SPARE TRACK CLA CLEAR THE MODE FLAG * SETSK STA SKFLG SET MODE TO 0/1 LDA \DNTR COMPUTE THE TRACK ADDRESS ADA UBADC AGAIN STA \TRAK SAVE FOR DISK5 CLE SET TO WRITE LDB MADDR GET BUFFER ADDRESS JMP DISK5 FLAG THE SPARE * * TRACK NOW SPARED - REPORT WHICH SPARE USED * INIRS LDA UBADC REPORT THE ADA \DNTR LOGICAL TRACK # OF THE LDB ASPMS USED SPARE JSB TRKMS OK LDA CHEKS RESET THE INIT FLAG STA \INIT AND LDA BTRAK GET BAD TRACK # AGAIN STA \TRAK AND RESET AS CURRENT TRACK ISZ UBADC STEP THE SPARE COUNTER JMP \DSK5,I CONTINUE WRITING & INITIALIZING * * UNAVAILABLE SPARE - EITHER DEFECTIVE OR ALREADY A FMGR SPARE * SO REPORT IT AND GO TRY THE NEXT ONE * NIXSP DLD CYLBD RESET THE ORIGINAL BAD TRACK ADDRESS DST CYLAD BECAUSE IT MUST BE REFLAGGED WITH A CCB NEW SPARE ADDRESS STB SKFLG ALSO MUST RE-SEEK TO THAT BAD TRACK LDA UBADC HERE IF SPARE IS BAD ISZ UBADC BUMP SPARE COUNT ADA \DNTR COMPUTE UNIT TRACK# JMP FLAGD DON'T REPORT BAD SPARE * BTRAK NOP ORIGINAL BAD TRACK # CYLBD BSS 2 & ITS CYLINDER, HEAD/SECTOR ADDRESSES SKP * * REPORT BAD TRACK/ SPARE ROUTINE * * A = LOGICAL TRACK * B = ADDRESS OF FIRST 5 WORDS OF MESSAGE * PT#TR = CYL ADDRESS * H#AD = HEAD ADDRESS * UN#IT = UNIT ADDRESS * * JSB TRKMS * RETURN A,B MEANINGLESS * TRKMS NOP STB TRK01 SAVE THE ADDRESS CMA,INA SET UP TO CONVERT THE TRACK LDB P2 STB \CLEN LDB ALBUF TO THE MESSAGE BUFFER JSB \CVAS DO IT LDA PT#TR NOW CONVERT CMA,INA THE CYL. # LDB ACYLM TO THE MESSAGE JSB \CVAS LDA H#AD CONVERT THE HEAD ALF,ALF ADA BL0 STA HEDMS SET IT IN THE MESSAGE LDA UN#IT NOW THE UNIT ADA BL0 STA UNIMS SET IN THE MESSAGE LDA N6 STA MOV6 COUNTER LDA TRK01 GET THE PREAMBLE LDB EMES4 AND STB TEMP2 MOVE LDB A,I MOVE IT TO THE STB TEMP2,I MESSAGE ISZ TEMP2 INA ISZ MOV6 JMP MOVE LDA P15 SEND LDB EMES4 "XXXXXXXXXX LLLLL CCCCCC H U" JSB \DSPL TO THE TTY JMP TRKMS,I AND RETURN * MOV6 NOP N6 DEC -6 TEMP2 NOP TRK01 NOP ASPMS DEF SPMS ABTMS DEF BTMS ALBUF DEF TKMS ACYLM DEF CYLMS EMES4 DEF EMS4 EMES2 DEF *+1 ASC 11,BAD TRACKS SUBCHANNEL XX EMSS2 NOP LOCATION FOR XX EMES1 DEF EMSS2 BL0 ASC 1, 0 EMES3 DEF *+1 ASC 5, ASC 11, LOGICAL CYL HEAD UNIT EMS4 ASC 6,BAD TRACK TKMS ASC 3, CYLMS ASC 3, HEDMS ASC 2, UNIMS ASC 1, BTMS ASC 6,BAD TRACK SPMS ASC 6,SPARED TO ERR43 DEF *+1 ASC 15,INVALID DISC SPECIFICATIONS ER43A DEF ERR43+15 UBADC NOP # USED SPARES SPC 7 * SWTCH DISC DRIVER I/O INSTRUCTION ADDRESSES * I/OTB DEF DSKDR DATA CHANNEL DEF DSK20 DEF DSK21 DEF DSK22 DEF DSK24 DEF DSK25 DEF DSK26 DEF DSK27 DEF DSK28 DEF DSK29 DEF DSK30 I/OTC EQU * HED 7905 I/O DISC DRIVER * THE DISK5 SUBROUTINE IS THE MAIN DISC INPUT/OUTPUT DRIVER. * IT SETS UP THE COMPLETE TRANSFER AND READS OR WRITES * \LNTH WORDS ON THE DISC. IT WAITS UNTIL THE TRANSFER * IS COMPLETE. STATUS IS DONE AFTER EACH TRANSFER. FOR WRITE * PROTECT ERRORS THE OPERATOR IS ASKED TO TURN ON THE SWITCH. * FOR UNDEFINED ERRORS OR ERRORS THAT SHOULD NOT HAPPEN * THE IRRECOVERABLE ERROR EXIT AT EOCYL IS * TAKEN. FOR NOT READY ERRORS THE OPERATOR IS NOTIFIED. * FOR OTHER ERRORS TEN TRIES ARE MADE. IF THE ERROR STILL EXIST * THEN: IF THE INIT FLAG IS SET GO TO EOCYL, * ELSE NOTIFY OPERATOR AND TERMINATE * * CALLING SEQUENCE * \LNTH = NEGATIVE # WORDS TO TRANSMIT * B = CORE ADDRESS * E = 1 FOR READ * E = 0 FOR WRITE * * * THE \DSK5 ROUTINE INTERCEPTS ALL I/O CALL TO DISK5 AND SETS THE * PROPER VALUES FOR THE FLAG WORD CHEKS AND THE FILE MASK * INSTRUCTION FILMK. THEIR VALUES DEPEND ON WHETHER A READ * OR A NORMAL WRITE VERSUS AN INITIALIZE WRITE IS BEING DONE. * FOR INITIALIZE WRITES, A REGULAR WRITE WITH SPARING DISABLED * IS DONE FIRST IN ORDER TO DETECT THE PRESENT STATUS OF THE * TRACK (IE, POSSIBLY DEFECTIVE) SO THAT THAT STATUS MAY BE * ACKNOWLEDGED. CHEKS CONTAINS THE ORIGINAL VALUE OF \INIT * AS SET BY THE CALL FROM SWTCH'S MAINLINE CODE - UNLESS IT WAS * A READ CALL IN WHICH CASE IT IS SET TO 0. \INIT IS THEREFORE * THE TEMPORARY VALUE PERTAINING TO EACH I/O CALL AND MAY BE * 0 FOR A REGULAR READ/WRITE, OR SET TO THE VALUES FOR FLAGGING * PROTECTED, DEFECTIVE, AND/OR SPARE TRACKS. * \DSK5 NOP SEZ IF A READ CALL CLA,RSS THEN ALWAYS SET TO 0 LDA \INIT ELSE GET THE INTENDED MODE STA CHEKS AND SAVE SZA IF AN INITIALIZE WRITE JMP SET5 THEN GO SET THE \INIT & FILMK VALUES STA SKFLG CLEAR DEF-SEEK/SPARE-STATUS FLAG LDA FLMWS OTHERWISE ENABLE SPARING STA FILMK ON ALL ACCESSES JMP DISK5 AND GO DO IT! * SET5 CLA CLEAR THE INIT MODE FLAG STA \INIT TO SIGNAL A WRITE FOR STATUS PURPOSES STA SKFLG CLEAR DEFECTIVE-SEEK/SPARE-STATUS FLAG LDA FLMNS DISABLE SPARING SO DEFECTIVE & STA FILMK AND SPARE TRACKS CAN BE DETECTED JMP DISK5 * CHEKS NOP ORIGINAL TRANSFER MODE OF I/O CALL FLMNS OCT 107400 FILE MASK WITH NO AUTOMATIC SPARING FLMWS OCT 107404 FILE MASK WITH AUTOMATIC SPARING SKFLG NOP DEFECTIVE-SEEK = -1 / SPARE-STATUS = 1 / ELSE 0 SKP * * DISK5 RBL,ERB SET THE READ/WRITE BIT STB MADDR AND SAVE THE ADDRESS LDA \TRAK GET TRACK ADDRESS JSB DADTR TRANSLATE THE TRACK ADDRESS LDB #UNST SET # TO CONFIGURE COUNTER STB UNCOU LDB UNITC GET UNIT CONFIGURE ADDRESS NXUN XOR B,I AND CONFIGURE THE UNIT NUMBERS AND M17 OF COURSE THIS XOR B,I CODE WORKS STA B,I INB ISZ UNCOU DONE? JMP NXUN NO TRY AGAIN * LDA WRTCM GET THE WRITE COMMAND ADA \INIT ADD THE INIT CODE STA W#CMD AND SET IT LDA \INIT GET THE INIT CODE CPA FLGDF IF FLAGGING A DEFECTIVE TRACK JMP OFF THEN SKIP ADDRESS SETUP FOR SEEK LDA PT#TR GET THE CYLINDER LDB \SECT SECTOR BRS ADJUST OUT THE 64 WORD JASS ADB H#AD PUT IN THE HEAD DST CYLAD SET THE SEEK ADDRESSES * LDA \INIT IF FLAGGING A SPARE AND M137 CPA FLGSP JMP OFF THEN SKIP THE SECOND ADDRESS SET UP LDA CYLAD ELSE DST CYLA2 SET UP THE ADDRESS RECORD COMMAND * OFF JSB $LIBR KILL THE INTERRUPT SYSTEM NOP CLF 0 * RTRY LDA N10 SET THE ERROR STA EDCNT COUNTER TO 10 TRIES OVER JSB STATW GET STATUS RBR,SLB,RBL READY? JMP NRERR NO SO LONG * SLB IF DRIVE BUSY JMP OVER WAIT FOR IT * LDB MADDR GET THE CORE ADDRESS LDA R#DCM PRESET FOR READ SSB WRITE? JMP DSEEK NO, GO DO REGULAR READ SEQUENCE * LDA CHEKS GET INITIAL TRANSFER MODE SZA,RSS JMP WSEEK GO DO A REGULAR WRITE LDA \INIT IS THIS THE FIRST WRITE FOR STATUS? SZA,RSS JMP WSEEK THEN MUST SEEK LDA SKFLG MUST SEEK FOR A SECOND-TIME-AROUND DEFECTIVE SZA FLAGGING, OR STATUS-WRITE TO A SPARE JMP WSEEK GO SEEK * LDA W#CMD SINCE A WRITE WAS JUST DONE JSB XFER WITH NO END COMMAND ISSUED, A SEEK DEF ADRES-1 NEEDN'T BE DONE DEF R/WCM JMP CKSTA CHECK ERROR STATUS * WSEEK LDA W#CMD SET TO WRITE DSEEK JSB XFER STANDARD TRANSFER WITH SEEK DEF WAITC-1 ADDRESS OF COMMAND TABLE DEF R/WCM ADDRESS OF END OF TABLE CKSTA ADA CTABA INDEX WITH STATUS INTO JMP A,I STATUS XFER TABLE * * CTABA DEF *+1 CODE ERROR DISPOSITION JMP ENDOK 00 NO ERROR - TEST FOR VERIFY 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 ERRDS 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 ERRDS 16 OVER RUN JUST RETRY JMP ERRDS 17 CORRECTABLE ERROR DON'T EVEN TRY JMP ISPAR 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 ST2ER 26 ILLEGAL WRITE TEST ST 2 JMP UWAIT 27 WAIT FOR THE UNIT. SKP * * ERRDS ENTRY CONDITIONS: * STATUS 10,16,17 ERRORS * VERIFY ERROR * INVALID STATUS 2 ERROR * ERRDS ISZ EDCNT STEP OPERATION ERROR COUNT JMP OVER OK TRY AGAIN * LDB CHEKS WAS THIS A WRITE FOR STATUS SZB,RSS CHECKING? JMP DSKER NO, SO FLAG THE ERROR JSB INTON TURN THE INTERRUPTS BACK ON JSB STWRT IF STATUS WRITE, BRANCH APPROPRIATELY CPA \INT5 INIT ONLY? RSS CPA \INP5 INIT,WRITE PROTECT? JMP INIER YES, GO SPARE IT CPA FLGDF IF TRACK IS BEING SET JMP INISS DEFECTIVE - GO CHECK THE SPARES AND M137 CPA FLGSP IF TRACK IS BEING SPARED JMP NIXSP THEN MUST TRY ANOTHER RSS SKIP INTON CALL * * DSKER JSB INTON LDA \TRAK ERROR MESSAGE CONTAINING THE CMA,INA TRACK # LDB P2 STB \CLEN LDB ER22A JSB \CVAS LDB ER22B STORE SUBCHANNEL # JSB ESUB IN MESSAGE LDA P18 LDB ERR22 JSB \DSPL "PARITY OR DATA ERROR TRACK XXXX" JMP \XOUT SPC 2 * * IF A STATUS-WRITE FOR EITHER A REGULAR TRACK OR * FOR A SPARE TRACK, BRANCH APPROPRIATELY FOR THE ERROR * STWRT NOP LDA \INIT GET THE PRESENT MODE SZA,RSS IF STATUS THEN LDA SKFLG CHECK IF CHECKING A SPARE'S STATUS CPA P1 IN WHICH CASE A NEW JMP NIXSP SPARE MUST BE GOTTEN SZA,RSS OTHERWISE, JMP INIER THIS TRACK MUST BE MARKED DEFECTIVE JMP STWRT,I RETURN TO ERRDS OR DEFTR FOR MORE CHECKS SKP * * STATUS 21 ERROR - CHECK IF INITIALIZING OR NOT * DEFTR JSB INTON TURN INTERRUPTS BACK ON LDB CHEKS WAS THIS A WRITE WITH STATUS SZB,RSS CHECKING? JMP FAULT NO - REGULAR READ/WRITE WITH NO RECOVERY * JSB STWRT IF A STATUS-WRITE, BRANCH APPROPRIATELY CPA FLGDF WAS IT JUST MARKED DEFECTIVE? JMP INISS YES, SO GO SPARE IT NOW AND M137 MASK OFF POSSIBLE WP BIT CPA FLGSP WAS IT JUST SPARED? JMP NIXSP YES, GO TRY ANOTHER SPARE JMP INIER OTHERWISE, FLAG DEFECTIVE & SPARE IT SKP * * ILLEGAL SPARE (STATUS 20 ERROR) * - IF NOT INITIALIZING THE SYSTEM * SUBCHANNEL IN FILESAVE MODE, THEN IGNORE * ISPAR LDB CHEKS WAS THIS A WRITE INITIALIZE? SZB,RSS JMP FAULT-1 NO, SO STATUS 20 ERROR IS VALID * LDA SKFLG IF CHECKING THE STATUS OF A SPARE CPA P1 THEN CHECK FURTHER IF RSS IT IS AVAILABLE FOR USE JMP END01 OTHERWISE IGNORE ERROR & CONTINUE * * IF NOT THE SYSTEM SUBCHANNEL OR NOT SAVING FILES, * THEN RE-USE THE TRACK. * LDA \DSUB IS THE SYSTEM SUBCHANNEL CPA \TSUB BEING INITIALIZED? RSS JMP USESP NO - SO SPARE CAN BE REUSED LDB \SAVE ARE FILES BEING SAVED? SZB JMP GETBD YES, SEE IF IT LIES IN THE FMGR SPACE * USESP JSB INTON TURN INTERRUPTS BACK ON JMP INIFS GO REUSE IT * NEXTS JSB INTON TURN INTERRUPTS BACK ON JMP NIXSP AND TRY NEXT SPARE TRACK * * STILL INITIALIZING THE SYSTEM SUBCHANNEL, CHECK IF TRACK * BELONGS TO THE FMGR AREA. * GETBD LDB N3 MUST READ THE ADDRESS OF THE DEFECTIVE STB \LNTH THAT WAS STORED IN THIS SPARE LDB DPBUF GET THE 3-WORD PREAMBLE BUFFER ADDR LDA RFSCM AND THE READ FULL SECTOR COMMAND JSB XFER AND PERFORM THE READ DEF ADRES-1 ADDRESS OF COMMAND TABLE, -1 DEF R/WCM ADDRESS OF LAST COMMAND TO EXECUTE * LDA \D#WT RESET THE LENGTH OF DMA TRANSFER CMA,INA STA \LNTH TO ONE TRACK LDA HDSSP GET THE HEAD/SECTOR ADDR ALF,ALF ROTATE TO LOW BYTE AND M37 AND ISOLATE STA HDSSP SAVE ONLY THE HEAD # * LDB \SAVE LDA \FFMP GET FIRST LOGICAL FMP TRACK SSB IF SOME WERE OVERLAID LDA \STRK THEN GET NEXT TRACK AFTER SYSTEM JSB DADTR CONVERT FIRST FMP TRACK TO CYL & HEAD * * CHECK IF DEFECTIVE TRACK LIES WITHIN CURRENT SUBCHANNEL DEFINITION * LDA N9 CLEAR SURFACE BUFFER STA TEMP1 SET LOOP COUNTER CLA LDB DSBUF GET BUFFER ADDRESS STA B,I INB ISZ TEMP1 DONE? JMP *-3 NO * LDA \DNSU GET # SURFACE OCCUPIED BY SYSTEM CMA,INA SUBCHANNEL, AND SET AS A STA TEMP1 LOOP COUNTER CLB,INB GET 'OCCUPIED' INDICATOR LDA \DSHD GET STARTING HEAD # ADA DSBUF AND OFFSET INTO BUFFER SETDS CPA ESBUF END-OF-BUFFER? JMP CHEKK (ERRONEOUS DEF'N) STB A,I MARK SURFACE AS ONE OCCUPIED BY SYS SUBCH INA BUMP BUFFER ADDRESS ISZ TEMP1 DONE? JMP SETDS NO * CHEKK LDA HDSSP GET HEAD # OF DEFECTIVE TRACK ADA DSBUF AND GET CORRESPONDING ENTRY IN TABLE LDB A,I SZB,RSS POSSIBLY WITHIN THE SYS SUBCH? JMP USESP NO, SO SPARE CAN BE RESUED * * COMPARE WITH FIRST FMP CYLINDER * LDB PT#TR GET STARTING CYLINDER OF FMP CMB,INB AND COMPARE WITH DEF TRACK'S CYLINDER ADB CYLSP SSB JMP USESP DEFECTIVE TRACK CYLINDER IS LESS SZB GREATER? JMP CLAST YES, SO CHECK WITH LAST FMP TRACK * * SEE IF DEFECTIVE HEAD PRECEEDS STARTING HEAD OF FMP * LDA H#AD GET FIRST FMP HEAD# ALF,ALF INTO LOW BYTE AND M37 AND ISOLATE SZA,RSS IF ZERO THEN JMP NEXTS NO HEAD PRECEEDS IT - TRY NEXT SPARE CMA,INA ADA HDSSP GET DEFECTIVE HEAD# AND COMPARE WITH THAT SSA,RSS OF THE FIRST FMP - LESS? JMP NEXTS NO, THIS SPARING MUST BE PRESERVED - TRY NEXT JMP USESP GO AHEAD AND USE THIS SPARE * * SEE IF DEFECTIVE TRACK'S CYLINDER IS > LAST FMP CYLINDER * CLAST CCA CONVERT LAST TRACK ON SUBCHANNEL ADA \DNTR TO PHYSICAL CYLINDER AND HEAD JSB DADTR ADDRESSES LDB CYLSP GET DEFECTIVE TRACK CYL CMB,INB AND COMPARE WITH LAST FMP CYL ADB PT#TR JUST COMPUTED SSB GREATER? JMP USESP YES, REUSE THAT SPARE SZB LESS? JMP NEXTS YES, TRY FOR NEXT SPARE * * SEE IF DEFECTIVE HEAD# IS > LAST FMP CYL HEAD# * LDA H#AD GET LAST FMP HEAD ALF,ALF ISOLATE AND M37 LDB HDSSP COMPARE WITH HEAD# OF DEFECTIVE TRACK CMB,INB ADA B SSA,RSS JMP NEXTS TRY ANOTHER TRACK JMP USESP REUSE THAT SPARE SPC 2 DPBUF DEF *+1,I PREAMBLE BUFFER NOP CYLSP NOP CYLINDER ADDR STORED IN SPARE HDSSP NOP HEAD/SECTOR ADDR STORED IN SPARE N3 DEC -3 N9 DEC -9 RFSCM OCT 3000 * DSBUF DEF *+1 BSS 9 SUBCHANNEL SURFACE BUFFER ESBUF DEF * SKP * * STATUS-2 ERROR POSSIBLE CONDITIONS ARE: * NO ERROR SO JUST RETRY AT ERRDS * NOT READY GO TO NRERR TO WAKE 'EM UP * PROTECTED SEND TURN ON THE SWITCH MESSAGE * ST2ER SSB,RSS IF NO STATUS 2 ERROR THEN JMP ST2 TRY FOR A FORMAT PROTECT SWITCH ERROR * LDA B STATUS 2 TO A AND P4 ISOLATE THE SEEK CHECK BIT SZA IF SET THEN WE HAVE A BAD ADDRESS JMP EOCYL SO TERMINATE JMP NRERR OTHERWISE, IT MUST NOT BE READY * ST2 LDA MADDR WAS THIS A READ OR A WRITE? SSA JMP ERRDS READ - SO NEEDN'T WORRY ABOUT SWITCHS * LDA B GET THE STATUS WORD AGAIN AND M40 KEEP FORMAT BITS SZA,RSS SET?? JMP WRPTM TURN ON FORMAT SWITCHH LDA B GET STATUS -2 AGAIN AND M100 GET PROTECTED BIT SZA,RSS JMP ERRDS JUST COUNT THE ERROR AND TRY AGAIN * * * FORMAT/PROTECT ERROR - WARN 'EM AND WAIT * WRPTM STA TEMP2 SAVE BITS OF STATUS-2 JSB INTON JSB \BLIN WRITE PROTECT SWITCH IS LDA TEMP2 LDB MS34A SZA LDB MS32A JSB ESUB STORE SUBCHANNEL # IN MESSAGE LDA TEMP2 RETRIEVE THOSE BITS LDB MES34 "TURN ON FORMAT SWITCH - PRESS RUN" SZA LDB MES32 "TURN OFF DISK PROTECT - PRESS RUN" LDA P18 JSB \DSPL * JSB $LIBR OFF THE INTERRUPTS FOR A HALT NOP CLF 0 HLT 32B WAIT FOR TURN ON JMP RTRY TRY AGAIN. SPC 1 * * NOT READY ERROR - WARN 'EM AND WAIT * NRERR JSB INTON JSB \BLIN DISC IS NOT READY LDB MS33A STORE SUBCHANNEL # JSB ESUB IN MESSAGE LDA P14 LDB MES33 SEND THE WORD TO THE MAN JSB \DSPL "READY DISC AND PRESS RUN" * JSB $LIBR OFF THE INTERRUPTS FOR A HALT NOP CLF 0 LDA STATB HLT 33B PAUSE JMP RTRY ON RESTART RETRY SPC 5 * * ENTRY CONDITIONS: * STATUS ERRORS 1,2,12 * UNIMPLEMENTED STATUS ERRORS 3,4,5,6,13,15,24,25 * FROM DEFTR ON A STATUS ERROR 21 * FROM ISPAR ON A STATUS ERROR 20 * JSB INTON TURN ON INTERRUPTS FOR MESSAGE FAULT LDA \TRAK CMA,INA LDB P2 STB \CLEN LDB ER40A JSB \CVAS LDB ER40A STORE SUBCHANNEL # JSB ESUB IN MESSAGE LDA P18 LDB ERR40 JSB \DSPL "DEFECTIVE CYLINDER - TRACK XXX" JMP \XOUT TERMINATE SPC 4 ESUB NOP CLA,INA SET FOR A 1-WORD CONVERSION STA \CLEN LDA \DSUB GET CURRENT SUBCHANNEL CMA,INA JSB \CVAS JMP ESUB,I SKP SPC 1 ERR40 DEF *+1 ASC 18,DEFECTIVE CYLINDER - TRACK XXXX ER40A DEF ERR40+15 ER40B DEF ERR40+18 WRTCM OCT 4000 ENDC OCT 12400 VERCM OCT 3400 CALC OCT 600 WAITX OCT 13000 M40 OCT 40 M100 OCT 100 M137 OCT 137777 UN#IT NOP * SPC 3 * * INTON TURNS THE INTERRUPT SYSTEM BACK ON * INTON NOP DSK30 CLF 0 CLC 6 JSB $LIBX DEF INTON SPC 3 * UWAIT WAIT FOR UNIT TO BECOME AVAILABLE * * UWAIT LDA WAITX SEND THE WAIT UWAT1 JSB OUTCC COMMAND JSB WAITF AND WAIT JMP OVER OK NOW TRY IT * SPC 3 * * RECAL RECALIBRATE THE DISC ON CYLINDER COMPARE ERRORS * RECAL ISZ EDCNT CHECK COUNT RSS JMP DSKER LDA CALC GET COMMAND JMP UWAT1 GO SEND IT SKP * * ENDOK AFTER A SUCCESFUL TRANSFER WE MUST DO AND END * TO ALLOW OTHER CPU'S TO ACCESS THE CONTROLLER. * ALSO IF DOING INITIALIZE AND NOT FLAGGING DEFECTIVE DO * A VERIFY TO CHECK FOR ERRORS. * * NOTE: AN 'END' COMMAND IS NOT ISSUED IF A WRITE FOR STATUS PURPOSES * WAS JUST DONE, ALLOWING THE SEEK TO BE SKIPPED WHEN RE-WRITING . * ENDOK LDB CHEKS WAS THIS A WRITE FOR STATUS SZB,RSS CHECKING? JMP ENDSX NO, JUST GO SEND THE END COMMAND * END01 LDA \INIT FIRST TIME THRU FOR THE SZA STATUS ONLY? JMP END02 NO - JUST DID THE REAL THING JSB INTON TURN INTERRUPTS BACK ON FIRST LDA SKFLG IF THE STATUS CHECK WAS TO A CPA P1 POTENTIAL SPARE TRACK JMP INIFS THEN NEEDN'T SEND THE END * STB \INIT YES, NOW THE THE CORRECT INIT FLAG LDB MADDR GET BUFFER ADDRESS CLE CLEAR FOR A WRITE JMP DISK5 NOW DO THE REAL INITIALIZE (NO END WAS DONE) * END02 RAL,SLA IF SPARING JMP STDAD THE SEEK ADDRESS IS ALREADY SET * RAL,SLA IF JUST PROTECTING JMP STDAD USE STANDARD ADDRESS * RAL,SLA IF FLAGING DEFECTIVE JMP ENDSX DON'T EVEN CHECK * STDAD LDB \LNTH EITHER STRAIGHT INIT. OR CMB,INB PROTECT LSR 7 SET UP THE STB VERCO SECTOR COUNT LDA VERCM SEND VERIFY COMMAND JSB XFER AND GO DEF WAITC-1 DO IT DEF VERCO SZA ANY ERROR IS JMP ERRDS BAD NEWS * * SEND THE END COMMAND * ENDSX LDA ENDC GET THE END COMMAND JSB OUTCC SEND IT LDA \BOOT ARE WE BOOTIN UP? SZA,RSS YES, SO GO DO IT! JMP ENDBR NO LDA \TCH GET TARGET CHANNEL = DEST. CHANNEL ALF,RAL AND STORE IN BITS RAL 11-6 OTA 1 OF THE SWITCH REGISTER LDA M2055,I GET STARTING ADDRESS LDB M1742 DETERMINE IF WE'RE IN AN CPB P2 RTE-II OR AN RTE-III/IV RSS MUST DISABLE MAPPING FOR RTE-III/IV JMP A,I GO TO RTE! CLB MUST CLEAR THE BASE PAGE FENCE SETTING LFB DJP A,I WELL SAID! * M2055 OCT 2055 M1742 EQU 1742B * ENDBR JSB INTON LDA \INIT CPA FLGDF BRANCH APPROPRIATELY, JMP INISS FLAGGING DEFECTIVE - NOW GET A SPARE AND M137 CPA FLGSP JMP INIRS FLAGGING A SPARE - RESET \TRAK & \INIT JMP \DSK5,I AND EXIT SKP * * * XFER THE TRANSFER ROUTINE * DOES DMA SET UP,AND SENDS A SERIES OF WORDS TO THE DISC * CONTROLLER. THEN STATUS IS DONE USING STATW. * * CALLING SEQUENCE: * * A= COMMAND FOR THE XFER READ/WRITE INIT ETC. * B= ADDRESS WITH DIRECTION BIT SET FOR DMA * * JSB XFER * DEF COMMAND LIST * DEF LAST COMMAND (ALSO DMA COMMAND) * * XFER NOP STA R/WCM SET THE READ WRITE COMMAND LDA DSKDR SET UP THE DMA OTA 6 SEND CW1 CLC 2 PREPARE MEM ADDR REG FOR CW2 OTB 2 SEND CW2 STC 2 PREPARE WORD CNT REG FOR CW3 LDA \LNTH OTA 2 SEND CW3 LDB XFER,I GET THE HEAD OF THE LIST ISZ XFER STEP TO THE END ADDRESS NXTC INB STEP TO THE FIRST COMMAND LDA B,I GET THE WORD CPB ACTCM IF ACTION COMMAND CCE,RSS SKIP TO THE CLC RAL,CLE,SLA,ERA ELSE CLEAR THE SIGN AND IF SET DSK20 CLC 0 TELL THE CONTROLLER IT IS A COMMAND DSK21 OTA 0,C SEND THE WORD CPB XFER,I IF THIS IS THE ACTION WORD STC 6,C ACTIVATE THE DMA DSK22 STC 0 START THE CONTROLLER SEZ IF NOT A COMMAND SKIP THE FLAG WAIT JSB WAITF WAIT FOR THE FLAG STF 6 STOP THE DMA CPB XFER,I DONE? RSS YES SKIP JMP NXTC NO GO DO THE NEXT ONE * JSB WAITF THIS WAIT IS ONLY NEEDED FOR VERIFY ISZ XFER STEP TO EXIT ADDRESS JSB STATW GET THE STATUS WORDS JMP XFER,I AND GET OUT SKP * * * XFER COMMAND TABLE * WAITC OCT 113000 WAKEUP COMMAND SEEKC OCT 101200 MUST CONFIGURE TO UNIT CYLAD NOP CYLINDER ADDRESS HDSCT NOP HEAD AND SECTOR ADRES OCT 106000 NEEDS UNIT CYLA2 NOP CYLINDER ADDRESS FOR ADDRESS RECORD HDSC2 NOP FILMK OCT 107404 FILE MASK/SPARING ONLY R/WCM OCT 102400 READ/WRIT COMMAND VERCO NOP VERIFY COUNT * * END OF LIST * * UNIT CONFIGURE LIST * UNITC DEF *+1,I DEF WAITX DEF SEEKC DEF VERCM DEF CALC DEF ADRES ACTCM DEF R/WCM DEF STACC DEF WRTCM DEF R#DCM DEF RFSCM #UNST ABS UNITC-*+1 NUMBER IN THE LIST SKP * * * DADTR ROUTINE TO TRANSLATE A TRACK ADDRESS INTO CYL,HEAD * UNIT TO BE STORED AT: * * CYL AT: PT#TR * HEAD AT: H#AD ALSO RETURNED IN B. * UNIT AT: UN#IT ALSO RETURNED IN A. * * CALLING SEQUENCE: * * LDA TRACK SET TRACK ADDRESS IN A. * JSB DADTR CALL * * DADTR NOP CLB DIVIDE # TRACKS BY DIV \DNSU NUMBER OF HEADS/CYL ADA \DFTR ADD BASE CYLINDER ADDRESS STA PT#TR SET THE CYLINDER ADDRESS ADB \DSHD ADD THE BASE HEAD ADDRESS BLF,BLF PUT HEAD ADDRESS IN IT'S PLACE LDA B PUT INTO A TO AND M174C ISOLATE STA H#AD STORE IT AS PROMISED SWP GET UNIT FROM LOW B LDA \TUNT STA UN#IT STORE IT AS PROMISED JMP DADTR,I RETURN A= UNIT, B=HEAD * PT#TR NOP H#AD NOP SKP * * STATW RETURNS STATUS AS FOLLOWS: * * STATB FULL STATUS 1 WORD * A ERROR CODE (MAX=27) FROM STATUS 1 * B STATUS 2 WORD * * STATW NOP LDA STACC GET STATUS COMMAND JSB OUTCC SEND IT JSB WAITF WAIT FOR FLAG DSK24 LIA 0,C GET WORD 1 JSB WAITF WAIT FOR FLAG DSK25 LIB 0,C GET WORD 2 STA STATB SAVE WORD 1 ALF,ALF ROTATE AND M37 ISOLATE CPA M37 ATTENTION? JMP STATW+1 YES TRY AGAIN * JMP STATW,I NO - RETURN SPC 3 * * * OUTCC OUTPUT THE COMMAND WORD IN THE A-REG * OUTCC NOP DSK26 CLC 0 SEND "HERE COME DE WORD" DSK27 OTA 0,C SEND DE WORD DSK28 STC 0 SET UP IN CASE IT IS NEEDED JMP OUTCC,I RETURN SPC 3 * * * WAITF WAITS FOR A FLAG * WAITF NOP DSK29 SFS 0 HERE YET JMP *-1 NO KEEP TRYING * JMP WAITF,I YES RETURN SPC 3 * * STACC OCT 1400 MADDR NOP MEMORY ADDRESS FOR CURRENT TRANSFER UNCOU NOP EDCNT NOP ERROR COUNT FOR CURRENT TRANSFER STATB NOP R#DCM OCT 102400 W#CMD NOP DSKDR ABS 0 DMA CONTROL WORD MES32 DEF *+1 ASC 18,TURN OFF DISC PROTECT - PRESS RUN MS32A DEF MES32+18 MES34 DEF *+1 ASC 18,TURN ON FORMAT SWITCH - PRESS RUN MS34A DEF MES34+18 MES33 DEF *+1 ASC 14,READY DISC AND PRESS RUN MS33A DEF MES33+14 ERR22 DEF *+1 ASC 18,PARITY OR DATA ERROR TRACK XXXX ER22A DEF ERR22+15 ER22B DEF ERR22+18 * * END EQU * END BEG5