ASMB,R,L,C
      HED DVR31  RTE MOVING HEAD DRIVER 
* 
*     NAME:      DVR31
*     SOURCE:    29013-80001
*     RELOC:     29013-60001
*     PGMR:      G.A.A. 
* 
*  ***************************************************************
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1976.  ALL RIGHTS     *
*  * RESERVED.  NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED,      *
*  * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT*
*  * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.       *
*  ***************************************************************
* 
      NAM DVR31,0 29013-60001 REV.1710 770216 
      ENT I.31,C.31 
      EXT $UPIO,.MVW
      EXT $TB31 
TBXX  EQU $TB31 
* 
* 
* 
*     THIS DRIVER OPERATES UNDER THE CONTROL OF 
*  THE I/O CONTROL MODULE OF THE REAL-TIME EXECUTIVE. 
*  THIS DRIVER IS RESPONSIBLE FOR CONTROLLING DATA
*  TRANSMISSION WITH A MOVING HEAD TYPE DISC FILE.
* 
*     THIS DRIVER MAKES THE MOVING HEAD DISC APPEAR TO
*  HAVE 64 WORD SECTORS, HOWEVER SPEED IS IMPROVED
*  IF THE DRIVER DOES NOT HAVE TO DO THIS PROCESSING. 
* 
*  THIS IS DONE BY ALWAYS STARTING A READ REQUEST ON AN 
*  EVEN SECTOR AND BY ENDING WRITE REQUESTS WITHIN. 
*  ODD SECTORS. 
* 
* 
* ALL DATA TRANSFER IS DONE UNDER DMA CONTROL.
*     THE USER SPECIFIES TRACK AND SECTOR AND 
*     LENGTH OF EACH REQUEST. 
* 
* ERROR RETRY PROCEDURE :  THE DRIVER SEEKS 202 AND 
*      0 FOR EACH ERROR DETECTED. THE DRIVER THEN 
*      RETRIES THE OPERATION. THE USER MAY SPECIFY
*  CYCLIC CHECKING BE DONE ON WRITE REQUESTS
*  BY SETING SUBFUNCTION BIT 8 IN THE WRITE REQUEST.
*  A FAILED CYCLIC CHECK WILL CAUSE THE WRITE TO BE 
*  RETRIED UP TO TEN TIMES. 
* 
* 
*  SPECIAL SYSTEM REQUESTS:  A GROUP OF TRANSFERS 
*     MAY BE SPECIFIED BY AN INTERNAL SYSTEM
*     REQUEST (VIA <XSIO>). THIS REQUEST HAS THE
*     SPECIAL FORMAT: 
* 
*       (EQ T7,I) 'CONTAINS A POINTER TO A GROUP OF 
*       3 OR 4 WORDS CONTAINING THE BUFFER ADDRESS(WORD 1), 
*       LENGTH(WORD 2) AND TRACK/SECTOR(WORD 3 OR IF SIGN 
*       BIT IS SET ON WORD 3 THEN IT IS THE SECTOR (THE SIGN
*       IS STRIPED) AND WORD FOUR IS THE TRACK) ADDRESS FOR 
*       EACH TRANSFER. THE GROUP OF TRANSFER VECTORS IS 
*       OPEN-ENDED AND IS TERMINATED BY A ZERO-WORD.
*       ALL TRANSFERS ARE MADE BEFORE A COMPLETION
*       RETURN TO <CIC> IS MADE.
      SKP 
RWSUB NOP           READ/WRITE    ROUTINE   ENTRY 
*                     E  =  0    WRITE
*                     E  =  1    READ 
* 
*                   B    =       BUFFER ADDRESS 
*                   A    =    -LENGTH IN WORDS
* 
* 
* 
      STB UBUF      SAVE BUFFER ADDRESS.
      STA LN.N      SAVE LENGTH 
      LDB TRACK     GET THE TRACK AND 
      BLF,BLF       COMBINE WITH
      ADB UNIT      THE UNIT
      CPB LTRUN     SAME AS IN LOCAL BUFFER?
      LDB BM10      YES;  B_-8. 
      LDA HDSC      CHECK THE HEAD SECTOR 
      CPA LHDSC     SAME AS IN LOCAL BUFFER?
      INB           YES;  !_B+1 
      LDA LN.N      UNDER 129 WORDS 
      SEZ,RSS       IF WRITE
      JMP WRT1      GO DO WRITE TESTS 
* 
      ADA D128      REQUESTED?
      CPB BM7      ALL CONDITIONS MET?
      SSA           MET?
      JMP RD2       NO; GO READ 
* 
      LDA LBUFA     YES; SET FOR MOVE 
      CPA UBUF      IF DATA IS WANTED IN LOCAL
      JMP CLE       BUFFER CLE AND RETURN 
