$CONTROL MAP,CODE,USLINIT                                               00010000
<<IOPTPN0 - MODULE 14>>                                                 00015000
<< HP32002C MPE SOURCE C.00.00 >>                                       00020000
<< COPYRIGHT     "(C) COPYRIGHT HEWLETT-PACKARD CO. 1980.           >>  00025000
<<     THIS PROGRAM MAY BE USED WITH ONE COMPUTER SYSTEM AT A       >>  00030000
<<     TIME AND SHALL NOT OTHERWISE BE RECORDED, TRANSMITTED OR     >>  00035000
<<     STORED IN A RETRIEVAL SYSTEM.  COPYING OR OTHER REPRODUCTION >>  00040000
<<     OF THIS PROGRAM EXCEPT FOR ARCHIVAL PURPOSES IS PROHIBITED   >>  00045000
<<     WITHOUT THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.>>  00050000
<< **** Note - Dollar Copyright cannot be used with this module *** >>  00055000
                                                                        00060000
                                                                        00065000
                                                                        00070000
                                                                        00075000
                                                                        00080000
$CONTROL PRIVILEGED,UNCALLABLE                                          00085000
$THIRTY                                                                 00090000
$TITLE "2895A PAPER TAPE PUNCH DRIVER"                                  00095000
                                                                        00100000
                                                                        00105000
                                                                        00110000
DRIVER REQUEST CODES:                                                   00115000
                                                                        00120000
    1 - WRITE                                                           00125000
        P1       - VERTICAL FORMAT IF ASCII                             00130000
                   0-PRINT AND SINGLE SPACE(XOFF/CR/LF)                 00135000
                   1-USE FIRST DATA BYTE AS VERTICAL FORMAT             00140000
                     SPECIFICATION.                                     00145000
                   %53 "+" PUNCH AND XOFF/CR (NO LF)                    00150000
                   %60 "0" PUNCH AND DOUBLE SPACE                       00155000
                           (XOFF/CR/LF/LF).                             00160000
                   %200-%277 PUNCH AND N-%200 SPACES                    00165000
                             (XOFF/CR/N-%200 LFS).                      00170000
                   %320 PUNCH (NO CR/LF).                               00175000
                                                                        00180000
        P2(11:2) - ASCII/BINARY MODE                                    00185000
                   0 - ASCII                                            00190000
                   1 - COLUMN BINARY                                    00195000
        P2(15:1) - 0-POSTSPACE.PUNCH DATA THEN PUNCH                    00200000
                     SPACING CHARACTERS.                                00205000
                   1-PRESPACE.PUNCH SPACING CHARACTERS                  00210000
                     THEN PUNCH DATA.                                   00215000
    2 - OPEN FILE                                                       00220000
        P2(13:3) - TYPE OF ACCESS                                       00225000
                   0 - OPEN FOR READ ONLY                               00230000
                   1 - OPEN FOR WRITE ONLY                              00235000
                   2 - OPEN FOR READ AND WRITE                          00240000
    3 - CLOSE FILE                                                      00245000
    4 - CLOSE DEVICE                                                    00250000
    5 - REQUEST NEW TAPE                                                00255000
          PUNCH TRAILER                                                 00260000
          ISSUE NEW TAPE REQUEST TO OPERATOR                            00265000
          PUNCH LEADER                                                  00270000
                                                                        00275000
                                                                        00280000
                                                                        00285000
                                                                        00290000
