$CONTROL MAP,CODE,USLINIT                                               00010000
  <<        IOFLOP0 ,MODULE 23 - 7902 DISC DRIVER     SERIES 33 >>      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 PRIVILEGED,UNCALLABLE,MAIN=IOFLOP0                             00030000
$TP                                                                     00032000
$TITLE "7902(FLOPPY) FLEXIBLE DISC DRIVER "                             00034000
                                                                        00036000
DRIVER CALLING SEQUENCE                                                 00038000
                                                                        00040000
   DRIVER REQUEST CODES                                                 00042000
     0 - READ                                                           00044000
     1 - WRITE                                                          00046000
     2 - FILE OPEN                                                      00048000
     3 - FILE CLOSE                                                     00050000
     4 - DEVICE CLOSE                                                   00052000
     5 - FILL WITH ZEROS                                                00054000
     6 - FILL WITH BLANKS                                               00056000
     7 - REQUEST STATUS:  COUNT = #WRDS TO RETURN                       00058000
           TO BE COMPATIBLE WITH SERIES III, STATUS REQUEST WILL        00060000
           CHECK TO SEE IF LAST TRANSFER FOR THE ADDRESSED UNIT         00062000
           ENDED IN AN ERROR. IF LAST TRANSFER DID END IN               00064000
           AN ERROR, THEN THE STATUS FROM THAT TRANSFER WILL            00066000
           BE RETURNED, OTHERWISE A NEW STATUS REQUEST WILL BE          00068000
           GENERATED AND THAT STATUS RETURNED.                          00070000
     8 - FORMAT DISCETTE                                                00072000
     9 - INITIALIZE TRACK                                               00074000
    10 - ISSUE SELF TEST                                                00076000
    11 - WRITE LABEL (SECTOR 0)                                         00078000
    12 - VERIFY MEDIA                                                   00080000
    13 - REQUEST PHYSICAL ADDRESS                                       00082000
    15 - REQUEST STATUS  (SAME AS FUNCTION CODE 7)                      00084000
                                                                        00086000
   COUNT - WORD/BYTE COUNT. ODD BYTE COUNT WILL BE ROUNDED UP.          00088000
                                                                        00090000
   PARAMETERS P1 AND P2 FORM A DOUBLE WORD DISC ADRESS FOR ALL XFERS.   00092000
                                                                        00094000
DRIVER RETURN CODES                                                     00096000
                                                                        00098000
   GENERAL(13:3)        QUALIFYING(8:5)               OVERALL(8:8)      00100000
   0 - PENDING          1 - WAIT FOR COMPLETION       %10               00102000
   1 - SUCCESSFUL                                     %01               00104000
   4 - IRRECOVERABLE    0 - INVALID FUNCTION          %04               00106000
       ERROR            1 - TRACK ERROR               %14               00108000
                        3 - XMISSION ERROR            %34               00110000
                        4 - SIO FAILURE               %44               00112000
                        5 - UNIT FAILURE              %54               00114000
                        6 - INVALID DISC ADRESS       %64               00116000
                        %12 - SYSTEM ERROR            %124              00118000
                        %14 - CHANNEL ERROR           %144              00120000
                        %15 - VERIFY ERROR            %154              00122000
                        %16 - UNKNOWN OR BLANK FORMAT %164              00124000
                        %17 - DELETED RECORD ON IBM   %174     <<01115>>00126000
                                                                        00128000
DISC CONTROLLER HARDWARE STATUS RETURNS                                 00130000
                                                                        00132000
   STATUS 1                                                             00134000
   BITS     USE                                                         00136000
      0      SPARE TRACK                                                00138000
      1      PROTECTED TRACK                                            00140000
      2      DEFECTIVE TRACK                                            00142000
   3-7      TERMINATION STATUS                                          00144000
               0 - NORMAL COMPLETION                                    00146000
               1 - ILLEGAL COMMAND                                      00148000
             %10 - UNCORRECTABLE DATA ERROR                             00150000
             %11 - HEAD-SECTOR COMPARE ERROR                            00152000
             %12 - SIO PROGRAM ERROR                                    00154000
             %14 - END OF CYLINDER                                      00156000
             %16 - OVERRUN                                              00158000
             %21 -  ATTEMPT TO ACCESS DEFECTIVE TRACK                   00160000
             %22 - HEAD MOVEMENT DURING DATA OPERATION                  00162000
             %23 - DISC DRIVE (STATUS-2) ERROR                          00164000
             %27 - DRIVE UNAVAILABLE                                    00166000
             %37 - DRIVE ATTENTION                                      00168000
   8-12      UNUSED                                                     00170000
  13-15      UNIT NUMBER                                                00172000
                                                                        00174000
                                                                        00176000
                                                                        00178000
   STATUS 2 WORD                                                        00180000
      0      DRIVE ERROR                                                00182000
    3-6      DRIVE TYPE                                                 00184000
      8      ATTENTION                                                  00186000
      9      PROTECTED                                                  00188000
     10      FORMAT                                                     00190000
     11      FAULT                                                      00192000
     12      FIRST STATUS                                               00194000
     13      SEEK CHECK                                                 00196000
     14      DRIVE NOT READY                                            00198000
     15      DRIVE BUSY                                                 00200000
