*COMDECK,LSFMD1 
          TITLE  HIGH LEVEL LSFMD1 FULL TRACK PRODUCT OVERLAY FOR MALET.
 5S1      SEGMENT POVLA 
          ORG    POVLA
          QUAL   LSFMD1 
*CALL,VERS
          COMMENT LSFMD1 PRODUCT OVERLAY FOR MALET "VERS" 
          EJECT 
  
**        FOLLOWING COMMANDS ARE DESIGNATED FOR LSFMD DISK SUBSYSTEM ON 
*         AN 885-1X RUNNING IN A  FULL-TRACK MODE.  5S1 IS  THE PRODUCT 
*         OVERLAY THAT  EXECUTES THESE  COMMANDS  AND IS DRIVEN  BY THE 
*         INSTRUCTION STACK OF THE MALET PP DRIVER. FOR LSFMD DISK SUB- 
*         SYSTEMS, THE MALET PP  DRIVER  EXECUTES  OUT OF A 16  BIT 4X
*         SPEED  PP UTILIZING  A 12 BIT CHANNEL.  REQUESTS ARE  MADE BY 
*         THE DRIVER BY  STORING  PARAMETERS INTO PP  DIRECT CELLS  AND 
*         PERFORMING A RETURN-JUMP TO AN OVERLAY SUBROUTINE.  THE OVER- 
*         LAY SUBROUTINE ALSO USES  PARAMETERS WHICH HAVE BEEN COMPILED 
*         INTO THE  INSTRUCTION STACK AREA.  ONCE THE REQUEST  HAS BEEN 
*         COMPLETED,  CONTROL IS RETURNED TO  THE STACK TO EXECUTE  THE 
*         NEXT COMMAND.  THE LANGUAGE (DEVICE) TYPE FOR  THESE COMMANDS 
*         IS LSFMD1.
* 
*         THE LSFMD1 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_
* 
*           CONTROL- SEND CONTROL WORD TO CONTROLLER AL .GE. 10 NEEDED. 
*           FLAG   - SEND FLAG PULSE FUNCTION TO CONTROLLER 
*           FMDPT  - SEND POSITIONER TEST FUNCTION TO SUBSYSTEM 
*           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 500B SECTORS FROM DISK TO IB. 
*           READCW - SEEK AND READ CHECKWORD ON 0 TO 500B 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. 
*           STATUS - INPUT GENERAL, DETAIL OR CHANNEL STATUS TO SB. 
*           VERIFY - SEEK AND WRITE VERIFY 0 TO 500B SECTORS ON DISK. 
*           WRITE  - SEEK AND WRITE 0 TO 500B 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 2540B 12BIT WORDS ACROSS 
*         A 12 BIT CHANNEL.  A WRITE IS ACCOMPLISHED BY REPETATIVE OUT- 
*         PUTS  FROM THE  OUTPUT BUFFER (A BLOCK OF 140B WORDS FOLLOWED 
*         BY 4 BLOCKS OF 500B WORDS). IN THIS WAY A LARGE SECTOR (2540B 
*         12 BIT WORDS) IS CONSTRUCTED FROM THE 500B WORD BUFFER. 
* 
*         EXECUTION OF A READ WILL LEAVE THE LAST 500B WORD BLOCK IN THE
*         INPUT 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
*                               FMDPT-------------/ . / . /-- RESET 
*                              FLAG-------------. / . / . / .- RTNADDR
*                             GET-------------/ . / . / . / . / SEEK
*                            MARGINS--------. / . / . / . / . / .STATUS 
*                           READ----------/ . / . / . / . / . / . VERIFY
*                          READCW-------. / . / . / . / . / . / . / WRIT
*   CODE     MESSAGE      REL---------/ . / . / . / . / . / . / . / . 
*      ------------------------------ - - - - - - - - - - - - - - - - 
* 4001 ADDR OUT OF FL                 X . . . . . . . . X . . . . . . 
*      ------------------------------ - - - - - - - - - - - - - - - - 
* 4004 BUFFER INDEX OR WC ERROR       . . . . . . . X . . . X . . . . 
*      ------------------------------ - - - - - - - - - - - - - - - - 
* 6610 CH NOT ASSIGNED                . X X . X X X X X . X X X X X X 
*      ------------------------------ - - - - - - - - - - - - - - - - 
* 6611 CH ACTIVE ON ENTRY             . . . . . . . . . X . . . . . . 
*      ------------------------------ - - - - - - - - - - - - - - - - 
* 6612 NO INACTIVE TO LAST FUNC.      X X X . X X X X X X X X X X X X 
*      ------------------------------ - - - - - - - - - - - - - - - - 
* 6613 NO INACTIVE TO GENERAL STATUS  . X X . X . . . . X . X X X X X 
*      ------------------------------ - - - - - - - - - - - - - - - - 
* 6614 NO INACTIVE TO DETAIL STATUS   . X X . X . . . . X . . X X X X 
*      ------------------------------ - - - - - - - - - - - - - - - - 
* 6615 GENERAL STATUS NOT RETURNED    . X X . X . . . . X . X X X X X 
*      ------------------------------ - - - - - - - - - - - - - - - - 
* 6616 INCOMPLETE STATUS RETURNED     . X X . X . X X . X . . X X X X 
*      ------------------------------ - - - - - - - - - - - - - - - - 
* 6617 FUNC PARAMETERS NOT ACCEPTED   . X X . X X . X . X . . X . X X 
*      ------------------------------ - - - - - - - - - - - - - - - - 
* 6620 ALL DATA NOT ACCEPTED FROM PP  . . . . . . . X X . . . . . X X 
*      ------------------------------ - - - - - - - - - - - - - - - - 
* 6621 INCOMPLETE DATA RETURNED TO PP . . X . X . . . . . . . . . . . 
*      ------------------------------ - - - - - - - - - - - - - - - - 
* 6622 CONTROLLER/DRIVE NOT CONNECTED . X X . X X X X X . . X X X X X 
*      ------------------------------ - - - - - - - - - - - - - - - - 
* 6623 ACCESS LEVEL TOO LOW FOR REQ   . . X . . . . X X . . . . . X X 
*      ------------------------------ - - - - - - - - - - - - - - - - 
* 6624 RESERVE TIMEOUT                . . . . . . . . . X . . . . . . 
*      ------------------------------ - - - - - - - - - - - - - - - - 
* 6625 ABNORMAL GENERAL STATUS        . X X . X . . . . X . X X . X X 
*      ------------------------------ - - - - - - - - - - - - - - - - 
* 6626 ILLEGAL STROBES/OFFSET         . . . X . . . . . . . . . . . . 
*      ------------------------------ - - - - - - - - - - - - - - - - 
* 6627 UNIT HUNG BUSY ON SEEK         . X X . X . . . . . . . X . X X 
*      ------------------------------ - - - - - - - - - - - - - - - - 
* 6630 SUCCESSFUL RETRY               . X X . X . . . . . . . . . X X 
*      ------------------------------ - - - - - - - - - - - - - - - - 
* 6631 DATA COMPARE ERROR             . . X . . . . . . . . . . . . . 
*      ------------------------------ - - - - - - - - - - - - - - - - 
* 6632 DEVICE CODE/STATUS MISMATCH    . . . . . . . . . X . . . . . . 
*      ------------------------------ - - - - - - - - - - - - - - - - 
* 6633 NO INACTIVE AFTER DATA XFER    . . X . X . . . . . . X . . . . 
*      ------------------------------ - - - - - - - - - - - - - - - - 
* 6634 CHANNEL FAILED TO GO EMPTY     . X X . X X . X X X . . . . X X 
*      ------------------------------ - - - - - - - - - - - - - - - - 
* 6635 CHANNEL PE ON INPUT            . . X . . . . . . . . . . X . . 
*      ------------------------------ - - - - - - - - - - - - - - - - 
          EJECT 
  
*         THE PROCESS DESCRIBED IN THE FOLLOWING STEPS IS USED WITHIN 
*         LSFMD1 PRODUCT OVERLAY TO UPDATE TRACK AND SECTOR REGISTERS 
*         WHILE PROCESSING I/O DATA TRANSFER COMMANDS READ, READCW, 
*         VERIFY AND WRITE IN 1:1 INTERLACE MODE. 
* 
*         THE "SECTORS REMAINING COUNT" IS THE NUMBER OF SECTORS
*         REQUESTED WHICH REMAIN TO BE PROCESSED.  INITIALLY, 
*         "SECTORS REMAINING COUNT" EQUALS NUMBER OF SECTORS REQUESTED. 
* 
*         THE "SECTOR COUNT" IS THE PHYSICAL SECTOR POSITION OF THE 
*         SECTOR CURRENTLY BEING TRANSFERRED.  THE "TRACK COUNT" IS 
*         THE PHYSICAL TRACK POSITION OF THE TRACK CURRENTLY BEING
*         TRANSFERRED.
* 
*          1. PERFORM SEEK SEQUENCE.
* 
*          2. IF SECTORS REMAINING COUNT (V) = 0, EXIT TO STACK.
* 
*          3. CALCULATE NUMBER OF SECTORS THAT CAN BE PROCESSED FROM
*             CURRENT TRACK/SECTOR TO END OF CYLINDER.  SET THE 
*             SECTORS REMAINING COUNT TO THIS VALUE OR TO THE NUMBER
*             REQUESTED WHICHEVER IS SMALLER. 
*                A. CALCULATE THE NUMBER OF TRACKS FROM CURRENT TRACK+1 
*                   TO END OF CYLINDER.  CONVERT THIS NUMBER TO A COUNT 
*                   OF THE NUMBER OF SECTORS REPRESENTED. 
*                B. DETERMINE NUMBER OF SECTORS IN CURRENT TRACK EXTEND-
*                   ING FROM CURRENT SECTOR POSITION TO END OF TRACK. 
*                C. ADD THE NUMBER  OF SECTORS CALCULATED IN STEP A, TO 
*                   THE NUMBER OF SECTORS DETERMINED IN STEP B. THE SUM 
*                   REPRESENTS  THE MAXIMUM NUMBER OF SECTORS  THAT CAN 
*                   BE GRANTED IN THE I/O COMMAND.
*                D. SUBTRACT THE VALUE OF V (SECTORS REQUESTED)FROM THE 
*                   VALUE IN STEP C (MAXIMUM SECTORS GRANTED).
*                E. IF THE  DIFFERENCE IS POSITIVE, ALL OF THE  SECTORS 
*                   REQUESTED (V) WILL BE PROCESSED BY THE I/O COMMAND. 
*                F. IF THE DIFFERENCE IS NEGATIVE,THE NUMBER OF SECTORS 
*                   WHICH WILL BE PROCESSED IS THE MAX. NUMBER GRANTED. 
*                   REPLACE THE CONTENTS OF REG. V (SECTORS REQUESTED), 
*                   WITH THE VALUE FROM STEP C (MAX. SECTORS GRANTED).
* 
*          4. PROCESS ONE SECTOR. 
* 
*          5. SUBTRACT ONE FROM SECTORS REMAINING COUNT.
* 
*          6. IF SECTORS REMAINING COUNT = 0, EXIT TO STACK.
* 
*          7. INCREMENT SECTOR COUNT. 
* 
*          8. IF SECTOR COUNT IS GREATER THAN 7B, GO TO 9, ELSE 
*             GO TO 4.
* 
*          9. CLEAR SECTOR COUNT. 
* 
*         10. INCREMENT TRACK COUNT.
* 
*         11. GO TO 4.
          EJECT 
