ASMB,R,L,C,B
      HED ISA S61.1 DIGITAL INPUT/OUTPUT  A-92413-16004 REV. B
      NAM DI.O,7  92413-16004B  18SEP75 
      ENT DIW,DI,DOLW,DOL,DOMW,DOM
      ENT STEPW,STEP,PSET 
      EXT EXEC,.ENTR,$LIBR,$LIBX,#GET!
      SUP 
******************************************************* 
*     DI,DIW,DOL,DOLW,DOM,DOMW,PSET,STEP,STEPW -
*                   DIGITAL INPUT OUTPUT ROUNTINES FOR 6940 
* 
*     SOURCE: 92413-16004 REV B 
*     RELOC:  92413-18004 REV B 
* 
*     REVISION B BY STEVE SCOVILL 
******************************************************* 
* 
* 
* 
*     DI.O PERFORMS DIGITAL INPUT AND OUTPUT CALLS TO THE 6940
*     USING STANDARD EXEC CALLS.
* 
*     CALLING SEQUENCES:
* 
*     CALL DI(NUM,ICHAN,IDATA,IERR) 
* 
*     CALL DIW(NUM,ICHAN,IDATA,IERR)
* 
*     THE TWO DIGITAL INPUT CALLS DIFFER IN THAT THE DI CALL DOESN'T
*     USE EITHER A GATE OR TME BIT DURING ITS OPERATION.  THE DIW CALL
*     DOES USE THE GATE AND TME BITS AND WAITS FOR A INPUT FLAG FROM
*     THE ADDRESSED CARD
* 
* 
*     CALL DOL(NUM,ICHAN,IDATA,IMASK,IERR)
* 
*     CALL DOLW(NUM,ICHAN,IDATA,IMASK,IERR) 
* 
*     THE OUTPUT VALUE ACTUALLY OUTPUTED TO THE ADDRESSED CARD IS GIVEN 
*     BY THE FOLLOWING LOGICAL EXPRESSION-
* 
*     OUTPUT=(DATA.AND.MASK).OR.(STATUS.AND.(.NOT.MASK))
* 
*     WHERE 
*     DATA IS THE THIRD PARAMETER 
*     MASK IS THE FOURTH PARAMETER
*     STATUS IS THE PREVIOUS OUTPUT 
* 
*     THE TWO OUTPUT CALLS DIFFER IN THAT THE DOL CALL DOESN'T
*     USE THE TME BIT AND HENCE DOESN'T WAIT FOR THE FLAG TO BE 
*     RETURNED FROM THE CARD.  THE DOLW CALL WAITS FOR THIS FLAG
*     BY USING THE TME BIT. 
* 
* 
*     CALL DOM(NUM,ICHAN,IDATA,IDELAY,IERR) 
* 
*     CALL DOMW(NUM,ICHAN,IDATA,IDELAY,IERR)
* 
*     THE DOM CALLS PERFORM MOMENTARY DIGITAL OUTPUT BY FIRST 
*     OUTPUTTING ALL GIVEN DATA WORDS THEN SUSPENDING ITSELF FOR
*     THE GIVEN TIME AND FINALLY CLEARS ALL THE CARDS BY OUT- 
*     PUTTING ZEROS.
* 
*     THERE IS NO DIFFERENCE IN THE DOM AND DOMW CALLS.  BOTH DON'T 
*     USE THE TME BIT.
* 
* 
*     CALL STEP(NUM,ICHAN,IDATA,IERR) 
* 
*     CALL STEPW(NUM,ICHAN,IDATA,IERR)
* 
*     STEP PREFORMS OUTPUT TO THE STEPPING MOTOR CARD.
*     POSITIVE VALUES ARE TO OUTPUT NUMBER ONE, AND NEGATIVE VALUES 
*     ARE TO OUTPUT NUMBER TWO(BIT 11 = ONE). 
* 
*     AS WITH THE DOL CALL, STEP DOESN'T WAIT TO COMPLETE WHILE 
*     THE STEPW DOES.  CARE SHOULD BE USED WHILE PROGRAMMING WITH 
*     THE STEPW CALL AS THE STEPPING MOTOR IS QUITE SLOW (100 HERTZ)
*     AND THERE MAY BE A POSSIBILITY OF INTERFERING WITH THE OPERATION
*     OF HIGHER PRIORITY PROGRAMS.
* 
* 
*     CALL PSET(NUM,ICHAN,IDATA,IERR) 
* 
*     PSET IS USED TO PRESET A COUNTER CHANNEL TO A GIVEN VALUE 
*     FOR THE PRESET COUNTER WITH INTERRUPT FUNCTION.  IT IS DESIGNED 
*     TO BE USED IN CONJUNCTION THE THE EVSNS CALL. 
* 
*     PARAMETER DEFINATIONS 
* 
*     NUM-  INTEGAR NUMBER OF READINGS TO BE TAKEN
*     ICHAN-INTEGAR ARRAY (LENGTH = NUM) OF 6940 CHANNEL NUMBERS
*     IDATA-INTEGAR ARRAY (LENGTH = NUM) OF OF DATA TO BE OUTPUTED
*     MASK- INTEGAR MASK USED TO DETERMINE WHICH BITS GET CHANGED 
*     IDELAY-INTEGAR DURATION OF THE MOMENTARY OUTPUT IN 10'S OF MS 
*     IERR- ERROR PARAMETER 
*                   1=NORMAL OPERATION
*                   2=DEVICE ERROR OR MALFUNCTION 
*                   3=BAD PARAMETER (USUALLY INCORRECT CHANNEL ADDR)
* 
* 
* 
      SKP 
