$CONTROL MAP,CODE,USLINIT                                               00010000
<<IOMDISC1 - MODULE 27>>                                                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=IOMDISC1                            00030000
$THIRTY                                                                 00032000
$TITLE "7905/7920/7925 MOVING HEAD DISC DRIVER -- SEEK'AHEAD"  <<01549>>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                                        <<00.PV>>00058000
     8 - FORMAT TRACK                                          <<01.PV>>00060000
     9 - INITIALIZE TRACK                                      <<02.PV>>00062000
    10 - READ FULL SECTOR                                      <<03.PV>>00064000
    11 - WRITE LABEL (SECTOR 0)                                <<04.PV>>00066000
    12 - READ (WITH SPARING DISABLED)                          <<07.PV>>00068000
                                                                        00070000
   COUNT - WORD/BYTE COUNT. ODD BYTE COUNT WILL BE ROUNDED UP.          00072000
                                                                        00074000
   PARAMETERS P1 AND P2 FORM A DOUBLE WORD DISC ADRESS FOR ALL XFERS.   00076000
                                                                        00078000
DRIVER RETURN CODES                                                     00080000
                                                                        00082000
   GENERAL(13:3)        QUALIFYING(8:5)               OVERALL(8:8)      00084000
   0 - PENDING          1 - WAIT FOR COMPLETION       %10               00086000
   1 - SUCCESSFUL                                     %01               00088000
   4 - IRRECOVERABLE    0 - INVALID FUNCTION          %04               00090000
       ERROR            1 - TRACK ERROR               %14               00092000
                        3 - XMISSION ERROR            %34               00094000
                        4 - SIO FAILURE               %44               00096000
                        5 - UNIT FAILURE              %54               00098000
                        6 - INVALID DISC ADRESS       %64               00100000
                        %12 - SYSTEM ERROR            %124              00102000
                                                                        00104000
DISC CONTROLLER HARDWARE STATUS RETURNS                                 00106000
                                                                        00108000
   STATUS 1 (RETURNED BY TIO,SENSE,ETC.)                                00110000
   BITS     USE                                                         00112000
     0      SIO OK                                                      00114000
     1      RIO/WIO OK                                                  00116000
     2      INTERRUPT REQUEST                                           00118000
   3-7      TERMINATION STATUS                                          00120000
               0 - NORMAL COMPLETION                                    00122000
               1 - ILLEGAL COMMAND                                      00124000
               2 - WAKE-UP STATUS (USED IN REQUEST STAT FUNCT) <<01549>>00126000
               7 - CYL COMPARE ERROR                                    00128000
             %10 - UNCORRECTABLE DATA ERROR                             00130000
             %11 - HEAD-SECTOR COMPARE ERROR                            00132000
             %12 - SIO PROGRAM ERROR                                    00134000
             %14 - END OF CYLINDER                                      00136000
             %16 - OVERRUN                                              00138000
             %17 - POSSIBLY CORRECTABLE DATA ERROR                      00140000
             %20 - ILLEGAL ACCESS TO SPARE TRACK                        00142000
             %21 - ATTEMPT TO ACCESS DEFECTIVE TRACK                    00144000
             %22 - HEAD MOVEMENT DURING DATA OPERATION                  00146000
             %23 - DISC DRIVE (STATUS-2) ERROR                          00148000
             %26 - ATTEMPT TO WRITE ON PROTECTED TRACK                  00150000
             %27 - DRIVE UNAVAILABLE                                    00152000
             %37 - DRIVE ATTENTION                                      00154000
   8-12      UNUSED                                            <<25.00>>00156000
  13-15      UNIT NUMBER                                       <<25.00>>00158000
                                                                        00160000
NOTE THE FOLLOWING DIFFERENCE IN THE RETURN STATUS COMMAND              00162000
                                                                        00164000
      0      SPARE TRACK                                                00166000
      1      PROTECTED TRACK                                            00168000
      2      DEFECTIVE TRACK                                            00170000
                                                                        00172000
                                                                        00174000
   STATUS 2 WORD                                                        00176000
      0      DRIVE ERROR                                                00178000
    3-6      DRIVE TYPE NYBBLE                                 <<25.00>>00180000
      8      ATTENTION                                                  00182000
      9      PLATTER (7905) OR PACK (7920/7925) READ ONLY      <<25.00>>00184000
     10      FORMAT                                                     00186000
     11      DRIVE FAULT                                       <<25.00>>00188000
     12      FIRST STATUS                                               00190000
     13      SEEK CHECK                                                 00192000
     14      DRIVE NOT READY                                            00194000
     15      DRIVE BUSY                                                 00196000
$PAGE                                                                   00198000
BEGIN                                                                   00200000
EQUATE                                                                  00202000
   ADRREC      = %006000, << ADRESS RECORD CMD >>                       00204000
   ALLOWPOLL   = 140,     << OFFSET TO ALLOWPOLL PROG>>        <<01549>>00206000
   ATTENTION   = %37,     << ATTENTION STATUS CODE FROM DRIVE>><<01549>>00208000
   BADSIO      = %44,     << SIO FAILURE RETURN >>                      00210000
   CBIT'       = 7,       << RECALIBRATE BIT OF QMISC >>                00212000
   CDBA        = 14,      << CURRENT DATA BUF INDEX >>                  00214000
   CDERR       = %17,     << CORRECTABLE DATA ERROR CODE >>             00216000
   CEDA        = 10,      << CURRENT ERROR DISC ADR. INDEX >>           00218000
   CEDA1       = 20,      << CEDA INDEX (SINGLE) >>            <<01.PV>>00220000
   CLDA        = 5,       << CURRENT LOGICAL DISC ADR. INDEX >>         00222000
   CPDA        = 6,       << CURRENT PHYSICAL DISC ADR. INDEX >>        00224000
   CLEARUNIT   = %010000, << CLEAR UNIT CONTROL FUNCTION >>             00226000
   CONTROL     = %040000, << SIO CONTROL ORDER >>                       00228000
   CURCYL      = 12,      << CURRENT CYLINDER INDEX >>                  00230000
   CR4K        = %170000, << CHAINED READ OF 4 K WORDS >>               00232000
   CWC         = 16,      << CURRENT WORD COUNT INDEX >>                00234000
   CW4K        = %160000, << CHAINED WRITE OF 4 K WORDS >>              00236000
   DADR        = 4,       << DISC ADRESS INDEX IN IOQ >>                00238000
   DILTP       = 5,       << OFFSET IN DIT TO ILTP >>          <<RK0PV>>00240000
   DITIOQP     = 2,       << OFFSET IN DIT TO IOQP >>          <<01549>>00242000
   DIRECT'SPARE= %20,     << DIRECT ACCESS TO SPARE TRACK >>   <<01549>>00244000
   DLDEV       = 3,       << LOGICAL DEVICE INDEX OF DIT >>             00246000
   DLINK       = 1,       << OFFSET IN DIT TO RESOURCE CHAIN >><<01549>>00248000
   DRIVE'AVAIL =  %2,     << WAKEUP -- THIS CPU HAS DRIVE >>   <<01549>>00250000
   DRIVE'ERROR = %23,     << STATUS TWO ERROR >>               <<01549>>00252000
   DRIVE'NRDY  = %23,     << STATUS TWO  -- NOT READY,OTHERS >><<01549>>00254000
   DSCXFRERR   = %14,     << DISC XFER ERROR STATUS RETURN >>           00256000
   DSERR       = 7,       << ERROR STATUS INDEX OF DIT >>               00258000
   DSTAT       = 6,       << DEVICE STATUS RETURN INDEX >>              00260000
   DSTAT1      = 18,      << STATUS 1 RETURN INDEX >>                   00262000
   DSTAT2      = 19,      << STATUS 2 RETURN INDEX >>                   00264000
   ENDINT      = %034000, << SIO END COMMAND >>                         00266000
   ENDOP       = %012400, << DISC END ORDER >>                          00268000
   FILLB       = 6,       << FILL WITH BLANK CMD >>                     00270000
   FOPEN       = 2,       << FILE OPEN FUNCTION >>             <<02.PV>>00272000
   FORMAT      = 8,       << FORMAT FUNCTION >>                <<RH.PV>>00274000
   ILTPLOC     = 5,       << ILT POINTER IN DIT >>                      00276000
   INIT        = 9,       << INITIALIZE FUNCTION >>            <<02.PV>>00278000
   INITOP      = %005400, << INITIALIZE COMMAND >>             <<01.PV>>00280000
   INITADR     = 30,      << INITIALIZE ADDRESS INDEX >>       <<06.PV>>00282000
   INITADDR    = 15,      << INITIALIZE ADDRESS INDEX (DBL) >> <<06.PV>>00284000
   INVDSKADR   = %64,     << INVALID DISC ADRESS RETURN >>              00286000
   INVFUNC     = 4,       << INVALID FUNCTION RETURN >>                 00288000
   ISIOP     = 8,         << SIOP POINTER IN ILT >>            <<01300>>00290000
   IQUEUE      = 12,      << OFFSET IN ILT TO CONTROLLER Q # >><<01549>>00292000
   IDITP     = 14,        << DITP POINTER IN ILT >>            <<01300>>00294000
   ICNTRL    = 7,         << CONTROLLER INFO IN ILT >>         <<01300>>00296000
   IFLAG     = 13,        << FLAGS WORD OF ILT >>              <<01300>>00298000
   JUMP        = %000000, << JUMP COMMAND >>                   <<RK.00>>00300000
   JUMPC       = %004000, << JUMP CONDITIONAL COMMAND >>                00302000
   MBIT'       = 3,       << TRACK MAP BIT OF QMISC >>                  00304000
   OVERRUN     = %16,     << CONTROLLER GOT OVERRUN >>         <<01549>>00306000
   QFUNC       = 6,       << FUNCTION CODE INDEX OF IOQ >>              00308000
   QLDEV       = 2,       << LDEV INDEX OF IOQ >>                       00310000
   QMISC       = 3,       << DRIVER WORD INDEX OF IOQ >>                00312000
   QSTAT       = 10,      << STATUS RETURN INDEX OF IOQ >>              00314000
   QWBCT       = 7,       << COUNT INDEX >>                             00316000
   READ        = 0,       << READ FUNCTION >>                           00318000
   READOP      = %002400, << DISC READ COMMAND >>                       00320000
   READFS      = 10,      << READ FULL SECTOR FUNCTION >>      <<03.PV>>00322000
   READFSOP    = %003000, << READ FULL SECTOR COMMAND >>       <<03.PV>>00324000
   READSPD     = 12,      << READ WITH SPARING DISABLED >>     <<07.PV>>00326000
   RECALP      = 136,     << OFFSET TO RECALIBRATE PROG >>     <<01549>>00328000
   RECALP1     = RECALP+1,                                              00330000
   RECALIBRATE = %000600, << DISC RECALIBRATE ORDER >>                  00332000
   REQSTAT     = %001400, << REQUEST STATUS CMD >>                      00334000
   RQALL       = 40,      << OFFSET IN SIOP TO SET OF RQST >>  <<01549>>00336000
   RSTAP       = 122,     << OFFSET TO REQ STATUS I/O PROG >>  <<01549>>00338000
   RSTAP1      = RSTAP+1,                                               00340000
   RSTAP3      = RSTAP1+2,                                              00342000
   RSTAP5      = RSTAP3+2,                                              00344000
   RSTAP7      = RSTAP5+2,                                              00346000
   RSTAP8      = RSTAP7+1,                                     <<RK.00>>00348000
   RSTAP9      = RSTAP7+2,                                              00350000
   RSTAP10     = RSTAP8+2,                                     <<RK.00>>00352000
   RSTAP11     = RSTAP9+2,                                              00354000
   RSTAP13     = RSTAP11+2,                                    <<RK.00>>00356000
   RSTAT       = 7,       << REQUEST STATUS FUNCTION >>        <<00.PV>>00358000
   RSYNP       = 118,     << OFFSET TO REQ SYNDROME I/O PROG>> <<01549>>00360000
   RSYNP1      = RSYNP+1,                                               00362000
   RSYNP3      = RSYNP1+2,                                     <<01549>>00364000
   S'ADREC'UNIT= 77,      << OFFSET OF MAIN ADDRESS RECORD >>  <<01549>>00366000
   S'ADREC'CYL = 79,      << POINTER TO CYL, HEAD-SECTOR >>    <<01549>>00368000
   S'BANK      = 80,      << MAIN SET BANK ORDER >>            <<01549>>00370000
   S'BANK'VALUE= 81,      << WHICH BANK WE'RE SETTING TO >>    <<01549>>00372000
   S'CHAIN     = 84,      << WHERE CHAINED ORDERS START >>     <<01549>>00374000
   S'CHAIN'D   = S'CHAIN/2, << DOUBLE INDEX >>                 <<01549>>00376000
   S'CONF'MASK = -4,                                           <<01960>>00378000
   S'FILEMASK  = 73,      << FILE MASK/ALSO WHERE A JUMP GOES>><<01549>>00380000
   S'FILEMASK'D= S'FILEMASK/2, << DOUBLE WORD ADDRESS >>       <<01549>>00382000
   S'LOOP      = 74,      << WHERE JUMPC LOOPS BACK >>         <<01549>>00384000
   S'LOOP'BANK0= 75,      << RESET BANK 0 >>                   <<01549>>00386000
   S'NO'SEEK   = 41,      << OFFSET BEYOND SEEK ORDER 1 >>     <<01549>>00388000
   S'SEEKENABMASK=-1,                                          <<01960>>00390000
   S'SEEK'MASK = -3,                                           <<01960>>00392000
   S'SEEKVALUES= 11,      << DOUBLEWORD BEYOND SEEK LOCATIONS>><<01549>>00394000
   S'THIS'DITP = -5,                                           <<01960>>00396000
   S'THIS'UNIT = -6,                                           <<01960>>00398000
   S'THIS'UNITD= S'THIS'UNIT/2, << DOUBLE WORD ADDRESS >>      <<01549>>00400000
   S'XFER'CMD  = 83,      << READ, WRITE, RFS, INIT, ETC. >>   <<01549>>00402000
   SCOUNT      = 29,      << SECTOR COUNT >>                   <<05.PV>>00404000
   SEEK        = %001200, << SEEK CMD >>                                00406000
   SENSE       = %050000, << SENSE COMMAND - USED AS NOP >>    <<RK.00>>00408000
   SETBANK     = %014000, << SET BANK COMMAND >>               <<06.PV>>00410000
   SETWAKE     = %013000, << SET WAKEUP WHEN DRIVE AVAILABLE CMD >>     00412000
   STATTAB     =  8,      << OFFSET IN SIOP TO STATUS-2 WORDS>><<01549>>00414000
   STATTAB'    = STATTAB/2,  << DOUBLE INDEX >>                <<RK1PV>>00416000
   SUCCESSFUL  = 1,       << SUCCESSFUL COMPLETION STATUS RETURN >>     00418000
   SYSBUFA     = 17,      << SYSBUF INDEX OF DIT >>                     00420000
   SYSDB       = %1000,                                                 00422000
   SYSERROR    = %124,    << SYSTEM ERROR CODE RETURN >>                00424000
   SYSLPDT     = 8,       << DB INDEX OF LPDT POINTER >>                00426000
   SYSSBUF     = 6,       << DB INDEX OF SBUF TABLE >>                  00428000
   UNITFAILURE = %54,     << UNIT FAIL STATUS RETURN >>                 00430000
   VERIFYOP    = %003400, << VERIFY COMMAND >>                 <<01.PV>>00432000
   WAIT        = %10,     << WAIT FOR COMP. STATUS RETURN >>            00434000
   WCR         = 15,      << WORD COUNT REMAINING INDEX >>              00436000
   WRITE       = 1,       << WRITE FUNCTION >>                          00438000
   WRITEL      = 11,      << WRITE LABEL FUNCTION >>           <<04.PV>>00440000
   WRITEOP     = %004000, << DISC WRITE COMMAND >>                      00442000
   XFER'NOGOOD = %12,     << TRANSFER ERR -- MAYBE MEM PARITY>><<01549>>00444000
   XFERERROR   = %34;     << XFER ERROR STATUS RETURN >>                00446000
