$CONTROL MAP,CODE,USLINIT                                               00010000
<<IOTAPE0 - MODULE 18>>                                                 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=IOTAPE0                                                   00030000
$CONTROL PRIVILEGED,UNCALLABLE                                          00032000
$THIRTY                                                                 00034000
$TITLE "7970A/B/E MAGNETIC TAPE DRIVER"                                 00036000
                                                                        00038000
DRIVER REQUEST CODES:                                                   00040000
                                                                        00042000
    0 - READ                                                            00044000
        P1(13:3) - END OF FILE SPECIFICATION                            00046000
    1 - WRITE                                                           00048000
        P2(15:1) - IF SET THEN WRITE PAST END OF TAPE MARK              00050000
                   IF CLEAR THEN RETURN ERROR IF EOT HAS BEEN DETECTED  00052000
    2 - OPEN FILE (NO OPERATION)                                        00054000
    3 - CLOSE FILE (RESET EOF FLAGS IN LPDT)                            00056000
    4 - CLOSE DEVICE (RESET EOF FLAGS AND REWIND TAPE)                  00058000
    5 - REWIND                                                          00060000
    6 - WRITE TAPE MARK                                                 00062000
    7 - FORWARD SPACE FILE                                              00064000
    8 - BACKSPACE FILE                                                  00066000
    9 - REWIND AND UNLOAD                                               00068000
   10 - GAP                                                             00070000
   11 - FORWARD SPACE RECORD                                            00072000
   12 - BACKSPACE RECORD                                                00074000
                                                                        00076000
COUNT - WORD/BYTE COUNT. NOTE THAT ALTHOUGH THE BYTE COUNT RETURNED     00078000
        WILL REFLECT THE TRUE INFORMATION TRANSFER, AN EVEN NUMBER OF   00080000
        BYTES WILL ALWAYS BE PHYSICALLY TRANSFERRED.                    00082000
                                                                        00084000
DRIVER RETURN CODES:                                                    00086000
                                                                        00088000
  GENERAL STATUS (13:3)       QUALIFING STATUS (8:5)       OVERALL (8:8)00090000
                                                                        00092000
  0 - PENDING                 1 - WAITING FOR COMPLETION   %10          00094000
                              2 - DOING ERROR RECOVERY     %20          00096000
                              3 - NOT READY WAIT           %30          00098000
                              4 - NO WRITE RING WAIT       %40          00100000
                                                                        00102000
  1 - SUCCESSFUL              0 - NO ERRORS                  1          00104000
                              2 - RETRY WAS NECESSARY      %21          00106000
                              3 - EOT AFTER WRITE          %31          00108000
                                                                        00110000
  2 - END OF FILE             1 - A TAPE MARK WAS READ OR  %12          00112000
                                  P1 WAS NONZERO AND THE                00114000
                                  LAST RECORD READ WAS A                00116000
                                  TAPE MARK                             00118000
                          2 - 7   THE DATA DEPENDENT EOF                00120000
                                  CONDITION AS SPECIFIED                00122000
                                  BY EOFCHECK                           00124000
                                                                        00126000
  3 - UNUSUAL CONDITION       3 - REQUEST ABORTED          %33          00128000
                              6 - POWERFAIL ABORT          %63          00130000
                              7 - BOT AND BACKSPACE REQ.   %73          00132000
                             10 - TAPE RUNAWAY             %103         00134000
                            %11 - EOT AND WRITE REQ.       %113         00136000
  4 - IRRECOVERABLE ERROR     0 - INVALID REQUEST            4          00138000
                              1 - TRANSMISSION ERROR       %14          00140000
                              3 - TIMING ERROR             %34          00142000
                              4 - SIO FAILURE              %44          00144000
                              5 - UNIT FAILURE             %54          00146000
                              7 - TAPE PARITY ERROR        %74          00148000
                            %12 - SYSTEM ERROR             %124         00150000
                                                                        00152000
                                                                        00154000
TAPE CONTROLLER STATUS                                                  00156000
   BITS       USE                                                       00158000
                                                                        00160000
      0       SIO OK                                                    00162000
      1       ODD BYTE READ                                             00164000
      2       INTERRUPT REQUEST                                         00166000
   3- 4       UNIT NUMBER                                               00168000
      5       END OF TAPE                                               00170000
      6       WRITE PROTECTED                                           00172000
      7       UNIT READY                                                00174000
      8       BEGINNING OF TAPE                                         00176000
      9       800/1600 CPI DRIVE                                        00178000
     10       LAST OPERATION WAS A WRITE                                00180000
     11       END OF FILE MARK DETECTED                                 00182000
  12-14       ENCODED ERROR STATUS                                      00184000
     15       9/7 TRACK DRIVE (ALWAYS 0)                                00186000
                                                                        00188000
   ENCODED ERROR STATUS                                                 00190000
                                                                        00192000
      000   UNIT READY                                                  00194000
      001   TRANSFER ERROR                                              00196000
      010   COMMAND REJECTED                                            00198000
      011   TAPE RUNAWAY                                                00200000
      100   TIMING ERROR                                                00202000
      101   TAPE ERROR                                                  00204000
      110   UNUSED                                                      00206000
      111   NO ERROR ENCOUNTERED                                        00208000