DI    NOP 
      LDA DI        FIX RETURN ADDRESS
      LDB .2         GET IFUNC = 2
      STB IFUNC       (NO GATE) 
      LDB =B170640     AND TME =0 
      JMP DIX 
* 
DIW   NOP 
      LDA DIW       FIX RETURN ADDRESS
      LDB ZERO       GET IFUNC =0 
      STB IFUNC       (WITH GATE) 
      LDB =B170260     AND TME = 1
* 
DIX   STB TME?      SAVE CONTROL WORD 
      CLB            FIX ERROR FOR A FOUR 
      STB ERR         PARAMETER CALL
      JSB SETUP     SET THINGS UP 
* 
*     BUILD EXEC CALL 
* 
      LDA TME?      BUILD 
      ADA UNIT       UP 
      STA IBUFF+1     EXEC
      LDA SLOT         CALL 
      STA IBUFF+2       TO 6940 
* 
      JSB EXEC      CALL
      DEF *+6        6940 
      DEF .1          DRIVER
      DEF LU           TO 
      DEF IBUFF         READ
      DEF .5             ONE
      DEF IFUNC           WORD
* 
      AND =B204 
      SZA,RSS       CHECK FOR BAD STATUS BITS 
      SZB,RSS        OR ZERO XMISSON LOG
      JMP ERR2        GIVE IERR = 2 
* 
      LDA IWORD     FETCH WORD READ 
      AND =B7777  GET RID OF LOWER BITS!
      STA DATA,I     AND SAVE 
      ISZ DATA      BUMP ARRAY
      ISZ CHAN        ADDRESSES 
      ISZ NUM       LAST WORD?
      JMP GET2      NO, READ NEXT WORD
      JMP ENTRY,I   YES, RETURN 
* 
*  INPUT BUFFER 
* 
IBUFF DEC 2         BUFFER
      BSS 2          FOR
.1    OCT 1           READ
IWORD BSS 1            DIRECT 
.2    EQU IBUFF 
      SKP 
