*COMDECK,FMDFT
          EJECT 
 5FF      SEGMENT POVLA 
          ORG    POVLA
          QUAL   FMDFT
*CALL,VERS
          COMMENT FMDFT PRODUCT OVERLAY FOR MALET "VERS"
          TITLE  HIGH LEVEL FMD FULL TRACK PRODUCT OVERLAY FOR MALET. 
**        THE FOLLOWING COMMANDS ARE DESIGNED FOR  THE  FMD  DISK  SUB- 
*         SYSTEMS  RUNNING  IN  A  FULL-TRACK MODE.  5FF IS THE PRODUCT 
*         OVERLAY THAT EXECUTES THESE COMMANDS AND  IS  DRIVEN  BY  THE 
*         INSTRUCTION STACK OF THE MALET PP  DRIVER.  REQUESTS ARE MADE 
*         BY THE DRIVER BY STORING PARAMETERS INTO PP  DIRECT CELLS AND 
*         PERFORMING  A  RETURN-JUMP TO AN OVERLAY SUBROUTINE. ONCE THE 
*         REQUEST HAS BEEN COMPLETED, CONTROL IS RETURNED TO THE  STACK 
*         TO EXECUTE THE NEXT COMMAND.
* 
*         THE FMD FULL-TRACK PRODUCT OVERLAY  SUPPORTS  A  PROGRAMMABLE 
*         INPUT BUFFER (IB) OF 505B PP WORDS, AN  OUTPUT BUFFER (OB) OF 
*         505B PP WORDS AND A STATUS BUFFER (SB) OF 64B PP WORDS.  DATA 
*         IS  WRITTEN  TO  THE  DISK FROM THE OUTPUT BUFFER AND IS READ 
*         FROM THE DISK TO THE INPUT BUFFER.  THE STATUS BUFFER IS USED 
*         TO HOLD GENERAL AND DETAIL STATUS FROM THE SUBSYSTEM
*         AND OTHER WORDS DEFINED LATER. SUPPORTED CAPABILITIES ARE  AS 
*         FOLLOWS_
* 
*           DIAGRD - READ 322D WORDS FROM SUBSYSTEM MEMORY TO IB. 
*           DIAGWR - WRITE 322D WORDS FROM OB TO SUBSYSTEM MEMORY.
*           GET    - READ SERIAL, FACTORY OR UTILITY MAP SECTOR TO IB.
*           MARGINS- SET STROBES AND OFFSET FOR READ AND READCW.
*           READ   - SEEK AND READ 0 TO 4095 SECTORS FROM DISK TO IB. 
*           READCB - PREFORM A READ ON THE COUPLER BUFFER 
*           READCW - SEEK AND READ CHECKWORD ON 0 TO 4095 SECTORS.
*           REL    - RELEASE DRIVE, CONTROLLER AND I/O CHANNEL. 
*           RES    - RESERVE I/O CHANNEL, CONTROLLER AND DRIVE. 
*           RESET  - AUTOLOAD CONTROLLER TO MONITOR LOOP. 
*           RTNADDR- READ LAST CYLINDER ADDRESS TO IB.
*           SEEK   - MOVE DRIVE POSITIONER. 
*           SHORTRD- READ ONE SHORT SECTOR(477B WORDS) FROM DISK TO IB. 
*           STATUS - INPUT GENERAL OR DETAIL STATUS TO SB.
*           VERIFY - SEEK AND WRITE VERIFY 0 TO 4095 SECTORS ON DISK. 
*           WRITE  - SEEK AND WRITE 0 TO 4095 SECTORS ON DISK.
* 
*         THIS PRODUCT OVERLAY DOES NOT USE THE WC OR BA  REGISTERS  TO 
*         CONTROL  I/O OPERATIONS.  THESE REGISTERS ARE FREE FOR USE BY 
*         THE MODULE PROGRAMMER.  ALL NORMAL READS AND WRITES  TRANSFER 
*         502B WORDS STARTING AT THE FIRST WORD OF THE OUTPUT BUFFER. 
* 
          EJECT 
**        THE FOLLOWING CHART DEFINES THE LAY-OUT OF THE STATUS BUFFER. 
* 
*                   --------------------   ---
*               0   /   GENERAL STATUS /      / 
*                   /------------------/      / 
*               1   /                  /      / 
*               .   /                  /      / 
*               .   /   DETAIL STATUS  /      / THIS IS THE NORMAL/LAST 
*               .   /                  /      / TAKEN STATUS FROM THE 
*               .   /                  /      / SUBSYSTEM 
*               .   /                  /      / 
*               .   /                  /      / 
*               .   /                  /      / 
*              24B  /                  /   ---
*                   /------------------/   ---
*              25B  /   GENERAL STATUS /      / 
*                   /------------------/      / 
*              26B  /                  /      / 
*               .   /                  /      / THIS IS THE FIRST TAKEN 
*               .   /   DETAIL STATUS  /      / STATUS WITHIN SEQUENCES 
*               .   /                  /      / THAT REQUIRED RECOVERY
*               .   /                  /      / TO BE PERFORMED.
*               .   /                  /      / (CONTINUE FUNCTIONS 
*               .   /                  /      / ISSUED) 
*               .   /                  /      / 
*              51B  /                  /   ---
*                   /------------------/   ---
*              52B  /  RETRY COUNT     /      / ERROR CORRECTION DATA 
*                   /------------------/   ---
*              56B  / 1ST BYTE         /      / DISK PACK SERIAL NUMBER 
*              57B  / 2ND BYTE         /      / (FROM ASSIGN DIRECTIVE) 
*                   /------------------/   ---
*              60B  / SEEK TIME        /      / MILLISECONDS TO DO LAST 
*                   /------------------/      / SEEK
*              61B  / CHANNEL          /   ---
*              62B  / EQUIPMENT        /      / 
*              63B  / UNIT             /      / EQUIPMENT UNDER TEST
*                   --------------------   ---
* 
*         ALL SUBROUTINES IN THIS PRODUCT OVERLAY USE  A  COMMON  ERROR 
*         EXIT  SEQUENCE  WHEN  AN  ERROR  IS  DETECTED.  THIS SEQUENCE 
*         STORES AN INTERNAL ERROR CODE INTO THE EC REGISTER, AN  ERROR 
*         MESSAGE INDEX INTO THE EM REGISTER AND THE CURRENT P REGISTER 
*         CONTENTS (LINE NUMBER) INTO THE  EA  REGISTER.   I/O  CHANNEL 
*         CLEAN-UP  OCCURS  AND  A JUMP IS MADE TO THE STATEMENT NUMBER 
*         SPECIFIED BY THE ABT ADDRESS IN THE COMMAND.
* 
          EJECT 
**        THE FOLLOWING TABLE DEFINES THE ERROR CODES AND MESSAGES THAT 
*         MAY BE GENERATED FOR EACH COMMAND.
*                                                   .----RES
*                                 DIAGRD----------. . /-----RESET 
*                                DIAGWR---------/ . . / .----RTNADDR
*                               GET-----------. / . . / . /---SEEK
*                              MARGINS------/ . / . . / . / .--SHORTRD
*                             READ--------. / . / . . / . / . /-STATUS
*                            READCW-----/ . / . / . . / . / . / VERIFY
* CODE         MESSAGE      REL-------. / . / . / . . / . / . / . WRT 
*      ------------------------------ - - - - - - - - - - - - - - - 
* 5304 WC OR BUFFER INDEX ERROR       . . X . . . . . . . . . . X X 
*      ------------------------------ - - - - - - - - - - - - - - - 
* 5310 I/O CH NOT ASSIGNED            . . . . . . . . X . . . . . . 
*      ------------------------------ - - - - - - - - - - - - - - - 
* 5311 I/O CH ACTIVE FROM SYSTEM      . . . . . . . X . . . . . . . 
*      ------------------------------ - - - - - - - - - - - - - - - 
* 5312 NO INACTIVE TO LAST FUNC.      X X X . X X X X X X X X X X X 
*      ------------------------------ - - - - - - - - - - - - - - - 
* 5313 NO INACTIVE TO GENERAL STATUS  . X X . X . . X . X X X X X X 
*      ------------------------------ - - - - - - - - - - - - - - - 
* 5314 NO INACTIVE TO DETAIL STATUS   . X X . X . . X . . X X X X X 
*      ------------------------------ - - - - - - - - - - - - - - - 
* 5315 GENERAL STATUS NOT RETURNED    . X X . X . . X . X X X X X X 
*      ------------------------------ - - - - - - - - - - - - - - - 
* 5316 INCOMPLETE STATUS RETURNED     . X X . X . . X . . X X X X X 
*      ------------------------------ - - - - - - - - - - - - - - - 
* 5317 FUNC PARAMETERS NOT ACCEPTED   . X X . X . . X . . X X . X X 
*      ------------------------------ - - - - - - - - - - - - - - - 
* 5320 ALL DATA NOT ACCEPTED FROM PP  . . . . . X . . . . . . . X X 
*      ------------------------------ - - - - - - - - - - - - - - - 
* 5321 INCOMPLETE DATA RETURNED TO PP . . X . X . X . . X . X . . . 
*      ------------------------------ - - - - - - - - - - - - - - - 
* 5322 CONTROLLER/UNIT NOT CONNECTED  . X X X X X X . . X X X X X X 
*      ------------------------------ - - - - - - - - - - - - - - - 
* 5323 ACCESS LEVEL TOO LOW FOR REQ   . . X . . . . . . . . X . X X 
*      ------------------------------ - - - - - - - - - - - - - - - 
* 5324 RESERVE TIMEOUT                . X X . . . . X . . . . . X X 
*      ------------------------------ - - - - - - - - - - - - - - - 
* 5325 ABNORMAL GENERAL STATUS        . X X . X . . X . X X X . X X 
*      ------------------------------ - - - - - - - - - - - - - - - 
* 5326 ILLEGAL STROBES/OFFSET         . . . X . . . . . . . . . . . 
*      ------------------------------ - - - - - - - - - - - - - - - 
* 5327 UNIT HUNG BUSY ON SEEK         . X X . X . . . . . X X . X X 
*      ------------------------------ - - - - - - - - - - - - - - - 
* 5330 SUCCESSFUL RETRY               . X X . X . . . . . . . . X X 
*      ------------------------------ - - - - - - - - - - - - - - - 
* 5331 DATA COMPARE ERROR             . . X . . . . . . . . . . . . 
*      ------------------------------ - - - - - - - - - - - - - - - 
* 5332 DEVICE CODE/STATUS MISMATCH    . . . . . . . X . . . . . . . 
*      ------------------------------ - - - - - - - - - - - - - - - 
* 5333 NO INACTIVE AFTER DATA XFER    . X X . . X X X . . . . . X X 
*      ------------------------------------------------------------ 
* 5334 CH PE ON INPUT                 . . X . . . X . . . . X X . . 
*      ------------------------------------------------------------ 
          EJECT 
**        THE  FOLLOWING  FLOW-CHART  DOCUMENTS THE PROCESS USED WITHIN 
*         THE PRODUCT OVERLAY TO  UPDATE  CYLINDER,  TRACK  AND  SECTOR 
*         IN A 1_1 INTERLACE MODE. (READ, READCW, VERIFY AND WRITE) 
* 
*         ------------------------------------------------------------- 
*         I CALCULATE  NUMBER  OF  SECTORS THAT CAN BE PROCESSED FROM I 
*         I CURRENT TRACK/SECTOR TO END OF CYLINDER. SET  REGISTER  V I 
*         I TO LENGTH. EXIT IF NO SECTORS TO PROCESS.                 I 
*         ------------------------------------------------------------- 
*                                 V                      &
*                          ---------------        --------------- 
*                          I  PROCESS    I        I  PERFORM    I 
*                  ------->I    ONE      I        I    SEEK     I 
*                 I        I  SECTOR     I        I  SEQUENCE   I 
*                 I        ---------------        --------------- 
*                 I               V                     & 
*                 I        ----------------             I 
*                 I        I ADD 1 TO SEC I 
*                 I        ----------------           START 
*                 I               V 
*                 I           --------- 
*                 I          /         \  NO
*                 I         /  SECTOR   \---- 
*                 I         \   .GT.    /   I 
*                 I          \  37B    /    I 
*                 I           ---------     I 
*                 I          YES  V         I 
*                 I        ---------------- I 
*                 I        I RESET SECTOR I I 
*                 I        I TO 0 AND ADD I I 
*                 I        I 1 TO TRACK   I I 
*                 I NO     ---------------- I 
*              -------            V         I 
*             /  I/O  \    ---------------  I 
*            / LENGTH  \   I  SUBTRACT 1 I  I 
*            \  EQUAL  /<--I  FROM I/O   I<--     --------------- 
*             \ ZERO  /    I  LENGTH     I        I    EXIT     I 
*              -------     ---------------        I   TO STACK  I 
*                 V YES                           --------------- 
*          ----------------    ---------                 &
*          I DECREMENT    I    I       I          --------------- 
*          I REGISTER V   I    I EXIT  I          I SET TRACK   I 
*          I BY I/O LENGTHI    I       I          I  REGISTER   I 
*          ----------------    ---------          I    TO 47B   I 
*                 I                &              --------------- 
*                 V                I YES                 &
*          ----------------      -------          --------------- 
*          I UPDATE REGS. I     / REG.  \ NO      I    SET      I 
*          I W,X AND Y BY I--->/   V     \------->I   SECTOR    I 
*          I I/O LENGTH   I    \  EQUAL  /        I  REGISTER   I 
*          I MINUS ONE.   I     \ ZERO  /         I    TO 37B   I 
*          ----------------      -------          --------------- 
          EJECT 
