ASMB,Q,C,N
* 
      HED DVA32    12821 (HPIB) RTE DISC DRIVER 
*    HPIB DISK DRIVER  WITH SPECIALS
*     NAME:   DVA32 
*     SOURCE: 92060-18553 
*     RELOC:  92060-16553/92067-16506 
*     PGMR: 
*             J.S.W. -- NEW TRACK MAP FORMAT
*             J.R.S. -- DMA CONFIG...9895 FIRST STATUS CLEAR
* 
*  ***************************************************************
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1979.  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.       *
*  ***************************************************************
* 
      IFN 
      NAM DVA32,0  92067-16553 REV.2013 800129
      XIF 
      IFZ 
      NAM DVC32,0  92067-16506 REV.2013 800129
      XIF 
* 
* 
*     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. 
* 
*      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.
* 
* 
* 
**************************************************************************
* 
* CONTROL REGISTER FORMAT FOR 12821 HPIB CARD 
* 
* 15  14  13  12  11  10  9   8   7   6   5   4   3   2   1   0 
* 
* SRQ IFC REN IRL LBO LBI EOI ATN X   NRD PPE P/E P   L   T   CIC 
* 
**************************************************************************
* 
      IFN 
      ENT IA32,CA32 
      EXT $TA32,.MVW,$UPIO
      XIF 
      IFZ 
      ENT IC32,CC32 
      EXT $TC32,.MVW,$UPIO
      XIF 
* 
* 
A     EQU 0         A REGISTER
B     EQU 1         B REGISTER
.     EQU 1650B     BASE PAGE ORIGIN
EQTA  EQU . 
EQT1  EQU .+8         I/O R QUEST LIST POINTER
EQT2  EQU .+9        INITIATION SECTION ADDRESS 
EQT3  EQU .+10       COMPLETION SECTION ADDRESS 
EQT4  EQU .+11       I/O ASSIGNMENT 
EQT5  EQU .+12       DEVICE STATUS INFO 
EQT6  EQU .+13       I/O REQUEST INFO 
EQT7  EQU .+14       REQUEST BUFFER ADDRESS 
EQT8  EQU .+15       REQUEST BUFFER LENGTH
EQT9  EQU .+16       REQUEST TRACK #
EQT10 EQU .+17       SECTOR # 
EQT11 EQU .+18       DRIVER TEMP
EQT12 EQU .+81       XMIT LOG 
EQT13 EQU .+82      NOT USED
EQT14 EQU .+83      TIME-OUT VALUE SET BY USER OF RTGEN 
EQT15 EQU .+84      TIME-OUT CLOCK
* 
IBI   EQU 26B       SELECT CODE FOR IBI CARD
* 
CHAN  EQU .+19      DMA CHANNEL 
* 
INTBA EQU 1654B 
DUMMY EQU 1737B 
*  IF REQ TRACK > LAST TRACK IN SUB OR  -1 AND READ 
*         RETURN LAST TRACK AND SECTOR PER TRACK
* 
* SYSTEM TRIPLET FORMAT (XSIO CALL):
* 
*  1ST WORD - REQ BUFFER ADDRESS
*  2ND      - LENGTH
*  3RD      - TRACK/SECTOR
*  TERMINATED BY 0
* 
* 
* 
      SKP 
* 
I.34  DEC -1       -1 MEANS NO IO IN PROGRESS 
      STA SCODE     SAVE DEVICE CODE
      JMP CONFI     CONFIGURE SELECT CODR AND I/O 
      LDA CHAN      GET DMA CHANNEL # 
      ADA STF       COFIGURE STF DMA
      STA STFD      SET STF DMA 
      ADA B500
      STA OTAD      CONFIGURE ALL DMA INSTRUCTIONS
      XOR B1100 
      STA STCDC     START DMA INSTRUCTION 
      XOR B5000 
      STA CLCD      INHIBIT DMA INTERRUPT INSTR 
      STA CLCD1     INHIBIT DMA INTERRUPT INSTR 800114 JRS
      XOR B4
      STA CLCD2 
      XOR B4000 
      STA STCD2 
      XOR B100
* 
      STA OTAD2 
      STA OTAD3 
      ADA BM100 
      STA LIAD2 