* 
* "DOLW" PERFORMS LATCHING DIGITAL OUTPUT 
* THE OUTPUT VALUE IS EQUAL TO THE FOLLOWING LOGICAL EXPRESSION 
* 
* OUTPUT = ( DATA AND MASK ) OR ( STATUS AND MASK' )
* 
* WHERE:
*    DATA - OUTPUT DATA ( 3RD PARAMETER ) 
*    MASK - OUTPUT MASK ( 4TH PARAMETER ) 
*    STATUS - PREVIOUS OUTPUT WORD STATUS 
* 
* 
DOL   NOP             DOL WITHOUT WAIT
      LDA TME0       GET TME = 0
      STA TME?       SAVE TME FLAG
      CLB,INB 
      STB MODE
      LDA DOL       GET RETURN ADDR 
      JMP DOLX      CONTINUE
* 
DOLW  NOP           DOL WITH WAIT 
      LDA TME1      SET TME TO 1
      STA TME?      SAVE TME FLAG 
      CLB 
      STB MODE
      LDA DOLW       FIX RETURN ADDRESS 
DOLX  JSB SETUP     GET CALLING PARAMETERS
      JSB STATS     GET STATUS
      LDA TME?        WITH TME = 1
      ADA UNIT         ADD IN THE UNIT NUMBER 
      STA OBUFF         SAVE IN OUTPUT BUFFER 
      LDA DATA,I    FETCH NEXT OUTPUT 
      AND DELAY,I    WORD, MASK IT AND
      STA TEMP        SAVE RESULT 
      LDA DELAY,I   FORM COMPLEMENT 
      CMA            OF MASK
      AND ADR2,I         AND SAVE APPROPRIATE ADR2ITS 
      IOR TEMP      OR IN NEW BITS AND
      JSB OUTPT      OUTPUT WORD
      ISZ DELAY     BUMP MASK ADDRESS 
      ISZ NUM       LAST ENTRY? 
      JMP GET2      NO, CONTINUE
      JMP ENTRY,I 
      SKP 
* 
* "DOMW" PERFORMS MOMENTARY DIGITAL OUTPUT BY FIRST OUTPUTTING
* ALL GIVEN DATA WORDS THEN SUSPENDING ITSELF FOR THE SPECIFIED 
* TIME, THEN OUTPUTTING ZERO. 
* 
* 
DOMW  NOP           ENTRY POINT 
      LDA DOMW       FIX RETURN ADDRESS 
      JSB SETUP     GET CALLING PARAMETERS
* 
      CLB,INB       SET MODE OF OUTPUT TO 
      STB MODE       WRITE WITH HANDSHAKE 
      JSB STATS     GET STATUS
* 
      LDB TME0        AND TME = 0 
      ADB UNIT         ADD IN THE UNIT NUMBER 
      STB OBUFF         SAVE IN OUTPUT BUFFER 
* 
      LDA DATA,I    FETCH WORD FOR OUTPUT 
      JSB OUTPT      AND GO OUTPUT IT 
      ISZ NUM        LAST WORD? 
      JMP GET2      NO, CONTINUE
* 
      LDA DELAY,I   FETCH DELAY 
      CMA,SSA,INA,SZA  COMPLEMENT AND IF
      RSS             DELAY IS NEGATIVE OR ZERO 
      JMP OUT0      SKIP DELAY
      STA DELAY 
* 
      JSB EXEC      SUSPEND 
      DEF *+6        PROGRAM
      DEF .12         FOR 
      DEF ZERO         SPECIFIED
      DEF .1            TIME
      DEF ZERO
      DEF DELAY 
* 
OUT0  LDA NX2 
      STA SETUP 
     LDA CHAN       RESET CHANNEL 
      ADA NUM1       POINTER TO 
      STA CHAN        FIRST ELEMENT IN ARRAY
NEXT1 JMP GET2
NXT2  JSB STATS     GET STATUS
      CLA           RESET 
      JSB OUTPT      ALL
* 
      ISZ NUM1        OUTPUTS 
      JMP NEXT1        TO ZERO
      JMP ENTRY,I 
NX2   DEF NXT2
      SKP 
* 
*     STEP PERFORMS OUTPUT TO THE STEPPING MOTOR CARD 
*      IF DATA IS NEGATIVE, IT IS MADE POSITIVE 
*       AND THEN BIT 11 IS SET (THE OTHER DIRECTION). 
* 
* 
STEP  NOP           STEP W/O WAIT 
      LDA TME0      SET TME=0 
      STA TME?       SAVE TME FLAG
      CLB,INB 
      STB MODE
      LDA STEP      GET RETURN ADDR 
      JMP STEPX      CONTINUE 
* 
STEPW NOP           STEP WITH WAIT
      LDA TME1       SET TME TO 1 
      STA TME?        SAVE TME FLAG 
      CLB 
      STB MODE
      LDA STEPW     FIX RETURN ADDR 
STEPX CLB           SET ERR FOR A 
      STB ERR        FOUR PARAMETER CALL
      JSB SETUP        AND GET PARAMETERS 
* 
      JSB STATS     GET STATUS(IF ANY)
* 
      LDB TME?      MAKE A CONTROL
      ADB UNIT       WORD WITH TME
      STB OBUFF 
* 
      LDA DATA,I    GET THE DATA, 
      SSA,RSS        AND IF NEGATIVE
      JMP *+3 
      CMA,INA         MAKE POSITIVE 
      IOR M11           AND SET BIT 11
      JSB OUTPT     DO OUTPUT 
* 
      ISZ NUM       MORE? 
      JMP GET2       YES, CONTINUE
      JMP ENTRY,I   RETURN
      SKP 
* 
*     PSET PRESETS A COUNTER CARD TO THE GIVEN VALUE
* 
PSET  NOP 
      CLA           SET ERR FOR A 
      STA ERR        FOUR PARAMETER CALL
      LDA PSET        FIX RETURN ADDR 
      JSB SETUP         GET CALLING PARAMETERS
* 
      LDA TYPE      CHECK FOR 
      CPA .8         A COUNTER CARD 
      RSS             IF NOT
      JMP ERR3         GIVE ERROR 3 
* 
      CLB,INB       SET MODE
      STB MODE       TO HANDSHAKE 
* 
      LDB TME0      SET CONTROL WORD 1
      ADB UNIT       TO TME=0 
      STB OBUFF       PLACE IN BUFFER 
      LDA DATA,I
      JSB OUTPT     DO THE OUTPUT 
      ISZ NUM       DONE? 
      JMP GET2       NO,CONTINUE
      JMP ENTRY,I   YES, RETURN 
      SKP 
* 
*     SETUP: SAVES A FEW WORDS
* 
SETUP NOP 
      STA ENTRY     STORE ENTRY 
      JMP ENTRY+1     GET CALLING PARAMETERS
* 
NUM   NOP 
CHAN  NOP 
DATA  NOP 
DELAY NOP 
ERR   NOP 
* 
ENTRY NOP 
      JSB .ENTR 
      DEF NUM 
* 
      LDA ERR       SEE IF ERR
      SZA            IS ZERO (DIGIN)
      JMP *+3 
      LDA DELAY     IF SO, PUT DELAY
      STA ERR        INTO ERR 
* 
      LDA .1        SET ERR 
      STA ERR,I      TO 1 
      LDA NUM,I     MAKE NUM
      CMA,INA        NEGATIVE 
      SZA           IF ZERO,
      SSA,RSS        OR POSITIVE
      JMP ERR3      GIVE ERROR 3
      STA NUM 
      STA NUM1
* 
*     GET TABLE VALUES
* 
GET2  LDA CHAN,I    GET CHAN
* 
      JSB #GET! 
LU    NOP 
TYPE  NOP 
REL#  NOP 
ADR   NOP 
      SSB           ERROR?
      JMP ERR3      CHAN OUT OF RANGE 
* 
      ADA .M1 
      DIV .15 
      STA UNIT      SAVE UNIT 
      BLF,BLF 
      BLF           MOVE SLOT TO MSB'S
      STB SLOT       AND SAVE 
      JMP SETUP,I 
      SKP 
* 
* "OUTPT" PERFORMS OUTPUT TO 6940 AND UPDATES OUTPUT STATUS 
*  TABLE. 
* 
OUTPT NOP 
      AND B7777     MASK DATA AND 'OR'
      IOR SLOT       WITH SLOT
      STA OBUFF+1      TO FORM OUTPUT WORD
* 
      LDA ADR2      GET STATUS ADDR 
      LDB OBUFF+1    AND OUTPUT WORD
      ISZ CHAN
      ISZ DATA
* 
      JSB $LIBR 
      NOP 
      STB 0,I 
      JSB $LIBX 
      DEF *+1 
      DEF *+1 
* 
WRITE JSB EXEC      PERFORM 
      DEF *+6        DIGITAL
      DEF .2          OUTPUT
      DEF LU           TO 
      DEF OBUFF         6940
      DEF .2
      DEF MODE
* 
      AND =B204     CHECK FOR BAD STATUS BITS 
      SZA,RSS 
      SZB,RSS        OR ZERO XMISSION LOG 
      JMP .ERR2        ERROR 2
      JMP OUTPT,I 
* 
*     CONSTANTS, CONTROL WORDS, STORAGE 
* 
.M1   DEC -1
ZERO  DEC 0 
.3    DEC 3 
.5    DEC 5 
.8    DEC 8 
.12   DEC 12
.15   DEC 15
B7777 OCT 7777
M11   OCT 4000
* 
TME0  OCT 170140
TME1  OCT 170160
TME?  NOP 
* 
UNIT  NOP 
SLOT  NOP 
NUM1  NOP 
MODE  NOP 
ADR2  NOP 
IFUNC NOP 
* 
*     OUTPUT BUFFER 
* 
OBUFF NOP 
      NOP 
* 
*     GET STATUS ADDR(IF ANY) 
* 
STATS NOP 
      CLA           CLEAR PHONEY
      STA ADRX,I     STATUS 
      LDA TYPE      IF TYPE OF CARD 
      CPA .3         DI/O USE STATUS FROM BUFFER
      JMP TABLE 
      LDA ADRX      ELSE, USE PHONY 
      STA ADR2       (ZERO) STATUS
      JMP STATS,I     AND RETURN
TABLE CCA           LOCATE THE
      ADA REL#       REAL STATUS
      ADA ADR         IN THE
      STA ADR2         CONFIGURATION TABLE
      JMP STATS,I   AND RETURN
* 
ADRX  DEF *+1 
      NOP 
* 
*     WHATS EQUAL TO WHAT 
* 
DOM   EQU DOMW
TEMP  EQU DOLW
* 
*     ERRORS
* 
.ERR2 LDA OBUFF 
      AND =B20
      SZA,RSS 
      JMP ERR2
      LDA OBUFF 
      AND =B170057
      STA OBUFF 
      JSB EXEC
      DEF *+6 
      DEF .2
      DEF LU
      DEF OBUFF 
      DEF .1
      DEF MODE
      RSS 
ERR3  ISZ ERR,I 
ERR2  ISZ ERR,I 
      JMP ENTRY,I 
      END 
                                                                                                                                                                                                                                                  