* 
      STA LBUFP     SET UP FOR
      LDA LN.N      MOVE
      LDB UBUF
      JSB MOVE      AND MOVE DATA 
CLE   CLE           SET E FOR CONTINUATION
      JMP RWSUB,I   RETURN
* 
B40   EQU CLE 
* 
* 
* 
RD2   LDB UBUF      READ; TO LOCAL
      CPB LBUFA     BUFFER? 
      STA LHDSC     SHOW LOCAL SECTOR BUFFER ENPTY
WRT1  SSB,RSS       IF SAME TRACK 
      JMP WRIT      DIFFERENT TRACK SKIP
* 
      ADA D128      AND REQUEST TO WRITE MORE THAN 128
      CLE,SSA,RSS   WORDS OR
      CPB BM7       TO WRITE ON LOCAT SECTOR
      STB LHDSC     YES; SET TO SHOW NONE IN
WRIT  LDA TRACK     SET FOR SEEK
      JSB SEEK      SEEK RECORD 
      LDB RDCM      GET THE READ COMMAND
      SEZ,CME,RSS   READ? 
      LDB WRCM      NO - USE WRITE COMMAND
      ADB UNIT      SET UNIT BITS 
CLCC5 CLC CMND      PRESET THE COMMAND CHANNEL
OTBC2 OTB CMND      SEND COMMAND TO THE CONTROLLER
      LDB UBUF      GET BUFFER ADDRESS
      SEZ,RSS 
      ADB ADDCM     AND SET DIRECTION BIT 
STFD  STF DATA      SET UP THE INTERFACE
      SSB           FOR THE 
STCD1 STC DATA,C    TRANSFER
      LDA DMAC      GET THE DMA CONTROL WORD
DMASW NOP           DMA SWITCH NOP IF CHAN #6 ELSE RSS
      JMP CHAN6     CHANNEL SIX; GO DO IT.
* 
      OTA 7         CHANNEL 7; SEND CONTROL WORD
      CLC 3         SET FOR BUFFER
      OTB 3         SEND BUFFER ADDRESS 
      LDA LN.N      GET LENGTH
      STC 3         SET FOR LENGTH
      OTA 3         SEND IT.
      STC 7,C       START DMA 
STCC1 STC CMND,C    START DISC
      CLC 7         INHIBIT DMA INTERRUPT 
      JSB WAITI     GO WAIT FOR INTERRUPT 
      STF 7         FOURCE DMA COMPLETION 
      LIA 3         SAVE DMA RESIDUE. 
      JMP CHAN7     GO TO DO STATUS 
* 
CHAN6 OTA 6         CHANNEL SIX;
      CLC 2         SAME
      OTB 2         IDEA
      LDA LN.N      AS
      STC 2         ABOVE.
      OTA 2 
      STC 6,C 
STCC2 STC CMND,C
      CLC 6 
      JSB WAITI 
      STF 6 
      LIA 2 
* 
CHAN7 JSB STAT      DO STATUS 
      JMP WRIT      ERROR; RETRY
* 
      LDA UBUF      WAS XFER TO LOCAL BUFFER
      CPA LBUFA     ? 
      RSS 
      JMP RWSUB,I   NO; RETURN
* 
      LDA HDSC      UPDATE THE
      STA LHDSC     LOCAL BUFFER
      LDA TRACK     GET THE CURRENT TRACK 
      ALF,ALF       TO HIGH A 
      ADA UNIT      COMBINE WITH UNIT 
      STA LTRUN     SET TRACK/UNIT WORD 
      JMP RWSUB,I   RETURN
* 
* 
TRACK NOP 
DMAC  OCT 120000
HDSC  NOP 
LHDSC OCT -1
LTRUN NOP 
LN.N  NOP 
UBUF  NOP 
RDCM  OCT 20000     READ COMMAND
WRCM  OCT 10000     WRITE COMMAND 
D128  DEC 128 
BM7   OCT -7
* 
* 
* 
SEEK  NOP           SEEK ROUTINE
*                                   1. SEEK RECORD WHOSE TRACK IS 
*                                      IN A, UNIT HDSC
*                                   2. KEEP LAST TRACK FLAG AND 
*                                      DO ADDRESS RECORD IF SAME
*                                      TRACK/UNIT.
CLCC2 CLC CMND      CLEAR COMMAND.
OTAD1 OTA DATA      SEND CYLINDER NO. 
STCD2 STC DATA,C    TO DATA CARD. 
      LDB UNIT      GET THE UNIT
      ADB LSTB      ADD THE LAST SEEK TABLE ADDRESS 
      STB CYL       SAVE THE LAST SEEK ADDRESS
      LDB SEEKC     GET THE SEEK COMMAND
      CPA CYL,I     SAME AS LAST TIME?
      ADB ADDCM     YES ADD THE ADDRESS COMMAND BIT 
      ADB UNIT      SET UNIT BITS 
