$CONTROL MAP,CODE,USLINIT                                               00010000
<<IOFDISC0 - MODULE 17>>                                                00012000
<< HP32002C MPE SOURCE C.00.00 >>                                       00014000
<< COPYRIGHT     "(C) COPYRIGHT HEWLETT-PACKARD CO. 1980.           >>  00016000
<<     THIS PROGRAM MAY BE USED WITH ONE COMPUTER SYSTEM AT A       >>  00018000
<<     TIME AND SHALL NOT OTHERWISE BE RECORDED, TRANSMITTED OR     >>  00020000
<<     STORED IN A RETRIEVAL SYSTEM.  COPYING OR OTHER REPRODUCTION >>  00022000
<<     OF THIS PROGRAM EXCEPT FOR ARCHIVAL PURPOSES IS PROHIBITED   >>  00024000
<<     WITHOUT THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.>>  00026000
<< **** Note - Dollar Copyright cannot be used with this module *** >>  00028000
$CONTROL MAIN=IOFDISC0                                                  00030000
$CONTROL PRIVILEGED,UNCALLABLE                                          00032000
$TITLE "2660A FIXED HEAD DISC DRIVER"                                   00034000
$THIRTY                                                                 00036000
                                                                        00038000
DRIVER CALLING SEQUENCE                                                 00040000
                                                                        00042000
                                                                        00044000
DRIVER REQUEST CODES:                                                   00046000
                                                                        00048000
   0 - READ                                                             00050000
   1 - WRITE                                                            00052000
   2 - FILE OPEN                                                        00054000
   3 - FILE CLOSE                                                       00056000
   4 - DEVICE CLOSE                                                     00058000
   5 - FILL WITH ZEROS                                                  00060000
   6 - FILL WITH BLANKS                                                 00062000
  11 - WRITE DISC LABEL                                                 00064000
                                                                        00066000
                                                                        00068000
COUNT - WORD/BYTE COUNT. BYTE COUNT WILL BE ROUNDED UP TO AN EVEN #     00070000
                                                                        00072000
                                                                        00074000
PARAMETERS P1 AND P2 FORM A DOUBLE WORD DISC ADRESS. P1 MUST ALWAYS     00076000
BE ZERO.                                                                00078000
                                                                        00080000
                                                                        00082000
NOTE THAT THE BUFFER ADRESS WORD IN THE IOQ IS USED AS THE              00084000
BUFFER FOR ALL FILL OPERATIONS.                                         00086000
                                                                        00088000
                                                                        00090000
DRIVER RETURN CODES:                                                    00092000
                                                                        00094000
   GENERAL STATUS             QUALIFYING STATUS          OVERALL        00096000
   0 - PENDING                1 - WAIT FOR COMPLETION    %10            00098000
                                                                        00100000
   1 - SUCCESSFUL             0 - NORMAL COMPLETION      %01            00102000
                                                                        00104000
   4 - IRRECOVERABLE ERROR    0 - INVALID FUNCTION       %04            00106000
                              1 - DISC TRANSMISSION ERR  %14            00108000
                              3 - I/O TRANSMISSION ERROR %34            00110000
                              5 - DISC UNIT FAILURE      %54            00112000
                              6 - INVALID DISC ADRESS    %64            00114000
