*COMDECK,FMDHT
          EJECT 
 5FH      SEGMENT POVLA 
          ORG    POVLA
          QUAL   FMDHT
*CALL,VERS
          COMMENT FMDHT PRODUCT OVERLAY FOR MALET "VERS"
          TITLE  HIGH LEVEL FMD HALF TRACK PRODUCT OVERLAY FOR MALET. 
  
**        THE FOLLOWING COMMANDS ARE DESIGNED FOR  THE  FMD  DISK  SUB- 
*         SYSTEMS  RUNNING  IN  A  HALF-TRACK MODE.  5FH 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 HALF-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_
* 
*           CONTROL- SEND CONTROL WORD TO CONTROLLER AL GE 10 NEEDED. 
*           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.
*           OUT    - OUTPUT CONTROL FUNCTION AL GE 10 NEEDED. 
*           READ   - SEEK AND READ 0 TO 1280 SECTORS FROM DISK TO IB. 
*           READCB - READ COUPLER BUFFER. 
*           READCW - SEEK AND READ CHECKWORD ON 0 TO 1280 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(476B WORDS) FROM DISK TO IB. 
*           STATUS - INPUT GENERAL, DETAIL OR CHANNEL STATUS TO SB. 
*           VERIFY - SEEK AND WRITE VERIFY 0 TO 1280 SECTORS ON DISK. 
*           WRITE  - SEEK AND WRITE 0 TO 1280 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   /                  /      / 
*         /     .   /                  /      / 
*         /CHANNEL  /   DETAIL STATUS  /      / THIS IS THE NORMAL/LAST 
*         /STATUS   /                  /      / TAKEN STATUS FROM THE 
*         /WORDS.   /                  /      / SUBSYSTEM 
*         /     .   /                  /      / 
*         /     .   /                  /      / 
*         /     .   /                  /      / 
*         /    24B  /                  /   ---
*         /         /------------------/   ---
*         /    25B  /   GENERAL STATUS /      / 
*         /         /------------------/      / 
*         /    26B  /                  /      / 
*         /     .   /                  /      / THIS IS THE FIRST TAKEN 
*         /     .   /   DETAIL STATUS  /      / STATUS WITHIN SEQUENCES 
*         /     .   /                  /      / THAT REQUIRED RECOVERY
*          ----40B  /                  /      / 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.
*                                                    OUT
*                                 CONTROL-----------. / .--- RES
*                               DIAGRD------------/ . / . /-- RESET 
*                              DIAGWR-----------. / . / . / -- RTNADDR
*                             GET-------------/ . / . / . / . / SEEK
*                            MARGINS--------. / . / . / . / . /  SHORTRD
*                           READ----------/ . / . / . / . / . / . STATUS
*                          READCW-------. / . / . / . / . / . / . / VER 
*   CODE     MESSAGE      REL---------/ . / . / . / . / . / . / . / . WR
*      ------------------------------ - - - - - - - - - - - - - - - - - 
* 5204 BUFFER INDEX OR WC ERROR       . . X . . . . X X . . . . . . X X 
*      ------------------------------ - - - - - - - - - - - - - - - - - 
* 5210 CH NOT ASSIGNED                . X X . X X X X X . X X X X X X X 
*      ------------------------------ - - - - - - - - - - - - - - - - - 
* 5211 CH ACTIVE ON ENTRY             . . . . . . . . . X . . . . . . . 
*      ------------------------------ - - - - - - - - - - - - - - - - - 
* 5212 NO INACTIVE TO LAST FUNC.      X X X . X X X X X X X X X X X X X 
*      ------------------------------ - - - - - - - - - - - - - - - - - 
* 5213 NO INACTIVE TO GENERAL STATUS  . X X . X . . . . X . X X X X X X 
*      ------------------------------ - - - - - - - - - - - - - - - - - 
* 5214 NO INACTIVE TO DETAIL STATUS   . X X . . . . . . X . . X X X X X 
*      ------------------------------ - - - - - - - - - - - - - - - - - 
* 5215 GENERAL STATUS NOT RETURNED    . X X . X . . X . X . X X X X X X 
*      ------------------------------ - - - - - - - - - - - - - - - - - 
* 5216 INCOMPLETE STATUS RETURNED     . X X . X . . X . X . X X X X X X 
*      ------------------------------ - - - - - - - - - - - - - - - - - 
* 5217 FUNC PARAMETERS NOT ACCEPTED   . X X . X . . X X X . . X X . X X 
*      ------------------------------ - - - - - - - - - - - - - - - - - 
* 5220 ALL DATA NOT ACCEPTED FROM PP  . . . . . X . X X . . . . . . X X 
*      ------------------------------ - - - - - - - - - - - - - - - - - 
* 5221 INCOMPLETE DATA RETURNED TO PP . . X . X . X X . . . X . X . . . 
*      ------------------------------ - - - - - - - - - - - - - - - - - 
* 5222 CONTROLLER/UNIT NOT CONNECTED  . X X X X X X X X . . X X X X X X 
*      ------------------------------ - - - - - - - - - - - - - - - - - 
* 5223 ACCESS LEVEL TOO LOW FOR REQ   . . X . . . . X X . . . . X . X X 
*      ------------------------------ - - - - - - - - - - - - - - - - - 
* 5224 RESERVE TIMEOUT                . . . . . . . . . X . . . . . . . 
*      ------------------------------ - - - - - - - - - - - - - - - - - 
* 5225 ABNORMAL GENERAL STATUS        . X X . X . . X . X . X X X . X X 
*      ------------------------------ - - - - - - - - - - - - - - - - - 
* 5226 ILLEGAL STROBES/OFFSET         . . . X . . . . . . . . . . . . . 
*      ------------------------------ - - - - - - - - - - - - - - - - - 
* 5227 UNIT HUNG BUSY ON SEEK         . X X . X . . . . . . . X X X X X 
*      ------------------------------ - - - - - - - - - - - - - - - - - 
* 5230 SUCCESSFUL RETRY               . X X . X . . . . . . . . . . X X 
*      ------------------------------ - - - - - - - - - - - - - - - - - 
* 5231 DATA COMPARE ERROR             . . X . . . . . . . . . . . . . . 
*      ------------------------------ - - - - - - - - - - - - - - - - - 
* 5232 DEVICE CODE/STATUS MISMATCH    . . . . . . . . . X . . . . . . . 
*      ------------------------------ - - - - - - - - - - - - - - - - - 
* 5233 NO INACTIVE AFTER DATA XFER    . X X . . X X X X X . . . . . X X 
*      ---------------------------------------------------------------
          EJECT 