* 
*         THE FOLLOWING STEPS DESCRIBE THE ERROR EXIT/ERROR 
*         RECOVERY SEQUENCE USED IN GET, READ, READCW, VERIFY AND 
*         WRITE COMMANDS. 
* 
*         1. AFTER COMPLETING I/O OPERATION FOR CURRENT SECTOR, 
*            REQUEST AND INPUT GENERAL STATUS TO DETERMINE IF 
*            OPERATION COMPLETED SUCCESSFULLY.  IF GENERAL
*            STATUS IS NON-ZERO ENTER ERROR EXIT/ERROR RECOVERY 
*            SEQUENCE.
* 
*         2. REQUEST AND INPUT DETAIL STATUS, SAVE IN STATUS
*            BUFFER.
* 
*         3. IF GENERAL STATUS BIT 2**9 (UNRECOVERED ERROR) IS
*            CLEAR GO TO 7, ELSE GO TO 4. 
* 
*         4. A NONRECOVERABLE ERROR HAS OCCURRED.  BEGIN
*            NON-RECOVERABLE ERROR EXIT.
* 
*         5. SELECT ERROR REPORT - ABNORMAL GENERAL STATUS. 
* 
*         6. PERFORM ERROR EXIT.
* 
*         7. A RECOVERABLE ERROR CONDITION EXISTS.  IF GENERAL
*            STATUS BIT 2**8 IS SET (RECOVERY IN PROGRESS), 
*            ENTER THE RECOVERY SEQUENCE (GO TO 9), ELSE GO TO
*            8. 
* 
*         8. GENERAL STATUS AT THIS POINT IS STRANGE SINCE IT 
*            IS NON-ZERO YET BOTH NON-RECOVERABLE AND RECOVERY- 
*            IN-PROGRESS BITS ARE ZERO.  GO TO 5. 
* 
*         9. BEGIN RECOVERY SEQUENCE.  IF FIRST ERROR RETRY GO
*            TO 10, ELSE GO TO 11.
* 
*        10. SAVE DETAIL STATUS IN STATUS BUFFER SAVE AREA FOR
*            INITIAL ERROR. 
* 
*        11. INCREMENT RETRY COUNTER. 
* 
*        12. IF 28D TRIES HAVE BEEN MADE GO TO 13, ELSE GO TO 14. 
* 
*        13. SELECT ERROR REPORT - SUCCESSFUL RETRY AND GO TO 6.
* 
*        14. PERFORM CONTINUE FUCNTION (14B) FOLLOWED BY I/O
*            DATA TRANSFER OPERATION.  GO TO 1. 
          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.CAE   EQU    11B         CHANNEL ACTIVE ON ENTRY
 EC.NILF  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.CDNC  EQU    22B         CONTROLLER/DRIVE NOT CONNECTED 
 EC.ALTL  EQU    23B         ACCESS LEVEL TOO LOW FOR REQUEST 
 EC.REST  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.CFE   EQU    34B         CHANNEL FAILED TO GO EMPTY 
 EC.CPE   EQU    35B         CHANNEL PARITY ERROR ON INPUT
  
*         DIRECT CELL EQUATES.
  
 CDCF     EQU    60B         CONNECT DRIVE/CONTROLLER FLAG
 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
 COCON    EQU    64B         CONTROLLER CONNECTED FLAG
 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
 IOC      EQU    D.T6        I/O CODE REGISTER
  
          EJECT 
*         EQUATES FOR EQUIPMENT FUNCTIONS.
  
 CONN     EQU    0           CONNECT
 SEK11    EQU    1           SEEK 1 TO 1 INTERLACE
 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
 DW       EQU    33B         DIAGNOSTIC WRITE 
 SSO      EQU    41B         SELECT STROBES AND OFFSET
 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. 
  
 BUSY     EQU    1           UNIT BUSY
 DRES     EQU    3           DRIVE RESERVED 
 RIP      EQU    8D          RECOVERY IN PROGRESS 
 UNR      EQU    9D          NONRECOVERABLE ERROR 
 CRES     EQU    10D         CONTROLLER RESERVED
  
*         DEVICE CODES SUPPORTED. 
  
 LSFMD    EQU    16B         LSFMD LARGE SECTOR SERIAL 885-1X 
          SPACE  4,20 
*         MISCELANEOUS 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
  
 MAXCDD   EQU    1512B       MAXIMUM CYLINDER ON A 885
 MAPCYL   EQU    1511B       CYLINDER CONTAINING MAP INFORMATION
 PRECYL   EQU    2           NUMBER OF PREALLOCATED CYLINDERS 
  
*IF,DEF,SECURE,1
 ARD      EQU    4           READ ANYWHERE
*IF,-DEF,SECURE,1 
 ARD      EQU    2           READ ANYWHERE
 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 
 SELS     EQU    37B         MAXIMUM SECTOR COUNT (SMALL SECTOR)
 SELL     EQU    7           MAXIMUM SECTOR COUNT (LARGE SECTOR)
 TRL      EQU    47B         MAXIMUM TRACK 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 
  
          CON    IB          FWA OF INPUT BUFFER
          CON    OB          FWA OF OUTPUT BUFFER 
          CON    SB          FWA OF STATUS BUFFER 
          CON    LIB         LENGTH OF INPUT BUFFER 
          CON    LIB         LENGTH OF OUTPUT BUFFER
          CON    LSB         LENGTH OF STATUS BUFFER
          CON    BD.VERS     VERSION NUMBER OF THIS OVERLAY 
  
**        RFM    - RELEASE FROM MLD (FIXED LOCATION ENTRY POINT)
*                  RELEASE CALLED FROM MAINTENANCE LANGUAGE DRIVER
*                  RELEASE CONTROLLER AND DRIVE IF CONNECTED
* 
*                  REL, ABT Z 
* 
*         ENTRY  - (A) = ABORT ADDRESS (777777B)
* 
*         EXIT   - RELEASE COMMAND HAS BEEN EXECUTED
* 
*         USES   - ERR3, ERR4 
* 
*         CALLS  - OPC, BD.DCH
* 
 XRFM     LJM    **          EXIT TO MLD
 RFM      EQU    *-1
          STM    ERR4        SAVE ABORT ADDRESS (777777B) 
          SHN    -12D 
          STM    ERR3 
          RJM    OPC         RELEASE THE EQUIPMENT IF CONNECTED 
          RJM    BD.DCH      DROP CHANNEL/TALK TO SYSTEM AND EXEC 
          UJN    XRFM        EXIT TO MLD
          EJECT 
**        ENT    - DISTRIBUTE CONTROL TO REQUESTED COMMAND
* 
*         ENTRY  - ((ENT))    BITS 11 - 06 = INDEX TO TBLENT ENTRY
*                                            BIASED BY 20B
*                  ((ENT))    BITS 05 - 00 = LINE NO. UPPER 6 BITS
* 
*                  ((ENT)+1)  BIT  11      = LINE NO. LOWER BIT 
*                  ((ENT)+1)  BITS 10 - 00 = ABORT ADDRESS IN STACK 
* 
*         EXIT   - COMMAND HAS BEEN EXECUTED
* 
*         USES   - D.Z1, D.Z2, D.Z3, ERR3, ERR4 
* 
*         CALLS  - NONE (LJM TO REQUESTED COMMAND)
* 
 XENT     LJM    **          EXIT TO CALLER OF COMMAND CODE (IN STACK)
 ENT      EQU    *-1
          LDM    ENT         ADDRESS OF COMMAND PARAMETERS IN STACK 
          STD    D.Z2        SAVE FOR INDIRECT LOAD OF PARAMETERS 
          LDI    D.Z2        LOAD COMMAND PARAMETER WORD 1 FROM STACK 
          SHN    12D         OBTAIN INDEX+20B TO CURRENT TBLENT ENTRY 
          STD    D.Z3        SAVE FOR LOAD OF ADDRESS OF COMMAND CODE 
          SHN    -12D        OBTAIN UPPER 6 BITS OF LINE NUMBER 
          STM    ERR3        SAVE IN ERROR PROCESSING AREA
          AOD    D.Z2        INCREMENT TO COMMAND STACK PARAMETER WORD 2
          LDI    D.Z2        LOAD COMMAND PARAMETER WORD 2 FROM STACK 
          STM    ERR4        RIGHT BIT OF LINE NO./ 11 BIT ABORT ADDRESS
          AOD    D.Z2        INCREMENT TO NEXT COMMAND IN STACK 
          STM    ENT         STORE ADDRESS IN EXIT TO STACK LONG JUMP 
          LDM    TBLENT-20B,D.Z3     LOAD FWA OF CODE TO EXECUTE COMMAND
          STD    D.Z1 
          LJM    0,D.Z1      GO EXECUTE COMMAND 
  
**        TABLE OF ENTRY POINTS FOR EXECUTING HIGH LEVEL COMMANDS 
* 
 TBLENT   CON    REL            RELEASE CONTROLLER AND DRIVE
          CON    RES         RESERVE CONTROLLER OR CONTROLLER AND DRIVE 
          CON    CNTRL       SEND CONTROL FUNCTION TO CONTROLLER
          CON    GET         READ SERIAL, FACTORY OR UTILITY SECTOR 
          CON    MARGINS     SAVE STROBES AND OFFSET MARGINS
          CON    OUT         SEND CONTROL FUNCTION TO CONTROLLER
          CON    RDWR        SEEK AND I/O THE REQUESTED NO. OF SECTORS
          CON    RESET       AUTOLOAD THE CONTROLLER
          CON    RTNADDR     RETURN CYLINDER ADDRESS FUNCTION 
          CON    SEEK        SEEK TO THE ADDRESS SPECIFIED
          CON    FMDPT       FMD POSITIONER TEST
          CON    STATUS      GET GENERAL, DETAIL OR CHANNEL STATUS
          CON    FLAG        FMD FLAG PULSE 
          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  - (PA) = CONTROLLER/DRIVE FLAG 