$PAGE                                                                   00116000
BEGIN                                                                   00118000
EQUATE                                                                  00120000
   CHAINFILL   = %167777,                                               00122000
   CHAINRD     = %170000,                                               00124000
   CHAINWRT    = %160000,                                               00126000
   CONTROL     = %040000,                                               00128000
   CONTROL1    = %040001, << SELECT SECTOR ONE >>                       00130000
   DATAOVERUN  = %34, << STATUS RETURN, I/O XFER TOO SLOW >>            00132000
   DDADR       = 11, << DISC ADRESS OF FILL IN DIT >>                   00134000
   DLOGERROR   = 13,  << ERROR LOG STATUS>>                    <<01337>>00136000
   DSERR       = 7, << ERROR DEVICE STATUS WORD IN DIT >>               00138000
   DSTAT       = 6, << HARDWARE DEVICE STATUS WORD IN DIT >>            00140000
   DSYSBA      = 12, << SYSTEM BUFFER ADRESS IN DIT >>                  00142000
   DXFER       = 10, << FILL TRANSFER COUNT IN DIT >>                   00144000
   ENDINT      = %034000,                                               00146000
   FILL        = %067777,                                               00148000
   INVDISCADR  = %64, << STATUS RETURN, BAD DISC ADRESS >>              00150000
   INVALIDFUNC = 4, << STATUS RETURN, INVALID OPERATION REQUESTED >>    00152000
   PENDING     = %10, << STATUS RETURN, I/O STARTED BUT NOT FINISHED >> 00154000
   QADDR       = 5, << BUFFER ADRESS WORD OF IOQ >>                     00156000
   QFUNC       = 6, <<FUNCTION CODE WORD OF IOQ >>                      00158000
   QLDEV       = 2, << LOGICAL DEVICE NUMBER WORD OF IOQ >>             00160000
   QMISC       = 3, << DRIVER WORD OF IOQ >>                            00162000
   QPAR1       = 8, << HIGH ORDER DISC ADRESS WORD OF IOQ >>            00164000
   QPAR2       = 9, << LSW DISC ADRESS OF IOQ >>                        00166000
   QSTAT       = 10, <<RETURN STATUS WORD OF IOQ >>                     00168000
   QWBCT       = 7,  << XFER COUNT WORD OF IOQ >>                       00170000
   READ128     = %077600,                                               00172000
   SIORD       = %070000,                                               00174000
   SIOWRT      = %060000,                                               00176000
   SYSDB       = %1000,                                                 00178000
   SYSSBUF     = 6, << DB INDEX OF SYSTEM BUFFER TABLE POINTER >>       00180000
   TRANSERR    = %14, << STATUS RETURN, DISC TRACK XFER ERROR >>        00182000
   UNITFAIL    = %54, << STATUS RETURN, DISC DEVICE PROBLEMS >>         00184000
   WRITE128    = %067600,                                               00186000
   XFER128     = %007600,                                               00188000
   SUCCESS     = 1; << STATUS RETURN, SUCCESSFUL XFER >>                00190000
DEFINE                                                                  00192000
   BN          = (14:2)#, << BANK NUM. BITS OF MEM. MANAGEMENT I/O REQ>>00194000
   BADTRK      = (0:1)#,<< BAD TRACK TABLE USE BIT IN QMISC >>          00196000
   CRCERR      = (4:1)#, << CRC ERROR BIT OF DEVICE STATUS >>           00198000
   DISABLE     = ASSEMBLE(SED 0)#,                                      00200000
   DISCERR     = (3:7)#, << HARDWARE ERROR STATUS BITS OF QSTAT >>      00202000
   DUPLICATE   = ASSEMBLE(DUP)#,                                        00204000
   ENABLE      = ASSEMBLE(SED 1)#,                                      00206000
   FUNC        = (8:8)#, << FUNCTION FIELD OF QFUNC >>                  00208000
   INDEXF      = (3:13)#, << DST INDEX FIELD OF MEM. LINK >>            00210000
   LIMIT       = (10:1)#, << RESTRICT I/O ACTIVITY BIT IN DIT >>        00212000
   QLDEVN      = (8:8)#, << LOGICAL DEVICE NUM. FIELD OF IOQ >>         00214000
   RETRYCNT    = (12:4)#, << RETRY COUNTER FIELD OF QMISC >>            00216000
   SECTOR      = (11:5)#, << SECTOR FIELD OF DISC ADRESS >>             00218000
   SFAIL       = (10:1)#, << GIP FAILED TO START I/O >>                 00220000
   SPEC        = (1:1)#, << IOQ BIT INDICATING A MEMORY MAN. REQ. >>    00222000
   STAT        = (8:8)#,  << I/O STATUS RETURN FIELD OF IOQ >>          00224000
   SYSBUFR     = (3:1)#,  << IOQ BIT. DATA IS IN SYSTEM BUFFERS >>      00226000
   TRACK       = LSR(5)#,                                               00228000
   WRITEBIT    = (1:1)#,<< BAD TRACK HAS BEEN RETURNED TO DISC (QMISC)>>00230000
   XFERERR     = (6:1)#; << HARDWARE STATUS BIT IN DSTAT >>             00232000
INTEGER POINTER                                                         00234000
   SBUF = DB+ SYSSBUF; << SYSBUF TABLE POINTER >>                       00236000
