ASMB,R,L,C
      HED DVR32  RTE MOVING HEAD DRIVER 
*     NAME:   DVR32 
*     SOURCE: 92060-18031 
*     RELOC:  92060-16031 
*     PGMR:   G.A.A.,JSW,JJC
* 
*  ***************************************************************
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1975.  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 DVR32,0 92060-16031 REV.2013 800130 
      ENT I.32,C.32 
      EXT .MVW,$UPIO,$CGRN,$OPSY
      EXT $TB32 
TBXX  EQU $TB32 
      SUP 
      SPC 3 
*     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.
* 
* 
******** WARNING *****************************************************
* 
*  THIS DRIVER WILL CORRECTLY HANDLE MULTI-CPU, MULTI-DRIVE CONDITIONS
*  ONLY WITH THE LATEST FIRMWARE IN THE DISC CONTROLLER. IT WILL ALSO 
*  HANDLE MULTI-DRIVE CONDITIONS WITH OLD FIRMWARE IN THE CONTROLLER. 
*  HOWEVER, IF USED WITH OLD FIRMWARE IN A MULTI-CPU ENVIROMENT IT WILL 
*  LIKELY PUT THE SYSTEM INTO A TIGHT INTERRUPT DRIVEN LOOP.
* 
*  THIS IS INTENDED AS THERE IS NO CORRECT ANSWER TO THE PROBLEM WITH OLD 
*  FIRMWARE. THE TIGHT LOOP WILL OCCUR ON FIRST CONTENTION FOR THE LOCK 
*  REQUEST AND WILL "HEAL" ON REMOVAL OF THE CONTENTION (OTHER CPU
*  UNLOCKS), SOLUTION:
*      GET NEW FIRMWARE!!!
* 
************************************************************************* 
      SPC 4 
******* WARNING ********************************************************
*  THIS DRIVER CONTAINS A SECTION OF CODE THAT TEMPORARILY MODIFIES 
*  THE ALTERNATE MAP FOR THE ECC SCHEME (ERR CORRECTION)
*  OF THE 13037 CONTROLLER. 
*  THE SECTION OF CODE AT LIMST SHOULD BE REVIEWED
*  WHEN THIS DRIVER IS PUT IN A NEW OP SYSTEM, TO VERIFY THAT 
*  THE ASSUMPTIONS MADE IN THE CODE ARE STILL VALID.   800129 
**************************************************************************
      SKP 
RWSUB NOP           READ/WRITE    ROUTINE   ENTRY 
*                     E  =  0    WRITE
*                     E  =  1    READ 
* 
*                   B    =       BUFFER ADDRESS 
*                   A    =    -LENGTH IN WORDS
      SPC 3 
      STB UBUF      SAVE BUFFER ADDRESS.
      STA LN.N      SAVE LENGTH 
      LDB TRACK     GET THE TRACK AND 
      BLF           COMBINE WITH
      ADB UNIT      THE UNIT
      CPB LTRK      SAME AS IN LOCAL BUFFER?
      LDB BM10      YES;  B_-8. 
      LDA HDSC      CHECK THE HEAD/SECT 
      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      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 
      SPC 3 
RD2   LDB UBUF      READ; TO LOCAL
      CPB LBUFA     BUFFER? 
      STB LTRK      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 LOCAL SECTOR
      STB LTRK      YES; SET TO SHOW NONE IN
WRIT  JSB SEEK      SEEK RECORD 
      LDA DMAC      GET THE DMA CONTROL WORD
OTAD  OTA 6         SEND TO THE DMA 
      LDA RDCM      GET THE READ COMMAND
      SEZ,CME,RSS   READ? 
      LDA WRCM      NO - USE WRITE COMMAND
      STA SEEK      SAVE THE COMMAND
      LDA UBUF      GET BUFFER ADDRESS
      SEZ,RSS 
      ADA MSIGN     AND SET DIRECTION BIT 
CLCD2 CLC 2         SET FOR BUFFER
OTAD2 OTA 2         SEND BUFFER ADDRESS 
      LDA LN.N      GET LENGTH