* 
*********************************************** 
*   NOW SET UP EXIT FLAGS AND RETURN ADDRESS
* 
**********************************************
* 
      CLA           A=0 => I.XX 
      STA XFLAG     INDICATE EXIT FLAG
      STA TFLAG     CLEAR TIME OUT FLAG 
* 
      LDA I.34      GET RETURN ADDRESS
      STA C.34     SET IT 
* 
* SET UP TB34 ENTRY ADDRESS AND CHECK FOR ILLEGAL SUBCHANNEL #
* 
* 
      LDA EQT4,I    GET UNIT AND CHANNEL #
* IF DMA    NOT ASSIGNED REJECT CALL****
* (MAY NOT NEEDED)
* 
      SSA,RSS       DMA BIT (15) SET? 
      JMP REJCT     NO DMA, REJECT
      IOR BIT12     ENABLE TIME-OUT FOR DRIVER
      STA EQT4,I    SET IT
      RRR 6         BITS 6-10 HAS UNIT #
      AND B37       EXTRACT UNIT #
      STA B         SAVE IN B 
      STA SUBC#     SAVE SUBCHANNEL#
      ADB TB34A,I   NEG SUBC# 
      SSB,RSS       IF POSSITIVE
      JMP REJCT     REJECT
* 
* 
* 5 WORD PER ENTRY
* 
      MPY B5
      STA .SUBC     SAVE SUBCHANNEL ENTRY ADDRESS 
* 
* 
      LDA EQT6,I    GET REQUEST CODE
      AND B3        BIT 0 & 1 HAS ICODE 
      CPA B3        CONTROL REQUEST?
      JMP $CNTL     CONTROL REQ 
* 
      STA REQC      SAVE REQ CODE 
      LDA BM12      RESET COUNTER 
      STA ERCTR     ERROR RETRY COUNTER 
* 
* 
* 
      LDA EQT6,I    GET REQUEST CODE
SYS2  LDB EQT7,I    GET BUFFER ADDRESS
      SSA           SYSTEM CALL?
      JMP SYS       YES  GO DO SYSTEM CALL
* 
* 
LNTS  LDA EQT6,I    GET REQ CODE
      RAR,CLE,ELA   SET 
      RBL,ERB       SIGN OF BUFFER ADDRESS TO SHOW DIRECTION
      STB EQT11,I   AND SAVE FOR TRIPLT CALL
* 
      LDA EQT8,I    GET XFER LENGTH 
      STA EQT12,I   SET IT FOR RETURN 
      SSA,RSS       MAKE IT NEGATIVE WORD COUNT 
      CMA,INA,RSS 
      ARS           IF CHAR COUNT, TAKE HALF
      STA EQT8,I    SET IT UP FOR READ/WRITE
      SZA           CHECK FOR ZERO XFER 
      JMP TIPLT     GO PROCESS $TB34 OR SYSTEM TRIPLET
* 
EOXF  LDA EQT6,I    GET REQ CODE
      SSA           SYYTEM CALL?
      JMP SYS2      YES 
SYRTN JSB ENDCM     SEND END COMMAND
.RTN. LDB EQT12,I   GET XMIT LOG
      CCE,SSB       SET TO POSITIVE 
      CMB,INB       IF NEGAIVE
      JMP DONE      NO,RETURN 
**********************************************************
* 
*      CONTROL REQUEST: 
*       SUBFUNCTION=0 =>  PROGRAM ABORTND SEND IFC
*                         UNADDRESS DEVICE AND IFC
*                  NOT=0=> IGNORE, RETURNS IMMEDIATELY
* 
* 
**********************************************************
* 
MASK7 OCT 77774     MASK FOR BITS 3 TO 14 
* 
$CNTL LDA EQT6,I    GET REQUEST CODE & SUBFUNCTION
      AND MASK7     EXTRACT BITS 3-14 
      SZA,RSS       IF ZERO MEANS PROGRAM ABORT 
      JMP CLEAR      CLEAR CARD RETURN
* 
      JSB $UNLS     UNADDRESS DEVICE
CB    LDA IFCTL     SET UP CONTROL REG FOR IFC
      JSB SETC      SET IBI 