BEGIN                                                                   00295000
    EQUATE                                                              00300000
         SX0          = 0,       <<INDX TO SIOPGM LINE>>                00305000
         SX1          = 4,                                              00310000
         SX2          = 6,                                              00315000
         SX3          = 10,                                             00320000
         SX4          = 12,                                             00325000
         SX5          = 14,                                             00330000
         SX6          = 16,                                             00335000
         SX7          = 20,                                             00340000
         SX8          = 26,                                             00345000
         SX9          = 30,                                             00350000
         SX10         = 46,                                             00355000
         SX11         = 50,                                             00360000
         SX12         = 52,                                             00365000
         SX13         = 56,                                             00370000
         SX14         = 58,                                             00375000
         SX15         = 60,                                             00380000
         SX16         =61,                                              00385000
         SX17         = 62,      <<SPACE CHAR>>                         00390000
         ASCII        = 0,       <<MODE>>                               00395000
         BINARY       = 1,       <<MODE>>                               00400000
         QDSTN        = 4,       <<INDEX INTO IOQ-DST#>>                00405000
         QFUNC        = 6,       <<INDEX INTO IOQ-FUNCT CODE>>          00410000
         QPAR1        = 8,       <<INDEX INTO IOQ-PARAM #1>>            00415000
         QPAR2        = 9,       <<INDEX INTO IOQ-PARAM #2>>            00420000
         QMISC        = 3,       <<INDEX INTO IOQ-INTERNAL FLAGS>>      00425000
         QWBCNT       = 7,       <<INDEX INTO IOQ-WORD/BYTE CNT>>       00430000
         QFLAG        = 0,       <<INDEX INTO IOQ-FLAGS>>               00435000
         QLDEV        = 2,       <<INDEX INTO IOQ-LOG DEV#>>            00440000
         QSTAT        =10,       <<INDEX INTO IOQ-STATUS>>              00445000
         DFLAG        = 0,       <<INDEX INTO DIT-FLAGS>>               00450000
         DLDEV        = 3,       <<INDEX INTO DIT-LOG DEV#>>            00455000
         DSTAT        = 6,       <<INDEX INTO DIT-STATUS>>              00460000
         DSERR        = 7,  <<DIT INDEX-HARWARE STATUS INDEX>> <<01335>>00465000
         DLOGERROR    =10,   <<DIT INDEX-ERROR LOG STATUS>>    <<01335>>00470000
         DACCESS      = 8,       <<INDEX INTO DIT-ACCESS TYPE>>         00475000
         WRITE        = 1,       <<FUNCTION-WRITE>>                     00480000
         OPEN         = 2,       <<FUNCTION-FILE OPEN>>                 00485000
         CLOSE        = 3,       <<FUNCTION-FILE CLOSE>>                00490000
         DEVCLOSE     = 4,       <<FUNCTION-DEVICE CLOSE>>              00495000
         CNTRL        = %40000,  <<SIO CNTRL ORDER>>                    00500000
         JUMP         = 0,       <<SIO UNCOND JUMP>>                    00505000
         SETBANK      = %14000,  <<SIO SET BANK>>                       00510000
         SIOEND       = %34000,  <<SIO END ORDER>>                      00515000
          NEWTAPE      = 5,       <<FUNCTION REQ NEW TAPE>>             00520000
         COMPLETION   = 3,       <<MONITOR STATE-COMPLETION>>           00525000
         ENDIO        = 5,       <<MONITOR STATE-END OF REQUEST>>       00530000
         REINIT       = %7,      <<MONITOR STATE-REINIT ON INTRP>>      00535000
         UNITFAIL     = %54,     <<SATUS RET=UNIT FAIL>>                00540000
         INVALID      = 5,       <<STATUS RET=INV FUNC>>                00545000
         ICNTRL       = 7,       <<INDEX OF DRT IN ILT>>       <<01300>>00550000
         J            = 9,       <<DIT REPLY BUFFER>>                   00555000
         XFERR        = %14,     <<STATUS RET=TRANSFERR ERR>>           00560000
         TAPFAIL      = %105,    <<STATUS RET=TAPE FAIL>>               00565000
         TAPLOW       = %31,    <<STATUS RET=TAPE LOW>>                 00570000
         NTRDY        = %30,    <<STATUS RET=NOT RDY>>                  00575000
         SUCCESS      = 1,       <<STATUS RET=SUCCESSFUL >>            00580000
         TABROKEN     = %105,    <<STATUS RET=TAPE BROKEN>>             00585000
         MACC         = %123,    <<STATUS RETURN-MULTIPLE ACCESS>>      00590000
         ABORTED      = %33,     <<STATUS RETURN-I/0 ABORTED>>          00595000
         PFABORT      = %63,     <<STATUS RETURN-PWR FAIL ABORT>>       00600000
         CLEAR        = %040000, <<CLEAR ALL INTERRUPTS>>               00605000
         MSTRCLEAR    = %100000, <<MASTER CLEAR>>                       00610000
         SYSDB        = %1000,   <<SYSTEM DB>>                          00615000
         SYSSBUF      = 6,       <<SYS BUF TABLE INDEX>>                00620000
         WNEW         = %7,      <<REINITIATE ON INTERRUPT>>            00625000
         CALLCMPLT    = %13,     <<CALL CMPLTR ON INTRPT>>              00630000
         BADCNTRL     = %3,      <<INVALID CONTROL FUNCTION>>           00635000
         BADFUNC      = %4,      <<INVALID FUNCTION CODE>>              00640000
         XFERERR      = %14,     <<TRANSFERR ERROR-STATUS>>             00645000
         SYSLPDT      = %10,     <<LPDT POINTER INDEX>>                 00650000
         PTPDITSZ     = 11,      <<DIT SIZE FOR PTAPE PCH>>    <<01335>>00655000
         SIOSIZE      =166,      <<SIO PGM + SPACE CHARS>>     <<01300>>00660000
         SIOSIZED2    =SIOSIZE/2,<< SIO SIZE /2 FOR INITIAL>>  <<01300>>00665000
         BLANK        = %040,    <<BLANK>>                     <<00143>>00670000
         BLANKBLANK   = %020040, <<BLANKBLANK>>                <<00143>>00675000
         XOFF         = %023,    <<XOFF>>                               00680000
         CR           = %015,    <<CARRIAGE RETURN>>                    00685000
         LF           = %012,    <<LINE FEED>>                          00690000
         SIOWR1       = %67777,  <<SIOWR 1 WORD>>                       00695000
         SIOWR2       = %60000,  <<SIOWR 0 CNT>>                        00700000
          TERMI       = 0;        <<TERMINATOR>>                        00705000
                                                                        00710000
  DEFINE                                                                00715000
       ABS            = ABSOLUTE#,                                      00720000
       DISABLE        = ASSEMBLE(SED 0)#,                               00725000
       DRT            = (8:8)#,                                <<01300>>00730000
       ENABLE         = ASSEMBLE(SED 1)#,                               00735000
       PFAILB         = (11:1)#,                                        00740000
       IAK            = (8:1)#,                                         00745000
       EOF            = (8:2)#,   <<EOF FIELD IN LPDT>>                 00750000
       DEOF           =DITP(DACCESS).(12:1)#,                           00755000
       STATUS         =IOQP(QSTAT).(8:8)#,                              00760000
       DACCP          =DITP(DACCESS)#,                                  00765000
       MSGDONE        =IOQP(QFLAG).(15:1)#,<<MESSAGE DONE>>             00770000
       SBUF           =IOQP(QFLAG).(3:1)#,  <<SYS BUFFER FLAG>>         00775000
       QMISCP         =IOQP(QMISC)#,                                    00780000
       PWONFLG        =QMISCP.(13:1)#,                         <<01518>>00785000
       TAPREQF        =QMISCP.(14:2)#;                                  00790000
                                                                        00795000
                                                                        00800000
                                                                        00805000
                                                                        00810000
<< DIT DEFINITION AND DRIVER LINKAGE AREA >>                            00815000
                                                                        00820000
BYTE ARRAY CONFIG(0:7)=DB:=                                             00825000
PTPDITSZ,1,0,0,0,0,SIOSIZED2,0;                                <<01300>>00830000
                                                                        00835000
ARRAY DITAB(1:PTPDITSZ)=DB:=                                            00840000
                                                               <<01335>>00845000
        0,    <<DFLAG>>                                        <<01335>>00850000
        0,    <<DLINK>>                                        <<01335>>00855000
        0,    <<DIOQP>>                                        <<01335>>00860000
        0,    <<DLDEV>>                                        <<01335>>00865000
        0,    <<DLTP>>                                         <<01335>>00870000
        0,    <<DILTP>>                                        <<01335>>00875000
        0,    <<DSTAT>>                                        <<01335>>00880000
        0,    <<DSERR>> <<COUNT AND INDEX OF HARWARE STATUS>>  <<01335>>00885000
        0,    <<DACCESS>>                                      <<01335>>00890000
        0,    << J >>                                          <<01335>>00895000
        0;    <<DLOGERROR>>                                    <<01335>>00900000
                                                                        00905000
ARRAY SIOA(1:SIOSIZE)=DB:=                                              00910000
                                                                        00915000
                                                                        00920000