ARRAY INITIAL(0:39) = DB := << INITIAL CONFIGURATION DATA >>   <<01337>>00238000
   %007041, << DIT SIZE = 14, CORE RES., DVR TYPE = 1 >>       <<01337>>00240000
         0,                                                             00242000
         0, << UNIT EXTRACT INSTRUCTION >>                              00244000
   [8/%13,8/0],  <<I/O PROG AREA = 22 >>                       <<01300>>00246000
   %040000,   <<DFLAG>> <<DIT WORD 0 - DEVICE IS A DISC>>      <<01337>>00248000
        0,    <<DLINK>>                                        <<01337>>00250000
        0,    <<DIOQP>>                                        <<01337>>00252000
        0,    <<DLDEV>>                                        <<01337>>00254000
        0,    <<DLTP>>                                         <<01337>>00256000
        0,    <<DILTP>>                                        <<01337>>00258000
        0,    <<DSTAT>>                                        <<01337>>00260000
        0,    <<DSERR>> <<INDEX & COUNT OF HARWARE STATUS>>    <<01337>>00262000
        0,    <<DMAMQT>>                                       <<01337>>00264000
        0,    <<DMAMQT>>                                       <<01337>>00266000
        0,    <<DXFER>>                                        <<01337>>00268000
        0,    <<DDADR>>                                        <<01337>>00270000
        0,    <<DSYSBA>>                                       <<01337>>00272000
        0,    <<DLOGERROR>>                                    <<01337>>00274000
   %014000, << I/O PROG AREA - SET BANK >>                              00276000
         0,                                                             00278000
     20(0); << REST OF I/O PROG AREA >>                                 00280000
$PAGE                                                                   00282000
PROCEDURE CHECKINDEX(INDEX,TABLE);                                      00284000
VALUE INDEX,TABLE;                                                      00286000
INTEGER INDEX;                                                          00288000
INTEGER POINTER TABLE;                                                  00290000
OPTION EXTERNAL;                                                        00292000
                                                                        00294000
PROCEDURE DCONVERT(WORD); VALUE WORD; INTEGER WORD;                     00296000
   OPTION EXTERNAL;                                                     00298000
                                                                        00300000
INTEGER PROCEDURE GETSBUF(TYPE); VALUE TYPE; INTEGER TYPE;              00302000
   OPTION EXTERNAL;                                                     00304000
                                                                        00306000
PROCEDURE GIP; OPTION EXTERNAL;                                         00308000
                                                                        00310000
PROCEDURE HELP; OPTION EXTERNAL;                                        00312000
                                                                        00314000
PROCEDURE IOFAILURE(DRTN,DITP);                                         00316000
VALUE DRTN,DITP;                                                        00318000
LOGICAL DRTN;                                                           00320000
POINTER DITP;                                                           00322000
OPTION EXTERNAL;                                                        00324000
                                                                        00326000
PROCEDURE LDEVNOTRDY(DITP);  VALUE DITP; POINTER DITP;                  00328000
OPTION EXTERNAL;                                                        00330000
                                                                        00332000
PROCEDURE MMSTAT(E,P1,P2,P3);                                           00334000
   VALUE E,P1,P2,P3;                                                    00336000
   INTEGER E,P1,P2,P3;                                                  00338000
   OPTION EXTERNAL;                                                     00340000
                                                                        00342000
PROCEDURE RETURNSBUF(SBUFP); VALUE SBUFP; INTEGER SBUFP;                00344000
   OPTION EXTERNAL;                                                     00346000
                                                                        00348000
PROCEDURE SIODM(A,B); VALUE A,B; INTEGER POINTER A; LOGICAL B;          00350000
OPTION EXTERNAL;                                                        00352000
                                                                        00354000
PROCEDURE STARTIO(DITP,SIOP,QUEUE); VALUE DITP,SIOP,QUEUE;              00356000
   INTEGER POINTER DITP,SIOP; LOGICAL QUEUE;                            00358000
   OPTION EXTERNAL;                                                     00360000
                                                                        00362000
PROCEDURE WRITE2(WORD); VALUE WORD; INTEGER WORD;                       00364000
   OPTION EXTERNAL;                                                     00366000
