*COMDECK,LSFMD2 
          TITLE  HIGH LEVEL LSFMD2 FULL TRACK PRODUCT OVERLAY FOR MALET.
 5S2      SEGMENT POVLA 
          ORG    POVLA
          QUAL   LSFMD2 
*CALL,VERS
          COMMENT LSFMD2 PRODUCT OVERLAY FOR MALET "VERS" 
          EJECT 
**        FOLLOWING COMMANDS ARE DESIGNATED FOR LSFMD DISK SUBSYSTEM ON 
*         AN 885-1X RUNNING IN A  FULL-TRACK MODE.  5S2 IS  THE PRODUCT 
*         OVERLAY THAT  EXECUTES THESE  COMMANDS  AND IS DRIVER  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 LSFMD2.
* 
*         THE LSFMD2 FULL-TRACK PRODUCT OVERLAY SUPPORTS A PROGRAMMABLE 
*         INPUT BUFFER (IB) OF 505B PP WORDS, AN  OUTPUT BUFFER (OB) OF 
*         505B PP WORDS AND A STATUS BUFFER (SB) OF 64B PP WORDS.  DATA 
*         IS  WRITTEN  TO  THE  DISK FROM THE OUTPUT BUFFER AND IS READ 
*         FROM THE DISK TO THE INPUT BUFFER.  THE STATUS BUFFER IS USED 
*         TO HOLD GENERAL AND DETAIL STATUS FROM THE SUBSYSTEM
*         AND OTHER WORDS DEFINED LATER. SUPPORTED CAPABILITIES ARE  AS 
*         FOLLOWS_
* 
*           DIAGRD - READ 322D WORDS FROM SUBSYSTEM MEMORY TO IB. 
*           DIAGWR - WRITE 322D WORDS FROM OB TO SUBSYSTEM MEMORY.
*           GET    - READ SERIAL, FACTORY OR UTILITY MAP SECTOR TO IB.
*           MARGINS- SET STROBES AND OFFSET FOR READ AND READCW.
*           READ   - SEEK AND READ 0 TO 500B SECTORS FROM DISK TO IB. 
*           READCB - READ 502B WORDS FROM COUPLER BUFFER TO IB. 
*           READCW - SEEK AND READ CHECKWORD ON 0 TO 500B SECTORS.
*           REFORM - SEND FORMAT FUNCTION.
*           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.
*           SCAN   - SEND FUNCTION 47B TO SCAN CYLINDER FOR FLAWS.
*           SEEK   - MOVE DRIVE POSITIONER. 
*           STATUS - INPUT GENERAL OR DETAIL STATUS TO SB.
*           VERIFY - SEEK AND WRITE VERIFY 0 TO 500B SECTORS ON DISK. 
*           WRITE  - SEEK AND WRITE 0 TO 500B SECTORS ON DISK.
*           WRITECB- WRITE 502B WORDS FROM OB TO COUPLER BUFFER.
*           WRPRO  - WRITE PROTECTED SECTOR.
* 
*         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   /                  /      / 
*               .   /                  /      / 
*               .   /   DETAIL STATUS  /      / THIS IS THE NORMAL/LAST 
*               .   /                  /      / TAKEN STATUS FROM THE 
*               .   /                  /      / SUBSYSTEM 
*               .   /                  /      / 
*               .   /                  /      / 
*               .   /                  /      / 
*              24B  /                  /   ---
*                   /------------------/   ---
*              25B  /   GENERAL STATUS /      / 
*                   /------------------/      / 
*              26B  /                  /      / 
*               .   /                  /      / THIS IS THE FIRST TAKEN 
*               .   /   DETAIL STATUS  /      / STATUS WITHIN SEQUENCES 
*               .   /                  /      / THAT REQUIRED RECOVERY
*               .   /                  /      / TO BE PERFORMED.
*               .   /                  /      / (CONTINUE FUNCTIONS 
*               .   /                  /      / ISSUED) 
*               .   /                  /      / 
*              51B  /                  /   ---
*                   /------------------/   ---
*              52B  /  RETRY COUNT     /      / ERROR CORRECTION DATA 
*                   /------------------/   ---
*              56B  / 1ST BYTE         /      / DISK PACK SERIAL NUMBER 
*              57B  / 2ND BYTE         /      / (FROM ASSIGN DIRECTIVE) 
*                   /------------------/   ---
*              60B  / SEEK TIME        /      / MILLISECONDS TO DO LAST 
*                   /------------------/      / SEEK
*              61B  / CHANNEL          /   ---
*              62B  / EQUIPMENT        /      / 
*              63B  / UNIT             /      / EQUIPMENT UNDER TEST
*                   --------------------   ---
* 
*         ALL SUBROUTINES IN THIS PRODUCT OVERLAY USE  A  COMMON  ERROR 
*         EXIT  SEQUENCE  WHEN  AN  ERROR  IS  DETECTED.  THIS SEQUENCE 
*         STORES AN INTERNAL ERROR CODE INTO THE EC REGISTER, AN  ERROR 
*         MESSAGE INDEX INTO THE EM REGISTER AND THE CURRENT P REGISTER 
*         CONTENTS (LINE NUMBER) INTO THE  EA  REGISTER.   I/O  CHANNEL 
*         CLEAN-UP  OCCURS  AND  A JUMP IS MADE TO THE STATEMENT NUMBER 
*         SPECIFIED BY THE ABT ADDRESS IN THE COMMAND.
* 
          EJECT 