CNTRL,%40000,JUMP,0,        <<SX0-CLEAR INTS>>                          00925000
SETBANK,0,                  <<SX1-SETBANK>>                             00930000
CNTRL,6,JUMP,0,             <<SX2-UNPACKING ENABLED>>                   00935000
CNTRL,2,                    <<SX3-UNPACKING DISABLED>>                  00940000
SIOWR1,0,                   <<SX4-WRITE FIRST WD(BYTE)>>                00945000
CNTRL,6,                    <<SX5-UNPACKING ENABLED>>                   00950000
SIOWR2,0,JUMP,0,            <<SX6-WR REMAINDER OF MAIN>>                00955000
CNTRL,2,SETBANK,0,SIOWR1,0, <<SX7-WR ODD BYTE>>                         00960000
SETBANK,0,JUMP,0,           <<SX8-RESET BANK>>                          00965000
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,<<SX9-WR CHAINED SYSBUF>>               00970000
JUMP,0,SETBANK,0,           <<SX10-RESET TO BANK 0>>                    00975000
CNTRL,2,                    <<SX11-UNPACKING DISABLED>>                 00980000
SIOWR2,0,JUMP,0,            <<SX12-WR PRE(POST) SPACING>>               00985000
SIOWR2,0,                   <<SX13-WR TRAILER(LEADER)>>                 00990000
SIOEND,-1,                  <<SX14-SIO END ORDER>>                      00995000
0,                          <<SX15 ODDBYTE>>                            01000000
0,                          <<SX16-J>>                                  01005000
                            <<SX17-SPACE CHAR>>                         01010000
XOFF,CR,LF,LF,LF,LF,LF,LF,LF,LF,LF,LF,LF,LF,LF,                         01015000
LF,LF,LF,LF,LF,LF,LF,LF,LF,LF,LF,LF,LF,LF,LF,                           01020000
LF,LF,LF,LF,LF,LF,LF,LF,LF,LF,LF,LF,LF,LF,LF,                           01025000
LF,LF,LF,LF,LF,LF,LF,LF,LF,LF,LF,LF,LF,LF,LF,                           01030000
LF,LF,LF,LF,LF,LF,LF,LF,LF,LF,LF,LF,LF,LF,LF                            01035000
;     <<TERMINATOR >>                                                   01040000
PROCEDURE EOFCHECK(IOQP,BUFR,CNT,HARDCHK);                              01045000
  VALUE IOQP,BUFR,CNT,HARDCHK;                                          01050000
  DOUBLE BUFR;                                                          01055000
  POINTER IOQP;                                                         01060000
  INTEGER CNT,HARDCHK;                                                  01065000
  OPTION EXTERNAL;                                                      01070000
                                                                        01075000
PROCEDURE GIP;                                                          01080000
  OPTION EXTERNAL;                                                      01085000
                                                                        01090000
PROCEDURE HELP;                                                         01095000
  OPTION EXTERNAL;                                                      01100000
                                                                        01105000
LOGICAL PROCEDURE IOMESSAGE(SETNO,MSGNO,MASK,P1,P2,P3,P4,P5,   <<0U.EB>>01110000
   DEST,REPLY,OFFSET,DITP,IOTYPE);                             <<0U.EB>>01115000
VALUE SETNO,MSGNO,MASK,P1,P2,P3,P4,P5,DEST,REPLY,OFFSET,DITP,  <<0U.EB>>01120000
   IOTYPE;                                                     <<0U.EB>>01125000
INTEGER SETNO,MSGNO,MASK,P1,P2,P3,P4,P5,DEST,REPLY,OFFSET,     <<0U.EB>>01130000
   IOTYPE;                                                     <<0U.EB>>01135000
INTEGER POINTER DITP;                                          <<0U.EB>>01140000
OPTION VARIABLE,EXTERNAL;                                      <<0U.EB>>01145000
                                                               <<0U.EB>>01150000
PROCEDURE LDEVNOTRDY(DITP);                                    <<0U.EB>>01155000
   VALUE DITP; POINTER DITP; OPTION EXTERNAL;                  <<0U.EB>>01160000
                                                                        01165000
PROCEDURE SIODM(DITP,FLAGS);                                            01170000
  VALUE DITP,FLAGS;                                                     01175000
  LOGICAL FLAGS;                                                        01180000
  POINTER DITP;                                                         01185000
  OPTION EXTERNAL;                                                      01190000
                                                                        01195000
                                                                        01200000
PROCEDURE MASTERCLEAR(DITP);                                            01205000
  ARRAY DITP;                                                           01210000
  OPTION EXTERNAL;                                                      01215000
                                                                        01220000
                                                                        01225000
PROCEDURE CHECKINDEX(INDEX,TABLE);                                      01230000
   VALUE INDEX,TABLE;                                                   01235000
   INTEGER INDEX;                                                       01240000
   INTEGER POINTER TABLE;                                               01245000
   OPTION EXTERNAL;                                                     01250000
                                                                        01255000
                                                                        01260000
                                                                        01265000
                                                                        01270000
PROCEDURE STARTIO(DITP,SIOP,QFLAG);                                     01275000
   VALUE DITP,SIOP,QFLAG;                                               01280000
   POINTER DITP,SIOP;                                                   01285000
   LOGICAL QFLAG;                                                       01290000
   OPTION EXTERNAL;                                                     01295000
                                                                        01300000
                                                                        01305000
                                                                        01310000
PROCEDURE IOFAILURE(DRTN,DITP);                                         01315000
   VALUE DRTN;                                                          01320000
   INTEGER DRTN;                                                        01325000
   ARRAY DITP;                                                          01330000
   OPTION EXTERNAL;                                                     01335000
                                                                        01340000
                                                                        01345000
PROCEDURE INITZ(IDITP);                                                 01350000
   INTEGER ARRAY IDITP;                                                 01355000
   BEGIN                                                                01360000
     POINTER PS0=S-0;                                                   01365000
     MASTERCLEAR(IDITP);                                                01370000
     TOS:=IDITP(5);     <<GET DRT NUMBER>>                              01375000
     TOS:=PS0(ICNTRL).DRT;                                     <<01300>>01380000
     TOS:=2;          <<ENABLE INTERRUPTS>>                             01385000
     ASSEMBLE (CIO 1);                                                  01390000
     IF <> THEN ASSEMBLE(DEL);                                          01395000
   END;                                                                 01400000