$INCLUDE INCLMEAS                                              <<01549>>00448000
                                                                        00450000
$INCLUDE INCLMIFT                                                       00452000
DEFINE                                                                  00454000
   ABS        = ABSOLUTE#,                                              00456000
   ASMB       = ASSEMBLE#,                                              00458000
   ATTNBIT    = (8:1)#,   << ATTN BIT IN STATUS 2 WORD >>      <<RK0PV>>00460000
   CBIT       = (CBIT':1)#,                                             00462000
   DBIT       = (0:1)#,    << RETRY DETERMINATION BIT OF QMISC >>       00464000
   DISABLE    = ASMB(SED 0)#,                                           00466000
   DRVNOTRDY  = (14:1)#,   << DRIVE NOT READY BIT OF QSTAT2 >>          00468000
   EBIT       = (2:1)#,    << ERROR BIT OF QMISC >>                     00470000
   ENABLE     = ASMB(SED 1)#,                                           00472000
   ERRCODE    = (3:5)#,    << ENCODED ERROR STATUS >>                   00474000
   FUNCTION   = (8:8)#,    << REQUEST FUNCTION CODE >>                  00476000
    HCUNIT    =(11:5)#,  << HIGHEST CONF. UNIT IN ILT FLAGS W>><<01300>>00478000
   HEAD       = LSR(8)#,   << HEAD FIELD OF DISC ADRESS >>              00480000
   MBIT       = (MBIT':1)#,                                             00482000
   QLDEVN     = (8:8)#,    << LDEV FIELD IN IOQ >>                      00484000
   QUEUEN     = (8:8)#,                                        <<01549>>00486000
   RETRY      = (8:8)#,    << RETRY COUNT FIELD OF QMISC >>             00488000
   SBIT       = (1:1)#,    << REQUEST SYNDROME BIT OF QMISC >>          00490000
   SECTOR     = (8:8)#,    << SECTOR FIELD OF DISC ADRESS >>            00492000
   SEEKCHECK  = (13:1)#,   << INVALID SEEK BIT OF STATUS-2 >>           00494000
   SEM        = (1:3)#,    << S,E, AND M BITS OF QMISC >>               00496000
   SFAIL      = (10:1)#,   << SIO FIALED TO START IN GIP >>             00498000
   SPARE      = (0:1)#,    << SPARE BIT OF STATUS-1 >>                  00500000
   SPEC       = (1:1)#,    << SPECIAL REQ. BIT OF IOQ >>                00502000
   STAT       = (8:8)#,    << I/O STATUS RETURN FIELD OF IOQ >>         00504000
   STATEF     = (12:4)#,  << STATE FIELD OF DITP WORD 0 >>     <<01549>>00506000
   SUBT       = (12:4)#,   << SUBTYPE FIELD OF LPDT >>                  00508000
   SYSBUFR    = (3:1)#,    << SYSTEM BUFFER BIT OF IOQ >>               00510000
   UNITN      = LSR(8)#,   << UNIT FIELD OF DIT >>                      00512000
   UNITF      = (11:5)#,  << UNIT FIELD OF TIO STATUS WORD >>  <<01549>>00514000
   WBIT       = (4:1)#;    << WRITING BAD TRACK BIT OF QMISC >>         00516000
                                                                        00518000
INTEGER POINTER                                                         00520000
   HEAD'TAB    = DB + %56,                                     <<01549>>00522000
   SBUF        = DB + SYSSBUF;                                          00524000
                                                                        00526000
DOUBLE POINTER                                                          00528000
   DLPDT       = DB + SYSLPDT;                                          00530000
ARRAY INITIAL(0:179) = DB :=                                   <<01549>>00532000
   %020041,          << DIT SIZE = 32, CORE RES., TYPE = 1 >>  <<01549>>00534000
         0,                                                             00536000
   %037437,           <<UNIT EXTRACT INST (ANDI %37)>>         <<01.02>>00538000
   %110000,          << 144 WORD SIO PROGRAM AREA >>           <<01549>>00540000
   << DIT >>                                                            00542000
     %040000,        << DFLAG; DISC >>                         <<01300>>00544000
           0,        << DLINK >>                                        00546000
           0,        << DIOQP >>                                        00548000
           0,        << DLDEV >>                                        00550000
           0,        << DDLTP >>                                        00552000
           0,        << DILTP >>                                        00554000
           0,        << DSTAT >>                                        00556000
           0,        << DSERR >>                                        00558000
           0,        << DMAMQ >>                                        00560000
           0,        << DMAMQT >>                                       00562000
         0,0,        << CLDA - CURRENT LOGICAL DISC ADR >>              00564000
         0,0,        << CPDA - CURRENT PHYSICAL DISC ADR >>             00566000
           0,        << CDBA - CURRENT DATA BUFFER ADR >>               00568000
           0,        << WCR - WORD COUNT REMAINING >>                   00570000
           0,        << CWC - CURRENT TRANSFER COUNT >>                 00572000
           0,        << SYSBUFA - SYSTEM BUFFER ADR >>                  00574000
           0,        << STAT1 - FIRST DISC STATUS >>                    00576000
           0,        << STAT2 - SECOND DISC STATUS >>                   00578000
         0,0,        << CEDA - CURRENT ERROR DISC ADR >>                00580000
0,0,0,0,0,0,0,       << REQUEST SYNDROME AREA >>                        00582000
           0,        << SCOUNT - SECTOR COUNT >>               <<05.PV>>00584000
         0,0,        << INITIALIZE ADDRESS >>                  <<06.PV>>00586000
   << SIO PROGRAM >>                                           <<01549>>00588000
         0,0,        << JUMP >>                                <<01549>>00590000
         0,0,        << THIS'UNIT,THIS'DITP >>                 <<01549>>00592000
         0,0,        << CONF'MASK,SEEK'MASK >>                 <<01549>>00594000
         0,0,        << GARBAGE AREA FOR NON-CONF UNITS >>     <<01549>>00596000
         0,0,        << STATTAB >>                             <<01549>>00598000
         0,0,        << STATTAB >>                             <<01549>>00600000
         0,0,        << STATTAB >>                             <<01549>>00602000
         0,0,        << STATTAB >>                             <<01549>>00604000
         0,0,        << DISC'ADDR3 >>                          <<01549>>00606000
         0,0,        << DISC'ADDR2 >>                          <<01549>>00608000
         0,0,        << DISC'ADDR1 >>                          <<01549>>00610000
   %040000,0,        << SEEK COMMAND >>          <<SEEK3>>     <<01549>>00612000
   %067776,%10,      << DISC ADRESS >>                         <<01549>>00614000
   %050000,-1,       << SENSE >>                               <<01549>>00616000
   %040000,0,        << SEEK COMMAND >>          <<SEEK2>>     <<01549>>00618000
   %067776,%10,      << DISC ADRESS >>                         <<01549>>00620000
   %050000,-1,       << SENSE >>                               <<01549>>00622000
   %040000,0,        << SEEK COMMAND >>          <<SEEK1>>     <<01549>>00624000
   %067776,%10,      << DISC ADRESS >>                         <<01549>>00626000
   %050000,-1,       << SENSE >>                               <<01549>>00628000
   %040001,%001407,  << RQST 7 >>       <<RQALL>>              <<01549>>00630000
   %077776,%10,      << RD 2 W >>                              <<01549>>00632000
   %040001,%001406,  << RQST 6 >>                              <<01549>>00634000
   %077776,%10,      << RD 2 W >>                              <<01549>>00636000
   %040001,%001405,  << RQST 5 >>                              <<01549>>00638000
   %077776,%10,      << RD 2 W >>                              <<01549>>00640000
   %040001,%001404,  << RQST 4 >>                              <<01549>>00642000
   %077776,%10,      << RD 2 W >>                              <<01549>>00644000
   %040001,%001403,  << RQST 3 >>                              <<01549>>00646000
   %077776,%10,      << RD 2 W >>                              <<01549>>00648000
   %040001,%001402,  << RQST 2 >>                              <<01549>>00650000
   %077776,%10,      << RD 2 W >>                              <<01549>>00652000
   %040001,%001401,  << RQST 1 >>                              <<01549>>00654000
   %077776,%10,      << RD 2 W >>                              <<01549>>00656000
   %040001,%001400,  << RQST 0 >>                              <<01549>>00658000
   %077776,%10,      << RD 2 W >>                              <<01549>>00660000
   %040000,0,        << FILE MASK OR JUMP ORDER >>             <<01549>>00662000
   %014000,0,        << SET BANK 0 >>                          <<01549>>00664000
   %040000,0,        << ADRESS RECORD >>                       <<01549>>00666000
   %067776,0,        << DISC ADRESS >>                         <<01549>>00668000
   %014000,0,        << SET DATA BANK # >>                     <<01549>>00670000
   %040000,0,        << SET TRANSFER DIRECTION >>              <<01549>>00672000
         0,0,        << UP TO 7 CHAINED XFER ORDERS >>         <<01549>>00674000
         0,0,                                                  <<01549>>00676000
         0,0,                                                  <<01549>>00678000
         0,0,                                                  <<01549>>00680000
         0,0,                                                  <<01549>>00682000
         0,0,                                                  <<01549>>00684000
         0,0,                                                  <<01549>>00686000
         0,0,        << LAST XFER ORDER >>                     <<01549>>00688000
         0,0,        << CONDITIONAL JUMP TO ADRESS RECORD >>   <<01549>>00690000
         0,0,        << END I/O >>                             <<01549>>00692000
         0,0,        << ADDITIONAL SPACE FOR FORMAT >>         <<01549>>00694000
         0,0,        << ADDITIONAL SPACE FOR FORMAT >>         <<01549>>00696000
         0,0,        << ADDITIONAL SPACE FOR FORMAT >>         <<01549>>00698000
         0,0,        << ADDITIONAL SPACE FOR FORMAT >>         <<01549>>00700000
         0,0,        << ADDITIONAL SPACE FOR FORMAT >>         <<01549>>00702000
         0,0,        << ADDITIONAL SPACE FOR FORMAT >>         <<01549>>00704000
         0,0,        << ADDITIONAL SPACE FOR FORMAT >>         <<01549>>00706000
   %040001,%6400,    << REQUEST SYNDROME >>                    <<01549>>00708000
   %077771,0,        << READ SYNDROME >>                       <<01549>>00710000
   %040001,0,        << REQUEST DISC STATUS >>                 <<01549>>00712000
   %077776,0,        << READ STATUS >>                         <<01549>>00714000
   %040001,%12000,   << REQUEST DISC ADRESS >>                 <<01549>>00716000
   %077776,0,        << READ DISC ADRESS >>                    <<01549>>00718000
   %050000,-1,       << SENSE/JUMP GOES HERE >>                <<01549>>00720000
   %040000,0,        << SET WAKEUP >>                          <<01549>>00722000
   %034000,-1,       << END I/O >>                             <<01549>>00724000
   %040000,0,        << RECALIBRATE ORDER >>                   <<01549>>00726000
   %030000,-1,       << END I/0 >>                             <<01549>>00728000
   %040000,%12400,   << DISC END >>                            <<01549>>00730000
   %030000,-1;       << END I/O, NO INT >>                     <<01549>>00732000
PROCEDURE CHECKINDEX(INDEX,TABLE);                                      00734000
VALUE INDEX,TABLE;                                                      00736000
INTEGER INDEX;                                                          00738000
POINTER TABLE;                                                          00740000
OPTION EXTERNAL;                                                        00742000
                                                                        00744000
PROCEDURE DCONVERT(WORD);                                               00746000
VALUE WORD;                                                             00748000
INTEGER WORD;                                                           00750000
OPTION EXTERNAL;                                                        00752000
                                                                        00754000
INTEGER PROCEDURE GETSBUF(TYPE);                                        00756000
VALUE TYPE;                                                             00758000
INTEGER TYPE;                                                           00760000
OPTION EXTERNAL;                                                        00762000
                                                                        00764000
PROCEDURE GIP;                                                 <<RK0PV>>00766000
OPTION EXTERNAL;                                                        00768000
                                                                        00770000
PROCEDURE HELP;                                                         00772000
OPTION EXTERNAL;                                                        00774000
                                                                        00776000
PROCEDURE LDEVNOTRDY(DITP);                                             00778000
VALUE DITP;                                                             00780000
POINTER DITP;                                                           00782000
OPTION EXTERNAL;                                                        00784000
                                                                        00786000
PROCEDURE SIODM(DITP,FLAGS);                                            00788000
VALUE DITP,FLAGS;                                                       00790000
POINTER DITP;                                                           00792000
LOGICAL FLAGS;                                                          00794000
OPTION EXTERNAL;                                                        00796000
                                                                        00798000
PROCEDURE RETURNSBUF(SBUFP);                                            00800000
VALUE SBUFP;                                                            00802000
INTEGER SBUFP;                                                          00804000
OPTION EXTERNAL;                                                        00806000
                                                                        00808000
PROCEDURE STARTIO(DITP,SIOP,QUEUE);                                     00810000
VALUE DITP,SIOP,QUEUE;                                                  00812000
POINTER DITP,SIOP;                                                      00814000
LOGICAL QUEUE;                                                          00816000
OPTION EXTERNAL;                                                        00818000
                                                                        00820000
PROCEDURE WRITE2(WORD);                                                 00822000
VALUE WORD;                                                             00824000
INTEGER WORD;                                                           00826000
OPTION EXTERNAL;                                                        00828000
                                                               <<01549>>00830000
PROCEDURE INIT7920(DITP);                                      <<01549>>00832000
VALUE DITP;                                                    <<01549>>00834000
INTEGER POINTER DITP;                                          <<01549>>00836000
OPTION FORWARD;                                                <<01549>>00838000
$PAGE                                                                   00840000
INTEGER PROCEDURE MHDDVR(IOQP,DITP,BANK,BUFFER,SIOP,DRTN);              00842000
VALUE IOQP,DITP,BANK,BUFFER,SIOP,DRTN;                                  00844000
INTEGER BANK,BUFFER,DRTN;                                               00846000
INTEGER POINTER IOQP,DITP,SIOP;                                         00848000
OPTION PRIVILEGED,UNCALLABLE;                                           00850000
BEGIN                                                                   00852000
                                                                        00854000
       <<------------------>>                                  <<25.00>>00856000
       <<DISC SUBTYPE TABLE>>                                  <<25.00>>00858000
       <<------------------>>                                  <<25.00>>00860000
EQUATE                                                         <<25.00>>00862000
   NUMSUBTYPES  = 6,   << NUMBER OF MOVING HEAD SUBTYPES >>    <<25.00>>00864000
   NUMENTRIES   = 4,   << NUMBER OF TABLE ENTRIES/SUBTYPE >>   <<25.00>>00866000
   SECPERTRACK  = 0,   << OFFSET TO SEC/TRACK ENTRIES >>       <<25.00>>00868000
   SECPERCYL    = 1,   << OFFSET TO SEC/CYLINDER ENTRIES >>    <<25.00>>00870000
   MAXCYLINDER  = 2,   << OFFSET TO MAX CYLINDER FOR SUBTYPE >><<25.00>>00872000
   MAXCYL'M'SECCYL = MAXCYLINDER - SECPERCYL,                  <<01549>>00874000
   SECTRK'M'MAXCYL = SECPERTRACK - MAXCYLINDER,                <<01549>>00876000
   FILEMASK     = 3;   << OFFSET TO FILEMASK ENTRIES >>        <<25.00>>00878000
   <<                                                        >><<01549>>00880000
   << Q+1  -- AD, BUFCNT                                     >><<01549>>00882000
   << Q+2  -- XD                                             >><<01549>>00884000
   << Q+3  -- INTR'UNIT                                      >><<01549>>00886000
   << Q+4  -- CXFER        DOUBLE DXFERORDER                 >><<01549>>00888000
   << Q+5  -- BUFADR       DOUBLE DXFERORDER                 >><<01549>>00890000
   << Q+6  -- ERR                                            >><<01549>>00892000
   << Q+7  -- XCNT                                           >><<01549>>00894000
   << Q+8  -- I                                              >><<01549>>00896000
   << Q+9  -- BADTRACK                                       >><<01549>>00898000
   << Q+10 -- OTHER'DITP                                     >><<01549>>00900000
   << Q+11 -- OTHER'IOQP                                     >><<01549>>00902000
   << Q+12 -- START'ADDR                                     >><<01549>>00904000
   << Q+13 -- SUBTYPE                                        >><<01549>>00906000
   << Q+14 -- FUNCT                                          >><<01549>>00908000
   << Q+15 -- SBFLG                                          >><<01549>>00910000
   << Q+16 -- UNIT                                           >><<01549>>00912000
   << Q+17 -- ILTP                                           >><<01549>>00914000
   <<                                                        >><<01549>>00916000
                                                               <<25.00>>00918000
INTEGER                                                                 00920000
   AD           = Q+1,  << ADRESS DELTA >>                              00922000
   BUFADR       = Q+5,  << ABSOLUTE BUFFER ADRESS >>                    00924000
   BUFCNT       = Q+1,  << COUNT CHECK FOR REQUEST SYND. >>             00926000
   CXFER        = Q+4,  << CHAINED XFER ORDER >>                        00928000
   ERR          = Q+6,  << DISC ENCODED ERROR STATUS >>                 00930000
   FUNCT        = Q+14, << REQUEST FUNCTION CODE >>            <<01549>>00932000
   I            = Q+8,                                                  00934000
   INTR'UNIT    = Q+3,                                         <<01549>>00936000
   MSTATE       = MHDDVR,                                               00938000
   RSTATUS      = Q-1,   << PCAL RETURN STATUS >>                       00940000
   S0           = S-0,                                                  00942000
   S2           = S-2,                                                  00944000
   S3           = S-3,                                         <<01549>>00946000
   START'ADDR   = Q+12,   << WHERE WE START XFER PROG ( + 1)>> <<01549>>00948000
   SUBTYPE      = Q+13, << DEVICE SUBTYPE >>                   <<01549>>00950000
   UNIT         = Q+16, << DEVICE UNIT # >>                    <<01549>>00952000
   X            = X,                                                    00954000
   XCNT         = Q+7,  << XFER COUNT >>                                00956000
   XD           = Q+2;  << XFER DELTA >>                                00958000
                                                                        00960000
DOUBLE                                                                  00962000
   DXFERORDER   = CXFER;                                                00964000
                                                                        00966000
DOUBLE POINTER                                                          00968000
   DPS0         = S-0,                                         <<01549>>00970000
   DDITP        = DITP,                                                 00972000
   DIOQP        = IOQP,                                                 00974000
   DOTHER'IOQP  = Q+11,                                        <<01549>>00976000
   DSIOP        = SIOP;                                                 00978000
                                                                        00980000
LOGICAL                                                                 00982000
   SBFLG        = Q+15, << SYSTEM BUFFER FLAG >>               <<01549>>00984000
   LS0          = S-0,                                         <<00.06>>00986000
   LSM1         = S-1;                                                  00988000
                                                                        00990000
LOGICAL POINTER                                                         00992000
   LDITP        = DITP,                                                 00994000
   LIOQP        = IOQP,                                                 00996000
   LSIOP        = SIOP;                                                 00998000
                                                                        01000000
INTEGER POINTER                                                         01002000
   BADTRACK     = Q+9,                                                  01004000
   ILTP         = Q+17,                                        <<01549>>01006000
   OTHER'DITP   = Q+10,                                        <<01549>>01008000
   OTHER'IOQP   = DOTHER'IOQP,                                 <<01549>>01010000
   PS0          = S-0,                                         <<01549>>01012000
   PS1          = S-1;                                                  01014000
                                                                        01016000
LOGICAL POINTER                                                <<01115>>01018000
   LPDTP=8;    <<LOGICAL-PHYSICAL DEVICE TABLE>>               <<01115>>01020000
                                                               <<01115>>01022000
INTEGER ARRAY    << STARTING W/ 16 AVOIDS SUBTYPES 0-3. >>     <<25.00>>01024000
   DISCINFO (16:15 + NUMSUBTYPES*NUMENTRIES) = PB :=           <<25.00>>01026000
     48,  96, 410, %7426, << STYPE 4, 7905, REMOVABLE CART. >> <<25.00>>01028000
     48,  48, 410, %7425, << STYPE 5, 7905, FIXED PLATTER >>   <<25.00>>01030000
     48, 144, 410, %7427, << STYPE 6, 7905, BOTH PLATTERS >>   <<25.00>>01032000
     48, 144, 410, %7427, << STYPE 7, 7905, FH DISC REPLCMNT >><<25.00>>01034000
     48, 240, 822, %7427, << STYPE 8, 7920 >>                  <<25.00>>01036000
     64, 576, 822, %7427; << STYPE 9, 7925 >>                  <<25.00>>01038000
                                                               <<*****>>01040000
DEFINE HELPER = ASMB(RSW);                                     <<*****>>01042000
      IF TOS.(2:1) THEN HELP#;                                 <<01549>>01044000
                                                               <<*****>>01046000
                                                                        01048000
DEFINE DITLDEV=3).(8:8#;                                       <<01115>>01050000
DEFINE FOREIGN=(LPDTP(LDITP(DITLDEV)&LSL(1)+1).(10:2)=3)#;     <<01115>>01052000
$PAGE "SUBROUTINES"                                            <<01549>>01054000
DOUBLE SUBROUTINE CONVERTADR;                                           01056000
BEGIN << THIS ROUTINE CONVERTS A PHYSICAL TO LOGICAL DISC ADR. >>       01058000
   TOS := DDITP(X); << DIT INDEX PASSED IN X REG. >>                    01060000
   TOS := S0&HEAD;                                                      01062000
   IF SUBTYPE = 5 THEN TOS := TOS - 2; << REMOVE HEAD OFFSET >>         01064000
   TOS := TOS * DISCINFO (SUBTYPE*NUMENTRIES + SECPERTRACK);   <<25.00>>01066000
   ASMB(XCH);                                                           01068000
   TOS := TOS.SECTOR;                                                   01070000
   ASMB(ADD,ZERO;XCH,CAB);                                              01072000
   TOS := DISCINFO (SUBTYPE*NUMENTRIES + SECPERCYL);           <<25.00>>01074000
   ASMB(LMPY,DADD; STD S-4);                                            01076000
END;                                                                    01078000
                                                                        01080000
                                                                        01082000
INTEGER SUBROUTINE CALCSBUFADR(CNT);                                    01084000
VALUE CNT;                                                              01086000
INTEGER CNT;                                                            01088000
BEGIN                                                                   01090000
   CALCSBUFADR := DITP(CDBA); << GET FIRST ABS. SYSTEM BUFFER ADRESS >> 01092000
   WHILE CNT >= 128 DO                                                  01094000
   BEGIN << STOMP THROUGH THE BUFFERS >>                                01096000
      CHECKINDEX(ABS(S2-1),SBUF); << INDEX VALID ? >>                   01098000
      CALCSBUFADR := ABS(X) + @SBUF + SYSDB; << GET NEXT SBUF ADRESS >> 01100000
      CNT := CNT - 128;                                                 01102000
   END;                                                                 01104000
END;                                                                    01106000
SUBROUTINE REQSTATSIO;                                         <<00.PV>>01108000
BEGIN                                                          <<00.PV>>01110000
   SIOP(RSTAP1) := REQSTAT + UNIT; << REQ UNIT STATUS >>       <<00.PV>>01112000
   TOS := @DITP(DSTAT1) + SYSDB;                               <<00.PV>>01114000
   SIOP(RSTAP3) := S0; << STATUS STORAGE ADRESS >>             <<00.PV>>01116000
   SIOP(RSTAP7) := TOS + 2; << DISC ADRESS STORAGE >>          <<00.PV>>01118000
   SIOP(RSTAP8) := SENSE; << A JUMP MAY GO HERE >>             <<RK.00>>01120000
   SIOP(RSTAP11):= SETWAKE + UNIT; << REQUEST WAKEUP CMD >>    <<RK.00>>01122000
   << THE SET WAKEUP COMMAND INSURES THE CORRECT UNIT >>       <<00.PV>>01124000
   << NUMBER IS RETURNED IN THE TIO STAT AFTER INTERRUPT >>    <<00.PV>>01126000
   SIOP(RSTAP13):= -1;  << SIO END ORDER STATUS LOCATION >>    <<RK.00>>01128000
END;                                                           <<00.PV>>01130000
                                                               <<01549>>01132000
SUBROUTINE TOS'LOG'TO'PHY; << REALLY DOUBLE SUBROUTINE >>      <<01549>>01134000
<< VALUE ADDRESS , SUBTYPE; >>                                 <<01549>>01136000
<< DOUBLE ADDRESS; ( IN TOS WHEN CALLED ) >>                   <<01549>>01138000
<< INTEGER SUBTYPE; ( IN X WHEN CALLED ) >>                    <<01549>>01140000
                                                               <<01549>>01142000
BEGIN                                                          <<01549>>01144000
   ASMB(CAB,CAB);  <<PUTS LOGICAL ADDRESS ON TOS>>             <<01549>>01146000
   TOS := DISCINFO (X*NUMENTRIES + SECPERCYL);                 <<01549>>01148000
   ASMB(LDIV); << COMPUTE DISC ADRESS >>                       <<01549>>01150000
   IF LSM1 > LOGICAL (DISCINFO (X + MAXCYL'M'SECCYL)) OR       <<01549>>01152000
     OVERFLOW THEN                   <<CYLAD TOO BIG>>         <<01549>>01154000
      BEGIN                                                    <<01549>>01156000
      ASMB(DDEL);                                              <<01549>>01158000
      TOS := -1D;                                              <<01549>>01160000
      END                                                      <<01549>>01162000
   ELSE                                                        <<01549>>01164000
      BEGIN                                                    <<01549>>01166000
      TOS := DISCINFO (X + SECTRK'M'MAXCYL);                   <<01549>>01168000
      ASMB(DIV,XCH);                                           <<01549>>01170000
      IF (X/NUMENTRIES)=5 THEN TOS := TOS + 2;<<ADD HEAD OFFSET<<01549>>01172000
      TOS := TOS&LSL(8) + TOS;                                 <<01549>>01174000
      END;                                                     <<01549>>01176000
   ASMB(CAB);  <<PUT RETURN ADDRESS ON TOS FOR SXIT>>          <<01549>>01178000
END;                                                           <<01549>>01180000
                                                               <<01549>>01182000
SUBROUTINE ADD'SEEK(UNIT,PHY'ADR);                             <<01549>>01184000
VALUE UNIT,PHY'ADR;                                            <<01549>>01186000
DOUBLE PHY'ADR;                                                <<01549>>01188000
INTEGER UNIT;                                                  <<01549>>01190000
BEGIN                                                          <<01549>>01192000
   I := I + 1;                                                 <<01549>>01194000
   START'ADDR := START'ADDR - 6;                               <<01549>>01196000
   SIOP(START'ADDR) := UNIT + SEEK;                            <<01549>>01198000
   SIOP(X:=X+4) := -1;  <<SET SENSE FIELD >>                   <<01549>>01200000
   DSIOP(S'SEEKVALUES - I) := PHY'ADR;                         <<01549>>01202000
END;                                                           <<01549>>01204000
$PAGE                                                                   01206000
$PAGE "VARIABLE INITIALIZATION AND NEW REQUESTS"               <<01549>>01208000
   ASMB(ADDS 12); << INITIALIZE LOCAL VARIABLES >>             <<01549>>01210000
   TOS := DLPDT(IOQP(QLDEV).QLDEVN);                                    01212000
   DELB;                                                                01214000
   TOS := TOS.SUBT; << DEVICE SUBTYPE >>                                01216000
   TOS := IOQP(QFUNC).FUNCTION; << REQUEST FUNCTION >>                  01218000
   TOS := IOQP.SYSBUFR;  << SYSBUF FLAG >>                              01220000
   TOS := DITP(DLDEV)&UNITN; << DISC UNIT NUMBER >>                     01222000
   TOS := DITP(ILTPLOC);  << POINTER TO ILT >>                 <<RH.PV>>01224000
   IF SIOP(S'CONF'MASK) = 0 THEN INIT7920(DITP);               <<01549>>01226000
                                                                        01228000
                                                               <<02039>>01230000
                                                               <<*****>>01232000
   IF MSTATE = 2 THEN                                                   01234000
   BEGIN << NEW REQUEST >>                                              01236000
      TOS := IOQP(QWBCT); << DETERMINE XFER COUNT >>                    01238000
      IF < THEN                                                         01240000
      BEGIN << COUNT IN BYTES >>                                        01242000
         ASMB(DUP);                                                     01244000
         IF TOS THEN IOQP(X) := IOQP(X) - 1; << ROUND UP CNT IF ODD >>  01246000
         TOS := -(TOS&ASR(1)); << CONVERT TO WORDS >>                   01248000
      END;                                                              01250000
      DITP(WCR) := TOS; << XFER COUNT >>                                01252000
      DDITP(CLDA) := DIOQP(DADR); << DISC ADRESS >>                     01254000
      DITP(CDBA) := BUFFER; << SET CURRENT BUFFER ADRESS >>             01256000
      IF FUNCT > READSPD THEN                                  <<07.PV>>01258000
      BEGIN                                                             01260000
INVALIDFUNC:                                                            01262000
         TOS := INVFUNC;                                                01264000
         GO TO BADEND;                                                  01266000
      END;                                                              01268000
      IF SBFLG AND ( DITP(WCR) > 1024 OR FUNCT >= FORMAT )     <<01549>>01270000
         THEN GOTO INVALIDFUNC;                                <<01549>>01272000
      TOS := 0; << RESET QMISC >>                                       01274000
      X := FUNCT; << SWITCH ON REQUEST TYPE >>                          01276000
      ASMB(LOAD SWT,X; ADAX; BR SWT,X;                                  01278000
SWT:  CON DOXFER;    CON DOXFER;    CON GOODEND;   CON GOODEND;         01280000
      CON GOODEND;   CON FILLZERO;  CON FILLBLANK;             <<00.PV>>01282000
      CON REQSTATUS; CON DOXFER;    CON DOXFER;                <<02.PV>>01284000
      CON DOXFER;    CON DOXFER;    CON DOXFER);               <<07.PV>>01286000
      HELP; << HELP CALL NEEDED FOR BREAKPOINTS >>                      01288000
   END;                                                                 01290000
                                                                        01292000
$PAGE "CONTINUATOR EVALUATION OF INTERRUPT STATUS"             <<01549>>01294000
   << CONTINUATOR SECTION >>                                            01296000
                                                               <<*****>>01298000
   IF LIOQP.SFAIL THEN GO TO SIOFAILURE; << GIP FAILED TO START I/O >>  01300000
   TOS := IOQP(QMISC); << QMISC STAYS ON TOS THROUGHOUT DRIVER >>       01302000
   TOS := DITP(DSTAT);                                         <<01549>>01304000
   IF S0 = -1 THEN                                             <<01549>>01306000
      INTR'UNIT := UNIT   << POWER FAIL >>                     <<01549>>01308000
   ELSE                                                        <<01549>>01310000
      INTR'UNIT := S0.UNITF;                                   <<01549>>01312000
   X := ERR := TOS.ERRCODE;                                    <<01549>>01314000
   IF <> THEN                                                  <<01549>>01316000
      BEGIN   << SOME KIND OF ERROR STATUS >>                  <<01549>>01318000
      IF FUNCT = RSTAT AND X = DRIVE'AVAIL THEN                <<01549>>01320000
         ERR := 0                                              <<01549>>01322000
      ELSE                                                     <<01549>>01324000
         IF X = XFER'NOGOOD OR X = OVERRUN THEN                <<01549>>01326000
            INTR'UNIT := UNIT;                                 <<01549>>01328000
      IF INTR'UNIT <> UNIT  AND X = DRIVE'NRDY THEN            <<01549>>01330000
         BEGIN << EXTRA SEEK ABORTED >>                        <<01549>>01332000
                                                               <<01549>>01334000
         TOS := SIOP(S'SEEK'MASK);                             <<01549>>01336000
         X := INTR'UNIT;                                       <<01549>>01338000
         ASMB(TRBC 0,X); <<RESET SEEK BIT>>                    <<01549>>01340000
         IF = THEN HELP;        <<*****>>                      <<01549>>01342000
         SIOP(S'SEEK'MASK) := TOS;                             <<01549>>01344000
                                                               <<01549>>01346000
         TOS := ABS(DRTN&LSL(2)) - SYSDB;                      <<01549>>01348000
         IF S0 > @SIOP AND S0 < @SIOP(S'NO'SEEK) THEN          <<01549>>01350000
            GOTO STARTIOPROG                                   <<01549>>01352000
               ELSE DEL;   << PROCESS AS AN ERROR >>           <<01549>>01354000
         END;                                                  <<01549>>01356000
      END;                                                     <<01549>>01358000
                                                               <<01549>>01360000
                                                               <<01549>>01362000
   IF ERR <> 0 AND (LS0 LAND %60000)=0 THEN                    <<01549>>01364000
   BEGIN << HAD AN ERROR >>                                             01366000
      REQSTATSIO;   << INITIALIZE SIO PROGRAM >>               <<00.PV>>01368000
      IF ERR = CDERR THEN                                               01370000
      BEGIN << DO REQUEST SYNDROME ON CORRECTABLE DATA ERROR >>         01372000
         SIOP(RSYNP3) := @DITP(22) + SYSDB;                             01374000
         TOS.SBIT := 1;                                                 01376000
         TOS := @SIOP(RSYNP);                                           01378000
         GO TO STARTIOPROG;                                             01380000
      END;                                                              01382000
      TOS.EBIT := 1;                                                    01384000
      TOS := @SIOP(RSTAP);                                              01386000
      GO TO STARTIOPROG;                                                01388000
   END;                                                                 01390000
                                                                        01392000
                                                               <<01549>>01394000
<< AT THIS POINT, IF THERE ARE NO ERRORS, WE DROP TO CONTXFER>><<01549>>01396000
                                                               <<01549>>01398000
$PAGE "SYNDROME PROCESSING -- CORRECTIBLE DATA ERRORS"         <<01549>>01400000
   TOS.SBIT := 0;                                                       01402000
   IF <> THEN                                                           01404000
   BEGIN << COMPLETED REQUEST SYNDROME >>                               01406000
      TOS := DITP(22).ERRCODE;                                          01408000
      TOS := DITP(23);                                                  01410000
      TOS := DITP(24);                                                  01412000
      DDITP(CEDA) := TOS; << PHYSICAL DISC ADRESS OF ERROR >>           01414000
      IF TOS = CDERR AND ( FUNCT=READ OR FUNCT=READSPD )  THEN <<RK2PV>>01416000
      BEGIN << ERROR IS CORRECTABLE >>                                  01418000
         TOS := CONVERTADR - DDITP(CLDA); << RELATIVE SECTOR CNT >>     01420000
         XCNT := TOS&LSL(7); << RELATIVE XFER COUNT >>                  01422000
         I := TOS; << ZERO I >>                                         01424000
         IF SBFLG THEN BUFADR := CALCSBUFADR(XCNT) << SYSTEM BUFFERS >> 01426000
         ELSE BUFADR := DITP(CDBA) + XCNT; << DATA SEG >>               01428000
         BUFADR := BUFADR + DITP(25); << DATA OFFSET IN SECTOR >>       01430000
         BUFCNT := DITP(CWC) - XCNT - DITP(25); << ADRESS FENCE >>      01432000
         DO << CORRECT THE DATA ERROR IN MEMORY AND CONTINUE XFER >>    01434000
            IF 0 <= (DITP(25) + I) <= 127 AND (BUFCNT - I) > 0 THEN     01436000
            BEGIN                                                       01438000
               TOS := BANK;                                             01440000
               TOS := BUFADR + I;                                       01442000
               ASMB(LSEA);                                              01444000
               TOS := TOS XOR LDITP(26+I);                              01446000
               ASMB(SSEA);                                              01448000
               DDEL;                                                    01450000
            END                                                         01452000
         UNTIL (I:=I+1) >= 3;                                           01454000
         DITP(CWC) := XCNT + 128;                                       01456000
         GO TO CONTXFER;                                                01458000
      END;                                                              01460000
      DITP(DSTAT1) := DITP(22); << SET ERROR STATUS FOR EXAM >>         01462000
      TOS.EBIT := 1; << SET E BIT TO GET INTO ERROR ANALYSIS >>         01464000
   END;                                                                 01466000
                                                                        01468000
$PAGE "ERROR PROCESSING"                                       <<01549>>01470000
   TOS.EBIT := 0;                                                       01472000
   IF <> THEN                                                           01474000
   BEGIN << ERROR STATUS COMPLETION >>                                  01476000
     ERR := DITP(DSTAT1).ERRCODE;                                       01478000
     DITP(DSERR) := [8/5,8/DSTAT1]; <<SET LOG COUNT & INDEX>>  <<01341>>01480000
     IF ERR = DRIVE'ERROR AND LDITP(DSTAT2).DRVNOTRDY THEN     <<01549>>01482000
     BEGIN << DRIVE NOT READY >>                                        01484000
        LDEVNOTRDY(DITP); << SEND NOT READY MESSAGE TO CONSOLE >>       01486000
        TOS := WAIT;                                                    01488000
        TOS := 7;                                                       01490000
        GO TO CHECKSBUF;                                                01492000
     END;                                                               01494000
     IF ERR = 7 THEN                                           <<02874>>01496000
     BEGIN << CYLINDER MISCOMPARE ERROR >>                              01500000
        TOS.CBIT := 1;                                                  01502000
        IF = THEN                                                       01504000
        BEGIN << TRY A RECALIBRATE >>                                   01506000
           DITP(CURCYL) := 0; << CYL # IS 0 >>                          01520000
           SIOP(RECALP1) := RECALIBRATE + UNIT;                         01522000
           TOS := @SIOP(RECALP);                                        01524000
           GO TO STARTIOPROG;                                           01526000
        END;                                                            01528000
     END;                                                               01530000
                                                               <<01549>>01532000
<< EVERYONE >>                                                 <<01549>>01534000
<< DESERVES >>                                                 <<01549>>01536000
                                                               <<01549>>01538000
     TOS.DBIT := 1; << SET RETRY DETERMINATION >>                       01540000
     IF = THEN GO TO DOXFER; << TRY ONCE MORE >>                        01542000
                                                               <<01549>>01544000
<<   TWO    >>                                                 <<01549>>01546000
<< CHANCES  >>                                                 <<01549>>01548000
                                                                        01550000
$PAGE "ERROR PROCESSING -- SECOND TRY FAILED"                  <<01549>>01552000
     << ERROR CANNOT BE RECOVERED >>                                    01554000
                                                                        01556000
     IF FUNCT = READSPD OR FUNCT = FORMAT THEN                 <<RK2PV>>01558000
     IF (%7<=ERR<=%11) OR (%17<=ERR<=%21) THEN                 <<07.PV>>01560000
     BEGIN                                                     <<07.PV>>01562000
          DITP(DSERR) := 0;  <<FOR SIODM - DON'T LOG AS ERROR>><<RH.PV>>01564000
          TOS := (ERR & LSL(3)) + 4;  << RETURN ERROR >>       <<07.PV>>01566000
          GO TO BADEND;                                        <<07.PV>>01568000
     END;                                                      <<07.PV>>01570000
                                                               <<07.PV>>01572000
     IF 7 <= ERR <= %11 THEN                                            01574000
     IF FOREIGN THEN GO TO DISCXFER                            <<01115>>01576000
     ELSE                                                      <<01115>>01578000
     BEGIN << TRACK SPECIFIC ERROR >>                                   01580000
        TOS.DBIT := 0; << RESET D BIT FOR TRACK MAP >>                  01582000
        TOS.MBIT := 1;                                                  01584000
        IF <> THEN GO TO DISCXFER; << ERROR ON MAP XFER >>              01586000
        TOS := DITP(SYSBUFA);                                           01588000
        IF = THEN                                                       01590000
        BEGIN << GET A SYSTEM BUFFER >>                                 01592000
           TOS := GETSBUF(1); << GET A BUFFER >>                        01594000
           ASMB(DELB,DUP);                                              01596000
           IF = THEN GO TO DISCXFER; << NO MORE BUFFERS >>              01598000
           DITP(X) := TOS;                                              01600000
        END;                                                            01602000
        DITP(CDBA) := TOS + SYSDB; << SET BUFFER ADRESS >>              01604000
        ASMB(DZRO,INCA); << DOUBLE ONE >>                               01606000
        DDITP(CLDA) := TOS;                                             01608000
        DITP(WCR) := 128;                                               01610000
        FUNCT := READ; << SET UP XFER OF TRK MAP >>                     01612000
        BANK := 0; << ZERO BANK FOR SYSBUF XFER >>                      01614000
        GO TO DOXFER;                                                   01616000
     END;                                                               01618000
     IF ERR = %23 AND LDITP(DSTAT2).SEEKCHECK                           01620000
     OR ERR = %20 THEN                                                  01622000
     BEGIN << INVALID DISC ADRESS >>                                    01624000
BADDSKADR:                                                              01626000
        TOS := INVDSKADR;                                               01628000
BADEND:                                                                 01630000
        IOQP(QWBCT) := 0;                                               01632000
        TOS := 5;                                                       01634000
        GO TO CHECKSBUF;                                                01636000
     END;                                                               01638000
     IF ERR = %12 OR ERR = %16 THEN                                     01640000
     BEGIN << TRANSFER ERROR >>                                         01642000
        TOS := XFERERROR;                                               01644000
        GO TO BADEND;                                                   01646000
     END;                                                               01648000
UNITFAIL:                                                               01650000
     TOS := UNITFAILURE;                                                01652000
     GO TO BADEND;                                                      01654000
   END;                                                                 01656000
                                                                        01658000
$PAGE "TRACK MAP PROCESSING"                                   <<01549>>01660000
   ASMB(TBC MBIT');                                                     01662000
   IF <> THEN                                                           01664000
   BEGIN << ENTRING BAD TRACK INTO BAD TRACK TABLE >>                   01666000
      TOS.WBIT := 1;                                                    01668000
      IF <> THEN                                                        01670000
      BEGIN << TRACK MAP COMPLETED >>                                   01672000
DISCXFER:                                                               01674000
         TOS := DSCXFRERR;                                              01676000
         GO TO BADEND;                                                  01678000
      END;                                                              01680000
      @BADTRACK := DITP(SYSBUFA);                                       01682000
      IF BADTRACK >= 120 THEN GO TO DISCXFER; << TABLE FULL >>          01684000
      X := CEDA;                                                        01686000
      TOS := CONVERTADR;                                                01688000
      TOS := DISCINFO (SUBTYPE*NUMENTRIES + SECPERTRACK);      <<25.00>>01690000
      ASMB(LDIV,DEL);                                                   01692000
      TOS := TOS&LSL(2);                                                01694000
      IF LDITP(DSTAT1).SPARE THEN TOS := TOS + 1;                       01696000
      << SET ALTERNATE TRACK BIT >>                                     01698000
      X := 0;                                                           01700000
      WHILE X < BADTRACK DO                                             01702000
      BEGIN << IS TRACK ALREADY IN THE TABLE >>                         01704000
         ASMB(DUP,INCX);                                                01706000
         IF TOS = BADTRACK(X) THEN GO TO DISCXFER;                      01708000
         << ITS ALREADY IN THE TABLE >>                                 01710000
      END;                                                              01712000
      BADTRACK := BADTRACK + 1; << INC TRACK COUNT >>                   01714000
      BADTRACK(X:=X+1) := TOS; << ENTER TRACK >>                        01716000
      FUNCT := WRITE;                                                   01718000
      BANK := 0;                                                        01720000
      GO TO DOXFER;                                                     01722000
   END;                                                                 01724000
                                                                        01726000
$PAGE "CONTINUATION / CLEANUP OF TRANSFERS"                    <<01549>>01728000
CONTXFER:                                                               01730000
   TOS := DITP(WCR) - DITP(CWC);                                        01732000
   IF <= THEN                                                           01734000
   BEGIN << XFER COMPLETE >>                                            01736000
      IF FUNCT = 7 THEN                                        <<RK.00>>01738000
         BEGIN                                                 <<RK.00>>01740000
            TOS:=BANK;                                         <<RK.00>>01742000
            TOS:=BUFFER;                                       <<RK.00>>01744000
            TOS:=0;                                            <<RK.00>>01746000
            TOS:=@DITP(DSTAT1)+SYSDB;                          <<RK.00>>01748000
            TOS:=DITP(CWC);                                    <<RK.00>>01750000
           ASMB(MABS 5);                                       <<RK.00>>01752000
         END;                                                  <<RK.00>>01754000
      TOS := @SIOP(STATTAB);                                   <<01549>>01756000
      TOS := 0;  << WILL BE ATTN'BITS >>                       <<01549>>01758000
      X := -1;                                                 <<01549>>01760000
      WHILE (X:=X+1) <= 7 DO                                   <<01549>>01762000
        BEGIN                                                  <<01549>>01764000
        TOS := PS1(X);                                         <<01549>>01766000
        IF TOS.ATTNBIT THEN                                    <<01549>>01768000
           ASMB(TSBC 0,X);                                     <<01549>>01770000
        END;                                                   <<01549>>01772000
      PS1(-1) := S0;  << LEAVE A COPY FOR DUMPS >>             <<01549>>01774000
      TOS := TOS LAND LSIOP(S'CONF'MASK)                       <<01549>>01776000
             LAND NOT(LSIOP(S'SEEK'MASK));                     <<01549>>01778000
      ASMB(DDEL);  << GET RID OF @SIOP(STATAB) AND TOS >>      <<01549>>01780000
      IF <> THEN                                               <<01549>>01782000
         BEGIN                                                 <<RK0PV>>01784000
         SIOP(1) := @SIOP(ALLOWPOLL) + SYSDB;                  <<RK0PV>>01786000
         SIOP(ALLOWPOLL+3) := %377;                            <<RK0PV>>01788000
         DISABLE;                                              <<RK0PV>>01790000
         DITP.STATEF := %15;                                   <<02874>>01792000
         STARTIO(DITP,SIOP,TRUE);                              <<RK0PV>>01794000
         IF > THEN GOTO SIOFAILURE;                            <<RK0PV>>01796000
         RSTATUS.(1:1) := 0;  << MAKE SURE WE RETURN DISABLED>><<RK0PV>>01798000
                              << SO THAT STATE GETS STORED,IN>><<RK0PV>>01800000
                              << CASE WE'RE NOW OFF THE ICS  >><<RK0PV>>01802000
         TOS := SUCCESSFUL;                                    <<02874>>01804000
         TOS := %15; << RETURN STATE >>                        <<RK0PV>>01806000
         GOTO CHECKSBUF;                                       <<RK0PV>>01808000
         END;                                                  <<RK0PV>>01810000
GOODEND:                                                                01812000
      TOS := SUCCESSFUL;                                                01814000
      TOS := %5;                                                        01816000
CHECKSBUF:                                                              01818000
      TOS := DITP(SYSBUFA);                                             01820000
      IF <> THEN                                                        01822000
      BEGIN                                                             01824000
         RETURNSBUF(*);                                                 01826000
         DITP(X) := 0;                                                  01828000
      END ELSE DEL;                                                     01830000
      DSIOP(S'THIS'UNITD) := 0D;  <<RESET OWNERSHIP>>          <<01549>>01832000
      TOS := SIOP(S'SEEK'MASK);                                <<01549>>01834000
      X := UNIT;                                               <<01549>>01836000
      ASMB(TRBC 0,X);                                          <<01549>>01838000
      SIOP(S'SEEK'MASK) := TOS; <<RESET SEEK-IN-PROGRESS>>     <<01549>>01840000
      GO TO EXIT;                                                       01842000
   END;                                                                 01844000
                                                               <<01549>>01846000
<<                  >>                                         <<01549>>01848000
<< NOT DONE YET !!! >>                                         <<01549>>01850000
<<                  >>                                         <<01549>>01852000
                                                               <<01549>>01854000
   DITP(WCR) := TOS; << SET REMAINING WORD COUNT >>                     01856000
   IF FUNCT <= WRITE THEN                                               01858000
   IF SBFLG THEN DITP(CDBA) := CALCSBUFADR(DITP(CWC)) << SYS BUF >>     01860000
   ELSE DITP(X) := DITP(CWC) + DITP(CDBA); << DATA SEG >>               01862000
   TOS := DITP(CWC)&LSR(7);                                             01864000
   ASMB(ZERO,XCH); << UPDATE DISC ADRESS >>                             01866000
   DDITP(X) := TOS + DDITP(CLDA);                                       01868000
                                                               <<01549>>01870000
<<                       >>                                    <<01549>>01872000
<< DROP DOWN INTO DOXFER >>                                    <<01549>>01874000
<<                       >>                                    <<01549>>01876000
                                                                        01878000
$PAGE "BUILD A DATA TRANSFER PROGRAM -- CALCULATE SEEKS "      <<01549>>01880000
   << QMISC MUST BE ON TOS HERE >>                                      01882000
DOXFER: << THIS SECTION BUILDS AND STARTS AN I/O PROG >>                01884000
   TOS := DDITP(CLDA);                                                  01886000
   IF = AND (WRITE<=FUNCT<=RSTAT)                              <<01115>>01888000
      AND NOT FOREIGN <<NOT FOREIGN>>                          <<01115>>01890000
      THEN GO TO BADDSKADR;                                    <<01115>>01892000
   << WRITE TO SECTOR ZERO IS A NO-NO >>                                01894000
   X := SUBTYPE;  << FOR TOS'LOG'TO'PHY >>                     <<01549>>01896000
   TOS'LOG'TO'PHY; << TRANSFORM TOS TO A PHYSICAL ADDRESS >>   <<01549>>01898000
   ASMB(DTST); IF < THEN GOTO BADDSKADR; << OVERFLOW >>        <<01549>>01900000
   DDITP(CPDA) := TOS; << CURRENT PHYSICAL DISC ADDRESS >>     <<01549>>01902000
   I := 0;                                                     <<01549>>01904000
   START'ADDR := S'NO'SEEK;                                    <<01549>>01906000
   TOS := SIOP(S'SEEK'MASK);                                   <<01549>>01908000
   X := UNIT;                                                  <<01549>>01910000
   ASMB(TSBC 0,X);                                             <<01549>>01912000
   IF = THEN                                                   <<01549>>01914000
      BEGIN                                                    <<01549>>01916000
      ADD'SEEK(X,DDITP(CPDA));                                 <<01549>>01918000
      END;                                                     <<01549>>01920000
   DISABLE;                                                    <<01549>>01922000
   @OTHER'DITP := HEAD'TAB(ILTP(IQUEUE).QUEUEN);               <<01549>>01924000
   WHILE I < 3 AND @OTHER'DITP > 0 DO                          <<01549>>01926000
      BEGIN                                                    <<01549>>01928000
      @OTHER'IOQP := OTHER'DITP(DITIOQP);<<IOQP OF CHAINED DIT><<01549>>01930000
      IF <> AND OTHER'IOQP(QFUNC).FUNCTION <=1 <<RD OR WR>>    <<01785>>01932000
      AND OTHER'IOQP(QWBCT)<>0 THEN                            <<01785>>01934000
         BEGIN                                                 <<01549>>01936000
         X := OTHER'DITP(DLDEV)&UNITN;                         <<01549>>01938000
         ASMB(TSBC 0,X);                                       <<02874>>01940000
         IF = THEN    << NO SEEK YET >>                        <<01549>>01942000
            BEGIN                                              <<01549>>01944000
            TOS:=SIOP(S'SEEKENABMASK);                         <<01960>>01946000
            X:=OTHER'DITP(DLDEV)&UNITN;                        <<01845>>01948000
            ASMB(TSBC 0,X;DEL);                                <<01845>>01950000
            IF <> THEN                                         <<01845>>01952000
            BEGIN <<SEEK-AHEAD ENABLED FOR THIS DEVICE>>       <<01845>>01954000
            TOS := X;  <<PUSH UNIT FOR LATER CALL TO ADD'SEEK>><<01549>>01962000
            TOS := DOTHER'IOQP(DADR);  <<DISC ADDRESS>>        <<01549>>01964000
            X := OTHER'IOQP(QLDEV).QLDEVN;                     <<01549>>01966000
            TOS := DLPDT(X);                                   <<01549>>01968000
            ASMB(DELB);                                        <<01549>>01970000
            X := TOS.SUBT;  <<X := SUBTYPE FOR TOS'LOG'TO'PHY>><<01549>>01972000
            TOS'LOG'TO'PHY; <<TRANSFORM TOS TO PHYSICAL ADDR>> <<01549>>01974000
            ASMB(DTST);                                        <<01549>>01976000
            IF < THEN ASMB(DDEL,DZRO); << ILLEGAL ADDRESS >>   <<01549>>01978000
            ADD'SEEK(*,*);                                     <<01549>>01980000
            IF GCLASSENABLEDMASK.CLASS0 THEN                   <<01549>>01982000
               BEGIN  <<MEASURE ISSUE OF PRE-SEEK>>            <<01549>>01984000
               TOS:=MEASSTATXDSBANK;                           <<01549>>01986000
               TOS:=MEASSTATXDSBASE;                           <<01549>>01988000
               TOS:=TOS+C0SUB0'SEGRELOFF+C'OVLAPSEEKISSUED;    <<01549>>01990000
               ASMB(LSEA);                                     <<01549>>01992000
               TOS:=TOS+1;                                     <<01549>>01994000
               ASMB(SSEA;DDEL);                                <<01549>>01996000
               END;                                            <<01549>>01998000
            END;                                               <<01845>>02000000
            END;                                               <<01549>>02002000
         END;                                                  <<01549>>02004000
      @OTHER'DITP := OTHER'DITP(DLINK);                        <<01549>>02006000
      END;                                                     <<01549>>02008000
   SIOP(S'SEEK'MASK) := TOS;                                   <<01549>>02010000
   ENABLE;                                                     <<01549>>02012000
$PAGE "BUILD A DATA TRANSFER PROGRAM -- SETUP AD,XD,CXFER"     <<01549>>02014000
   TOS := CONTROL;                                             <<01549>>02016000
   TOS := DISCINFO (SUBTYPE*NUMENTRIES + FILEMASK);            <<25.00>>02018000
   IF LOGICAL(S3&CSL(1)) THEN TOS := TOS + %220;<<S3 IS QMISC>><<01549>>02020000
   IF FUNCT = READSPD THEN TOS.(13:1) := 0;  <<NO SPARING>>    <<07.PV>>02022000
   << IF RETRY DETERMINATION IS SET, RETRY 10 TIMES >>                  02024000
   DSIOP(S'FILEMASK'D) := TOS;                                 <<01549>>02026000
   SIOP(S'ADREC'UNIT) := ADRREC + UNIT;                        <<01549>>02028000
   SIOP(S'ADREC'CYL) := @DITP(CURCYL) + SYSDB;                 <<01549>>02030000
                                                               <<01549>>02032000
<< WORK ON S'XFER'CMD >>                                       <<01549>>02034000
                                                               <<01549>>02036000
   TOS := CW4K;                                                         02038000
   IF FUNCT = READ OR FUNCT = READSPD THEN                     <<07.PV>>02040000
   BEGIN                                                                02042000
      ASMB(TSBC 3); << CHANGE WRITE TO READ >>                          02044000
      TOS := READOP;                                                    02046000
   END ELSE                                                    <<03.PV>>02048000
   IF FUNCT = READFS THEN                                      <<03.PV>>02050000
   BEGIN                                                       <<03.PV>>02052000
      ASMB(TSBC 3);  << CHANGE WRITE TO READ >>                <<03.PV>>02054000
      TOS := READFSOP;                                         <<03.PV>>02056000
   END ELSE TOS := WRITEOP;                                             02058000
                                                               <<01549>>02060000
   SIOP(S'XFER'CMD) := TOS + UNIT;                             <<01549>>02062000
   IF (FOPEN<=FUNCT<=RSTAT) OR SBFLG THEN                      <<01.PV>>02064000
   BEGIN                                                                02066000
      TOS := TOS LOR %7600; << CUT XFER (CW4K) TO 128 >>       <<01549>>02068000
      TOS := 128; << TRANSFER DELTA >>                                  02070000
      TOS := 0;   << ADDRESS  DELTA >>                                  02072000
      BANK := 0;                                                        02074000
   END ELSE                                                             02076000
   BEGIN                                                                02078000
      TOS := 4096;                                                      02080000
      ASMB(DUP);                                                        02082000
   END;                                                                 02084000
   AD := TOS;                                                           02086000
   XD := TOS;                                                           02088000
   CXFER := TOS;                                                        02090000
                                                               <<01549>>02092000
   SIOP(S'BANK'VALUE) := BANK;                                 <<01549>>02094000
   TOS := DITP(WCR);                                                    02096000
   IF (FOPEN<=FUNCT<=RSTAT) THEN                               <<01.PV>>02098000
   BEGIN << LIMIT XFER TO 1024 FOR FILL OPERATIONS >>                   02100000
      SBFLG := FALSE;                                                   02102000
      TOS := 1024;                                                      02104000
      ASMB(DDUP,LCMP);                                                  02106000
      IF < THEN ASMB(XCH);                                              02108000
      DELB; << SMALLEST LEFT ON TOS >>                                  02110000
   END;                                                                 02112000
   IF SUBTYPE = 4 THEN                                                  02114000
   BEGIN << UPPER PLATTER, CHECK END OF CYL >>                          02116000
      TOS := DISCINFO (SUBTYPE*NUMENTRIES + SECPERCYL);        <<25.00>>02118000
      TOS := DDITP(CLDA);                                               02120000
      TOS := S2;                                                        02122000
      ASMB(LDIV,DELB;SUB);                                              02124000
      TOS := TOS&LSL(7); << XFER CNT OT EOC >>                          02126000
      ASMB(DDUP,LCMP);                                                  02128000
      IF < THEN ASMB(XCH);                                              02130000
      DELB; << SMALLEST LEFT ON TOS >>                                  02132000
   END;                                                                 02134000
   ASMB(DUP,DUP);                                                       02136000
   IF = THEN GO TO GOODEND; << ZERO XFER COUNT >>                       02138000
   DITP(CWC) := TOS;                                                    02140000
   BUFADR := DITP(CDBA);                                                02142000
   IF SBFLG THEN CHECKINDEX(@SBUF+SYSDB-BUFADR,SBUF);                   02144000
$PAGE "BUILD A DATA TRANSFER PROGRAM -- BUILD CHAINNED PART"   <<01549>>02146000
   IF FUNCT = INIT THEN  << FIX UP SIO PROG >>                 <<02.PV>>02148000
   BEGIN                                                       <<02.PV>>02150000
      TOS := BANK;                                             <<02.PV>>02152000
      TOS := BUFADR - 2;                                       <<RK2PV>>02154000
      ASMB(LDEA);                                              <<06.PV>>02156000
      DDITP(INITADDR) := TOS;                                  <<06.PV>>02158000
      ASMB(DECA;LSEA);  << LOAD FROM BUFADR >>                 <<02.PV>>02160000
      ASMB(DELB,DELB);  << DELETE BANK AND BUFADR >>           <<02.PV>>02162000
      TOS.(15:1) := 0;  << TEST AND RESET ALT TRACK BIT>>      <<02.PV>>02164000
      SIOP(S'XFER'CMD) := (TOS & LSL(12)) + INITOP + UNIT;     <<01549>>02166000
      SIOP(S'FILEMASK) := %7402;  << FILE MASK >>              <<01549>>02168000
      SIOP(S'ADREC'CYL) := @DITP(INITADR) + SYSDB;             <<01549>>02170000
   END;                                                        <<01549>>02172000
   X := S'CHAIN'D;                                             <<01549>>02174000
   WHILE TOS > XD DO                                                    02176000
   BEGIN << BUILD CHAINED XFER ORDERS >>                                02178000
      TOS := TOS - XD;                                                  02180000
      DSIOP(X) := DXFERORDER;                                           02182000
      ASMB(DUP,INCX);                                                   02184000
      IF SBFLG THEN                                                     02186000
      BEGIN << GO TO NEXT SYSBUF >>                                     02188000
         TOS := X;                                                      02190000
         CHECKINDEX(ABS(BUFADR-1),SBUF);                                02192000
         BUFADR := ABS(X) + @SBUF + SYSDB;                              02194000
         X := TOS;                                                      02196000
      END ELSE BUFADR := BUFADR + AD;                                   02198000
   END;                                                                 02200000
   ASMB(NEG; TRBC 3); << BUILD LAST XFER ORDER >>                       02202000
   TOS := TOS LOR LOGICAL(CXFER);                                       02204000
   ASMB(TRBC 0);                                                        02206000
   TOS := BUFADR;                                                       02208000
   DSIOP(X) := TOS;                                                     02210000
   IF FUNCT = FORMAT THEN  << FIX UP SIO PROGRAM >>            <<01.PV>>02212000
   BEGIN                                                       <<01.PV>>02214000
      I := (X + 1) & LSL(1);                                   <<01.PV>>02216000
      SIOP(I     ) := SETBANK;                                 <<06.PV>>02218000
      SIOP(I:=I+1) := 0;        << BANK 0 >>                   <<06.PV>>02220000
      SIOP(I:=I+1) := CONTROL;                                 <<RK3PV>>02222000
      SIOP(I:=I+1) := SEEK + UNIT;                             <<RK3PV>>02224000
      SIOP(I:=I+1) := %67776;  << WRITE DISC ADDRESS >>        <<RK3PV>>02226000
      SIOP(I:=I+1) := @DITP(CURCYL) + SYSDB;                   <<RK3PV>>02228000
      SIOP(I:=I+1) := CONTROL;                                 <<01.PV>>02230000
      SIOP(I:=I+1) := ADRREC + UNIT;                           <<01.PV>>02232000
      SIOP(I:=I+1) := %67776;  << WRITE DISC ADDRESS >>        <<01.PV>>02234000
      SIOP(I:=I+1) := @DITP(CURCYL) + SYSDB;                   <<01.PV>>02236000
      SIOP(I:=I+1) := CONTROL;                                 <<01.PV>>02238000
      SIOP(I:=I+1) := VERIFYOP + UNIT;                         <<01.PV>>02240000
      SIOP(I:=I+1) := %67777;  << WRITE SECTOR COUNT >>        <<01.PV>>02242000
      SIOP(I:=I+1) := @DITP(SCOUNT) + SYSDB;                   <<01.PV>>02244000
      SIOP(S'FILEMASK) := %7402;  << FILE MASK >>              <<01549>>02246000
      SIOP(S'XFER'CMD) := INITOP + UNIT;                       <<01549>>02248000
      DITP(SCOUNT) := DITP(CWC) & LSR(7);  << SECTOR COUNT >>  <<05.PV>>02250000
      TOS := (I + 1) & LSR(1);  << DOUBLE INDEX >>             <<01.PV>>02252000
   END ELSE                                                    <<01.PV>>02254000
   TOS := X + 1;                                                        02256000
   TOS := JUMPC; << BUILD JUMP AND END ORDERS >>                        02258000
   TOS := @SIOP(S'LOOP) + SYSDB;                               <<01549>>02260000
   ASMB(CAB,STAX);                                                      02262000
   DSIOP(X) := TOS;                                                     02264000
   TOS := ENDINT;                                                       02266000
   TOS := -1;                                                           02268000
   DSIOP(X:=X+1) := TOS;                                                02270000
   TOS := @SIOP(START'ADDR - 1);                               <<01549>>02272000
                                                                        02274000
$PAGE " START SIO PROGRAM -- ALSO FILL,RQST"                   <<01549>>02276000
STARTIOPROG: << START THE I/O PROGRAM >>                                02278000
   SIOP(1) := TOS + SYSDB; << SET THE JUMP ADRESS >>                    02280000
   TOS := UNIT;                                                <<01549>>02282000
   TOS := @DITP;                                               <<01549>>02284000
   DSIOP(S'THIS'UNITD) := TOS;                                 <<01549>>02286000
   STARTIO(DITP,SIOP,TRUE);                                             02288000
   IF > THEN                                                            02290000
   BEGIN << NO START >>                                                 02292000
SIOFAILURE:                                                             02294000
      TOS := BADSIO;                                                    02296000
      GO TO BADEND;                                                     02298000
   END;                                                                 02300000
   IOQP(QMISC) := TOS;                                                  02302000
   TOS := WAIT;                                                         02304000
   TOS := %13;                                                          02306000
EXIT:                                                                   02308000
   MSTATE := TOS;                                                       02310000
   IOQP(QSTAT).STAT := TOS;                                             02312000
   RETURN;                                                              02314000
                                                                        02316000
FILLBLANK:                                                              02318000
   TOS := "  ";                                                         02320000
   GO TO FC;                                                            02322000
FILLZERO:                                                               02324000
   TOS := 0;                                                            02326000
FC:                                                                     02328000
   TOS := GETSBUF(2);                                                   02330000
   ASMB(DUP,DUP);                                                       02332000
   IF = THEN                                                            02334000
   BEGIN << NO BUFFERS AVAILABLE >>                                     02336000
      TOS := SYSERROR;                                                  02338000
      GO TO BADEND;                                                     02340000
   END;                                                                 02342000
   DITP(SYSBUFA) := TOS;                                                02344000
   DITP(CDBA) := TOS + SYSDB;                                           02346000
   ASMB(XCH);                                                           02348000
   PS1 := TOS; << PUT FILL WORD INTO FIRST WORD OF BUFFER >>            02350000
   ASMB(DUP,INCB); << SET MOVE POINTERS >>                              02352000
   TOS := 127; << MOVE COUNT >>                                         02354000
   ASMB(MOVE 3);                                                        02356000
   GO TO DOXFER;                                                        02358000
                                                                        02360000
REQSTATUS:                                                     <<00.PV>>02362000
   REQSTATSIO;  << INITIALIZE SIO PROGRAM >>                   <<00.PV>>02364000
   SIOP(RSTAP8) := JUMP;                                       <<RK.00>>02366000
   SIOP(RSTAP9) := @SIOP(RQALL) + SYSDB;                       <<RK.00>>02368000
   TOS := JUMP;                                                <<01549>>02370000
   TOS := @SIOP(RSTAP10) + SYSDB;                              <<01549>>02372000
   DSIOP(S'FILEMASK'D) := TOS;                                 <<01549>>02374000
   IF DITP(WCR) > 4 THEN DITP(WCR) := 4; <<TRUNCATE>>          <<RK.00>>02376000
   DITP(CWC) := DITP(WCR); <<MAKE SURE WE PASS CONTXFER TEST>> <<RK.00>>02378000
   TOS := @SIOP(RSTAP);                                        <<00.PV>>02380000
   GO TO STARTIOPROG;                                          <<00.PV>>02382000
                                                               <<00.PV>>02384000
END;                                                                    02386000
                                                               <<RK0PV>>02388000
$PAGE "INITIALIZATION PROCEDURE -- CALLED ONCE PER ILT"        <<01549>>02390000
PROCEDURE INIT7920(DITP);                                      <<RK0PV>>02392000
VALUE DITP;                                                    <<RK0PV>>02394000
INTEGER POINTER DITP;                                          <<RK0PV>>02396000
OPTION PRIVILEGED,UNCALLABLE;                                  <<RK0PV>>02398000
                                                               <<RK0PV>>02400000
BEGIN                                                          <<RK0PV>>02402000
   INTEGER POINTER ILTP = Q + 1;                               <<RK0PV>>02404000
   INTEGER POINTER SIOP = Q + 2;                               <<RK0PV>>02406000
   INTEGER HCU          = Q + 3;  <<HIGHEST CONFIGURED UNIT>>  <<RK0PV>>02408000
   INTEGER UNIT         = Q + 4;                               <<RK0PV>>02410000
   INTEGER TARGADDR     = Q + 5;                               <<RK0PV>>02412000
   INTEGER PROGADDR     = Q + 6;                               <<RK0PV>>02414000
   INTEGER CONF'MASK    = Q + 7;                               <<01549>>02416000
   INTEGER X = X;                                              <<01549>>02418000
   INTEGER S0 = S-0;                                           <<01549>>02420000
                                                               <<RK0PV>>02422000
   TOS := DITP(DILTP);                                         <<RK0PV>>02424000
   TOS := ILTP(ISIOP);                                         <<RK0PV>>02426000
   TOS := ILTP(IFLAG).HCUNIT;  <<HIGHEST CONFIGURED UNIT>>     <<01300>>02428000
   TOS := -1;  <<UNIT>>                                        <<RK0PV>>02430000
   TOS := STATTAB - 1;<<TARGADDR IN STATUS TABLE FOR 1ST UNIT>><<RK0PV>>02432000
   TOS := RQALL + 31; <<PROGADDR IN SIOPROG FOR UNIT 0>>       <<RK0PV>>02434000
   TOS := 0;  << WILL BE CONF'MASK -- MUST BE TOS !!! >>       <<01549>>02436000
   WHILE (UNIT := UNIT + 1) <= 7 DO                            <<RK0PV>>02438000
      BEGIN                                                    <<RK0PV>>02440000
      IF ( UNIT <= HCU ) AND ( ILTP(UNIT+IDITP) > 0 ) THEN     <<01549>>02442000
         BEGIN << CONFIGURED UNIT >>                           <<01549>>02444000
         X := UNIT;                                            <<01549>>02446000
         ASMB(TSBC 0,X);                                       <<01549>>02448000
         END;                                                  <<01549>>02450000
      SIOP(PROGADDR) := @SIOP(TARGADDR) + SYSDB;               <<01549>>02452000
      TARGADDR := TARGADDR + 1;                                <<01549>>02454000
      PROGADDR := PROGADDR - 4; <<UNIT 0 IS LAST IN SIOPROG >> <<01549>>02456000
      END;                                                     <<01549>>02458000
   TOS := SYSDB + @SIOP(S'SEEKVALUES & LSL(1) ) - 2;           <<01549>>02460000
   SIOP(S'NO'SEEK - 4) := S0;                                  <<01549>>02462000
   TOS := TOS - 2;                                             <<01549>>02464000
   SIOP(X:=X-6) := S0;                                         <<01549>>02466000
   TOS := TOS - 2;                                             <<01549>>02468000
   SIOP(X:=X-6) := TOS;                                        <<01549>>02470000
   SIOP(S'CONF'MASK) := CONF'MASK;                             <<01549>>02472000
END; << OF INIT7920 >>                                         <<RK0PV>>02474000
$PAGE "7905/7920/7925 MOVING HEAD DISC DRIVER -- SEEK'AHEAD"   <<01549>>02476000
ASMB(                                                                   02478000
   PCAL SIODM;  << MONITOR >>                                           02480000
   PCAL MHDDVR; << INITIATOR >>                                         02482000
   PCAL MHDDVR; << COMPLETOR >>                                         02484000
   CON 0;       << I/O PROCESS PROCEDURE >>                             02486000
   CON 0;        << INITIALIZATION PROCEDURE >>                <<01549>>02488000
   CON 1;       << # OF INTERRUPT PROCEDURES >>                         02490000
   PCAL GIP);   << INTERRUPT HANDLER >>                        <<RK0PV>>02492000
END.                                                                    02494000