*         EQUATES FOR ERROR CODES - FIRST 7 ARE FOR BASIC DRIVER. 
  
 EC.FLE   EQU    1           ADDRESS OUT OF FIELD LENGTH
 EC.TL    EQU    2           TIME LIMIT ERROR FOR COMMUNICATIONS
 EC.SEE   EQU    3           SUBROUTINE ENTRY/EXIT ERROR
 EC.WC    EQU    4           BUFFER REFERENCE OR WC ERROR 
 EC.RES   EQU    5           RESERVED FOR BASIC DRIVER
 EC.RES1  EQU    6           RESERVED FOR BASIC DRIVER
 EC.RES2  EQU    7           RESERVED FOR BASIC DRIVER
  
 EC.CNA   EQU    10B         CHANNEL NOT ASSIGNED 
 EC.CAS   EQU    11B         CHANNEL ACTIVE FROM SYSTEM 
 EC.NIF   EQU    12B         NO INACTIVE TO LAST FUNCTION 
 EC.NIGS  EQU    13B         NO INACTIVE TO GENERAL STATUS
 EC.NIDS  EQU    14B         NO INACTIVE TO DETAIL  STATUS
 EC.GSNR  EQU    15B         GENERAL STATUS NOT RETURNED
 EC.ISR   EQU    16B         INCOMPLETE STATUS RETURNED 
 EC.FPNA  EQU    17B         FUNCTION PARAMETERS NOT ACCEPTED 
 EC.DNA   EQU    20B         ALL DATA NOT ACCEPTED FROM PP
 EC.IDR   EQU    21B         INCOMPLETE DATA RETURNED TO PP 
 EC.CNC   EQU    22B         CONTROLLER/DRIVE NOT CONNECTED 
 EC.IAL   EQU    23B         ACCESS LEVEL TOO LOW FOR REQUEST 
 EC.NRES  EQU    24B         NO RESERVE IN 5 MINUTES
 EC.AGS   EQU    25B         ABNORMAL GENERAL STATUS
 EC.ISO   EQU    26B         ILLEGAL STROBES/OFFSET 
 EC.UHB   EQU    27B         UNIT HUNG BUSY ON SEEK 
 EC.STRY  EQU    30B         SUCCESSFUL RETRY 
 EC.DCE   EQU    31B         DATA COMPARE ERROR 
 EC.DCSM  EQU    32B         DEVICE CODE/STATUS MISMATCH
 EC.NIDT  EQU    33B         NO INACTIVE AFTER DATA TRANSFER
 EC.CPE   EQU    34B         CHANNEL PARITY ERROR ON INPUT
  
*         DIRECT CELL EQUATES 
  
 RDWRF    EQU    60B         READ/WRITE FLAG
 COD      EQU    61B         WRITE - READ CODED FLAG
 FUN      EQU    62B         FUNCTION FOR READ OR WRITE 
 CL       EQU    63B         ADDRESS OF CURRENT IO LENGTH  - V
 WC       EQU    64B         WORD COUNT FOR I/O 
 CC       EQU    65B         ADDRESS OF CURRNET CYLINDER   - W
 CT       EQU    66B         ADDRESS OF CURRENT TRACK      - X
 CS       EQU    67B         ADDRESS OF CURRENT SECTOR     - Y
  
 SEEKA    EQU    D.Z3        SEEK ADDRESS USES D.Z3 THRU D.Z7 
 PA       EQU    D.T0        PARAMETER ADDRESS
  
          EJECT 
*         EQUATES FOR EQUIPMENT FUNCTIONS.
  
 CONN     EQU    0           CONNECT
 SEK11    EQU    1           SEEK 1_1 INTERLACE 
 IOL      EQU    3           I/O LENGTH IN SECTORS
 RD       EQU    4           READ 
 WR       EQU    5           WRITE
  
 WRV      EQU    6           WRITE VERIFY 
 RDCW     EQU    7           READ CHECKWORD 
  
 OC       EQU    10B         OPERATION COMPLETE 
 GS       EQU    12B         GENERAL STATUS 
 CONT     EQU    14B         CONTINUE 
 FMT      EQU    16B         FUNCTION CODE FOR FORMAT PACK
 DREL     EQU    20B         DRIVE RELEASE
 RCA      EQU    21B         RETURN CYLINDER ADDRESS
 EDS      EQU    23B         EXTENDED DETAIL STATUS 
 RFD      EQU    30B         READ FACTORY DATA
 RUM      EQU    31B         READ UTILITY MAP 
 DR       EQU    32B         DIAGNOSTIC READ
 DW       EQU    33B         DIAGNOSTIC WRITE 
 WRP      EQU    37B         WRITE PROTECTED SECTOR FUNCTION
 RS       EQU    40B         READ SHORT 
 SSO      EQU    41B         SELECT STROBES AND OFFSET
 RCB      EQU    43B         READ COUPLER BUFFER
 WCB      EQU    44B         WRITE COUPLER BUFFER 
 FSCAN    EQU    47B         SCAN DISK FUNCTION 
 AUTO     EQU    414B        AUTOLOAD FUNCTION
  
*         GENERAL STATUS BIT EQUATES. 
  
 NDE      EQU    0           NONRECOVERABLE DATA ERROR
 BUSY     EQU    1           UNIT BUSY
 DRES     EQU    3           DRIVE RESERVED 
 COR      EQU    5           CORRECTABLE ERROR BIT
 RIP      EQU    8D          RECOVERY IN PROGRESS 
 UNR      EQU    9D          NONRECOVERABLE ERROR 
 CRES     EQU    10D         CONTROLLER RESERVED
  
*         DEVICE CODES SUPPORTED
  
 D885     EQU    7           FMD/885
 DFSCA    EQU    10B
 DFSCB    EQU    11B
 DFSC     EQU    12B
          SPACE  4,20 
*         MISCELANOUS EQUATES.
  
 TIMFJM   EQU    50000D/2     INTERATION TIME TO WAIT FOR FULL 50 MSEC
 TIMREL   EQU    400000D/100D INTERVAL FOR CHANNEL RELEASE- 
 MAXITT   EQU    12D         ITERATION COUNT FOR ABOUT A 5 SEC.DELAY
  
 MAXFSCA  EQU    632B 
 MAXFSCB  EQU    1456B
 FMAPCY   EQU    1057B
 MAXCDD   EQU    1512B       MAXIMUM CYLINDER ON A 885
 MAPCYL   EQU    1511B       CYLINDER CONTAINING MAP INFORMATION
 PRECYL   EQU    2           NUMBER OF PREALLOCATED CYLINDERS 
  
 ARP      EQU    1           READ PREALLOCATED
*IF,DEF,SECURE,1
 ARD      EQU    4          READ ANYWHERE 
*IF,-DEF,SECURE,1 
 ARD      EQU    2           READ ANYWHERE
 ARWP     EQU    3           READ ANYWHERE, WRITE PREALLOCATED
 ARW      EQU    4           READ ANYWHERE, WRITE ANYWHERE
 AL21     EQU    21B         ACCESS LEVEL FOR NO CHANNEL CLEANUP ON ERR 
  
 CH       EQU    37B         DEFAULT CHANNEL VALUE FOR I/O COMMANDS 
  
 SEL      EQU    37B         MAXIMUM SECTOR COUNT 
 TRL      EQU    47B         MAXIMUM TRACK COUNT
 WRRD     EQU    502B        STANDARD WORD COUNT
 SHRD     EQU    476B        SHORT WORD COUNT 
 FTR1     EQU    22B
 FSTR     EQU    24B
 FSEL     EQU    33B
 FTRL     EQU    35B
          EJECT 