* 
*         EXIT   - I/O CHANNEL ASSIGNED AND CHANNEL ASSIGNED FLAGS ARE
*                  SET IN ALL THE OTHER SUBROUTINES.
* 
*                  ER.REST - IF NO RESERVE WITHIN 5 MINUTES 
*                  ER.CAE  - IF CHANNEL ACTIVE ON ENTRY 
*                  ER.DCSM - IF DEVICE CODE/STATUS MISMATCH 
*                  ER.AGS  - IF ABNORMAL GENERAL STATUS 
* 
*         USES   - EC, EA, EM, RESA, RES6, OPC1, D.T3, LF, D.T4, DRCON
* 
*         CALLS  - OPC, BD.RCH, IJM, STS, DST, FNO. 
* 
  
**     1. DISCONNECT DRIVE AND CONTROLLER WITH AN OPERATION COMPLETE
*         FUNCTION IF EITHER IS CONNECTED.
  
**     2. CLEAR ERROR EXIT REGISTERS. 
  
 RES      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 
          STD    CDCF        SAVE CONNECT DRIVE/CONTROLLER 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.REST     ERROR - RESERVE TIMEOUT
          LJM    ERR         ERROR EXIT 
  
 RES2     RJM    BD.RCH      DROP/REQUEST CHANNEL AS REQUESTED
          RJM    IJM         WAIT CHANNEL ACTIVE
          LDC    ER.CAE      ERROR - CH ACTIVE ON ENTRY 
          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 
          LDN    GS          GENERAL STATUS FUNCTION CODE 
          STD    LF          SPECIFY LAST (MAJOR) FUNCTION
 RES3     RJM    STS         GET GENERAL STATUS 
  
**     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 
          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    LDD    CDCF        CONNECT DRIVE/CONTROLLER FLAG
          ZJN    RES15       JUMP IF DRIVE CONNECT NOT DESIRED
  
**     8. ISSUE A CONNECT FUNCTION AND OUTPUT THE UNIT NUMBER.
  
          LDC    **          UNIT NUMBER STORED HERE
 UN       EQU    *-1
          STD    D.T4        SAVE FOR SUBROUTINE FNO
          LPN    77B         STRIP OFF BIT 10 (LARGE SECTOR REQUEST)
          SBN    40B
          MJN    RES9B       JUMP IF UNIT NO. LESS THAN 40B 
          SBN    20B
          PJN    RES9B       JUMP IF UNIT NO. GREATER THAN 57B
  
          LDN    CONN        LOAD CONNECT FUNCTION
          RJM    FNO         PERFORM FUNCTION AND OUTPUT CONTROL WORD 
  
**     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
          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
          LJM    RES1        ELSE START ANOTHER ITERATION 
  
 RES15    UJN    REL1        EXIT TO STACK
  
 RES9B    LDC    ER.DCSM     ERROR - DEVICE CODE/STATUS MISMATCH
          LJM    ERR         ERROR EXIT 
  
 RES9C    LDM    RESA 
          NJN    RES9A       IF NOT LAST PASS 
  
 RES10    LJM    ERRAGS      ERROR - ABNORMAL GENERAL STATUS
  
 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       JUMP IF FMD CONTROLLER 
          UJN    RES9B       ERROR, NOT FMD CONTROLLER
          EJECT 
 REL      TITLE  REL - RELEASE CONTROLLER AND DRIVE IF CONNECTED. 
**        REL    - RELEASE CONTROLLER AND DRIVE IF CONNECTED. 
* 
*                  REL, ABT Z 
* 
*         ENTRY  - NONE 
* 
*         EXIT   - DEVICE CONNECT HAS BEEN RELEASED IF ASSIGNED AND THE 
*                  CHANNEL IS RELEASED TO THE SYSTEM. 
* 
*         USES   - P
* 
*         CALLS  - 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    OPC         RELEASE THE EQUIPMENT IF CONNECTED 
          RJM    BD.DCH      DROP CHANNEL/TALK TO SYSTEM AND EXEC 
 REL1     LJM    XENT        EXIT TO STACK
          EJECT 
 CNTRL    TITLE  CNTRL - SEND CONTROL FUNCTION TO CONTROLLER. 