OTBC1 OTB CMND      SEND COMMAND
STCC3 STC CMND,C    START SEEK
      STA CYL,I     SET LAST SEEK FLAG FOR NEXT TIME
      SWP           WAIT  SERVAL MORE CYCLES
      LDB HDSC      GET THE HEAD AND SECTOR 
SFSD1 SFS DATA      DATA READY? 
      JMP NRERR     NO; TAKE NOT READY EXIT 
* 
OTBD1 OTB DATA      SEND HEAD/SECTOR INFO 
STCD3 STC DATA,C    TELL CONTROLLER 
      JMP SEEK,I    RETURN
* 
SEEKC OCT 30000     SEEK COMMAND
LSTB  DEF *+1       ADDRESS OF LAST SEEK TABLE
      OCT -1,-1,-1,-1 
CYL   NOP           ADDRESS OF LAST SEEK FLAG FOR CURRENT UNIT. 
* 
* 
IGNOR STA EQT15,I   ZERO TIME OUT 
      JSB STATW     DO STATUS 
      JMP IGNO2     IGNOR THE RESULT
* 
* 
* 
* 
*                              WAITI SUBROUTINE 
*                                A: SAVE E
*                                B. IF FIRST EXIT SEND ACCEPT CODE
*                                C. ELSE DO CONTINUATION RETURN 
*                                D. ON INTERRUPT SAVE RETURN
*                                    ADDRESS
*                                E. NOT INTERRUPT FOR NEXT ENTRY
*                                F. RESTOR E AND RETURN 
WAITI DEF IGNOR 
      ELB           B_E 
      STB MOVE      SAVE E
      CLA           SET A FOR OPERATION INITIATED 
      STA RTNCD     SET RETURN CODE TO SHOW COMPLETION AFTER INTERRUPT
IGNO2 ISZ C.XX      STEP TO CONTINUATION RETURN 
      JMP C.XX,I    RETURN TO RTIOC 
* 
* 
* 
C.XX  NOP           INTERRUPT ENTRY FROM RTIOC
      LDB MOVE      RESTORE E-REG.
      ERB 
      JMP WAITI,I   RETURN TO CONTINUE PROSSING 
* 
RTNCD OCT 4 
ADDCM OCT 100000
HEAD  NOP 
UNIT  NOP 
* 
* 
* 
*                                   STATUS CHECK SECTION
*         STATUS SHOULD BE RETURNED IMMEDIATELY.
*         IF IT IS NOT A NOT READY RETURN IS MODE 
*         THE ERROR COUNTER IS RESET FOR EACH CORRECT 
*         STATUS. 
*         THE STATUS WORD IN THE E QT IS SET AS FOLLOWS 
*                   0 - ANY ERROR 
*                   1 - DATA ERROR
*                   2 - SEEK CHECK (ADDRESS A NON-EXISTANT TRACK) 
*                   3 - FLAGGED CYLINDER (3 AND 4 IMPLIES DEFECTIVE)
*                   4 - ADDRESS ERROR (3 ALONE IMPLIES WRITE PRO.)
*                   5 - END OF TRACK (DATA TOO LONG)
*                   6 - NOT READY (POWER, SERVO, MECHANICAL)
* 
* 
*         A WRITE PROTECT OR FLAGED CYLINDER ERROR WILL 
*                   FOURCE A PARITY ERROR RETURN
*         NOT READY WILL FOURCE A NOT READY RETURN
* 
*         OVERRUN WILL FORCE THE STATUS ROUTINE TO RETRY
*              THE TRANSFER AN INFINITE # OF TIMES. 
* 
*         OTHER ERRORS WILL CAUSE THE STATUS ROUTINE TO 
*              RETRY THE TRANSFER UP TO TEN TIMES.
* 
* 
STAT  NOP 
      STA SEEK      SAVE DMA RESIDUE. 
      JSB STATW     DO STATUS COMMAND 
      STA STATW     SAVE THE STATUS 
      AND B377      MASK TO 8 BITS
      IOR B         IN WITH THE NEW 
      STA EQT5,I    SET IT IN THE TABLE.
B30   SLA,ALS       ANY ERRORS
      JMP ANALZ     YES; GO ANALIZE 
* 
      LDA SEEK      GET DMA RESIDUE AND 
      CME,SZA        RETRY IF NONZERO.
      JMP STAT,I
      ISZ STAT      NO; 
      LDB BM12
      STB ERCTR     RESET COUNTER 
RTRY  CME 
      JMP STAT,I    RETURN
* 
* 
STATW NOP           CORE STATUS ROUTINE 
CLCC3 CLC CMND      CLEAR THE CHANNEL 
STCD4 STC DATA,C    SET UP DATA CHANNEL.
      LDB UNIT      SEND DRIVE UNIT 