CLC08 CLC IBI       CONTROL MODE
LIA01 LIA IBI       GET STATUS
STC08 STC IBI       DATA MODE 
      AND BIT7      GET BIT 7 (IFC) 
      SZA           CLEAR?
      JMP CLC08     NO TRY AGAIN
      CLA           CLEAR FIFO
      JSB CFIFO 
      JMP DONE      IMMEDIATE COMPLETION
* 
IFCTL OCT 40001 
* 
CLEAR JSB CFIFO 
      CLA 
      JSB SETC
      JMP DONE
* 
**********************************************
* 
*    CONSTANT POOL
* 
* 
**************************************************
EQT#  NOP 
B2    OCT 2 
B3    OCT 3 
B4    OCT 4 
B5    OCT 5 
B17   OCT 17
B37   OCT 37
B177  OCT 177 
B377  OCT  377
B500  OCT 500 
B1100 OCT 1100
B5000 OCT 5000
BIT12 OCT 10000     SET BIT 12
BM100 OCT -100
BM12  DEC -10 
B100  OCT 100 
B4000 OCT 4000
BIT11 EQU B4000 
STF   STF 0 
REQC  NOP           REQUEST CODE (1=READ,2=WRITE) 
SCODE OCT 14        SELECT CODE FOR CARD
XFLAG NOP           EXIT FLAG: 0 => I.34, NONZERO => C.34 
      IFN 
TB34A DEF $TA32     ADDRESS OF TRACK MAP TABLE
      XIF 
      IFZ 
TB34A DEF $TC32     ADDRESS OF TRACK MAP TABLE
      XIF 
.TB34 NOP           POINTER FOR SUBCHANNEL ENTRY
TPER  NOP           RETRY  COUNTER
ERCTR NOP 
SECTR NOP           # SECTOR PER TRACK
MXSIZ NOP           # OF WORDS PER TRACK
* 
SUBC# NOP           SUBCHANNEL ENTRY# 
.SUBC NOP           SUBCHANNEL ENTRY ADDRESS
CHDSC NOP 
* 
********************************************************
* 
*    REJECT CALL,RETURN TO RTIOC
* 
********************************************************* 
TEMP  NOP           TEMPORY STORAGE FOR SYSTEM CALL (XSIO)
REJCT EQU * 
      CLA,INA       REJECT CALL,A=1 
      JMP I.34,I    REJECT CALL 
* 
*********************************************************** 
* 
* 
* 
      SPC 5 
SYS   STB TEMP      SYSTEM TRIPLE PROCESSOR 
      INB           STEP TO THE ADDRESS OF
      LDA B,I       LENGTH AND STORE IT IN
      STA EQT8,I    EQT 8 
      INB           STEP TO DISC ADDRESS
      LDA B,I       GET THE ADDRESS 
      RAL,CLE,SLA,ERA IF FOUR WORD ENTRY
      INB,RSS       STEP TO THE TRACK AND SKIP MASK 
      AND B177      MASK  THE SECTOR AND
      STA EQT10,I   SET IT IN THE EQT 
      XOR B,I       GET THE TRACK ADDRESS 
      ALF,ALF       ROTATE TO LOW A 
      RAL 
      SEZ           IF FOUR WORD ENTRY USE
      LDA B,I       FULL FOURTH WORD FOR TRACK
      STA EQT9,I    AND SET IN THE EQT
      INB           STEP TO ADDRESS OF NEXT TRIPLET 
      STB EQT7,I    AND SET IT IN EQT 7 
      LDB TEMP,I    GET THE BUFFER ADDRESS
      SZB           IF ZERO  THEN DONE
      JMP LNTS      AGAIN 
      JSB STATR 
      LDA PPCTL     FORCE A DUMMY INTERRUPT 
      JSB SETC      P POLL
      JSB WEXIT 
      JMP SYRTN     SEND END COMMAND AND RETURN 
* 
* 
* 
      SKP 