**        THE FOLLOWING TABLE DEFINES THE ERROR CODES AND MESSAGES THAT 
*         MAY BE GENERATED FOR EACH COMMAND.     - COMMAND -
* 
*                                    D D G M R R R R R R R S S S S V W W
* NOTE - FOR READCB  SEE DIAGRD.     I I E A E E E E E E T C E H T E R R
*        FOR WRITECB SEE DIAGWR.     A A T R A A F L S S N A E O A R I P
*                                    G G . G D D O / . E A N K R T I T R
*                                    R W . I . C R / . T D / . T U F E O
* ERROR      ERROR                   D R . N . W M / . / D / . R S Y . /
* CODE      MESSAGE                  . / . S . / . / . / R / . D . / . /
*                                    . / . / . / . / . / . / . / . / . /
*      ----------------------------- - - - - - - - - - - - - - - - - - -
* 4001 ADDR OUT OF FL                . . . . . . X X X . X . . . . . . .
*      ----------------------------- - - - - - - - - - - - - - - - - - -
* 4004 WC OR BUFFER INDEX ERROR      . . . . . . X . . . X . . . . . . .
*      ----------------------------- - - - - - - - - - - - - - - - - - -
* 6710 CH NOT ASSIGNED               X X X . X X X . . X X X X X . X X X
*      ----------------------------- - - - - - - - - - - - - - - - - - -
* 6711 CH ACTIVE ON ENTRY            . . . . . . . . X . . . . . . . . .
*      ----------------------------- - - - - - - - - - - - - - - - - - -
* 6712 NO INACTIVE TO LAST FUNC      X X X . X X X X X X X X X X . X X X
*      ----------------------------- - - - - - - - - - - - - - - - - - -
* 6713 NO INACTIVE TO GENERAL STATUS . . X . X X . . X . X . X X X X X X
*      ----------------------------- - - - - - - - - - - - - - - - - - -
* 6714 NO INACTIVE TO DETAIL STATUS  . . X . X X . . X . . . X X X X X X
*      ----------------------------- - - - - - - - - - - - - - - - - - -
* 6715 GENERAL STATUS NOT RETURNED   . . X . X X . . X . X . X X X X X X
*      ----------------------------- - - - - - - - - - - - - - - - - - -
* 6716 INCOMPLETE STATUS RETURNED    . . X . X X . . X . . . X X X X X X
*      ----------------------------- - - - - - - - - - - - - - - - - - -
* 6717 FUNC PARAMETERS NOT ACCEPTED  . . X . X X . . X . . . X X . X X X
*      ----------------------------- - - - - - - - - - - - - - - - - - -
* 6720 ALL DATA NOT ACCEPTED FROM PP . X . . . . X . . . . . . . . X X X
*      ----------------------------- - - - - - - - - - - - - - - - - - -
* 6721 INCOMPLETE DATA RETURNED TO PPX . X . X . . . . . . . . X . . . .
*      ----------------------------- - - - - - - - - - - - - - - - - - -
* 6722 CONTROLLER/DRIVE NOT CONNECTEDX X X . X X X . . . X X X X . X X X
*      ----------------------------- - - - - - - - - - - - - - - - - - -
* 6723 ACCESS LEVEL TOO LOW FOR REQ  . . X . X . X . . . . . . X . X X X
*      ----------------------------- - - - - - - - - - - - - - - - - - -
* 6724 RESERVE TIMEOUT               . . . . . . . . X . . . . . . . . .
*      ----------------------------- - - - - - - - - - - - - - - - - - -
* 6725 ABNORMAL GENERAL STATUS       . . X . X X . . X . X . X X . X X X
*      ----------------------------- - - - - - - - - - - - - - - - - - -
* 6726 ILLEGAL STROBES/OFFSET        . . . X . . . . . . . . . . . . . .
*      ----------------------------- - - - - - - - - - - - - - - - - - -
* 6727 UNIT HUNG BUSY ON SEEK        . . X . X X . . . . . . X X . X X X
*      ----------------------------- - - - - - - - - - - - - - - - - - -
* 6730 SUCCESSFUL RETRY              . . X . X X . . . . . . . X . X X X
*      ----------------------------- - - - - - - - - - - - - - - - - - -
* 6731 DATA COMPARE ERROR            . . . . X . . . . . . . . . . . . .
*      ----------------------------- - - - - - - - - - - - - - - - - - -
* 6732 DEVICE CODE/STATUS MISMATCH   . . . . . . . . X . . . . . . . . .
*      ----------------------------- - - - - - - - - - - - - - - - - - -
* 6733 NO INACTIVE AFTER DATA XFER   . . X . X . . . . . X . . . . . . .
*      ----------------------------- - - - - - - - - - - - - - - - - - -
* 6734 CHANNEL FAILED TO GO EMPTY    . . X . X X . . X . . . . X . X X X
*      ----------------------------- - - - - - - - - - - - - - - - - - -
* 6735 CHANNEL PE ON INPUT           X . . . X . . . . . . . . X X . . .
*      ----------------------------- - - - - - - - - - - - - - - - - - -
          EJECT 
  
*         THE PROCESS DESCRIBED IN THE FOLLOWING STEPS IS USED WITHIN 
*         LSFMD2 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           ADDR OUT OF FL 
 EC.TL    EQU    2           I/O TIMEOUT ON CH RESERVE
 EC.SEE   EQU    3           SUBR ENTRY/EXIT ERROR
 EC.WC    EQU    4           BUFFER INDEX OR WC ERR 
 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         CH NOT ASSIGNED
 EC.CAE   EQU    11B         CH ACTIVE ON ENTRY 
 EC.NILF  EQU    12B         NO INACTIVE TO LAST FUNC 
 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         FUNC 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 REQ 
 EC.REST  EQU    24B         RESERVE TIMEOUT
 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 TO EMPTY 
 EC.CPE   EQU    35B         CHANNEL PARITY ERROR ON INPUT
  
*         DIRECT CELL EQUATES 
  
 RDWRF    EQU    60B         READ/WRITE FLAG
 COD      EQU    61B         WRITE - READ CODED FLAG
 FUN      EQU    62B         FUNCTION FOR READ OR WRITE 
 CL       EQU    63B         ADDRESS OF CURRENT (SECTOR) LENGTH  - V
 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 
 FMT      EQU    16B         FUNCTION CODE FOR FORMAT PACK
 DREL     EQU    20B         DRIVE RELEASE
 RCA      EQU    21B         RETURN CYLINDER ADDRESS
 EDS      EQU    23B         EXTENDED DETAIL STATUS 
 RFD      EQU    30B         READ FACTORY DATA
 DR       EQU    32B         DIAGNOSTIC READ
 WRP      EQU    37B         WRITE PROTECTED SECTOR FUNCTION
 RS       EQU    40B         READ SHORT 
 SSO      EQU    41B         SELECT STROBES AND OFFSET
 RCB      EQU    43B         READ COUPLER BUFFER
 FSCAN    EQU    47B         SCAN DISK 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     INTERATION TIME TO WAIT FOR FULL 50 MSEC
 TIMREL   EQU    400000D/100D INTERVAL FOR CHANNEL RELEASE- 
 MAXITT   EQU    12D         ITERATION COUNT FOR ABOUT A 5 SEC.DELAY
  
 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    7B          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    DIAG        DIAGNOSTIC I/O TO/FROM INPUT/OUTPUT BUFFER 
          CON    GET         READ SERIAL, FACTORY OR UTILITY SECTOR 
          CON    MARGINS     SAVE STROBES AND OFFSET MARGINS
          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    WRPRO       PROCESS WRITE PROTECTED SECTOR COMMAND 
          CON    STATUS      GET GENERAL OR DETAIL STATUS 
          CON    REFORM      PROCESS REFORM COMMAND 
          CON    SCAN        PERFORM SCAN FUNCTION
          CON    SHORTRD     SHORT READ 
          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   - NONE 
* 
*         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 
          LJM    XENT        EXIT TO STACK
          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.
* 
*                  ERRNRES - IF NOT RESERVED IN 5 MINUTES 
*                  ERRCAS  - IF CHANNEL ACTIVE FROM SYSTEM
*                  ERRAGS  - IF ABNORMAL GENERAL STATUS 
*                  ERRDCSM - IF DEVICE CODE/STATUS MISMATCH 
* 
*         USES   - EC, EA, EM, RESA, RES7, OPC1, D.T3, LF,
*                  SBIE, 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 CODE REGISTER
          STD    EA          CLEAR ERROR ADDRESS REGISTER 
          STD    EM          CLEAR ERROR MESSAGE REGISTER 
  
**     3. DROP/REQUEST I/O CHANNEL FROM THE SYSTEM. 
* 
          LDN    MAXITT      ITERATION COUNT FOR STATUS 
          STM    RESA        AND PAUSE LOOP 
          LDD    PA 
          STM    RES7        SAVE CONTROLLER/DRIVE CONNECT FLAG 
 RES2     RJM    OPC         TO RELEASE THE CONTROLLER IF SELECTED
          LDN    0
          STM    OPC1        SET CONTROLLER AND UNIT NOT RESERVED 
 RES2A    SOM    RESA        DECREMENT THE ITERATION COUNT
          PJN    RES3        IF NOT TIMED OUT 
          LDC    ER.REST     ERROR - RESERVE TIMEOUT
          LJM    ERR         ERROR EXIT 
 RES3     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 EXIT 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
 RES4     RJM    STS         GET GENERAL STATUS 
          STM    SBIE        SAVE IT AS STATUS BEFORE ERROR TIME
  