LIAC1 LIA CMND      GET THE ATTENTION BITS IF ANY 
      SZA,RSS       ANY SET ??
      JMP OTBC3     NO GO USE THE CURRENT UNIT
* 
      CLB           YES  SET TO FIND IT 
ULOOP SLA,RAR       TEST THE BITS 
      JMP OTBC3     FOUND ONE GO DO IT
* 
      INB           STEP B AND
      JMP ULOOP     GO TRY AGAIN
* 
OTBC3 OTB CMND      TO COMMAND CHANNEL. 
STCC5 STC CMND,C    START STATUS. 
      LDA EQT5,I    GET STATUS WORD 
      AND B1774     OUT WITH THE OLD
      SWP B         SAVE IN B(ALSO DELAY).
SFSD2 SFS DATA      IF NOT BACK 
      JMP NRERR     THEN GO TO NOT READY. 
* 
LIAD1 LIA DATA      GET STATUS. 
      RAL,ARS       SET 15 IF 14 IS SET 
      SSA,RSS       FIRST STATUS??
      JMP STATW,I   RETURN TO ANALIZE STATUS
* 
      STA LHDSC     SHOW NO SECTOR IN CORE
      LDB I.XX      WAS THE DRIVER DOWNED BY US?? 
      SZB,RSS       YES IF ZERO SO
      JMP $UPIO     GO UP IT
* 
      LDB RTNCD     WHO HAS CONTROL?
      SZB,RSS       IGNORE IF C.XX ENTRY
      JMP IGNO2     ELSE IGNOR THE INTERRUPT
* 
      LDA SEEKC     ELSE SET UP CONTROLER FOR 
OTAC2 OTA CMND      ANOTHER STATUS
STCC6 STC CMND,C    AND THEN
      JMP CLCC3     GO REDO THE STATUS
* 
* 
ANALZ LDB STATW     GET THE SAVED STATUS WORD 
      RBR,BLR       CLEAR SIGN AND LEAST BITS 
      CPB B10       IF WRITE PROTECT
      RSS           OR
      CPB B30       BAD CYLINDER FLAG SET 
      JMP PARER     ISSUE PARITY ERROR
* 
      LSR 6         IF NOT
      SLB,RBR       READY?
      JMP NRERR     ISSUE NOT READY ERROR.
* 
* 
*     IT MAY BE POSSIBLE TO RECOVER 
*     SO RETRY
* 
* 
      ALF,SLA       IF STILL SEEKING
      JMP SKCK1     GO WAIT FOR ATTENTION 
* 
      CPB B100      IF OVERRUN, THEN
      JMP RTRY       TRY AN INFINITE # OF TIMES.
* 
      ISZ ERCTR     STEP COUNT
      CLA,CME,RSS   IF NOT LAST RETRY SKIP
      JMP PARER     ELSE ISSUE PARITY ERROR 
* 
      ISZ CYL,I 
      RBR,SLB       SEEK CHECK??
      JMP STAT,I    YES RETRY NOW 
* 
      JSB SEEK      SEEK 0
SKCK1 JSB WAITI     GO WAIT FOR INTERRUPT 
      JSB STATW     DO CORE STATUS REQUEST
      JMP STAT,I    TAKE RETRY EXIT.
* 
B400  OCT 400 
B1774 OCT 177400
B377  OCT 377 
BM12  OCT -12 
ERCTR OCT -12 
D202  DEC 202 
EQT#  DEC 1         SET ON FIRST ENTRY
* 
* 
NRERR CLA,INA       NOT READY -SET A=1 -POST INTERRUPT
      CLB           SET BEEN
      STB I.XX      HERE FLAG 
      LDB RTNCD     GET THE RETURN CODE 
      SZB,RSS       IF ZERO DO COMPLETION EXIT
      JMP COMEX 
* 
      ISZ C.XX
PARER LDA B3          A_3 ERROR RETURN
COMEX LDB EQT9,I    COMPLETION RETURN 
      STA RTNCD     SET THE RETURN CODE 
      JMP NRRTN     AND TAKE THE CENTRAL EXIT 
* 
* 
B3    OCT 3 
LBUFA DEF BUF 
BUFA  EQU LBUFA 
* 
* 
MOVE  NOP           MOVE SUBROUTINE 
*                                   ENTER WITH A = -COUNT 
*                                              B = DESTINATION/SOURCE 
*                                              E = 1 FROM LOCAL BUF 
*                                              E = 0 TO LOCAL BUF 
*                                              LBUFP = LOCAL BUFFER ADD 
*                                                      FOR THIS MOVE
      CMA,INA       SET COUNT POSITIVE
      STA COUNT     SET COUNTER 
      LDA LBUFP     GET LOCAL BUFFER ADDRESS
      SEZ,RSS       IF FROM USER BUFFER 
      SWP           SWAP THE ADDRESSES. 
      JSB .MVW      GO MOVE THE WORDS 
      DEF COUNT 
      NOP 
      JMP MOVE,I    NO; RETURN. 