**        THE  FOLLOWING  FLOW-CHART  DOCUMENTS THE PROCESS USED WITHIN 
*         THE PRODUCT OVERLAY TO  UPDATE  CYLINDER,  TRACK  AND  SECTOR 
*         REGISTERS  AFTER  PROCESSING  A  SECTOR SUCCESSFULLY IN A 2_1 
*         INTERLACE MODE. (READ, READCW, VERIFY AND WRITE)
* 
*                       ----------------------- 
*                       /EXIT IF NO SECTORS   / 
*                       /TO PROCESS. DECREMENT/ 
*               /------>/SECTORS TO DO AND    /<--------- 
*               /       /PROCESS ONE SECTOR.  /          /
*               /       -----------------------   --------------- 
*               /                 V               /  PERFORM    / 
*               /          ---------------        /    SEEK     /<-START
*               /          /  ADD 2 TO   /        /  SEQUENCE   / 
*               /          /  SECTOR REG./        --------------- 
*               /          ---------------
*               /                 V 
*               /             --------- 
*               /       NO   /         \
*               /<----------/  SECTOR   \ 
*               /           \   .GT.    / 
*               /            \  37B    /
*               /             --------- 
*               /            YES  V 
*               /          ---------------
*               /          / SUBTRACT 30B/
*               /          / FROM SECTOR /
*               /          / REGISTER.   /
*               /          ---------------
*               /                 V 
*               /          ---------------
*               /          /  ADD 1 TO   /
*               /          /  TRACK REG. /
*               /          ---------------
*               /                 V 
*               /             --------- 
*               /        NO  /         \          --------------- 
*               /<----------/  TRACK    \         /  EXIT TO    / 
*               /           \   .GT.    /         /   STACK     / 
*               /            \  47B    /          /             / 
*          ------------       ---------           --------------- 
*          / PERFORM  /     YES   V                      &
*          /  SEEK    /    ---------------        --------------- 
*          / SEQUENCE /    / RESET TRACK /        /  SET TRACK  / 
*          ------------    / REG TO 0    /        /  REG TO 47B / 
*               &          ---------------        --------------- 
*               /                 V                      &
*          ------------       ---------           --------------- 
*          /   SET    /  NO  /         \  YES     /     SET     / 
*          / SECTOR   /<----/PROCESSING \-------->/   SECTOR    / 
*          / REGISTER /     \   ODD     /         /  REGISTER   / 
*          /  TO 1    /      \ SECTORS /          /   TO 37B    / 
*          ------------       ---------           --------------- 
          EJECT 
**        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.
* 
  
*         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
  
*         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
 SEK21    EQU    2           SEEK 2%1 INTERLACE 
 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 
 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 
 RS       EQU    40B         READ SHORT 
 SSO      EQU    41B         SELECT STROBES AND OFFSET
 RCB      EQU    43B         READ COUPLER BUFFER
 IPCS     EQU    52B         INPUT PROCESSOR CHANNEL STATUS 
 FP       EQU    54B         FLAG PULSE FUNCTION
 PT       EQU    64B         POSITIONER TEST 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
          SPACE  4,20 
*         MISCELANOUS EQUATES.
  
 TIMFJM   EQU    50000D/2    MAXIMUM 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
 DSFMD    EQU    2000B       DETAIL STATUS BIT IN WORD 4 FOR FMD
  
 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
 SEI      EQU    2           SECTOR INCREMENT 
 WRRD     EQU    502B        STANDARD WORD COUNT
 SHRD     EQU    476B        SHORT WORD COUNT 
          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 
  
 XCNTRL   LJM    ** 
          LJM    CNTRL       CONTROL SUBROUTINE 
  
 XDIAG    LJM    ** 
          LJM    XDIAG       FILLER CODE FOR DELETED COMMAND
  
 XGET     LJM    ** 
          LJM    GET         GET SERIAL/FACTORY/UTILITY SECTOR
  
 XMARGINS LJM    ** 
          LJM    MARGINS     SELECT OFFSET AND STROBE MARGINS SUBROUTIN 
  
 XOUT     LJM    ** 
          LJM    OUT         OUT PROCESSOR CONTROL WORD 
  
 XRDWR    LJM    ** 
          LJM    RDWR        READ, READCW, VERIFY AND WRITE 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
  
 XFLAG    LJM    ** 
          LJM    FLAG        FLAG PULSE SUBROUTINE
  
 XFMDPT   LJM    ** 
          LJM    FMDPT       POSITIONER TEST 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 NO RESERVE WITHIN 5 MINUTES 
* 
*         USES   - EC, EA, EM, P, D.T3, RESA, RES5, FNOA, 
*                  COCON, DRCON, DST2, DST4, DEVTY
* 
*         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. 
  
          LDN    MAXITT      ITERATION COUNT FOR STATUS 
          STM    RESA        AND PAUSE LOOP 
          LDD    PA 
          STM    RES6        SAVE CONTROLLER/DRIVE CONNECT FLAG 
 RES1     RJM    OPC         TO RELEASE THE CONTROLLER IF SELECTED
          LDN    0
          STM    OPC1        SET CONTROLLER AND UNIT NOT RESERVED 
 RES1A    SOM    RESA        DECREMENT THE ITERATION COUNT
          PJN    RES2        IF NOT TIMED OUT 
          LDC    ER.NRES     ELSE ERROR EXIT
          LJM    ERR
  
 RES2     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 
 RES3     RJM    STS         TO GET GENERAL STATUE
  
**     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    RES5        IF COUPLER IS CONNECTED
          SOD    D.T3        DECREMENT LOOP COUNT 
          PJN    RES3        IF NOT TIMED OUT 
 RES4     UJN    RES1A       ELSE START NEXT ITERATION
  
**     6. SET THE CONTROLLER CONNECTED FLAG.
  
 RES5     RJM    DST         GET DETAILED STATUS
          SHN    -9          POSITION CONTROLLER/UNIT RESERVE BITS
          LPN    2           MASK OFF CONTROLLER RESERVE BIT
          ADN    1           SET UNIT RESERVE BIT 
          STM    OPC1        SAVE DETAIL STATUS WD 13 FOR OPC 
  
**     7. STEP 11 IF THE KEYWORD *CONTROLLER* IS SPECIFIED. 
  
 RES5B    LDC    **          **   TYPE OF FUNCTION
 RES6     EQU    *-1         *** CONNECT DRIVER/CONTROLLER FLAG 
          NJN    RES8        IF DRIVE CONNECT IS ALSO DESIRED 
          LJM    RES12       TEST FOR FMD TYPE CONTROLLER 
  
**     8. ISSUE A CONNECT FUNCTION AND OUTPUT THE UNIT NUMBER.
  
 RES8     LPC    2000B       IF RES DRIVE FAULT BIT 10 SET IN UN FIELD
          LMC    **          UNIT NUMBER STORED HERE
 UN       EQU    *-1
          STD    D.T4 
          SBN    40B
          PJN    RES8A       IF GREATER THAN OR EQUAL 10B 
          LJM    RES13
  
 RES8A    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). 
  
 RES9     RJM    STS         TO GET STATUS
          ZJN    RES11       IF STATUS OK 
          SHN    17-DRES     DRIVE BUSY BIT 
          MJN    RES9C       IF DRIVE HUNG BUSY 
          SHN    2
          PJN    RES10       IF NOT CONTROLLER BUSY 
 RES9A    SOD    D.T3        DECREMENT COUNT
          PJN    RES5B       IF NOT DONE WITH THIS ITERATION
 RES9B    LJM    RES1        ELSE START ANOTHER ITERATION 
  
 RES9C    LDM    RESA 
          NJN    RES9A       IF NOT LAST PASS 
  
 RES10    LJM    ERRAGS      ELSE ERROR EXIT
  
 RES11    STM    DRCON
          RJM    DST         GET DETAIL STATUS
          SHN    17-9        POSITION UNIT RESERVE BIT
          MJN    RES12       IF UNIT RESERVED 
          SOM    OPC1        CLEAR UNIT RESERVED BIT
 RES12    LDM    SB+4        DS WD WITH CTRLWARE NO. AND UNIT NO. 
          SHN    17-10
          MJN    RES15       IF FMD CONTROLLER
  
 RES13    LDC    ER.DCSM     ELSE ERROR EXIT
          LJM    ERR
  
  