**     5. IF BIT 2**10 IS SET, REPEAT STEP 4 UNTIL 500 MSEC HAS 
*         ELAPSED.  IF A RESERVE IS NOT SUCCESSFUL WITHIN THIS
*         TIME-FRAME, EXECUTE THE *REL* SEQUENCE TO COMMUNICATE 
*         WITH THE SYSTEM.  REPEAT THIS STEP UNTIL A RESERVE IS 
*         SUCCESSFUL OR 5 MINUTES HAVE ELAPSED. ABORT IF NO 
*         RESERVE IN 5 MINUTES. 
* 
          SHN    17D-CRES 
          PJN    RES6        IF COUPLER IS CONNECTED
          SOD    D.T3        DECREMENT LOOP COUNT 
          PJN    RES4        IF NOT TIMED OUT 
          UJN    RES2A       ELSE START NEXT ITERATION
  
**     6. SET THE CONTROLLER CONNECTED FLAG.
* 
 RES6     RJM    DST         GET DETAILED STATUS
          SHN    -9          POSITION CONTROLLER/UNIT RESERVE BITS
          LPN    2           MASK OFF CONTROLLER RESERVE BIT
          ADN    1           SET UNIT RESERVE BIT 
          STM    OPC1        SAVE DETAIL STATUS WD 13 FOR OPC 
  
  
**     7. EXIT IF THE KEYWORD *CONTROLLER* IS SPECIFIED.
* 
 RES6A    LDC    **          TYPE OF FUNCTION 
 RES7     EQU    *-1         *** CONNECT DRIVER/CONTROLLER FLAG 
          NJN    RES9        IF DRIVE CONNECT IS ALSO DESIRED 
          LJM    RES15
  
**     8. ISSUE A CONNECT FUNCTION AND OUTPUT THE UNIT NUMBER.
* 
 RES9     LDC    **          UNIT NUMBER STORED HERE
 UN       EQU    *-1
          STD    D.T4        SAVE FOR SUBROUTINE FNO
          LPN    77B         EXAMINE ONLY BITS FOR UNIT NO. 
          SBN    40B
          MJN    RES13       JUMP IF UNIT NO. LESS THAN 40B 
          SBN    20B
          PJN    RES13       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
          SCN    2           TO TEST OTHER THAN BUSY
          ZJN    RES11       IF NO ERROR STATUS 
          SHN    17D-DRES    TO TEST THE DRIVE RESERVED BIT 
          PJN    RES10       IF THE UNIT IS NOT RESERVED
          SOD    D.T3        DECREMENT THE COUNT
          PJN    RES6A       IF NOT DONE WITH THIS ITERATION
          LJM    RES2        ELSE START ANOTHER ITERATION 
  
 RES10    LJM    ERRAGS 
  
 RES11    RJM    DST         TO 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    RES14
  
 RES13    LDC    ER.DCSM     ERROR - DEVICE CODE/STATUS MISMATCH
          LJM    ERR         ERROR EXIT 
  
**    10. SET THE DRIVE CONNECTED FLAG. 
* 
 RES14    LDN    0
          STM    DRCON       SET DRIVE CONNECTED FLAG 
 RES15    LJM    XENT        EXIT TO STACK
          EJECT 
 DIAG     TITLE  DIAG - DIAGNOSTIC READ.
**        DIAG   - DIAGNOSTIC READ TO INPUT BUFFER. 
*                  DIAGNOSTIC WRITE FROM OUTPUT BUFFER. 
*                  READ COUPLER BUFFER TO INPUT BUFFER. 
*                  WRITE OUTPUT BUFFER TO COUPLER BUFFER. 
* 
*                  DIAGRD, ABT Z
*                  DIAGWR, ABT Z
*                  READCB, ABT Z
*                  WRITECB, ABT Z 
* 
*         ENTRY  - (PA) = FUNCTION CODE FOR DIAGRD, DIAGWR, READCB OR 
*                         WRITECB.
* 
*         EXIT   - ERR - IF INCOMPLETE DATA RETURNED TO PP (VIA RDW28A) 
*                        IF ALL DATA NOT ACCEPTED FROM PP  (VIA RDW28A) 
* 
*         USES   - WT, RDWRF, IB(0-501), D.T1 
* 
*         CALLS  - TCO, FNC, IJM
  
**     1. VERIFY THAT THE CONTROLLER IS CONNECTED.
* 
 DIAG     RJM    TCO         TEST CONTROLLER CONNECTED
          STD    WT          CLEAR THE WORDS TRANSFERRED REGISTER 
          LDD    PA          GET THE FUNCTION PARAMETER 
          SBN    DR 
          ZJN    DIAG1       IF DIAGNOSTIC READ 
          SBN    RCB-DR 
 DIAG1    STD    RDWRF       SET THE READ WRITE FLAG
  
**     2. ISSUE ONE OF THE FOLLOWING FUNCTIONS- 
*         DIAGRD(32), DIAGWR(33), READCB(43), WRITECB(44).
* 
          LDD    PA          GET THE FUNCTION 
          RJM    FNC         PERFORM THE FUNCTION 
  
**     3. INPUT 322D WORDS FROM THE SUBSYSTEM MEMORY TO THE INPUT 
*         BUFFER IF A DIAGRD OR READCB. 
* 
          ACN    CH+40B      ACTIVATE THE CHANNEL 
          LDD    RDWRF       IS IT WRITE (NOT ZERO) OR READ (ZERO)
          NJN    DIAG2       IF IT IS A WRITE 
          LDM    BTSD        BLOCK TRANSFER SIZE, DIAGNOSTIC I/O COMMAND
          IAM    IB,CH       READ TO INPUT BUFFER 
          SFM    ERCPE1,CH   CHECK FOR CH PARITY ERROR
          UJN    DIAG3
  
**     4. OUTPUT 322D WORDS FROM THE OUTPUT BUFFER TO THE SUBSYSTEM 
*         IF A DIAGWR OR WRITECB. 
* 
 DIAG2    LDM    BTSD        BLOCK TRANSFER SIZE, DIAGNOSTIC I/O COMMAND
          OAM    OB,CH       WRITE FROM THE OUTPUT BUFFER 
  
**     5. VERIFY THAT 322B WORDS WERE ACTUALLY INPUT. 
* 
 DIAG3    STD    D.T1        SAVE COUNT OF WORDS NOT WRITTEN
          LDM    BTSD        LOAD THE EXPECTED WORD COUNT 
          SBD    D.T1 
          STD    WT          STORE THE WORDS ACTUALLY TRANSFERRED 
          RJM    IJM         INSURE CHANNEL IS INACTIVE 
          NJN    DIAG5       JUMP IF CHANNEL INACTIVE 
          DCN    CH+40B      DEACTIVATE THE CHANNEL 
 DIAG5    LDD    D.T1 
          ZJN    DIAG6       IF ALL WORDS TRANSFERRED, EXIT TO STACK
          LJM    RDW28A      ERROR - ALL WORDS NOT TRANSFERRED
 DIAG6    LJM    XENT        EXIT TO STACK
          EJECT 
 REFORM   TITLE  REFORM - PROCESS REFORM COMMAND. 
**        REFORM - PROCESS REFORM COMMAND.
* 
*                  REFORM X, ABT Z
* 
*         ENTRY  - (PA) = FWA OF 7 PARAMETER WORDS TO SEND. 
* 
*         EXIT   - RDW6   - IF ACCESS LEVEL NOT 4 OR GREATER. 
*                  RDW29  - IF ALL DATA NOT ACCEPTED FROM PP. 
* 
*         USES   - PA+1, PA+4, 1+(PA), REF2, D.Z1 
* 
*         CALLS  - TDR, BD.TEST, FNC
* 
  