* TRIPLET PROCESSER-- PROCESS $TB34 INFO :: TRANSLATE LOGICAL TRACK 
*     AND SECTOR WITH SUBCHANNEL INTO PHYSICAL DISK ADDRESS 
* $TA32 FORMAT: 
* 
* WORD
*  0      $TA32        NEGATIVE # OF SUBCHANNEL 
*  1                   # OF SECTORS PER TRACK 
*  2                   CYLINDER # OF TRACK 0
*  3                   BITS 10-15:  # HEADS THIS SUBC 
*                            4-9 :  STARTING HEAD#
*                           3-0  :  HPIB DEVICE ADDRESS 
*  4                   # OF TRACKS IN THIS SUBCHANNEL 
*  5                   CONTROLLER/UNIT/ # OF SPARES 
*                      (REPEAT 1-5 FOR N SUBCHANNEL)
* 
*     EQT8-- REQ LENGTH 
*      EQT9-- REQ TRACK # 
*      EQT10- REQ SECTOR #
* 
      SPC 5 
B16K  OCT 16000 
FCODE NOP 
B2301 OCT 2301
B2200 OCT 2200
UNIT# NOP           UNIT # OF THIS HPIB ADDRESS 
BM10  OCT -10 
B2300 OCT 2300
* 
TIPLT EQU * 
      LDA .SUBC     GET SUBCHANNEL ENTRY DISPLACEMENT 
      ADA TB34A     ADD TO $TB34 ADDRESS
      INA           STEP 1ST WORD OF $TB34 (COUNTER)
      STA .TB34     SAVE SUBCH ADDRESS
* 
      LDA EQT6,I    GET REQUEST CODE
      CPA B2301     SUBFUNCTION CODE=23 AND READ? 
      JMP FUSTA     YES, FULL STATUS
      AND B2300     EXTRACT BITS 6-10 
      STA FCODE     SAVE FUNC. CODE 
      CPA B2200     SPECIAL CALL? SUBF=22?
      JMP $SPCL     YES, DO SPECIALS
* 
* 
      LDB .TB34,I   GET 1ST WORD CONTENT--SECTOR #
      STB SECTR 
      ISZ .TB34 
* 
      CLA           PREVENT OVERFLOW
      ASL 6         SECTOR * 64 TO MAKE WORD PER TRACK
      STB MXSIZ     SAVE IT 
* 
* 
      DLD EQT9,I    GET TRACK AND SECTOR
*  SEE IF TRACK = -1
* 
      INA,SZA,RSS   *TRACK= -1? 
      JMP CK02      YES DONT REJECT 
* 
      LDA EQT9,I    GET TRACK#
      SSA,RSS       IF EITHER IS NEGATIVE 
      SSB           GO REJECT 
      JMP REJCT 
* 
      CLA 
      ASL 6         REQUEST SECTR *64 
      CMB,INB       MAKE IT NEGATIVE
      ADB EQT8,I    ADD XFER LENGTH 
      ADB MXSIZ     SUBTRACT MAX WORD PER TRACK 
      SOS           IF REQUEST TOO MANY WORDS 
      SSB 
      JMP REJCT     REJECT CALL   # 
* 
* 
CK02  EQU * 
      LDA BM12
      STA VRER      SET ERROR RETRY COUNT 
      LDA .TB34,I   GET STARTING CYL #
      STA CYL01     SAVE IT 
      ISZ .TB34 
* 
* NOW SET UP UNIT # 
* 
      LDA .TB34     ADDRESS FOR 3 WORD OF TA32
      ADA B2        5TH WORD
      LDA A,I       GET CONTENT OF 5TH WORD 
      AND B16K      MASK OUT UNIT # 
      ALF           PUT UNIT # IN ITS PLACE 
      RAL,RAL 
      STA UNIT#     SAVE IT 
* 
      DLD .TB34,I   GET WORD 3,4 OF &TB34 
*                   A HAS HEAD,SURF,UNIT# 
*                   B HAS # OF TRACK IN THIS SUBCH
      AND B17       ISOLATE UNIT #
      STA ADDRS     HPIB ADDRESS
* 
      LDA EQT9,I    GET TRACK # 
      INA,SZA,RSS   IF -1 RETURN LAST TRACK 
      JMP EOT 