**    11. BUMP P AND EXIT 
  
 RES15    LJM    XRES        EXIT TO STACK
  
          EJECT 
 CNTRL    TITLE  CNTRL - SEND CONTROL FUNTION TO CONTROLLER.
**        CNTRL- SEND CONTROL FUNTION TO CONTROLLER.
* 
*                  CONTROL A B C D ,ABT Z 
*                  CONTROL A B C D EXECUTE,ABT Z
*                  CONTROL A B C D TIME V TO X AND Y,ABT Z
*                  CONTROL A B C D TIME V X AND Y,ABT Z 
*                  CONTROL A B C D TIME V X Y,ABT Z 
* 
*         ENTRY  - (A)  = ABT ADDRESS 
*                  (PA) = CODE   DESCRIPTION
*                  ------------------------------------------ 
*                          0     CONTROL. 
*                          1     CONTROL EXECUTE. 
*                          2     CONTROL EXECUTE WITH TIMING. 
* 
*                  (PA+1  ) = VALUE V 
*                  (PA+55B) = REG X ADDRESSS
*                  (PA+56B) = REG Y ADDRESSS
*                  (PA+50B) = VALUE A 
*                  (PA+51B) = VALUE B 
*                  (PA+52B) = VALUE C 
*                  (PA+53B) = VALUE D 
* 
*         EXIT   - (FMDADDR) = ADDRESS OF NEXT STORE-1
* 
*                  ERRDNA - ERROR EXIT IF DATA NOT ACCEPTED 
*                  ERRIDR - ERROR EXIT IF DATA NOT RECEIVED 
* 
*         USES   - P, FUN, PA, PA+1, D.T0, D.T1, D.T2, D.T4, PA+50B,
*                  PA+51B, PA+52B, PA+53B, PA+55B, PA+56B,
*                  OB, WT, AL.
* 
*         CALLS  - TCO, FNC, IJM, BD.TEST, FNO. 
* 
  
**     1. VERIFY THAT THE CONTROLLER IS CONNECTED.
* 
 CNTRL    RJM    TCO         TEST CONTROLLER CONNECTED
          STD    WT          (WT)   = 0 
          STD    D.T2        (D.T2) = 0 
          LDD    D.T1 
          STD    D.T4 
          LDD    PA 
          STD    D.Z1        SAVE CONTROL CODE
  
**     2. TEST ADDRESS TO SEE IF IN RANGE OF OB, AND INITIALIZE VALUES
*         FOR DATA STORING. 
* 
          LDM    FMDADDR
          STD    D.T0        (D.T0) = FIRST WORD TO STORE ADDRESS 
          ADC    -OB-1+4
          SHN    -2          DIVIDE BY FOUR TO GET NO. OF CONTROL WORDS 
          STM    OB          (OB) = WORD COUNT OF CONTROL WORDS 
          LDN    4
          STD    D.T1        (D.T1) = WORD COUNT
          RJM    BD.TEST
  
**     3. MOVE THE 4 WORDS TO OB. 
* 
 CNT1     LDM    PA+50B,D.T2 GET DATA 
          STM    OB+1,PA+2
 FMDADDR  EQU    *-1         STORE ADDRESS IN OB
          AOD    D.T2        ADVANCE LOAD ADDRESS 
          LPN    4
          ZJN    CNT1        IF A-D NOT MOVED 
          RAM    FMDADDR
  
**     4. DECREMENT CODE IF EXECUTE THEN STEP 5, ELSE STEP 8. 
* 
          SOD    D.Z1        DECREMENT CONTROL CODE 
          PJN    CNT2        IF NOT ZERO
          LJM    CNT13       EXIT TO STACK
  
**     5. RESET STORE WORD TO FIRST WORD OF BUFFER OB.
*         CHECK CODE IF EXECUTE WITH NO TIMING THEN STEP 6, ELSE SEND 
*         55 FUNCTION WITH CHANNEL 5 THEN STEP 6. 
* 
*         RESET STORE WORD TO FIRST WORD OF BUFFER OB.
* 
 CNT2     LDC    OB+1 
          STM    FMDADDR     RESET VALUE FOR NEXT CONTROL FUNCTION
          LDD    AL 
          SBN    3
          MJN    CNT5        IF ACCESS LEVEL LT 3 
          NJN    CNT6        IF ACCESS LEVEL GE 4 
          LDM    OB 
          STD    PA          SAVE NUMBER OF CONTROL WORDS 
          LDC    OB+4 
          STD    PA+1        (PA+1)=NUMBER LEFT TO CHECK
 CNT3     LDI    PA+1 
          LPN    10B
          NJN    CNT4        IF WRITE BIT SET 
          LDN    4
          RAD    PA+1        INCREMENT ADDRESS FOR NEXT CONTROL WORD
          SOD    PA 
          PJN    CNT3        IF NOT DONE
          UJN    CNT6        IF DONE
  
 CNT4     LDC    0
 FPRECYL  EQU    *-1         NON ZERO = PRE-ALLOCATED AREA  ZERO = NOT
          NJN    CNT6        IF PRE-ALLOCATED AREA
 CNT5     LJM    ERRIAL      WRITE AND NOT PRE-ALLOCATED AREA 
  
 CNT6     LDD    D.Z1 
          ZJN    CNT7        IF EXECUTE 
          LDN    55B
          RJM    FNO         SEND INITIATE TIMING FUNCTION
  
**     6. SEND 51 FUNCTION AND OUTPUT NUMBER OF WORDS.
* 
 CNT7     LDN    51B
          RJM    FNC
          ACN    CH+40B 
 CNT8     LDN    49 
          OAM    OB,CH       SEND DATA TO BC
          ZJN    CNT9        IF ALL DATA NOT ACCEPTED FROM PP 
          LJM    ERRDNA      ALL DATA NOT ACCEPTED FROM PP
  
 CNT9     DCN    CH+40B 
          LDD    D.Z1        GET CONTROL CODE 
  