**        1. VERIFY DRIVE IS CONNECTED. 
* 
 REFORM   RJM    TDR         CALLER ENTRY POINT 
  
**        2. CLEAR WORDS TRANSMITTED, THEN TEST ACCESS LEVEL FOR 4 OR 
*            GREATER, IF NOT ERROR EXIT ELSE STEP 3.
* 
          LDD    AL 
          SBN    4
          PJN    REF1        IF AL=4 OR GREATER 
          LJM    RDW3 
  
**        3. TEST BUFFER ADDRESSES FOR WC ERROR.
* 
 REF1     LDN    7
          STD    PA+1        STORE WORD COUNT 
          STD    PA+4        STORE WORD COUNT 
          RJM    BD.TEST     TEST ADDRESS FOR RANGE IB-OB 
  
**        4. OUTPUT FORMAT FUNCTION AND SEVEN WORDS OF DATA.
* 
          LDM    1,PA 
          SCN    77B
 REFU     ADN    **          APPEND UNIT NO.
          STM    1,PA 
          LDD    PA 
          STM    REF2        STORE OUTPUT ADDRESS 
          LDN    FMT         LOAD FORMAT FUNCTION 
          RJM    FNC         SEND FORMAT FUNCTION 
          ACN    CH+40B      ACTIVATE THE CHANNEL 
          LDN    7
          OAM    OB,CH       SEND SEVEN WORDS TO FMD CONTROLLER 
 REF2     EQU    *-1
          STD    D.Z1 
  
**        5. IF ALL DATA ACCEPTED RETURN TO STACK, ELSE ERROR EXIT
*            RDW29 .
* 
          ZJN    REF3        JUMP IF ALL WORDS ACCEPTED 
          LJM    RDW29       ERROR - ALL DATA NOT ACCEPTED FROM PP
  
 REF3     DCN    CH+40B      DEACTIVATE THE CHANNEL 
 REF4     LJM    DIAG6       EXIT TO STACK
          EJECT 
 MARGINS  TITLE  MARGINS - PROCESS MARGINS COMMAND. 
**        MARGINS- SAVE STROBES AND OFFSET MARGINS FOR LATER READS. 
* 
*                  MARGINS W, ABT Z 
*                  MARGINS X OFFSET Y STROBES, ABT Z
* 
*         ENTRY  - (PA) = MARGINS ARGUMENT
* 
*         EXIT   - MARGINS PARAMETER CONVERTED FOR FUNCTION 
* 
*                  ERRISO  - IF ILLEGAL STROBE/OFFSET WERE SELECTED 
* 
*         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 
          UJN    REF4        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           LSFMD2 I/O CODE FOR GET COMMAND
          UJN    SHORTR1     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 
 SHORTRD  TITLE SHORTRD - PERFORM A SHORT READ OPERATION ON ONE SECTOR. 
**        SHORTRD - PERFORM A SHORT READ OPERATION ON ONE SECTOR
* 
*                   SHORTRD CYL W TRK X SEC Y, ABT Z
* 
*         ENTRY  - (CC) = W 
*                  (CT) = X 
*                  (CS) = Y 
* 
*         EXIT   - RDW1 (COMMON READ/WRITE SUBROUTINE)
* 
*         USES   - COD, RDWRF, D.T5, CL, FUN
* 
*         CALLS  - TDR
* 
 SHORTRD  RJM    TDR         VERIFY THAT DRIVE IS CONNECTED 
          STD    COD         ELMINATE CODED DATA CHECK
          STD    RDWRF       INDICATE A READ OPERATION TO PP
* 
          LDN    1           SPECIFY READ ONE SECTOR
          STD    D.T5        STORE NUMBER OF SECTORS TO READ
          LDN    D.T5        ADDRESS OF NUMBER OF SECTORS TO READ 
          STD    CL          CURRENT LENGTH (IN SECTORS)
* 
          LDN    RS          CONTROLLER FUNCTION CODE FOR READ SHORT
          STD    FUN         STORE CONTROLLER FUNCTION CODE 
* 
          LDN    10B         SET SECTOR SIZE FLAG (BIT 3) 
          STD    PA          SET BIT 3 = 1 FOR SMALL SECTOR 
* 
          LDN    6           I/O CODE FOR SHORTRD COMMAND = 6 
* 
*         EXIT TO READ/WRITE ROUTINE RDWR 
* 
 SHORTR1  UJN    WRPRO1      GO READ ONE SHORT SECTOR (476B WORDS)
          EJECT 
 WRPRO    TITLE WRPRO - EXECUTE WRITE PROTECTED SECTOR COMMAND. 
**        WRPRO  - EXECUTE WRITE PROTECTED SECTOR COMMAND.
* 
*                   WRPRO CYL W TRK X SEC Y, ABT Z
* 
*         ENTRY  - (CC) = W 
*                - (CT) = X 
*                - (CS) = Y 
* 
*         EXIT   - RDW1 (COMMON READ/WRITE ROUTINE) 
* 
*         USES   - COD, FUN, RDWRF, D.T5, CL
* 
*         CALLS  - TDR       - VERIFY THAT DRIVE IS CONNECTED 
* 
 WRPRO    RJM    TDR         VERIFY THAT DRIVE IS CONNECTED 
          STD    COD         CLEAR CODED FLAG 
* 
*         SPECIFY FUNCTION CODE 
* 
          LDN    WRP         WRITE PROTECTED SECTOR FUNCTION
          STD    FUN         STORE FUNCTION CODE INTO FUNCTION REGISTER 
* 
*         SPECIFY NUMBER OF SECTORS TO WRITE
* 
          LDN    1           SPECIFY WRITE ONE SECTOR 
          STD    RDWRF       SET READ/WRITE FLAG TO WRITE 
          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    5           LSFMD2 I/O CODE FOR WRPRO COMMAND
 WRPRO1   UJN    RDW1        GO WRITE PROTECTED SECTOR
          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