* 
      LDA B         # OF TRACKS IN THIS SUBCH 
      CMA,INA       NEGATE
      ADA EQT9,I    ADD TO REQ TRACK # TO CHECK 
      SSA           IF REQ TRACK > TRACK IN SUBCH 
      JMP CONT      NO,OK 
EOT   LDA EQT5,I    SET END OF TAPE IN EQT 5
      IOR B40 
      STA EQT5,I    UPDATE EQT5 
* 
      LDA REQC      GET REQUEST CODE
      SLA,RSS       IF WRITE REQUEST
      JMP XOUT      DONT RETURN SECT/TRK
* 
      LDA EQT7,I    GET IBUFR ADDRESS 
      STA UBUF      SAVE IT IN UBUF 
      LDA SECTR     GET #SECTR/TRK
      STA UBUF,I    RETURN IT IN IBUF(1)
      JMP XOUT      IMMEDIATE COMPLETION TRACK TOO LARGE
* 
* 
* 
* FUSTA-- GET FULL STATUS AND STORE IN IBUFR 1-4
* 
* 
* 
* 
FUSTA LDB EQT7,I    GET IBUFR ADDRESS 
      STB UBUF      SET UP POINTER
      LDA EQT8,I    GET LENGTH
      ADA B2        CHECK IF LENGTH =2
      SZA           YES,RETURN CURRENT STATUS 
      JMP GT2ST     RETURN OLD AND NEW
* 
* 
CSTAT JSB STATR     GET CURRENT STATUS
      DLD S1        GET S1 S2 
      DST UBUF,I    PUT INTO IBUFR 1,2
      LDB EQT8,I
      JMP DONE
* 
* 
GT2ST ADA B2        MAKE SURE LENGTH =4 
      SZA 
      JMP REJCT     IF NOT REJECT 
* 
      ADB B2        IBUFR(3) ADDRESS
      STB TPBUF     SET POINTER 
      DLD S1        GET S1 S2 (OLD) 
      DST TPBUF,I   STORE THEM IN IBUF 3 4
      JMP CSTAT     GET CURRENT STATUS
* 
* 
* 
* 
* 
CONT  EQU * 
* 
      JSB $UNLS 
      JSB DSJ       SEE IF DISK IS READY
      SZA,RSS       IF DSJ NOT 0 CHECK STATUS 
      JMP ST.OK     IF ZERO EVERYTHING OK 
      JSB STATR     CHECK STATUS
      RAR,RAR       BIT 1 OF S2 
      SLA           SET?
      JMP NRERR 
ST.OK LDA .TB34,I   GET HEAD& DEVICE ADDRESS
      ALF,RAL       # HEAD IN LOW A 
      RAL           SHIFT 6 BITS LEFT TO GET HEAD#
      AND B77       ISOLATE # OF HEAD 
      STA HEAD#     SAVE
      LDA EQT9,I    GET REQ TRACK 
      CLB           CLEAR B FOR DIVIDE
      DIV HEAD#     TRACK/# HEADS 
*                   A= CYL OFFSET / B= HD OFFSET
      ADA CYL01     QUOTIENT ADD TO BASE CYLINDER 
      STA TRACK     SAVE TRACK # FOR RD.WR COMPARE
      ASR 8         PUT HEAD# IN BITS 7 TO 15 
      LDB .TB34,I 
      BLF 
      ADA B 
      AND B374H 
      LDB EQT10,I   GET SECTOR
      CLE,ERB       TAKE 1/2 OF IT
* 
      ADA B         COMBINE HEAD WITH SECTORFOR COMPARE 
TIPRT STA CHDSC     SAVE FOR CYCL CHECK 
* 
      STA HDSC      SAVE IT FOR COMPARE 
      LDB EQT8,I    BRING IN THE LENGTH 
      STB TPLN      SET IN FOR READ/WRITE 
      LDB EQT11,I   AND THE 
      STB TPBUF     BUFFER ADDRESS
      SPC 4 
      LDA TPLN      PRESENT A FOR EVEN SECTOR 
      LDB EQT10,I   GET SECTOR
      CCE,SLB,RSS   IF EVEN SECOTR
      JMP TPNXT     NO PATCHING 