INTEGER PROCEDURE PTPCHDVR(IOQP,DITP,BANK,BUFADR,SIOP,DRTN);            01405000
  VALUE IOQP,DITP,BANK,BUFADR,SIOP,DRTN;                                01410000
  INTEGER BANK,DRTN;                                                    01415000
  INTEGER POINTER IOQP,SIOP,BUFADR;                                     01420000
  POINTER DITP;                                                         01425000
                                                                        01430000
                                                                        01435000
  BEGIN                                                                 01440000
                                                                        01445000
    DOUBLE UBUF=BANK;                                                   01450000
    INTEGER MSTATE=PTPCHDVR,                                            01455000
            S0=S-0,                                                     01460000
            S1=S-1,                                                     01465000
            S2=S-2,                                                     01470000
            S3=S-3,                                                     01475000
            S4=S-4,                                                     01480000
            S5=S-5,                                                     01485000
            X=X,                                                        01490000
            FUNC,                                                       01495000
            P1,                                                         01500000
            P2,                                                         01505000
            MODE,                                                       01510000
            I,K,L,M,N,CNT,IX,                                           01515000
            MAXBUFSIZE,                                                 01520000
            BNKNO,                                                      01525000
            TEMP,                                                       01530000
            FWORD,                                                      01535000
            WBCNT;                                                      01540000
    DEFINE LDEV   = IOQP(QLDEV).(8:8)#,                                 01545000
           SIOPBASE = @SIOP+SYSDB#;                                     01550000
                                                                        01555000
                                                                        01560000
                                                                        01565000
        INTEGER POINTER SBUFR=DB+SYSSBUF,BADR;                          01570000
        DOUBLE POINTER LPDTD = DB+SYSLPDT;                              01575000
       LOGICAL ODDBYTE:=FALSE;                                 <<00.02>>01580000
       LOGICAL ODDONE:=FALSE;                                  <<00.02>>01585000
SUBROUTINE CHECKREADY;                                         <<01518>>01590000
  BEGIN <<CHECK FOR LDEV NOT READY>>                           <<01518>>01595000
   IF PWONFLG=1 THEN GO CKON;                                  <<01518>>01600000
MAKRDY:                                                        <<01518>>01605000
   TOS:=DRTN;                                                  <<01518>>01610000
   DITP(J):=-1;  <<REPLY FLAG>>                                <<01518>>01615000
   ASSEMBLE(TIO 0);                                            <<01518>>01620000
   IF <> THEN GO UFAIL;                                        <<01518>>01625000
   IF TOS.(5:1)=0 THEN                                         <<01518>>01630000
   BEGIN <<ASK FOR POWER ON>>                                  <<01518>>01635000
    PWONFLG:=1;  <<TURN ON PWR ON FLAG>>                       <<01518>>01640000
    IF NOT IOMESSAGE(1,150,%10000,LDEV,,,,,0,1,J,DITP) THEN    <<01581>>01645000
    BEGIN                                                      <<01518>>01650000
     ASSEMBLE(DEL);                                            <<01518>>01655000
     MASTERCLEAR(DITP);                                        <<01518>>01660000
     IOQP(QWBCNT):=0; <<ZERO WORD COUNT>>                      <<01518>>01665000
     TOS:=%124; <<SYSTEM ERROR>>                               <<01518>>01670000
     TOS:=ENDIO;                                               <<01518>>01675000
     GO BEND;                                                  <<01518>>01680000
    END;                                                       <<01518>>01685000
    ASSEMBLE(DEL); <<DRTN OFF TOS>>                            <<01518>>01690000
    TOS:=SUCCESS;                                              <<01518>>01695000
    TOS:=REINIT;                                               <<01518>>01700000
    GO BEND;                                                   <<01518>>01705000
CKON:                                                          <<01518>>01710000
    PWONFLG:=0; <<TURN OFF PWR ON FLAG>>                       <<01518>>01715000
    BEGIN                                                      <<01518>>01720000
     IF NOT LOGICAL(DITP(J)) THEN GO MAKRDY;                   <<01518>>01725000
     MSGDONE:=0; <<RESET REPLY FLAG>>                          <<01518>>01730000
    END;                                                       <<01518>>01735000
    GO MAKRDY;                                                 <<01518>>01740000
   END;  <<ASK FOR POWER ON>>                                  <<01518>>01745000
   ASSEMBLE(DEL); <<DRTN OFF TOS>>                             <<01518>>01750000
  END; <<CHECK FOR LDEV NOT READY>>                            <<01518>>01755000
                                                                        01760000
                                                                        01765000
SUBROUTINE DOSIO;                                                       01770000
  BEGIN  <<DO START IO>>                                                01775000
    MASTERCLEAR(DITP);  <<CLEAR INTERRUPTS>>                            01780000
    CHECKREADY; <<MAKE SURE DEVICE IS ON LINE>>                <<01518>>01785000
    STARTIO(DITP,SIOP,1);                                               01790000
    IF <> THEN                                                          01795000
    BEGIN                                                               01800000
UFAIL:                                                                  01805000
      IOFAILURE(DRTN,DITP);   <<NON RESPONDING DEVICE>>                 01810000
    END;                                                                01815000
    TOS:=%10;                                                           01820000
    TOS:=CALLCMPLT;                                                     01825000
    GO TO BEND;                                                         01830000
  END;  <<START I/O>>                                                   01835000
SUBROUTINE PCHLDR;                                                      01840000
  BEGIN                                                                 01845000
    SIOP(SX17+3):=0;  <<SET UP BLANKS>>                                 01850000
    MOVE SIOP(SX17+4):=SIOP(SX17+3),(59);                               01855000
    SIOP(SX0+3):=SIOPBASE+(SX2);  <<UNPACK ENABLED>>                    01860000
    SIOP(SX2+3):=SIOPBASE+(SX13);  <<LEADER SIOWR>>                     01865000
    SIOP(SX13).(4:12):=-60;  <<CNT FOR 12" LEADER/TRAIL>>               01870000
    SIOP(SX13+1):=SIOPBASE+(SX17+3);  <<LEAD/TRAIL DATA ARA>>           01875000
    DOSIO;                                                              01880000
  END;  <<PUNCH LEADER/TRAILER>>                                        01885000
                                                                        01890000
                                                                        01895000
                                                                        01900000
                                                                        01905000
                                                                        01910000
                                                                        01915000
SUBROUTINE SETFLAGS;                                                    01920000
  BEGIN                                                                 01925000
    FUNC:=IOQP(QFUNC);     <<GET FUNCTION CODE>>                        01930000
    P1:=IOQP(QPAR1);       <<GET PARAMETER 1>>                          01935000
    P2:=IOQP(QPAR2);       <<GET PARAMETER 2>>                          01940000
    MODE:=P2.(11:2);                                           <<00.02>>01945000
  END;   <<SETFLAG>>                                           <<00143>>01950000
                                                               <<00143>>01955000
                                                               <<00143>>01960000