*                  WRITE V SMALL 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    = UNCODED/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.NILF - IF NO INACTIVE TO LAST FUNCTION
*                  ER.NIDT - IF NO INACTIVE AFTER DATA TRANSFER 
*                  ER.NIGS - IF NO INACTIVE TO GENERAL STATUS 
*                  ER.GSNR - IF GENERAL STATUS NOT RETURNED 
*                  ER.DCE  - IF DATA COMPARE ERROR
*                  ER.IDR  - IF INCOMPLETE DATA RETURNED TO PP
*                  ER.DNA  - IF ALL DATA NOT ACCEPTED FROM PP 
*                  ER.AGS  - IF ABNORMAL GENERAL STATUS 
*                  ER.STRY - IF SUCCESSFUL RETRY
* 
*         USES   - RDWRF, COD, FUN, IOC, D.T2, SB(0-24B, SBIE(0-24B), 
*                  RETRY, D.T4, RDW12, RDW8, (CL), RT, WT, OB(500B-502B), 
*                  D.T3, IB(0-503B), D.T1, (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 LSFMD2 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, SHORTRD AND WRPRO COMMANDS 
* 
 RDW1     STD    IOC         INITIALIZE LSFMD2 I/O CODE REGISTER
* 
*         PRESET I/O CODE FOR SMALL SECTOR WRITE COMMAND
* 
          LMC    1           TEST IF IOC = 1 (WRITE)
          NJN    RDW1A       JUMP IF NOT WRITE COMMAND
          LDD    PA          PARAMETERS/ARGUMENT REGISTER 
          LPN    10B         MASK OFF ALL BUT SECTOR SIZE SELECT BIT
          ZJN    RDW1A       EXIT IF LARGE SECTOR REQUESTED 
          LDN    7           WRITE SMALL SECTOR (IOC = 7) 
          STD    IOC         PRESET IOC FOR WRITE SMALL SECTOR
* 
*         CLEAR THE STATUS BUFFER (SB), STATUS SAVE AREA FOR INITIAL
*         ERROR ON RETRY (SBIE) AND RETRY COUNTER (RETRY) 
* 
 RDW1A    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 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 INSTRUCTIONS 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    RDW6C       CURRENT TRK+1 TO END OF CYL) TO SECTORS. 
          LDM    SELB,D.T2   INSTRUCTION FOR LOADING SECTOR LENGTH
          STM    RDW6D
          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
* 
*         DETERMINE WHETHER LAST SECTOR TEST APPLIES TO CURRENT COMMAND 
*         AND PRESET JUMP SWITCH IN SECTOR TRANSFER LOOP ACCORDINGLY
*         (LAST SECTOR TEST APPLIES TO WRITE AND VERIFY COMMANDS) 
* 
 RDW6A    LDD    IOC         I/O CODE REGISTER
          LMN    5           COMPARE WITH I/O CODE FOR WRPRO COMMAND
          ZJN    RDW6B       JUMP IF WRITE PROTECTED SECTOR (WRPRO) 
          LDD    RDWRF       READ/WRITE FLAG
 RDW6B    STD    D.T1        SET INDEX FOR LOAD OF JUMP SWITCH
          LDM    RDWLS,D.T1  LOAD CODE FOR CURRENT RELATIVE JUMP
          ADC    -1100B      CHANGE OP CODE LOADED FROM LDN TO UJN
          STM    RDW8        STORE RELATIVE JUMP SWITCH IN SECTOR LOOP
* 
*         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.
* 
          LDN    TRL         TRACK LENGTH (NO. TRACKS IN CYLINDER) - 1
          SBI    CT          MINUS CURRENT TRACK (HERE = STARTING TRACK)
 RDW6C    SHN    **          CONVERT NO. TRACKS TO SECTOR EQUIVALENT
          STD    D.T4        LOGICAL SECS FROM CURR. TRK+1 TO END OF CYL
 RDW6D    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    RDW7        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
 RDW7     LDI    CL          CURRENT LENGTH IN SECTORS
          SHN    -2 
          RAD    RT          RESET REAL TIME CLOCK
* 
* 
*         START OF LOOP TO TRANSFER DATA (1 SECTOR PER ITERATION) 
* 
* 
*         WRITE (AND WRITE VERIFY) LAST SECTOR PROCESSING 
* 
*         JUMP ACCORDING TO WHETHER OR NOT LAST SECTOR TEST APPLIES TO
*         CURRENT COMMAND.
*                IF TEST APPLIES JUMP TO RDW8A
*                IF TEST DOES NOT APPLY JUMP TO RDW8B 
* 
 RDW8     UJN    **          ** = RDW8A OR RDW8B
* 
*         DETERMINE IF CURRENT SECTOR IS LAST SECTOR TO BE TRANSFERRED
* 
 RDW8A    LDI    CL          CURRENT LENGTH IN SECTORS
          LMN    1           COMPARE CURRENT SECTOR LENGTH WITH 1 
          NJN    RDW8B       JUMP IF NOT LAST SECTOR
* 
*         THE CURRENT COMMAND IS EITHER A WRITE (FUN = 0005) OR WRITE 
*         VERIFY (FUN = 0006).  TO WRITE LAST SECTOR ON A 7155
*         CONTROLLER, A WRITE LAST SECTOR FUNCTION IS USED (0035 FOR
*         WRITE, 0036 FOR WRITE VERIFY).  USING THESE LAST SECTOR 
*         FUNCTIONS ALLOWS USEFUL STATUS TO BE READ ON THE FIRST
*         REQUEST AFTER WRITE OF DATA.
* 
          LDD    FUN         LOAD THE CURRENT FUNCTION CODE 
          ADN    30B         FORM WRITE LAST SECTOR FUNCTION (35 OR 36) 
          UJN    RDW9        JUMP TO PERFORM THE FUNCTION 
* 
*         ISSUE A FUNCTION TO PERFORM ONE OF THE FOLLOWING COMMANDS-
*         READ (4), WRITE (5), VERIFY (6), READCW (7), CONTINUE (14), 
*         GET (30 OR 31), WRITE LAST SECTOR (35), WRITE VERIFY LAST 
*         SECTOR (36), WRITE PROTECTED SECTOR (37), SHORTRD (40). 
* 
 RDW8B    LDD    FUN         LOAD THE CURRENT FUNCTION CODE 
 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 
*          WRPRO           1                 0            5 
*          SHORTRD         1                 0            6 
*          WRITE SMALL SEC 1                 0            7 
* 
          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 (LARGE SECTOR), 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 BLOCK TRANSFER SIZE (BTS) 
          IAM    IB+344B,CH  READ BTS 12 BIT WORDS TO INPUT BUFFER
          UJN    RDW18       VERIFY THAT BTS WORDS WERE TRANSFERRED 
 RDW12A   LDD    D.T3        CURRENT PP I/O BLOCK TRANSFER SIZE (BTS) 
          OAM    OB+344B,CH  WRITE BTS 12 BIT WORDS FROM OUTPUT BUFFER
          UJN    RDW18       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)
          UJN    RDW15       GET     COMMAND
          UJN    RDW16       WRPRO   COMMAND
          UJN    RDW15       SHORTRD COMMAND
*               SMALL SECTOR WRITE   COMMAND
* 
* 
*         WRITE (LARGE AND SMALL SECTOR), VERIFY OR WRPRO COMMAND 
* 
 RDW16    OAM    OB,CH       WRITE BTS 12 BIT WORDS FROM OUTPUT BUFFER
          UJN    RDW18       VERIFY BTS WORDS TRANSFERRED 
* 
*         READ, SHORTRD OR GET COMMAND - READ TO INPUT BUFFER 
* 
 RDW15    IAM    IB,CH       READ BTS 12 BIT WORDS TO INPUT BUFFER
* 
*         VERIFY THAT THE CURRENT SELECTED NUMBER OF WORDS WERE ACTUALLY
*         TRANSFERRED. STORE CUMULATIVE NO. WORDS TRANSFERRED IN WT REG.
* 
 RDW18    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    RDW19       JUMP IF BLOCK DATA TRANSFERS COMPLETE
          LJM    RDW11       LOOP BACK IF BLOCK TRANSFERS NOT COMPLETE
* 
*         COMPLETE I/O OPERATION FOR CURRENT SECTOR 
* 
 RDW19    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 
          LJM    RTNADDR4    ERROR - NO INACTIVE AFTER DATA XFER
 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 SECTOR (REGISTER Y)
 RDW24A   SBN    **          TEST IF SECTOR COUNT .GT. MAX SECS/TRK 
          MJN    RDW25       JUMP IF NO, GO PROCESS NEXT SECTOR 
          STI    CS          CLEAR CURRENT SECTOR REGISTER
          AOI    CT          INCREMENT CURRENT TRACK (REGISTER X) 
 RDW25    LJM    RDW8        GO PROCESS NEXT SECTOR 
* 
*         PROCESS ERROR EXIT FOR SUCCESSFUL RETRY 
* 
 RDW26    LDD    FUN         CURRENT CONTROLLER FUNCTION CODE 
          LMN    RS          TEST IF SHORT READ (SHORTRD) 
          ZJN    RDW31       EXIT TO STACK IF SHORT READ
          LDC    ER.STRY     ERROR - SUCCESSFUL RETRY 
 RDW27    LJM    ERR         ERROR EXIT 