$PAGE                                                                   00210000
BEGIN                                                                   00212000
EQUATE                                                                  00214000
   ABORTIO     = %33,      << I/O ABORTED RETURN STATUS >>              00216000
   BACK'       = 1,        << BACKSPACE RECOVERY BIT OF QMISC >>        00218000
   BOTBACK     = %73,      << BACKSPACE ERROR STATUS RETURN >>          00220000
   BSFILE      = %13,                                                   00222000
   BSRECORD    = %12,                                                   00224000
   BSRF        = 12,                                           <<00.05>>00226000
   CLOSE       = 3,                                                     00228000
   CONSOLE     = 0,        << MESSAGE REQUEST >>                        00230000
   DCLOSEF     = 4,                                                     00232000
   DDFLAG      = 9,       <<DIT REWIND FLAG>>                  <<00.05>>00234000
   DLDEV       = 3,        << DIT LDEV INDEX >>                         00236000
   DLOGERROR   = 11,       << DIT ERROR LOG STATUS >>          <<01338>>00238000
   DSERR       = 7,        << DIT ERROR STATUS INDEX >>                 00240000
   DSTAT       = 6,        << DIT DEVICE STATUS INDEX >>                00242000
   DTIME       = 8,       <<DIT TIMEOUT COMPLETED INDICATOR>>  <<00.05>>00244000
   DTRLX       = 10,      <<DIT TIMEOUT DELAY DTRLX>>          <<00.05>>00246000
   ENDINT      = %034000,                                               00248000
   EOFB'       = 4,       << END OF FILE BACKSPACE BIT OF QMISC >>      00250000
   FORSP'      = 2,       << FORWARD SPACE RECOVERY BIT OF QMISC >>     00252000
   FSFILE      = %17,                                                   00254000
   FSRECORD    = 7,                                                     00256000
   FSRF        = 11,                                           <<00.05>>00258000
   GAPF        = 10,                                                    00260000
   GOODEOT     = %31,      << EOT AFTER WRITE RETURN STATUS >>          00262000
   GOODRETRY   = %21,      << RETRY NECESSARY FOR SUCCESS RETURN STAT >>00264000
   GOODSTAT    = 1,        << REQUEST SUCCESSFUL STATUS RETURN >>       00266000
   INVFUNC     = 4,        << INVALID FUNCTION STATUS RETURN >>         00268000
   NOERR       = 7,        << NO ERROR ENCODED STATUS RETURN >>         00270000
   NOTRDYMSG   = 11,       << NOT READY MSG CAT INDEX >>                00272000
   NOWRITERING = 220,      << NO WRITE RING MSG CAT INDEX >>            00274000
   OPEN'       = 7,        << Avail bit in QMISC >>            <<02629>>00276000
   PFABORT     = %63,      << POWER FAIL ABORT STATUS RETURN >>         00278000
   QFUNC       = 6,        << IOQ FUNCTION INDEX >>                     00280000
   QMISC       = 3,        << IOQ ERROR WORD INDEX >>                   00282000
   QPAR1       = 8,        << IOQ PARAMETER INDEX >>                    00284000
   QPAR2       = 9,                                                     00286000
   QSTAT       = 10,       << STATUS RETURN WORD OF IOQ >>              00288000
   QWBCT       = 7,        << IOQ XFER CNT INDEX >>                     00290000
   RDYWAIT     = %30,      << NOT READY WAIT STATUS RETURN >>           00292000
   READCON     = 6,                                                     00294000
   READF       = 0,                                                     00296000
   RESETIF     = %100000,                                               00298000
   RESIDUE     = %010000,                                               00300000
   RETRY'      = 0,         << RETRY BIT OF QMISC >>                    00302000
   RETRYWAIT   = %20,      << RETRY WAIT STATUS RETURN >>               00304000
   RETRYSTAT   = %21,      << RETRY NECESSARY STATUS RETURN >>          00306000
   REWF        = 5,                                                     00308000
   REWINDC     = %10,                                                   00310000
   REWULDF     = 9,                                                     00312000
   REWUNLOAD   = %11,                                                   00314000
   RINGWAIT    = %40,      << NO WRITE RING WAIT RETURN STATUS >>       00316000
   SHORT'      = 5,       << SHORT READ BIT OF QMISC >>                 00318000
   SIOFAIL     = %44,      << SIO FAIL STATUS RETURN >>                 00320000
   SYSDB       = %1000,                                                 00322000
   SYSERROR    = %124,     << SYSTEM ERROR STATUS RETURN >>             00324000
   SYSLPDT     = %10,      << LPDT POINTER INDEX >>                     00326000
   SYSSBUF     = 6,        << SYS BUF TABLE POINTER INDEX >>            00328000
   TAPEERR     = %74,      << TAPE ERROR STATUS RETURN >>               00330000
   TAPEGAP     = 5,                                                     00332000
   TAPEMARK    = %15,                                                   00334000
   TAPERUN     = %103,     << TAPE RUNAWAY STATUS RETURN >>             00336000
   TIMINGERR   = %34,      << TIMING ERROR STATUS RETURN >>             00338000
   TGAP'       = 3,       << GAP SPACE RECOVERY BIT OF QMISC >>         00340000
   UNITFAIL    = %54,      << UNIT FAIL STATUS RETURN >>                00342000
   WAIT        = %10,      << WAIT FOR COMPLETION STATUS RETURN >>      00344000
   WRITEF      = 1,                                                     00346000
   WRITECON    = 4,                                                     00348000
   WRTEOT      = %113,     << REQUEST WRITE AFTER EOT STATUS RETURN >>  00350000
   WRTMKF      = 6,                                                     00352000
   XFERERR     = %14;      << TRANSFER ERROR STATUS RETURN >>           00354000