**     7. IF EXECUTE ONLY THEN STEP 8 ELSE GET TIMING DATA AND STORE
*         IN REGISTERS SPECIFIED BY X AND Y.
* 
          ZJN    CNT13       IF EXECUTE ONLY
 CNT10    LDN    56B         FUNCTION FOR TIMING DATA 
          RJM    FNC
          ACN    CH+40B 
          RJM    FJM         WAIT FOR CHANNEL FULL
          ZJN    CNT11       IF CHANNEL DID NOT GO FULL 
          IAN    CH+40B 
          STI    PA+55B      SAVE TIMING WORD IN REGISTER X 
          RJM    FJM
          NJN    CNT12       IF CHANNEL DID NOT GO FULL 
 CNT11    LJM    ERRISR      ERROR EXIT IF INCOMPLETE STATUS RETURNED 
  
 CNT12    IAN    CH+40B 
          STI    PA+56B      SAVE TIMING WORD IN REGISTER Y 
          DCN    CH+40B 
  
**     8. RETURN TO STACK.
* 
 CNT13    LJM    XCNTRL      EXIT TO STACK
          EJECT 
          EJECT 
 FLAG     TITLE  FLAG - FMD FLAG PULSE. 
**        FLAG - FMD FLAG PULSE.
* 
*                FLAG PULSE CHANNEL=X,ABT Z 
* 
*         ENTRY  - (A) = ABT ADDRESS
*                  (PA)= VALUE X TO BE SENT WITH FUNCTION.
* 
*         EXIT   - NONE.
* 
*         USES   - FNOA.
* 
*         CALLS  - FNO, TDR.
* 
  
**        1. VERIFY THAT THE CONTROLLER IS CONNECTED. 
* 
 FLAG     RJM    TCO
  
**        2. SEND FLAG PUSE FUNCTION AND DATA WORD. 
* 
          LDD    PA 
          STD    D.T4 
          LDN    FP 
          RJM    FNO         SEND FUNCTION
  
**        3. EXIT TO STACK. 
* 
          LJM    XFLAG       RETURN TO CALLER 
          EJECT 
 FMDPT    TITLE  FMDPT - FMD POISITIONER TEST.
**        FMDPT - FMD POSITIONER TEST.
* 
*                FMDPT X Y,ABT Z
* 
*         ENTRY  - (A)        = ABT ADDRESS 
*                  ((PA+55B)) = ADDRESS FOR WORD ONE OF TIMING DATA.
*                  ((PA+56B)) = ADDRESS FOR WORD TWO OF TIMING DATA.
* 
*         EXIT   - ((PA+55B)) = WORD ONE OF TIMING DATA.
*                  ((PA+56B)) = WORD TWO OF TIMING DATA.
* 
*         USES   - XCNTRL+1.
* 
*         CALLS  - FNC, TDR, CNT5A. 
* 
  
**        1. VERIFY THAT THE DRIVE IS CONNECTED.
* 
 FMDPT    RJM    TDR
  
**        2. SEND FMD POSITIONER TEST FUNCTION THEN JUMP TO INPUT 
*            TIMING DATA. 
* 
          LDN    PT 
          RJM    FNC         SEND FUNCTION
          LDM    XFMDPT+1 
          STM    XCNTRL+1    SET RETURN ADDRESS 
          LJM    CNT10       GO TO INPUT TIMING DATA
          EJECT 
 GET      TITLE  GET - READ SERIAL, FACTORY OR UTILITY MAP SECTORS. 
**        GET    - READ SERIAL, FACTORY OR UTILITY FLAW MAP SECTORS.
* 
*                  GET SERIAL, ABT Z
*                  GET FACTORY SECTOR X, ABT Z
*                  GET UTILITY SECTOR X, ABT Z
* 
*         ENTRY  - (A)    = ABT ADDRESS 
*                  (PA)   = CODE ------ 0 = SERIAL
*                  (PA+1) = SECTOR      1 = FACTORY 
*                                       2 = UTILITY 
* 
*         EXIT   -
* 
*         USES   - P, CC, CT, CS, CL, D.T5, D.T6, D.T7, 
*                  COD, RDWRF, PA, PA+1.
* 
*         CALLS  - TDR, RDWR0.
* 
  
**     1. VERIFY THAT THE DRIVE IS CONNECTED. 
* 
 GET      RJM    TDR         CALLER ENTRY POINT 
  
**     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).
* 
          STD    COD         ELIMINATE CODED DATA CHECK 
          STD    RDWRF       INDICATE A READ OPERATION
          LDC    MAPCYL 
          STD    D.T6        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 
  
**     3. EXIT TO STEP 2 READ/WRITE RDWR ROUTINE. 
* 
          LDD    PA 
          SBN    1
          ZJN    GET1        IF GET FACTORY 
          LDN    1
 GET1     STD    D.T7        STORE TRACK
          LDD    PA 
          SHN    0-1
          ADN    RFD         LOAD THE FUNCTION
 GET2     STD    D.Z1        SAVE FUNCTION ** ENTRY FOR SHORTRD **
          LDN    1
          STD    D.T5        STORE NUMBER OF SECTORS
          LDN    D.T5 
          STD    CL 
          LDD    D.Z1        GET FUNCTION 
          LJM    RDWR0       READ ONE SECTOR
  
 GETA     DATA   0           STORAGE FOR SECTOR NUMBER
          EJECT 
 MARGINS  TITLE  MARGINS- PROCESS MARGINS COMMMAND. 
**        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 PARAMETER 
* 
*         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 
 OUT      TITLE  OUT - SEND CONTROL FUNTION TO CONTROLLER.
**        OUT - SEND CONTROL FUNTION TO CONTROLLER. 
* 
*                  OUT CHANNEL=A B C,ABT Z
* 
*         ENTRY  - (A)  = ABT ADDRESS 
*                  (PA) = CHANNEL 
*                  (PA+1) = VALUE B 
*                  (PA+2) = VALUE C 
* 
*         EXIT   - ERRDNA - ERROR EXIT IF DATA NOT ACCEPTED 
*                  ERRIDR - ERROR EXIT IF DATA NOT RECEIVED 
*                  ERRIAL - ERROR EXIT IF ACCESS LEVEL TOO LOW
* 
*         USES   - P, FUN.
* 
*         CALLS  - TCO, FNC, IJM, BD.TEST, FNO. 
* 
  
**     1. VERIFY THAT THE CONTROLLER IS CONNECTED.
* 
 OUT      RJM    TCO         TEST CONTROLLER CONNECTED
          LDD    AL 
          SBN    3
          PJN    OUT1        IF ACCESS LEVEL .GE. 3 
          LJM    ERRIAL      ERROR EXIT AL TOO LOW FOR REQUEST
  
 OUT1     LDN    50B
          RJM    FNC         SEND FUNCTION TO FMD 
          ACN    CH          ACTIVATE THE CHANNEL 
          LDN    3
          STD    WT 
          OAM    PA,CH       OUTPUT THE THREE WORDS TO PROCESSOR
          STD    D.Z1 
          DCN    40B+CH 
          ZJN    OUT3        IF ALL WORDS TRANSMITTED 
          LDD    WT 
          SBD    D.Z1 
          STD    WT          STORE WORDS TRANSMITTED
 OUT2     LJM    ERRDNA      ALL DATA NOT ACCEPTED FROM PP
  
 OUT3     STM    FPRECYL     CLEAR PRE-ALLOCATED CYL FLAG 
          LJM    XOUT 
          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    = CODED/NOT CODED FLAG 