* 
      LDB BUFA      ELSE READ 
      LDA DM128     128 WORDS TO
      JSB  RD.WR    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           AN
      LDA BM100        64 
      LDB TPBUF     GET ADDRESS 
      ELB,RBR       CLEAR SIGN AND SET READ/WRITE 
      JSB MOVE      GO MOVE THE WORDS 
      LDA DM128     SET TO WRITE
      LDB BUFA      THE SECTOR
      SEZ,RSS       WRITE REQUEST?
      JSB RD.WR     YES  WRITE IT OUT 
      LDA BM100     UPDATE POINTERS 
* 
TPA   CMA,INA       TO REFLECT
      STA MOVE      LAST TRANSFER 
      ADA TPBUF     ADJUST BUFFER ADDRESS 
      STA TPBUF     TPBUF=TPBUF+(-(-A REGISTER))
      LDA MOVE      LENGTH THAT HAS BEEN XFERED 
      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
      LDA TPLN      GET THE LENGTH
      ADA MOVE      SUBTRACT THE NUMBER XFERED
      CLE,SSA,RSS   IF NON LEFT CHECK 
      JMP CYCK      FOR CYCLIC CHECK
* 
      STA TPLN      SAVE UPDATED LENGTH 
* 
TPNXT LDB TPBUF     GET BUFFER ADDRESS
      CLE,SSB       READ? 
      JMP TPRD      NO  GOT TRANSFER LAST WORDS 
* 
      ADA B100
      CCE,SSA,RSS 
      JMP TPB 
* 
      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 XFER
      CLE,SZB       IF LESS THAN 64 MOD 128 LEFT
      AND DM128     DELETE EXCELL OVER EVEN SECTOR
      LDB TPBUF     GET BUFFER ADDRESS
TPRD  ELB,RBR       SET READ/WRITE FLAG 
      JSB RD.WR     DO THE XFER 
      LDA LN.N      GET THE LENGTH
      JMP TPA       GO UPDATE THE POINTERS
* 
* 
TPB   LDA DM128     WRITE OF LAST 64 WORD IN
      LDB BUFA      FIRST HALF OF SECTOR
      STB LBUFP     SET UP
      JSB RD.WR     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
      JSB RD.WR 
* 
      SPC 4 
CYCK  LDA EQT6,I    REQUEST FOR CYLIC CHECK?
      AND B2002 
      CPA B2002      AND WRITE? 
      RSS 
      JMP EOXF      NO,RETURN 
* 
* 
      LDB CHDSC     GET HEAD/SECTOR 
      STB HDSC      SET IT
      LDA TRACK     GET TRACK 
      JSB SEEK      DO A SEEK 
      LDB EQT8,I    GET LENGTH
      CMB,INB       CALCULATE # OF SECTORS
      LDA EQT10,I   TRANSFERRED 
B10   SLA           START ODD 
      ADB B100      ADD 64
      ADB B177      ROUND UP NEXT HIGHER SECTOR 
      LSR 7 
      JSB VERFY     DO VERIFY 
      JSB STATS     GET STATUS
      JMP BADV      BAD NEWS
      JMP EOXF      OK RETURN 
* 
* 
BADV  LDA CHDSC 
      ISZ VRER      STEP VERIFY ERROR COUNTER 
      JMP TIPRT     RETRY 
      JMP PARER     TOO MANY! PARITY ERROR
* 
* 
* 
* 
* 
* 
* 
VRER  NOP           VERIFY RETRY COUNTER
B2002 OCT 2002      VERIFY AFTER WRITE REQUEST CODE 
LBUFA DEF BUF 
BUFA EQU LBUFA
HLBUF DEF BUF+64    HIGH PORTION OF LOCAL BUFFER
TPLN  NOP 
TPBUF NOP 
DM128 DEC -128
B77   OCT 77
B374H OCT 37400 
* 
      SKP 
* 
* 
* 
* 
* 
*RD.WR-- READ/WRITE SUBROUTINE
* 
*     *READ=01 WRITE=10 IN EQT7 
*     E=0 => WRITE
*     E=1 => READ 
* 
*     B= BUFFER ADDRESS 
* 
*     A = -LENGTH IN WORDS
* 
* 
* 
* 
* 
RD.WR NOP 
* 
      STB UBUF      SAVE BUFFER ADDRESS 
      STA LN.N      SAVE LENGTH 