**        CNTRL- SEND CONTROL FUNCTION 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  - (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
* 
*                  ERRIAL - ERROR EXIT IF ACCESS LEVEL TOO LOW FOR REQ
*                  ERRDNA - ERROR EXIT IF ALL DATA NOT ACCEPTED FROM PP 
*                  ERRISR - ERROR EXIT IF INCOMPLETE STATUS RETURNED
* 
*         USES   - WT, D.T2, D.T4, D.Z1,D.T0, OB(0-60B), D.T1,
*                  FMDADDR, PA, PA+1, (PA+55B), (PA+56B). 
* 
*         CALLS  - TCO, BD.TEST, FNO, FNC, FJM. 
* 
  
**     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    XENT        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    RDW3        ERROR - ACCESS LEVEL TOO LOW FOR REQUEST 
  
 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 
          LDN    49 
          OAM    OB,CH       SEND DATA TO BC
          ZJN    CNT9        IF ALL DATA NOT ACCEPTED FROM PP 
          LJM    RDW29       ERROR - 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 - INCOMPLETE STATUS RETURNED 
  
 CNT12    IAN    CH+40B 
          STI    PA+56B      SAVE TIMING WORD IN REGISTER Y 
          DCN    CH+40B 
  
**     8. RETURN TO STACK.
* 
 CNT13    UJN    FLAG1       EXIT TO STACK
          EJECT 
 FLAG     TITLE  FLAG - FMD FLAG PULSE. 
**        FLAG - FMD FLAG PULSE.
* 
*                FLAG PULSE CHANNEL=X, ABT Z
* 
*         ENTRY  - (PA) = VALUE X TO BE SENT WITH FUNCTION
* 
*         EXIT   - NONE.
* 
*         USES   - D.T4.
* 
*         CALLS  - TCO, FNO.
* 
  
**        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. 
* 
 FLAG1    UJN    MARGINS2    EXIT TO STACK
          EJECT 
 FMDPT    TITLE  FMDPT - FMD POISITIONER TEST.
**        FMDPT - FMD POSITIONER TEST.
* 
*                FMDPT X Y,ABT Z
* 
*         ENTRY  - ((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  - TDR, FNC.
* 
  
**        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
          UJN    CNT10       GO TO INPUT TIMING DATA
          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  - (PA) = MARGINS ARGUMENT
* 
*         EXIT   - MARGINS PARAMETER CONVERTED FOR READ FUNCTION
* 
*                  ER.ISO  - IF ILLEGAL STROBE/OFFSET PARAMETER 
* 
*         USES   - MARGINSA 
* 
*         CALLS  - NONE 
* 
  
**     1. VERIFY THAT MARGINS ARE LEGAL.
* 
 MARGINS  LDD    PA          MARGIN PARAMETER WORD
          SCN    33B         MASK OUT LEGAL BITS
          ZJN    MARGINS1    IF LEGAL PARAMETERS
          LDC    ER.ISO      ERROR - ILLEGAL STROBES/OFFSET 
          LJM    ERR         ERROR EXIT 
  
**     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 
 MARGINS2 LJM    XENT        EXIT TO STACK
          EJECT 
 OUT      TITLE  OUT - SEND CONTROL FUNCTION TO CONTROLLER. 
**        OUT - SEND CONTROL FUNCTION TO CONTROLLER.
* 
*                  OUT CHANNEL=A B C,ABT Z
* 
*         ENTRY  - (PA)   = CHANNEL 
*                  (PA+1) = VALUE B 
*                  (PA+2) = VALUE C 
* 
*         EXIT   - ERRIAL - ERROR EXIT IF ACCESS LEVEL TOO LOW
*                  ERRDNA - ERROR EXIT IF DATA NOT ACCEPTED 
* 
*         USES   - WT, FPRECYL
* 
*         CALLS  - TCO, FNC 
* 
  
**     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    RDW3        ERROR - AL TOO LOW FOR REQUEST 
  
 OUT1     LDN    50B
          RJM    FNC         SEND FUNCTION TO FMD 
          ACN    CH+40B      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
          LJM    RDW29       ERROR - ALL DATA NOT ACCEPTED FROM PP
  
 OUT3     STM    FPRECYL     CLEAR PRE-ALLOCATED CYL FLAG 
          UJN    MARGINS2    EXIT TO STACK
          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  - (PA)   = CODE ------ 0 = SERIAL
*                  (PA+1) = SECTOR      1 = FACTORY 
*                                       2 = UTILITY 
*         EXIT   - RDW1 (COMMON READ/WRITE ROUTINE) 
* 
*         USES   - COD, RDWRF, FUN, GETCYL, CC, GETTRK, CT, 
*                  GETSEC, CS, D.T5, CL 
* 
*         CALLS  - TDR
* 
* 
 GET      RJM    TDR         VERIFY THAT DRIVE IS CONNECTED 
          STD    COD         DESELECT CODED DATA CHECK
          STD    RDWRF       SPECIFY A READ (TO PP) OPERATION 
* 
*         SPECIFY FUNCTION CODE (SERIAL, FACTORY = 30, UTILITY = 31)
* 
          LDD    PA          LOAD GET TYPE CODE (PASSED FROM STACK) 
          SHN    0-1         SELECT BIT 2**1
          ADN    RFD         BIAS BY FUNCTION CODE FOR READ FACTORY DATA
          STD    FUN         STORE FUNCTION CODE INTO FUNCTION REGISTER 
  
* 
*         PRESET INDIRECT MEMORY REFERENCES FOR SEEK SEQUENCE 
* 
*         SPECIFY SEEK TO CYLINDER 1511B
* 
          LDC    MAPCYL      SPECIFY MAP CYLINDER 841D
          STM    GETCYL      STORE MAP CYLINDER 
          LDC    GETCYL      POINTER FOR MAP CYLINDER 
          STD    CC          CURRENT CYLINDER REGISTER
* 
*         SPECIFY TRACK (SERIAL = 1, FACTORY = 0, UTILITY = 1)
* 
          LDD    PA          LOAD GET TYPE CODE (PASSED FROM STACK) 
          LPN    1           SELECT RIGHT BIT 
          LMN    1           COMPLEMENT RIGHT BIT 
          STM    GETTRK      STORE TRACK NUMBER FOR CURRENT GET TYPE
          LDC    GETTRK      POINTER FOR TRACK NO. FOR CURRENT GET TYPE 
          STD    CT          CURRENT TRACK REGISTER 
* 
*         SPECIFY SECTOR (SERIAL = 0, FACTORY = X, UTILITY = X) 
* 
          LDD    PA+1        LOAD SELECTED SECTOR (PASSED FROM STACK) 
          STM    GETSEC      STORE SECTOR NUMBER SELECTED 
          LDC    GETSEC      POINTER FOR SECTOR NUMBER SELECTED 
          STD    CS          CURRENT SECTOR REGISTER
* 
*         SPECIFY NUMBER OF SECTORS TO READ 
* 
          LDN    1           SPECIFY READ OF ONE SECTOR 
          STD    D.T5        STORE NUMBER OF SECTORS REQUESTED
          LDN    D.T5        POINTER FOR NUMBER OF SECTORS REQUESTED
          STD    CL          CURRENT LENGTH REGISTER
* 
*         SPECIFY SMALL SECTOR SIZE IN PARAMETERS/ARGUMENT REGISTER 
* 
          LDN    10B         SET SECTOR SIZE FLAG (BIT 3) 
          STD    PA          BIT 3 = 1 FOR SMALL SECTOR 
* 
*         EXIT TO READ/WRITE ROUTINE RDWR 
* 
          LDN    4           LSFMD1 I/O CODE FOR GET COMMAND
          UJN    RDW1        GO READ REQUESTED MAP SECTOR 
* 
 GETCYL   DATA   0           STORAGE FOR CYLINDER NUMBER
 GETTRK   DATA   0           STORAGE FOR TRACK    NUMBER
 GETSEC   DATA   0           STORAGE FOR SECTOR   NUMBER
          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 
*                  READCW V SMALL 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  - (PA)      BITS 0-2  = FUNCTION CODE
*                            BIT  3    = LARGE/SMALL SECTOR FLAG
*                            BIT  4    = NOT CODED/CODED FLAG 
*                            BIT  5    = READ/WRITE FLAG
* 
*                  (CL) = V - NO. SECTORS REQUESTED (CURRENT LENGTH)
*                  (CC) = W - STARTING CYLINDER     (CURRENT CYLINDER)
*                  (CT) = X - STARTING TRACK        (CURRENT TRACK) 
*                  (CS) = Y - STARTING SECTOR       (CURRENT SECTOR)
* 
*         EXIT   - V = ZERO,
*                  W, X, AND Y = LAST CYL, TRK, AND SEC.
* 
*                  ER.ALTL - IF ACCESS LEVEL TO LOW FOR REQUEST 
*                  ER.NIDT - IF NO INACTIVE AFTER DATA XFER 
*                  ER.DCE  - IF DATA COMPARE ERROR
*                  ER.STRY - IF SUCCESSFUL RETRY
*                  ER.IDR  - IF INCOMPLETE DATA RETURNED TO PP
*                  ER.DNA  - IF DATA NOT ACCEPTED FROM PP 
*                  ER.AGS  - IF ABNORMAL GENERAL STATUS 
* 
*         USES   - RDWRF, COD, FUN, IOC, D.T2, SB(0-24B), SBIE(0-24B),
*                  RETRY, D.T4, D.T1, (CL), RT, WT, OB(500B-502B),
*                  D.T3, IB(O-504B), (CL), (CS), (CT).
* 
* 
*         CALLS  - TDR, SEEK1, FNO, FNC, IJM, STS, DST
* 
*         ENTRY POINT FOR READ, READCW, VERIFY, WRITE COMMANDS
* 
 RDWR     RJM    TDR         VERIFY THAT DRIVE IS CONNECTED 
* 
*         PRESTORE PARAMETERS PASSED WITH CALL FROM STACK 
* 
          LDD    PA          PARAMETERS/ARGUMENT REGISTER 
          SHN    13D         SHIFT READ/WRITE FLAG TO BIT 2**0
          STD    RDWRF       CLEAR/SET READ/WRITE (TO/FROM PP) FLAG 
          SCN    1           CLEAR/READ WRITE BIT 
          SHN    1           SHIFT CODED FLAG TO BIT 2**0 
          STD    COD         CLEAR/SET THE CODED FLAG 
          SHN    -14D        RIGHT ADJUST THE FUNCTION CODE 
          LPN    7B          MASK OFF ALL BUT FUNCTION CODE 
          STD    FUN         STORE THE FUNCTION CODE
* 
*         ASSIGN VALUE TO LSFMD1 I/O CODE REGISTER CORRESPONDING TO 
*         CURRENT RDWR DATA TRANSFER COMMAND
* 
          SBN    4           BIAS FUNCTION CODE BY -4 TO OBTAIN I/O CODE
* 
*         ENTRY POINT FOR GET COMMAND 
* 
 RDW1     STD    IOC         INITIALIZE LSFMD1 I/O CODE REGISTER
* 
*         CLEAR THE STATUS BUFFER (SB), STATUS SAVE AREA FOR INITIAL
*         ERROR ON RETRY (SBIE) AND RETRY COUNTER (RETRY) 
* 
          LDN    RETRY-SB    NUMBER OF WORDS TO CLEAR - 1 
          STD    D.T2        INITIALIZE LOOP COUNTER
 RDW2     LDN    0
          STM    SB,D.T2     CLEAR CURRENT WORD IN BUFFER 
          SOD    D.T2        UPDATE LOOP COUNTER
          PJN    RDW2        LOOP BACK IF NOT DONE
* 
*         PERFORM ACCESS LEVEL CHECKS 
* 
          LDD    IOC         LOAD THE CURRENT I/O CODE
          LMN    4           COMPARE WITH I/O CODE FOR GET COMMAND
          ZJN    RDW4        IF GET COMMAND IGNORE ACC. LEVEL VALIDATION
          LDD    FUN         LOAD THE CURRENT FUNCTION CODE 
          LMN    RDCW        MASK IT WITH READ CHECKWORD FUNCTION CODE
          ZJN    RDW4        IF READCW IGNORE ACCESS LEVEL VALIDATION 
          LDD    BD.AL       ACCESS LEVEL ASSIGNED
          SBM    RDWAL,RDWRF COMPARE WITH ACCESS LEVEL REQUIRED 
          PJN    RDW4        JUMP IF ACCESS LEVEL HIGH ENOUGH 
          ADN    1           TEST IF ACCESS LEVEL FOR PREALLOCATED AREA 
          MJN    RDW3        JUMP IF AL TOO LOW FOR PREALLOCATED AREA 
          LDC    MAXCDD-PRECYL     PREALLOCATED CYLINDER - 1
          SBI    CC          CURRENT CYLINDER 
          MJN    RDW4        JUMP IF CYL DESIRED IS IN PREALLOCATED AREA
 RDW3     LDC    ER.ALTL     ERROR - ACCESS LEVEL TOO LOW FOR REQ 
          LJM    ERR         ERROR EXIT 
* 
 RDW4     LDD    PA          PARAMETERS ARGUMENT/REGISTER 
          LPN    10B         BIT 3 = SECTOR SIZE (0 = LARGE, 1 = SMALL) 
          RJM    SEEK1       SEEK TO DESIRED CYLINDER 
* 
*         INITIALIZE INSTUCTIONS INVOLVING SECTOR SIZE
* 
          LDD    PA          PARAMETERS/ARGUMENT REGISTER 
          SHN    -3          SHIFT SECTOR SIZE FLAG FROM BIT 3 TO BIT 0 
          LPN    1           MASK OFF ALL BUT SECTOR SIZE FLAG
          STD    D.T2        SECTOR SIZE FLAG (0 = LARGE, 1 = SMALL)
          LDM    SELA,D.T2   INSTRUCTION FOR CONVERTING NO. TRKS (FROM
          STM    RDW6B       CURRENT TRK+1 TO END OF CYL) TO SECTORS
          LDM    SELB,D.T2   INSTRUCTION FOR LOADING SECTOR LENGTH
          STM    RDW6C
          LDM    SELC,D.T2   INSTRUCTION FOR TESTING IF SECTOR COUNT
          STM    RDW24A      .GT. MAXIMUM SECTORS/TRACK 
* 
*         EXIT COMMAND PROCESSING IF NO SECTORS REQUESTED (V = 0) 
* 
          LDI    CL          REMAINING SECTOR COUNT (CURRENT LENGTH)
          NJN    RDW5        JUMP IF 1 OR MORE SECTORS REQUESTED
          LJM    XENT        EXIT TO STACK, NO SECTORS REQUESTED
* 
*         ISSUE SELECTED STROBES AND OFFSET OPTIONS IF THEY HAVE BEEN 
*         DEFINED BY A PREVIOUS MARGINS COMMAND AND IF CURRENT
*         COMMAND IS A READ TYPE COMMAND. 
* 
 RDW5     LDD    RDWRF       READ/WRITE FLAG
          NJN    RDW6        SKIP MARGINS ON A WRITE OPERATION
          LDC    **          LOAD OPTIONS ARGUMENT
 MARGINSA EQU    *-1         *** STROBE AND OFFSET SELECTIONS 
          ZJN    RDW6        JUMP IF NO MARGINS SELECTED
          STD    D.T4        SAVE SELECTIONS FOR SUBROUTINE FNO 
          LDN    SSO         FUNCTION CODE FOR SELECTING STROBE/OFFSET
          RJM    FNO         SEND MARGIN FUNCTION TO CONTROLLER 
* 
*         PRESTORE ADDRESS OF CURRENT BLOCK CONTAINING
*         PP I/O DATA BLOCK TRANSFER SIZES
* 
 RDW6     LDM    BTSA,IOC   ADDRESS OF CURRENT BLOCK TRANSFER SIZE BLOCK
          STM    RDW12       STORE IN INSTRUCTION TO LOAD CURRENT BTS 
* 
*         IF THE KEYWORD CODED WAS SPECIFIED IN THE WRITE OR VERIFY 
*         COMMAND, STORE THE FOLLOWING DATA INTO THE PP OUTPUT BUFFER.
* 
*           REGISTER W (CYLINDER) TO OB(500B) 
*           REGISTER X (TRACK)    TO OB(501B)  DONE IN SECTOR LOOP BELOW
*           REGISTER Y (SECTOR)   TO OB(502B)  DONE IN SECTOR LOOP BELOW
* 
          LDD    RDWRF       READ/WRITE FLAG
          ZJN    RDW6A       JUMP IF READ 
          LDD    COD         CODED FLAG 
          ZJN    RDW6A       JUMP IF NOT CODED
* 
          LDI    CC          CURRENT CYLINDER 
          STM    OB+500B     LOCATION IN BUFFER FOR CURRENT CYLINDER
* 
*         CALCULATE NUMBER OF SECTORS THAT CAN BE PROCESSED FROM CURRENT
*         TRACK/SECTOR TO END OF CYLINDER.  SET THE NUMBER OF SECTORS TO
*         PROCESS ((CL)) TO THIS VALUE OR TO THE CONTENTS OF REGISTER V 
*         (ORIGINAL ((CL))) WHICHEVER IS SMALLER. USES 1 TO 1 INTERLACE.
* 
 RDW6A    LDN    TRL         TRACK LENGTH (NO. TRACKS IN CYLINDER) - 1
          SBI    CT          MINUS CURRENT TRACK (HERE = STARTING TRACK)
 RDW6B    SHN    **          CONVERT NO. TRACKS TO SECTOR EQUIVALENT
          STD    D.T4        LOGICAL SECS FROM CURR. TRK+1 TO END OF CYLINDER 
 RDW6C    LDN    **          SECTOR LENGTH (MAX LOGICAL SECTORS/TRACK)
          SBI    CS          MINUS CURR. LOGICAL SEC (HERE=STARTING SEC)
          RAD    D.T4        LOGICAL SECS. FROM START SEC. TO END OF CYL
          SBI    CL          COMPARE WITH NUMBER OF SECTORS REQUESTED 
          PJN    RDW8        JUMP IF NO. REQUESTED IS CONTAINED IN CYL. 
          LDD    D.T4        SECS. FROM STARTING SEC. TO END OF CYLINDER
          STI    CL          GRANT ONLY SECTORS TO END OF CYLINDER
 RDW8     LDI    CL          CURRENT LENGTH IN SECTORS
          SHN    -2 
          RAD    RT          RESET REAL TIME CLOCK
* 
*         START OF LOOP TO TRANSFER DATA (1 LARGE SECTOR PER ITERATION) 
* 
* 
*         ISSUE A FUNCTION TO PERFORM ONE OF THE FOLLOWING COMMANDS-
*         READ(4), WRITE(5), VERIFY(6), READCW(7), CONTINUE(14),
*         GET(30 OR 31).
* 
 RDW8A    LDD    FUN         LOAD THE FUNCTION
 RDW9     RJM    FNC         SEND THE FUNCTION TO CONTROLLER
          LDN    0           CLEAR REGISTER FOR 
          STD    WT          CUMULATIVE NUMBER OF WORDS TRANSFERRED 
* 
          LDD    FUN         LOAD THE CURRENT FUNCTION CODE 
          LMN    RDCW        TEST IF READ CHECK WORD (READCW) 
          NJN    RDW9A       JUMP IF NOT READCW 
          LJM    RDW22       READCW COMMAND - NO DATA TRANSFER TO PP
* 
*         IF THE KEYWORD CODED WAS SPECIFIED IN THE WRITE OR VERIFY 
*         COMMAND, STORE THE FOLLOWING DATA INTO THE PP OUTPUT BUFFER.
* 
*           REGISTER W (CYLINDER) TO OB(500B)  DONE BEFORE SECTOR LOOP
*           REGISTER X (TRACK)    TO OB(501B) 
*           REGISTER Y (SECTOR)   TO OB(502B) 
* 
 RDW9A    LDD    RDWRF       READ/WRITE FLAG
          ZJN    RDW10       JUMP IF READ 
          LDD    COD         CODED FLAG 
          ZJN    RDW10       JUMP IF NOT CODED
* 
          LDI    CT          CURRENT TRACK
          STM    OB+501B     LOCATION IN BUFFER FOR CURRENT TRACK 
          LDI    CS          CURRENT SECTOR 
          STM    OB+502B     LOCATION IN BUFFER FOR CURRENT SECTOR
* 
 RDW10    ACN    CH+40B      ACTIVATE THE CHANNEL 
* 
*         PRESET LOOP COUNT FOR CURRENT NO. PP I/O DATA BLOCK TRANSFERS 
* 
*         COMMAND     NO. TRANSFERS     LOOP COUNT     I/O CODE 
*          READ            5                 4            0 
*          WRITE           5                 4            1 
*          VERIFY          5                 4            2 
*          READCW          -                 -            3 
*          GET             1                 0            4 
* 
          LDM    LIO,IOC     LOOP COUNT FOR CURRENT NO. PP BLOCK XFERS
          STD    D.T2        SAVE LOOP COUNT
* 
*         START OF LOOP TO TRANSFER DATA
*         ONE PP I/O DATA BLOCK TRANSFER PER ITERATION
* 
 RDW11    LDM    **,D.T2     LOAD CURRENT PP I/O BLOCK TRANSFER SIZE
 RDW12    EQU    RDW11+1     ADDRESS OF CURRENT BLOCK OF PP I/O BTS"S 
          STD    D.T3        SAVE CURRENT PP I/O BLOCK TRANSFER SIZE
* 
*         THE FIRST TRANSFER FOR A WRITE, WRITE VERIFY OR READ COMMAND
*         IS OFFSET IN THE BUFFER BY 344B WORDS (TRANSFER OF 140B WORDS). 
*         THIS ALLOWS CODED DATA TO BE LOCATED IN IB/OB(500B-502B). 
* 
          ADC    -140B       TEST IF CURRENT BTS = 140B 
          NJN    RDW13       JUMP IF NOT BTS = 140B 
          LDD    RDWRF       READ (ZERO) OR WRITE (NON-ZERO)
          NJN    RDW12A      JUMP IF WRITE
          LDD    D.T3        CURRENT PP I/O BTS 
          IAM    IB+344B,CH  READ BTS 12 BIT WORDS TO INPUT BUFFER
          UJN    RDW17       VERIFY THAT BTS WORDS WERE TRANSFERRED 
 RDW12A   LDD    D.T3        CURRENT PP I/O BTS 
          OAM    OB+344B,CH  WRITE BTS 12 WORDS FROM OUTPUT BUFFER
          UJN    RDW17       VERIFY THAT BTS WORDS WERE TRANSFERRED 
* 
*         DISTRIBUTE CONTROL TO CODE TO TRANSFER DATA BETWEEN PP AND
*         DISK SUBSYSTEM (ONE PP I/O DATA BLOCK TRANSFER) 
* 
 RDW13    LDD    D.T3        CURRENT PP I/O BTS 
          LJM    RDW14,IOC   JUMP TO TRANSFER CODE FOR CURRENT COMMAND
 RDW14    UJN    RDW15       READ   COMMAND 
          UJN    RDW16       WRITE  COMMAND 
          UJN    RDW16       VERIFY COMMAND 
          PSN                READCW - NOT USED (NO DATA TRANSFER TO PP) 
*                            GET    COMMAND 
* 
*         READ OR GET COMMAND - READ TO INPUT BUFFER
* 
 RDW15    IAM    IB,CH       READ BTS 12 BIT WORDS TO INPUT BUFFER
          UJN    RDW17       VERIFY BTS WORDS TRANSFERRED 
* 
*         WRITE OR VERIFY COMMAND 
* 
 RDW16    OAM    OB,CH       WRITE BTS WORDS FROM OUTPUT BUFFER 
* 
*         VERIFY THAT THE CURRENT SELECTED NUMBER OF WORDS WERE ACTUALLY
*         TRANSFERRED. STORE CUMULATIVE NO. WORDS TRANSFERRED IN WT REG.
* 
 RDW17    STD    D.T1        SAVE COUNT OF WORDS NOT WRITTEN
          LDD    D.T3        CURRENT PP I/O DATA BLOCK TRANSFER SIZE
          SBD    D.T1        COMPUTE NO. WORDS ACTUALLY TRANSFERRED 
          RAD    WT          UPDATE CUMULATIVE NO. WORDS TRANSFERRED
          LDD    D.T1        COUNT OF WORDS NOT TRANSFERRED 
          NJN    RDW20       IF NOT ZERO, EARLY (ERROR) EXIT
* 
*         UPDATE LOOP COUNT FOR PP I/O BLOCK DATA TRANSFERS 
* 
          SOD    D.T2        DECREMENT LOOP COUNT 
          MJN    RDW18       JUMP IF BLOCK DATA TRANSFERS COMPLETE
          LJM    RDW11       LOOP BACK IF BLOCK TRANSFERS NOT COMPLETE
* 
*         COMPLETE I/O OPERATION FOR CURRENT SECTOR 
* 
 RDW18    LDD    RDWRF       READ/WRITE (TO/FROM PP) FLAG 
          NJN    RDW21       JUMP IF WRITE FROM PP
          SFM    ERCPE1,CH   CHECK FOR CH PARITY ERROR
          RJM    IJM         INSURE CHANNEL IS INACTIVE 
          NJN    RDW22       JUMP IF CHANNEL DEACTIVATED PROPERLY 
 RDW19    LDC    ER.NIDT     ERROR - NO INACTIVE AFTER DATA XFER
          UJN    RDW23A      ERROR EXIT 
 RDW20    LJM    RDW28       ERROR, A REGISTER NON-ZERO AFTER PP I/O
 RDW21    RJM    EJM         WAIT FOR CHANNEL TO GO EMPTY 
          DCN    CH+40B      DEACTIVATE THE CHANNEL 
* 
*         REQUEST AND INPUT GENERAL STATUS TO DETERMINE IF OPERATION
*         COMPLETED SUCCESSFULLY.  IF GENERAL STATUS IS NON-ZERO ENTER
*         ERROR SEQUENCE. 
* 
 RDW22    RJM    STS         READ GENERAL STATUS
          ZJN    RDW23       JUMP IF NO GENERAL STATUS ERROR
          LJM    RDW32       ENTER ERROR EXIT OR RECOVERY SEQUENCE
* 
*         IF THE CURRENT COMMAND IS READ AND KEYWORD CODED WAS SPECIFIED
*         COMPARE THE CONTENTS OF THE FOLLOWING:  
* 
*           IB(500B) TO REGISTER W (CYLINDER) 
*           IB(501B) TO REGISTER X (TRACK)
*           IB(502B) TO REGISTER Y (SECTOR) 
* 
 RDW23    LDD    IOC         I/O CODE REGISTER
          NJN    RDW24       JUMP IF NOT READ COMMAND 
          LDD    COD         UNCODED/CODED FLAG 
          ZJN    RDW24       JUMP IF NOT CODED
          LDM    IB+500B     CHECK FOR CORRECT READ CODING (CYLINDER) 
          ADM    IB+501B                                   (TRACK)
          ADM    IB+502B                                   (SECTOR) 
          SBI    CC          CURRENT CYLINDER 
          SBI    CT          CURRENT TRACK
          SBI    CS          CURRENT SECTOR 
          ZJN    RDW24       JUMP IF NO CODING ERROR
          LDC    ER.DCE      ERROR - DATA COMPARE ERROR 
 RDW23A   UJN    RDW27       ERROR EXIT FOR CODED ERROR 
* 
 RDW24    LDM    RETRY       TEST IF RETRY COMPLETED
          NJN    RDW26       JUMP IF RETRY COMPLETED
* 
*         UPDATE SECTOR AND TRACK COUNTS
* 
          SOI    CL          DECREMENT SECTORS REMAINING COUNT (V)
          ZJN    RDW31       EXIT TO STACK IF ALL SECTORS PROCESSED 
* 
*         INCREMENT THE CONTENTS OF REGISTERS X (CURRENT TRACK) AND Y 
*         (CURRENT SECTOR) PER 1 TO 1 INTERLACE ALGORITHM.
* 
          AOI    CS          INCREMENT CURRENT LOGICAL SEC (REGISTER Y) 
 RDW24A   SBN    **          TEST IF SECTOR COUNT .GT. MAX SECS/TRACK 
          MJN    RDW25       JUMP IF NO, GO PROCESS NEXT SECTOR 
          STI    CS          CLEAR CURRENT SECTOR REGISTER
          AOI    CT          INCREMENT CURRENT TRACK (REGISTER X) 
 RDW25    LJM    RDW8A       GO PROCESS NEXT SECTOR 
* 
*         PROCESS PP I/O ABORT BECAUSE THE A REGISTER UNEQUAL ZERO
* 
 RDW28    RJM    STS         OBTAIN GENERAL STATUS
          LDD    RDWRF       READ/WRITE (TO/FROM PP) FLAG 
          NJN    RDW29       JUMP IF WRITE FROM PP
* 
          LDC    ER.IDR      ERROR - INCOMPLETE DATA RETURNED TO PP 
          UJN    RDW30
* 
 RDW29    LDC    ER.DNA      ERROR - ALL DATA NOT ACCEPTED FROM PP
 RDW30    LJM    ERRDST      GO GET DETAIL STATUS AND ERROR EXIT
* 
 RDW31    LJM    XENT        EXIT TO STACK, ALL SECTORS PROCESSED 
* 
*         PROCESS ERROR EXIT FOR SUCCESSFUL RETRY 
* 
 RDW26    LDC    ER.STRY     ERROR - SUCCESSFUL RETRY 
 RDW27    LJM    ERR         ERROR EXIT 
* 
*         A GENERAL STATUS ERROR HAS OCCURRED.  ENTER ERROR EXIT OR 
*         ERROR RECOVERY SEQUENCE.  REQUEST AND INPUT DETAIL STATUS.
*         EXECUTE THE ERROR EXIT SEQUENCE IF BIT 2**9 IS SET IN 
*         GENERAL STATUS (NONRECOVERABLE ERROR).
* 
 RDW32    RJM    DST         REQUEST AND INPUT DETAILED STATUS
          LDM    SB          LOAD GENERAL STATUS
          SHN    17D-UNR     LEFT ADJUST NONRECOVERABLE ERROR BIT 
          MJN    RDW33       JUMP IF AN UNRECOVERED ERROR 
* 
*         IF BIT 2**8 IS SET (RECOVERY IN PROGRESS) ENTER THE RECOVERY
*         SEQUENCE. 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). 
* 
          SHN    17D-RIP-17D+UNR   TEST IF RECOVERY IN PROGRESS 
          MJN    RDW34       JUMP IF RECOVERY IN PROGRESS 
 RDW33    LJM    ERRAGS      ERROR - ABNORMAL GENERAL STATUS
* 
*         BIT 2**8 IS SET (RECOVERY IN PROGRESS).  DETERMINE IF THE 
*         RETRY COUNT IN THE STATUS BUFFER IS ZERO (FIRST TIME FAILURE).
*         IF SO, STORE GENERAL AND DETAILED STATUS INTO WORDS 25B THRU
*         51B OF THE STATUS BUFFER TO PRESERVE THE ORIGINAL STATUS THAT 
*         CAUSED RECOVERY TO BE PERFORMED.  INCREMENT THE RETRY COUNTER 
*         IN THE PP STATUS BUFFER, ISSUE A CONTINUE FUNCTION (0014), AND
*         GO PERFORM THE RETRY OF THE I/O DATA TRANSFER.
* 
 RDW34    LDM    RETRY       LOAD RETRY COUNTER 
          NJN    RDW36       JUMP IF NOT FIRST ERROR RETRY
          LDN    25B         MOVE THE INITIAL ERROR STATUS TO SBIE
          STD    D.T1        INITIALIZE LOOP COUNTER
 RDW35    LDM    SB,D.T1     LOAD A DETAILED STATUS WORD
          STM    SBIE,D.T1   STORE A DETAILED STATUS WORD 
          SOD    D.T1        DECREMENT LOOP COUNT 
          PJN    RDW35       LOOP BACK IF NOT DONE MOVING DETAIL STATUS 
 RDW36    AOM    RETRY       INCREMENT THE RETRY COUNT
          SBN    28D         A MAXIMUM OF 28D TRIES ARE PERMITTED 
          PJN    RDW26       .GT. 27D RETRIES - ERROR EXIT
 RDW37    LDN    CONT        LOAD CONTINUE FUNCTION CODE
          LJM    RDW9        GO PERFORM I/O TRANSFER AFTER A CONTINUE 
* 
*         LOOP COUNTS USED TO SPECIFY NUMBER OF PP I/O BLOCK
*         DATA TRANSFERS PER CONTROLLER DATA TRANSFER FUNCTION
* 
*         FUNCTION     NO. TRANSFERS     LOOP COUNT     I/O CODE
*           READ            5                 4            0
*           WRITE           5                 4            1
*           VERIFY          5                 4            2
*           READCW          0                 -            3
*           GET             1                 0            4
* 
 LIO      DATA   4,4,4,502B,0   LOOP COUNTS FOR PP I/O BLOCK TRANSFERS
* 
*         ADDRESSES OF BLOCK TRANSFER SIZE BLOCKS 
*         ADDRESS ENTRIES MUST BE IN ORDER CORRESPONDING TO I/O CODE
* 
*                ADDRESS     IOC     COMMAND
 BTSA     CON    BTSR         0       READ
          CON    BTSW         1       WRITE 
          CON    BTSV         2       VERIFY
          BSS    1            3       READCW (NOT USED - NO PP I/O XFER)
          CON    BTSG         4       GET 
* 
*         BLOCK TRANSFER SIZE BLOCKS (ENTRIES, IN BLOCKS HAVING MULTIPLE
*         ENTRIES, ARE USED IN REVERSE ORDER) 
* 
 BTSW     DATA   500B,500B,500B,500B,140B     WRITE  COMMAND
 BTSG     EQU    LIO+3  (IN UNUSED LIO SLOT)  GET    COMMAND
 BTSR     EQU    BTSW                         READ   COMMAND
 BTSV     EQU    BTSW                         VERIFY COMMAND
* 
*         READ/WRITE ACCESS LEVEL TABLE 
* 
 RDWAL    CON    ARD         ACCESS LEVEL FOR READ ANYWHERE 
          CON    ARW         ACCESS LEVEL FOR READ OR WRITE ANYWHERE
* 
*         INSTRUCTIONS INVOLVING SECTOR SIZE WHICH ARE LOADED AND 
*         PRESTORED INTO RDWR DURING RDWR INITIALIZATION FOR
*         LATER EXECUTION 
* 
*         INSTRUCTIONS FOR CONVERTING NO. OF TRACKS (FROM 
*         CURRENT TRACK+1 TO END OF CYLINDER) TO NO. OF SECTORS.
*         USED WHEN CALCULATING NO. OF SECTORS THAT CAN BE
*         PROCESSED FROM CURRENT TRACK/SECTOR TO END OF CYLINDER. 
* 
 SELA     SHN    3           10B LOGICAL LARGE SECTORS/TRACK
          SHN    5           40B LOGICAL SMALL SECTORS/TRACK
* 
*         INSTRUCTIONS FOR LOADING SECTOR LENGTH WHEN CALCULATING 
*         NO. OF SECTORS THAT CAN BE PROCESSED FROM CURRENT 
*         TRACK/SECTOR TO END OF CYLINDER.
* 
 SELB     LDN    SELL+1      SECTOR LENGTH (MAX LOGICAL LARGE SECS/TRK) 
          LDN    SELS+1      SECTOR LENGTH (MAX LOGICAL SMALL SECS/TRK) 
* 
*         INSTRUCTIONS FOR TESTING IF SECTOR COUNT .GT. 
*         MAXIMUM SECTORS/TRACK WHEN UPDATING SECTOR AND
*         TRACK COUNTS AT END OF SECTOR TRANSFER LOOP 
* 
 SELC     SBN    SELL+1      LARGE SECTOR TEST INSTRUCTION
          SBN    SELS+1      SMALL SECTOR TEST INSTRUCTION
          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  - NONE 
* 
*         EXIT   - NONE 
* 
*         USES   - COCON
* 
*         CALLS  - TCA, FNC 
* 
  
**     1. INSURE CHANNEL IS ASSIGNED (RJM   TCA)
* 
*      2. ISSUE AUTOLOAD FUNCTION (0414B) 
* 
*      3. ACTIVATE CHANNEL (ACN   CH+40B) 
* 
*      4. DELAY 16D-64D MILLISECONDS TO ALLOW THE CONTROLLER TO 
*         COMPLETE ITS INITIALIZATION AND ENTER ITS MONITOR LOOP
* 
*      5. DEACTIVATE THE CHANNEL (DCN   CH+40B) 
* 
*      6. SET CONTROLLER CONNECTED FLAG (COCON) 
* 
*      7. EXIT TO STACK 
* 
 RESET    RJM    TCA         INSURE CHANNEL IS ASSIGNED 
          LDC    AUTO        AUTOLOAD FUNCTION CODE 
          RJM    FNC         ISSUE AUTOLOAD FUNCTION
          ACN    CH+40B      ACTIVATE CHANNEL 
          LDN    40B         DELAY 16D-64D MILLISECONDS DEPENDING ON PP 
 RESET1   SBN    1           SPEED TO ALLOW THE CONTROLLER TO COMPLETE
          NJN    RESET1      ITS INITIALIZATION AND ENTER MONITOR LOOP
          DCN    CH+40B      DEACTIVATE THE CHANNEL 
          STD    COCON       SET CONTROLLER CONNECTED FLAG
          UJN    SEEK0       EXIT TO STACK
          EJECT 
 RTNADDR  TITLE  RTNADDR- PERFORM A RETURN CYLINDER ADDRESS FUNCTION. 
**        RTNADDR- PERFORM A RETURN CYLINDER ADDRESS FUNCTION.
* 
*                  RTNADDR TO Y, ABT Z
* 
*         ENTRY  - (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+1, (PA).
* 
*         CALLS  - TCO, BD.TEST, 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.
* 
          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    SEEK0       EXIT TO STACK IF NOT TIMED OUT 
 RTNADDR4 LJM    RDW19       ERROR - NO INACTIVE AFTER DATA XFER
          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  - (CC) = W 
*                  (CT) = X 
*                  (CS) = Y 
* 
*         EXIT   - SEEK COMPLETED TO NEW ADDRESS
* 
*                  ERRCDNC - IF CONTROLLER/DRIVE NOT CONNECTED
*                  ERRFPNA - IF FUNCTION PARAMETERS NOT ACCEPTED
*                  ERRUHB  - IF THE UNIT IF BUSY FOR OVER 200 MSEC
*                  ERRAGS  - IF ABNORMAL GENERAL STATUS 
* 
*         USES   - SEEKA(0-4), FPRECYL, D.T1, D.T2, SEEKTIM, RT 
* 
*         CALLS  - TDR, SEEK1, STS, FNC, DST
* 
  
**     1. VERIFY THAT THE DRIVE IS CONNECTED. 
* 
 SEEK     RJM    TDR         INSURE DRIVE CONNECTED (A=0 IF CONNECTED)
          RJM    SEEK1       PERFORM SEEK (A=0 SELECTS LARGE SECTOR)
 SEEK0    LJM    XENT        EXIT TO STACK
  
 SEEK1X   LJM    **          SUBROUTINE ENTRY/EXIT
 SEEK1    EQU    *-1
          SHN    9D-3D       POSITION SECTOR SIZE PARAMETER AT BIT 9
          STM    SEEK3A      0 IF LARGE SECTOR, 1000B IF SMALL SECTOR 
          SHN    1-9D        POSITION SECTOR SIZE FLAG AT BIT 1 
          LMC    1002B       FORM SHIFT INSTRUCTION FOR SECTOR ADDRESS
          STM    SEEK3B      SHN 0 IF SMALL, SHN 2 IF LARGE SECTOR
          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
          LJM    ERRCDNC     ERROR - CONTROLLER/DRIVE NOT CONNECTED 
  
  
**     2. PRESET SEEK FUNCTION DATA 
* 
 SEEK3    LDM    UN          SECTOR SIZE BIT (SET) AND UNIT NUMBER
          LMC    **          **=0 IF LARGE SECTOR, 1000B IF SMALL SECTOR
 SEEK3A   EQU    *-1         10UU IF LARGE SECTOR, 00UU IF SMALL SECTOR 
          STD    SEEKA+1
          LDI    CC          CURRENT CYLINDER 
          STD    SEEKA+2
          LDI    CT          CURRENT TRACK
          STD    SEEKA+3
          LDI    CS          CURRENT SECTOR 
 SEEK3B   SHN    **          SHN 0 IF SMALL, SHN 2 IF LARGE SECTOR
          STD    SEEKA+4
  
**     3. ISSUE A 1 TO 1 SEEK FUNCTION (0001).
* 
 SEEK4    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+40B      ACTIVATE THE CHANNEL 
          OAM    SEEKA+1,CH  OUTPUT THE SEEK DATA 
          ZJN    SEEK6       IF OUTPUT COMPLETE 
          LJM    ERRFPNA     ERROR - FUNC PARAMETERS NOT ACCEPTED 
  
 SEEK6    DCN    CH+40B      DEACTIVATE THE CHANNEL 
  
**     5. REQUEST AND INPUT GENERAL STATUS. 
* 
          RJM    STS         TO OBTAIN STATUS 
  
**     6. GO TO STEP 3 IF UNIT IS STI L 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 CLOCK WRAP 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 
  
          LDC    ER.UHB      ERROR - UNIT HUNG BUSY ON SEEK 
 ERRDST   STD    D.T2 
          RJM    DST         GET DETAIL STATUS
          LDD    D.T2 
          LJM    ERR         ERROR EXIT 
  
**     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      ERROR - ABNORMAL GENERAL STATUS
          UJN    ERRDST      GO GET DETAIL STATUS AND 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 
 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  - (PA) = CODE          0 = GENERAL 
*                                       1 = DETAIL
*                                       2 = CHANNEL 
* 
*         EXIT   - (A)  = STATUS (IF GENERAL STATUS IS SELECTED)
*                  (SB(1-20D)) = DETAIL STATUS (IF SELECTED)
*                  (SB(1-30D)) = CHANNEL STATUS (IF SELECTED) 
* 
*                  ERRISR - ERROR EXIT IF INCOMPLETE STATUS RETURNED
* 
*         USES   - WT, LF, SB(1+30D)
* 
*         CALLS  - 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    XENT        EXIT TO STACK
  
 STATUS5  LDN   IPCS
          RJM    FNC         SEND FUNCTION TO PROCESSOR 
          ACN    CH+40B 
          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
          SFM    ERCPE1,CH   CHECK FOR CH PARITY ERROR
          NJN    STATUS4     IF OK EXIT TO STACK
 STATUS6  LJM    ERRISR      ERROR - INCOMPLETE STATUS RETURNED 
          EJECT 
 OPC      TITLE  UTILITIES USED BY LSFMD1 PRODUCT OVERLAY.
**        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.
* 
 OPC0     LDD    D.T5 
          RJM    FNC         TO FUNCTION OPERATION COMPLETE 
  
 OPCX     LJM    **          ENTRY/EXIT 
 OPC      EQU    *-1
          LDM    BD.CHFG
          ZJN    OPCX        EXIT IF CHANNEL NOT RESERVED 
          LDD    COCON
          NJN    OPCX        EXIT IF CONTROLLER NOT RESERVED
          STM    FPRECYL     CLEAR PRE-ALLOCATED CYLINDER FLAG
          AOD    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 
  
*         THE RELEASE REQUEST CAME FROM THE BASIC DRIVER, SO PROCESS
*         IT WITHOUT CHANGING ANY DATA OR CREATING AN ERROR EXIT. 
  
 OPC3     LDN    OC          FUNCTION CODE FOR OPERATION COMPLETE 
 OPC4     STD    D.T5 
          LDM    ERR3        UPPER BITS OF ABT ADDRESS
          SBN    77B
          NJN    OPC0        IF REQUEST IS FROM THE USER
          LDD    D.T5 
          RJM    FNA         EXECUTE OPERATION COMPLETE FUNCTION
          NJN    OPCX        EXIT IF NOT FUNCTION TIMEOUT 
          DCN    CH+40B      ELSE DO A DISCONNECT 
          UJN    OPCX        AND EXIT 
          SPACE  4,51 
**        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
          LJM    **          ENTRY/EXIT 
 DST      EQU    *-1
  
**        1.  STORE 177777B 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 - NO INACTIVE TO DETAIL STATUS 
          UJN    DST4        ERROR EXIT 
  
**        3. INPUT STATUS AND RETURN. 
* 
 DST2     ACN    CH+40B 
          RJM    FJM         WAIT FOR FULL
          ZJN    ERRISR      JUMP 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 - INCOMPLETE STATUS RETURNED 
 DST4     UJN    EJM3        ERROR EXIT 
          SPACE  4,17 
**        EJM    - WAIT FOR CHANNEL TO GO EMPTY 
* 
*         ENTRY  - NONE 
* 
*         EXIT   - NONE 
* 
*         USES   - NONE 
* 
*         CALLS  - NONE 
* 
 EJMX     LJM    **          SUBROUTINE ENTRY/EXIT
 EJM      EQU    *-1
 EJM1     EJM    EJMX,CH     JUMP IF CHANNEL EMPTY
          ADN    1           UPDATE LOOP COUNT
          PJN    EJM1        LOOP ON CHANNEL EMPTY TEST 
 EJM2     LDC    ER.CFE      ERROR - CHANNEL FAILED TO GO EMPTY 
 EJM3     UJN    FNC1        ERROR EXIT 
          SPACE  4,22 
**        FJM    - WAIT FOR CHANNEL TO GO FULL. 
* 
*         ENTRY  - NONE 
* 
*         EXIT   - (A) NONZERO IF CHANNEL FULL
*                  (A) ZERO IF TIMED OUT (CHANNEL DID NOT GO FULL)
* 
*         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        JUMP IF TIME NOT COUNTED DOWN
          UJN    FJMX        EXIT WITH A EQ. ZERO (CHANNEL NOT FULL)
          SPACE  4,21 
**        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 
          LDC    ER.NILF     ERROR - NO INACTIVE TO LAST FUNC 
 FNC1     UJN    FNO1        ERROR EXIT 
          SPACE  4,17 
**        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+40B      FUNCTION FROM A
          RJM    IJM         WAIT FOR INACTIVE
          UJN    FNAX        EXIT 
          SPACE  4,29 
**        FNO    - ISSUE FUNCTION AND OUTPUT ONE WORD OF DATA.
* 
*         ENTRY  - (A)  = FUNCTION DESIRED
*                  D.T4 = DATA WORD TO OUTPUT 
* 
*         EXIT   - ERRFPNA - IF FUNCTION PARAMETER NOT ACCEPTED 
*                            IF ALL DATA NOT ACCEPTED FROM PP 
* 
*         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+40B      ACTIVATE THE CHANNEL 
          LDN    1
          OAM    D.T4,CH
          ZJN    FNO2        IF PARAMETER WAS ACCEPTED
 ERRFPNA  LDC    ER.FPNA     ERROR - FUNC PARAMETERS NOT ACCEPTED 
 FNO1     UJN    STS0        ERROR EXIT 
  
 FNO2     EJM    FNO3,CH
          ADN    1
          PJN    FNO2        LOOP ON CHANNEL EMPTY TEST 
          LJM    EJM2        ERROR - CHANNEL FAILED TO GO EMPTY 
  
 FNO3     DCN    CH+40B 
          UJN    FNOX        EXIT 
          SPACE  4,22 
**        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 
          PSN                DELAY 5 MORE CLOCK PERIODS PER ITERATION 
 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,39 
**        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 
          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 
          LDC    ER.NIGS     ERROR - NO INACTIVE TO GENERAL STATUS
 STS0     UJN    STS3        ERROR EXIT 
  
 STS1     LDN    0
          STD    COCON       SET CONTROLLER CONNECTED 
          ACN    CH+40B 
          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
 STS2     LDC    ER.GSNR     ERROR - GENERAL STATUS NOT RETURNED
 STS3     UJN    TCA1        ERROR EXIT 
          SPACE  4,18 
**        TCA    - TEST CHANNEL ASSIGNMENT. 
* 
*         ENTRY  - NONE 
* 
*         EXIT   - ABT ADDRESS STORED IN ERR3 AND ERR4
* 
*                  ERRCNA  - IF CHANNEL NOT ASSIGNED
* 
*         CALLS  - ERA
* 
*         USES   - NONE 
* 
 TCAX     LJM    **          ENTRY/EXIT 
 TCA      EQU    *-1
          LDM    BD.CHFG
          NJN    TCAX        EXIT IF CHANNEL ASSIGNED 
          LDC    ER.CNA      ERROR IF CHANNEL NOT RESERVED
 TCA1     UJN    ERR
          SPACE  4,18 
**        TCO    - TEST CONTROLLER CONNECTED. 
* 
*         ENTRY  - NONE 
* 
*         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         TEST IF CHANNEL ASSIGNED 
          LDD    COCON       CONTROLLER CONNECTED FLAG
          ZJN    TCOX        EXIT IF CONTROLLER CONNECTED 
          UJN    ERRCDNC     ERROR - CONTROLLER/DRIVE NOT CONNECTED 
          SPACE  4,17 
**        TDR    - TEST DRIVE RESERVED. 
* 
*         ENTRY  - NONE 
* 
*         EXIT   - NONE 
* 
*         USES   - NONE 
* 
*         CALLS  - TCO
* 
 TDRX     LJM    **          ENTRY/EXIT 
 TDR      EQU    *-1
          RJM    TCO         TEST CONTROLLER CONNECTED
          LDC    ** 
 DRCON    EQU    *-1         *** DRIVE CONNECTED FLAG STORED HERE.
          ZJN    TDRX        EXIT IF DRIVE CONNECTED
 ERRCDNC  LDC    ER.CDNC     ERROR - CONTROLLER/DRIVE NOT CONNECTED 
          UJN    ERR
  
 ERCPE1   LDC    ER.CPE 
          EJECT 
**        ERR    - ERROR EXIT SUBROUTINE
* 
*         ENTRY  - (A) = MESSAGE ADDRESS INDEX
* 
*         EXIT   - (A) = ABORT ADDRESS FOR AN ABORT 
*                  (A) = LINE NUMBER FOR MODULE 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     BASIC DRIVER CHANNEL FLAG
          ZJN    ERR2        JUMP IF CHANNEL IS NOT ASSIGNED
          LDD    BD.AL       BASIC DRIVER ACCESS LEVEL
          SBN    AL21 
          ZJN    ERR2        IF ACCESS LEVEL INDICATES NO CHAN CLEANUP
          IJM    ERR2,0      CLEAN UP CHANNEL 
          DCN    40B
 ERR2     LDD    D.Z1 
          LPN    77B         MASK ERROR CODE
          ADC    6600B       ADD IN BIAS FOR LSFMD1 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        JUMP 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      ITERATION COUNT FOR RES COMMAND
 LSB      EQU    64B         LENGTH OF STATUS BUFFER
  
          ERRPL  *-IB-1      ERROR IF LSFMD1 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    SB+63B      UNIT TO STATUS BUFFER
          ADC    1000B       SET BIT 9 (SECTOR = 1376D WORDS ON 885-1X) 
          STM    UN          SET UNIT NUMBER
          LDN    0
          STM    SB+62B      EQUIPMENT NUMBER TO STATUS BUFFER
  
*         SET DELAY TIME BASED ON SPEED OF PPU
  
          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 
**
*         THE FOLLOWING CODE IS ASSEMBLED IF THE SYMBOL 'MVE' IS DEFINED
*         AT UPDATE TIME. THIS DEFINITION MEANS THAT THE ASSEMBLY WILL BE 
*         FOR THE NOSVE ENVIRONMENT.
* 
*         *IF DEF,MVE 
*IF DEF,MVE 
 INIT5    STD    D.T1        CLEAR CELL 
          LDC    MMSGL. 
          STD    D.T0        LENGTH OF PO MSG AREA IN 60 BIT WORDS
 INIT5.1  SBN    3           NUMBER OF 60 BIT WORDS/MESSAGE 
          MJN    INIT5.2     IF NO MESSAGES 
          STD    D.T0        UPDATED LENGTH 
          AOD    D.T1        INCREMENT MESSAGE COUNT
          LDD    D.T0 
          NJN    INIT5.1     IF MORE MESSAGES 
 INIT5.2  LDD    D.T1 
          STM    BD.MSGS     MESSAGE COUNT
* 
*         WRITE PP MESSAGES TO CM 
* 
 INIT5.3  LDN    0
          STD    D.Z1 
          STD    D.Z2 
          STD    D.Z3 
          STD    D.Z4 
 INIT6    LDM    PPMSGS,D.Z1 GET PP MESSAGE WORD
 INIT6.1  EQU    *-1         MODIFIED TO FWA OF INITIALIZATION ERROR
          ZJN    INIT8       IF END OF MESSAGE
 INIT7    STM    D.T4,D.Z2   STORE IN D.T4+ 
          AOD    D.Z1        BUMP PP MESSAGE POINTER
          UJN    INIT9
 INIT8    LDC    2R          MESSAGE END, STORE BLANKS
          STM    D.T4,D.Z2
 INIT9    AOD    D.Z2        BUMP D.T4+ POINTER 
          SBN    4
          NJN    INIT6       IF NOT 4 PP WORDS
          STD    D.Z2        CLEAR POINTER
          LDC    BD.MSGA     INDEX INTO CM COMM BUFFER TO PO MSG AREA 
          ADD    D.Z4        BIAS TO WORD WITHIN PO MSG AREA
          STM    BD.IDEX
          LDN    BD.CMB      POINTER TO FWA OF CM COMM BUFFER 
          RJM    BD.SETR
          CWDL   D.T4        WRITE MSG WORD TO CM 
          AOD    D.Z4        INCREMENT BIAS INTO PO MSG AREA
          AOD    D.Z3        BUMP CM WORD COUNTER 
          SBN    BD.MSGML+1  EACH MESSAGE OCCUPIES A 4 WORD CM BLOCK
          NJN    INIT6       IF NOT BD.MSGML CM WORDS 
          STD    D.Z3        CLEAR CM WORD COUNTER
          LDC    0
 INIT9.1  EQU    *-1         MODIFIED TO FWA OF INITIALIZATION ERROR
          ZJN    INIT9.2     IF NOT PO INITIALIZATION ERROR 
          LCN    0
          LJM    INIT12      PO INITIALIZATION ERROR (A) = NEG ZERO 
 INIT9.2  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
          ZJN    INIT10.1    IF LAST MESSAGE
          LJM    INIT7       GET NEXT MESSAGE 
 INIT10.1 EQU    *
  
*ENDIF
*         *ENDIF
**
  
**
*         THE FOLLOWING CODE IS ASSEMBLED IF THE SYMBOL 'MVE' IS NOT DEFINED
*         AT UPDATE TIME. THIS MEANS THAT THE ASSEMBLY WILL BE FOR THE NOS
*         OR NOSBE ENVIRONMENT. 
* 
*         *IF -DEF,MVE
*IF -DEF,MVE
*         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
*ENDIF
*         *ENDIF
**
  
*         SET DIRECT CELLS
  
          STD    WT          CLEAR WORDS TRANSMITTED REGISTER 
          STD    BA          CLEAR BEGINNING ADDRESS REGISTER 
**
*         THE FOLLOWING CODE IS ASSEMBLED IF THE SYMBOL 'MVE' IS NOT DEFINED
*         AT UPDATE TIME. THIS MEANS THAT THE ASSEMBLY WILL BE FOR THE NOS
*         OR NOSBE ENVIRONMENT. 
* 
*         *IF -DEF,MVE
*IF -DEF,MVE
          LDC    100D        100 MSEC DELAY IN BD.RCH 
          STM    DLYDCH      MODIFY DELAY USED ON CHANNEL DROP
*ENDIF
*         *ENDIF
**
  
*         VERIFY THAT THE ASSIGNED DEVICE CODE IS SUPPORTED 
  
          LDD    DC          DEVICE CODE CURRENTLY ASSIGNED 
          SBN    LSFMD       TEST IF DEVICE CODE = LSFMD
          ZJN    INIT12 
          LDC    INITA       (A) = POINTER TO ERROR MSG IF NO SUPPORT 
**
*         THE FOLLOWING CODE IS ASSEMBLED IF THE SYMBOL 'MVE' IS DEFINED
*         AT UPDATE TIME. THIS DEFINITION MEANS THAT THE ASSEMBLY WILL
*         BE FOR THE NOSVE ENVIRONMENT. 
* 
*         *IF DEF,MVE 
*IF DEF,MVE 
          STM    INIT6.1
          STM    INIT9.1
          LJM    INIT5.3     PROCESS ERROR MESSAGE
*ENDIF
*         *ENDIF
**
 INIT12   LJM    START       EXIT WITH (A) = ERROR/NO ERROR FLAG
  
 INITA    DIS    ,*  SELECTED DEVICE CODE NOT SUPPORTED*
  
*         TABLE OF PPU SPEED SWITCHES 
  
 TSPEED   CON    FJM2 
          CON    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.CAE,EC.CAE,(CH ACTIVE ON ENTRY) 
          MMSG   ER.NILF,EC.NILF,(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.CDNC,EC.CDNC,(CONTROLLER/DRIVE NOT CONNECTED) 
          MMSG   ER.ALTL,EC.ALTL,(ACCESS LEVEL TOO LOW FOR REQ) 
          MMSG   ER.REST,EC.REST,(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)
          MMSG   ER.CFE,EC.CFE,(CHANNEL FAILED TO GO EMPTY) 
          MMSG   ER.CPE,EC.CPE,(CHANNEL PE ON INPUT)
 MMSGL.   EQU    MMSGL
          DATA   0
****
 TCHAN    EQU    *           CREATE CHANNEL TABLE 
          LIST   D
          HERE
          LIST   *
          DATA   0           END OF CHANNEL TABLE 
  
**
*         THE FOLLOWING CODE IS ASSEMBLED IF THE SYMBOL 'MVE' IS NOT
*         DEFINED AT UPDATE TIME. THIS MEANS THAT THE ASSEMBLY IS NOT 
*         FOR THE NOSVE ENVIRONMENT.
* 
*         *IF -DEF,MVE
*IF -DEF,MVE
          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 
*ENDIF
*         *ENDIF
**
  
**
*         THE FOLLOWING CODE IS ASSEMBLED IF THE SYMBOL 'MVE' IS DEFINED
*         AT UPDATE TIME. THIS MEANS THAT THE ASSEMBLY IS BEING MADE FOR
*         THE NOSVE ENVIRONMENT.
* 
*         *IF DEF,MVE 
*IF DEF,MVE 
          ERRPL  *-7773B     ERROR IF LSFMD OVERLAY OVERFLOW
*ENDIF
*         *ENDIF
**
  
          IFEQ   NOSBE,1,1
          ERRPL  *-7773B     ERROR IF LSFMD OVERLAY OVERFLOW
  
          QUAL   *