* 
* 
LBUFP NOP 
COUNT NOP 
      SKP 
*     THE TRIPLET PROCESSOR TAKE SYSTEM OR USER 
*     GENERATED TRIPLETS AND TRANSLATES THEM
*     INTO READ, WRITE, AND MOVE REQUESTS 
* 
*     CALLING SEQUENCE: 
* 
*     EQT8   NEG REQUEST LENGTH IN WORDS
*     EQT9   SYSTEM TRACK NUMBER (NOT ACTUAL) 
*     EQT10  SYSTEM SECTOR NUMBER (NOT ACTUAL)
*     EQT11  REQUEST BUFFER ADDRESS. (SIGN BIT SET FOR READ)
* 
* 
*     $TB30  IS UESE TO TRANSLATE THE SYSTEM TRACK TO 
*            AN ACTUAL UNIT AND CYLINDER NUMBER.
*            THE FORMAT IS: 
* 
*            WORDS 1 TO 8 THE NUMBER OF TRACKS ON 
*                              UNITS 0-7
*            WORDS 9 TO 16 THE FIRST TRACK ON UNITS 
*                                      0-7
*     CONSTANTS FOR TIPLT 
* 
BM10  OCT -10 
TB31A DEF TBXX
MXSIZ NOP           MAX NO OF WORDS PER TRACK 
* 
* 
* 
* 
TIPLT DLD EQT9,I    GET TRACK AND SECTOR ADDRESSES
      SSA,RSS       IF EITHER IS NEGATIVE 
      SSB           THEN
      JMP REJCT     GO REJECT THE CALL
* 
      RRL 6         SECTOR * 64 
      CMB,INB       SET NEGATIVE
      ADB EQT8,I    ADD THE NO OF WORDS IN XFER 
      ADB MXSIZ     SUBTRACT FROM MAX WORD COUNT
      SSB           TRACK WRAP AROUND?
      JMP REJCT     YES GO REJECT THE REQUEST 
* 
      LDA BM12      SET ERROR COUNTER 
      STA TPER      FOR 10 TRIES
TIPRT LDA SUBCH     GET THE SUBCHANNEL
      ADA TB31A     ADD THE TABLE ADDRESS 
      LDB A,I       GET THE FIRST TRACK TO B
      ADB EQT9,I    ADD THE ADDRESSED TRACK 
      STB TRACK     SAVE THE TRACK ADDRESS
      ADA B10       STEP TO THE NUMBER OF TRACKS ADDRESS
      LDB A,I       GET THE NUMBER OF TRACKS
      LDA B         SET IN B FOR POSSIBLE REJECT
      CMA,INA       NEGATE THE NUMBER 
      ADA EQT9,I    ADD THE ADDRESSED TRACK NUMBER
      SSA           IF POSITIVE THE ERROR 
      JMP TIP0      NEGATIVE SO OK - CONTINUE 
* 
      LDA EQT5,I    SET THE 
      IOR B40       END OF TAPE BIT IN THE STATUS 
      STA EQT5,I    EQT STATUS WORD 
      JMP NRRTN     EXIT ERROR
* 
TIP0  LDB EQT8,I    BRING IN THE
      STB TPLN      LENGTH
      LDB EQT11,I   AND THE 
      STB TPBUF     BUFFER ADDRESS
      LDB SUBCH     GET THE SUBCHANNEL
      CLA,CLE       SET A FOR AN ODD SUBCHANNEL 
      SLB,RSS       IF EVEN 
      INA           RESET A FOR HEAD 2
      LDB EQT10,I   GET THE 
      BRS           ACTUAL SECTOR 
      STB MOVE      YES SAVE
      ADB NSEC      IS IT ON THE ODD
      SSB,RSS       SIDE OF THE DISC
      STB MOVE      YES RESET 
      ELA           MOVE IN THE SECOND HEAD BIT 
      ALF,ALF       ROTATE HEAD TO BITS 8-9.
      STA HEAD      SET HEAD WORD 
      ADA MOVE      ADD THE SECTOR
      STA HDSC      SAVE FOR ADDRESS
      STA CHDSC     AND FOR CYCLICK CHECK.
* 
* 
      LDA TPLN     PRESET A FOR EVEN SECTOR 
      LDB EQT10,I   GET SECTOR
      CCE,SLB,RSS   IF EVEN 
      JMP TPNXT     JUMP