*                             BIT 5    = WRITE/READ FLAG
* 
*                  (PA+63B) = V 
*                  (PA+65B) = W 
*                  (PA+66B) = X 
*                  (PA+67B) = Y 
* 
*         EXIT   - V = ZERO,
*                  W, X, _ Y = LAST CYL, TRK, _ SEC./ 
* 
*                  ERRAGS  - IF ABNORMAL GENERAL STATUS 
*                  ERRDCE  - IF DATA COMPARE ERROR
*                  ERRDNA  - IF DATA NOT ACCEPTED FROM PP 
*                  ERRIAL  - IF ACCESS LEVEL TO LOW FOR REQUEST 
*                  ERRIDR  - IF INCOMPLETE DATA RETURNED TO PP
*                  ERRSTRY - IF A SUCCESSFUL RETRY HAS OCCURRED 
* 
*         USES   - RDWRF,  COD,  FUN,  D.T1, D.T2, D.T4, SB(0-51),(CL), 
*                  SBIE(SB(25-51)), FNOA, (CT), (CS), D.Z0, D.Z1, D.Z2, 
*                  RDWR20,  RDWR21, WT, IR(0-501, OR(1-3) 
* 
* 
*         CALLS  - SEEK1, RDW, STS, DST, TDR
* 
  
**     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 THE 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 CODE 
  
*         ENTRY FOR GET AND SHORTRD 
  
 RDWR0    STD    FUN         SAVE THE FUNCTION CODE 
          LDN    RETRY-SB 
          STD    D.T2        NUMBER OF WORDS IN SB TO CLEAR 
 RDWR1    LDN    0
          STM    SB,D.T2     CLEAR THE STATUS BUFFER
          SOD    D.T2 
          PJN    RDWR1       IF NOT DONE
          LDM    RDWAL,RDWRF
          STD    D.T1        SET READ/WRITE ACCESS LEVEL REQUIRED 
          LDD    BD.AL
          SBD    D.T1        TO TEST ACCESS LEVEL 
          PJN    RDWR3       IF ACC.LEV. NOT PREALLOCATED AREA. 
          ADN    1           TO VERIFY ANY OPERATION OK 
          MJN    ERRIAL      IF PREALLOCATED OPERATION IS NOT OK
          LDD    FUN         LOAD THE CURRENT FUNCTION
          LMN    RDCW        MASK IT WITH READ CHECKWORD
          ZJN    RDWR3       IF READCW IGNORE VALIDATON 
          LDC    MAXCDD-PRECYL
          SBI    CC          CURRENT CYLINDER 
          MJN    RDWR3       IF CYL DESIRED IS IN PREALLOCATED AREA 
 ERRIAL   LDC    ER.IAL      ELSE ERROR EXIT
          LJM    ERR
  
 RDWR3    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    RDWR7       IF THERE ARE SECTORS TO READ 
 RDWR4    LDD    FUN         LOAD CURRENT FUNCTION
          LMN    RS          MASK FOR SHORTRD 
          NJN    RDWR5       IF NOT A SHORT READ
          LJM    XSHORT      EXIT TO SHORT READ 
 RDWR5    LDD    FUN         LOAD THE CURRENT FUNCTION
          LMN    RFD         MASK FOR GET COMMAND 
          SHN    0-1
          NJN    RDWR6       IF IT IS NOT A GET COMMAND 
          LJM    XGET 
  
 RDWR6    LJM    XRDWR       EXIT TO STACK
  
**     4. ISSUE SELECTED STROBES AND OFFSET OPTIONS IF  THEY  HAVE
*         BEEN DEFINED BY A PREVIOUS MARGINS COMMAND. CALCULATE 
*         THE SECTORS REMAINING IN THIS HALF TRACK, IF THE REMAIN-
*         ING COUNT IS MORE THAN  V  USE  V.  IF  NOT  SET  THE 
*         REMAINING COUNT INTO  V. NORMAL EXIT WILL BE WITH  V
*         EQUAL ZERO. 
* 
 RDWR7    LDD    RDWRF
          NJN    RDWR8       SKIP MARGINS ON A WRITE OPERATION
          LDC    **          *** STROBE AND OFFSET SELECTIONS 
 MARGINSA EQU    *-1
          ZJN    RDWR8       IF NO MARGINS
          STD    D.T4 
          LDN    SSO         LOAD THE FUNCTION
          RJM    FNO         TO SEND MARGIN FUNCTION
  
 RDWR8    LDI    CS 
          SHN    -1 
          STD    D.T1        SAVE SECTOR COUNT IN THIS HALF TRACK 
          LDI    CS 
          LPN    1           MASK FOR ODD OR EVEN HALF TRACKS 
          LMN    1
          ZJN    RDWR9       IF ODD HALF TRACKS 
          LDN    TRL+1       ELSE FOR EVEN ADD ALL ODD TRACK COUNT
 RDWR9    ADN    TRL         ADD CURRENT HALF TRACK TRACK COUNT 
          SBI    CT          SUBTRACT THE TRKS WE DONT NEED TO DO 
          SHN    4           MULTIPLY THE REMAINDER BY 16 
          STD    D.T4        SAVE IT
          LDN    20B         MAX SECTORS PER HALF TRACK 
          SBD    D.T1        MINUS THOSE ALREADY DONE 
          RAD    D.T4        TOTAL REMAINING IN THIS HALF TRACK 
          SBI    CL          SUBTRACT THE NUMBER DESIRED
          PJN    RDWR10      IF LESS THAN MAX GO DO THEM
          LDD    D.T4        ELSE SET DESIRED COUNT TO MAX. 
          STI    CL 
  
**     5. ISSUE A READ FUNCTION (0004). 
* 
 RDWR10   LDD    RDWRF       IS IT WRITE (NOT ZERO) OR READ (ZERO)
          ZJN    RDWR11      IF IT IS A READ
          LDD    COD         CODED DATA FLAG
          ZJN    RDWR11      IF IT IS NOT CODED 
          LDI    CC 
          STM    OB+1        SET THE CYLINDER 
          LDI    CT 
          STM    OB+2        SET THE TRACK
          LDI    CS 
          STM    OB+3        SET THE SECTOR 
 RDWR11   LDD    FUN         LOAD THE FUNCTION
 RDWR12   RJM    RDW         TO SEND THE FUNCTION AND READ OR WRITE 
  
**     6. INPUT THE NUMBER OF WORDS SPECIFIED  BY  THE WC REGISTER
*         INTO THE PP INPUT  BUFFER AND STORE THE NUMBER OF  WORDS
*         ACTUALLY READ INTO THE WT REGISTER. 
* 
*      7. REQUEST  AND  INPUT  GENERAL  STATUS TO DETERMINE IF THE
*         OPERATION COMPLETED SUCCESSFULY. IF  GENERAL  STATUS  IS
*         ZERO (NO ERROR), GO TO STEP 11. 
* 
          RJM    STS         TO GET GENERAL STATUS
          NJN    RDWR13      IF BAD STATUS
          LJM    RDWR27      TO READ AGAIN AFTER UPDATING PARAMETERS
  
**     8. REQUEST AND INPUT DETAIL STATUS.  EXECUTE THE ERROR EXIT
*         SEQUENCE IF BIT 2**9 IS SET IN GENERAL STATUS.
*         (NONRECOVERABLE ERROR). 
* 
 RDWR13   RJM    DST         TO GET DETAILED STATUS 
          LDM    SB          GENERAL STATUS 
          SHN    17D-UNR
          PJN    RDWR14      IF NOT A UNRECOVERED ERROR 
          LDD    FUN         GET THE CURRENT FUNCTION 
          LMN    RS          COMPARE WITH SHORT READ
          NJN    RDWR15      IF NOT A SHORT READ
          LJM    RDWR4       ELSE EXIT IF SHORT READ
  
  
**     9. 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). 
* 
 RDWR14   SHN    17D-RIP-17D+UNR   TEST REC. IN PROGRESS
          MJN    RDWR24      IF RECOVERY IN PROGRESS
 RDWR15   LDC    ER.AGS      ERROR EXIT FOR NO RECOVERY IN PROGRESS 
          LJM    ERR
  