$PAGE                                                                   00202000
BEGIN                                                                   00204000
EQUATE                                                                  00206000
   BADSIO      = %44,     << SIO FAILURE RETURN >>                      00208000
   CBIT'       = 7,       << RECALIBRATE BIT OF QMISC >>                00210000
   CBMODE      = %100000, << BURST MODE >>                              00212000
   CBFILLMODE  = %104000, << CURST AND FILL MODE >>                     00214000
   CDBA        = 14,      << CURRENT DATA BUF INDEX >>                  00216000
   CDERR       = %17,     << CORRECTABLE DATA ERROR CODE >>             00218000
   CDSJ        = %2400,   << DEVICE SPECIFIED JUMP>>                    00220000
   CDSJ1       = CDSJ+1,                                                00222000
   CDSJ2       = CDSJ+2,                                                00224000
   CDSJ3       = CDSJ+3,                                       <<01866>>00226000
   CEDA        = 10,      << CURRENT ERROR DISC ADR. INDEX >>           00228000
   CEDA1       = 20,      << CEDA INDEX (SINGLE) >>                     00230000
   CHANABORT   = 7,       << CPVA0.(0:4) WHEN CHAN ABORT >>             00232000
   CHANERR     = %144,    << CHANNEL PROGRAM ABORT ERROR >>             00234000
   CINTHLT    = %600,     <<CHANNEL INTERRUPT AND HALT>>                00236000
   CINTHLT1   = CINTHLT+1,                                              00238000
   CINTHLT2   = CINTHLT+2,                                              00240000
   CINTHLT3   = CINTHLT+3,                                              00242000
   CINCHARGE'  = 5,       << CONTROLLER IN CHARGE >>                    00244000
   CLBIT'      = 8,       << DEVICE CLEAR BIT >>                        00246000
   CLDA        = 5,       << CURRENT LOGICAL DISC ADR. INDEX >>         00248000
   CLDA1       = 10,      << FIRST WORD OF CLDA INDEX >>                00250000
   CLDA2       = 11,      << SECOND WORD OF CLDA INDEX >>               00252000
   CLEARC      = %4400,   << CHANNEL CLEAR COMMAND >>                   00254000
   CLEARISSUED = %100001, << VALUE PUT INTO CPVA ON DSJ 2 >>            00256000
   CLRP        = 191,     << OFFSET TO CLEAR PROGRAM >>        <<00490>>00258000
   CJUMP       = %000000, << CHANNEL JUMP COMMAND >>                    00260000
   CMD         = 236,     << OFFSET OF DISC COMMANDS >>        <<01866>>00262000
                           << !!!!NOTE: CMD SHOULD ALWAYS >>   <<00490>>00264000
                           <<        BE AN EVEN NUMBER   >>    <<00490>>00266000
   CMD1        = CMD+1,                                                 00268000
   CMD2        = CMD+2,                                                 00270000
   CMD2'       = CMD2/2,                                                00272000
   CMD4        = CMD+4,                                                 00274000
   CMD5        = CMD+5,                                                 00276000
   CMD6        = CMD+6,                                                 00278000
   CMD7        = CMD+7,                                                 00280000
   CMD8        = CMD+8,                                                 00282000
   CMD9        = CMD+9,                                                 00284000
   CMD10       = CMD+10,                                                00286000
   CMD11       = CMD+11,                                                00288000
   CMD12       = CMD+12,                                                00290000
   CMD13       = CMD+13,                                       <<00490>>00292000
   CNOUPD      = %002000, << NO UPDATE CHANNEL ORDERS>>                 00294000
   CPDA        = 6,       << CURRENT PHYSICAL DISC ADR. INDEX >>        00296000
   CREADD      = %001400, << CHANNEL READ DATA>>                        00298000
   CREADC      = %001410, << CHANNEL READ COMMAND DATA>>                00300000
   CRESULT     = %003417, << CHANNEL READ SELFTEST RESULT >>            00302000
   CSELFTEST   = %004017, << CHANNEL INITIATE SELF TEST >>              00304000
   CURCYL      = 12,      << CURRENT CYLINDER INDEX >>                  00306000
   CWAIT       = %001000, <<CHANNEL WAIT>>                              00308000
   CWRITED     = %002000, << CHANNEL WRITE DATA>>                       00310000
   CWRITEC     = %002010, << CHANNEL WRITE COMMAND FOR UNBUFFERED >>    00312000
   CWRITEF     = %002014, << FORMAT COMMAND>>                           00314000
   CWRITEP     = %002014, << REQ PHYSICAL ADDRESS >>                    00316000
   CWRITERB    = %002012, << WRITE COMMAND FOR BUFFERED READ >>         00318000
   CWRITEWB    = %002011, << WRITE COMMAND FOR BUFFERED WRITE >>        00320000
   CWC         = 16,      << CURRENT WORD COUNT INDEX >>                00322000
   DADR        = 4,       << DISC ADRESS INDEX IN IOQ >>                00324000
   DILTP       = 5,       << ILT POINTER >>                             00326000
   DLDEV       = 3,       << LOGICAL DEVICE INDEX OF DIT >>             00328000
   DLTDREC     = %174,    << DELETED RECORD STATUS RETURN >>   <<01115>>00330000
   DLOGERROR   = 24,      <<HARDWARE LOGGED ERROR STATUS>>     <<01349>>00332000
   DMISC       = 23,      << DIT MISC >>                                00334000
   DSCXFRERR   = %14,     << DISC XFER ERROR STATUS RETURN >>           00336000
   DSERR       =  7,      << ERROR STATUS COUNT & INDEX >>     <<01349>>00338000
   DSTAT       = 6,       << DEVICE STATUS RETURN INDEX >>              00340000
   DSTAT1      = 18,      << STATUS 1 RETURN INDEX >>                   00342000
   DDSTAT1     = 9,       << DOUBLE INDEX FOR STATUS 1 RETURN >>        00344000
   DSTAT2      = 19,      << STATUS 2 RETURN INDEX >>                   00346000
   DXFP        = 36,      << OFFSET OF DATA XFER I/O PROG >>   <<01866>>00348000
                          << !!! NOTE: DXFP SHOULD ALWAYS >>   <<01866>>00350000
                          <<           BE AN EVEN NUMBER  >>   <<01866>>00352000
   DXFP4       = DXFP+4,                                       <<01866>>00354000
   DXFP14      = DXFP+14,                                      <<01866>>00356000
   DXFP15      = DXFP+15,                                      <<01866>>00358000
   DXFP16      = DXFP+16,                                      <<01866>>00360000
   DXFP19      = DXFP+19,                                      <<01866>>00362000
   DXFP24      = DXFP+24,                                      <<01866>>00364000
   DXFP24'     = DXFP24/2,                                     <<01866>>00366000
   DXFP26      = DXFP+26,                                      <<01866>>00368000
   DXFP27      = DXFP+27,                                      <<01866>>00370000
   DXFP31      = DXFP+31,                                      <<01866>>00372000
   DXFP34      = DXFP+34,                                      <<01866>>00374000
   DXFP35      = DXFP+35,                                      <<01866>>00376000
   DXFP36      = DXFP+36,                                      <<01866>>00378000
   DXFP37      = DXFP+37,                                      <<01866>>00380000
   DXFP39      = DXFP+39,                                      <<01866>>00382000
   DXFP40      = DXFP+40,                                      <<01866>>00384000
   DXFP40'     = DXFP40/2,                                     <<01866>>00386000
   DXFP42      = DXFP+42,                                      <<01866>>00388000
   DXFP42'     = DXFP42/2,                                     <<01866>>00390000
   DXFP44      = DXFP+44,                                      <<01866>>00392000
   DXFP44'     = DXFP44/2,                                     <<01866>>00394000
   DXFP46      = DXFP+46,                                      <<01866>>00396000
   DXFP46'     = DXFP46/2,                                     <<01866>>00398000
   DXFP48      = DXFP+48,                                      <<01866>>00400000
   DXFP48'     = DXFP48/2,                                     <<01866>>00402000
   DXFP50      = DXFP+50,                                      <<01866>>00404000
   DXFP50'     = DXFP50/2,                                     <<01866>>00406000
   DXFP52      = DXFP+52,                                      <<01866>>00408000
   DXFP52'     = DXFP52/2,                                     <<01866>>00410000
   DXFP54      = DXFP+54,                                      <<01866>>00412000
   DXFP54'     = DXFP54/2,                                     <<01866>>00414000
   DXFP56      = DXFP+56,                                      <<01866>>00416000
   DXFP61      = DXFP+61,                                      <<01866>>00418000
   DXFP68      = DXFP+68,                                      <<01866>>00420000
   DXFP72      = DXFP+72,                                      <<01866>>00422000
   DXFP75      = DXFP+75,                                      <<01866>>00424000
   ENDOP       = %012400, << DISC END ORDER >>                          00426000
   FILLB       = 6,       << FILL WITH BLANK CMD >>                     00428000
   FILLZ       = 5,       << FILL WITH ZERO CMD >>                      00430000
   FIRSTSTATUS'= 12,      << FIRST STATUS REQUIRED >>                   00432000
   FMAT        = 120,     << OFFSET TO START OF FORMAT PROG >> <<01866>>00434000
   FMAT4       = FMAT+4,                                                00436000
   FMAT16      = FMAT+16,                                               00438000
   FMAT21      = FMAT+21,                                               00440000
   FOPEN       = 2,       << FILE OPEN FUNCTION >>                      00442000
   FORMAT      = 8,       << FORMAT FUNCTION >>                         00444000
   FORMATPARM  = 2,       << PARAMETER PASSED IN FORMAT COMMAND >>      00446000
   ICNTRL      = 7,       << CONTROLLER INFO IN ILT >>                  00448000
   HPFORMAT    = 2,       << DISC TYPE OF HP FORMATTED DISCETTE >>      00450000
   IBMFMTPARM  = 1,       << INTERLEAVE VALUE FOR IBM >>       <<04826>>00452000
   IBMFORMAT   = 8,       << DISC TYPE OF IBM FORMATTED DISCETTE >>     00454000
   ICPVA0      = 0,       << FIRST WORD OF CPVA >>                      00456000
   ICPVA1      = 1,       << SECOND WORD OF CPVA >>                     00458000
   ICPVA3      = 3,       << THIRD WORD OF CPVA >>                      00460000
   IDLEP       = 2,       << START OF IDLE CHANNEL PROG >>     <<01776>>00462000
   IDLEP4      = IDLEP+4,                                      <<01776>>00464000
   IDLEP20     = IDLEP+20,                                     <<01776>>00466000
   IDLEP24     = IDLEP+24,                                     <<01776>>00468000
   IDLEP27     = IDLEP+27,                                     <<01776>>00470000
   IFLAG       = 13,      << FLAGS WORD OF ILT >>                       00472000
   INITIALIZE  = 9,       << INITIALIZE FUNCTION >>                     00474000
   INITP       = 2,       << OFFSET TO PROG STARTED BY INITIO >>        00476000
   INITOP      = %005400, << INITIALIZE COMMAND >>                      00478000
   INVDSKADR   = %64,     << INVALID DISC ADRESS RETURN >>              00480000
   INVFUNC     = 4,       << INVALID FUNCTION RETURN >>                 00482000
   ISIOP       = 8,       << CHAN PROG POINTER >>                       00484000
   ISTAP       = 9,       << STATUS AREA PTR IN ILT >>                  00486000
   JUMPOFFSET  = 2,       << OFFSET OF JUMP ORDER AT START OF PROGRAM >>00488000
   LOCKOP      = %14400,  << LOCK DOOR ORDER >>                         00490000
   LOCKP       = 147,     << OFFSET TO LOCK PROGRAM >>         <<01866>>00492000
   LOCKP4      = LOCKP+4,                                               00494000
   MAXTRANSFER = 32767,   << MAXIMUM TRANSFER >>                        00496000
   MBIT'       = 3,       << TRACK MAP BIT OF QMISC >>                  00498000
   QFUNC       = 6,       << FUNCTION CODE INDEX OF IOQ >>              00500000
   QLDEV       = 2,       << LDEV INDEX OF IOQ >>                       00502000
   QMISC       = 3,       << DRIVER WORD INDEX OF IOQ >>                00504000
   QSTAT       = 10,      << STATUS RETURN INDEX OF IOQ >>              00506000
   QWBCT       = 7,       << COUNT INDEX >>                             00508000
   READ        = 0,       << READ FUNCTION >>                           00510000
   READOP      = %002400, << DISC READ COMMAND >>                       00512000
   REQDADR     = %012000, << REQUEST DISC ADDRESS>>                     00514000
   REQPHYSADR  = 13,      << REQUEST PHYSICAL DISC ADDRESS FUNCTION >>  00516000
   REQSTAT     = %001400, << REQUEST STATUS CMD >>                      00518000
   RDAP        = 171,     << OFFSET OF DISC ADDRESS PROG >>    <<01866>>00520000
   RDAP4       = RDAP+4,                                                00522000
   RDAP9       = RDAP+9,                                                00524000
   RPADR       = 188,     << OFFSET TO REQ PHYS ADR PROG >>    <<01866>>00526000
   RPADR4      = RPADR+4,                                               00528000
   RPADR8      = RPADR+8,                                               00530000
   RPADR9      = RPADR+9,                                               00532000
   RSTAP       = 161,     << OFFSET TO REQ STATUS I/O PROG >>  <<01866>>00534000
   RSTAP4      = RSTAP+4,                                               00536000
   RSTAP9      = RSTAP+9,                                               00538000
   RSTAT       = 7,       << REQUEST STATUS FUNCTION >>                 00540000
   SCOUNT      = 22,      << SECTOR COUNT >>                            00542000
   SEEK        = %001000, << SEEK CMD >>                                00544000
   SELFTEST    = 10,      << SELF TEST FUNCTION >>                      00546000
   SELFTP      = 216,     << OFFSET TO SELF TEST PROGRAM >>    <<01866>>00548000
   SELFTP4     = SELFTP+4,                                              00550000
   SELFTP10    = SELFTP+10,                                             00552000
   SELFTP11    = SELFTP+11,                                             00554000
   SETDBIT     = %20000,   <<SET D BIT IN INITIALIZE COM>>              00556000
   SUCCESSFUL  = 1,       << SUCCESSFUL COMPLETION STATUS RETURN >>     00558000
   SYSBUFA     = 17,      << SYSBUF INDEX OF DIT >>                     00560000
   SYSDB       = %1000,                                                 00562000
   SYSERROR    = %124,    << SYSTEM ERROR CODE RETURN >>                00564000
   SYSLPDT     = 8,       << DB INDEX OF LPDT POINTER >>                00566000
   SYSSBUF     = 6,       << DB INDEX OF SBUF TABLE >>                  00568000
   UNITFAILURE = %54,     << UNIT FAIL STATUS RETURN >>                 00570000
   UNKNOWNFMAT = %164,    <<ILLEGAL FORMAT >>                           00572000
   UNLOCKOP    =%15000,   << UNLOCK DOOR ORDER >>                       00574000
   VERIFY      = 12,      << VERIFY FUNCTION >>                         00576000
   VERIFYERR   = %154,    << ERROR ON VERIFY >>                         00578000
   VERIFYOP    = %003400, << VERIFY COMMAND >>                          00580000
   WAIT        = %10,     << WAIT FOR COMP. STATUS RETURN >>            00582000
   WCR         = 15,      << WORD COUNT REMAINING INDEX >>              00584000
   WRITE       = 1,       << WRITE FUNCTION >>                          00586000
   WRITEL      = 11,      << WRITE LABEL FUNCTION >>                    00588000
   WRITEOP     = %004000, << DISC WRITE COMMAND >>                      00590000
   XFERERROR   = %34;     << XFER ERROR STATUS RETURN >>                00592000
                                                                        00594000