$PAGE                                                                   00368000
INTEGER PROCEDURE FHDDVR(IOQP,DITP,BANK,BUFADR,SIOP,DRTN);              00370000
VALUE IOQP,DITP,BANK,BUFADR,SIOP,DRTN;                                  00372000
INTEGER BANK,BUFADR,DRTN;                                               00374000
INTEGER POINTER IOQP,DITP,SIOP;                                         00376000
OPTION PRIVILEGED,UNCALLABLE;                                           00378000
BEGIN                                                                   00380000
DOUBLE POINTER                                                          00382000
   DSIOP = SIOP;                                                        00384000
INTEGER POINTER                                                         00386000
   BADTRACK = Q+1;                                                      00388000
LOGICAL                                                                 00390000
   CONC = Q+3,                                                          00392000
   SIOCOUNT = DB+%60;                                                   00394000
INTEGER                                                                 00396000
   I = Q+2,                                                             00398000
   X = X,                                                               00400000
   MSTATE = FHDDVR,                                                     00402000
   S0 = S-0;                                                            00404000
LOGICAL POINTER                                                         00406000
   DITPL = DITP,                                                        00408000
   IOQPL = IOQP;                                                        00410000
                                                                        00412000
                                                                        00414000
   TOS := 0; << BADTRACK >>                                             00416000
   TOS := 2; << I >>                                                    00418000
   IF MSTATE = 2 THEN                                                   00420000
   BEGIN << START NEW REQUEST, INITIATON SECTION >>                     00422000
      IOQP(QMISC) := 0;                                                 00424000
      TOS := IOQP(QWBCT); << SET XFER COUNT >>                          00426000
      IF < THEN                                                         00428000
      BEGIN << BYTE COUNT >>                                            00430000
         DUPLICATE;                                                     00432000
         IF TOS THEN IOQP(X) := IOQP(X) - 1; <<ROUND UP COUNT >>        00434000
         TOS := -(TOS&ASR(1)); << CONVERT TO POS. WORD COUNT >>         00436000
      END;                                                              00438000
      DITP(DXFER) := TOS;                                               00440000
      IF IOQP(QPAR1) <> 0 THEN                                          00442000
      BEGIN << DISC ADRESS TOO LARGE >>                                 00444000
BADDADR:                                                                00446000
         TOS := INVDISCADR;                                             00448000
         GO TO BADEND;                                                  00450000
      END;                                                              00452000
      TOS := BANK;                                                      00454000
      SIOP(1) := TOS; << DO SET BANK I/O INST. >>                       00456000
      IF IOQP(QFUNC).FUNC = 7 THEN GO TO INVALID;              <<02870>>00458000
      TOS := IF IOQP(QFUNC).FUNC = 11 THEN 7                   <<02870>>00460000
        ELSE IOQP(QFUNC).FUNC;                                 <<02870>>00462000
      ASSEMBLE(DUP,STAX);                                               00464000
      IF TOS > 7 THEN                                          <<02870>>00466000
      BEGIN << INVALID FUNCTION >>                                      00468000
INVALID:                                                                00470000
         TOS := INVALIDFUNC;                                            00472000
         GO TO BADEND;                                                  00474000
      END;                                                              00476000
      ASSEMBLE(LOAD SWT,X; ADAX; BR SWT,X;                              00478000
SWT:                                                                    00480000
      CON READ; CON WRITE; CON GOODEND; CON GOODEND; CON GOODEND;       00482000
      CON FILLZERO; CON FILLBLANK; CON WRITE);                 <<02870>>00484000
                                                                        00486000
      HELP;                                                             00488000
                                                                        00490000
WRITE:                                                                  00492000
      TOS := CHAINWRT; << SET WRITE CONSTANTS >>                        00494000
      GO TO WRITECONT;                                                  00496000
                                                                        00498000
READ:                                                                   00500000
      TOS := CHAINRD;                                                   00502000