STCD2 STC 2         SET FOR LENGTH
OTAD3 OTA 2         SEND IT.
CON   LDA SEEK      GET THE COMMAND 
      JSB OUTCC     AND SEND IT 
STCDC STC 6,C       START DMA 
CLCD  CLC 6         INHIBIT DMA INTERRUPT 
      JSB WAITS     GO WAIT FOR INTERRUPT 
STFD  STF 6         FOURCE DMA COMPLETION 
LIAD2 LIA 2         GET RESIDUE FOR CORRECTION ALG. 
      JSB STATS     DO STATUS 
      JMP WRIT      ERROR; RETRY
* 
      JMP CON       CONTINUE THE XFER AFTER CORRECTION
* 
      LDA UBUF      WAS XFER TO LOCAL BUFFER
      CPA LBUFA     ? 
      RSS 
      JMP RWSUB,I   NO; RETURN
* 
      LDA TRACK     UPDATE THE
      ALF 
      ADA UNIT
      STA LTRK      LOCAL BUFFER
      LDA HDSC      GET THE CURRENT HEAD /SECTOR
      STA LHDSC     SET HD/SECT WORD
      JMP RWSUB,I   RETURN
* 
TRACK NOP 
DMAC  NOP           DMA CONTROL WORD (SELECT CODE ONLY) 
HDSC  NOP 
LTRK  OCT -1
LHDSC NOP 
LN.N  NOP 
UBUF  NOP 
RDCM  ABS READC     READ COMMAND
WRCM  ABS WRITC     WRITE COMMAND 
D128  DEC 128 
BM7   OCT -7
      SKP 
      SPC 3 
SEEK  NOP           SEEK ROUTINE
*                                   1. SEEK RECORD WHOSE TRACK IS 
*                                      IN TRACK, UNIT HDSC
*                                   2. DO ADDRESS RECORD
*                                   3. SEND THE FILE MASK 
SK2   JSB SEAD      SEND THE SEEK COMMAND AND DATA
      ABS SEEKC+HOLD
      JSB WAITI     WAIT FOR ATTENTION
SK1   RAR,RAR       MOVE SEEK CHECK BIT 
      RAR,SLA,RAL   TO LEAST A AND SKIP IF OK 
      SLA           IF NOT READY OR NO SEEK CHECK 
      JMP SK3       CONTINUE THE PROCESS (GET NOT READY LATER)
* 
      JMP SK2       GO REISSUE THIS SEEK
* 
SK3   JSB SEAD      SEND ADDRESS RECORD 
      ABS ADREC 
      LDA FILM      GET THE FILE MASK 
      XOR UNIT      CHEAT OUTC
      JSB OUTC      AND SEND THE IT 
      JMP SEEK,I    RETURN
* 
FILM  OCT 7404      FILE MASK  SPARING ONLY 
* 
* 
* 
SEAD  NOP 
*                                 SEAD SEND THE SEEK/ADDRESS RECORD 
*                                 COMMANDS TO THE CONTROLLER
*  CALLING SEQUENCE:
* 
*  JSB SEAD 
*  OCT COMMAND  EITHER SEEK OR ADDRESS RECORD 
* 
*  ASSUMES CYL = CYLINDER ADDRESS 
*          HDSC= HEAD AND SECTOR
*          UNIT= UNIT ADDRESS 
* 
SEK2  LDA SEAD,I    GET THE COMMAND 
      JSB OUTC      SEND IT TO THE CONTROLLER 
SFC1  SFC DC        ACCEPTED? 
      JMP SKOK      YES  CONTINUE 
* 
      JMP NRERR     ELSE TAKE NOT READY EXIT
* 
* 
SKOK  LDA TRACK     GET THE CYLINDER ADDRESS
OTA1  OTA DC,C      AND SEND IT 
      ISZ SEAD      STEP TO RETURN ADDRESS
      JSB WAFLG     WAIT FOR FLAG 
      JMP NRERR     IF NONE THEN NOT READY
      LDA HDSC      NOW THE HEAD/SECTOR 
OTA2  OTA DC,C      SEND IT 
      JMP SEAD,I    RETURN