SUBROUTINE SETCOUNT;                                           <<00143>>01965000
  BEGIN                                                        <<00143>>01970000
    ODDBYTE:=FALSE;                                                     01975000
    TOS:=IOQP(QWBCNT);  <<GET WORD BYTE COUNT>>                         01980000
    ASSEMBLE(DUP,DUP);                                                  01985000
    IF TOS.(0:1)=1 THEN                                                 01990000
    BEGIN   <<NEGATIVE COUNT IS IN BYTES>>                              01995000
      IF TOS.(15:1)=1 THEN ODDBYTE:=TRUE                                02000000
      ELSE ODDBYTE:=FALSE;                                              02005000
      WBCNT:=(-TOS)/2;                                                  02010000
      IF ODDBYTE THEN                                                   02015000
      BEGIN                                                             02020000
         TOS:=BANK;                                            <<00.02>>02025000
         TOS:=@BUFADR+WBCNT;                                   <<00.02>>02030000
         ASSEMBLE(LSEA);                                       <<00.02>>02035000
         TOS:=TOS&ASR(8);                                      <<00.02>>02040000
         SIOP(SX15):=TOS;                                      <<00.02>>02045000
         ASSEMBLE(DDEL);                                       <<00.02>>02050000
      END;                                                              02055000
    END                                                                 02060000
    ELSE                                                                02065000
    BEGIN                                                               02070000
    WBCNT:=TOS;<<COUNT IS IN WORDS>>                                    02075000
    DEL;                                                                02080000
    END;                                                                02085000
    IF WBCNT=0 THEN ODDONE:=TRUE;                              <<00.02>>02090000
  END;   <<SETCOUNT>>                                          <<00143>>02095000
                                                                        02100000
                                                                        02105000
SUBROUTINE DELBLANKS;  <<DELETE TRAILING BLANKS>>              <<00143>>02110000
  BEGIN                                                        <<00143>>02115000
    IF ODDBYTE THEN                                            <<00143>>02120000
       BEGIN                                                   <<00143>>02125000
         TOS := SIOP(SX15);  <<GET THE ODD BYTE>>              <<00143>>02130000
         IF TOS <> BLANK THEN RETURN; <<NO TRAILING BLNKS>>    <<00143>>02135000
         SIOP(SX15) := 0;    <<CLEAR BLANK>>                   <<00143>>02140000
         ODDBYTE := FALSE;                                     <<00143>>02145000
       END;                                                    <<00143>>02150000
    TOS := BANK;                                               <<00143>>02155000
    ASSEMBLE(DUP,DUP);                                         <<00143>>02160000
    DO   <<SEARCH FOR TRAILING BLANKS IN DATA BUFFER>>         <<00143>>02165000
      BEGIN                                                    <<00143>>02170000
        DDEL;                                                  <<00143>>02175000
        WBCNT := WBCNT-1;  <<WORK BACK THRU DATA BUFFER>>      <<00143>>02180000
        IF < THEN   <<ENTIRE STRING IS BLANKS>>                <<00143>>02185000
          BEGIN                                                <<00143>>02190000
            DEL;                                               <<00143>>02195000
            IOQP(QWBCNT) := 0; <<NOTHING TO WRITE>>            <<00143>>02200000
            RETURN;                                            <<00143>>02205000
          END;                                                 <<00143>>02210000
        TOS := @BUFADR+WBCNT;  <<GET DATA LOC>>                <<00143>>02215000
        ASSEMBLE(LSEA);        <<GET DATA>>                    <<00143>>02220000
      END                                                      <<00143>>02225000
    UNTIL S0  <> BLANKBLANK;                                   <<00143>>02230000
    ASSEMBLE(DUP);                                             <<00143>>02235000
    IF (TOS LAND %377) = BLANK THEN                            <<00143>>02240000
      BEGIN                                                    <<00143>>02245000
        TOS := TOS&ASR(8);  <<GET LEFT BYTE>>                  <<00143>>02250000
        SIOP(SX15) := TOS;  <<FOR ODD BYTE WRITE>>             <<00143>>02255000
        ODDBYTE := TRUE;                                       <<00143>>02260000
      END                                                      <<00143>>02265000
    ELSE                                                       <<00143>>02270000
      BEGIN                                                    <<00143>>02275000
        DEL;                                                   <<00143>>02280000
        WBCNT := WBCNT +1; <<ACTUAL WORD COUNT>>               <<00143>>02285000
      END;                                                     <<00143>>02290000
    DDEL;                                                      <<00143>>02295000
    IF WBCNT = 0 THEN ODDONE := TRUE;                          <<00143>>02300000
  END;   <<DELBLANKS>>                                         <<00143>>02305000
                                                               <<00143>>02310000
                                                               <<00143>>02315000
SUBROUTINE SETSYSBUF;                                                   02320000
  BEGIN                                                                 02325000
    @BADR:=@BUFADR;                                                     02330000
    IF WBCNT > 1024 THEN GO INVFUNC;                                    02335000
    IX:=0;                                                              02340000
    CNT:=WBCNT;                                                         02345000
    CHECKINDEX(@SBUFR+SYSDB-@BADR,SBUFR);                               02350000
    WHILE CNT>0 DO                                                      02355000
    BEGIN                                                               02360000
      SIOP(SX9+IX+1):=@BADR;<<SET DATA ADDR>>                           02365000
      IF CNT >128 THEN                                                  02370000
      BEGIN                                                             02375000
        TOS:=%160000;   <<WR CHAINED>>                                  02380000
        TOS.(4:12):=-128;  <<SET FULL COUNT>>                           02385000
        SIOP(SX9+IX):=TOS;  <<STORE IN CMD>>                            02390000
        CNT:=CNT-128;                                                   02395000
      END                                                               02400000
      ELSE                                                              02405000
      BEGIN  <<CNT IS 128 OR LESS>>                                     02410000
        TOS:=%60000;  <<WR UNCHAINED>>                                  02415000
        TOS.(4:12):=-CNT;  <<SET WR COUNT>>                             02420000
        SIOP(SX9+IX):=TOS;  <<STORE IN CMD>>                            02425000
        CNT:=0;                                                         02430000
      END;                                                              02435000
      IX:=IX+2;  <<BUMP CMD CHAIN INDEX>>                               02440000
IF CNT > 0 THEN BEGIN                                                   02445000
      CHECKINDEX(ABS(@BADR(-1)),SBUFR);                        <<01.02>>02450000
      @BADR:=ABS(X)+@SBUFR+SYSDB;                                       02455000
      END;                                                              02460000
    END;                                                                02465000
    IF WBCNT < 897 THEN                                                 02470000
    BEGIN  <<LESS THAN 8 CHAIN ORDERS>>                                 02475000
      SIOP(SX9+IX):=JUMP;                                               02480000
      SIOP(SX9+IX+1):=SIOPBASE+SX10;                                    02485000
    END;                                                                02490000
  END;  <<SETSYSBUF>>                                                   02495000
                                                                        02500000
                                                                        02505000
                                                                        02510000
                                                                        02515000