**    10. 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. 
* 
 RDWR24   LDM    RETRY
          NJN    RDWR26      IF NOT THE FIRST ERROR RETRY 
          LDN    25B         ELSE MOVE THE INITIAL ERROR TO SBIE
          STD    D.T1 
 RDWR25   LDM    SB,D.T1     LOAD A WORD
          STM    SBIE,D.T1   STORE A WORD 
          SOD    D.T1        DECREMENT THE COUNT
          PJN    RDWR25      IF NOT DONE MOVING WORDS 
 RDWR26   AOM    RETRY       INCREMENT THE RETRY COUNT
          SBN    28D
          PJN    ERRSTRY     IF .GT. 27D RETRIES
 RDWR26A  LDN    CONT        FOR THE CONTINUE FUNCTION
          LJM    RDWR12      TO INPUT AFTER A CONTINUE
  
**    11. WE ARRIVE AT THIS  STEP  AFTER  COMPLETING  A  READ  AND
*         GENERAL  STATUS  IS  ZERO  (NO ERROR). EXECUTE THE ERROR
*         EXIT SEQUENCE IF THE CONTENTS OF THE WT REGISTER IS  NOT
*         EQUAL  THE  WC  REGISTER  (ALL BYTES NOT READ) OR 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).
* 
 RDWR27   LDD    FUN         WHAT IS THE CURRENT FUNCTION 
          LMN    RDCW        IS IT A READCW 
          ZJN    RDWR31      IF READWC DONT COMPARE WC AND WT 
          LDD    WT          WORD ACTUALLY READ 
          SBD    WC          DESIRED WORD COUNT 
          ZJN    RDWR31      IF WORD COUNTS DONT AGREE
 ERRIDR   LDD    RDWRF       IS IT WRITE (NOT ZERO) OR READ (ZERO)
          NJN    ERRDNA      IF IT IS A WRITE 
          LDC    ER.IDR      ELSE ERROR EXIT
          UJN    RDW30
  
 ERRDNA   LDC    ER.DNA      ERROR EXIT 
 RDW30    LJM    ERRDST 
  
 RDWR31   LDM    RETRY
          ZJN    RDWR32      IF NO RETRYS 
          LDD    FUN         GET THE CURRENT FUNCTION 
          LMN    RS          COMPARE WITH SHORT READ
          NJN    ERRSTRY     IF NOT A SHORT READ
          LJM    RDWR4       ELSE EXIT IF SHORT READ
 ERRSTRY  LDC    ER.STRY     ELSE ERROR EXIT
          UJN    RDW30
  
**    12. 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.
* 
 RDWR32   LDD    RDWRF       IS IT WRITE (NOT ZERO) OR READ (ZERO)
          NJN    RDWR33      IF IT IS A WRITE 
          LDD    COD         CODED DATA FLAG
          ZJN    RDWR33      IF NOT CODED DATA
          LDM    IB+1        ADD UP THE DATA WORDS
          ADM    IB+2 
          ADM    IB+3 
          SBI    CC          SUBTRACT THE REGISTERS 
          SBI    CT 
          SBI    CS 
          ZJN    RDWR33      IF NOT A CODE ERROR
          LDC    ER.DCE      ELSE ERROR EXIT
          UJN    RDW30
  
**    13. 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.
* 
 RDWR33   SOI    CL          DECREMENT THE SECTORS REMAINING FLAG 
          ZJN    RDWR37      IF ALL SECTORS PROCESSED 
  
**    14. INCREMENT  THE  CONTENTS  OF REGISTERS W/X/Y PER THE 2_1
*         INTERLACE FLOW-CHART. IF THE CYLINDER IS NOT  COMPLETED,
*         GO TO STEP 5 TO CONTINUE READING FROM THE SAME CYLINDER.
*         IF THE CYLINDER IS COMPLETED, EXIT WITH W/X/Y POINTING
*         TO THE LAST SECTOR PROCESSED. 
* 
 RDWR34   LDN    SEI
          RAI    CS          INCREMENT SECTOR 
          SBN    SEL+1       FOR LIMIT TESTING
          MJN    RDWR35      IF NOT COMPLETE THIS TRACK 
          STI    CS          ELSE RESET SECTOR
          AOI    CT          AND INCREMENT TRACK
          SBN    TRL+1       FOR LIMIT TESTING
          MJN    RDWR35      IF NOT COMPLETE THIS CYLINDER
          STI    CT          ELSE RESET TRACK (TO ZERO) 
          AOI    CS          SWITCH HALF TRACKS 
          LPN    1
          STI    CS          SET SECTOR TO 0 OR 1 
          ZJN    RDWR36      IF A SEEK IS REQUIRED
 RDWR35   LJM    RDWR10      ELSE READ ANOTHER SECTOR 
  
 RDWR36   LDN    SEL
          STI    CS          RESET CURRENT SECTOR TO LAST SECTOR
          LDN    TRL
          STI    CT          RESET CURRENT TRACK TO LAST TRACK
 RDWR37   LJM    RDWR4       RETURN THRU EXIT 
          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 ADDRESS FUNCTION. 
**        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/INPUT GENERAL STATUS AND VERIFY THAT IT IS NOT BUSY.
* 
 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    RTNADDR5    IF NOT TIMED OUT 
 RTNADDR4 LJM    ERRNIDT     ELSE ERROR EXIT
  
 RTNADDR5 LJM    XRTNADD     EXIT TO STACK
          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
          STD    SEEKA       CLEAR CURRENT SEEK TIME
          STM    FPRECYL     CLEAR PRE-ALLOCATED CYL FLAG 
          RJM    STS         TO GET STATUS
          SHN    17D-CRES 
          PJN    SEEK3       IF COUPLER RESERVED
 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 2%1 SEEK FUNCTION (0002). 