WRITECONT:                                                              00504000
      TOS := IOQP(QPAR2);                                               00506000
      IF = AND (1 <= IOQP(QFUNC) <= 6) THEN GO TO BADDADR;     <<02870>>00508000
      TOS := TOS.SECTOR LOR CONTROL;                                    00510000
      TOS := IOQP(QPAR2)&TRACK;                                         00512000
      DSIOP(1) := TOS; << SET DISC ADRESS >>                            00514000
      TOS := DITP(DXFER);                                               00516000
      IF = THEN GO TO GOODEND; << ZERO XFER CNT IS A NO OP >>           00518000
      DUPLICATE;                                                        00520000
      IF IOQPL.SYSBUFR THEN                                             00522000
      BEGIN << DATA IS IN SYSTEM BUFFERS >>                             00524000
         IF S0 > 1024 THEN GO TO INVALID; << XFER TOO BIG >>            00526000
         CONC := CONC LOR XFER128; << AJUST XFER ORDERS >>              00528000
         CHECKINDEX(@SBUF + SYSDB - BUFADR,SBUF);                       00530000
         WHILE TOS > 128 DO                                             00532000
         BEGIN << BUILD SERIES OF CHAINED ORDERS >>                     00534000
            TOS := TOS - 128;                                           00536000
            TOS := CONC;                                                00538000
            TOS := BUFADR;                                              00540000
            DSIOP(I) := TOS;                                            00542000
            I := I + 1;                                                 00544000
            CHECKINDEX(ABSOLUTE(BUFADR-1),SBUF);                        00546000
            BUFADR := ABSOLUTE(X) + @SBUF + SYSDB;                      00548000
            DUPLICATE;                                                  00550000
         END;                                                           00552000
      END ELSE                                                          00554000
      BEGIN                                                             00556000
         X := I;                                                        00558000
         WHILE TOS > 4096 DO                                            00560000
         BEGIN << DATA IN DST, BUILD SERIES OF CHAINED ORDERS >>        00562000
            TOS := TOS - 4096;                                          00564000
            TOS := CONC;                                                00566000
            TOS := BUFADR;                                              00568000
            DSIOP(X) := TOS;                                            00570000
            ASSEMBLE(INCX,DUP);                                         00572000
            BUFADR := BUFADR + 4096;                                    00574000
         END;                                                           00576000
         I := X;                                                        00578000
      END;                                                              00580000
      TOS := ((-TOS) LAND %7777) LOR (CONC LAND %070000);               00582000
      TOS := BUFADR;                                                    00584000
      DSIOP(I) := TOS;                                                  00586000
ENDIO:                                                                  00588000
      I := I + 1;                                                       00590000
      TOS := ENDINT; << APPEND END I/O ORDER >>                         00592000
      TOS := -1;                                                        00594000
      DSIOP(I) := TOS;                                                  00596000
EXECIO:                                                                 00598000
      STARTIO(DITP,SIOP,TRUE);                                          00600000
      IF > THEN                                                         00602000
      BEGIN << DEVICE NOT READY    >>                                   00604000
NOTREADY:                                                               00606000
         LDEVNOTRDY(DITP); << SENT NOT READY MSG TO CONSOLE >>          00608000
         TOS := DRTN;                                                   00610000
         TOS := %100000;                                                00612000
         ASSEMBLE(CIO 1); << CLEAR INTERFACE >>                         00614000
         IF <> THEN GO TO IOFAIL;                                       00616000
WAIT:                                                                   00618000
         ASSEMBLE(TIO 0);                                               00620000
         IF <> THEN GO TO IOFAIL;                                       00622000
         ASSEMBLE(TEST,DEL);                                            00624000
         IF >= THEN GO TO WAIT;                                         00626000
         DEL;                                                           00628000
         GO TO EXECIO; << TRY AGAIN WHEN DISC IS READY >>               00630000
      END;                                                              00632000
      MSTATE := %13;                                                    00634000
      TOS := PENDING;                                                   00636000
      GO TO DONE;                                                       00638000
                                                                        00640000
FILLBLANK:                                                              00642000
      TOS := "  ";                                                      00644000
      GO TO FC;                                                         00646000
                                                                        00648000
FILLZERO:                                                               00650000
      TOS := 0;                                                         00652000
FC:                                                                     00654000
      IOQP(QADDR) := TOS; << SAVE FILL WORD IN ADRESS WORD OF IOQ >>    00656000
      DITP(DDADR) := IOQP(QPAR2); << PUT DISC ADR. INTO DIT >>          00658000