**        ERROR MESSAGES - WRITTEN TO CM DURING INITIALIZATION. 
* 
*         MMSG MARCO. 
* 
*         MMSG  MACRO  NAME,ECODE,MSG,FABT
* 
*         NAME = 6/FABT,6/MESSAGE ORDINAL,6/ECODE.
* 
*         ECODE = ERROR CODE TO BE ASSIGNED (6 BITS). 
* 
*         MSG = ERROR MESSAGE (40 CHARACTERS).
* 
*         FABT = FORCE ABORT (UPPER 6 BITS OF NAME. 
* 
          PURGMAC MMSG
 MMSG     MACRO  NAME,ECODE,MSG,FABT
          IF     -DEF,MMSGORD,1 
 MMSGORD  SET    0                        INITIALIZE ORDINAL
          IFC    EQ,$FABT$$,2             TEST FOR NO FORCE ABORT 
 NAME     EQU    MMSGORD*100B+ECODE 
          ELSE   1
 NAME     EQU    FABT*10000B+MMSGORD*100B+ECODE 
 MMSGBGN  SET    *                        SAVE CURRENT ADDRESS
          IFC    EQ,$MSG$$,2              TEST NULL MESSAGE 
          DATA   1H                       INSURE DATA ITEM
          ELSE   1
          DATA   H$MSG$                   STORE MESSAGE 
          DATA   0                        SET END OF MESSAGE
          IFGT   *-MMSGBGN,BD.MSGML*5+1,1 TEST MESSAGE TOO LONG 
 P        ERR    MESSAGE TOO LONG 
 MMSGORD  SET    MMSGORD+1                BUMP ORDINAL
          IFGT   MMSGORD,BD.MSGMN,1       TEST TOO MANY MESSAGES
 P        ERR    TOO MANY MESSAGES
 MMSGL    SET    MMSGORD*BD.MSGML         SET CM WORD COUNT 
          ENDM
          EJECT 
 START    LJM    **          ENTRY POINT FOR OVERLAY INITIALIZATION 
          LJM    INIT 
  
          VFD    12/IB       FWA OF INPUT BUFFER
          VFD    12/OB       FWA OF OUTPUT BUFFER 
          VFD    12/SB       FWA OF STATUS BUFFER 
          VFD    12/LIB      LENGTH OF INPUT BUFFER 
          VFD    12/LIB      LENGTH OF OUTPUT BUFFER
          VFD    12/LSB      LENGTH OF STATUS BUFFER
          VFD    12/BD.VERS  VERSION NUMBER 
  
*         FIXED ADDRESS TABLE OF SUBROUTINE ENTRY POINTS
  
 XREL     LJM    ** 
          LJM    REL         RELEASE SUBROUTINE 
  
 XRES     LJM    ** 
          LJM    RES         RESERVE SUBROUTINE 
  
 XDIAG    LJM    ** 
          LJM    DIAG        DIAGNOSTIC WRITE, READ, WRITECB, AND READCB
  
 XGET     LJM    ** 
          LJM    GET         GET SERIAL/FACTORY/UTILITY SECTOR
  
 XMARGINS LJM    ** 
          LJM    MARGINS     SELECT OFFSET AND STROBE MARGINS SUBROUTIN 
  
 XRDWR    LJM    ** 
          LJM    RDWR        READ,READCW, WRITE, VERIFY SUBROUTINE
  
 XRESET   LJM    ** 
          LJM    RESET       AUTOLOAD BC SUBROUTINE/
  
 XRTNADD  LJM    ** 
          LJM    RTNADDR     RETURN ADDRESS SUBROUTINE
  
 XSEEK    LJM    ** 
          LJM    SEEK        SEEK SUBROUTINE
  
 XSHORT   LJM    ** 
          LJM    SHORTRD     READ SHORT SUBROUTINE
  
 XSTATUS  LJM    ** 
          LJM    STATUS      STATUS SUBROUTINE
  
 XREFORM  LJM    ** 
          LJM    REFORM      REFORM SUBROUTINE
  
 XSCAN    LJM    ** 
          LJM    SCAN        SCAN SUBROUTINE
  
 XWRPRO   LJM    ** 
          LJM    WRPRO       WRITE PROTECTED SECTOR SUBROUTINE
          EJECT 
 REL      TITLE  REL - RELEASE CONTROLLER AND DRIVE IF CONNECTED. 
**        REL    - RELEASE CONTROLLER AND DRIVE IF CONNECTED. 
* 
*                  REL, ABT Z 
* 
*         ENTRY  - (A) = ABORT ADDRESS IN CASE OF AN I/O ERROR DURING 
*                  THE RELEASE SEQUENCE.
* 
*         EXIT   - DEVICE CONNECT HAS BEEN RELEASED IF ASSIGNED AND THE 
*                  CHANNEL IS RELEASED TO THE SYSTEM. 
* 
*         USES   - P
* 
*         CALLS  - ERA, OPC, BD.DCH 
* 
  
**     1. DISCONNECT DRIVE AND CONTROLLER WITH AN OPERATION COMPLETE
*         FUNCTION IF EITHER IS CONNECTED.
* 
*      2. DROP THE I/O CHANNEL TO THE OPERATING SYSTEM IF ASSIGNED. 
* 
 REL      RJM    ERA         SAVE ABT ADDRESS IN CASE OF ERROR
          RJM    OPC         RELEASE THE EQUIPMENT IF CONNECTED 
          RJM    BD.DCH      DROP CHANNEL/TALK TO SYSTEM AND EXEC 
          LJM    XREL        EXIT TO CALLER 
          EJECT 
 RES      TITLE  RES - RESERVE CONTROLLER OR CONTROLLER AND DRIVE.
**        RES    - RESERVE CONTROLLER OR CONTROLLER AND DRIVE.
* 
*                  RES CONTROLLER, ABT Z
*                  RES DRIVE, ABT Z 
* 
*         ENTRY  - (A) = ABORT ADDRESS IN CASE OF I/O ERROR DURING THE
*                  EXECUTION OF THE RELEASE SEQUENCE. 
*                  (PA) = CONTROLLER/DRIVE FLAG.
* 
*         EXIT   - I/O CHANNEL ASSIGNED AND CHANNEL ASSIGNED FLAGS ARE
*                  SET IN ALL THE OTHER SUBROUTINES.
* 
*                  ERRAGS  - IF ABNORMAL GENERAL STATUS 
*                  ERRCAS  - IF CHANNEL ACTIVE FROM SYSTEM
*                  ERRDCSM - IF DEVICE CODE/STATUS MISMATCH 
*                  ERRNRES - IF NOT RESERVED IN 5 MINUTES 
* 
*         USES   - EC, EA, EM, P, D.T3, D.T4, RESA, RES7, 
*                  COCON, DRCON, DST2, DEVTY, SBIE(SB25), RDW19 
* 
*         CALLS  - ERA, RES1, OPC, STS, DST, FNA, BD.RCH. 
  
**     1. DISCONNECT DRIVE AND CONTROLLER WITH AN OPERATION COMPLETE
*         FUNCTION IF EITHER IS CONNECTED.
* 
 RES      RJM    ERA         SAVE ABT ADDRESS IN CASE OF ERROR
  
**     2. CLEAR ERROR EXIT REGISTERS. 
* 
          LDN    0
          STD    EC          CLEAR ERROR REGISTERS
          STD    EA 
          STD    EM 
  
**     3. DROP/REQUEST I/O CHANNEL FROM THE SYSTEM. 
* 
 RES1     LDN    MAXITT      ITERATION COUNT FOR STATUS 
          STM    RESA        AND PAUSE LOOP 
          LDD    PA 
          STM    RES7        SAVE CONTROLLER/DRIVE CONNECT FLAG 
 RES2     RJM    OPC         TO RELEASE THE CONTROLLER IF SELECTED
          LDN    0
          STM    OPC1        SET CONTROLLER AND UNIT NOT RESERVED 
 RES2A    SOM    RESA        DECREMENT THE ITERATION COUNT
          PJN    RES3        IF NOT TIMED OUT 
          LDC    ER.NRES     ELSE ERROR EXIT
          LJM    ERR
 RES3     RJM    BD.RCH      DROP/REQUEST CHANNEL AS REQUESTED
          RJM    IJM         WAIT CHANNEL ACTIVE
          LDC    ER.CAS 
          AJM    ERR,CH      ERROR IF CHANNEL ACTIVE FROM SYSTEM
  
**     4. REQUEST AND INPUT GENERAL STATUS. 
* 
          LDC    TIMREL      DELAY CONSTANT FOR TIMEOUT 
          STD    D.T3        TO COUNT STATUS ITERATIONS 
 RES4     RJM    STS         TO GET GENERAL STATUE
          STM    SBIE        SAVE IT AS STATUS BEFORE ERROR TIME
  
**     5. IF BIT 2**10 IS SET, REPEAT STEP 4 UNTIL 500 MSEC HAS 
*         ELAPSED.  IF A RESERVE IS NOT SUCCESSFUL WITHIN THIS
*         TIME-FRAME, EXECUTE THE *REL* SEQUENCE TO COMMUNICATE 
*         WITH THE SYSTEM.  REPEAT THIS STEP UNTIL A RESERVE IS 
*         SUCCESSFUL OR 5 MINUTES HAVE ELAPSED. ABORT IF NO 
*         RESERVE IN 5 MINUTES. 
* 
          SHN    17D-CRES 
          PJN    RES6        IF COUPLER IS CONNECTED
          SOD    D.T3        DECREMENT LOOP COUNT 
          PJN    RES4        IF NOT TIMED OUT 
 RES5     UJN    RES2A       ELSE START NEXT ITERATION
  
**     6. SET THE CONTROLLER CONNECTED FLAG.
* 
 RES6     RJM    DST         GET DETAILED STATUS
          SHN    -9          POSITION CONTROLLER/UNIT RESERVE BITS
          LPN    2           MASK OFF CONTROLLER RESERVE BIT
 TRES     ADN    1           SET UNIT RESERVE BIT 
*         LDN    0           MODIFIED FOR FSC 
          STM    OPC1        SAVE DETAIL STATUS WD 13 FOR OPC 
  
  
**     7. EXIT IF THE KEYWORD *CONTROLLER* IS SPECIFIED.
* 
 RES6A    LDC    **          TYPE OF FUNCTION 
 RES7     EQU    *-1         *** CONNECT DRIVER/CONTROLLER FLAG 
          NJN    RES9        IF DRIVE CONNECT IS ALSO DESIRED 
          LJM    RES12       TEST FOR FMD TYPE CONTROLLER 
  
**     8. ISSUE A CONNECT FUNCTION AND OUTPUT THE UNIT NUMBER.
* 
 RES9     LDC    **          UNIT NUMBER STORED HERE
 UN       EQU    *-1
          STD    D.T4        SAVE FOR SUBROUTINE
 TRES3    SBN    40B
*         SBN    0           MODIFIED FOR FSC 
          MJN    RES13       IF LT 10  ERROR EXIT 
          LDN    CONN        LOAD CONNECT FUNCTION
          RJM    FNO         TO PERFORM FUNCTION AND OUTPUT CONTROL WOR 
  
**     9. REQUEST AND INPUT GENERAL AND DETAIL STATUS. VERIFY THAT
*         GENERAL STATUS IS 0000 OR 0002 AND  THAT  DETAIL  STATUS
*         INDICATES THAT THE UNIT ASSIGNED MATCHES THE DEVICE CODE
*         ASSIGNED. (FMD OR NOT). 
* 
          RJM    STS         TO GET STATUS
          SCN    2           TO TEST OTHER THAN BUSY
          ZJN    RES11       IF NO ERROR STATUS 
          SHN    17D-DRES    TO TEST THE DRIVE RESERVED BIT 
          PJN    RES10       IF THE UNIT IS NOT RESERVED
          SOD    D.T3        DECREMENT THE COUNT
          PJN    RES6A       IF NOT DONE WITH THIS ITERATION
          LJM    RES2        ELSE START ANOTHER ITERATION 
  
 RES10    LJM    ERRAGS 
  
 RES11    STM    DRCON       SET DRIVE CONNECTED FLAG 
          RJM    DST         GET DETAILED STATUS
          SHN    17-9        POSITION UNIT RESERVE BIT
 TRES1    MJN    RES12       IF UNIT RESERVED 
*         UJN    RES12       MODIFIED FOR FSC 
          SOM    OPC1        CLEAR UNIT RESERVED BIT
 RES12    LDM    SB+4        DS WD WITH CTRLWARE NO. AND UNIT NO. 
          SHN    17-10
 TRES2    MJN    RES15       IF FMD CONTROLLER
*         UJN    RES15       MODIFIED FOR FSC 
  
 RES13    LDC    ER.DCSM     ELSE ERROR EXIT
          LJM    ERR
  
 RES15    LJM    XRES        EXIT TO STACK
          EJECT 
 DIAG     TITLE  DIAG - DIAGNOSTIC READ.
**        DIAG   - DIAGNOSTIC READ TO INPUT BUFFER. 
*                  DIAGNOSTIC WRITE FROM OUTPUT BUFFER. 
* 
*                  DIAGRD, ABT Z
*                  DIAGWR, ABT Z
*                  READCB, ABT Z
*                  WRITECB, ABT Z 
* 
*         ENTRY  - (A)  = ABT ADDRESS 
*                  (PA) = FUNCTION CODE FOR DIAGRD OR DIAGWR
* 
*         EXIT   - ERRNIDT - IF NO INACTIVE AFTER DATA TRANSFER 
* 
*         USES   - P, RDWRF, WT, IB(0-501), D.T1
* 
*         CALLS  - TCO, FNC, IJM
* 
  
**     1. VERIFY THAT THE CONTROLLER IS CONNECTED.
* 
 DIAG     RJM    TCO         TEST CONTROLLER CONNECTED
          STD    WT          CLEAR THE DIFFERENCE REGISTER
          LDD    PA          GET THE FUNCTION PARAMETER 
          SBN    DR 
          ZJN    DIAG1       IF DIAGNOSTIC READ 
          SBN    RCB-DR 
 DIAG1    STD    RDWRF       SET THE READ WRITE FLAG
  
**     2. ISSUE A 32 FUNC(DIAGRD), 33 FUNC(DIAGWR) , 43 FUNC(READCB)
*         OR 44 FUNC(WRITECB) 
* 
          LDD    PA          GET THE FUNCTION 
          RJM    FNC         TO PERFORM THE FUNCTION
  
**     3. INPUT 322D WORDS FROM THE SUBSYSTEM MEMORY TO THE INPUT 
*         BUFFER IF A DIAGRD OR READCB. 
* 
          ACN    CH          ACTIVATE THE CHANNEL 
          LDD    RDWRF       IS IT WRITE (NOT ZERO) OR READ (ZERO)
          NJN    DIAG2       IF IT IS A WRITE 
          LDD    WC 
          IAM    IB,CH       READ TO INPUT BUFFER 
          UJN    DIAG3
  
**     4. OUTPUT 322B WORDS FROM THE OUTPUT BUFFER TO THE SUBSYSTEM 
*         IF A DIAGWR OR WRITECB. 
* 
 DIAG2    LDD    WC          LOAD WORD COUNT
          OAM    OB,CH       WRITE FROM THE OUTPUT BUFFER 
  
**     5. VERIFY THAT 322B WORDS WERE ACTUALLY INPUT. 
* 
 DIAG3    STD    D.T1        SAVE COUNT OF WORDS NOT WRITTEN
          SFM    ERCPE1,CH   CHECK FOR CH PARITY ERROR
          LDD    WC          LOAD THE EXPECTED WORD COUNT 
          SBD    D.T1 
          STD    WT          STORE THE WORDS ACTUALLY TRANSFERED
  
 DIAG4    DCN    CH+40B      DEACTIVATE THE CHANNEL 
 DIAG5    LDD    D.T1 
          ZJN    DIAG6       IF ALL WORDS TRANSFERED
          LJM    RDW36
  
 DIAG6    LJM    XDIAG       EXIT TO STACK
          EJECT 
 REFORM   TITLE  REFORM - PROCESS REFORM COMMAND. 
**        REFORM - PROCESS REFORM COMMAND.
* 
*                  REFORM X,ABT Z 
* 
*         ENTRY  - (A) = ABORT ADDRESS. 
*                  (PA)= FWA OF 7 PARAMETER WORDS TO SEND.
* 
*         EXIT   - RDW6   - IF ACCESS LEVEL NOT 4 OR GREATER. 
*                  RDW37  - IF ALL DATA NOT ACCEPTED. 
* 
*         USES   - PA, PA+1, WT, PA+4, D.Z1, REF2.
* 
*         CALLS  - BD.TEST - TEST BUFFER ADDRESS FOR RANGE OF IB-OB.
*                  FNO     - SEND FUNCTION PLUS PARAMETER.
*                  TDR     - TEST DRIVE RESERVE.
* 
  
**        1. VERIFY DRIVE IS CONNECTED. 
* 
 REFORM   RJM    TDR         CALLER ENTRY POINT 
  
**        2. CLEAR WORDS TRANSMITTED, THEN TEST ACCESS LEVEL FOR 4 OR 
*            GREATER, IF NOT ERROR EXIT ELSE STEP 3.
* 
          LDD    AL 
          SBN    4
          PJN    REF1        IF AL=4 OR GREATER 
          LJM    RDW6 
  
**        3. TEST BUFFER ADDRESSES FOR WC ERROR.
* 
 REF1     LDN    7
          STD    PA+1        STORE WORD COUNT 
          STD    PA+4        STORE WORD COUNT 
          RJM    BD.TEST     TEST ADDRESS FOR RANGE IB-OB 
  
**        4. OUTPUT FORMAT FUNCTION AND SEVEN WORDS OF DATA.
* 
          LDM    1,PA 
          SCN    77B
          ADM    UN 
          STM    1,PA 
          LDD    PA 
          STM    REF2        STORE OUTPUT ADDRESS 
          LDN    FMT         LOAD FORMAT FUNCTION 
          RJM    FNC         SEND FORMAT FUNCTION 
          ACN    CH 
          LDN    7
          OAM    OB,CH       SEND SEVEN WORDS TO FMD CONTROLLER 
 REF2     EQU    *-1
          STD    D.Z1 
  
**        5. IF ALL DATA ACCEPTED RETURN TO STACK ELSE ERROR EXIT 
*            RDW37 .
* 
          ZJN    REF3        IF ALL WORDS ACCEPTED
          LJM    RDW37       ERROR EXIT DATA NOT ACCEPTED 
  
 REF3     DCN    CH 
          LJM    XREFORM     RETURN TO CALLER 
          EJECT 
 GET      TITLE  GET- READ SERIAL, FACTORY OR UTILITY FLAW MAP SECTORS. 
**        GET    - READ SERIAL, FACTORY OR UTILITY FLAW MAP SECTORS.
* 
*                  GET SERIAL, ABT Z
*                  GET FACTORY SECTOR X, ABT Z
*                  GET FACTORY SEC X, ABT Z 
*                  GET UTILITY SECTOR X, ABT Z
*                  GET UTILITY SEC X, ABT Z 
* 
*         ENTRY  - (A)    = ABT ADDRESS 
*                  (PA)   = CODE------- 0 = SERIAL
*                  (PA+1) = SECTOR      1 = FACTORY 
*                                       2 = UTILITY 
*         EXIT   - NONE 
* 
*         USES   - P, CC, CT, CS, CL, D.T5, D.T6, D.T7, 
*                  COD, RDWRF 
* 
*         CALLS  - TDR, RDW0
* 
  
**     1. VERIFY THAT THE DRIVE IS CONNECTED. 
* 
 GET      RJM    TDR         CALLER ENTRY POINT 
          STD    COD         ELIMINATE CODED DATA CHECK 
          STD    RDWRF       INDICATE A READ OPERATION
  
**     2. EXECUTE THE SEEK SEQUENCE TO SEEK TO CYLINDER 1511B. THE
*         SEEK IS PERFORMED TO TRACK 0 SECTOR X FOR FACTORY OR
*         TRACK 1 FOR SERIAL OR UTILITY (X BASED ON KEYWORDS
*         SERIAL, FACTORY OR UTILITY).
* 
 FMAP     LDC    MAPCYL      CODE TO SET UP FOR THE SEEK
*         LDC    FMAPCY      *MODIFIED IF FSC 
          STD    D.T6        MAP CYLINDER NUMBER
          LDN    D.T6        TO SET FOR SEEK
          STD    CC          INDIRECT MEMORY REF. 
          LDN    D.T7 
          STD    CT 
          LDD    PA+1 
          STM    GETA 
          LDC    GETA 
          STD    CS 
          LDN    1
          STD    D.T5        STORE NUMBER OF SECTORS TO READ
          LDN    D.T5 
          STD    CL          SET ADDRESS OF SECTORS TO READ 
  
**     3. EXIT TO READ WRITE ROUTINE RDWR STEP 2. 
* 
          LDD    PA 
 GET0     SBN    1
*         LDN    0           USE TRACK 0 ON FSC 
          ZJN    GET1        IF GET FACTORY 
          LDN    1           ELSE USE TRACK 1 
 GET1     STD    D.T7        STORE TRACK
          LDD    PA 
          SHN    0-1
          ADN    RFD         LOAD THE FUNCTION
          LJM    RDW0        READ ONE SECTOR
  
 GETA     DATA   0           STORAGE FOR SECTOR NUMBER
          EJECT 
 MARGINS  TITLE  MARGINS - PROCESS MARGINS COMMAND. 
**        MARGINS- SAVE STROBES AND OFFSET MARGINS FOR LATER READS. 
* 
*                  MARGINS W, ABT Z 
*                  MARGINS X OFFSET Y STROBES, ABT Z
* 
*         ENTRY  -  (A)  = ABT ADDRESS
*                   (PA) = MARGINS
* 
*         EXIT   - MARGINS PARAMETER CONVERTED FOR FUNCTION 
* 
*                  ERRISO  - IF ILLEGAL STROBE/OFFSET WERE SELECTED 
* 
*         USES   - P, MARGINSA
* 
*         CALLS  - ERA
* 
  
**     1. VERIFY THAT MARGINS ARE LEGAL.
* 
 MARGINS  RJM    ERA         CALLER ENTRY POINT 
          LDD    PA          MARGIN PARAMETER WORD
          SCN    33B         MASK OUT LEGAL BITS
          ZJN    MARGINS1    IF LEGAL PARAMETERS
          LDC    ER.ISO      ERROR EXIT 
          LJM    ERR
  
**     2. SAVE SELECTED MARGINS.
* 
 MARGINS1 LDD    PA          PARAMETER WORD 
          SHN    2           LINE IT UP 
          LPN    4           MASK IT
          STM    MARGINSA    STORE FORWARD OFFSET 
          LDD    PA          PARAMETER WORD 
          LPN    32B         MASK IN THE OTHER BITS 
          SHN    4           SHIFT TO CORRECT BIT POSITION
          RAM    MARGINSA    STORE IT 
          LJM    XMARGINS    EXIT TO CALLER 
          EJECT 
 RDWR     TITLE  RDWR - SEEK AND I/O THE REQUESTED NUMBER OF SECTORS. 
**        RDWR   - SEEK AND I/O THE REQUESTED NUMBER OF SECTORS.
* 
*                  READ V SECTORS AT CYL W TRK X SEC Y, ABT Z 
*                  READ V CODED SECTORS AT CYL W TRK X SEC Y, ABT Z 
*                  READCW V SECTORS AT CYL W TRK X SEC Y, ABT Z 
*                  VERIFY V SECTORS AT CYL W TRK X SEC Y, ABT Z 
*                  VERIFY V CODED SECTORS AT CYL W TRK X SEC Y, ABT Z 
*                  WRITE V SECTORS AT CYL W TRK X SEC Y, ABT Z
*                  WRITE V CODED SECTORS AT CYL W TRK X SEC Y, ABT Z
* 
*         ENTRY  - (A)      = ABT ADDRESS 
*                  (PA)     = BITS 0-2 = FUNCTION CODE
*                             BIT 4    = UNCODED/CODED FLAG 
*                             BIT 5    = READ/WRITE FLAG
* 
*                  (PA+63B) = V 
*                  (PA+65B) = W 
*                  (PA+66B) = X 
*                  (PA+67B) = Y 
* 
*         EXIT   - V = ZERO,
*                  W, X, _ Y = LAST CYL, TRK, _ SEC.
* 
*                  ERRDCE  - IF DATA COMPARE ERROR
*                  ERRDNA  - IF ALL DATA NOT ACCEPTED FROM PP 
*                  ERRIAL  - IF ACCESS LEVEL TO LOW FOR REQUEST 
*                  ERRIDR  - IF INCOMPLETE DATA RETURNED TO PP
*                  ERRGSNR - IF GENERAL STATUS NOT RETURNED 
*                  ERRNIDT - IF NO INACTIVE AFTER DATA TRANSFER 
*                  ERRNIF  - IF NO INACTIVE TO LAST FUNCTION
*                  ERRNIGS - IF NO INACTIVE TO GENERAL STATUS 
*                  ERRSTRY - IF A SUCCESSFUL RETRY HAS OCCURRED 
* 
*         USES   - RDWRF,  COD,  FUN,  D.T1, D.T2, D.T4, SB(0-51),(CL), 
*                  (CT), (CS), SBIE(SB(25-51)), D.Z0, D.Z1,  D.Z2,  WT, 
*                  IR(0-501,  OR(1-3)  RDW16,  RDW23+1,  RDW18,  RDW22, 
*                  RDW25, RDW47, RDW46
* 
* 
*         CALLS  - SEEK1, RDW, STS, DST 
* 
  
**     1. VERIFY THAT THE DRIVE IS CONNECTED. 
* 
 RDWR     RJM    TDR         CALLER ENTRY POINT 
  
**     2. VALIDATE  ACCESS  TO  THE  CYLINDER  SPECIFIED  BY W AND
*         EXECUTE THE SEEK SEQUENCE TO MOVE THE DISK POSITIONER.
* 
          LDD    PA 
          SHN    18D-5D      SHIFT READ/WRITE FLAG TO BIT 0 
          STD    RDWRF       SET/CLEAR READ/WRITE FLAG
          SCN    1           CLEAR THE BIT
          SHN    18D-4D-18D+5D SHIFT CODED FLAG TO BIT 0
          STD    COD         SET/CLEAR THE CODED FLAG 
          SHN    0-14D       SHIFT IN THE FUNCTION
  
*         ENTRY POINT FOR GET AND SHORTRD 
  
 RDW0     STD    FUN         SAVE THE FUNCTION
          LDC    0303B
          STM    RDW16       INDICATE NO RETRY
          LDC    RDW24
          STM    RDW23+1     SET JUMP ADDRESS FOR ALL BUT READCW
          LDM    RDWAL,RDWRF LOAD THE ACCESS LEVEL REQUIRED 
          STD    D.T1 
          LDD    RDWRF       IS IT WRITE (NOT ZERO) OR READ (ZERO)
          ZJN    RDW2        IF IT IS A READ
          LDD    COD         GOT THE CODED WORD 
          ZJN    RDW1        IF NOT CODED 
          LDI    CC 
          STM    OB+1 
 RDW1     LDC    0302B       FOR WRITE TYPE OPERATION FLAG
 RDW2     STM    RDW18       AND MODIFY REQUIRED LOCATIONS
          STM    RDW22
          STM    RDW25
          STM    RDW34A 
          LDD    COD
          NJN    RDW3 
          STM    RDW22
  
 RDW3     LDN    RETRY-SB 
          STD    D.T2        NUMBER OF WORDS IN SB TO CLEAR 
 RDW4     LDN    0
          STM    SB,D.T2     CLEAR THE STATUS BUFFER
          SOD    D.T2 
          PJN    RDW4        IF NOT DONE
          LDD    FUN
          LMN    RDCW 
          NJN    RDW5        IF NOT READCW
          LDC    RDW30
          STM    RDW23+1     SET JUMP ADDRESS FOR READCW
          UJN    RDW7        IGNORE ACCESS LEVEL ON READCW
  
 RDW5     LDD    BD.AL
          SBD    D.T1        TO TEST ACCESS LEVEL 
          PJN    RDW7        IF ACC.LEV. NOT PREALLOCATED AREA. 
          ADN    1           TO VERIFY ANY OPERATION OK 
          MJN    RDW6        IF PREALLOCATED OPERATION IS NOT OK
 FMAP1    LDC    MAXCDD      *MAXIMUM CYLINDER ADDRESS
*         LDC    FMAPCY      *MODIFIED IF FSC 
          SBN    PRECYL      SUBTRACT PREALLOCATED CYLINDERS
          SBI    CC          CURRENT CYLINDER 
          MJN    RDW7        IF CYL DESIRED IS IN PREALLOCATED AREA 
 RDW6     LDC    ER.IAL      ELSE ERROR EXIT
          LJM    ERR
  
 RDW7     RJM    SEEK1       TO SEEK TO DESIRED CYLINDER
  
**     3. EXECUTE  A  NORMAL EXIT IF THE CONTENTS OF REGISTER V IS
*         ZERO (NO SECTORS TO READ).
* 
          LDI    CL          LOAD THE REMAINING SECTOR COUNT
          SHN    -2 
          RAD    RT 
          LDI    CL 
          NJN    RDW11       IF THERE ARE SECTORS TO READ 
  
*         AN EXIT POINT 
  
 RDW8     LDD   FUN          LOAD THE CURRENT FUNCTION
          LMN    RS          MASK FOR SHORTRD 
          NJN    RDW9        IF NOT A SHORT READ
          LJM    XSHORT      EXIT TO SHORT READ 
  
 RDW9     LDD    FUN          LOAD THE CURRENT FUNCTION 
          LMN    RFD         TEST IF A GET OPERATION
          SHN    0-1
          NJN    RDW10       IF IT IS NOT A GET OPERATION 
          LJM    XGET        EXIT TO GET ROUTINE
  
 RDW10    LJM    XRDWR       EXIT TO STACK
  
**     4. ISSUE SELECTED STROBES AND OFFSET OPTIONS IF  THEY  HAVE
*         BEEN DEFINED BY A PREVIOUS MARGINS COMMAND. 
* 
 RDW11    LDD    RDWRF       IS IT WRITE (NOT ZERO) OR READ (ZERO)
          NJN    RDW12       SKIP MARGINS ON WRITE OPERATIONS 
          LDC    **          *** STROBE AND OFFSET SELECTIONS 
 MARGINSA EQU    *-1
 FMAR     ZJN    RDW12
*         UJN    RDW12       MODIFIED IF FSC
          STD    D.T4        SAVE FOR MARGINS FUNCTION
          LDN    SSO         LOAD THE FUNCTION
          RJM    FNO         TO SEND MARGIN FUNCTION
  
**     5. CALCULATE THE NUMBER OF SECTORS THAT  CAN  BE  PROCESSED
*         FROM THE CURRENT TRACK AND SECTOR SPECIFIED BY REGISTERS
*         X AND Y TO THE END OF THE CURRENT  CYLINDER.  SET  THE
*         NUMBER  OF SECTORS TO READ THIS VALUE  OR THE  CONTENTS 
*         OF REGISTER V,  WHICHEVER IS SMALLER.   ( NOTE THAT THE 
*         MAXIMIM  NUMBER  OF  SECTORS  ( I/O LENGTH ) THAT CAN BE
*         PROCESSED  IS 1280D ( ONE CYLINDER ). 
* 
 RDW12    LDN    TRL
*         LDN    35          *MODIFIED IF FSC 
          SBI    CT          BEGINNING TRACK
 FRDW12   SHN    5
*         SHN    2
          PSN                *STD          D.Z3 
          PSN                *SHN          3
          PSN                *SBD          D.Z3 
          STD    D.T4 
 FSEL1    LDN    SEL+1
*         LDN    FSEL+1      MODIFIED IF FSC
          SBI    CS          TO GET NUMBER OF SECTORS IN THIS TRACK 
          RAD    D.T4        SECTORS REMAINING IN CYL.
          SBI    CL          SECTORS TO READ
          PJN    RDW13       IF LESS THAN SECTORS IN CYLINDER 
          LDD    D.T4        SAVE THE SECTOR COUNT FOR THIS CYLINDER
          STI    CL 
 RDW13    UJN    RDW17
          EJECT 
* ******************************************************************
* ******************************************************************
*                                                                  *
*                                                                  *
*             NOTE.. NOTE.. NOTE.. NOTE..                          *
*                                                                  *
*             THIS IS THE START OF CODE IN  WHICH                  *
*             THE TIMING IS CRITICAL WITH RESPECT                  *
*             TO THE DISK DRIVES.                                  *
*                                                                  *
*             AFTER THE LAST  INTERMITTENT  ERROR                  *
*             INDICATE BY A LOST DATA CONTITION A                  *
*             CHANGE WAS MADE TO REMOVE  7  MICRO                  *
*             SECONDS OF CODE. ALL TEST CASES NOW                  *
*             RUN. IF CHANGES ARE REQUIRED DO THE                  *
*             FOLLOWING;                                           *
*                                                                  *
*             1. READ THE REFERENCE MANUALS.                       *
*             2. ANALYZE AND UNDERSTAND THE CODE.                  *
*             3. PERFORM A THOROUGH TEST ON ALL                    *
*                SUPPORTED DEVICES, AND ALLOW                      *
*                FOR POOR HEAD SWITCH TIMING.                      *
*                                                                  *
  
**     6. PASS
* 
**     7. DECREMENT  THE  CONTENTS OF REGISTER V BY ONE (NUMBER OF
*         SECTORS REMAINING TO BE READ). IF THE  RESULT  IS  ZERO,
*         PERFORM A NORMAL COMMAND EXIT.
* 
 RDW14    LDM    SB 
          ZJN    RDW16       IF NO STATUS ERROR 
  
*         AN ERROR HAS OCCURRED, SO THE BUMPING OF SECTORS THAT 
*         HAVE BEEN DONE MUST BE REVERSED AS THEY WERE ADVANCED.
  
          AOI    CL          BUMP NUMBER OF SECTORS TO DO 
          SBN    1
          ZJN    RDW15       IF LAST SECTOR, SKIP TRACK/SECTOR
          SOI    CS          DECREMENT THE SECTOR REGISTER
          PJN    RDW15       IF NO SECTOR UNDERFLOW 
 FSEL2    LDN    SEL
*         LDN    FSEL        MODIFIED IF FSC
          STI    CS          RESET SECTOR REGISTER TO ZERO
          SOI    CT          DECREMENT TRACK
 RDW15    LJM    RDW39       PROCESS ERROR
  
**     8. INCREMENT THE CONTENTS OF REGISTERS W,X,Y PER THE 
*         1-1 INTERLACE FLOW-CHART. IF WE ARE ABOUT TO WRITE THE
*         LAST SECTOR ON A 7155 CONTROLLER, A WRITE LAST SECTOR 
*         FUNCTION IS USED (0036 FOR WRITE, OR 0037 FOR WRITE VERIFY).
* 
 RDW16    UJN    *+3         *** JUMP *+3 IF NO RETRY 
*         DATA   0           *** DATA 0 IF RETRY DONE 
          LJM    ERRSTRY     EXIT ON SUCCESSFUL RETRY 
  
 RDW17    LDI    CL 
          NJN    RDW18       IF MORE SECTORS TO PROCESS 
          LJM    RDW8        IF DONE
  
 RDW18    UJN    *+2         *** UJN *+2 FOR A WRITE TYPE FUNCTION
*         DATA   0           *** DATA  0 FOR A READ TYPE FUNCTION 
          UJN    RDW20       IF READ
  
          LMN    1
 RDW19    NJN    RDW20       IF NOT THE LAST SECTOR 
          LDD    FUN
          SBN    37B
          ZJN    RDW20       IF WRITE PROTECTED SECTOR
          ADN    37B+30B     CREATE WRITE LAST SECTOR FUNCTION
          UJN    RDW21       TO PERFORM THE FUNCTION
  
**     9. ISSUE A FUNCTION TO READ, READCW, WRITE VERIFY, WRITE,
*         CONTINUE, WRITE VERIFY LAST SECTOR, OR WRITE LAST SECTOR. 
* 
 RDW20    LDD    FUN         LOAD THE FUNCTION
 RDW21    FAN    CH          SEND THE FUNCTION
          STD    LF          SAVE THE FUNCTION
  
 RDW22    UJN    *+2         *** UJN *+2 FOR A WRITE TYPE FUNCTION
*         DATA   0           *** DATA  0 FOR A READ TYPE FUNCTION 
          UJN    RDW23       IF READ
  
**    10. IF  THE KEYWORD CODED WAS SPECIFIED IN THE WRITE OR VERIFY
*         COMMAND, STORE THE FOLLOWING DATA INTO THE PP OUTPUT BUFFER.
* 
*           OB(1) TO REGISTER W (CYLINDER)
*           OB(2) TO REGISTER X (TRACK) 
*           OB(3) TO REGISTER Y (SECTOR)
* 
          LDI    CT 
          STM    OB+2        SET THE TRACK CODING 
          LDI    CS 
          STM    OB+3        SET THE SECTOR CODING
  
 RDW23    IJM    RDW24,CH    IF CHANNEL DEACTIVATED 
*         IJM    RDW30       *** IF READCW COMMAND
          ADN    1
          STD    WT          *INCREASE THE TIME LIMIT 
          STD    WT          *INCREASE THE TIME LIMIT 
          NJN    RDW23
          LJM    ERRNIF      ELSE ERROR EXIT
  
**    11. INPUT OR OUTPUT THE NUMBER OF WORDS SPECIFIED BY WC TO/FROM 
*         THE PP INPUT/OUTPUT BUFFER. IF THE A REGISTER IS NON ZERO 
*         AFTER COMPLETION, GO TO STEP 14.
* 
 RDW24    ACN    CH          ACTIVATE THE CHANNEL 
          LDD    WC          GET THE WORD COUNT 
          STD    WT          PRESET WT ASSUME GOOD READ OR WRITE
 RDW25    UJN    *+2         *** UJN *+2 FOR A WRITE TYPE FUNCTION
*         DATA   0           *** DATA  0 FOR A READ TYPE FUNCTION 
          UJN    RDW26       IF READ FUNCTION 
  
          OAM    OB,CH       OUTPUT THE DATA
          NJN    RDW27       IF WRITE ABORT 
          DCN    CH+40B      DISCONNECT THE CHANNEL 
          UJN    RDW30       TO STATUS
  
 RDW26    IAM    IB,CH       INPUT THE DATA 
          SFM    ERCPE1,CH   CHECK FOR CH PARITY ERROR
          ZJN    RDW28       IF READ ABORT
 RDW27    LJM    RDW35       TO PROCESS THE ERROR 
 RDW28    IJM    RDW30,CH    IF CHANNEL DEACTIVATED PROPERLY
           ADN    1 
           PJN    RDW28       IF NOT TIMED OUT
          LJM    ERRNIDT     ELSE ERROR EXIT
  
**    12. REQUEST  AND  INPUT  GENERAL  STATUS TO DETERMINE IF THE
*         OPERATION COMPLETED SUCCESSFULY. IF  GENERAL  STATUS  IS
*         ZERO (NO ERROR), GO TO STEP 13. EXECUTE THE  ERROR  EXIT
*         SEQUENCE  IF  THE  RETRY  COUNT  IN THE STATUS BUFFER IS
*         NON-ZERO (THE READ OF THIS  SECTOR  HAS  BEEN  COMPLETED
*         SUCCESSFULLY  BUT  A  RETRY WAS REQUIRED, SO CONTROL  IS
*         RETURNED TO THE USER FOR  POSSIBLE  MESSAGE  REPORTING).
* 
 RDW30    FNC    GS,CH       FUNCTION FOR GENERAL STATUS
  
          RJM    IJM         WAIT CHANNEL INACTIVE
          NJN    RDW33
          LJM    ERRNIGS     ELSE ERROR EXIT
  
 RDW33    ACN    CH          ACTIVATE THE CHANNEL 
          LCN    0
          IAN    CH          AND INPUT TO A 
          STM    SB          SAVE STATUS
          IJM    RDW34A,CH   IF CHANNEL DEACTIVATED 
          LMC    7777B
          ZJN    RDW34       IF NO GENERAL STATUS RECEIVED
 RDW33A   IJM    RDW34A,CH   IF CHANNEL DEACTIVATED 
          ADN    1
          PJN    RDW33A      IF NOT TIMED OUT 
 RDW34    LJM    ERRGSNR     THE CHANNEL DIDNT DEACTIVATE 
  
**    13. IF  THE KEYWORD CODED WAS SPECIFIED IN THE READ COMMAND,
*         COMPARE THE CONTENTS OF THE FOLLOWING_
* 
*           IB(1) TO REGISTER W (CYLINDER)
*           IB(2) TO REGISTER X (TRACK) 
*           IB(3) TO REGISTER Y (SECTOR)
* 
*         IF A NON-COMPARE IS DETECTED,  EXECUTE  THE  ERROR  EXIT
*          SEQUENCE.
* 
 RDW34A   UJN    *+2         *** UJN *+2 FOR A WRITE TYPE FUNCTION
*         DATA   0           *** DATA  0 FOR A READ TYPE FUNCTION 
          UJN    RDW34C      IF READ
  
 RDW34B   UJN    RDW34D      LOOP ON WRITE OPERATION
  
 RDW34C   LDM    IB+1        CHECK FOR CORRECT CODING 
          ADM    IB+2 
          ADM    IB+3 
          SBI    CC          FOR CODING CHECK 
          SBI    CT 
          SBI    CS 
          ZJN    RDW34D      IF NO CODING ERROR 
          LDD    COD         CODED DATA FLAG
          ZJN    RDW34D      IF NOT CODED DATA
          RJM    STS         GET GENERAL STATUS 
          LDC    ER.DCE      ERROR EXIT FOR CODED ERROR 
          UJN    RDW38
  
  
 RDW34D   SOI    CL          DECREMENT SECTORS TO PROCESS 
          ZJN    RDW34E      IF NO MORE SECTORS TO DO 
          AOI    CS          BUMP SECTOR
 FSEL3    SBN    SEL+1
*         SBN    FSEL+1 
          MJN    RDW34E      IF NOT COMPLETE THIS TRACK 
          STI    CS          SET SECTOR TO ZERO 
          AOI    CT          BUMP THE TRACK 
 RDW34E   LJM    RDW14
*                                                                   * 
*                   END OF CRITICAL CODE                            * 
*                                                                   * 
* ******************************************************************* 
* ******************************************************************* 
  
  
**    14. PROCESS FOR READ ABORT BECAUSE THE  A  REGISTER IS NOT EQUAL
*         ZERO. SAVE THE COUNT OF ACTUAL WORDS READ IN LOCATION  WT 
*         AND EXIT. 
* 
 RDW35    STD    D.T1        SAVE THE REMAINING WORD COUNT
          LDD    WC          LOAD THE WORD COUNT
          SBD    D.T1        SUBTRACT THE REMAINDER 
          STD    WT          SAVE IT
          RJM    STS         TO PROVIDE ERROR STATUS
 RDW36    LDD    RDWRF       IS IT WRITE (NOT ZERO) OR READ (ZERO)
          NJN    RDW37       IF IT IS A WRITE 
 RDW36A   LDC    ER.IDR      ELSE ERROR EXIT
          UJN    RDW38
  
 RDW37    LDC    ER.DNA      ERROR EXIT 
 RDW38    LJM    ERRDST      GO GET DETAIL STATUS AND ERROR EXIT
  
**    15. REQUEST AND INPUT DETAIL STATUS.  EXECUTE THE ERROR EXIT
*         SEQUENCE IF BIT 2**9 IS SET IN GENERAL STATUS.
*         (NONRECOVERABLE ERROR). 
* 
 RDW39    RJM    DST         TO GET DETAILED STATUS 
          LDM    SB          GENERALSTATUS
          SHN    17D-UNR
          PJN    RDW40       IF NOT A UNRECOVERED ERROR 
          LDD    FUN         GET THE CURRENT FUNCTION 
          LMN    RS          COMPARE WITH SHORT READ
          NJN    RDW41       IF NOT A SHORT READ
          LJM    RDW8        ELSE EXIT IF SHORT READ
  
**    16. IF BIT 2**8 IS CLEAR (NO RECOVERY IN PROGRESS) ENTER THE
*         ERROR EXIT SEQUENCE. (GENERAL STATUS AT  THIS  POINT  IS
*         STRANGE  SINCE  IT  IS NOT ZERO, BUT DOES NOT INDICATE A
*         RECOVERABLE OR NONRECOVERABLE ERROR). 
* 
 RDW40    SHN    17D-RIP-17D+UNR   TEST REC. IN PROGRESS
          MJN    RDW50       IF RECOVERY IN PROGRESS
 RDW41    LDC    ER.AGS 
          UJN    RDW44       JUMP TO ERR EXIT 
  
 ERRSTRY  EQU    *
          AOI    CL 
          SBN    1
          ZJN    RDW42
          SOI    CS 
          PJN    RDW42
          LDN    0
          STI    CS 
          SOI    CT 
 RDW42    LDD    FUN         GET THE CURRENT FUNCTION 
          LMN    RS          COMPARE WITH SHORT READ
          NJN    RDW43       IF NOT A SHORT READ
          LJM    RDW8        ELSE EXIT IF SHORT READ
  
 RDW43    LDC    ER.STRY     INDICATE SUCCESSFUL RETRY ERROR
 RDW44    LJM    ERR
  
**    17. IF BIT 2**8  IS SET (RECOVERY IN PROGRESS), DETERMINE IF
*         THE RETRY COUNT IN THE STATUS BUFFER IS ZERO (FIRST TIME
*         FAILURE).  IF SO, REQUEST AND INPUT  DETAIL  STATUS  AND
*         STORE  IT  AND GENERAL STATUS INTO WORDS 25B THRU 51B OF
*         THE STATUS BUFFER TO CAPTURE THE  ORIGINAL  STATUS  THAT
*         CAUSED  RECOVERY  TO  BE  PERFORMED.   ISSUE  A CONTINUE
*         FUNCTION  (0014), BUMP  THE  RETRY  COUNTER  IN  THE  PP
*         STATUS BUFFER AND GO TO STEP 6 TO PERFORM A RETRY OF THE
*         READ. 
* 
 RDW50    LDM    RETRY
          NJN    RDW52       IF NOT THE FIRST ERROR RETRY 
          STM    RDW16       INDICATE A RETRY TO CRITICAL TIMING LOOP 
          LDN    25B         ELSE MOVE THE INITIAL ERROR TO SBIE
          STD    D.T1 
 RDW51    LDM    SB,D.T1     LOAD A WORD
          STM    SBIE,D.T1   STORE A WORD 
          SOD    D.T1        DECREMENT THE COUNT
          PJN    RDW51       IF NOT DONE MOVING WORDS 
 RDW52    AOM    RETRY       INCREMENT THE RETRY COUNT
          SBN    28D
          PJN    RDW43       IF GT 27D RETRIES
          LDN    CONT        FOR THE CONTINUE FUNCTION
          LJM    RDW21       TO INPUT AFTER A CONTINUE
  
*         THE FOLLOWING FUNCTION TABLE MUST BE KEPT IN ORDER. 
  
 RDWAL    VFD    12/ARD      ACCESS LEVEL FOR READ ANYWHERE 
          VFD    12/ARW      ACCESS LEVEL FOR WRITE ANYWHERE
          EJECT 
 RESET    TITLE  RESET - AUTOLOAD THE BC TO RESTART CONTROLWARE.
**        RESET  - AUTOLOAD THE BC TO RESTART CONTROLWARE AT THE IDLE 
*                  LOOP.
* 
*                  RESET, ABT Z 
* 
*         ENTRY  - (A) = ABT ADDRESS
* 
*         EXIT   - NONE 
* 
*         USES   - P
* 
*         CALLS  - TCA, FNC 
* 
  
**     1. VERIFY THAT THE I/O CHANNEL IS ASSIGNED.
* 
 RESET    RJM    TCA         CHECK CHANNEL ASSIGNED AND SAVE ABORT ADDR 
  
**     2. ISSUE AN AUTOLOAD FUNCTION, ACTIVATE AND DEACTIVATE THE I/O 
*         CHANNEL TO CAUSE THE BC TO RE-START EXECUTION.
* 
          LDC    AUTO 
          RJM    FNC         TO FUNCTION AUTOLOAD 
          ACN    CH          ACTIIVATE THE CHANNEL
          LDN    40B         DELAY A LITTLE 
 RESET1   SBN    1
          NJN    RESET1      IF NOT END OF DELAY
          DCN    CH+40B      DEACTIVATE THE CHANNEL 
          STM    COCON       SET CONTROLLER CONNECTED FLAG
          LJM    XRESET      EXIT TO CALLER 
          EJECT 
 RTNADDR  TITLE  RTNADDR- PERFORM A RETURN CYLINDER ADDR FNC. 
**        RTNADDR- PERFORM A RETURN CYLINDER ADDRESS FUNCTION.
* 
*                  RTNADDR TO Y, ABT Z
* 
*         ENTRY  - (A)  = ABT ADDRESS 
*                  (PA) = Y 
* 
*         EXIT   - (PA) = THE ADDRESS RETURNED
* 
*                  ERRAGS  - IF ABNORMAL GENERAL STATUS 
*                  ERRNIDT - IF NO INACTIVE AFTER DATA TRANSFER 
*                  ERRWC   - IF BUFFER ADDRESS OR WC INCORRECT
* 
*         USES   - (PA), P
* 
*         CALLS  - TCO, STS, FNC, FJM, IJM
* 
  
**     1. VERIFY THAT THE CONTROLLER IS CONNECTED.
* 
 RTNADDR  RJM    TCO
  
**     2. VERIFY THAT Y IS IN RANGE OF THE INPUT BUFFER.
* 
          LDN    1
          STD    PA+1        WORD COUNT FOR RTNADDR 
          RJM    BD.TEST     TEST IF ADDRESS WITHIN RANGE 
  
  
**     3. REQUEST AND INPUT GENERAL STATUS AND VERIFY THAT IT IS ZERO.
* 
 RTNADDR2 RJM    STS         TO GET STATUS
          SHN    17D-BUSY 
          PJN    RTNADDR3    IF STATUS IS OK
          LJM    ERRAGS      ELSE ERROR EXIT
  
**     4. ISSUE A RETURN CYLINDER ADDRESS FUNCTION (0021).
* 
 RTNADDR3 LDN    RCA
          RJM    FNC         TO FUNCTION RETURN CYLINDER ADDRESS
  
**     5. PERFORM A ONE WORD INPUT AND STORE IT INTO THE INPUT BUFFER 
*         AT THE ADDRESS SPECIFIED BY Y.
* 
          ACN    CH          TO ACTIVATE AND
          RJM    FJM         WAIT FULL
          ZJN    RTNADDR4    IF NO FULL 
          IAN    CH          INPUT THE WORD 
          STI    PA          SAVE THE WORD
          RJM    IJM         INSURE THE CHANNEL DEACTIVATES 
          NJN    RTNADDR6    IF NOT TIMED OUT 
  
 ERRNIDT  EQU    *
 RTNADDR4 LDC    ER.NIDT     ELSE ERROR EXIT
 RTNADDR5 LJM    ERR
  
 RTNADDR6 LJM    XRTNADD     EXIT TO STACK
          EJECT 
 SCAN     TITLE  SCAN - SEND SCAN FUNCTION. 
**        SCAN - SEND SCAN FUNCTION.
* 
*                  SCAN,ABT Z 
* 
*         ENTRY  - (A) = ABORT ADDRESS. 
* 
*         EXIT   - NONE.
* 
*         USES   - NONE.
* 
*         CALLS  - TDR     - TEST DRIVE RESERVE.
*                  FNC     - SEND FUNCTION TO CONTROLLER. 
* 
  
**        1. TEST DRIVE CONNECTED.
* 
 SCAN     RJM    TDR
  
**        2. SEND SCAN FUNCTION TO FMD CONTROLLER.
* 
          LDN    FSCAN       SCAN FUNCTION
          RJM    FNC
  
**        3. RETURN TO CALLER.
* 
          LJM    XSCAN       RETURN TO CALLER 
          EJECT 
 SEEK     TITLE  SEEK - SEEK TO THE ADDRESS SPECIFIED.
**        SEEK   - SEEK TO THE ADDRESS SPECIFIED. 
* 
*                  SEEK CYL W TRK X SEC Y, ABT Z
* 
*         ENTRY  - (A)      = ABT ADDRESS 
*                  (PA+65B) = W 
*                  (PA+66B) = X 
*                  (PA+67B) = Y 
* 
*         EXIT   - SEEK COMPLETED TO NEW ADDRESS
* 
*                  ERRAGS  - IF ABNORMAL GENERAL STATUS 
*                  ERRCNC  - IF CONTROLLER/DRIVE NOT CONNECTED
*                  ERRFPNA - IF FUNCTION PARAMETERS NOT ACCEPTED
*                  ERRUHB  - IF THE UNIT IF BUSY FOR OVER 200 MSEC
* 
*         USES   - P, SEEKA(0-4), SBIE, D.T1, D.T2
* 
*         CALLS  - TDR, STS, FNC, DST 
* 
  
**     1. VERIFY THAT THE DRIVE IS CONNECTED. 
* 
 SEEK     RJM    TDR         SAVE ABORT ADDRESS,INSURE DR.CONN. 
          RJM    SEEK1       TO DO A SEEK 
          LJM    XSEEK       EXIT 
  
 SEEK1X   LJM    **          SECONDARY ENTRY/EXIT 
 SEEK1    EQU    *-1
          LDN    0           PROVIDES SEEK TIME BIASED BY MINUS ONE 
          STD    SEEKA       PRESET CURRENT SEEK TIME 
          RJM    STS         TO GET STATUS
          SHN    17D-CRES 
          PJN    SEEK3
 SEEK2    LJM    ERRCNC      ELSE IT IS AN ERROR
  
  
**     2. PRESET SEEK FUNCTION DATA 
* 
 SEEK3    LDM    UN          UNIT NUMBER
          STD    SEEKA+1
          LDI    CC          CURRENT CYLINDER 
          STD    SEEKA+2
          LDI    CT          CURRENT TRACK
          STD    SEEKA+3
          LDI    CS          CURRENT SECTOR 
          STD    SEEKA+4
  
**     3. ISSUE A 1/1 SEEK FUNCTION (0001). 
* 
          IANN   14B         INPUT THE REAL TIME CLOCK
          STD    D.T1 
 SEEK5    LDN    SEK11
          RJM    FNC         TO SEND A FUNCTION 
  
**     4. OUTPUT 4 SEEK PARAMETER WORDS AND STORE THE NUMBER OF WORDS 
*         ACTUALLY OUTPUT INTO THE WT REGISTER. VERIFY THAT 4 WORDS 
*         WERE ACTUALLY TRANSMITTED.
* 
          LDN    4           WORD COUNT 
          ACN    CH          ACTIVATE THE CHANNEL 
          OAM    SEEKA+1,CH  OUTPUT THE SEEK DATA 
          ZJN    SEEK6       IF OUTPUT COMPLETE 
          LJM    ERRFPNA     ELSE ERROR EXIT
  
 SEEK6    DCN    CH+40B      DEACTIVATE THE CHANNEL 
  
**     5. REQUEST AND INPUT GENERAL STATUS. 
* 
 SEEK7    RJM    STS         TO OBTAIN STATUS 
  
**     6. GO TO STEP 3 IF UNIT IS STILL BUSY AND 200 MSEC HAS NOT 
*         ELAPSED (ABORT WHEN TIME ELAPSES).
* 
          SHN    17D-BUSY    TEST FOR BUSY
          PJN    SEEK11      IF NOT BUSY JUMP 
          LDC    1000D       WAIT AND TRY AGAIN 
          RAD    D.T1 
 SEEK8    IANN   14B         CHECK CLOCK AGAIN
          STD    D.T2 
          LDD    D.T1 
          SBD    D.T2 
          ZJN    SEEK9       IF TIMING LOOP IS COMPLETE 
          SHN    17D-11D     TO ELIMINATE CLK WRAPE AROUND
          PJN    SEEK8       IF NOT TIMED OUT 
 SEEK9    AOD    SEEKA       INCREMENT ITERATION COUNT IF TIMED OUT 
          LMC    200000D/1000D COUNT LIMIT FOR BUSY 
          NJN    SEEK5       IF BUSY NOT TIMED OUT
  
 SEEK10   LDC    ER.UHB      AND ERROR EXIT 
 ERRDST   STD    D.T2 
          RJM    DST         GET DETAIL STATUS
          LDD    D.T2 
          LJM    ERR
  
**     7. STORE THE NUMBER OF MILLISECONDS REQUIRED TO COMPLETE THE 
*         SEEK INTO SB(60). 
* 
 SEEK11   LDD    SEEKA       MOVE THE SEEK TIME 
          ZJN    SEEK12      IF READY WITHOUT ANY MOVE
          SBN    1           ADJUST THE SEEK TIME 
 SEEK12   STM    SEEKTIM     THIS IS MILLISEC. COUNT REQUIRED FOR SEEK
          SHN    -1 
          RAD    RT          INCREMENT I/O LIMIT
  
**     8. IF GENERAL STATUS IS ZERO, EXIT.  OTHERWISE, REQUEST AND
*         INPUT DETAIL STATUS AND EXECUTE THE ERROR EXIT SEQUENCE.
* 
          LDM    SB 
          ZJN    SEEK14      IF ZERO AFTER NOT BUSY 
 ERRAGS   LDC    ER.AGS      AND ERROR EXIT 
 SEEK13   UJN    ERRDST 
 SEEK14   LJM    SEEK1X      TO EXIT
          EJECT 
 SHORTRD  TITLE  SHORTRD- PERFORM A SHORT RD OPERATION ON ONE SECTOR. 
**        SHORTRD- PERFORM A SHORT READ OPERATION ON ONE SECTOR.
* 
*                  SHORTRD CYL W TRK X SEC Y, ABT Z 
* 
*         ENTRY  - (A)      = ABT ADDRESS 
*                  (PA+65B) = W 
*                  (PA+66B) = X 
*                  (PA+67B) = Y 
* 
*         EXIT   - NONE 
* 
*         USES   - P, COD, RDWRF, WC, WT, D.T7, CL
* 
*         CALLS  - TDR, RDW0
* 
  
**     1. VERIFY THAT THE DRIVE IS CONNECTED. 
* 
 SHORTRD  RJM    TDR         CALLER ENTRY POINT 
          STD    COD         SAVE THE UNCODED FLAG (FORCED) 
          STD    RDWRF       INDICATE A READ OPERATION
 FSHRD    LDC    SHRD 
*         LDC    474B        *MODIFIED FOR 100,200 MEGABYTE DEVICE
          STD    WC          SET FOR ABNORMAL WORD COUNT
          LDN    1
          STD    D.T7        NUMBER OF SECTORS TO READ
          LDN    D.T7 
          STD    CL          ADDRESS OF THE NUMBER OF SECTORS TO READ 
  
**     2. EXECUTE THE SEEK SEQUENCE TO MOVE THE DISK POSITIONER TO THE
*         SELECTED CYLINDER.
* 
*      3. ISSUE A READ SHORT FUNCTION (0040). 
* 
*      4. INPUT 477B WORDS TO THE PP INPUT BUFFER.
* 
*      5. SET THE WT REGISTER TO THE NUMBER OF WORDS ACTUALLY INPUT.
* 
*      6. REQUEST AND INPUT GENERAL AND DETAIL STATUS.
* 
*      7. VERIFY THAT 477B DATA WORDS WERE ACTUALLY READ. 
* 
          LDN    RS          TO SET THE FUNCTION
          LJM    RDW0        TO VERIFY, SEEK, AND READ
          EJECT 
 STATUS   TITLE  STATUS - GET GENERAL OR DETAIL STATUS. 
**        STATUS - GET GENERAL OR DETAIL STATUS.
* 
*                  STATUS GENERAL, ABT Z
*                  STATUS DETAIL, ABT Z 
* 
*           GENERAL - INPUT 1 WORD OF GENERAL STATUS TO  SB(0). 
*           DETAIL  - INPUT 20D WORDS OF DETAIL STATUS TO SB(1)-SB(20D) 
* 
*         ENTRY  - (A)  = ABT ADDRESS 
*                  (PA) = CODE          0 = GENERAL 
*                                       1 = DETAIL
*         EXIT   - NONE 
* 
*         USES   - LF, P
* 
*         CALLS  - TCO, STS, DST
  
**     1. STORE 7777B INTO THE STATUS BUFFER FOR WORDS ABOUT TO BE READ 
* 
*      2. VERIFY THAT THE CONTROLLER IS CONNECTED.
* 
 STATUS   RJM    TCO         TEST CONTROLLER CONNECTED
  
**     3. ISSUE THE SELECTED STATUS FUNCTION SPECIFIED BY THE KEYWORD 
*         GENERAL (0012), DETAIL (0023) 
* 
*      4. INPUT THE REQUIRED NUMBER OF WORDS TO THE STATUS BUFFER 
*         (1 OR 24B). 
* 
          LDD    PA          LOAD CODE
          NJN    STATUS3     IF DETAIL STATUS REQUEST 
          LDN    GS 
          STD    LF          SAVE LAST PRIMARY FUNCTION 
          RJM    STS         GET GENERAL STATUS 
          UJN    STATUS4
  
 STATUS3  LDN    EDS
          STD    LF          SAVE LAST PRIMARY FUNCTION 
          RJM    DST         GET DETAIL STATUS
 STATUS4  LJM    XSTATUS     EXIT TO STACK
          EJECT 
 WRPRO    TITLE  WRPRO - PROCESS WRITE PROTECTED SECTOR COMMAND.
**        WRPRO - PROCESS WRITE PROTECTED SECTOR COMMAND. 
* 
*                 WRPRO CYL W TRK X SEC Y,ABT Z 
* 
*         ENTRY  - (A) = ABORT ADDRESS. 
*                  (PA+65) = W. 
*                  (PA+66) = X. 
*                  (PA+67) = Y. 
* 
*         EXIT   - RDW0   - COMMON READ WRITE ROUTINE.
* 
*         USES   - WT, D.T5, RDWRF, COD, CL.
* 
*         CALLS  - BD.TEST - TEST BUFFER ADDRESS FOR RANGE OF IB-OB.
*                  FNO     - SEND FUNCTION PLUS PARAMETER.
*                  TDR     - TEST DRIVE RESERVE.
* 
  
**        1. TEST DRIVE CONNECTED.
* 
 WRPRO    RJM    TDR         TEST DRIVE CONNECTED.
  
**        2. SET CODED FLAG TO NOT CODED, SET WRITE FLAG AND STORE
*            SECTOR COUNT TO ONE. 
* 
          STD    COD         CLEAR CODED FLAG 
          LDN    1
          STD    RDWRF       FLAG WRITE FUNCTION
          STD    D.T5 
          LDN    D.T5 
          STD    CL          STORE UMBER OF SECTORS TO WRITE
  
**        3. SET RETURN ADDRESS TO STACK AND JUMP TO COMMON READ/WRITE
*            ROUTINE. 
* 
          LDC    XWRPRO 
          STM    XRDWR+1     STORE RETURN ADDRESS TO STACK
          LDN    WRP         WRITE PROTECTED SECTOR FUNCTION
          LJM    RDW0        ENTER DISK READ WRITE DRIVER 
          EJECT 
 DST      TITLE  UTILITIES USED BY THE FMD OVERLAY. 
**        DST    - OBTAIN DETAIL STATUS.
* 
*         ENTRY  - NONE 
* 
*         EXIT   - STATUS BUFFER CONTAINS THE CURRENT DETAIL STATUS.
*                  TO BE USED FOR ERROR CHECKING. 
* 
*                - (A) = (SB+13D) 
* 
*                  ERRISR  - IF INCOMPLETE STATUS RETURNED
*                  ERRNIDS - IF NO INACTIVE TO DETAIL STATUS
* 
*         USES   -
* 
*         CALLS  - STATUS1
* 
*         TIME   - MINIMUM 1X SPEED EXECUTION TIME IS 247+ MICROSEC.
* 
 DST0     LDM    SB+13       DETAIL STATUS WORD 13
 DSTX     LJM    **          ENTRY/EXIT 
 DST      EQU    *-1
  
*         STORE 7777B INTO ALL WORDS
  
          LDN    24B
          STD    D.T1 
 DST1     LCN    0
          STM    SB,D.T1
          SOD    D.T1 
          NJN    DST1        DO ALL WORDS 
          LDN    EDS
          RJM    FNA         ISSUE STATUS FUNCTION
          NJN    DST3        IF FUNCTION ACCEPTED 
          LDC    ER.NIDS     ERROR IF NO INACTIVE TO DETAIL STATUS
          UJN    DST6 
  
 DST3     ACN    CH 
          RJM    FJM         WAIT FOR FULL
          ZJN    ERRISR      IF FULL NOT RECEIVED 
          LDN    24B
          IAM    SB+1,CH
          NJN    ERRISR      IF ALL WORDS NOT INPUT 
          SFM    ERCPE3,CH   CHECK FOR CH PARITY ERROR
          RJM    IJM         VERIFY INACTIVE IS RECEIVED
          NJN    DST0        IF INACTIVE RECEIVED 
 ERRISR   LDC    ER.ISR      ERROR IF INCOMPLETE STATUS RETURNED
 DST6     LJM    ERR
          SPACE  4,10 
**        ERA    - SAVE ERROR EXIT (ABORT) ADDRESS. 
* 
*         ENTRY  - (A) = THE ABORT ADDRESS
* 
*         EXIT   - ABT ADDRESS SAVED IN ERR3 AND ERR4.
* 
*         USES   - ERR3,ERR4
* 
*         CALLS  - NONE 
* 
*         TIME   - MINIMUM 1X SPEED EXECUTION TIME IS 10 MICROSEC.
* 
 ERAX     LJM    **          ENTRY/EXIT 
 ERA      EQU    *-1
          STM    ERR4        SAVE ABORT ADDRESS 
          SHN    -12
          STM    ERR3 
          UJN    ERAX        EXIT 
          SPACE  4,10 
**        FJM    - WAIT FOR CHANNEL TO GO FULL. 
* 
*         ENTRY  - NONE 
* 
*         EXIT   - (A) NONZERO IF NOT TIMED OUT WAITING FULL
*                  (A) ZERO IF TIMED OUT
* 
*         USES   - D.T1 
* 
*         CALLS  - NONE 
* 
*         TIME   - MINIMUM 1X SPEED EXECUTION TIME IS 6 MICROSEC. 
* 
 FJMX     LJM    **          ENTRY/EXIT 
 FJM      EQU    *-1
          LDC    TIMFJM*2 
 FJM1     FJM    FJMX,CH     IF FULL EXIT 
 FJM2     SBN    4           *** SBN 4 IF 1X SPEED PPU ***
*         SBN    2           *** SBN 2 IF 2X SPEED PPU ***
*         SBN    1           *** SBN 1 IF 4X SPEED PPU ***
          NJN    FJM1        IF TIME NOT COUNTED DOWN 
          UJN    FJMX        ELSE EXIT WITH A EQ. ZERO
          SPACE  4,10 
**        FNC    - ISSUE A FUNCTION ON A CHANNEL AND WAIT INACTIVE. 
* 
*         ENTRY  - (A) = FUNCTION TO ISSUE
* 
*         EXIT   - (A) = NONZERO IF FUNCTION ACCEPTED.
* 
*                  ERRNIF  - IF NO INACTIVE TO LAST FUNCTION
* 
*         USES   - LF 
* 
*         CALLS  - FNA
* 
*         TIME   - MINIMUM 1X SPEED EXECUTION TIME IS 22 MICROSEC.
* 
 FNCX     LJM    **          ENTRY/EXIT 
 FNC      EQU    *-1
          STD    LF          TO SAVE LAST MAJOR FUNCTION
          RJM    FNA         TO FUNCTION AND WAIT INACTIVE
          NJN    FNCX        IF INACTIVE EXIT 
 ERRNIF   LDC    ER.NIF      ELSE ERROR EXIT
          UJN    FNO1 
          SPACE  4,10 
**        FNA    - ISSUE A FUNCTION AND WAIT INACTIVE.
* 
*         ENTRY  - (A) = FUNCTION TO ISSUE
* 
*         EXIT   - (A) = NONZERO IF FUNCTION ACCEPTED 
* 
*         USES   - NONE 
* 
*         CALLS  - IJM
* 
*         TIME   - MINIMUM 1X SPEED EXECUTION TIME IS 14 MICROSEC.
* 
 FNAX     LJM    **          ENTRY/EXIT 
 FNA      EQU    *-1
          FAN    CH          FUNCTION FROM A
          RJM    IJM         WAIT FOR INACTIVE
          UJN    FNAX        EXIT 
          SPACE  4,10 
**        FNO    - ISSUE FUNCTION AND OUTPUT ONE WORD OF DATA.
* 
*         ENTRY  - (A)  = FUNCTION DESIRED
*                  FNOA = DATA WORD TO OUTPUT 
* 
*         EXIT   - NONE 
* 
*                 ERRFPNA - IF FUNCTION PARAMETERS NOT ACCEPTED 
* 
*         USES   - NONE 
* 
*         CALLS  - FNC, DCN 
* 
*         TIME   - MINIMUM 1X SPEED EXECUTION TIME IS 40 MICROSEC.
* 
 FNOX     LJM    **          ENTRY/EXIT 
 FNO      EQU    *-1
          RJM    FNC         TO SEND FUNCTION 
          ACN    CH+40B 
          LDD    D.T4 
          OAN    40B+CH 
  
 FNO2     EJM    FNO3,CH
          ADN    1
          PJN    FNO2        LOOP ON CHANNEL EMPTY TEST 
 ERRFPNA  LDC    ER.FPNA
 FNO1     LJM    ERR
  
 FNO3     DCN    CH+40B 
          UJN    FNOX        EXIT 
          SPACE  4,10 
**        IJM    - WAIT INACTIVE AND TIME OUT.
* 
*         ENTRY  - NONE 
* 
*         EXIT   - (A) = NONZERO IF FUNCTION ACCEPTED 
*                        ZERO IF FUNCTION NOT ACCEPTED
* 
*         USES   - D.T3 
* 
*         CALLS  - NONE 
* 
*         TIME   - MINIMUM 1X SPEED EXECUTION TIME IS 6 MICROSEC. 
* 
 IJMX     LJM    **          ENTRY/EXIT 
 IJM      EQU    *-1
          LDN    4
          STM    IJM3 
 IJMA     LCN    3
 IJM1     IJM    IJMX,CH     IF INACTIVE EXIT 
 IJM2     SBN    4           *** SBN 4 IF 1X SPEED PPU ***
*         SBN    2           *** SBN 2 IF 2X SPEED PPU ***
*         SBN    1           *** SBN 1 IF 4X SPEED PPU ***
          NJN    IJM1        IF NOT COUNTED DOWN
          SOM    IJM3 
          NJN    IJMA        1 SECOND 
          UJN    IJMX        ELSE EXIT W/(A) = ZERO 
  
 IJM3     DATA   0           TIME FOR ONE SECOND
          SPACE  4,10 
**        OPC    - RELEASE THE CONTROLLER WITH AN OPERATION COMPLETE. 
* 
*         ENTRY  - NONE 
* 
*         EXIT   - (A) = ZERO IF CONTROLLER NOT CONNECTED 
*                      = NONZERO IF OPERATION COMPLETE ACCEPTED 
* 
*         USES   - NONE 
* 
*         CALLS  - FNC
* 
*         TIME   - MINIMUM 1X SPEED EXECUTION TIME IS 44 MICROSEC.
* 
 OPCX     LJM    **          ENTRY/EXIT 
 OPC      EQU    *-1
          LDM    BD.CHFG
          ZJN    OPCX        EXIT IF CHANNEL NOT RESERVED 
          LDM    COCON
          NJN    OPCX        EXIT IF CONTROLLER NOT RESERVED
          LDN    77B
          STM    COCON       CLEAR THE CONTROLLER CONNECT FLAG
          STM    DRCON       CLEAR THE DRIVE CONNECT FLAG 
          LDC    ** 
 OPC1     EQU    *-1         DETAIL STATUS WORD 13 STORED HERE
          SBN    2
          MJN    OPC3        IF CONTROLLER NOT RESERVED 
          NJN    OPCX        IF CONTROLLER AND UNIT RESERVED
          LDN    DREL 
          UJN    OPC4 
  
 OPC2     UJN    OPCX        RETURN 
  
 OPC3     LDN    OC 
 OPC4     STD    D.T5        ONLY FOR SPECIAL CALL FROM BASIC DRIVER
          LDM    ERR3        UPPER BITS OF ABT ADDRESS
          SBN    77B
          NJN    OPC5        IF NORMAL USER CALL
          LDD    D.T5 
          RJM    FNA         ONLY FOR SPECIAL CALL FROM BASIC DRIVER
          NJN    OPC2        IF NOT FUNCTION TIMEOUT
          DCN    CH+40B      ELSE DO A DISCONNECT 
          UJN    OPC2        AND EXIT 
  
 OPC5     LDD    D.T5 
          RJM    FNC         TO FUNCTION OPERATION COMPLETE 
          UJN    OPC2        EXIT 
          SPACE  4,10 
**        STS    - REQUEST AND INPUT GENERAL STATUS.
* 
*         ENTRY  - NONE 
* 
*         EXIT   - (A) = STATUS 
* 
*                  ERRGSNR - IF GENERAL STATUS NOT RETURNED 
*                  ERRNIGS - IF NO INACTIVE TO GENERAL STATUS 
* 
*         USES   - SB 
* 
*         CALLS  - STATUS1
* 
*         TIME   - MINIMUM 1X SPEED EXECUTION TIME IS 60 MICROSEC.
* 
 STSXX    LDM    SB          LOAD STATUS AND EXIT 
 STSX     LJM    **          ENTRY/EXIT 
 STS      EQU    *-1
          LCN    0
          STM    SB          NEGATIVE ZERO TO SB
          LDN    GS 
          RJM    FNA         ISSUE GENERAL STATUS FUNCTION
          NJN    STS1        IF FUNCTION ACCEPTED 
 ERRNIGS  LDC    ER.NIGS     ERROR IF NO INACTIVE TO GS FUNCTION
          UJN    STS3 
  
 STS1     LDN    0
          STM    COCON       SET CONTROLLER CONNECTED 
          ACN    CH 
          RJM    FJM         WAIT FOR FULL
          ZJN    STS2        IF NO FULL RECEIVED
          LDN    1
          IAM    SB,CH       INPUT GENERAL STATUS 
          NJN    STS2        IF NO STATUS PROVIDED
          SFM    ERCPE2,CH   CHECK FOR CH PARITY ERROR
          RJM    IJM         WAIT FOR INACTIVE
          NJN    STSXX       IF INACTIVE RECEIVED 
  
 ERRGSNR  EQU    *
 STS2     LDC    ER.GSNR     ERROR IF NO FULL OR NO INACTIVE
 STS3     UJN    TCA1 
          SPACE  4,10 
**        TCA    - TEST CHANNEL ASSIGNMENT. 
* 
*         ENTRY  - (A) = ABORT ADDRESS
* 
*         EXIT   - ABT ADDRESS STORED IN ERR3 AND ERR4
* 
*                  ERRCNA  - IF CHANNEL NOT RESERVED
* 
*         CALLS  - ERA
* 
*         USES   - NONE 
* 
 TCAX     LJM    **          ENTRY/EXIT 
 TCA      EQU    *-1
          RJM    ERA         TO SAVE ABORT ADDRESS
          LDM    BD.CHFG
          NJN    TCAX        EXIT IF CHANNEL ASSIGNED 
          LDC    ER.CNA      ERROR IF CHANNEL NOT RESERVED
 TCA1     UJN    TDR1 
          SPACE  4,10 
**        TCO    - TEST CONTROLLER CONNECTED. 
* 
*         ENTRY  - (A) = ABORT ADDRESS
* 
*         EXIT   - ABT ADDRESS STORED IN ERR3 AND ERR4
*                  WC SET TO WRRD 
* 
*         USES   - WC 
* 
*         CALLS  - TCA
* 
 TCOX     LJM    **          ENTRY/EXIT 
 TCO      EQU    *-1
          RJM    TCA         TO SAVE ABORT ADDRESS, CHECK ACTIVE
          LDC    WRRD 
          STD    WC          SET WORD COUNT FOR ALL COMMANDS. 
          LDC    77B
 COCON    EQU    *-1         *** CONTROLLER CONNECTED FLAG STORED HERE
          ZJN    TCOX        IF CONNECTED 
          UJN    ERRCNC      ELSE ERROR EXIT
          SPACE  4,10 
**        TDR    - TEST DRIVE RESERVED. 
* 
*         ENTRY  - (A) = ABORT ADDRESS
* 
*         EXIT   - NONE 
* 
*         USES   - NONE 
* 
*         CALLS  - TCO
* 
 TDRX     LJM    **          ENTRY/EXIT 
 TDR      EQU    *-1
          RJM    TCO         SAVE ABT ADDRESS,CHECK CTLR. CONNECTED 
          LDC    77B
 DRCON    EQU    *-1         *** DRIVE CONNECTED FLAG STORED HERE.
          ZJN    TDRX        IF CONNECTED EXIT
 ERRCNC   LDC    ER.CNC      ELSE ERROR EXIT
 TDR1     UJN    ERR
  
 ERCPE1   RJM    STS         GET GENERAL STATUS 
 ERCPE2   RJM    DST         GET DETAILED STATUS
 ERCPE3   LDC    ER.CPE 
          EJECT 
**        ERR    - ERROR EXIT SUBROUTINE
* 
*         ENTRY  - (A) = MESSAGE ADDRESS INDEX
* 
*         EXIT   - (A) = ABORT ADDRESS FOR AN ABORT 
*                  (A) = LINE NUMBER FOR MUDULE TERMINATE 
* 
*         USES   - D.Z1, D.Z2, EC, EM, EA 
* 
*         CALLS  - NONE 
* 
 ERR      STD    D.Z1        SAVE MESSAGE INDEX AND ERROR NUMBER
          SHN    -12
          STD    D.Z2        SAVE ABORT FLAG
          LDM    BD.CHFG
          ZJN    ERR2        IF CHANNEL IS NOT ASSIGNED 
          LDD    BD.AL
          SBN    AL21 
          ZJN    ERR2        IF ACCESS LEVEL INDICATES NO CHAN CLEANUP
 ERR1     IJM    ERR2,0      CLEAN UP CHANNEL 
          DCN    40B
 ERR2     LDD    D.Z1 
          LPN    77B         MASK ERROR CODE
          ADC    5300B       ADD IN BIAS FOR FMDFT PRODUCT OVERLAY
          STD    EC          STORE ERROR CODE 
          LDD    D.Z1 
          SHN    -6 
          ADC    100B        FLAG MESSAGE INDEX AS OVERLAY MESSAGE
          STD    EM          STORE MESSAGE INDEX
          LDD    P
          STD    EA          STORE LINE NUMBER WHERE ERROR OCCURRED 
          LDD    D.Z2 
          NJN    ERR5        IF ABORT FLAG SET
          LDC    ** 
 ERR3     EQU    *-1         FOR ABORT ADDRESS
          SHN    12 
          LMC    ** 
 ERR4     EQU    *-1         FOR ABORT ADDRESS
          LJM    BD.RNI      RNI AT THE REJECT ADDRESS
  
 ERR5     LJM    BD.ABT      TERMINATE MODULE 
  
 IB       EQU    6500B       INPUT BUFFER 
 LIB      EQU    505B        LENGTH OF INPUT AND OUTPUT BUFFERS 
 OB       EQU    IB+LIB      OUTPUT BUFFER
 SB       EQU    OB+LIB      STATUS BUFFER
 SBIE     EQU    SB+25B      STATUS THAT DETECTED THE ERROR 
 RETRY    EQU    SB+52B      RETRY COUNT
 SERNUM1  EQU    SB+56B      FIRST HALF OF PACK SERIAL NUMBER 
 SERNUM2  EQU    SB+57B      SECND HALF OF PACK SERIAL NUMBER 
 SEEKTIM  EQU    SB+60B      LAST SEEK TIME 
 RESA     EQU    SB+64B 
 SBLWA    EQU    SB+64B      STATUS BUFFER LWA+1
 LSB      EQU    64B         LENGTH OF STATUS BUFFER
  
          ERRPL  *-IB-1      ERROR IF FMDFT OVERLAY OVERFLOW
          EJECT 
 INIT     TITLE  INIT - INITIALIZATION. 
**        THE INITIALIZATION CODE THAT FOLLOWS IS OVERLAYED BY THE
*         PRODUCT OVERLAY BUFFERS ABOVE.
* 
*         TEST EQUIPMENT AND UNIT NUMBER
* 
 INIT     LDN    0
          STD    D.Z1        CLEAR COUNTER
 INIT0    LDN    0
          STM    SB,D.Z1     CLEAR STATUS BUFFER
          AOD    D.Z1 
          SBN    LSB
          NJN    INIT0       IF STATUS BUFFER NOT CLEARED 
          LDM    BD.SN
          STM    SERNUM1     SAVE USER SUPPLIED SERIAL NUMBER IN SB 
          LDM    BD.SN+1
          STM    SERNUM2
          LDM    BD.EQ
          LPN    77B
          STM    UN          SET UNIT NUMBER
          STM    SB+63B      UNIT TO STATUS BUFFER
          LDN    0
          STM    SB+62B      EQUIPMENT NUMBER TO STATUS BUFFER
  
*         SET DELAY TIME BASED ON SPEED OF PPU
  
 INIT1    LDC    TSPEED 
          STD    D.T0 
 INIT2    LDI    D.T0 
          ZJN    INIT3       IF END OF TABLE
          STD    D.T1 
          LDI    D.T1 
          SCN    77B
          ADM    BD.SPEED 
          STI    D.T1        SET ADN/SBN VALUE
          AOD    D.T0 
          UJN    INIT2       COMPLETE ALL WORDS 
  
*         STORE I/O CHANNEL INTO COMMANDS 
  
 INIT3    LDM    BD.CHAN
          STD    D.T2 
          STM    SB+61B      I/O CHANNEL TO STATUS BUFFER 
          LDC    TCHAN
          STD    D.T0        SET FWA OF TABLE CONTAINING ADDRESSES
 INIT4    LDI    D.T0 
          ZJN    INIT5       IF END OF TABLE
          STD    D.T1 
          LDI    D.T1 
          LPC    7740B
          ADD    D.T2 
          STI    D.T1 
          AOD    D.T0 
          UJN    INIT4       COMPLETE ALL WORDS 
  
*         WRITE PP MESSAGES TO CM 
  
 INIT5    LDM    BD.MSGA     GET PP MESSAGE AREA ADDRESS
          STD    D.T6        SAVE IT
          ADC    MMSGL.      ADD LENGTH 
          RJM    BD.TFL      SEE IF IN FL 
          LDN    P.ZERO      CLEAR CELLS, D.Z1=PP MESSAGE ADDRESS 
          CRD    D.Z1        D.Z2=D.T0-D.T4 POINTER, D.Z3=CM WD COUNTER 
 INIT6    LDM    PPMSGS,D.Z1 GET PP MESSAGE WORD
          ZJN    INIT8       IF END OF MESSAGE
 INIT7    STM    D.T0,D.Z2   STORE IN D.T0+ 
          AOD    D.Z1        BUMP PP MESSAGE POINTER
          UJN    INIT9
 INIT8    LDC    2R          MESSAGE END, STORE BLANKS
          STM    D.T0,D.Z2
 INIT9    AOD    D.Z2        BUMP D.T0+ POINTER 
          SBN    5
          NJN    INIT6       IF NOT 5 PP WORDS
          STD    D.Z2        CLEAR POINTER
          LDD    D.RA        PUT RA IN A REG
          SHN    6
          ADD    D.T6        ADD MESSAGE ADDRESS
          CWD    D.T0        WRITE ONE WORD FROM D.T0 
          AOD    D.T6        UPDATED ADDRESS
          AOD    D.Z3        BUMP CM WORD COUNTER 
          SBN    BD.MSGML 
          NJN    INIT6       IF NOT BD.MSGML CM WORDS 
          STD    D.Z3        CLEAR CM WORD COUNTER
          LDM    PPMSGS,D.Z1
          ZJN    INIT10      IF MESSAGE ENDED IN ZERO BYTE
          AOD    D.Z1        SKIP ZERO BYTE TERMINATOR
 INIT10   AOD    D.Z1        BUMP PP MESSAGE ADDRESS TO NEXT MESSAGE
          LDM    PPMSGS,D.Z1
          NJN    INIT7       IF NOT LAST MESSAGE
  
*         SET DIRECT CELLS
  
          STD    WT          CLEAR WORDS TRANSMITTED REGISTER 
          STD    BA          CLEAR BEGINNING ADDRESS REGISTER 
          LDC    100D        100 MSEC DELAY IN BD.RCH 
          STM    DLYDCH      MODIFY DELAY USED ON RES AND REL CHANNEL 
 INIT11   LDC    WRRD 
          STD    WC          SET DEFAULT VALUE IN WORD COUNT REGISTER 
  
*         VERIFY THAT THE ASSIGNED DEVICE CODE IS SUPPORTED 
  
          LDD    DC          DEVICE CODE CURRENTLY ASSIGNED 
          SBN    D885 
          ZJN    INIT12      IF LEGAL DEVICE CODE 
          SBN    1
          ZJN    INIT11A     IF DEVICE CODE = 10
          SBN    1
          ZJN    INIT12A     IF DEVICE CODE = 11
          SBN    1
          ZJN    INIT13      IF DEVICE CODE = 12
          LDC    INITA       (A) = POINTER TO ERROR MSG IF NO SUPPORT 
 INIT12   LJM    START       EXIT WITH (A) = ERROR/NO ERROR FLAG
  
INITA     DIS    ,*DC NOT SUPPORTED*
INIT13    LDC    FTAB2
          UJN    INIT13B
INIT11A   LDC    FTAB3
          UJN    INIT12B
INIT12A   LDC    FTAB4
INIT12B   RJM    STOR 
          LDC    FTAB5
INIT13B   RJM    STOR 
          LDC    FTAB1
          RJM    STOR 
          LJM    INIT12 
*         STORE FIELDS FOR DEVICE CODES 10,11 AND 12
*         LOAD THE TABLES 
* 
STORX     LJM    ** 
STOR      EQU    *-1
          STD    D.Z1 
STOR1     LDI    D.Z1 
          ZJN    STORX
          STD    D.Z2 
          AOD    D.Z1 
          LDI    D.Z1 
          STI    D.Z2 
          AOD    D.Z1 
          UJN    STOR1
  
 FTAB1    VFD    12/TRES,12/1400B 
          VFD    12/TRES1,12/0300B+RES12-TRES1
          VFD    12/TRES2,12/0300B+RES15-TRES2
          VFD    12/TRES3,12/1700B
          VFD    12/GET0,12/1400B 
          VFD    12/FMAR,12/0300B+RDW12-FMAR
          VFD    12/FRDW12,12/1002B 
          VFD    12/FRDW12+1,12/3400B+D.Z3
          VFD    12/0 
  
*         TABLE FOR DC=12 
  
 FTAB2    VFD    12/FMAP+1,12/FMAPCY
          VFD    12/FMAP1+1,12/FMAPCY 
          VFD    12/RDW12,12/FTRL+1400B 
          VFD    12/FSEL1,12/FSEL+1+1400B 
          VFD    12/FSEL2,12/FSEL+1400B 
          VFD    12/FSEL3,12/FSEL+1+1700B 
          VFD    12/FRDW12+2,12/1003B 
          VFD    12/FRDW12+3,12/3200B+D.Z3
          VFD    12/0 
  
*         TABLE FOR DC=10 
  
 FTAB3    VFD    12/FMAP+1,12/MAXFSCA 
          VFD    12/FMAP1+1,12/MAXFSCA
          VFD    12/0 
  
*         TABLE FOR DC=11 
  
 FTAB4    VFD    12/FMAP+1,12/MAXFSCB 
          VFD    12/FMAP1+1,12/MAXFSCB
          VFD    12/0 
  
*         TABLE FOR DC=10 AND 11
  
 FTAB5    VFD    12/RDW12,12/FTR1+1400B 
          VFD    12/FSEL1,12/FSTR+1+1400B 
          VFD    12/FSEL2,12/FSTR+1400B 
          VFD    12/FSEL3,12/FSTR+1+1700B 
          VFD    12/FSHRD+1,12/474B 
          VFD    12/FRDW12+2,12/1002B 
          VFD    12/FRDW12+3,12/3100B+D.Z3
          VFD    12/0 
  
*         TABLE OF PPU SPEED SWITCHES 
  
 TSPEED   VFD    12/FJM2
          VFD    12/IJM2
          DATA   0           END OF SPEED SWITCHES TABLE
  
          EJECT 
 PPMSGS   TITLE  ERROR MESSAGES 
 PPMSGS   EQU    *           START OF PP MESSAGES 
****
          MMSG   ER.FLE,EC.FLE,(ADDR OUT OF FL),1 
          MMSG   ER.TL,EC.TL,(I/O TIME OUT ON CH RESERVE),1 
          MMSG   ER.SEE,EC.SEE,(SUBR ENTRY/EXIT ERR),1
          MMSG   ER.WC,EC.WC,(BUFFER INDEX OR WC ERR),1 
          MMSG   ER.RES,EC.RES,(R)
          MMSG   ER.RES1,EC.RES1,(R)
          MMSG   ER.RES2,EC.RES2,(R)
          MMSG   ER.CNA,EC.CNA,(CH NOT ASSIGNED)
          MMSG   ER.CAS,EC.CAS,(CH ACTIVE ON ENTRY) 
          MMSG   ER.NIF,EC.NIF,(NO INACTIVE TO LAST FUNC) 
          MMSG   ER.NIGS,EC.NIGS,(NO INACTIVE TO GENERAL STAT)
          MMSG   ER.NIDS,EC.NIDS,(NO INACTIVE TO DETAIL STAT) 
          MMSG   ER.GSNR,EC.GSNR,(GENERAL STAT NOT RETURNED)
          MMSG   ER.ISR,EC.ISR,(INCOMPLETE STAT RETURNED) 
          MMSG   ER.FPNA,EC.FPNA,(FUNC PARAMS NOT ACCEPTED) 
          MMSG   ER.DNA,EC.DNA,(ALL DATA NOT ACCEPTED FROM PP)
          MMSG   ER.IDR,EC.IDR,(INCOMPLETE DATA RETURNED TO PP) 
          MMSG   ER.CNC,EC.CNC,(CONTROLLER/DRIVE NOT CONNECTED) 
          MMSG   ER.IAL,EC.IAL,(AL TOO LOW FOR REQ) 
          MMSG   ER.NRES,EC.NRES,(RES TIMEOUT)
          MMSG   ER.AGS,EC.AGS,(ABNORMAL GENERAL STATUS)
          MMSG   ER.ISO,EC.ISO,(ILLEGAL STROBES/OFFSET) 
          MMSG   ER.UHB,EC.UHB,(UNIT HUNG BUSY ON SEEK) 
          MMSG   ER.STRY,EC.STRY,(SUCCESSFUL RETRY) 
          MMSG   ER.DCE,EC.DCE,(DATA COMPARE ERR) 
          MMSG   ER.DCSM,EC.DCSM,(DC/STATUS MISMATCH) 
          MMSG   ER.NIDT,EC.NIDT,(NO INACTIVE AFTER DATA XFER)
          MMSG   ER.CPE,EC.CPE,(CH PE ON INPUT) 
 MMSGL.   EQU    MMSGL
          DATA   0
****
 TCHAN    EQU    *           CREATE CHANNEL TABLE 
          LIST   D
          HERE
          LIST   *
          DATA   0           END OF CHANNEL TABLE 
  
          IFEQ   NOS,1
 .1       SET    POVLA
 .2       SET    10000B 
 .3       SET    *-.1+5+4+500B
 .4       SET    .2-.1+5-1
          ERRNG  .2-.1+5-.3/500B*500B-1  BYTES LEFT AFTER LAST SECTOR 
          ERRNG  .3/500B*500B-5-*+.1-5   BYTES LEFT IN LAST SECTOR
          ERRNG  .4/500B*500B-5-*+.1-5   BYTES CAN BE ADDED TO OVERLAY
          ENDIF 
  
          IFEQ   NOSBE,1,1
          ERRPL  *-7773B     IF OVERFLOW IN FMDFT PRODUCT OVERLAY 
          QUAL   *