* 
      LDB BUFA      ELSE READ 
      LDA DM128     128 WORDS TO
      JSB RWSUB     LOCAL BUFFER
      LDA HLBUF     SET MOVE BUFFER 
      STA LBUFP     ADDRESS 
      LDB TPLN      GET LENGTH
      ADB B100      LESS 64 
      LDA TPLN      USE MIN OF REQUEST
      CLE,SSB                AND
      LDA BM100                  6 4
      LDB TPBUF     GET ADDRESS 
      ELB,RBR       CLEAR SIGN & SET READ/WRITE 
      JSB MOVE      GO MOVE THE WORDS.
      LDA DM128     SET TO WRITE
      LDB BUFA      THE SECTOR
      SEZ,RSS       WRITE REQUEST?
      JSB RWSUB     YES; WRITE IT OUT.
      LDA BM100     UP DATE POINTERS
TPA   CMA,INA       TO REFLECT
      STA MOVE      LAST TRANSFER 
      ADA TPBUF       ADJUST BUFFER ADDRESS 
      STA TPBUF 
      LDA MOVE
      ADA B100      ROUND UP THE COUNT
      CLB           CLEAR B FOR SHIFT 
      LSR 7         SHIFT TO GET SECTOR COUNT 
      ADA HDSC      ADD TO THE CURRENT SECTOR 
      STA HDSC      SAVE FOR NEXT ACCESS
      AND B377      MASK TO SECTOR ONLY 
      ADA NSEC      SIDE TWO? 
      IOR HEAD      SET UP THE HEAD BITS
      IOR B400      SET SIDE TWO BIT
      SSA,RSS       IF SIDE TWO 
      STA HDSC      RESET THE HEAD SECTOR ADDRESS 
      LDA TPLN      GET THE LENGTH
      ADA MOVE      SUBTRACT THE NUMBER XFERED
      CLE,SSA,RSS   IF NONE LEFT CHECK
      JMP CYCK      FOR CYCLIC CHECK
* 
      STA TPLN      SAVE LENGTH 
TPNXT LDB TPBUF    GET BUFFER ADDRESS 
      CLE,SSB       READ? 
      JMP TPRD      YES; GO TRANSFER REST OF RECORD 
* 
      ADA B100      NO; MORE THAN 64 WORDS LEFT 
      CCE,SSA,RSS   ? 
      JMP TPB       NO; GO TRANSFER LAST WORDS
* 
      LDA TPLN      YES; TEST FOR MORE THAN LESS THAN 
      AND B100      64 WORDS MOD 128 LEFT 
      STA B         SAVE FLAG 
      ADA TPLN      GET LENGTH TO SET FOR X-FER 
      CLE,SZB       IF LESS THAN 64 MOD 128 LEFT
      AND DM128    DELETE EXCELL OVER EVEN SECTORS
      LDB TPBUF     GET BUFFER ADDRESS
TPRD  ELB,RBR       SET READ/WRITE FLAG 
      JSB RWSUB     DO THE TRANSFER.
      LDA LN.N      GET THE LENGTH AND
      JMP TPA       GO UP DATE THE POINTERS 
* 
* 
TPB   LDA DM128    WRITE OF LAST 64 WORD IN 
      LDB BUFA      FIRST HALF OF SECTOR
      STB LBUFP     SET UP
      JSB RWSUB     AND READ THE SECTOR 
      LDA TPLN      SET UP TO 
      LDB TPBUF     MOVE THE USER WORDS 
      JSB MOVE      GO MOVE TO THE BUFFER 
      LDA DM128     WRITE THE BUFFER OUT AGAIN. 
      LDB BUFA      AGAIN 
      JSB RWSUB 
* 
* 
* 
CYCK  LDA EQT6,I    REQUEST FOR CYCLIC
      AND B2002     CHECK 
      CPA B2002     AND WRITE 
      RSS           YES  SKIP 
      JMP EOXF      NO- RETURN
* 
      LDA CHDSC     SET THE HEAD/SECTOR FOR 
      STA HDSC      SEEK
      LDA TRACK     GET TRACK FOR SEEK
      JSB SEEK
      LDB EQT8,I    CALCULATE THE 
      CMB,INB       NUMBER
      LDA EQT10,I   OF
B10   SLA           SECTORS TRANSFERED
      ADB B100      START ODD - ADD 64 TO COUNT 
      ADB B177      ROUND UP TO NEXT HIGHER SECTOR
      LSR 7         SECTOR COUNT TO B 
      LDA CHCKC     GET CHECK COMMAND 
      ADA UNIT      SET UNIT BITS 
CLCC4 CLC CMND      PRESET THE COMMAND CHANNEL
OTBD2 OTB DATA      SEND SECTOR COUNT 
STCD5 STC DATA,C   TO DATA
OTAC1 OTA CMND      SEND COMMAND
STCC4 STC CMND,C     START CHECK
      JSB WAITI     GO WAIT 
      CLA 
      JSB STAT      DO STATUS 
RSS   RSS           BAD - SKIP
      JMP EOXF      O-K RETURN