* 
B27   OCT 27
* 
* 
*     OUTC          SEND COMMAND TO THE CONTROLLER AND
*         WAIT FOR ACCEPTANCE 
* 
OUTC  NOP 
      JSB OUTCC     SEND THE COMMAND
      JSB WFLS      WAIT FOR THE FLAG 
      JMP OUTC,I    RETURN
* 
*     OUTCC         SEND COMMAND TO INTERFACE  DO NOT WAIT FOR FLAG.
* 
OUTCC NOP 
CLC1  CLC DC        SET 'HERE-COME-DE-WORD' 
      XOR UNIT      ADD/SUBTRACT THE UNIT 
OTA3  OTA DC,C      SEND THE WORD 
      JMP OUTCC,I   RETURN
* 
* 
*     INWD          WAITS FOR A FLAG AND THEN INPUTS ONE WORD TO A. 
* 
INWD  NOP 
      JSB WAFLG     WAIT FOR THE FLAG 
      JMP NRERR     IF NO RESPONCE TAKE NOT READY EXIT
* 
LIA1  LIA DC,C      GET THE WORD
      JMP INWD,I    RETURN
* 
* 
*     WAITI         WAIT FOR INTERRUPT AND ANNALIZE REASON FOR INTERRUPT
*         IF NO STATUS BIT SET EXIT TO CALLER 
*         ELSE DO STATUS AND: 
*         1. IF UNIT 10 GO TO HOL10 (TO COMPLETE HOLD)
*         2. IF CURRENT UNIT RESTORE E AND RETURN 
*         3. IF NOT CURRENT UNIT IGNOR THE INTERRUPT AND
*            POSSIBLY CALL SYSTEM UP PROCESSOR
* 
* 
WAITI DEF IGNOR     INTERRUPT BEFORE EXPECTED IGNOR 
      ELB           SAVE THE E REG
      STB MOVE      IN MOVE ENTRY POINT 
      CLA           CLEAR THE RETURN ADDRESS
      STA RTNCD     SWITCH
IGNO2 ISZ C.XX      TAKE CONTINUATION INTERRUPT 
STC1  STC DC        SET FOR INTERRUPT 
      JMP C.XX,I    RETURN
* 
C.XX  NOP           INTERRUPT RETURNS TO HERE 
      ISZ STACT     IF TO IGNOR STATUS
      RSS           THEN
      JMP WAIER     JUST GO RETURN
* 
      JSB STATW     THIS CALL ASSUMES WE HAVE CONTROLLER
      CPB D10       UNIT 10 WAKE UP?
      JMP HOL10     YES GO PROCESS IT 
* 
      CPB UNIT      THIS THE CURRENT UNIT?
      RSS           YES SKIP
      JMP IGNOR     NO GO PROCESS ATTENTION INTERRUPT 
* 
WAIER LDB MOVE      RESTORE 
      ERB           THE E REG.
      JMP WAITI,I   AND RETURN
* 
*  THIS WILL PUT A SYSTEM WITH
*  THE OLD CONTROLLER INTO A TIGHT LOOP-
*  USE NEW FIRMWARE WITH MULT-CPU 
* 
HOL10 LDA S1CD      IF NOT SUCCESSFUL 
      CPA B27       THEN
      JMP LOKEX     GO EXIT 
* 
      LDA EQT13,I   ELSE
      JSB $CGRN     CLEAR THE RN
      CLA           AND THE 
      STA EQT13,I   LOCK 10 FLAG
LOKEX LDB D10 
* 
IGNOR CLA           MUST BE ATTENTION 
      STA EQT15,I   OF SOME KIND
      CPB D10       IF UNIT 10
      JMP WAK       SKIP THE CORE SECTOR CLEAR
* 
      LDB WAITI     IF WE DO NOT EXPECT AN
      CPB DIGNO     INTERRUPT 
      STB LTRK      CLEAR IN CORE FLAGS.
WAK   JSB WAKEN     SET UP WAKE UP OR END 
      LDA EQT#      GO TO SYSTEM
      LDB I.XX      $IOUP IF
      SZB           WE DID A
      JMP IGNO2     NOT READY 
