ASMB,R,L,C
      HED DVR62F -- 2313B DRIVER FOR RTE-IV SYSTEMS 
*     NAME:    DVR62F 
*     SOURCE:  02313-18004
*     RELOC:   02313-16004
* 
*  ***************************************************************
*  * (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 DVR62F 02313-16004  REV 1826   780403           
      ENT I.62,C.62 
      EXT $MATA     FIRST PAGE OF USER PARTITION
      EXT $MPFT     FENCE TABLE USED TO FIND
*                                   LOWEST LEGAL BUFFER ADDR
      SPC 2 
      SPC 2 
*  ************************************************************ 
*  *                                                          * 
*  *          THIS DRIVER WILL NOT SUPPORT CLASS I/O          * 
*  *                                                          * 
*  ************************************************************ 
      SPC 2 
*  THIS DRIVER OPERATES THE 2313B SUBSYSTEM IN THE RTE-IV 
*  ENVIRONMENT.  IT REQUIRES THE USE OF INTERFACE ROUTINES
*  TO SIMPLIFY OPERATION.  IT CAN, HOWEVER, BE CALLED 
*  DIRECTLY BY AN EXEC CALL IF THE USER FOLLOWS THE 
*  FOLLOWING FORMAT:
* 
*    FORTRAN:  CALL EXEC(ICODE,ICNWD,IQUE,N)
* 
* 
* 
* 
*    ASSEMBLY:
* 
*     EXT EXEC
*      .
*      :
*     JSB EXEC
*     DEF *+5 
*     DEF ICODE 
*     DEF ICNWD 
*     DEF IQUE
*     DEF N 
*   <RETURN>
*      .
*      :
* 
*    WHERE: 
* 
*      ICODE=2 (NORMAL CALLS ASSUME WRITE PATH) 
*      ICNWD=BITS 0-5 ARE THE LOGICAL UNIT #
*              BIT 6 IS 1 TO SPECIFY DMA NEEDED 
*              (NOT USED FOR REMOTE,I.E.,SUBCHANNEL 1 - SEE BELOW)
*       IQUE=ADDRESS OF QUEUE BUFFER CONTAINING 
*                ALL OPERATIONS 
*          N=NUMBER OF "ENTRIES" IN IQUE
* 
* 
*  IQUE CONTAINS A NUMBER OF MULTIPLE WORD ENTRIES
*  WHICH DEFINE OPERATIONS.  MOST PRACTICAL USES OF 
*  THE 2313B WILL REQUIRE MORE THAN ONE OPERATION.
*  ALL OPERATIONS IN IQUE ARE EXECUTED IN ONE CALL
*  TO THE DRIVER.  THIS METHOD PREVENTS ANOTHER 
*  PROGRAM FROM CHANGING SUB-SYSTEM PARAMETERS
*  DURING RELATED OPERATIONS. 
      SPC 2 
*  ONE WORD ENTRIES:
* 
*     TYPE = 1     ISSUE SYSTEM NORMALIZE (NO DMA)
* 
*     TYPE = 2     ISSUE 2930A LOOP ESCAPE (NO DMA) 
* 
*  THREE WORD ENTRIES:
* 
*     TYPE = 3     OUTPUT NUMB WORDS (DMA AVAILABLE - LOCAL ONLY) 
*     NUMB = NUMBER TO OUTPUT 
*     BUFF = ADDRESS OF OUTPUT BUFFER 
* 
*     TYPE = 4     INPUT NUMB WORDS  (DMA AVAILABLE - LOCAL ONLY) 
*     NUMB = NUMBER TO INPUT
*     BUFF = ADDRESS OF INPUT BUFFER
* 
*  FOUR WORD ENTRIES: 
* 
*     TYPE = 5     OUTPUT THEN INPUT NUMB PAIRS (NO DMA)
*     NUMB = NUMBER OF OUT-IN PAIRS 
*     OBUF = ADDRESS OF OUTPUT BUFFER 
*     IBUF = ADDRESS OF INPUT BUFFER
* 
*     TYPE = 6     OUTPUT NUMB ADRS THEN DATA PAIRS (NO DMA)
*     NUMB = NUMBER OF OUT-OUT PAIRS
*     OBF1 = ADDRESS OF CHANNEL BUFFER
*     OBF2 = ADDRESS OF DATA BUFFER 
* 
*     TYPE = 7     OUTPUT NUMB CHAN THEN DATA PAIRS (NO DMA)
*     NUMB = NUMBER OF DATA POINTS TO OUTPUT
*     CHAN = ADDRESS OF THE CHANNEL NUMBER
*     OBUF = ADDRESS OF DATA BUFFER 
* 
*     TYPE = 8     OUTPUT NUMB DATA POINTS SEQUENTIALLY (NO DMA)
*     NUMB = NUMBER OF DATA POINTS TO OUTPUT
*     OBF1 = ADDRESS OF 2 WORD BUFF CONTAINING START & END CHAN 
*     OBF2 = ADDRESS OF DATA BUFFER 
* 
*     TYPE = 9     OUTPUT NUMB ERASE COMMANDS (NO DMA)
*     NUMB = NUMBER OF DACS TO ERASE
*     OBUF = ADDRESS OF CHANNEL BUFFER
*     CMND = ADDRESS OF THE DATA WORD (ERASE) 
* 
*  ADDITIONAL COMMENTS: 
* 
*  IN ALL CASES NUMB MUST NOT BE LESS THAN 0.  FOR ALL BUT
*  TYPE 3 NUMB MUST BE GREATER THEN 0.  FOR TYPE 3 NUMB 
*  MAY BE 0 TO INDICATE OUTPUT BUT DO NOT ENCODE. 
*  (FOR REMOTE NO OUTPUT WILL BE DONE BUT THE WORD WILL 
*  BE SAVED TO BE OUTPUT FOR NEXT ENTRY IF NEEDED.) 
* 
*  FOR TYPE 3 WITH DMA REQUESTED, DMA WILL BE USED
*  WHEN NUMB IS GREATER THAN 2.  FOR TYPE 4 WITH DMA REQUESTED, 
*  DMA WILL BE USED.  DMA IS NEVER USED FOR REMOTE (SUBCHANNEL 1) 
* 
*     TYPES 3 THROUGH 7 MAKE THIS DRIVER A GENERAL
*     PURPOSE MICROCIRCUIT I/O CARD DRIVER
*     (MUST BE SUBCHANNEL 0 -- SEE BELOW) 
******************************************************************
*                                                                *
*     THE RTE MUST BE CONFIGURED FOR SUBCHANNEL 0 FOR LOCAL,     *
*     SUBCHANNEL 1 FOR REMOTE.                                   *
*                                                                *
******************************************************************
      SKP 
********************************************************************
*                                                                  *
*                                                                  *
*        >>>>>>> IMPORTANT NOTE FOR FUTURE MODIFIERS <<<<<<<       *
*                                                                  *
*                                                                  *
*  THIS VERSION OF THE 2313 DRIVER WAS ADAPTED FROM THE RTE-III    *
*   VERSION TO SUPPORT RTE SYSTEMS WITH EXTENDED MEMORY (GREATER   *
*   THAN 32K).  THIS VERSION IS COMPATIBLE ONLY WITH RTE IV        *
*   SYSTEMS.  THIS DRIVER DOES NOT SUPPORT CLASS I-O CALLS.        *
*                                                                  *
*                                                                  *
********************************************************************
      SKP 
************************
*                      *
*  INITIATION SECTION  *
*                      *
************************
      SPC 2 
I.62  NOP 
      JSB CNFGR    CONFIGURE ALL I/O INSTRUCTIONS 
      LDA BIT7     FORM MASK
      CMA            TO TURN OFF
      AND EQT5,I       XMSN ERROR STATUS BIT
      STA EQT5,I         AND RESTORE STATUS WORD
      DLD INTBA,I  \
      CPA EQT1      \ 
      JMP HVDMA      > CHECK FOR DMA ASSIGNED 
      CPB EQT1      / 
      JMP HVDMA    /
      SPC 2 
*                  ** VALID REQUEST CHECK **
      SPC 1 
      LDA EQT1,I    GET REQUEST LIST POINTER
      INA 
      LDB A,I 
      RBL 
      SSB           CLASS OR BUFFERED I-O REQUEST?
      JMP ERROR     YES - CLASS I/O ILLEGAL 
      SLB 
      JMP NORML 
      INA           REIO REQUEST? 
      LDB A,I 
      SSB 
      JMP ERROR    YES -  REIO REQUEST ILLEGAL
NORML EQU * 
      LDA EQT6,I    GET REQUEST CONTROL WORD
      AND B77       MASK REQUEST TYPE 
      CPA TWO      WRITE REQUEST? 
      JMP CHKQU      YES - GOOD 
      CPA THREE    CONTROL REQUEST? 
      CLA,INA,RSS    YES - A=2 FOR RETURN 
ERROR CLA          READ REQUEST - A=1 FOR RETURN
      INA            (ALSO FOR BAD ENTRIES) 
      JMP I.RTN    ERROR RETURN 
      SPC 2 
      SKP 
*  THIS ROUTINE CHECKS A SPECIFIED BUFFER TO SEE IF ANY PART
*   OF IT LIES IN A DISK RESIDENT PROGRAM AREA.  IF ANY PART
*   OF THE BUFFER IS IN A DISK AREA THEN RETURN IS TO (P+1),
*   IF IN LEGAL SYSTEM AREA,RETURN IS TO (P+2). 
* 
*  ENTER WITH (A)=BUFFER ADDRESS, (B)=BUFFER LENGTH 
* 
*  OPERATION:  WE CHECK ALL PHYSICAL PAGES (REPEAT, PHYSICAL) 
*   OCCUPIED WHOLLY OR PARTIALLY BY A BUFFER.  IF ANY SUCH PAGE 
*   IS WRITE PROTECTED, THE DRIVER REJECTS THE CALL.  IF ANY
*   SUCH PAGE IS PART OF A DISK PARTITION, THEN RETURN IS TO
*   (P+1).  OTHERWISE, IF THE BUFFER BEGINS IN SSGA OR SYSTEM 
*   COMMON, RETURN IS TO (P+2): IF BELOW SSGA, THE DRIVER REJECTS 
*   THE CALL.  NOTE THAT ALL PAGES OF THE BUFFER ARE CHECKED SO 
*   THAT THE PARTITION NEED NOT CONSIST OF CONTIGUOUS PAGES.
* 
*   THE USER (REPEAT, USER) MAP IS EXAMINED TO ACCOMPLISH THIS
*   TEST.  NOTE THAT ALL BUFFERS CHECKED HERE WILL BE VISIBLE 
*   FROM THE USER MAP.
      SPC 2 
DRA?  NOP           ENTRY  (A)=ADDRESS,(B)=LENGTH 
      SSA           ERROR IF BUFFER ADDR LESS 
      JMP ERROR       THAN ZER0 
      SZB,RSS       MAKE ZERO LENGTH BUFFERS
      INB            LOOK LIKE ONE WORD FOR THIS CODE 
      STA TEMP4 
      ADB A         ERROR IF
      ADB N1           END ABOVE
      SSB               77777B. 
      JMP ERROR 
      CLA           CLEAR A TEMPORARY TO KEEP TRACK 
      STA PAGES       OF PAGES IN DISC PART OF MEM
      LDA TEMP4     PUT FWA IN A, LENGTH IN B 
      LSR 10         GET PAGE NUMBERS 
      AND B77         AND ISOLATE THEM. 
      SPC 1 
      CMB           GET -NUMBER OF PAGES STRADDLED
      ADB A          BY BUFFER AND
      STB COUNT       SAVE AS LOOP COUNTER. 
      ADA P32       CONVERT START PAGE TO MAP#
      SPC 1 
      LDB MATA.,I   GET MATA ADDRESS
      ADB THREE     POINT TO FIRST USER PARTITION BASE
      LDB B,I         AND LOAD IT 
      SWP           ISOLATE 
      AND M1777       PAGE
      SWP               NUMBER
      INB           IGNORE BASE PAGE
      STB SPFP      AND SAVE IT 
      SPC 1 
LOOP  LDB TEMP.     POINT TO PLACE TO DUMP MAP
      LDX N1        DUMP ONLY ONE REGISTER
      XMM           DUMP MAP TO MEMORY
      LDB TEMP7     PICK UP MAP REG 
      RBL            ERROR IF BIT 14
      SSB             IS SET. 
      JMP ERROR        (WRITE 
      RBR               PROTECTED PAGE).
      SWP           MASK TO 
      AND M1777      PHYSICAL PAGE
      SWP             ADDRESS.
      CMB,INB       IF PHYSICAL PAGE ADDR 
      INB 
      ADB SPFP       IS IN USER PARTITION 
      SSB             THEN INCR COUNTER - MUST BE 
      ISZ PAGES        IN DISC AREA.
      ISZ COUNT     BUMP COUNTER
      JMP LOOP       AND CONTINUE IF MORE.
      SPC 1 
      LDA PAGES     IF ANY PAGES IN DISC AREA 
      SZA             THEN
      JMP DRA?,I        RETURN TO CALLER
      ISZ DRA?            ELSE CHECK IF IN COMMON OR SSGA 
      SPC 2 
*   CHECK IF BUFFER IN COMMON, SSGA OR MEMORY RESIDENT AREA 
      SPC 2 
      LDA MPFT.,I   FETCH MPFT ADDRESS
      ADA FOUR      POINT TO SSGA BASE
      LDA A,I         AND LOAD IT 
      CMA,INA       NEGATE
      ADA TEMP4     ADD BUFFER ADDRESS
      SSA           <0? 
      JMP ERROR     YES - NOT IN LEGAL MEM. RES. AREA 
      JMP DRA?,I    NO - RETURN TO CALLER - BUFFER LEGAL
N1    DEC -1
P32   DEC 32
TEMP. DEF TEMP7 
M1777 OCT 1777
MATA. DEF $MATA    START PAGE OF FIRST USER PARTITION 
SPFP  BSS 1 
PAGES BSS 1 
COUNT BSS 1 
      SKP 
*                  ** CHECK QUEUE BUFFER LENGTH  ** 
      SPC 1 
CHKQU EQU * 
      LDA EQT8,I   CHECK QUEUE
      CMA,INA        BUFFER # OF ENTRIES
      SSA,RSS          >0?
      JMP ERROR          NO - REJECT
      SPC 2 
*                  ** VALID ENTRY TYPES CHECK **
      SPC 1 
      LDB EQT7,I   GET & SAVE 
      STB TEMP1      QUEUE BUFFER ADDRESS 
      STA TEMP2    SAVE ENTRY COUNTER 
      STB TEMP3 
      SPC 1 
*  FIND QUEUE BUFFER LOCATION  *
      SPC 1 
      CLB          SET UP 
      STB QBUF       QUEUE FLAG 
      LDA TEMP3    FETCH QUEUE ADDRESS
      JSB DRA?     FIND LOCATION
      ISZ QBUF     IF QUEUE IN DISK AREA, QBUF=1
*                                  IF QUEUE IN SSGA OR COMMON, QBUF=0 
      SPC 1 
L1    EQU * 
      LDB TEMP1,I  GET CURRENT ENTRY TYPE NUMBER
      ISZ TEMP1    ADVANCE QUEUE BUFFER ADDRESS 
      CPB ONE      TYPE = 1?
      RSS            YES - OK 
      CPB TWO      TYPE = 2?
      JMP L6         YES - OK 
      LDA TEMP1,I  GET NUMBER OF
      STA TEMP5      OPERATIONS AND 
      CMA,SSA,RSS      CHECK FOR <0 
      JMP ERROR          <0 SO REJECT 
      CPB THREE    TYPE = 3?
      JMP L2         YES - OK 
      SZB           IF ENTRY TYPE = 0 THEN ERROR
      CMA,SZA,RSS  CHECK # OF OPERATIONS FOR 0
      JMP ERROR        =0 SO REJECT 
      LDA MIN10    IS TYPE
      ADA B          MORE THAN
      SSA              THREE BUT
      SSB                LESS THAN TEN? 
      JMP ERROR            NO 
      SPC 2 
*                  ** VALID BUFFER  CHECK **
* 
*     IF THE QUEUE BUFFER IS NOT IN A DISK RESIDENT AREA (EITHER RT 
*     OR BACKGROUND) THEN NO DATA BUFFER MAY BE IN A DISK RESIDENT
*     AREA. 
* 
L2    EQU * 
      STB TEMP6     SAVE (B)
      ISZ TEMP1     POINT TO BUFFER ADDR
      LDA QBUF      CHECK QUEUE LOCATION
      CPA ONE       IF QUEUE
      JMP NOSWP      IN DISK AREA - NOT SWAPABLE
      SPC 1 
      SPC 1 
      JSB CPASS     FETCH BUFFER LENGTH 
      LDA TEMP1,I   FETCH BUFFER ADDRESS
      JSB DRA?      CHECK BUFFER LOCATION 
      JMP ERROR     BUFFER IS IN DISK AREA -- ERROR 
      JMP NSWP2     BUFFER IS IN CORE AREA
      SPC 1 
NOSWP EQU *         QUEUE IN DISC AREA
      JSB CPASS     FETCH BUFFER LENGTH 
      LDA TEMP1,I   FETCH BUFFER ADDR 
      JSB DRA?      CHECK BUFFER ADDRESS ANYHOW 
      NOP           (DON'T CARE IF BUFF IN DISC AREA) 
NSWP2 EQU *         BUFFER NOT IN DISC AREA IF ENTRY HERE 
      LDB TEMP6     RESTORE (B) 
      SSB          FIRST BUFFER?
      JMP L3         NO 
      CPB FOUR       YES - TYPE = 4?
      JMP L5                 YES - BUFFER OK
      CPB THREE    TYPE = 3?
      JMP L5         YES - BUFFER OK
      CMB,INB      SET FOR SECOND BUFFER CHECK
      JMP L2
      SPC 2 
CPASS NOP 
      LDB TEMP5     GET DATA LEN FROM Q 
      LDA TEMP6     GET TYPE & BUFF NUMBER FLG
      SSA           1ST BUFFER? 
      JMP PASS2     NO, 2ND 
      CPA SEVEN     YES, IF TYPE 7 CALL 
      CLB,INB        THEN LENGTH IS 1 
      CPA EIGHT       ELSE IF TYPE 8
      LDB TWO          THE LENGTH IS 2
      JMP CPASS,I   RETURN
      SPC 1 
PASS2 CMA,INA       2ND BUFF, COMPL FLAG FOR TYPE 
      CPA NINE      IF TYPE 9 
      CLB,INB        THEN 2ND BUFF LEN IS 1 
      JMP CPASS,I   RETURN
      SPC 1 
NINE  DEC 9 
MIN10 DEC -10 
      SPC 2 
L3    EQU * 
      CMB,INB      RECOVER TYPE 
      CPB FIVE     TYPE = 5?
      RSS            YES - CHECK VALIDITY 
      JMP L5         NO - BUFFERS OK
      SPC 2 
      SPC 2 
*                  ** CHECKED ALL ENTRIES? ** 
      SPC 1 
L5    ISZ TEMP1    ADVANCE QUEUE ADDRESS
L6    ISZ TEMP2    CHECKED ALL ENTRIES? 
      JMP L1         NO - CHECK NEXT ONE
QBUF  BSS 1 
      SKP 
*                  ** NEED DMA? **
      SPC 1 
      LDA REMOT     GET REMOTE/LOCAL FLAG 
      SLA           REMOTE? 
      JMP NODMA     YES, NO DMA 
      LDA EQT6,I   CHECK CONWD BIT 6
      AND BIT6       TO SEE IF DMA
      SZA,RSS          HAS BEEN REQUESTED BY USER 
      JMP NODMA    NOT REQUESTED
      LDA FIVE     COMPLETE TO GET
      JMP I.RTN       DMA ASSIGNED
      SPC 1 
*                  ** DON'T USE DMA **
      SPC 1 
NODMA EQU * 
      LDA EQT6,I   MAKE SURE THAT CONWD 
      AND BX177       IS CLEAR OF 
      STA EQT6,I       UNDESIRABLE BITS 
      JMP OP
      SPC 2 
BX177 OCT 140177
BIT7  OCT 200 
      SPC 2 
*                  ** HAVE DMA ** 
      SPC 1 
HVDMA EQU * 
      LDA EQT6,I   SET CONWD
      AND BX177      FOR DMA
      IOR BIT7         OPERATIONS 
      STA EQT6,I         WHERE POSSIBLE 
      SPC 1 
      LDB EQT9,I
      SPC 1 
      LDA CHAN     CONFIGURE
      JSB DCFGR      DMA INSTRUCTIONS 
      SPC 2 
*                  ** CALL MAIN PROCESSOR **
      SPC 1 
OP    EQU * 
      LDA EQT8,I   CREATE 
      CMA            NUMBER OF ENTRIES
      STA EQT8,I       COUNTER
      CCA          FORCE
      STA EQT10,I    START-UP 
      JSB PROC     START OPERATIONS 
      CLA,RSS      OPERATION INITIATED
      LDA FOUR     IMMEDIATE COMPLETION 
      CLB 
I.RTN EQU * 
      JMP I.62,I     THEN RETURN TO SYSTEM
      SPC 2 
THREE DEC 3 
FIVE  DEC 5 
SIX   DEC 6 
MPFT. DEF $MPFT 
      SKP 
***************************************** 
*                                       * 
*  CONTINUATION AND COMPLETION SECTION  * 
*                                       * 
***************************************** 
      SPC 2 
C.62  NOP 
      LDB EQT1,I   SPURIOUS 
      SZB,RSS        INTERRUPT? 
      JMP SPURI        YES - IGNORE IT
      SPC 1 
      CPA SIX      WAS
      RSS            INTERRUPT
      CPA SEVEN        FROM 
      RSS                DMA
      JMP DEV              NO 
      JSB DCFGR            YES - CONFIGURE DMA
      SPC 1 
CLCD1 CLC HDMA     TURN OFF DMA 
      CCA          FORCE NEW
      STA EQT10,I    ENTRY CHECK
      LDA EQT6,I   IS A DEVICE    \ 
      ALF,ALF        INTERRUPT     CHECKS BIT 9 
      RAR,SLA          REQUIRED?  / 
      JMP CONT           YES
      LDA EQT4,I         NO - GET DEVICE
      AND B77                   SELECT CODE 
      SPC 2 
*                  ** CALL MAIN PROCESSOR **
      SPC 1 
DEV   EQU * 
      JSB CNFGR    CONFIGURE ALL I/O INSTRUCTIONS 
      SPC 1 
      LDA REMOT      REMOTE?
      SLA,RSS        YES - SKIP 
      JMP LOCAL      NO - SKIP STATUS WORD CHECK
LIA2  LIA .2313,C    READ STATUS WORD 
      AND SMASK      SAVE PARITY, MISSED, & RIP BITS
      SZA,RSS         CHECK FOR BAD STATUS
      JMP LOCAL      GOOD STATUS - CONTINUE 
      LDA EQT5,I     BAD STATUS 
      IOR BIT7       SET XMSN ERROR BIT 
      STA EQT5,I      IN STATUS WORD
      JMP PERR       AND RETURN TO CALLER 
LOCAL EQU * 
      LDA EQT6,I   IS A              \
      ALF,ALF        DMA CHANNEL      CHECKS BIT 7
      SSA,RSS          ASSIGNED?     /
      JMP L7             NO 
      DLD INTBA,I  \
      ELA,CLE,ERA   \ 
      ELB,CLE,ERB    \
      CPA EQT1        > GET PROPER
      LDA SIX        /    DMA CHANNEL 
      CPB EQT1      / 
      LDA SEVEN    /
      JSB DCFGR    GO CONFIGURE DMA 
      SPC 1 
L7    EQU * 
      JSB PROC     START OR CONT OPERATION
      JMP CONT     OPERATION CONTINUATION 
      CLB,INB,RSS  ALL OPERATIONS DONE (B=1)
PERR  EQU * 
      CLB           PARITY ERROR(B=0) 
      LDA BIT15    SET A= BIT 15 TO RELEASE DMA 
CLC1  CLC .2313,C  TURN OFF DEVICE
      JMP C.RTN    RETURN TO SYSTEM (COMPLETED) 
      SPC 2 
TWO   DEC 2 
SMASK OCT 100006
      SPC 2 
SPURI EQU * 
      STB EQT15,I  CLEAR TIME OUT ON SPURIOUS INT 
CONT  EQU * 
      ISZ C.62      SET RETURN FOR CONTINUATION 
C.RTN EQU * 
      JMP C.62,I   RETURN TO SYSTEM 
      SPC 2 
ONE   DEC 1 
B77   OCT 77
      SKP 
********************
*                  *
*  MAIN PROCESSOR  *
*                  *
********************
      SPC 2 
PROC  NOP 
      ISZ EQT10,I  CHECK FOR END OF CURRENT ENTRY 
      JMP MORE       MORE TO GO ON THIS ONE 
*                                   ("MORE" ENABLES USER MAP) 
NEXT  EQU * 
      LDA STCC1    SET ENCODE 
      STA STCC2      COMMAND
      ISZ EQT8,I   MORE ENTRIES TO GO?
      RSS            YES
      JMP DONE       NO - ALL DONE
      LDB EQT7,I   GET NEW TYPE NUMBER
      LDB B,I        AND SAVE 
      STB EQT9,I       IT IN EQT
      ISZ EQT7,I   ADVANCE QUEUE ADRS 
      CCA          ASSUME TYPE 1 OR 2 AND 
      STA EQT10,I    SET FOR 1 OPERATION
      CPB ONE      TYPE = 1?
      JMP SYNRM      YES - GO DO A SYSTEM NORMALIZE 
      CPB TWO      TYPE = 2?
      JMP ESCPE      YES - ISSUE 2930A ESCAPE WORD
      SPC 1 
      SPC 1 
      LDA EQT7,I   GET TRANSFER 
      LDA A,I        LENGTH FROM QUEUE BUFFER 
      CMA              MAKE IT A NEGATIVE 
      STA EQT10,I        COUNTER & STORE IN EQT 
      ISZ EQT7,I   ADVANCE QUEUE ADRS 
      LDA EQT7,I   GET 1ST OR ONLY BUFF ADRS
      LDA A,I        AND PLACE IT IN
      STA EQT11,I      EQT IN POSITIONS FOR BOTH
      STA EQT12,I        BUFFER ADDRESSES 
      ISZ EQT7,I   ADVANCE QUEUE ADRS 
      LDB EQT9,I    RESTORE TYPE TO B 
      CPB THREE     TYPE = 3? 
      JMP OUT         DO SIMPLE OUTPUT UNDER USER MAP 
*                                   ("OUT" ENABLES USER MAP)
      CPB FOUR      TYPE=4? 
      JMP IN          DO SIMPLE INPUT UNDER USER MAP
*                                   ("IN" ENABLES USER MAP) 
      LDA EQT7,I   GET 2ND BUFF ADRS
      LDA A,I        AND PLACE IT IN
      STA EQT12,I      THE EQT
      ISZ EQT7,I   ADVANCE QUEUE ADRS 
      SPC 1 
      UJP NEXT3     SWITCH TO USER MAP
NEXT3 CPB FIVE     TYPE = 5?
      JMP OUTPT      YES - GO TO OUTPUT (THEN INPUT)
      LDA EQT11,I  GET & SAVE 
      LDA A,I        THE 1ST WORD OF
      STA EQT13,I      THE 1ST BUFFER 
      LDA EQT10,I  ADJUST THE 
      INA            OPERATIONS COUNTER 
BIT9  ALS              FOR DOUBLE OPERATIONS
      STA EQT10,I        ON THE DUAL DAC
      JMP DAC 
      SKP 
SEVEN DEC 7 
EIGHT DEC 8 
SYN   OCT 140001
      SPC 1 
*                  ** ISSUE SYSTEM NORMALIZE ** 
      SPC 1 
SYNRM EQU * 
      LDA SYN      GET SYSTEM NORMALIZE COMMAND 
      LDB REMOT     GET REMOTE/LOCAL FLAG 
      SLB           REMOTE? 
      JMP R/L       YES,ISSUE COMMAND REMOTE
CLC2  CLC .2313,C   CLC TO GET ENCODE EDGE
OTA1  OTA .2313      AND ISSUE IT 
STCC1 STC .2313,C  DOUBLE ENCODE
      NOP            TO INSURE
STC1  STC .2313        RESPONSE 
      JMP PROC,I   CONTINUATION RETURN
      SPC 1 
FOUR  DEC 4 
BIT8  OCT 400 
      SPC 1 
*                  ** CONTINUATION ** 
      SPC 1 
MORE  EQU * 
      LDB EQT9,I   GET CURRENT TYPE NUMBER
      CPB THREE    TYPE = 3?
      JMP OUTPT      YES - CONT SIMPLE OUTPUT 
      CPB FOUR     TYPE = 4?
      JMP INPT1      YES - CONT SIMPLE INPUT
      CPB FIVE     TYPE = 5?
      JMP INPT2      YES - GO INPUT (THEN OUTPUT) 
      SPC 1 
DAC   EQU * 
      LDA EQT6,I    GET REQUEST CONTROL WORD
      XOR BIT8      TOGGLE BIT 8 FOR MIXED IN/OUT 
      STA EQT6,I    SAVE IT 
      ALF,ALF       POSITION FOR TESTING LATER
      CPB SIX      TYPE = 6?
      JMP BLOCK      YES - GO DO BLOCK SCAN ON DAC
      CPB SEVEN    TYPE = 7?
      JMP SINGL      YES - GO DO SINGLE CHAN ON DAC 
      CPB EIGHT    TYPE = 8?
      JMP SEQTL      YES - GO TO SEQUENTIAL ON DAC
      SLA          TYPE = 9: CHECK CONWD BIT 8? 
      JMP CHANL                CHANNEL # OUTPUT 
      LDA EQT12,I  GET DATA WORD
      LDA A,I 
      JMP R/L       GOTO REMOTE LOCAL OUTPUT
      SKP 
SEQTL EQU * 
      SLA,RSS      DAC SEQ SCAN: CHECK CONWD BIT 8? 
      JMP DATA                     DATA OUTPUT
      LDA EQT13,I  GET ADDRESS TO BE OUTPUT 
      AND DMASK      & ELIMINATE WAIT BIT 
      STA B 
      LDA EQT11,I  GET END CHANNEL
      INA            ADDRESS FOR SEQUENTIAL 
      LDA A,I          SCAN AND CHECK 
      AND DMASK            TO SEE IF
      CPA B                CURRENT CHAN IS END CHAN 
      JMP NWSCN              IT IS - START NEW SCAN 
      LDA EQT13,I  \
      STA B         \ INCREMENT 
      ADB B20       /   CHANNEL # 
      STB EQT13,I  /
      SPC 2 
      CLB,INB      IS THIS THE
      CMB            LAST CHANNEL 
      CPB EQT10,I      TO BE SET? 
      JMP DWAIT          YES - SET WAIT BIT 
      JMP R/L#
      SPC 1 
ESCPE EQU * 
      LDA SCAPE    (GET 2930A ESCAPE WORD)
R/L   EQU *         REMOTE/LOCAL OUTPUT FROM (A) REGISTER 
      STA EQT13,I   SAVE LAST OUTPUT WORD 
R/L#  EQU * 
      LDB REMOT     GET REMOTE/LOCAL FLAG 
      SLB,RSS       LOCAL?
      JMP OTA2      YES 
      SPC 1 
REOUT EQU *         REMOTE OUTPUT ONLY
STCC4 STC .2313,C  SET RECEIVE MODE 
LIB1  LIB .2313,C   CLEAR STATUS
LIB2  LIB .2313     CLEAR DATA
OTA3  OTA .2313     OUTPUT COMMAND WORD TO 2313 
      JMP PROC,I    RETURN AND WAIT FOR FLAG
      SPC 1 
OTA2  OTA .2313    ISSUE A WORD 
* 
*     NOTE:  THE FOLLOWING INSTRUCTION IS NORMALLY A CONFIGURED 
*     "STC SC,C" EXCEPT FOR TYPE 3 ENTRIES WITH N=0. IN THIS
*     CASE, IT IS A "JMP NEXT". 
* 
STCC2 JMP NEXT       AND ENCODE 
      JMP PROC,I   CONTINUATION RETURN
      SPC 2 
B20   OCT 20
DMASK OCT 7776
BIT6  OCT 100 
SCAPE OCT 146000
BIT15 OCT 100000
      SKP 
NWSCN EQU * 
      LDB EQT11,I  DAC SEQ NEW SCAN 
      LDB B,I      RESTORE CURRENT CHAN ADRS
      STB EQT13,I    STORAGE WITH START CHAN ADRS 
      LDA EQT11,I 
      INA 
      LDA A,I 
DWAIT EQU * 
      IOR ONE      SET FLAG WAIT BIT
      JMP R/L#
      SPC 1 
SINGL EQU * 
      SLA,RSS      DAC SINGLE CHAN: CHK CONWD B8? 
      JMP DATA                         DATA OUTPUT
      LDA EQT11,I  GET "THE" CHANNEL
      LDA A,I        NUMBER 
      JMP R/L 
      SPC 1 
BLOCK EQU * 
      SLA,RSS      DAC BLK SCAN: CHK CONWD BIT 8? 
      JMP DATA                     DATA OUTPUT
CHANL EQU * 
      LDA EQT11,I  GET NEXT CHANNEL 
      LDA A,I        NUMBER 
ADVNC EQU * 
      ISZ EQT11,I  ADVANCE CHAN BUFF ADDRESS
      JMP R/L 
      SPC 1 
DATA  EQU * 
      LDA EQT12,I  DAC DATA OUTPUT: 
      LDA A,I        GET DATA WORD FROM BUFFER
      ISZ EQT12,I    ADVANCE DATA BUFF ADDRESS
      JMP R/L#      GO OUTPUT THE DATA WORD 
      SPC 2 
*                  ** SIMPLE OUTPUT (TYPE 3) ** 
      SPC 1 
OUT   EQU * 
      ISZ EQT10,I  ADJUST OPERATIONS COUNTER
      JMP DMCHK      IF >0 OPS THEN GO CHK MORE 
      LDA SAJMP    FOR 0 OPS ELIMINATE
      STA STCC2      ENCODE AND FORCE NEXT ENTRY
      LDA REMOT     \ 
      SLA,RSS        \
      JMP OUTPT     (LOCAL) 
      LDA EQT11,I      SKIP OUPUT BUT 
      LDA A,I            SAVE OUTPUT WORD 
      STA EQT13,I     / 
      ISZ EQT11,I    /
      JMP NEXT      / 
      SPC 1 
OUTPT EQU * 
      LDA EQT11,I  GET OUTPUT WORD
      LDA A,I        FROM BUFFER
      JMP ADVNC 
      SKP 
DMCHK EQU * 
      LDA REMOT     GET REMOTE FLAG 
      SLA           REMOTE
      JMP OUTPT     YES,NO DMA
      LDA EQT10,I  CHECK NUMBER OF
      CMA,INA        OPERATIONS 
      CPA ONE          FOR >2?
      JMP OUTPT          =1 (NO DMA)
      CPA TWO            >1 
      JMP OUTPT          =2 (NO DMA)
      LDA EQT6,I         >2 SO CHECK CONWD
      ALF,ALF                 BIT 7 
      SSA,RSS                   FOR DMA?
      JMP OUTPT                   NO DMA
      ALF,CLE,ALF  SET BIT 9 OF CONWD (DEV INTRPT 
      IOR BIT9       REQUIRED) & CLEAR E (OUTPUT) 
      JMP DMSET    GO START OUTPUT DMA
      SPC 2 
NOT9  OCT 176777
BIT13 OCT 20000 
      SPC 1 
*                  ** SIMPLE INPUT (TYPE 4) **
      SPC 1 
IN    EQU * 
*     UJP IN2       MAKE SURE WE'RE IN USER MAP    *CIO*
      LDA REMOT 
      SLA,RSS 
      JMP IN1 
NCODE EQU * 
      LDA EQT13,I 
      JMP REOUT 
IN1   EQU * 
      LDA EQT6,I   CHECK CONWD
      ALF,ALF        BIT 7 FOR
      SSA,RSS          DMA OPERATION? 
      JMP STCC2           NO DMA - GO ENCODE
      ALF,ALF      CLEAR CONWD BIT 9(NO DEV INTRPT) 
      AND NOT9       REQUIRED) & SET E
      CCE              FOR DMA INPUT
      SPC 1 
*                  ** SET UP & START DMA ** 
*                        (LOCAL ONLY) 
      SPC 1 
DMSET EQU * 
      STA EQT6,I   SAVE CONWD 
      LDA EQT4,I   FORM DMA 
      AND B77        COMMAND WORD 1 WITH DEVICE 
      IOR BIT15        SELECT CODE & STC OPTION 
      SEZ          INPUT? 
      IOR BIT13      YES - SET CLC OPTION 
OTAD1 OTA HDMA     ISSUE CW1 &
CLCD2 CLC LDMA       PREPARE FOR CW2
      LDA EQT11,I  GET BUFFER ADDRESS FOR CW2 
      SEZ            INPUT? 
      IOR BIT15        YES - SET INPUT MODE BIT 
OTAD2 OTA LDMA     ISSUE CW2 &
STCD1 STC LDMA       PREPARE FOR CW3
      LDA EQT10,I  GET TRANSMISSION LENGTH
      SEZ             AS CW3 AND
      INA               ADJUST IF INPUT 
OTAD3 OTA LDMA     ISSUE CW3 - DMA IS NOW READY 
      CLF 0        TURN OFF INTERRUPT SYSTEM
      SEZ,RSS      OUTPUT?
STF1  STF .2313      YES - SET DEVICE FLAG
      SEZ          INPUT? 
STCC3 STC .2313,C    YES - START DEVICE 
STCD2 STC HDMA,C   START DMA TRANSFER 
      CLA          PRIVILEGED I/O 
      CPA DUMMY      PRESENT? 
      JMP PROC,I       NO - CONTINUATION EXIT 
CLCD3 CLC HDMA         YES - TURN OFF DMA INTERRUPT 
      LDB INTBA    GET ADDRESS
      LDA CHAN       OF APPROPRIATE 
      CPA SEVEN        DMA CHANNEL
      INB                IN INTERRUPT 
      LDA B,I              TABLE
      IOR BIT15    SET BIT 15 TO INDICATE THIS DMA
      STA B,I        CHANNEL IS IN USE
      STF 0        TURN INTERRUPT SYSTEM BACK ON
      JMP PROC,I   CONTINUATION EXIT
      SPC 2 
SAJMP NOP 
      SPC 2 
DONE  EQU * 
      ISZ PROC     SET FOR COMPLETION 
      JMP PROC,I     AND RETURN 
      SPC 2 
*                  ** INPUT ROUTINE **
      SPC 1 
INPUT NOP 
LIA1  LIA .2313    GET READING FROM I/O CARD
      LDB EQT12,I  GET BUFFER ADDRESS 
      STA B,I        AND STORE THE READING
      ISZ EQT12,I  ADVANCE BUFFER ADDRESS 
      LDA EQT10,I  GET OPERATION COUNTER
      INA,SZA        AND CHECK FOR DONE?
      JMP INPUT,I      NO - GO ON 
      JMP NEXT         YES - GET NEXT ENTRY 
      SPC 2 
INPT1 EQU *         CONTINUE SIMPLE INPUT OPERATION 
      JSB INPUT    CONTINUE SIMPLE INPUT
      LDB REMOT 
      SLB 
      JMP NCODE 
      JMP STCC2      OPERATION
      SPC 1 
INPT2 EQU * 
      JSB INPUT    CONT INPUT THEN GO 
      JMP OUTPT      OUTPUT NEXT CHAN # 
      SKP 
      SKP 
******************************* 
*                             * 
*  I/O CONFIGURATION ROUTINE  * 
*                             * 
******************************* 
      SPC 1 
CNFGR NOP 
      LDB STCC2    SAVE JUMP
      STB SAJMP      INSTRUCTION
      CLB              FIRST TIME 
      STB *-2            ONLY 
      IOR OTA0     FORM "OTA SC" INST 
      STA OTA1       AND
      STA OTA2         STORE IT 
      STA OTA3
      IOR BIT6     FORM "STC SC" INST 
      STA STC1       AND STORE IT 
      XOR B5000    FORM "CLC SC,C " INST
      STA CLC1       AND STORE IT 
      STA CLC2
      XOR BIT11    FORM "STC SC,C" INST 
      STA STCC1      AND
      STA STCC2        STORE
      STA STCC3          IT 
      STA STCC4 
      XOR B1200    FORM "LIA SC" INST 
      STA LIA1       AND STORE IT 
      IOR BIT9     FORM "LIA SC,C" INST 
      STA LIA2       AND STORE IT 
      IOR BIT11     FORM "LIB SC,C" INSTRUCTION 
      STA LIB1
      XOR BIT9       FORM "LIB SC" INSTRUCTION
      STA LIB2
      XOR BIT8     FORM "STF SC" INST 
      STA STF1       AND STORE IT 
      LDA EQT4,I    GET SUBCHANNEL
      ASR 6         SHIFT TO LSB
      STA REMOT 
      JMP CNFGR,I 
      SPC 2 
REMOT NOP           REMOTE/LOCAL FLAG 
OTA0  OTA 0 
BIT11 OCT 4000
B1200 OCT 1200
B5000 OCT 5000
NB4   OCT -4
      SKP 
******************************************* 
*                                         * 
*  DMA INSTRUCTION CONFIGURATION ROUTINE  * 
*                                         * 
******************************************* 
      SPC 1 
DCFGR NOP 
      STA CHAN     SAVE CHANNEL 
      IOR OTA0     FORM "OTA 6 OR 7" INST 
      STA OTAD1      AND STORE IT 
      ADA NB4      FORM "OTA 2 OR 3" INST 
      STA OTAD2      AND
      STA OTAD3        STORE IT 
      IOR BIT6     FORM "STC 2 OR 3" INST 
      STA STCD1      AND STORE IT 
      IOR BIT11    FORM "CLC 2 OR 3" INST 
      STA CLCD2      AND STORE IT 
      ADA FOUR     FORM "CLC 6 OR 7" INST 
      STA CLCD1      AND
      STA CLCD3        STORE IT 
      XOR B5000    FORM "STC 6,C OR 7,C" INST 
      STA STCD2      AND STORE IT 
      LDB INTBA    \
      SLA           \ 
      INB            \ CLEAR BIT 15 OF
      LDA B,I        /   PROPER INTBL LOC.
      ELA,CLE,ERA   / 
      STA B,I      /
      JMP DCFGR,I 
      SKP 
****************************************
*                                      *
*  BASE PAGE POINTERS AND OTHER EQU'S  *
*                                      *
****************************************
      SPC 2 
A     EQU 0 
B     EQU 1 
.2313 EQU 0 
LDMA  EQU 0 
HDMA  EQU 0 
      SPC 1 
TEMP1 EQU CLCD1 
TEMP2 EQU C.62
TEMP3 EQU OTAD1 
TEMP4 EQU CLCD2 
TEMP5 EQU OTAD2 
TEMP6 EQU PROC
TEMP7 EQU INPUT 
      SPC 1 
INTBA EQU 1654B 
      SPC 1 
.     EQU 1657B    ESTABLISHES REF POINT
EQT1  EQU .+1 
EQT4  EQU .+4 
EQT5  EQU .+5 
EQT6  EQU .+6 
EQT7  EQU .+7 
EQT8  EQU .+8       NEG. COUNT OF # OF ENTRIES
EQT9  EQU .+9       CURRENT ENTRY TYPE #
EQT10 EQU .+10      # BUFFER WORDS IN CURRENT ENTRY 
EQT11 EQU .+11      1ST BUFFER ADDRESS
EQT12 EQU 1771B     2ND BUFFR ADDR(=EQT11 IF NO 2ND)
EQT13 EQU 1772B     LAST WORD OUTPUT (LAST ADDR DAC)
      SPC 1 
EQT15 EQU 1774B     TIME-OUT TIMER
      SPC 1 
CHAN  EQU 1673B 
DUMMY EQU 1737B 
      SPC 3 
******************* 
*                 * 
*  END OF DRIVER  * 
*                 * 
******************* 
      SPC 1 
      END 
                      