* 
* SEE IF R/W TO SAME SUBCHANNEL# ,TRACK AND HEAD/SECTOR 
* 
      LDB SUBC#     GET SUBCH # 
      CPB LSUBC     SAME AS LAST SUBCH? 
      RSS           YES, SAME SUBCH, CHECK TRACK
      STA LTRK      NO,DIFFERENT SUBCH:- SET TO NEGATIVE
*                                    TO FAIL NEXT TEST
* 
      LDB TRACK     GET CURRENT TRACK 
      CPB LTRK      SAME AS IN LOCAL BUFFER?
      LDB BM10      YES  B=-8 
* 
      LDA BM7       GET COUNT 
      STA TPER      INIT ERROR COUNTER
* 
      LDA HDSC      CHECK THE HEAD/SECTOR 
      CPA LHDSC     SAME AS IN LOCAL BUFFER?
      INB           YES  B=B+1
      LDA LN.N      UNDER 129 WORDS?
      SEZ,RSS       IF WRITE
      JMP WRT1      GO DO WRITE TESTS 
* 
      ADA D128      REQUEST?
      CPB BM7       ALL CONDITION MET?
      SSA           MET?
      JMP RD2       NO  GO READ 
* 
      LDA LBUFA     YES SET FOR MOVE
      CPA UBUF      IF DATA IS WANTED IN LOCAL BUFFER 
      JMP CLE       CLEAR E 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 RD.WR,I   RETURN
B40   EQU CLE 
      SPC 5 
RD2   LDB UBUF      READ
      CPB LBUFA     TO LOCAL BUFFER?
      STB LTRK      SHOW LOCAL SECTOR BUFFER EMPTY
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 LOACAL SECTOR 
      STB LTRK      YES  SETR TO SHOW LOCAL BUFF EMPTY
* 
RE.SK ISZ TPER
      RSS 
      JMP PARER     FAILED 6 TIMES  GO PARITY ERROR 
WRIT  LDA TRACK     SET UP TRACK# & HD/SEC FOR SEEK 
      LDB HDSC
      JSB SEEK      SEEK CYL,HEAD&SECTOR
      JSB DSJ       GET DSJ RESPONSE
      SZA,RSS       ANY ERROR 
      JMP SKOK      NO,ERROR
      JSB STATR 
      RAR,SLA,RAR   IF BIT 13 (NOT READY) SET 
      JMP NRERR     NOT READY ABORT 
      RAR,SLA       IF SEEK CHECK BIT SET 
      JMP RE.SK     RE-SEEK 
      RAR,SLA       CHECK FIRST STATUS BIT...IF SET RETRY SEEK
      JMP RE.SK     RE-SEEK                    JRS 800129 
* 
SKOK  EQU * 
* 
* CALL READ/WRITE TO DO DISK OP 
* 
* E=0 FOR READ E=1 FOR WRITE (AFTER CME INSTR)
      SEZ,CME       FLIP E FOR RETRY  , IF READ 
      JMP .RD       ADDRESS DEVICE
      JSB WRITE     ADDRESS TO LISTEN 
      JMP *+2 
.RD   JSB READ      DO READ 
* 
      LDA UBUF      GET USER BUFFER ADDRESS 
      SEZ,RSS       READ? (E=0 FOR READ, E=1 FOR WRITE )
      ADA SIGNB     SET SIGN IN BUFFER ADDRESS FOR READ 
* 
* CALL STDMA TO SET UP DMA, CHECK FOR PRIV. SYSTEM, ENABLE DMA INTR 
* IF PRIV. SYS. START DMA, WAIT AND ABORT DMA 
* 
      JSB STDMA     DO THE DMA STUFF
      JSB $UNLS     UNADDRESS DEVICE
LIAD2 LIA 2      GET DCPC WORD COUNT
      JSB STATS     REQUEST STATUS
      JMP WRIT      ERROR RETRY 
* 
      LDA UBUF      WAS XFER TO LOCAL BUFFER? 
      CPA LBUFA 
      RSS 
      JMP RD.WR,I   NO  RETURN