* 
STC2  STC DC        SET CONTROL FIRST 
      JMP $UPIO     NOW GO UP THE DEVICE
* 
* 
*     WAITS         DOES WAITI WITHOUT STATUS 
* 
WAITS NOP 
      CCA           SET THE NO STATUS 
      STA STACT     FLAG
      JSB WAITI     WAIT FOR THE INTERRUPT
      JMP WAITS,I   RETURN
* 
* 
RTNCD OCT 4 
STACT NOP 
D10   DEC 10
HLD10 ABS RECAC+HOLD+10 USE RECALABRATE COMMAND TO HOLD 
UNIT  NOP 
* 
* 
* 
* 
* 
*     WAKEN         CALLED BEFORE ANY EXIT FOR COMPLETION OR
*         AFTER AND UNEXPECTED INTERRUPT
* 
* 
WAKEN NOP 
      STB XOR       SAVE B
      LDA ENDC      PRESET TO SEND THE END COMMAND
      LDB WAITI     IF WAITING FOR
      CPB DSK1      A SEEK TO COMPLETE
      JMP WAKX      JUST END
* 
      LDB EQT13,I   GET THE WAKE UP FLAG
      SZB           IF NOT WAITING FOR 10 
      LDA HLD10     SKIP ELSE LOAD WAKE 10 COMMAND
      XOR UNIT      FOOL OUTC 
WAKX  JSB OUTCC     SEND THE COMMAND
      LDB XOR       RESTORE B 
      JMP WAKEN,I   RETURN
* 
* 
ENDC  ABS ENDCC 
DSK1  DEF SK1 
DIGNO DEF IGNOR     RETURN FOR IGNOR INTERRUPT
*                                   STATUS CHECK SECTION
*         STATUS MAY REQUIRE AND INTERRUPT IF CONTROLLER
*         IS NOT CONNECTED TO THIS CPU. 
*         THE ERROR COUNTER IS RESET FOR EACH CORRECT 
*         STATUS. 
*         THE STATUS WORD IN THE EQT IS SET AS FOLLOWS
*                   0 - ANY ERROR 
*                   1 - DRIVE BUSY (HEADS NOT OVER A TRACK) 
*                   2 - DRIVE NOT READY (HEADS NOT LOADED => 1 ALSO)
*                   3 - SEEK CHECK (BAD ADDRESS-USUALLY WIPES SYSTEM) 
*                   4 - FIRST STATUS
*                   5 - DRIVE FAULT 
*                   6 - FORMAT SWITCH IS ON 
*                   7 - PROTECT SWITCH IS ON
* 
* 
*         A WRITE TO A PROTECTED CYLINDER WILL
*                   FOURCE A PARITY ERROR RETURN
*                   UNLESS THE FORMAT SWITCH IS ON, IN WHICH
*                   CASE THE WRITE IS RETRIED WITH A WRITE
*                   INITIALIZE. 
*         NOT READY WILL FOURCE A NOT READY RETURN
* 
* 
* 
STATS NOP 
* 
*     STATS CALLING SEQUENCE: 
* 
*     LIA DMAWC/CLA,INA   SET DMA RESIDUE IF DMA XFER ELSE 1
*     JSB STATS 
*     JMP RETRY     RETRY THE TRANSFER (E= NOT E) 
*     JMP CONT      CONTINUE THE TRANSFER (E=E) 
*     OK EXIT                             (E=E) 
* 
*     THE FOLLOWING ACTIONS ARE TAKEN ON THE STATUS-1 WORD: 
* 
*     STATS  PROBLEM         ACTION 
* 
*     00     NO ERROR        OK - IF DMA RESIDUE = 0 EXIT ELSE RETRY
*     07     CLY. COMP. ERR  RECALIBRATE - RETRY EXIT 
*     10     DATA ERROR      RETRY EXIT (UP TO 10 TIMES)
*     11     HEAD/SECT COMP. RECALIBRATE - RETRY EXIT 
*     16     OVERRUN         RETRY EXIT (UP TO 10 TIMES)
*     17     CORR. DATA ERR  TRY TO CORRECT THEN: 
*                            1. IF FAIL RETRY EXIT (UP TO 10 TIMES) 
*                            2. IF SUCCESS AND DMA RESIDUE = 0
*                               TAKE OK EXIT, ELSE IF RESIDUE = 1 
*                               UPDATE VERIFY COUNTERS AND TAKE 
*                               CONTINUE EXIT, IF RESIDUE # 0 OR 1
*                               CONTINUE EXIT.
*     20     ILLEGAL TRACK   PARITY ERROR ABORT 
*     22     NOT READY       RETRY EXIT 
*     23     STATUS-2        IF PROTECT THEN PARITY ERROR ABORT 
*                            ELSE NOT READY ABORT 
*     26     WRITE PROTECT   IF FORMAT SWITCH ON RESET COMMAND
*                            TO INITIALIZE WITH SPD BITS AND
*                            TAKE CONTINUE EXIT, ELSE PARITY
*                            ERROR ABORT
*     --     ALL OTHERS      NOT READY ABORT
* 
* 
      STA WAKEN     SAVE THE DMA RESIDUE
      JSB STATW     DO THE STATUS REQUEST 
      LDB S1CD      GET THE STATUS-1 CODE 
      SZB,RSS       IF NO ERROR 
      JMP OKEX      THEN JUST EXIT