$PAGE                                                                   02520000
<<  I  N  I  T  I  A  T  O  R    >>                                     02525000
     DISABLE;     <<DISABLE INTERRUPTS>>                                02530000
     TOS:=IOQP;                                                         02535000
     DEL;                                                               02540000
     IF < THEN                                                          02545000
     BEGIN     <<I/O HAS BEEN ABORTED>>                                 02550000
       ENABLE;                                                          02555000
       IF MSTATE = COMPLETION THEN                                      02560000
       MASTERCLEAR(DITP);                                               02565000
       IF IOQP.PFAILB =1 THEN TOS:=PFABORT ELSE TOS:=ABORTED;           02570000
       TOS:=ENDIO;                                                      02575000
       GO TO BEND;                                                      02580000
     END;                                                               02585000
     ENABLE;                                                            02590000
     IF MSTATE = COMPLETION THEN GO COMPLETOR;                          02595000
     IF PWONFLG=1 THEN CHECKREADY;                             <<01518>>02600000
     IF TAPREQF=2 THEN GO COMPLETOR;                                    02605000
     TOS:=DRTN;     <<ENABLE DEV STATUS,CLEAR INTERRUPTS>>              02610000
     TOS:=CLEAR LOR %10;                                                02615000
     ASSEMBLE (CIO 1; DEL);                                             02620000
     IF <> THEN                                                         02625000
     BEGIN                                                              02630000
UFAIL:                                                                  02635000
       IOFAILURE(DRTN,DITP);   <<NON RESPONDING DEVICE>>                02640000
FAIL:                                                                   02645000
      MASTERCLEAR(DITP);                                                02650000
      TOS:=UNITFAIL;                                                    02655000
      TOS:=ENDIO;                                                       02660000
      GO TO BEND;                                                       02665000
    END;                                                                02670000
    SETFLAGS;                                                           02675000
    IF P1.(0:1)=1 THEN HELP;                                            02680000
IF FUNC=WRITE THEN                                                      02685000
$PAGE                                                                   02690000
<<  I N I T I A T O R    W R I T E               >>                     02695000
    BEGIN                                                               02700000
    SETCOUNT;   <<SET UP BYTE COUNT>>                          <<00143>>02705000
    IF MODE = ASCII THEN DELBLANKS;  <<DEL TRAILING BLNKS>>    <<00143>>02710000
    IF IOQP(QWBCNT)=0 THEN GO WELLDONE;                        <<00.05>>02715000
    SIOP(SX17+3):=LF;  <<SET UP SPACE CHAR>>                            02720000
    MOVE SIOP(SX17+4):=SIOP(SX17+3),(59);                               02725000
    SIOP(SX12+1):=SIOPBASE+SX17;                                        02730000
    SIOP(SX4+1):=@BUFADR;                                               02735000
    SIOP(SX1+1):=BANK;                                                  02740000
    SIOP(SX6+1):=@BUFADR;                                      <<00.02>>02745000
    SIOP(SX0+3):=SIOPBASE+SX1;                                 <<00.03>>02750000
        IF ODDBYTE=TRUE THEN BEGIN                                      02755000
        SIOP(SX6+3):=SIOPBASE+SX7;                                      02760000
        SIOP(SX7+5):=SIOPBASE+SX15;                                     02765000
        END                                                             02770000
        ELSE                                                            02775000
        SIOP(SX6+3):=SIOPBASE+SX8;                                      02780000
        SIOP(SX8+3):=SIOPBASE+SX14;   <<GO TO END>>                     02785000
        SIOP(SX6).(4:12):=-((WBCNT).(4:12));                            02790000
    IF MODE = BINARY THEN                                               02795000
    BEGIN   <<SET UP SIO PGM FOR BINARY>>                               02800000
    SIOP(SX2+3):=SIOPBASE+SX6;  <<JUMP TO PUNCH FIRST>>        <<00.02>>02805000
      IF SBUF=1 THEN                                                    02810000
      BEGIN   <<SET UP SYS BUF CHAIN AND LINK SIOPGM>>                  02815000
        SIOP(SX2+3):=SIOPBASE+SX9;   <<SYS BUF CHAIN>>                  02820000
        SETSYSBUF;     <<GO SET UP SYS BUF CHAIN>>                      02825000
        SIOP(SX10+1):=SIOPBASE+SX14;   <<GO TO END>>                    02830000
       IF ODDBYTE THEN SIOP(SX10+1):=SIOPBASE+SX7;             <<00.04>>02835000
      END;                                                     <<00.03>>02840000
        IF ODDONE AND NOT ODDBYTE THEN                         <<00.02>>02845000
        SIOP(SX0+3):=SIOPBASE+SX14;                            <<00.02>>02850000
        IF ODDONE AND ODDBYTE THEN                             <<00.02>>02855000
        SIOP(SX0+3):=SIOPBASE+SX7;                             <<00.02>>02860000
    END    <<SET UP SIOPGM FOR BINARY>>                                 02865000
    ELSE                                                                02870000
    BEGIN   <<SET UP SIOPGM FOR ASCII>>                                 02875000
      TOS:=BANK;     <<GET FIRST DATA BYTE>>                            02880000
     TOS:=@BUFADR;                                             <<00.02>>02885000
      ASSEMBLE(LSEA);                                                   02890000
      TOS:=TOS&ASR(8);                                         <<00.02>>02895000
      FWORD:=TOS;                                                       02900000
     ASSEMBLE(DDEL);                                           <<00.02>>02905000
      SIOP(SX12+1):=SIOPBASE+SX17;                                      02910000
      IF P1=0 THEN                                                      02915000
      BEGIN   <<1ST BYTE NOT FORMAT SPEC>>                              02920000
        SIOP(SX8+3):=SIOPBASE+SX12;                                     02925000
        SIOP(SX12).(4:12):=-3;   <<XOFF,CR,LF>>                         02930000
        SIOP(SX2+3):=SIOPBASE+SX6;                                      02935000
        SIOP(SX0+3):=SIOPBASE+SX1;                                      02940000
        SIOP(SX6).(4:12):=-((WBCNT).(4:12));                            02945000
        SIOP(SX6+1):=@BUFADR;                                           02950000
      END                                                               02955000
      ELSE                                                              02960000
      BEGIN     <<USE FIRST DATA BYTE AS FORMAT SPEC>>                  02965000
     SIOP(SX0+3):=SIOPBASE+(SX1);                              <<00.02>>02970000
        SIOP(SX2+3):=SIOPBASE+SX3;                                      02975000
        SIOP(SX4).(4:12):=-1;                                           02980000
        SIOP(SX4+1):=@BUFADR;                                           02985000
     SIOP(SX6).(4:12):=-((WBCNT-1).(4:12));                    <<00.02>>02990000
        SIOP(SX6+1):=@BUFADR+1;                                         02995000
        IF FWORD=%53 THEN                                               03000000
        SIOP(SX12).(4:12):=-2;   <<X0FF,CR>>                            03005000
        IF FWORD=%60 THEN                                               03010000
        SIOP(SX12).(4:12):=-4;   <<XOFF,CR,LF,LF>>                      03015000
        IF (FWORD-%200)>0 THEN                                          03020000
        BEGIN   <<CHECK # LFS>>                                         03025000
          SIOP(SX12).(4:12):=-(FWORD-%200);                             03030000
     IF FWORD=%320 THEN BEGIN                                  <<00.02>>03035000
     SIOP(SX12):=0; SIOP(SX12+1):=SIOPBASE+(SX12+2); END;      <<00.02>>03040000
        END;                                                            03045000
      END;   <<END FIRST DATA BYTE FORMAT SPEC>>                        03050000
      IF P2.(15:1)=1 THEN                                               03055000
      BEGIN     <<PRESPACE>>                                            03060000
     SIOP(SX0+3):=SIOPBASE+(SX10+2);                           <<00.02>>03065000
        SIOP(SX12+3):=SIOPBASE+SX1;                                     03070000
        SIOP(SX8+3):=SIOPBASE+SX14;                                     03075000
     IF ODDONE THEN SIOP(SX12+3):=SIOPBASE+14;                 <<00.02>>03080000
     IF ODDONE AND ODDBYTE THEN                                <<00.02>>03085000
     SIOP(SX12+3):=SIOPBASE+SX7;                               <<00.02>>03090000
      END                                                               03095000
      ELSE                                                              03100000
      BEGIN     <<POSTSPACE>>                                           03105000
        SIOP(SX0+3):=SIOPBASE+SX1;                                      03110000
     SIOP(SX8+3):=SIOPBASE+(SX10+2);                           <<00.02>>03115000
        SIOP(SX12+3):=SIOPBASE+SX14;                                    03120000
     IF ODDONE THEN SIOP(SX0+3):=SIOPBASE+(SX10+2);            <<00.02>>03125000
     IF ODDONE AND ODDBYTE THEN                                <<00.02>>03130000
     SIOP(SX0+3):=SIOPBASE+SX7;                                <<00.02>>03135000
      END;     <<POSTSPACE>>                                            03140000
    END;     <<SET UP SIOPGM FOR ASCII>>                                03145000
    DOSIO;                                                              03150000
    END;     <<WRITE>>                                                  03155000
    IF FUNC = OPEN THEN                                                 03160000