* 
      ISZ TPER      STEP COUNTER
      JMP TIPRT     TOO MANY? - NO TRY AGAIN
* 
      JMP PARER     YES; TAKE PARITY ERROR EXIT.
* 
* 
* 
HLBUF DEF BUF+64
TPLN  NOP 
TPBUF NOP 
TPER  NOP 
CHCKC OCT 60000     CYCLIC CHECK COMMAND
CHDSC NOP 
SUBCH NOP 
B100  OCT 100 
DM128 DEC -128
BM100 OCT -100
NSEC  NOP 
B7    OCT 7 
* 
* 
REJCT CLA,INA       ILLEGAL CALL SO REJECT
      JMP I.XX,I    IT
      SKP 
*                   INITIATOR ENTRY POINT 
I.XX  NOP 
      JMP CONFI     CONFI CLEARS THIS WORD
* 
      LDA RSS       SET UP
      LDB CHAN      THE DMA 
      SLB,RSS       CHANNEL 
      CLA           SWITCH
      STA DMASW     NOP IF CHANNEL 6, RSS IF 7. 
      CCA 
      ADA I.XX      SET RETURN
      STA C.XX      ADDRESS 
      LDA B4        SET THE RETURN CODE 
      STA RTNCD 
      LDA EQT4,I    GET THE UNIT
      RRR 6         FROM THE EQT
      AND B7        MASK TO UNIT NUMBER 
      STA SUBCH     SET THE SUBCHANNEL
      CLE,ERA       SHIFT TO THE UNIT 
      STA UNIT      SET THE UNIT
      JSB STATW     CHECK TO MAKE SURE DISC IS READY
      RRR 6         SHIFT THE READY BIT 
      SLA           READY?? 
      JMP NRERR     NO GO TAKE NOT READY EXIT 
* 
      LDA EQT6,I    GET AND ISOLATE 
      AND B3        THE REQUEST 
      CPA B3        CONTROL?
      CLA,INA,RSS   YES; SET FOR REJECT AND SKIP
      JMP OK        NO; CONTINUE
* 
      JMP NRRTN     GO NOT READY REJECT.
* 
OK    LDA BM12      RESET 
      STA ERCTR     THE ERROR COUNTER 
      LDA EQT6,I    GET THE REQUEST CODE
SYS2  LDB EQT7,I    GET BUFFER ADDRESS
      SSA           SYSTEM REQUEST? 
      JMP SYS       YES; GO DO SYSTEM THING.
* 
LNTS  LDA EQT6,I    GET THE CON WORD AGAIN
      RAR,CLE,ELA   SET READ WRITE BIT
      RBL,ERB       SET SIGN OF BUFFER ADDRESS TO SHOW DIRECTION
      STB EQT11,I   AND SAVE FOR TIPLT CALL 
      LDA EQT8,I    GET THE LENGTH. 
      STA EQT12,I   SAVE FOR EXIT 
      SSA,RSS       MAKE NEGATIVE 
      CMA,INA,RSS    WORDS
      ARS           AND 
      STA EQT8,I    SAVE
B2002 SZA           IF ZERO SKIP CALL 
      JMP TIPLT     CALL FOR X-FER
* 
EOXF  LDA EQT6,I    GET REQUEST CODE
      SSA           SYSTEM
      JMP SYS2      YES; GO GET NEXT TRIPLET
* 
DONE  LDB EQT12,I   NO; DONE; GET TLOG
      CCE,SSB       SET POSITIVE
      CMB,INB       IF NEG. 
NRRTN LDA DIGNO     GET THE DUMMY INTERRUPT ADDRESS 
      STA WAITI     AND SET IT. 
      LDA RTNCD     GET RETURN CODE (0 OR 4)
      CPA B4        IF 4
      ISZ C.XX      BUMP RETURN (DID -1 ON IT ABOVE)
      JMP C.XX,I    ELSE JUST EXIT
* 
DIGNO DEF IGNOR 
* 
SYS   STB MOVE      SYSTEM TRIPLET PROCESSOR
      INB           STEP TO THE ADDRESS OF
      LDA B,I       LENGTH AND STORE IT IN
      STA EQT8,I    THE EQUIPMENT TABLE 
      INB           STEP TO THE DISC ADDRESS
      LDA B,I       GET THE ADDRESS 
      RAL,CLE,SLA,ERA IF SIGN BIT SET THEN
      INB,RSS       THIS IS A PURE SECTOR ADDRESS 
      AND B177      MASK THE SECTOR AND 
      STA EQT10,I   AND SET IT IN THE EQT 
      XOR B,I       GET THE TRACK ADDRESS 
      ALF,ALF       ROTATE TO LOW A 
      RAL 
      SEZ           IF FULL WORD TRACK
      LDA B,I       USE FULL WORD 
      STA EQT9,I    AND SET IN THE EQT
      INB           STEP TO ADDRESS OF NEXT TRIPLET 
      STB EQT7,I    AND SET IT IN THE EQT 
      LDB MOVE,I    GET THE BUFFER ADDRESS
      SZB           IF ZERO THEN DONE 
      JMP LNTS      GO DO THE TRANSFER. 