* 
          IANN   14B         INPUT THE REAL TIME CLOCK
          STD    D.T1 
 SEEK5    LDN    SEK21
          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       ELSE 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 
          SHN    -8 
          ZJN    SEEK5       IF NOT BUSY FOR 256 MSEC 
  
 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
          ZJN    SEEK11A     IF NO SEEK TIME
          SBN    1           ADJUST SEEK TIME 
 SEEK11A  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    SEEK13      IF ZERO AFTER NOT BUSY 
 ERRAGS   LDC    ER.AGS      AND ERROR EXIT 
 SEEK12   UJN    ERRDST      ERROR EXIT 
  
 SEEK13   LDC    MAXCDD-PRECYL+1
          SBI    CC          SUBTRACT CURRENT CYL 
          PJN    SEEK14      IF NOT PRE-ALLOCATED CYL 
          AOM    FPRECYL     FLAG PRE-ALLOCATED CYL 
 SEEK14   LJM    SEEK1X      RETURN 
          EJECT 
 SHORTRD  TITLE  SHORTRD- PERFORM A SHORT READ 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, RDWR0 
* 
  
**     1. VERIFY THAT THE DRIVE IS CONNECTED. 
* 
 SHORTRD  RJM    TDR         CALLER ENTRY POINT 
          STD    COD         SET FOR NOT CODED READ 
          STD    RDWRF       SET FLAG FOR READ
          LDC    SHRD 
          STD    WC          SET FOR ABNORMAL WORD COUNT
  
**     2. EXIT TO THE READ WRITE ROUTINE RDWR STEP 2. 
* 
          LDN    RS          TO SET THE FUNCTION
          LJM    GET2        ENTER COMMON SEQUENCE
          EJECT 
 STATUS   TITLE  STATUS - GET GENERAL, DETAIL OR CHANNEL STATUS.
**        STATUS - GET GENERAL, DETAIL OR CHANNEL STATUS. 
* 
*                  STATUS GENERAL, ABT Z
*                  STATUS DETAIL, ABT Z 
*                  STATUS CHANNEL, ABT Z
* 
*          GENERAL - INPUT 1 WORD OF GENERAL STATUS TO  SB(0).
*          DETAIL  - INPUT 20D WORDS OF DETAIL STATUS TO SB(1)-SB(20D)
*          CHANNEL - INPUT 30D WORDS OF CHANNEL STATUS TO SB(1)-SB(30D) 
* 
*         ENTRY  - (A)  = ABT ADDRESS 
*                  (PA) = CODE          0 = GENERAL 
*                                       1 = DETAIL
*                                       2 = CHANNEL 
* 
*         EXIT   - (A)  = STATUS (IF GENERAL STATUS IS SELECTED)
*                  (SB), OR (SB 0-24) = STATUS OR DETAIL. 
* 
*                  ERRISR - ERROR EXIT IF INCOMPLETE STATUS RETURNED
* 
*         USES   - LF, P, D.T1, SB, WT
* 
*         CALLS  - ERA, TCO, STS, DST, FNC, FJM, IJM
* 
  
**     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
          STD    WT          CLEAR WT REGISTER
  
**     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  SBN    1
          NJN    STATUS5     IF NOT STATUS DETAIL 
          LDN    EDS         SAVE LAST FUNCTION 
          STD    LF          SAVE LAST PRIMARY FUNCTION 
          RJM    DST         GET DETAIL STATUS
 STATUS4  LJM    XSTATUS     EXIT TO STACK
  
 STATUS5  LDN   IPCS
          RJM    FNC         SEND FUNCTION TO PROCESSOR 
          ACN    CH 
          RJM    FJM         WAIT FOR FULL
          ZJN    STATUS6     IF CHANNEL DID NOT GO FULL 
          LDN    32D
          IAM    SB+1,CH     INPUT PROCESSOR CHANNEL STATUS 
          NJN    STATUS6
          RJM    IJM         WAIT FOR INACTIVE
          NJN    STATUS4     IF OK RETURN 
 STATUS6  UJN    ERRISR 
          EJECT 
 DST      TITLE  UTILITIES USED BY FMD PRODUCT 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   - D.T1, SB(1-24) 
* 
*         CALLS  - FNA, FJM, IJM
* 
*         TIME   - MINIMUM 1X SPEED EXECUTION TIME IS 247+ MICROSEC.
* 
 DST0     LDM    SB+13       DETAIL STATUS WORD 13
 DSTX     LJM    **          ENTRY/EXIT 
 DST      EQU    *-1
  
**        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 
  
**        2. ISSUE DETAIL EXTENDED STATUS FUNCTION. 
* 
          LDN    EDS
          RJM    FNA         ISSUE STATUS FUNCTION
          NJN    DST2        IF FUNCTION ACCEPTED 
          LDC    ER.NIDS     ERROR IF NO INACTIVE TO DETAIL STATUS
          UJN    DST4 
  
**        3. INPUT STATUS AND RETURN. 
* 
 DST2     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 
          RJM    IJM         VERIFY INACTIVE IS RECEIVED
          NJN    DST0        IF INACTIVE RECEIVED 
 ERRISR   LDC    ER.ISR      ERROR IF INCOMPLETE STATUS RETURNED
 DST4     UJN    FNC1 
          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    ITERATION TIME 
 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 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
 FNC1     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   - ERRFPNA - IF FUNCTION PARAMETER NOT ACCEPTED 
* 
*         USES   - NONE 
* 
*         CALLS  - FNC
* 
*         TIME   - MINIMUM 1X SPEED EXECUTION TIME IS 40 MICROSEC.
* 
 FNOX     LJM    **          ENTRY/EXIT 
 FNO      EQU    *-1
          RJM    FNC         TO SEND FUNCTION 
          ACN    CH          ACTIVATE THE CHANNEL 
          LDN    1
          OAM    D.T4,CH
          ZJN    FNO2        IF PARAMETER WAS ACCEPTED
 ERRFPNA  LDC    ER.FPNA     ELSE ERROR EXIT
 FNO1     LJM    ERR
  
 FNO2     EJM    FNO3,CH
          ADN    1
          PJN    FNO2        LOOP ON CHANNEL EMPTY TEST 
          LJM    ERRDNA      ERROR EXIT IF CHANNEL DID NOT GO EMPTY 
  
 FNO3     DCN    CH+40B 
          UJN    FNOX        EXIT 
  
 FNOA     DATA   0           DATA WORD TO BE SENT 
          SPACE  4,10 
**        IJM    - WAIT INACTIVE AND TIME OUT.
* 
*         ENTRY  - NONE 
* 
*         EXIT   - (A) = NONZERO IF FUNCTION ACCEPTED 
*                        ZERO IF FUNCTION NOT ACCEPTED
* 
*         USES   - NONE 
* 
*         CALLS  - NONE 
* 
*         TIME   - MINIMUM 1X SPEED EXECUTION TIME IS 6 MICROSEC. 
* 
 IJMX     LJM    **          ENTRY/EXIT 
 IJM      EQU    *-1
          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
          UJN    IJMX        ELSE EXIT W/(A) = ZERO 
          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
          STM    FPRECYL     CLEAR PRE-ALLOCATED CYLINDER FLAG
          AOM    COCON       CLEAR CONTROLLER CONNECT FLAG
          AOM    DRCON       CLEAR 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        DRIVE RELEASE FUNCTION 
          UJN    OPC4 
  
 OPC2     UJN    OPCX        RETURN 
  