$PAGE                                                                   03165000
<<  I N I T I A T O R    O P E N                  >>                    03170000
    BEGIN     <<FILE OPEN>>                                             03175000
      PCHLDR;     <<PUNCH LEADER>>                                      03180000
      GO WELLDONE;                                                      03185000
    END;                                                                03190000
    IF FUNC = CLOSE THEN                                                03195000
$PAGE                                                                   03200000
<<  I N I T I A T O R    C L O S E                 >>                   03205000
    BEGIN     <<FILE CLOSE>>                                            03210000
    PCHLDR;     <<PUNCH TRAILER>>                                       03215000
    END;     <<FILE CLOSE>>                                             03220000
    IF FUNC = DEVCLOSE THEN                                             03225000
$PAGE                                                                   03230000
<<  I N I T I A T O R    D E V I C E   C L O S E   >>                   03235000
    BEGIN     <<DEVICE CLOSE>>                                          03240000
      GO TO WELLDONE;                                                   03245000
    END;    <<DEVICE CLOSE>>                                            03250000
    IF FUNC = NEWTAPE THEN                                              03255000
$PAGE                                                                   03260000
NWTAPE:                                                        <<00.05>>03265000
<<  I N I T I A T O R    N E W T A P E               >>                 03270000
    BEGIN     <<NEWTAPE>>                                               03275000
    TAPREQF:=1;  <<FLAG FOR PUNCH TRAILER>>                             03280000
    PCHLDR;      <<PUNCH TRAILER>>                                      03285000
    END;     <<NEWTAPE>>                                                03290000
    IF FUNC > 5 THEN                                                    03295000
$PAGE                                                                   03300000
<<  I N I T I A T O R    I N V A L I D                >>                03305000
    BEGIN                                                               03310000
      TOS:=INVALID;                                                     03315000
      TOS:=ENDIO;                                                       03320000
      GO BEND;                                                          03325000
WELLDONE:                                                               03330000
      TOS:=1;     <<ENDING STAT OK>>                                    03335000
      TOS:=ENDIO;                                                       03340000
      GO BEND;                                                 <<00.03>>03345000
LOGIT:                                                         <<00.03>>03350000
      DITP(DSERR):= [8/1,8/DLOGERROR]; <<LOG COUNT & INDEX>>   <<01335>>03355000
      DITP(DLOGERROR):= DITP(DSTAT);     <<LOG ERROR>>         <<01335>>03360000
BEND:                                                                   03365000
      MSTATE:=TOS;     <<SET MONITOR STATE>>                            03370000
      STATUS:=TOS;     <<SET STATUS>>                                   03375000
     <<ENABLE INTERRUPTS>>                                              03380000
                                                                        03385000
      RETURN;                                                           03390000
    END;     <<INITIATOR>>                                              03395000
                                                                        03400000
                                                                        03405000
                                                                        03410000
$PAGE                                                                   03415000
<<        C  O  M  P  L  E  T  O  R        >>                           03420000
                                                                        03425000
                                                                        03430000
