@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ÅÙÔÁ×@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@åÖÓñÁôñðùó@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@æÈÄÙñ@ÄÁãÁ@@@@@@@@@@@@@@@ðøð@ðñððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ðñððñ@ÄÄÙñ@ÄÁãÁðù@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@ÄÄÙñ@ÄÁãÁñð@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@ÄÄÙñ@ÄÁãÁññ@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@ÄÄÙñ@ÄÁãÁñò@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@ÄÄÙñ@ÄÁãÁñó@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@ÄÄÙñ@ÄÁãÁñô@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@ÄÄÙñ@ÄÁãÁñõ@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@ÄÄÙñ@ÄÁãÁñö@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@ÄÄÙñ@ÄÁãÁñ÷@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@ÄÄÙñ@ÄÁãÁñø@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@ÄÄÙñ@ÄÁãÁñù@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@ÄÄÙñ@ÄÁãÁòð@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@ÄÄÙñ@ÄÁãÁòñ@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@ÄÄÙñ@ÄÁãÁòò@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@ÄÄÙñ@ÄÁãÁòó@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@ÄÄÙñ@ÄÁãÁòô@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@ÄÄÙñ@ÄÁãÁòõ@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@ÄÄÙñ@ÄÁãÁòö@@@@@@@@@@@@@ðøð@÷ôððñ@÷óðòö@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷ôððñ@åååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå åååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå åååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå åååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå RSTS70 DECRT11A åååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå Î,kQC%» ¸8Rˆ,kQC%» ¸8á T~kQ/C%» åååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå¸8õZhMkQC%» ¸8áyhkQ"C%» ¸8R~E kQC%» ¸8„:‚Låååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå IF DF THE EXTENDED INSTRUCTION SET IS AVAILABLE(KE-11E) ;BAMLT$ IF DF, THE ROUTINES TO GET(BAGTM) AND RELEASE(BARLM) ; MULTIPååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååLE CONTIGUOUS BUFFERS WILL BE INCLUDED. .SBTTL MACROS & GLOBALS .MCALL .SETTOP,.REGDE,$SOB,$DIV,$SPL .REGDE ;GLOBALS DååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååEFINED LOCALLY .GLOBL BAINT,BAGET,BAREL,BAWDS,BALL,BAAHL,BASIZ,BACNT,BBASIZ,BAEROR .IIF DF BAMLT$ .GLOBL BAGTM,BARLM ;GLOBAkQ2C%» ¸8•}kQC%» ¸8&õvkQxC%» ¸8ÉdÀDkQ5C%åååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå» ¸8]zÀ!kQ=C%» ¸8{3XkQC%» ¸8zòGkQ C%.TITLE BUFALL BUFFER ALLOCATION ;LAB APPLICATIONS-11 ;DEC-11-SLABA-C-LA ;FILENAME BUFALL.MAC ;FILE ID BUFALL.6 .CSECT BUFA» ¸8  LL ;COPYRIGHT (C) 1975 ;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ;THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A ;SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLUSION ;OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANY OTHER COPIES ;THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ;OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO AGREES ;TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE SOFTWARE ;SHALL AT ALL TIMES REMAIN IN DEC. ;ååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååTHE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE ;WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A ;COMMITMENT BY DIGITAL ååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååEQUIPMENT CORPORATION. ;DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ;ITS SOFTWARE ON EQUIPMENT WHICH IS NOT ååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååSUPPLIED BY DEC. ;LDP SOFTWARE DEVELOPMENT, FEB. 1975 ; CARL RALSTON ;THE BUFFER ALLOCATION MODULE IS USED TO DYNAMICALLYåååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå CONTROL ;THE USE OF THE FREE CORE AREA AS DISCRETE UNITS(BUFFERS). .SBTTL CONDITIONAL ASSEMBLY PARAMETERS EXPLANATIONS ;EISP OF FREE CORE. ;6. PLACE THE BUFFER ADDRESSES IN THE BUFFER USE TBL AS FREE. ;7. ABS. LOC. 50 WILL CONTAIN THIS JOB'S HIGH COUF THAN TBL LENGTH MOV R0,BACT ;# OF BUFFERS BLE BAERR ;NO BUFFERS? ASL R2 ;# OF BYTES NEEDED MOV #BAAHL,R5 ;R5-> BAARE LIMIT. ;8. IF BUFFERSIZE IS .LT. 256 THEN BACNT IS THE # OF BUFFERS IT ; TAKES TO MAKE 256. OTHERWISE = 0. ;CALL VIA JSHL SUB R2,@R5 ;NEW ACTIVE HIGH LIMIT MOV @R5,R1 ;R1 -> TBL MOV R1,ADRTBL ;ADR OF THE BUFFER USE TBL ROR R3 ;C=0, SO BR PC,BAINT BAINT: JSR PC,SAVARG ;SAV REGS CLR BAEROR ;ZERO RUNTIME ERROR COUNTER MOV R0,R4 ;SAV BUF SIZE TEMP MOV R0,IT 15 =0, WD ADDR 10$: MOV R3,(R1)+ ;SETUP BUFFER USE TBL ENTRIES ADD R4,R3 ;UP BY BASIZ $SOB R0,10$ ;LOOP FOR ALL BUFFER(PC)+ ;TUCK IT AWAY BASIZ: 256. ;BUFFER SIZE IN WORDS ASL R0 ;TIMES 2 MOV R0,(PC)+ ;BUFFER SIZE IN BYTES BBASIZ: 512. S CLR @R1 ;0 ENDS THE TBL & C=0 12$: JSR PC,RSTARG RTS PC BAERR: SEC ;INDICATE ERROR BR 12$ ;AND RTN .DSABL LSB B .SETTOP #-2 ;HOW MUCH FREE CORE? MOV R0,BAAHL ;INIT ACTIVE HIGH TO ABS HIGH. MOV R0,R1 ;ALSO AT ABS LOC 50 MOV BALL,R3 ALIM: .LIMIT ;1ST WD IS LOW ADDR. BALL =BALIM+2 ;2ND WD IS HIGH ADDR OF CODE .SBTTL BAGET - GET A BUFFER ;BAGET STORES THE ;TOP OF CODE SUB R3,R1 ;DIFF IS FREE CORE ROR R1 ;FREE CORE IN WDS, C WAS 0 CLR BACNT ;=0 IF BASIZ IS 256 OR GREATER ADDRESS OF A FREE BUFFER IN THE LOCATION ;POINTED TO BY R0. IF NO BUFFERS ARE FREE ;THE C BIT IS SET ON RETURN. ;CALL VIA JSRLS DEFINED EXTERNALLY .GLOBL SAVARG,RSTARG .SBTTL LOCAL DEFINITIONS PS=177776 ;ADDR OF PROGRAM STATUS WORD B15=100000 ; CMP R4,#512. ;IF .GT. 512 DOES NOT NEED .ENABL LSB BGT 4$ ;TO BE A POWER OF 2. MOV R4,R5 MOV R5,-(SP) ;TEST IF BUF SIZBUFFER USE BIT FOR CLEARING & SETTING ;THE BUFFER USE TABLE POINTED TO BY 'ADRTBL' IS A TABLE ;OF THE BUFFER ADDRESSES DIVIDEDE IS NEG @SP ;A POWER OF 2, FORM MASK BIC (SP)+,R5 ;Z=1 IF POWER OF 2 BNE BAERR ;HAD MORE THAN 1 BIT ON CMP R4,#256. ; BY 2 SO THE SIGN BIT CAN BE ;USED AS AN INDICATION IF THE BUFFER IS IN USE OR NOT. ;THE BUFFER IS FREE IF BIT 15 =0, AND IN UDO WE NEED TO SETUP BACNT BGE 4$ ;BR IF NO, ALREADY 0 2$: ADD R4,R5 ;BUFSIZE TO R5 INC (PC)+ BACNT: 0 ;# OF BUFFERS = SE IF BIT 15 =1. ;THE TABLE IS TERMANIATED WITH A 0 ENTRY. .SBTTL BAINT - SUBR. ;R0 CONTAINS THE SIZE IN WORDS OF AN INDIVI256 CMP #256.,R5 ;LOOP UNTIL R5=256 BGT 2$ ;NOW GET SOME SPACE FOR THE BUFFER ADDR USE TBL. 4$: CLR R0 ;FREECORE/BASIZ DUAL BUFFER ON ENTRY. ;BUFFER ALLOCATION INITIALIZE ROUTINE DOES THE FOLLOWING: ;1. DETERMINES HOW MUCH FREE CORE AVAILABLE ;$DIV R4,R0 ;R0=QUOT, R1=REM INC R0 ;ROUND UP, FOR TBL LENGTH 6$: CMP R1,R0 ;WDSFRE MUST BE .GE. # NEEDED FOR TBL BHIS 8$2. IF BUFFER SIZE IS .LE. 512 SEE IF A POWER OF 2, IF NOT GIVE ERROR. ;3. SET VALUE IN BAAHL. BALL IS SET BY .LIMIT ;4. NUMBER ;BR IF ENOUGH ROOM FOR TBL DEC R0 ;1 LESS BUFFER ADD R4,R1 ;INCREASE WDSFRE BY BASIZ BR 6$ ;TRY AGAIN 8$: SUB R0,R1 OF BUFFERS WE HAVE AND ANY WORDS LEFT OVER WILL ; GO TO THE WORDS ROUTINE. ;5. GET SPACE FOR THE BUFFER USE TBL FROM THE TO ;WDSFRE-TBL LENGTH=WDSFRE MOV R1,WDSFRE ;# OF WDS REMAINING FOR BAWDS MOV R0,R2 ;MAKE A COPY OF LENGTH DEC R0 ;1 LESS BSO C=0 RTS PC 4$: MOV (SP)+,@#PS BR 2$ ;TRY AGAIN .SBTTL BAREL - RELEASE A BUFFER ;BAREL RELEASES(FREES) A BUFFER WHOSSPACE BR 2$ ;TEST AGAIN 10$: SUB @SP,WDSFRE ;REMOVE SOME FREE WDS ASL @SP ;BY 2 FOR ADDR SUB @SP,BAAHL ;ACT HIGH-# NEEDE ADDR IS ;PASSED IN R0. THIS ADDR IS USED TO CLEAR THE ;APPROPERIATE BIT IN THE BITMAP. IF THE BUF WAS ALREADY FREE, ;NO EED=NEW ACT HIGH MOV (PC)+,@SP ;RESULT ADDR & C=0 BAAHL: 0 ;ACTIVE HIGH LIMIT 12$: MOV (SP)+,R0 ;RST REG RTS PC .DSABL RROR IS RETURNED. THE ADDR MUST BE IN THE BUFFER AREA ;(OBTAINED FROM BAGET) SINCE NO ERROR CHECKING IS DONE. ;CALL VIA JSR PLSB .SBTTL BAGTM - GET MULTIPLE CONTIGUOUS BUFFERS ;BAGTM STORES THE ADDR OF THE FIRST FREE BUFFER IN A LOC ;POINTED TO BY C,BAREL BAREL: SEC ;WE ARE LOOKING FOR A BUF IN USE ROR R0 ;SO SIGN BIT WILL BE SET. MOV R1,-(SP) ;SAV REG MOV ADRTBL,R0. THE NUMBER OF CONTIGUOUS BUFFERS REQUIRED IS ;PASSED IN R1. IF NO FREE CONTIGUOUS SPACE IS FOUND ;THE C BIT WILL BE SET. R1 ;R1 -> TABLE 2$: TST @R1 ;ARE WE AT END OF TBL? BEQ 4$ ;BR IF YES CMP (R1)+,R0 ;IF = THEN FREE THIS BUF BNE 2$ ;KEE;CALL VIA JSR PC,BAGTM .IF DF BAMLT$ BAGTM: MOV R0,-(SP) ;SAV PTR MOV R1,-(SP) ;SAV # OF BUF NEEDED 1$: MOV ADRTBL,R0 ;RP LOOKING BIC #B15,-(R1) ;MAKE IT FREE 4$: MOV (SP)+,R1 ;RST REG RTS PC .SBTTL BAWDS - GET SPACE FOR # OF WORDS ;BAWDS 0 -> TABLE 2$: MOV @SP,R1 ;# REQUIRED FOR CTR 4$: TST (R0)+ ;TEST TBL ENTRY FOR, BLT 4$ ;NEG THEN IN USE BGT 10$ ;0 THSUPPLIES THE STARTING ADDR OF SPACE FOR A ;GIVEN NUMBER OF WORDS. THE SIZE OF THE AREA ;NEEDED IS IN R0 AND ON RETURN R0 CONTEN END OF TBL BR 8$ ;NONE FREE, ERROR 6$: TST (R0)+ ;ARE NEXT N-1 FREE BGT 10$ ;BR IF FREE BNE 2$ ;BR IF IN USE 8$: AINS THE ST ADDR ;OF THAT AREA. THIS AREA STARTS AT HIGH CORE AND ;WORKS DOWN. THIS ROUTINE IS NOT REENTERANT. ;CARRY SET IF MOV (SP)+,R1 ;POP BEFORE ERROR RTN BR ERRRTN ;ERROR RTN 10$: $SOB R1,6$ ;IF WE FALL THRU LOOP, THEN WE MOV @SP,R1 ;HAVE NO SPACE AVAILABLE. ;CALL VIA JSR PC,BAWDS .ENABL LSB BAWDS: MOV R0,-(SP) ;SAV # REQUESTED 2$: CMP (PC)+,@SP ;ENOUGH SPACFOUND ENOUGH FREE BUFFERS. MOV @#PS,-(SP) ;SAVE STATUS $SPL 7 ;NO INTERRUPTS WHILE WE SET BITS 12$: TST -(R0) ;IS BUFR ST PC,BAGET BAGET: MOV R0,-(SP) ;SAV PTR MOV (PC)+,R0 ;R0 -> BUF ADDR TBL ADRTBL: 0 ;ADDR OF BUFFER USE TBL 2$: TST (R0)+E CURRENTLY? WDSFRE: 0 ;# OF WDS FREE TO BE USED BHI 10$ ;BR IF YES MOV (PC)+,R0 ;# OF BUFFERS BACT: 0 BLE ERRRTN ;N ;CHECK TBL ENTRY BLT 2$ ;IF<0 THEN IN USE BEQ ERRRTN ;IF>0 THEN FREE, 0 ENDS TBL MOV @#PS,-(SP) ;FOUND IT!, SAVE CURREO BUFFERS TO GET SPACE FROM DEC BACT ;ONE LESS BUFFER ASL R0 ;BY 2 FOR ADDR ADD ADRTBL,R0 ;R0 -> END OF TBL TST -(R0) NT STATUS $SPL 7 ;DISABLE INTR WHILE SET BUFR IN USE TST -(R0) ;IS BUFR STILL FREE? BLT 4$ ;NO, RESTORE PS & TRY AGAIN ;IS LAST BUFFER FREE? BGT 6$ ;YES IF >0 ERRRTN: INC (PC)+ ;BUMP ERROR CTR ON EACH ERROR BAEROR: 0 ;# OF BUFR REQUESTS U MOV @R0,@2(SP) ;GET TBL ENTRY BIS #B15,@R0 ;SET IN USE BIT MOV (SP)+,@#PS ;RESTORE IT ASL @(SP)+ ;BIT 15=0 BEFORE ASL, NABLE TO FILL SEC ;C=1 IF NO ROOM BR 12$ ;ERROR RTN 6$: CLR @R0 ;NEW END OF TBL ADD BASIZ,WDSFRE ;BUF TO THE FREE WD D MOV (SP)+,@#PS ;RESTORE STATUS MOV @R0,R0 ;ADDR FROM TBL ASL R0 ;BY 2 FOR ADDR CLC ;NO ERROR MOV (SP)+,R1 ;RST #MPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLUSION ;OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANY OTHER COPIES ;TH REQUIRED MOV R0,@(SP)+ ;ADDR OF 1ST BUFFER RTS PC 16$: MOV (SP)+,@#PS BR 1$ .SBTTL BARLM - RELEASE MULTIPLE CONTIGUOUEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ;OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO AGREESS BUFFERS ;BARLM RELEASES(FREES) MULTIPLE CONTIGUOUS BUFFERS WHOSE STARTING ;ADDR IS PASSED IN R0. R1 CONTAINS THE NUMBER OF ;TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE SOFTWARE ;SHALL AT ALL TIMES REMAIN IN DEC. ;THE INFORMATION IN THIBUFFERS TO FREE. ;THIS ROUTINE DOES NO ERROR CHECKING ;SO THE ADDRESSES MUST BE LEGAL(COME FROM BAGTM). ;R0 & R1 ARE CHANGED,S DOCUMENT IS SUBJECT TO CHANGE ;WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A ;COMMITMENT BY DIGITAL EQUIPMENT CORPORATION. ALL OTHERS REG ARE SAVED. ;CALL VIA JSR PC,BARLM BARLM: SEC ROR R0 ;NOW SIGN BIT IS ON MOV R2,-(SP) ;SAV REG MOV ADR ;DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ;ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. ;LTBL,R2 ;R2 -> TABLE 2$: TST @R2 ;0 ENDS THE TBL BEQ 6$ ;BR IF AT END CMP (R2)+,R0 ;IF = THEN AT RIGHT PLACE BNE 2$ TSDP SOFTWARE DEVELOPMENT, MARCH 1975 ; CARL RALSTON ;THE MERGE MODULE TAKES BUFFERS SMALLER THAN 256 WORDS AND ;COMBINES THET -(R2) ;BACKUP 1 WD 4$: BIC #B15,(R2)+ ;MAKE N BUFFERS FREE $SOB R1,4$ 6$: MOV (SP)+,R2 ;RST REG RTS PC ;RTN .ENDC .M INTO A 256 WORD BUFFER. .MCALL .REGDEF,$SOB .REGDEF ;GLOBALS DEFINED LOCALLY .GLOBL MERGE ;GLOBALS DEFINED EXTERNEND ALLY .GLOBL BAGTM,BACNT,CTOBUF .IIF NDF CTREL$ .GLOBL BAREL ;THE SOLE FUNCTION OF THIS ROUTINE IS TO TAKE BUFFERS ;SMALLER THAN 256 WORDS BUT A POWER OF 2 IN SIZE AND COMBINE THEM ;INTO A 256 WORD BUFFER. THIS OUTPUT BUFFER IS NORMALLY PASSED TO ;THE THROUGHPUT ROUTINE BECAUSE THE THROUGHPUT ROUTINE REQUIRES ;INPUT BUFFERS THAT ARE A WHOLE NUMBER MULTIPLE OF 256 WORDS. ;THE MERGE MODULE IS JUST ANOTHER PROCESS IN THE CONTROL MODULE ;SCHEME. AS SUCH, R0 AND R1 POINT TO WORD PAIRS OF INFO: ;.TITLE MERGE ;LAB APPLICATIONS-11 ;DEC-11-SLABA-C-LA ;FILENAME MERGE.MAC ;FILE ID MERGE.5 .CSECT MERGER ;COPYRIGHT (C) 1 R0 => OUTPUT BUFFER ADDR. OR 0 FOR NON-YET ; INDEX INTO BUFFER OR LAST BUFFER INDICATOR (LBI) ; R1 => ADDR OF INPUT BUFILL FREE? BLT 16$ ;NO, RST PS & TRY AGAIN BIS #B15,@R0 ;BACKUP N SETTING THEM IN USE $SOB R1,12$ ;LOOP UNTIL ALL SET USE975 ;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ;THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A ;SINGLE CONOT LAST BUF, LBI IS - CMP #256.,R0 ;IS THE OUTPUT BUFFER FULL? BGT 16$ ;BR IF NOT FULL 12$: JSR PC,CTOBUF ;PASS OUTPUT BUDED BY CONTROL MODULE .IF DF,FG$ .GLOBL CTRUN .ENDC .GLOBL SAVRG,RSTRG,SAVARG,RSTARG;PROVIDED BY GENERAL SUBROUTINES MODULF TO CTRL MODULE BCS 18$ ;ERROR, CTRL MOD ALREADY KNOWS! 16$: NEG @R4 ;MAKE INDEX POSITIVE IF NOT A FULL BUF, 18$: .IF NDFE ;INTERNAL GLOBALS .GLOBL ATINIT,ATSAMP,ATIDIG,ATEROR ;CONDITIONAL ASSEMBLY PARAMETERS ;LPS11$ OR AR11$ ONE FER ; LBI (NON-NEGATIVE IS THE LAST BUFFER) ;THE OUTPUT INDEX IS ASSUMED TO BE 0 ON THE 1ST CALL AND IS ;ZEROED BY CT CTREL$ MOV (SP)+,R0 JSR PC,BAREL .ENDC CLC ;OTHERS DO NOT MATTER. RTS PC .END OBUF EACH TIME CTOBUF IS CALLED ;TO PASS THE OUTPUT BUFFER. THE OUTPUT ADDR. IS ALSO ;ZEROED BY CTOBUF. ; *** NOTE *** ;TH.TITLE AWITHT ACQUISITION WITH THRESHOLDING MODULE ;LAB-APPLICATIONS-11 ;DEC-11-SLABA-C-LA ;FILENAME AWITHT.MAC ;FILE ID AWIIS ROUTINE DOES NOT SAVE ANY REGISTERS BECAUSE ;IT IS NOT NECESSARY WHEN USED UNDER THE CONTROL MODULE. ;IT USES REGISTERS R0,THT.6 .CSECT AWITHT ;COPYRIGHT (C) 1975 ;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ;THIS SOFTWARE IS FURNISHED UNDR1,R2,R3,R4. MERGE: MOV R0,R4 ;OUTPUT BUFFER INFO PTR MOV R1,R3 ;INPUT BUFFER INFO PTR .IIF NDF CTREL$ MOV R1,-(SP) ;SAER A LICENSE FOR USE ONLY ON A ;SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLUSION ;OF THE ABOVE COPYRIGHT NOTICVE BUFFER ADDR TST @R4 ;IF OUTPUT BUFFER ADDR IS 0, BNE 2$ ;THEN WE MUST GET ONE. MOV BACNT,R1 ;# OF BUFFERS THAT = 256.E. THIS SOFTWARE, OR ANY OTHER COPIES ;THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ;OTHER PERSON EXCEPT FO JSR PC,BAGTM ;STORE BUF ADDR @R0 BCC 2$ ;NO OUTPUT BUFFERS AVAILABLE .IF NDF CTREL$ MOV (SP)+,R0 ;RELEASE INPUT BUFR R USE ON SUCH SYSTEM AND TO ONE WHO AGREES ;TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE SOFTWARE ;SHALL AT ALL TIMES JSR PC,BAREL SEC ;INDICATE ERROR .ENDC RTS PC 2$: MOV (R4)+,R0 ;OUTPUT BUF ADDR ADD @R4,R0 ;ADD WORD OFFSET ADD @ REMAIN IN DEC. ;THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE ;WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A ;COR4,R0 ;MAKE AN ADDR. MOV (R3)+,R1 ;INPUT BUF ADDR MOV @R3,R2 ;INPUT LBI BEQ 12$ ;IF=0, LAST BUF WITH NO WORDS. BPL 4$MMITMENT BY DIGITAL EQUIPMENT CORPORATION. ;DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ;ITS SOFTWARE ON EQU NEG R2 ;MAKE + WORD COUNT 4$: INC R2 ;FOLD WORD COUNT TO SPEED XFER ASR R2 BCC 8$ 6$: MOV (R1)+,(R0)+ ;INPUT BUF TO OIPMENT WHICH IS NOT SUPPLIED BY DEC. ;LDP SOFTWARE DEVELOPMENT, JUNE 1975 .SBTTL MACRO DEFS,GLOBALS, AND CONDITIONAL ASSUTPUT BUF 8$: MOV (R1)+,(R0)+ $SOB R2,6$ ;LOOP UNTIL ALL TRANSFERRED SUB -2(R4),R0 ;DETERMINE OUTPUT INDEX ASR R0 ;WORDEMBLY PARAMETERS .MCALL ..V2..,.REGDEF,.INTENT,.PROTECT,.SYNCH,.RSUM,.DEVICE .MCALL $ADDEF,$SOB,$DIV,$SPL,.GTJB $ADDEF . OFFSET MOV R0,@R4 ;STORE INDEX FOR FUTURE TST @R3 ;PASS LAST BUF TO CM? BPL 12$ ;BR IF LAST BUF, LBI IS + NEG @R4 ;.V2.. .REGDEF ;EXTERNAL GLOBALS .GLOBL BAGET,BAREL,BASIZ ;PROVIDED BY BUFFER ALLOCATOR .GLOBL CTIBUF,CTIDON ;PROVIE ; VALUE AT WHICH TO SET THE THRESHOLD ; C)OBTAINING THE NUMBER OF SAMPLES TO AVERAGE IN ORDER ; TO CALCULATE A BASR A/D F/B MOV (R5)+,R0 ;GET CLOCK FREQ. ASL R0 ADD #400,R0 ;SET CLOCK STATUS WORD(MODE 2) MOV R0,@#CLKSAD ;STORE CLOCK ELINE VALUE. ; D)SET UP A/D CHANNELS FOR SAMPLING ; E)ACQUIRE INITIAL DATA STORAGE BUFFER ADDRESSES ; F)GET READY TO ACCEPSTATUS WORD MOV (R5)+,R0 ;GET CLOCK TICK NEG R0 ;GET TWO'S COMPLEMENT OF CLOCK TICKS MOV R0,@#CLKBUF ;SET CLOCK BUFFERT START AND STOP COMMANDS ; G)RETURN TO CALLING ROUTINE ; ; ERRORS FROM THIS SECTION ARE SIGNALED BY THE CARRY BIT ;BEI PRESET REG. MOV (R5)+,ATTHRH ;SET THRESHOLD OFFSET VALUE MOV (R5)+,ATIDNO ;GET DATA PATH ID NO FOR CONTROL MODULE MNG SET ON RETURN. R0 WILL CONTAIN THE ERROR TYPE ;AS FOLLOWS: ; R0 = 0 IMPLIES, NO ROOM AVAILABLE FOR TWO INITIAL STORAGE OVB (R5)+,R0 ;SET NUMBER OF ADDITIONAL CHANNELS, INC R0 ;GET TOTAL NO. OF CHANNELS INVOLVED MOV R0,ATNOFC ;STORE NUMBER OF ; BUFFERS ; R0 = 1 IMPLIES, LOCATION ADVEC PROTECTED ALREADY ; R0 = 2 IMPLIES, LOCATION CLKVEC PROTECTED ALREADY ; ( CHANNELS MOV #ATCHAN,R2 ;GET A/D SW TABLE MOVB (R5)+,R1 ;GET FIRST ENTRY FOR A/D SW TABLE BMI 4$ ;IF NEGATIVE, GO PROMUST BE DEFINED TO INDICATE HARDWARE IN USE ;EIS IF DEFINED, HARDWARE MULTIPLY AND DIVIDE OPTION IS CONFIGURED IN ; SYSTEM ANTHE ABOVE CAN OCCUR ONLY FOR ST1 START) ; R0 = 3 IMPLIES, LOCATION DIOVEC PROTECTED ALREADY ; (THE ABOVE CAN OCCUR ONLY FOD WILL BE USED. IF NOT DEFINED, "DIVR0" FROM GENERAL ; SUBROUTINE MODULE IS REQUIRED. ;FG$ IF DEFINED, MODULE WILL BE RUN IN TR DIG START) ATINIT: JSR PC,SAVRG ;SAVE REGISTERS R0-R5 TST @#ADBUF ;CLEAR DONE FLAG .IF DF,FG$ MOV #GTJBA,R0 ;GETHE FOREGROUND. ;LPSDR$ OR DR11K$ IF EITHER IS DEFINED, DIGITAL START/STOP OPTIONS ; MAY BE USED. NOTE: ONLY ONE MAY BE DEFIN GTJB AREA .GTJB MOV GTJBA,SYNCTL+2 ;SET WORD IN SYNC TABLE FOR JOB F OR B .ENDC MOV #DLIST,R0 .DEVICE ;SET UP DEVED. .IF DF,LPSDR$ & DR11K$ ERROR=2DIOS ;ONLY ONE DI/0 UNIT MAY BE SELECTED .ENDC PS=177776 .SBTTL ACQUISITIONICE DISABLE LIST TST PRTFLG ;ARE VECTOR LOCS. ALREADY PROTECTED BNE ATINTS ;IF SO, DON'T PROTECT AGAIN MOV #PROTAR,R0 ;G WITH THRESHOLDING INITIALIZATION ; THIS SECTION READS THE PARAMETER TABLE DESCRIBED IN ;THE USERS GUIDE AND USING THE INFOET AREA FOR .PROTECT .PROTECT ,#ADVEC ;PROTECT A/D VECTOR ADDRESS BCS ERROR1 ;GO INDICATE ERROR MOV #PROTAR,R0 ;GET AREARMATION CONTAINED IN ;THE TABLE, INITIALIZES THE ACQUISITIONS PROCESS. ; THE ADDRESS OF THE PARAMETER TABLE SHOULD BE CONTA FOR .PROTECT .PROTECT ,#CLKVEC BCS ERROR2 ;IF ALREADY PROTECTED, GO IND. ERR MOV #340,@#CLKVEC+2 ;SET PRIORITY FOR FG IINED ;IN R5 WHEN THIS ENTRY IS CALLED VIA "JSR PC,ATINIT". ; THE INITIALIZATION PROCESS CONSISTS OF THE FOLLOWING: ; A)SNT. INC PRTFLG ;VECTOR LOCATIONS HAVE BEEN PROTECTED BR ATINTS ERROR1: MOV #1,R0 ;INDICATE ADVEC ALREADY PROTECTED JMP ETTING THE LPS CLOCK TO INITIATE A/D CONVERSIONS ; AT A PRESCRIBED RATE ; B)OBTAINING THE OFFSET FROM A CALCULATED BASELINATINEX ;GO EXIT ERROR2: MOV #2,R0 ;INDICATE ERROR TYPE JMP ATINEX ;RETURN ATINTS: MOV #340,@#ADVEC+2 ;STORE PRIORITY 7 FOCHECK FOR MOR CHANNELS 55$: BIT #1,R5 ;CHECK FOR WORD BOUNDARY IN PARA TABLE BEQ 6$ ;IF ON A WORD BOUNDARY , B+C INC R5 D STOPPED? BEQ AT3 ;IF,ZERO, UNDER PROGRAMMED CONTROL .IF DF,LPSDR$ ! DR11K$ BMI AT1 ;IF NEG., ST1 START SO, B+C MOV;IF NOT, GET ON ONE 6$: CLR (R2) ;PUT ZERO AT END OF TABLE MOV #BUF1,R0 ;GO GET FIRST OUTPUT BUFFER JSR PC,BAGET ; FROM B #PROTAR,R0 ;SET UP .PROTECT SCRATCH SPACE .PROTECT ,#DIVEC BCS ERROR3 ;IF ALREADY PROTECTED,GO IND.ERR MOV #340,@#DIVECUFFER ALLOCATOR BCS 15$ ;IF NO ROOM, GO IND. ERROR AND EXIT 13$: MOV #BUF2,R0 ;GET SECOND BUFFER JSR PC,BAGET ; FROM BUF+2 ;IF NOT, SET PRIORITY FOR FG INT. CLR @#DIOSAD ;DISABLE DI/O INT. MOV (R5)+,SDIMSK ;GET START MASK MOV (R5)+,HDIMSK ;GEFER ALLOCATOR BCC 14$ ;CHECK FOR ERROR 15$: CLR R0 ;INDICATE NO ROOM FOR BUF2 SEC ;IND. ERROR BR ATINEX ;DETECTED ANT STOP MASK MOV #DISTRT,@#DIVEC ;SET UP INTERRUPT VECTOR MOV #100,@#DIOSAD ;ENABLE DIGITAL INPUT INTERUPT BR AT3 .ENDC ERROR, SO RETURN 14$: MOV #ATBASL,@#ADVEC ;SET UP A/D VECTOR FOR BASELINE AVERAGE MOV BUF1,BUFPNT ;SET UP BUFFER POINTER M AT1: MOV #ST1INT,@#CLKVEC;SET INTRPT LOC. ADD #40000,@#CLKSAD ;ENABLE ST1 AND ST1 INT. AT3: CLRB ATEROR ;CLEAR ERROR BYTEOV BASIZ,BUFCNT ;SET UP BUFFER COUNTER MOV (R5)+,ATN2AV ;SAVE NUMBER OF SAMPLES TO AVERAGE MOV ATN2AV,BASCNT ; TO GET BASEL CLR R0 ;INDICATE NO ERRORS CLC ; ATINEX: JSR PC,RSTRG ;RESTORE REGISTERS RTS PC ERROR3: MOV #3,R0 ;INDICATE ERROR TINE VALUE FOR RUN. BNE 16$ ;IF BASELINE CALCUL NEEDED, B+C CLR @BUFPNT ;OTHERWISE, IND ZERO BASELINE ADD #2,BUFPNT ;UPDAYPE BR ATINEX ;RETURN .SBTTL PROGRAMMED START ROUTINE ; THIS ROUTINE IS CALLED, VIA "JSR PC,ATSAMP" ;FROM THE USETE OUTPUT BUFFER INFORMATION DEC BUFCNT MOV #ATDATA,@#ADVEC ;IND. TO START TAKING DATA IMMED. 16$: CLRB ENDFLG ;CLEAR END R'S AREA TO START AND STOP ACQUISITION. ;ACQUISITION MAY BE STARTED AND STOPPED ONLY ONCE PER ;MODULE INITIALIZATION. ; TCESS TABLE SWAB R1 ;GET BIT IS LEGT HALF MOV R1,R3 ADD #140,R3 MOV R3,(R2)+ ;STORE FIRST A/D SW INC R1 ;SET A/D ENABOF RUN FLAG CLR REJKLO ;CLEAR LO-PART OF REJECT COUNT CLR REJKHI ;CLEAR HI-PART CLR BASLIN ;CLEAR BASLIN SUM-AVERAGE LE BIT FOR CHANNELS 2$: DEC R0 ;ANY MORE CHANNELS? BEQ 6$ ;IF NOT, PROCESS NEXT PARAMETER ADD #400,R1 ;INCREMENT A/D CHACLR BASLIN+2 ;CLEAR BASLINE HI-PART CLR BUFPAS ;CLEAR FLAG INDICATING ; A BUFFER IS BEING TRANSFERRED MOV ATCHAN,@#ADNNEL NUMBER MOV R1,(R2)+ ;PUT NEXT ENTRY IN A/D SW TABLE BR 2$ ;CHECK FOR MORE CHANNELS 4$: MOVB (R5)+,R1 ;GET FIRST A/D CSAD ;SET UP FIRST A/D SW MOVB #-1,FLAG1 ;INDICATE TO "BREAK THRESHOLD" INITIALLY .IF DF,LPSDR$ ! DR11K$ MOV (R5)+,OUTDOHAN # FROM INPUT SWAB R1 ADD #140,R1 MOV R1,(R2)+ ;AND PUT IN A/D SW TABLE 5$: DEC R0 ;ANY MORE CHANNELS? BEQ 55$ ;IFP ;SHOULD WE OUT PUT DIGITTALY WHEN S/S BEQ ATOUTP ;IF NOT, RESTORE PSW AND RETURN MOV (R5)+,SDOMSK ;IF SO, GET MASK TO OUP NOT,GO PROCESS NEXT INPUT MOVB (R5)+,R1 SWAB R1 INC R1 MOV R1,(R2)+ ;IF YES, ENTER NEXT A/D # IN SW TABLE BR 5$ ;GO TUT WHEN STARTING MOV (R5)+,HDOMSK ;GET MASK TO OUTPUT WHEN STOPPING .ENDC ATOUTP: TST (R5)+ ;HOW WILL RUN BE STARTED AN AND WILL RETURN TO THE USER. ;***NOTE*** ; IF THIS IS A FOREGROUND JOB IT WILL BE THE RESPONSIBILITY ; OF THE USER THE INPUT CONTAINS THE BITS ;WHICH MATCH THE DIGITAL INPUT START BIT MASK. IF NOT, ;THE ROUTINE JUST RETURNS. IF IT DOES MTO INFORM THE MONITOR TO RESUME THE FOREGROUND ; PROCESSING UPON RETURN FROM A SECOND CALL TO "ATSAMP". ATSAMP: BIT #1,@#CATCH, THE CLOCK IS ;ENABLED, AND ALL FURTHER DIGITAL INPUT INTERRUPTS ARE ;DIRECTED TO "DISTOP" DISTRT: MOV @#DIBUF,ATIDLKSAD ;IS CLOCK ALREADY ENABLED? BEQ ATSMP2 ;IF NOT, GO ENABLE ATSTOP: CLR @#ADSAD ;CLEAR A/D INTERRUPTS CLR @#CLKSAD ;IFIG ;GET THE D.I AND PUT IN GLOBAL MOV ATIDIG,@#DIBUF ;CLEAR D.I. REG BIT SDIMSK,ATIDIG ;DOES THE INPUT CONTAIN THE START MAS SO, DISABLE CLOCK AND THUS INPUT MOV R2,-(SP) ;SAVE REGISTERS R0,R1,R2 MOV R1,-(SP) MOV R0,-(SP) MOV ATIDNO,R0 ;GET DATK BEQ DISTRR ;IF NOT, JUST RETURN JSR PC,ATSMP2 ;GO ENABLE OR DISABLE CLOCK MOV #DISTOP,@#DIVEC ;SET VECTOR TO CHECK FOR A PATH ID NUMBER MOV BUF1,R1 ;GET BUFFER ADDRESS MOV BASIZ,R2 ;GET BUFFER SIZE SUB BUFCNT,R2 ;GET NUMBER OF DATA POINTS HALT DISTRR: RTI ;RETURN ;DIGITAL INPUT STOP ROUTINE ; AFTER ACQUISITION HAS STARTED, ALL DIGITAL INTERRUPTS ARE ;HAN JSR PC,CTIBUF ;GO GIVE BUFFER TO CONTROL MODULE DEC CTIDON ;INDICATE ACQUISITION DONE MOV BUF2,R0 ;ALWAYS RELEASE JSR PDLED BY "DISTOP" IF "ATSTRT" IN THE INITIALIZATION ;PARAMETER TABLE WAS POSITIVE. IF THE DIGITAL INPUT RECEIVED ;MATCHES THC,BAREL ; BUF2 MOV (SP)+,R0 ;RESTORE REGISTERS MOV (SP)+,R1 MOV (SP)+,R2 .IF DF,LPSDR$ ! DR11K$ TST OUTDOP ;SHOULDE DIGITAL INPUT STOP BIT MASK, THE CLOCK IS DISABLED ;BUFFERS ARE PASSED, AND, IF A FOREGROUND JOB, FOREGROUND ;MAINSTREAM WE OUTPUT DIGITALLY? BEQ ATSMP1 ;IF NOT, JUST RETURN MOV @#DOBUF,-(SP) ;GET CURRENT OUTPUT BIS HDOMSK,(SP) ;SET HALT BITPROCESSING IS RESUMED. ALL FURTHER DIGITAL INPUT ;INTERUPTS HAVE NO EFFECT ON THIS ROUTINE DISTOP: MOV @#DIBUF,ATIDIG ;GET S INDICATION MOV (SP)+,@#DOBUF ;OUTPUT NEW WORD .ENDC ATSMP1: JSR PC,CHNGVC ;DUMMY UP INTERRUPT VECTORS RTS PC ;RETURNTHE D.I. AND PUT IN GLOBAL MOV ATIDIG,@#DIBUF ;CLEAR D.I. REG BIT HDIMSK,ATIDIG ;TEST FOR STOP BITS BEQ DISTPR ;IF NO MAT ATSMP2: INC @#CLKSAD ;ENABLE CLOCK AND THUS ACQUISITION .IF DF,LPSDR$ ! DR11K$ TST OUTDOP ;SHOULD WE OUTPUT DIGITALLY? CH, JST RETURN JSR PC,ATSTOP ;GO STOP PROCESS .IF DF,FG$ TST CTRUN ;TEST FOR NEED TO SYNCH BNE DCONT ;IF NOT NEEDED, BEQ 2$ ;IF NOT, JUST RETURN MOV @#DOBUF,-(SP) ;GET CURRENT OUTPUT BIS SDOMSK,(SP) ;SET START BITS INDICATION MOV (SP)+, BRANCH .INTEN 4 .SYNCH #SYNCTL NOP .RSUM INC CTRUN ;INDICATE SYNC CLR HDIMSK ;DISABLE MSK RTS PC .ENDC DCOHE FIRST CALL TO THIS ENTRY WILL ENABLE THE CLOCK AND ;SAMPLING WILL BEGIN ON THE FIRST CLOCK OVERFLOW. ; THE SECOND CALL T@#DOBUF ;OUTPUT NEW WORD .ENDC 2$: RTS PC ;RETURN .IF DF,LPSDR$ ! DR11K$ .SBTTL DIGITAL INPUT INTERRUPT ROUO THIS ENTRY WILL DISABLE THE CLOCK AND ;THUS ACQUISITION. IT WILL PASS THE SEMI-FILLED LAST BUFFER ;TO THE "CONTROL MODULE"TINES ;DIGITAL START ROUTINE ; WHEN A DIGITAL INTERRUPT IS RECEIVED AFTER INITIALIZATION ;THIS ROUTINE CHECKS TO SEE IF FAST, B+C JSR PC,ERRSYN ;OTHERWISE, KILL JOB .IF DF,FG$ JMP ST1A ;GO SYNC AND RETURN .ENDC .IF NDF,FG$ RTI ;MONITORED CHANNEL HAS "BROKEN THRESHOLD" AND ; CERTAIN DATA IS OUTPUTTED. FIRST, THE COMPLEMENT OF THE ; REJECT COUNT(NT: CLR HDIMSK ;SET MASK TO IGNORE ALL INPUT DISTPR: RTI ;RETURN .ENDC .SBTTL SCHMIT TRIGGER 1 INTERRUPT ROUTINE AND RETURN .ENDC .ENDC 11$: ADD @#ADBUF,BASLIN+2;ADD NEW VALUE TO SUM ADC BASLIN ;UPDATE HI-PART OF SUM DEC BASCNT ; THIS ROUTINE STARTS AND STOPS ACQUISITION VIA SCHMIT TRIGGER ;1 INTERRUPTS. THE FIRST INTERRUPT AFTER INITIALIZATION START ;DECREMENT COUNT FOR AVERAGE BEQ 1$ ;IF ZERO , GO AVERAGE RTI ;IF NOT, WAIT FOR MORE INFO. 1$: MOV R0,-(SP) ;SAVE REGISS ;THE ACQUISITION. THE SECOND STOPS ACQUISITION, DISABLING THE ;CLOCK, AND PASSING THE SEMI-FILLED LAST BUFFERS TO THE TERS R0 AND R1 MOV R1,-(SP) MOV BASLIN+2,R1 ;GET LO HALF OF SUM MOV BASLIN,R0 ;GET HI $DIV ATN2AV,R0 ;DIVIDE MOV R0,@B;"CONTROL MODULE". ST1INT: JSR PC,ATSAMP ;GO START OR STOP ACQUISITION BIC #100000,@#CLKSAD ;CLEAR ST1 FLAG MOV #ST12ND,@UFPNT ;STORE BASELINE VALUE IN BUFFER ADD #2,BUFPNT ;INCREMENT BUFFER POINTER DEC BUFCNT ;DECREMENT BUFFER COUNTER ADD R0#CLKVEC ;REDIRECT CLK INT VEC RTI ST12ND: INCB ENDFLG ;INDICATE DONE ACQ 11$: TST BUFPAS ;ARE WE PASSING A BUFFER BEQ ,ATTHRH ;MAKE THRESHOLD OFFSET ACTUAL VALUE MOV #ATDATA,@#ADVEC ;SETUP A/D VECTOR FOR DATA TAKING MOV (SP)+,R1 ;RESTORE REGI1$ ;IF NOT, B+C RTI ;OTHERWISE RETURN 1$: JSR PC,ATSTOP ;STOP ACQ AND PASS LAST BUFFERS .IF NDF,FG$ RTI .ENDC STERS R0 AND R1 MOV (SP)+,R0 RTI ;RETURN .SBTTL DATA PROCESSING SECTION ; THIS ROUTINE SAMPLES THE MONITORED CHAN .IF DF,FG$ ST1A: TST CTRUN ;TEST NEED TO SYNCH BEQ ST1B ;IF NOT NEEDED RTI ; RETURN ST1B: .INTEN 5 ;LOWER PRIORITY NEL AT THE INITIALIZED ;RATE AND CHECKS TO SEE IF IT IS ABOVE THE THRESHOLD VALUE ;CALCULATED IN THE PREVIOUS SECTION. THE TO 5 .SYNCH #SYNCTL ;SET UP TO NOP .RSUM ;RESUME FOREGROUND MAINSTREAM INC CTRUN ;INDICATE SYNC RTS PC ;RETURN ACTION TAKEN NEXT ;DEPENDS BOTH ON THE RESULT OF THE COMPARE AND THE PREVIOUS ;HISTORY OF THE RUN. ; IF THE VALUE IS LE.ENDC .SBTTL CALCULATING BASELINE ; THIS ROUTINE SAMPLES THE FIRST "ATN2AV"(FROM INITIALIZATION ;PARAMETER TABLE) VALUESSS THAN THE THRESHOLD VALUE, A REJECT COUNT ;IS INCREMENTED BY ONE, AND THE ROUTINE RETURNS FROM THE INTERUPT ; IF THE VALU FROM THE MONITORED A/D CHANNEL, AVERAGES ;THEM TO OBTAIN A BASELINE VALUE, ADDS THIS BASELINE VALUE TO ;"ATHRSH"(FROM INITIE IS GREATER THAN THE THRESHOLD VALUE, A CHECK IS ;MADE TO SEE IF THE PREVIOUS A/D CONVERTED VALUE FROM THE MONI- ;TORED CHAALIZTION PARAMETER TABLE) TO OBTAIN THE ;THRESHOLD VALUE FOR THE RUN, AND FINALLY, OUTPUTS THIS BASELINE ;VALUE AS THE FIRSTNNEL WAS ALSO ABOVE THE THRESHOLD VALUE. ; IF IT WAS, THEN THE CURRENT VALUE IS OUTPUTTED TO THE ; CURRENT OUTPUT BUF DATUM IN THE FIRST OUTPUT BUFFER. ATBASL: .ENABL LSB .IF NDF,AR11$ TST @#ADSAD ;TEST ACQ SPEED BPL 11$ ;IF NOT TOOFER AND THE ROUTINE EXITS FROM THE INTERUPT ; IF THE PREVIOUS VALUE WAS BELOW THE THRESHOLD VALUE, THEN ; WE SAY THE ;STORE BELOW THREHOLD INDICATOR (0) ADD #2,BUFPNT ;INCREMENT BUFFER POINTER DEC BUFCNT ;DECREMENT BUFFER COUNTER BNE 12$ EC BUFCNT ;DECREMENT BUFFER COUNTER BNE 4$ ;IF NOT FULL, CONTINUE JSR PC,NXTBUF ;IF FULL, SWITCH BUFFERS BCS LEAVE ;IF ;IF NOT ZERO, BRANCH JSR PC,NXBUF ;OTHERWISE, SWITCH BUFFERS BCS 12$ ;IF ERROR, BRANCH JMP PASBUF ;OTHERWISE, GO PASS BERROR,GO EXIT BR 4$ ;TEST NEXT A/D SW 6$: MOV ATCHAN,@#ADSAD ;SET A/D SW FOR FIRST CHANNEL BIT #200,@#CLKSAD ;DID WE BEUFFER 12$: RTI ;RETURN 1$: TSTB FLAG1 ;WAS PREVIOUS VALUE BELOW THRESH.? BNE 2$ ;IF YES, EXTRA OUTPUT REQUIRED MOV AT THE CLOCK BEQ 60$ ;IF SO,BRANCH JSR PC,ERREND ;IF NOT, INDICATE ERROR 60$: MOV SDATUM,(R4)+ ;STORE MONITORED DATUM DE@#ADBUF,@BUFPNT ;IF NOT, JUST OUTPUT CURRENT VALUE ADD #2,BUFPNT ;INCREMENT BUFFER POINTER DEC BUFCNT ;DECREMENT BUFFER COUC BUFCNT ;DECREMENT BUFFER COUNTER BNE 61$ ;IF NOT FULL, CONTINUE JSR PC,NXBUF ;IF FULL, SWITCH BUFFERS BCC 62$ ;IF NO DOUBLE PRECISION) IS WRITTEN INTO THE CURRENT ; OUTPUT BUFFER. NEXT, IF ANY ADDITIONAL CHANNELS WERE ; SPECIFIED AT INTINTER BNE 15$ ;IF NOT ZERO, BUFFER FULL, SO B+C JSR PC,NXBUF ;IF BUFFER FULL, SWITCH BUFFERS BCC PASBUF ;GO PASS FULL BUFALIZATION, THEY ARE NOW SAMPLED AND THEIR ; VALUES WRITTEN INTO THE OUTPUT BUFFER ALSO. FINALLY, THE ; MONITORED CHANNEL,GET NEW ONE,RETURN 15$: RTI 2$: BIC #200,@#CLKSAD ;SET TRAP FOR SPEED ERROR MOV @#ADBUF,SDATUM ;BROKE THRESHOLD, SAVE DAS VALUE IS WRITTEN INTO THE BUFFER. THEN ; THE ROUTINE RETURNS FROM THE INTERRUPT ATDATA: CLRB FLAG2 ;INDICATE NO FULLTUM MOV R4,-(SP) ;SAVE R4,5 MOV R5,-(SP) CLRB FLAG1 ;IND. BROKE THRESHOLD MOV #ATCHN2,R5 ;GET ADDRESS OF A/D S.W.S MO BUFFERS .IF NDF,AR11$ TST @#ADSAD ;TST ACQ. SPEED BPL ATDATC ;IF ALRIGHT, B+C JSR PC,ERREND ;IF SO, KILL JOB,BUT AV (R5)+,@#ADSAD ;START NEXT CONVERSION MOV BUFPNT,R4 ;GET CURRENT BUFFER POINTER MOV REJKLO,(R4)+ ;STORE LO-PART COMPLEMENT TERCD: TST BUFPAS ;TST IF PASSING A BUFFER BEQ ATERSP ;IF NOT, BRANCH RTI ; ALLOW TO PASS BUFFERS ATERSP: JSR PC,ATSTOPOF REJ. CNT DEC BUFCNT ;DECREMENT BUFFER COUNTER BNE 3$ ;IF BUFFER NOT FULL,CONTINUE JSR PC,NXTBUF ;IF FULL,SWITCH WITH ;STOP ACQ AND PASS BUFFER .IF NDF,FG$ RTI ;AND RETURN .ENDC .IF DF,FG$ JMP ST1A ;GO SYNC AND RETURN .ENDC ALTERNATE BUFFER BCS LEAVE ;IF ERROR, GO EXIT 3$: MOV REJKHI,(R4)+ ;STORE HI-PART OF REJ. CNT COMPLEMENT DEC BUFCNT ;DECR .ENDC ATDATC: CMP @#ADBUF,ATTHRH ;COMPARE NEW VALUE TO THRESHOLD .ENABL LSB BGT 1$ ;IF GREATER, GO SAVE VALUE INC REJEMENT BUFFER COUNTER BNE 4$ ;IF BUFFER NOT FULL, CONTINUE JSR PC,NXTBUF ;IF FULL,SWITCH WITH OTHER BUFFER BCS LEAVE ;IF KLO ;INCR. LO-PART OF REJECT COUNT BNE 11$ ;IF NO OVERFLOW, BRANCH INC REJKHI ;OTHERWISE UPDATE HI-PART TOO 11$: TSTB FLERROR, GO EXIT 4$: TST @#ADSAD ;CHECK STATUS WORD BEQ 6$ ;IF ZERO, NO EXTRA CHANNELS TO READ 41$: TSTB @#ADSAD ;TEST IAG1 ;IS THIS THE FIRST TIME BELOW THRESH BNE 12$ ;IF NOT, BRANCH DECB FLAG1 ;OTHERWISE, IND. BELOW THRESH CLR @BUFPNT F DONE BPL 41$ ;IF NOT DONE TEST AGAIN MOV @#ADBUF,(R4)+ ;STORE NEW DATUM VALUE MOV (R5)+,@#ADSAD ;START NEXT CHANNEL DSBUF: .INTEN 5 ;CHANGE PRIORITY LEVEL TO 5 .ENABL LSB MOV R0,-(SP) ;SAVE REGISTERS R0,R1,R2 MOV R1,-(SP) MOV R2,-(SP) TY ONE, BUFFER 2. THE ADDRESS OF THE ;ORIGINAL BUFFER 1 IS SAVED, AND WHEN THE CURRENT INTERUPT HAS ;BEEN COMPLETELY SERVI MOV ATIDNO,R0 ;GET ID NO. FOR CONTROL MODULE MOV BUFPAS,R1 ;GET BUFFER STARTING ADDRESS MOV BASIZ,R2 ;GET COUNT NEG R2 ;CED, THE PROCESS OF PASSING THE FILLED ;BUFFER TO THE "CONTROL MODULE" AND ACQUIRING A NEW BUFFER 2 ;BEGINS NXTBUF: MOV BSHOW NOT LAST BUFFER JSR PC,CTIBUF ;GIVE FULL BUFFER TO CONTROL MODULE BCC 10$ ;IF NO ERRORS, CONTINUE CLR @#ADSAD ;DISUF2,R4 ;CHANGE STORAGE ADDRESS IN R0 BR NX2 NXBUF: MOV BUF2,BUFPNT ;CHANGE BUFFER POINTER NX2: TST BUFPAS ;TEST IF PREVIOUABLE A/D INTERRUPT CLR @#CLKSAD ;IF ERROR, HALT PROCESSING DEC CTIDON ;INDICATE DONE MOV BUF1,R0 ;GET CURRENT BUFFER ADS FULL BUFFER GONE BEQ NX1 ;IF GONE CONTINUE JSR PC,ERREND ;GO TERMINATE ACQUISITION RTS PC NX1: INCB FLAG2 ;SIGNAL BUFDRESS JSR PC,BAREL ;RELEASE IT .IF DF,LPSDR$ ! DR11K$ TST OUTDOP ;SHOULD WE OUTPUT DIGITALLY? BEQ 9$ ;IF NOT, CONTINFER TRANSFER STATE MOV BUF1,BUFPAS ;SETUP BUFFER ADDRESS TO PASS MOV BUF2,BUF1 ;CHANGE CURRENT BUFFER MOV BASIZ,BUFCNT ;GEUE MOV @#DOBUF,-(SP) ;GET CURRENT OUTPUT BIS HDOMSK,(SP) ;SET HALT BITS INDICATION MOV (SP)+,@#DOBUF ;OUTPUT NEW WORD .ET NEW BUFFER COUNT RTS PC ;RETURN .SBTTL ROUTINE TO TERMINATE ABNORMALLY ; WHEN AN ERROR OCCURS DURING ACQUISITION, NDC 9$: JSR PC,CHNGVC ;DUMMY UP INTERRUPT VECTORS BR 11$ ;GO EXIT GRACEFULLY 10$: MOV #BUF2,R0 ;GO GET NEW BUFFER JSR USUALLY DUE TO ;LACK OF SPACE FOR MORE REQUIRED BUFFERS OR AN ACQUISITION ;SPEED TOO GREAT TO BE HANDLED BY PRE-PROCESSING RERROR, B+C BR LEAVE ;IF ERROR, GO EXIT 61$: MOV R4,BUFPNT ;STORE BUFFER POINTER 62$: CLR REJKLO ;CLEAR LO-PART OF REJECT CPC,BAGET ; FROM BUFFER ALLOCATOR BCC 11$ ;IF NO ERRORS, CONTINUE JSR PC,ERREND ;GO TERMINATE ACQUISITION 11$: MOV (SP)+,ROUNT CLR REJKHI ;CLEAR HI-PART LEAVE: MOV (SP)+,R5 ;RESTORE R5,4 MOV (SP)+,R4 TSTB FLAG2 ;WERE THE BUFFERS SWITCHED B2 MOV (SP)+,R1 ;RESTORE REGISTERS MOV (SP)+,R0 .IF DF,FG$ TST CTRUN ;TEST NEED TO SYNCH BNE 13$ ;IF NOT NEEDED, BNE PASBUF ;IF SO, BRANCH TSTB ENDFLG ;DID ERROR OCCUR BNE ATEREX ;ITS POSSIBLE GO CHECK RTI ;OTHERWISE RETURN ATEREXRANCH .SYNCH #SYNCTL BR ERRSYN INC CTRUN ;INDICATE SYNC .RSUM ;RESUME MAINSTREAM .ENDC 13$: $SPL 7 ;DISABLE INT: JMP ATERCD .SBTTL ROUTINE TO TEST FOR ACQUIRING NEW BUFFER AND RETURN ; IF BUFFERS ONE AND TWO WERE INTERCHANGED THENERUPTS TSTB ENDFLG ;CHECK IF ACQ SHOULD BE DISABLED BEQ 12$ ;IF NOT, B+C $SPL 5 ;OTHERWISE, LET SOME INT. OCCUR JSR P BUFFER 1 ;NEEDS TO BE PASSED TO THE "CONTROL MODULE" AND A NEW BACKUP ;BUFFER 2 NEEDS TO BE ACQUIRED. THIS SECTION SATISFIC,ATSTOP ; BUT DISABLE ACQ 12$: CLR BUFPAS ;INDICATE BUFFER TRANSFER DONE RTS PC ;RETURN .SBTTL ROUTINE TO INTERCHES BOTH ;NEEDS. IF AN ERROR OCCURS IN THE PROCESS, ACQUISITION IS ;HALTED, AND THE LAST BUFFER IS PASSED IF POSSIBLE. PAANGE THE TWO PREVIOUSLY ACQUIRED BUFFERS ; WHEN THE CURRENT OUTPUT BUFFER IS FULL, BUFFER 1, IT IS ;EXCHANGE FOR A NEW EMPDUMMY INTERRUPT VECTORS MOV #IGNORI,@#CLKVEC .IF DF,LPSDR$ ! DR11K$ MOV #IGNORI,@#DIVEC .ENDC RTS PC ;RETURN IGNORA: DLIST: .BYTE 0,14 ;ENT AR LIST .WORD DLIST1 ;ADDRESS DLIST1: ADSAD 0 ADVEC IGNORA CLKSAD 0 CLKVEC IGNORI . TST @#ADBUF ;CLR DONE BIT CLR @#ADSAD ;CLEAR ANY ERROR IGNORI: RTI .SBTTL STORAGE AREA .IF DF,LPSDR$ ! DR11K$ OUTIF DF,LPSDR$ ! DR11K$ DIOSAD .WORD 0 DIVEC IGNORI .ENDC .WORD 0 PRTFLG: .WORD 0 ;PROTECT FLAG .IF DF,FG$ GTJBDOP: .BLKW 1 ;SIGNAL FOR OUTPUT PULSE SDOMSK: .BLKW 1 ;OUTPUT MSK FOR STARTING SDIMSK: .BLKW 1 ;INPUT DIGITAL MASK FOR STARA: .BYTE 0,20 ;AREA FOR GET JOB .WORD GTJBA .BLKW 6 SYNCTL: .WORD 0,0,0,0,0 ;STORAGE FOR .SYNCH -1 0 .ENDC .END TING HDOMSK: .BLKW 1 ;OUTPUT DIGITAL MASK FOR STOPPING HDIMSK: .BLKW 1 ;INPUT DIGITAL MASK FOR STOPPING ATIDIG: .BLKW 1 ;G LOBAL CONTAINNING CURRENT DIG. INP. .ENDC ATEROR: .BYTE 0 ;ABNORMAL END INDICATOR ENDFLG: .BYTE 1 ;SIGNAL TO END RUN AT.TITLE ENVELOPE PROCESSING MODULE ;LAB-APPLICATIONS-11 ;DEC-11-SLABA-C-LA ;FILENAME NVELOP.MAC ;FILE ID NVELOP.2 .CSECT EIDNO: .BLKW 1 ;DATA PATH ID NO FOR CONTROLMODULE ATTHRH: .BLKW 1 ;INITIAL THRESHOLD OFFSET AND LATER, ; ACTUAL THRESHOLNVLOP ;COPYRIGHT (C) 1975 ;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ;THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR D VALUE ATNOFC: .BLKW 1 ;NUMBER OF ACTIVE CHANNELS ATCHAN: .BLKW 1 ;AREA FOR A/D COMMANDS ATCHN2: .BLKW 3 ;AND SPACE FOR XUSE ONLY ON A ;SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLUSION ;OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE,TRA CHNL'S A/D SW ATN2AV: .BLKW 1 ;NUMBER OF SAMPLES TO AVERAGE FOR BASELINE SDATUM:BASCNT: .BLKW 1 ;COUNTER FOR AVERAGING B OR ANY OTHER COPIES ;THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ;OTHER PERSON EXCEPT FOR USE ON SUCH SYSUF1: .BLKW 1 ;ADDRESS OF CURRENT OUTPUT BUFFER BUF2: .BLKW 1 ;ADDRESS OF NEXT OUTPUT BUFFER REJKLO: .BLKW 1 ;LOW ORDER PARTTEM AND TO ONE WHO AGREES ;TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE SOFTWARE ;SHALL AT ALL TIMES REMAIN IN DEC. OF REJECT COUNTER REJKHI: .BLKW 1 ;HIGH ORDER PART OF REJECT COUNTEER BASLIN: .BLKW 2 ;SUM, THEN, AVERAGE BASELINE VALUE F ;THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE ;WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A ;COMMITMENT BY DIGITOUTINES ;DOWN STREAM(SEE "CONTROL MODULE"), THE ROUTINE STOPS ACQUI- ;SITION BY COMING HERE, DISABLING THE CLOCK, AND PASSINLAG1: .BLKB 1 ;FLAG INDICATING BREAKING THRESHOLD FLAG2: .BLKB 1 ;FLAG INDICATING BUFFER TRANSFERRING BUFPNT: .BLKW 1 ;POING ;THE LAST BUFFER,IF POSSIBLE. ERRSYN: DEC CTIDON ;IND ACQ DONE ERREND: INCB ATEROR ;INDICATE ABNORMAL END CLR @#ADSATER INTO OUTPUT BUFFER BUFCNT: .BLKW 1 ;CURRENT COUNT OF OUTPUT BUFFER ; POSITIONS REMAINING BUFPAS: .BLKW 1 ;ADDRESSD ;DISABLE A/D INTERRUPTS CLR @#CLKSAD ;DISABLE CLOCK INCB ENDFLG ;INDICATE ALL DONE CHNGVC: MOV #IGNORA,@#ADVEC ;SET UP OF BUFFER TO PASS TO CONTROL MODULE ; IF EQUAL ZERO, NO BUFFER TO PASS PROTAR: 14400 ;STORAGE AREA FOR PROTECT .BLKW 1AL EQUIPMENT CORPORATION. ;DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ;ITS SOFTWARE ON EQUIPMENT WHICH IS NUMS COUNTER CC=36 ;MAXIMUMS COUNTER T0L=40 ;INITIAL TIME OF LOCAL TIME SEGMENT T0H=42 ;HI-ORDER TYPE=44 ;PEAK TYPE. =0 IOT SUPPLIED BY DEC. ;LDP SOFTWARE DEVELOPMENT, JUNE 1975 .SBTTL MACROS,GLOBALS, AND CONDITIONALS .MCALL ..V2..,.REGDEF,F ENDS ON VALLEY, =1 IF AT THRESHOLD OAL=46 ;LO-ORDER OF AREA OF CURRENT PEAK OAH=50 ;HI OCNL=52 ;LO-ORDER OF SUMMATION FO$SOB,$MUL ..V2.. .REGDEF ;EXTERNAL GLOBALS .GLOBL CTOBUF ;FROM CONTROL MODULE .GLOBL BAGET,BASIZ,BAREL,BBASIZ ;FRR, OR ACTUAL,CENTROID OCNH=54 ;HI WDL=56 ;LO-ORDER OF PEAK WIDTH WDH=60 ;HI TOPTL=62 ;LO-ORDER OF TIME OF PEAK TOPTH=64 OM BUFFER ALLOCATION MODULE ;INTERNAL GLOBAL .GLOBL NVELOP ;CONDITIONAL ASSEMBLY PARAMETER ; "CTREL$" IS THE ONL;HI TOP=66 ;PEAK HEIGHT FTML=70 ;LO-ORDER OF LEADING TIME OF PEAK FTMH=72 ;HI SAVR=74 ;LOCATION TO SAVE REGISTERS AT CRIY CONDITIONAL ASSEMBLY PARAMETER AFFECTING ; THIS MODULE. IF NOT DEFINED, THE MODULE MUST RELEASE ITS OWN ; INPUT BUFFERS BEFTICAL TIMES CCNL=76 ;LO-ORDER OF PARTIAL CENTROID SUMMATION CCNH=100 ;HI CTL=102 ;LO-ORDER OF TIME OF LATEST MAXIMUM CTH=1ORE RETURNING CONTROL TO THE CONTROL MODULE. ; THE PREVIOUS STATEMENT ASSUMES THAT THE ENVELOPE PROCESSING ; MODULE IS NOT THE04 ;HI CNT=106 ;LOCATION NEEDED FOR A COUNTER BAS=110 ;BASELINE VALUE FOR DATA PATH .SBTTL START OF NVELOP MODULE LAST MODULE IN A DATA PATH. SEE CONTROL ; MODULE FOR FURTHER EXPLAINATION. .SBTTL OFSETS INTO PARAMETER - VARIABLE TABLE;REGISTER FIVE(R5) SHOULD POINT TO ASSOCIATED ; PARAMETER - VARIABLE TABLE ;REGISTER ZERO(R0) SHOULD POINT ; THE FOLLOWING IS A LIST OF THE OFFSETS INTO THE PARAMETER - ; VARIABLE TABLE (REGISTER FIVE(R5)CONTAINS THE ADDRESS OF TO ASSOCIATED ; OUTPUT INFORMATION(SEE CONTROL MODULE) ;REGISTER ONE (R1) SHOULD POINT TO ASSOCIATED ; THIS ; TABLE WHEN "NVELOP" IS CALLED) USED BY THIS ROUTINE. NOFC=0 ;NO. OF EXTRA CHANNELS OF DATA IGT=2 ;SENSITIVITY, # INPUT INFORMATION(SEE CONTROL MODULE) NVELOP: CLR NDFLG ;CLEAR END OF INPUT FLAG TST +2(R1) ;IS THIS A LAS OF PTS NEEDED ON EACH SIDE OF PEAK FIRSTM=4 ;ZER0 ON FIRST CALL TO ROUTINE ONLY EROR=5 ;ERROR INDICATOR S1=6 ;INDICATES A T BUFFER .ENABL LSB BMI 3$ ;IF NOT, B+C BNE 2$ ;IF NOT EMPTY, B+C JMP ENDATA ;OTHERWISE, GO OUTPUT FINAL BUFFER 2$: DECREASING TREND WHEN SET S2=7 ;INDICATES AN INCREASING TREND WHEN SET PK=10 ;INDICATES A PEAK FOUND YX=12 ;PREVIOUS AVERADEC NDFLG ;IND. LAST INPUT BUFFER NEG +2(R1) ;CHANGE SIGN OF WORD COUNT 3$: MOV (R1)+,INADDR ;SAVE INPUT BUFFER POINTER GED POINT TML=14 ;LO-ORDER OF LOCAL TIMER TMH=16 ;HI TTL=20 ;LO-ORDER OF TOTAL TIMER TTH=22 ;HI CAL=24 ;LO-ORDER OF AR .IF NDF,CTREL$ MOV INADDR,SINADR ;SAVE INPUT BUFFER ADDRESS .ENDC MOV (R1),INCNT ;SAVE INPUT BUFFER WORD COUNT MOV R0EA ACCUMULATED DURING INCREASING TREND CAH=26 ;HI MX=30 ;CURRENT MAXIMUM VALUE MN=32 ;CURRENT MINIMUM VALUE MC=34 ;MINIM,OUTADR ;SAVE ADDRESS OF POINTER TO OUTPUT BUFR TST FIRSTM(R5) ;IS THIS THE FIRST CALL BY DATA PATH BEQ 4$ ;IF SO, B+C JMNE N30 INC FTMH(R5) N30: CLR TOP(R5) ;CLEAR LAST PEAK VALUE CLR TOPTL(R5) ;CLEAR PEAK TIME CLR TOPTH(R5) CLR OCNL(R5) IF MORE B+C JMP N20 ;OTHERWISE, REINITIALIZE ;GOT A NEW DATUM N115: INC TML(R5) ;INC. LOCAL TIMER .ENABL LSB BNE;CLEAR CENTROID SUMMATION CLR OCNH(R5) CLR OAL(R5) ;CLEAR TOTAL AREA CLR OAH(R5) N50: MOV #77777,MN(R5) ;SET MIN TO VERY 1$ INC TMH(R5) 1$: INC TTL(R5) ;INC. TOTAL TIMER BNE 2$ INC TTH(R5) 2$: SUB BAS(R5),R3 ;SUBTRACT BASELINE VALUE ; ADD LARGE NUMBER MOV #100000,MX(R5) ;SET CURRENT MAX TO VERY LARGE NEG NUMBER CLR MC(R5) ;CLEAR NO. OF DECREASES COUNTER CLR YX(R5),R3 ;GET "AVERAGED" POINT ; ASR R3 MOV R3,YX(R5) ;SAVE IT CMP R3,MN(R5) ;TEST IF LOWER THAN CURRENT MINIMUM BGT N1P RESUME ;IF NOT, GO PICK UP WHERE LEFT OFF ; COMES HERE ONLY ONCE, AT START, TO GET BASELINE VALUE , ; AND THEN PASSES CC(R5) ;CLEAR NO. OF INCREASES COUNTER MOVB #1,S1(R5) ;IND. INCREASING TREND CLRB S2(R5) ;IND. NO DECREASING TREND N100:IT ON THROUGH THE OUTPUT BUFFER 4$: JSR PC,NEXTPT ;GET BASELINE VALUE MOV R3,BAS(R5) ;SAVE IT CLRB EROR(R5) ;CLEAR ERROR JSR PC,NEXTPT ;GET NEXT INPUT TST R3 ;IS THIS A REAL DATA POINT BNE N115 ;IF SO, B+C .ENABL LSB 5$: MOV TTL(R5),WDL(R5INDICATOR JSR PC,GETBUF ;GET OUTPUT BUFFER POINTER BCC 5$ ;IF OUTPUT BUFR OBTAINED, B+C .IF NDF,CTREL$ JMP ENDATC ;O) ;FIND WIDTH MOV TTH(R5),WDH(R5) SUB FTMH(R5),WDH(R5) SUB FTML(R5),WDL(R5) SBC WDH(R5) BNE 1$ ;TEST IF WIDTH IS LESSTHERWISE, RETURN INDICATING ERROR .ENDC .IF DF,CTREL$ RTS PC ;OTHERWISE, RETURN INDICATING ERROR .ENDC 5$: MOV R3, THAN SIX CMP #6,WDL(R5) ; IF WIDER, BRANCH TO 1$ BHI N101 ;OTHERWISE FORGET PEAK 1$: MOV #1,TYPE(R5) ;INDICATE PEAK ENDS (R2)+ ;STORE BASELINE VALUE IN OUTPUT BUFFER DEC (R0) ;DECREMENT OUTPUT BUFFER WORD CNT MOV R2,-(R0) ;STORE OUTPUT BUFFER PON THRESHOLD JSR PC,OUTPUT ;GO OUTPUT PEAK BLOCK N101: JSR PC,NEXTPT ;GET LO-PART OF REJECT COUNT .ENABL LSB ADD R3,TTL(ROINTER CLR TTL(R5) ;ZERO TOTAL TIMER CLR TTH(R5) CLR FTML(R5) ;ZERO INITIAL TIME OF PEAK CLR FTMH(R5) INCB FIRSTM(R5)5) ; COUNT. ADD TO TOTAL TIME ADC TTH(R5) JSR PC,NEXTPT ;GET HI-ORDER PART ADD R3,TTH(R5) ;ADD TO TOTAL TIME MOV TTL(R5) ;IND. NOT FIRST TIME ANY MORE BR N101 ;GO START PROCESSING ; RE-INITIALIZE ALMOST EVERYTHING AT START OF NEW ENVELOPE ;,T0L(R5) ;SAVE T0 OF ENVELOP MOV TTH(R5),T0H(R5) MOV NOFC(R5),CNT(R5);GET NO. OF EXTRA CHANNELS MOV #-1,R3 ;INDICATE BEGI MOV BAS(R5),YX(R5) ;CLEAR PREVIOUS VALUE N20: CLRB PK(R5) ;CLEAR PEAK FOUND INDICATION CLR CAL(R5) ;CLEAR AREA ACCUM. DURINING NEW ENVELOP BR 31$ 3$: JSR PC,NEXTPT ;GET NEXT POINT 31$: JSR PC,GETBUF ;GET OUTPUT BUFFER TST (R0) ;IS THERE ROOM LNG INCREASE CLR CAH(R5) CLR CCNL(R5) ;CLEAR PARTIAL CENTROID CALCULATION CLR CCNH(R5) CLR TML(R5) ;CLEAR LOCAL TIMER EFT IN OUTPUT BUFFER BNE 4$ ;IF SO, B+C JSR PC,PASBUF ;IF NOT, PASS THE FULL BUFR AND GET NEW 1 4$: MOV R3,(R2)+ ;OUTPUT VCLR TMH(R5) MOV TTL(R5),FTML(R5) ;SET BEGIN TIME TO CURRENT TIME MOV TTH(R5),FTMH(R5) INC FTML(R5) ;CORRECT BEGIN TIME BALUE DEC (R0) ;DEC. OUTPUT WORD COUNT MOV R2,-(R0) ;RESTORE OUTADDR DEC CNT(R5) ;DECREMENT EXTRA CHANNEL CNT BGE 3$ ;SING TREND CLR CC(R5) ; SO CLEAR INCREASES COUNTER MOV #100000,MX(R5) ;IF NOT, SET PHONY MAX JMP N100 ;AND GET NEXT POINT ;GO OUTPUT PEAK BLOCK MOV TTL(R5),FTML(R5);RECORD BEGIN OF NEXT PEAK TIME MOV TTH(R5),FTMH(R5) JMP N30 ;INITIALIZE SOMET ;FOUND PEAK N130: MOVB #1,PK(R5) ;INDICATE FOUND A PEAK MOV MX(R5),TOP(R5) ;SAVE CREST VALUE MOV CTL(R5),TOPTL(R5) VARIABLES .SBTTL UTILITY ROUTINES ;ROUTINE TO GET NEXT AVERAGED POINT NEXTPT: MOV INADDR,R2 ;GET INPUT TABLE ADDR ;SAVE CREST TIME MOV CTH(R5),TOPTH(R5) JMP N50 ;CONTINUE .SBTTL CHECK FOR NEW MAXIMUM N150: ADD R3,CAL(R5) ;INCR. ARESS NEXTIN: INC INCNT ;DECR INPUT BUFR CNT .ENABL LSB BLE NEXTC ;IF NOT EMPTY , CONTINUE TST NDFLG ;CHECK FOR LAST BUFEA FROM INCREASING TREND ADC CAH(R5) MOV TML(R5),R0 ;MULT LOCAL TIME BY CUR. VALUE AND ADD $MUL R3,R0 ;TO PARTIAL CENTROIFER BEQ 20$ ;IF NOT A LAST BUFFER, B+C TST (SP)+ ;FORGET WHERE WE CAME FROM JMP ENDATB ;IF IT IS, RELEASE OUTPUT BUFFED SUMMATION ADD R1,CCNL(R5) ADC R0 ADD R0,CCNH(R5) MOV TMH(R5),R0 ;SAME FOR MSH OF LOCAL TIME $MUL R3,R0 ADD R1,CCNHR 20$: MOV (SP)+,SAVR(R5) CLC ;INDICATE NO ERRORS .IF NDF,CTREL$ JMP ENDATC ;GO RELEASE INPUT BUFFER AND RETURN .E(R5) CMP R3,MX(R5) ;IS NEW VALUE LARGER THAN OLD MAX .ENABL LSB BGE 1$ ;IF SO, B+C JMP N100 ;OTHERWISE GET A NEW POINTNDC .IF DF,CTREL$ RTS PC ;RETURN TO CONTROL MODULE .ENDC RESUME: MOV SAVR(R5),-(SP) MOV INADDR,R2 ;GET ADDR OF INP50 ;IF NOT, B+C .SBTTL FOUND NEW MINIMUM MOV R3,MN(R5) ;STORE NEW MINIMUM INC MC(R5) ;INCR. MINS COUNTER MOV TML(R5 1$: MOV R3,MX(R5) ;SAVE NEW MAX MOV TTL(R5),CTL(R5) ;SAVE NEW MAX TIME MOV TTH(R5),CTH(R5) INC CC(R5) ;INCR INCREASE CO),R0 ;GET LOCAL TIME $MUL R3,R0 ;MUL BY NEW VALUE ADD R1,OCNL(R5) ;ADD TO CENTROID SUMMATION ADC R0 ADD R0,OCNH(R5) MUNTER CMP CC(R5),IGT(R5) ;GOT ENOUGH INCREASES FOR A TREND BGE 2$ ;IF SO, B+C JMP N100 ;OTHERWISE, GET NEXT POINT 2$: COV TMH(R5),R0 ;DO SAME FOR MSH OF LOCAL TIME $MUL R3,R0 ADD R1,OCNH(R5) ADD CCNL(R5),OCNL(R5) ;ADD PARTIAL CENTR. SUM FOR LR MC(R5) ;CLEAR DECREASES COUNTER MOV MX(R5),MN(R5) ; AND SET MIN TO CURR VALUE TSTB S1(R5) ;IS THIS AN INCREASE AFTER A INCR ADC OCNH(R5) ADD CCNH(R5),OCNH(R5) CLR CCNL(R5) ;CLEAR PARTIAL CENTROID SUMMATION CLR CCNH(R5) ADD R3,OAL(R5) ;ADDECREASE BNE 3$ ;IF SO, B+C JMP N100 ;IF NOT, GO GET NEXT POINT 3$: MOVB #1,S2(R5) ;IND. INCREASING TREND CLRB S1(R5) D TO TOTAL AREA ADC OAH(R5) ADD CAL(R5),OAL(R5) ;ADD PARTIAL AREA FROM INCR ADC OAH(R5) ADD CAH(R5),OAH(R5) CLR CAL(R5; NOT DECREASING TSTB PK(R5) ;HAS THERE BEEN A PEAK FOUND BNE 4$ ;IF SO, IT IS ENDING ON A VALLEY,SO B+C JMP N100 ;IF N) ;CLEAR PARTIAL AREAS CLR CAH(R5) .ENABL LSB CMP MC(R5),IGT(R5) ;ENOUGH POINTS DURING INCREAS BGE 1$ ;IF SO, B+C JMOT, THIS IS START OF FIRST PEAK 4$: CLRB PK(R5) ;CLEAR PEAK FOUND FLAG MOV TTL(R5),WDL(R5) ;GET WIDTH MOV TTH(R5),WDH(R5) P N100 ;OTHERWISE GET NEXT POINT 1$: TSTB S2(R5) ;IS THIS AFTER A CREST BNE N130 ;IF SO, B+C MOVB #1,S1(R5) ;IND. DECREA SUB FTMH(R5),WDH(R5) SUB FTML(R5),WDL(R5) SBC WDH(R5) CLR TYPE(R5) ;INDICATE TYPE OF PEAK(ENDS ON VALLEY) JSR PC,OUTPUGET ADDR OF ADDR OF OUTPUT BUFFER JSR PC,BAGET ;OTHERWISE, GET AN OUTPUT BUFFER BCC 1$ ;IF ALLS WELL, B+C CLRB FIRSTM(R5)CK IN OUTPUT BUFFER DEC (R0) ;DECR BUFR WORD CNT $SOB R3,3$ ;DECR BLOCK WORD CNT. B+C IF NOT ZERO MOV R2,-(R0) ;STORE CU ;IF NOT, IND. NEXT DATA RECEIVED FOR THIS INCB EROR(R5) ;INDICATE ERROR SEC ; CHANL TO BE TREATED AS INITIAL DATA. 2$: RRENT BUFFER POINTER RTS PC ;ROUTINE TO OUTPUT LAST BUFFER ENDATB: MOV OUTADR,R0 ;GET ADDR OF ADDR OF OUTPUTBUFR ENDATRTS PC ;INDICATE ERROR AND RETURN ;ROUTINE TO PASS FULL OUTPUT BUFFER TO CONTROL MODULE ; ROUTINE ALSO CALLS GETBUF TO GEA: MOV +2(R0),R1 ;GET BUFFER WORD CNT .ENABL LSB BNE 1$ ;IF USED, SOMETHING IS IN IT COM (R0) ;OTHERWISE, SET PHONY BUFRT NEW OUTPUT BUFFER PASBUF: MOV BASIZ,(R0) ;SET LBI TO BUFR SIZE .ENABL LSB SUB BBASIZ,R2 ;GET BEGIN BUFR ADDR NEG (R0) ADDR(-1) BR 2$ 1$: SUB BASIZ,R1 ;GET NEG COUNT OF BUFR ELEMENTS ASL R1 ;GET NEG BYTE COUNT ADD R1,(R0)+ ;RESET BUFR ADD ;INDICATE NOT LAST BUFR MOV R2,-(R0) ;RESTORE BUFR ADDR JSR PC,CTOBUF ;PASS BUFR BCC 3$ ;IF ALL'S WELL, B+C CLR FIRSTR TO START OF BUFR ASR R1 ;GET NEG COUNT OF BUFR ELEMENTS NEG R1 ;GET POS COUNT OF BUFR ELEMENTS MOV R1,(R0) ;STORE FORM(R5) ;INDICATE IN INITIAL STATE 4$: TST (SP)+ ;OTHERWISE, QUIT TST (SP)+ .IF NDF,CTREL$ JMP ENDATC ;GO RELEASE INPUT LBI 2$: JSR PC,CTOBUF ;PASS BUFFER CLRB FIRSTM(R5) ;INDICATE IN INITIAL STATE .IF NDF,CTREL$ ENDATC: ROR -(SP) ;SAVE C BUFFER AND RETURN .ENDC .IF DF,CTREL$ RTS PC .ENDC 3$: JSR PC,GETBUF ;GET ANOTHER OUTPUT BUFR BCS 4$ ;IF NO AVAARRY MOV SINADR,R0 ;GET INPUT BUFFER ADDRESS JSR PC,BAREL ;RELEASE IT ROL (SP)+ ;RESTORE CARRY .ENDC RTS PC ;RETURILABLE BUFFERS, QUIT RTS PC ;ROUTINE TO OUTPUT A BLOCK OF PEAK DATA. OUTPUT: MOV OCNL(R5),R1 ;DIV OCN/OA + T0 = OCN MN ;ROUTINE TO DIVIDE R0, R1 BY R2, R3 WITH RESULT IN R0,R1 DDIVD: MOV R5,-(SP) ;SAVE R5 MOV #32.,-(SP) ;GET LOOOV OCNH(R5),R0 MOV OAL(R5),R3 MOV OAH(R5),R2 JSR PC,DDIVD ADD T0L(R5),R1 ADC R0 ADD T0H(R5),R0 MOV R1,OCNL(R5) MP COUNT CLR R4 ;READY REMAINDER(R4+R5) CLR R5 .ENABL LSB 1$: ROL R1 ROL R0 ;EXPOSE NEW BIT OF NEWMERATOR ROL R4 RUT BUFFER INC INCNT ;DECREMENT INPUT BUFFER COUNTER NEXTC: MOV (R2)+,R3 ;GET NEXT DATUM MOV R2,INADDR ;SAVE INPUT BUFFER POV R0,OCNH(R5) .ENABL LSB JSR PC,GETBUF ;GET OUTPUT BUFR ADDR IN R2, WD CT ADR R0 BCC 1$ ;IF NO ERRORS B+C TST (SP)+ OINTER RTS PC ;RETURN ;ROUTINE TO GET THE CURRENT OUTPUT BUFR POINTER,RETURNED IN ; R2, AND ADDRESS OF COUNT OF OUTPUT .IF NDF,CTREL$ JMP ENDATC ;GO RELEASE INPUT BUFFER AND RETURN .ENDC .IF DF,CTREL$ RTS PC .ENDC 1$: MOV R5,R4 SPACE LEFT, RETURNED IN R0 GETBUF: CLC ;IND. NO ERROR .ENABL LSB 1$: MOV OUTADR,R0 ;GET ADDR OF ADDR OF OUTPUT BUFFER ADD #TYPE,R4 ;GET ADDRESS OF START OF PEAK OUPUT BLOCK MOV #14,R3 ;GET OUPUT WORD COUNT 3$: TST (R0) ;IS THERE ROOM FOR MOMOV (R0)+,R2 ;GET ADDR OF OUTPUT BUFFER BNE 2$ ;IF IT EXITS, B+C MOV BASIZ,(R0) ;SET WORD CNT TO BUFFER SIZE TST -(R0) ;RE IN OUT BUFR BNE 2$ ;IF SO, B+C JSR PC,PASBUF ;IF NOT, PASS THIS ONE AND GET NEW ONE 2$: MOV (R4)+,(R2)+ ;PUT OUTPUT BLOECK LOW PARTS BHI 3$ ;BRANCH IF DENOM. TOO BIG(C=0) 2$: SUB R3,R4 ;SUB DENOM FROM REMAINDER SBC R5 SUB R2,R5 SEC ;IEM AND TO ONE WHO AGREES ;TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE SOFTWARE ;SHALL AT ALL TIMES REMAIN IN DEC. NDECATE NEW QUOTIENT BIT 3$: DEC (SP) ;CHECK LOOP COUNT BGE 1$ ;IF MORE TO COME B+C TST (SP)+ ;UP SP MOV (SP)+,R5 ;RES ;THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE ;WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A ;COMMITMENT BY DIGITATORE R5 RTS PC ;RESULT IN R3,R2 NDFLG: .WORD 0 ;END FLAG, SET IF INPUT BUFR IS A LAST BF INADDR: .WORD 0 ;CONTAINS POL EQUIPMENT CORPORATION. ;DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ;ITS SOFTWARE ON EQUIPMENT WHICH IS NOINTER IN CURRENT INPUT BUFFER ;TO NEXT INPUT DATUM INCNT: .WORD 0 ;CONTAINS COUNT OF DATA LEFT IN IN BUFFER OUTADR: .WOT SUPPLIED BY DEC. ;LDP SOFTWARE DEVELOPMENT, MAR. 1975 ; CARL RALSTON ;THE SPIKE TRAIN ACQUISITION MODULE WILL ALLOW THERD 0 ;CONTAINS ADDRESS OF ADDRESS OF OUTPUT ;BUFFER POINTER .IF NDF,CTREL$ SINADR: .WORD 0 ;ADDRESS TO SAVE INPUT B USER TO ;COLLECT INTER-SPIKE INTERVAL(ISI) OR POST STIMULUS TIME(PST) ;DATA FROM THE LPS OR AR11. (OPTIONALLY USING DIGITAL IUFFER ADDRESS .ENDC .END /O) .SBTTL CONDITIONAL ASSEMBLY PARAMETER EXPLANATIONS ;FG$ IF DF THIS WILL BE USED IN THE FOREGROUND. ; IF NDF WILL BE USED IN THE BACKGROUND OR SJ. ;LPS11$ IF DF THE HARDWARE IS THE LPS. ; OR ;AR11$ IF DF THE HARDWARE IS THE AR11. ;LPSDR$ IF DF INCLUDE CODE FOR USING THE LPS DIGITAL I/O ; OR ;DR11K$ IF DF INCLUDE CODE FOR USING THE DR11K AS THE DIGITAL I/O ; OR ;STVC$ IF DF USE THE DISPLAY CONTROL AS LIMITED DIGITAL I/O. ; THE INPUT BIT IS 'ERASE RET L' AND THE OUTPUT BIT IS 'CHANNEL'. .TITLE STACQ SPIKE TRAIN ACQUISITION ;LAB APPLICATIONS-11 ;DEC-11-SLABA-C-LA ;FILENAME STACQ.MAC ;FILE ID STACQ.1 .CSECT S ;STDP$ IF DF THE OUTPUT DATA FORMAT IS DOUBLE PRECISION. THE FIRST ; WORD IS THE NUMBER OF CLOCK OVERFLOWS. THE SECOND WORD ISTACQ ;COPYRIGHT (C) 1975 ;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ;THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR U THE ; VALUE LEFT IN THE MAIN COUNTER.(CLOCK TICKS PAST LAST OVERFLOW) ;DO SOME CONDITIONAL ASSEMBLY PARAMETER CHECKING .ISE ONLY ON A ;SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLUSION ;OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, F DF LPSDR$ & DR11K$ ERROR=2DIOS ;ONLY ONE DIGITAL I/O UNIT ALLOWED .ENDC .IF DF LPS11$ & AR11$ ERROR=2DEVICES ;LPS11 OL R5 CMP R2,R5 ;DOES DENOMINATOR FIT BHI 3$ ;IF NOT, B+C(CARRY = 0) BLT 2$ ;IF SO, B+C CMP R3,R4 ;IF HIGH EQUAL, CHOR ANY OTHER COPIES ;THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ;OTHER PERSON EXCEPT FOR USE ON SUCH SYSTHANNEL BIT OF THE VC. N=1 IF STDP$ NDF. ;STOPAT: .WORD N ;DIG OUTPUT BIT PATTERN WHEN STSTYP IS NONZERO ; .ENDC ; .ENDC ;STS1 MOV #STIM,(R1)+ MOV R2,@R1 .ENDC .IF DF AR11$ MOV #CLKVEC,R1 ;R1 -> VECTOR LOCATIONS MOV #CLKIN,(R1)+ MOV R2,(R1TYP & STODAT ARE REQUIRED FOR PST ONLY. ;LPS AR11 USE ;ST1 'ERASE RET' STIMULUS AND/OR STARTUP ;ST2 'EXTERNAL EVENT' RES)+ .IF DF STVC$ MOV #STIM,(R1)+ MOV R2,@R1 .ENDC .ENDC .IF DF DR11K$ MOV #DIVEC,R1 ;R1 -> DIGITAL VECTORS MOV #DOR AR11 CAN BE SELECTED .ENDC .IF DF LPSDR$ .IF NDF LPS11$ ERROR=NOLPS ;LPS11$ MUST BE DEFINED FOR LPSDR .ENDC .ENPONSES OR SPIKES ;D OUT CHANNEL BIT OR D OUT INTERNAL STIMULUS OUTPUT ;D IN D IN STIMULUS OR SPIKES .SBTTL STINT INITIALIZDC .IIF DF LPSDR$ ! DR11K$ DIO$=1 .IF DF DIO$ & STVC$ ERROR=CAN'T USE VC BITS WHEN DIGITAL I/O IS AVAILABLE. .ENDC ATION ROUTINE ;DOES THE FOLLOWING: ;1. .DEVICE FOR STATUS REG USED ;2. IF FOREGROUND, DO A .PROTECT ON FIRST CALL ONLY ;3. S .SBTTL MACROS, GLOBALS, & EQUATES .MCALL .REGDEF,..V2..,.DEVICE,.PROTECT,.INTENT,.SYNCH,.RSUM .MCALL $ADDEF,$SOB,$SPL .REGDETUP INERRUPT VECTORS FOR DEVICES ASSEMBLED. ;4. FROM RATE, DETERMINE IF ISI, AND BUILD CLK STATUS WORD. ;5. COPY STOP COUNTEREF ..V2.. $ADDEF ;GLOBALS DEFINED LOCALLY .GLOBL STINT,STGO,STSTOP,STDPID,STEROR .IIF DF DIO$ .GLOBL STIDIG ;GLOBALS D, STSRT,STIMSK,STSTYP, & INIT SOME VALUES ;6. GET 2 BUFRS ;7. DO PROPER START UP ;8. RETURN WITH CLC IF NO ERRORS STINT: JEFINED EXTERNALLY .GLOBL BAGET,BAREL,BASIZ,CTIBUF,CTIDON,SAVRG,RSTRG .IIF DF FG$ .GLOBL CTRUN PS=177776 B5=40 B6=100 B7=SR PC,SAVRG ;R1-R4 CLR R4 ;START AT 0 FOR ERR IND MOV #DLIST,R0 ;R0 -> AREA FOR .DEVICE .DEVICE ;NOP OF SJ, NO ERR POSS200 B8=400 B9=1000 B10=2000 B12=10000 B14=40000 B15=100000 ;PARAMETER TABLE STRUCTURE ;STNBSP: .WORD N ;# OF STIMULUSES IBLE TST (PC)+ ;ONLY PROTECT ON 1ST CALL FSTCAL: 0 ;0 ON 1ST CALL, NON-ZERO AFTER BNE NOPRO INC FSTCAL MOV #PROTAR,RTO COUNT BEFORE STOPPING ;(SPIKES FOR ISI) ;STRATE: .BYTE 1-5,7 ;CLOCK RATE (NEG FOR ISI) ;STSRT: .BYTE ;TYPE OF STARTUP1 ;R1 -> AREA FOR .PROTECT MOV R1,R0 .PROTECT ;CLOCK BCS ERR2 ;ALREADY PROTECTED .IF DF DIO$ MOV R1,R0 .PROTECT ,# ; -1 ;IMMEDIATELY ON ENTRY (STINT CALLS STGO) ; 0 ;AFTER ST1 (ENABLE ST1 INTERRUPTS) ; +1 ;PROGRAM CONTROL (USER CALLS STDIVEC BCS ERR0 .ENDC .IF DF LPS11$ MOV R1,R0 .PROTECT ,#ADVEC ;USED FOR CLOCK OVERFLOW BCS ERR3 .ENDC .IF DF STVGO) ; .IF DF DIO$ ;STIMSK: .WORD 0 ;DETECT RESPONSES ON ST2(SPIKES ISI) ; N ;DETECT THEM FROM DIG INPUT WHERE N IS THE BITMAC$ MOV R1,R0 .PROTECT ,#VCVEC BCS ERR0 .ENDC NOPRO: MOV #340,R2 ;VECTOR PRIORITY 7 !!! .IF DF LPS11$ MOV #ADVEC,R1SK ; .IF DF DIO$ ! STVC$ ;STSTYP: .WORD 0 ;STIMULUS DETECTED ON ST1. IF STVC$ IS DF ;THEN DETECTED ON VC BIT FOR 'ERASE RE ;R1 -> VECTOR LOCATIONS MOV #OVRFLO,(R1)+ ;USED FOR CLK OVERFLOW MOV R2,(R1)+ ;PS VALUE MOV #CLKIN,(R1)+ ;CLOCK ROUTINE T L' ; N ;INTERNALLY GENERATED STIMULUS PULSES ON EVERY NTH ;CLOCK OVERFLOW & APPLIES A SIGNAL TO DIG OUTPUT ;OR THE C MOV R2,(R1)+ .IF DF LPSDR$ MOV #DIGIN,(R1)+ ;DIG INPUT ROUTINE MOV R2,(R1)+ .ENDC .ENDC .IF DF STVC$ MOV #VCVEC,RNT NEED PATTERN IF 0 MOV (R5)+,(PC)+ ;DIG OUTPUT PIT PATTERN STOPAT: 0 .ENDC 6$: .IIF DF AR11$ CLR CNTCLK ;AR11 EXTENDED CLE PROCEEDS BY INTERRUPTS UNTIL STOPPED BY ;SOME EXTERNAL CONDITION(CALL TO STSTOP,CLK OVERFLOW, ERROR CONDITION). STGO: .IIOUNTER MOV BASIZ,R3 ;GET BUFFER SIZE CLR BUFPAS ;NO BUFR TO PASS MOV #OUTCTR,R0 ;R0 -> OUTPUT COUNTER MOV R3,@R0 ;# OFF DF LPS11$ MOV #B6+B5,@#ADSAD ;CLK OVERFLOW ENABLE .IF DF DIO$ TST STIMSK ;SHOULD WE ENABLE DIG INPUT? BEQ 2$ MOV #177 WDS LEFT TO FILL .IIF DF STDP$ ASR @R0 ;HALF FOR D.P. MOV @R0,(PC)+ ;VALUE TO RESTORE OUTCTR SIZE: 0 MOV #BUF1,R0 ;PRIMA77,@#DIBUF ;YES, CLR INPUT REG. MOV #B6,@#DIOSAD ;ENABLE INPUT INTERRUPTS .ENDC 2$: .IF DF STVC$ TST ISIFLG BNE 3$ MORY OUTPUT BUFR ADDR. JSR PC,BAGET BCS ERR1 MOV BUF1,OUTPTR ;INIT OUTPUT POINTER MOV #BUF2,R0 ;SECONDARY OUTPUT BUFR ADDRV #B6+B12,@#VCSTAT ;ERASE RTN FOR PST ONLY .ENDC 3$: MOV CLKSR,@#CLKSAD ;ENABLE CLOCK & CLR FLAGS RTS PC .IF DF LPS11$ . JSR PC,BAGET BCS ERR1 NEG R3 MOV R3,LBI ;- # OF WDS IN BUFR CLR STEROR ;ZERO SOME FLAGS CLR ERRF CLR @#CLKBUF ! STVC$ .SBTTL GOIN STARTUP ROUTINE VIA ST1 OR ERASE RETURN BIT GOIN: .IIF DF LPS11$ MOV #CLKIN,@#CLKVEC ;SET CLK INTERRUPT IGIN,(R1)+ MOV R2,(R1)+ .ENDC CLR ISIFLG ;0 FOR PST, NON 0 FOR ISI MOV (R5)+,STNBSP ;STOP COUNTER ;THE CLOCK STATUS ;ALWAYS COUNTS FROM ZERO TSTB (PC)+ ;CHECK TYPE OF STARTUP STSRT: 0 BGT 18$ ;USER WILL CALL STGO BMI 12$ ;START NOW WORD SHOULD HAVE THE FOLLOWING BITS ON: ; LPS PST B14+B9+B6+RATE+1 ; ISI B9+B8+B6+RATE+1 ; AR11 BOTH B14+B8+B6+RATE+1 MOV.IF DF LPS11$ MOV #GOIN,@#CLKVEC ;GO INTERRUPT FROM ST1 MOV #B14,@#CLKSAD ;ST1 ENABLE .ENDC .IF DF STVC$ MOV #GOIN,@#VB (R5)+,R3 ;CLK RATE 1-5,7 ASL R3 ;PROPER BIT POSITION FOR CLK .ENABL LSB BPL 4$ ;NEG OF ISI INC ISIFLG ;DOING ISI TYCVEC MOV #B6+B12,@#VCSTAT ;ERASE RET ENABLE & ERASE TO CLR F/F .ENDC BR 18$ 12$: JSR PC,STGO 18$: CLC ;NO ERRORS 20$PE ACQUISITION NEG R3 ;POS CLK VALUE NOW .IF DF LPS11$ BIS #B9+B8+B6+1,R3 ;COUNT FROM ZERO BASE, MODE ENABLE, GO BR 5$ : JSR PC,RSTRG RTS PC ERR3: INC R4 ;ADVEC ALREADY PROTECTED ERR2: INC R4 ;CLOCK ALREADY PROTECTED ERR1: INC R4 ;NO OUT 4$: BIS #B14+B9+B6+1,R3 ;EXTERNAL EVENT OR ST1 FOR PST 5$: .IFF 4$: BIS #B14+B8+B6+1,R3 ;AR11 IN MODE 1 .ENDC MOV R3,(PC)PUT BUFFERS AVAILABLE ERR0: MOV R4,R0 ;DIG IN ALREADY PROTECTED OR VC BR 20$ ;CARRY SET ON ERROR. .DSABL LSB DLIST: .BYT+ ;BUILT CLK STATUS WORD CLKSR: 0 MOVB (R5)+,STSRT ;TYPE OF STARTUP .IF DF DIO$ MOV (R5)+,STIMSK ;SPIKE INPUT BIT MASK,E 0,12. ;.DEVICE CODE DEVADR ;ADDR OF WORD PAIRS DEVADR: CLKSAD,0 .IIF DF LPS11$ ADSAD,0 .IIF DF DIO$ DIOSAD,0 .IIF ;IF 0 DONT NEED TO ENABLE DIO .ENDC TST ISIFLG ;IF 0 THEN PST BNE 6$ .IF DF DIO$ ! STVC$ MOV (R5)+,STSTYP ;TYPEDF STVC$ VCSTAT,0 0 ;TERMINATED BY 0 ADDR. PROTAR: .BYTE 0,25. ;.PROTECT CODE CLKVEC ;VECTOR LOC TO PROTECT .SBTTL S OF STIMULUS PULSES BEQ 6$ .IIF NDF STDP$ MOV #1,STSTYP MOV STSTYP,TYPCTR ;SET COUNTER .ENDC .IF DF DIO$ BEQ 6$ ;DOTGO ENABLE INTERRUPTS FOR DATA COLLECTION ;AFTER STINT IS CALLED THIS ROUTINE ENABLES THE PROPER INTERRUPTS ;SO THAT THIS MODU ;SO THAT THE RTI AFTER .INTENT WILL ;RTS PC FORM STSTOP. BR FULL ;PASS LAST BUFR. KILL: .IIF DF STVC$ CLR @#VCSTAT RTUP. ;FOR THE AR11: ;THE MODE FLAG (BIT7) IS THE CLK OVERFLOW CONDITION AND BIT15 IS THE ;EXTERNAL EVENT FLAG. FOR OVERFLO .IIF DF DIO$ CLR @#DIOSAD .IIF DF LPS11$ CLR @#ADSAD CLR @#CLKSAD .IIF DF STDP$ ASL OUTCTR ;BY 2 FOR DP ADD OUTCTR,LBW AN INTERNAL COUNTER IS INCREMENTED ;TO EXTEND THE AR11 8 BIT COUNTER TO 16 BITS. THE EXTERNAL ;EVENT (SPIKES) CAUSES THE CLKI ;REDUCE BY # LEFT NEG LBI ;NOW + FOR LAST BUFR. RTS PC .IF DF DIO$ .SBTTL DIGIN DIGITAL INPUT INTERRUPT SERVICE ROUT CTR TO BE PLACED INTO THE OUTPUT BUFFER. ;FOR PST, THE STIMULUS PULSES MUST COME FROM DIG INPUT OR ERASE RETURN. CLKIN: TSTINE ;ONCE THE MODULE HAS BEEN INITIALIZED AND STARTED, THIS ROUTINE ;CHECKS TO SEE IF THE DIGITAL INPUT REG CONTAINS ANY BITS B @#CLKSAD ;WAS IT THE MODE FLAG? BMI MODE ;YES BIC #B15,@#CLKSAD ;NO, CLR ST1 OR EXTERNAL EVENT FLAG .IIF DF AR11$ BR ARWHICH ;MATCH THE DIGITAL INPUT BITMASK "STIMSK". IF NOT, THE ROUTINE ;JUST RETURNS. IF ANY BITS MATCH, A ST2 INTERRUPT IS CAUSIN ;AR11 EXTERNAL EVENT ;THE INTERRUPT FOR ERASE RETURN SIGNAL IS USED AS A ;SUBSTITUTE FOR LPS ST1 COMES HERE. STIM: CLRED FOR LPS OR ;THIS IS A SPIKE OR RESPONSE WHEN USED WITH AR11. IN ANY CASE THE ;CURRENTLY READ DIGITAL INPUT REG IS SAVED IN -(SP) ;0 IN BUF MEANS STIMULUS PULSE .IIF DF STDP$ CLR -(SP) .IIF DF STVC$ BIS #B12,@#VCSTAT ;ERASE BIT TO REENABLE INTERRGLOBAL "STIDIG". DIGIN: MOV @#DIBUF,(PC)+ ;READ INPUT REG. STIDIG: 0 ;CURRENTLY READ IN VALUE MOV STIDIG,@#DIBUF ;CLEAR UPT STIM1: DEC @#CLKSAD ;STOP CLOCK ALSO CLEARS CLKCTR CLR @#CLKBUF INC @#CLKSAD ;RESTART CLK AT 0 .IIF DF AR11$ CLR CNTCINPUT REG BIS #B6,@#DIOSAD ;REENABLE INTERRUPTS BIT STIDIG,(PC)+ ;SEE IF ANY MASK BITS ON STIMSK: 0 ;DIGITAL INPUT BITMASLK ;HIGH BYTE CTR .IIF DF STDP$ CLR OVRCTR ;CLK OVERFLOW COUNTER DEC (PC)+ ;COLLECTED ENOUGH DATA? STNBSP: 0 ;# OF STIMUADDR. .IIF DF STVC$ MOV #STIM,@#VCVEC JSR PC,STGO ;ENABLE INTR FOR DATA COLECTION TST ISIFLG ;IS THIS FOR PST? BEQ STIK BEQ 2$ ;BR IF NO MASK BITS ON .IIF DF LPS11$ BIS #B10,@#CLKSAD ;SET MAINT ST2, ;SO THE INTERRUPT WILL READ CLK .IIM ;YES, OUTPUT 0 FOR STIMULUS RTI .ENDC .SBTTL STSTOP DISABLE INTERRUPTS & PASS LAST BUFFER ;THIS ROUTINE MAY BE CALLEDF DF AR11$ BR ARIN ;RESPONSE FOR PST, SPIKE FOR ISI 2$: RTI .ENDC .SBTTL CLKIN CLOCK INTERRUPT SERVICE ROUTINE ;FOR THE L AT ANYTIME TO STOP ACQUISITION. THIS ;IS DONE BY DISABLING ALL INTERUPTS. THE CURRENT BUFFER IS LABELED AS ;AS THE LAST AND PPS: ;THE SPIKES OR RESPONSES ARE RECIEVED FROM ST2 INTERRUPTS MODE FLAG ;BIT7. THE CLK COUNTER IS TRANSFERRED TO BUFFER PRESETASSED TO THE CTRL MODULE. IF THERE IS A 2ND BUFFER ;IT WILL BE RELEASED. STSTOP: JSR PC,KILL ;STOP EVERYTHING MOV (SP)+,S ;REG BY THE INTERRUPT AND THIS ROUTINE READS THE CLK VALUE PLACING ;IT INTO THE OUTPUT BUFFER. THE STIMULUS PULSE COMES IN OTSRT ;SAVE PC OF JSR MOV @#PS,-(SP) ;SETUP STACK SO THAT .INTENT WILL WORK MOV STSRT,-(SP) ;PUT PC OF SUBR CALL ON STACK N ST1 ;B15 FOR PST AT WHICH TIME THE CLK IS STOPPED, RESTART CLOCK AT 0, ;STORE 0 IN BUFFER. FOR ISI, ST1 IS ONLY USED FOR STA LPS11$ MODE: BIC #B7,@#CLKSAD ;CLR MODE FLAG MOV @#CLKBUF,-(SP) ;CLK VALUE OF RESPONSE OR SPIKE .ENDC .IF DF AR11$ AR .IFF BCC RTN ;NOT D.P. OR 16 BIT OVERFLOW, JUST RTI .ENDC .ENDC .IF DF DIO$ ! STVC$ TST ISIFLG ;SHOULD WE GENERATE IN: MOV @#CLKCTR,-(SP) ;READ CLK DIRECTLY ADD CNTCLK,@SP ;HIGH ORDER BITS .ENDC BNE 1$ ;HAVE NO RESP VALUE OF 0 TST ISISTIMULUS PULSE? BNE 1$ ;ONLY FOR PST, ISI STOP IF NOT D.P. TST (PC)+ ;IF 0 DONT OUTPUT ANYTHING STSTYP: 0 ;TYPE OF STIMFLG ;ONLY FOR PST BNE 1$ INC @SP 1$: .IF DF STDP$ MOV (PC)+,-(SP) ;HIGH ORDER WORD OVRCTR: 0 .ENDC TST (PC)+ ;IF IULUS PULSES BEQ 1$ ;STOP IF STDP$ NOT DF DEC (PC)+ ;YES, BUT THIS OVERFLOW? TYPCTR: 0 ;CTR FOR INTERNAL STIMULUS PULSESSI, ISIFLG: 0 BNE STIM1 ;COUNT # OF SPIKES & CLR CLOCK VALUES .SBTTL INSERT PUT VALUE INTO OUTPUT BUFR FROM STACK ;, UPD. BNE RTN ;NO MOV STSTYP,TYPCTR ;YES, RESET COUNTER & .SBTTL INTERNAL STIMULUS PULSE ;WHEN THE STIMULUS PULSES ARE GENEATE BUFR POINTERS AND SEE IF BUFR FULL INSERT: MOV (SP)+,@OUTPTR ;STORE VALUE IN BUFR ADD #2,(PC)+ ;BUMP PTR OUTPTR: 0 ;PTRATED BY THIS ROUTINE, ;A SIGNAL WILL BE APPLIED TO THE DIGITAL OUTPUT REGISTER ON BITS ;SPECIFIED IN 'STODAT'. IF THE VC IS UR INTO CURRENT BUFR .IF DF STDP$ MOV (SP)+,@OUTPTR ;2ND D.P. VALUE ADD #2,OUTPTR .ENDC DEC (PC)+ ;ANY MORE ROOM IN BUSED, THEN THE OUTPUT SIGNAL ;WILL BE THE CHANNEL BIT (BIT 9). THIS IS FOR PST ONLY. ;THE CLOCK WILL BE ZEROED & STARTED. ;A ZFR OUTCTR: 0 ;# OF WORDS LEFT TO FILL BUFR BEQ FULL ;PASS FULL BUFR RTN: RTI .SBTTL OVRFLO CLOCK OVERFLOW ROUTINE ;THERO WILL BE PLACED IN OUTPUT BUFR TO INDICATE STIMULUS PULSE. .IF DF DIO$ CLRB @#DIOSAD+1 ;CLR OUTPUT FLAG MOV STOPAT,@#IS ROUTINE IS THE INTERRUPT SERVICE ROUTINE FOR THE LPS ;CLOCK OVERFLOW. IT IS REALLY THE INTERRUPT FROM THE A/D CONVERTER ON DOBUF ;LOAD STIMULUS PULSE BITS .IFF BIS #B9,@#VCSTAT ;OUTPUT SIGNAL ON CHANNEL BIT BIC #B9,@#VCSTAT ;CAUSES A TRANSITION ;A CLOCK OVERFLOW. IT WILL CONVERT A CHANNEL THEN INTERRUPT. ;IF STDP$ IS NOT DEFINED, THE OVERFLOW WILL STOP ACQUISITION. THIS .ENDC BR STIM ;PLACE 0 IN BUFR .ENDC 1$: .IIF DF STDP$ RTI 2$: JSR PC,KILL ;STOP ALL ACQ IF WE OVERFLOW INC STEROR ;SHOULD NOT OCCURE FOR PROPER USE. IF STDP$ IS DEFINED, ;THEN AN INTERNAL OVERFLOW COUNTER IS INCREMENTED UNTIL IT OVERFLOWS ;THIS STOP IS AN ERROR ;PASS LAST BUFR .SBTTL FULL PASS A FULL (OR LAST) BUFFER TO THE CONTROL MODULE .ENABL LSB FU ;AT WHICH TIME ACQUISITION IS ALSO STOPPED. .ENABL LSB OVRFLO: .IF DF STDP$ & LPS11$ INC OVRCTR ;BUMP # OF OVERFLOWS LL: TST (PC)+ ;IS ACQ TOO FAST? BUFPAS: 0 ;ADDR OF BUFR TO PASS BEQ 2$ ;0 IF ALREADY PASSED JSR PC,KILL ;IF SO, STOP ALI OR SPIKES TO CNT BEFORE STOP BNE INSERT ;NO JSR PC,KILL ;YES, STOP MOV #1,OUTCTR ;FORCE A BR TO FULL .IF DF STDP$ BEQ 2$ ;STOP IF BECOMES 0 .ENDC .IF DF AR11$ MODE: BIC #B7,@#CLKSAD ;CLK OVERFLOW FLAG ADD #400,(PC)+ ;CLK OVERFLOW, 256 ADD #2,LBI ;2 WORDS FOR LAST VALUE .IFF INC LBI ;COUNT LAST VALUE .ENDC BR INSERT ;PUT LAST VALUE INTO BUFR .IF DF TO INTERNAL CTR CNTCLK: 0 ;EXTENDS AR11 CLK COUNTER .IF DF STDP$ ADC OVRCTR ;D.P. CTR BEQ 2$ ;STOP IF BECOMES ZERO L 5 TST (PC)+ ;IF + WE ARE ON LAST BUFR LBI: 0 ;-# OF WDS IN BUFR, + FOR LAST BMI 11$ DEC CTIDON ;CTRL MOD DONE COUNT11K VECTOR ADDR. MAXRR$=12 ;USED ONLY BY THE THROUGHPUT PROGRAM FOR THE ;MAXIMUM # OF ENTRIES IN THE ROUND ROBIN TABLE. ;FGCQ INC ERRF ;SET TOO FAST FLAG RTI 2$: MOV BUF1,BUFPAS ;GET BUFR TO PASS MOV BUF2,OUTPTR ;SWITCH BUFFER 2 TO PRIMARY MER 11$: CLR BUFPAS ;READY TO PASS BUFR RTS PC ;RTI, BECAUSE OF .INTENT .IF DF FG$ SYNFAIL:JSR PC,KILL ;STOP ACQ. INOV BUF2,(PC)+ BUF1: 0 ;PRIMARY BUFFER ADDR. BNE 4$ ;IF 0 MEANS NO SECOND BUFR JSR PC,KILL ;STOP & PASS LAST BUFR 4$: MC ERRF ;WILL FORCE TO PASS LAST BUFR. INC CTRUN ;SO WE DONT TRY ANOTHER .SYNCH BR 9$ ;THIS WILL PASS LAST BUFR AND EXIT OV SIZE,OUTCTR ;RESET OUTPUT COUNTER .INTENT 5 ;LOWER PRIORITY WHILE WE PASS ;& GET THE NEW BUFFER 5$: MOV R0,-(SP) ;SA ;GRACEFULLY SYNAR: 0,2,0,0,0,-1,0 ;STORAGE FOR .SYNCH .ENDC .END VE R0-R2 MOV R1,-(SP) MOV R2,-(SP) MOV BUFPAS,R1 ;BUFFER ADDR MOV (PC)+,R0 ;DATA PATH I.D. STDPID: 0 ;SET BY CALLER, .NLIST .TITLE THRASM CONDITIONAL ASSEMBLY PARAMETERS FOR 'THRU' PROGRAM. ;LAB APPLICATIONS-11 ;DEC-11-SLABA-C-LA ;FILENAME TOTHERWISE 0 MOV LBI,R2 ;# OF WORDS IN BUFR, LBI JSR PC,CTIBUF ;PASS BUFR TO CTRL MOD BCC 6$ ;IF ACCEPTED, BR JSR PC,KIHRASM.MAC ;FILE ID THRASM.1 ;THIS FILE CONTAINS THE CONDITIONAL ASSEMBLY PARAMETERS FOR THE ;THROUGHPUT PROGRAM. TO CONFIGLL ;IF NOT, SHUT DOWN MOV R1,R0 ;ADDR OF BUF NOT ACCEPTED JSR PC,BAREL ;RELEASE IT BR 8$ ;CTRL MOD MADE PREVIOUS BUFR TURE A SYSTEM, IT IS ONLY NECESSARY TO ;ELIMINATE THE SEMICOLON TO THE LEFT OF THOSE PARAMETERS ;ONE WISHES DEFINED OR INSERT AHE LAST 6$: TST LBI ;DONT GET BUF2 WHEN PASSING LAST BUFR BPL 7$ MOV #BUF2,R0 ;LOC TO STORE 2ND BUFR ADDR JSR PC,BAGET ; SEMICOLON PRECEDING ;THE PARAMETERS NOT WANTED. IF THAT PARAMETER IS DEFINED IT ;WILL INCLUDE CODE AND/OR ENABLE THE FEATUREGET BACK-UP BUFR BCC 8$ 7$: CLR (PC)+ ;NO SPACE,STOP WHEN CURRENT BUFR FULL BUF2: 0 ;ADDR OF SECONDARY BUFR 8$: MOV (SP) DISCRIBED. ;THE PARAMETERS DEFINED ARE THOSE USED BY THE SUPPLIED VERSION OF ;THE 'THRU' PROGRAM. ;GENERAL HARDWARE USAGE+,R2 ;RESTORE REGS MOV (SP)+,R1 MOV (SP)+,R0 .IF DF FG$ TST CTRUN ;IS CTRL MOD RUNNING? BNE 9$ .SYNCH #SYNAR ;NO, LPS11$=10 ;SET = MAXIMUM NUMBER OF DATA PATHS USED BY CONSAM ;AR11$=10 ;SAME AS LPS11$ BUT FOR THE AR11 LPSDR$=1 ;CODE FORUSES R4 & R5 BR SYNFAIL ;SYNAR ERROR RTN INC CTRUN ;SAYWE DID A .SYNCH .RSUM .ENDC 9$: $SPL 7 ;* NO INTERRUPTS WHILE USING LPS DIGITAL INPUT & OUTPUT ;DR11K$=1 ;LIKE LPSDR$ EXCEPT DR11K ;LVN40$=1 ;CPU IS PDP-11/40 OR PDP-11/35 ;LVN45$=1 ;CPU CHECKING ERRORS TST (PC)+ ;RUNNING TOO FAST? ERRF: 0 ;NON-ZERO WHEN RUNNING TO FAST BEQ 10$ INC (PC)+ ;SET GLOBAL ER IS PDP-11/45 ;EIS=1 ;EXTENDED INSTRUCTION SET (KE11-E) ;EAE=1 ;INDICATES EAE (KE11-A OR KE11-B) ;ADSR$=170400 ;DEFAULT A/DROR FLAG STEROR: 0 CLR ERRF $SPL 5 ;BACK TO .INTENT LEVEL MOV BUF1,BUFPAS BR 5$ ;PASS TOO FAST BUFR AS LAST 10$: $SP STATUS REG. ADDR. ;ADVEC$=340 ;DEFAULT A/D VECTOR ADDR ;DRSR$=167770 ;DEFAULT DR11K STATUS REG. ADDR ;DRVEC$=300 ;DEFAULT DRMULATE EIS DIV .ENDC TPCLS$=1 ;CLOSE SUBROUTINE "TPCLS" INCLUDED .IF DF MODE1$ BAMLT$=1 ;GET AND RELEASE MULTIPLE CONTIGUO .MCALL ..V2..,.REGDEF,$OUTDEF,$SOB,.PRINT,.TTYIN,.TTYOUT ..V2.. .REGDEF $OUTDEF ;EXTERNAL GLOBALS .GUS BUFFERS .ENDC .LIST LOBL CTNOFD,CTNOFB ;PERTAINENT TO C.T. MOD. ; FROM DIRKTR PROGRAM .GLOBL CSMODE,CSNOFC,CSRATE,CSTICK,CSNOFB ;PERTAINENT TO C.S. MOD. .GLOBL CSTYPE,CSCHGP,CSDOUT,CSSOUT,CSHOUT ; FROM DIRKTR PROGRAM .GLOBL CSSTOP,CSSIN,CSHIN,CSRRCT,CSRRTB,CSTART .GLOBL PROGSS ;PROGRAMMED START/STOP ; FLAG FROM DIRKTR PROGR .GLOBL BAINT,BASIZ,BALL ;GLOBALS FROM B.A. MOD. .$=1 ;MODULES USED IN THE FOREGROUND ;CONTRL CONTROL MODULE MAXDP$=10 ;DEFINED = TO THE MAXIMUM # OF DATA PATHS TO BE USED ;SINCE THERE IS ONLY ONE ACQUISITION MODULE, THIS ;PARAMETER SHOULD EQUAL LPS11$ OR AR11$. ;CONSAM CONTINUOUS SAMP.TITLE INITIALIZATION ROUTINE ;LAB-APPLICATIONS-11 ;DEC-11-SLABA-C-LA ;FILENAME INTLIZ.MAC ;FILE ID INTLIZ.5 .CSECT INTLING MODE1$=1 ;SINGLE RATE AND CONTROL MODE MODE2$=1 ;MULTI-RATE AND CONTROL MODE MODE3$=1 ;ROUND ROBIN MODE .IF DF MODE1LIZ ;COPYRIGHT (C) 1975 ;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ;THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR US$ AUTOG$=1 ;GAIN RELATED CODE DMA$=1 ;CODE FOR SINGLE CHANNEL DMA .IF DF DMA$ DUAL$=1 ;DUAL SAMPLE & HOLD DMA .IF DF DUE ONLY ON A ;SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLUSION ;OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OAL$ DSORT$=1 ;FOR DUAL SAMPLE & HOLD DMA, DATA IS SORTED .IF DF DSORT$ ;INPLC$=1 ;IF DSORT$ IS DF, ONLY 2 BUFFERS ARE SORTEDR ANY OTHER COPIES ;THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ;OTHER PERSON EXCEPT FOR USE ON SUCH SYSTE IN PLACE .ENDC .ENDC .ENDC .ENDC ;THE FOLLOWING PARAMETERS ARE FOR THE TTYR11, QA, OUTF, ;GENS,TPUT AND BUFALL MOM AND TO ONE WHO AGREES ;TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE SOFTWARE ;SHALL AT ALL TIMES REMAIN IN DEC. DULES. ;THEY SHOULD NOT BE CHANGED. RT11$=1 ;RT-11 O.S. REQUIRED QAMIX$=1 ;MIXED INPUT QAALP$=1 ;ALPHANUMERIC INPUT QAS;THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE ;WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A ;COMMITMENT BY DIGITALDO$=1 ;SINGLE, DOUBLE, OCTAL INPUT FORTX$=1 ;ASCII TEXT OUTPUT FORSP$=1 ;SINGLE PRECISION OUTPUT SAVRG$=1 ;SAVE AND RESTORE R EQUIPMENT CORPORATION. ;DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ;ITS SOFTWARE ON EQUIPMENT WHICH IS NOTEG LISTC$=1 ;LIST COMPARE MULT$=1 ;UNSIGNED MULTIPLY DIV$=1 ;DIVIDE .IF NDF EIS MULR0$=1 ;SIMULATE EIS MUL DIVR0$=1 ;SI SUPPLIED BY DEC. ;LDP SOFTWARE DEVELOPMENT, JUNE 1975 .SBTTL MACROS FROM SYSMAC,GLOBALS,CONDITIONAL ASSEMBLY PARAMETERS CONTINUOUS SAMPLING MODULE UNDER MODE #3). IT MUST BE ; DEFINED ONLY IF MODE #3 TYPE SAMPLING IS BEING REQUESTED. .IF NDF, MOV X2,MESAGE ;GET ADDRESS OF MAIN TEXT MOV X3,R3 ;GET COUNT OF ITEM TO HANDLE MOV X4,R2 ;GET ADDRESS IN TEXT OF VARIABMAXRR$ MAXRR$=0 .ENDC ;FG$,LPSDR$,DR11K$,AND MAXDP$ ARE ALSO USED BY THIS PROGRAM. FOR THEIR ; MEANING, PLEASE CONSULT LE NUMBER JSR PC,X5 ;GO SET UP TABLE .ENDM .SBTTL INTLIZ-BABEGN SECTION TO PARAMETERIZE AND INITIALIZE ;THE BUFFER ATHE MODULES MANUAL, SINCE THE MODULES ; DETERMINE HOW OR IF THESE PARAMETERS ARE TO BE DEFINED. .SBTTL MACROS PECULIAR TO LLOCATION MODULE ;THE ONLY PARAMETER VALUE REQUIRED FROM THE USER IS ;"BASIZ". OVRLA1: CLRB TTYICH ;SET INPUT TOTHIS ROUTINE ;CHECK PROVIDES TO PROCEDURE NECESSARY TO GET A ;PARAMETER VALUE FROM A USER FOR THE CONTROL AND ;CONTINU COME FROM TERMINAL CLRB TTYOCH ;SET OUTPUT TO GO TO THE TERMINAL MOV #OVRLA1,BALL ;SET LOWER LIMIT TO FREE CORE FOR BUFFEROUS SAMPLING MODULES. ;SETUPT PROVIDES THE PROCEDURE NECESSARY TO GET A ;TABLE OF PARAMETER VALUES FOR THE CONTINUOUS ;S ; TO BE START OF THIS OVERLAY. THIS ; INSTRUCTION MAKES THE ORDER OF LINKING ; THIS OVERLAY CRUCIAL, IN THAT,SAMPLING MODULE. .MACRO CHECK Z0,Z1,Z2,Z3,Z4,?Z5,?Z6,?Z7 ;GETS PROPER VALUE FOR TABLE .ENABL LSB ; OLD TST NDFLAG THIS ; PROGRAM MUST BE LINKED FIRST TO OBTAIN ; MAXIMUM CORE UTILIZATION DURING DATA ; ACQUISITION. BABEGN: JSR ;CHECK IF A USER RESPONSE IS NECCESSARY BEQ Z5 ;FOR ENTRY. IF SO, BRANCH CMP Z1,NDFLAG ;CHECK IF THIS LINE NEEDS A RESPONS R5,QA 1000 BAINMS ;INDICATE B.A. MODULE INITIALIZATION BUFINT: MOV #BAMSAD,MESAGE ;SET ADDRESS OF BUFFER SIZE MESSAGE GLOBL CTINIT ;C.T. MOD INIT. ADDR. .GLOBL CSINIT ;C.S. MOD. INIT. ADDR. .GLOBL TPOPN,TPCHN,TPWRT ;GLOBALS FORM T.P. E BNE Z6 ;IF NOT, BRANCH CLR NDFLAG ;OTHERWISE, SIGNAL TO RESPONSE HEREAFTER Z5: MOV Z2,MESAGE ;SET TEXT ADDRESS FOR PROMMOD. .GLOBL QA,QAERR,QADATF,QABUFP,QAANS ;QA MODULE GLOBALS .GLOBL CRLF,TTYOCH,TTYICH ;GLOBALS FROM T.I. MOD. .GLOBL FORMAPT .IF B,Z4 MOV Z3,VALUE ;SUPPLY OLD VALUE .IFF CLR VALUE ;SUPPLY OLD VALUE MOVB Z3,VALUE ; IN WORD .IF IDN,Z0,GETT ;OUTPUT FORMATTER ADDRESS .IF NDF,FG$ .GLOBL TTYCHK ;ROUTINE TO CHECK FOR ; TERMINAL INPUT WHEN ; ABS BPL Z7 ;IF POSITIVE, BRANCH BIS #177400,VALUE ;EXTEND SIGN IN BYTE TO GET IT PRINTED .ENDC .ENDC Z7: JSR PC,Z0 ;LPROGRAMMED START/STOP .ENDC ; IS SELECTED. ;INTERNAL GLOBALS .GLOBL OVRLA1 ;OVERLAY START ADDRESS ;CONDOOK FOR A NEW VALUE BCS Z6 ;IF NONE WAS SUPPLIED, BRANCH .IF B,Z4 MOV R0,Z3 ;OTHERWISE, UPDATE VALUE Z6: MOV Z3,(R5)+ ;ITIONAL ASSEMBLY PARAMETERS NEEDED ;MAXRR$ IS THE ONLY PARAMETER WHICH IS DIRECTLY APPLICABLE TO THE PROGRAM ; AND IS NOT DIPUT VALUE IN PARAMETER TABLE .IFF MOVB R0,Z3 ;OTHERWISE,UPDATE VALUE Z6: MOVB Z3,(R5)+ ;PUT VALUE IN PARAMETER TABLE .ENRECTLY INVOLVED IN THE MODULES THEMSELVES. IT ; REPRESENTS THE TOTAL NUMBER OF POSSIBLE ENTRIES IN A ROUND ROBIN ; TABLE(SEEDC .ENDM .MACRO SETUPT X1,X2,X3,X4,X5 ;SETS UP FOR AND CALLS PTABWD OR PTABYT MOV X1,R4 ;GET ADDRESS OF PRESENT VALUESMOV BASIZ,R0 ;GET DESIRED BUFFER SIZE IN R0 JSR PC,BAINT ; GO INITIALIZE B.A. MODULE BCC CTBEGN ;IF NO ERRORS, BRANCH AND S CT5 ;IF NO CHANGE INDICATED, BRANCH JSR PC,QCHANG ;OTHERWISE, FIND OUT WHICH QUES. TO CHANGE BCS CT4 ;IF IMPROPER RESPONCONTINUE .PRINT #INTERM ;OTHERWISE, INFORM USER OF ERROR BR BUFINT ; AND RESTART PROCEDURE INTERM: .ASCIZ <15><12>/MODUSE, ASK FOR CHANGES JSR R5,QA ;RESET QA MODULE TO RIGHT MODE 11000 ;OUTPUT CRLF BR CT1 ; GO LOOK FOR NEW VALUE LE INITIALIZATION ERROR./ BAMSAD: .ASCIZ /BASIZ = / BAINMS: .ASCIZ <15><12>/BUFFER ALLOCATION MODULE INITIALIZATION/<15><12> ;THIS SECTION ACTUALLY CREATES THE PARAMETER TABLE NEEDED BY ;THE CONTROL MODULE FOR INITIALIZATION CT5: MOV #CTPTBL,R5 ;O .EVEN .SBTTL CTBEGN ROUTINE TO PARAMETERIZE AND INITIALIZE ;THE CONTROL MODULE. ;ONLY TWO PARAMETERS ARE REQUIRED OFTHERWISE, GET ADDRESS OF C.T. PARA TABL MOV #1,(R5)+ ;INDICATE ONE ACQUISITION SOURCE IN TABLE MOVB CTNOFD,R0 ;GET # OF DATA THE USER: ; CTNOFD AND CTNOFB. ;THE REASON THE OTHER PARAMETERS ARE NOT NEEDED ;IS BECAUSE OF THE SPECIFIC NATURE OF T PATHS .IF NDF,FG$ INC R0 ;ADD ONE FOR DUMMY CHANL FOR PROGRAMMED .ENDC ; START AND STOP MOV R0,(R5)+ ;SUPPLY PAHE PROGRAM. ;THE PROCESSES IN EACH DATA PATH ARE THE SAME, AND ;IN FACT EACH DATA PATH CONTAINS ONLY ONE PROCESS, ;I.E.RAMETER TAB WITH # OF PROCESSES MOVB CTNOFB,(R5)+ ;SUPPLY # OF BUFRS ALLOWED TO WAIT MOVB R0,(R5)+ ;SUPPLY # OF DATA PATHS ,"TPWRT". THE PROGRAM ALSO ASSIGNS THE PRIORITIES ;OF PROCESS EXECUTION, WHICH IT CHOSES AS ONE MORE THAN ;THE ASSOCIATED .IF NDF,FG$ DEC R0 ;SET R0 TO CTNOFD .ENDC CLR R1 ;SET DATA PATH ID AND PRIORITY INDICATOR CT6: MOVB R1,(R5)+ ;SUP DATA PATH NUMBER, THUS ENSURING UNIQUE ;PRIORITIES. ;THIS SECTION ALSO SETS UP AN ADDITIONAL DATA PATH IF ;THE CONDIPLY PARAMETER TABLE WITH DATA PATH ID MOVB #1,(R5)+ ;SUPPLY # OF DATA PATH ENTRIES MOV R1,(R5)+ ;SUPPLY RT-11 CHNL NO. TO TPTIONAL ASSEMBLY PARAMETER "FG$" IS NOT DEFINED. ;THIS DATA PATH WOULD BE USED BY THE PROGRAM TO LOOK FOR ;INPUT FROM THE TWRT MOV #TPWRT,(R5)+ ;SUPPLY PROCESS ADDRESS FOR DATA PATH MOV R1,(R5)+ ;SUPPLY PROCESS PRIORITY INC R1 ;INCR DATA PATH AERMINAL IF A PROGRAMMED START/STOP ;CAPABILITY IS REQUIRED BY THE PARAMETERIZATION OF THE ;CONTINUOUS SAMPLING MODULE ND PRIORITY LEVEL IND $SOB R0,CT6 ;CHECK FOR MORE DATA PATHS. .IF NDF,FG$ ;THIS SECTION CREATES THE EXTRA DATA PATH MOV BASIZ,VALUE ;GET CURRENT VALUE OF BUFFER SIZE JSR PC,GETNUM ;LOOK FOR NEW VALUE .ENABL LSB BCS 1$ ;IF NO CHANGE IS IN CTBEGN: JSR R5,QA 1000 CTMSG ;INDICATE CONTROL MODULE INITIALIZATION CT0: CLR NDFLAG ;CLEAR "NO RESPONSE NEEDED"DICATED, BRANCH MOV R0,BASIZ ;OTHERWISE, UPDATE BASIZ 1$: JSR PC,CHANGE ;GIVE ANOTHER CHANCE TO CHANGE BCS 2$ ;IF NO CHANG FLAG CT1: MOV #CTNOFD,R5 ;GET ADDRESS OF VARIABLES .ENABL LSB CT2: CHECK GETNUM,#1,#NOFDMS,(R5),#1 ;GET NO. OF DATA PATHS E DESIRED, BRANCH JSR R5,QA ;GET QA MODULE IN RIGHT MODE 11000 ;AND OUTPUT CRLF BR BUFINT ;GO LOOK FOR NEW VALUE 2$: .ENABL LSB CT3: CHECK GETNUM,#2,#NOBTMS,(R5),#1 ;GET # OF BUFRS ALOWD TO WAIT CT4: JSR PC,CHANGE ;CHECK FOR ANY CHANGES BC MOVB R1,(R5)+ ;SUPPLY DATA PATH ID FOR START/STOP PROG MOVB #1,(R5)+ ;SUPPLY # OF DATA PATH ENTRIES CLR (R5)+ ;NO EXTRA A PATHS BLT 5$ ;IF LESS, BRANCH .PRINT #TOOBIG ;BUT IF GREATER, INDICATE TOO LARGE BR 3$ ;AND TRY AGAIN 5$: MOV QAANS,INFORMATION NEEDED BY PROCESS MOV #TTYCHK,(R5)+ ;SUPPLY PROCESS ADDRESS FOR DATA PATH MOV R1,(R5)+ ;SUPPLY LOWEST PRIORITY TTPCHN ;GET CHNL # TO BE DEFINED OR REDEFINED MOV #1,R1 ;GO GET ONE MORE DEF BR 1$ TOOBIG: .ASCIZ/ILLEGAL RT-11 CHANNELO PARA TAB .ENDC MOV #CTPTBL,R5 ;GET PARAMETER TABLE ADDRESS JSR PC,CTINIT ;INITIALIZE CONTROL MODULE WITH PARA. TAB B NUMBER/<15><12> CCHNLN: .ASCIZ/RT-11 CHANNEL NUMBER OF FILE DEFINITION TO CHANGE IS / HEADIN: .ASCIZ/DEFINE OUTPUT FILES FOR:CC TPBEGN ; IF NO ERRORS, BRANCH JSR PC,PRNTER ;GO PRINT ERROR MESSAGE JMP CT0 ;AND TRY AGAIN CTMSG: .ASCIZ <15><12>/CO/ TPMSAD: .ASCIZ<15><12>/THROUGHPUT MODULE INITIALIZATION/ .EVEN .SBTTL CSBEGN ROUTINE TO PARAMETERIZE AND INITIALIZE ;NTROL MODULE INITIALIZATION/<15><12> NOFDMS: .ASCIZ /Q1: CTNOFD = / NOBTMS: .ASCIZ /Q2: CTNOFB = / .EVEN .SBTTL TPBEGN ROTHE CONTINUOUS SAMPLING MODULE. ;ALL PARAMETERS MUST BE SPECIFIC EITHER EXPLICITLY ;OR IMPLICITLY. THE SECTION WILL NOT CUTINE TO INITIALIZE THE THROUGHPUT MODULE BY ;DEFINING AN OUTPUT DATA FILE FOR EACH DATA PATH TPBEGN: .PRINT #TPMSADHECK FOR NON- ;PROGRAM RELATED ERRORS, BUT LETS THE MODULE DO MOST ;OF THE CHECKING. THE PROGRAM DOES CHECK TO SEE THAT ;INDICATE THROUGPUT MODULE INITIALIZATION .ENABL LSB MOVB CTNOFD,R1 ;GET NO. OF DATA PATHS MOV R1,R2 ;GET SECOND COPY ;"CSNOFC" IS EQUAL TO "CTNOFD", SINCE THIS IS REQUIRED ;FOR THIS PARTICULAR PROGRAM FOR PROPER OPERATION. IT ;ALSO CHECK CLR TPCHN ;ZERO DATA PATH NO.(RT-11 CHANNEL) 1$: .PRINT #HEADIN ;PRINT GENERAL HEADING 2$: JSR R5,FORMAT ;ASK IF DEFINING RS THAT "CSRRCT" IS LESS THAN OR EQUAL TO ;"MAXRR$" FOR THE SAME REASON. CSBEGN: JSR R5,QA 1000 CSINMS ;TELL OFT-11 CHANNEL #X .BYTE TEXT ; BY "CHANNEL #XXXXXX" .ASCIZ/RT-11 CHANNEL #/ .BYTE OCTAL,0 .EVEN TPCHN .BYTE SPACE,2 CONTINUOUS SAMPLING MODULE INIT CS0: CLR NDFLAG ;CLEAR "NO RESPONSE NEEDED" FLAG CS1: MOV #CSPTBL,R5 ;GET PARAMETER TABLE AD .BYTE EXIT .EVEN JSR PC,ITPOPN ;OTHERWISE, GO TRY TO OPEN CHANNEL TPCHN BCS 2$ ;IF ERROR OCCURED, ASK AGAIN $SOB R1,2$DRESS CHECK GETNUM,#1,#MODEMS,CSMODE,#1 ;GET MODE(BYTE) CS2: .ENABL LSB ;GET NO. OF CHANNELS TST NDFLAG ;TEST IF A RESPON ;CHECK FOR MORE RT-11 CHANNELS 3$: JSR PC,CHANGE ;CHECK FOR ANY CHANGES BCS CSBEGN ;IF NONE, BRANCH JSR R5,QA ; FIND OUSE IS NECESSARY BEQ 1$ ;IF SO, BRANCH CMP #2,NDFLAG ;CHECK IF THIS LINE NEEDS A RESPONSE BNE 2$ ;IF NOT, BRANCH CLR NDT WHICH 4 ; RT-11 CHANNEL # TO REDEFINED OR DEFINE CCHNLN ; TSTB QAERR ;IF RESPONSE IS SYNTACTICALLY WRONG BNE 3$ FLAG ;OTHERWISE, SIGNAL TO RESPOND HEREAFTER 1$: MOV #NOFCMS,MESAGE ;SET TEXT ADDRESS FOR PROMPT CLR VALUE ;SUPPLY OLD VALU; OR TSTB QADATF ; IF NO NUMBER IS SUPPLIED BEQ 3$ ; GO ASK FOR CHANGES AGAIN CMP QAANS,R2 ;COMPARE RESPONSE TO # OF DATE MOVB CSNOFC,VALUE ; IN WORD JSR PC,GETNUM ;LOOK FOR A NEW VALUE BCS 2$ ; IF NONE WAS SUPPLIED, BRANCH MOVB R0,CSNOFC NE CHANNEL BR CS9 ; NO. TO BE SPECIFIED CS8: DEC NOFADC ;IF A DIGITAL CHANNEL, DEC. COUNT OF A/DS BEQ CS9A ;IF DIGITAL CGO INITIALIZE CS15: CHECK GETNUM,#12,#SINMS,CSSIN ;GET DIG MASK WHICH STARTS ACQ BNE CS16 ;IF SAME MASK FOR ALL CHANNELS, BRHANNEL ONLY, BRANCH CS9: CHECK GETABS,#6,#CHGPMS,CSCHGP,#1 ;GET CHNL # + GAIN/POL(BYTE) BPL CS9A ;IF CONTIGUOUS CHANNELS, BRANCH SETUPT #CSSIN+2,#MSINMS,CSNOFC,SINNO,PTABWD ;GET TABLE OF ;DIG MASKS WHICH START ACQ CS16: CHECK GETNUM,#13,#HINMSANCH SETUPT #CSCHGP+2,#MCGPMS,NOFADC,CHGPNO,PTABYT ;GET TABLE OF ; CHNL NOS. + GAINS OR POLARITIES CS9A: BIT #1,R5 ;M,CSHIN ;GET DIG MASK WHICH STOPS ACQ BNE CS17 ;IF SAME MASK FOR ALL CHANNELS, BRANCH SETUPT #CSHIN+2,#MHINMS,CSNOFC,HINNO,P;OTHERWISE STORE NEW VALUE 2$: CMPB CSNOFC,CTNOFD ;MAKE SURE COMPATIBLE WITH CONTROL MODULE BEQ CS3 ;IF COMPATIBLE, BRANCH AKE SURE ON WORD BOUNDARY BEQ CS10 ;IF SO , BRANCH INC R5 ;OTHERWISE GET ON WORD BOUNDARY CS10: .IF DF,LPSDR$ ! DR11K$ .PRINT #NOFCNC ;OTHERWISE, NOTIFY USER CLR NDFLAG ; CLEAR "NO NEED TO RESPOND" FLAG BR CS2 ; AND GO GET CORRECT RESPONSECHECK GETNUM,#7,#DOUTMS,CSDOUT ;GET DIGITAL OUTPUT INDICATOR BEQ CS12 ;IF DIGITAL OUTPUT NOT DESIRED, BRANCH CHECK GETNUM,#(HOPEFULLY) CS3: MOVB CSNOFC,(R5)+ ;PUT VALUE IN PARAMETER TABLE MOVB CSNOFC,NOFADC ;SET NO. OF A/D CHNLS TO # OF CHNLS CH10,#SOUTMS,CSSOUT ;GET VAL TO DIG. OUTP ON START BNE CS11 ;IF THE SAME FOR ALL CHANNELS, BRANCH BIT #2,CSMODE ;IF NOT MODEECK GETABS,#3,#RATEMS,CSRATE ;GET CLOCK FREQUENCY BPL CS4 ;IF ONLY ONE, BRANCH SETUPT #CSTICK,#MTICMS,CSNOFC,TICKNO,PTABWD S 2 OR 3 BEQ CS11 ; BRANCH SETUPT #CSSOUT+2,#MSOTMS,CSNOFC,SOUTNO,PTABWD ;GET TABLE OF ;VALUES TO OUTPUT DIGITALLY ON;GET TABLE OF ; CLOCK TICKS BR CS6 CS4: TST NDFLAG ;TEST IF RESPONSE IS REQUIRED BNE CS5 ;IF NOT, BRANCH MOV #T START CS11: CHECK GETNUM,#11,#HOUTMS,CSHOUT ;GET VAL TO DIG. OUTP ON STOP BNE CS12 ;IF THE SAME FOR ALL CHANNELS, BRANCH ICKMS,MESAGE ;OTHERWISE, GET PROMPT MESSAGE ADDRESS MOV CSTICK,VALUE ;GET CURRENT VALUE JSR PC,GETNUM ;GO LOOK FOR NEW VALUE BIT #2,CSMODE ;IF NOT MODES 2 OR 3 BEQ CS12 ; BRANCH SETUPT #CSHOUT+2,#MHOTMS,CSNOFC,HOUTNO,PTABWD ;GET TABLE OF ;VAL BCS CS5 ;BRANCH IF NO NEW VALULE MOV R0,CSTICK ;OTHERWISE, UPDATE CSTICK CS5: MOV CSTICK,(R5)+ ;PUT VALUE IN PARAMETER TAUES TO OUTPUT DIGITALLY ON STOP .ENDC CS12: BIT #2,CSMODE ;IF MODES 2OR 3 BNE CS15 ; BRANCH CHECK GETABS,#16,#STRTMS,CBLE CS6: CHECK GETABS,#4,#NOFBMS,CSNOFB ;GET NO. OF BUFFERS TO FILL BPL CS7 ;IF SAME FOR ALL CHANNELS, BRANCH SETUPT #CSNOSTART ;GET METHOD OF START/STOP BEQ CS14 ;IF PROGRAMMED(TTY), BRANCH .IF DF,LPSDR$ ! DR11K$ BMI CS13 ;IF SCHMIT TRIGGEFB+2,#MNOBMS,CSNOFC,BUFNO,PTABWD ;GET TABLE OF ; BUFFER LENGTHS CS7: CHECK GETABS,#5,#TYPEMS,CSTYPE,#1 ; GET TYPE(BYTE)R ONE, GO INITIALIZE CHECK GETNUM,#12,#SINMS,CSSIN ;GET DIG MASK TO START ACQ CHECK GETNUM,#13,#HINMS,CSHIN ;GET DIG MASK WH BEQ CS9 ;IF ALL A/D CHANNELS, BRANCH BMI CS8 ;IF ONE DIGITAL CHANNEL, BRANCH MOV #1,NOFADC ;OTHERWISE, DMA. NEED ONLY OICH HALTS ACQ .ENDC CS13: JMP CSCHNG ;GO INITIALIZE CS14: MOV #1,PROGSS ;INDICATE A PROGRAMMED START/STOP JMP CSCHNG ; UPDATE VALUE 2$: CMP CSRRCT,#MAXRR$ ;COMPARE TO MAX SPACE ASSEMBLED BLE CS21 ;IF IT FITS, BRANCH .PRINT #EXRRTB ;OTHERWIDOUT = / SOUTMS: .ASCIZ/Q10: CSSOUT = / MSOTMS: .ASCIZ/ CSSOUT FOR DATA PATH 000 = / HOUTMS: .ASCIZ/Q11: CSHOUT = / MHOTMS:SE, INFORM USER CLR NDFLAG ;CLEAR "NO RESPONSE NEEDED" FLAG BR CS20 ;AND GO ASK AGAIN CS21: MOV CSRRCT,(R5)+ ;PUT ROUND R .ASCIZ/ CSHOUT FOR DATA PATH 000 = / SINMS: .ASCIZ/Q12: CSSIN = / MSINMS: .ASCIZ/ CSSIN FOR DATA PATH 000 = / HINMS: .ASCOBIN COUNT IN PARAMETER TABLE SETUPT #CSRRTB,#RRTBMS,CSRRCT,RRTBNO,PTABYT ;SET UP ROUND ;ROBIN TABLE CHECK GETABS,#IZ/Q13: CSHIN = / MHINMS: .ASCIZ/ CSHIN FOR DATA PATH 000 = / STOPMS: .ASCIZ/Q14: CSSTOP = / RRCTMS: .ASCIZ/Q15: CSRRCT = /16,#STRTMS,CSTART ;GET START INDICATOR(WORD) BR CS18 CSCHNG: JSR PC,CHANGE ;GO CHECK FOR ANY CHANGES BCS CSINTL ;IF NONE EXRRTB: .ASCIZ<15><12>/CSRRCT HAS EXCEEDED VALUE ASSEMBLED FOR MAXRRC/ RRTBMS: .ASCIZ/ ROUND ROBIN TABLE ENTRY # 000 = / ST, GO INITIALIZE MODULE JSR PC,QCHANG ;OTHERWISE, FIND QUES. NO. TO CHANGE BCS CSCHNG ;IF IMPROPER RESPONSE, BRANCH JSR R5RTMS: .ASCIZ/Q16: CSTART = / .EVEN TICKNO: MTICMS+35 ;ADDRESS OF NUMERICS IN TEXT BUFNO: MNOBMS+27 CHGPNO: MCGPMS+27 SOUT,QA ;GET QA IN RIGHT MODE 11000 ;AND ISSUE CRLF JMP CS1 ;GO CHANGE APPROPRIATE LINE(S) CSINTL: MOV #CSPTBL,R5 ;GET ADNO: MSOTMS+27 HOUTNO: MHOTMS+27 SINNO: MSINMS+27 HINNO: MHINMS+27 RRTBNO: RRTBMS+34 .SBTTL UTILITY ROUTINES PECULIAR TO TTABWD ;GET TABLE OF ;DIG MASKS WHICH STOP ACQ CS17: CHECK GETNUM,#14,#STOPMS,CSSTOP ;GET DIG MASK WHICH STOPS PROG CLR DRESS OF PARAMETER TABLE JSR PC,CSINIT ;GO INITIALIZE CONTINUOUS SAMPLING MODULE BCC DONE ;IF NO ERRORS, BRANCH JSR PC,PRPROGSS ;CLEAR FLAG FOR PROGRAMMED(TTY)START/STOP CMP #3,CSMODE ;IS THIS MODE 3 BEQ CS20 ; IF SO , BRANCH CHECK GETABS,#1NTER ;GO PRINT ERROR MESSAGE JSR R5,QA 11000 ;GET QA IN CORRECT MODE JMP CS0 ;GO START PARAMETER TABLE OVER DONE: .PRI6,#STRTMS,CSTART ;GET START INDICATOR CS18: BNE CS19 ;IF DIGITAL INPUT START/STOP, BRANCH INC PROGSS ;OTHERWISE, INDICATE PNT #INTLDN ;INDICATE DONE RTS PC NOFCNC: .ASCIZ <15><12>/NO. OF CHANNELS NOT EQUAL NO. OF DATA PATHS./ INTLDN: .ASCIZ <15ROGRAMMED(TTY) CS19: JMP CSCHNG ;GO CHECK FOR ANY CHANGES BEFORE INIT CS20: .ENABL LSB ;GET ROUND ROBIN TABLE COUNT TST ND><12>/INITIALIZATION FINISHED!/<15><12> CSINMS: .ASCIZ<15><12>/CONTINUOUS SAMPLING MODULE INITIALIZATION/<15><12> MODEMS: .ASCFLAG ;IS A RESPONSE REQUIRED BEQ 1$ ;IF SO, BRANCH CMP #15,NDFLAG ;IS A RESPONSE REQUIRED FOR THIS LINE BNE 2$ ;IF NOT,IZ/Q1: CSMODE = / NOFCMS: .ASCIZ/Q2: CSNOFC = / RATEMS: .ASCIZ/Q3: CSRATE = / MTICMS: .ASCIZ/ NO. OF TICKS FOR DATA PATH BRANCH CLR NDFLAG ;OTHERWISE, CLEAR "NO NEED TO RESPOND" FL 1$: MOV #RRCTMS,MESAGE ;GET PROMPT MESSAGE COUNT MOV CSRRCT,V000 = / TICKMS: .ASCIZ/ NO. OF TICKS = / NOFBMS: .ASCIZ/Q4: CSNOFB = / MNOBMS: .ASCIZ/ CSNOFB FOR DATA PATH 000 = / TYPEMALUE ;GET CURRENT VALUE OF COUNT JSR PC,GETNUM ;LOOK FOR NEW VALUE BCS 2$ ;IF NO CHANGE, BRANCH MOV R0,CSRRCT ;OTHERWISE,S: .ASCIZ/Q5: CSTYPE = / CHGPMS: .ASCIZ/Q6: CSCHGP = / MCGPMS: .ASCIZ/ CSCHGP FOR DATA PATH 000 = / DOUTMS: .ASCIZ/Q7: CS, AND THE CARRY BIT WILL BE SET ON RETURN. ; OTHERWISE, THE CARRY IS CLEAR ON RETURN. ITPOPN: CLR R0 ;INDICATE DEFS. COM ; IF A NEW VALUE IS SUPPLIED, THE VALUE IS STORED IN R0 ; AND THE CARRY IS CLEAR ON RETURN. ; IF A (CR) ONLY IS RECEIVEDMING FROM TERMINAL JSR PC,TPOPN ;GO TRY TO OPEN AN RT-11 CHANNEL .ENABL LSB BCC 2$ ;IF NO ERRORS, BRANCH MOV R0,1$ ;OT AS A RESPONSE TO THE PROMPT, ; THE CARRY IS SET AND THE PROGRAM RETURNS. ; IF A RESPONSE OF ".(CR)" IS RECEIVED, "NDFLAG", HERWISE, PUT ERROR NO. IN PLACE JSR R5,FORMAT ; AND PRINT .BYTE CRLFC0,TEXT ; ERROR MESSAGE TPERMS: .ASCIZ <12><15>/ERROR #THE "NO ; NEED TO RESPOND" FLAG IS SET AS WELL AS THE CARRY BIT, ; AND THE PROGRAM RETURNS. GETNUM: CLR SIGN ;NON-PRIN/ .BYTE OCTAL,200 ; AND .EVEN 1$: .WORD 0 ; ERROR NUMBER .BYTE CRLFC0,EXIT .EVEN SEC ;INDICATE ERROR 2$: RTS PC TING CHARACTER BR GAGAIN GETABS: TST VALUE ;CHECK IF NEGATIVE BGE GETNUM ;IF NOT,BRANCH MOV #55,SIGN ;OTHERWISE, SUPPLY ;RETURN ;CHANGE GIVES THE PROMPT "ANY CHANGES?" AND ACTS UPON THE ANSWER. ; IF YES ("Y(CR)"), THE CARRY IS CLEAR ON RET MINUS SIGN NEG VALUE ;AND TAKE ABSOLUTE VALUE OF VALUE GAGAIN: JSR R5,FORMAT ; .BYTE TEXTA ;PRINT .EVEN MESAGE: .WORDURN. ; IF NO ("N(CR)"), THE CARRY IS SET ON RETURN. ; IF RESTART ("R(CR)"), THE PROGRAM JUMPS TO "BABEGN". ; OTHERWISE, TH 0 ;PROMPT MESSAGE .BYTE TEXTA ;PRINT SIGN OF VALUE IF NEGATIVE .EVEN SIGN .BYTE OCTAL,200 ;PRINT CURRENT ABSOLUTE VAE QUESTION IS ASKED AGAIN. CHANGE: MOV R5,-(SP) ;SAVE R5 .ENABL LSB 2$: JSR R5,QA ;ASK IF SATISFIED WITH RESPONSES FOR LUE OF VALUE: .WORD 0 ;SELECTED PARAMETER .BYTE EXIT .EVEN .TTYOUT #57 ;PRINT BACK-SLASH JSR R5,QA ;GO LOOK FOR USERLAST 20 ; PARAMETER TABLE. ASK "ANY CHANGES?". CHNMS ; RESPOND "Y" FOR YES, "N" FOR NO COMAND ; OR "R" T RESPONSE 4004 ;EXPECT AN OCTAL RESPONSE MOV QAANS,R0 ;GET ANSWER .ENABL LSB TSTB QADATF ;TEST FOR CR-LF ONLY BEQ 2O RESTART PROGRAM TSTB QAERR ;TEST FOR WRONG TYPE OF RESPONSE BNE 2$ ;IF SO, ASK AGAIN. TSTB QADATF ;TEST FOR NULL RESP$ ;IF SO, NO CHANGE FOR PARAMETER INDICATED TSTB QAERR ;TEST FOR "ERROR" BNE 1$ ;IF ERROR INDICATED, CHECK FOR END OF TABHIS PROGRAM ;PRNTER PRINTS AN ERROR MESSAGE AND THE VALUE RETURN IN ; R0 AFTER AN UNSUCCESSFUL ATTEMPT AT A MODULE'S ; ONSE BEQ 2$ ;IF SO, ASK AGAIN. MOV (SP)+,R5 ;RESTORE R5 ASR R0 ;SET CARRY FOR NO, CLEAR CARRY FOR YES BMI CHANGE ;ASKINITIALIZATION. PRNTER: MOV R0,CSEROR ;OTHERWISE, JSR R5,FORMAT ; INFORM USER .BYTE CRLFC0,TEXTA INTERM .BYTE TEXT AGAIN IF INCORRECT RESPONSE BEQ 1$ ;IF Y, OR N BRANCH TST (SP)+ ; OTHERWISE, POP STACK JMP BABEGN ; AND RESTART INITIA .ASCIZ / R0 = / .BYTE OCTAL,200 ; ERROR .EVEN CSEROR: .WORD 0 ; NO. RETURNED .BYTE CRLFC0,EXIT .EVEN RTS PC LIZATION 1$: RTS PC ;RETURN CHNMS: .ASCIZ /ANY CHANGES? / COMAND: .BYTE 4,1 .ASCIZ /YNR/ .EVEN ;GETNUM GIVES A P ;ITPOPN CALLS TPOPN, AND ON RETURN, CHECKS FOR ERRORS ; IF AN ERROR OCCURS, THE ERROR NO. AND AN ERROR MESSAGE ; IS PRINTEDROMPT FOR OBTAINING A NEW VALUE FOR THE ;PARAMETER NAMED IN THE PROMPT, AND AWAITS A REPLY, VIA ;THE TERMINAL FROM THE USER.IF NOT, GO TELL OF IMPROPER RESPONSE MOV #-1,NDFLAG ;OTHERWISE, INDICATE NO MORE TABLE CHANGE 2$: SEC ;INDICATE NO CHANGE TRESS OF THE PARAMETER TABLE IS IN R5. PTABST: TST NDFLAG ;SEE IF NECCESSARY TO ASK QUESTIONS BNE PTAB4 ;IF NOT, BRANCH O TABLE ENTRY RTS PC ;AND RETURN 4$: .PRINT #BADRSP ;PRINT ERROR MESSAGE BR GAGAIN ;TRY AGAIN SIGN: .WORD 0 ;SIGN OF MOVB #60,(R2) ;OTHERWISE START VARIABLE NUMBER IN TEXT MOVB (R2),1(R2) ; AT ZERO MOVB (R2),2(R2) BR PTAB1 ;START ASKING VALUE(IF DESIRED) IN ASCII BADRSP: .ASCIZ <12><15>/BAD RESPONSE. TRY AGAIN!/ .EVEN ;PTABWD SETS APPLICABLE INSTRUCTI QUESTIONS PTAB0: MOV #10,R0 ;GET ASCII OCTAL NUMBER OVERFLOW BIT INCB 2(R2) ;INCREMENT VARIABLE NUMBER IN TEXT BITB R0,2ONS IN THE PTABST ROUTINE TO ; WORD MODE PTABWD: MOV #100000,R0 ;GET BYTE INSTRUCTION BIT BIC R0,PTAB1 ;CLEAR IT IN THE A(R2) BEQ PTAB1 BICB R0,2(R2) INCB 1(R2) BITB R0,1(R2) BEQ PTAB1 BICB R0,1(R2) INCB (R2) PTAB1: MOVB (R4),VALUE ;GPPROPRIATE INSTRUCTIONS BIC R0,PTAB2 BIC R0,PTAB3 BIC R0,PTAB4 MOV #GETNUM,GETADR ;GET UNSIGNED VALUES BR PTABST ET CURRENT TABLE ENTRY JSR PC,@GETADR ;GET NEW VALUE BCS PTAB3 ;IF NONE INDICATED, BRANCH PTAB2: MOVB R0,(R4) ;OTHERWISE, ;PTABYT SETS APPLICABLE INSTRUCTIONS IN THE PTABST ROUTINE TO ; BYTE MODE PTABYT: MOV #100000,R0 ;GET BYTE INSTRUCTION BIT UPDATE TABLE ENTRY PTAB3: MOVB (R4)+,(R5)+ ;ENTER VALUE IN PARAMETER TABLE TST NDFLAG ;CHECK FOR NO MORE CHANGES BNE PTAB BIS R0,PTAB1 ;SET IT IN THE APPROPRIATE INSTRUCTIONS BIS R0,PTAB2 BIS R0,PTAB3 BIS R0,PTAB4 MOV #GETABS,GETADR ;GET S5 ;IF NONE, BRANCH $SOB R3,PTAB0 ;OTHERWISE CHECK FOR MORE TO DO RTS PC ;IF DONE, RETURN PTAB4: MOVB (R4)+,(R5)+ ;ENTER VIGNED VALUES CLR VALUE ;CLEAR UPPER HALF OF VALUE TO PRINT ;PTABST IS USED BY PTABYT AND PTABWD TO PRODUCE A TABLE OF ALUE IN PARAMETER TABLE PTAB5: $SOB R3,PTAB4 ;IF MORE ENTRIES, CONTINUE RTS PC ;OTHERWISE,RETURN GETADR: .WORD 0 ;ADDRES O ; EITHER BYTES OR WORDS. THIS IS DONE BY PRINTING A PROMPT ; WHOSE STARTING ADDRESS HAS BEEN GIVEN TO THE "GETNUM" ROUTINE F ROUTINE TO GET NEW AND ; PRINT OLD VALUES ;QCHANG ASKS FOR THE NUMBER OF THE QUESTION TO CHANGE. ; IF AN OCTAL ; ALREADY BY SETTING ADDRESS "MESAGE". HOWEVER, PTABST MODIFIES ; THIS PROMPT EACH TIME IT LOOKS FOR A NEW TABLE ENTRY BY NUMBER IS SUPPLIED, THIS NUMBER IS ;PUT IN "NDFLAG" , THE CARRY IS CLEARED, AND QCHANG RETURNS. ; IF SOMETHING OTHER THAN ; UPDATING A THREE DIGIT ASCII NUMBER WHOSE MOST SIGNIFICANT ; ASCII DIGIT START AT THE ADDRESS CONTAINED IN R2. ; WHEN TAN OCTAL NUMBER IS RESPONDED TO ;THE PROMPT OF QCHANG, "QUESTION # TO CHANGE = ", THE CARRY ;IS SET AND THE ROUTINE RETURNS.HIS ROUTINE IS CALLED, R4 CONTAINS THE STARTING ADDRESS ; OF THE PREVIOUS VALUES OF THIS TABLE, WHICH IS ALSO WHERE THE ; NE QCHANG: JSR R5,QA ;OTHERWISE, CHECK QUESTION NO. TO CHANGE 4 CHNGQS MOV QAANS,NDFLAG ;GET QUESTION NO. ASRB QAERR CLC ;OTHERWISE, INDICATE NEW DATUM RECEIVED RTS PC ;AND RETURN 1$: CMPB @QABUFP,#56 ;SEE IF INPUT WAS A "." BNE 4$ ;W VALUES ARE STORE AS WELL AS IN THE PARAMETER TABLE BEING ; PREPARED FOR THE CONTINUOUS SAMPLING MODULE. THE CURRENT ; ADDTION IN THIS DOCUMENT IS SUBJECT TO CHANGE ;WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A ;COMMITMENT BY DIGITAL EQUIPMENT CN TO ; CHANGE THE SEQUENCE. ENTAR: .BYTE 0,2 ;.ENTER CHAN & CODE 0,0 ;DBLK & LENGTH TPCTRG: 0 ;0 FOR .ENTER, COUNT ORPORATION. ;DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ;ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BYARG FOR MT & CT DEFEXT: .RAD50 /DATDATDATDAT/ ;4 WD DEFAULT EXT BLK OUTSPC: .BLKW 15. ;15 WDS FOR 3 OUTPUT FILES CBLK: .BL ;IF A SYNTACTICALLY INCORRECT BCS QC1 ; OR TSTB QADATF ; NULL RESPONSE RECEIVED BNE QC1 ; SET CARRY AND RETURN SEC DEC. ;LDP SOFTWARE DEVELOPMENT, FEB. 1975 ; CARL RALSTON ;THIS MODULE TAKES THE SUPPLIED OUTPUT FILE INFORMATION AND ;O ;INDICATE AN ERROR QC1: RTS PC ; AND RETURN CHNGQS: .ASCIZ /QUESTION NO. TO CHANGE = / .EVEN NDFLAG: .WORD 0 ;NOUTPUTS DATA FROM MEMORY INTO THOSE FILES ON AUXILARY STORAGE MEDIA. ;IT SUPPORTS MULTIPLE AND ASYNCHRONOUS DATA PATHS IN REAL-T NEED TO RESPOND FLAG NOFADC: .WORD 0 ;NO. OF A/D CHANNELS CTPTBL: .BLKW 1+MAXDP$*3 ;CONTROL MODULE PARAMETER TABLE .IF NDIME. .SBTTL CONDITIONAL ASSEMBLY PARAMETERS EXPLANATIONS ;FG$ IF DF, WILL BE USED IN THE FOREGROUND ; IF NDF, ASSUMED TO BE F,FG$ .BLKW 3 .ENDC CSPTBL: .BLKW MAXDP$/2*11+MAXRR$+12 ;CONTIUOUS SAMPLING PARAMETER TABLE .IF DF,LSSDR$ ! DR11K$ .BLUSED IN THE BACKGROUND OR S.J. ;MAXDP$ MUST BE DEFINED EQUAL TO THE MAXIMUM NUMBER OF DATA ; PATHS THAT CAN BE USED. ALSO THE KW 2*MAXDP$+3 .ENDC .END MAX # OF RT CHANNELS. ;TPCLS$ IF DF THE CLOSE "TPCLS" ROUTINE WILL BE INCLUDED. ; OTHERWISE THE USER WILL DO HIS OWN .CLOSE ;BAMLT$ IF DF MULTIPLE CONTIGIOUS BUFFERS MAY BE COMBINED TO ; FORM A 256. WORD BUFFER. OTHERWISE ALL BUFFER SIZES ARE A WHOLE .TITLE TPUT THROUGHPUT MODULE ;LAB APPLICATIONS-11 ;DEC-11-SLABA-C-LA ;FILENAME TPUT.MAC ;FILE ID TPUT.7 .CSECT TP ;COPY; NUMBER MULTIPLE OF 256. AND NEED ONLY BE RELEASED THRU "BAREL". .SBTTL MACROS & DEFINITIONS .MCALL .REGDEF,.WRITC,.CLOSE,.RIGHT (C) 1975 ;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ;THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A .V2..,.QSET,.CDFN,.DSTATUS,$SOB ..V2.. .REGDEF ERRBYT =52 ;EMT ERROR CODE .SBTTL GLOBALS ;GLOBALS DEFINED LOCALLY .GL ;SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLUSION ;OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANY OTHER OBL TPOPN,TPWRT,TPCHN,TPEROR,TPSEK,TPCTRG .IIF DF TPCLS$ .GLOBL TPCLS ;EXTERNAL GLOBALS USED .GLOBL BASIZ,BAREL,BACNT,SAVCOPIES ;THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ;OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM AND TO ONERG,RSTRG .IIF DF BAMLT$ .GLOBL BARLM .IIF NDF FG$ .GLOBL BAWDS .SBTTL LOCAL STORAGE ;TPCHN IS THE CURRENT CHANNEL TO BE WHO AGREES ;TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE SOFTWARE ;SHALL AT ALL TIMES REMAIN IN DEC. ;THE INFORMAOPENED. STARTS AT 0 ; AND INCREMENTS UP FOR EACH CHANNEL ENTERED. THIS GLOBAL ; CAN BE CHANGED BY THE USER BEFORE CALLING TPOPHANDLING ERRORS MOV R0,CSTRG ;ADDR OF ASCIZ STRING OR 0 FOR TTY TST (PC)+ ;IS THIS 1ST CALL FSTIM: 0 ;0 ON 1ST CALL, .NEEL OF INTEREST 16$: ADD #10.,R2 ;5 WDS FOR EACH FILE $SOB R3,10$ ;GET UP TO 3 FILES AT A TIME 20$: JSR PC,RSTRG RTS PC .0 ON ALL OTHERS BNE 2$ ;BR IF 1ST INC FSTIM ;MAKE .NE.0 FOR NEXT CALL .QSET #QAREA,#MAXDP$ ;ADDITIONAL QUEUE ELEMENTS ;ADD CLC FOR NORMAL RTN ERR3: INC R4 ;SETUP ERROR # FOR R0 ERR2: INC R4 ERR1: INC R4 ERR0: MOV R4,R0 SEC ;C=1 FOR ERR .IF GT MAXDP$-16. ;NEED ADDITIONAL CHANNELS DEFINED? MOV #CDFAR,R0 ;R0 -> CDFN AREA .CDFN ;IGNORE THE ERROR IF ANY .ENDOR BR 20$ .DSABL LSB .SBTTL TPSEK START A SEEK ON THE CHANNEL CONTAINED IN R0 ;ON ENTRY R0 CONTAINS THE RT-11 CHANNEL #C 2$: MOV #OUTSPC,R2 ;R2 -> FILE INFO MOV SP,R1 ;SAVE STACK VALUE MOV R2,-(SP) ;OUTSPC MOV #DEFEXT,-(SP) ;DEFAULT EXTENS TO DO THE SEEK. CONTROL ;RETURNS TO THE USER IMMEDEATELY AFTER THE SEEK IS INITIATED. ;NO ERRORS ARE RETURNED. TPSEK: MOVBION MOV (PC)+,-(SP) CSTRG: 0 ;ADDR OF ASCIZ STRING OR 0 FOR TTY EMT 345 ;.CSISPC R2,#DEFEXT,CSTRG MOV R1,SP ;RST STAC R0,-(SP) ;SAVE CHANNEL # MOV #SEKAR,R0 ;R0 -> .READ AREA MOVB (SP)+,@R0 ;SET CHANNEL # EMT 375 ;.READ EMT RTS PC SEKAKW 24. ;WDS FOR INPUT FILES & AREA FOR DSTATUS .SBTTL TPOPN ;THE TPOPN ROUTINE DOES THE FOLLOWING: ;1. IF 1ST CALL, DO A .K VALUE BCS ERR0 ;ILL CMD LINE TST CBLK ;WERE ANY INPUT FILES GIVEN? BNE ERR0 ;YES, ERROR MOV #3,R3 ;CNT FOR 3 OUTPUQSET FOR MAXDP$ ;2. IF 1ST CALL AND MORE THAN 16 CHANNELS DO A .CDFN FOR ; MAXDP$ CHANNELS. THIS MUST BE DONE BEFORE ANY I/T FILES 10$: TST @R2 ;WAS A FILE GIVEN BEQ 16$ ;0 IF NO .DSTATUS #CBLK,R2 ;INFO ABOUT DEV BCS ERR1 ;NO SUCH DEV MOV O OPERATION ; HAS BEEN INITIATED. ;3. CALLS THE CSI IN SPECIAL MODE TO GET OUTPUT FILE ; INFORMATION EITHER FROM MEMORY OCBLK+4,R0 ;ENTRY PT OF HNDLR .IF DF FG$ BEQ ERR3 ;HNDLRS MUST BE RESIDENT FOR FG .IFF ;LOAD IT IF BG OR SJ BNE 14$ ;R FROM THE TERMINAL. ;4. IF IN BG, NON-RESIDENT HANDLERS WILL BE LOADED INTO AN AREA ; DETERMINED BY THE BA. FG MUST HAVE D0 IMPLIES NOT IN MEMORY MOV CBLK+2,R0 ;SIZE OF HNDLR IN BYTES ASR R0 ;NOW SIZE IN WDS JSR PC,BAWDS ;GET ROOM FOR HNDLR ONE A KMON LOAD CMD. ;5. CLOSE EACH CHANNEL BEFORE DOING AN ENTER. ;6. THE CHANNEL TO ENTER IS DETERMINED BY TPCHN AND IS ; BCS ERR3 ;NO ROOM MOV R0,-(SP) ;CORADD TO LOAD MOV R2,R0 ;R0 -> DEVICE NAME EMT 343 ;.FETCH EMT BCS ERR1 ;NO SUCH DE INCREMENTED AFTER EACH ENTER. ;7. IF THE CARRY BIT IS SET, AN ERROR HAS OCCURED AND R0 HAS ; VALUE IN IT MEANING AS FOLLOWSV .ENDC 14$: MOV TPCHN,R1 ;CHAN # CLRB TPEROR(R1) ;ZERO CHAN ERROR FLAG .CLOSE R1 ;CLOSE CHAN BEFORE USE MOV #ENTAR+4,: ; 0 ILLEGAL COMMAND LINES TO CSI ; 1 DEVICE SPECIFIED IS NOT FOUND IN SYSTEM TABLES ; 2 NO ROOM FOR FILE ON OUTPUT DEVICE R0 ;PREPARE TO DO ENTER MOV 8.(R2),@R0 ;LENGTH OF FILE MOV R2,-(R0) ;DBLK ADDR TST -(R0) ;2 FROM R0 MOVB R1,@R0 ;SET C; 3 IF FG, HANDLER NOT RESIDENT. IF BG, NO ROOM TO LOAD HANDLER .ENABL LSB TPOPN: JSR PC,SAVRG ;SAV R1-R4 CLR R4 ;0 FOR HAN # EMT 375 ;.ENTER #ENTAR,TPCHN,DBLK,LENGTH,#0 BCS ERR2 ;BAD ENTER INC (PC)+ ;BUMP CHAN # TPCHN: 0 ;CURRENT CHANNTABLE. THE VALUES IN TPEROR CAN BE ; 0 NO ERROR ; 1 ATTEMPTED TO WRITE PAST EOF ; 2 HARDWARE ERROR ; 3 CHANNEL NOT OPEN ;BAMLT$ MOV BACNT,R1 ;# OF BUFFERS TO RELEASE BNE 4$ ;IF = 0, BUFSIZ IS 256 OR GREATER .IFTF JSR PC,BAREL ;RELEASE THIS CALL VIA JSR PC,TPWRT .ENABL LSB TPWRT: MOV R2,-(SP) ;SAV REG MOV #WRTAR+6,R2 ;R2 -> .WRITC AREA MOV 2(R1),@R2 ;WORD COBUFFER RTS PC ;RETURN .IFT 4$: JSR PC,BARLM ;RELEASE MULTIPLE BUFFERS RTS PC ;RETURN .ENDC .DSABL LSB .IF DF TPCUNT BEQ 4$ ;IF WDCNT=0, JUST RTN BPL 2$ ;- IF NOT LAST BUFFER NEG @R2 ;MAKE + WDCNT 2$: MOV @R1,-(R2) ;BUF ADDR MOV LS$ .SBTTL TPCLS CLOSE SUBR ;THIS ROUTINE TERMINATES ACTIVITY ON A SPECIFIED CHANNEL BY THE ;.CLOSE REQUEST. THIS MAKES THE O@R0,-(R2) ;REL BLK # INTO AREA MOV 4(R2),R1 ;GET + WORD COUNT ADD #377,R1 ;ROUND UP MOD(256.) BIC #377,R1 SWAB R1 ;# TUTPUT FILE A PERMANENT FILE ;ON THE OUTPUT DEVICE. ;INPUTS: ; R0 CONTAINS THE CHANNEL # TO CLOSE (RANGE 0-255) ; IF NEGATIVEO UNDATE REL BLK ADD R1,@R0 ;UPDATE RELBLK # TST -(R2) ;R2 - 2 MOVB R5,@R2 ;SET CHAN # MOV R5,R0 ;.WAIT CODE IS 0 , IT WILL CLOSE ALL CHANNELS UP TO MAXDP$ ;NO ERRORS ARE POSSIBLE. ;CALL VIA JSR PC,TPCLS ;R0 IS NOT SAVED & WILL BE CHANGED..IIF GT MAXDP$-127. BIC #177400,R0 ;CLR PROPOGATED SIGN BITS EMT 374 ;.WAIT EMT BCS 3$ ;EOF OR HARDWARE ON PREVIOUS WRITE ;THIS ROUTINE USES THE USR, SO CARE MUST BE TAKEN AS ;TO WHEN YOU CLOSE A CHANNEL! TPCLS: TST R0 ;IF NEG CLOSE ALL BP ASL R5 ;BY 2 FOR WD OFFSET MOV 4(R2),BUFADS(R5) ;ADDR INTO TBL TO BE RELEASED LATER ASR R5 ;BACK TO CHAN # MOV R2,R0 L 4$ MOV R1,-(SP) ;SAV REG MOV #MAXDP$,R1 ;USED FOR CTR 2$: MOV R1,R0 ;CHAN # BIS #6*400,R0 ;SET CODE IN HIGH BYTE EMT;R0 -> WRITC AREA .WRITC BCC 4$ 3$: MOVB @#ERRBYT,TPEROR(R5) ;GET EMT ERROR CODE INCB TPEROR(R5) ;BUMP BY ONE 4$: MOV (S 374 $SOB R1,2$ ;LOOP UNTIL ALL MOV (SP)+,R1 ;RST REG CLR R0 ;CLOSE CHAN 0 & RTN 4$: BIS #6*400,R0 ;CODE BYTE FOR .CLOSR: .BYTE 0,8. ;CHANNEL # & .READ CODE 0,0,0 ;REL BLK, BUF, WORD COUNT .WORD 1 ;1 FOR .READ .SBTTL TPWRT ;THIS ROUTINP)+,R2 ;RST REG, C=1 IF ERROR RTS PC ;RETURN .DSABL LSB WRTAR: .BYTE 0,9. ;.WRITC CHAN & CODE 0,0,0 ;REL BLK #, BUF AE TAKES A BUFFER WHOSE SIZE IS A WHOLE NUMBER ;MULTIPLE OF 256 AND WRITES IT TO A SPECIFIED CHANNEL. ;INPUTS: ; R1 -> 2 WORD DDR, WCNT WRCOMP ;ADDR OF COMPLETION ROUTINE .SBTTL WRITC COMPLETION ROUTINE ;THIS IS THE COMMON COMPLETION ROUTINE USEDAREA ; 1ST WD CONTAINS BUF ADDR ; 2ND WD IS # OF WDS IN THE BUF, + IF LAST BUFR ; R0 -> THE "PIT" AREA OF THE CTRL MODULE. ; BY THE WRITC FOR ALL CHANNELS. ;ON ENTRY R0 CONTAINS THE CHAN STATUS WD ; R1 CONTAINS THE CHAN # ;THE CHAN # IS USED AS AN O R0 -> LOC TO STORE REL BLK FOR THIS CHAN ; R5 = RT CHANNEL # ;THE CARRY WILL BE SET IF AN ERROR OCCURED ON THAT CHANNEL. ;R0FFSET INTO THE TBL CONTAINING ;THE BUF ADDR TO BE RELEASED. .ENABL LSB WRCOMP: ROR R0 ;BIT 0 SET AN HARDWARE ERROR BCC -R1 ARE DESTROYED, R2-R5 ARE PRESERVED. ;THE HARDWARE ERROR IS DETERMINED BY THE COMPLETION ROUTINE ;AND PLACED IN THE TPEROR 2$ MOVB #2,TPEROR(R1) ;ERR COND FOR CHAN 2$: ASL R1 ;BY 2 FOR WORD OFFSET MOV BUFADS(R1),R0 ;BUF ADDR TO RELEASE .IF DF BLKW MAXDP$*7. ;QUEUE ELEMENT AREA TPEROR: .REPT MAXDP$ ;TBL OF ERRORS. 1 FOR EACH RT11 CHAN. .BYTE 0 ;IF NON-ZERO A ERROR OCHICH IS NOT SUPPLIED BY DEC. ;LDP SOFTWARE DEVELOPMENT, JUNE 1975 ;MACRO CALLS, GLOBALS, CONDITIONAL ASSEMBLY PARACURED ON THAT CHAN .ENDR .EVEN BUFADS: .BLKW MAXDP$ ;TBL OF BUF ADDR TO BE RELEASED ;WHEN THE COMPLETION ROUTINE IS ENTMETERS .MCALL ..V2..,.REGDEF,.INTEN,.PROTECT,.SYNCH,.RSUM,.DEVICE,$ADDEF .MCALL $SOB,.GTJB ..V2.. .REGDEF $ADDEF ;EERED. .END XTERNAL GLOBALS .GLOBL SAVRG,RSTRG,SAVARG,RSTARG ;FROM GENS .GLOBL BAGET,BAREL ;FROM BUFFER ALLOCATOR .IF DF,MODE1$ .GLOBL BAGTM,BARLM .ENDC .GLOBL BASIZ,BBASIZ,BAWDS .GLOBL CTIDON,CTIBUF ;FROM CONTROL MODULE .IF DF,FG$ .GLOBL CTRUN .ENDC ;INTERNAL GLOBALS .GLOBL CSINIT,CSAMPL,CSEROR .IF DF,MODE2$ ! MODE3$ .IF DF,LPSDR$ ! DR11K$ .GLOBL CSIDIG .ENDC .GLOBL CSDATA .ENDC ;CONDITIONALS ; THE FOLLOWING PARAMETERS APPLY TO ALL MODES ;FG$ ;MUST BE DEFINED FOR A FOREGROU.TITLE CONSAM CONTINUOUS SAMPLING MODULE ;LAB-APPLICATIONS-11 ;DEC-11-SLABA-C-LA ;FILENAME CONSAM.MAC ;FILE ID CONSAM.8 .ND JOB ;LPSDR$ ;MUST BE DEFINED FOR DI/O FROM LPSDR ;DR11K$ ;MUST BE DEFINED FOR DI/O FROM DR11-K ;NOTE:ONLY ONE OF THE PREVCSECT CONSAM ;COPYRIGHT (C) 1975 ;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ;THIS SOFTWARE IS FURNISHED UNDER A LICIOUS TWO PARAMETERS MAY ; BE DEFINED AT ONE TIME OR AN ASSEMBLY ; ERROR WILL RESULT ;LPS11$ OR AR11$ ;MUST BE DEFENSE FOR USE ONLY ON A ;SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLUSION ;OF THE ABOVE COPYRIGHT NOTICE. THIS INED, AND SET EQUAL TO THE LARGEST NO. OF ; DATA PATHS TO BE EMPLOYED IN RUNS .IF DF,AR11$ MXINP$=AR11$ .SOFTWARE, OR ANY OTHER COPIES ;THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ;OTHER PERSON EXCEPT FOR USE ONIFF MXINP$=LPS11$ .ENDC .IF DF,LPSDR$ & DR11K$ ERROR=2DIOS .ENDC ; THE FOLLOWING PARAMETERS APPLY ONLY TO MODE 1( SUCH SYSTEM AND TO ONE WHO AGREES ;TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE SOFTWARE ;SHALL AT ALL TIMES REMAIN CSMODE=1) ;MODE1$ ;MUST BE DEFINED AND SET EQUAL TO ONE FOR ASSEMBLY ;OF ANY CODE FOR MODE 1 OPERATIONS ;DEFINING THE FOLE EMT 374 ;.CLOSE EMT RTS PC .ENDC .IF GT MAXDP$-16. ;FOR .CDFN IF >16. CHANL: .BLKW MAXDP$*5. ;NEED 5 WDS FOR EACH IN DEC. ;THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE ;WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A ;COMMITMENTCHAN CDFAR: 13.*400 ;CODE WD FOR .CDFN CHANL ;ADDR OF I/O CHAN LIST MAXDP$ ;# OF I/O CHAN TO CREATE .ENDC QAREA: . BY DIGITAL EQUIPMENT CORPORATION. ;DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ;ITS SOFTWARE ON EQUIPMENT WO SET UP INTERRUPT VECTORS CSINIT: JSR PC,SAVRG ;SAVE REGISTERS R1-R4 .IF DF,FG$ MOV #GTJBA,R0 ;SET UP FOR GTJB .GTJ BIT #MODE,R1 ;IS MODE ASSEMBLED? BNE 12$ ;IF IT IS, CONTINUE MOV #4,R0 ;IF NOT, INDICATE ERROR TYPE JMP EREXIT ; AND ELOWING PARAMETERS HAS AN EFFECT ONLY IF "MODE1$" IS ; DEFINED AND SET EQUAL TO ONE. ;AUTOG$ ;MUST BE DEFINED FOR AUTO-GAINING B MOV GTJBA,SYNCTL+2 ;PUT JOB # IN SYNC TABLE .ENDC MOV #DLIST,R0 .DEVICE ;SET UP DEVICE DISABLE LIST TST PRTFLG CODE IN MODE 1 ;DMA$ ;MUST BE DEFINED FOR ANY DMA OPERATIONS ;IF DMA$ IS DEFINED, ; DUAL$ ;MUST BE DEFINED FOR DMA DUAL ;ARE VECTOR LOCS. ALREADY PROTECTED BNE CSINTS ;IF SO, DON'T PROTECT AGAIN .IF DF,LPSDR$ ! DR11K$ MOV #PROTAR,R0 ;GET SAMPLE AND HOLD SAMPLING ; IF DUAL$ IS DEFINED, ; DSORT$ ;MUST BE DEFINED IF DATA ACQUIRED VIA DUAL DMA ; SAMPLINAREA FOR .PROTECT .PROTECT ,#DIVEC ;PROTECT DIO VECTOR ADDRESS BCC PROTAD ;GO PROTEC ADVEC MOV #2,R0 ;INDICATE DIVEC ALG IS TO BE SORTED BY CHANNEL INTO SEPERATE ; BUFFERS BEFORE PASSING TO C.M. ; IF DSORT$ IS DEFINED, ; INPLAC ;MUSTREADY PROTECTED JMP EREXIT ;GO EXIT .ENDC PROTAD: MOV #PROTAR,R0 ;GET AREA FOR .PROTECT .PROTECT ,#ADVEC ;PROTECT A/D BE DEFINED IF SORTING OF DATA ACQUIRED VIA ; DUAL DMA SAMPLING IS TO BE SORTED "IN PLACE". ; IF NOT DEFINED, SORTIN VECTOR ADDRESS BCC PROTCL ;GO PROTECT CLKVEC MOV #1,R0 ;INDICATE ADVEC ALREADY PROTECTED JMP EREXIT ;GO EXIT PROTCL: G IS QUICKER BUT REQUIRES ; AN ADDITIONAL BUFFER TO PERFORM THE SORT. ; WHEN DEFINED, SORTING TAKES PLACE IN THE MOV #PROTAR,R0 ;GET AREA FOR .PROTECT .PROTECT ,#CLKVEC ;PROTECT CLOCK VEC ADDR BCC DNPROT ;GO IND. PROTECTION DONE MOV # ; DOUBLE BUFFER WHICH IS ALREADY ALLOCATED. ;MODE2$ ;MUST BE DEFINED FOR ANY MODE 2 (CSMODE=2)CODE TO BE ASSEMBLED ;(M3,R0 ;IND. CLOCK VEC ALREADY PROTECTED JMP EREXIT ;GO EXIT DNPROT: INC PRTFLG ;VECTOR LOCATIONS HAVE BEEN PROTECTED MOV ULTI-CHANNEL,RATE AND CONTROL MODE) ;MODE3$ ;MUST BE DEFINED FOR ANY MODE 3(CSMODE=3) CODE TO BE ASSEMBLED ;(ROUND ROBIN MO#340,@#ADVEC+2 ;STORE PRIORITY OF 7 FOR A/D NO F/B MOV #340,@#CLKVEC+2 ;STORE PRIORITY OF 7 FOR CLK NO F/B .IF DF,LPSDR$ ! DDE) MODE=0 .IF DF,MODE1$ MODE=MODE+1 .ENDC .IF DF,MODE2$ MODE=MODE+2 .ENDC .IF DF,MODE3$ MODE=MODE+4 R11K$ MOV #340,@#DIVEC+2 ;STORE PRIOTRIY OF 7 FOR DIO NO F/B .ENDC ;R5 CONTAINS ADDRESS OF PARAMETER TABLE FOR INITIAL.ENDC .IF DF,LPSDR$ & DR11K$ 2DIOER=CONDITIONALASSEMBLYERROR ;ONLY ONE DI/O UNIT ALLOWED .ENDC .IF DF,AR11$ & LPS11IZATION .SBTTL BEGIN TO READ PARAMETER TABLE CSINTS: CLR @#ADSAD ;CLEAN SYSTEM TST @#ADBUF CLR @#CLKSAD .IF DF,LPS$ 2ACQER=CONDITIONALASSEMBLYERROR ;ONLY ONE ACQ UNIT ALLOWED .ENDC .IF DF,DMA$ ! AUTOG$ & AR11$ 0NOPER=CONDITIONALASSEDR$ ! DR11K$ CLR @#DIOSAD .ENDC MOVB (R5)+,R0 ;GET INTENDED MODE MOV #1,R1 ;GET FIRST MODE BIT .ENABLE LSB 1$: DECMBLYERROR ;OPTIONS NOT AVAILABLE ON AR11 .ENDC PS=177776 .SBTTL CONTINUOUS SAMPLING MODULE INITIALIZATION ;SECTION T R0 ;DECREMENT MODE COUNTER BEQ 11$ ;IF MODE BIT IN PLACE, BRANCH ASL R1 ;IF NOT, MOVE BIT BR 1$ ; AND TRY AGAIN 11$:E NEG. NUMBER MOV #INTABL,R0 ;GET CLOCK TICK COUNTER TABLE MOV R1,R2 ;GET SECOND COPY OF TAB LENGTH TST CFLAG ;TST FOR M11,CSMODE ;IS THIS MODE 1 OR 4 BNE 4$ ;IF SO, BRANCH 33$: MOV #BUFCNT,R0 ;GET FLAG MOV CSNOFC,R3 ;GET NO. OF CHANLS MOV ULTI RATE BNE 24$ ;IF MULTI RATE, B+C MOV (R5)+,R4 ;IF SINGLE, GET RATE 23$: TST CFLAG ;TST FOR MULTI RATE BNE 24$ ;IF(R0),R1 ;IS A TABLE PROVIDED? BMI 35$ ;IF YES, PROCESS 34$: MOV R1,(R0)+ ;STORE BUF. CNT FOR NEXT CHANNEL $SOB R3,34$ ;A MULTI RATE, B+C MOV R4,(R0) ;IF NOT, FILL IN NEXT TAVBLE ENTRY BR 25$ ;B+C 24$: MOV (R5)+,(R0) ;GET NEXT CLOCK CNT 25$:NY MORE CHANNELS,IF SO,B+C BR 4$ ;IF NOT, CONTINUE 35$: MOV (R5)+,(R0)+ ;STORE BUF CNT FOR NEXT CHANL $SOB R3,35$ ;ANY M NEG (R0) ;GET TWO'S COMPLIMENT CMP (R0)+,R3 ;TEST IF SMALLER THAN LAST SMALLEST CNT BLE 26$ ;IF NOT, B+C MOV -2(R0),R3 ORE CHANNELS,IF SO,B+C .ENDC .SBTTL THIS SECTION DETERMINES FIRST MAIN BRANCH ;IF DMA (MODE1 ONLY) A BRANCH OCCURS 4$:XIT 12$: MOV R1,CSMODE ;STORE MODE CODE MOVB (R5)+,CSNOFC ;GET AND STORE NO. OF CHANLS. CLRB CSNOFC+1 ;MAKE SURE NO.OF CHNL;IF SMALLER(ABSOLUTE VALUE) SAVE 26$: $SOB R1,23$ ;ANY MORE CHANNELS,IF SO, B+C MOV R3,@#CLKBUF ;SET CLK BUF/PRE TO SMALLESTS IS RIGHT CMP CSNOFC,#MXINP$ ;MAKE SURE ASSEMB. FOR THIS MANY CHANNELS BLE 15$ ;IF ENOUGH SPACE ALLOTTED, BRANCH MOV #5, CNT MOV #100001,R4 ;GET LARGE NEG. NUMBER MOV #SCHNTB,R1 ;GET ADDR OF TABLE OF NEXT CHNLS TO SAMPL CLR (R1)+ ;CLEAR CNT R0 ;OTHERWISE, GET ERROR CODE JMP EREXIT ;AND EXIT 15$: MOV (R5)+,R0 ;GET CLOCK FREQ. .IF DF,MODE2$ BIT #2,R1 ;TESTOF CHNLS TO SAMPLE,PT TO NEXT CLR R0 ;GET 1ST CHNLS GEN TAB OFFSET 27$: MOV INTABL(R0),CINTAB(R0) ;GET NEXT CNT SUB R3,CI IF MODE 2 BNE 2$ ;IF SO, B+C .ENDC ASL R0 ;OTHERWISE, POSITION FREQ ADD #400,R0 ;SET CLOCK MODE MOV R0,@#CLKSADNTAB(R0) ;SUBTRACT FIRST CNT TO GET CURR.CNT BNE 28$ ;IF NOT EQUAL ZERO, B+C MOV INTABL(R0),CINTAB(R0) ;IF EQUAL ZERO, SET ;PUT FREQ IN CLOCK STATUS WORD MOV (R5)+,R0 ;GET CLOCK TICKS NEG R0 ;GET TW0'S COMPLEMENT MOV R0,@#CLKBUF ;SET CLOCK COUEQUAL TO ORIG. CNT INC SCHNTB ;INCR. CNT OF CHNLS TO SAMP 1ST MOV R0,(R1)+ ;STORE NEXT OFFSET OF CHNL TO SAMP 28$: CMP CINNTER ;THIS SECTION SETS UP CLOCK TICKS FOR MULTIPLE ; CHANNELS SAMPLED AT MULTIPLE RATES ;(MODE2 ONLY) .IF DF,MODE2TAB(R0),R4 ;IS THIS VALUE LESS THAN CURR. SMALLEST BLE 29$ ;IF NOT, B+C MOV CINTAB(R0),R4 ;IF IT IS, RESET CUR. SMALLEST CN$ BR BUFRCK ;CONTINUE 2$: TST R0 ;IS ONLY ONE RATE SPECIFIED BMI 20$ ;IF NOT SO, B+C CLR CFLAG ;IND. ONE RATE BR 21T 29$: TST (R0)+ ;INC TABLE POINTER $SOB R2,27$ ;ARE THERE ANY MORE CHANNELS,IF SO, B+C MOV R4,NXCKCT ;IF NOT, SAVE NEXT $ ;GO SET CLOCK SW 20$: MOV #-1,CFLAG ;IND. MANY RATES NEG R0 ;GET CLOCK SW BITS 21$: ASL R0 ;ADJUST THE BITS ADD #500,CLOCK CNT MOV #SAMOD2,@#CLKVEC;SET CLOCK INT VECTOR .ENDC ;THIS SECTION TESTS FOR SAMPLING TO END ON A MAXIMUM ; NUMBR0 ;SET MODE AND INTERRUPT ENABLE MOV R0,@#CLKSAD ;SET CLOCK SW MOV CSNOFC,R1 ;GET NO. OF CHANLS MOV #100001,R3 ;GET LARGER OF OUTPUT BUFFERS FILLED BUFRCK: MOV (R5)+,BUFCNT ;GET BUFFER STOP COMMAND .IF DF,MODE2$ ! MODE3$ .ENABL LSB BIT # SWAB DMASW ;GET CHANL # IN CORRECT POSITION ADD #42,DMASW ;GET FUNCTION BITS MOV BASIZ,DMAWDC ;GET BUFFER SIZE NEG DMAWDZATION SECTION ;SET UP A/D CHANNEL-GAIN(OR POLARITY) TABLE DIGCHN: .IF DF,LPSDR$ ! DR11K$ DEC R1 ;DECREMENT A/D CHNL CNC ;GET NEG. WD CNT MOV #DMASAM,@#ADVEC ;SET A/D VECTOR FOR DMA SAMPLING MOV #BUF1,R0 ;GET FIRST BUFFER PINTER DEC R1 ;FIT SINCE D.I. .IFF MOV #10,R0 ;GET NO DIGITAL EROR NO. JMP EREXIT ;AND EXIT .ENDC ADONLY: MOV R1,CSNOFA ;SET # OF AND OUT IF DUAL SAMPLING ; .IF DF,DUAL$ BNE 45$ ;BRANCH IF DUAL SAMPLING .ENDC ; JSR PC,BAGET ;GET BUFFER #1 BCS 4/D CHANLS .ENABL LSB .IF DF,MODE1$ .IF DF,LPSDR$ ! DR11K$ BNE 59$ ; IF SOME A/D CHANNELS, B+C BIT #1,CSMODE ;IF MO4$ ;IF NO SPACE, GO IND. ERROR MOV #BUF2,R0 ;GET BUFFER #2 PONTER JSR PC,BAGET ;GET BUFFER #2 BCC 47$ ;GO BUFFER, SO BRADE 1 BEQ 59$ ;IF NOT MODE1, B+C JMP DIONLY ;BRANCH TO D/I ONLY .ENDC .ENDC 59$: MOV #ADSWTB,R3 ;GET ADDR OF A/D SWNCH 44$: JMP SPEXIT ;IND.ERROR AND EXIT IF NO ROOM ; .IF DF,DUAL$ 45$: MOV R1,R3 ;TEST TO SEE IF 2 CHANNELS SELECTED D TAB MOV CSNOFA,R2 ;GET CHANL CNT .IF DF,LPSDR$ ! DR11K$ BEQ CTAB2 ;IF DI ONLY , B+C .ENDC MOVB (R5)+,R1 ;GET CEC R3 BEQ 46$ ;IF TWO CHANNELS, B+C MOV #12,R0 ;OTHERWISE, INDICATE ERROR JMP EREXIT ; AND EXIT 46$: BIS #40000,DMASW HANLS & GAIN OR POLARITY BMI CTAB1 ;IF NEG., GO PROCESS A TABLE TABLOP: JSR PC,SETAB1 ;GO INSERT VALUES IN BOTH ABOVE TABS ;INDICATE DUAL SAMPLING ASL DMAWDC ;GET DOUBLE WD CNT INC R1 ;GET INDICATOR OF BUFFERS NEEDED JSR PC,BAGTM ;GET 2 CONTIG INC R1 ;UPDATE CHANL # $SOB R2,TABLOP ;ANY MORE CHANLS?,IF MORE, B&C BR CTAB2 ;IF NOT, B&C SETAB1: BIC #177600,R1 ;GET C MOV CSNOFC,R1 ;GET NUMBER OF CHANLS MOVB (R5)+,R0 ;GET CHANNEL TYPE MOV R0,CSTYPE ;SAVE TYPE BNE 48$ ;BRANCH IF NOT ALLUOUS BUFFERS BCS 44$ ;IF NOROOM GO IND. ERROR MOV #BUF2,R0 ;GET SECOND POINTER FOR BUFFERS JSR PC,BAGTM ;GET 2 MORE CONTI NORMAL A/D CHANLS JMP ADONLY 48$: BPL 49$ ;BRANCH IF NOT A DIGITAL CHANL JMP DIGCHN 49$: .IF DF,DMA$ BIT #1,CSMODE GUOUS BUFFERS BCS 44$ ;IF NO ROOM, GO IND. ERROR .IF DF,DSORT$ .IF NDF,INPLAC MOV #BUF3,R0 ;GET ADDR. OF DUMMY BUF;IS IT MODE 1 BEQ 41$ ;IF NOT, GO INDICATE ERROR TST R0 ;TEST CHANL TYPE AGAIN BLE 41$ ;BRANCH IF DMA CHANLS NOT REQ. R NEEDED JSR PC,BAGTM ;GET 2 MORE CONTIGUOUS BUFFERS BCS 44$ ;IF NO ROOM, GO IND. ERROR .ENDC .ENDC .ENDC 47$ JMP DMAINT .ENDC 41$: MOV #6,R0 ;INDICATE TYPE ERROR JMP EREXIT ; AND EXIT .IF DF,MODE1$ .IF DF,DMA$ : MOV R1,DMAFLG ;SET DMA FLAG BIC #170000,DMAWDC ;SET WD CNT MOV #6,@#ADSAD ;POINTER TO DMA ADDR REG MOV BUF1,@#DMAREG ;SE .SBTTL SECTION IS UNIQUE TO DMA INITIALIZATION DMAINT: CLR DMASW ;CLEAR A/D SW AREA MOVB (R5)+,DMASW ;GET CHANNEL NO. T DMA DDDR REG MOV #4,@#ADSAD ;POINT TO DMA WDC REG MOV DMAWDC,@#DMAREG ;SET DMA WDC REG MOV DMASW,@#ADSAD ;SET A/D SW FOR BGE 43$ ;IF NON-NEGATIVE BRANCH MOVB (R5)+,DMASW ; OTHERWISE, CHANNEL NO. IS NEXT TSTB (R5)+ ;GET ON WORD BOUNDERY 43$: DMA MOV #10000,@#DMAREG ;ENABLE DMA TRANSFER JMP MD1F ;PROCESS NEXT PARAMETER .ENDC .ENDC .SBTTL NON-DMA INITIALID GAIN OR POLITY JSR PC,SETAB1 ;INSERT VALUES IN TABLES $SOB R2,CTAB1 ;ANY MORE CHANLS,IF SO, B&C CTAB2: .IF DF,LPSDR$ ! C JMP SPEXIT ;IF NOT, GO IND. ERROR MD1D: MOV #BUF2,R0 ;GET POINTER FOR BACK-UP BUFFERS JSR PC,BAGTM ;GET NEEDED PPACE FORDR11K$ .IF DF,MODE2$ ! MODE3$ TST CSTYPE ;TEST FOR DIGITAL INPUT BPL CTAB3 ;IF NONE, B+C .IF DF,MODE1$ BIT #1,CS CONTIGUOUS BUFRS BCC MD1E ;IF SPACE OBTAINED, B&C JMP SPEXIT ;IF NOT, GO IND. ERROR MD1E: DEC R1 ;CK FOR SINGLE CHANL MMODE ;TEST IF MODE 1 BNE CTAB3 ;IF SO, FORGET FAKING STATUS WORD .ENDC MOV #200,(R3) ;STORE FAKE A/D SW .ENDC .ODE BNE MD1F ;IF NOT, B+C .IF DF,AUTOG$ CMP #MD1AUT,@#CLKVEC;TEST FOR AUTO-GAINING BEQ MD1F ;IF SO, B+C .ENDC ENDC CTAB3: .IF DF,MODE1$ .SBTTL SECTION IS UNIQUE TO MODE 1 INITIALIZATION .IF DF,MODE2$ ! MODE3$ BIT #1,CSMODE MOV #MD1SNG,@#ADVEC ;STORE A/D INT VECTOR MOV #100,R1 ;GET INTRP ENABLE BIT BIC R1,@#CLKSAD ;DISABLE CLK INTERRUPT BIS R1;IS THIS MODE 1 BNE MD1 ;IF SO, B+C JMP MD2OR3 ;IF NOT, B&C .ENDC MD1: MOV #MD1ACQ,@#CLKVEC;GET ADDRESS FOR SAMPLING ,@#ADSAD ;ENABLE A/D INTERRUPT FOR SINGLE A/D CHNL BIS R1,ADSWTB ;SET INTRP. BIT IN S/W TABLE MD1F: MOV #SMODE1,CSAMPA ;STORE BIS #100,@#CLKSAD ;ENABLE CLK INTERRUPT MD1AGR: MOV #ADSWTB,R2 ;GET A/D SW TAB ADDR MOV (R2),R3 ;GET AND SAVE FIRST A/D SW POINTER TO START/STOP ACQ. CLR CSTOP ;CLEAR ACQ STOP FLAG DEC BUFCNT ;GET BUFR CNT READY FOR SAMPLING BNE MDD1 ;IF NOT BPL MD1A ;BRANCH IF NO AUTO-GAIN .IF DF,AUTOG$ MOV #MD1AUT,@#CLKVEC;OTHERWISE, SET AUTO-GAIN INT. VECTOR MOV CSNOFA, ZERO, B+C INC CSTOP ;IF ZERO, STOP AFTER ONE FULL BUFFER MDD1: CLR CSERRF ;CLEAR TOO FAST FLAG CLR CSDONF ;CLEAR ACQ DOR1 ;GET NO. OF A/D CHANNELS MD1AA: BIC #170000,(R2)+ ;MAKE SURE NO GAIN IS SPECIFIED $SOB R1,MD1AA ;B+C TILL DONE BR MD1AGRNE FLAG CLR FASTER ;CLEAR SPEEDY ERROR FLAG CLR CHANCE ;DON'T GIVE A SECOND CHANCE CLR BUFPAS ;CLR FLG TO ALLOW ACQ TO ;GET A/D SW TAB ADDR .ENDC MD1A: MOV CSNOFA,R1 ;GET # OF A/D CHANLS ADD #40,R3 ;SET A/D SW FUNC. BITS FOR 1ST CHANL PASS A BUFR BIT #1,R5 ;GET ON WORD BOUNDARY BEQ MDD2 INC R5 MDD2: .IF DF,LPSDR$ ! DR11K$ MOV (R5)+,OUTDOP ;SHALL WBR MD1C ;GO CHECK FOR MORE CHANNELS MD1B: MOV +2(R2),(R2) ;PUSH STACK DOWN INC (R2)+ ;SET FUNC. BITS IN NEXT CHNL'S A/D SW E OUTPUT BEQ MD1G ;IF NOT, B&C MOV (R5)+,SDOMSK ;GET START MASK FOR D/O MOV (R5)+,HDOMSK ;GET STOP MASK FOR D/O .ENDC HANNEL NO. BIT #100,R1 ;IS THIS AN AUTO-GAIN BEQ SETB1 ;IF NOT, B+C .IF DF,AUTOG$ ADD #100,R1 ;IF SO, MOVE BIT TO S MD1C: $SOB R1,MD1B ;CK FOR MORE CHANLS,IF MORE, B&C MOV R3,(R2)+ ;STORE FIRST A/D SW MOV #-1,(R2) ;INDICATE END OF TABLE IGN POSITION .ENDC .IF NDF,AUTOG$ MOV #7,R0 ;IND. ERROR - NO AUTOGAIN ASSEMBLED JMP EREXIT ; AND EXIT .ENDC SET MOV R3,@#ADSAD ;SET FIRST A/D SW MOV BASIZ,OUTPTR ;SET BUFR ENTRY CNTR MOV CSNOFC,R1 ;IF NOT, GET # OF DATA CHANLS MOV #BB1: MOV R1,(R3) ;SAVE A/D STATUS SWAB (R3)+ ;STORE A/D SW BITS RTS PC ;RETURN CTAB1: MOVB (R5)+,R1 ;GET NEXT CHANL # ANUF1,R0 ;GET POINTER ADDRESS FOR 1ST BUFFERS JSR PC,BAGTM ;GET NEEDED CONTIGUOUS BUFR SPACE BCC MD1D ;IF SPACE AVAILABLE, B& MD1G: TST (R5)+ ;CHECK START/STOP FLAG BMI MD1H ;IF ST1, B+C BNE MDII ;IF DIGITAL, B+C JMP CSEXIT ;IF PROGRAMMED STD ;SET INTRP ENABLE FOR ST1 JMP CSEXIT ;EXIT .ENDC .IF DF, MODE1$ .IF DF,LPSDR$ ! DR11K$ .SBTTL SECTION UNIART,RETURN MDII: .IF NDF,LPSDR$ & DR11K$ MOV #10,R0 ;INDICATE NO DIGITAL INPUT JMP EREXIT ;AND EXIT .ENDC .IF DFQUE TO INITIALIZING MODE1 ONE DIGITAL CHANNEL DIONLY: BIS #100,@#CLKSAD ;ENABL CLOCK INTERRUPT MOV #BUF1,R0 ;GET POINTER ,LPSDR$ ! DR11K$ TST CSTYPE ;TEST IF A DIGITAL INPUT CHNL EXITS BMI TWODI ;IF SO , INDICATE ERROR MOV #DISTRT,@#DIVEC ;SFOR FIRST BUFFER JSR PC,BAGET ;GET SPACE BCC DONLY1 ;IF SPACE OBTAINED, B&C JMP SPEXIT ;IF NOT, GO IND. ERROR DONLY1: MET UP DIGITAL INPUT INTRPT. VECTOR MOV (R5)+,SDIMSK ;IF NOT, GET START MASK FOR D/I MOV (R5),HDIMSK ;GET STOP MASK FOR D/I OV #BUF2,R0 ;GET POINTER FOR BUFFER 2 JSR PC,BAGET ;GET SPACE FOR BUFFER 2 BCC DONLY2 ;IF SPACE OBTAINED, B&C JMP SPEXIT MOV #100,@#DIOSAD ;ENABLE DIO JMP CSEXIT ; AND RETURN TWODI: MOV #11,R0 ;INDICATE ERROR JMP EREXIT .ENDC MD1H: MOV ;IF NOT, GO IND. ERROR DONLY2: MOV #DISAMP,@#CLKVEC;SET UP CLK VECTOR TO SAMPL D/I JMP MD1F ;CK FOR START UP .ENDC .E @#CLKSAD,R0 SUB #14,R0 ;CHECK FOR CLK CNTING ST1'S BIT #14,R0 .ENABL LSB BNE 1$ ;IF OK, B+C MOV #13,R0 ;IF NOT, INDC .IF DF,MODE2$ ! MODE3$ .SBTTL SECTION OF INITIALIZATION UNIQUE TO MODES 2 AND 3 MD2OR3: .ENABL LSB MOV #CSEROR+ND. ERROR TYPE JMP EREXIT ;AND RETURN 1$: .IF DF,DMA$ ! LPSDR$ ! DR11K$ TST CSTYPE ;CHECK FOR ADDT PERIPHERAL HANDLING 1,R1 ;GET ERROR TABLE MOV CSNOFC,R2 ;GET NO. OF ENTRIES BIT #1,R5 ;GET ON WORD BOUNDARY BEQ 1$ INC R5 1$: CLRB (R1)+ BEQ 4$ ;IF ONLY ORDINARY A/D, B+C .ENDC .IF DF,LPSDR$ ! DR11K$ BMI 42$ ;IF A DIGITAL CHANNEL IS NEEDED, B+C .ENDC .I;CLR ENTRIES $SOB R2,1$ ;LOOP CLR RNGCNT ;CLEAR CNT MOV #RNGBEG,RNGIN ;SET UP PTRS INTO RING BUFR FOR BUFRS MOV #RNGBEF DF,DMA$ BR 2$ ;OTHERWISE, DMA SO BRANCH .ENDC .IF DF,LPSDR$ ! DR11K$ 42$: CMP #1,CSNOFC ;CHECK FOR SINGLE DIGITAL CHANG,RNGOUT ; TO BE PASSED TO THE CONTROL MODULE MOV #RNGBEG,RNGEND MOV CSNOFC,R1 ASL R1 ASL R1 ASL R1 ADD R1,RNGEND ;NEL BNE 4$ ;IF NOT, BRANCH MOV #DISTSM,NEXCVA ;SET INTRP VEC FOR DIG ONLY START BR 3$ .ENDC 4$: .IF DF,AUTOG$ CMP #MGET END OF RING BUFFER ADDRESS MOV CSNOFC,R4 ;GET NO.OF CHANLS MOV #BUF2,R2 ;GET ADDR OF BUF2 PTRS MOV #BUF1,R1 ;GET ADDR D1AUT,@#CLKVEC ;WAS AUTOGAINING SPECIFIED BNE 5$ ;IF NOT BRANCH MOV #MD1STA,NEXCVA ;SET INTRP VEC FOR AUTO-G BR 3$ .ENDOF TABLE OF BUF1 PTRS MOV #OUTPTR,R3 ;GET ADDR OF TABLE OF BUFR 1 ENTRY CNTRS 2$: MOV R1,R0 ;GET ADDR. OF BUFR 1 PTR FOR NEXC 5$: CMP #1,CSNOFC ;CHECK FOR SINGLE A/D CHANNEL METHOD BEQ 2$ ;IF SO , BRANCH MOV #MD1STN,NEXCVA ;SET INTRP VEC FOR MULTT CHANL JSR PC,BAGET ;GET BUFFER BCC 3$ ;IF NO ROOM, GO IND ERROR BY B&C JMP SPEXIT ;GO IND ERROR 3$: MOV BASIZ,(R3)+ ;I A/D CHAN BR 3$ 2$: MOV #ST1END,NEXCVA ;SET INTP VECTOR 3$: MOV #ST1INT,@#CLKVEC ;SET INTERUPT VECTOR BIS #40000,@#CLKSASTORE ADDR. FOR OUTPUT POINTER 4$: MOV (R1)+,(R2)+ ;INCREMENT ALL THE BUFFER POINTER POINTERS $SOB R4,2$ ;ANY MORE CHANLS,IFMK ;GET MASK TO STOP ACQUISTION ENTIRELY .ENDC .IF DF,MODE3$ BIT #4,CSMODE ;IS THIS MODE 3 BNE MODE3A ;IF SO , GO PRERROR MOV CSNOFC,R2 ;GET # OF CHNLS(DIG. IS LAST ONE) .ENDC 1$: DEC R2 ;GET IN ROUND ROBIN TAB. ENTRY FORM BR 5$ ;GO OCESS MORE PARAMETERS .ENDC .IF DF,MODE2$ TST (R5) ;TEST FOR DIGITAL START BEQ MD2A ;IF ZERO, PROGRAMMED START, B+CENTER IN TABLE 2$: MOV #ADSWTB+1,R3 ;GET A/D SW TAB(ALSO CONTAINS CHNL #'S) MOV CSNOFA,R4 ;GET # OF A/D CHANLS BEQ 4$ ;IF .IF NDF,LPSDR$ & DR11K$ MOV #10,R0 ;IF NOT AVAILABLE, IND ERROR JMP EREXIT .ENDC .IF DF,LPSDR$ ! DR11K$ TST NONE, ERROR .IF DF,AUTOG$ BIT #100,R1 ;CHECK FOR AUTOGAINNING CHANNEL BEQ 3$ ;IF NOT ONE, BRANCH ADD #100,R1 ;OTHER YES, B&C MOV #SAMP23,CSAMPA ;STORE START/STOP ADDRESS CLR CSDONF ;CLEAR MORE FLAGS CLR CSDATA CLR BUFPAS CLR CSCHDN CSTYPE ;CHECK FOR DIGITAL CHANNEL BEQ MD2B ;IF NONE SPECIFIED , CONTINUE MOV #11,R0 ;OTHERWISE, A CONFLICT JMP EREXIT MOV #-1,SAMFLG ;SET FIRST FLAG .IF DF,LPSDR$ ! DR11K$ MOV (R5)+,OUTDOP ;WILL THERE BE DIGITAL OUTPUT BEQ MD23AI ;IF MD2B: MOV #DIMD23,@#DIVEC MOV #100,@#DIOSAD ;IF NOT, DI START. ENABLE INT. .ENDC MD2A: INC @#CLKSAD ;START CLOCK MOV NNOT, B&C MOV CSNOFC,R1 ;GET # OF CHANNELS MOV #HDOMSK,R0 ;STORE PTR FOR STOP OUTP MASK TABL MOV R1,R2 ;GET SECOND COPY OFXCKCT,@#CLKBUF ;SET NEXT CLOCK BUF/PRE JMP CSEXIT ;RETURN .ENDC .IF DF,MODE3$ .SBTTL SECTION OF INITIALIZATION UNIQU CHNLS CNT FOR SUB MOV #SDOMSK,R4 ;GET ADDR OF STRT TABL JSR PC,SETAB2 ;FILL MASK TABLES .ENDC MD23AI: MOV CSNOFC,R1E TO MODE 3 MODE3A: MOV (R5)+,R0 ;GET COUNT OF SAMPLING TABLE MOV R0,CSCHDN ;SAVE COUNT ASR R0 ;ONE BYTE PER TABLE ENTR ;GET NO. OF CHANLS MOV #HDIMSK,R0 ;STORE ADDR. FOE STOP INPUT MASKS MOV #SDIMSK,R4 ;GET ADDRESS OF START INPUT MASKS MOV Y INC R0 JSR PC,BAWDS ;GET SPACE FOR SAMPLING TABLE BCC MODE3B ;IF SPACE OBTAINED, B+C JMP SPEXIT ;IF NOT, IND. ERROR R1,R2 ;GET A SECOND COPY OF # OF CHANLS JSR PC,SETAB2 ;FILL MASK TABLES BR MD23HI SETAB2: MOV (R5)+,R3 ;CHECK TO SEE IF AND EXIT MODE3B: MOV R0,RRTBEG ;STORE ADDR OF ROUND ROBIN TABLE MOV R0,RRTEND ;SET UP END AND MOV R0,CRRPTR ; CURRENT PTR TALL START MSKS SAME BEQ MD23DI ;IF NOT, B&C MD23CI: MOV R3,(R4)+ ;STORE MASK IN TABLE # OF CHNL TIMES $SOB R1,MD23CI BR O ROUND ROBIN TABLE ADD CSCHDN,RRTEND MODE3C: CLR R2 ;PREPARE TABLE OFFSET COUNTER .ENABL LSB MOVB (R5)+,R1 ;GET NEXT ROMD23EI MD23DI: MOV (R5)+,(R4)+ ;STORE EACH MASK IN TABLE $SOB R1,MD23DI MD23EI: MOV (R5)+,R3 ;TEST TO SEE IF ALL THE SAME STUND ROBIN TABLE ENTRY BPL 2$ ;IF AN A/D CHANNEL, BRANCH INC R1 ;CHECK FOR A DELAY BEQ 1$ ;IF A DELAY, BRANCH .IF NDOP MASKS BEQ MD23GI ;IF NOT, B&C MD23FI: MOV R3,(R0)+ ;STORE STOP MASK IN TABL # OF CHNL TIMES $SOB R2,MD23FI RTS PC ;RF,LPSDR$ & DR11K$ BR 4$ ;ILLEGAL ENTRY, GO INDICATE .ENDC .IF DF,LPSDR$ ! DR11K$ TST CSTYPE ;CHECK FOR A DIG. ACQ. CETURN MD23GI: MOV (R5)+,(R0)+ ;STORE EACH STOP INPUT MASK IN TABLE $SOB R2,MD23GI RTS PC ;RETURN MD23HI: MOV (R5)+,STOPHNL SPECIFIED BEQ 4$ ;IF NONE SPECIFIED, ENTRY ERROR INC R1 ;OTHERWISE CHECK IF TRUE ENTRY BNE 4$ ;IF NOT, GO INDICATE RROR TO INDICATE BR EREXIT 6$: MOV #DIMD23,@#DIVEC ADD #100,@#DIOSAD ;ENABLE DI INT .ENDC MODE3H: ADD #101,@#CLKSAD ;E JUST RETURNS. IF IT DOES MATCH, THE CLOCK IS ;ENABLED, AND ALL FURTHER DIGITAL INPUT INTERRUPTS ARE ;DIRECTED TO "DISTOPSTART CLOCK JMP CSEXIT .ENDC SPEXIT: CLR R0 ;INDICATE NOROOM ERROR EREXIT: SEC ;SET CARRY, INDICA" DISTRT: MOV @#DIBUF,CSIDIG ;GET THE D.I AND PUT IN GLOBAL MOV CSIDIG,@#DIBUF ;CLEAR D.I. REG BIS #100,@#DIOSAD ;RE-ENABTE ERROR BR CEXIT ;EXIT CSEXIT: CLRB CSEROR ;CLEAR FATAL ERROR INDICATOR CLR R0 ;INDICATE NO ERRORS CLC ;CLEAR CARRYLE DI INTERRUPT BIT SDIMSK,CSIDIG ;TEST FOR START BITS BEQ DISTRR ;IF NO MATCH, JUST RETURN JSR PC,SMODE1 ;GO ENABLE OR D, INDICATE NO ERROR CEXIT: JSR PC,RSTRG ;RESTORE REGISTERS 1-4 RTS PC .SBTTL ACQUISITION SECTIONS CSAMPL: JSR PC,@CISABLE CLOCK MOV #DISTOP,@#DIVEC ;SET VECTOR TO CHECK FOR HALT DISTRR: RTI ;RETURN ;DIGITAL INPUT STOP ROUTINE ; AFTESAMPA ;GO TO APPRO ROUTINE RTS PC .SBTTL START UP ROUTINE FOR MODE 1 .IF DF,MODE1$ SMODE1: MOV #HMODE1,CSAMPA R ACQUISITION HAS STARTED, ALL DIGITAL INTERRUPTS ARE ;HANDLED BY "DISTOP" IF "ATSTRT" IN THE INITIALIZATION ;PARAMETER TAB;CHAMGE POINTER TO STOP TEST .IF DF,LPSDR$ ! DR11K$ TST OUTDOP ;IS D/O REQUIRED ON START BEQ SMD1B ;IF NOT, B+C MOVLE WAS POSITIVE. IF THE DIGITAL INPUT RECEIVED ;MATCHES THE DIGITAL INPUT STOP BIT MASK, THE CLOCK IS DISABLED ;BUFFERS ARE WISE, GET IN PROPER FORM FOR SEARCH .ENDC 3$: CMPB (R3)+,R1 ;TEST FOR A MATCHING CHANNEL NO. BEQ 5$ ;IF A MATCH IS FOUND SDOMSK,@#DOBUF ;IF SO, OUTPUT DIGITALLY .ENDC SMD1B: INC @#CLKSAD ;START CLOCK RTS PC HMODE1: .IF DF,LPSDR$ ! DR11K, GO ENTRY IN RR TAB TSTB (R3)+ ;OTHERWISE, INC. A/D SW TABLE POINTER INC R2 ;INC OFFSET COUNTER $SOB R4,3$ ;CHECK FOR $ TST OUTDOP ;IS D/0 REQUIRED ON HALT BEQ HMD1C ;IF NOT, B+C MOV HDOMSK,@#DOBUF ;IF SO, OUTPUT DIGITALLY .ENDC HMDMORE POSSIBILITIES TO CHECK 4$: MOV #14,R0 ;SEARCH FAILED BECAUSE OF ILLEGAL ENTRY BR EREXIT ;GO IND. ERROR 5$: MOVB R2,(R1C: INC CSTOP ;INDICATE TO HALT ACQ AFTER NEXT BUFR RTS PC .SBTTL SECTION FOR ST1(OR EXT INP) INTRPT START ST1INT: 0)+ ;ENTER OFSET IN ROUND ROBIN TABLE DEC CSCHDN ;ANY MORE R.R. TABLE ENTRIES BNE MODE3C ;IF SO, BRANCH AND CONTINUE,OTHERJSR PC,SMODE1 ;START ACQ BIC #100000,@#CLKSAD ;CLEAR ST1 FLG MOV NEXCVA,@#CLKVEC ;REDIRECT CLK INT VEC RTI ST1END: JSWISE MOV #SAMOD3,@#CLKVEC;STORE CLKVEC ADDRESS BIT #1,R5 ;GET ON WORD BOUNDARY BEQ 55$ INC R5 55$: TST (R5) BEQ MODER PC,HMODE1 ;STOP ACQ BIC #140000,@#CLKSAD ;CLR ST1 FLG AND ST1 INT ENABLE ST1NOP: RTI .IF DF,LPSDR$ ! DR11K$ .SBTT3H ;IF NOT A DIGITAL START, B+C .IF NDF,LSPDR$ ! DR11K$ MOV #10,R0 ;INDICATE NO DIG. ASSM. BR EREXIT .ENDC .IFL DIGITAL INPUT INTERRUPT ROUTINES ;DIGITAL START ROUTINE ; WHEN A DIGITAL INTERRUPT IS RECEIVED AFTER INITIALIZATION ; DF,LPSDR$ ! DR11K$ TST CSTYPE ;CHECK FOR DIG. ACQ. CHANNEL BEQ 6$ ;IF NONE, CONTINUE MOV #11,R0 ;OTHERWISE, CONFLICT ETHIS ROUTINE CHECKS TO SEE IF THE INPUT CONTAINS THE BITS ;WHICH MATCH THE DIGITAL INPUT START BIT MASK. IF NOT, ;THE ROUTIN .SBTTL SINGLE RATE,CONTROL. MULTI-CHANNEL MD1STN: TST @#CLKSAD ;TEST FOR ST1 PULSE BPL MD1ACQ ;IF NOT, B+C JMP ST1ENC CHANCE ;INDICATE SLOWED DOWN, SO GIVE ONE CHANC INC CSTOP ;IND. TO STOP IF TRYING TO PASS BUFRS .INTEN 5 ;CHANGE PRIORND ;IF SO, GO STOP MD1ACQ: BIC #200,@#CLKSAD ;CLEAR DONE BIT TST @#ADSAD ;CHECK FOR ERROR BPL MD1A2 ;IF NONE, CONTINUE ITY LEVEL TO 5 BR 6$ 5$: JSR PC,KILLM1 ;IF SO, SHUT DOWN SYSTEM TST BUFPAS ;WAS THE MODULE PASSING A BUFFER BNE 55$ ;IF DEC CHANCE ;IS THIS THE FIRST BAD POINT BMI M3 ;IF NOT, STOP ACQ MD1A2: MOV R2,-(SP) ;SAVE REGS 2-4 MOV R3,-(SP) MOV R SO, B+C .INTEN 5 ;LOWER PRIORITY MOV BUF1,BUFPAS ;GET OFFSETTED BUFFER PTR INC CSDONF ;IND. LAST BUFFER BR 7$ 55$:4,-(SP) MOV BBASIZ,R2 ;GET # OF BUFFER BYTES MOV BUF1,R3 ;GET CUR. PTR. INTO OUTPUT BUFR MOV #ADSWTB,R4 ;GET A/D SW TABLE SUB BBASIZ,BUF1 ;RESET BUFFER POINTER INC CSERRF ;INDICATE ACQ STOPPED ABNORMALLY RTI ; AND RETURN 6$: TST BUFCNT ;SHO BR MD1LOP MD1NXT: ADD R2,R3 ;POINT INTO NEXT BUFFER MD1LOP: TSTB @#ADSAD ;CK FOR CONVERSION COMPLETE BPL MD1LOP ;IF NOULD BUFR CNT BE TESTED BMI 7$ ;IF NOT, B+C DEC BUFCNT ;IF IT SHOULD, TEST TO STOP ACQ ON BUFCNT BNE 7$ ;IF NOT, B+C IT, B+C MOV (R4)+,@#ADSAD ;START NEXT CHANNEL MOV @#ADBUF,(R3) ;STORE DATA TST (R4) ;TEST FOR END OF TABLE BPL MD1NXT ;NC CSTOP ;SET ACQ FINISHED FLG FOR THIS MODULE 7$: MOV R2,-(SP) ;SAVE REGISTERS 0-2 MOV R1,-(SP) ;.INTEN SAVES REG 4-5 MOVIF MORE CHANNELS, B+C .ENABL LSB MD1DIG: .IF DF,LPSDR$ ! DR11K$ TST CSTYPE ;TEST FOR DIGITAL INPUT BPL 1$ ;IF NONE, B R0,-(SP) MOV BUFPAS,R1 ;GET OFFSETTED BUFFER PTR MOV BBASIZ,R5 ;GET BUFFER SIZE SUB R5,R1 ;RESET BUFR PTR MD1MPS: MOV B+C ADD R2,R3 ;POINT TO NEXT BUFFER MOV @#DIBUF,(R3) ;GET DIGITAL VALUE AND STORE MOV (R3),@#DIBUF ;CLEAR DIGITAL VALUE INASIZ,R2 ;GET BUFR SIZE IN WORDS MD1CON: MOV CSNOFC,R4 ;GET TOTAL # OF BUFRS TO PASS .ENABL LSB CLR R0 ;SET FIRST DPID TS BUFR .ENDC 1$: ADD #2,BUF1 ;POINT FO NEXT ENTRY IN BUFFER MOV (SP)+,R4 ;RESTORE REGS 2-4 MOV (SP)+,R3 MOV (SP)+,R2 T CSDONF ;TEST FOR ACQ STOPPED BNE 1$ ;IF SO, LEAVE LBI POSITIVE NEG R2 ;OTHERWISE NEGATE IT 1$: JSR PC,CTIBUF ;PASS BUFPASSED, AND, IF A FOREGROUND JOB, FOREGROUND ;MAINSTREAM PROCESSING IS RESUMED. ALL FURTHER DIGITAL INPUT ;INTERUPTS ARE IG DEC OUTPTR ;HAVE THE BUFFERS BEEN FILLED BEQ M4 ;IF SO, B+C BIT #200,@#CLKSAD ;ARE WE SAMPLING TOO FAST BNE 2$ ;IF SONORED BY THIS ROUTINE DISTOP: MOV @#DIBUF,CSIDIG ;GET THE D.I. AND PUT IN GLOBAL MOV CSIDIG,@#DIBUF ;CLEAR D.I. REG BIS #, B+C RTI ;IF NOT, RETURN 2$: DEC CHANCE ;SHALL WE GIVE IT ANOTHER CHANCE BMI M3 ;NO RTI M3: JSR PC,TOFAST ;GO STOP 100,@#DIOSAD ;RE-ENABLE DI INTERRUPT BIT HDIMSK,CSIDIG ;TEST FOR STOP BITS BEQ DISTPR ;IF NO MATCH, JUST RETURN JSR PC,HMTHINGS MOV BBASIZ,R5 ;GET BYTE BUFFER COUNT BR MD1CON ;GO PASS BUFFER M4: TST CSTOP ;SHOULD ACQ STOP BNE 5$ ;IF NOT, BODE1 ;GO STOP PROCESS CLR HDIMSK ;SET MASK TO IGNORE ALL INPUT DISTPR: RTI ;RETURN .ENDC .ENDC .IF DF,MODE1$ +C MOV BUF1,BUFPAS ;GET OFFSETTED BUFR PTR MOV BUF2,BUF1 ;SET UP NEXT BUFR PTR MOV BASIZ,OUTPTR ;RESET BUFR ENTRY CNTR I1NST: MOV #BUF2,R0 ;GET POINTER FOR BACKUP BUFRS MOV CSNOFC,R1 ;GET NO. OF CONTIGU BUFRS TST CSDONF ;TEST FOR ACQ STOPPED OWER PRIORITY CLR CHANCE ;SHOULD HAVE USED CHANCE BY NOW TST CSDONF ;IS ACQ DONE BEQ 7$ ;IF NOT, B+C DEC CTIDON ;IF BNE 3$ ;IF SO, B+C JSR PC,BAGTM ;IF NOT, GET MORE BUFFERS BCC 4$ ;IF SPACE OBTAINED, B+C 2$: INC CSTOP ;INDICATE ACQ SIT IS, TELL THE CONTROL MODULE CLR CSDONF ;DON'T DEC CTIDON AGAIN 7$: RTS PC ;RETURN VIA INTEN,SYNCH,RSUM .IF DF,FG$ STOPPED CLR BUF2 ;PUT DUMMY VALUE FOR BUFR BR 4$ ;CONTINUE 3$: MOV (R0),R0 ;GET ADDRESS OF BUFFERS JSR PC,BARLM ;RELEASYNER1: JMP KILLM1 ;STOP ACQ INCB CSEROR ;RECORD ERROR .ENABL LSB TST CSDONF ;TEST FOR ACQ STOPPED BEQ 1$ ;IF NOT, BRE BACKUP BUFFERS 4$: MOV (SP)+,R0 ;RESTORE REGS 0-2 MOV (SP)+,R1 ;.SYNC WILL RESTORE 4-5 MOV (SP)+,R2 .IF DF,FG$ TSTANCH DEC CTIDON ;OTHERWISE, TELL C.M. WE'RE DONE RTS PC 1$: TST CSERRF ;CHECK FOR ADDIT. BUFFER WAITING BNE MD1MEC ;I CTRUN ;DO WE NEED A SYNCH BNE 45$ ;IF NOT, BRANCH .SYNCH #SYNCTL BR SYNER1 INC CTRUN ;INDICATE SYNC .RSUM .ENDC F SO, BRANCH INC CSERRF ;OTHERWISE, MIMIC GOING TOO FAST TO INC FASTER ; PASS A LAST PARTIAL BUFFER JSR PC,NOTFUL ;RESET 45$: BIS #340,@#PS ;;RAISE PRIORITY WHILE CHECKING FOR ERS MD1MEC: TST CSERRF ;;TEST FOR GOING TOO FAST .ENABL LSB BLE BUF1 AND WORD COUNT BR MD1MEC ;GO PASS BUFFERS .ENDC NOTFUL: MOV R2,-(SP) ;SAVE R2 MOV BASIZ,R2 ;GET BU;FFER SIZE S6$ ;;IF ALRIGHT , B+C INCB CSEROR ;RECORD ERROR COUNT CLR CSERRF ;CLEAR ERROR FLAG, APPROP. ACTION TAKEN BIC #100,@#PS UB OUTPTR,R2 ;GET NO. OF ENTRIES ASL R2 ;GET NO. OF BYTES SUB R2,BUF1 ;RESET BUFFER POINTER ASR R2 ;GET NO. OF WORDS ;LOWER PRIROITY IF ACQ STOPPED MOV R2,-(SP) ;SAVE REGS 0-2 MOV R1,-(SP) ;.SYNCH SAVES 4-5 MOV R0,-(SP) INC CSDONF ;IND.MOV R2,CNT ;OTHERWISE, STORE CNT MOV (SP)+,R2 ;RESTORE R2 RTS PC TOFAST: JSR PC,KILLM1 ;STOP ACQ JSR PC,NOTFUL ;RESE ACQ HAS STOPPED MOV BUF1,R1 ;GET BUFR POINTER .IF DF,DMA$ & DUAL$ .IF NDF,DSORT$ TST CSTYPE ;TEST FOR DMA BLE 56$T BUF1 AND WORD COUNT MOV (SP)+,JMPADR ;STORE RETURN ADDRESS TST BUFPAS ;TEST FOR BUFFER PASSING BEQ TO2 ;IF NOT PASSING ;IF NOT DMA, BRANCH CMP #2,CSNOFC ;IF DMA, CHECK FOR DUAL SAMPLING BNE 56$ ;IF NOT,BRANCH JMP DMANST ;OTHERWISE , BRAN, B+C INC FASTER ;SET FAST ERR INC CSERRF ;IND ERROR IN ACQ RTI ;AND RETURN TO2: .INTEN 5 ;LOWER PRIORITY TO 5 INCCH .ENDC .ENDC 56$: MOV BBASIZ,R5 ;GET BUFFER SIZE IN BYTES TST FASTER ;CHECK ERROR TYPE BNE 55$ ;IF SAMPLING RATE B CSEROR ;RECORD ERROR MOV R2,-(SP) ;SAVE REG 0-2 MOV R1,-(SP) MOV R0,-(SP) ;REG 4-5 SAVED BY .INTEN MOV CNT,R2 ;GET CTOO FAST TO SAMPLE,B+C JMP MD1MPS ;GO PASS LAST BUFFER 55$: CLR FASTER ;CLEAR ERROR FLAG MOV CNT,R2 ;GET SAMPLE COUNT OUNT MOV BUF1,R1 ;GET BUFFER ADDRESS INC CSDONF ;IND. ACQ STOPPED TO MODULE JMP @(PC) ;RETURN JMPADR: .WORD 0 KILR TO CONTROL MODULE ADD R5,R1 ;POINT TO NEXT BUFR INC R0 ;UP DPID NO. $SOB R4,1$ ;ANOTHER BUFFR TO PASS? IF YES,B+C MDBR MD1CON ;OUTPUT BUFFER 6$: DEC CSTOP ;IND. READY TO PASS MORE BUFFERS CLR BUFPAS ;NOT PASSING BUFFERS BIC #100,@#PS ;L2$: CMP R5,#4200 ;SHOULD GAIN VALUE BE ABOVE 4 BGE 4$ ;IF NOT, B+C CMP R5,#4040 ;SHOULD GAIN VALUE BE 16 BLT 3$ ;IF NOT,R ENTRY CNTR MOV BUF1,BUFPAS ;GET BUFR TO PASS MOV BUF2,BUF1 ;REPLCE PRIMARY BUFR INC CHANCE ;INDICATE SLOWED DOWN, SO GI NO OTHER GAIN NEEDED, B+C MOV #20000,R0 ;OTHERWISE, SET GAIN BITS TO 16 BR 9$ ;GO TO SET GAIN AND RESAMPLE 3$: MOV #30000VE ONE CHANC INC CSTOP ;IND. TO STOP IF HERE TOO FAST .INTEN 5 ;RESET PRIORITY TO LEVEL 5 BR 2$ 1$: JSR PC,KILLM1 ;IF SLM1: CLR @#ADSAD ;SHUT DOWN ACQ - A/D,CLK,DI/O CLR @#CLKSAD MOV #IGNORA,@#ADVEC ; AND DUMMY UP VECTORS MOV #IGNORI,@#CLKV,R0 ;SET GAIN BITS TO 64 9$: ADD R0,@#ADSAD ;SET GAIN BITS IN A/D SW INC @#ADSAD ;ENABLE A/D CONVERT BR 1$ ;GO WAIT FOR CEC .IF DF,LPSDR$ ! DR11K$ MOV #IGNORI,@#DIVEC CLR SDIMSK CLR HDIMSK TST OUTDOP ;IS OUTPUT REQUIRED ON HALT BEQ KIONVERSION 4$: CMP R5,#5000 ;SHOULD GAIN VALUE BE 4 BGE 5$ ;IF NOT, B+C MOV #10000,R0 ;IF SO, SET GAIN BITS TO 4 BR 9$ ;LM1A ;IF NOT, B+C MOV HDOMSK,@#DOBUF ;IF SO, OUTPUT REQUIRED MASK .ENDC KILM1A: RTS PC ;RETURN .ENDC .IF DF,AUTAND GO TO SET GAIN AND RESAMPLE 5$: TST COMFLG ;TEST IF VALUE WAS NEGATED BEQ 10$ ;IF IT WAS NOT, B+C BIS #170000,R5 ;IF OG$ .SBTTL SINGLE RATE,CONTROL. MULTI-CHANNEL AUTO-GAIN MD1STA: TST @#CLKSAD ;TEST FOR ST1 PULSE BPL MD1AUT ;IF NIT WAS, NEG R5 ; RE-NEGATE IT 10$: MOV (R4)+,@#ADSAD ;START NEXT CHANNEL ADD R0,R5 ;IND. GAIN BITS IN DATA MOV R5,(R3)OT THERE, B+C JMP ST1END ;IF THERE, GO STOP MD1AUT: BIC #200,@#CLKSAD ;CLEAR DONE BIT MOV R2,-(SP) ;SAVE REG 2-4 MOV R3, ;STORE DATA TST (R4) ;TEST FOR END OF TABLE OF A/D SW BPL 15$ ;IF NOT AT END, B+C MOV (SP)+,R5 ;RESTORE REG 5+0 MOV -(SP) MOV R4,-(SP) MOV R0,-(SP) ;SAVE REG 0+5 MOV R5,-(SP) MOV BBASIZ,R2 ;GET BUFR SIZ MOV BUF1,R3 ;GET CUR. BUFR. EN(SP)+,R0 JMP MD1DIG ;OTHERWISE, CHECK FOR D/I AND FILLED BFS .ENDC .IF DF,MODE1$ .SBTTL SINGLE RATE,CONTROL,A/D CHTRY PTR. MOV #ADSWTB,R4 ;GET A/D SW TABLE ADDR. CLR R0 ;SIGNAL FIRST CONVERSION FOR CHNL .ENABL LSB BR 17$ 15$: CLR R0ANNEL ACQUISITION MD1SNG: MOV @#ADBUF,@BUF1 ;STORE NEXT A/D VALUE .IF NDF,AR11 TST @#ADSAD ;CHECK FOR ERROR BGE MD1S ;CLEAR FIRST CONVERSION FLAG ADD R2,R3 ;POINT INTO NEXT BUFFER 1$: TSTB @#ADSAD ;TST FO CONVERSION DONE BPL 1$ ;IF NOTCN ;IF NONE, CONTINUE DEC CHANCE ;DOES IT GET A SECOND CHANCE BEQ MD1SCM ;IF SO, BRANCH AND CONTINUE JSR PC,TOFAST ;OTH, BRANCH AND TEST AGAIN 17$: MOV @#ADBUF,R5 ;GET A/D CONVERTED VALUE TST R0 ;IS THIS THE 1ST CONVERT. FOR CHANL BNE 10$ ;ERWISE, STOP THINGS NOW BR MD1ERR ;IF NOT PASSING BUFFERS, GO PASS BUFFER MD1SCM: BIC #100000,@#ADSAD ;CLEAR ERROR FLAG .EIF NOT, B+C CLR COMFLG ;CLEAR COMPLEMENT FLAG CMP R5,#4000 ;IS VALUE IN NEGATIVE RANGE BGE 2$ ;IF NOT, B+C INC COMFLG NDC MD1SCN: ADD #2,BUF1 ;POINT TO NEXT ENTRY IN BUFFER DEC OUTPTR ;ANY MORE ROOM IN BUFFER BEQ MD1ONE ;IF NOT, B+C R ;IF SO, IND. TO NEGATE NEG R5 ;GET NO. IN RIGHT RANGE BEQ 10$ ;IF ZERO, NO NEED FOR GAIN BIC #170000,R5 ;WITHOUT SIGN TI ;IF THER IS, RETURN MD1ONE: TST CSTOP ;IS ACQ FINISHED .ENABL LSB BNE 1$ ;IF SO, B+C MOV BASIZ,OUTPTR ;RESET BUFFEBUFR TST CSDONF ;HAS ACQ STOPPED BNE 4$ ;IF SO, GO RELEASE BUFR JSR PC,BAGET ;IF NOT, GO GET BACK-UP BUFR BCC 5$ ;IF ;OTHERWISE, TELL C.M. WE'RE DONE RTS PC 1$: TST CSERRF ;CHECK FOR ADDIT. BUFFER WAITING BNE MD1SEC ;IF SO, BRANCH INCSPACE OBTAINED, B+C INC CSTOP ;IND. ACQ STOPPED CLR BUF2 ;SET UP DUMMY ADDR. AT BUFFER 2 BR 5$ ;GO EXIT 4$: MOV (R0),R CSERRF ;OTHERWISE, MIMIC GOING TOO FAST TO INC FASTER ; PASS A LAST PARTIAL BUFFER JSR PC,NOTFUL ;RESET BUF1 AND WORD COU0 ;GET ADDR OF BUFR TO RELEASE JSR PC,BAREL ;RELEASE BUFR 5$: MOV (SP)+,R0 ;RESTORE REG. 0-2 MOV (SP)+,R1 MOV (SP)+,R2 NT BR MD1SEC ;GO PASS BUFFERS .ENDC .ENDC .IF DF,MODE1$ .IF DF,LPSDR$ ! DR11K$ .SBTTL SINGLE RATE,CONTROL, .IF DF,FG$ TST CTRUN ;DO WE NEED A SYNCH BNE 6$ ;IF NOT BRANCH .SYNCH #SYNCTL BR SYNER2 ;IF ERROR INC CTRUN DIGITAL INPUT DISTSM: TST @#CLKSAD ;TEST ST1 PULSE BPL DISAMP ;IF NOT THERE, B+C JMP ST1END ;IF THERE, STOP THINGS DI;INDICATE SYNC .RSUM .ENDC 6$: BIS #340,@#PS ;;AVOID INTERRUPTS WHILE CHECKING ERS MD1SEC: TST CSERRF ;;IS SYSTEM RUNNISAMP: MOV @#DIBUF,@BUF1 ;STORE NEXT D/I VALUE MOV @BUF1,@#DIBUF ;CLEAR DIGITAL INPUT ADD #2,BUF1 ;POINT TO NEXT BUFR ENTRY O, STOP ACQ. TST BUFPAS ;CK FOR PASSING BUFFER BNE 15$ ;IF SO, B+C .INTEN 5 ;LOWER PRIORITY MOV BUF1,BUFPAS ;GET BUFFNG TOO FAST .ENABL LSB BEQ 7$ ;;IF NOT, B+C INCB CSEROR ;RECORD ERROR NUMBER CLR CSERRF ;CLEAR ERROR FLAG. APPROP. ACER TO PASS INC CSDONF ;IF NOT, IND. LAST BUFFER BR 3$ 15$: SUB BBASIZ,BUF1 ;POINT TO START OF BUFFER INC CSERRF ;IND. GTION TAKEN BIC #100,@#PS ;LOWER PRIORITY SINCE ACQ HAS STOPPED MOV BUF1,BUFPAS ;GET LAST BUFFER INC CSDONF ;INDICATE ACQ OING TOO FAST RTI ;AND RETURN 2$: TST BUFCNT ;DOES ACQ. STOP ON BUFR COUNT BMI 3$ ;IF NOT, B+C DEC BUFCNT ;IF SO, SHSTOPPED .IF DF,AR11 BR MD1SP1 ;GO PASS AND RELEASE LAST BUFFER .IFF TST FASTER ;CHECK FOR ERROR TYPE BEQ MD1SP1 ;OULD ACQ STOP BNE 3$ ;IF NOT, B+C INC CSTOP ;IF SO, INDICATE 3$: SUB BBASIZ,BUFPAS ;GET START ADDRESS OF BUFR TO PASS MDGO PASSS AND RELEASE LAST BUFFER MOV R2,-(SP) ;RESAVE REGISTERS IF TOO FAST FOR ACQ. MOV R1,-(SP) MOV R0,-(SP) MOV CNT,1SP1: MOV R2,-(SP) ;SAVE REG 0-2 MOV R1,-(SP) MOV R0,-(SP) MOV BASIZ,R2 ;GET BUFGER SIZE MD1ER1: MOV BUFPAS,R1 ;GET BUFFER2 ;GET CORRECT WORD COUNT BR MD1ER1 ;GO PASS BUFFER .ENDC 7$: DEC CSTOP ;IND. READY TO PASS MORE BUFRS CLR BUFPAS R ADDRESS .ENABL LSB MD1ERR: CLR R0 ;GET CHANNEL ID TST CSDONF ;IS THIS THE LAST BUFFER BNE 2$ ;IF SO, LEAVE WD. CNT P;NOT PASSING BUFFERS BIC #100,@#PS ;LOWER PRIORITY CLR CHANCE ;SHOULD HAVE USED CHANCE BY NOW TST CSDONF ;IS ACQ DONE OSITIVE NEG R2 ;IF NOT, NEGATE WD. CNT. 2$: JSR PC,CTIBUF ;PASS BUFR TO CONTROL MODULE BCC 25$ ;IF ACCEPTED, B+C JSR PCBEQ 8$ ;IF NOT, B+C DEC CTIDON ;IF IT IS, TELL THE CONTROL MODULE 8$: RTS PC ;RETURN .IF DF,FG$ SYNER2: JSR PC,KILLM1,KILLM1 ;IF NOT, SHUT ACQUISITION DOWN INC CSDONF ;SIGNAL ACQUISITION HAS STOPPED 25$: MOV #BUF2,R0 ;GET ADDR.OF PTR TO 2ND ;STOP ACQ INCB CSEROR ;RECORD ERROR .ENABL LSB TST CSDONF ;TEST FOR ACQ STOPPED BEQ 1$ ;IF NOT, BRANCH DEC CTIDONMOV #10000,@#DMAREG ;ENABLE DMA TRANSFER MOV BUF2,BUF1 ;REPLCE PRIMARY BUFR INC CSTOP ;IND TO STOP NEXT TIME IF TOO FAST DECREMENT BY ONE MOV BUFPAS,R1 ;GET BUFR ADDR CLR R2 ;CLR # OF ITEMS TO PUSH 5$: INC R2 ;INCR. # OF ITEMS TO PUSH MOV R.INTEN 5 ;LOWER PRIORITY TO LEVEL 5 BR 2$ 1$: JSR PC,KILLM1 ;IF SO, STOP ACQ. TST BUFPAS ;CK FOR PASSING BUFFER BNE 15$2,R4 ;GET # OF TEMS TO PUSH MOV R2,R3 ;GET NEXT ENTRY ASL R3 ; TO BE ASL R3 ; BUBBLED UP ADD R1,R3 MOV (R3),R5 ;IF SO, B+C INC CSDONF ;IF NOT, IND. LAST BUFFER .INTEN 5 MOV BUF1,BUFPAS ;GET LAST BUFFER ADDRESS BR 3$ 15$: INC CS ;SAVE ENTRY TO BUBBLE 6$: MOV -(R3),2(R3) ;SWAP NEXT TWO ENTRIES DEC R4 ;CK IF DONE SWAPPING BNE 6$ ; FOR THIS PASS, IFERRF ;IND. GOING TOO FAST RTI ;AND RETURN 2$: TST BUFCNT ;DOES ACQ. STOP ON BUFR COUNT BMI 3$ ;IF NOT, B+C DEC BUFCN NOT, B+C MOV R5,(R3) ;IF SO, INSERT VALUE BUBBLED DEC R0 ;SORT FINISHED BNE 5$ ;IF NOT, DO NEXT PASS .ENDC 7$: MOT ;IF SO, SHOULD ACQ STOP BNE 3$ ;IF NOT, B+C INC CSTOP ;IND. TO STOP NEXT TIME 3$: .IF NDF,DUAL$ JMP MD1SP1 ;GO PAV (SP)+,R3 ;RESTORE R3 .ENDC MOV BUFPAS,R1 ;GET ADDR OF BUFR TO PASS .IF NDF,DSORT$ DMANST: MOV BASIZ,R2 ;GET BUFFER SS BUFFER .ENDC .IF DF,DUAL$ TST DMAFLG ;TEST FOR SINGLE OR DUAL SAMPLING BNE 4$ ;IF DUAL, B+C JMP MD1SP1 ;IF SINSIZE NEG R2 ;NOT LAST BUFFER CLR R0 ;GET DAT PATH ID JSR PC,CTIBUF ;PASS BUFFER BCC DMAST1 ;IF NO ERRORS, BRANCH JSGLE, GO PASS BUFFER 4$: MOV R2,-(SP) ;SAVE REGS 0-2 MOV R1,-(SP) ;.INTEN SAVE 4-5 MOV R0,-(SP) .IF DF,DSORT$ MOV R3,-R PC,KILLM1 ;STOP ACQ DMAST1: ADD BBASIZ,R1 ;GET SECOND BUFER ADDRESS TST CSDONF ;TEST IF LAST BUFFER BEQ DMAST2 ;IF SO ,(SP) ;SAVE R3 TOO .IF NDF,INPLAC MOV BASIZ,R2 ;GET BUFR SIZE MOV BUF3,R1 ;GET AREA TO SORT FIRST CHNL DATA TO MOV R1 BRANCH NEG R2 ;OTHERWISE NEGATE DMAST2: JSR PC,CTIBUF ;PASS IT BCC DMAST3 ;IF ACCEPTED, BRANCH JSR PC,KILLM1 ;STOP ACQ DEC OUTPTR ;ANY MORE ROOM IN BUFR BEQ DISAM1 ;IF NOT, GO PASS BUFFER RTI ;OTHERWISE, RETURN DISAM1: JMP MD1ONE ;GO P,R3 ADD R2,R3 ;GET AREA TO SORT 2ND CHNL DATA TO MOV BUFPAS,R4 ;GET ADDR OF FILLED MIXED BUFFER 5$: MOV (R4)+,(R1)+ ;GET AASS BUFFER .ENDC .ENDC .IF DF,DMA$ .SBTTL SINGLE RATE,CONTROL,DMA(SINGLE,DUAL-SORTED OR NOT) DMASAM: TST CSTND STORE NEXT 1ST CHNL ENTRY MOV (R4)+,(R3)+ ;GET AND STORE NEXT 2ND CHNL ENTRY DEC R2 ;ANY MORE ENTRIES BNE 5$ ;IF SO, OP ;IS ACQ FINISHED .ENABL LSB BNE 1$ ;IF SO, B+C MOV BUF1,BUFPAS ;GET FILLED BUFR ADDR.,SIGNAL PASSING MOV #6,@#ADSADB+C MOV BUF3,BUFPAS ;IF NOT, GET ADDR OF BUFRS ACTUALLY PASNG TST CSDONF ;HAS ACQUISITION STOPPED BEQ 6$ ;IF NOT, B+C ;POINT DAM REG TO CUR. ADDR. REG. MOV BUF2,@#DMAREG ;LOAD BUFR. ADDR. IN DMA ADDR. PTR. MOV #4,@#ADSAD ;POINT DMA REG TO CUMOV #2,R1 ;GET NO. OF CONTIGUOUS BUFRS TO RELEASE MOV BUF1,R0 ;GET ADDR OF BUFRS TO RELEASE JSR PC,BARLM ;GO RELEASE BUFRSR. WD. CTR. MOV DMAWDC,@#DMAREG ;LOAD WD. CNT. IN DMA WD. CTR. MOV DMASW,@#ADSAD ;POINT DMAR. TO DMA SW. ,SET A/D SW BITS BR 7$ 6$: MOV BUF1,BUF3 ;REASSIGN THE DUTIES OF BUFR 1 .ENDC .IF DF,INPLAC MOV BASIZ,R0 ;GET BUFR SIZE DEC R0 ;SIZE OF BUFFER JMP MD1MPS ;GO PASS BUFFERS .ENDC .ENDC .IF DF, MODE2$ ! MODE3$ SAMP23: TST CSDONF ;HAS ;IF NOT, RESTORE ALL REGISTERS CLC ;IND. NO ERRORS RTS PC ; AND RETURN STCHNL: MOV #BUF2,R4 ;GET BUF2 PTR TABLE ADDR ACQ STOPPED .ENABL LSB BEQ 1$ ;IF NOT, B+C SEC ;IF SO, SET CARRY IND. ERROR RTS PC ; AND RETURN 1$: TST R1 ;ZERO I.ENABL LSB 1$: MOV -(R3),R0 ;GETNEXT OFFSET TO GEN TAB FOR CHNL ADD R4,R0 ;GET CHNL'S BUF2 PTR ADDR JSR PC,BAGET ;GET A BNPUT IS A NOP BEQ 11$ BIT R1,STOPMK ;SHOULD ALL ACQ STOP BEQ 2$ ;IF NOT, B+C JSR PC,SAVARG ;SAVE ALL REGS JSR PC,KILMUF2 FOR CHNL .IF DF,LPSDR$ ! DR11K$ TST OUTDOP ;SHOULD D/O OCCUR ON CHANL START BEQ 2$ ;IF NOT, B+C MOV (R3),R2 ;GE23 ;IF SO, GO DISABLE SYSTEM AND CLEAN UP JSR PC,RSTARG ;RESTORE ALL REGS 11$: CLC ;IND. NO ERROR RTS PC ;AND RETURN 2$T OFSET ONCE AGAIN MOV SDOMSK(R2),@#DOBUF ;IF SO, OUTPUT PROPER MASK .ENDC 2$: DEC STCNT ;ANY MORE CHNLS STARTED BNE 1: JSR PC,SAVARG ;SAVE ALL REG(0-5) CLR R2 ;GET GEN. TAB. OFFSET FOR 1ST CHNL MOV #SPTAB,R5 ;GET ADDR OF STOPPED CHNLS TABLE$ ;IF SO, B+C TST SPCNT ;ANY CHNLS STOPPED BEQ SAM23R ;IF NOT, B+C SPCHNL: MOV BASIZ,R2 ;GET FULL BUFFER SIZE MOV -(R5 MOV #STTAB,R3 ;GET ADDR OF STARTED CHNLS TABLE MOV CSNOFC,R4 ;GET # OF CHNLS CLR STCNT ;CLEAR STARTED CHNLS CNTR CLR S),R0 ;GET CHNL'S GEN TAB OFFSET MOV OUTPTR(R0),R3 ;GET BUFR ENTRY CNTR FOR CHNL MOV R2,OUTPTR(R0) ;RESET CNTR SUB R3,R2 ;PCNT ;CLEAR STOPPED CHNLS CNTR 3$: BIT R1,HDIMSK(R2) ;SHOULD THIS CHNL BE STOPPED BEQ 4$ ;IF NOT, B+C BIT #1,ADSWTB(R2) ;GET ACTUAL WORD CNT IN BUFR MOV BUF1(R0),R1 ;GET PTR TO NEXT FREE BUF1 ENTRY ASL R2 ;GET BYTE CNT SUB R2,R1 ;GET START OWAS THIS CHNL ALREADY STOPPED BEQ 4$ ;IF SO, B+C BIC #1,ADSWTB(R2) ;IF NOT, STOPPED CHNL'S ACQ INC SPCNT ;INCR. STOPPED F BUF 1 FOR CHNL ASR R2 ;RESTORE WORD CNT ASR R0 ;GET DATA PATH ID NO. JSR PC,CTIBUF ;PASS LAST BUFR FOR CHNL ASL R0 CHNLS CNTR MOV R2,(R5)+ ;STORE CHNLS GEN. TAB. OFFSET BR 5$ 4$: BIT R1,SDIMSK(R2) ;SHOULD THIS CHNL BE STARTED BEQ 5$ ;I;RESTORE OFFSET IN BYTES MOV BUF2(R0),BUF1(R0) ;SET UP BUF1 FOR RESTART .IF DF,LPSDR$ ! DR11K$ TST OUTDOP ;SHOULD D/O OF NOT, B+C BIT #1,ADSWTB(R2) ;WAS THIS CHNL ALREADY STARTED BNE 5$ ;IF SO, B+C BIS #1,ADSWTB(R2) ;IF NOT, ENABLE CHNLS ACCCUR ON CHNL HALT BEQ SP1 ;IF NOT, B+C MOV HDOMSK(R0),@#DOBUF ;IF SO, OUTPUT PROPER MASK .ENDC SP1: DEC SPCNT ;ANY OTQ INC STCNT ;INCR. STARTED CHNLS CNTR MOV R2,(R3)+ ;STORE CHNL'S GEN. TAB. OFFSET 5$: TST (R2)+ ;INCR. GEN. TAB. OFFSET PHER CHNLS STOPPED BNE SPCHNL ;IF SO, B+C MOV #1,CSDATA ;NDICATE DATA PASSED BR SAM23R ;IF NOT, RETURN SAMPLE: BIT #1,A INC CSDONF ;INC. DONE FLAG SUB BBASIZ,R1 ;GET BUFFER ADDRESS CMP R1,BUF2 ;SEE IF THE TWO ARE THE SAME BNE DMAST3 ;IFTR BY 2 BYTES $SOB R4,3$ ;ANY MORE CHNLS TO CHK? IF SO, B+C BIC #140,@#PS ;LOWER PRIORITY TO 4 TST STCNT ;WERE ANY PROCE NOT, JUST EXIT CLR BUF2 ;OTHERWISE DUMMY UP ADDRESS DMAST3: JMP MD1NST ;OTHERWISE CONTINUE .ENDC MOV BBASIZ,R5 ;GET SSES STARTED BNE STCHNL ;IF SO, B+C TST SPCNT ;WERE ANY PROCESSES STOPPED BNE SPCHNL ;IF SO, B+C SAM23R: JSR PC,RSTARG, B+C CMP R5,#4040 ;SHOULD GAIN VALUE BE 16 BLT 23$ ;IF NOT, NO OTHER GAIN NEEDED, B+C MOV #20000,R4 ;OTHERWISE, SET GAINIF DF,LPSDR$ ! DR11K$ CLR @#DIOSAD ;AND DIG INTERRUPTS .ENDC INC CSDONF ;IND TO THIS MODULE ITS DONE DEC CTIDON ;IND TDSWTB(R1) ;IS CHANNEL ENABLED .ENABL LSB BNE 1$ ;IF IT IS, B+C RTS PC 1$: MOV ADSWTB(R1),R3 ;GET STATUS WORD .IF DF BITS TO 16 BR 29$ ;GO TO SET GAIN AND RESAMPLE 23$: MOV #30000,R4 ;SET GAIN BITS TO 64 29$: ADD R4,@#ADSAD ;SET GAIN BITS ,LPSDR$ ! DR11K$ TSTB R3 ;IS THIS A DIGITAL CHANNEL BMI 10$ ;IF SO, B+C .ENDC MOV R3,@#ADSAD ;START A/D CONVERSION IN A/D SW INC @#ADSAD ;ENABLE A/D CONVERT BR 21$ ;GO WAIT FOR CONVERSION 24$: CMP R5,#5000 ;SHOULD GAIN VALUE BE 4 BGE .IF DF,AUTOG$ TST R3 ;SEE IF AUTO-GAINNING BMI 20$ ;IF SO, B+C .ENDC 2$: TSTB @#ADSAD ;IS CONVERSION DONE BPL 25$ ;IF NOT, B+C MOV #10000,R4 ;IF SO, SET GAIN BITS TO 4 BR 29$ ;AND GO TO SET GAIN AND RESAMPLE 25$: TST COMFLG ;TEST 2$ ;IF NOT, TRY AGAIN MOV @#ADBUF,@BUF1(R1) ;STORE DATA IN BUFR ADD #2,BUF1(R1) ;INCR. ADDR OF BUFR PTR DEC OUTPTR(R1) ;DIF VALUE WAS NEGATED BEQ 28$ ;IF IT WAS NOT, B+C BIS #170000,R5 ;IF IT WAS, NEG R5 ; RE-NEGATE IT 28$: ADD R4,R5 ;INDEC BUFR CNTR BNE 3$ ;IF NOT ZERO JUST RETURN JMP SAMPAS ;IF FULL, GO SET UP TO PASS BUFR 3$: RTS PC ;IF NOT, IND NO ERRO GAIN USED MOV R5,@BUF1(R1) ;STORE DATA ADD #2,BUF1(R1) ;INC BUFR POINTER DEC OUTPTR(R1) ;DEC COUNTER FOR BUFFER BEQ SAMR AND RETURN .IF DF,LPSDR$ ! DR11K$ 10$: MOV @#DIBUF,@BUF1(R1) ;STORE DATA IN BUFR MOV @BUF1(R1),@#DIBUF ;CLEAR DIG. BUFRPAS ;IF BUFFER FULL, B+C RTS PC ;AND RETURN .ENDC SAMPAS: MOV RNGIN,R3 ;GET NEXT ADDR IN BUFR TO STORE FULL BUFR .ENA ADD #2,BUF1(R1) ;INCR. ADDR OF BUFFER POINTER DEC OUTPTR(R1) ;CHECK FOR FULL BUFFER BNE 3$ ;IF NOT ZERO, JUST RETURN JBL LSB MOV R1,(R3)+ ;STORE CHNL TABLE OFFSET MOV BASIZ,R4 ;GET BUFR SIZE MOV R4,OUTPTR(R1) ;RESET BUFR CNTR MOV BUF1(R1MP SAMPAS ;IF FULL, GO SET UP TO PASS BUFR .ENDC .IF DF,AUTOG$ 20$: CLR R4 ;CLEAR SIGNAL FOR FIRST CONVERSION .ENABL ),R5 ;GET ADDR. OF CUR. BUFR1 PTR SUB R4,R5 ;GET STRT OF FULL BUFR 1 SUB R4,R5 ;GET STRT OF FULL BUFR 1 CMP BUF2(R1),R5 LSB 21$: TSTB @#ADSAD ;TST FO CONVERSION DONE BPL 21$ ;IF NOT, BRANCH AND TEST AGAIN MOV @#ADBUF,R5 ;GET A/D CONVERTED VA;COMP BUF1 ADDR TO BUF2 ADDR BNE 53$ ;IF NOT EQUAL, CORRECT, SO, B+C CLR SDIMSK(R1) ;OTHERWISE,CHNL TOO FAST, SO DISABLE LUE TST R4 ;IS THIS THE 1ST CONVERT. FOR CHANL BNE 28$ ;IF NOT, B+C CLR COMFLG ;CLEAR COMPLEMENT FLAG CMP R5,#4000 ;IBIC #1,ADSWTB(R1) ; BY CLEARING ENABLE MASK AND S.W. ENABLE ASR R1 ;GET COUNT OF BYTES INCB CSEROR+1(R1) ;INDICATE CHANNEL S VALUE IN NEGATIVE RANGE BGE 22$ ;IF NOT, B+C INC COMFLG ;IF SO, IND. TO NEGATE NEG R5 ;GET NO. IN RIGHT RANGE BEQ 2STOPPED ABNORMALLY ASL R1 ;RESTORE R1 NEG -2(R3) ;IND. CHNL DEAD IN RING BUFR INC CSCHDN ;INCR. CNT OF # OF CHNLS DEAD 8$ ;IF ZERO NO NEED FOR GAIN BIC #170000,R5 ;WITHOUT SIGN 22$: CMP R5,#4200 ;SHOULD GAIN VALUE BE ABOVE 4 BGE 24$ ;IF NOT CMP CSCHDN,CSNOFC ;COMPARE TO NO. OF CHANNELS BNE 53$ ;IF SOME STILL ALIVE, B+C CLR @#CLKSAD ;OTHERWISE, DIABLE CLOCK .(R4),R1 ;WAS BUF1 SAME AS BUF2 FOR CHNL BEQ 20$ ;IF SO, B+C 5$: MOV BUF2(R4),R0 ;IF NOT, GET ADDR OF BUF2 JSR PC,BAREL ; A SAMPLE 6$: SUB R2,(R3)+ ;SUB NEXT INT. FROM CHNL'S CUR INT BNE 7$ ;IF NOT ZERO, DON'T SAMPLE NEXT TIME INC SCHNTB ;IF ZEND RELEASE THE BUFFER TO B.A. BR 20$ 10$: TST SDIMSK(R4) ;WAS CHNL ALIVE BNE 5$ ;IF SO, B+C 20$: TST (R4)+ ;INCREMENT OFRO, UP CNTR OF CHNLS TO SAM NEXT MOV R1,(R0)+ ;STORE OFFSET FOR CHNLS IN TABLE MOV (R5),-2(R3) ;RESET TIM INT TO ORIGINAL COFSET $SOB R5,2$ ;IF MORE CHANLS, B+C INC CSDONF ;IF NOT, IND. ACQ DONE TO THIS MODULE DEC CTIDON ;INDICATE ACQUISITION UNT 7$: TST (R1)+ ;INC BYTE COUNT FOR OFFSET TST (R5)+ ;INC ORIGINAL TIM INT TABL PTR DEC R4 ;ANY MORE CHANNELS BNE 6$STOPPED TO C.M. MOV #IGNORI,@#CLKVEC ;DUMMY VECTORS .IF DF,LPSDR$ ! DR11K$ MOV #IGNORI,@#DIVEC .ENDC RTS PC ; AND RET ;IF SO, B+C TST BUFPAS ;WAS BUFR PASSING INTERRUPTED BNE 8$ ;IF SO, B+C TST RNGCNT ;WERE MORE BUFFERS PUT IN RING BUFO C.M. ACQ HAS STOPPED 53$: MOV BUF2(R1),BUF1(R1) ;CHANG BUFFERS MOV R5,(R3)+ ;STORE BUFR ADDR. IN RING BUFR CMP R3,RNGEND URN .ENDC ;END OF CODE FOR MODE2+3 .IF DF,MODE2$ SAMOD2: INC SAMFLG ;TEST IF TOO SOON .ENABL LSB BEQ 1$ ;IF NO;TEST IF PAST LAST ADDR IN RING BNE 54$ ;IF NOT, B+C MOV #RNGBEG,R3 ;IF SO, RESET TO FIRST 54$: MOV R3,RNGIN ;RESET RING IT, B+C CLR @#CLKSAD ;IF SO, STOP CLOCK .IF DF,LPSDR$ ! DR11K$ CLR @#DIOSAD ;STOP ALL DIO .ENDC RTI 1$: .INTEN 5 ;LOWN PTR INC RNGCNT ;INDICATE GOT A BUFFER TO PASS RTS PC ; AND RETURN KILM23: CLR @#CLKSAD ;STOP THE CLOCK .IF DF,ER PRIORITY TO 4 JSR PC,SAVARG ;SAVE REG MOV #SCHNTB,R2 ;GET ADDR OF TABLE OF CHANNELS TO SAMPLE MOV (R2)+,R0 ;GET # OF CHLPSDR$ ! DR11K$ CLR @#DIOSAD ;STOP DI/O .ENDC 1$: MOV CSNOFC,R5 ;GET TOTAL NO. OF CHANNELS CLR R4 ;CLEAR OFFSET PTRNLS TO TRY TO SAMPLE 2$: MOV (R2)+,R1 ;GET OFFSET OF 1ST CHNL TO SAMPLE JSR PC,SAMPLE ;GO TRY TO SAMPLE CHNL DEC R0 ;ANY M FOR GEN TABS 2$: BIT #1,ADSWTB(R4) ;WAS THIS CHANNEL ENABLED BEQ 10$ ;IF NOT, B+C .IF DF,LPSDR$ ! DR11K TST OUTDOP ORE CHNLS TO TRY TO SAMPLE BNE 2$ ;IF SO, B+C MOV #CINTAB,R0 ;GET CUR. TIME INTERVAL TABLE ADDR MOV R0,R3 ;GET SECOND CO;CHECK FOR DIGITAL OUTPUT ON STOP BEQ 3$ ;IF NOT, BRANCH BIS HDOMSK(R4),@#DOBUF ;OTHERWISE SET BITS .ENDC 3$: MOV BASIPY MOV CSNOFC,R1 ;GET # OF CHNLS MOV R1,R4 ;GET 2ND COPY MOV (R0)+,R2 ;GET A GUESS FOR MINIMUM TIME INTERVAL BR 5$ 4$:Z,R2 ;GET BUFFER SIZE MOV OUTPTR(R4),R3 ;GET BUFR ENTRY CNTR FOR CHNL SUB R3,R2 ;GET ACTUAL WD CNT IN BUFR ASL R2 ;GET B CMP (R0)+,R2 ;CMP NEXT INTERVAL TO PRESENT MINIMUM BLE 5$ ;IF ABSOLUTE VALUE LARGER, B+C MOV -2(R0),R2 ;IF NOT, GET NEW MIYTE CNT MOV BUF1(R4),R1 ;GET PTR INTO BUF1 FOR CHNL SUB R2,R1 ;GET START OF BUFR ASR R2 ;RESTORE WD CNT MOV R4,R0 ;GENIMUM 5$: DEC R1 ;ANY MORE CHANNEL TO TEST BNE 4$ ;IF SO, B+C MOV R2,@#CLKBUF ;SET NEXT BUF PRESET VALUE MOV #INTABL,R5T DPID FOR CHNL ASR R0 ;GET DPID NO FOR CHANNEL JSR PC,CTIBUF ;PASS BUFFER INC CSDATA ;IND. BUFFER WAS PASSED CMP BUF2 ;GET ADDR OF ORIGINAL TIM INT TABLE MOV #SCHNTB,R0 ;GET ADDR OF NEXT CHNL TO SAMP TABL CLR (R0)+ ;CLEAR COUNT OF CHANLS TOSET SIGN BR 3$ 2$: TST BUFCNT(R3) ;TEST FOR DISABLE ON BUFR. CNT. BEQ 5$ ;IF NOT APPLICABLE, B+C DEC BUFCNT(R3) ;TEST IFCTRUN ;INDCATE SYNCED .RSUM .ENDC GIVCHK: BIS #340,@#PS ;;DID ANY THING HAPPEN TST RNGCNT ;; HOUSE CLEANING WAS GOING # OF BUFRS PASSED IS MAX BNE 5$ ;IF NOT, B+C CLR SDIMSK(R3) ;IF SO, DISABLE CHNL'S START MSK BIC #1,ADSWTB(R3) ;DISABLE ON BNE GIVBF2 ;;IF SO, GO BACK AND PROCESS CLR BUFPAS ;;IF NOT, SIGNAL THROUGH PASSING BUFRS RTS PC GIVBF2: BIC #140,@CHNL'S ACQ INC CSCHDN ;INCR. CNT OF # OF CHNLS DEAD CMP CSCHDN,CSNOFC ;COMPARE TO NO. OF CHANNELS BNE 3$ ;IF SOME STILL #PS ;LOWER PRIORITY TO 4 JSR PC,SAVARG ;SAVE ALL REGS BR GIVBF3 ; GO PROCESS NEW BUFFERS .IF DF,FG$ SYNER3: CLR @#CLALIVE, B+C CLR @#CLKSAD ;OTHERWISE, DIABLE CLOCK .IF DF,LPSDR$ ! DR11K$ CLR @#DIOSAD ;AND DIG INTERRUPTS .ENDC INC CSDKSAD ;STOP ACQ INCB CSEROR ;RECORD ERROR JSR PC,SAVARG ;SAVE REG JSR PC,KILM23 ;PASS BUFFERS JSR PC,RSTARG ;RESTORE REGONF ;IND TO THIS MODULE ITS DONE DEC CTIDON ;IND TO C.M. ACQ HAS STOPPED 3$: .IF DF,LPSDR$ ! DR11K$ TST OUTDOP ;SHOULISTERS RTS PC .ENDC .ENDC .IF DF,MODE3$ SAMOD3: INC SAMFLG ;TEST IF TOO SOON .ENABL LSB BEQ 1$ ;IF NOT, B+C D OUTPUT D/O ON HALT BEQ 4$ ;IF NOT, B+C MOV HDOMSK(R3),@#DOBUF ;IF SO, OUTPUT MASK DIGITALLY .ENDC 4$: NEG R2 ;INDIC CLR @#CLKSAD ;IF SO, STOP CLOCK .IF DF,LPSDR$ ! DR11K$ CLR @#DIOSAD ;STOP ALL DIO .ENDC RTI 1$: .INTEN 5 ;LOWER PRIOATE A LAST BUFR 5$: MOV (R4)+,R1 ;GET BUFR TO PASS CMP R4,RNGEND ;IS RING OUT PTR AT LAST LOC IN RING BNE 6$ ;IF NOT, B+C RITY TO 4 JSR PC,SAVARG ;SAVE REG MOV CRRPTR,R0 ;GET CUR. PTR INTO ROUND ROBIN TABLE MOVB (R0)+,R1 ;GET NEXT OFFSET ENTRYFER BNE GIVBUF ;IF SO, B+C JSR PC,RSTARG ;RESTOR REGS BIS #340,@#PS ;;DISABLE INTERRUPTS TST SAMFLG ;;DID CLOCK TICK T MOV #RNGBEG,R4 ;IF SO, PTR TO 1ST LOC IN BUFR 6$: MOV R4,RNGOUT ;UPDATE RING OUTPUT POINTER MOV R3,R0 ;GET CHNL'S DPID AOO SOON BEQ 9$ ;;IF NOT, B+C JSR PC,SAVARG ;SAVE REG JSR PC,KILM23 ;;IF SO, GET RID OF ALL BUFFERS INCB CSEROR ;;INDICSR R0 JSR PC,CTIBUF ;PASS BUFFER TST R2 ;WAS THIS A LAST BUFFER BPL 7$ ;IF SO, B+C MOV #BUF2,R0 ;IF NOT, GET BUF2 TABLATE ERROR, FATAL JMP GIVEND ;;GO RETURN 8$: JSR PC,RSTARG ;RESTORE REGS 9$: DEC SAMFLG ;;RESET FLAG IF NO ERROR(=0 IF ERROE ADDR ADD R3,R0 ;GET ADDR FOR CHNL'S BUF2 PTR JSR PC,BAGET ;GET ANOTHER BUFFER 7$: DEC RNGCNT ;ANY MORE BUFRS TO PASS R) RTS PC .ENDC .IF DF,MODE2$ ! MODE3$ GIVBUF: INC BUFPAS ;IND PASSING BUFFERS DEC SAMFLG ;ALLOW MORE SAMPLING BNE GIVBF1 ;IF SO, B+C TST CSDONF ;HAS ACQ STOPPED ON ALL CHNLS FOR GOOD BNE GIVEND ;IF SO, B+C TST SAMFLG ;CHECK FOR GIVBF3: MOV RNGOUT,R4 ;GET RING PTR FOR OUTPUT TO C.M. .ENABL LSB GIVBF1: MOV BASIZ,R2 ;GET BUFFER SIZE NEG R2 ;IND. NOT DISABLED SYSTEM BMI GIVEND ;IF NOT DISABLED, B+C JSR PC,KILM23 ;IF DISABLED, GO CLEAN UP GIVEND: JSR PC,RSTARG ;RESTORE REA LAST BUFFER MOV (R4)+,R3 ;GET CHNL'S GEN TAB OFFSET BPL 2$ ;IF CHNL NOT KILLED, B+C NEG R3 ;IF DEAD CHNL, CORRECT OFFGS .IF DF,FG$ TST CTRUN ;DO WE NEED A SYNCH BNE GIVCHK ;IF NOT, BRANCH .SYNCH #SYNCTL BR SYNER3 ;IF ERROR INC E ;TEST FOR DIG DATA CHANL IN USE BEQ 35$ ;IF NOT, B+C CMP R1,CSNOFC ;CHECK IF NEXT CHNL IS DIGITAL BEQ 4$ ;IF SO B+C PE: .BLKW 1 ;WORD INDICATING SPECIAL INPUT CONDITIONS CSDONF: .BLKW 1 ;INTERNAL DONE FLAG ADSWTB: .BLKW MXINP$+1 ;TABLE O .ENDC 35$: ASL R1 ;GET BYTE OFFSET INTO TABLES MOV ADSWTB(R1),R1 ;GET A/D SW BIC #160377,R1 ;GET MUX BITS ONLY MOV R1F A/D STATUS WORDS. 1 FOR EA.CHNL .IF DF,LPSDR$ ! DR11K OUTDOP: .BLKW 1 ;FLAG INDICATING POSSIBLE D/O ON S/S CSIDIG: .BL,@#ADSAD ;CHANGE MUX 4$: TST BUFPAS ;WAS BUFR PASSING INTERRUPTED BNE 8$ ;IF SO, B+C TST RNGCNT ;WERE MORE BUFFERS PUT IKW 1 ;WORD CONTAINING LASTEST SAMPLED DIG. INPUT .ENDC .IF DF,AUTOG$ COMFLG: .BLKW 1 ;FLAG TO IND. FOLDING .ENDC N RING BUFFER BEQ 5$ ;IF NOT ALREADY PASSING BUFRS, B+C JMP GIVBUF ;IF SO, B+C 5$: JSR PC,RSTARG ;RESTOR REGS BIS #340,.IF NDF,MODE2$ .IF NDF,MODE3$ BUFCNT: .BLKW 1 ;STOREAGE FOR OUTPUT BUFR CNT BUF1: .BLKW 1 ;PNTR TO ACTIVE OUTPUT BUFRS@#PS ;;DISABLE INTERRUPTS TST SAMFLG ;;DID CLOCK TICK TOO SOON BEQ 9$ ;;IF NOT, B+C JSR PC,SAVARG ;SAVE ALL REGS JSR P BUF2: .BLKW 1 ;PNTR TO NEXT OUTPUT BUFRS OUTPTR: .BLKW 1 ;OUTPUT BUFRS COUNTER .IF DF,LPSDR$ ! DR11K$ SDIMSK: .BLKW 1 C,KILM23 ;;IF SO, GET RID OF ALL BUFFERS INCB CSEROR ;;RECORD FATAL ERROR JMP GIVEND ;;GO RETURN 8$: JSR PC,RSTARG ;RESTO ;BIT MASK USED TO START ACQUISITION HDIMSK: .BLKW 1 ;BIT MASK USED TO STOP ACQUISITION SDOMSK: .BLKW 1 ;BIT MASK OUTPUTERE ALL REGS 9$: DEC SAMFLG ;;RESET FLAG IF NO ERROR(=0 IF ERROR) RTS PC .ENDC .IF DF, MODE2$ ! MODE3$ .SBTTL DID ON D/O WHEN ACQ STRTS HDOMSK: .BLKW 1 ;BIT MASK OUTPUTED ON D/O WHEN ACQ STOPS .ENDC .ENDC .ENDC .IF DF,MODE1$ GITAL INTERRUPT ROUTINE FOR MODES 2+3 .IF DF,LPSDR$ ! DR11K$ DIMD23: MOV R1,-(SP) MOV @#DIBUF,R1 MOV R1,@#DIBUF ;CLR DICHANCE: .BLKW 1 ;FLAG INDICATING SLOW DOWN CSERRF: .BLKW 1 ;FLAG INDICATING ERROR CSTOP: .BLKW 1 ;FLAG INDICATING TO STOGITAL INPUT BUFFER BIS #100,@#DIOSAD ;RE-ENABLE DI INTERRUPT MOV R1,CSIDIG ;SAVE DIGITAL INPUT IN GLOBAL .INTEN 4 ;LOWER P ACQ FASTER: .BLKW 1 ;FLAG IND. SECOND ERROR TYPE CNT: .BLKW 1 ;COUNT OF UNFILLED BUFFER NEXCVA: .BLKW 1 ;ADDR OF CLK PRIORITY JSR PC,@CSAMPA MOV (SP)+,R1 .IF DF,FG$ TST CSDATA ;WERE ANY BUFFERS PASSED BNE DIMD01 ;IF NOT, B+C .SYNINT VEC AFTER 1ST ST1 .IF DF,DMA$ DMASW: .BLKW 1 ;DMA STATUS WORD DMAWDC: .BLKW 1 ;DMA WORD COUNT DMAFLG: .BLKW 1 ;DM BMI 2$ ;IF NEG., JUST A DELAY, SO B+C ASL R1 ;GET BYTE OFFSET JSR PC,SAMPLE ;OTHERWISE GO TRY TO SAMPLE 2$: CMP R0,RRTCH #SYNCTL NOP .RSUM DIMD01: CLR CSDATA ;CLEAR DATA FLAG .ENDC RTS PC .ENDC .ENDC .SBTTL STORAGE AREA END ;IS CUR. RR PTR AT END OF TABLE BNE 3$ ;IF NOT, B+C MOV RRTBEG,R0 ;IF SO, RESET TO START OF TABLE 3$: MOV R0,CRRPTR ;U CSMODE: .BLKW 1 ;MODE CODE CSNOFC: .BLKW 1 ;NO. OF INPUT CHANNELS CFLAG: .BLKW 1 CSNOFA: .BLKW 1 ;NO. OF A/D INPUT CHAPDATE CURRENT RR POINTER MOVB (R0),R1 ;IS THE NEXT ENTRY A DELAY BMI 4$ ;IF SO, B+C .IF DF,LPSDR$ ! DR11K$ TST CSTYPNNELS BUFPAS: .BLKW 1 ;FLAG INDICATING MODULE PASSING BUFRS CSAMPA: .BLKW 1 ;WORD CONTAINING START/STOP ROUTINE ADDR CSTYA FLAG FOR EITHER SINGLE OR DUAL SAMPL .IF DF,DUAL$ .IF NDF,INPLAC BUF3: .BLKW 1 ;PNTR TO SCRATCH BUFRS FOR SORT .ENDC R SMPLING EA. CHANL SCHNTB: .BLKW MXINP$+1 ;TABLE OF CHNLS TO SAMPL NEXT CLK OVRFLW NXCKCT: .BLKW 1 ;SECOND BUFR PRESET VAL .ENDC .ENDC .ENDC CSEROR: .BYTE 0 ;FATAL ERROR COUNT .IF DF,MODE2$ ! MODE3$ .BLKB MXINP$ ;TABLE OF CHANNELS STOPUE FOR CLOCK .ENDC .IF DF,MODE3$ RRTBEG: .BLKW 1 ;PNTR TO DRIVER TABLE OF ROUND ROBIN RRTEND: .BLKW 1 ;LAST ADDR INDPED ABNORMALLY .EVEN BUFCNT: .BLKW MXINP$ ;TABLE OF BUFR CNTS. ONE FOR EACH CHANNEL BUF1: .BLKW MXINP$ ;TABLE OF ACTIVE OU. OF ROUND ROBIN TABLE CRRPTR: .BLKW 1 ;CUR. PTR INTO ROUND ROBIN TABLE .ENDC .IF DF,FG$ GTJBA: .BYTE 0,20 ;GET JOB ATPUT BUFR POINTERS BUF2: .BLKW MXINP$ ;TABLE OF NEXT OUTPUT BUFRS RNGBEG: .BLKW 4*MXINP$ ;RING BUFR FOR BUFRS TO PASS TO C.MREA .WORD GTJBA .BLKW 6 SYNCTL: .WORD 0,0,0,0,0 ;STORAGE FOR .SYNCH -1 0 .ENDC PROTAR: 14400 ;STORAGE AREA FOR P. OUTPTR: .BLKW MXINP$ ;TABLE OF OUTPUT BUFR CNTRS SPTAB: .BLKW MXINP$ ;TABLE OF CHNLS TO BE STOPPED STTAB: .BLKW MXINP$ ;ROTECT .BLKW 1 DLIST: .BYTE 0,14 ;ENT AR LIST .WORD DLIST1 ;ADDRESS DLIST1: ADSAD .WORD 0 ADVEC IGNORA CLKSAD .TABLE OF CHNLS TO BE STARTED CSDATA: .BLKW 1 ;WD INDICATING IF BUFFER IS PASSED AFTER ;CALL TO CSAMPL SAMFLG: .BLKW 1 WORD 0 CLKVEC IGNORI .IF DF,LPSDR$ ! DR11K$ DIVEC IGNORI DIOSAD .WORD 0 .ENDC .WORD 0 PRTFLG: .WORD 0 ;PROTE ;FLAG INDICATING SAMPLING IN PROGRESS SPCNT: .BLKW 1 ;COUNT OF CHNLS TO BE STOPPED STCNT: .BLKW 1 ;COUNT OF CHNLS TO BE SCT FLAG IGNORA: TST @#ADBUF ;CLR DONE FLAG CLR @#ADSAD ;CLR ERROR FLAG IGNORI: RTI .END TARTED STOPMK: .BLKW 1 ;BIT MASK USED TO STOP ALL CHANNELS SDIMSK: .BLKW MXINP$ ;TABLE OF BIT MSKS USED TO START CHNLS HDI.TITLE PEAK PROCESSING MODULE ;LAB-APPLICATIONS-11 ;DEC-11-SLABA-C-LA ;FILENAME PEAK.MAC ;FILE ID PEAK.1 .CSECT PEAKPR MSK: .BLKW MXINP$ ;TABLE OF BIT MSKS USED TO STOP CHNLS RNGEND: .BLKW 1 ;ADDR OF END OF RING BUFFER RNGIN: .BLKW 1 ;ADDR ;COPYRIGHT (C) 1975 ;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ;THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLYIN RING BUFR TO INPUT NEXT BUFR RNGOUT: .BLKW 1 ;ADDR IN RING BUFR OF NEXT BUFR TO PASS RNGCNT: .BLKW 1 ;COUNT OF BUFRS TO ON A ;SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLUSION ;OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANY BE PASSED IN R BUFR CSCHDN: .BLKW 1 ;COUNT OF CHNLS DONE FOR GOOD .IF DF,LPSDR$ ! DR11K$ SDOMSK: .BLKW MXINP$ ;BITS MSKSOTHER COPIES ;THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ;OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM AND TO OUTPUT WHEN EACH CHNLS STRT HDOMSK: .BLKW MXINP$ ;BIT MSKS TO OUTPUT WHEN EACH CHNL STOPS .ENDC .ENDC .EVEN .IF TO ONE WHO AGREES ;TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE SOFTWARE ;SHALL AT ALL TIMES REMAIN IN DEC. ;THE I DF,MODE2$ INTABL: .BLKW MXINP$ ;TBL OF CLK TICKS BETWEEN SAMPLING EACH CHANL CINTAB: .BLKW MXINP$ ;TBL OF CLK TICKS LEFT BEFONFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE ;WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A ;COMMITMENT BY DIGITAL EQUIPBROUTINE ; MODULE IS REQUIRED AND "MULR0$" AND "DIVR0" MUST BE DEFINED ; WHEN ASSEMBLING "GENS". .IF DF,AUTOG$ OFSET=4 IF RATE DECREASE IS NEEDED PTR=WS+2 ;PTR FOR INITIAL SIX POINTS NEEDED FOR DIGITAL FILTER CAL=PTR+2 ;LO-ORDER PART OF AREA AC .ENDC .IF NDF,AUTOG$ OFSET=2 .ENDC .SBTTL PARAMETER-VARIABLE TABLE OFFSETS ; THE FOLLOWING LIST OF OFFSETS INTOCUM. DURING SIGNAL INCREASE CAH=CAL+2 ;HI-ORDER PART OSL=CAH+2 ;LO-ORDER PART OF OLD SLOPE MINIMUM OSH=OSL+2 ;HI-ORDER PART THE PARAMETER TABLE - SCRATCH ; AREA DEFINED BY THE ADDRESS IN REGISTER FIVE(R5) WHEN "PEAK" IS ; CALLED IS USED BY THE ROUTITML=OSH+2 ;LO-ORDER PART OF CURRENT PT COUNTER TMH=TML+2 ;HI-ORDER PART CNTR2=TMH+2 ;COUNTER OF POINTS TO AVERAGE SAV0=CNTR2+MENT CORPORATION. ;DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ;ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLNE. SR=0 ;PPDENS, ORIGINAL SAMPLE RATE WT=2 ;PPWIDTH, WIDTH TEST PARAMETER GT=4 ;PPGATE, NO. OF CONSECUTIVE CHANGES TO CIED BY DEC. ;LDP SOFTWARE DEVELOPMENT JUNE 1975 .SBTTL MACROS,GLOBALS, AND CONDITIONALS .MCALL ..V2..,.REGDEF,HANGE DIRECTION HM=6 ;PPMNIN, MINIMUM CHANGE CONSIDERED AN INCREASE .IF DF,AUTOG$ AUT=10 ;PPAUTG,SET NON-ZERO FOR AUTO-GAIN$SOB,$MUL,$DIV ..V2.. .REGDEF ;EXTERNAL GLOBALS .GLOBL CTOBUF ;FROM CONTROL MODULE .GLOBL BAGET,BASIZ,BBASIZ ;FROM ED INPUT .ENDC FIRSTM=HM+OFSET ;PPINIT, SET EQUAL ZERO MEANS MODULE NOT CALLED YET EROR=FIRSTM+1 ;ERROR INDICATOR CNTR1=ERORBUFFER ALLOCATION MODULE .IF NDF,CTREL$ .GLOBL BAREL .ENDC ;INTERNAL GLOBAL .GLOBL PEAK ; THE MODULE IS VERY CONCER+1 ;NEEDED COUNTER SC=CNTR1+1 ;BASELINE TEST INCREASE COUNTER BS=SC+1 ;BASELINE SWITCH. 0=PEAK STARTED ON BASELINE ; NED WITH ONE CONDITIONAL ASSEMBLY ; PARAMETER, ; "AUTOG$". ; IF DEFINED, THE DATA WILL ALWAYS BE HANDLED IN THE PROCESSING 1=LOOK FOR PEAK WIDTH ; 2=LOOK FOR END ON BASELINE S1=BS+1 ;SWITCH SET IF DECREASING W/OUT A PREV. INCREASE S2=S1+; PORTION OF THE ROUTINE AS IF THE DATA WAS OBTAINED VIA AUTO- ; GAINING, THUS HAVING A POSSIBILITY OF EIGHTEEN(18) BIT ; SIG1 ;SWITCH SET IF INCREASING AFTER A DECRES OR BASELINE Y1=S2+2 ;FIRST POINT OF ARRAY USED FOR SMOOTHING WINDOW .IF DF,AUTOG$NIFICANCE, EVEN THOUGH THE ACTUAL DATA MAY BE EITHER ; AUTO-GAINED DATA OR 12-BIT NON-AUTO-GAINED DATA DEPENDING ; ON THE PAR Y1H=Y1+2 ;HI-ORDER PART OF FIRST POINT OF ARRAY .ENDC Y2=Y1+OFSET ;SECOND POINT OF ARRAY .IF DF,AUTOG$ Y2H=Y2+2 ;HI-ORDER AMETER "PPAUTG" IN THE PARAMETER TABLE. SEE OPERATING ; MANUAL. ; ; "CTREL$" IS ANOTHER CONDITIONAL ASSEMBLY PARAMETER ; AFOF 2ND PT .ENDC Y3=Y2+OFSET ;THIRD PT .IF DF,AUTOG$ Y3H=Y3+2 .ENDC Y4=Y3+OFSET ;FOURTH PT .IF DF,AUTOG$ Y4H=Y4+2 .ENDCFECTING THIS MODULE. IF NOT DEFINED, THE MODULE MUST RELEASE ; ITS OWN INPUT BUFFERS BEFORE RETURNING CONTROL TO THE CONTROL ; Y5=Y4+OFSET ;FIFTH PT .IF DF,AUTOG$ Y5H=Y5+2 .ENDC Y6=Y5+OFSET ;SIXTH PT .IF DF,AUTOG$ Y6H=Y6+2 .ENDC Y7=Y6+OFSET ;SEV MODULE. ; ; "EIS" IS THE ONLY OTHER CONDITIONAL ASSEMBLY PARAMETER ; AFFECTING THIS MODULE. IF NOT DEFINED, THE GENERAL SUENTH PT .IF DF,AUTOG$ Y7H=Y7+2 .ENDC DN=Y7+OFSET ;ACTUAL DENSITY OF THE POINTS IN THE PROCESS WS=DN+2 ;SWITCH TO DOUBLE DN;HI-ORDER PART .ENDC SLL=BM+OFSET ;LO-ORDER PART OF NEW OR CURRENT SLOPE*1000 SLH=SLL+2 ;HI-ORDER PART OAL=SLH+2 ;LO-ORDER PI/O IS TREATED IN THIS WAY. PEAK: CLRB NDFLG ;CLEAR END FO INPUT FLAG TST +2(R1) ;IS THIS A LAST BUFFER .ENABL LSB ART OF AREA OAH=OAL+2 ;HI-ORDER PART PH=OAH+2 ;PEAK HEIGHT (SAVED FOR OUTPUT) .IF DF,AUTOG$ PHH=PH+2 ;HIGH ORDER PART OF PEA BMI 3$ ;IF NOT, B+C BNE 2$ ;IF INPUT BUFFER NOT EMPTY, B+C JMP ENDATA ;GO PASS LAST OUTPUT BUFFER 2$: DECB NDFLG ;INDIK HEIGHT .ENDC PTL=PH+OFSET ;LO-ORDER PART OF TIME OF PEAK (SAVED FOR OUTPUT) PTH=PTL+2 ;HI-ORDER PART LMH=PTH+2 ;LEADING MICATE END OF INPUT NEG +2(R1) ;IF NOT, GET BUFFER SIZE 3$: MOV (R1)+,INADDR ;FREE REGS OF BUFFER INFORMATION .IF NDF,CTRENIMUM HEIGHT(SAVED FOR OUTPUT) .IF DF,AUTOG$ LMHH=LMH+2 ;HI-ORDER PART .ENDC LMTL=LMH+OFSET ;LO-ORDER PART OF TIME OR LEADINL$ MOV INADDR,SINADR ;SAVE INPUT BUFFER ADDRESS .ENDC MOV (R1),INCNT MOV R0,OUTADR TSTB FIRSTM(R5) ;IS THIS THE FIRSG MINIMUM LMTH=LMTL+2 ;HI-ORDER PART WDL=LMTH+2 ;LO-ORDER PART OF WIDTH(IN SAMPLE CNTS) WDH=WDL+2 ;HI-ORDER PART MN=WDH+2 ;T CALL BEQ 4$ ;IF YES, B+C JMP RESUME ;RESUME WHERE WE LEFT OFF ;COMES HERE ONLY ONCE AT THE FIRST CALL TO ;INITITRAILING MINIMUM .IF DF,AUTOG$ MNH=MN+2 ;HI-ORDER PART .ENDC MTL=MN+OFSET ;LO-ORDER PART OF TIME OF TRAILING MINIMUM MTH=MTALIZE VARIABLES AND PROCESSING 4$: MOVB #1,FIRSTM(R5) ;IND. MODULE ENTERED AT LEAST ONCE CLRB EROR(R5) ;CLEAR ERROR INDICAT2 ;WORD TO STORE R0 WHILE WAITING FOR NEXT INPUT BUFFER SAV1=SAV0+2 ;WORD TO STORE R1 SAV6=SAV1+2 ;WORD TO STORE SP MC=SAV6+2L+2 ;HI-ORDER PART TYPE=MTH+2 ;OUTPUT PEAK TYPE INDICATOR ; =0, IMPLIES PEAK ENDED ON BASELINE ; =1, IMPLIES PEAK ENDED O ;TEMPORARY COUNTER FOR # OF MINS FOUND CC=MC+2 ;TEMPORARY COUNTER FOR # OF MAXS FOUND MX=CC+2 ;CURRENT MAXIMUM .IF DF,AUTON VALLEY .SBTTL PEAK ENTRY POINT ;R5 CONTAINS ADDRESS OF START OF PARAMETER-VARIABLE TABLE FOR ; PERTAINENT DATA PATHG$ MXH=MX+2 ;HIGH ORDER PART OF CURRENT MAXIMUM .ENDC KM=MX+OFSET ;LAST CREST HEIGHT .IF DF,AUTOG$ KMH=KM+2 ;HIGH ORDER PAR. ;R1 SHOULD CONTAIN THE ADDRESS OF THE ADDRESS OF THE INPUT BUFFER ; (R1)+2 SHOULD CONTAIN THE NUMBER OF ELEMENTS IN THE T .ENDC KH=KM+OFSET ;HEIGHT OF LAST PEAK CREST .IF DF,AUTOG$ KHH=KH+2 ;HI-ORDER PART OF HEIGHT OF LAST PEAK CREST .ENDC KCINPUT ; BUFFER. IF NEGATIVE, THIS IS NOT THE LAST INPUT BUFFER AND ; THE ABSOLUTE VALUE OF THIS NUMBER IS THE WORD COUNL=KH+OFSET ;LO-ORDER PART OF TIME OF LAST PEAK CREST KCH=KCL+2 ;HI-ORDER PART CTL=KCH+2 ;LO-ORDER PART OF TIME OF LATEST MAXIMT FOR THE ; BUFFER. ;R0 SHOULD CONTAIN THE ADDRESS OF THE PRESENT POINTER INTO THE ; OUTPUT BUFFER. IF ZERO, NO OUTPUTUM CTH=CTL+2 ;HI-ORDER PART KTL=CTH+2 ;LO-ORDER PART OF PEAK LEADING MINIMUM TIME KTH=KTL+2 ;HI-ORDER PART BTL=KTH+2 ;LO-ORD BUFFER HAS YET BEEN ; ALLOCATED. (R0)+2 SHOULD CONTAIN THE COUNT OF THE NUMBER ; OF EMPTY ENTRIES LEFT IN THE OUTPUT BER PART OF LEADING BASELINE MINIMUM TIME BTH=BTL+2 ;HI-ORDER PART BM=BTH+2 ;LEADING BASELINE MINIMUM .IF DF,AUTOG$ BMH=BM+2 UFFER. ALL BUFFERS ; ARE OF SIZE "BASIZ". ;R0 AND R1 ARE ASSUMED TO HAVE BEEN PROVIDED BY THE ; "CONTROL MODULE" AND DD #Y1,PTR(R5) ; OF FIRST AVERAGED ELEMENT MOVB #6,CNTR1(R5) ;GET CNT OF AVERAGED ELEMENTS NEEDED ;GET FIRST SIX AVERAGE HALVES .ENDC ASL R3 .IF DF,AUTOG$ ROL R2 .ENDC ASL R3 .IF DF,AUTOG$ ROL R2 .ENDC SUB R0,R3 ;TD POINTS FOR DIGITAL FILTER. FIRST6: JSR PC,NEXTPT ;GET NEXT AVERAGED POINT MOV R0,@PTR(R5) ;STORE LOW ORDER RESULT ADDERM2 - TERM1 SBC R2 .IF DF,AUTOG$ SUB R1,R2 .ENDC MOV Y5(R5),R0 ; + 11 * (Y5 + Y3) ADD Y3(R5),R0 .IF DF,AUT #2,PTR(R5) ;POINT TO NEXT LOC .IF DF,AUTOG$ MOV R1,@PTR(R5) ;STORE HIGH ORDER RESULT ADD #2,PTR(R5) ;POINT TO NEXT LOC OG$ MOV Y5H(R5),R4 ADC R4 ADD Y3H(R5),R4 .ENDC MOV #11.,R1 JSR PC,MULUNS ADD R1,R3 ADC R2 ADD R0,R2 .IF .ENDC DECB CNTR1(R5) ;HAVE THE 1ST 6 AVERAGED POINTS BEEN CAL BNE FIRST6 ;IF NOT , B+C ;START OF NEW PEAK N2DF,AUTOG$ MOV R4,R0 $MUL #11.,R0 ADD R1,R2 .ENDC MOV Y4(R5),R0 ; + 14 * Y4 MOV #14.,R1 JSR PC,MULUNS ADD R1,R47: MOVB #1,S1(R5) ;SET DECREASING WITHOUT INCREASE CLR MC(R5) ;CLR MINIMUM COUNTER CLR CC(R5) ;CLR MAXIMUM COUNTER CLRB3 ADC R2 ADD R0,R2 .IF DF,AUTOG$ MOV Y4H(R5),R0 $MUL #14.,R0 ADD R1,R2 MOV R2,R0 MOV R3,R1 MOV #42.,R3 ;[-( S2(R5) ;SET NOT INCREASING AFTER A DECREASE MOV #77777,MN(R5) ;SET MINIMUM TO LARGE NO. MOV #100000,MX(R5) ;SET MAXIMUN TOY1+Y7)+4*(Y2+Y6)+11.*(Y3+Y5)+14.*Y4]/ CLR R2 ; 42. JSR PC,DDIVD MOV R1,Y4(R5) ;STORE NEW FILTERED POINT MOV R0,Y VERY LOW NO. .IF DF,AUTOG$ MOV #77777,MNH(R5) ;FINISH SETTING MINIMUM MOV #100000,MXH(R5) ;FINISH SETTING MAXIMUM .EN4H(R5) .ENDC .IF NDF,AUTOG$ MOV R2,R0 MOV R3,R1 $DIV #42.,R0 ;[-(Y1+Y7)+4*(Y2+Y6)+11.*(Y3+Y5)+14.*Y4]/ ; DC ;GETTING NEXT POINT N100: ADD WS(R5),DN(R5) ;UPDATE SAMPLES TO AVERAGE .ENABL LSB BCC 1$ ;IF SAM. RATE IS TOO LAR 42. MOV R0,Y4(R5) ;STORE NEW FILTERED POINT .ENDC ;END OF ALGORITHM FOR DIGITAL FILTER GE JMP ENDATB ;EXIT 1$: CLR WS(R5) ;CLEAR CHANGE SAMPLE RATE INDICATOR ADD DN(R5),TML(R5) ;UPDATE CURRENT TIME ADC TMH( ;SHIFT POINTS FOR ALGORITHM DOWN ONE MOV R5,R4 ;SET Y(I) = Y(I+1) ADD #Y1,R4 .IF NDF,AUTOG$ MOV #6,R3 .ENDC OR CLRB SC(R5) ;CLEAR FLAGS. BASELINE SLOPE CHANGE CNTR CLRB BS(R5) ;BASLINE SWITCH CLR CAL(R5) ;ACC. AREA DURING INCRER5) JSR PC,NEXTPT ;GET NEXT AVERAGED POINT MOV R0,Y7(R5) ;STORE LOW PART OF VALUE .IF DF,AUTOG$ MOV R1,Y7H(R5) ;STORE ASE CLR CAH(R5) MOV #77777,OSH(R5) ;SET SLOPE TO LARGE NO. MOV #177777,OSL(R5) ; CLR WS(R5) ;RATE CHANGE SWITCH MOV SHI PART OF VALUE .ENDC ;START OF ALGORITHM FOR DIGITAL FILTER MOV Y7(R5),R0 ;ALGORITHM FOR GETTING CNTR WGTD VALUE AR(R5),DN(R5) ;TAKE SAMPLE RATE FROM TABLE MOV DN(R5),TML(R5) ;SET UP CURRENT TIME(IN SAMPLE PERIODS) CLR TMH(R5) ;CLEAR HIGDD Y1(R5),R0 ; -(Y1+Y7) .IF DF,AUTOG$ MOV Y1H(R5),R1 ADC R1 ADD Y7H(R5),R1 ; MOST SIG. HALVES .ENDC CLR H PART OF TIME ASL TML(R5) ; ROL TMH(R5) ADD DN(R5),TML(R5) ADC TMH(R5) ;TIME=3*DENSITY MOV R5,PTR(R5) ;GET ADDR AR2 MOV Y6(R5),R3 ;+ 4(Y6+Y2) ADD Y2(R5),R3 .IF DF,AUTOG$ ADC R2 ADD Y6H(R5),R2 ADD Y2H(R5),R2 ; MOST SIG.) ;COMP. CENTER VALUE TO CURRENT MIN BLT 2$ BEQ 3$ ;IF EQUAL, CHECK LO-ORDER JMP N150 ;IF GREATER THAN OR EQUAL, B+C .BY MOV DN(R5),R1 ; CENTERED PT. * SAMPLE RATE JSR PC,MULUNS ADD R1,OAL(R5) ADC R0 ADD R0,OAH(R5) .IF DF,AUTOG$ ENDC 3$: CMP Y3(R5),MN(R5) ;CMPARE CENTER VALUE TO CURRENT MIN BLO 2$ JMP N150 ;IF GREATER THAN OR EQUAL, B+C ;NEW POMOV Y3H(R5),R0 $MUL DN(R5),R0 ADD R1,OAH(R5) .ENDC ADD CAL(R5),OAL(R5) ; AND INCREASE ACC. AREA BY AREA ACC. ADC OAHINT LOWER THAN MINIMUM 2$: CMPB #1,BS(R5) ;ARE WE LOOKING FOR PEAK WIDTH BNE N117 ;IF NOT, B+C MOV KH(R5),R1 ;IF SO, CHE(R5) ; DURING INCREASE ADD CAH(R5),OAH(R5) .ENABL LSB TSTB BS(R5) ;IS PEAK START ON BASELINE? BNE 1$ ;IF NOT, B+C CK IF LOW ENOUGH TO ADD KM(R5),R1 ; CALCULATE PEAK WIDTH .IF DF,AUTOG$ MOV KHH(R5),R0 ADC R0 ADD KMH(R5),R0 ASR R TSTB S1(R5) ;ARE WE ON BACK SIDE OF PEAK BEQ 1$ ;IF NOT, B+C CLR OAH(R5) ;IF SO, ZERO ACC. AREA CLR OAL(R5) 1$: CLR C0 ;CAL (KM+KH)/2 .ENDC ROR R1 ;(KM+KH)/2 = TERM .IF DF,AUTOG$ CMP Y3H(R5),R0 ;IS CENTERED PT > TERM BGT N117 ;IAH(R5) ;CLEAR ACC. AREA DURING INCREASE CLR CAL(R5) CMP MC(R5),GT(R5) ;COMPARE #MINS TO GATE BGE 2$ ;IF GREATER OR EQUALF SO, B+C BLT 4$ ;IF LESS, B+C .ENDC CMP Y3(R5),R1 ;IS CENTERED PT > TERM BHI N117 ;IF SO, B+C 4$: MOV TMH(R5),R0 ;, B+C JMP N100 ;OTHERWISE 2$: INCB S1(R5) ;INDICATE NOT ON BACKSIDE CLR CC(R5) ;CLEAR MAXIMUMS COUNTER TSTB S2(R5) ;WOTHERWISE, CALCULATE 1/2WID AT 1/2HT MOV TML(R5),R1 SUB KCH(R5),R0 SUB KCL(R5),R1 SBC R0 MOV R0,WDH(R5) ;SET WIDTH MAS THERE AN INCR. AFTER A DECR. OR BASL BNE 3$ ;IF SO, B+C MOV #100000,MX(R5) ;IF NOT, SET MAX LARGE NEG NUM .IF DF,AUOV R1,WDL(R5) INCB BS(R5) ;INDICATE LOOKING FOR END PEAK ON BASLIN $DIV DN(R5),R0 ;IS WIDTH LESS THAN 25 PTS CMP R0,#25. TOG$ MOV #100000,MXH(R5) .ENDC JMP N200 3$: MOV CTL(R5),PTL(R5) ;RECORD PEAK TIME MOV CTH(R5),PTH(R5) MOV KTL(R5),L BLT N117 ;IF SO , B+C MOV Y5(R5),R1 ;OTHERWISE, ADD 1/2 Y5 TO ACC. AREA .IF NDF,AUTOG$ ASR R1 .ENDC .IF DF,AUMTL(R5);RECORD LEADING MINIMUM TIME MOV KTH(R5),LMTH(R5) MOV MX(R5),PH(R5) ;RECORD PEAK HEIGHT MOV KM(R5),LMH(R5) ;RECORD TOG$ MOV Y5H(R5),R0 ASR R0 ROR R1 .ENDC ADD R1,OAL(R5) ;ADJUSTING ACC. AREA FOR STEP CHANGE ADC OAH(R5) .IF DLEADING MINIMUM HEIGHT .IF DF,AUTOG$ MOV MXH(R5),PHH(R5) ;RECORD PEAK HEIGHT(MSH) MOV KMH(R5),LMHH(R5);RECORD LEADING MIF,AUTOG$ ADD R0,OAH(R5) .ENDC MOV DN(R5),WS(R5) ;SET SWITCH TO HALVE SAMPLE RATE JSR PC,OUTSRC ;OUTPUT SAMPLE RATE CHANIMUM HEIGHT(MSH) .ENDC MOVB #1,BS(R5) ;IND. LOOKING FOR PEAK WIDTH MOV CTL(R5),KCL(R5) ;KEEP TIME OF LASTEST MAX MOV NGE BLOCK N117: MOV Y3(R5),MN(R5) ;RECORD CURRENT MINIMUM VALUE .IF DF,AUTOG$ MOV Y3H(R5),MNH(R5) .ENDC MOV TMH(R5CTH(R5),KCH(R5) MOV MX(R5),KH(R5) ;KEEP VALUE OF LATEST MAX .IF DF,AUTOG$ MOV MXH(R5),KHH(R5) .ENDC JMP N247 ;PR .IF DF,AUTOG$ MOV #14,R3 .ENDC .ENABL LSB 1$: MOV OFSET(R4),(R4)+ $SOB R3,1$ .IF DF,AUTOG$ CMP Y3H(R5),MNH(R5),MTH(R5) ;RECORD CURRENT PT COUNTER MOV TML(R5),MTL(R5) INC MC(R5) ;INC MINS FOUND COUNTER MOV Y3(R5),R0 ;INC ACC. AREA LEADING MINIMUM TIME MOV MTH(R5),KTH(R5) MOV MN(R5),KM(R5) ;RECORD PEAK LEADING MINIMUM .IF DF,AUTOG$ MOV MNH(R5),KMHSIDE OF PEAK BEQ 2$ ;IF NOT, GO GET NEXT POINT MOV WDH(R5),R0 $MUL WT(R5),R0 ;CAL WIDTH*WIDTH TEST MOV R1,R3 MOV WDL((R5) .ENDC .ENABL LSB CMPB #1,BS(R5) ;DETERMINE WHAT TO DO BY WHERE WE ARE BLE 1$ ;IF NOT STARTING ON BASELINE,END OR5),R0 ;IF SO, TEST TO SEE IF FAR ENOUGH PAST MOV WT(R5),R1 ; TO START LOOKING FOR BASELINE JSR PC,MULUNS ADD R3,R0 MOVEPARE FOR NEXT PEAK ;NEW POINT LARGER THAN CURRENT MINIMUM N150: MOV Y3(R5),R0 ;UPDATE AREA ACC. DURING INCR BY MOV DN(RF PEAK MOV KTL(R5),BTL(R5) ;IF STARTING ON BASELINE, RECORD NEW MOV KTH(R5),BTH(R5) ; BASELINE TIME AND MOV KM(R5),BM(R55),R1 ;CURRENT AREA JSR PC,MULUNS ADD R1,CAL(R5) ADC R0 ADD R0,CAH(R5) .IF DF,AUTOG$ MOV Y3H(R5),R0 $MUL DN(R5),) ; HEIGHT .IF DF,AUTOG$ MOV KMH(R5),BMH(R5) .ENDC JMP N160 1$: BNE 2$ ;IF NOT LOOKING FOR WIDTH, B+C MOV MTL(RR0 ADD R1,CAH(R5) .ENDC MOV MX(R5),R1 ;CHECK IF NEW PT. SIGNIFICANTLY INCREASED ADD HM(R5),R1 ; OVER LATEST MAX .ENA5),R1 ;OTHERWISE,MUST CAL. PEAK WIDTH NOW MOV MTH(R5),R0 ; SINCE PEAK HAS ENDED BEFORE SUB KCH(R5),R0 ; HALF HEIGHT WAS RBL LSB .IF DF,AUTOG$ MOV MXH(R5),R0 ADC R0 CMP Y3H(R5),R0 BGT 1$ BLT 2$ .ENDC CMP Y3(R5),R1 BHI 1$ 2$: JEACHED SUB KCL(R5),R1 SBC R0 ASR R0 ROR R1 ;WIDTH EQUALS 1/2(MIN TIM - LEAD MIN TIM) MOV R0,WDH(R5) ;SET WIDTH MOV MP N200 1$: MOV TML(R5),CTL(R5) ;IF INCREASE IS SIGNIFICANT, UPDATE MAX MOV TMH(R5),CTH(R5) ; INFORMATION INC CC(R5) ;UPDR1,WDL(R5) 2$: CLR TYPE(R5) ;IND. NOT ON BASELINE JSR PC,OUTPUT ;OUTPUT PEAK DATA MOVB #2,BS(R5) ;IND. LOOKING FOR END ON BATE TIME,MAXS FOUND COUNT, MOV Y3(R5),MX(R5) ; AND HEIGHT .IF DF,AUTOG$ MOV Y3H(R5),MXH(R5) .ENDC CMP CC(R5),GT(R5ASELINE MOV WDL(R5),R1 ;CHECK WIDTH MOV WDH(R5),R0 $DIV DN(R5),R0 CMP #25.,R0 BLE 4$ ;IF WIDER THAN 24 PTS, GO LOWE) ;CMPARE #MAXS TO GATE VALUE BGE 3$ ;IF HIGH ENOUGH, B+C JMP N200 ;OTHERWISE WAIT 3$: CLR MC(R5) ;CLR MINS COUNTER TSR SAMP RATE JMP N160 4$: MOV Y3(R5),R1 ;CORRECT ACC AREA BY 1/2 CENTERED PT HT .IF NDF,AUTOG$ ASR R1 .ENDC .IF DTB S1(R5) ;ARE WE ON BACKSIDE OF PEAK BNE 4$ ;IF SO, B+C JMP N160 ;OTHERWISE 4$: MOV MN(R5),R0 ;UPDATE AREA ACC. DURING F,AUTOG$ MOV Y3H(R5),R0 ASR R0 ROR R1 ADD R0,OAH(R5) .ENDC ADD R1,OAL(R5) ADC OAH(R5) JSR PC,OUTSRC ;OUTPUT BLINCR. BY MOV DN(R5),R1 ; 1/2 LEADING MINIMUM * SAMPLE RATE JSR PC,MULUNS .IF DF,AUTOG$ MOV R1,R3 MOV R0,R2 MOV MNOCK INDICATINE SAMPLE RATE MOV DN(R5),WS(R5) ; CHANGE. SET SWITCH TO CHANGE SAMP RATE ;LOOKING FOR BASELINE N160: MOV MX(H(R5),R0 $MUL DN(R5),R0 ADD R0,R3 MOV R3,R1 MOV R2,R0 .ENDC ASR R0 ROR R1 ADD R1,CAL(R5) ;UPDATE AREA ADC R0R5),MN(R5) ;SET CURRENT MAX TO CURRENT MIN .IF DF,AUTOG$ MOV MXH(R5),MNH(R5) .ENDC N200: CMPB #2,BS(R5) ;HAS THE WIDT ADD R0,CAH(R5) INCB S2(R5) ;IND INCREASE AFTER DECREASE CLRB S1(R5) ;IND NO DECREASE MOV MTL(R5),KTL(R5) ;RECORD PEAKH BEEN CALCULATED YET .ENABL LSB BEQ 1$ ;IF SO, B+C 2$: JMP N100 ;IF NOT, GO GET NEXT PT 1$: TSTB S1(R5) ;IS PT ON BACKOV R0,R4 MOV R1,R3 MOV R2,R0 $MUL #1000.,R0 ADD R3,R0 MOV R0,R1 MOV R4,R0 .ENDC MOV TML(R5),R3 ; (CURBUFFER 20$: MOV R0,SAV0(R5) ;SAVE APPROPRIATE INFO MOV R1,SAV1(R5) MOV (SP)+,SAV6(R5) CLC ;INDICATE NO ERRORS .IF NRENT TIME-LEADING BASELINE MOV TMH(R5),R2 ; TIME) SUB BTH(R5),R2 SUB BTL(R5),R3 SBC R3 JSR PC,DDF,CTREL$ JMP ENDATC ;GO RELEASE INPUT BUFFER AND RETURN .ENDC .IF DF,CTREL$ RTS PC ;RETURN TO CONTROL MODULE .ENDDIVD TSTB SIGN BEQ 9$ NEG R0 ;IF SIGNS DIFFERED, SLOPE NEGATIVE NEG R1 SBC R0 9$: MOV R0,SLH(R5) MOV R1,SLL(R5) C RESUME: MOV SAV0(R5),R0 ;RESTORE APPROPRIATE INFO MOV SAV1(R5),R1 MOV SAV6(R5),-(SP) MOV INADDR,R2 ;GET ADDR OF INPUTCMP OSH(R5),SLH(R5) ;COMPARE TO OLD SLOPE BGT 10$ ;IF OLD GREATER, GO UPDATE AND TRY AGAIN BLT 11$ ;IF OLD IS LESS, CHECK BUFFER INC INCNT NEXTC: MOV (R2)+,R3 ;GET NEXT DATUM .ENABL LSB .IF DF,AUTOG$ TST AUT(R5) BEQ 5$ ;IF NOT, B+C IF BASELINE CMP OSL(R5),SLL(R5) ;COMPARE TO LSH TO OLD SLOPE BLOS 11$ ;IF OLD IS LESS, CHECK IF BASELINE 10$: MOV SLL(R5),MOV -2(R2),-(SP) ;GET GAIN BITS BIC #7777,(SP) BIC (SP),R3 ;GET RID OF GAIN BITS IN DATA CLR R4 ;GET MSH READY SUB #40 TML(R5),R3 ;CAL TIME FROM CREST TO CURRENT POINT MOV TMH(R5),R2 SUB KCH(R5),R2 SUB KCL(R5),R3 SBC R2 CMP R2,R0 ;COMPOSL(R5) ;SET OLD TO NEW MOV SLH(R5),OSH(R5) CLRB SC(R5) ;CLEAR SLOPE INCR COUNTER JMP N100 ;GO GET NEXT POINT 11$: INCBARE TWO CALCULATED QUANTITIES BGT 4$ ;IF FIRST IS GREATER, B+C BEQ 3$ ;IF HIGH PARTS EQUAL, GO CHECK LO PARTS 5$: JMP N10 SC(R5) ;INCRE SLOPE INCR COUNTER CMPB #2,SC(R5) ;HAS SLOPE INCR TWICE IN A ROW BGE 12$ ;IF SO, B+C JMP N100 ;OTHERWISE0 ;IF FIRST IS LESS, GO GET NEXT POINT 3$: CMP R3,R1 ;COMPARE LSH OF TWO CAL. QUANTITIES BLO 5$ ;IF FIRST IS LESS, GO GET , GO GET NEXT POINT 12$: MOV #1,TYPE(R5) ;IND. ENDING PEAK ON BASELINE JSR PC,OUTPUT ;OUTPUT PEAK DATA BLOCK CLRB SC(R5) ;NEXT POINT 4$: MOV Y3(R5),R0 ;OTHERWISE, CALCULATE CURRENT SLOPE CLRB SIGN ; CLEAR SIGN FLAG SUB BM(R5),R0 ;SLOPE = (CURRECLEAR SLOPE INCR. COUNTER MOV #77777,OSH(R5) ;SET SLOPE TO LARGE NO. CLRB BS(R5) ;SET FLAG TO INDICATE STARTING AT BASELIN NT POINT-LEADING BASELINE ; MINIMUM)/ .IF DF,AUTOG$ MOV Y3H(R5),R2 SBC R2 SUB BMH(R5),R2 BP JMP N100 ;GO GET NEXT POINT .SBTTL UTILITIES ;ROUTINE TO GET NEXT AVERAGED POINT NEXTPT: MOV DN(R5),CNTR2(R5) ;GEL 55$ ;IF POSITIVE, B+C INCB SIGN ;OTHERWISE, INDICATE SIGN CHANGE NEG R2 NEG R0 SBC R2 55$: TST R2 ;CHECK FOR ZERO T NO.OF PTS TO AVERAGE MOV INADDR,R2 ;GET INPUT TABLE ADDRESS CLR R0 ;GET SUM READY CLR R1 .IF DF,AUTOG$ CLR R4 SLOPE BNE 7$ .ENDC .IF NDF,AUTOG$ BGE 6$ ;IF POSITIVE, B+C INCB SIGN ;OTHERWISE, INDICATE SIGN CHANGE NEG R0 .ENDC NEXTIN: INC INCNT ;DECR INPUT BUFR CNT .ENABL LSB BLE NEXTC ;IF NOT EMPTY , CONTINUE TSTB NDFLG ;CHECK FOR LAS.ENDC 6$: TST R0 ;CHECK FOR ZERO SLOPE BEQ 9$ ;IF NON-ZERO , B+C 7$: MOV #1000.,R1 JSR PC,MULUNS .IF DF,AUTOG$ MT BUFFER BEQ 20$ ;IF NOT A LAST BUFFER, B+C TST (SP)+ ;FORGET WHERE WE CAME FROM JMP ENDATB ;IF IT IS, RELEASE OUTPUT N SAMPLES AVERAGED .IF DF,AUTOG$ CLR R2 ;DIVID R0,R1 BY R2,R3. RESULT IN R0,R1 JSR PC,DDIVD MOV R0,-(SP) MOV R1,R0LUE MOV MN(R5),R0 MOV R2,R1 JSR PC,MULUNS ADD R1,OAL(R5) ADC R0 ADD R0,OAH(R5) .IF DF,AUTOG$ MOV MNH(R5),R0 MOV (SP)+,R1 .ENDC .IF NDF,AUTOG$ $DIV R4,R0 ;DIVD R0,R1 BY R4. RESULT R0 .ENDC RTS PC ;ROUTINE TO GET THE$MUL R2,R0 ADD R1,OAH(R5) .ENDC .ENABL LSB JSR PC,GETBUF ;GET OUTPUT BUFR ADDR IN R2,WD CNT ADR R0 BCC 1$ ;IF NO ER CURRENT OUTPUT BUFR POINTER,RETURNED IN ; R2, AND ADDRESS OF COUNT OF OUTPUT SPACE LEFT, RETURNED IN R0 GETBUF: CLC ;INDROR, B+C TST (SP)+ .IF NDF,CTREL$ JMP ENDATC ;GO RELEASE INPUT BUFFER AND RETURN .ENDC .IF DF,CTREL$ RTS PC .. NO ERROR .ENABL LSB 1$: MOV OUTADR,R0 ;GET ADDR OF ADDR OF OUTPUT BUFFER MOV (R0)+,R2 ;GET ADDR OF OUTPUT BUFFER BNE 2$ENDC 1$: MOV #OAL,R4 ;GET ADDR OF OUTPUT BLOCK ADD R5,R4 .IF DF,AUTOG$ MOV #17.,R3 ;GET BLOCK LENGTH .ENDC .I ;IF IT EXITS, B+C MOV BASIZ,(R0) ;SET WORD CNT TO BUFFER SIZE TST -(R0) ;GET ADDR OF ADDR OF OUTPUT BUFFER JSR PC,BAGETF NDF,AUTOG$ MOV #14.,R3 ;GET BLOCK LENGTH .ENDC 3$: TST (R0) ;IS THERE ROOM FOR MORE IN OUT BUFR BNE 2$ ;IF SO, B+C ;OTHERWISE, GET AN OUTPUT BUFFER BCC 1$ ;IF ALLS WELL, B+C CLRB FIRSTM(R5) ;IF NOT, IND. NEXT DATA RECEIVED FOR THIS INC JSR PC,PASBUF ;IF NOT, PASS THIS ONE AND GET NEW ONE 2$: MOV (R4)+,(R2)+ ;PUT OUTPUT BLOCK IN OUTPUT BUFFER DEC (R0) ;DECB EROR(R5) ;INDICATE ERROR SEC ; CHANL TO BE TREATED AS INITIAL DATA. 2$: RTS PC ;INDICATE ERROR AND RETURN ;ROUTINE R BUFR WORD CNT $SOB R3,3$ ;DECR BLOCK WORD CNT. B+C IF NOT ZERO MOV R2,-(R0) ;STORE CURRENT BUFFER POINTER CLR OAL(R5) TO PASS FULL OUTPUT BUFFER TO CONTROL MODULE ; ROUTINE ALSO CALLS GETBUF TO GET NEW OUTPUT BUFFER PASBUF: MOV BASIZ,(R0) ;S;CLEAR AREA CLR OAH(R5) RTS PC ;ROUTINE TO OUTPUT -1, INDICATING A CHANGE OF SAMPLE RATE OUTSRC: MOV #2,R3 ;OUTPUT D00,R3 ;GET IN RIGHT RANGE(SHOULD NOT BE NEG) SBC R4 ;GET RIGHT SIGN(SHOULD BE POSITIVE) SWAB (SP) ;PUT IN RIGHT JUSTIFIED ET LBI TO BUFR SIZE .ENABL LSB SUB BBASIZ,R2 ;GET BEGIN BUFR ADDR NEG (R0) ;INDICATE NOT LAST BUFR MOV R2,-(R0) ;RESTORPOSITION ASR (SP) ASR (SP) ASR (SP) COM (SP) ;GET COMPLEMENT,I.E., # OF SHIFTS BIC #177771,(SP) ;IN 2 LEAST SIGN. BE BUFR ADDR JSR PC,CTOBUF ;PASS BUFR BCC 3$ ;IF ALL'S WELL, B+C CLR FIRSTM(R5) ;INDICATE IN INITIAL STATE 4$: TST (SP)+ ITS BEQ 2$ ;IF DONE, B+C 4$: ASL R3 ;NORMALIZE VALUE ROL R4 DEC (SP) ;MORE SHIFTS 2$: BNE 4$ ;IF SO, B+C TST (SP)+ ;OTHERWISE, QUIT TST (SP)+ .IF NDF,CTREL$ JMP ENDATC ;GO RELEASE INPUT BUFFER AND RETURN .ENDC .IF DF,CTREL$ R ;POP STACK .ENDC 5$: ADD R3,R1 ;KEEP SUMMING ADC R0 .IF DF,AUTOG$ ADD R4,R0 ;ADD MSH .ENDC DEC CNTR2(R5) ;STS PC .ENDC 3$: JSR PC,GETBUF ;GET ANOTHER OUTPUT BUFR BCS 4$ ;IF NO AVAILABLE BUFFERS, QUIT RTS PC ;ROUTINE TO OUHOULD MORE BE SUMMED BNE NEXTIN ;IF SO , B+C MOV R2,INADDR ;SAVE CURRENT ADDRESS OF INPUT BUFFER MOV DN(R5),R3 ;GET NO. ITPUT A BLOCK OF PEAK DATA. OUTPUT: MOV DN(R5),R2 ;CORRECT AREA BY 1/2 SAMPLE RATE * ASR R2 ; LEADING MIN VA #-1,(R2)+ ;STORE RATE CHNGE INDICATOR DEC (R0) ;DEC OUT BUF WD CNT $SOB R3,1$ ;DOUBLE OUTPUT MOV R2,-(R0) ;STORE CURRENSULTS IN R0 AND R1 MULUNS: .ENABL LSB MOV R3,-(SP) ;SAVE REGS 2 AND 3 MOV R2,-(SP) MOV #100000,R3 ;R3 CONTAINS COMPLET BUFFER POINTER RTS PC ;ROUTINE TO OUTPUT LAST BUFFER ENDATB: MOV OUTADR,R0 ;GET ADDR OF ADDR OF OUTPUTBUFR ENDATA: MTION FLAG CLR R2 ;R2 WILL CONTAIN HIGH ORDER PRODUCT 1$: ROR R1 ;C = MULTIPLIER BIT BCC 2$ ;BR IF ZERO MULTIPLIER BIT OV +2(R0),R1 ;GET BUFFER WORD CNT .ENABL LSB BNE 1$ ;IF USED, SOMETHING IS IN IT COM (R0) ;OTHERWISE, SET PHONY BUFR ADDADD R0,R2 ;BIT MULTIPLY 2$: ROR R2 ;SHIFT HIGH ORDER ROR R3 ;THE LOW ORDER & COMPLETION FLAG BCC 1$ ;BR IF MULTIPLICATIR(-1) BR 2$ 1$: SUB BASIZ,R1 ;GET NEG COUNT OF BUFR ELEMENTS ASL R1 ;GET NEG BYTE COUNT ADD R1,(R0)+ ;RESET BUFR ADDR TOON IS NOT COMPLETE MOV R2,R0 ;LEAVE RESULT IN R0 & R1 MOV R3,R1 MOV (SP)+,R2 ;RESTORE REGISTERS MOV (SP)+,R3 RTS PC START OF BUFR ASR R1 ;GET NEG COUNT OF BUFR ELEMENTS NEG R1 ;GET POS COUNT OF BUFR ELEMENTS MOV R1,(R0) ;STORE FOR LBI NDFLG: .BYTE 0 ;END FLAG, SET IF INPUT BUFR IS A LAST BF SIGN: .BYTE 0 ;USED TO DETERMINE SIGN OF SLOPE INADDR: .WORD 2$: JSR PC,CTOBUF ;PASS BUFFER CLRB FIRSTM(R5) ;INDICATE IN INITIAL STATE .IF NDF,CTREL$ ENDATC: ROR -(SP) ;SAVE CARRY 0 ;CONTAINS POINTER IN CURRENT INPUT BUFFER ;TO NEXT INPUT DATUM INCNT: .WORD 0 ;CONTAINS COUNT OF DATA LEFT IN IN BU MOV SINADR,R0 ;GET INPUT BUFFER ADDRESS JSR PC,BAREL ;RELEASE IT ROL (SP)+ ;RESTORE CARRY .ENDC RTS PC ;RETURN FFER OUTADR: .WORD 0 ;CONTAINS ADDRESS OF ADDRESS OF OUTPUT ;BUFFER POINTER .IF NDF,CTREL$ SINADR: .WORD 0 ;ADDRES ;ROUTINE TO DIVIDE R0, R1 BY R2, R3 WITH RESULT IN R0,R1 DDIVD: MOV R5,-(SP) ;SAVE R5 MOV #32.,-(SP) ;GET LOOP COS TO SAVE INPUT BUFFER ADDRESS .ENDC .END UNT CLR R4 ;READY REMAINDER(R4+R5) CLR R5 .ENABL LSB 1$: ROL R1 ROL R0 ;EXPOSE NEW BIT OF NEWMERATOR ROL R4 ROL R5 CMP R2,R5 ;DOES DENOMINATOR FIT BHI 3$ ;IF NOT, B+C(CARRY = 0) BLT 2$ ;IF SO, B+C CMP R3,R4 ;IF HIGH EQUAL, CHECK .TITLE SWEEP SAMPLING MODULE ;LAB APPLICATION-11 ;DEC-11-SLABA-C-LA ;FILE SWEEP.MAC ;FILE ID SWEEP.5 .CSECT SWEEP ;COPYRLOW PARTS BHI 3$ ;BRANCH IF DENOM. TOO BIG(C=0) 2$: SUB R3,R4 ;SUB DENOM FROM REMAINDER SBC R5 SUB R2,R5 SEC ;INDECIGHT (C) 1975 ;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ;THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A OUBLE PRECISION JSR PC,GETBUF ;GET OUTPUT BUFFER .ENABL LSB BCC 1$ ;IF ALL'S WELL, B+C TST (SP)+ ;OTHERWISE, QUIT RTATE NEW QUOTIENT BIT 3$: DEC (SP) ;CHECK LOOP COUNT BGE 1$ ;IF MORE TO COME B+C TST (SP)+ ;UP SP MOV (SP)+,R5 ;RESTORES PC 1$: TST (R0) ;IS THERE ROOM IN OUTBUFR BNE 2$ ;IF SO, B+C JSR PC,PASBUF ;IF NOT, PASS OLD, GET NEW OUT BUFR 2$: MOV R5 RTS PC ;RESULT IN R3,R2 ;UNSIGNED SINGLE PRECISION MULTIPLY ;MULTIPLIES THE CONTENTS OF R0 BY R1 AND STORES ;REN NOT HAVE BOTH DISPLAYS DEFINED. .ENDC .IF DF SS$1 .IF NDF GT40$ & VR14$ ERROR=XXXX ;IF SS$1 DEFINED, A DISPLAY MUST BE DEE ON. THE GT40 DISPLAY IS ALWAYS TURNED OFF ON EXIT. 4. A TELETYPE MODULE IS NEEDED. UNLESS DISPLAY TYPE (SSDTYP) =-1 ;SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLUSION ;OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANY OTHER CFINED .ENDC .ENDC .SBTTL VALUE DEFINITIONS & MACROS .MCALL .REGDEF,$ADDEF,$QADEF,$SOB,$SPL .REGDEF $ADDEF $QADEF HLTOPIES ;THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ;OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE =0 TTYBUF=177562 ;TTY INPUT BUFR B5=40 B6=100 B7=200 B8=400 B14=40000 B15=100000 PR6=300 .SBTTL GLOBAL DEFINITIONS WHO AGREES ;TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE SOFTWARE ;SHALL AT ALL TIMES REMAIN IN DEC. ;THE INFORMAT .GLOBL SSAMP,QA,QAERR,QADATF,QAANS,MULT,DIVR .IF DF SS$1 .IF DF VR14$ .GLOBL DISPLY,DIRCMD,DILCMD,DIICMD,DIDCMD,DISET .ENDCION IN THIS DOCUMENT IS SUBJECT TO CHANGE ;WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A ;COMMITMENT BY DIGITAL EQUIPMENT CO .IF DF GT40$ .GLOBL GTDISP,GTRCMD,GTLCMD,GTICMD,GTDCMD,GTSET .GLOBL GTRCAL,SSSCAL,SSMAXV .ENDC .GLOBL SSDTYB,SSDTAB .ENDCRPORATION. ;DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ;ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY .IIF DF SS$2 .GLOBL SSXWAT .SBTTL DISCRIPTION .REPT 0 SSAMP IS A SUBROUTINE TO DO THE FOLLOWING 1. SAMPLE 1-64 CHANNELDEC. ;LDP SOFTWARE DEVELOPMENT, MAY 1975 ; CARL RALSTON .SBTTL CONDITIONAL ASSEMBLY PARAMETERS ;SS$1 SHOW DISPLAY IF S, OR 1 DMA CHANNELS 2. ADD DATA IF MORE THAN ONE SWEEP TO A S.P. OR D.P. BUFR. 3. DISPLAY DATA WHILE SAMPLING 4. START CLOCKDEFINED ;FOR NO PRE-AMPS ON A/D ;SS$2 IF NDF THE MUX IS CHANGED AT THE ;SAME TIME THE A/D IS STARTED. ;IF DF, THD MU OFF OF SCHMITT 1 AND SAMPLE CHANNELS VIA CLOCK TIMING. CLOCK FIRES A/D. 5. ALLOW A NEGATIVE DELAY(COLLECT DATA PRIOR TO SX IS CHANGED THEN A USER DELAY ;SUBR IS CALLED, ON RETURN THE A/D IS STARTED. ;SS$3 DF IF MUTI CHANNEL CAPABILITY DESIREDYNC PULSE) DMA CAN'T BE USED WHEN A NEGITIVE DELAY IS REQUESTED. TO CALL THE ROUTINE THE USER MUST DO THE FOLLOWING. ;SS$4 DF IF FAST SAMPLING DESIRED ;SS$5 DF IF LED READOUT DESIRED ;GT40$ GT40 IF DF ;SS$INT SAMPLING PRIORITY FOR F1. THE VECTOR AND STATUS REGISTER ADDRESSES ARE DETERMINED IN LABMAC BY DEFINING ADVEC$ AND ADSR$ EQUAL TO THE ADDRESSES RESAST SAMPLE MODE ;SSDTYP=-1, SET SS$INT = 4, 5, OR 6 ;IF NDF, THE DEFAULT PRIORITY IS 4 ;VR14$ IF DF, THE SCOPE IS VR1P. THE DEFAULT IS 340 AND 170400. 2. IF A DISPLAY IS TO BE USED, DEFINE THE ENTRY IN THE DISPLAY TABLE, Y BUFR ADDR=DIS4. ;AR11$ IF DF, SYSTEM HAS AR11 RATHER THAN LPS ;LPS11$ IF DF, SYSTEM HAS LPS .SBTTL CONDITIONAL CHECKS .IF DF AR11$ YBU, TO SSDTYB, SET SSDTAB TO THE DISPLAY TABLES FIRST VALUE AND SET BOTH GLOBAL 3. INCLUDE THE MULTIPLY AND DIVIDE ROUTIN& SS$5 NOLEDS ;AR11 HAS NO LEDS .ENDC .IIF NDF SS$INT,SS$INT=4 ;DEFAULT TO PRIORITY 4 .IF DF GT40$ & VR14$ ERROR=XXXX ;CAE FROM THE GENERAL SUBROUTINE MODULE FOR A GT40 DISPLAY , IF SSAMP IS CALLED WITH F TYPE DISPLAY, THE DISPLAY MUST B A PARTIAL DISPLAY IS A GRAPH PLOT DISPLAY AND DOES NOT COVER THE WHOLE SCREEN. IN THIS DISPLAY, THE INCREASE AND FR(DPFLG) 9. SSCHN (BYTE) THE FIRST CHANNEL TO SAMPLE FROM, 0 IS CHANNNEL 0.(FSTCHN) 10. SSNOFC (BYTE) IS THE # OF CHANNELDECREASE COMMANDS DO NOT WORD. THE SUM BUFR OF THE A/D IS UPDATED ON THE FLY, THE CURRENT BUFR FOR DMA IS UPDATED ON THS -1 TO SAMPLE.(NOFC) 11. SSCOUT IS THE # OF POINTS SAMPLED PER CHANNEL.(NPTS) 12. SSNOFS IS THE # OF SWEEPS.(NSWPS) FOR GRAPE FLY, BUT THE SUM BUFR FOR DMA IS UPDATED AT THE END OF THE SWEEP IF A GT40 DISPLAY IS USED THE FOLLOWING VARIABLES H PLOT MODE THE NEXT 2 INPUTS ARE NEEDED FOR MODES N AND F THEY ARE NOT NEEDED 13. SSGRAB DISPLAY BUFR FOR GRAPH PLOT ON GT-40 MUST BE DEFINED AND SET GLOBAL. SSACAL ADDRESS OF THE SCALE FACTOR IN THE DISPLAY ID. TABLE SSMAXV ADDRESS OF THE ,ADDRESS OF BUFR 14. SSGRAS SIZE OF DISPLAY BUFR FOR GRAPH PLOT 7. SET THE DISPLAY TYPE IN THE DISPLAY TABLE TO DOUBLEIS USED. IF THE MODULE IS ASSEMBLED WITH NO DISPLAY, DISPLAY TYPE -1 OR 0 CAN BE USED DISPLAY TYPE = -1 CAN SAMPLE AT AMAXIMUM Y SIZE OF THE SCOPE 1377=GT40, 1777=GT44, 7777=VR14 IF A VR14 IS USED THE DISPLAY IS THE ONE PRODUCED BY TH FASTER RATE 5. LOAD THE A/D SAMPLER TABLE AS SHOWN BELOW. 6. CALL SSAMP MOV #PARTBL,R5 JSR PC,SSAMP CARRY BIT SET IF EE VR14 DISPLAY MODULE, AND SHOWN THE DATA COMMING IN ON THE FLY. THE DMA SUM BUFR IS UPDATED AT THE END OF THE SWEEP. RROR CHARACTERISTICS OF A/D TABLE A TABLE OF DISPLAY COMMANDS TO CONTROL THE DISPLAY WHILE SAMPLING ID DEFINED AS FOLLO SAMPLE TABLE: INTERNAL VARIABLES IN () 1. SSBUFA ADDRESS OF FIRST SUM BUFR OR BUFRS. THE SUM BUFRS ARE CONTIGUOUS(BUFAWS. THE TABLE IS A CHARACTER PER BYTE ENDED BY 0, AND HAS THE VALUES AS FOLLOWS. CMDS: .BYTE 'S,'X,'R,'L,'I,'D,C,0 DR) 2. SSBTMP IS THE ADDRESS OF THE TEMP BUFR FOR DMA ONLY. CAN = SSBUFA FOR ONE SWEEP & BOTH S.P. ALSO A REQUIRED TEMP THE FIRST CHARACTER IS TO START THE SAMPLING, THE SECOND TO EXIT, THE ROUTINE BACK TO THE USER, THE NEXT 4 WILL SCALE BUFR WHEN NEGATIVE DELAY IS REQUESTED.(TMPBUF) 3. SSDTYP (BYTE) DISPLAY TYPE FOR VR14 AND GT40 SET=0 FOR FULL DISPLAY UP,SCALE DOWN, INCREASE AND DECREASE THE NUMBER OF POINTS DISPLAYED RESPECTIVELY. A NUMBER IS INPUT TO DISPLAY DIFFERENT C =1 FOR GRAPH PLOT DISPLAY, GT40 ONLY =-1 FOR NO DISPLAY AND FAST SAMPLE MODE IN THE MODE TERMINAL IS LOCKED OUT. HANNELS. 1 FOR THE FIRST CHANNEL, 2 FOR SECOND, ETC. TYPYING A C WILL VIEW THE CURRENT SWEEP FOR DMA SAMPLING. IF A GT S AND X ARE NOT ECHOED(DISTYP) 4. SSRATE (BYTE) THE CLOCK BASE FREQUENCY 5. SSCLK CLOCK COUNTER VALUE. 6. SSDELY THE NUMB40 DISPLAY IS USED THERE IS THE POSSIBILITY OF 2 DISPLAYS OR NO DISPLAY A FULL DISPLAY WILL SHOW THE DISPLAY VIA THE ER OF SAMPLE PERIODS TO DELAY. IF NEQATIVE, CAUSES THE ABS(SSDELY) SAMPLES TO BE COLLECTED PRIOR TO THE SYNC PULSE.(DELY) GT40 DISPLAY MODULE. THIS DISPLAY IS UPDATED 10 TIMES A SWEEP, THE DMA BUFRS WILL BE UPDATED AT THE END OF THE SWEEP. 7. SSCHTY (BYTE) IS THE CHANNEL TYPE 0 FOR REGULAR, 1 FOR DMA(DMAFLG) 8. SSDOUP (BYTE) SET 0 FOR S.P. BUFR, 1 FOR D.P. BU TMPBUF ADDR OF DMA OR NEG DELAY BUFR NOFC (# OF CHAN)-1 NPTS # OF PTS PER SWEEP NSWPS # OF SWEEPS DELY # OF SAMPLE PE SSDOUP =13 ;=0 FOR S.P., =1 FOR D.P. BUFRS. SSCHN =14 ;FIRST CHANNEL TO SAMPLE FROM. SSNOFC =15 ;# OF CHANNELS -1 SSCOUT RIODS TO DELY(+ OR -) DISINC FULL DISPLAY UPDATE INCREMENT DISCTR DISPLAY COUNTER DISDLT " TABLE DELTA DISCT " BUFR SIZE=16 ;PTS PER SWEEP COUNTER. SSNOFS =20 ;NUMBER OF SWEEPS .SBTTL SSAMP ENTRY TO SWEEP SAMPLING ROUTINE ;MOV #PARTBL,R5 ; DISBUF " BUFR ADDR DISTYP FULL=0,-1 NONE, 1 POINT PLOT BUFPTR RELATIVE PTR INTO SUM BUFR BUFCTR # OF POINTS COUNTER TMJSR PC,SSAMP ;CARRY SET IF ERROR, R0 WILL CONTAIN ERROR # SSAMP: CLR R3 ;USED FOR ERROR RETURN MOV R5,R4 ;USE R4 AS TAPPTR RELATIVE POSITION IN TEMP BUFR TMPCTR # OF POINTS CTR TMPSIZ TEMP SUB BUFR SIZE IN BYTES NOFCTR NOFC TEMP CTR TOTBSBLE POINTER CLR (PC)+ ;INITIALIZE VALUES. DMAFLG: .BYTE 0 ;=1 FOR DMA, ELSE 0 DONFLG: .BYTE 0 ;SAMPLING DONE FLAG. CLR Z TOTAL BUFR SIZE IN WORDS BUFADR START OF SUM BUFR DELCTR DELY TEMP CTR SAVVEC A/D INTERRUPT ROUTINE ADDR DELYP ABS(DE(PC)+ DPFLG: .BYTE 0 ;=0 FOR S.P. BUFR, 1 FOR D.P. AVGFLG: .BYTE 0 ;=0 WHEN NOT AVG. =1 WHEN AVERAGING. MOV SSCOUT(R4),R5 LY) WHEN NEG , ELSE 0 .ENDR .SBTTL RUN TIME VALUES SSAML: SCSP-INTOFF-2 ;RELATIVE ADDRESSES OF INTERRUPT ROUTINES SCDP-I;R5 = # OF PTS PER SWEEP .ENABL LSB .SBTTL IF ABS(SSDELY) .GE. SSCOUT GIVE ERROR! CLR R2 ;START DELYP AT 0 MOV SSDELY(RNTOFF-2 ;SINGLE CHAN D.P. MCSPDP-INTOFF-2 ;MULTI CHAN S.P. & D.P. SSWPD-INTOFF-2 ;DMA INTERRUPT ADDRESS SCNSP-INTOFF-2 4),R0 BPL 2$ ;ONLY WHEN NEG NEG R0 ;NOW POSITIVE MOV R0,R2 CMP R0,R5 ;IS DELAY .GE. PTS PER SWEEP BHIS ERR0 ;YES, OR SINGLE WORD, DEPENDING ON THE BUFR TYPE REGISTERS THIS ROUTINE WILL DESTROY ALL REGISTERS ERROR MESSAGES ARE IN R ;SINGLE CHAN N MODE S.P. SCNDP-INTOFF-2 ; D.P. MCNSP-INTOFF-2 ;MULTI CHAN N MODE S.P. MCNDP-INTOFF-2 ; D.P. TMPSAM:0 R0=0 DELAY ERROR R0=1 CLOCK RATE ERROR R0=2 BUFR TYPE ERROR R0=3 DISPLAY BUFR OVERFLOW 8. THE ROUTINE WILL RETURN T SCSPD-TMPOFF-2 ;SINGLE CHAN DURING NEG DELAY SCNSP-TMPOFF-2 ; N MODE MCSPD-TMPOFF-2 ;MULTI CHAN MCNSPD-TMPOFF-2 .IFO THE USER WHEN THE TOTAL SAMPLING IS DONE. .ENDR .SBTTL INTERNAL VARIABLE LIST .REPT 0 DMAFLG BYTE 1 IF DMA, ELSE 0 DON DF SS$5 LEDCTR: .BYTE 0,0,0,0,0,0 ;LED COUNTERS .ENDC CMDS: .BYTE 7,1,'S,'X,'R,'L,'I,'D,'C,0 .SBTTL EXTERNAL INPUT VALUEFLG BYTE SAMPLING DONE FLAG DPFLG BYTE 0 FOR S.P., 1 FOR D.P. AVGFLG BYTE 0 WHEN NOT AVG. 1 WHEN AVERAGING TMP2 TEMP FOR FASS. ;THIS TABLE REPRESENTS THE USER'S TABLE THAT MUST ;BE SET BEFORE CALLING THE ROUTINE SSBUFA =0 ;ADDRESS OF FIRST BUFR OT SAMPLING TMP3 " BPTINC BUFR PTR INCREMENT, 2 FOR SP, 4 FOR DP BUFSKP 2*ABS(DELY)[*2 IF DP], ELSE 0 BUFSTP BUFR STEP FF BUFRS. SSBTMP =2 ;TEMPORARY BUFR ADDR. SSDTYP =4 ;DISPLAY TYPE SSRATE =5 ;BASE CLOCK FREQUENCY SSCLK =6 ;NUMBER OF CLOOR MULTI CHAN BUFSIZ SUB BUFR SIZE CLKRAT VALUE TO LOAD CLK STATUS REG. RATE ADSAV A/D STATUS VALUE TO RUN(1ST CHAN+B6+B5)CK TICKS FOR EACH SAMPLE PERIOD SSDELY =10 ;NUMBER OF SAMPLE PERIODS TO DELAY SSCHTY =12 ;CHANNEL TYPE 0=REG CHANNEL, 1=DMA 4$: .IIF DF LPS11$ CMP #16.,SSNOFS(R4) .IIF DF AR11$ CMP #64.,SSNOFS(R4) BLO ERR2 6$: MOV R5,(PC)+ ;SAVE SUB BUFR SIZE IN ADDR OF A/D ADD @R1,R0 ;INTERRUPT ROUTINE MOV R0,(PC)+ SAVVEC: 0 MOV #PR6,@#ADVEC+2 ;PRIORITY 6 MOV #PR6,@#CLKVEC+2 BYTES BUFSIZ: 0 .IF DF SS$3 ADD R5,R0 ;BUMP STEP BY BUFSIZ MOV R0,BUFSTP ;BUFR STEP TO NEXT SUM SUB BUFR .ENDC MOV ;GET REST OF VARIABLES FROM THE INPUT TABLE. MOV (R4)+,BUFADR MOV (R4)+,(PC)+ ;DMA OR NEG DELAY TEMP BUF TMPBUF: 0 MOVB R2,(PC)+ ;BYTES TO SKIP AT BEGINNING OF BUFSKP: 0 ;SUM BUFR DUE TO NEG DELAY .SBTTL IF BOTH DMA & NEG DELAY GIVE ERROR! T(R4)+,(PC)+ ;GET DISPLAY TYPE DISTYP: 0 ;=0 FULL DISPLAY, -1 NO DISPLAY ;=1 GRAPH PLOT DISPLAY ;DETERMINE CLOCK VALUESSTB SSCHTY(R4) ;IS DMA USED? BEQ 8$ TST SSDELY(R4) ;YES, CHECK NEG DELAY? BGE 8$ ;NO, SO NO ERROR ERR3: INC R3 ;BOTH DM MOVB (R4)+,R0 ;GET CLK FREQUENCY BLE ERR1 ;RATE OF 0 WON'T WORK ASL R0 ;PROPER BITS FOR CLK MOV R0,(PC)+ ;CLOCK RATE A & NEG DELAY REGUESTED ERR2: INC R3 ;BUFR ERROR ERR1: INC R3 ;CLOCK ERROR ERR0: MOV R3,R0 ;DELAY ERROR SEC ;INDICATE CLKRAT: 0 MOV (R4)+,@#CLKBUF ;LOAD BUFR/PRESET REG. NEG @#CLKBUF MOV (R4)+,(PC)+ ;DELAY COUNT DELY: 0 .SBTTL DETERMINE ERROR RTS PC ;CALCULATE TOTAL SIZE OF ALL BUFRS. 8$: MOVB SSNOFC(R4),R0 ;MULTIPLY # OF BUFR TIMES INC R0 ;THEIR SIZE INTERRUPT SERVICE ROUTINE FOR NEG DELAY BPL NONEG CMP TMPBUF,BUFADR ;CAN'T BE THE SAME BEQ ERR2 CLR R0 TSTB 3(R4) ;MU ASR R5 ;SET BUFSIZ TO WORDS JSR PC,@#MULT MOV R5,TOTBSZ ;TOTAL BUFR SIZE IN WORDS .DSABL LSB .SBTTL DETERMINE A/D STALTI CHANNEL? BEQ 2$ CMP (R0)+,(R0)+ ;YES, ADD 4 2$: TSTB DISTYP ;NEG IF N MODE BPL 4$ TST (R0)+ ;N MODE SO ADD 2 4$:TUS & ROUTINE TO USE MOVB SSCHN(R4),R0 ;SET 1ST CHANNEL TO START FROM. SWAB R0 ADD #B6+B5,R0 ;CLOCK STARTS A/D. MOV R0,( MOV PC,R1 ;ADDR OF TEMP SERVICE ADD #TMPSAM-4$-2,R1 ;ROUTINE TABLE ADD R0,R1 ;OFFSET INTO TBL TMPOFF: MOV PC,R0 ADD @RPC)+ ;A/D STATUS VALUE TO RUN ADSAV: 0 CLR R0 ;USED TO DETERMINE ADDR OF INTERRUPT TSTB SSDOUP(R4) ;TEST BUFR TYPE BEQ 21,R0 MOV R0,(PC)+ ;INTR ROUTINE TO USE DURING NEG DELAY TMPVEC: 0 NONEG: ADD #3,R4 ;SKIP SOME VALUES MOVB (R4)+,(PC)+ ;# $ INCB DPFLG TST (R0)+ ;ADD 2 2$: TSTB SSNOFC(R4) ;TEST FOR MULTI CHANNEL BEQ 4$ MOV #4,R0 4$: TSTB SSCHTY(R4) ;TEST OF CHAN -1 NOFC: 0 MOV @R4,(PC)+ ;POINTS PER SWEEP NPTS: 0 MOV (R4)+,TMPSIZ ASL (PC)+ ;TMP SUB BUFR SIZE IN BYTES TMPSERROR 2$: MOV R2,DELYP ;ABS(DELY) WHEN NEG, ELSE 0 ASL R2 ;(# OF PTS TO SKIP)*2 ASL R5 ;(# OF PTS)*2 MOV #2,(PC)+ ;SETUFOR DMA BEQ 6$ INCB DMAFLG MOV #6,R0 BR 8$ 6$: .IF DF SS$4 TSTB SSDTYP(R4) ;TEST FOR NO DISPLAY BPL 8$ ADD #10,R0P BUFR VALUES BPTINC: 0 ;=2 FOR S.P., 4 FOR D.P. MOV #-2,R0 ;BUFR STEP TSTB SSDOUP(R4) ;IS BUFR D.P.? BEQ 4$ ASL BPT ;CALCULATE NO DISPLAY TSTB SSNOFC(R4) ;TEST FOR MULTI CHARACTERS BEQ 8$ TSTB DPFLG ;INTERRUPT ROUTINE ADDR. BEQ 8$ INC ;YES, MULT SOME VALUES BY 2 ASL R0 ASL R2 ASL R5 BR 6$ .SBTTL IF SSNOFC .GT. 16(64 AR11) AND NOT D.P. GIVE ERROR TST (R0)+ ;ADD 2 .ENDC 8$: MOV PC,R1 ;GET ADDR OF A/D ADD #SSAML-8$-2,R1 ;ADDR TABLE ADD R0,R1 INTOFF: MOV PC,R0 ;GETIZ: 0 MOV (R4)+,(PC)+ ;# OF SWEEPS NSWPS: 0 .IF DF GT40$ & SS$1 .SBTTL SETUP INITIAL VT11 DISPLAY BUFR MOV NPTS,R5 ;CASAVE THE BUFR START ADDR. DISBUF: 0 MOV R2,R3 ;SAVE ADDR. ASL R0 ADD R0,R2 ;END ADDR +2 OF DISPLAY BUFR. MOV #DRET,(RLCULATE UPDATE PERIOD MOV #10.,R0 ;FOR F TYPE DISPLAYS JSR PC,@#DIVR MOV R0,(PC)+ ;FULL DISPLAY UPDATE INCREMENT DISINC:2)+ ;STORE A SUBR RTN. CLR @R2 MOV BUFADR,@#SSDTYB ;STORE BUFR TO DISPLAY ASR R0 4$: CLR (R3)+ ;CLEAR DISPLAY BUFR $SO 0 MOV R0,(PC)+ ;INITIALIZE FOR DISPLAY COUNTER DISCTR: 0 TSTB DISTYP ;TEST FOR GRAPH PLOT BEQ STSAM2 BMI 2$ ;N DISPLB R0,4$ MOV R5,R0 .INSRT .START ;START DISPLAY .ENDC .SBTTL STSAM START SAMPLING STSAM: .IF DF SS$4 CLR TMP3 TSAY MODE MOV (R4)+,R5 ;DISPLAY ADDR MOV @R4,R0 ;DISPLAY BUF SIZE 2$: .STOP ;STOP THE GT-40 FOR N OR P TSTB DISTYP BMITB DISTYP ;TEST FOR N MODE BPL STSAM2 $SPL SS$INT ;SHUT OUT INTERRUPTS .ENDC STSAM2: JSR PC,ZBUF ;ZERO BUFRS. JSR PC STSAM CMP R0,#10. ;DISPLAY BUF. MUST BE AT LEAST 10. BHI NER4 ERR4: MOV #4,R0 ;DISPLAY BUFR NOT BIG ENOUGH SEC RTS P,STSWP ;SET UP TO START SAMPLING .IF DF SS$4 TSTB DISTYP ;TEST FOR NO DISPLAY BPL STSAM8 ST4: TSTB DONFLG ;TEST IF DONEC NER4: MOV #1,R1 ;SET DISPLAY DELTA MOV #1,R2 ;SET DATA BUF. DELTA MOV NPTS,R4 ;CAL DISPLAY BUF THE SMALLER SUB #7,. BNE STSM12 ;YES MOV @#TTYBUF,(PC)+ ;READ TTY INPUT TMP2: 0 BIC #200,TMP2 ;CLEAR PARITY BIT CMP TMP2,(PC)+ ;TST IF VAR0 ;OF 1024, BUFR, OR CMP R4,R0 ;DISPLAY BUFR BHI 4$ MOV R4,R0 4$: CMP #1024.,R0 BHI 6$ MOV #1024.,R0 6$: CMP R0,#LUE CHANGED TMP3: 0 BEQ ST4 ;NO MOV TMP2,TMP3 ;YES,SAVE NEW VALUE CMP #'S,TMP3 ;TEST FOR S BEQ CD2 CMP #'X,TMP3 ;TES1024. ;TEST IF DATA TO DISPLAY GREATER BHI 10$ ;THAN GT-40 ABILILY MOV R0,R3 ;NO, CALCULATE THE DISPLAY LESS THAN 8$: ASLT FOR X BNE ST4 BR CD6 .ENDC STSAM8: JSR R5,QA QADWA+QANQ STSM10: TSTB DONFLG ;TEST IF SWEEP DONE .IF DF SS$1 B R3 CMP R3,#1024. ;TEST TO DOUBLE DELTA BHI 10$ ASL R1 BIT #100,R1 ;TEST FOR MAX DISPLAY DELTA BEQ 8$ DEC R1 ;SET EQ SETDIS .IFF BEQ CD .ENDC STSM12: ;SWEEP DONE RETURN TO USER. .IF DF GT40$ & SS$1 .STOP TSTB DISTYP ;TEST TO STO MAX DISPLAY DELTA 10$: CMP R4,R0 BLOS 14$ MOV R4,R3 12$: ASL R2 ASR R3 CMP R3,R0 BHI 12$ MOV R3,R0 ;CALCULTOP DISPLAY BEQ 2$ .ENDC .IF DF SS$4 TSTB DISTYP ;TEST FOR NO DISP. BPL 2$ MOV @#TTYBUF,R0 ;CLEAR TTY BUF. $SPL 0ATE THE DATA BUFR DELTA ;SAVE THE DISPLAY BUFR SIZE 14$: MOV R2,(PC)+ ;SAVE DATA BUFR DELTA DISDLT: 0 MOV R5,R2 ;BUILD ;RESET THE STATUS .ENDC 2$: CLC ;NO ERRORS RTS PC ;ALL DONE RETURN TO CALLER .IF DF SS$1 SETDIS: .IIF DF VR14$ JS THE DISPLAY BUFR ADD #174100,R1 MOV #POINT,(R2)+ ;SET POINT MODE CLR (R2)+ CLR (R2)+ MOV R1,(R2)+ ;STORE THE GRAPH DER PC,@#DISPLY ;SET DISPLAY .IF DF GT40$ .SBTTL UPDATE VT11 DISPLAY BUFR TSTB DISTYP ;TEST FOR DISPLAY TYPE BMI CD ;NO LTA MODE WORD MOV #GRAPHY+INT6,(R2)+ ;STORE THE GRAPH MODE WORD. MOV R0,(PC)+ ;SAVE THE BUFR SIZE DISCT: 0 MOV R2,(PC)+ ;DISPLAY BEQ 16$ ;GRAPH DISPLAY MOV DISCT,R0 ;GRAPH PLOT DISPLAY MOV DISBUF,R1 ;SCALE AND STORE DATA MOV @#SSDTYB,R2 ;GESTSM10 TST R0 ;TEST FOR NON VALID COMMAND. BMI 20$ ;NEG IF NO MATCH BNE 4$ CD2: CLR @#ADSAD ;S CMD CLR @#CLKSAD IN.P. SCSP: ADD @#ADBUF,@BUFPTR ;ADD DATA TO BUFR ADD #2,(PC)+ BUFPTR: 0 ;RELATIVE POSITION IN BUF SCSP2: DEC (PC)+ ;TESCB AVGFLG ;START SAMPLING JMP STSAM2 4$: CMP R0,#2 .IF DF SS$1 BGE 10$ .IFF BGE STSAM8 .ENDC CD6: CLR @#CLKSAD T IF DONE BUFCTR: 0 BEQ 2$ RTI 2$: JMP SSWPD ;YES SET FOR NEXT SWEEP. .SBTTL SCDP SINGLE CHANNEL SAMPLING, D.P. SCD;X CMD,CLR CLOCK & A/D CLR @#ADSAD .IF DF LPS11$ TSTB DMAFLG ;TEST FOR DMA BEQ 8$ MOV #2,@#ADSAD ;TURN DMA OFF CLR P: MOV R0,-(SP) MOV BUFPTR,R0 ;DO A D.P. ADD TO BUFR. ADD @#ADBUF,(R0)+ ADC (R0)+ MOV R0,BUFPTR MOV (SP)+,R0 BR SCSPT BUFR ADDRESS 2$: CLR R4 ;CLEAR HIGH ORDER OF VALUE MOV (R2)+,R5 ;GET VALUE TSTB DPFLG ;TEST FOR DOUBLE PRECISION BEQ @#DMAREG .ENDC 8$: JMP STSM12 ;EXIT .IF DF SS$1 10$: .IF DF VR14$ BNE 12$ JSR PC,@#DIRCMD ;R CMD, UP SCOPE .ENDC 4$ MOV (R2)+,R4 ;HIGH ORDER PART 4$: MOVB @#SSSCAL,R3 ;GET SCALE FACTOR BMI 8$ BEQ 10$ 6$: ASL R5 ;SCALE LEFT ROL R4 .IF DF GT40$ TSTB DISTYP ;TEST FOR NO DISPLAY BMI 28$ CMP R0,#2 ;TEST FOR UP SCOPE BNE 12$ JSR PC,@#GTRCMD .ENDC $SOB R3,6$ BR 10$ 8$: CLC ;SCALE RIGHT ROR R4 ROR R5 INC R3 BNE 8$ 10$: CMP R5,SSMAXV ;TEST FOR A VALUE TOO LARG BR 28$ 12$: CMP R0,#4 BGE 14$ .IIF DF VR14$ JSR PC,@#DILCMD ;LOWER SCOPE .IIF DF GT40$ JSR PC,@#GTLCMD BR 28$ 1E FOR SCREEN BLO 12$ MOV SSMAXV,R5 12$: MOV R5,(R1)+ ;STORE VALUE IN DISPLAY DEC R0 ;BUFR TEST IF DONE BEQ CD MOV DI4$: BNE 16$ .IIF DF VR14$ JSR PC,@#DIICMD ;INCREASE # OF POINTS .IIF DF GT40$ JSR PC,@#GTICMD BR 28$ 16$: CMP R0,#6 BSDLT,R4 ;GET DATA BUF. DELTA 14$: DEC R4 ;SKIP POINTS IF NECC. BEQ 2$ TST (R2)+ ;SKIP POINTS TSTB DPFLG ;TEST FOR D.P.GE 18$ .IIF DF VR14$ JSR PC,@#DIDCMD ;DECREASE # OF POINTS. .IIF DF GT40$ JSR PC,@#GTDCMD BR 28$ 18$: BNE 20$ .IF DF SKIP. BEQ 14$ TST (R2)+ ;ADD 2 BR 14$ 16$: MOV NPTS,R0 ;TEST FOR REFRESH DISPLAY SUB BUFCTR,R0 ;TEST IF COUNTER OVERLPS11$ TSTB DMAFLG ;TEST FOR DMA BUFR BEQ 28$ MOV TMPBUF,@#SSDTYB BR 26$ .ENDC .IIF DF AR11$ BR 28$ 20$: JSR R5,FLOWED CMP R0,DISCTR ;UPDATE EVERY 1/10TH OF # OF PTS BLE 17$ MOVB #1,@#GTRCAL ADD DISINC,DISCTR ;BUMP FOR NEXT TIME 17QA QASIL+QASP ;SILENT Q, S.P. # TSTB @#QAERR ;ANY ERROR? BNE 28$ MOV @#QAANS,R0 ;NO, GET CHAN. # BEQ 28$ DEC R0 $: TSTB @#GTRCAL ;RECALCULATE DISPLAY? BEQ CD .STOP ;YES, TURN IT OFF. JSR PC,@#GTDISP ;RESET DISPLAY TST R0 ;TEST FOCMP R0,NOFC ;IS # TOO LARGE? BHI 28$ MOV BUFADR,R1 ;NO, CALCULATE NEW BUFR 22$: DEC R0 ;ADDRESS. BMI 24$ ADD BUFSIZ,RR ERROR BEQ 18$ JMP ERR4 18$: .START ;TURN IT ON. .ENDC .ENDC .SBTTL CD COMMAND DECODER .ENABL LSB CD: JSR R5,QA1 BR 22$ 24$: MOV R1,@#SSDTYB ;STORE IN DISPLAY TABLE 26$: MOV #SSDTAB,R0 ;RESET DISPLAY .IIF DF VR14$ JSR PC,@#DISET .I QAAO+QADWA+QAALP ;ALPHANUMERIC CMD, ANS ONLY DON'T WAIT CMDS ;S,X,R,L,I,D,C TSTB @#QADATF ;TEST FOR A LINE INPUT BEQ IF DF GT40$ JSR PC,@#GTSET 28$: JMP STSAM8 .IFF 20$: BR STSAM8 .ENDC .DSABL LSB .SBTTL SCSP SINGLE CHANNEL SAMPLING, S$ 6$: TSTB @#ADSAD ;WAIT FOR THE A/D CONVERSION BMI 2$ ;TO COMPLETE. BR 6$ 8$: TSTB @#ADSAD ;WAIT FOR A/D. BPL 8$ CHANGE CHAN .IFF ADD #401,@R3 ;CHANGE CHANNELS, START NEXT CHAN. .IFTF ADD @R4,(R1)+ ;ADD DATA TO BUFR .IFT JSR PC, ADD @#ADBUF,(R0)+ ;ADD VALUE MOVB DPFLG,R1 ;TEST FOR D.P. BUFR BEQ 10$ ADC @R0 10$: ADD BPTINC,BUFPTR ;STEP BUFR POINTERSSXWAT ;GO TO USER WAIT ROUTINE INC @R3 .ENDC MOV NOFC,NOFCTR ;SET # OF CHANNELS-1 TO DO. MOV R1,R0 ;SAVE BUF ADDR BR FOR NEXT VALUE. 12$: MOV ADSAV,@#ADSAD ;RESET A/D CSR MOV (SP)+,R1 MOV (SP)+,R0 BR SCSP2 ;EXIT. .SBTTL MCSPD MULTI 6$ 4$: .IF DF SS$2 ADD #400,@R3 ;JUST CHANGE CHAN .IFF ADD #401,@R3 ;CHANGE CHANNELS, START NEXT CHAN. .IFTF ADD @CHANNEL SAMPLING DURING NEG DELAY MCSPD: MOV R0,-(SP) MOV R1,-(SP) MOV TMPPTR,R0 ;SET BUFR ADDR MOV NOFC,R1 ;# OF CHANNER4,(R1)+ ;ADD DATA TO BUFR .IFT JSR PC,SSXWAT ;GO TO USER WAIT ROUTINE INC @R3 .ENDC 6$: ADD BUFSTP,R1 ;SET TO NEXT CHALS 14$: .IF NDF SS$2 ADD #401,@#ADSAD ;START NEXT CHAN .IFF ADD #400,@#ADSAD JSR PC,SSXWAT INC @#ADSAD .ENDC MOV NNEL'S BUF. DEC NOFCTR ;TEST IF LAST CHANNEL BEQ 10$ 8$: TSTB @R3 ;NO, WAIT TILL A/D DONE BMI 4$ BR 8$ 10$: TSTB @R3@#ADBUF,@R0 ADD TMPSIZ,R0 ;SET TO NEXT BUFR DEC R1 ;DONE ALL CHANNELS? BEQ 20$ 18$: TSTB @#ADSAD ;WAIT FOR CONVERT TO C ;LAST CHANNEL, WAIT TILL BPL 10$ ;A/D DONE ADD @R4,@R1 ;ADD VALUE TO BUFR MCNEX: MOV R0,R1 ;RESET BUF POINTER FOR CHAN2 .SBTTL SCSPD SINGLE CHANNEL SAMPLING, S.P. DURING NEG DELAY SCSPD: MOV @#ADBUF,@TMPPTR ;DATA TO RING BUFR ADD #2,(PC)+OMPLETE BMI 14$ BR 18$ 20$: ADD #2,TMPPTR ;STEP BUFR PTR FOR NEXT TIME 22$: TSTB @#ADSAD BPL 22$ MOV @#ADBUF,@R0 ;READ TMPPTR: 0 SCSPD2: DEC (PC)+ ;TEST IF AT END OF RING BUFR TMPCTR: 0 BNE 2$ MOV TMPBUF,TMPPTR ;RESET PTR TO BEGINNING OF LAST CHAN MOV ADSAV,@#ADSAD ;RESET STATUUS REG. MOV (SP)+,R1 MOV (SP)+,R0 BR SCSPD2 ;SEE IF END OF RING BUFR .DSABL BUFR MOV NPTS,TMPCTR ;RESET WORDS IN BUFR CTR 2$: RTI .IF DF SS$3 .SBTTL MCSPDP MULTI CHANNEL SAMPLING (S.P. & D.P.) .ELSB .IFF MCSPDP:MCSPD: HLT .ENDC .IF DF SS$4 .SBTTL SCNSP SINGLE CHANNEL N MODE, S.P. ; R0 TEMP ; R1 -> BUFR POINTER NABL LSB MCSPDP: MOV R0,-(SP) MOV R1,-(SP) MOV BUFPTR,R0 ;SET BUFR ADDRESS MOV NOFC,R1 ;# OF CHANNELS 2$: .IF NDF SS$2 ; R2 = COUNTER OF NUMBER OF PTS ; R3 -> PTR TO A/D STATUS REG. ; R4 -> PTR TO A/D BUFR REG. ; R5 = VALUE TO RESTORE A/D STAT ADD #401,@#ADSAD ;START NEXT CHANNEL. .IFF ADD #400,@#ADSAD JSR PC,SSXWAT ;USER WAIT ROUTINE INC @#ADSAD ;START AD US (ADSAV) .ENABL LSB 1$: RTI ;COMMON RETURN FOR SOB SCNSP: ADD @R4,(R1)+ ;ADD DATA TO BUFR 2$: $SOB R2,1$ ;TEST IF SWEE.ENDC .IIF DF AR11$ BIC #140,@#ADSAD ;TURN OFF CLOCK START ADD @#ADBUF,(R0)+ ;ADD VALUE TO BUFR. BITB #1,DPFLG ;TEST FOR DP DONE BR SSWPD .SBTTL SCNDP SINGLE CHANNEL N MODE, D.P. SCNDP: ADD @R4,(R1)+ ;ADD DATA LOW TO BUFR ADC (R1)+ ;ADD HIGH.P. BUFR BEQ 4$ ADC (R0)+ ;ADD CARRY IF SO. 4$: ADD (PC)+,R0 ;SET TO NEXT BUFR. BUFSTP: 0 DEC R1 ;TEST IF DONE BEQ 8 ORDER $SOB R2,1$ BR SSWPD .SBTTL MCNSP MULTI CHANNEL N MODE, S.P. .IF DF SS$3 MCNSP: .IF DF SS$2 ADD #400,@R3 ;JUST BUFR .IFT JSR PC,SSXWAT ;GO TO USER WAIT ROUTINE INC @R3 .ENDC MOV NOFC,NOFCTR ;SET # OF CHANNELS-1 TO DO. MOV R1,RMCNSP:MCNDP:SCNSPD:MCNSPD: HLT .ENDC .DSABL LSB .SBTTL SSWPD END OF SWEEP ROUTINE FOR REGULAR CHANNELS ;CLEAR CLOCK AND A0 ;SAVE BUF ADDR TST (R0)+ ;ADD 2 BR 16$ 14$: .IF DF SS$2 ADD #400,@R3 ;JUST CHANGE CHAN .IFF ADD #401,@R3 ;CHANG/D ;TEST IF AVERAGING. NO, ZERO BUFRS. SSWPD: CLR @#CLKSAD CLR @#ADSAD MOV R0,-(SP) MOV R1,-(SP) .ENABL LSB .IF DF SE CHANNELS, START NEXT CHAN. .IFTF MOV @R4,@R1 ;DATA TO BUFR .IFT JSR PC,SSXWAT ;GO TO USER WAIT ROUTINE INC @R3 .ES$5 .SBTTL UPDATE LEDS MOV #LEDCTR,R0 ;R0 -> INTERNAL LED COUNTERS CLR R1 2$: INCB @R0 ;ADD 1 TO DIGIT CMPB @R0,#10. ;NDC 16$: ADD TMPSIZ,R1 ;SET TO NEXT CHANNEL'S BUF. DEC NOFCTR ;TEST IF LAST CHANNEL BEQ 20$ 18$: TSTB @R3 ;NO, WAIT TILLTEST IF DIGIT =10. BNE 4$ CLRB (R0)+ ;NUMBER CARRY,SET DIGIT 0 MOV R1,@#ADBUF ;SET LED DIGIT 0 ADD #400,R1 ;GO TO NEXT A/D DONE BMI 14$ BR 18$ 20$: TSTB @R3 ;LAST CHANNEL, WAIT TILL BPL 20$ ;A/D DONE MOV @R4,@R1 ;ADD VALUE TO BUFR M LED CMP R0,#LEDCTR+5 ;AND CARRY THE 1 TO NEXT DIGIT BNE 2$ BR 5$ ;EXIT IF COUNTER FULL 4$: MOVB @R0,-(SP) ;SET DIGIT INOV R0,R1 ;RESET BUF POINTER MOV R5,@R3 ;RESET A/D STATUS BR 12$ .SBTTL MCNDP MULTI CHANNEL N MODE, D.P. .ENABL LSB LEDS BIC #177400,@SP ADD (SP)+,R1 MOV R1,@#ADBUF 5$: .ENDC .IF DF GT40$ & SS$1 MOVB #1,@#GTRCAL MOV DISINC,DISCTR MCNDP: .IF DF SS$2 ADD #400,@R3 ;JUST CHANGE CHAN .IFF ADD #401,@R3 ;CHANGE CHANNELS, START NEXT CHAN. .IFTF ADD @R4,(;RESET REFRESH COUNT FOR ;TYPE DISPLAY .ENDC TSTB AVGFLG BNE 8$ JSR PC,ZBUF 6$: MOV (SP)+,R1 MOV (SP)+,R0 7$: JR1)+ ;ADD DATA TO BUFR ADC (R1)+ .IFT JSR PC,SSXWAT ;GO TO USER WAIT ROUTINE INC @R3 .ENDC MOV NOFC,NOFCTR ;SET # OFSR PC,STSWP ;START NEXT SWEEP RTI 8$: .IF DF LPS11$ .SBTTL ADD DMA BUFR TO SUM BUFR TSTB DMAFLG ;TEST FOR DMA BEQ 14$ CHAN -1 MOV R1,R0 ;SAVE BUFR POINTER BR 4$ 2$: .IF DF SS$2 ADD #400,@R3 ;JUST CHANGE CHAN .IFF ADD #401,@R3 ;CHANGE ;BRANCH IF NOT CMP TMPBUF,BUFADR ;TEST FOR SINGLE BEQ 14$ ;BUFR DMA MOV R2,-(SP) MOV TMPBUF,R0 ;ADD THE CURRENT BUFR . 1 MOV R5,@R3 ;RESET A/D STATUS BR 2$ ;TEST END OF SWEEP DONE .ENDC .SBTTL SCNSPD SINGLE CHANNEL N MODE DURING NEG D CHANNELS, START NEXT CHAN. .IFTF ADD @R4,(R1)+ ;ADD DATA TO BUFR ADC (R1)+ .IFT JSR PC,SSXWAT ;GO TO USER WAIT ROUTINELAY SCNDPD: MOV @R4,(R1)+ ;DATA TO TEMP BUFR 12$: $SOB R2,1$ ;TEST IF END OF RING BUFR MOV TMPBUF,R1 ;RESET OF BEGINING E INC @R3 .ENDC 4$: ADD BUFSTP,R1 ;SET TO NEXT CHANNEL'S BUF. DEC (PC)+ ;TEST IF LAST CHANNEL NOFCTR: 0 ;TEMP # OF CHOF BUFR MOV NPTS,R2 ;RESET # OF PTS RTI .SBTTL MCNSPD MULTI CHANNEL N MODE DURING NEG DELAY .IF DF SS$3 MCNSPD: .IF DAN COUNTER BEQ 8$ 6$: TSTB @R3 ;NO, WAIT TILL A/D DONE BMI 2$ BR 6$ 8$: TSTB @R3 ;LAST CHANNEL, WAIT TILL BPL 8$ F SS$2 ADD #400,@R3 ;JUST CHANGE CHAN .IFF ADD #401,@R3 ;CHANGE CHANNELS, START NEXT CHAN. .IFTF MOV @R4,@R1 ;DATA TO;A/D DONE ADD @R4,(R1)+ ;ADD VALUE TO BUFR ADC @R1 BR MCNEX .IFF MCNSP:MCNDP:MCNSPD: HLT .ENDC .IFF SCNSP:SCNDP:R2)+ 12$: $SOB R1,10$ MOV (SP)+,R2 .ENDC .SBTTL ADD NEG DELAY BUFR TO SUM BUFR 14$: TST DELY ;NEG DELAY? BPL 28$ .II MOV ADSAV,R5 .ENDC 2$: MOV CLKRAT,@#CLKSAD TST @#ADBUF ;CLEAR A/D FLAG .IF DF LPS11$ TSTB DMAFLG ;DMA SAMPLING USEF DF SS$3 MOV NOFC,NOFCTR ;YES,# OF CHANNELS TO DO MOV R2,-(SP) MOV R3,-(SP) MOV TMPSIZ,-(SP) ;TEMP SUB BUFR SIZE ON STACKD? BEQ 3$ MOV #6,@#ADSAD ;YES,SET CURRENT ADDRESS MOV TMPBUF,@#DMAREG MOV #4,@#ADSAD ;SET COUNT AS NEG. VALUE MOV NPTS MOV BUFADR,R2 ;ST ADDR OF SUM BUFR MOV TMPBUF,R3 ;ST ADDR OF TEMP RING BUFR MOV TMPPTR,R0 ;VALUE OF POINTER WHEN ST1 FIRE,@#DMAREG NEG @#DMAREG MOV #2,@#ADSAD ;ENABLE DMA MOV #10000,@#DMAREG .ENDC 3$: MOV SAVVEC,@#ADVEC ;PROPER INTR ROUTINED 16$: MOV (PC)+,R1 ;# OF PTS TO ADD DELYP: 0 SUB R1,R0 ;BACKUP DELAY WORDS SUB R1,R0 CMP R0,R3 ;IF R0 < ,THEN WENT TO MOV #CLKINT,@#CLKVEC MOV DELY,DELCTR ;WHAT TYPE OF DELAY? & SET CTR BLT 6$ ;NEG DELAY BGT 4$ ;POSITIVE DELAY .SBTTLO FAR BHIS 18$ ADD @SP,R0 ;MOV TOWARDS END OF RING 18$: ADD @SP,R3 ;START OF NEXT RING SUB BUFR MOV R2,TMPPTR ;REMEMBER ZERO DELAY, ST1 START BIS #B14+B8,@#CLKSAD ;ENABLE ST1 INTER & MODE RTS PC .SBTTL POSITIVE DELAY, SETUP TO COUNT DELY C CURRENT POSITION 20$: ADD (R0)+,(R2)+ ;DO SUM BITB #1,DPFLG BEQ 22$ ADC (R2)+ 22$: CMP R0,R3 ;ARE WE BEYOND END OF RINLOCK OVERFLOWS 4$: BIS #B14+B8+B6,@#CLKSAD ;ENABLE ST1 INTER, OVERFLOW ENABLE RTS PC .SBTTL NEG DELAY, ENABLE ST1 INTR & G SUB BUFR? BLO 24$ SUB @SP,R0 ;YES, RESET R0 FOR WRAP AROUND 24$: $SOB R1,20$ ;ALL FOR THIS CHAN? .IF DF SS$3 .IF DFSTART SAMPLING 6$: MOV ADSAV,@#ADSAD ;1ST CHAN, INTR ON CLK OVER MOV TMPVEC,@#ADVEC ;SERVICE ROUTINE DURING NEG DELAY MOV # SS$4 DEC NOFCTR .IFF DEC (PC)+ NOFCTR: 0 .ENDC BMI 26$ MOV TMPPTR,R2 ;DETERMINE NEXT SUM SUB BUFR ADD BUFSIZ,R2 ST1INT,@#CLKVEC MOV TMPBUF,TMPPTR ;SET PTR TO BEGINNING OF BUFR MOV NPTS,TMPCTR ;RING BUFR FULL CTR TSTB DISTYP BPL 8$ ADD @SP,R0 ;UPDATE TO NEXT SUB BUFR BR 16$ .ENDC 26$: TST (SP)+ ;POP TMPSIZ OFF STACK MOV (SP)+,R3 MOV (SP)+,R2 28 MOV TMPBUF,R1 ;SET REG IF N MODE MOV NPTS,R2 8$: BIS #B14+B8+1,@#CLKSAD ;ST1 ENABLE & GO RTS PC .SBTTL CLKINT CLOCK INT$: MOV (SP)+,R1 MOV (SP)+,R0 DEC NSWPS ;TEST IF ALL SWEEPS DONE BNE 7$ INCB DONFLG ;SET DONE FLAG RTI .DSABL LSB ERRUPT SERVICE FOR + DELAY ;IF ST1 OR EXTERNAL EVENT INTERRUPT, START CLOCK .ENABL LSB CLKINT: MOV R0,-(SP) MOV #CLKSAD,R0 .SBTTL STSWP ROUTINE TO INITIALIZE A SWEEP OF SAMPLING. STSWP: MOV BUFADR,BUFPTR ;SET UP SUM BUFR POINTER ADD BUFSKP,BUFPT ;R0 -> CLOCK STATUS REG TST @R0 ;ST1 OR EXTERNAL EVENT? BPL 2$ INC @R0 ;YES, START CLK BIC #B15+B14,@R0 ;ST1 FLAG & DR ;SKIP OVER NEG DELAY PTS IF REQUIRED MOV NPTS,BUFCTR ;# OF PTS PER CHAN SUB DELYP,BUFCTR ;REDUCED BY DELAY PTS .IF DF SSISABLE INTR BR 4$ 2$: TSTB @R0 ;MODE FLAG? BPL 8$ ;NO 4$: DEC (PC)+ ;IS DELAY DONE? DELCTR: 0 BGT 6$ BIC #B7+B6,@R MOV NPTS,R1 ;TO THE SUM BUFR. MOV BUFADR,R2 10$: ADD (R0)+,(R2)+ BITB #1,DPFLG ;TEST FOR D.P. SUM BUFR BEQ 12$ ADC ($4 TSTB DISTYP ;TEST FOR N MODE. BPL 2$ MOV #ADBUF,R4 ;YES, SET REGISTERS MOV BUFPTR,R1 MOV BUFCTR,R2 MOV #ADSAD,R3THER COPIES ;THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ;OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM AND TTH HISTOGRAM .SBTTL OUTPUT BUFFER FORMAT ;THE ZEROTH HISTOGRAM PROCEEDS THE HISTOGRAM TABLE SINCE ITS LENGTH ;IS NOT KNOWN O ONE WHO AGREES ;TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE SOFTWARE ;SHALL AT ALL TIMES REMAIN IN DEC. ;THE INUNTIL COMPLETION OF THE RUN. ITS END IS INDICATED BY A ; -1. THE HISTO TABLE CONTAINS A COPY OF SOME PARAMETER TABLE INFO ;PL0 ;YES, DISABLE CLK INTR MOV ADSAV,@#ADSAD ;INTR ON & CLK DRIVEN FOR A/D BR 8$ 6$: BIC #B7,@R0 ;CLR MODE FLAG 8$: MOV (SPFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE ;WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A ;COMMITMENT BY DIGITAL EQUIPM)+,R0 RTI .DSABL LSB .SBTTL ST1INT CLOCK INTERRUPT SERVICE FOR ST1 DURING NEG DELAY ST1INT: BIC #B15+B14,@#CLKSAD ;ST1 FENT CORPORATION. ;DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ;ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLILAG & DISABLE INTR MOV SAVVEC,@#ADVEC ;CHANGE SERVICE ROUTINES TSTB DISTYP ;IF N MODE MUST REMEMBER BPL 2$ ;POINTER INTOED BY DEC. ;LDP SOFTWARE DEVELOPMENT, JUNE 1975 ; CARL RALSTON .SBTTL CONDITIONAL ASSEMBLY PARAMETER EXPLANATION ;HTPST$ TEMP BUFR MOV R1,TMPPTR ;YES, N MODE MOV BUFPTR,R1 ;ALSO SETUP USED REG MOV BUFCTR,R2 2$: RTI .SBTTL ZBUF ZERO BUFRS IF DF, INCLUDE CODE TO PROCESS PST DATA. ;HTISI$ IF DF, INCLUDE CODE TO PROCESS ISI DATA ;HTDP$ IF DF, INPUT VALUES & SOME PARAND LEDS ZBUF: MOV R0,-(SP) MOV R5,-(SP) MOV (PC)+,R5 ;TOTAL BUFR SIZE IN WORDS TOTBSZ: 0 MOV (PC)+,R0 ;ZERO IT ALL. BUAMETERS ARE DOUBLE PRECISION. ;HTZER$ IF DF, CODE TO PRODUCE ZEROTH HISTOGRAM IS INCLUDED. ;CTREL$ IF DF, THE CONTROL MODULE WFADR: 0 2$: CLR (R0)+ $SOB R5,2$ .IF DF SS$5 CLR @#ADBUF ;SET LED COUNTERS 0 MOV #5,R5 CLR R0 4$: ADD #400,R0 ;DIGILL RELEASE INPUT BUFFERS. .IF NDF HTPST$ ! HTISI$ ERROR=DEFINE HTPST$ OR HTISI$ OR BOTH .ENDC .IIF DF HTDP$ DP=1 .IIF IT ADDR MOV R0,@#ADBUF CLRB LEDCTR(R5) $SOB R5,4$ CLRB LEDCTR .ENDC MOV (SP)+,R5 MOV (SP)+,R0 RTS PC .END NDF HTDP$ DP=0 .SBTTL MACROS & GLOBALS .MCALL .REGDE,$SOB,$DIV,$MUL .REGDE ;INTERNAL GLOBALS .IIF DF HTPST$ .GLOBL HTPST .IIF DF HTISI$ .GLOBL HTISI .GLOBL HTTBL,HTEROR ;EXTERNAL GLOBALS .GLOBL BAGTM,BAGET,CTOBUF,BASIZ,BBASIZ .IIF NDF CTR.TITLE HISTO HISTOGRAM MODULE ;LAB APPLICATIONS-11 ;DEC-11-SLABA-C-LA ;FILENAME HISTO.MAC ;FILE ID HISTO.2 .CSECT HISTO EL$ .GLOBL BAREL .SBTTL PARAMETER TABLE OFFSETS HTMNTM=0 ;MIN VALUE TO CONSIDER (SP OR DP) HTBINW=2*DP+2 ;BIN WIDTH HTNOFB;COPYRIGHT (C) 1975 ;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ;THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY =HTBINW+2 ;# OF BINS HTMXTM=HTNOFB+2 ;MAX VALUE TO CONSIDER (SP OR DP) HTZERO=2*DP+HTMXTM+2 ;ZEROTH HISTOGRAM FLAG HTOOFL=HTZON A ;SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLUSION ;OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANY OERO+2 ;ORDER OF LATENCY, MAX # OF RESPONSES TO CONSIDER ;AFTER EACH STIMULUS. (PST) HTTMSG=HTOOFL ;TIME SEGMENT FOR ISI ZEROE WHEN REQUESTED ; 2 CTOBUF RETRUNED ERROR ; 3 ARITHMETIC OPERATION OVERFLOW BEYOND PRECISION .IF DF HTISI$ HTISI: MOV #1OV (R5)+,(R0)+ ;BIN WIDTH MOV @R5,(R0)+ ;# OF BINS MOV (R5)+,R1 ;COPY FOR CTR MOV (R5)+,(R0)+ ;HTMXTM .IIF DF HTDP$ MOV ,ISIFLG ;INDICATE ISI BR IN .ENDC .IF DF HTPST$ HTPST: CLR ISIFLG ;NOT ISI .ENDC IN: MOV R0,-(SP) ;SAVE OUTPUT PTR (R5)+,(R0)+ TST (R5)+ ;SKIP ZEROTH HISTO FLAG MOV @R5,(R0)+ ;HTOOFL OR HTTMSG SUB #HTOOFL,R5 ;RESET R5 TO BEGINNING OF PAON STACK .IIF NDF CTREL$ MOV @R1,BUFADR ;SAVE BUFR ADDR TO RELEASE INC LSTBUF ;SAY LAST UNTIL CLEARED MOV 2(R1),R2 ;# OF RM TBL ADD #5,R1 ;5 EXTRA CTRS TO ZERO MOV #10.,BIN1 ;DETERMINE ADDR OF 1ST BIN ADD R0,BIN1 6$: CLR (R0)+ ;CLEAR ALL COWORDS IN INPUT BUFR BGT 2$ ;LAST AND SOME TO PROCESS BNE 1$ JMP LAST ;0 SO NONE TO PROCESS 1$: NEG R2 ;MAKE COUNT + UNTERS $SOB R1,6$ .IF DF HTZER$ TST HTZERO(R5) ;DO WE NEED ZEROTH HISTO BUFR BEQ 8$ JSR PC,GETZER ;GET ZEROTH HISTO OUCLR LSTBUF ;SAY NOT LAST BUFR 2$: .IIF DF HTDP$ ASR R2 ;HALF FOR D.P. MOV @R1,R3 ;R3 -> INPUT BUFR TST @R0 ;0 ADDR ON FITPUT BUFR BCS NOROOM .IIF DF HTISI$ CLR RUNSUM ;STARTS AT 0 .ENDC 8$: CLR (PC)+ ;COUNT OF # OF SPIKES IN TIME SEGMENT RUS THE HISTOGRAM PROPER. ALL VALUES ARE S.P. EXCEPT FOR HTMNTM ;AND HTMXTM. THE FIRST PART ARE COPIES OF THE FOLLOWING: ;1-5RST CALL BNE PROCES ;NOT FIRST CALL ;COME HERE ONLY ONCE ON FIRST CALL.(WHEN R0 -> 0). ;SO DO THE FOLLOWING: ;1. DETERMI. HTMNTM,HTBINW,HTNOFB,HTMXTM, HTOOFL OR HTTMSG ;6. # OF BIN COUNTERS THAT HAVE OVERFLOWED ;7. TOTAL # OF STIMULI (0 FOR ISI) NE SIZE NEEDED FOR HISTO TABLE OUTPUT BUFR. ;2. GET MULTI BUFRS & STORE BUFR TABLE ADDR. ;3. COPY PARAMETERS & ZERO COUNTERS ;8. UNDERFLOW BIN COUNTER ;9. OVERFLOW BIN CTR ;10. REJECT CTR (VALUES OVER HTMXTM) ; . ; . ; HTNOFB WORDS OF THE BIN COUN;4. IF ZEROTH HISTO GET A BUFR FOR IT .ENABL LSB CLR (PC)+ ;SET TO NO ERROR HTEROR: 0 MOV #2*DP+10.,R1 ;HEADER WORDS ATERS ; . ; . .SBTTL HTISI & HTPST ENTRY POINTS ;THIS MODULE IS A PROCESSING MODULE AND AS SUCH USES THE CONTROL ;MODULE ST BEGINNING ADD HTNOFB(R5),R1 ;ADD # OF BINS REQUIRED MOV R1,WDSREQ ;FOR LATER USE CLR R0 ;S.P. DIV $DIV BASIZ,R0 ;WORDCHEME FOR PASSING BUFFER INFORMATION. ;R5 = ADDR OF THE PARAMETER TABLE ;R0 -> OUTPUT BUFR ADDR OR 0 IF NON-YET ; ADDR OF HIS REQ/BASIZ TST R1 ;IS REM 0? BEQ 2$ INC R0 ;NO, BUMP # OF BUFRS NEEDED 2$: MOV R0,R1 ;# OF BUFRS REQUIRED MOV @SP,RSTO TABLE IF NO ZEROTH HISTO REGUIRED ; OTHERWISE ADDR OF ZEROTH HISTOGRAM BUFR ; 2(R0) INDEX INTO OUTPUT BUFR (LBI) ;R1 -> A0 ;STORE ADDR @R0 JSR PC,BAGTM BCC 5$ NOROOM: MOV #1,HTEROR ;NO BUFRS AVAILABLE ERTN: .IF NDF CTREL$ MOV BUFADR,R0 ;WE DDR OF INPUT BUFR ; 2(R1) NUMBER OF WORDS IN THE INPUT BUFR ; IF NEG., NOT LAST BUFR ;IF AN ERROR OCCURED THE CARRY BIT WILL MUST RELEASE INPUT BUFR JSR PC,BAREL SEC .ENDC MOV (SP)+,R0 ;POP STACK, LEAVE C=1 RTS PC 5$: MOV @(SP),R0 ;R0 -> HIBE SET ON RETURN. ;(EXCEPT IF CTOBUF RETURNED AN ERROR) ;HTEROR HAS THE FOLLOWING VALUES: ; 0 NO ERROR ; 1 NO BUFRS AVAILABLSTO TBL MOV R0,HTTBL ;HISTO TABLE ADDR MOV (R5)+,(R0)+ ;COPY THE FOLLOWING VALUES:HTMNTM .IIF DF HTDP$ MOV (R5)+,(R0)+ MW ;3. IF .GT. HTMXTM, INC REJECT CTR ;4. IF > MXKP, INC OVERFLOW (MXKP=HTMNTM+HTBINW*HTNOFB) ;5. DETERMINE NORMAL BIN TO INC : .IFTF CMP R1,@R5 ;HIGH =, CMP LOW PARTS BHIS 6$ INC -6(R4) ;UNDERFLOW CTR BR 12$ 6$: .IFT CMP @R3,HTMXTM+2(R5) ;I ;6. IF ANY BIN OVERFLOWS, INC BIN OVERFLOW FLAG ;R0 = TEMP ;R1 INPUT VALUE ;R2 = # OF WORDS IN INPUT BUFR. ;R3 -> INPUT BF > HTMXTM, INC REJECT BHI 7$ BLO 8$ .IFTF CMP R1,HTMXTM(R5) BLOS 8$ 7$: INC -2(R4) ;REJECT CTR BR 12$ 8$: .IFT UFR ;R4 -> OUTPUT BUFR 1ST BIN ;R5 -> START OF PARAMETER TABLE .ENABL LSB .IF DF HTPST$ & HTZER$ TST ISIFLG ;PICK UP CMP @R3,MXKP+2 ;IF .GE. MXKP, INC OVERFLOW BHI 9$ BLO 10$ .IFTF CMP R1,MXKP BLO 10$ 9$: INC -4(R4) ;OVERFLOW CTR 1ST STIMULUS IF PST BNE PROCES ;NOT PST MOV BIN1,R4 ;SETUP R4 MOV (R3)+,R1 ;GET 1ST BUFR VALUE BNE 3$ .IF DF HTDP$ BR 12$ 10$: SUB @R5,R1 ;DETERMINE WHICH BIN TO INC .IFT MOV @R3,R0 ;HIGH ORDER PART SBC R0 SUB HTMXTM+2(R5),R0 ;HIGH TST @R3 ;D.P. TEST FOR 0 BNE 3$ .ENDC BR 2$ ;A STIMULUS SO INC STIM CTR .ENDC PROCES: MOV (PC)+,R4 ;R4 -> 1ST BIN BORDER PART .IFF CLR R0 ;S.P. DIV .ENDC $DIV HTBINW(R5),R0 ;(VALUE-HTMNTM)/HTBINW BVS EROR3 ;BINWIDTH TOO SMALL ASLIN1: 0 PROLP: .IF DF HTISI$ TST ISIFLG ;ONLY FOR ISI BEQ 1$ MOV (R3)+,R1 .IF DF HTZER$ TST HTZERO(R5) BEQ 4$ INC R0 ;MAKE WORD INDEX ADD R4,R0 INC @R0 12$: BNE 14$ ;DID ANY INC CAUSE AN OVERFOW INC -12(R4) ;YES, BIN OVERFLOW FLAG RSPCT ;COUNT OF SPIKES IN TIME SEGMENT ADD R1,(PC)+ ;RUNNING SUM OF TIMES RUNSUM: 0 CMP RUNSUM,HTTMSG(R5) ;IS RUNSUM.GE.H 14$: .IIF DF HTDP$ TST (R3)+ ;BUMP INPUT PTR $SOB R2,PROLP ;LOOP UNTIL ALL INPUT GONE TST (PC)+ ;LAST BUFR? LSTBUF: 0 ;TTMSG? BLO 4$ SUB HTTMSG(R5),RUNSUM ;YES,RESET RUNNING SUM & JSR PC,ZEROUT ;OUTPUT # OF SPIKES BCS NOROOM .ENDC BR 4LAST BUFR FLAG, NON-ZERO FOR LAST BNE LAST RTN: .IF NDF CTREL$ MOV (PC)+,R0 ;WE MUST RELEASE BUFR BUFADR: 0 JSR PC,BARSPCT: 0 ;COUNT OF # OF RESPONSES AFTER STIMULUS MOV HTBINW(R5),R0 ;CALCULATE MAX VALUE TO KEEP $MUL HTNOFB(R5),R0 ;HTBINW*$ .ENDC 1$: .IF DF HTPST$ MOV (R3)+,R1 ;INPUT VALUE, ZERO=STIM BNE 3$ .IF DF HTDP$ TST @R3 ;HIGH ORDER PART ZERO AHTNOFB ADD @R5,R1 ;MXKP=HTMNTM+HTBINW*HTNOFB .IF DF HTDP$ ADC R0 ADD HTMNTM+2(R5),R0 MOV R0,MXKP+2 ;HIGH ORDER PART LSO? BNE 3$ .ENDC .IF DF HTZER$ TST HTZERO(R5) ;ZEROTH HISTO OUTPUT BEQ 2$ JSR PC,ZEROUT ;YES, OUTPUT RESPONSES CTR .ENDC BCC 9$ EROR3: MOV #3,HTEROR ;OVERFLOW BEYOND PRECISION BR ERTN 9$: MOV R1,MXKP ;LOW ORDER PART .DSABL LSB .SB BCS NOROOM .ENDC 2$: INC -10(R4) ;TOTAL STIMULUS COUNT BR 12$ 3$: INC RSPCT ;BUMP COUNT OF RESPONSES CMP RSPCT,HTOOFTTL INCREMENT PROPER BIN ;THIS SECTION TAKES THE INPUT VALUE AND DOES THE FOLLOWING: ;1. IF=0, A STIMULUS, INC TOTAL STIMULUS L(R5) ;SHOULD THIS RESP BE INCLUDED? BLOS 4$ ;KEEP IT DEC RSPCT ;PREVENT FROM OVERFLOWING BR 14$ ;DONT KEEP BUT LOOP COUNT ; OUTPUT RSPCT FOR ZEROTH HISTO ; ZERO RSPCT (COUNT OF # OF RESPONSES AFTER EACH STIMULI) ;2. IF < HTMNTM, INC UNDERFLO.ENDC 4$: .IF DF HTDP$ CMP @R3,HTMNTM+2(R5) ;IF HTMNTM BLO 5$ ;VALUE < HTMNTM 5$UST PASS HISTO TABLE BUFR. .ENABL LSB LAST: .IF DF HTZER$ TST HTZERO(R5) ;WAS ZEROTH HISTO DONE? BEQ 7$ JSR PC,ZEROUT ANOTHER OUTPUT BUFR. C=1 IF NO BUFRS AVAILABLE .ENABL LSB ZEROUT: MOV RSPCT,@ZERPTR ;YES, OUTPUT RESPONSES CTR CLR RSPCT ;YES,OUTPUT LAST RESPONSE CNT MOV #-1,RSPCT ;PUT -1 IN ZEROTH BUFR JSR PC,ZEROUT MOV ZERCTR,R2 ;# OF WDS LEFT TO FILL BUF ;RESET TO 0 ADD #2,(PC)+ ;BUMP BUFR PTR ZERPTR: 0 ;ZEROTH HISTO BUFR PTR DEC (PC)+ ;IS IT FULL ZERCTR: 0 ;ZEROTH OUR CMP BASIZ,R2 ;IF BUFR JUST FULL, BEQ 7$ ;DON'T NEED TO COMBINE MOV @SP,R0 ;R0 -> OUTPUT PAIR TST (R0)+ ;R0 -> LBI OTPUT BUFR FULL CTR BNE 2$ PASZER: MOV 2(SP),R0 ;GET OUTPUT BUFR PTR TST (R0)+ ;PTS TO LBI MOV BASIZ,@R0 ;LBI NEG @R0 F OUTPUT BUFR MOV BASIZ,@R0 ;START WITH BUFR SIZE SUB R2,@R0 ;TAKE AWAY ZERCTR MOV ZERPTR,R1 ;R1 -> ZEROTH BUFR TO FILL ;NOT LAST BUFR JSR PC,CTOBUF ;PASS OUTPUT BUFR TO CTRL MOD BCS EROR2 ;FULL UP, CM ALREADY KNOWS TST LSTBUF ;DONT GET ANO MOV HTTBL,R3 ;HIST BUFR ADDR MOV #WDSREQ,R4 ;R4 -> WORDS REGUIRED SUB R2,@R4 ;TRANSFER ZERCTR OR WDSREQ WORDS BPL 2$ ;WTHER IF LAST BNE 1$ GETZER: MOV #ZERPTR,R0 ;GET A NEW BUFR JSR PC,BAGET MOV ZERPTR,@2(SP) ;STORE BUFR ADDR 1$: MOV BASIZHICHEVER IS SMALLER. ADD R2,@R4 ;IF SUB -, THEN HISTO TBL < MOV @R4,R2 ;NEEDED TO FILL BUFR. CLR @R4 ;0 FOR LATER CHECK,ZERCTR ;RESET COUNTER 2$: RTS PC .ENDC ISIFLG: 0 ;0 FOR PST, NON-ZERO FOR ISI MXKP: .BLKW 1+DP ;MXKP=HTMNTM+HTBINW*HTNO 2$: ADD R2,@R0 ;ADD WDS TO FILL BUFR TO LBI 4$: MOV (R3)+,(R1)+ ;SHIFT TO ZEROTH BUFR $SOB R2,4$ TST @R4 ;IF 0, THEN LAFB ;VALUES BETWEEN MXKP & HTMXTM CAUSE OVERFLOW BIN ;TO BE INCREMENTED. .END ST BUFR BEQ 5$ NEG @R0 ;- NOT LAST BUFR 5$: JSR PC,CTOBUF ;PASS HISTO TBL TO CTRL BCS EROR2 MOV HTTBL,R1 ;SHIFT HISTO .TITLE DIRECTOR PROGRAM ;LAB-APPLICATIONS-11 ;DEC-11-SLABA-C-LA ;FILENAME DIRKTR.MAC ;FILE ID DIRKTR.3 .CSECT DIRKTR TBL DOWN MOV @R4,R2 ;# OF WDS TO MOV BLE 8$ ;NON TO TRANSFER 6$: MOV (R3)+,(R1)+ $SOB R2,6$ .ENDC 7$: MOV @SP,R0 ;P ;COPYRIGHT (C) 1975 ;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ;THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLYASS HISTO TBL TO CTRL MOD MOV (PC)+,(R0)+ HTTBL: 0 ;ST ADDR OF HISTO TBL MOV (PC)+,@R0 ;LAST BUFR SO + WDSREQ: 0 ;WORD ON A ;SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLUSION ;OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANY S REQUIRED FOR HISTO TBL JSR PC,CTOBUF BCC 8$ EROR2: MOV #2,HTEROR ;CTOBUF RTNED ERROR, DONT RTN C SET 8$: .IF DF CTREL$ OTHER COPIES ;THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ;OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM AND EL .ENDC TST (SP)+ ;POP STACK & C=0 RTS PC ;RETURN ;ON LAST BUFR.: ;IF ZEROTH, PUT -1 IN ITS BUFR, COMBINE HISTO TBL CLR @(SP)+ ;0 INPUT BUFR ADDR IN CTRL MOD TABLE RTS PC .IFF CLR @(SP) BR RTN .ENDC .DSABL LSB .IF DF HTZER$ . WITH ZEROTH BUFR, ; PASS SINGLE BUFR WHEN FULL, COMBINE REST INTO ; SELF, PASS THE COMBINED WITH PROPER LBI. ;IF NO ZEROTH JSBTTL ZEROUT SUBR TO OUTPUT INTO ZEROTH HISTOGRAM BUFFER ;THIS SUBR OUTPUTS 'RSPCT' INTO ZEROTH BUFR AND IF FULL ;GETS ANOTHERODE #3). IT MUST BE ; DEFINED ONLY IF MODE #3 TYPE SAMPLING IS BEING REQUESTED. .IF NDF,MAXRR$ MAXRR$=1 .ENDC ;FG$,LJSR PC,OVRLA2 ;CALL ROUTINE TO CLOSE OPEN FILES BR REINIT ;RECYCLE .SBTTL ROUTINE FOR PROGRAMMED START/STOP CONTROL VIA TETO ONE WHO AGREES ;TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE SOFTWARE ;SHALL AT ALL TIMES REMAIN IN DEC. ;THE IPSDR$,DR11K$,AND MAXDP$ ARE ALSO USED BY THIS PROGRAM. FOR THEIR ; MEANING, PLEASE CONSULT THE MODULES MANUAL, SINCE THE MODULNFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE ;WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A ;COMMITMENT BY DIGITAL EQUIPES ; DETERMINE HOW OR IF THESE PARAMETERS ARE TO BE DEFINED. .SBTTL DIRECTION SECTION. THIS PART OF THE PROGRAM, CALLS MENT CORPORATION. ;DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ;ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPL ;THE OVERLAYS AS NEEDED, STARTS THE CONTROL MODULE ;AND STARTS THE PROCESS OF LOOKING FOR A PROGRAMMED ;START/STOP COMMAIED BY DEC. ;LDP SOFTWARE DEVELOPMENT JUNE 1975 .SBTTL MACROS,GLOBALS,AND CONDITIONAL ASSEMBLY PARAMETERS .MCALL ..ND, VIA THE TERMINAL, IF THE ;CONTINUOUS SAMPLING MODULE WAS PARAMETERIZED AS SUCH. THRU: BIS #100,@#44 ;SET BIT 6 INV2..,.REGDEF,.QSET,.MRKT,.CMKT,.TTINR,.TTYIN,.PRINT .MCALL .TWAIT ..V2.. .REGDEF ;INTERNAL GLOBALS .GLOBL CTNOFD, JOB STATUS WORD .IF DF,FG$ .PRINT #GIVCTF ;REMIND USER TO HIT .QSET #QUEUE,#1 ; (CNTRL) F (CR) WATING: MOV #TAREA,R0 CTNOFB ;PERTAINENT TO C.T. MOD. .GLOBL CSMODE,CSNOFC,CSRATE,CSTICK,CSNOFB ;PERTAINENT TO C.S. MOD. .GLOBL CSTYPE,CSCHGP,CSD.TWAIT ;MEANWHILE, WAIT NOP GETING: .TTINR BCS WATING CMPB R0,#12 ;WAIT FOR END OF LINE BNE GETING .ENDC REINIOUT,CSSOUT,CSHOUT .GLOBL CSSIN,CSHIN,CSSTOP,CSRRCT,CSRRTB,CSTART .GLOBL PROGSS,TTYBUF ;EXTERNAL GLOBALS .GLOBL OVRLA1T: JSR PC,OVRLA1 ;CALL PARAMETERIZATION-INITIALIZATION CLR R0 ;SET SEEK FOR CHANNEL 0 JSR PC,TPSEK ;START HEAD IN MOTION ,OVRLA2 ;ADDRESSES OF OVERLAYS .GLOBL CTSTRT,CTIDON ;GLOBALS FROM OF C.T.MOD .GLOBL CSAMPL ;START/STOP ADDR OF TST PROGSS ;CHECK FOR PROGRAMMED START/STOP(VIA TTY) .ENABL LSB BEQ 2$ ;IF NOT, JUST GO TO CONTROL MODULE .IF NDF,FG$ ; CONTINUOUS SAMPLING MOD .GLOBL TPSEK ;FROM TPUT .IF NDF,FG$ .GLOBL CTIBUF,TTYCHK ;ADDRESS TO PASS BUFFERS .EN MOV #-1,R2 ;OTHERWISE, ENABLE ROUTINE MOV R2,R1 ;TO LOOK FOR TTY INPUT TO START AND STOP MOVB CTNOFD,R0 ;ACQUISITION. RDC ; IN C.T. MOD, AND ; ROUTINE TO PROCESS ; PROGRAMMED START/STOP ;CONDITIONAL ASSEMBLY PARAMETERS NEEDED OUTINE IS A SELF FEEDING JSR PC,CTIBUF ;DUMMY DATA PATH PROCESS .ENDC .IF DF,FG$ TST QUEDON ;OTHERWISE, ENABLE ROUT ;MAXRR$ IS THE ONLY PARAMETER WHICH IS DIRECTLY APPLICABLE TO THE PROGRAM ; AND IS NOT DIRECTLY INVOLVED IN THE MODULES THEMINE TO LOOK BNE 1$ ;FOR TTY INPUT TO START AND STOP .QSET #QUEUE,#1 ;ACQUISITION. ROUTINE IS .MRTM DRIVEN. 1$: .MRKT #ARESELVES. IT ; REPRESENTS THE TOTAL NUMBER OF POSSIBLE ENTRIES IN A ROUND ROBIN ; TABLE(SEE CONTINUOUS SAMPLING MODULE UNDER MA,#INTRVL,#TTYCHK,#1 .ENDC 2$: JSR PC,CTSTRT ;START CONTROL MODULE .IF DF,FG$ .CMKT #AREA,#1 ;STOP CLOCK .ENDC .TTYIN ;OTHERWISE, GET LF OUT OF BUFFER JSR PC,CSAMPL ;PASS VALUE TO C.S. MODULE 3$: TST CTIDON ;CHECK TO SEE IF ACQUISITIååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååON FINISHED BEQ 4$ ;IF SO, NO NEED TO CHECK FOR MORE INPUT, ; SO BRANCH TO EXIT .IF DF,FG$ .MRKT #AREA,#INTRVL,#TTYååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååCHK,#1 ;RESTART CLOCK .IFF MOV #-1,R2 ;GIVE PROCESS ANOTHER DUMMY BUFFER MOV R2,R1 ;TO PROCESS, THUS ENABLING IT MOVååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååB CTNOFD,R0 ;WHEN TIME AVAILS. JSR PC,CTIBUF .ENDC 4$: RTS PC .SBTTL STORAGE AREA. ;AREA WHERE PREVIOUS RUN PARAMETååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååRMINAL ;IF IN F/G ENVIRONMENT, A .MRKT IS USED TO CHECK EVERY ;TENTH OF A SECOND OR SO FOR TERMINAL INPUT. ;IF IN S/J ERS AS WELL AS ;PROGRAM STORAGE LOCATIONS ARE KEPT CTNOFD: .BYTE 1 ;STORED PARAMETERS FOR CONTROL MODULE CTNOFB: .ENVIRONMENT, A SELF-FEEDING DATA PATH WITH ;ONE PROCESS OF LOWEST PRIORITY IS USED TO CHECK FOR ;TERMINAL INPUT. ;A.)IBYTE 4 ;ONLY TWO VARY CSMODE: .WORD 1 ;STORRED PARAMETERS FOR CSNOFC: .WORD 1 ; CONTINUOUS SAMPLING ROUTINE CSRATE: .WF INPUT IS NOT AVAILABLE: ; IN F/G ANOTHER .MRKT COMMAND IS GIVEN, AND THE ; ROUTINE RETURNS. ; IN S/J A DUMMY BUFFER ORD 4 CSTICK: .WORD 5 .BLKW MAXDP$-1 CSNOFB: .WORD 12 .BLKW MAXDP$ CSTYPE: .WORD 0 CSCHGP: .WORD 0 .BLKB MAXDP$ .EVE(ADDRESS OF -1) IS GIVEN ; TO THE CONTROL MODULE FOR THIS PROCESS, AND ; THEN THE ROUTINE RETURNS. ;**EXCEPTION: N .IF DF,LPSDR$ ! DR11K$ CSDOUT: .WORD 0 CSSOUT: .WORD 1 .BLKW MAXDP$ CSHOUT: .WORD 2 .BLKW MAXDP$ .ENDC CSSIN: .WO; IF THE ACQUISITION HAS STOPPED,I.E.,CTIDON=0. ; IN THIS CASE THE ROUTINE SIMPLY RETURNS ; WITH NO FURTHER ACTION. RD 4 .BLKW MAXDP$ CSHIN: .WORD 10 .BLKW MAXDP$ CSSTOP: .WORD 20 CSRRCT: .WORD 1 CSRRTB: .BYTE 0 .BLKB MAXRR$-1 .EVEN;B.)IF INPUT IS AVAILABLE, IT IS GIVEN TO THE CONTINUOUS ; SAMPLING ROUTINE IN R1 VIA CSAMPL, AND THEN PROCEEDS ; AS I CSTART: .WORD 0 .IF DF,FG$ QUEDON: .WORD 0 ;FLAG TO TEST IF .QSET AREA IS RESERVED QUEUE: .BLKW 5 ;AREA FOR QUEUE S A.) TTYCHK: .TTINR ;CHECK FOR TTY LINE .ENABL LSB BCS 3$ ;IF NONE AVAILABLE, SPLIT CLR R1 ;PREPARE FOR MASK ELEMENT FOR .MRTM AREA: .BLKW 5 ;AREA NEEDED BY .MRTM SCRATCH TAREA: .BYTE 0,24 ;AREA FOR TWAIT .WORD INTRVL INTRVL: .WO BR 2$ 1$: SUB #60,R0 ;ASSUME OCTAL NO. STRIP OFF ASCII ASL R1 ;MULTIPLY OLD VALUE BY EIGHT ASL R1 ASL R1 ADD R0,R1 RD 0,6 ;INTERVAL TO CHECK(ABOUT 1/10 SEC) GIVCTF: .ASCIZ /TYPE (CTRL)F(CR) TO START PROGRAM/ .ENDC PROGSS: .WORD 0 ;PROG;ADD NEW VALUE .TTYIN ;GET NEXT VALUE 2$: CMP #15,R0 ;CHECK FOR CARRIAGE RETURN BNE 1$ ;IF NOT, UPDATE CURRENT VALUE RAMMED START/STOP FLAG TTYBUF: .BLKB 112 ;ALLOW FOR 72 CHARACTER TERMINAL .END THRU