*         THE RELEASE REQUEST CAME FROM THE BASIC DRIVER, SO PROCESS
*         IT WITHOUT CHANGING ANY DATA OR CREATING AN ERROR EXIT. 
  
 OPC3     LDN    OC 
 OPC4     STD    D.T5 
          LDM    ERR3        UPPER BITS OF ABT ADDRESS
          SBN    77B
          NJN    OPC5        IF REQUEST IS FROM THE USER
          LDD    D.T5 
          RJM    FNA         EXECUTE OPERATION COMPLETE FUNCTION
          NJN    OPC2        EXIT 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 
**        RDW    - ISSUE REQUESTED FUNCTION AND READ OR WRITE.
* 
*         ENTRY  - (A) = FUNCTION TO ISSUE. 
* 
*         EXIT   - NONE 
* 
*         USES   - IB(0-501), D.T1, WT
* 
*         CALLS  - FNC, IJM 
* 
 RDWX     LJM    **          ENTRY/EXIT 
 RDW      EQU    *-1
  
**     1. ISSUE THE REQUESTED FUNCTION. 
* 
          SHN    12D
          STD    WT          CLEAR WT REGISTER
          SHN    -12D 
          RJM    FNC         ISSUE THE FUNCTION 
          LDD    FUN
          LMN    RDCW 
          ZJN    RDWX        EXIT IF READCW - NO DATA TRANSFER
  
**     2. INPUT 322D WORDS FROM THE SUBSYSTEM MEMORY TO THE INPUT 
*         BUFFER IF IT IS A READ OPERATION. 
* 
          ACN    CH          ACTIVATE THE CHANNEL 
          LDD    RDWRF       IS IT WRITE (NOT ZERO) OR READ (ZERO)
          NJN    RDW1        IF IT IS A WRITE 
          LDD    WC 
          IAM    IB,CH       READ TO INPUT BUFFER 
          UJN    RDW2 
  
**     3. OUTPUT 322D WORDS FROM THE OUTPUT BUFFER TO THE SUBSYSTEM 
*         IF IT IS A WRITE OPERATION. 
* 
 RDW1     LDD    WC          LOAD WORD COUNT
          OAM    OB,CH       WRITE FROM THE OUTPUT BUFFER 
  
**     4. VERIFY THAT 322B WORDS WERE ACTUALLY INPUT. 
* 
 RDW2     STD    D.T1        SAVE COUNT OF WORDS NOT WRITTEN
          LDD    WC          LOAD THE EXPECTED WORD COUNT 
          SBD    D.T1 
          STD    WT          STORE THE WORDS ACTUALLY TRANSFERED
          LDD    RDWRF       IS IT WRITE (NOT ZERO) OR READ (ZERO)
          NJN    RDW4        IF IT IS A WRITE 
          RJM    IJM         TO INSURE CHANNEL IS INACTIVE
 RDW3     NJN    RDWX        EXIT IF CHANNEL NOT HUNG ACTIVE
 ERRNIDT  LDC    ER.NIDT     ELSE ERROR EXIT
          UJN    STS0        JUMP TO ERR
  
 RDW4     DCN    CH+40B      DEACTIVATE THE CHANNEL 
          UJN    RDW3        EXIT 
          SPACE  4,16 
**        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  - FNA, FJM, IJM
* 
*         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
 STS0     UJN    STS3        JUMP TO ERR
  
 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
          RJM    IJM         WAIT FOR INACTIVE
          NJN    STSXX       EXIT IF INACTIVE RECEIVED
 ERRGSNR  EQU    *
 STS2     LDC    ER.GSNR     ERROR IF NO FULL OR NO INACTIVE
 STS3     UJN    TCA1        JUMP TO ERR
          SPACE  4,10 
**        TCA    - TEST CHANNEL ASSIGNMENT. 
* 
*         ENTRY  - (A) = ABORT ADDRESS
* 
*         EXIT   - ABT ADDRESS STORED IN ERR3 AND ERR4
* 
*                  ERRCNA  - IF CHANNEL NOT ASSIGNED
* 
*         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    ERR
          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    ** 
 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    ** 
 DRCON    EQU    *-1         *** DRIVE CONNECTED FLAG STORED HERE.
          ZJN    TDRX        IF CONNECTED EXIT
 ERRCNC   LDC    ER.CNC      ELSE ERROR EXIT
          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    5200B       ADD IN BIAS FOR FMDHT 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
 RDWAL    EQU    SB+53B      AL REQUIRED FOR READ NON PREALLOCATED
 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      ITERATION COUNT FOR RES COMMAND
 SBLWA    EQU    SB+64B      STATUS BUFFER LWA+1
 LSB      EQU    64B         LENGTH OF STATUS BUFFER
  
          ERRPL  *-IB-1      ERROR IF FMDHT PRODUCT 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 REL AND RES CHANNEL 
 INIT11   LDC    WRRD 
          STD    WC          SET DEFAULT VALUE IN WORD COUNT REGISTER 
          LDN    ARD
          STM    RDWAL       SET AL FOR READ NON PREALLOCATED 
          LDN    ARW
          STM    RDWAL+1     SET AL FOR WRITE NON PREALLOCATED
  
*         VERIFY THAT THE ASSIGNED DEVICE CODE IS SUPPORTED 
  
          LDD    DC          DEVICE CODE CURRENTLY ASSIGNED 
          SBN    D885 
          ZJN    INIT12 
          LDC    INITA       (A) = POINTER TO ERROR MSG IF NO SUPPORT 
 INIT12   LJM    START       EXIT WITH (A) = ERROR/NO ERROR FLAG
  
 INITA    DIS    ,*  SELECTED DEVICE CODE NOT SUPPORTED*
  
*         TABLE OF PPU SPEED SWITCHES 
  
 TSPEED   VFD    12/FJM2
          VFD    12/IJM2
          DATA   0           END OF SPEED SWITCHES TABLE
  
          EJECT 
          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 STATUS)
          MMSG   ER.NIDS,EC.NIDS,(NO INACTIVE TO DETAIL STATUS) 
          MMSG   ER.GSNR,EC.GSNR,(GENERAL STATUS NOT RETURNED)
          MMSG   ER.ISR,EC.ISR,(INCOMPLETE STATUS RETURNED) 
          MMSG   ER.FPNA,EC.FPNA,(FUNC PARAMETERS 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,(ACCESS LEVEL TOO LOW FOR REQ) 
          MMSG   ER.NRES,EC.NRES,(RESERVE 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 ERROR) 
          MMSG   ER.DCSM,EC.DCSM,(DEVICE CODE/STATUS MISMATCH)
          MMSG   ER.NIDT,EC.NIDT,(NO INACTIVE AFTER DATA XFER)
 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     ERROR IF 66X OVERLAY OVERFLOW
  
          QUAL   *