* 
      CPB B20       ILLEGAL TRACK?
      JMP PARER     GO GIVE PARITY ERROR
* 
      CPB B26       WRITE PROTECT?
      JMP PARER     GO CHECK THE SWITCH 
* 
      CPB B23       STATUS-2 ERROR? 
      JMP NR?       GO CHECK FOR NOT READY
* 
      CPB B16       RETRY OVER RUNS 
      JMP REXIT     FOR EVER
* 
      ISZ ERCTR     STEP ERROR COUNT
      RSS           STILL OK SO CONTINUE
      JMP PARER     TOO MANY ERROR - ABORT
* 
      CPB B7        FOR CYL. ERROR
      RSS 
* 
      CPB B11       AND HEAD/SECT. COMP 
      JMP RECAL     TRY RECALABRATE 
* 
      CPB B17       LAST CHANCE 
RSS   RSS           POSSIBLY CORRECTABLE ERROR
* 
      JMP REXIT     NONE OF THE ABOVE TRY IT AGAIN
* 
*     POSSIBLY CORRECTABLE DATA ERROR.  GET SYNDROME FROM CONTROLER 
*     AND GIVE IT A TRY.
* 
      LDA RQSYN     SEND THE COMMAND
      JSB OUTCC     TO THE CONTROLLER 
      JSB WAITS     WAIT FOR INTERRUPT - NO STATUS
LIA2  LIA DC,C      GET UPDATED STATUS
      ALF,ALF       AND 
      STA SU        SAVE IT 
      JSB INWD      BURN THE CYL. ADDRESS 
      JSB INWD      GET THE SECTOR
      STA WAITS     SAVE IT 
      JSB INWD      GET THE DISPLACEMENT
      STA STATW     AND SAVE
      JSB INWD      NOW GET 
      STA PAT1      AND 
      JSB INWD      SAVE
      STA PAT2      THE 
      JSB INWD      THREE 
      STA PAT3      CORRECTION WORDS
      LDA SU        GET THE UPDATED STATUS
      SLA,RSS       IF NOT CORRECTABLE
      JMP REXIT     TAKE RETRY EXIT 
* 
*     CORRECTION ROUTINE USES THE FOLLOWING:
*     UBUF  = BUFFER ADDRESS
*     -LN.N = ORIGIONAL TRANSFER WORD COUNT 
*     WAITI = REMAINING WORD COUNT
* 
*     IF WAITI = 1 THEN ENTRY IS FROM VERIFY SO CORRECTION IS 
*     NOT NEEDED. 
* 
      LDB WAKEN     GET THE DMA RESIDUE 
      CPB B1        IF ONE
      JMP CKCNT     GO SET UP TO CONTINUE VERIFY