* 
*         PROCESS PP I/O ABORT BECAUSE THE A REGISTER UNEQUAL ZERO
* 
 RDW28    RJM    STS         OBTAIN GENERAL STATUS
 RDW28A   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 
* 
*         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 
          UJN    RDW33A      GO REPORT ERROR
 RDW33    LDD    FUN         CURRENT CONTROLLER FUNCTION CODE 
          LMN    RS          TEST IF READ SHORT (SHORTRD) 
          ZJN    RDW31       EXIT TO STACK IF SHORTRD 
 RDW33A   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 
          MJN    RDW37       JUMP IF .LT. 28D TRIES 
          LJM    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 LARGE SEC 5                 4            1
*           VERIFY          5                 4            2
*           READCW          0                 -            3
*           GET             1                 0            4
*           WRPRO           1                 0            5
*           SHORTRD         1                 0            6
*           WRITE SMALL SEC 1                 0            7
* 
 LIO      DATA   4,4,4,502B,0,0,0,0   LOOP COUNTS FOR PP I/O DATA XFERS 
* 
*         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 LARGE SECTOR
          CON    BTSV         2       VERIFY
          DATA   476B         3       READCW (NOT USED - NO PP I/O XFER)
          CON    BTSG         4       GET 
          CON    BTSP         5       WRPRO 
          CON    BTSS         6       SHORTRD 
          CON    BTSM         7       WRITE SMALL SECTOR
* 
*         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
 BTSP     EQU    BTSG                          WRPRO   COMMAND
 BTSS     EQU    BTSA+3 (IN UNUSED BTSA SLOT)  SHORTRD COMMAND
 BTSM     EQU    BTSG             SMALL SECTOR WRITE   COMMAND
 BTSD     EQU    BTSG                   DIAGRD/DIAGWR  COMMANDS 
* 
*         READ/WRITE ACCESS LEVEL TABLE 
* 
 RDWAL    CON    ARD      ACCESS LEVEL FOR READ ANYWHERE
          CON    ARW      ACCESS LEVEL FOR READ OR WRITE ANYWHERE 
* 
*         INSTRUCTIONS USED TO FORM FAST RELATIVE JUMP SWITCH TO CONTROL
*         LAST SECTOR PROCESSING IN TIME CRITICAL LOOP TO WRITE SECTORS.
*         TIME IS CRITICAL ON 2X SPEED PP. THE TWO SWITCH SETTINGS ARE, 
*         RESPECTIVELY, FOR WHEN . . .
* 
 RDWLS    LDN    RDW8B-RDW8  . . . LAST SECTOR TEST DOES NOT APPLY
          LDN    RDW8A-RDW8  . . . LAST SECTOR TEST DOES APPLY
* 
*         INSTRUCTIONS PRESTORED INTO RDWR FOR LATER EXECUTION
*         WHICH INVOLVE SECTOR SIZE 
* 
*         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 
          STM    COCON       SET CONTROLLER CONNECTED FLAG
 RESET2   LJM    XENT        EXIT TO STACK
          EJECT 
 RTNADDR  TITLE  RTNADDR- PERFORM A RETURN CYLINDER ADDR FNC. 
**        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 AND INPUT GENERAL STATUS AND VERIFY THAT IT IS ZERO.
* 
          RJM    STS         TO GET STATUS
          SHN    17D-BUSY 
          PJN    RTNADDR3    IF STATUS IS OK
          LJM    ERRAGS      ERROR - ABNORMAL GENERAL STATUS
  
**     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+40B      TO ACTIVATE AND
          RJM    FJM         WAIT FULL
          ZJN    RTNADDR4    IF NO FULL 
          IAN    CH+40B      INPUT THE WORD 
          STI    PA          SAVE THE WORD
          RJM    IJM         INSURE THE CHANNEL DEACTIVATES 
          NJN    RESET2      EXIT TO STACK IF NOT TIMED OUT 
  
 RTNADDR4 LDC    ER.NIDT     ERROR - NO INACTIVE AFTER DATA XFER
          LJM    ERR         ERROR EXIT 
          EJECT 
 SCAN     TITLE  SCAN - SEND SCAN FUNCTION. 
**        SCAN - SEND SCAN FUNCTION.
* 
*                  SCAN,ABT Z 
* 
*         ENTRY  - NONE 
* 
*         EXIT   - NONE.
* 
*         USES   - NONE.
* 
*         CALLS  - TDR     - TEST DRIVE RESERVE.
*                  FNC     - SEND FUNCTION TO CONTROLLER. 
* 
  
**        1. TEST DRIVE CONNECTED.
* 
 SCAN     RJM    TDR
  
**        2. SEND SCAN FUNCTION TO FMD CONTROLLER.
* 
          LDN    FSCAN       SCAN FUNCTION
          RJM    FNC
  
**        3. RETURN TO CALLER.
* 
 SCAN1    LJM    XENT        EXIT TO STACK
          EJECT 
 SEEK     TITLE  SEEK - SEEK TO THE ADDRESS SPECIFIED.
**        SEEK   - SEEK TO THE ADDRESS SPECIFIED. 
* 
*                  SEEK CYL W TRK X SEC Y, ABT Z
* 
*         ENTRY  - (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), 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)
          UJN    SCAN1       EXIT TO STACK
  
 SEEK1X   LJM    **          SECONDARY ENTRY/EXIT 
 SEEK1    EQU    *-1
          SHN    9D-3D       POSITION SECTOR SIZE PARAMETER AT BIT 9
          STM    SEEK4       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    SEEK4A      SHN 0 IF SMALL, SHN 2 IF LARGE SECTOR
          LDN    0           PROVIDES SEEK TIME BIASED BY MINUS ONE 
          STD    SEEKA       PRESET CURRENT SEEK TIME 
          RJM    STS         TO GET STATUS
          SHN    17D-CRES 
          PJN    SEEK3
          LJM    ERRCDNC     ELSE IT IS AN ERROR
  
  
**     2. PRESET SEEK FUNCTION DATA 
* 
 SEEK3    LDM    UN          SECTOR SIZE BIT (SET) AND UNIT NUMBER
          LMC    **          **=0 IF LARGE SECTOR, 1000B IF SMALL SECTOR
 SEEK4    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 
 SEEK4A   SHN    **          SHN 0 IF SMALL, SHN 2 IF LARGE SECTOR
          STD    SEEKA+4
  
**     3. ISSUE A 1 TO 1 SEEK FUNCTION (0001) 
* 
          IANN   14B         INPUT THE REAL TIME CLOCK
          STD    D.T1 
 SEEK5    LDN    SEK11       SEEK 1 TO 1 INTERLACE
          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 
          LDC    ER.FPNA     ERROR - FUNC PARAMETERS NOT ACCEPTED 
          UJN    SEEK10      ERROR EXIT 
  
 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       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 
          LMC    200000D/1000D COUNT LIMIT FOR BUSY 
          NJN    SEEK5       IF BUSY NOT TIMED OUT
  
          LDC    ER.UHB      ERROR - UNIT HUNG BUSY ON SEEK 
 ERRDST   STD    D.T2 
          RJM    DST         GET DETAIL STATUS
          LDD    D.T2 
 SEEK10   LJM    ERR         ERROR EXIT 
  
**     7. STORE THE NUMBER OF MILLISECONDS REQUIRED TO COMPLETE THE 
*         SEEK INTO SB(60). 
* 
 SEEK11   LDD    SEEKA       MOVE THE SEEK TIME 
          ZJN    SEEK12      IF READY WITHOUT ANY MOVE
          SBN    1           ADJUST THE SEEK TIME 
 SEEK12   STM    SEEKTIM     THIS IS MILLISEC. COUNT REQUIRED FOR SEEK
          SHN    -1 
          RAD    RT          INCREMENT I/O LIMIT
  