* 
      LDA TRACK     UPDATE ALL FLAGS AND
      STA LTRK      LOCAL BUFFER
      LDA HDSC      DISK ADDRESS
      STA LHDSC 
* 
      LDA SUBC#     UPDATE LAST SUBCHANNEL# 
      STA LSUBC 
      JMP RD.WR,I   RETURN
* 
LSUBC OCT -1        LAST SUBCHANNEL#
TRACK NOP 
LTRK  OCT -1
HDSC  NOP 
LHDSC NOP           LAST HEAD/SECTOR# 
LN.N  NOP 
UBUF  NOP 
D128  DEC 128 
BM7   OCT -7
* 
* THE FOLLOWING CODES HANDLE READ/WRITE OPERATION USING DMA IN A PRIV.
* SYSTEM. IF PRIV. SYSTEM, INHIBIT DMA INTERRUPT AND SET SIGN BIT 
* OF INTERRUPT ENTRY IN INTERRUPT TABLE FOR DMA CHANNEL 6 OR 7
* THEN WAIT FOR DMA COMPLETION, ABORT DMA, CLEAR THE ENTRY AND EXIT 
* IF NOT A PRIV. SYSTEM, SEE IF READ, IF NO, INHIBIT DMA INTERRUPT. 
* 
STDMA NOP 
CLCD2 CLC 2         SET DMA CONTROL 
OTAD2 OTA 2         SEND BUFFER ADDRESS 
      LDA SCODE     GET SELECT CODE 
OTAD  OTA 6         SEND TO DMA 
      LDA LN.N      GET XFER LENGTH 
STCD2 STC 2         SET UP DMA WORD 2 
OTAD3 OTA 2         SEND LENGTH 
* 
* SEE IF PRIVELEGED SYSTEM, SET BIT 15 OF DMA ASSIGNMENT TO 
* ENABLE DMA INTERRUPT IN READ .
* 
      CLF 0         INTERRUPT OFF 
STCDC STC 6,C       STAT DMA HERE 
* 
      CLA           IF NOT A PRIV. SYSTEM 
      CPA DUMMY     IGNORE THE FOLLOWING
      JMP X         NO SPECIAL PROCESSING NEEDED
* 
CLCD  CLC 6         INHIBIT DMA INTERRUPT HERE (LET RTIOC DO IT LATER)
* 
      SEZ           IF WRITE
      JMP INTON     DONT WANT DMA INTERRUPT, JUST WAIT FOR THE CARD 
* READ
      LDB INTBA     GET INTERRUPT TABLE ADDRESS 
      LDA STCDC     FIND OUT CHANNEL 6 OR 7 
      SLA           IF CHANNEL 6 SKIP 
      INB           CHANNEL 7 GET SECOND WORD 
      STB .CHAN    SAVE THE ENTRY ADDRESS 
      LDA B,I       GET CONTENT 
      IOR SIGNB     SET SIGN BIT
      STA B,I       RESTORE, SET SIGN BIT 
INTON STF 0         RE-ENABLE INTERRUPT 
      JMP XWAIT     WAIT FOR DMA DONE 
* 
X     SEZ           IF WRITE REQUEST
CLCD1 CLC 6         INHIBIT DMA INTERRUPT 
XWAIT EQU * 
      JSB .WAIT     WAIT FOR XFER DONE
STFD  STF 6         ABORT DMA 
* 
* IF PRIV. SYSTEM CLEAR INTERRUPT TABLE ENTRY BIT 15 TO PREVENT 
* FURTHER INTERRUPT FORM DMA
* IF NOT PRIV. SYSTEM RETURN
* 
      CLA           IF PRIV. SYSTEM 
      CPA DUMMY     SKIP TO CLEAR INTBA 
      JMP STDMA,I   ELSE RETURN 
      LDA .CHAN,I  GET DMA INTERRUPT ENTRY ADDRESS
      AND SMSK      MASK OUT SIGN BIT 
      STA .CHAN,I  PUT IT BACK
      JMP STDMA,I 
* 
SMSK  OCT 77777     CLEAR SIGN BIT MASK 
.CHAN NOP 
* 
                                                                                                                                                                                              