* 
* 
      LDA RTNCD   GET THE RETURN CODE 
      SZA,RSS       IF ZERO-
      JMP DONE      GO RETURN 
* 
      LDA UNIT      GET THE 
      ADA LSTB      LAST TRACK SEEKED ON
      LDA A,I       THE CURRENT UNIT AND
      JSB SEEK      SEEK SAME CYL.
      JSB WAITI     GO WAIT FOR A INTERRUPT 
      JMP DONE      EXIT
* 
* 
B4    OCT 4 
B177  OCT 177 
      SKP 
BUF   BSS 128 
LN    EQU * 
      ORG BUF 
CONFI STA B         SAVE THE SELECT CODE
      IOR OTA       CONFIGURE 
      STA OTAD1     ALL 
      XOR B4000     THE 
      STA OTBD1     I/O 
      STA OTBD2     INSTRUCTIONS
      XOR B5100 
      STA STCD1 
      STA STCD2 
      STA STCD3 
      STA STCD4 
      STA STCD5 
      XOR B5000 
      XOR B4400 
      STA SFSD1 
      STA SFSD2 
      XOR B0600 
      STA LIAD1 
      XOR B0400 
      STA STFD
      XOR B221. 
      STA DMAC
      INA           NOW THE COMMAND CHANNEL 
      XOR B226. 
      STA OTAC1 
      STA OTAC2 
      XOR B4000 
      STA OTBC1 
      STA OTBC2 
      STA OTBC3 
      XOR B5100 
      STA STCC1 
      STA STCC2 
      STA STCC3 
      STA STCC4 
      STA STCC5 
      STA STCC6 
      XOR B5000 
      STA CLCC2 
      STA CLCC3 
      STA CLCC4 
      STA CLCC5 
      XOR B4200 
      STA LIAC1 
      CLB           FIND
      LDA EQTA      THE EQT 
      CMA,INA       NUMBER
      ADA EQT1      FOR THE UP REQUEST
      DIV .15 
      INA           AND 
      STA EQT#      SET IT
      CLA           CLEAR THE JUMP TO 
      STA I.XX+1    THIS ROUTINE
      LDA TB31B     GET THE ADDRESS OF THE TABLE ADDRESS
      LDA A,I       GET THE ADDRESS 
      RAL,CLE,SLA,ERA 
      JMP *-2       STIL INDIRECT GO GET NEXT LEVEL 
* 
      LDB A,I       GET THE FIRST WORD OF THE TABLE 
      CMB,SSB,INB,RSS  SET POSITIVE IF NEG  SKIP IF IT WAS POSITIVE 
      INA,RSS       IT WAS NEGATIVE SO STEP THE TABLE ADDRESS 
      LDB SECTR     IT WAS POSITIVE SO USE THE BASE PAGE SECTOR COUNT 
      STA TB31A     SET THE TABLE ADDRESS 
      BRS,BRS       ADDJUST TO NO. SECTORS PER SIDE 
      CMB,INB       SET NEGATIVE AND
      STB NSEC      SET FOR THE DRIVER
      CMB,INB       FIND THE
      BLF,BLF       MAX NO
      STB MXSIZ     OF WORDS PER TRACK AND SET
      JMP I.XX+1
* 
TB31B DEF TB31A     ADDRESS OF THE TABLE ADDRESS
OTA   OTA 0 
B221. OCT 22100 
B226. OCT 22600 
B4000 OCT  4000 
B5100 OCT  5100 
B5000 OCT 5000
B4400 OCT 4400
B0600 OCT  0600 
B0100 OCT  0100 
B0400 OCT 0400
B4200 OCT 4200
.15   DEC 15
TEST  EQU LN-*      ERROR HERE MEANS THE CONFIGURE ROUTINE
*                                   I TOO LONG. 
.     EQU 1650B 
EQTA  EQU . 
EQT1  EQU .+8 
EQT4  EQU EQT1+3
EQT5  EQU EQT1+4
EQT6  EQU EQT1+5
EQT7  EQU EQT1+6
EQT8  EQU EQT1+7
EQT9  EQU EQT1+8
EQT10 EQU EQT1+9
EQT11 EQU EQT1+10 
EQT12 EQU .+81
EQT15 EQU .+84
CHAN  EQU .+19
I.31  EQU I.XX
C.31  EQU C.XX
CMND  EQU 0 
DATA  EQU 0 
A     EQU 0 
B     EQU 1 
SECTR EQU .+71
LNPG  EQU LN        DRIVER LENGTH 
      END 
                          