**     8. IF GENERAL STATUS IS ZERO, EXIT.  OTHERWISE, REQUEST AND
*         INPUT DETAIL STATUS AND EXECUTE THE ERROR EXIT SEQUENCE.
* 
          LDM    SB 
          ZJN    SEEK14      IF ZERO AFTER NOT BUSY 
 ERRAGS   LDC    ER.AGS      ERROR - ABNORMAL GENERAL STATUS
          UJN    ERRDST      GO GET DETAIL STATUS AND ERROR EXIT
 SEEK14   LJM    SEEK1X      TO EXIT
          EJECT 
 STATUS   TITLE  STATUS - GET GENERAL OR DETAIL STATUS. 
**        STATUS - GET GENERAL OR DETAIL STATUS.
* 
*                  STATUS GENERAL, ABT Z
*                  STATUS DETAIL, ABT Z 
* 
*           GENERAL - INPUT 1 WORD OF GENERAL STATUS TO  SB(0). 
*           DETAIL  - INPUT 20D WORDS OF DETAIL STATUS TO SB(1)-SB(20D) 
* 
*         ENTRY  - (PA) =  CODE         0 = GENERAL 
*                                       1 = DETAIL
*         EXIT   - NONE 
* 
*         USES   - LF 
* 
*         CALLS  - TCO, STS, DST
  
**     1. STORE 7777B INTO THE STATUS BUFFER FOR WORDS ABOUT TO BE READ 
* 
*      2. VERIFY THAT THE CONTROLLER IS CONNECTED.
* 
* 
*      3. ISSUE THE SELECTED STATUS FUNCTION SPECIFIED BY THE KEYWORD 
*         GENERAL (0012), DETAIL (0023) 
* 
*      4. INPUT THE REQUIRED NUMBER OF WORDS TO THE STATUS BUFFER 
*         (1 OR 24B). 
* 
 STATUS   RJM    TCO         TEST CONTROLLER CONNECTED
          LDD    PA          LOAD CODE
          NJN    STATUS3     IF DETAIL STATUS REQUEST 
          LDN    GS 
          STD    LF          SAVE LAST PRIMARY FUNCTION 
          RJM    STS         GET GENERAL STATUS 
          UJN    STATUS4
  
 STATUS3  LDN    EDS         FUNCTION CODE FOR EXTENDED DETAIL STATUS 
          STD    LF          SAVE LAST PRIMARY FUNCTION 
          RJM    DST         GET DETAIL STATUS
 STATUS4  LJM    XENT        EXIT TO STACK
          EJECT 
 DST      TITLE  UTILITIES USED BY THE LSFMD2 OVERLAY.
**        DST    - OBTAIN DETAIL STATUS.
* 
*         ENTRY  - NONE 
* 
*         EXIT   - STATUS BUFFER CONTAINS THE CURRENT DETAIL STATUS.
*                  TO BE USED FOR ERROR CHECKING. 
* 
*                - (A) = (SB+13D) 
* 
*                  ERRNIDS - IF NO INACTIVE TO DETAIL STATUS
*                  ERRISR  - IF INCOMPLETE STATUS RETURNED
* 
*         USES   - D.T1, SB(1-24B)
* 
*         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
  
*         STORE 7777B INTO ALL WORDS
  
          LDN    24B
          STD    D.T1 
 DST1     LCN    0
          STM    SB,D.T1
          SOD    D.T1 
          NJN    DST1        DO ALL WORDS 
          LDN    EDS         FUNCTION CODE FOR EXTENDED DETAIL STATUS 
          RJM    FNA         ISSUE STATUS FUNCTION
          NJN    DST3        IF FUNCTION ACCEPTED 
          LDC    ER.NIDS     ERROR - NO INACTIVE TO DETAIL STATUS 
          UJN    DST6        ERROR EXIT 
  
 DST3     ACN    CH+40B 
          RJM    FJM         WAIT FOR FULL
          ZJN    ERRISR      IF FULL NOT RECEIVED 
          LDN    24B
          IAM    SB+1,CH
          NJN    ERRISR      IF ALL WORDS NOT INPUT 
          RJM    IJM         VERIFY INACTIVE IS RECEIVED
          NJN    DST0        IF INACTIVE RECEIVED 
 ERRISR   LDC    ER.ISR      ERROR - INCOMPLETE STATUS RETURNED 
 DST6     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 - CH FAILED TO GO EMPTY
 EJM3     LJM    ERR         ERROR EXIT 
          SPACE  4,22 
**        FJM    - WAIT FOR CHANNEL TO GO FULL. 
* 
*         ENTRY  - NONE 
* 
*         EXIT   - (A) NONZERO IF NOT TIMED OUT WAITING FULL
*                  (A) ZERO IF TIMED OUT
* 
*         USES   - NONE 
* 
*         CALLS  - NONE 
* 
*         TIME   - MINIMUM 1X SPEED EXECUTION TIME IS 6 MICROSEC. 
* 
 FJMX     LJM    **          ENTRY/EXIT 
 FJM      EQU    *-1
          LDC    TIMFJM*2 
 FJM1     FJM    FJMX,CH     IF FULL EXIT 
 FJM2     SBN    4           *** SBN 4 IF 1X SPEED PPU ***
*         SBN    2           *** SBN 2 IF 2X SPEED PPU ***
*         SBN    1           *** SBN 1 IF 4X SPEED PPU ***
          NJN    FJM1        IF TIME NOT COUNTED DOWN 
          UJN    FJMX        ELSE EXIT WITH A EQ. ZERO
          SPACE  4,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 LAST FUNCTION
* 
*         USES   - LF 
* 
*         CALLS  - FNA
* 
*         TIME   - MINIMUM 1X SPEED EXECUTION TIME IS 22 MICROSEC.
* 
 FNCX     LJM    **          ENTRY/EXIT 
 FNC      EQU    *-1
          STD    LF          TO SAVE LAST MAJOR FUNCTION
          RJM    FNA         TO FUNCTION AND WAIT INACTIVE
          NJN    FNCX        IF INACTIVE EXIT 
          LDC    ER.NILF     ERROR - NO INACTIVE TO LAST FUNC 
          UJN    EJM3        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,30 
**        FNO    - ISSUE FUNCTION AND OUTPUT ONE WORD OF DATA.
* 
*         ENTRY  - (A)  = FUNCTION DESIRED
*                  D.T4 = DATA WORD TO OUTPUT 
* 
*         EXIT   - NONE 
* 
*                 ERRFPNA - IF FUNCTION PARAMETERS NOT ACCEPTED 
* 
*         USES   - NONE 
* 
*         CALLS  - FNC
* 
*         TIME   - MINIMUM 1X SPEED EXECUTION TIME IS 40 MICROSEC.
* 
 FNOX     LJM    **          ENTRY/EXIT 
 FNO      EQU    *-1
          RJM    FNC         TO SEND FUNCTION 
          ACN    CH+40B 
          LDD    D.T4 
          OAN    40B+CH 
  
 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 
 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,46 