DEFINE                                                                  00356000
   ABS         = ABSOLUTE#,                                             00358000
   ASMB        = ASSEMBLE#,                                             00360000
   BACK        = (BACK':1)#,                                            00362000
   DUPLICATE   = ASSEMBLE(DUP)#,                                        00366000
   EOF         = (7:3)#,   << EOF FIELD OF LPDT >>                      00368000
   EOFB        = (EOFB':1)#,                                            00370000
   EOFBIT      = (11:1)#,  << EOF ENCOUNTERED BIT IN TAPE STATUS >>     00372000
   EOT         = (5:1)#,   << EOT BIT IN TAPE STATUS >>                 00374000
   EOTFLAG     = (13:1)#,  << READ PAST EOT BIT IN QPAR2 >>             00376000
   ERRCODE     = (12:3)#,  << ENCODED ERROR FIELD IN TAPE STATUS >>     00378000
   ERRCNT      = (12:4)#,  << RETRY COUNT FIELD OF QMISC  >>   <<02629>>00380000
   FORSP       = (FORSP':1)#,                                           00382000
   FUNC        = (8:8)#,   << FILE PROTECTED BIT OF TAPE STATUS  >>     00386000
   FILEPROTECT = (6:1)#,   << FILE PROTECTED TAPE STATUS BIT >>         00388000
   LDEV        = (8:8)#,   << LOGICAL DEVICE FIELD OF DIT >>            00390000
   LOADP       = (8:1)#,   << LOAD POINT BIT OF TAPE STATUS >>          00392000
   ODDBYTE     = (1:1)#,   << ODD BYTE XFER BIT OF TAPE STATUS >>       00394000
   PFAILB      = (11:1)#,  << POWER FAIL ABORT BIT OF QFLAGS >>         00396000
   READY       = (7:1)#,   << DRIVE READY BIT OF TAPE STATUS >>         00398000
   RETRY       = (RETRY':1)#,                                           00400000
   REWB4WRITE  = (14:1)#,  <<NEED REWIND TO ASSURE AT LOADP>>  <<00562>>00402000
   REWOUND     = (15:1)#,  <<DRIVE IS REWOUND>>                <<00562>>00404000
   SC          = (8:4)#,   << Space count field of QMISC  >>   <<02629>>00406000
   SFAIL       = (10:1)#,  << GIP FAILED TO START I/O >>                00408000
   SHORT       = (SHORT':1)#,                                           00410000
   STAT        = (8:8)#,   << STATUS FIELD OF QSTAT >>                  00412000
   SYSBUFR     = (3:1)#,   << SYSTEM BUFFER INDICATOR OF QFLAG >>       00414000
   TGAP        = (TGAP':1)#,                                            00416000
   WRTUNLD     = (6:1)#;   << UNLOAD TAPE FOR WRITE RING BIT QMISC >>   00418000
                                                                        00420000
                                                                        00422000
ARRAY INITIAL(0:55)=DB:=  <<INITIAL CONFIGURATION DATA>>       <<01338>>00424000
   %006001,               <<DIT SIZE=12,DVR TYPE=1>>           <<01338>>00426000
         0,                                                             00428000
   %026462,  << UNIT EXTRACT INSTRUCTION >>                             00430000
   [8/20,8/0],  << SIO PROG AREA SIZE(40 WORDS)/2 =  20>>      <<01300>>00432000
        0,    <<DFLAG>>                                        <<01338>>00434000
        0,    <<DLINK>>                                        <<01338>>00436000
        0,    <<DIOQP>>                                        <<01338>>00438000
        0,    <<DLDEV>>                                        <<01338>>00440000
        0,    <<DLTP>>                                         <<01338>>00442000
        0,    <<DILTP>>                                        <<01338>>00444000
        0,    <<DSTAT>>                                        <<01338>>00446000
        0,    <<DSERR>> <<INDEX & COUNT OF HARWARE STATUS>>    <<01338>>00448000
        0,    <<DTIME  TIMEOUT COMPLETED INDICATOR>>           <<01338>>00450000
        0,    <<DDFLAG - REWIND FLAG>>                         <<01338>>00452000
        0,    <<DTRLX - TIMEOUT DELAY>>                        <<01338>>00454000
        0,    <<DLOGERROR>>                                    <<01338>>00456000
   %014000,  << SIO PROG AREA - SET BANK >>                             00458000
         0,                                                             00460000
   %040000,  << CONTROL - UNIT SELECT >>                                00462000
         0,                                                             00464000
   %040000,  << CONTROL - OPERATION >>                                  00466000
         0,                                                             00468000
     34(0);  << REST OF I/O PROGRAM >>                                  00470000
$PAGE                                                                   00472000
PROCEDURE ABORTTIMEREQ(TRLX);                                           00474000
VALUE TRLX; INTEGER TRLX;                                               00476000
OPTION EXTERNAL;                                                        00478000
                                                                        00480000
PROCEDURE CHECKINDEX(INDEX,TABLE);                                      00482000
VALUE INDEX,TABLE;                                                      00484000
INTEGER INDEX;                                                          00486000
INTEGER POINTER TABLE;                                                  00488000
OPTION EXTERNAL;                                                        00490000
                                                                        00492000
                                                                        00494000
PROCEDURE EOFCHECK(IOQP,BUF,CNT,HCHK);                                  00496000
VALUE IOQP,BUF,CNT,HCHK;                                                00498000
POINTER IOQP;                                                           00500000
DOUBLE BUF;                                                             00502000
INTEGER CNT,HCHK;                                                       00504000
OPTION EXTERNAL;                                                        00506000
                                                                        00508000
                                                                        00510000
PROCEDURE GIP;                                                          00512000
OPTION EXTERNAL;                                                        00514000
                                                                        00516000
INTEGER PROCEDURE TIMEREQ(CODE,REQ,TIME);                               00518000
VALUE CODE,REQ,TIME;                                                    00520000
INTEGER CODE,REQ; DOUBLE TIME;                                          00522000
OPTION EXTERNAL;                                                        00524000
                                                                        00526000
PROCEDURE HELP;                                                         00528000
OPTION EXTERNAL;                                                        00530000
                                                                        00532000
                                                                        00534000
LOGICAL PROCEDURE IOMESSAGE(SETNO,MSGNO,MASK,P1,P2,P3,P4,P5,   <<0U.EB>>00536000
   DEST,REPLY,OFFSET,DITP,IOTYPE);                             <<0U.EB>>00538000
VALUE SETNO,MSGNO,MASK,P1,P2,P3,P4,P5,DEST,REPLY,OFFSET,DITP,  <<0U.EB>>00540000
   IOTYPE;                                                     <<0U.EB>>00542000
INTEGER SETNO,MSGNO,MASK,P1,P2,P3,P4,P5,DEST,REPLY,OFFSET,     <<0U.EB>>00544000
   IOTYPE;                                                     <<0U.EB>>00546000
INTEGER POINTER DITP;                                          <<0U.EB>>00548000
OPTION VARIABLE,EXTERNAL;                                      <<0U.EB>>00550000
                                                               <<0U.EB>>00552000
PROCEDURE LDEVNOTRDY(DITP);                                    <<0U.EB>>00554000
   VALUE DITP; POINTER DITP; OPTION EXTERNAL;                  <<0U.EB>>00556000
                                                                        00558000
                                                                        00560000
PROCEDURE MASTERCLEAR(DITP);                                            00562000
VALUE DITP;                                                             00564000
INTEGER POINTER DITP;                                                   00566000
OPTION EXTERNAL;                                                        00568000
                                                                        00570000
                                                                        00572000
PROCEDURE SIODM(A,B);                                                   00574000
VALUE A,B;                                                              00576000
INTEGER POINTER A;                                                      00578000
LOGICAL B;                                                              00580000
OPTION EXTERNAL;                                                        00582000
                                                                        00584000
                                                                        00586000
PROCEDURE STARTIO(A,B,C);                                               00588000
VALUE A,B,C;                                                            00590000
INTEGER POINTER A,B;                                                    00592000
LOGICAL C;                                                              00594000
OPTION EXTERNAL;                                                        00596000
$PAGE                                                                   00598000
INTEGER PROCEDURE MTAPEDVR(IOQP,DITP,BANK,BUFADR,SIOP,DRTN);            00600000
VALUE IOQP,DITP,BANK,BUFADR,SIOP,DRTN;                                  00602000
INTEGER BANK,BUFADR,DRTN;                                               00604000
INTEGER POINTER IOQP,DITP,SIOP;                                         00606000
OPTION PRIVILEGED,UNCALLABLE;                                           00608000
BEGIN                                                                   00610000
                                                                        00612000
                                                                        00614000
DOUBLE                                                                  00616000
   ABSADR      = BANK,                                                  00618000
   DXFERORDER  = BANK;                                                  00620000
DOUBLE POINTER                                                          00622000
   DSIOP       = SIOP,                                                  00624000
   LPDTD       = DB + SYSLPDT;                                          00626000
LOGICAL                                                                 00628000
   STATUS      = Q+2,                                                   00630000
   XFERORDER   = BANK;                                                  00632000
LOGICAL POINTER                                                         00634000
   DITPL       = DITP,                                                  00636000
   IOQPL       = IOQP;                                                  00638000
INTEGER                                                                 00640000
   FCODE       = Q+3,                                                   00642000
   I           = Q+1,                                                   00644000
   MSTATE      = MTAPEDVR,                                              00646000
   S0          = S-0,                                                   00648000
   S3          = S-3,                                                   00650000
   X           = X,                                                     00652000
   XD          = Q+4,                                                   00654000
   XFERCNT     = Q+5;                                                   00656000
INTEGER POINTER                                                         00658000
   SBUF        = DB + SYSSBUF;                                          00660000
                                                                        00662000
<<This subroutine returns a TRUE condition if the conditions >><<02680>>00664000
<<are such that a write after encountering EOT is NOT allowed>><<02680>>00666000
logical subroutine CHECK'WRITE'AFTER'EOT;                      <<02680>>00668000
begin                                                          <<02680>>00670000
                                                               <<02680>>00672000
if STATUS.EOT                   <<EOT has been passed on tape>><<02680>>00674000
   and not IOQPL(QPAR2).EOTFLAG <<wrt after EOT flag not set>> <<02680>>00676000
   and IOQP(QMISC) >= 0 then    <<not in RETRY mode>>          <<02680>>00678000
  CHECK'WRITE'AFTER'EOT := true;                               <<02680>>00680000
                                                               <<02680>>00682000
end;                                                           <<02680>>00684000
                                                                        00686000
   TOS := IOQP;                                                         00688000
   DEL;                                                                 00690000
   IF < THEN                                                            00692000
   BEGIN << I/O HAS BEEN ABORTED >>                                     00694000
      IF MSTATE = 3 THEN MASTERCLEAR(DITP); << STOP I/O IF MINE >>      00696000
      IF IOQPL.PFAILB THEN TOS := PFABORT ELSE TOS := ABORTIO;          00698000
      DITPL(DDFLAG).REWB4WRITE := FALSE; <<ABORT AUTO REWIND>> <<00668>>00700000
      GO TO BADEND;                                                     00702000
   END;                                                                 00704000
   TOS := 3; << SET I >>                                                00706000
   TOS := DITP(DSTAT); << SET STATUS >>                                 00708000
   TOS := IOQP(QFUNC).FUNC; << SET FCODE >>                             00710000
   TOS := 0;  << XD >>                                                  00712000
   TOS := IOQP(QWBCT);                                                  00714000
   IF < THEN TOS := -(TOS&ASR(1)); << SET XFERCNT >>                    00716000
                                                                        00718000
IF DITP(DTIME).(0:1)=1 THEN                                    <<00.05>>00720000
BEGIN      <<TIMEOUT HAS ELAPSED>>                             <<00.05>>00722000
    ABORTTIMEREQ(DITP(DTRLX));                                 <<00.05>>00724000
    IOQP(QMISC).WRTUNLD:=1;   <<UNLOAD TAPE FOR INSTALLING>>   <<00.05>>00726000
    DITP(DTIME):=0;                        <<WRITE RING>>      <<00.05>>00728000
    TOS:=REWUNLOAD;                                            <<00.05>>00730000
    GOTO CONTROLCONT;                                          <<00.05>>00732000
END;                                                           <<00.05>>00734000
   IF MSTATE = 2 THEN                                                   00736000
   BEGIN << START REQUEST - INITIATOR SECTION >>                        00738000
      IF FCODE > 12 THEN                                                00740000
      BEGIN << INVALID REQUEST >>                                       00742000
INVALIDFUNC:                                                            00744000
         TOS := INVFUNC;                                                00746000
         GO TO BADEND;                                                  00748000
      END;                                                              00750000
      X := FCODE; << SWITCH ON REQUEST CODE >>                          00752000
      ASSEMBLE(LOAD SWI,X; ADAX; BR SWI,X;                              00754000
SWI:                                                                    00756000
      CON READ;   CON WRITE;  CON OPEN;   CON FCLOSE; CON DCLOSE;       00758000
      CON REW;    CON WRTMK;  CON FSF;    CON BSF;    CON REWULD;       00760000
      CON GAP;    CON FSR;    CON BSR);                                 00762000
                                                                        00764000
   HELP;                                                                00766000
                                                                        00768000
READ:                                                                   00770000
      EOFCHECK(IOQP,0D,0,0); << CHECK FOR PRE READ EOF >>               00772000
      IF <> THEN                                                        00774000
      BEGIN << EOF FOUND >>                                             00776000
EOFOUT:                                                                 00778000
         MSTATE := 5;                                                   00780000
         RETURN;                                                        00782000
      END;                                                              00784000
      IF XFERCNT = 0 THEN GO FSRPEOF; << READ LENGTH OF ZERO >><<00.06>>00786000
      IF XFERCNT < 3 THEN                                               00788000
      BEGIN << SHORT READ FOR EOFCHECK >>                               00790000
         BANK := 0; << READ 3 WORDS INTO SIO PROG AREA FOR EOFCHECK >>  00792000
         BUFADR := @SIOP(20) + SYSDB;                                   00794000
         IOQP(QMISC).SHORT := 1;                                        00796000
         XFERCNT := 3;                                                  00798000
      END;                                                              00800000
      TOS := %170000; << CHAINED READ OF 4K >>                          00802000
      TOS := READCON;                                                   00804000
WRITECONT:                                                              00806000
      SIOP(5) := TOS; << SET XFER CONTROL ORDER >>                      00808000
      SIOP(1) := BANK; << SET BANK FOR XFER >>                          00810000
      IF IOQPL.SYSBUFR THEN                                             00812000
      BEGIN                                                             00814000
         TOS := TOS + %007600; << SET XFER ORDER TO 256 WORDS >>        00816000
         CHECKINDEX(@SBUF+SYSDB-BUFADR,SBUF);                           00818000
         IF XFERCNT > 1024 THEN GO TO INVALIDFUNC; << XFER TOO BIG >>   00820000
         TOS := 128;                                                    00822000
      END ELSE TOS := 4096;                                             00824000
      XD := TOS; << TRANSFER DELTA >>                                   00826000
      XFERORDER := TOS;                                                 00828000
      TOS := XFERCNT;                                                   00830000
      WHILE S0 > XD DO                                                  00832000
      BEGIN << BUILD CHAINED XFER ORDER >>                              00834000
         TOS := TOS - XD; << DECREMENT REMAINING COUNT >>               00836000
         DSIOP(I) := DXFERORDER;                                        00838000
         TOS := RESIDUE;                                                00840000
         TOS := -XD;                                                    00842000
         DSIOP(X:=X+1) := TOS; << RETURN RESIDUE ORDER >>               00844000
         I := X + 1;                                                    00846000
         IF IOQPL.SYSBUFR THEN                                          00848000
         BEGIN << ADVANCE THE BUFFER ADRESS >>                          00850000
            CHECKINDEX(ABS(BUFADR-1),SBUF);                             00852000
            BUFADR := ABS(X) + @SBUF + SYSDB;                           00854000
         END ELSE BUFADR := BUFADR + XD;                                00856000
      END;                                                              00858000
      ASMB(NEG,DUP; TRBC 3); << BUILD LAST XFER ORDER PAIR >>           00860000
      TOS := TOS LOR XFERORDER;                                         00862000
      ASMB(TRBC 0); << REMOVE DATA CHAINING BIT >>                      00864000
      TOS := BUFADR;                                                    00866000
      DSIOP(I) := TOS;                                                  00868000
      TOS := RESIDUE;                                                   00870000
      ASSEMBLE(XCH,INCX); << ADD RETURN RESIDUE ORDER >>                00872000
      DSIOP(X) := TOS;                                                  00874000
      I := X + 1;                                                       00876000
ENDIO:                                                                  00878000
      TOS := ENDINT;                                                    00880000
      TOS := -1;                                                        00882000
      DSIOP(I) := TOS;                                                  00884000
      TOS := DITPL(DLDEV) LAND %1400; << SET UNIT SELECT CONTROL >>     00886000
      SIOP(3) := TOS;                                                   00888000
      STARTIO(DITP,SIOP,TRUE);                                          00890000
      IF > THEN                                                         00892000
      BEGIN << SIO FAILURE >>                                           00894000
SIOFAILURE:                                                             00896000
         TOS := SIOFAIL;                                                00898000
         GO TO BADEND;                                                  00900000
      END;                                                              00902000
      DITPL(DDFLAG).REWOUND := FALSE;  <<RESET REWOUND>>       <<00562>>00904000
      MSTATE := %13; << SET COMPLETION WAIT >>                          00906000
      TOS := IOQP(QMISC);                                               00908000
      ASMB(TBC EOFB');                                                  00910000
      IF <> THEN RETURN;                                                00912000
      ASMB(TBC RETRY');                                                 00914000
      IF <> THEN  TOS := RETRYWAIT ELSE TOS := WAIT;                    00916000
      GO TO OUT;                                                        00918000
                                                                        00920000
WRITE:                                                                  00922000
      IF DITPL(DDFLAG).REWB4WRITE  THEN <<NEED BE AT LOADP>>   <<00562>>00924000
        IF STATUS.LOADP  <<THEN ALREADY AT LOAD POINT>>        <<00562>>00926000
           THEN DITPL(DDFLAG).REWB4WRITE := FALSE              <<00562>>00928000
           ELSE GO TO REW;  <<GO REWIND THE TAPE>>             <<00562>>00930000
      IF XFERCNT=0  THEN GO TO TESTWRITE;                      <<00668>>00932000
      <<see if write after EOT is allowed>>                    <<02680>>00934000
      if CHECK'WRITE'AFTER'EOT then                            <<02680>>00936000
      BEGIN << ATTEMPTED A WRITE AFTER EOT >>                           00938000
         TOS := WRTEOT;                                                 00940000
         GO TO BADEND;                                                  00942000
      END;                                                              00944000
      TOS := %160000; << CHAINED WRITE OF 4K >>                         00946000
      TOS := WRITECON;                                                  00948000
      GO TO WRITECONT;                                                  00950000
                                                                        00952000
REW:                                                                    00954000
      TOS := REWINDC;                                                   00956000
      IF DITPL(DDFLAG).REWOUND  AND  STATUS.LOADP              <<00562>>00958000
      THEN GO TO GOODEND;<<ALREADY REWOUND>>                   <<01.01>>00960000
CONTROLCONT:                                                            00962000
      SIOP(5) := TOS;                                                   00964000
      GO TO ENDIO;                                                      00966000
                                                                        00968000
WRTMK:                                                                  00970000
      IF DITPL(DDFLAG).REWB4WRITE  THEN <<NEED BE AT LOADP>>   <<00687>>00972000
        IF STATUS.LOADP  <<THEN ALREADY AT LOAD POINT>>        <<00687>>00974000
           THEN DITPL(DDFLAG).REWB4WRITE := FALSE              <<00687>>00976000
           ELSE GO TO REW;  <<GO REWIND THE TAPE>>             <<00687>>00978000
                                                               <<02680>>00980000
      <<see if write after EOT is allowed>>                    <<02680>>00982000
      if CHECK'WRITE'AFTER'EOT then                            <<02680>>00984000
        begin                                                  <<02680>>00986000
        tos := WRTEOT;                                         <<02680>>00988000
        go to BADEND;                                          <<02680>>00990000
        end;                                                   <<02680>>00992000
                                                               <<02680>>00994000
      TOS := TAPEMARK;                                                  00996000
      GO TO CONTROLCONT;                                                00998000
                                                                        01000000
FSF:                                                                    01002000
      TOS := FSFILE;                                                    01004000
      GO TO CONTROLCONT;                                                01006000
                                                                        01008000
BSF:                                                                    01010000
      TOS := BSFILE;                                                    01012000
CHKLOADP:                                                               01014000
      IF STATUS.LOADP THEN                                              01016000
      BEGIN                                                             01018000
         TOS := BOTBACK;                                                01020000
         GO TO BADEND;                                                  01022000
      END;                                                              01024000
      GO TO CONTROLCONT;                                                01026000
                                                                        01028000
DCLOSE:                                                                 01030000
      TOS := LPDTD(DITP(DLDEV).LDEV);                                   01032000
      TOS.EOF := 0; << RESET EOF FIELD IN LPDT >>                       01034000
      LPDTD(X) := TOS;                                                  01036000
                                                                        01038000
REWULD:                                                                 01040000
      TOS := REWUNLOAD;                                                 01042000
      IF DITPL(DDFLAG).REWOUND  AND  NOT STATUS.READY          <<00562>>01044000
         THEN GO TO GOODEND;                                   <<00562>>01046000
      GO TO CONTROLCONT;                                                01048000
GAP:                                                                    01050000
      IF DITPL(DDFLAG).REWB4WRITE  THEN <<NEED BE AT LOADP>>   <<00687>>01052000
        IF STATUS.LOADP  <<THEN ALREADY AT LOAD POINT>>        <<00687>>01054000
           THEN DITPL(DDFLAG).REWB4WRITE := FALSE              <<00687>>01056000
           ELSE GO TO REW;  <<GO REWIND THE TAPE>>             <<00687>>01058000
      TOS := TAPEGAP;                                                   01060000
      GO TO CONTROLCONT;                                                01062000
                                                                        01064000
FSR:                                                                    01066000
     EOFCHECK(IOQP,0D,0,0);                                    <<00.05>>01068000
     IF <> THEN GOTO EOFOUT;                                   <<00.05>>01070000
FSRPEOF:                                                       <<00.06>>01072000
      TOS := FSRECORD;                                                  01074000
      GO TO CONTROLCONT;                                                01076000
                                                                        01078000
BSR:                                                                    01080000
     EOFCHECK(IOQP,0D,0,0);                                    <<00.05>>01082000
     IF <> THEN GOTO EOFOUT;                                   <<00.05>>01084000
BSRPEOF:                                                       <<00.06>>01086000
      TOS := BSRECORD;                                                  01088000
      GO TO CHKLOADP;                                                   01090000
   END ELSE                                                             01092000
   BEGIN << CONTINUATOR SECTION >>                                      01094000
      IF IOQPL.SFAIL THEN GO TO SIOFAILURE;                             01096000
      TOS := IOQP(QMISC); << CHECK FOR RETRY CONDITION >>               01098000
      IF < THEN                                                         01100000
      BEGIN << ERROR RECOVERY IN PROGRESS >>                            01102000
         ASMB(TBC BACK');                                               01104000
         IF <> THEN                                                     01106000
         BEGIN << BACKSPACE RECORD COMPLETED >>                         01108000
            IF STATUS.ERRCODE <> NOERR THEN GO TO FAIL;                 01110000
            if FCODE = WRITEF or FCODE = WRTMKF then           <<02684>>01112000
            BEGIN << WRITE ORDER, SO GAP THE TAPE >>                    01114000
               TOS.BACK := 0;                                           01116000
               TOS.TGAP := 1;                                           01118000
               IOQP(X) := TOS;                                          01120000
               GO TO GAP;                                               01122000
            END;                                                        01124000
            IF STATUS.LOADP THEN GO TO ENDBACK;                         01126000
            tos := tos + %20; <<Inc bwd space cntr>>           <<02629>>01128000
            if S0.SC <> S0.ERRCNT then                         <<02629>>01130000
            BEGIN << BACKSPACE ANOTHER RECORD >>                        01132000
               IOQP(X) := TOS;                                          01134000
               GO BSRPEOF;                                     <<00.06>>01136000
            END;                                                        01138000
            <<perform # of fwd spaces 1 less than bckspcs>>    <<02679>>01140000
ENDBACK:                                                                01142000
            TOS.BACK := 0; << FINISHED BACKSPACE, NOW FORWARD >>        01144000
            TOS.FORSP := 1;                                             01146000
         END;                                                           01148000
         ASMB(TBC FORSP');                                              01150000
         IF <> THEN                                                     01152000
         BEGIN << COMPLETED A FORWARD SPACE RECORD >>                   01154000
            IF STATUS.ERRCODE <> NOERR THEN GO TO FAIL;                 01156000
           if S0.SC > 0 then                                   <<02685>>01158000
            tos := tos - %20;  <<Decrement fwd space ctr>>     <<02679>>01160000
            if S0.SC > 0 then  <<must still space fwd>>        <<02679>>01162000
            BEGIN << FORWARD SPACE ANOTHER RECORD >>                    01164000
               IOQP(X) := TOS;                                          01166000
               GO FSRPEOF;                                     <<00.06>>01168000
            END;                                                        01170000
            S0.SC := 0;     << Reset space count >>            <<02629>>01172000
            TOS.FORSP := 0; << DONE WITH FORWARD SPACE >>               01174000
            IOQP(X) := TOS; << GO READ THE RECORD AGAIN >>              01176000
            GO TO READ;                                                 01178000
         END;                                                           01180000
         TOS.TGAP := 0;                                                 01182000
         IF <> THEN                                                     01184000
         BEGIN << GAP IS COMPLETE, RETRY THE WRITE >>                   01186000
            IF STATUS.ERRCODE <> NOERR THEN GO TO FAIL;                 01188000
            IOQP(X) := TOS;                                             01190000
            if FCODE = WRITEF then                             <<02684>>01192000
               go to WRITE    <<write retry>>                  <<02684>>01194000
            else                                               <<02684>>01196000
               go to WRTMK;   <<write filemark retry>>         <<02684>>01198000
         END;                                                           01200000
      END;                                                              01202000
      ASMB(TBC EOFB');                                                  01204000
      IF <> THEN GO TO EOFOUT;<< BACKSPACE DUE TO DATA EOF, RETURN EOF>>01206000
      X := STATUS.ERRCODE;                                              01208000
      DEL; << SWITCH ON ERROR CONDITION >>                              01210000
      ASMB(LOAD SWC,X; ADAX; BR SWC,X;                                  01212000
SWC:                                                                    01214000
      CON UNITRDY;   CON TRANSFER;  CON REJECT;    CON RUNAWAY;         01216000
      CON TIMING;    CON TAPERROR;  CON RESERVE;   CON NOERROR);        01218000
                                                                        01220000
BADEND:                                                                 01222000
      IOQP(QWBCT) := 0; << ZERO XFER COUNT ON ERROR RETURNS >>          01224000
      DITP(DSERR):= [8/1,8/DLOGERROR];<< LOG COUNT & INDEX>>   <<01338>>01226000
      DITP(DLOGERROR):= STATUS;           <<LOG ERROR>>        <<01338>>01228000
      GO TO UNUSUALEND;                                                 01230000
                                                                        01232000
UNITRDY:                                                                01234000
RESERVE:                                                                01236000
FAIL:                                                                   01238000
      TOS := UNITFAIL;                                                  01240000
      GO TO BADEND;                                                     01242000
                                                                        01244000
RUNAWAY:                                                                01246000
      TOS := TAPERUN;                                                   01248000
      GO TO BADEND;                                                     01250000
                                                                        01252000
TRANSFER:                                                               01254000
      MASTERCLEAR(DITP); << RESET CONTROLLER ON XFER ERROR >>           01256000
      TOS := XFERERR;                                                   01258000
      GO TO SKIP;                                                       01260000
                                                                        01262000
TIMING:                                                                 01264000
      TOS := TIMINGERR;                                                 01266000
      GO TO SKIP;                                                       01268000
                                                                        01270000
TAPERROR:                                                               01272000
      TOS := TAPEERR;                                                   01274000
SKIP:                                                                   01276000
      DITP(DSERR):= [8/1,8/DLOGERROR];<< LOG COUNT & INDEX>>   <<01409>>01278000
      DITP(DLOGERROR):= STATUS;       <<SET ERROR STATUS>>     <<01409>>01280000
      IF (FCODE=WRITEF OR FCODE=WRTMKF OR FCODE=GAPF)          <<00847>>01282000
        AND STATUS.(10:1)=0    <<WRITE STATUS BIT>>            <<00847>>01284000
        THEN GO TO FAIL;  <<WRITE CURRENT DROPPED--UNIT FAIL>> <<00847>>01286000
      if IOQP(QMISC).ERRCNT = 15 then go to BADEND;            <<02629>>01288000
      TOS := IOQP(X) + 1; << INCREMENT RETRY COUNTER >>                 01290000
      TOS.RETRY := 1;                                                   01292000
      TOS.BACK := 1;                                                    01294000
      tos := tos land %177417; <<zero spacing cntr>>           <<02629>>01296000
      IOQP(X) := TOS;                                                   01298000
      if FCODE > WRITEF and FCODE <> WRTMKF then               <<02684>>01300000
        go to BADEND                                           <<02684>>01302000
      else                                                     <<02684>>01304000
        go to BSRPEOF;  <<attempt error recovery>>             <<02684>>01306000
                                                                        01308000
REJECT:                                                                 01310000
      IF FCODE = READF AND STATUS.READY THEN GO TO NOERROR;             01312000
      << SHORT READ CONDITION >>                                        01314000
TESTWRITE:                                                              01316000
      IF NOT STATUS.READY THEN                                          01318000
      BEGIN << DEVICE IS NOT READY >>                                   01320000
         LDEVNOTRDY(DITP);                                     <<0U.EB>>01322000
         IF = THEN                                             <<0U.EB>>01324000
         BEGIN                                                          01326000
            TOS := RDYWAIT;                                             01328000
RESTART:                                                                01330000
            MSTATE := 7;                                                01332000
            GO TO OUT;                                                  01334000
         END;                                                           01336000
SYSERR:                                                                 01338000
         TOS := SYSERROR;                                               01340000
         GO TO BADEND;                                                  01342000
      END;                                                              01344000
      IF FCODE = WRITEF OR FCODE = WRTMKF OR FCODE = GAPF THEN          01346000
      BEGIN << CHECK FOR FILE PROTECT ON WRITE >>                       01348000
         IF STATUS.FILEPROTECT THEN                                     01350000
         BEGIN << NO WRITE RING >>                                      01352000
            IF IOMESSAGE(1,NOWRITERING,%10000,DITP(DLDEV).     <<0U.EB>>01354000
               LDEV,,,,,CONSOLE) THEN                          <<0U.EB>>01356000
            BEGIN                                                       01358000
              DITP(DTIME):=0;                                  <<00.05>>01360000
              DITP(DTRLX):=TIMEREQ(%20,@DITP,1000D);           <<00.05>>01362000
              MSTATE:=%13;                                     <<00.05>>01364000
              RETURN;                                          <<00.05>>01366000
            END;                                                        01368000
            GO TO SYSERR;                                               01370000
         END;                                                           01372000
         IF MSTATE = 2 THEN GO TO GOODEND; << WRITE RING CHECK >>       01374000
         << FOR APPEND ACCESS FROM FILE SYS. - XFERCNT = 0 >>           01376000
      END;                                                              01378000
      GO TO FAIL;                                                       01380000
                                                                        01382000
NOERROR:                                                                01384000
      IOQP(QMISC).WRTUNLD := 0; << RESET UNLOAD BIT >>                  01386000
      IF <> THEN                                                        01388000
      BEGIN << NOW WAIT FOR WRITE RING MOUNT >>                         01390000
         DITPL(DDFLAG).REWB4WRITE := TRUE;  <<ASSURE AT LDPT>> <<00562>>01392000
         TOS := RINGWAIT;                                               01394000
         GO TO RESTART;                                                 01396000
         << THE FOLLOWING SEQUENCE OCCURS AFTER A NO-RING   >> <<00562>>01398000
         << CONDITION IS DETECTED:  FIRST, A DELAY IS       >> <<00562>>01400000
         << REQUESTED (FOR REASONS UNKNOWN).  THEN, AN      >> <<00562>>01402000
         << UNLOAD IS INITIATED, AND IOQP(QMISC).WRTUNLD    >> <<00562>>01404000
         << IS SET.  AFTER ERROR-FREE COMPLETION OF THE     >> <<00562>>01406000
         << UNLOAD, WRTUNLD IS RESET, AND                   >> <<00562>>01408000
         << DITPL(DDFLAG).REWB4WRITE IS SET.  THE LATTER    >> <<00562>>01410000
         << FLAG REQUESTS A REWIND BEFORE THE NEXT WRITE,   >> <<00562>>01412000
         << WHICH PREVENTS THE OPERATOR FROM PUTTING THE    >> <<00562>>01414000
         << TAPE ON-LINE PRIOR TO THE BOT MARKER.  AFTER    >> <<00562>>01416000
         << COMPLETION OF THE REWIND, THE ORIGINAL WRITE    >> <<00562>>01418000
         << IS REINITIATED.  IF THE TAPE IS NOT AT LOAD     >> <<00562>>01420000
         << POINT, THE REWIND-BEFORE-WRITE SEQUENCE WILL    >> <<00562>>01422000
         << OCCUR AGAIN.  IF THERE IS STILL NO WRITE RING   >> <<00562>>01424000
         << ON THE TAPE, THIS ENTIRE CYCLE REPEATS.         >> <<00562>>01426000
      END;                                                              01428000
      IF DITPL(DDFLAG).REWB4WRITE  THEN                        <<00562>>01430000
      BEGIN  <<TAPE PROBABLY AT LOADP--TRY TO WRITE>>          <<00562>>01432000
         MSTATE := 2;  <<STATE = WRITE INITIATOR>>             <<00562>>01434000
         GO TO WRITE;                                          <<00562>>01436000
      END;                                                     <<00562>>01438000
      IF STATUS.EOFBIT THEN                                             01440000
      BEGIN << SET EOF IN LPDT >>                                       01442000
         TOS := LPDTD(DITP(DLDEV).LDEV);                                01444000
         TOS.EOF := 1;                                                  01446000
         LPDTD(X) := TOS;                                               01448000
      END;                                                              01450000
      IF FCODE=FSRF OR FCODE=BSRF THEN                         <<00.05>>01452000
      BEGIN                                                    <<00.05>>01454000
         EOFCHECK(IOQP,ABSADR,0,0);                            <<00.05>>01456000
         IF <> THEN GOTO EOFOUT;                               <<00.05>>01458000
      END ELSE                                                 <<00.05>>01460000
      IF FCODE = REWF OR FCODE = REWULDF OR FCODE = DCLOSEF THEN        01462000
      BEGIN << TAKE CARE OF REWIND TERMINATION >>                       01464000
         DITPL(DDFLAG).REWOUND := TRUE;  <<SET REWOUND FLAG>>  <<00562>>01466000
         IF FCODE <> REWF OR STATUS.LOADP THEN GO TO GOODEND;           01468000
         MSTATE := 7; << RETURN STATE 7 SO THAT REWIND COMPLETION >>    01470000
         RETURN; << WILL NOT TRIGGER DEVREC ON JOB ACCEPT. UNITS >>     01472000
      END;                                                              01474000
      IF FCODE = READF AND XFERCNT <> 0 THEN                            01476000
      BEGIN                                                             01478000
         TOS := SIOP(9);                                                01480000
         WHILE SIOP(X:=X+1) <> ENDINT DO TOS := TOS + SIOP(X:=X+3);     01482000
         IF IOQPL(QMISC).SHORT THEN                                     01484000
         BEGIN << SHORT READ, CHECK INTERNAL BUFFER >>                  01486000
            TOS := TOS + 3; << ACTUAL AMOUNT READ >>                    01488000
            TOS := @IOQP;                                               01490000
            TOS := 0;                                                   01492000
            TOS := @SIOP(20) + SYSDB;                                   01494000
            TOS := S3;                                                  01496000
            EOFCHECK(*,*,*,0);                                          01498000
            IF > THEN GO TO EOFOUT;                                     01500000
            IF < THEN                                                   01502000
            BEGIN << BACKSPACE REQUIRED >>                              01504000
BACKSP:                                                                 01506000
               TOS := IOQP(QMISC);                                      01508000
               TOS.BACK := 1;                                           01510000
               TOS.EOFB := 1;                                           01512000
               IOQP(X) := TOS;                                          01514000
            GO BSRPEOF;                                        <<00.06>>01516000
            END;                                                        01518000
            TOS := ABSADR;                                              01520000
            TOS := SIOP(20);                                            01522000
            IF XFERCNT = 1 THEN ASMB(SSEA) ELSE                         01524000
            BEGIN << GIVE SECOND WORD >>                                01526000
               TOS := SIOP(21);                                         01528000
               ASMB(SDEA);                                              01530000
            END;                                                        01532000
            ASMB(DDEL,DUP);                                             01534000
            IF TOS < XFERCNT THEN XFERCNT := TOS ELSE DEL;              01536000
         END ELSE                                                       01538000
         BEGIN << NORMAL READ >>                                        01540000
            XFERCNT := TOS + XFERCNT; << ACTUAL AMOUNT READ >>          01542000
            EOFCHECK (IOQP,ABSADR,XFERCNT,0);                           01544000
            IF <> THEN                                                  01546000
            BEGIN << EOF FOUND >>                                       01548000
               IF < THEN TOS := TRUE ELSE TOS := FALSE;                 01550000
               << REMEMBER TO BACKSPACE OR NOT >>                       01552000
               X := XFERCNT;                                            01554000
               IF <> THEN                                               01556000
               BEGIN  << ZERO OUT THE USER BUFFER >>                    01558000
                  TOS := ABSADR;                                        01560000
                  TOS := 0;                                             01562000
                  ASMB(SSEA; INCA,DDUP; DECA); << SET MOVE ADR. >>      01564000
                  TOS := X - 1; << SET COUNT >= 127 >>                  01566000
                  TOS := 127;                                           01568000
                  ASMB(DDUP,CMP);                                       01570000
                  IF < THEN ASMB(XCH);                                  01572000
                  DELB;                                                 01574000
                  ASMB(MABS 5);                                         01576000
               END;                                                     01578000
               IF TOS THEN GO TO BACKSP ELSE GO TO EOFOUT;              01580000
            END;                                                        01582000
         END;                                                           01584000
         TOS := XFERCNT;                                                01586000
         TOS := IOQP(QWBCT);                                            01588000
         DEL;                                                           01590000
         IF < THEN                                                      01592000
         BEGIN << BYTE COUNT >>                                         01594000
            TOS := -(TOS&LSL(1));                                       01596000
            IF STATUS.ODDBYTE THEN TOS := TOS + 1;                      01598000
         END;                                                           01600000
         IOQP(X) := TOS; << SET RETURN COUNT >>                         01602000
      END ELSE                                                          01604000
      if STATUS.EOT then    <<we are past the tape EOT>>       <<02679>>01606000
      if FCODE=WRITEF or FCODE=WRTMKF then                     <<02679>>01608000
      BEGIN << SET EOT STATUS RETURN >>                                 01610000
         TOS := GOODEOT;                                                01612000
         GO TO UNUSUALEND;                                              01614000
      END;                                                              01616000
GOODEND:                                                                01618000
OPEN:                                                                   01620000
FCLOSE:                                                                 01622000
      TOS := IOQP(QMISC);                                               01624000
      IF < THEN TOS := GOODRETRY ELSE TOS := GOODSTAT;                  01626000
UNUSUALEND:                                                             01628000
      MSTATE := 5;                                                      01630000
OUT:                                                                    01632000
      IOQP(QSTAT).STAT := TOS;                                          01634000
   END;                                                                 01636000
END;                                                                    01638000
   ASSEMBLE(                                                            01640000
      PCAL SIODM; << MONITOR >>                                         01642000
      PCAL MTAPEDVR; << INITIATOR >>                                    01644000
      PCAL MTAPEDVR; << COMPLETOR >>                                    01646000
      CON 0; << I/O PROCESS PROCEDURE >>                                01648000
      CON 0; << INITIALIZATION PROCEDURE >>                             01650000
      CON 1; << # OF INTERRUPT HANDLERS >>                              01652000
      PCAL GIP); << INTERRUPT HANDLER >>                                01654000
END.                                                                    01656000
