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