FILLCONT:                                                               00660000
      TOS := DITP(DXFER);                                               00662000
      DUPLICATE;                                                        00664000
      IF <= THEN GO TO GOODEND; << ALL DONE >>                          00666000
      TOS := DITPL(DDADR).SECTOR LOR CONTROL;                           00668000
      TOS := DITP(X)&TRACK;                                             00670000
      DITP(X) := DITP(X) + 8; << UPDATE DISC ADRESS >>                  00672000
      DSIOP(1) := TOS; << ENTER DISC ADRESS >>                          00674000
      BUFADR := @IOQP(QADDR) + SYSDB; << SET FILL ADRESS >>             00676000
      X := I;                                                           00678000
      WHILE X < 9 AND TOS > 128 DO                                      00680000
      BEGIN << BUILD SERIES OF CHAINED FILL ORDERS >>                   00682000
         TOS := TOS - 128;                                              00684000
         TOS := CHAINFILL;                                              00686000
         TOS := BUFADR;                                                 00688000
         DSIOP(X) := TOS;                                               00690000
         ASSEMBLE(INCX,DUP);                                            00692000
      END;                                                              00694000
      TOS := FILL;                                                      00696000
      TOS := BUFADR;                                                    00698000
      DSIOP(X) := TOS;                                                  00700000
      I := X;                                                           00702000
      DITP(DXFER) := TOS - 128;                                         00704000
      GO TO ENDIO;                                                      00706000
   END ELSE                                                             00708000
   BEGIN << CONTINUATOR SECTION >>                                      00710000
      IOQP.SFAIL := 0;                                                  00712000
      IF <> THEN GO TO NOTREADY;                                        00714000
      IF DITP(DSTAT).DISCERR = 0 THEN                                   00716000
      BEGIN << NO ERROR >>                                              00718000
         IF IOQPL(QMISC).BADTRK THEN                                    00720000
         BEGIN << GOT THE BAD TRACK TABLE IN A SYSBUF >>                00722000
            IOQP(X).WRITEBIT := 1;                                      00724000
            IF <> THEN                                                  00726000
            BEGIN << HAVE COMPLETED RETURN OF BTT TO DISC >>            00728000
RETURNSB:                                                               00730000
               RETURNSBUF(DITP(DSYSBA));                                00732000
BADRETRY:                                                               00734000
               TOS:= DITP(DLOGERROR)&LSL(4);<<EXAMINE STATUS>> <<01408>>00736000
               IF < THEN                                                00738000
               BEGIN << DISC CRC ERROR >>                               00740000
                  TOS := TRANSERR;                                      00742000
BADEND:                                                                 00744000
                  IOQP(QWBCT) := 0;  << ZERO TRANSFER COUNT >>          00746000
                  GO TO BADCONT;                                        00748000
               END;                                                     00750000
               TOS := TOS&LSL(2);                                       00752000
               IF < THEN                                                00754000
               BEGIN << I/O TRANSFER ERROR >>                           00756000
                  TOS := DATAOVERUN;                                    00758000
                  GO TO BADEND;                                         00760000
               END;                                                     00762000
               TOS := TOS&LSL(1);                                       00764000
               IF < THEN                                                00766000
               BEGIN << TRACK ADRESS TO BIG >>                          00768000
                  TOS := INVDISCADR;                                    00770000
                   GO TO BADEND;                                        00772000
               END;                                                     00774000
               TOS := UNITFAIL;                                         00776000
               GO TO BADEND;                                            00778000
            END ELSE                                                    00780000
            BEGIN << HAVE READ BTT, UPDATE AND RETURN >>                00782000
               TOS := DITP(DDADR)&LSL(2); << BAD TRACK # >>             00784000
               I := 0;                                                  00786000
               @BADTRACK := DITP(DSYSBA);                               00788000
               WHILE I < BADTRACK DO                                    00790000
               BEGIN << SEE IF BAD TRACK IS ALREADY IN THE TABLE >>     00792000
                  DUPLICATE;                                            00794000
                  IF TOS = BADTRACK(I := I + 1) THEN GO TO RETURNSB;    00796000
               END;                                                     00798000
               IF BADTRACK > 120 THEN GO TO RETURNSB;                   00800000
               TOS := BADTRACK;                                         00802000
               ASSEMBLE(INCA,DUP; STAX);                                00804000
               BADTRACK := TOS;                                         00806000
               BADTRACK(X) := TOS; <<ENTER BAD TRACK INTO TABLE >>      00808000
               SIOP(4) := WRITE128;                                     00810000
               GO TO EXECIO;                                            00812000
            END;                                                        00814000
         END ELSE                                                       00816000
         BEGIN << NO BAD TRACK, NORMAL COMPLETION >>                    00818000
            IF IOQP(QFUNC).FUNC >= 5 AND                       <<02870>>00820000
              IOQP(QFUNC).FUNC <> 11 THEN GO TO FILLCONT;      <<02870>>00822000