DEFINE                                                                  00596000
   ABORT      = (0:3)#,    << ABORT FIELD OF CPVA0 >>                   00598000
   ABS        = ABSOLUTE#,                                              00600000
   ASMB       = ASSEMBLE#,                                              00602000
   CBIT       = (CBIT':1)#,                                             00604000
   CINCHARGE  = (CINCHARGE':1)#,                                        00606000
   CLBIT      = (CLBIT':1)#,                                            00608000
   CPVAEFIELD = (4:12)#,  << ERROR FIELD OF CPVA WORDS >>               00610000
   DBIT       = (0:1)#,    << RETRY DETERMINATION BIT OF QMISC >>       00612000
   DBLESIDED  = (4:1)#,    << MEDIA IS DOUBLE SIDED DISCETTE >>         00614000
   DISABLE    = ASMB(SED 0)#,                                           00616000
   DRVNOTRDY  = (14:1)#,   << DRIVE NOT READY BIT OF QSTAT2 >>          00618000
   DSTBANKFIELD= (8:8)#,   << HIGH ORDER MEM ADDRESS IN DST >> <<01776>>00620000
   EBIT       = (2:1)#,    << ERROR BIT OF QMISC >>                     00622000
   ENABLE     = ASMB(SED 1)#,                                           00624000
   ERRCODE    = (3:5)#,    << ENCODED ERROR STATUS >>                   00626000
   FUNCTION   = (8:8)#,    << REQUEST FUNCTION CODE >>                  00628000
   FINISH     = %(2)1000#, << CHANNEL PROGRAM FINISH WITHOUT ABORT>>    00630000
   FIRSTSTATUS= (FIRSTSTATUS':1)#,                                      00632000
   HEAD       = LSR(8)#,   << HEAD FIELD OF DISC ADRESS >>              00634000
   HPDRTYPE   = (5:1)#,    << HP FORMATTED DISCETTE >>                  00636000
   IBMDRTYPE  = (3:1)#,    << IBM FORMATTED DISCETTE >>                 00638000
   L'STAT'ERR = (15:1)#,   << LAST TRANSFER STATUS                      00640000
                              - TRUE IF LAST TRANSFER ENDED WITH ERROR  00642000
                              - OTHERWISE FALSE                         00644000
                            >>                                          00646000
   MBIT       = (MBIT':1)#,                                             00648000
   QLDEVN     = (8:8)#,    << LDEV FIELD IN IOQ >>                      00650000
   RETRY      = (13:3)#,   << RETRY COUNT FIELD OF QMISC >>             00652000
   SBIT       = (1:1)#,    << REQUEST SYNDROME BIT OF QMISC >>          00654000
   SECTOR     = (8:8)#,    << SECTOR FIELD OF DISC ADRESS >>            00656000
   SEEKCHECK  = (13:1)#,   << INVALID SEEK BIT OF STATUS-2 >>           00658000
   SEM        = (1:3)#,    << S,E, AND M BITS OF QMISC >>               00660000
   SFAIL      = (10:1)#,   << SIO FIALED TO START IN GIP >>             00662000
   SIOP       = CON %20302;CON 0#, <<SIOP INSTRUCTION>>                 00664000
   SPARE      = (0:1)#,    << SPARE BIT OF STATUS-1 >>                  00666000
   SPEC       = (1:1)#,    << SPECIAL REQ. BIT OF IOQ >>                00668000
   STAT       = (8:8)#,    << I/O STATUS RETURN FIELD OF IOQ >>         00670000
   SUBT       = (12:4)#,   << SUBTYPE FIELD OF LPDT >>                  00672000
   SYSBUFR    = (3:1)#,    << SYSTEM BUFFER BIT OF IOQ >>               00674000
   UNITN      = (2:6)#,    << UNIT FIELD OF DIT >>             <<01301>>00676000
   WAITPROG   = (1:1)#,    << IDLE CHANNEL PROG STARTED OF IFLAG >>     00678000
   WBIT       = (4:1)#;    << WRITING BAD TRACK BIT OF QMISC >>         00680000
                                                                        00682000
INTEGER POINTER                                                         00684000
   SBUF        = DB + SYSSBUF;                                          00686000
                                                                        00688000
DOUBLE POINTER                                                          00690000
   DLPDT       = DB + SYSLPDT;                                          00692000
ARRAY INITIAL(0:278) = DB :=                                   <<01866>>00694000
   [8/25,8/%61],     <<DIT SIZE= 25, RUNWAIT, TYPE=1>>         <<01349>>00696000
         0,                                                             00698000
   %037407,          << UNIT EXTRACT INSTRUCTION (ANDI 7) >>            00700000
   [8/125,8/2],    << 250 WORD SIO PROG,2 WORD STATUS AREA >>  <<01866>>00702000
   << DIT >>                                                            00704000
     %040020,        << DFLAG; FLEXIBLE DISC >>                         00706000
           0,        << DLINK >>                                        00708000
           0,        << DIOQP >>                                        00710000
       %040000,      << DLDEV - HP-IB DEVICE >>                <<01301>>00712000
           0,        << DDLTP >>                                        00714000
           0,        << DILTP >>                                        00716000
           0,        << DRQST >>                                        00718000
           0,        << DSERR >>                                        00720000
           0,        << DMAMQ >>                                        00722000
           0,        << DMAMQT >>                                       00724000
         0,0,        << CLDA - CURRENT LOGICAL DISC ADR >>              00726000
         0,0,        << CPDA - CURRENT PHYSICAL DISC ADR >>             00728000
           0,        << CDBA - CURRENT DATA BUFFER ADR >>               00730000
           0,        << WCR - WORD COUNT REMAINING >>                   00732000
           0,        << CWC - CURRENT TRANSFER COUNT >>                 00734000
           0,        << SYSBUFA - SYSTEM BUFFER ADR >>                  00736000
           0,        << STAT1 - FIRST DISC STATUS >>                    00738000
           0,        << STAT2 - SECOND DISC STATUS >>                   00740000
         0,0,        << CEDA - CURRENT ERROR DISC ADR >>                00742000
           0,        << SCOUNT - SECTOR COUNT >>                        00744000
           0,        << DMISC >>                                        00746000
           0,        << DLOGERROR >>                           <<01349>>00748000
                                                                        00750000
        <<-----------------                                             00752000
          CHANNEL PROGRAM                                               00754000
        ----------------->>                                             00756000
                                                                        00758000
        CJUMP,0,                                                        00760000
                                                                        00762000
                                                               <<01776>>00764000
        <<----------------------                                        00766000
          IDLE CHANNEL PROGRAM                                          00768000
        ---------------------->>                                        00770000
                                                                        00772000
        CWRITEC,2,0,CNOUPD,0,     <<ISSUE END>>                         00774000
        CWAIT,0,                                                        00776000
        CDSJ2,0,                  << CHECK FOR POWER UP >>     <<01776>>00778000
        4,4,0,                    << DSJ=2 DO CLEAR >>         <<01776>>00780000
        CLEARC,0,                                              <<01776>>00782000
        CWAIT,0,                                               <<01776>>00784000
        CWRITERB,2,0,CNOUPD,0,    <<REQUEST STATUS>>                    00786000
        CWAIT,0,                                                        00788000
        CREADC,4,4,CBMODE,0,      <<READ STATUS>>                       00790000
        CDSJ,0,0,                 <<DISABLE POLL RESPONSE>>    <<01866>>00792000
        CINTHLT2,1,               <<HALT WITH INTERUPT>>                00794000
        -1,                       <<SO DXFP0 EVEN NUMBER>>     <<01866>>00796000
                                                                        00798000
        <<-------------------                                           00800000
          DATA XFER PROGRAM                                             00802000
        ------------------->>                                           00804000
                                                                        00806000
 <<DXFP0>>   CWRITEC,6,0,CNOUPD,0, << SEEK >>                  <<01866>>00808000
 <<DXFP5>>   CWAIT,0,                                          <<01866>>00810000
 <<DXFP7>>   CDSJ3,0,                                          <<01866>>00812000
 <<DXFP9>>   0,                    << NO ERROR >>              <<01866>>00814000
 <<DXFP10>>  112,                  << ERROR OCCURRED >>        <<01866>>00816000
 <<DXFP11>>  158,                  << POWER ON >>              <<01866>>00818000
 <<DXFP12>>  0,                    << SO REST DXFP/2 EVEN >>   <<01866>>00820000
 <<DXFP13>>  CJUMP,0,                                          <<01866>>00822000
 <<DXFP15>>  CWRITEC,4,0,CNOUPD,0, << VERIFY >>                <<01866>>00824000
 <<DXFP20>>  CWAIT,0,                                          <<01866>>00826000
 <<DXFP22>>  CDSJ2,0,                                          <<01866>>00828000
 <<DXFP24>>  55,                   << NO ERROR >>              <<01866>>00830000
 <<DXFP25>>  98,                   << ERROR OCCURED >>         <<01866>>00832000
 <<DXFP26>>  144,                  << POWER ON >>              <<01866>>00834000
 <<DXFP27>>  CWRITERB,2,0,CNOUPD,0,<< XFER ORDER OR INIT >>    <<01866>>00836000
 <<DXFP32>>  CWAIT,0,                                          <<01866>>00838000
 <<DXFP34>>  0,0,0,0,0,            << ACTUAL TRANSFER >>       <<01866>>00840000
 <<DXFP39>>  0,0,0,0,0,            << CHAIN IF NECESSARY >>    <<01866>>00842000
 <<DXFP44>>  CJUMP,4,              << JUMP PAST BURST LOOP >>  <<01866>>00844000
 <<DXFP46>>  CWAIT,0,                                          <<01866>>00846000
 <<DXFP48>>  CJUMP,-23,            << JMP BACK TO BURST LOOP >><<01866>>00848000
 <<DXFP50>>  CWAIT,0,                                          <<01866>>00850000
 <<DXFP52>>  CDSJ2,0,              << ERROR CHECK >>           <<01866>>00852000
 <<DXFP54>>  0,                    << NO ERROR >>              <<01866>>00854000
 <<DXFP55>>  0,                    << ERROR OCCURRED >>        <<01866>>00856000
 <<DXFP56>>  0,                    << POWER UP >>              <<01866>>00858000
 <<DXFP57>>  CWRITEC,6,0,CNOUPD,0, << SEEK >>                  <<01866>>00860000
 <<DXFP62>>  CWAIT,0,                                          <<01866>>00862000
 <<DXFP64>>  CWRITERB,2,0,CNOUPD,0,   << READ DATA BACK >>     <<01866>>00864000
 <<DXFP69>>  CWAIT,0,                                          <<01866>>00866000
 <<DXFP71>>  CREADD,0,0,CBFILLMODE,0, << USE FILL WORD >>      <<01866>>00868000
 <<DXFP76>>  CJUMP,-56,            << DO DSJ >>                <<01866>>00870000
 <<DXFP78>>  CWAIT,0,                                          <<01866>>00872000
 <<DXFP80>>  CJUMP,-18,                                        <<01866>>00874000
 <<DXFP82>>  CINTHLT2,2,           << STOP >>                  <<01866>>00876000
                                                                        00878000
        <<----------                                                    00880000
           FORMAT                                                       00882000
        ---------->>                                                    00884000
                                                                        00886000
 <<FMAT>>    CWRITEF,5,0,CNOUPD,0, <<FORMAT>>                           00888000
 <<FMAT5>>   CWAIT,0,              <<MAY NOT NEED???>>                  00890000
 <<FMAT7>>   CDSJ2,0,              << ERROR CHECK >>                    00892000
 <<FMAT9>>   0,                    << NO ERROR, HALT >>                 00894000
 <<FMAT10>>  29,                   << ERROR, GET STATUS >>     <<01866>>00896000
 <<FMAT11>>  75,                   << POWER UP, ISSUE CLEAR >> <<01866>>00898000
 <<FMAT12>>  CWRITEC,2,0,CNOUPD,0, << ISSUE STATUS REQUEST >>           00900000
 <<FMAT17>>  CREADC,4,0,CNOUPD,0,                                       00902000
 <<FMAT22>>  CDSJ,0,0,                                         <<01866>>00904000
 <<FMAT25>>  CINTHLT2,3,                                       <<01866>>00906000
                                                                        00908000
        <<-------------------------                                     00910000
          LOCK AND UNLOCK PROGRAM                                       00912000
        ------------------------->>                                     00914000
                                                                        00916000
 <<LOCKP>>   CWRITEF,2,0,CNOUPD,0, << LOCK OR UNLOCK DOOR >>            00918000
 <<LOCKP5>>  CWAIT,0,                                                   00920000
 <<LOCKP7>>  CDSJ2,0,                                                   00922000
 <<LOCKP9>>  0,          << NO ERROR >>                                 00924000
 <<LOCKP11>> 2,          << ERROR - GET STATUS >>                       00926000
 <<LOCKP11>> 48,         << POWER UP >>                        <<01866>>00928000
 <<LOCKP12>> CINTHLT2,4,                                                00930000
                                                                        00932000
        <<------------------------                                      00934000
          REQUEST STATUS PROGRAM                                        00936000
        ------------------------>>                                      00938000
                                                                        00940000
 <<RSTP00>>  CWRITEC,2,0,CNOUPD,0, <<REQUEST STATUS>>                   00942000
 <<RSTP5>>   CREADC,4,0,CNOUPD,0,  <<READ STATUS>>                      00944000
                                                                        00946000
        <<--------------------------------------                        00948000
          REQUEST LOGICAL DISC ADDRESS PROGRAM                          00950000
        -------------------------------------->>                        00952000
                                                                        00954000
 <<RDAP00>>  CWRITEC,2,0,CNOUPD,0, <<REQUEST DISC ADDRESS>>             00956000
 <<RDAP05>>  CREADC,4,0,CNOUPD,0,  <<READ DISC ADDRESS>>                00958000
 <<RDAP10>>  CWAIT,0,                                                   00960000
 <<RDAP12>>  CDSJ,0,0,            <<DISABLE POLL RESPONSE>>    <<01866>>00962000
 <<RDAP15>>  CINTHLT1,1,          <<ERROR HALT>>               <<01866>>00964000
                                                                        00966000
        <<--------------------------                                    00968000
          REQUEST PHYSICAL ADDRESS                                      00970000
        -------------------------->>                                    00972000
                                                                        00974000
 <<RPADR0>>  CWRITEP,2,0,CNOUPD,0, << REQUEST PHYSICAL ADDRESS >>       00976000
 <<RPADR5>>  CREADC,4,0,CNOUPD,0,  << READ PHYSICAL ADDRESS >>          00978000
 <<RPADR10>> CWAIT,0,                                                   00980000
 <<RPADR12>> CDSJ2,0,                                                   00982000
 <<RPADR14>> 0,                    << NO ERROR >>                       00984000
 <<RPADR15>> %177724,              << GET STATUS >>            <<01866>>00986000
 <<RPADR16>> 2,                    << ISSUE CLEAR >>                    00988000
 <<RPADR17>> CINTHLT2,5,                                                00990000
                                                                        00992000
        <<-------------------                                           00994000
          ISSUE AMIGO CLEAR                                             00996000
        ------------------->>                                           00998000
                                                                        01000000
 <<CLRP>>    CLEARC,0,                                                  01002000
 <<CLRP2>>   CWAIT,0,                                                   01004000
 <<CLRP4>>   CDSJ,0,0,                                         <<01866>>01006000
 <<CLRP7>>   CINTHLT3,1,                                       <<01866>>01008000
                                                                        01010000
        <<-----------------                                             01012000
          ISSUE SELF TEST                                               01014000
        ----------------->>                                             01016000
                                                                        01018000
 <<STEST>>   CSELFTEST,1,0,CNOUPD,0,  << ISSUE SELF TEST >>             01020000
 <<STEST5>>  CWAIT,0,                                                   01022000
 <<STEST7>>  CRESULT,2,0,CNOUPD,0,    << READ SELF TEST RESULT >>       01024000
 <<STEST12>> CWAIT,0,                                                   01026000
 <<STEST14>> CDSJ,0,0,                                         <<01866>>01028000
 <<STEST17>> CINTHLT2,6,                                       <<01866>>01030000
        -1,                                                    <<01866>>01032000
                                                               <<01866>>01034000
                                                               <<00490>>01036000
        <<----------                                                    01038000
          COMMANDS                                                      01040000
        ---------->>                                                    01042000
                                                                        01044000
 <<CMD>>     0,          <<SET WAKEUP>>                                 01046000
 <<CMD1>>    0,0,0,      <<SEEK>>                                       01048000
 <<CMD4>>    %12400,     <<END>>                                        01050000
 <<CMD5>>    0,          <<REQUEST STATUS>>                             01052000
 <<CMD6>>    REQDADR,    <<REQUEST DISC ADDRESS>>                       01054000
 <<CMD7>>    0,0,        << VERIFY OR FORMAT ORDER >>                   01056000
 <<CMD9>>    0,          << DISC XFER OR INITIALIZE ORDER >>            01058000
 <<CMD10>>   0,          << FILL WORD >>                                01060000
 <<CMD11>>   0,          << LOCK OR UNLOCK COMMAND >>                   01062000
 <<CMD12>>   0,          << SELFTEST BYTE >>                   <<00490>>01064000
 <<CMD13>>   READOP;     << READ AFTER WRITE >>                <<00490>>01066000
                                                                        01068000
$PAGE                                                                   01070000
PROCEDURE CHECKINDEX(INDEX,TABLE);                                      01072000
VALUE INDEX,TABLE;                                                      01074000
INTEGER INDEX;                                                          01076000
POINTER TABLE;                                                          01078000
OPTION EXTERNAL;                                                        01080000
                                                                        01082000
PROCEDURE DCONVERT(WORD);                                               01084000
VALUE WORD;                                                             01086000
INTEGER WORD;                                                           01088000
OPTION EXTERNAL;                                                        01090000
                                                                        01092000
INTEGER PROCEDURE GETSBUF(TYPE);                                        01094000
VALUE TYPE;                                                             01096000
INTEGER TYPE;                                                           01098000
OPTION EXTERNAL;                                                        01100000
                                                                        01102000
PROCEDURE GIP'HPIB;                                            <<01301>>01104000
OPTION EXTERNAL;                                                        01106000
                                                                        01108000
PROCEDURE HELP;                                                         01110000
OPTION EXTERNAL;                                                        01112000
                                                                        01114000
PROCEDURE LDEVNOTRDY(DITP);                                             01116000
VALUE DITP;                                                             01118000
POINTER DITP;                                                           01120000
OPTION EXTERNAL;                                                        01122000
                                                                        01124000
PROCEDURE MASTERCLEARHPIB(DITP);                               <<01301>>01126000
INTEGER ARRAY DITP;                                                     01128000
OPTION EXTERNAL;                                                        01130000
                                                                        01132000
PROCEDURE SIODM(DITP,FLAGS);                                            01134000
VALUE DITP,FLAGS;                                                       01136000
POINTER DITP;                                                           01138000
LOGICAL FLAGS;                                                          01140000
OPTION EXTERNAL;                                                        01142000
                                                                        01144000
PROCEDURE RETURNSBUF(SBUFP);                                            01146000
VALUE SBUFP;                                                            01148000
INTEGER SBUFP;                                                          01150000
OPTION EXTERNAL;                                                        01152000
                                                                        01154000
PROCEDURE START'HPIB(DITP,CHANP,QUEUE);                        <<01301>>01156000
VALUE DITP,CHANP,QUEUE;                                                 01158000
POINTER DITP,CHANP;                                                     01160000
LOGICAL QUEUE;                                                          01162000
OPTION EXTERNAL;                                                        01164000
                                                                        01166000
PROCEDURE WRITE2(WORD);                                                 01168000
VALUE WORD;                                                             01170000
INTEGER WORD;                                                           01172000
OPTION EXTERNAL;                                                        01174000
$PAGE                                                                   01176000
INTEGER PROCEDURE FLOPINIT(DITP);                                       01178000
  INTEGER ARRAY DITP;                                                   01180000
  <<INITIALIZATION ROUTINE FOR IOMDISC1:                                01182000
    IT SETS UP IDLE CHANNEL PROGRAM,                                    01184000
    STARTS IT TO RUN,                                                   01186000
    SETS BIT FIEDLS TO INDICATE IT IS RUNNING                           01188000
  >>                                                                    01190000
    BEGIN                                                               01192000
    INTEGER POINTER ILTP=Q+1,                                           01194000
                    CHANP=Q+2;                                          01196000
    LOGICAL ABSCHANP=Q+3;                                               01198000
    LOGICAL POINTER ILTPL=ILTP;                                         01200000
                                                                        01202000
      <<----------------------                                          01204000
        INITIALIZE VARIABLES                                            01206000
      ---------------------->>                                          01208000
                                                                        01210000
      TOS := DITP(DILTP);   << ILT POINTER >>                           01212000
      TOS := ILTP(ISIOP);   << CHANNEL PROGRAM POINTER >>               01214000
      TOS := @CHANP+SYSDB;  <<ABSOLUTE ADDRESS OF CHANP>>               01216000
      <<-------------------------                                       01218000
        INITIALIZE IDLE PROGRAM                                         01220000
      ------------------------->>                                       01222000
      IF NOT ILTPL(IFLAG).WAITPROG THEN                                 01224000
        BEGIN <<FIRST UNIT FOR CONTROLLER>>                             01226000
        CHANP(IDLEP4) := ABSCHANP+CMD4; << END ORDER >>                 01228000
        CHANP(IDLEP20) := ABSCHANP+CMD5;                       <<01776>>01230000
        CHANP(DXFP61):=CHANP(DXFP4):=ABSCHANP+CMD1; << SEEK >> <<01866>>01232000
        CHANP(DXFP19) := ABSCHANP+CMD7;  << VERIFY >>          <<01866>>01234000
        CHANP(DXFP31) := ABSCHANP+CMD9;  << XFER OR INIT >>    <<01866>>01236000
        CHANP(DXFP68):=ABSCHANP+CMD13; << RD ORDER AFT WRT >>  <<01866>>01238000
        CHANP(DXFP75) := ABSCHANP+CMD10; << USE FILL WORD >>   <<01866>>01240000
        CHANP(FMAT4) := ABSCHANP+CMD7;   << FORMAT COMMAND >>           01242000
        CHANP(FMAT16) := ABSCHANP+CMD5; << REQUEST STATUS >>            01244000
        CHANP(LOCKP4) := ABSCHANP+CMD11; << LOCK, UNLOCK >>             01246000
        CHANP(RSTAP4) := ABSCHANP+CMD5;  << STATUS COMMAND >>           01248000
        CHANP(RDAP4) := ABSCHANP+CMD6;  << DISC ADDRESS >>              01250000
        CHANP(RPADR4) := ABSCHANP+CMD6; << PHYS. DISC ADDR >>           01252000
        CHANP(SELFTP4) := ABSCHANP+CMD12; << INIT SELF TEST >>          01254000
        CHANP(CMD5) := REQSTAT;                                         01256000
        CHANP(IDLEP27) := ILTP(ISTAP)+SYSDB;                   <<01776>>01258000
        <<------------                                                  01260000
          UPDATE ILT                                                    01262000
        ------------>>                                                  01264000
        CHANP(1) := 0;                                                  01266000
        START'HPIB(DITP,CHANP,FALSE);                          <<01301>>01268000
        END;                                                            01270000
      END;                                                              01272000
                                                                        01274000
$PAGE                                                                   01276000
INTEGER PROCEDURE FLOPDVR(IOQP,DITP,BANK,BUFFER,CHANP,DRTN);   <<01301>>01278000
VALUE IOQP,DITP,BANK,BUFFER,CHANP,DRTN;                        <<01301>>01280000
INTEGER BANK,BUFFER,DRTN;                                      <<01301>>01282000
INTEGER POINTER IOQP,DITP,CHANP;                                        01284000
OPTION PRIVILEGED,UNCALLABLE;                                           01286000
BEGIN                                                                   01288000
                                                                        01290000
INTEGER                                                                 01292000
   ABSCHANP     = Q+16, << ABSOLUTE ADDRESS OF CHANP>>                  01294000
   AD           = Q+1,  << ADRESS DELTA >>                              01296000
   BUFADR       = Q+5,  << ABSOLUTE BUFFER ADRESS >>                    01298000
   BUFCNT       = Q+1,  << COUNT CHECK FOR REQUEST SYND. >>             01300000
   CXFER        = Q+4,  << CHAINED XFER ORDER >>                        01302000
   DISCOP       = Q+3,  << DISC XFER ORDER>>                            01304000
   DXFPINDEX    = Q+10, <<INDEX INTO XFER PROGRAM>>                     01306000
   ERR          = Q+6,  << DISC ENCODED ERROR STATUS >>                 01308000
   FUNCT        = Q+13, << REQUEST FUNCTION CODE >>                     01310000
   I            = Q+8,                                                  01312000
   INDEX        = Q+18, <<INDEX INTO DISCINFO>>                         01314000
   MSTATE       = FLOPDVR,                                              01316000
   S0           = S-0,                                                  01318000
   S2           = S-2,                                                  01320000
   SUBTYPE      = Q+12, << DEVICE SUBTYPE :                >>           01322000
                        <<     0 - HP FORMAT SINGLE SIDED  >>           01324000
                        <<     1 - HP FORMAT DOUBLE SIDED  >>           01326000
                        <<     2 - IBM FORMAT SINGLE SIDED >>           01328000
   UNIT         = Q+15, << DEVICE UNIT # >>                             01332000
   X            = X,                                                    01334000
   XCNT         = Q+7,  << XFER COUNT >>                                01336000
   XD           = Q+2;  << XFER DELTA >>                                01338000
                                                                        01340000
DOUBLE                                                                  01342000
   DXFERORDER   = CXFER;                                                01344000
                                                                        01346000
DOUBLE POINTER                                                          01348000
   DDITP        = DITP,                                                 01350000
   DIOQP        = IOQP,                                                 01352000
   DCHANP       = CHANP;                                                01354000
                                                                        01356000
LOGICAL                                                                 01358000
   CHANQFLG     = Q+11, << CHANNEL QUEUE FLAG FOR STARTIO >>            01360000
   SBFLG        = Q+14, << SYSTEM BUFFER FLAG >>                        01362000
   LS0          = S-0,                                                  01364000
   LSM1         = S-1,                                         <<00490>>01366000
   READAFTERWRITE=Q+19;<< TRUE IF TO READ AFTER WRITE >>       <<00490>>01368000
                                                                        01370000
LOGICAL POINTER                                                         01372000
   LDITP        = DITP,                                                 01374000
   LILTP        = Q+17,                                                 01376000
   LIOQP        = IOQP,                                                 01378000
   LCHANP       = CHANP,                                       <<01115>>01380000
   LPDTP        = 8;                                           <<01115>>01382000
                                                                        01384000
INTEGER POINTER                                                         01386000
   BADTRACK     = Q+9,                                                  01388000
   ILTP         = LILTP,                                                01390000
   PS1          = S-1;                                                  01392000
                                                                        01394000
EQUATE                                                                  01396000
   HSTYPE      =    3,    << HIGHEST SUBTYPE >>                         01398000
   NENTRIES    =    6,    << NUMBER OF TABLE ENTRIES/SUBTYPE >>         01400000
   SECPERTRK   =    0,    << OFFSET TO SEC/TRACK ENTRIES >>             01402000
   SECPERCYL   =    1,    << OFFSET TO SEC/CYLINDER ENTRIES >>          01404000
   MAXCYL      =    2,    << OFFSET TO MAX CYLINDER FOR STYPE >>        01406000
   WORDSPERSEC =    3,    << OFFSET TO BYTES PER SECTOR >>              01408000
   BURSTLEN    =    4,    << OFFSET TO BURST LENGTH >>                  01410000
   INITSIZE    =    5;    << OFFSET TO LENGTH(IN WORDS) OF >>           01412000
                                                                        01414000
                          << TRANSFER FOR INITIALIZE FUNCTION >>        01416000
INTEGER ARRAY                                                           01418000
   DISCINFO(0:17) = PB :=                                      <<04826>>01420000
     30, 30, 76, 128,   0,   128, <<SUBTYPE 0,HP SINGLESIDE>>  <<04826>>01422000
     30, 60, 76, 128,   0,   128, <<SUBTYPE 1,HP DOUBLESIDE>>  <<04826>>01424000
   26, 26, 76,  64, 128,  1664; <<SUBTYPE 2, IBM,SINGLE SIDE>> <<04826>>01426000
                                                                        01430000
                                                                        01432000
DEFINE DITLDEV=3).(8:8#;                                       <<01115>>01434000
DEFINE FOREIGN=(LPDTP(LDITP(DITLDEV)&LSL(1)+1).(10:2)=3)#;     <<01115>>01436000
DEFINE IBM=(2<=SUBTYPE<=3)#;                                   <<01115>>01438000
                                                               <<01115>>01440000
INTEGER ARRAY                                                           01442000
   CHANRW(0:12)=PB:=CREADD,CWRITED,0,0,0,CWRITED,CWRITED,               01444000
   0,CWRITED,CWRITED,0,CWRITED,0;                                       01446000
                                                                        01448000
INTEGER ARRAY                                                           01450000
   XFEROP(0:12)=PB:=READOP,WRITEOP,0,0,0,WRITEOP,WRITEOP,               01452000
   0,WRITEOP,0,0,WRITEOP,0;                                             01454000
                                                                        01456000
DEFINE                                                                  01458000
   REQSTATSIO= CHANP(RSTAP9) := @DITP(DSTAT1)+SYSDB;                    01460000
               CHANP(RDAP9) := @DITP(CEDA1)+SYSDB;                      01462000
               CHANP(CMD5) := REQSTAT+UNIT#;                            01464000
                                                                        01466000
  DOUBLE SUBROUTINE CONVERTADR;                                         01468000
      BEGIN << THIS ROUTINE CONVERTS A PHYSICAL TO LOGICAL DISC ADR. >> 01470000
     TOS := DDITP(X); << DIT INDEX PASSED IN X REG. >>                  01472000
     ASMB(ZERO,XCH;CAB);                                                01474000
     TOS := DISCINFO(INDEX+SECPERCYL);                                  01476000
     ASMB(LMPY,DADD; STD S-4);                                          01478000
    END;                                                                01480000
                                                                        01482000
                                                                        01484000
  INTEGER SUBROUTINE CALCSBUFADR(CNT);                                  01486000
    VALUE CNT;                                                          01488000
    INTEGER CNT;                                                        01490000
      BEGIN                                                             01492000
     CALCSBUFADR := DITP(CDBA);<<GET FIRST ABS. SYSTEM BUFFER ADRESS >> 01494000
     WHILE CNT >= 128 DO                                                01496000
       BEGIN << STOMP THROUGH THE BUFFERS >>                            01498000
       CHECKINDEX(ABS(S2-1),SBUF); << INDEX VALID ? >>                  01500000
       CALCSBUFADR := ABS(X) + @SBUF + SYSDB; << GET NEXT SBUF ADRESS >>01502000
       CNT := CNT - 128;                                                01504000
       END;                                                             01506000
      END;                                                              01508000
                                                                        01510000
                                                                        01512000
        <<----------------------------                                  01514000
          INITIALIZE LOCAL VARIABLES                                    01516000
          ---------------------------->>                                01518000
                                                                        01520000
        ASMB(ADDS 11);                                                  01522000
        << Determine floppy subtype for single-sided floppies>><<04826>>01524000
        TOS := IF LDITP(DSTAT2).HPDRTYPE THEN 0 << SUBTYPE >>           01526000
                ELSE IF LDITP(DSTAT2).IBMDRTYPE THEN 2         <<04826>>01528000
                    ELSE  -2; << UNKNOWN FORMAT >>                      01530000
        << If double-sided and type HP increment the subtype>> <<04826>>01532000
        IF (LDITP(DSTAT2).DBLESIDED)                           <<04826>>01534000
                 AND                                           <<04826>>01536000
           (LDITP(DSTAT2).HPDRTYPE)                            <<04826>>01538000
           THEN                                                <<04826>>01540000
              TOS:=TOS+1;                                      <<04826>>01542000
        TOS := IOQP(QFUNC).FUNCTION; << REQUEST FUNCTION >>             01546000
        TOS := IOQP.SYSBUFR;  << SYSBUF FLAG >>                         01548000
        TOS := DITP(DLDEV).UNITN; << DISC UNIT NUMBER >>       <<01301>>01550000
        TOS := @CHANP+SYSDB;                                            01552000
        TOS := DITP(DILTP);                                             01554000
        TOS := SUBTYPE*NENTRIES; << INDEX >>                            01556000
        TOS := IF FUNCT=WRITE OR FUNCT=WRITEL                  <<00490>>01558000
                 OR FILLZ<=FUNCT<=FILLB THEN TRUE              <<00490>>01560000
               ELSE FALSE;     << READAFTERWRITE FLAG >>       <<00490>>01562000
        IF FUNCT=15 THEN FUNCT := RSTAT;  << FCODE 15=7 >>     <<01201>>01564000
                                                                        01566000
        IF MSTATE = 2 THEN                                              01568000
          BEGIN                                                         01570000
          <<-------------                                               01572000
            NEW REQUEST                                                 01574000
          ------------->>                                               01576000
          IF @IOQP=0 THEN                                               01578000
            BEGIN                                                       01580000
            <<----------------------------                              01582000
              START IDLE CHANNEL PROGRAM                                01584000
            ---------------------------->>                              01586000
            CHANP(CMD5) := REQSTAT;                                     01588000
            CHANP(IDLEP24) := 4;                               <<01776>>01590000
            CHANP(IDLEP27) := ILTP(ISTAP)+SYSDB;               <<01776>>01592000
            TOS := 0;                                                   01594000
            GO STARTIOPROG;                                             01596000
            END;                                                        01598000
          TOS := IOQP(QWBCT); << DETERMINE XFER COUNT >>                01600000
          IF < THEN                                                     01602000
            BEGIN << COUNT IN BYTES >>                                  01604000
            ASMB(DUP);                                                  01606000
             IF TOS THEN IOQP(QWBCT) := IOQP(QWBCT)-1;         <<04826>>01608000
            TOS := -(TOS&ASR(1)); << CONVERT TO WORDS >>                01610000
            END;                                                        01612000
          DITP(WCR) := TOS; << XFER COUNT >>                            01614000
          DDITP(CLDA) := DIOQP(DADR); << DISC ADRESS OR DISC TYPE>>     01616000
          DITP(CDBA) := BUFFER; << SET CURRENT BUFFER ADRESS >>         01618000
          IF FUNCT > REQPHYSADR THEN                                    01620000
            BEGIN                                                       01622000
INVALIDFUNC:                                                            01624000
            TOS := INVFUNC;                                             01626000
            GO TO BADEND;                                               01628000
            END;                                                        01630000
          IF SBFLG AND DITP(WCR) > 256 THEN GO TO INVALIDFUNC;          01632000
          TOS := 0; << RESET QMISC >>                                   01634000
TRYAGAIN:                                                               01636000
          X := FUNCT; << SWITCH ON REQUEST TYPE >>                      01638000
          ASMB(LOAD SWT,X; ADAX; BR SWT,X;                              01640000
SWT:      CON DOXFER;    CON DOXFER;    CON LOCK;      CON UNLOCK;      01642000
          CON UNLOCK;    CON FILLZERO;  CON FILLBLANK;                  01644000
          CON REQSTATUS; CON DOXFER;    CON DOXFER;                     01646000
          CON SELFTRESULT;    CON DOXFER;    CON DOXFER;                01648000
          CON DOXFER);                                                  01650000
          HELP; << HELP CALL NEEDED FOR BREAKPOINTS >>                  01652000
          END;                                                          01654000
                                                                        01656000
        <<---------------------                                         01658000
          CONTINUATOR SECTION                                           01660000
        --------------------->>                                         01662000
                                                                        01664000
        IF DITP(DSTAT)=-1 THEN                                          01666000
          BEGIN << POWER FIAL >>                                        01668000
            DITP(DSTAT) := 0;                                  <<04826>>01670000
          GO TRYAGAIN;                                                  01672000
          END;                                                          01674000
        IF LIOQP.SFAIL THEN GOTO SIOFAILURE; <<GIP FAILED TO START I/O>>01676000
        TOS := IOQP(QMISC); << QMISC STAYS ON TOS THROUGHOUT DRIVER >>  01678000
        IF ILTP(ICPVA0)<>0 THEN                                         01680000
          BEGIN << CHANNEL ERROR >>                                     01682000
          DITP(DSERR):= [8/1,8/DLOGERROR];                     <<01349>>01684000
          DITP(DLOGERROR):= ILTP(ICPVA0); <<LOG CHANNEL ERROR>><<01349>>01686000
          TOS := TOS+1;   <<INCREASE RETRY COUNT>>                      01688000
          ILTP(ICPVA0) := 0;                                            01690000
          IF LS0.RETRY<4 THEN                                           01692000
            BEGIN                                                       01694000
            TOS .DBIT := 1;                                             01696000
            TOS := TOS+1;                                               01698000
            GO TRYAGAIN;                                                01700000
            END;                                                        01702000
          TOS := CHANERR;                                               01704000
          GOTO BADEND;                                                  01706000
          END;                                                          01708000
        IF ILTP(ICPVA3) = CLEARISSUED THEN                              01710000
          BEGIN  << POWER UP DSJ SO ISSUE CLEAR >>                      01712000
          ILTP(ICPVA3) := 0;                                            01714000
          GO TRYAGAIN;                                                  01716000
          END;                                                          01718000
        IF FUNCT=VERIFY AND ILTP(ICPVA1)<>0 THEN                        01720000
          IF DITP(DSTAT1).ERRCODE<>%23 THEN                             01722000
            BEGIN << VERIFY FAILED >>                                   01724000
            DITP(DMISC).L'STAT'ERR:=1; << SAVE ERROR INDICATION >>      01726000
            ILTP(ICPVA1) := 0;                                          01728000
            TOS := BANK;                                                01730000
            TOS := BUFFER;                                              01732000
           X := CEDA;  <<SUBROUTINE EXPECTS PARAM IN X REG>>   <<04826>>01734000
            TOS := CONVERTADR;                                          01736000
            ASMB(SDEA);                                                 01738000
            TOS := TOS + 2D;                                            01740000
            TOS := DDITP(DDSTAT1);                                      01742000
            ASMB(SDEA);                                                 01744000
            DDEL;                                                       01746000
            TOS := VERIFYERR;                                           01748000
            GOTO BADEND;                                                01750000
            END;                                                        01752000
        IF FUNCT=RSTAT OR ILTP(ICPVA1)=0 THEN ERR:=0                    01754000
        ELSE                                                            01756000
          BEGIN                                                         01758000
          <<-------------------------                                   01760000
            ERROR STATUS COMPLETION                                     01762000
          ------------------------->>                                   01764000
          ILTP(ICPVA1) := 0;  << CLEAR WORD 1 OF CPVA>>                 01766000
          DITP(DMISC).L'STAT'ERR:=1; << SAVE ERROR INDICATION >>        01768000
          ERR := DITP(DSTAT1).ERRCODE;                                  01770000
          DITP(DSERR):= [8/6,8/DSTAT1]; <<SET ERROR INDICATOR>><<01349>>01772000
          IF ERR = %23 AND LDITP(DSTAT2).DRVNOTRDY THEN                 01774000
            BEGIN << DRIVE NOT READY >>                                 01776000
            LDEVNOTRDY(DITP); << SEND NOT READY MESSAGE TO CONSOLE >>   01778000
            TOS := WAIT;                                                01780000
            TOS := 7;                                                   01782000
            GO TO CHECKSBUF;                                            01784000
            END;                                                        01786000
          TOS.DBIT := 1; << SET RETRY INDICATOR >>                      01788000
          TOS := TOS+1; <<INCREASE RETRY COUNT>>                        01790000
          IF LS0.RETRY<4   THEN                                         01792000
            IF FUNCT<>FORMAT OR                                         01794000
               ERR=%23 AND LDITP(DSTAT2).FIRSTSTATUS THEN               01796000
              BEGIN << RETRY 4 TIMES >>                                 01798000
              DITP(DSTAT1) := 0;                                        01800000
              GO TRYAGAIN;                                              01802000
              END;                                                      01804000
                                                                        01806000
          <<---------------------------                                 01808000
            ERROR CONNAT BE RECOVERED                                   01810000
          --------------------------->>                                 01812000
                                                                        01814000
          IF %10 <= ERR <= %11 AND SUBTYPE<2 THEN                       01816000
          IF FOREIGN THEN GO TO DISCXFER                       <<01115>>01818000
          ELSE                                                 <<01115>>01820000
            BEGIN << TRACK SPECIFIC ERROR >>                            01822000
            TOS.RETRY := 0; << RESET RETRY FIELD FOR TRACK MAP >>       01824000
            TOS.MBIT := 1;                                              01826000
            IF <> THEN GO TO DISCXFER; << ERROR ON MAP XFER >>          01828000
            TOS := DITP(SYSBUFA);                                       01830000
            IF = THEN                                                   01832000
              BEGIN << GET A SYSTEM BUFFER >>                           01834000
              TOS := GETSBUF(1); << GET A BUFFER >>                     01836000
              ASMB(DELB,DUP);                                           01838000
              IF = THEN GO TO DISCXFER; << NO MORE BUFFERS >>           01840000
               DITP(SYSBUFA) := TOS;                           <<04826>>01842000
              END;                                                      01844000
            DITP(CDBA) := TOS + SYSDB; << SET BUFFER ADRESS >>          01846000
            ASMB(DZRO,INCA); << DOUBLE ONE >>                           01848000
            DDITP(CLDA) := TOS;                                         01850000
            DITP(WCR) := 128;                                           01852000
            FUNCT := READ; << SET UP XFER OF TRK MAP >>                 01854000
            BANK := 0; << ZERO BANK FOR SYSBUF XFER >>                  01856000
            GO TO TRYAGAIN;                                             01858000
            END;                                                        01860000
          IF ERR = %23 AND LDITP(DSTAT2).SEEKCHECK  THEN                01862000
            BEGIN                                                       01864000
            <<----------------------                                    01866000
              INVALID DISC ADDRESS                                      01868000
            ---------------------->>                                    01870000
BADDISCADR:                                                             01872000
            TOS := INVDSKADR;                                           01874000
BADEND:                                                                 01876000
            IOQP(QWBCT) := 0;                                           01878000
            TOS := 5;                                                   01880000
            GO TO CHECKSBUF;                                            01882000
            END;                                                        01884000
          IF ERR = %12 OR ERR = %16 THEN                                01886000
            BEGIN << TRANSFER ERROR >>                                  01888000
            TOS := XFERERROR;                                           01890000
            GO TO BADEND;                                               01892000
            END;                                               <<01115>>01894000
          IF ERR = %21 AND IBM THEN                            <<01115>>01896000
            BEGIN <<DELETED RECORD>>                           <<01115>>01898000
            TOS:=DLTDREC;                                      <<01115>>01900000
            GO BADEND;                                         <<01115>>01902000
            END;                                               <<01115>>01904000
UNITFAIL:                                                      <<01115>>01906000
          TOS := UNITFAILURE;                                           01908000
          GO TO BADEND;                                                 01910000
          END;                                                          01912000
                                                                        01914000
        ASMB(TBC MBIT');                                                01916000
        IF <> THEN                                                      01918000
          BEGIN << ENTRING BAD TRACK INTO BAD TRACK TABLE >>            01920000
          <<-----------------------------------------                   01922000
            ENTERING BAD TRACK INTO BAD TRACK TABLE                     01924000
          ----------------------------------------->>                   01926000
          TOS.WBIT := 1;                                                01928000
          IF <> THEN                                                    01930000
            BEGIN                                                       01932000
            <<---------------------                                     01934000
              TRACK MAP COMPLETED                                       01936000
            --------------------->>                                     01938000
DISCXFER:                                                               01940000
            TOS := DSCXFRERR;                                           01942000
            GO TO BADEND;                                               01944000
            END;                                                        01946000
          @BADTRACK := DITP(SYSBUFA);                                   01948000
          IF BADTRACK >= 120 THEN GO TO DISCXFER; << TABLE FULL >>      01950000
           X := CEDA;  << SUBROUTINE EXPECTS PARAM IN X REG>>  <<04826>>01952000
          TOS := CONVERTADR;                                            01954000
          TOS := DISCINFO(INDEX+SECPERTRK);                             01956000
          ASMB(LDIV,DEL);                                               01958000
          TOS := TOS&LSL(2);                                            01960000
          IF LDITP(DSTAT1).SPARE THEN TOS := TOS + 1;                   01962000
          << SET ALTERNATE TRACK BIT >>                                 01964000
          X := 0;                                                       01966000
          WHILE X < BADTRACK DO                                         01968000
           BEGIN << IS TRACK ALREADY IN THE TABLE >>                    01970000
            ASMB(DUP,INCX);                                             01972000
            IF TOS = BADTRACK(X) THEN GO TO DISCXFER;                   01974000
            << ITS ALREADY IN THE TABLE >>                              01976000
            END;                                                        01978000
          BADTRACK := BADTRACK + 1; << INC TRACK COUNT >>               01980000
          BADTRACK(X:=X+1) := TOS; << ENTER TRACK >>                    01982000
          FUNCT := WRITE;                                               01984000
          BANK := 0;                                                    01986000
          GO TO DOXFER;                                                 01988000
          END;                                                          01990000
                                                                        01992000
        IF FUNCT=RSTAT THEN                                             01994000
          BEGIN << MOVE STATUS TO USER STACK >>                         01996000
          ILTP(ICPVA1) := 0;  << CLEAR WORD 1 OF CPVA>>                 01998000
RSTATRET:                                                               02000000
          TOS := BANK;                                                  02002000
          TOS := DITP(CDBA);                                            02004000
          TOS := 0;                                                     02006000
          TOS := @DITP(DSTAT1)+SYSDB;                                   02008000
          TOS := DITP(WCR);                                             02010000
          IF S0>4 THEN                                                  02012000
            BEGIN                                                       02014000
            DEL;                                                        02016000
            TOS := 4;                                                   02018000
            END;                                                        02020000
          ASMB(MABS 5);                                                 02022000
          GOTO GOODEND;                                                 02024000
          END;                                                          02026000
                                                                        02028000
CONTXFER:                                                               02030000
        TOS := DITP(WCR) - DITP(CWC);                                   02032000
        IF <= OR FUNCT=REQPHYSADR OR FUNCT=FORMAT OR FUNCT=VERIFY THEN  02034000
          BEGIN << XFER COMPLETE >>                                     02036000
GOODEND:                                                                02038000
          TOS := SUCCESSFUL;                                            02040000
          TOS := %5;                                                    02042000
CHECKSBUF:                                                              02044000
          TOS := DITP(SYSBUFA);                                         02046000
          IF <> THEN                                                    02048000
            BEGIN                                                       02050000
            RETURNSBUF(*);                                              02052000
             DITP(SYSBUFA) := 0;                               <<04826>>02054000
            END ELSE DEL;                                               02056000
          GO TO EXIT;                                                   02058000
          END;                                                          02060000
        DITP(WCR) := TOS; << SET REMAINING WORD COUNT >>                02062000
        IF FUNCT <= WRITE THEN                                          02064000
        IF SBFLG THEN DITP(CDBA) := CALCSBUFADR(DITP(CWC)) << SYS BUF >>02066000
          ELSE DITP(WCR) := DITP(CWC)+DITP(CDBA); <<DATA SEG>> <<04826>>02068000
        TOS := DITP(CWC)&LSR(7);                                        02070000
        ASMB(ZERO,XCH); << UPDATE DISC ADRESS >>                        02072000
          DDITP(CWC) := TOS + DDITP(CLDA);                     <<04826>>02074000
                                                                        02076000
        <<-----------------------------                                 02078000
          NOTE!!!!!                                                     02080000
            QMISC MUST BE ON TOS HERE                                   02082000
        ----------------------------->>                                 02084000
                                                                        02086000
        <<---------------------------------                             02088000
          BUILD AND START THE I/O PROGRAM                               02090000
        --------------------------------->>                             02092000
                                                                        02094000
DOXFER:                                                                 02096000
        DITP(DMISC).L'STAT'ERR:=0; << LAST STATUS NO LONGER VALID >>    02098000
        IF FUNCT=FORMAT THEN                                            02100000
          BEGIN                                                         02102000
          IF DITP(CLDA2)<>HPFORMAT AND                                  02104000
              DITP(CLDA2) <> IBMFORMAT THEN                    <<04826>>02106000
            BEGIN                                                       02108000
            TOS := UNKNOWNFMAT;                                         02110000
            GOTO BADEND;                                                02112000
            END;                                                        02114000
          CHANP(CMD7) := %30&LSL(8)+UNIT;                               02116000
          <<*************************************************>><<04826>>02120000
          << The interleave parameter (IBMFMTPARM or         >><<04826>>02122000
          << FORMATPARM) determines the order in which the   >><<04826>>02124000
          << sectors occur on a track. If HP format the value>><<04826>>02126000
          << is set to 2 but if IBM format the value must be >><<04826>>02128000
          << set to 1.                                       >><<04826>>02130000
          <<*************************************************>><<04826>>02132000
          IF DITP(CLDA2) = IBMFORMAT                           <<04826>>02134000
             THEN                                              <<04826>>02136000
                TOS:=DITP(CLDA2)&LSL(8)+IBMFMTPARM             <<04826>>02138000
             ELSE                                              <<04826>>02140000
                TOS:=DITP(CLDA2)&LSL(8)+FORMATPARM;            <<04826>>02142000
          CHANP(CMD8) := TOS;                                           02144000
          CHANP(CMD9) := %20000;                                        02146000
          CHANP(FMAT21) := @DITP(DSTAT1)+SYSDB;                         02148000
          REQSTATSIO;   << FOR ERROR STATUS >>                          02150000
          TOS := FMAT-JUMPOFFSET;                                       02152000
          GO STARTIOPROG;                                               02154000
          END;                                                          02156000
        IF SUBTYPE<0 THEN                                               02158000
          BEGIN << ILLEGAL FORMAT TYPE >>                               02160000
          TOS := UNKNOWNFMAT;                                           02162000
          GOTO BADEND;                                                  02164000
          END;                                                          02166000
        TOS := DDITP(CLDA); <<CURRENT LOGICAL DISC ADDR>>               02168000
        IF = AND (WRITE<=FUNCT<=RSTAT)                         <<01115>>02170000
             AND NOT FOREIGN THEN GO TO BADDISCADR;            <<01115>>02172000
          <<WRITE TO SECTOR ZERO A NO-NO>>                              02174000
        TOS := DISCINFO(INDEX+SECPERCYL);                               02176000
        ASMB(LDIV);  <<COMPUTE DISC ADDRESS>>                           02178000
        IF OVERFLOW OR                                         <<01115>>02180000
           LSM1>LOGICAL(DISCINFO(SUBTYPE*NENTRIES+MAXCYL))     <<01115>>02182000
           THEN                                                <<01115>>02184000
          GOTO BADDISCADR;   <<CYLINDER TOO LARGE>>                     02186000
        TOS := DISCINFO(INDEX+SECPERTRK);                               02188000
        ASMB(DIV,XCH);                                                  02190000
        TOS := TOS&LSL(8)+TOS;        <<HEAD/SECTOR>>                   02192000
        IF SUBTYPE>=2 THEN TOS := TOS+1; << IBM FIRST SECTOR IS 1 >>    02194000
        IF FUNCT=INITIALIZE THEN                                        02196000
          BEGIN <<START TRANSFER AT START OF TRACK >>                   02198000
          TOS := TOS LAND %177400; << SECTOR 0 >>                       02200000
          IF SUBTYPE>=2 THEN TOS := TOS+1; << IBM >>                    02202000
          END;                                                          02204000
        DDITP(CPDA) := TOS;   <<CURRENT PHYSICAL ADDRESS>>              02206000
        CHANP(CMD1) := SEEK+UNIT;                                       02208000
        CHANP(CMD13) := READOP+UNIT;                           <<01866>>02210000
        DCHANP(CMD2') := DDITP(CPDA);     <<SEEK ADDRESS>>              02212000
        IF FUNCT=REQPHYSADR THEN GO REQPADR;                            02214000
        CHANP(DXFP14) := 12;      <<JUMP TO TRANSFER ORDER>>   <<01866>>02216000
        CXFER := CHANRW(FUNCT);   <<CHANNEL XFER COMMAND>>              02218000
        IF SBFLG THEN                                                   02220000
          BEGIN                                                         02222000
          TOS := 128;   <<XFER DELTA>>                                  02224000
          TOS := 0;     <<ADDR DELTA>>                                  02226000
          BANK := 0;                                                    02228000
          END                                                           02230000
        ELSE                                                            02232000
          BEGIN                                                         02234000
          TOS := MAXTRANSFER; << XFER DELTA = 32K-1 >>                  02236000
          ASMB(DUP);    <<ADDR DELTA = 16K>>                            02238000
          END;                                                          02240000
        AD := TOS;  <<ADDRESS DELTA>>                                   02242000
        XD := TOS;  <<TRANSFER DELTA>>                                  02244000
        TOS := IF FUNCT=INITIALIZE THEN DISCINFO(INDEX                  02246000
                 +INITSIZE) ELSE DITP(WCR);                             02248000
        IF FOPEN<=FUNCT<=RSTAT THEN SBFLG := FALSE;                     02250000
        ASMB(DUP,DDUP);                                                 02252000
        IF = AND FUNCT<>VERIFY THEN GOTO GOODEND;  <<XFER COMPLETE>>    02254000
        DITP(CWC) := TOS;                                               02256000
        DITP(SCOUNT) := TOS;                                            02258000
        BUFADR := DITP(CDBA);                                           02260000
        IF SBFLG THEN CHECKINDEX(@SBUF+SYSDB-BUFADR,SBUF);              02262000
        IF FUNCT=VERIFY THEN                                            02264000
          BEGIN                                                         02266000
          CHANP(DXFP14) := 0;   << JUMP TO VERIFY >>           <<01866>>02268000
          CHANP(CMD7) := VERIFYOP+UNIT;                                 02270000
          CHANP(CMD8) := DITP(SCOUNT);                                  02272000
          END                                                           02274000
        ELSE                                                            02276000
          BEGIN  << READ,WRITE, OR INITIALIZE >>                        02278000
          CHANP(CMD9) := IF FUNCT=INITIALIZE THEN                       02280000
            INITOP+UNIT+SETDBIT ELSE XFEROP(FUNCT)+UNIT;                02282000
          CHANP(DXFP27) := IF FUNCT=READ THEN CWRITERB         <<01866>>02284000
            ELSE IF FUNCT=INITIALIZE THEN CWRITEC ELSE CWRITEWB;        02286000
          END;                                                          02288000
        IF TOS>XD THEN                                                  02290000
          BEGIN                                                         02292000
          <<--------------                                              02294000
            CHAIN ORDERS                                                02296000
          -------------->>                                              02298000
          CHANP(DXFP34) := CXFER+%20; <<CHAINED>>              <<01866>>02300000
          CHANP(DXFP35) := XD&LSL(1);     <<BYTE COUNT>>       <<01866>>02302000
          CHANP(DXFP36) := DISCINFO(INDEX+BURSTLEN);           <<01866>>02304000
          CHANP(DXFP37) := IF FILLZ<=FUNCT<=FILLB THEN         <<01866>>02306000
                 CBFILLMODE ELSE CBMODE+BANK.DSTBANKFIELD;     <<01866>>02308000
          CHANP(X:=X+1) := BUFADR;                                      02310000
          DXFPINDEX := X+1;                                             02312000
          IF SBFLG THEN                                                 02314000
            BEGIN  <<GO TO NEXT SYSBUF>>                                02316000
            CHECKINDEX(ABS(BUFADR-1),SBUF);                             02318000
            BUFADR := ABS(BUFADR-1)+@SBUF+SYSDB;               <<04826>>02320000
            END;                                                        02322000
          DCHANP(DXFP44') := [16/CJUMP,16/4] D;                <<01866>>02324000
          DCHANP(DXFP46') := [16/CWAIT,16/0] D;                <<01866>>02326000
          DCHANP(DXFP48') := [16/CJUMP,16/%177751] D; << -23 >><<01866>>02328000
          DCHANP(DXFP50') := [16/CWAIT,16/0] D;                <<01866>>02330000
          DCHANP(DXFP52') := [16/CDSJ2,16/0] D;                <<01866>>02332000
          DCHANP(DXFP54'):=IF READAFTERWRITE THEN              <<01866>>02334000
            [16/0,16/68] D ELSE [16/25,16/68] D;<< NO ERR,ERR>><<01866>>02336000
          CHANP(DXFP56) := 114;  << ISSUE CLEAR >>             <<01866>>02338000
          TOS := TOS-XD;  << LEAVE REMAINNING COUNT ON TOS >>           02340000
          END                                                           02342000
        ELSE                                                            02344000
          BEGIN                                                         02346000
          CHANP(DXFP39) := CJUMP;                              <<01866>>02348000
          DCHANP(DXFP40') := [16/4,16/CWAIT] D;                <<01866>>02350000
          DCHANP(DXFP42') := [16/0,16/CJUMP] D;                <<01866>>02352000
          DCHANP(DXFP44') := [16/%177756,16/CWAIT] D; << -18 >><<01866>>02354000
          DCHANP(DXFP46') := [16/0,16/CDSJ2] D;                <<01866>>02356000
          DCHANP(DXFP48') := IF READAFTERWRITE THEN            <<01866>>02358000
            [16/0,16/5] D ELSE [16/0,16/30] D; << NO ERROR >>  <<01866>>02360000
          DCHANP(DXFP50') := [16/73,16/119] D; << ERR,PON >>   <<01866>>02362000
          DXFPINDEX := DXFP34;                                 <<01866>>02364000
          END;                                                          02366000
        CHANP(DXFPINDEX) := CXFER; <<BUILD LAST ORDER>>                 02368000
        CHANP(X:=X+1) := TOS&LSL(1);                                    02370000
        DXFPINDEX := X+1;                                               02372000
        CHANP(DXFPINDEX) := DISCINFO(INDEX+BURSTLEN);                   02374000
        CHANP(DXFPINDEX+1) := IF FILLZ<=FUNCT<=FILLB THEN CBFILLMODE    02376000
               ELSE CBMODE+BANK.DSTBANKFIELD;  << SEE COMMENT ABOVE >>  02378000
        CHANP(X:=X+1) := BUFADR;                                        02380000
        IF READAFTERWRITE THEN                                 <<00490>>02382000
          CHANP(DXFP72) := DITP(CWC)&LSL(1); << BYTE COUNT >>  <<01866>>02384000
        REQSTATSIO;                                                     02386000
        TOS := DXFP-JUMPOFFSET;  <<RELATIVE JUMP ADDRESS>>              02388000
                                                                        02390000
        <<-----------------------                                       02392000
          START THE I/O PROGRAM                                         02394000
        ----------------------->>                                       02396000
                                                                        02398000
STARTIOPROG:                                                            02400000
        CHANP(1) := TOS; << SET THE JUMP ADRESS >>                      02402000
        CHANQFLG := IF @IOQP=0 THEN FALSE ELSE TRUE;                    02404000
        START'HPIB(DITP,CHANP,CHANQFLG);                       <<01301>>02406000
        IF > THEN                                                       02408000
          BEGIN                                                         02410000
          <<----------                                                  02412000
            NO START                                                    02414000
          ---------->>                                                  02416000
SIOFAILURE:                                                             02418000
          TOS := BADSIO;                                                02420000
          GO TO BADEND;                                                 02422000
          END;                                                          02424000
        IF @IOQP=0 THEN                                                 02426000
          BEGIN  << STARTED WAIT CHANNEL PROG >>                        02428000
          MSTATE := 5;                                                  02430000
          RETURN;                                                       02432000
          END;                                                          02434000
        IOQP(QMISC) := TOS;                                             02436000
        TOS := WAIT;                                                    02438000
        TOS := %13;                                                     02440000
EXIT:                                                                   02442000
        MSTATE := TOS;                                                  02444000
        IOQP(QSTAT).STAT := TOS;                                        02446000
        RETURN;                                                         02448000
                                                                        02450000
FILLBLANK:                                                              02452000
        TOS := "  ";                                                    02454000
        GO TO FC;                                                       02456000
FILLZERO:                                                               02458000
        TOS := 0;                                                       02460000
FC:                                                                     02462000
        CHANP(CMD10) := TOS;                                            02464000
        DITP(CDBA) := ABSCHANP + CMD10;                                 02466000
        GO TO DOXFER;                                                   02468000
                                                                        02470000
        <<---------------------------                                   02472000
          INITIALIZE STATUS PROGRAM                                     02474000
        --------------------------->>                                   02476000
                                                                        02478000
REQSTATUS:                                                              02480000
        IF LDITP(DMISC).L'STAT'ERR THEN GOTO RSTATRET;                  02482000
        REQSTATSIO;                                                     02484000
        TOS := RSTAP-JUMPOFFSET;  <<RELATIVE JUMP ADDRESS>>             02486000
        GO STARTIOPROG;                                                 02488000
                                                                        02490000
        <<-----------------------------                                 02492000
          SETUP PHYSICAL ADDRESS PROG                                   02494000
        ----------------------------->>                                 02496000
                                                                        02498000
REQPADR:                                                                02500000
        CHANP(RPADR4) := ABSCHANP+CMD6;                                 02502000
        CHANP(RPADR8) := CNOUPD+BANK;                                   02504000
        CHANP(RPADR9) := DITP(CDBA);                                    02506000
        CHANP(DXFP14) := RPADR-DXFP15;                         <<01866>>02508000
        CHANP(CMD6) := REQDADR+UNIT;                                    02510000
        TOS := DXFP-JUMPOFFSET;                                         02512000
        GO STARTIOPROG;                                                 02514000
LOCK:                                                                   02516000
        TOS := LOCKOP;                                                  02518000
        GOTO LP;                                                        02520000
UNLOCK:                                                                 02522000
        TOS := UNLOCKOP;                                                02524000
LP:                                                                     02526000
        LDITP(DMISC).L'STAT'ERR := 0;<< Invalidate prior stat>><<02630>>02528000
        CHANP(CMD11) := TOS+UNIT;                                       02530000
        TOS := LOCKP-JUMPOFFSET;                                        02532000
        GO STARTIOPROG;                                                 02534000
SELFTRESULT:                                                            02536000
        CHANP(SELFTP10) := CNOUPD+BANK.DSTBANKFIELD;                    02538000
        CHANP(SELFTP11) := DITP(CDBA);                                  02540000
        TOS := SELFTP-JUMPOFFSET;                                       02542000
        GO STARTIOPROG;                                                 02544000
        END;                                                            02546000
ASMB(                                                                   02548000
   PCAL SIODM;    << MONITOR >>                                         02550000
   PCAL FLOPDVR;  << INITIATOR >>                                       02552000
   PCAL FLOPDVR;  << COMPLETOR >>                                       02554000
   CON 0;         << I/O PROCESS PROCEDURE >>                           02556000
   PCAL FLOPINIT; << INITIALIZATION PROCEDURE >>                        02558000
   CON 1;         << # OF INTERRUPT PROCEDURES >>                       02560000
   PCAL GIP'HPIB);<< INTERRPUT HANDLER >>                      <<01301>>02562000
END.                                                                    02564000