COMPLETOR:                                                              03435000
IF  TAPREQF=1 THEN GO NEWCOMP;                                 <<00.05>>03440000
<< GET HERE IF MONITOR STATE = 3.  SHOULD ONLY GET HERE IF >>           03445000
<< FUNCTION CODE = READ,WRITE,FILE CLOSE,OR OPEN FOR       >>           03450000
<< WRITE ONLY.                                             >>           03455000
                                                                        03460000
   TOS:=DRTN;                                                           03465000
   ASSEMBLE(TIO 0);                                                     03470000
   IF < THEN GO UFAIL;                                                  03475000
   TOS:=CLEAR ;  <<CLEAR INTERRUPTS>>                                   03480000
   ASSEMBLE(CIO 2);                                                     03485000
   IF <> THEN GO UFAIL;                                                 03490000
   << STATUS NOW ON TOS>>                                               03495000
   ASSEMBLE(DUP);                                              <<00.03>>03500000
   DITP(DSTAT):=TOS;                                           <<00.03>>03505000
   TOS:=TOS&CSR(2);     <<TRANSFER ERROR BIT>>                          03510000
   IF DITP(DSTAT).(14:1)=1 THEN                                <<00.05>>03515000
   BEGIN     <<TRANSFER ERROR INTERRUPT>>                               03520000
     TOS:=XFERERR;                                                      03525000
     TOS:=ENDIO;                                                        03530000
     GO LOGIT;                                                 <<00.03>>03535000
   END;                                                                 03540000
   TOS:=TOS&CSL(1);  <<WATCHDOG TIMER BIT>>                             03545000
   IF  DITP(DSTAT).(15:1)=1 THEN GO UFAIL;                     <<00.05>>03550000
   TOS:=TOS&CSR(4);  <<TAPE LOW BIT       >>                            03555000
   IF DITP(DSTAT).(9:1)=1 THEN                                 <<00.05>>03560000
   BEGIN                                                                03565000
     GO NWTAPE;                                                <<00.05>>03570000
     TOS:=ENDIO;                                                        03575000
     GO LOGIT;                                                 <<00.05>>03580000
   END;                                                                 03585000
   TOS:=TOS&CSR(1);  <<TAPE BROKEN>>                                    03590000
   IF  DITP(DSTAT).(12:1)=1 THEN                               <<00.05>>03595000
   BEGIN                                                                03600000
     TOS:=TABROKEN;                                                     03605000
     TOS:=ENDIO;                                                        03610000
     GO LOGIT;                                                 <<00.05>>03615000
   END;                                                                 03620000
   IF DITP(DSTAT).(0:1)=0 THEN                                 <<00.05>>03625000
   BEGIN                                                                03630000
     TOS:=MSTRCLEAR;                                                    03635000
     ASSEMBLE(CIO 2);                                                   03640000
     IF <> THEN GO UFAIL;                                               03645000
NOTRDY:                                                                 03650000
     LDEVNOTRDY(DITP);                                         <<0U.EB>>03655000
     MASTERCLEAR(DITP);                                                 03660000
     TOS:=1;                                                            03665000
     TOS:=REINIT;                                                       03670000
     GO BEND;                                                           03675000
   END;                                                                 03680000
CONT:                                                                   03685000
   ASSEMBLE(DEL);     <<DRTN ON TOS>>                                   03690000
   SETFLAGS;                                                            03695000
    IF TAPREQF <> 0 THEN GO NEWCOMP;                           <<00.05>>03700000
$PAGE                                                                   03705000
IF FUNC=NEWTAPE THEN                                                    03710000
BEGIN                                                                   03715000
NEWCOMP:                                                       <<00.05>>03720000
  IF TAPREQF=1 THEN                                                     03725000
  BEGIN  <<TRAILER PUNCHED. REQUEST NEW TAPE>>                          03730000
 ASK:                                                                   03735000
    DITP(J):=-1;  <<SET REPLY FLAG>>                                    03740000
    IF NOT IOMESSAGE(1,207,%10000,LDEV,,,,,0,1,J,DITP) THEN    <<06.EB>>03745000
     BEGIN                                                     <<01.02>>03750000
        MASTERCLEAR(DITP);                                     <<01.02>>03755000
        IOQP(QWBCNT):=0;<<ZERO WORD COUNT>>                    <<01.02>>03760000
        TOS:=%124;<<SYSTEM ERROR>>                             <<01.02>>03765000
        TOS:=ENDIO;                                            <<01.02>>03770000
        GO BEND;                                               <<01.02>>03775000
     END;                                                      <<01.02>>03780000
    TAPREQF:=2;                                                         03785000
CHCK:                                                                   03790000
    TOS:=SUCCESS;                                                       03795000
    TOS:=REINIT;                                                        03800000
    GO BEND;                                                            03805000
  END;                                                                  03810000
  IF TAPREQF=2 THEN                                                     03815000
  BEGIN  <<TAPE REQUESTED.PUNCH LEADER>>                                03820000
    IF MSGDONE =1 THEN                                                  03825000
    BEGIN                                                               03830000
      IF NOT LOGICAL (DITP(J)) THEN GO ASK;                             03835000
      MSGDONE :=0;        <<RESET MESSAGE FLAG>>                        03840000
    END                                                                 03845000
    ELSE GO CHCK;<<MSG NOT DONE WAIT SOME MORE>>                        03850000
    TAPREQF:=3;  <<SET LEADER FLAG>>                                    03855000
    PCHLDR;  <<GO PUNCH LEADER>>                                        03860000
  END;                                                                  03865000
  IF TAPREQF=3 THEN                                                     03870000
  BEGIN  <<COMPLETED>>                                                  03875000
    TAPREQF:=0;  <<RESET FLAGS>>                                        03880000
    GO WELLDONE;                                                        03885000
  END;                                                                  03890000
END;  <<NEW TAPE COMPLETION>>                                           03895000
                                                                        03900000
IF FUNC < 5 THEN GO WELLDONE;                                           03905000
$PAGE                                                                   03910000
<<  C O M P L E T O R  I N V A L I D  >>                                03915000
                                                                        03920000
<< IF YOU GET HERE FUNCTION IS INVALID.SHOULD NOT HAPPEN>>              03925000
INVFUNC:                                                                03930000
   TOS:=INVALID;                                                        03935000
   TOS:=ENDIO;                                                          03940000
   GO BEND;                                                             03945000
                                                                        03950000
END;     <<PTPCHDVR>>                                                   03955000
<< D R I V E R  L I N K A G E  A R E A >>                               03960000
                                                                        03965000
ASSEMBLE(                                                               03970000
         PCAL SIODM;          <<MONITOR>>                               03975000
         PCAL PTPCHDVR;       <<INITIATOR>>                             03980000
         PCAL PTPCHDVR;       <<COMPLETOR>>                             03985000
         CON 0;               <<NO I/O PROCESS>>                        03990000
         PCAL INITZ;          <<INITIALIZATION>>                        03995000
         CON 1;               <<1 INTERRUPT HANDLER>>                   04000000
         PCAL GIP);           <<INTERRUPT HANDLER>>                     04005000
END;                                                                    04010000