**        OPC    - RELEASE THE CONTROLLER WITH AN OPERATION COMPLETE. 
* 
*         ENTRY  - NONE 
* 
*         EXIT   - (A) = ZERO IF CONTROLLER NOT CONNECTED 
*                      = NONZERO IF OPERATION COMPLETE ACCEPTED 
* 
*         USES   - COCON, DRCON, D.T5 
* 
*         CALLS  - FNA, FNC 
* 
*         TIME   - MINIMUM 1X SPEED EXECUTION TIME IS 44 MICROSEC.
* 
 OPCX     LJM    **          ENTRY/EXIT 
 OPC      EQU    *-1
          LDM    BD.CHFG
          ZJN    OPCX        EXIT IF CHANNEL NOT RESERVED 
          LDM    COCON
          NJN    OPCX        EXIT IF CONTROLLER NOT RESERVED
          LDN    77B
          STM    COCON       CLEAR THE CONTROLLER CONNECT FLAG
          STM    DRCON       CLEAR THE DRIVE CONNECT FLAG 
          LDC    ** 
 OPC1     EQU    *-1         DETAIL STATUS WORD 13 STORED HERE
          SBN    2
          MJN    OPC3        IF CONTROLLER NOT RESERVED 
          NJN    OPCX        IF CONTROLLER AND UNIT RESERVED
          LDN    DREL 
          UJN    OPC4 
  
 OPC3     LDN    OC 
 OPC4     STD    D.T5        ONLY FOR SPECIAL CALL FROM BASIC DRIVER
          LDM    ERR3        UPPER BITS OF ABT ADDRESS
          SBN    77B
          NJN    OPC5        IF NORMAL USER CALL
          LDD    D.T5 
          RJM    FNA         ONLY FOR SPECIAL CALL FROM BASIC DRIVER
          NJN    OPC2        IF NOT FUNCTION TIMEOUT
          DCN    CH+40B      ELSE DO A DISCONNECT 
 OPC2     UJN    OPCX        RETURN 
  
 OPC5     LDD    D.T5 
          RJM    FNC         TO FUNCTION OPERATION COMPLETE 
          UJN    OPC2        EXIT 
          SPACE  4,40 
**        STS    - REQUEST AND INPUT GENERAL STATUS.
* 
*         ENTRY  - NONE 
* 
*         EXIT   - (A) = STATUS 
* 
*                  ERRNIGS - IF NO INACTIVE TO GENERAL STATUS 
*                  ERRGSNR - IF GENERAL STATUS NOT RETURNED 
* 
*         USES   - SB, COCON
* 
*         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
          UJN    STS3        ERROR EXIT 
  
 STS1     LDN    0
          STM    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
          SFM    ERCPE1,CH   CHECK FOR CH PARITY ERROR
          RJM    IJM         WAIT FOR INACTIVE
          NJN    STSXX       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 RESERVED
* 
*         CALLS  - NONE 
* 
*         USES   - NONE 
* 
 TCAX     LJM    **          ENTRY/EXIT 
 TCA      EQU    *-1
          LDM    BD.CHFG     BASIC DRIVER CHANNEL FLAG
          NJN    TCAX        EXIT IF CHANNEL ASSIGNED 
          LDC    ER.CNA      ERROR - CHANNEL NOT ASSIGNED 
 TCA1     UJN    ERR         ERROR EXIT 
          SPACE  4,18 
**        TCO    - TEST CONTROLLER CONNECTED. 
* 
*         ENTRY  - NONE 
* 
*         EXIT   - ERRCDNC- IF CONTROLLER NOT CONNECTED 
* 
*         USES   - WC 
* 
*         CALLS  - TCA
* 
 TCOX     LJM    **          ENTRY/EXIT 
 TCO      EQU    *-1
          RJM    TCA         TEST IF CHANNEL ASSIGNED 
          LDC    77B
 COCON    EQU    *-1         *** CONTROLLER CONNECTED FLAG STORED HERE
          ZJN    TCOX        EXIT IF CONTROLLER CONNECTED 
          UJN    ERRCDNC     ERROR - CONTROLLER/DRIVE NOT CONNECTED 
          SPACE  4,17 
**        TDR    - TEST DRIVE RESERVED. 
* 
*         ENTRY  - NONE 
* 
*         EXIT   - ERRCDNC- IF DRIVE NOT CONNECTED
* 
*         USES   - NONE 
* 
*         CALLS  - TCO
* 
 TDRX     LJM    **          ENTRY/EXIT 
 TDR      EQU    *-1
          RJM    TCO         TEST IF CONTROLLER CONNECTED 
          LDC    77B
 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
          ZJN    ERR2        IF CHANNEL IS NOT ASSIGNED 
          LDD    BD.AL
          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    6700B       ADD IN BIAS FOR LSFMD2 PRODUCT OVERLAY 
          STD    EC          STORE ERROR CODE 
          LDD    D.Z1 
          SHN    -6 
          ADC    100B        FLAG MESSAGE INDEX AS OVERLAY MESSAGE
          STD    EM          STORE MESSAGE INDEX
          LDD    P
          STD    EA          STORE LINE NUMBER WHERE ERROR OCCURRED 
          LDD    D.Z2 
          NJN    ERR5        IF ABORT FLAG SET
          LDC    ** 
 ERR3     EQU    *-1         FOR ABORT ADDRESS
          SHN    12 
          LMC    ** 
 ERR4     EQU    *-1         FOR ABORT ADDRESS
          LJM    BD.RNI      RNI AT THE REJECT ADDRESS
  
 ERR5     LJM    BD.ABT      TERMINATE MODULE 
  
 IB       EQU    6500B       INPUT BUFFER 
 LIB      EQU    505B        LENGTH OF INPUT AND OUTPUT BUFFERS 
 OB       EQU    IB+LIB      OUTPUT BUFFER
 SB       EQU    OB+LIB      STATUS BUFFER
 SBIE     EQU    SB+25B      STATUS THAT DETECTED THE ERROR 
 RETRY    EQU    SB+52B      RETRY COUNT
 SERNUM1  EQU    SB+56B      FIRST HALF OF PACK SERIAL NUMBER 
 SERNUM2  EQU    SB+57B      SECND HALF OF PACK SERIAL NUMBER 
 SEEKTIM  EQU    SB+60B      LAST SEEK TIME 
 RESA     EQU    SB+64B 
 LSB      EQU    64B         LENGTH OF STATUS BUFFER
  
          ERRPL  *-IB-1      ERROR IF LSFMD2 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
          ADC    600B        FORM CODE FOR ADN (16XX) 
          STM    REFU        STORE UNIT IN REFORM MODULE
          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    INIT11      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    INIT11      JUMP IF LEGAL DEVICE CODE
          LDC    INIT12      (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
**
 INIT11   LJM    START       EXIT WITH (A) = ERROR/NO ERROR FLAG
  
 INIT12   DIS    ,*DC NOT SUPPORTED*
  
*         TABLE OF PPU SPEED SWITCHES 
  
 TSPEED   CON    FJM2 
          CON    IJM2 
          DATA   0           END OF SPEED SWITCHES TABLE
          EJECT 
 PPMSGS   TITLE  ERROR MESSAGES 
 PPMSGS   EQU    *           START OF PP MESSAGES 
****
          MMSG   ER.FLE,EC.FLE,(ADDR OUT OF FL),1 
          MMSG   ER.TL,EC.TL,(I/O TIME OUT ON CH RESERVE),1 
          MMSG   ER.SEE,EC.SEE,(SUBR ENTRY/EXIT ERR),1
          MMSG   ER.WC,EC.WC,(BUFFER INDEX OR WC ERR),1 
          MMSG   ER.RES,EC.RES,(R)
          MMSG   ER.RES1,EC.RES1,(R)
          MMSG   ER.RES2,EC.RES2,(R)
          MMSG   ER.CNA,EC.CNA,(CH NOT ASSIGNED)
          MMSG   ER.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   *