* 
      LDA LN.N      GET ORGIONAL LENGTH 
      CMA,INA       TO A
      SZB,RSS       IF END OF TRANSFER
      JMP ZRORS     DO SPECIAL
* 
* 
*     COMPUTE LOWER AND UPPER LIMITS IN BUFFER FOR FIXUP. 
* 
      ADB DMABT     RESTORE THE MISSING RESIDUE BITS
      ADA B         GET UPPER LIMIT 
      STA B         SAVE IT 
LIMST ADA DM128     NOW LOWER LIMIT 
      ADA UBUF      ADD IN THE BUFFER ADDRESS 
      ADB UBUF      AND 
      STA S1        SET THE LOW 
      STB SU        AND HIGH LIMITS 
XECC1 JMP CRECT /NOP (CNFG'D TO NOP FOR SYS W/ DMS) 
* 
      CLB           GET LOW PAGE# OF CORRECTION 
      LSR 10          ADDRESS.
      STA INWD      SAVE LOW PAGE IN TEMP(SUBR ENT PT)
      RSB           WHICH MAP ARE WE EXECUTING IN?? 
      BLF              (MEM ST REG(BIT12)=0/1=SYS/USR)
      SLB,RSS       CURR MAP=SYS??
      IOR B40         YES-SET POINTER TO USR MAP
      STA OUTCC     SAVE MAP REG# OF ALT MAP IN TEMP(SUBR)
      SPC 1 
*     SAVE 2 REGS OF ALTERNATE MAP CUZ WE'RE GONNA OVERLAY 'EM
      SPC 1 
      LDB BM2       GET 2 REGS: MAPS>TO>MEM 
      CBX             SIGN OF X SAYS DIRECTION
      LDB ABSS1     SAVE AREA FOR 2 ALT MAP REGS. 
      XMM           MOVE 2 FROM ALT MAP TO ABSS1
      SPC 1 
*     SAVE 2 REGS OF CURRENT PORTMAP TO ABSS2 SAVE AREA 
      SPC 1 
      LDA INWD      GET PAGE# OF CORRECTION ADDR
      IOR B100      ADD OFFSET TO PORT A MAPS 
      LDB OTAD3     GET CNFG'D I/O INSTRUCTION
      SLB           USING PORT B CURRENTLY??
      IOR B40         YES-ADJUST OFFSET TO PORT B 
      LDB BM2       MOVE 2 REGS: PORTMAP>TO>MEM 
      CBX             INTO SAVE AREA AT ABSS2 
      LDB ABSS2 
      XMM           MOVE 'EM
      SPC 1 
*     STUFF 2 REGS. OF CURRENT PORT MAP INTO ALTERNATE MAP FOR XOR
      SPC 1 
      LDA OUTCC     GET MAP REG# OF ALT MAP 
      LDB B2        LOAD 2 MAP REGS: MEM>TO>MAPS
      CBX             FROM PORT MAP SAVE AREA 
      LDB ABSS2         AT ABSS2
      XMM           MOVE 'EM
* 
CRECT LDB S1        ADD LOW LIMIT+DISPLACEMENT & GET
      ADB STATW       THE CORRECTION ADDR IN B REG. 
      JSB XOR       CORRECT 
PAT1  NOP           THE 
      JSB XOR       DATA
PAT2  NOP           IN THE
      JSB XOR       BUFFER
PAT3  NOP 
* 
XECC2 JMP DONE? /NOP (CNFG'D TO NOP IF DMS SYSTEM)
      SPC 1 
*     RESTORE ALTERNATE MAP FROM ABSS1 SAVE AREA
      SPC 1 
      LDA OUTCC     GET POINTER TO ALT MAP REGS.
      LDB B2        SET TO MOVE 2 REGS: MEM>TO>MAPS 
      CBX             FROM THE 2 WORD SAVE
      LDB ABSS1         AREA AT ABSS1.
      XMM           RESTORE MAPS AS BEFORE
* 
DONE? LDA WAKEN     IF TRANSMISSION COMPLETE
      SZA,RSS       THEN
      JMP OKEX      TAKE OK EXIT
* 
      JMP CONEX     ELSE TAKE CONTINUE EXIT 
* 
* 
ZRORS LDB A         RESIDUE IS ZERO 
      ADA B177      B GET UPPER LIMIT OFFSET
      AND DM128     ROUND A UP TO NEXT 128 WD.
      JMP LIMST     CONTINUE CORRECTION.
* 
* 
CKCNT LDA HDSC      VERIFY IN PROGESS 
      CMA,INA       GET THE ORGIONAL HEAD ADDRESS 
      ADA WAITS     AND COMPUTE THE NUMBER CHECKED
      AND B377
      INA 
      STA HDSC      SET THE NEW ORG.
      CMA,INA       SUBTRACT
      ADA TVCNT     FROM VERIFY COUNT 
      JMP DONE?     AND GO TEST IF DONE.
* 
* 
RECAL LDA RECLC     RECALABRATE 
      JSB OUTCC     THE DISC
      JSB WAITI     WAIT FOR ATT. 
REXIT CME           SET E TO NOT E FOR RETRY
      JMP STATS,I   TAKE RETRY EXIT 
* 
RECLC ABS RECAC+HOLD
* 
NR?   ALF,ALF       IF PROTECTED
      SEZ,SSA       IF SWITCH OFF AND WRITE 
      JMP PARER     TAKE PARITY ERROR EXIT
* 
      JMP NRERR     ELSE TAKE NOT READY EXIT
* 
* 
OKEX  LDA WAKEN     IF DMA DISAGREES
      SSA 
      JMP REXIT     RETRY THE TRANSFER
* 
      LDB BM12      RESET THE ERROR 
      STB ERCTR     ON OK EXITS 
      ISZ STATS     STEP RETURN ADDRESS 
CONEX ISZ STATS 
      LDB MOVE      RESTORE 
      ERB           THE E REG.
      JMP STATS,I   RETURN
* 
* 
B1    OCT 1 
B11   OCT 11
B16   OCT 16
B17   OCT 17
B20   OCT 20
B22   OCT 22
B23   OCT 23
B26   OCT 26
B160K OCT 160000
BM2   OCT -2
DMABT NOP           HIGH DMA WORD COUNT BITS NOT RETURNED 
RQSYN ABS RQSYC 
TVCNT NOP 
INIAC ABS INITC 
* 
*     XOR           THIS ROUTINE DOES THE CORRECTION FOR CORRECTABLE
*                   DATA ERRORS.
* 
*     CALLING SEQUENCE: 
* 
*     SET S1 TO THE LOWER LIMIT 
*         SU TO THE UPPER LIMIT 
*         B  TO THE BUFFER ADDRESS
*     JSB XOR 
*     OCT PATTERN 
*     RETURN B_B+1
* 
*     THE PATTERN WILL BE XORED WITH THE WORD AT AND RESTORED TO
*     B,I IF AND ONLY IF S1<= B < SU.  B IS ALWAYS INCREMENTED. 
*     THE FIXUP IS ALWAYS DONE THRU THE ALTERNATE MAP IN
*     SYSTEMS WITH DMS (RTE-III/IV). (RTE-II CORRECTS IN CUR MAP.)
*     TWO REGISTERS OF THE ALTERNATE MAP ARE TEMPORARILY SET UP 
*     FROM THE PORT MAP WHICH WAS USED FOR THE DMA XFER. TWO REGS 
*     MUST BE SET UP INCASE THE 3 WORD XOR PATTERN CROSSES A PG BOUNDARY. 
*     THE CURRENT MAP IS NOT USED FOR XOR BECAUSE WE MAY MAP OURSELF
*     OUT OF EXISTENCE WHEN THE PORT MAP IS COPIED IN.
* 
XOR   NOP 
      LDA S1        GET LOWER LIMIT 
      CMA,CLE,INA   WATCH 'E' IT DOES ALL THE WORK
      ADA B         SET 'E' IF S1<= B.
      LDA B         NOW TEST UPPER LIMIT
      CMA,SEZ,CLE   = IS BAD / SKIP IF LOW FAILED 
      ADA SU        SET 'E' IF B< SU
      SEZ,RSS       IF OUSIDE LIMITS
      JMP EXXOR     GO BUMP B AND EXIT
* 
XECC3 JMP XORD /NOP (CNFG'D TO NOP IF DMS SYSTEM) 
* 
      XLA B,I       GET THE DATA
      XOR XOR,I       FIX IT AND
      XSA B,I           RESTORE IT TO DATA BUFFER.
      JMP EXXOR     EXIT
* 
XORD  LDA B,I       GET THE DATA(IT'S IN CUR MAP) 
      XOR XOR,I       FIX IT AND
      STA B,I           RESTORE IT TO DATA BUFFER.
* 
EXXOR INB           STEP ADDRESS
      ISZ XOR       STEP RETURN ADDRESS 
      JMP XOR,I     AND RETURN
* 
* 
STATW NOP         CORE STATUS ROUTINE  GETS THE STATUS ONLY 
*                                 LEAVES STATUS IN: 
*                                 S1  STATUS WORD ONE 
*                                 SU AND B  STATUS UNIT RETURNED
*                                 S1CD  ERROR CODE FROM S1 IN LOW PART
*                                 EQT5 AND A  STATUS 2 ROTATED 1 BIT
*                                       LEFT LOW 8 BITS ONLY
* 
      CCA           SET THE STATUS COMMAND IN PROGESS 
      STA STACT     FLAG TO PREVENT WAITI PROBLEMS
      LDA STC       GET THE STATUS COMMAND
      JSB OUTCC     SEND THE COMMAND   (MUST NOT USE OUTC 
      JSB WAFLG     OR WFLS HERE SINCE THEY MAY 
      JSB WAITI     BE WAITING. 
LIA3  LIA DC,C      GET THE FIRST STATUS WORD 
      STA S1        SAVE IT 
      AND B377      GET UNIT
      STA SU        SAVE IT 
      XOR S1        GET BACK HIGH PART
      ALF,ALF       ROTATE TO LOW A 
      AND B37       KEEP THE STATUS 
      STA S1CD
      JSB INWD      GET STATUS-2 WORD 
      RAL           ROTATE
      XOR EQT5,I    PUT IN LOW EQT5 
      AND B377      UNDER THE RULES 
      XOR EQT5,I    OF WOO
      LDB S1        IF PROTECTED
      RBL           SET 
      SSB           BIT 
      IOR B20       4 
      STA EQT5,I
      LDB SU        GET THE UNIT BACK TO B
      STB STACT     CLEAR THE STATUS IN PROGESS FLAG
      JMP STATW,I   AND RETURN
* 
STC   ABS STATC 
SU    NOP 
S1    NOP 
S1CD  NOP 
B37   OCT 37
* 
* 
*     WAFLG         WAITS FOR A FLAG FOR A TIME AND THEN RETURNS
*         P+1 IF NO FLAG IN TIME
*         P+2 IF A FLAG MADE IT IN TIME 
* 
WAFLG NOP 
      LDB WCOUN     PICK A TIME 
SFS1  SFS DC        FLAG HERE YET?
      JMP WAFTB     NO GO TEST TIMER
* 
      ISZ WAFLG     YES STEP RETURN TO P+2
      JMP WAFLG,I   AND DO IT 
* 
WAFTB ISZ B         TIME HERE YET?  (ISZ FOR TO SAVE E REG.)
      JMP SFS1      NO TRY THE FLAG AGAIN 
* 
      JMP WAFLG,I   YES TAKE P+1 EXIT 
* 
* 
*     WFLS          WAIT FOR FLAG, IF NONE WAIT FOR INTERRUPT 
* 
* 
WFLS  NOP 
      JSB WAFLG     FLAG WITHOUT INTERRUPT? 
      JSB WAITS     NO  WAIT FOR INTERRUPT
      JMP WFLS,I    RETURN
* 
B377  OCT 377 
BM12  OCT -12 
WCOUN DEC -35 
ERCTR OCT -12 
                                                                                            