GOODEND:                                                                00824000
            TOS := SUCCESS;                                             00826000
BADCONT:                                                                00828000
            MSTATE := 5;                                                00830000
DONE:                                                                   00832000
            IOQP(QSTAT).STAT := TOS; << SET RETURN STATUS >>            00834000
            RETURN;                                                     00836000
         END;                                                           00838000
      END ELSE                                                          00840000
      BEGIN << HAD A DISC ERROR, RETRY XFER >>                          00842000
         DITP(DSERR):= [8/1,8/DLOGERROR];<<LOG COUNT & INDEX>> <<01337>>00844000
         DITP(DLOGERROR):= DITP(DSTAT);   <<LOG ERROR>>        <<01337>>00846000
         TOS := IOQP(QMISC); << INC RETRY CNT >>                        00848000
         ASSEMBLE(INCA,DUP);                                            00850000
         MMSTAT(100,DITP(DSTAT),S0,                                     00852000
         IOQPL(QLDEV).QLDEVN LOR SIOCOUNT&LSL(8));                      00854000
         IOQP(QMISC) := TOS;                                            00856000
         IF TOS.RETRYCNT < 10 THEN GO TO EXECIO;                        00858000
         IF NOT DITPL(DLOGERROR).CRCERR THEN GO TO BADRETRY;   <<01408>>00860000
         << DO BAD TRACK ONLY ON CRC ERROR >>                           00862000
         TOS := IOQP(QMISC); << DO BAD TRACK STUFF >>                   00864000
         TOS := TOS LAND -16; << ZERO RETRY CNT FIELD >>                00866000
         TOS.BADTRK := 1;                                               00868000
         IOQP(X) := TOS;                                                00870000
         IF <> THEN GO TO BADRETRY; << FAILED ON BTT >>                 00872000
         SIOP(1) := 0; << ZERO BANK # >>                                00874000
         TOS := CONTROL1;                                               00876000
         TOS := 0;                                                      00878000
         DSIOP(1) := TOS; << READ IN THE BAD TRACK TABLE >>             00880000
         TOS := READ128;                                                00882000
         TOS := GETSBUF(1);                                             00884000
         DUPLICATE;                                                     00886000
         IF = THEN GO TO BADRETRY;                                      00888000
         DITP(DSYSBA) := TOS;                                           00890000
         TOS := TOS + SYSDB;                                            00892000
         DSIOP(2) := TOS;                                               00894000
         TOS := DRTN;                                                   00896000
         TOS := 2;                                                      00898000
         ASSEMBLE(CIO 1; BL *-1; TIO 0; BL *-1);                        00900000
         DITP(DDADR) := TOS; << SAVE THE BAD TRACK # >>                 00902000
         TOS := 0;                                                      00904000
         ASSEMBLE(CIO 1); << RESET STATUS TO STAT 0 >>                  00906000
         GO TO ENDIO;                                                   00908000
      END;                                                              00910000
   END;                                                                 00912000
IOFAIL:                                                                 00914000
   IOFAILURE(DRTN,DITP); << SENT FAILURE MESSAGE AND DIE >>             00916000
END;                                                                    00918000
   ASSEMBLE(                                                            00920000
      PCAL SIODM; << MONITOR >>                                         00922000
      PCAL FHDDVR; << INITIATOR >>                                      00924000
      PCAL FHDDVR; << COMPLETOR >>                                      00926000
      CON 0; << I/O PROCESS PROCEDURE >>                                00928000
      CON 0; << INITIALIZATION PROCEDURE >>                             00930000
      CON 1; << # OF INTERRUPT HANDLERS >>                              00932000
      PCAL GIP); << INTERRUPT HANDLER >>                                00934000
END.                                                                    00936000
