@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ RSTS70 DECRT11A  OykQ.c! 8OykQc! 8OyHkQ#c! 8OykQ)c! 8Cy_kQc! 8FyQkQc! 8Fy( COLST=6 TEXT=7 FFLOAT=15 EXP=16 .IFDF SPDDI$ .IFDF CAPS$ .GLOBL DEFLCK,DEEOL,DENORM .IFNDF SPNDI$ .GLOBL DESCA,DEMXMN,DEADJ .ENDC .ENDC .GLOBL DEDI,DEDIB2,DEDATA,DEASGN,DECMD,DEFLG1,DELST,DEONE,DEDID .GLOBL IFIX,MULT,DEDIT1,DEFORE,DECMD1,DEFLG4,QA,QADATF,DEOFY .GLOBL DISYBU,DISST,DIST,DISN,DISCU,DISSC,DISOFY,DEDYSZ,DEDXSZ .GLOBL DISTYP,DISCI,DISOFX,DISSZXkQ c! 8PykQ,c! 8:dHE c! 8 KkQ c! 8.SkQc! 8&kQc! 8OyЎkQc!.TITLE SPOV2 ;LAB APPLICATIONS-11 DISPLAY COMMAND ;DEC-11-SLABA-C-LA16 ;FILE ID SPOV2.1 ;FILE: SPOV2.MAC .CSECT SPOV2 ;C 8Oy kQ c! 8OypkQc! 8Cy_kQc!OPYRIGHT (C) 1974,1975 ;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ;THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ON 8Cy_kQc! 8MykQc! 8&kQ4c! LY ON A ;SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLUSION ;OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR AN8Cy`kQc! 8 @kQc! 8:d!kQ c! 8*KkQY OTHER COPIES ;THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ;OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM ANxc! 8  D 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, 1974-5 ; CARL RALSTON ; ASSEMBLY PARAMETER: GT40$ IF DEFINED WILL ASSEMBLE CODE FOR GT40 ; ELSE FOR VR14 ;GT40$=1 ;DEFINITIONS R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 EXIT=0 CRLFC0=3IFDF GT40$ JSR PC,@#DEGTOF ;TURN GT40 OFF .ENDC CLR @#DEDID ;INHIBIT DEFAULT-DATA-EDITOR-CMDS CLRB @#DEFLG1 ;INHIBITE? BLOS DEDI6 ;NO MOV @#DEDXSZ,R0 ;YES DEFAULT = SCOPESIZE BR DEDI6 DEDI3: JSR R5,@#IFIX BR DEDI4A DECMD1+4 DEDI DISPLY JSR R5,QA 20000+400+20 ;NULL ANS OK+SILENT QUES+ALPHA CMD DEDADR TSTB @#QADATF ;ANY ALPHAN CHAR GIVEN? BEQ 4A: DEC R0 ;(START-1) MOV R0,DEDIST ;SAV (START-1) BGE DEDI5 ;START-1<0? MOV #17.,R0 ;YES--(ERR) JMP DEDIEE DEDIDEDIB2 ;NO--USE DEFAULT NEW TST R0 ;'N' OR 'O' WAS SPECIF? BPL DEDI1 ;YES MOV #15.,R0 JMP DEDIEE ;NO,ILLEG CHAR-5: JSR R5,@#IFIX BR DEDI6 DECMD1 DEDI6: MOV R0,DEDIWI ;SAV WINDOW SIZE BGT DEDI6A MOV #18.,R0 JMP DEDIEE ;WINDOWSI-(ERR) DEDI1: BEQ DEDIB2 ;N WAS SPECIF ;COME HERE ONLY WHEN USING 'OLD' PARAMETERS MOV #177777,(PC)+ ;O WAS SPECIF--SZE < 1--(ERR) DEDI6A: CMP R0,@#DEDXSZ ;WINDOW > SCOPE SIZE ? BLOS DEDI6B ;NO MOV #20.,R0 JMP DEDIEE ;YES--(ERR) DEDET FLG! DEDIWI: 0 ;SAVE WINDOW SIZE CMP R1,#1 BNE DEDIB3 ;PREVIOUS DISPLY WASNT 'DDI' (ERR) MOV #DEDIT1,R0 ;GET 1STI6B: ADD DEDIST,R0 ;(ST-1) + WINDOW CMP R0,@#DEDATA+2 ;(ST-1) + WINDOW > BUFSIZ ? BLOS DEDI7 MOV #19.,R0 JMP DEDIEE I/D TBL ADDR TST DIST(R0) ;WAS A BUFR CMD GIVEN BTWN DISPLY CMDS? BNE DEDI7 ;NO DEDIB3: MOV #16.,R0 JMP DEDIEE ;YES;YES--(ERR) ;TIME TO FIND OUT IF B IS SP OR FP ; FIRST SAV 'DECMD'(THE TRUE TYPE & #) SINCE ; FP-VR14 DATA CODE WILL CHAN,DISTOP,DISBOT,DEOFYD .GLOBL DISBUF,DEDATT,FLOAT,DETLE .IFDF VR14$ .GLOBL DINIT .ENDC .IFDF GT40$ .GLOBL DISMPO,DEDBCB,--(ERR) BECAUSE 'OLD' PARAMS ARE GONE ; ---DEDIB2---IS AN ENTRY PT USED BY THE DATA ANALYSIS ROUTINE ; UPON COMPLETION OF GINIT,DEGTOF,DEGTON,GTDISP,DEFREE,DETOP .GLOBL DEGIDF,DEGFXF,DECDID,GTRCAL,DISSKP,DISGRA,DEGFCJ .ENDC ;ROUTINES CALLED:DEFTHE 'AAD' CMD ; COME HERE ONLY WHEN NEED TO DEFINE A 'NEW' DISPLY ; 1ST SET UP 'DENORM' ; GET'START' AND 'WINDOW' & CHK THEM ORE,IFIX,MULT,DINIT,DEADJ,FLOAT,DETLE ; DESCA,DEMXMN,DEEOL,DENORM,QA,GINIT ; DEGTOF,DEGTON,GTDISP ;---DDI B [WINDOWSIZE[STOUT DEDIB2: CLR @#DEDID ;THESE TWO INSTR WERE CLRB @#DEFLG1 ;REPEATED FOR 'AAD CMD' MOV @#DEOFYD,R1 ASL R1 ;R1=SCOART]] [NEW OR OLD] ;IF NEW-DISPLAY A BUFFER (S# OR F#) WITH 'WINDOWSIZE' BEING ; THE TOTAL #PTS TO DISPLAY AT ANY ONE TIME. ;PE SIZE TST @#DEDATT ;POS-NEG-DATA? BNE DEDI2 ;NO ASR R1 ;YES - R1=HALF-SCOPE-SIZE DEDI2: DEC R1 MOV R1,DEDIWI ;T 'START' IS THE 1ST PT DISPLYED SUCH THAT ; START+WINDOW <= BUFSIZ AND WINDOW <= SCOPE SIZE ;IF OLD-DISPLAY A BUFR B BUT USE EMP STORAGE JSR R5,@#FLOAT BR DEDI2A DEDIWI DEDI2A: MOV R0,@#DENORM ;'DENORM' IS NOW SETUP MOV R1,@#DENORM+2 CMP #17THE I/D TBL ; INFO FROM THE PREVIOUS 'NEW'. ;DEFAULTS: WINDOWSIZE=BUFSIZE IF <= SCOPESIZE, ELSE = SCOPESIZE ; OPTION='NEW' 7777,@#DECMD1+4 ;START WAS SPECIF ? BNE DEDI3 ;YES CLR (PC)+ ;NO, SAV (DEFAULT-1) VALUE DEDIST: 0 CMP #177777,@#DECMD; START=1 DEDI: JSR R5,DEEOL ;CHK ANY EXCESS BUFRS/CONSTANTS .BYTE 2,10 MOVB @#DEFLG1,R1 ;SAV PREVIOUS DISPLY TYPE .1 ;WINDOWSIZE WAS SPECIF ? BNE DEDI5 ;YES MOV @#DEDATA+2,R0 ;NO, SAV DEFAULT VALUE CMP R0,@#DEDXSZ ;DEFAULT > SCOPESIZ- 'DEADJ' GETS F.P. DATA VIA ; 'DECMD' AND DEPOSITS IT VIA 'DECMD+2 MOV #DEASGN+2,R5 ;ADDR+2 OF 1ST S.P. ASSIGN ENTRY IS P(#-1)*BUFSZ ADD @#DEDATA+6,R5 ;2*(#-1)*BUFSZ +ADR OF 1ST BUF MOV #1,R1 ;SET DATA TYPE (SP=1) .IFDF VR14$ CLR R2 ;SEUT JSR PC,DEADJ ;IN R5 FOR 'DEADJ' MOV @#DECMD+2,@#DECMD ;THE S.P. BUF IS ALWAYS DISPLYED BR DEDI9 .ENDC ; TIME TO FT CHAN/INTEN .ENDC .IFDF GT40$ MOV #6,R2 .ENDC ;FILL IN I/D TBL DEDI10: MOV #DEDIT1,R0 ;ADR OF I/D TBL .IFDF GTIND MULT & OFFSET SO GT40 DISPLY CAN SCALE DOWN ; THE F.P. DATA FOR DISPLY .IFDF GT40$ ;GT40 VERSION FOR F.P. BUFR MOVB40$ MOVB #1,DISSKP(R0) CLRB DISGRA(R0) .ENDC MOV R5,DISYBU(R0) ;BUFADR MOV R1,DISTYP(R0) ;DATA TYPE MOV R2,DISCI(R @#DECMD,@#DEASGN ;SET F# OF 1ST ENTRY MOV #DECMD,R1 ;NEED TYPE & # OF B, & CLR R0 ;NEED START OF B, & MOV @#DEDATA,R5 0) ;CHAN/INTENSITY TST DEDIWI ;OPTION 'OLD' WANTED? BMI DEDI11 ;YES MOV @#DEDATA+2,DISBUF(R0) ;BUFSZ (# DATA PTS) M DEC R5 ;NEED SIZE-1 OF B TO JSR PC,DEMXMN ;FIND MAX-MIN TO JSR PC,DESCA ;FIND MULT & OFFSET FOR SCALING MOV #DEASGNOV DEDIST,DISST(R0) ;START-1 MOV DEDIWI,DIST(R0) ;WINDOW SIZE MOV #1,DISN(R0) ;N=1 CLRB DISCU(R0) ;CURSOR FLG=0 CLRB +2,R5 MOV R1,(R5)+ ;SAV 'MULT' IN ASSIGN TBL MOV R2,(R5)+ MOV R3,(R5)+ ;SAV 'OFFSET' IN ASSIGN TBL MOV R4,(R5) MOV #DISSC(R0) ;SCA FAC=0 CLRB DEFLG4 ;CLEAR WINDOW FLG CLR DISOFX(R0) ;X-AXIS OFFSET MOV @#DEOFY,DISOFY(R0) ;Y-AXIS OFFSEDEDIT1,R0 ;ADDR IF 1ST I/D TBL ADD #DISMPO,R0 ;INDEX FOR STORING: MOV R1,(R0)+ ;'MULT' IN I/D TBL MOV R2,(R0)+ MOV R3T MOV @#DEDXSZ,DISSZX(R0) ;SCOPE SIZE X MOV @#DEDYSZ,DISTOP(R0) ;TOP OF DISPLY CLR DISBOT(R0) ;BOT OF DISPLY=0 ;SET I/,(R0)+ ; & OFFSET IN TBL MOV R4,(R0) ; PUT ST ADDR OF F.P. DATA BUFR IN R5 ; PUT DATA TYPE (F.P. = -2) IN R1 ; PUT INTEND TBL ADDR IN DELST & DEONE DEDI11: MOV #DEDIT1,@#DELST CLR @#DELST+2 ;2ND TBL DOESNT EXIST MOV #DEDIT1,@#DEONE CLR @#SITY VALUE IN R2 MOVB @#DECMD,R0 ;GET # DEC R0 ASL R0 ASL R0 ;(#-1)4--F.P. TAKES 4BYTES/DATUM MOV @#DEDATA+2,R5 DEONE+2 ;2ND TBL DOESNT EXIST .IFDF VR14$ JSR PC,@#DINIT .ENDC .IFDF GT40$ ; SET UP DISPLY BUFR CONTROL BLK (DEDBCB)GE IT DEDI7: JSR PC,@#DETLE ;CHK OTHER CMD STRING EXCESSES MOV @#DECMD,(PC)+ ;TYPE/# OF B(SAV FOR AWHILE) DEDIMD: 0 CL;BUFSIZ JSR PC,@#MULT ADD @#DEDATA+12,R5 ;4*(#-1)*BUFSIZ+ADR OF 1ST F.P. BUFR MOV #177776,R1 ;SET DATA TYPE (F.P.=-2) R @#DEDID+2 ;ONLY 1 DISPLY TSTB @#DECMD+1 ;WHAT TYPE IS B? BEQ DEDI8 ;SNGL .IFDF VR14$ TSTB @#DEASGN+1 ;A S.P. BUFRMOV #6,R2 ;SET INTENSITY (BRIGHT=6) BR DEDI10 .ENDC ; CODE FOR S.P. BUFS FOLLOWS DEDI8: CLRB @#DEASGN ;CLR F# OF 1S WAS ASSIGNED BNE DEDI7A MOV #21.,R0 JMP DEDIEE ;ASSIGN TBL IS EMPTY,ERR. DEDI7A: MOVB @#DECMD,@#DEASGN ;SET F# OF 1ST T ENTRY ;PUT ST.ADR. OF S.P BUFFER IN R5 ; PUT DATA TYPE (S.P.=0) IN R1 ; PUT STATUS WORD FOR CHAN/INTENSITY IN R2 DEDI9ENTRY CLRB @#DECMD+3 ;SET TYPE & # FOR MOVB @#DEASGN+1,@#DECMD+2 ;S.P. BUFR IN DECMD+2 ; NOW SCALE THE F.P. DATA DOWN : MOVB @#DECMD,R0 ;GET# DEC R0 ;#-1 ASL R0 ;(#-1)*2 (S.P. TAKES 2 BYTES) MOV @#DEDATA+2,R5 ;BUFSZ JSR PC,@#MULT ;RE SUB (R1)+,R2 ;TOP-1ST FREE LOC TST (R2)+ ;(TOP-1ST FREE)+2 MOV R2,(R1) ;SET BUFSIZ=(TOP-FREE)+2 JSR PC,@#GINIT CLR R0 DEMO2: JSR R5,@#DEGET DECMD JSR R5,@#DEPUT DECMD+2 INC R0 DEC R1 BNE DEMO2 JSR PC,@#DEFLCK ;OUTPUT BUFR M JSR PC,@#GTDISP ;CALL GT40 'DISPLY MODULE' TST R0 BEQ DEDI13 MOV #22.,R0 JMP DEDIEE ;GT40 BUFR NEEDS EXCEEDED DEDI1AY BE F.P. RTS PC DEME1: MOV #23.,R0 ;SPECIFY A 2ND BUFR TST (SP)+ ;POP NORMAL RTN OFF STACK JMP @#DEFORE .ENDC ;3: .IFDF RT11$ MOV @#DEDBCB,R0 ;GET DISPLY BUFFER ADDR .INSRT ;TELL GRAPHICS ABOUT IT MOV #DEGFCJ,R0 ;GET FREE CUR,--- NORMALIZE COMMAND --- .IFDF SPDNO$ .IFDF CAPS$ .GLOBL DEOPBU,DEADJ,DEFLCK,DESCA,DEMXMN,DEEOL,DEFMCK .GLOBL DEFMK0,DELINES ;SUBR CALL ADDRESSES .INSRT ;TELL GRAPHICS ABOUT THEM .ENDC JSR PC,@#DEGTON ;TURN GT40 ON .ENDC MOV DEFMK1 .ENDC .GLOBL DENO,DEDATA,DECMD,$POLSH,$CMR,DEGET,DEPUT,SAVARG,DETLE .GLOBL $MLR,$SBR,FORMAT,DEFORE,DECMD1,RSTARG ;RODIMD,@#DEDID ;ENABLE DEFAULT-DATA-EDITOR-CMDS MOVB #1,@#DEFLG1 ;ENABLE DISPLAY CMDS .IFDF GT40$ MOVB #-1,@#GTRCAL TSTBUTINES CALLED: DEFLCK,$POLSH,DEMXMN,DEGET,DEPUT,DESCA ; FORMAT,DEFMCK,DEEOL,DEFORE,DEOPBU,SAVARG,RSTARG,DETLE ;---DNO B1 B2 @#DEGIDF BNE DEDI12 TSTB @#DEGFXF BEQ DEDI14 DEDI12: TST (SP)+ JMP @#DECDID .ENDC DEDI14: RTS PC ;ALL DONE ;ERRL H--- ;L&H ARE OPTIONAL-WHEN SPECIFIED, EACH DATUM OF B1 OUTSIDE THESE ;LIMITS IS SET TO ITS CORRESP. LIMIT. ALL DATA IS ;NORS DEDIEE: TST (SP)+ ;GET NORMAL RETN OFF STACK JMP @#DEFORE ;CMD LIST USED BY 'QA' TO FIND OPTION DEDADR: .BYTE 3ORMALIZED TO THESE LIMITS. ;IF OPTIONS ARE ABSENT, DATA IS NORMALIZED REL. TO MAX-MIN VALS DENO: JSR R5,DEEOL ;CHK EXCESS BU,1 .BYTE 'N ;NEW .BYTE 'O ;OLD .BYTE 0 .EVEN .ENDC ;---MOVE COMMAND--- .IFDF SPBMO$ .IFDF CAPS$ .GLOBL DEFLFRS/CONSTANTS .BYTE 4,10 JSR PC,@#DETLE ;CHK OTHER CMD STRING EXCESSES JSR PC,@#DEOPBU ;CHK OPTIONAL BUFR,B1,B2 CMP @#DECK,DEEOL .ENDC .GLOBL DEMO,DEDATA,DEGET,DEPUT,DECMD,DEFORE,DETLE ;ROUTINES CALLED DEEOL,DEGET,DEPUT,DEFLCK,DEFORE,DETLE CMD1,#177777 ;1ST OPTION EXISTS? BNE DENO1 ;YES CMP @#DECMD,@#DECMD+2 ;NO B1=B2? BEQ DENO7 ;YES, EVERYTHING IS OK MOV ;---BMO B1 B2--- ;MOVE DATA OF B1 INTO B2 ;BOTH B1 & B2 MUST BE SPECIFIED ;IF B1 IS F.P. AND B2 IS S.P. THE TRANSF COULD CAU #177777,R0 ;NO, THEREFOR TRANSFR CONTENTS MOV @#DEDATA,R1 ;OF B1 TO B2 DENO0: INC R0 JSR R5,@#DEGET DECMD JSR R5,@#DEPSE AN FPMP ; ERROR DUE TO FIXING DATA TO +-15 BITS. ;ALL OTHER COMBINATIONS (B1,B2 BOTH F.P. OR S.P.) OR ; (B1 S.P. & B2 F.P.UT DECMD+2 DEC R1 BNE DENO0 ;TRANSFR NOT DN YET BR DENO7 ;TRANSFR IS DN! DENO1: CMP @#DECMD1+4,#-1 ;2ND OPTION MUST E) WILL CAUSE A TRANSF ; FROM B1 DIRECTLY TO B2 WITH NO PROBLEM DEMO: JSR R5,DEEOL ;CHK EXCESS BUFRS/CONSTANTS .BYTE 4,0 XIST BNE DENO2 ;YES IT DOES JMP DENOE1 ;NO ---(ERR) DENO2: MOV @#DEDATA,DENO10 ;SET DN CTR = DATASIZE MOV #-1,DENOR0 ;I MOV #DEDBCB,R1 ;ADDR OF BUFR CTRL BLK MOV @#DEFREE,(R1) ;SET BUFR ADDR = 1ST FREE LOC MOV @#DETOP,R2 ;TOP OF FREE COJSR PC,@#DETLE ;CHK OTHER CMD STRING EXCESSES TST @#DECMD+2 ;B2 WAS SPECIFIED? BMI DEME1 ;NO-- ERR MOV @#DEDATA,R1 ;YES PE & # OF B2 CLR R0 ;ST PT =0 MOV @#DEDATA,R5 DEC R5 ;#PTS-1 = #PTS TO SCAN FOR MAX-MIN JSR PC,DEMXMN JSR PC,DESCAVE OF F.P. DATUM FROM 'DEGET' DENOMU: 0,0 ;SAVED SCA FAC AFTER SCALING DENOMO: 0,0 ;SAVED OFFSET AFTER SCALING .ENDC ; MOV R1,DENOMU MOV R2,DENOMU+2 MOV R3,DENOMO MOV R4,DENOMO+2 MOV #-1,R0 ;R0 IS NOW INDEX FOR DEGET/DEPUT MOV @#DEDA---MAX-MIN COMMAND--- .IFDF SPBMM$ .IFDF CAPS$ .GLOBL DEFXCU,DEOPBU,DEMXMN,DEEOL,DEFMCK .GLOBL DEFMK0,DEFMK1 .ENDC .GNDEX PTR USED BY DEGET MOV @#DECMD1+2,-(SP) ;PUT 1ST VALUE ON STACK MOV @#DECMD1,-(SP) MOV @#DECMD1+6,-(SP) ;PUT 2ND VALUETA,R5 ;R5 IS DN CTR DENO8: INC R0 ;CURRENT INDEX MOV R0,DENOR0 ;POLSH DESTROYS REGS JSR PC,@#SAVARG MOV R2,-(SP) ;PUT SC ON STACK MOV @#DECMD1+4,-(SP) JSR R4,@#$POLSH $CMR,.+2 BMI DENO3 ;L,H VALUES ENTERED IN ORDER MOV @#DECMD1,R0 ;H,L EA FAC ON STACK MOV R1,-(SP) JSR R5,@#DEGET ;PUT DATUM ON STACK DECMD+2 MOV R4,-(SP) ;PUT OFFSET ON STACK MOV R3,-(SP) NTERED, THUS REVERSE ORDER MOV @#DECMD1+2,R1 MOV @#DECMD1+4,@#DECMD1 MOV @#DECMD1+6,@#DECMD1+2 MOV R0,@#DECMD1+4 MOV R JSR R4,@#$POLSH ;(DATUM-OFFSET)*SAC FAC $SBR,$MLR,.+2 MOV DENOR0,R0 JSR R5,@#DEPUT ;PUT NORMALIZED VALUE IN B2 DECMD+21,@#DECMD1+6 DENO3: MOV (PC)+,R0 DENOR0: 0 INC R0 JSR R5,@#DEGET ;GET DATUM FROM B1 DECMD MOV (SP)+,DENO11 ;SAV F.P. D JSR PC,@#RSTARG DEC R5 ;NORMALIZE DONE YET? BNE DENO8 ;NO ;TYPE OUT SCA FACTOR IN SPECIFIED FORMAT ;THIS IS THE SETATUM MOV (SP),DENO11+2 ; ALSO MOV DENO11,-(SP) ;LEAVE DATUM ON STACK MOV @#DECMD1+6,-(SP) ;PUT H ON STACK MOV @#DECMD1+4 UP JSR PC,@#DEFLCK ;OUTPUT BUFR MAYBE F.P. DENOX: MOV PC,R2 TST -(R2) SUB #DENOX-DENOMU,R2 ;R2=ADDR OF DENOMU RELOCATE,-(SP) JSR R4,@#$POLSH $CMR,.+2 BMI DENO4 ;DATUM < H MOV @#DECMD1+6,-(SP) ;DATUM >= H, THUS PUT H ON STACK MOV @#DECMD MOV R2,DENO17 ADD #4,R2 ;ADDR OF DENOMO RELOCATED MOV R2,DENO18 MOV DENOMU,DEFMK0 MOV DENOMU+2,DEFMK0+2 JSR PC,DED1+4,-(SP) BR DENO6 DENO4: MOV @#DECMD1+2,-(SP) ;PUT L ON STACK MOV @#DECMD1,-(SP) MOV DENO11+2,-(SP) ;PUT DATUM ON STACKFMCK MOVB DEFMK1,DENO15+1 MOV DENOMO,DEFMK0 MOV DENOMO+2,DEFMK0+2 JSR PC,DEFMCK MOVB DEFMK1,DENO16+1 ;THIS IS THE ACU MOV DENO11,-(SP) JSR R4,@#$POLSH $CMR,.+2 BMI DENO5 ;L < DATUM MOV @#DECMD1+2,-(SP) ;L >= DATUM, THUS PUT L ON STACKTAL OUTPUT JSR R5,@#FORMAT .BYTE CRLFC0,TEXT .ASCII /SCA FAC= / .BYTE 0 DENO15: .BYTE 16 ;FL=15,EXP=16 .BYTE 0 ;#DE MOV @#DECMD1,-(SP) BR DENO6 DENO5: MOV @#DENO11+2,-(SP) ;PUT DATUM ON STACK MOV @#DENO11,-(SP) DENO6: MOV DENOR0,R0 JC.PL. .BYTE 6 ;#SIG. DIG. .EVEN DENO17: DENOMU ;ADR OF SCA FAC .BYTE CRLFC0,TEXT .ASCII /OFFSET= / .BYTE 0 DENO16SR R5,@#DEPUT ;PUT CLIPPED VALUE IN B2 DECMD+2 DEC (PC)+ ;CLIPPING IS DONE? DENO10: 0 ;DN CTR =BUFSIZ INITIALLY BNE DE: .BYTE 16,0,6 .EVEN DENO18: DENOMO ;ADDR OF OFFSET .BYTE CRLFC0,EXIT .EVEN RTS PC ;ERROR DENOE1: MOV #10.,R0 NO3 ;NO ; NOW NORMALIZE THE DATA OF B2(POINTED TO BY DECMD+2) ; FIRST MUST FIND MAX-MIN OF B2 DENO7: MOV #DECMD+2,R1 ;TY;IF 1 OPTION IS SPECIF,SO MUST OTHER TST (SP)+ ;POP NORMAL RTN OFF STACK JMP @#DEFORE ;TAGS USED DENO11: 0,0 ;TEMP SAOV R2,DEMM9 MOV R4,DEMM10 MOV DEMAX,DEFMK0 MOV DEMAX+2,DEFMK0+2 JSR PC,DEFMCK MOVB DEFMK1,DEMM5+1 MOV DEMIN,DEFMK0 DEASS DESU: JSR PC,DEAS1 DESU1: MOV R0,@#DECMD1 JSR R5,@#DEGET DECMD+2 JSR R5,@#DEGET DECMD JSR R4,@#$POLSH $SBR, MOV DEMIN+2,DEFMK0+2 JSR PC,DEFMCK MOVB DEFMK1,DEMM6+1 ;THIS IS THE ACTUAL OUTPUT JSR R5,@#FORMAT .BYTE CRLFC0,TEX.+2 MOV @#DECMD1,R0 JSR R5,@#DEPUT DECMD+4 INC R0 CMP R0,@#DEDATA BMI DESU1 BR DEASS DEBMU: JSR PC,DEAS1 DEBMU1:T .ASCII /MAX VALUE=/ .BYTE 0,COLST,12. DEMM5: .BYTE 16 ;FLOAT=15, EXP=16 .BYTE 0 ;# DEC.PLACES .BYTE 6 ;#SIG. DIG. MOV R0,@#DECMD1 JSR R5,@#DEGET DECMD+2 JSR R5,@#DEGET DECMD JSR R4,@#$POLSH $MLR,.+2 MOV @#DECMD1,R0 JSR R5,@#D .EVEN DEMM9: DEMAX ;ADR OF MAX VALUE .BYTE CRLFC0,TEXT .ASCII /MIN VALUE=/ .BYTE 0,COLST,12. DEMM6: .BYTE 16 ;FLOATEPUT DECMD+4 INC R0 CMP R0,@#DEDATA BMI DEBMU1 BR DEASS DEBDI: JSR PC,DEAS1 DEBDI1: MOV R0,@#DECMD1 JSR R5,@#DEGET=15,EXP=16 .BYTE 0 ;#DEC. PL. .BYTE 6 ;#SIG. DIG. .EVEN DEMM10: DEMIN ;ADR OF MIN VALUE .BYTE CRLFC0,EXIT .EVEN DECMD+2 JSR R5,@#DEGET DECMD JSR R4,@#$POLSH $DVR,.+2 MOV @#DECMD1,R0 JSR R5,@#DEPUT DECMD+4 INC R0 CMP R0,LOBL DEMM,DECMD,DEDATA,FORMAT,DETLE ;ROUTINE CALLED: DEFXCU,DEMXMN,FORMAT,DEFMCK,DEOPBU,DETLE ; DEEOL ;---BMM B--- ;DE RTS PC ;TAGS USED DEMAX: 0,0 ;HOLDS MAXIMUM VALUE DEMIN: 0,0 ;HOLDS MINIMUM VALUE .ENDC ;--- ADD & SUB & MUL & DIV COMTERMINE THE MAX & MIN VALUE OF B BETWEEN THE ;FIXED CURSORS IF ACTIVE. IF NOT ACTIVE, OVER THE ;ENTIRE DATA ARRAY. ; ;MAXVAMANDS --- .IFDF SPBAD$ .IFDF CAPS$ .GLOBL DEFLCK,DEMXMN,DEEOL .IFNDF SPNDI$ .GLOBL DEADJ,DESCA .ENDC .ENDC .GLOBL DL ='DEMAX' ;MINVAL ='DEMIN' DEMM: JSR R5,DEEOL ;CHK EXCESS BUFRS/CONSTANTS .BYTE 2,0 JSR PC,@#DETLE ;CHK OTHER CMD STRINEAD,DESU,DEBMU,DEBDI,DECMD,DECMD1,DETLE .GLOBL $POLSH,$ADR,$SBR,$MLR,$DVR,DEDATA,DEGET,DEPUT ;ROUTINES CALLED:DEFLCK,$POLSH,G EXCESSES JSR PC,@#DEOPBU ;CHK OPTIONAL BUFR,B JSR PC,@#DEFXCU ;CHK IF CURSORS ARE ACTIVE TST R4 BMI DEMM3 ;CURSORS ARDEGET,DEPUT,DETLE,DEEOL ;--- BAD B1 B2 B3 --- B2+B1=B3 --- ;--- BSU B1 B2 B3 --- B2-B1=B3 --- ;--- BMU B1 B2 B3 --- B2*B1=BE NOT ACTIVE MOV R4,R0 ;START PT SUB R4,R5 ;(#PTS-1) TO SEARCH BR DEMM4 DEMM3: CLR R0 ;START PT=0 (INACTIVE) MOV @#D3 --- ;--- BDI B1 B2 B3 --- B2/B1=B3 --- ;IF B2 & B3 ARE NOT SPECIFIED, THEN THEY DEFAULT TO B1 ;IF B3 IS NOT SPECIFIED, IT DEDATA,R5 ;GET DATA SIZE DEC R5 ;R5=DATA SIZE-1 DEMM4: MOV #DECMD,R1 ;R1=ADR OF 'TYPE/#' OF B JSR PC,@#DEMXMN MOV R1,DEMAEFAULTS TO B2 DEAD: JSR PC,DEAS1 DEAD1: MOV R0,@#DECMD1 ;SAVE INDEX PTR JSR R5,@#DEGET ;PUT DATUM FROM B2 ONTO STACK DECX MOV R2,DEMAX+2 MOV R3,DEMIN MOV R4,DEMIN+2 ;OUTPUT MAX-MIN VALS IN SPECIFIED FORMAT ;THIS IS THE SET UP DEMMX: MOMD+2 JSR R5,@#DEGET ;PUT DATUM FROM B1 ONTO STACK DECMD JSR R4,@#$POLSH $ADR,.+2 MOV @#DECMD1,R0 ;$POLSH DESTROYS REGSV PC,R2 TST -(R2) SUB #DEMMX-DEMAX,R2 ;R2=ADDR OF DEMAX RELOCATED MOV R2,R4 ADD #4,R4 ;R4=ADDR OF DEMIN RELOCATED M JSR R5,@#DEPUT ;PUT RESULT FROM STACK INTO B3 DECMD+4 INC R0 CMP R0,@#DEDATA ;DONE? (R0=DATASIZE) BMI DEAD1 ;NO BR COMMAND--- .IFDF SPSAD$ .IFDF CAPS$ .GLOBL DEOPBU,DEFLCK,DEMXMN,DEEOL .IFNDF SPNDI$ .GLOBL DEADJ,DESCA .ENDC .ENMAND --- ;THIS FUNCTION SIMPLY CLEARS THE FREE CURSOR FLG IF IT ;IS SET, OR SETS IT IF IT IS CLEARED .GLOBL DEFR,DEWI,DEDR,DEDC .GLOBL DEOF,DEMU,DEDV,$MLR,$ADR,$DVR,$POLSH,DEDATA .GLOBL DEGET,DEPUT,DEFLG2,DECMD,DECMD1,DETLE ;ROUTINES CALLED: DEGET,XCUR,DEDPO,DE4POT,DEFLG1 .GLOBL DED1CO,DED2CO,DEFLG4,DEDIT1,DEDIT2,DEFORE .GLOBL DEFLG2,DEDXSZ .IFDF GT40$ .GLOBL DEGFCJ,DEDEPUT,$POLSH,DEOPBU,DEFLCK,DETLE,DEEOL ;--- SAD B1 B2 CONSTANT --- B1+CONSTANT=B2 --- ;--- SMU B1 B2 CONSTANT --- B1*CONSTANGLIJ,DEGLIX,DEGFC,DEGLI .GLOBL GTCCMD,DISGRA,DISSKP,GTSET,GTRCAL,GTDISP,DEGTON .GLOBL DEGTOF,GTTCMD,GTNCMD,DEDTA .ENDC .IFT=B2 --- ;---SDI B1 B2 CONSTANT---B1/CONSTANT=B2--- ;IF B2 IS NOT SPECIFIED, THEN IT DEFAULTS TO B1 DEOF: JSR PC,DEAMD DEODF VR14$ .GLOBL DITCMD,DICCMD,DISET .ENDC DEFR: CLR @#DE4POT COMB @#DEFLG1+1 .IFDF GT40$ BNE DEFR1 ;FLG JUST SET F1: MOV R0,@#DECMD+4 ;SAVE R0 JSR R5,@#DEGET ;PUT DATUM FROM B1 ONTO STACK DECMD ;PTR TO 'TYPE/#' OF B1 MOV @#DECMD1+ MOV #DEGLIJ,@#DEGFCJ+2 ;FLG JUST CLRD RTS PC DEFR1: MOV #DEGFC,@#DEGFCJ+2 .ENDC RTS PC ;---DEXCUR (FIX CURSOR CMD)-2,-(SP) MOV @#DECMD1,-(SP) ;PUT 'CONSTANT' ONTO STACK. JSR R4,@#$POLSH $ADR,.+2 MOV @#DECMD+4,R0 ;$POLSH DESTROYS REGS-- DEXCUR: CLR @#DE4POT .IFDF GT40$ JSR PC,@#GTCCMD .ENDC .IFDF VR14$ JSR PC,@#DICCMD .ENDC RTS PC ;---DWI JSR R5,@#DEPUT ;PUT RESULT FROM STACK INTO B2 DECMD+2 ;PTR TO 'TYPE/#' OF B2 INC R0 CMP R0,@#DEDATA ;DONE? (R0=DAT COMMAND--- ;THIS FUNCTION SIMPLY CLEARS THE WINDOW FLG IF IT IS SET ;OR SETS IT IF IT IS CLEARED DEWI: CLR @#DED1CO CLR ASIZE) BMI DEOF1 BR DEOMD DEMU: JSR PC,DEAMD DEMU1: MOV R0,@#DECMD+4 JSR R5,@#DEGET DECMD MOV @#DECMD1+2,-(SP) MOV@#DED2CO ;SET STARTS IN I/D TBLS =0 COMB DEFLG4 .IFDF VR14$ MOV #DEDIT1,R0 JSR PC,@#DISET MOV #DEDIT2,R0 JSR PC,@#@#DEDATA BMI DEBDI1 DEASS: MOV @#DECMD+4,@#DECMD+2 ;CHK OUTPUT BUFR (F.P. OR GT40) JSR PC,@#DEFLCK ;BUFR MUST BE IN 'DECMD @#DECMD1,-(SP) JSR R4,@#$POLSH $MLR,.+2 MOV @#DECMD+4,R0 JSR R5,@#DEPUT DECMD+2 INC R0 CMP R0,@#DEDATA BMI DEMU+2' FOR 'DEFLCK' RTS PC DEAS1: JSR R5,DEEOL ;CHK EXCESS BUFRS/CONSTANTS .BYTE 6,0 JSR PC,@#DETLE ;CHK OTHER CMD STRIN1 BR DEOMD DEDV: JSR PC,DEAMD DEDV1: MOV R0,@#DECMD+4 JSR R5,@#DEGET DECMD MOV @#DECMD1+2,-(SP) MOV @#DECMD1,-(SP) G EXCESSES CLR R0 ;R0 IS INDEX PTR FOR 'DEGET & DEPUT' TST @#DECMD+2 BPL DEAS2 ;B2 WAS SPECIFIED MOV @#DECMD,@#DECMD JSR R4,@#$POLSH $DVR,.+2 MOV @#DECMD+4,R0 JSR R5,@#DEPUT DECMD+2 INC R0 CMP R0,@#DEDATA BMI DEDV1 DEOMD: JSR PC,+2 ;B2 WAS NOT SPECIFIED; COPY B1 BR DEAS3 DEAS2: TST @#DECMD+4 BPL DEAS4 ;B3 WAS SPECIFIED DEAS3: MOV @#DECMD+2,@#DECMD@#DEFLCK RTS PC DEAMD: JSR R5,DEEOL ;CHK EXCESS BUFRS/CONSTANTS .BYTE 4,4 JSR PC,@#DETLE ;CHK OTHER CMD STRING EXCESSES+4 ;B3 WAS NOT SPECIFIED, COPY B2 DEAS4: RTS PC .ENDC ;--- MULTIPLY & OFFSET & FREE COMMAND --- ;---DIVIDE & WINDOW & DRAW JSR PC,DEOPBU ;CHK OPTIONAL BUFRS B1,B2 CLR R0 ;INDEX FOR 'DEGET & DEPUT' RTS PC .ENDC .IFDF SPDFR$ ;--- DFR COMSO RETURN JSR PC,@#DEGTOF ;YES, TURN OFF GT40 MOV #DEDIT1,R0 MOVB #1,DISGRA(R0) MOVB #1,DISSKP(R0) MOV #DEDIT2,R0 MOVB #1,DISGRA(R0) MOVB #1,DISSKP(R0) DEWI3: MOVB #1,@#GTRCAL JSR PC,@#GTDISP TST R0 BEQ DEWI2 MOV #22.,R0 ;GT40 BU.TITLE SPOV5 ;LAB APPLICATIONS-11 OPEN,INPUT,OUTPUT,REWIND,CLOSE ;DEC-11-SLABA-C-LA19 ;FILE ID SPOV5.1 ;FILE: SPOV5.MAC .CSFR NEEDS EXCEEDED DEWI4: TST (SP)+ ;GET NORMAL RTN OFF STACK JMP @#DEFORE DEWI2: JSR PC,@#DEGTON ;TURN GT40 BAK ON .EECT SPOV5 ;COPYRIGHT (C) 1974,1975 ;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ;THIS SOFTWARE IS FURNISHED UNDER A LICNDC DEWI5: RTS PC ;---DLI COMMAND--- ;THIS FUNCTION SIMPLY CLEARS THE DRAW FLG IT IT WAS SET ;OR SETS IT IF IT IS CLEARED ENSE FOR USE ONLY ON A ;SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLUSION ;OF THE ABOVE COPYRIGHT NOTICE. THIS DEDR: COM DEFLG2 .IFDF GT40$ BNE DEDR1 ;FLG JUST SET MOV #DEGLIX,@#DEGLIJ+2 ;FLG JUST CLRD RTS PC DEDR1: MOV #DESOFTWARE, OR ANY OTHER COPIES ;THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ;OTHER PERSON EXCEPT FOR USE ONGLI,@#DEGLIJ+2 .ENDC CLR @#DE4POT ;SET 'SUM OF 4 POTS'=0 RTS PC ;---DEDPO (POINTS CMD)---DEDTA (TBLDLTA CMD)--- DE SUCH SYSTEM AND TO ONE WHO AGREES ;TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE SOFTWARE ;SHALL AT ALL TIMES REMAIN DPO: .IFDF GT40$ JSR PC,@#DEGTOF ;TURN OF GT40 CMP R0,@#DEDXSZ ;#PTS > SCOPESIZE? BLOS DEDPO1 ;NO MOV #20.,R0 IN DEC. ;THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE ;WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A ;COMMITMENT ;YES--(ERR) BR DEWI4 DEDPO1: CLR @#DED1CO CLR @#DED2CO ;SET I/D TBL STARTS = 0 JSR PC,@#GTTCMD BR DEDPT DEDTA: JSR BY DIGITAL EQUIPMENT CORPORATION. ;DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ;ITS SOFTWARE ON EQUIPMENT WPC,@#DEGTOF CLR @#DED1CO CLR @#DED2CO JSR PC,@#GTNCMD DEDPT: MOV #DEDIT1,R0 MOVB #1,DISSKP(R0) MOV #DEDIT2,R0 MOVB HICH IS NOT SUPPLIED BY DEC. ;LDP SOFTWARE DEVELOPMENT, 1974-5 ; CARL RALSTON ;ASSEMBLY PARAMETER: GT40$ IF DEFINED WILL A#1,DISSKP(R0) TSTB @#DEFLG1 ;A DISPLY IS UP? BNE DEWI3 ;YES RTS PC ;NO, SO RETURN .ENDC .IFDF VR14$ CMP R0,@#DEDXSSSEMBLE CODE FOR GT40 ;VR14$ IF DF WILL ASSEMBLE CODE FOR VR14 ;THIS MODULE IS USED ONLY WITH RT-11 CRLFC0=3 EXIT=0 DEEZ ;#PTS > SCOPESIZE? BLOS DEDPO1 MOV #20.,R0 JMP @#DEFORE DEDPO1: JSR PC,@#DITCMD RTS PC .ENDC .ENDC RWD=52 ;RT-11 EMT ERROR CODE LOC .GLOBL DEOPN,DEINP,DEOUT,DEREW,DECLO,DEFLG1,FORMAT .GLOBL FLGOPN,DEFREE,DEFORE,OFILE,DEBTDISET .ENDC .IFDF GT40$ BNE DEWI1 MOV #DEDIT1,R0 CLRB DISGRA(R0) MOVB #1,DISSKP(R0) JSR PC,@#GTSET MOV #DEDIT2,R0 CLRB DISGRA(R0) MOVB #1,DISSKP(R0) JSR PC,@#GTSET RTS PC DEWI1: TSTB @#DEFLG1 ;A DISPLY IS UP? BEQ DEWI5 ;NO, N3: MOV #30.,R0 ;ERR--FILES ARE STILL OPEN DEOPN4: TST (SP)+ ;GET NORMAL RETN OFF STACK JMP @#DEFORE ;---MCL(OSE)--- ;THDATA WILL BEGIN. 1 IS THE 1ST VALUE IN B. ; (DEFAULT=START OF B) ;'FILE-POSITION' SPECIFIES THE NUMBER OF POINTS TO SKIP OVEROP,QA,DETLE .GLOBL QAANS,IFILE,DECMD,DEDATA,IFIX,QAERR,MULT .GLOBL DECMD1 .IF DF GT40$ .GLOBL GTRCAL,DEGTOF,DEDBCB .ENDCIS ROUTINE CLOSES ALL OUTPUT FILES THAT WERE WRITTEN INTO. ; OUTPUT FILES OPENED, BUT NEVER WRITTEN INTO ARE DELETED ;ALL INPU ;ROUTINES CALLED DEFORE,QA,IFIX,MULT,FORMAT,DEFLCK,DETLE .MCALL .CSIGEN,.CLOSE,.SRESET,.REGDEF,..V1.. .REGDEF ..V1.. T FILES ARE CLOSED. RT-11 IGNORES ANY CHANNELS NOT OPENED ;ALL NON-RESIDENT HANDLERS ARE RELEASED FROM CORE ; AND ALL TENTATI ;---MOP(EN)--- ;THIS ROUTINE CHECKS TO SEE IF ANY RT-11 FILES ARE OPEN ;IF ANY ARE OPEN, AN ERR IS OUTPUT FOLLOWED BY A RETUVE FILES ARE DELETED DECLO: JSR PC,@#DETLE ;CHK ANY CMD STRING EXCESSES TST @#OFILE ;1ST OUTPUT FILE ACCESSED? BMI DECLORN ; TO THE DATA EDITOR (#) ;IF NONE ARE OPEN, THE GENERAL MODE OF THE CSI IS CALLED ; TO ENABLE THE USER TO ENTER HIS FILE1 .CLOSE 0 ;YES, CLOSE IT DECLO1: TST @#OFILE+4 ;2ND ONE? BMI DECLO2 .CLOSE 1 ;YES, CLOSE IT DECLO2: TST @#OFILE+10 ;3S ; LIMIT IS 3 OUTPUT FILES AND 6 INPUT FILES ;ALL RT-11 HANDLERS WILL IMMEDIATELY FOLLOW THE CORE BUFRS DEOPN: JSR PC,@#DRD ONE? BMI DECLO3 .CLOSE 2 ;YES CLOSE IT DECLO3: .CLOSE 3 ;CLOSE ANY INPUT FILES WHICH .CLOSE 4 ;MAY BE OPEN .CLOSEETLE ;CHK ANY CMD STRING EXCESSES TST FLGOPN ;ANY FILES OPEN BNE DEOPN3 ;YES .IFDF GT40$ TSTB @#DEFLG1 ;ANY DISPLAY UP 5 .CLOSE 6 .CLOSE 7 .CLOSE 10 .SRESET ;RELEASE HANDLERS & DELETE TENTATIVE FILES ;NOW DO SOME HOUSEKEEPING MOV? BEQ DEOPN0 ;NO MOV #56.,R0 ;YES BR DEOPN4 DEOPN0: JSR PC,@#DEGTOF ;TURN GT40 OFF! .ENDC JSR R5,@#FORMAT ;ISSUE CR @#DEBTOP,@#DEFREE ;RESET FREE CORE TO 'BUFR TOP' CLR @#DEFLG1 ;CLR FR CUR FLG & DISPLY INACTIVE CLR FLGOPN ;SIGNALS NO FILLF BEFORE CALLING 'CSI' .BYTE CRLFC0,EXIT .EVEN MOV SP,R1 DEOPN1: .CSIGEN DEFREE,#DEFEXT ;FROM TERMINAL MOV R0,DEFREE ;ES ARE OPEN .IF DF GT40$ INCB @#GTRCAL ;SET GT40 RECALCULATION FLAG JSR PC,@#DEGTOF .IFDF RT11$ MOV @#DEDBCB,R0 ;REMOVR0 PTS TO FREE CORE AREA MOV R1,SP INC FLGOPN ;SET FLG WHEN FILES ARE OPEN ;TIME TO CLEAR DATA EDITOR I/O INFORMATION TAE GT40 DISPLAY BUFFER .REMOV .ENDC .ENDC RTS PC ;---MRE(WIND) FILE#--- ;THIS ROUTINE RESETS CURR. PT=0 AND REL. BLK=BLE MOV #OFILE,R0 ;R0=ADDR OF I/O INFO TABLE MOV #9.,R1 ;R1=9 SETS OF INFO (9 POSSIBLE FILES) CLR R2 ;CHANNEL CTR (EVE-1 ;FOR THE FILE SPECIFIED VIA FILE# ;FILE# IS SPECIF AS O1,O2,O3 OR I1,I2,I3,I4,I5,I6 DEREW: JSR PC,DEFILE ;GET PTR TO CN BYTE) DEOPN2: MOV #177777,(R0)+ ;1ST WD OF SET (CURR. REL. FILE BLK.) MOV R2,(R0)+ ;2ND WD OF SET (CURR. PT. & CHAN #) INORRECT I/O TBL ENTRY MOV #177777,(R4) ;REL. BLK TO RESET TO (-1) CLRB 3(R4) ;CURR. PT IS RESET TO 0 RTS PC ;---MIN(PUT)C R2 DEC R1 ;ALL NINE SETS ARE CLEARED YET? BNE DEOPN2 ;NO RTS PC ;YES DEFEXT: .RAD50 /DATDATDATDAT/ ;ERROR DEOP B #PTS FILE-POSITION BUF-POSITION FILE#--- ;'BUF-POSITION' IS THE NUMBERED POSITION WITHIN DATA BUFFER, B ; WHERE THE INPUT BEQ DEINP5 ;YES JSR PC,DETRIN ;NO (F.P) CALL TRANSFER-IN-ROUTN DEINP5: JSR PC,DETRIN ;CALL TRANSF-IN-ROUTN DEC R2 ;TRANS0 ;YES BR DEOUT9 DEOUT8: MOV #31.,R0 ;FILE NOT OPEN OR HARDWARE ERROR DEOUT9: TST (SP)+ ;GET NORMAL RETURN OFF STACK JMFR TO B IS COMPLETE YET? BEQ DEINP3 ;YES JOB IS DONE TSTB 3(R4) ;TRANSF. BUFR IS EMPTY? BNE DEINP4 ;NO INC (R4) ;YESP @#DEFORE ;---INOUTA-- ;THIS ROUTINE PROCESSES ALL ARGUMENTS ENTERED VIA THE ;'INPUT' OR 'OUTPUT' COMMAND. EXCEPT FILE# INCR REL. BLK BR DEINP2 ;DO ANOTHER .READW ;ERROR DEINPE: MOV #31.,R0 ;BAD FILENAME OR DEVICE TST (SP)+ ;GET NORMA;SETUP # SKPS FOR FILE (FILE POSITION) DEIOA: JSR R5,DEEOL ;CHK EXCESS BUFRS/CONSTANTS .BYTE 2,14 CMP #177777,@#DECMD1 ;#L RTN OFF STACK JMP @#DEFORE ;---MOU(TPUT) B #PTS FILE-POSITION BUF-POSITION FILE#--- ;SEE EXPLANATION OF ---INPUT--- AND R PTS SPECIF? BNE DEIO1 ;YES MOV @#DEDATA+2,R0 ;NO DEFAULT = BUFSIZ BR DEIO2 DEIO1: JSR R5,@#IFIX ;FIX # SKPS BR DEIO2 ; IN AN INPUT FILE (STARTING FROM THE LAST ACCESSED) ; POINT OF THE FILE) BEFORE BEGINNING TRANSFER (DEFAULT=0) ;'#PTS' SPEPLACE THE WORDS ;'INPUT DATA' WITH 'OUTPUT DATA', & 'READ INTO' WITH 'WRITE TO' ;R1=INDEX FOR B, R2=DNCTR, R4=PTR TO CORRECT ECIFIES THE NUMBER OF POINTS TO READ INTO B. ; (DEFAULT=SIZE OF BUFFER B) ;'FILE#' SPECIFIES WHICH RT-11 FILE, OPENED VIA THEENTRY OF I/O TBL DEOUT: JSR PC,DEIOA ;ON RETN R1,R2,R4 ARE SET UP JSR PC,DEFILE TST (R4) ;A BLK WAS WRITTEN OUT ALREADY? 'OPEN' COMMAND ; IS TO BE USED IN THE TRANSFER ; FORMAT IS I# OR O#, WHERE # IS 1,2,3,... AND ; REPRESENTS THE 1ST, 2ND, BMI DEOUT1 ;NO WE ARE JUST STARTING TSTB 3(R4) ;YES - BLK WRITTEN WAS FULL? BEQ DEOUT2 ;YES JSR PC,DEREAD ;NO, DO AETC OUTPUT OR INPUT FILE ; R1=INDEX FOR B, R2=DNCTR, R4=PTR TO CORRECT ENTRY OF I/O TBL ; R5=ADDR OF BUFR B DEINP: JSR PC READ INTO TRANSF BUFR BCS DEOUT7 ;READ WAS NOT SUCCESSFUL (ERROR) BR DEOUT2 DEOUT1: INC (R4) ;INC REL. BLK # DEOUT2: JS,DEIOA ;ON RETURN R1,R2,R4 ARE SET UP JSR PC,DEFILE ;GET FILE# & PUT PTR IN R4 TSTB 3(R4) ;CURR PT OF CURR BLK=0? BNE DEIR PC,DEIOB JSR PC,DESETB ;GET ADDR OF 'B' INTO R5 ;TIME TO DO TRANSFER DEOUT3: TSTB @#DECMD+1 ;B IS A S.P. BUFR? BEQ DNP1 ;NO INC (R4) ;YES, INC REL. BLK DEINP1: JSR PC,DEIOB ;CHK IF NEED TO UPDATE REL. BLK ;AND CURR. PT ANY FURTHER JEOUT4 ;YES JSR PC,DETROT ;NO - F.P. CALL TRANSF-OUT-ROUTN DEOUT4: JSR PC,DETROT ;CALL TRANSF-OUT-ROUTN TSTB 3(R4) ;TRANSFSR PC,DESETB ;GET ADDR OF 'B' INTO R5 ;DETERMINE WHICH '.READW' TO DO DEINP2: JSR PC,DEREAD ;DO .READW BCC DEINP4 ;READ BUFR FULL (CURR PT=0) BNE DEOUT5 ;NO JSR PC,DEWRT ;DO CORRECT .WRITW BCS DEOUT7 INC (R4) ;INC REL BLK DEOUT5: DEC R2 WAS SUCCESSFUL TST DEERWD ;RT-11 ERROR - WAS IT EOF? BNE DEINPE ;NO (FILE ERROR) DEINP3: MOV @#DECMD,@#DECMD+2 ;YES, FIN ;TRANSF IS COMPLETE? BNE DEOUT3 ;NO TSTB 3(R4) ;YES - TRANS. BUFR JUST WRITTEN? (CURR PT=0) BEQ DEOUT6 ;YES JSR PC,ISHED THIS CMD EARLY JSR PC,@#DEFLCK ;POSSIBLY JUST READ INTO A F.P.BUFR RTS PC DEINP4: TSTB @#DECMD+1 ;B IS A S.P. BUFR? DEWRT ;NO BCS DEOUT7 DEOUT6: RTS PC ;ERRORS DEOUT7: TST DEERWD ;RT/11 ERROR - WAS IT EOF? BNE DEOUT8 ;NO MOV #32.,RHECK IF B IS F.P. BUFFER TSTB @#DECMD+1 BEQ DEIO7A ;S.P. ASL R3 ;F.P. - DBL # SKPS ASL R1 ; DBL INDEX PTR VALUE DER4),DEINOT ;GET CURR PT ASL DEINOT ;MAKE IT 'WORD' CONSCIOUS ADD #DEBUTR,DEINOT ;ADD IN BASE ADDR OF TRANSF. BUFR. MOV (SIO7A: ASL R1 ;MAKE INDEX PTR 'WORD CONSCIOUS' RTS PC DEIOE3: MOV #11.,R0 ;BUF POS <1 BR DEIOE4 DEIOE1: MOV #12.,R0 ;(P)+,@DEINOT INCB 3(R4) ADD #2,R1 RTS PC ;---DESETB--- ;THIS ROUTINE CALCULATES THE ADDR OF BUFFER 'B' AND ;RETURNS ADBUF-POSITION)+(#PTS) EXCEED BUFSIZ DEIOE4: CMP (SP)+,(SP)+ ;POP 2 RETURNS OFF STACK JMP @#DEFORE ;---INOUTB--- ;THIS ROUTDR IN R5 ;ALGORITHM: GET (#-1) OF 'B' ;MULT BY 2 IF 'B' IS S.P.; ; MULT BY 4 IF 'B' IS F.P. ; MULT BY BUFFER SIZE OF 'B'; INE CHECKS TO SEE IF THE # OF SKPS + CURR PT ; WITHIN THE CURR REL BLK, WOULD NECESSITATE ; UPDATING THE REL. BLK # AND CONS; ADD RESULTANT PRODUCT TO STARTING ADDR OF ; S.P. OF F.P. BUFFERS WHICHEVER APPLIES DESETB: MOVB @#DECMD,R5 ;GET # DEC EQUENCTLY THE ; CURRENT PT. DEIOB: CLR DEIOBB MOVB 3(R4),DEIOBB ;GET CURR. PT. # ADD R3,DEIOBB ;CURR. PT + #SKPS = DEIR5 ;# -1 ASL R5 ;2BYTES/WD TSTB @#DECMD+1 ;'B' IS F.P. BEQ DESET1 ;NO S.P. ASL R5 ;YES F.P. MOV @#DEDATA+12,R3 ;ADO10: CMP #400,(PC)+ DEIOBB: 0 ;TEMP LOC BHI DEIO11 INC (R4) ;INC REL. BLK NUMBER SUB #400,DEIOBB BR DEIO10 DEIO11: DR OF 1ST F.P. BUFR BR DESET2 DESET1: MOV @#DEDATA+6,R3 ;ADDR OF 1ST S.P. BUFR DESET2: MOV @#DEDATA+2,R0 ;BUFSIZE JSR PC,@MOVB DEIOBB,3(R4) ;RESET CURR. PT. # RTS PC ;---DETRIN--- ;THIS ROUTINE GETS ONE WD OF DATA FROM THE ;TRANSFER BUFFR 'DEBU#MULT ;R5 WILL HOLD FINAL PRODUCT ADD R3,R5 ;R5 NOW=START ADDR. RTS PC ;---DEFILE--- ;THIS ROUTINE GETS FILE # ENTERED V DECMD1 DEIO2: MOV R0,@#DECMD+4 ;TEMP STORAGE FOR # PTS ;SET UP # PTS TO READ IN CMP #177777,@#DECMD1+4 ;# SKPS SPECIF?FR' (VIA CURR. PT) AND PUTS IT ;INTO BUFFER 'B' (VIA R1) DETRIN: CLR (PC)+ DEINOT: 0 ;TEMP LOC MOVB 3(R4),DEINOT ;GET C BNE DEIO3 ;YES CLR R0 ;NO DEFAULT = 0 BR DEIO4 DEIO3: JSR R5,@#IFIX BR DEIO4 DECMD1+4 DEIO4: MOV R0,@#DECMD+2 ;TEURR. PT. ASL DEINOT ;MAKE VALUE 'WORD' CONSCIOUS ADD #DEBUTR,DEINOT ;ADD BASE ADDR OF TRANSF. BUFR. MOV @DEINOT,-(SP) ;PUMP STORAGE FOR # SKPS ;SET UP BUF-POSITION CMP #177777,@#DECMD1+10 ;BUF-POSITIOM SPECIF? BNE DEIO5 ;YES CLR R0 ;NO T DATUM FROM TR.BUF ON STACK MOV R5,R0 ;GET ADDR OF 'B' ADD R1,R0 ;R0=INDEXED ADDR OF 'B' MOV (SP)+,(R0) ;GET DATUM FROMDEFAULT=0 BR DEIO7 DEIO5: JSR R5,@#IFIX BR DEIO6 DECMD1+10 DEIO6: DEC R0 ;POSITION # -1 BMI DEIOE3 ;BUF POS =0 DEIO STACK & PUT INTO 'B' INCB 3(R4) ;BMP CURR. PT ADD #2,R1 ;BMP 'B' PTR BY 1 WORD RTS PC ;---DETROT--- ;THIS ROUTINE G7: MOV R0,R1 ;R1=INDEX FOR BUFR 'B' MOV @#DECMD+4,R2 ;R2=DNCTR (# PTS TO TRANSF) MOV @#DECMD+2,R3 ;R3=# SKPS ;(POSITION ETS ONE WD OF DATA FROM THE BUFFR 'B' (VIA) R1) ;AND PUTS IT INTO THE TRANSF BUFFR 'DEBUFR' (VIA CURR. PT) DETROT: MOV R5,R0-1)+(#PTS)<=BUFSIZ MUST HOLD TRUE MOV R1,R4 ADD R2,R4 CMP R4,@#DEDATA+2 BHI DEIOE1 ;FMT ERR (ARGS ARE CONTRARY) ;C ;PUT ADDR OF 'B' ON STACK ADD R1,R0 ;ADD INDEXED VALUE MOV (R0),-(SP) ;PUT DATUM FROM 'B' ON STACK CLR DEINOT MOVB 3(O8 ;I WAS SPECIF TO 'QA' CMP R4,#10 ;O WAS SPECIF TO 'QA' BHI DEIOE2 ;FMT ERR (OFILE #>3) ADD #OFILE,R4 ;R4 IS PTR TO I.TITLE SPOV7 ;LAB APPLICATIONS-11 DATA DEFINE COMMAND ;DEC-11-SLABA-C-LA21 ;FILE NAME SPOV7.MAC ;FILE ID SPOV7.1 .CSECT SPO/O INFO TBL BR DEIO9 DEIO8: CMP R4,#24 BHI DEIOE1 ;FMT ERR (IFILE #>6) ADD #IFILE,R4 ;R4 IS PTR TO I/O INFO TBL DEIO9: V7 ;COPYRIGHT (C) 1974,1975 ;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ;THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOJSR PC,@#DETLE ;CHK ANY CMD STRING EXCESSES RTS PC ;COMMON EXIT ;ERRORS DEIOE2: MOV #31.,R0 ;FILE NOT OPEN CMP (SP)+R USE ONLY ON A ;SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLUSION ;OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWAR,(SP)+ ;POP 2 RETURNS OFF STACK JMP @#DEFORE ;CMD LIST FOR QA DEIOAD: .BYTE 3,1 .BYTE 'O,'I,'0 ;R0=0 (O) ;R0=1 (I) .E, OR ANY OTHER COPIES ;THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ;OTHER PERSON EXCEPT FOR USE ON SUCH SEVEN ;SUBROUTINE TO DO .READW OR .WRITW ;THE CHANNEL NUMBER AND RELATIVE BLOCK NUMBER ARE ;POINTED TO BY R4. ;THIS UPDATES YSTEM AND TO ONE WHO AGREES ;TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE SOFTWARE ;SHALL AT ALL TIMES REMAIN IN DEC.THE PROGRAM REQUEST AREA FOR RT-11 .ENABLE LSB DEWRT: MOV #11*400,-(SP) ;CODE FOR .WRITW BR 2$ DEREAD: MOV #10*400,-(SP) ;THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE ;WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A ;COMMITMENT BY DIG ;CODE FOR .READW 2$: MOV #ARGAR+2,R0 ;R0 => ARGMENT AREA MOV @R4,@R0 ;REL. BLK # MOV (SP)+,-(R0) ;CODE FOR READ OR WRITE ITAL EQUIPMENT CORPORATION. ;DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ;ITS SOFTWARE ON EQUIPMENT WHICH IS MOVB 2(R4),@R0 ;INSERT CHANNEL # EMT 375 ;.READW & .WRITW ARE SAME EMT RTS PC ARGAR: .BYTE 0,0 ;CHANNEL # & CODE, UPD NOT SUPPLIED BY DEC. ;LDP SOFTWARE DEVELOPMENT, 1974-5 ; CARL RALSTON ;BDD [P] OR [A] ;BUFFER DEFINE DATA COMMAND ;REATED 0 ;RELATIVE BLOCK #, UPDATED DEBUTR ;BUFFER ADDR 400 ;WORD COUNT 0 ;MUST BE 0 ;TRANSFER BUFFER IS LOCATEGISTER DEFINITION R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 PC=%7 SP=%6 .IFDF SPBDD$ ;ASSEMBLY PARAMETER ;GT40$=1 ;D HERE! DEBUTR: .BLKW 400 ;400 WD BUFR GOES HERE ASSEMBLE CODE FOR GT40 ;VR14$ ;ASEMBLE CODE FOR VR14 ;DA$4 ;CODE FOR DUAL DISPLAY ;DA$10 ;CODE FOR FREE CURSOR VALUES ;DAIA 'INPUT' OR 'OUTPUT' ;OR 'REWIND' CMD. IT SETS A PTR TO CORRESP. I/O-INFO-TBL ;ENTRY AND RETURNS PTR IN R4 DEFILE: JSR R5,QA 400+100 ;SILENT QUEST + MIX MODE + DEIOAD ;CMD LIST ADDR TSTB @#QAERR BNE DEIOE2 ;FMT ERR (BAD FILE #) MOV @#QAANS,R4 ;GET # (1-3) OR (1-6) DEC R4 BMI DEIOE2 ;FMT ERR (FILE #<1) ASL R4 ASL R4 TST R0 ;I OR O SPECIF? BNE DEI$11 ;CODE OFR FIXED CURSOR VALUES ;SYMBOL DEFINITIONS QASIL=400 QAALP=20 QANULA=20000 EXIT=0 CRLFC0=3 TEXT=7 SINGL=AST 1 DISPLY IS UP? BEQ DEID1 ;NO, RTN THEN! MOV #DEDIT1,R3 ;TYPE OUT ID OF 1ST CURVE JSR PC,DEIDSU CMPB DEFLG1,#1 ;MO12 EXP=16 ;GLOBAL SYMBOLS .GLOBL QA,QADATF,DEFORE,DEOFY,DEDI1S,DEDI2S .GLOBL $POLSH,$IR,DENORM .GLOBL DEDEFD,DEOFYD,DEDRE THAN 1 DISPLY IS UP? BLOS DEID1 ;NO RTN THEN! MOV #DEDIT2,R3 ;TYPE OUT ID OF 2ND CURVE JSR PC,DEIDSU DEID1: RTS PC ATT,DEFLG1 ;THIS ROUTINE SETS THE DATA TYPE ;THE DISPLAY OFFSET AND DENORM, NORMALIZE ;CONSTANT ARE SET. ;IF POS DATA ONLY DEIDSU: MOV #DEDID+1,R1 ;FIND ID SLOT FOR THIS CURVE CMP R3,@#DELST BEQ DEID2 MOV #DEDID+3,R1 DEID2: MOVB #'S,DEID4 T, X AXIS IS AT 0 ON SCOPE ;OTHERWISE IN MIDDLE OF SCOPE ;AND THE DATA IS NORMALIZED TO TEST FULL SCOPE ;OR HALF SCOPE ;DEOFYSTB (R1) BEQ DEID3 MOVB #'F,DEID4 DEID3: MOVB -(R1),DEID5 JSR R5,FORMAT .BYTE TEXT DEID4: .BYTE 0,0 ;'S OR 'F; E.O. T CONTAINS THE HALF SCOPE OFFSET. ;---BDD---BUFFER DEFINE DATA---- ;CALL VIA BDD [POVA] ;P FOR POSITIVE ONLY DATA ;A FOR ALL-EXT .BYTE 12,200 ;OUTPUT "#" IN DEID5 IN S.P. FMT .EVEN DEID5: 0 ;ID VALUE TO OUTPUT .BYTE CRLFC0,EXIT .EVEN RTS PNEG & POS. DEDEFD: JSR R5,QA QASIL+QAALP+QANULA DEDEFT TSTB @#QADATF ;TEST FOR COMMAND BEQ DEDEF1 TST R0 ;TEST FORC .ENDC .IFDF GT40$ .GLOBL DEGIDF,DEGIDX,DEGCID,DEDYSZ,DEG2ID .GLOBL DEFLG1,DEDID,DELST,FORMAB,DEID,DEID1 .GLOBL DEGXL, P OR A BEQ DEDEF1 BPL DEDEF2 MOV #17,R0 TST (SP)+ JMP @#DEFORE ;POS VALUES ONLY DEDEF2: CLR R0 ;SET Y OFFSET TDEGYL,DEGXR,DEGYR,DEDIT1,DEDIT2 ;THIS ROUTINE IS USED TO PUT UP THE CURVE ID, FOR A ;SINGLE OR DUAL DISPLAY. THE FORMAT IS O 0 MOV #1,@#DEDATT MOV @#DEOFYD,R1 ;SET DENORM=FULL SCOPE ASL R1 BR DEDEF3 ;ALL NUMBERS AVAILABLE DEDEF1: MOV @#DSXXX OR FXXX. ;THE ID WILL GO IN RIGHT HAND CORNERS TOP AND ;BOTTOM, FOR DUAL DISPLAYS AND JUST TOP FOR A SINGLE ;DISPLAY. IEOFYD,R0 ;SET Y OFFSET TO HALF SCOPE MOV R0,R1 ;SET DENORM TO HALF SCOPE CLR @#DEDATT DEDEF3: DEC R1 MOV R0,@#DEOFY CLF THE FREE CURSOR WERE ON WHEN THE ;DID COMMAND WAS GIVEN THE SINGLE OR TOP ID WILL ;GO WHERE THE LEFT FREE CURSOR IS. THE BOR R2 CMPB #3,DEFLG1 BNE DEDEF4 MOV DEOFYD,R2 ASR R1 ASR R0 DEDEF4: MOV R0,@#DEDI2S+1 ;STORE Y OFFSET IN ADD R2,R0 TTOM ;ID WILL GO WHERE THE RIGHT FREE CURSOR IS. DEID: COMB @#DEGIDF ;TEST TO PUT ID UP OR DOWN BNE DEID1 MOV #DEGIDX,@# MOV R0,@#DEDI1S+1 ;DISPLAY TABLE MOV R1,-(SP) JSR R4,@#$POLSH $IR,.+2 MOV (SP)+,@#DENORM ;STORE F.P. DENORM MOV (SP)+DEGCID-2 ;TAKE ID DOWN AND RTS PC ;FLAG IS 0. DEID1: MOV #DEIDT1,R3 ;GET TOP OR SINGLE PARAMETER ;TABLE. MOV @#DEDY,@#DENORM+2 RTS PC DEDEFT: .BYTE 3,1,'A,'P,0 .EVEN .ENDC ;---DID--- ;DISPLAY CURVE ID ROUTINE - GT-40. ;TYPE OUT CUSZ,R0 ;CALCULATE TOP OF SCREEN. SUB #17,R0 MOV R0,DEIDT1+2 JSR PC,DEIDSU ;PUT UP ID. MOV #DEGIDX,DEG2ID-2 ;SET DISPLAY BRVE ID - VR14 .IFDF SPDID$ .IFDF VR14$ .GLOBL DEID,DEFLG1,DEDIT1,DEDIT2,DEDID,DELST,FORMAT DEID: TSTB DEFLG1 ;AT LEUFFER TO MOV #103400,DEG2ID+6 ;SET INTENSITY 6 CMPB #3,DEFLG1 ;SKIP DUAL ID. BEQ DEID3 ;TEST FOR DOV OR DSP CMPB #2,DEF ;DISPLAY TABLE. DEIDCL: .BYTE 12,200 ;OUTPUT FORMAT TABLE .EVEN DEIDON: 0,0 DEIDT1: DEGCID+2,0,DEGXL,DEGYL,DEDIT1 ;$10 .GLOBL DEGCUF,DEGFCX,DEGFCL,DEFLG1,DEGXL,DEDYSZ,DEDFRC .GLOBL DEGYL,DGFCL1,DGFCL2,DGFCL3,DGFCL4,DE4POT ;THIS ROUTINE TOP ID PARAMETERS DEIDT2: DEG2ID+2,10,DEGXR,DEGYR,DEDIT2 ;BOTTOM ID PARAMETERS .ENDC ;---DFV--- ;DISPLAY FREE CURSOR VALSETS UP THE POSITION ON THE SCOPE TO ;DISPLAY THE FREE CURSOR VALUES DEDFRC: COMB DEGCUF ;TEST TO DISPLAY F.C.V. BNE DEDFUES. ;TYPE OUT FREE CURSOR VALUES - VR14 .IFDF VR14$ .IFDF DA$10 .GLOBL DEDFRC,DEDID,DECMD,SAVARG,RSTARG,$POLSH,$IR,FORM1 MOV #DEGFCX,DEGFCL-2 ;TURN DISPLAY OFF. RTS PC DEDF1: CLR DE4POT ;CLEAR POT SUM TSTB DEFLG1+1 ;TEST FOR F. CURSORS. LG1 ;COMMANDS. BNE DEID2 MOV #102600,DEG2ID+6 ;SET INTENSITY 3 FOR DOV DEID3: MOV #DEG2ID,DEG2ID-2 ;DUAL DISPLAY, SET DISPLAT DEDFRC: MOV DEDID,DECMD ;IS THERE A DISPLY? BEQ DEDFR ;NO RTN THEN! JSR PC,DEFRCU ;YES TST R0 ;CURSORS UP? BMI AY ;BUFFER 2 ID'S. MOV #DEIDT2,R3 JSR PC,DEIDSU ;PUT UP ID. DEID2: MOV #DEGCID,DEGCID-2 ;HOOK ID'S INTO GT-40 ;DIDEDFR ;NO JSR PC,SAVARG MOV R0,-(SP) ;GET X-POSITION OF LF CURSOR JSR R4,$POLSH $IR,.+2 ;FLOAT IT MOV (SP)+,DEFMK0 SPLAY OF FREE CURSORS ;AND LINE. RTS PC ;ID DISPLAY SUBROUTINE DEIDSU: MOV (R3)+,R0 ;STORE ADDRESS IN DISPLAY BUFF MOV (SP)+,DEFMK0+2 ;SEND THRU MY FORMAT CHK JSR PC,DEFMCK MOVB DEFMK1,DEDFRB ;#DEC PL MOV #"XL,DEDFRA JSR PC,DEDFRO ;OER ;OF ID IN R0. TSTB DEFLG1+1 ;TEST FOR FREE CURSOR. BNE DEIDS1 MOV #01700,(R0)+ ;FREE CURSOR OFF STORE ID MOV (R3UTPUT XL VALUE JSR PC,RSTARG JSR PC,SAVARG MOV R2,DEFMK0 MOV R3,DEFMK0+2 ;GET YL VALUE JSR PC,DEFMCK MOVB DEFMK1,DED)+,(R0)+ ;IN DEFAULT POSITION. ADD #4,R3 BR DEIDS2 DEIDS1: TST (R3)+ ;MOVE R3 UP MOV @(R3)+,(R0) ;FREE CURSOR ON, STORFRB MOVB #'Y,DEDFRA JSR PC,DEDFRO ;OUTPUT YL VALUE JSR PC,RSTARG JSR PC,SAVARG MOV R1,-(SP) ;GET X-POSITION OF RT CURSE POSITION BIC #40000,(R0)+ ;CLEAR INTENSITY BIT MOV @(R3)+,(R0)+ ;OF FREE CURSOR IN ID DISPLAY TABLE. DEIDS2: TST (R0)+ ;OR JSR R4,$POLSH $IR,.+2 MOV (SP)+,DEFMK0 MOV (SP)+,DEFMK0+2 JSR PC,DEFMCK MOVB DEFMK1,DEDFRB MOV #"XR,DEDFRA JSSKIP CHAR. MODE WORD. MOV #DEDID+1,R1 ;FIND THE DEDID SLOT CMP (R3)+,@#DELST ;FOR THIS CURVE BEQ DEIDS3 MOV #DEDID+3,R1 R PC,DEDFRO JSR PC,RSTARG JSR PC,SAVARG MOV R4,DEFMK0 MOV R5,DEFMK0+2 ;GET YR VALUE JSR PC,DEFMCK MOVB DEFMK1,DEDFRB DEIDS3: MOV #'S,R2 ;STOR S OR F. TSTB (R1) BEQ DEIDS4 MOV #'F,R2 DEIDS4: MOVB R2,(R0)+ MOVB -(R1),DEIDON ;STORE CURVE MOVB #'Y,DEDFRA JSR PC,DEDFRO ;OUTPUT YR VALUE JSR PC,RSTARG DEDFR: RTS PC DEDFRO: JSR R5,FORMAT .BYTE TEXT,40 ;(A NUMBER IN MOV R0,R5 ;OUTF TABLE. MOVB #40,(R0)+ ;PUT SPACES IN DISPLAY MOV #20040,(R0) ;BUFFER MOV #DEIDCL,R0 ;ADDRESS BLANK) DEDFRA: .ASCII /XL / .BYTE 0 ;E.O.TEXT .BYTE EXP DEDFRB: .BYTE 0 ;# OF DEC PL (TO BE FILLED IN) .BYTE 7 ;#SIG OF OUTPUT BUFFER FROM JSR PC,FORMAB ;FORMAB IS IN R5, COMMAND ;TABLE ADDRESS IN R0. RTS PC ;ASCII NUMBER STORED IN .FIG .EVEN DEFMK0 ;ADDR OF DATUM TO OUTPUT .BYTE CRLFC0,EXIT .EVEN RTS PC .ENDC .ENDC .IFDF GT40$ .IFDF DADEDFC ;YES TYPE OUT VALUES DEDFX2: RTS PC DEDFC: MOV R4,R0 ;INDEX VAL FOR DEGET INC R4 MOV R4,DEDFXP ;X-POS OF LF CURSO DEDFX3: MOV DEGXL,R0 ;SET TO FREE CURSOR BIC #40000,R0 ;VALUE MOV DEGYL,R1 DEDFX2: MOV #4,R3 ;STORE POSITIONS OF LINES R JSR R5,DEGET DECMD MOV (SP)+,DEFMK0 MOV (SP)+,DEFMK0+2 ;VALUE OF LF CURSOR JSR PC,SAVARG JSR PC,DEFMCK MOVB DEFM .IFDF DA$4 MOV #DEGCX,DEGCSB-2 CMPB #1,DEFLG1 ;TEST FOR DUAL DISPLAY BEQ DEDFX4 MOV #DEGCSB,DEGCSB-2 MOV #10,R3 .ENK1,DEDFXD JSR PC,RSTARG MOVB #'L,DEDFXA+1 MOVB #'L,DEDFXB+1 JSR PC,DEDFXO ;OUTPUT VALUES MOV R5,R0 ;INDEX OF 'DEGET DC DEDFX4: MOV #DEDFXT,R4 DEDFX5: MOV (R4)+,R2 ;STORE X,Y POSITIONS MOV R0,(R2)+ ;IN DISPLAY BUFFER MOV R1,(R2) SUB #30, INC R5 MOV R5,DEDFXP ;X-POS OF RT CURSOR JSR R5,DEGET DECMD MOV (SP)+,DEFMK0 MOV (SP)+,DEFMK0+2 ;VALUE OF RT CURSOR R1 DEC R3 BNE DEDFX5 MOV #DEGCST,DEGCST-2 RTS PC DEDFXT: DEGCS1-12 DEGCS2-10 DEGCS3-12 DEGCS4-10 .IFDF DA$4 JSR PC,SAVARG JSR PC,DEFMCK MOVB DEFMK1,DEDFXD JSR PC,RSTARG MOVB #'R,DEDFXA+1 MOVB #'R,DEDFXB+1 JSR PC,DEDFXO ;OUT DEGCS5-12 DEGCS6-10 DEGCS7-12 DEGCS8-10 0 ;FOR THE LINKER .ENDC .ENDC .ENDC .IFDF VR14$ .IFDF DA$11 .GLOBPUT VALUES RTS PC DEDFXO: JSR R5,FORMAT .BYTE TEXT DEDFXA: .ASCII /XL / .BYTE 0 ;E.O.TEXT .BYTE 12,200 ;S.P. FMTL MULT,DECMD,DEDID,DELST .GLOBL DISST,DISN,DIST,DISCU,DISXC1,DISXC2 ;ROUTINES CALLED: MULT ;---DEFXCU--- ;FIRST DETERMINE BNE DEDF3 MOV #1435,R0 ;SET TO DISPLAY AT DEFAULT MOV DEDYSZ,R1 ;POSITION SUB #47,R1 BR DEDF2 DEDF3: MOV DEGXL,R0 ; .EVEN DEDFXP: 0 ;VAL OF X POSITION OF CURSOR .BYTE CRLFC0,TEXT DEDFXB: .ASCII /YL / .BYTE 0 ;E.O.TEXT .BYTE EXP DDISPLAY AT F.C. LOC. BIC #40000,R0 MOV DEGYL,R1 DEDF2: MOV #4,R3 ;STORE POSITIONS OF 4 LINES MOV #DEDFRT,R4 DEDF4: MOV EDFXD: .BYTE 0 ;#DEC PL (TO BE FILLED IN) .BYTE 7 ;# SIG.FIG. .EVEN DEFMK0 ;ADDR OF DATUM TO OUTPUT .BYTE CRLFC0,EXI(R4)+,R2 MOV R0,(R2)+ MOV R1,(R2) SUB #30,R1 DEC R3 BNE DEDF4 MOV #DEGFCL,DEGFCL-2 RTS PC DEDFRT: DGFCL1-10 DT .EVEN RTS PC .ENDC .ENDC .IFDF GT40$ .IFDF DA$11 .GLOBL DEGFXF,DEGCX,DEGCST,DEFLG1,DE4POT .GLOBL DEGXL,DEGYLGFCL2-10 DGFCL3-10 DGFCL4-10 .ENDC .ENDC ;---DCV--- ;DISPLAY FIX CURSOR VALUES ;TYPE OUT FIX CURSOR VALUES .IFDF,DEDFXC,DEDFX1 .GLOBL DEGCS1,DEGCS2,DEGCS3,DEGCS4 .IFDF DA$4 .GLOBL DEGCS5,DEGCS6,DEGCS7,DEGCS8,DEGCSB .ENDC ;THIS ROU VR14$ .IFDF DA$11 .GLOBL DEDFXC,DEDID,DECMD,DEGET,FORMAT,SAVARG,RSTARG DEDFXC: MOV DEDID,DECMD ;IS THERE A DISPLY? BETINE SETS UP THE DISPLAY POSITION OF THE ;FIX CURSORS DISPLAYED VALUES. DEDFXC: COMB DEGFXF ;TEST DISPLAY FLAG BNE DEDFX1Q DEDFX2 ;NO RTN! JSR PC,DEFXCU ;YES TST R4 ;CURSORS UP? BMI DEDFX1 ;NO JSR PC,DEDFC ;YES TYPE OUT VALUES DEDFX1: MO MOV #DEGCX,DEGCST-2 ;TURN DISPLAY OFF RTS PC DEDFX1: CLR DE4POT ;CLEAR POT SUM TSTB DEFLG1+1 ;TEST FOR FREE CURSOR V DEDID+2,DECMD ;IS THERE A 2ND DISPLY BEQ DEDFX2 ;NO JSR PC,DEFXCU ;YES TST R4 ;CURSORS UP? BMI DEDFX2 ;NO JSR PC,BNE DEDFX3 ;ON, WHEN COMMAND MOV #1435,R0 ;GIVEN, IF SO, SET TO MOV DEDYSZ,R1 ;DEFAULT POSITION SUB #207,R1 BR DEDFX2 BNE DEFXC1 ;NOT SO FAR MOV @#DELST,R1 ;YES BR DEFXC2 DEFXC1: CMP @#DECMD,@#DEDID+2 BNE DEFX1 ;NO MOV @#DELST+2,R1 R2,R5 ;LET R5=ADDR OF 1ST I/D TBL ;TIME TO CALC Y1 AND Y2 MOV @#DEPOT2,R0 ;R0=POT2 CMP R0,@#DEDYSZ ;POT READING > SCOP DEFXC2: TSTB DISCU(R1) ;WE'LL SEE IF CURSORS ARE ACTIVE. BEQ DEFX1 ;THE'RE NOT ACTIVE MOV DIST(R1),R0 ;GET T SUB DISXC1(E SIZE Y? BLOS DEFR00 ;NO MOV @#DEDYSZ,R0 ;YES DEFR00: SUB DISOFY(R5),R0 ;R0=Y1-OFFSET (I/D TBL) JSR PC,DEFRS2 ;NOW R1),R0 ;(T-XC1) =R0 MOV DISN(R1),R5 ;N =R5 JSR PC,@#MULT ;(T-XC1)*N =R5 ADD DISST(R1),R5 ;ST+(T-XC1)*N MOV R5,R4 ;SAVE DO 'SCALE BACK #1' ON Y1 MOV R1,-(SP) MOV R0,-(SP) ;SAVE Y1 FOR THE MOMENT. MOV @#DEPOT3,R0 ;R0=POT3 CMP R0,@#DEDYSZ 'START LOC' IN R4 MOV DISXC1(R1),R0 ;XC1 SUB DISXC2(R1),R0 ;XC1-XC2=R0 MOV DISN(R1),R5 ;N=R5 JSR PC,@#MULT ;(XC1-XC2)*N=;POT READING > SCOPE SIZE Y? BLOS DEFR01 ;NO MOV @#DEDYSZ,R0 ;YES DEFR01: SUB DISOFY(R5),R0 ;R0=Y2-OFSET (I/D TBL) JSR5 ADD R4,R5 ;ST+(T-XC2)*N='END LOC' DEFX1: RTS PC ;DONE RTN .ENDC .ENDC .IFDF VR14$ .IFDF DA$10 .GLOBL DEASGN,SR PC,DEFRS2 ;NOW DO 'SCALE BACK #1' ON Y2 MOV R1,-(SP) MOV R0,-(SP) ;SAVE Y2 FOR THE MOMENT ;SEE IF WE NEED TO SCALE FURTAVARG,RSTARG,DECMD,$MLR,$ADR,DEGET,DEFLG1 .GLOBL DELST,DEPOTS,DEPOT1,DEPOT2,DEPOT3,DEDID,$POLSH .GLOBL $SBR,$DVR,MULT,FLOAT,DEHER DUE TO A F.P. BUFFER TSTB @#DEDID+1 ;DISPLAYING A F.P. BUF? BEQ DEFR3 ;NO CMPB @#DEDID,@#DEASGN ;GET CORRECT ENTRY CMD1,DEDXSZ .GLOBL DISOFY,DIST,DISST,DISSC,DEDYSZ,$IR,$RI,$MLR,$ADR ;ROUTINES CALLED: MULT,DIVR,FLOAT,$POLSH,SAVARG,RSTARG,DOF ASSIGN TBL BEQ DEFR1 ;1ST ENTRY MOV #DEASGN+14,DEFRT1 ;2ND ENTRY BR DEFR2 DEFR1: MOV #DEASGN+2,DEFRT1 DEFR2: JSR PCEGET ;---DEFRCU--- ;IF FREE CURSORS ARE ACTIVE, CONVERT THEIR READINGS ;RELATIVE TO THE DISPLAY SPECIFIED BY THE 1ST ENTRY ,DEFRS3 ;NOW DO 'SCALE BACK #2' ON Y2 MOV (SP)+,DEFRT MOV (SP)+,DEFRT+2 ;SAVE Y2 FOR A MOMENT JSR PC,DEFRS3 ;NOW DO 'SCOF 'DELST' ;RETURN X1 IN R0, X2 IN R1, Y1 IN R2,R3, Y2 IN R4,R5 ;IF FREE CURSORS ARE NOT ACTIVE RETURN '100000' IN R0. ALE BACK #2' ON Y1 MOV DEFRT+2,-(SP) MOV DEFRT,-(SP) ;PUT Y2 BACK ON STACK ;AT THIS POINT THE STACK HOLDS F.P. Y2,Y1 AND SWHICH I/D TBL IS USED TO DISPLY THE BUFR POINTED TO ;BY'DECMD'AND PUT IT IN R1. IF THIS BUFR IS NOT A DISPLAYABLE BUFR ;RETURN DEFRCU: MOV #100000,R0 ;MAYBE FREE CURSORS ARE INACTIVE CMP @#DECMD,@#DEDID ;IS B ONE OF THE DISPLY BUFS? BEQ DEFRC1 ; R4=-1 ;CONVERT THE FIXED CURSOR VALUES XC1 & XC2 OF ;A GIVEN I/D TBL TO THE ACTUAL LOCATION WITHIN THE ;BUFFER. APPLIES ONLYES CMP @#DECMD,@#DEDID+2 ;NOT SO FAR BNE DEFR4 ;NO IT ISNOT DEFRC1: TSTB @#DEFLG1+1 BEQ DEFR4 ;THEY ARE INACTIVE MY TO SNGL WD Y-DATA. ;ON RETURN, R4=START LOC AND R5=END LOC (START LOC=0 FOR 1ST PT) ;IF CURSORS ARE INACTIVE, R4=-1. DEFXOV @#DELST,R2 ;GET ADDR OF 1ST I/D TBL ;TIME TO CALC X1 AND X2 MOV @#DEPOTS,(PC)+ ;POT0 DEFRT1: 0 ;TEMPORARY JSR PC,DCU: MOV #177777,R4 ;MAYBE CURSORS ARE NOT ACTIVE OR ;BUFR NOT DISPLYED CMP @#DECMD,@#DEDID ;IS B ONE OF THE DISPLY BUFS?EFRS1 MOV DEFRT,-(SP) ;PUT X1 ON STACK MOV @#DEPOT1,DEFRT1 ;POT1 JSR PC,DEFRS1 MOV DEFRT,-(SP) ;PUT X2 ON STACK MOVR3 MOV (SP)+,R1 ;RTN X2 IN R0 MOV (SP)+,R0 ;RTN X1 IN R1 DEFR4: RTS PC ;TAGS USED DEFRT: 0,0 ;HOLDS Y1 TEMPORARILY ,R0 MOV 6(R0),-(SP) MOV 4(R0),-(SP) ;PUT OFFSET ON STACK JSR R4,@#$POLSH $ADR,.+2 DEFRS4: JMP @#0 .ENDC .ENDC . ;THIS SUBROUTINE CALC (WINDOWSIZE)*POT*N/DEDXSZ + ST ;THE POT READING IS PASSED VIA DEFRT1. ;THE RESULT IS LEFT IN DEFRT IFDF VR14$ .GLOBL SAVARG,RSTARG,$POLSH,$CMR,$MLR ;ROUTINES CALLED: $POLSH,SAVARG,RSTARG ;---DEFMCK--- ; THIS ROUTINE CALC DEFRS1: MOV DIST(R2),R5 ;WINDOWSIZE MOV DISN(R2),R0 ;N JSR PC,@#MULT MOV R5,DEFRT ;N*WINDOW JSR PC,@#SAVARG MOV DISTHE # OF DECIMAL PLACES FOR A ; NUMBER. 0.LE.N.LT.10 IS OUTPUT AS X.XXXXX, ; 10.LE.N.LT.100 IS OUTPUT AS XX.XXXX ETC. ; LIM =ST(R2),-(SP) ;PUT START ON STACK JSR R4,@#$POLSH $IR,.+2 ;FLOAT IT MOV DEFRT1,-(SP) ;PUT POT ON STACK JSR R4,@#$POL10,100,1000,ETC DEFMCK: JSR PC,@#SAVARG MOV #6,(PC)+ ;SET #DEC.PL.=6 DEFMK1: 0 CLR -(SP) MOV #41040,-(SP) ;PUT 10. OSH $IR,.+2 ;FLOAT IT MOV DEFRT,-(SP) ;PUT (N*WINDOW) ON STACK JSR R4,@#$POLSH $IR,.+2 ;FLOAT IT MOV @#DEDXSZ,-(N STACK MOV 2(SP),-(SP) MOV 2(SP),-(SP) ;COPY IT FOR LIM, STACK=LIM,10. DEFMK2: MOV 2(SP),-(SP) MOV 2(SP),-(SP) ;COPY LSP) ;PUT SCOPE SIZE X ON STACK JSR R4,@#$POLSH ;FLOAT IT $IR,$DVR,$MLR,$ADR,.+2 MOV (SP)+,DEFRT ;SAVE X1 OR X2 TEMP JIM,STACK=LIM,LIM,10. MOV DEFMK0+2,-(SP) MOV DEFMK0,-(SP) ;PUT NUMBER ON STACK BIC #100000,(SP) ;KEEP # POSITIVE JSR R4SR PC,@#RSTARG RTS PC ;THIS SUBROUTINE CALC THE F.P. (POT-OFFSET)*2^(-SCA FAC)---I/D--- ;THE (POT-OFFSET) IS PASSED VIA R0,@#$POLSH ;CMP LIM,N AND BRANCH $CMR,.+2 ;IF LIM.GT.N BGT DEFMK3 DEC DEFMK1 ;SET #DEC.PL. =1LESS BEQ DEFMK3 ;DON TO THIS ROUTINE ;THE SCALE BACK F.P. VALUE IS RETN IN R0,R1 DEFRS2: MOVB DISSC(R5),R3 ;GET 'I/D TBL' SCA. FAC. BEQ DEFR12 E IF 0 DEC.PL. MOV 2(SP),-(SP) MOV 2(SP),-(SP) ;COPY LIM MOV 12(SP),6(SP) MOV 10(SP),4(SP) ;COPY 10. JSR R4,@#$POLSH ;NO SCALING 'WAS' DONE BPL DEFR11 ;SCALING UP 'WAS' DONE DEFR10: ASL R0 ;SCALING DOWN 'WAS' DONE INC R3 ;THUS SCALE ;MULT LIM*10.=LIM $MLR,.+2 ;STACK=LIM,10. BR DEFMK2 DEFMK3: ADD #10,SP JSR PC,@#RSTARG RTS PC DEFMK0: 0,0 .ENDC BACK UP BNE DEFR10 BR DEFR12 DEFR11: ASR R0 ;THUS SCALE BACK DOWN DEC R3 BNE DEFR11 DEFR12: MOV R0,DEFRT1 ;GET REA .ENDC .END DY TO FLOAT THE VALUE. JSR R5,@#FLOAT BR DEFR13 DEFRT1 DEFR13: RTS PC ;THIS SUBROUTINE CALC F.P. (YVAL/SCA)+OFFSET---ASSIGN--- ;'DEFRT1' HOLDS PTR TO CORRECT ASSIGN TBL SCA FAC ;YVAL IS ON TOP OF STACK DEFRS3: MOV (SP)+,DEFRS4+2 ;LET YVAL STI.P. X2,X1 ;IN THAT ORDER. DEFR3: MOV (SP)+,R4 ;RTN Y2 IN R4,R5 MOV (SP)+,R5 MOV (SP)+,R2 ;RTN Y1 IN R2,R3 MOV (SP)+,LL BE ON TOP MOV DEFRT1,R0 MOV 2(R0),-(SP) MOV (R0),-(SP) ;PUT SCA FAC ON STACK JSR R4,@#$POLSH $DVR,.+2 MOV DEFRT1OFYD,MULT,DEDIT1,DEDIT2,DEFORE .GLOBL DISYBU,DISTYP,DISST,DISN,DIST,DISCU,DISSC,DISCI .GLOBL DISOFX,DISOFY,DISSZX,DISTOP,DISBO: MOV R0,@#DENORM ;DENORM IS NOW SET UP. MOV R1,@#DENORM+2 MOVB @#DEFLG1,R1 ;SAV PREVIOUS DISPLY TYPE .IFDF GT40$ JSR PCT,DISBUF .IFDF VR14$ .GLOBL DINIT .ENDC .IFDF GT40$ .GLOBL DISMPO,GINIT,DEDBCB,DEFREE,DETOP,GTDISP,DEGFCJ .GLOBL DEGT,@#DEGTOF ;TURN OFF GT40 .ENDC CLR @#DEDID ;INHIBIT DEFAULT-DATA-EDITOR-CMDS CLRB @#DEFLG1 ; " ALL DISPLAYS ;CALL .TITLE SPOV9 ;LAB APPLICATIONS-11 DUAL DISPLAY COMMANDS ;DEC-11-SLABA-C-LA23 ;FILE ID SPOV9.1 ;FILE: SPOV9.MAC .CSECT SPOV9OF,DEGTON,DEGIDF,DEGFXF,DECDID,GTRCAL,DISSKP,DISGRA .ENDC ;ROUTINES CALLED:FLOAT,IFIX,QA,MULT,DETLE,DEADJ,DESCA ; DEMXMN, ;COPYRIGHT (C) 1974,1975 ;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ;THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR DEEOL,DEFORE,DINIT,GINIT,GTDISP ; DEGTON,DEGTOF ;---DSP B1[B2][W1[W2[S1[S2]]]][NEW OR OLD]--- ;---DOV B1[B2][W1[W2[S1[S2]]]USE ONLY ON A ;SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLUSION ;OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE,][NEW OR OLD]--- ;IF NEW-DISPLAY BUFFERS(S.P. OR F.P. OR MIXED) WITH ; WINDOWSIZES(W1,W2)BEING THE TOTAL #PTS TO DISPLAY AT AN OR ANY OTHER COPIES ;THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ;OTHER PERSON EXCEPT FOR USE ON SUCH SYSY ; ONE TIME AND STARTING PTS(S1,S2) BEING THE 1ST PT ; DISPLAYED IN EACH CORRESPONDING BUFFER SUCH THAT ; (START-1)+WINDOW SCOPE SIZE? BLOS DEDU14 ;NO MOV @#DEDXSZ,DEDUW1 ;YES, DEFAULT = SCOPE SIZE BR DEDU14IVEN? BEQ DEDU5 ;NO--USE DEFAULT-NEW TST R0 ;'N' OR 'O' WAS SPECIF? BPL DEDU3 ;YES MOV #15.,R0 JMP DEDUEE ;NO--ILL DEDU12: JSR R5,@#IFIX BR DEDU13 DECMD1 DEDU13: MOV R0,DEDUW1 ;SAVE W1 (R1) BLE DEDU1C ;W1 < 1--(ERR) CMP #177777,@#DEG CHAR--(ERR) DEDU3: BEQ DEDU5 ;'N' WAS SPECIF ;COME HERE ONLY WHEN USING 'OLD' PARAMETERS ;MUST CHECK TO SEE IF PREVIOUSECMD1+4 ;W2 WAS SPECIF? BNE DEDU15 ;YES DEDU14: MOV DEDUW1,R0 ;NO -- SAVE W2=W1 (R0) BR DEDU16 DEDU15: JSR R5,@#IFIX BR DISPLAY WAS DUAL AND THAT A ;BUFR CMD WAS NOT GIVEN BETWEEN DISPLAY CMDS. JSR PC,@#DETLE ;CHK OTHER CMD STRING EXCESSES DEDU16 DECMD1+4 DEDU16: MOV R0,(PC)+ ;SAVE W2 DEDUW2: 0 BGT DEDU1D ;W2 < 1? DEDU1C: MOV #18.,R0 ;YES JMP DEDUEE DEDMOV #177777,DEDUW1 ;O WAS SPECIF--SET FLG! NEG R1 ;NEG PREV DISPLY TYPE # ADD DEDUFL,R1 ADD #2,R1 ;PREV DISPLY TYPE WAS U1D: MOV @#DEDXSZ,R4 ;SCOPE SIZE X CMP R0,R4 ;W2 > SCOPE SIZE ? BHI DEDU17 ;YES--(ERR) ADD DEDUS2,R0 ;NO CMP R0,@#DEDASAME ? BNE DEDU4 ;NO--ILLEG CMD--(ERR) MOV #DEDIT1,R0 ;YES GET 1ST I/D TBL ADDR TST DIST(R0) ;BUFR CMD GIVEN BTWN DISPLAYTA+2 ;(S2-1)+W2>BUFSIZ? BHI DEDU1E ;YES -- (ERR) MOV DEDUW1,R0 ;GET W1 CMP R0,R4 ;W1 > SCOPE SIZE ? BLOS DEDU1F ;NO CMDS? BNE DEDU18 ;NO DEDU4: MOV #16.,R0 JMP DEDUEE ;YES--(ERR)OLD PARAMS ARE GONE ;COME HERE ONLY WHEN NEED TO DEFINE DEDU17: MOV #20.,R0 JMP DEDUEE ;YES--(ERR) DEDU1F: ADD DEDUS1,R0 CMP R0,@#DEDATA+2 ;(S1-1)+W1>BUFSIZ? BLOS DEDU18 DEDU1A 'NEW' DISPLAY ;GET STARTS AND WINDOWS & CHECK THEM OUT. DEDU5: JSR PC,@#DETLE ;CHK OTHER CMD STRING EXCESSES CMP #177777E: MOV #19.,R0 JMP DEDUEE ;YES -- (ERR) ;TIME TO FIND OUT IF B1 & B2 ARE SP OR FP OR MIXED. DEDU18: TST @#DECMD+2 ;B2 WAN+14,R5 ;ADDR+2 OF 2ND SP ASSGN ENTRY DEDU24: MOV @#DECMD,@#DECMD+4 ;SAVE SP-B1 TEMPORARILY MOV @#DEDID+2,@#DECMD ;NEED FP-B20 ;USE 2ND I/D TBL FOR B2 STUFF ADD #DISMPO,R0 JSR PC,DEDUSV BR DEDU25 ;THIS ROUTINE FINDS THE MAX-MIN OF BUFR POINTED IN DECMD JSR PC,DEADJ ;FOR 'DEADJ' TO SCALE! MOV @#DECMD+4,@#DECMD ;RESTORE SP-B1 BR DEDU25 ;THIS ROUTINE SETS 'SP BUFTO BY R1 ;THEN FINDS MULT & OFFSET SO GT40 DISPLAY CAN ;SCALE DOWN THE F.P. DATA FOR DISPLAY. DEDUSC: CLR R0 ;START OF B R TYPE' IN DECMD+3, ;CHKS IF AN ASSIGNED SP BUFR IS AVAILABLE FOR THE F.P. DATA ;RETURNS R0 = 0(NONE) =1(1ST) =-1(2ND) DEDU MOV @#DEDATA,R5 DEC R5 ;SIZE -1 TO FIND JSR PC,DEMXMN ;MAX-MIN TO FIND JSR PC,DESCA ;MULT & OFFSET RTS PC ;THIS ROUAS: CLRB @#DECMD+3 ;SP-TYPE=0 MOV #1,R0 TSTB @#DEASGN+1 ;A SP BUFR WAS ASSIGNED? BEQ DEDUA1 ;NO -- RETURN (ERR) TSTB @#TINE STORES MULT & OFFSET (R1,R2,R3,R4) IN ;CORRECT 'ASSIGN TBL' ENTRY AND IN CORRECT I/D TBL DEDUSV: MOV R1,(R5)+ ;SAVE 'MUDEASGN ;YES -- ENTRY IS ALREADY TAKEN? BEQ DEDUA2 ;NO -- RETURN R0=1 TSTB @#DEASGN+13 ;YES -- A 2ND S.P. BUFR WAS ASSIGNED?LT' IN ASSIGN TBL MOV R2,(R5)+ MOV R3,(R5)+ ;SAVE 'OFFSET' IN ASSIGN TBL MOV R4,(R5) MOV R1,(R0)+ ;SAVE 'MULT' IN I/D TB BEQ DEDUA1 ;NO -- RETURN (ERR) DEC R0 ;YES -- RETURN R0=-1 DEDUA1: DEC R0 DEDUA2: RTS PC .ENDC .IFDF GT40$ TSTB L MOV R2,(R0)+ MOV R3,(R0)+ ;SAVE 'OFFSET' IN I/D TBL MOV R4,(R0) RTS PC .ENDC ;PUT THE FOLLOWING I/D TBL VALUES ON @#DECMD+1 ;WHAT TYPE IS B1? BEQ DEDU20 ;SNGL! MOVB @#DECMD,@#DEASGN ;F.P -- SET F# OF 1ST ASSIGN MOV #DECMD,R1 ;NEED TYPETHE STACK FIRST FOR ;B2 THEN B1 IN THIS ORDER: BOT,TOP,OFY,WI,ST,CI,TYP,BUFADR DEDU25: TST DEDUFL ;'SPL' OR 'DOV' ? BNE D & # OF B1 JSR PC,DEDUSC ;FIND MULT + OFFSET FOR SCALING MOV #DEASGN+2,R5 ;ADDR+2 OF ASSIGN TBL ENTRY MOV #DEDIT1,R0 ;USE EDU26 ;'SPL' WANTED CLR -(SP) ;'DOV'--SETUP B2-- BOT=0 MOV @#DEDYSZ,-(SP) ;TOP=SCOPE SIZE MOV @#DEOFY,-(SP) ;OFY='DEOFY'DECMD+2,@#DECMD ;THE SP BUF IS ALWAYS DISPLAYED DEDU20: MOV @#DEDID+2,@#DECMD+2 ;DECMD+2 MAY HAVE BEEN DESTROY TSTB @#DECMD+31ST I/D TBL FOR B1 STUFF ADD #DISMPO,R0 JSR PC,DEDUSV ;SAVE MULT + OFFSET AWAY. DEDU20: TSTB @#DECMD+3 ;WHAT TYPE IS B2? ;WHAT TYPE IS B2? BEQ DEDU25 ;SNGL PREC! JSR PC,DEDUAS ;FP -- CHK FOR ASSIGN SP BUFR. TST R0 BNE DEDU22 DEDU21: MOV #BEQ DEDU25 ;SNGL TSTB @#DEASGN ;1ST ASSIGN TBL ENTRY TAKEN? BNE DEDU21 ;YES, USE THE 2ND MOVB @#DECMD+2,@#DEASGN ;NO -- 21.,R0 JMP DEDUEE ;NO FREE ASSIGN BUF -- (ERR) DEDU22: BMI DEDU23 ;USE 2ND ENTRY MOVB @#DECMD+2,@#DEASGN ;SET F# OF 1ST ESET F# OF 1ST ASSIGN MOV #DECMD+2,R1 ;NEED TYPE & # OF B2 JSR PC,DEDUSC ;FIND MULT & OFFSET FOR SCALING. MOV #DEASGN+2,R5 NTRY MOVB @#DEASGN+1,@#DECMD+2 ;TYPE & # OF SP BUFR IN DECMD+2 MOV #DEASGN+2,R5 ;ADDR+2 OF 1ST SP ASSGN ENTRY BR DEDU24 D;ADDR+2 OF ASSIGN TBL ENTRY BR DEDU22 DEDU21: MOVB @#DECMD+2,@#DEASGN+12 ;SET F# OF 2ND ASSIGN MOV #DECMD+2,R1 ;NEED TYPE &EDU23: MOVB @#DECMD+2,@#DEASGN+12 ;SET F# OF 2ND ENTRY MOVB @#DEASGN+13,@#DECMD+2 ;TYPE & # OF SP BUFR IN DECMD+2 MOV #DEASG # OF B2. JSR PC,DEDUSC ;FIND MULT & OFFSET FOR SCALING MOV #DEASGN+14,R5 ;ADDR+2 OF ASSIGN TBL ENTRY DEDU22: MOV #DEDIT2,RUS1,-(SP) ;START1-1 MOV @#DECMD,@#DECMD+4 ;PASS B1 (TYPE & #) JSR PC,DEDUFX .IFDF VR14$ ADD #1000,4(SP) ;USE DIFF SCOPE SP BYTE DEDUF3: JMP (R1) ;RETURN VIA R1 ;TIME TO FILL IN I/D TBLS AND CALL INIT AND FILL IN ;DELST AND DEONE DEDU27: MOVCHANNELS .ENDC .IFDF GT40$ ADD #3,4(SP) ;INTENSITY GOES TO 6 .ENDC BR DEDU27 DEDU26: CLR -(SP) ;'SPL'--SET UP B2-- B #DEDIT1,R0 ;R0 MUST HOLD I/D TBL ADDR MOV R0,@#DELST MOV R0,@#DEONE JSR PC,DEDUTB MOV #DEDIT2,R0 MOV R0,@#DELST+2 MOT=0 MOV @#DEOFYD,-(SP) ;TOP=HALF SCOPE SIZE MOV @#DEOFY,-(SP) ASR (SP) ;OFY='DEOFY'/2 MOV DEDUW2,-(SP) ;WINDOW #2 MOOV R0,@#DEONE+2 JSR PC,DEDUTB BR DEDU28 ;THIS ROUTINE SETS UP THE I/D TBL WHOSE ADDR IS IN R0 ;MANY VALUES ARE ON STACK-V DEDUS2,-(SP) ;START2-1 MOV @#DECMD+2,@#DECMD+4 ;PASS B2 (TYPE & #) JSR PC,DEDUFX MOV @#DEOFYD,-(SP) ;--SET UP B1-- BOT=H-LASTLY, CALL INIT DEDUTB: MOV (SP)+,R1 ;GET 'RTN PC' OFF STACK .IFDF GT40$ MOVB #1,DISSKP(R0) CLRB DISGRA(R0) .ENDC ALF SIZE MOV @#DEDYSZ,-(SP) ;TOP=Y-SCOPE SIZE MOV @#DEOFY,-(SP) ASR (SP) ADD @#DEOFYD,(SP) ;OFY='DEOFY'/2+DEOFYD MOV D MOV (SP)+,DISYBU(R0) ;BUF ADDR MOV (SP)+,DISTYP(R0) ;DATA TYPE MOV (SP)+,DISCI(R0) ;CHAN/INTENSITY TST DEDUW1 ;OPTION 'EDUW1,-(SP) ;WINDOW #1 MOV DEDUS1,-(SP) ;START1-1 MOV @#DECMD,@#DECMD+4 ;PASS B1 (TYPE & #) JSR PC,DEDUFX BR DEDU27 ;OLD' WANTED? BPL DEDUT2 ;NO ADD #12,SP ;YES, POP ST,WI,OFY,TOP,BOT OFF STACK BR DEDUT1 DEDUT2: MOV @#DEDATA+2,DISBUF(R0THIS ROUTINE PUTS THE CI,TYP,BUFADR ON STACK ;TYPE & # BUFR IS PASSED IN DECMD+4 DEDUFX: MOV (SP)+,R1 ;MOV 'RTN PC' OFF STAC) ;BUF SIZE (# DATA PTS) MOV (SP)+,DISST(R0) ;START-1 MOV (SP)+,DIST(R0) ;WINDOW SIZE MOV #1,DISN(R0) ;N=1 CLRB DISCU(R0K .IFDF VR14$ CLR -(SP) ;CI=0 .ENDC .IFDF GT40$ CLR -(SP) ;CI=0 FOR THE MINUTE TST DEDUFL ;SPLIT OR DOV? BEQ DE) ;FIX CURSOR FLG=0 CLRB DISSC(R0) ;SCA FAC=0 CLRB DEFLG4 ;CLEAR WINDOW FLG CLR DISOFX(R0) ;X-AXIS OFFSET MOV (SP)+,DISDUF1 ;DOV! ADD #3,(SP) ;SPLIT CI=6 DEDUF1: ADD #3,(SP) ;DOV CI=3 (FOR NOW) .ENDC TSTB @#DECMD+5 BEQ DEDUF2 ;SP BUFROFY(R0) ;Y-AXIS OFFSET MOV @#DEDXSZ,DISSZX(R0) ;SCOPE SIZE X MOV (SP)+,DISTOP(R0) ;TOP OF DISPLAY MOV (SP)+,DISBOT(R0) ;BO MOV #177776,-(SP) ;FP BUFR---TYPE=-2 MOVB @#DECMD+4,R0 ;GET # DEC R0 ASL R0 ASL R0 ;4*(#-1)--FP TAKE 4 BYTES/DATUM T OF DISPLAY DEDUT1: .IFDF VR14$ JSR PC,@#DINIT ;VR14 INIT .ENDC .IFDF GT40$ JSR PC,@#GINIT ;GT40 INIT .ENDC JMP MOV @#DEDATA+2,R5 ;BUFSIZE JSR PC,@#MULT ADD @#DEDATA+12,R5 ;4*(#-1)*BUFSIZE+ADDR OF 1ST FP MOV R5,-(SP) ;BUFR ADDR OF FP(R1) ;RETURN VIA R1 ;FINISH UP! IF GT40, SET DISPLAY BUFR CTRL BLK (DEDBCB) AND ; CALL GT40 DISPLAY MODULE. ;FOR BOTH GT40 MOV DEDUW2,-(SP) ;WINDOW #2 MOV DEDUS2,-(SP) ;START2-1 MOV @#DECMD+2,@#DECMD+4 ;PASS B2 (TYPE & #) JSR PC,DEDUFX CLR BUFR BR DEDUF3 DEDUF2: MOV #1,-(SP) ;---TYPE=1 MOVB @#DECMD+4,R0 ;GET # DEC R0 ASL R0 ;2*(#-1)--SP TAKES 2 BYTES/DATU-(SP) ;--SETUP B1-- BOT=0 MOV @#DEDYSZ,-(SP) ;TOP=SCOPE SIZE MOV @#DEOFY,-(SP) ;OFY MOV DEDUW1,-(SP) ;WINDOW #1 MOV DEDM MOV @#DEDATA+2,R5 ;BUFSIZE JSR PC,@#MULT ADD @#DEDATA+6,R5 ;2*(#-1)*BUFSIZE+ADDR OF 1ST SP MOV R5,-(SP) ;BUFR ADDR OF -EDITOR-CMDS AND FOR THE ;DISPLAY MODULES'S CMDS. ;IF B IS NOT SPECIFIED, BOTH DISPLAYS WILL BE AFFECTED ;BY THE DISPLAY MODUE ;ROUTINES CALLED: DEGET,DEPUT,DEFORE,DEFXCU,DETLE,DEEOL ;---BAL [B]--- ;THIS CMD ASSUMES DUAL DISPLAYS. ;CASE1(FIXED C OR VR14 SET DEDID & DEFLG1 ; NOTE: DEDID+2 SET UP EARLIER DEDU28: .IFDF GT40$ MOV #DEDBCB,R1 ;ADDR OF BUFR CTRL BLK MLE'S CMDS, WHILE ONLY THE ;DISPLAY DESIGNATED BY THE 1ST ENTRY OF 'DELST' ;WILL BE REFERENCED BY ANY DEFAULT-DATA-EDITOR ;CMDOV @#DEFREE,(R1) ;DISPL BUF ADR=1ST FREE LOC MOV @#DETOP,R2 ;TOP OF FREE CORE SUB (R1)+,R2 ;TOP-1ST FREE LOC TST (R2)+ ;(S. (INTEGRATE, DERIVATIVE, ETC.) ;IF TWO DISPLAYS ARE NOT UP-THIS CMD IS IGNORED DETOPB: JSR R5,DEEOL ;CHK EXCESS BUFRS/CONSTOP-1ST FREE)+2 MOV R2,(R1) ;DISPL BUF SIZE=(TOP-FREE)+2 JSR PC,@#GTDISP ;CALL GT40 DISPLAY MODULE TST R0 BNE DEDUE3 ;TANTS .BYTE 2,0 JSR PC,@#DETLE ;CHK OTHER CMD STRING EXCESSES TST @#DEDID+2 ;2 DISPLAYS ARE UP? BEQ DETBE1 ;NO, --(ERR)GT40 BUF NEEDS EXCEEDED .IFDF RT11$ MOV @#DEDBCB,R0 ;GET DISPLY BUFFR ADDR .INSRT ;TELL GRAPHICS ABOUT IT MOV #DEGFCJ, CMP #177777,@#DECMD ;A BUFR WAS SPECIF? BEQ DETB2 ;NO CMP @#DECMD,@#DEDID ;B(TYPE &#) SAME AS DEDID? BEQ DETB1 ;YES R0 ;GET ADDR OF BUFS FOR ;FREE CUR, LINES ,ETC .INSRT ;TELL GRAPHICS ABOUT IT .ENDC JSR PC,@#DEGTON ;TURN GT40 ON CMP @#DECMD,@#DEDID+2 ;B(TYPE &#) SAME AS DEDID+2? BNE DETBE2 ;NO, 'B' NOT DISPLAYED--(ERR) MOV @#DEDID+2,R1 ;YES--SWITCH .ENDC MOV DEDUD0,@#DEDID ;ENABLE DEFAULT-DATA-EDITOR-CMDS MOVB #2,@#DEFLG1 ;INITIALLY SET FOR 'DOV' TST DEDUFL ;'DOV' ? DEDID & DEDI2+2 MOV @#DEDID,@#DEDID+2 MOV R1,@#DEDID MOV @#DELST+2,R1 ;AND--SWITCH DELST & DELST+2 MOV @#DELST,@#DELST+2 BEQ DEDU29 ;YES INCB @#DEFLG1 ;NO, 'SPLIT' (FLG=3) DEDU29: .IFDF GT40$ MOVB #-1,@#GTRCAL TSTB @#DEGIDF BNE DEDU30 MOV R1,@#DELST DETB1: CLR @#DEONE+2 ;DISPLAY CMDS USE ONLY B BR DETB4 DETB2: CMP @#DELST,#DEDIT1 ;DELST HOLD I/O TBL ADDR TSTB @#DEGFXF BEQ DEDU31 DEDU30: TST (SP)+ JMP @#DECDID .ENDC DEDU31: RTS PC ;ALL DONE! ;ERRORS DEDUE3: MOV #22 #1? BEQ DETB3 ;YES MOV @#DEDID+2,R1 ;NO--SWITCH DEDID & DEDID+2 MOV @#DEDID,@#DEDID+2 MOV R1,@#DEDID MOV @#DELST+2,R.,R0 ;BUFR NEEDS DEDUEE: TST (SP)+ ;GET NORMAL RTN OFF STACK JMP @#DEFORE ;CMD LIST USED BY 'QA' TO FIND OPTION NEW OR O1 ;AND--SWITCH DELST & DELST+2 MOV @#DELST,@#DELST+2 MOV R1,@#DELST DETB3: MOV @#DELST+2,@#DEONE+2 ;DISPLAY CMDS USE BOTH LD DEDUAD: .BYTE 3,1,'N,'O,0 .EVEN .ENDC ;---BUFFER DESIGNATE COMMAND--- .IFDF SPDTB$ .IFDF CAPS$ .GLOBL DEEOLDETB4: MOV @#DELST,@#DEONE RTS PC ;ERROR DETBE1: MOV #33.,R0 ;DUAL DISPLY NEEDED BR DETBEE DETBE2: MOV #34.,R0 ;BUF .ENDC .GLOBL DETOPB,DEDID,DECMD,DELST,DEONE,DEDIT1,DEFORE,DETLE ;ROUTINES CALLED: DEFORE,DETLE,DEEOL ;---DTB [B]--- ;R IS NOT DISPLYED DETBEE: TST (SP)+ ;GET NORMAL RTN OFF STACK JMP @#DEFORE .ENDC ;---BUFFER ALIGN COMMAND--- .IFDF SIF TWO DISPLAYS ARE UP, THIS CMD DESIGNATES EITHER ONE ;OF THE TWO BUFFERS (B1 OR B2) TO BE USED FOR ;THE DEFAULT-DISPLAY-DATAPBAL$ .IFDF CAPS$ .GLOBL DEFXCU,DEEOL .ENDC .GLOBL DEALGN,DECMD,DEDID,DELST,DISST,DEDATA .GLOBL DEGET,DEPUT,DEFORE,DETL LEFT CUR POS OF 1ST DISP. MOV R4,DELF1 ;CURSORS OF 1ST DISPLAY UP? BMI DEAL3 ;NO INC R3 ;YES BR DEAL4 DEAL3: DEC R3 MD MOV (SP)+,DEOLD MOV (SP)+,DEOLD+2 ;SAV IT DEROT2: ADD R1,R0 ;BMP INDEX BY #ROTATES CMP R0,@#DEDATA ;INDEX>BUFSIZ? DEAL4: MOV @#DEDID+2,@#DECMD JSR PC,DEFXCU ;GET LEFT CURSOR POSITION 2ND DISP MOV R4,DELF2 ;CURSORS OF 2ND DISPLAY UP? BM BLO DEROT3 ;NO SUB @#DEDATA,R0 ;YES,INDEX=INDEX-BUFSIZ DEROT3: CMP R0,R2 ;LOOPED BAK ONTO AN 'OLD' DATUM? BNE DEROT4I DEAL5 ;NO INC R3 ;YES BR DEAL6 DEAL5: DEC R3 DEAL6: BEQ DEALE2 ;R3=0--(ERR-CURSORS 'UP & DOWN') BPL DEAL7 ;R3=2 (C ;NO INC R2 ;YES, CHANGE "BEGIN PT" MOV DEOLD+2,-(SP) MOV DEOLD,-(SP) JSR R5,@#DEPUT ;FILL IN EMPTY SLOT IN B DECURSORS 'UP' ON BOTH) MOV @#DELST,R1 ;R3=-2 (CURSORS 'DOWN' ON BOTH) MOV DISST(R1),DELF1 ;(START-1) OF 1ST DISPLAY MOV @#DEMD DEC R3 ;DN YET? BNE DEROT1 ;NO BR DEROT5 ;YES DEROT4: JSR R5,@#DEGET ;GET DATUM & SAV IT IN 'NEW' DECMD MOVURSORS ARE UP FOR BOTH DISPLAYS)-THE DATA OF B ; IS ROTATED UNTIL THE DATA DESIGNATED BY THE LEFT ; CURSORS HAVE THE SAME BUFFLST+2,R1 MOV DISST(R1),DELF2 ;(START-1) OF 2ND DISPLAY ;AT THIS POINT R2=0 (1ST DISPLAY IS B) OR =1(2ND DISPLAY IS B) ;'DEER POSITION. ;CASE2(FIXED CURSORS ARE DOWN FOR BOTH DISPLAYS)-THE DATA OF B ; IS ROTATED UNTIL THE ITS 1ST DISPLAYED PT OCCUPILF1' HOLDS LEFT CURSOR POSTION OF 1ST DISPLAY OR (START-1) ;'DELF2' " " " " " 2ND " " " DEAL7: MES ; THE SAME BUFFER POSITION AS THE 1ST DISPLAYED PT OF THE ; OTHER BUFFER. ;B DEFAULTS TO THE 1ST ENTRY OF 'DEDID'. ;IF CUOV DELF2,R1 SUB DELF1,R1 ;#ROTATES=DELF2-DELF1 TST R2 ;'B' IS 1ST DISPLAY? BEQ DEAL8 ;YES NEG R1 ;NO, #ROTATES=DELF1-RSORS ARE UP ON ONE DISPLAY, BUT DOWN ON THE OTHER ;AN ERROR IS RETURNED. DEALGN: JSR R5,DEEOL ;CHK EXCESS BUFRS/CONSTANTS DELF2 MOV @#DEDID+2,@#DECMD ;SET UP 'DECMD' FOR 'DEROT' BR DEAL9 DEAL8: MOV @#DEDID,@#DECMD ;SET UP 'DECMD' FOR 'DEROT' DE .BYTE 2,0 JSR PC,@#DETLE ;CHK OTHER CMD STRING EXCESSES TST @#DEDID+2 ;DUAL DISPLAYS? BNE DEAL0 ;YES MOV #33.,R0 JMPAL9: TST R1 BEQ DEAL10 ;#ROTATES=0--THUS RETURN BPL DEAL11 ;#ROTATES>0 ADD @#DEDATA,R1 ;#ROTATES<0- R1=BUFSIZ+#ROTATES DEALEE ;NO--(ERR) DEAL0: CMP #177777,@#DECMD ;'B' WAS SPECIF? BNE DEAL1 ;YES MOV @#DEDID,@#DECMD ;B DEFAULTS TO 'DEDID' DEAL11: JSR PC,DEROT DEAL10: RTS PC ;GIVEN A CIRCULAR BUFFER OF 'N' DATUMS, ROTATE THE ;DATA 'M' DATUM POSITIONS FROM LOW TO DEAL1: CLR R2 ;R2 TELLS WHICH DISPLAY IS 'B' CMP @#DECMD,@#DEDID ;'B' IS 1ST DISPLAY? BEQ DEAL2 ;YES (R2=0) CMP @#DECMD HIGH CORE ;N=BUFFER SIZE, M IS IN R1. 'M' MUST BE <='N'. ;CIRCULAR BUFFER IS DESIGNATED BY DECMD ; R0=INDEX FOR DEGET & DEPU,@#DEDID+2 ;'B' IS 2ND DISPLAY? BNE DEALE1 ;NO--( ERR) INC R2 ;YES (R2=1) ;FIX CURSORS 'UP' OR 'DOWN' FOR 'BOTH' DISPLAT ; R1=#ROTATES ; R2=USED TO TELL WHENEVER "THE ROTATE" LOOPS BACK ONTO ITSELF ; R3=DATASIZE (DN CTR) DEROT: MOV @#DEDATA,YS? DEAL2: CLR R3 ;R3 TELLS IF BOTH ARE 'UP' OR 'DOWN' MOV @#DEDID,@#DECMD ;'DEFXCU' NEEDS B IN DECMD JSR PC,DEFXCU ;GETR3 ;DNCTR=BUFSIZ CLR R2 ;BEGIN WITH 1ST PT DEROT1: MOV R2,R0 ;GET NEW BEGIN PT JSR R5,@#DEGET ;GET DATUM FROM B DEC+2'. ;IT ALSO PUTS THE SCA FAC IN ADDR+0,+2 WHOSE ;ENTRY ADDR IS PASSED VIA R5 DEADJ: MOV R5,-(SP) ;SAV ADDR FOR SCA FAC MOV #DECMD,R1 ;ADR OF 'TYPE/#' FOR B MOV @#DEDATA,R5 ;DATASIZE DEC R5 ;(#PTS-1) TO SEARCH FOR MAX-MIN CLR R0 ;ST.PT OF S.TITLE SPCOM2 ;LAB APPLICATIONS-11 ;DEC-11-SLABA-C-LA ;FILE ID SPCOM2.1 ;FILE: SPCOM2.MAC ;COPYRIGHT (C) 1974,1975 ;DIGIEARCH=0 JSR PC,@#DEMXMN ;MAX (R1,R2), MIN (R3,R4) JSR PC,@#DESCA MOV (SP)+,R5 ;RESTORE S.P. ASSIGN ENTRY ADDR MOV R1,(R5TAL EQUIPMENT CORPORATION, MAYNARD, MASS. ;THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A ;SINGLE COMPUTER SYS) ;FL.PT. SCA. FACTOR MOV R2,2(R5) MOV R3,4(R5) MOV R4,6(R5) ;FL.PT. OFFSET ;NOW SCALE THE DATA DOWN---SCALED DATA=(DATUTEM AND MAY BE COPIED ONLY WITH THE INCLUSION ;OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANY OTHER COPIES ;THEREOF, MAYM-OFFSET)*SCA FAC MOV @#DEDATA,DEDICT ;DN CTR CLR R0 DEDI4: MOV R0,(PC)+ DEDICT: 0 ;DN CTR (TRANSF F.P. TO S.P.) JSR NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ;OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO AGREES ;TO THES PC,@#SAVARG MOV R2,-(SP) MOV R1,-(SP) ;FL.PT.SCA.FAC. JSR R5,@#DEGET DECMD ;GET DATUM MOV R4,-(SP) MOV R3,-(SP) ;E LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE SOFTWARE ;SHALL AT ALL TIMES REMAIN IN DEC. ;THE INFORMATION IN THIS DOCUMENTGET OFFSET JSR R4,@#$POLSH $SBR,$MLR,.+2 ;(DATUM-OFFSET)*SCA FAC MOV DEDIR0,R0 JSR R5,@#DEPUT DECMD+2 ;PUT DATUM AW (SP)+,DENEW MOV (SP)+,DENEW+2 MOV DEOLD+2,-(SP) MOV DEOLD,-(SP) ;PUT DATUM(SAV IN 'OLD') INTO JSR R5,@#DEPUT ;THE JUS IS SUBJECT TO CHANGE ;WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A ;COMMITMENT BY DIGITAL EQUIPMENT CORPORATION. ;DEC AT VACATED SLOT DECMD MOV DENEW,DEOLD MOV DENEW+2,DEOLD+2 ;OLD=NEW DEC R3 ;DN YET? BNE DEROT2 ;NO DEROT5: RTS PC SSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ;ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. ;LDP SOFTWAR ;YES ;ERRORS DEALE1: MOV #34.,R0 ;BUFR NOT DISPLYED BR DEALEE DEALE2: MOV #35.,R0 ;CURSOR ERROR DEALEE: TST (SP)+ ;E DEVELOPMENT, 1974-5 ; CARL RALSTON .IFNDF SPNDI$ .GLOBL DECMD,DEDATA,$POLSH,$MLR,$CMR,DEGET,DEPUT,DEDID,DEASGN .GLOBL $DGET NORMAL RETURN OFF STACK JMP @#DEFORE ;TAGS USED DELF1: ;LEFT CUR POS OR(ST-1) OF 1ST DISPLAY DEOLD: 0,0 ;TEMP STVR,$SBR,SAVARG,RSTARG,DENORM .IFDF GT40$ .GLOBL GTRCAL,DELST,DISMPO .ENDC ;ROUTINES CALLED:DEMXMN,DESCA,DEGET,DEPUT,$POLORAGE FOR 'DEROT' DELF2: ;LEFT CUR POS OR(ST-1) OF 2ND DISPLAY DENEW: 0,0 ;TEMP STORAGE FOR 'DEROT' .ENDC SH ; SAVARG,RSTARG,DEADJ ;GT40$- IF DEFINED WILL ASSEMBLE CODE NEEDED FOR GT40 VERSION ;OF DATA EDITOR ;---DEADJ--- ;THIS ROUTINE SCALES DATA POINTED TO BY 'DECMD' DOWN BY THE SCALE ;FACTOR IN R1,R2 AND STORES IT IN A BUFR POINTED TO BY 'DECMDIT IS SCALED DOWN ;THIS APPLIES TO 'VR14' DISPLAY. ;IF GT40 DISPLAY A FLAG IS SIMPLY SET TO TELL GT40 DISPLY ROUTINE TO ;RECAECMD,@#DEASGN ;IS IT THE 1ST ENTRY? BNE DEFLC2 ;NO, THE 2ND MOVB @#DEASGN+1,@#DECMD+2 ;YES, '#' OF B2 IS SET TO 1ST ENTRYLCULATE ITS DISPLAY BUFR WHENEVER THE BUFR IN QUESTION ;IS BEING DISPLAYED. ;THE MULT & OFFSET IS CALC & STUCK IN THE CORRECT MOV #DEASGN+2,R5 ;R5=ADDR+2 IF 1ST ASSIGN ENTRY BR DEFLC3 DEFLC2: MOVB @#DEASGN+13,@#DECMD+2 ;'#' OF B2 IS SET TO 2ND ENTASSIGN TBL ENTRY ;AND IN THE CORRECT I/D TBL. .GLOBL DECMD,DEDID DEFLCK: CMP @#DECMD+2,@#DEDID ;BUFR IS BEING DISPLYED? RY MOV #DEASGN+14,R5 ;R5=ADDR+2 OF 2ND ASSIGN ENTRY DEFLC3: JSR PC,@#DEADJ ;CALL 'DEADJ'--DO SCALE .ENDC DEFLC4: RTS PC BEQ DEFLC1 ;YES--IT IS THE 1ST ENTRY CMP @#DECMD+2,@#DEDID+2 ;MAYBE ITS THE 2ND ENTRY BNE DEFLC4 ;BUFR IS NOT BEING DIS .IFNDF SPNDI$ ;---DESCA--- ;CALL: JSR PC,DESCA ;INPUT: R1=H.ORD OF MAX VAL, R2=L.ORD OF MAX VAL ; R3=H.ORD OF MIN VAL, R4PLAYED! DEFLC1: .IFDF GT40$ INCB @#GTRCAL ;TELL GT40 TO RECALC BUFR TSTB @#DECMD+3 BEQ DEFLC4 ;BUFR IS SP! MOV #DECM=L.ORD OF MIN VAL ;FUNCTION: ; IF MAX>MIN>=0, OFFSET=MIN, MULT=DENORM/(MAX-MIN) ; IF MIN=0? BPL DESCA1 ;YES MOV R2,-(SP) ;,@#DEDID ;B2 IS 1ST DISPLY ? BNE DEFLC3 ;NO MOV @#DELST,R0 ;YES, ADDR OF 1ST I/D TBL BR DEFLC5 DEFLC3: MOV @#DELST+2,RNO, PUT OFFSET(MAX) ON STACK MOV R1,-(SP) BR DESCA2 DESCA1: TST R3 ;MIN VAL >= 0? BMI DESCA3 ;NO MOV R4,-(SP) ;YES, P0 ;ADDR OF 2ND I/D TBL DEFLC5: ADD #DISMPO,R0 ;INDEX FOR STORING: MOV R1,(R0)+ ;'MULT' IN I/D TBL MOV R2,(R0)+ MOV R3,UT OFFSET(MIN) ON STACK MOV R3,-(SP) DESCA2: MOV @#DENORM+2,-(SP) ;PUT DENORM ON STACK MOV @#DENORM,-(SP) MOV R2,-(SP) ;PAY JSR PC,@#RSTARG INC R0 DEC (PC)+ DEDIR0: 0 ;SV INDEX VAL FOR 'DEGET & DEPUT' BNE DEDI4 RTS PC .ENDC ;---DEF(R0)+ ;'OFFSET' IN I/D TBL MOV R4,(R0) MOV R1,(R5)+ ;ALSO SAV 'MULT' IN ASIGN TBL MOV R2,(R5)+ MOV R3,(R5)+ ;AND 'OFFLCK--- ;THIS ROUTINE CHECKS THE OUTPUT BUFR POINTED TO BY 'DECMD+2' TO SEE ;IF IT IS BEING DISPLAYED ;IF IT IS,A FURTHER CHESET' IN ASSIGN TBL MOV R4,(R5) .ENDC .IFDF VR14$ TSTB @#DECMD+3 BEQ DEFLC4 ;BUFR IS S.P. MOV @#DECMD+2,@#DECMD ;F.CK IS MADE TO SEE IF IT IS A F.P. BUFR ;AND IF SO, THE DATA IN THE F.P. BUFR IS MOVED TO THE ;ASSOC 'ASSIGNED S.P. BUFR' ONCE P. BUFR IS B1 FOR 'DEADJ' CLR @#DECMD+2 ;'TYPE' OF B2 IS SET FOR S.P. ;NOW TO FIND THE ASSOC 'ASSIGNED S.P. BUFR' CMPB @#DUT MAX ON STACK MOV R1,-(SP) MOV R4,-(SP) ;PUT MIN ON STACK MOV R3,-(SP) JSR R4,@#$POLSH ;MULT=DENORM/(MAX-MIN) $SBR,$P),R1 MOV (SP)+,R3 ;MAXVAL: R1=H.ORD,R2=L.ORD MOV (SP),R2 ;MINVAL=MAXVAL TO START WITH MOV (SP)+,R4 TST R5 BEQ DEMMDVR,.+2 BR DESCA6 DESCA3: CLR -(SP) ;PUT OFFSET(0) ON STACK CLR -(SP) BIC #100000,R1 ;ABS VAL OF MAX BIC #100000,R3 ;AN5 DEMMN1: INC R0 ;BMP BUF INDEX PTR JSR PC,@#SAVARG ;POLSH DONT SAV REGS. JSR R5,@#DEGET ;GET NXT DATUM DEMMX2: 0 ;PTRBS VAL OF MIN JSR PC,@#SAVARG MOV R2,-(SP) MOV R1,-(SP) ;PUT ABS VAL OF MAX ON STACK MOV R4,-(SP) MOV R3,-(SP) ;PUT AB TO 'TYPE/#' OF B MOV (SP)+,DEMMSV ;SAVE FL.PT. RESULT MOV (SP),DEMMSV+2 ; ALSO MOV DEMMSV,-(SP) ;LEAVE RESULT ON STACK. S VAL OF MIN ON STACK JSR R4,@#$POLSH $CMR,.+2 BPL DESCA4 ;/MAX/>=/MIN/ JSR PC,@#RSTARG ;/MIN/ > /MAX/ MOV R3,R1 MO MOV R2,-(SP) ;PUT MAXVAL ON STACK MOV R1,-(SP) JSR R4,@#$POLSH ;DO A COMPARE OF $CMR,.+2 ;MAXVAL WITH CURRENT VALUE BMV R4,R2 ;PUT GREATER OF 2 ABS VALS IN R1,R2 BR DESCA5 DESCA4: JSR PC,@#RSTARG ;GREATER OF 2 ABS VALS ALREADY IN R1,R2 DESCAI DEMMN2 ; CURRENT VALUE= MAXVAL MOV DEMMSV+2,R2 ;REPLACE MAXVAL 5: MOV @#DENORM+2,-(SP) MOV @#DENORM,-(SP) ;PUT 'DENORM' ON STACK MOV R2,-(SP) MOV R1,-(SP) ;PUT LARGER OF 2 ABS VALS ON SBR DEMMN4 DEMMN2: JSR PC,@#RSTARG ;POLSH DESTROYS REGS. JSR PC,@#SAVARG MOV DEMMSV+2,-(SP) ;PUT CURRENT VALUE BACK MOV DETACK JSR R4,@#$POLSH ;'DENORM'/(MAX-MIN) IF POS-NEG DATA $DVR,.+2 ;OR DESCA6: MOV (SP)+,R1 MOV (SP)+,R2 ;RTNED IN R1,R2 MMSV,-(SP) ;ON STACK MOV R4,-(SP) ;PUT MINVAL ON STACK MOV R3,-(SP) JSR R4,@#$POLSH ;DO A COMPARE OF $CMR,.+2 ;MINVAL W= MULT MOV (SP)+,R3 MOV (SP)+,R4 ;RTNED IN R3,R4 = OFFSET RTS PC DESCA7: MOV #40200,R1 ;MULT=1 CLR R2 CLR R3 ;OFFSETITH CURRENT VALUE BPL DEMMN3 ; CURRENT VALUE >= MINVAL JSR PC,@#RSTARG ;CURRENT VALUE < MINVAL MOV DEMMSV,R3 ;REPLACE MIN=0 CLR R4 RTS PC .ENDC ;---DEMXMN--- ;CALL: JSR PC,DEMXMN ; ADR OF 'TYPE/#' OF BUF IN R1 ; ST.PT. WITHIN BUF IN VAL MOV DEMMSV+2,R4 BR DEMMN4 DEMMN3: JSR PC,@#RSTARG DEMMN4: DEC R5 ;DECR 'DONE CTR' BGT DEMMN1 ;NOT DONE YET DEMMN5R0, USED BY 'DEGET' ; (#PTS-1) TO SEARCH IN R5 ; ;THIS ROUTINE FINDS THE MAX /MIN VALUES OF A ;BUFFER GIVEN THE STARTIN: RTS PC ;BYE,BYE DEMMSV: 0,0 ; ---DEEOL--- ; CALL: JSR R5,DEEOL ; .BYTE A,B WHERE A= AN OFFSET TO 'DECMD' ; AND BG PT AND # PTS TO SEARCH ;IN THE BUFFER. R0-R5 ARE NOT SAVED. ;MAXVAL IS IN R1,R2 AND MINVAL IS IN R3,R4 ON RTN. .GLOBL SA=AN OFFSET TO DECMD1 ; THE PURPOSE OF THIS ROUTINE IS TO CHECK IF USER ENTERED TOO ; MANY BUFRS AND/OR CONSTANTS AS PART OF A VARG,RSTARG,DEGET,$POLSH,$CMR .GLOBL DEFORE,DECMD,DECMD1 ;ROUTINES CALLED: SAVARG,RSTARG,DEGET,$POLSH,DEFORE DEMXMN: MOV CMD STRING DEEOL: MOVB (R5)+,R0 ;GET OFFSET TO 'DECMD' ADD #DECMD,R0 INC (R0) ;TOO MANY BUFRS? BEQ DEEOL1 ;NO MOV #R1,DEMMX1 ;TYPE/# OF B MOV R1,DEMMX2 ;TYPE/# OF B JSR R5,@#DEGET ;GET 1ST/ DATUM DEMMX1: 0 ;PTR TO 'TYPE/#' OF B MOV (S52.,R0 ;YES BR DEEOL2 DEEOL1: MOVB (R5)+,R0 ;GET OFFSET TO 'DECMD1' BMI DEEOL3 ;IF NEG, OMIT THIS PART OF CHK ADD #DECMALLED: $POLSH,SAVARG,RSTARG ;---DEFMCK--- ; THIS ROUTINE CALC THE # OF DECIMAL PLACES FOR A ; NUMBER ('DEFMK0'). 0.LE.N.LT.REMAIN IN DEC. ;THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE ;WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A ;COM10 IS OUTPUT AS X.XXXXX, ; 10.LE.N.LT.100 IS OUTPUT AS XX.XXXX ETC. ; LIM =10,100,1000,ETC DEFMCK: JSR PC,@#SAVARG MOV #5MITMENT BY DIGITAL EQUIPMENT CORPORATION. ;DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ;ITS SOFTWARE ON EQUI,(PC)+ ;SET #DEC.PL.=5 DEFMK1: 0 CLR -(SP) MOV #41040,-(SP) ;PUT 10. ON STACK MOV 2(SP),-(SP) MOV 2(SP),-(SP) ;COPY PMENT WHICH IS NOT SUPPLIED BY DEC. ;LDP SOFTWARE DEVELOPMENT, 1974-5 ; LARRY PEARSON JAN. 1974 ; CARL RALSTON MAR. 1975 D1,R0 INC (R0) ;TOO MANY CONSTANTS? BEQ DEEOL3 ;NO MOV #53.,R0 ;YES DEEOL2: JMP @#DEFORE DEEOL3: RTS R5 .END IT FOR LIM, STACK=LIM,10. DEFMK2: MOV 2(SP),-(SP) MOV 2(SP),-(SP) ;COPY LIM,STACK=LIM,LIM,10. MOV DEFMK0+2,-(SP) MOV DEFMK0,-(SP) ;PUT NUMBER ON STACK BIC #100000,(SP) ;KEEP # POSITIVE JSR R4,@#$POLSH ;CMP LIM,N AND BRANCH $CMR,.+2 ;IF L.TITLE SPFMCK ;LAB APPLICATIONS-11 ;DEC-11-SLABA-C-LA ;FILE ID SPFMCK.1 ;FILE: SPFMCK.MAC ;COPYRIGHT (C) 1974,1975 ;DIGIIM.GT.N BGT DEFMK3 DEC DEFMK1 ;SET #DEC.PL. =1LESS BEQ DEFMK3 ;DONE IF 0 DEC.PL. MOV 2(SP),-(SP) MOV 2(SP),-(SP) TAL EQUIPMENT CORPORATION, MAYNARD, MASS. ;THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A ;SINGLE COMPUTER SYS;COPY LIM MOV 12(SP),6(SP) MOV 10(SP),4(SP) ;COPY 10. JSR R4,@#$POLSH ;MULT LIM*10.=LIM $MLR,.+2 ;STACK=LIM,10. BRTEM AND MAY BE COPIED ONLY WITH THE INCLUSION ;OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANY OTHER COPIES ;THEREOF, MAY DEFMK2 DEFMK3: ADD #10,SP JSR PC,@#RSTARG RTS PC DEFMK0: 0,0 .ENDC NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ;OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO AGREES ;TO THES.TITLE FFTLNK FFT LINKAGE ;LAB APPLICATION-11 FFT LINKAGE SUBROUTINE ;DEC-11-SLABA-C-LA10 ;FILE SPFFTL.MAC ;FILE ID SPFFTL.E LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE SOFTWARE ;SHALL AT ALL TIMES REMAIN IN DEC. ;THE INFORMATION IN THIS DOCUMENT1 .CSECT SPFFTL ;COPYRIGHT (C) 1974,1975 ;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ;THIS SOFTWARE IS FURNISHED UNDE IS SUBJECT TO CHANGE ;WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A ;COMMITMENT BY DIGITAL EQUIPMENT CORPORATION. ;DEC AR A LICENSE FOR USE ONLY ON A ;SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLUSION ;OF THE ABOVE COPYRIGHT NOTICESSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ;ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. ;LDP SOFTWAR. THIS SOFTWARE, OR ANY OTHER COPIES ;THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ;OTHER PERSON EXCEPT FORE DEVELOPMENT, 1974-5 ; CARL RALSTON .IFDF SPPWR$!SPDNO$!SPBMM$!SPBIN$ .GLOBL SAVARG,RSTARG,$POLSH,$CMR,$MLR ;ROUTINES C USE ON SUCH SYSTEM AND TO ONE WHO AGREES ;TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE SOFTWARE ;SHALL AT ALL TIMES PRCSN TSTB @#DECMD+3 ;SJ IS OPTIONAL. IF SPECI- BEQ L.IN0 ;FIED, IT MUST BE SNGL PRCSN. BPL L.ERR ;JUMP IF ERROR MOV )+,R1 RTS PC ;MAIN RETURN L.ERR0: BPL L.ERR ;BR IF FLOATING POINT BUFFER MOV #2.,R3 ;MUST SPECIFY A BUFFER BR L.ERR @#DECMD,@#DECMD+2 ;UNSPECIFIED. MAKE INCB @#DECMD+2 ;SJ, S(I+1) ;COMPUTE ADDRESSES OF VECTORS L.IN0: MOVB @#DECMD,R0 ;S L.BERR: TST (SP)+ ;ERROR IN BUFFER NUMBER. FIX STACK L.ERR: MOV #DEFORE,6(SP) ;CHANGE RTN TO ERR ROUTINE MOV R3,R0 BR L.RNGL PRCSN BUFF NO. MOV #47.,R3 ;NON-EXISTENT BUFFER JSR PC,L.BFAD ;GET ADDR OF REAL BUFF MOV R1,L.REP ;IN XR1. XR0&XR2 ZATN ; .SBTTL L.BFAD - SUBROUTINE TO COMPUTE ADDR OF BUFFER ;LOCAL SUBROUTINE TO COMPUTE ADDRESS OF A SINGLE ;PRECISION BUFFEPPED MOVB @#DECMD+2,R0 ;IMAG BUFF NO. TO XR0 JSR PC,L.BFAD ;GET ADDR OF IMAG BUFF MOV R1,L.IMP ;STASH IT MOV #52.,R3 ;AR. CLOBBERS R0, R1, AND R2. ;ADDRESS IS RETURNED IN R1. ;CALLING SEQUENCE: ; MOVB BUFNO,R0 ;BUFNO CONTAINS BUFF NO. ; JSR PNY EXTRA BUFFERS SPECIFIED? TSTB @#DECMD+4 BPL L.ERR ;BR IF ERROR MOV #53.,R3 ;ANY UNNECESSARY CONST? INC @#DECMD1 BC,L.BFAD ;ADDR IS RTND IN R1 L.BFAD: MOV @#DEDATS+2,R1 ;ADDR OF FIRST BUFFER MOV @#DEDATA+2,R2 ;GET NUMBER OF POINTS ASL NE L.ERR ;BR IF ERROR ;TEST FOR FORWARD OR INVERSE TRANSFORM CLR L.INV ;SET FOR FORWARD XFORM JSR R5,QA 20420 L.CR2 ;MPY BY 2 FOR WORDS CMPB R0,@#DEDATS ;LEGAL BUFFER NO.? BGT L.BERR ;JUMP IF ERROR L.BF1: DEC R0 ;DECR BUFFER NO. BL ;SPFFT$ MUST BE DIFINED IN AN ASSEMBLY FILE .IFDF SPFFT$ ;DEFINITIONS R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 MAD MOV #42.,R3 ;INCORRECT CMD FORMAT TST @#QAERR ;ANY ERRORS BNE L.ERR TSTB @#QADATF ;ANY DATA FOUND? BEQ L.IN1 ;B SP=%6 PC=%7 .IFDF CAPS$ .GLOBL FFTC,L.CMAD .ENDC .GLOBL DEFF,DECMD,DECMD1,DEDATA,DEDATS .GLOBL DEFORE,DETLE,FORR IN NONE. FWRD FFT TST R0 ;R0=-1 MEANS NEITHER I NOR F ;=1 MEANS F, =0 MEANS I BMI L.ERR ;MINUS IS ERROR BNE L.IN1MAT .GLOBL QA,QADATF,QAERR ; FORMAT COMMAND DEFINITIONS CRLFC0= 3 ;CR-LF COMBINATION TEXT= 7 ;TEXT OUTPUT SING= 11 ;BR IF FORWARD TRANSFORM INC L.INV ;SET FOR INVRS XFORM L.IN1: MOV @#DEDATA+2,L.N ;GET N - NO. OF DATA POINTS JSR PC,@#D;OUTPUT A S.P. DECIMAL VALUE EXIT= 0 ;EXIT INTERPRETER ; .SBTTL INITIALIZATION AND ERROR CHECKING ;FFT COMMAND MUST BE IN TETLE ;ONE LAST ERROR CHECK ; .SBTTL CALL TO FFTC ;CALL THE FFT SUBROUTINE JSR R5,FFTC ;CALL THE FFT SUBROUTINE L.N-.-HE FOLLOWING FORMAT. ; FFT SI [SJ] [DIRECTION] ;WHERE SI IS THE REAL BUFFER, SJ IS THE IMAGINARY ;BUFFER, AND DIRECTION IS EI2 MOVB ERRTBL(R0),R3 ;GET SPARTA ERR CODE BNE L.ERR ;BR IF ERROR JSR R5,FORMAT ;L.SCLF CONTAINES THE SCALE FACTOR .BYTETHER 'F' OR ABSENT FOR A ;FORWARD TRANSFORM AND 'I' FOR AN INVERSE TRANSFORM. DEFF: MOV R1,-(SP) ;SAVE REGISTERS MOV R2,-( CRLFC0,TEXT .ASCII \SF = \ .BYTE 0,SING ;OUTPUT A DECIMAL VALUE .BYTE 0 ;NEXT PARM IS ADDR OF SIGNED INTEGER .EVEN SP) MOV R3,-(SP) MOV #36.,R3 ;SINGLE PRECISION ONLY TSTB @#DECMD+1 ;SI MUST BE SPECIFIED AND BNE L.ERR0 ;MUST BE SNGL L.SCLF .BYTE CRLFC0,EXIT .EVEN CLR R0 ;INDICATE NO ERROR L.RTN: MOV (SP)+,R3 ;RESTORE REGISTERS MOV (SP)+,R2 MOV (SP .ENDC QADATF,QAERR .GLOBL $ADR,$MLR,$POLSH SQRT$= 1 ;CAUSES SQUARE ROOT SUBROUTINE IN FNCTN TO BE ASSEMBLED ATAN$= 1 ;CAUSES ARC-TANGENT SUBROUTINE IN FNCTN TO BE ASSEMBLED ; .SBTTL POWER SPECTRUM INITIALIZATION DEPW: MOV R1,-(SP) ;SAVE REGISTERS .TITLE FPO & FMP COMMANDS ;LAB APPLICATIONS-11 POWER SPECTRUM AND MAGNITUDE PHASE ANGLE ;DEC-11-SLABA-C-LA11 ;FILE SPPWR.MAC MOV R2,-(SP) MOV R3,-(SP) MOV R4,-(SP) MOV R5,-(SP) MOV #DECMD,R1 ;POINTER TO COMMAND TABLE MOV R1,R2 MOV #2.,R0 ; ;FILE ID SPPWR.1 .CSECT SPPWR ;COPYRIGHT (C) 1974,1975 ;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ;THIS SOFTWARE ISSPECIFY A BUFFER CODE TST (R2)+ ;TEST IF BI SPECIFIED AND SET R2 ;TO POINT TO BJ SPECS BMI P.ERR MOV R2,R3 TST (R3 FURNISHED UNDER A LICENSE FOR USE ONLY ON A ;SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLUSION ;OF THE ABOVE C)+ ;TEST IF BJ SPECIFIED AND SET R3 ;TO POINT TO BK SPECS BPL P.SET1 ;BR IF BJ IS SPECIFIED ;BJ AND BK ARE UNSPECIFIOPYRIGHT NOTICE. THIS SOFTWARE, OR ANY OTHER COPIES ;THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ;OTHER PEED. SET J = I+1, K = I+2 MOV (R1),(R2) ;BJ = B(I+1) INCB (R2) ;J = I+1 MOV (R2),(R3) ;BK = B(J+1) = B(I+2) INCB (R3) RSON EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO AGREES ;TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE SOFTWARE ;SHAL ;K = J+1 = I+2 MOV #47.,R0 ;NON-EXISTENT BUFFER CODE TSTB 1(R3) ;SINGLE OR FLOATING BUFFERS? BGT P.SET2 ;BR IF FLOATINL AT ALL TIMES REMAIN IN DEC. ;THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE ;WITHOUT NOTICE AND SHOULD NOT BE CONSTG CMPB (R3),@#DEDATS ;K LEGAL BUFFER? BGT P.ERR P.SET1: MOV #42.,R0 ;INCORRECT FORMAT CODE TST (R3)+ ;IF BK IS NOT SPECRUED AS A ;COMMITMENT BY DIGITAL EQUIPMENT CORPORATION. ;DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ;ITS SIFIED BMI P.ERR ;IT IS AN ERROR MOV #52.,R0 ;TOO MANY BUFFERS? TST (R3) BPL P.ERR ;BR IF ERROR MOV #53.,R0 ;UNNECEE L.BFRT ;JMP IF DONE ADD R2,R1 ;SET ADDR TO NXT BUFF BR L.BF1 L.BFRT: RTS PC ; .SBTTL FFTLNK TEMPORARY STORAGE AND PAOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. ;LDP SOFTWARE DEVELOPMENT, 1974-5 ; LARRY PEARSON DEC. 1973 ; CARL RALSTRAMETERS ;FFT PARAMETERS L.N: 0 ;NUMBER OF POINTS L.REP: 0 ;ADDRESS OF REAL ARRAY L.IMP: 0 ;ADDRESS OF IMAGINARY ARRAY L.ON MAR. 1975 ; .SBTTL DEFINITIONS ; FPO BK [BJ BK] ; BK(I) = BI(I) * BI(I) + BJ(I) * BJ(I) ;IF BJ AND BK ARE NOT SPECIFIEINV: 0 ;=0 FOR FORWARD, =1 FOR INVERSE TRANSFORM L.SCLF: 0 ;SCALE FACTOR. NUMBER OF TIMES DATA DIVIDED BY 2 L.CMAD: .BYTE 3,D, J = I+1, K = I+2 R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 ;SPFPO$ MUST BE DEFINED IN AN ASSEMBLY 1,'I,'F,0 ;FFT COMMAND OPTIONS - F OR I ;FFT TO SPARTA ERROR CODE CONVERSION TABLE ERRTBL: .BYTE 0,38.,39.,37.,38. .EVENFILE .IFDF SPFPO$ .GLOBL DEPW,DEPH,DECMD,DECMD1,DEDATA,DEDATS .GLOBL DEFORE,DEGET,DEPUT,FORMAT,DEDATF,DETLE .GLOBL QA, (R3),@#DEDATF ;K LEGAL BUFFER? BLE P.SET1 ;BR IF OK P.ERR: MOV #DEFORE,12(SP) ;REPLACE RTN ADDR WITH ERROR ;ROUTINE'S STACK DECMD+2 MOV 2(SP),-(SP) ;DUP BJ(M) MOV 2(SP),-(SP) MOV (SP),M.B ;SAVE BJ(M) MOV 2(SP),M.B+2 JSR R4,$POLSH $MADDRESS BR P.RTN1 ;GO RESTORE REGISTERS AND EXIT ;TO THE ERROR HANDLER ; .SBTTL COMPUTATION OF POWER SPECTRUM P.MAINLR ;SQUARE BJ(M) $ADR,.+2 ;ADD SQUARES MOV (SP)+,M.C ;SAVE SUM OF SQUARES MOV (SP)+,M.C+2 JSR R5,SQRT ;TAKE SQUARE R: MOV P.M,R0 JSR R5,DEGET ;GET BI(M) ON STACK DECMD MOV 2(SP),-(SP) ;DUPLICATE BI(M) ON STACK MOV 2(SP),-(SP) JSR R4,$OOT OF SUM BR M.MSQX M.C M.MSQX: MOV R1,-(SP) ;STACK RESULT MOV R0,-(SP) MOV M.M,R0 ;GET M JSR R5,DEPUT ;STORE BK(M)POLSH $MLR,.+2 ;SQUARE BI(M) MOV P.M,R0 ;RESTORE M JSR R5,DEGET ;GET BJ(M) ON STACK DECMD+2 MOV 2(SP),-(SP) ;DUPLICA DECMD+4 JSR R5,ATAN2 ;COMPUTE PHASE ANGLE BR M.MATX M.A,M.B M.MATX: MOV R1,-(SP) ;STACK IT MOV R0,-(SP) MOV M.M,R0TE BJ(M) ON STACK MOV 2(SP),-(SP) JSR R4,$POLSH $MLR ;SQUARE BJ(M) $ADR,.+2 ;ADD SQUARES MOV P.M,R0 ;RESTORE M J ;GET M JSR R5,DEPUT ;STORE BL(M) DECMD+6 INC M.M ;INCR M CMP M.M,@#DEDATA+2 ;DONE? BLT M.MAIN CLR R0 ;NO ERRORS SR R5,DEPUT ;POP BK(M) OFF THE STACK DECMD+4 INC P.M ;INCREMENT M CMP P.M,@#DEDATA+2 ;DONE? BLT P.MAIN CLR R0 ;NO ER M.EXIT: JSR PC,DEOV10 M.EXT1: MOV (SP)+,R5 ;RESTORE REGISTERS MOV (SP)+,R4 MOV (SP)+,R3 MOV (SP)+,R2 MOV (SP)+,R1 RTROR P.RTN: JSR PC,DEOV10 P.RTN1: MOV (SP)+,R5 MOV (SP)+,R4 MOV (SP)+,R3 MOV (SP)+,R2 MOV (SP)+,R1 RTS PC ; .SBTTL S PC M.ERR: MOV #DEFORE,12(SP) ;REPLACE RETURN ADDRESS WITH ;ENTRY TO ERROR HANDLER BR M.EXT1 ; .SBTTL TEMPORARY DAMAGNITUDE AND PHASE ANGLE INITIALIZATION DEPH: MOV R1,-(SP) ;SAVE REGISTERS MOV R2,-(SP) MOV R3,-(SP) MOV R4,-(SP) MOTA STORAGE M.A: 0,0 ;DATA ELEMENT FROM BI M.B: 0,0 ;DATA ELEMENT FROM BJ M.C: 0,0 ;C = A*A + B*B P.M: M.M: 0,0 ;TEMP STV R5,-(SP) MOV #51.,R0 ;FOUR BUFFERS MUST BE SPECIFIED MOV #DECMD,R1 TST (R1)+ ;SPECIFIED FOR THE MP CMP BMI M.ERR TOREAGE FOR NUMBER OF POINTS ;THE FLOATING POINT SUBROUTINES IN THIS MODULE WERE EXTRACTED FROM ;THE "FPMP" SOURCE FOR USE WITST (R1)+ BMI M.ERR TST (R1)+ BMI M.ERR TST (R1)+ BMI M.ERR MOV #53.,R0 ;UNNECESSARY CONST? INC @#DECMD1 BNE M.EH "SPARTA". SOME SYMBOLS WERE CHANGED. ; .SBTTL $ATN03 .IFDF ATAN$ ; ATAN V003A .GLOBL ATAN,ATAN2; .IFNDF FPU .GRR ;BR IF ERROR JSR PC,@#DETLE ;ONE LAST ERROR CHECK CLR M.M ;INITALIZE M ; .SBTTL MAGNITUDE AND PHASE ANGLE CALCULATIONSLOBL $ADR,$SBR,$MLR,$DVR,$POLSH,$POPR3; .ENDC ; THE FORTRAN ATAN AND ATAN2 FUNCTIONS ; CALLING SEQUENCE FOR ATAN: ; JSR R5, M.MAIN: MOV M.M,R0 ;GET M JSR R5,DEGET ;GET BI(M) ON STACK DECMD MOV 2(SP),-(SP) ;DUP BI(M) MOV 2(SP),-(SP) MOV (SPATAN ; BR A ; .WORD ARGUMENT ADDRESS ;A: ; RETURNS ARCTAN(ARG) IN R0 AND R1. ; ; CALLING SEQUENCE FOR ATAN2: ; JSR R5,ATASSARY CONST? INC @#DECMD1 BNE P.ERR ;BR IF ERROR JSR PC,@#DETLE ;ONE LAST ERROR CHECK CLR P.M BR P.MAIN P.SET2: CMPB),M.A ;SAVE BI(M) MOV 2(SP),M.A+2 JSR R4,$POLSH $MLR,.+2 ;SQUARE BI(M) MOV M.M,R0 ;GET M JSR R5,DEGET ;GET BJ(M) ON TS R5 ;RETURN TO USER ATAN: CLR -(SP) ;CLEAR SIGN FLAG CLR -(SP) ;CLEAR ATAN2 BIAS CLR -(SP) CLR -(SP) ;CLEAR QUADRT SIGN $ADR ;ADD ATAN2 BIAS $POPR3,EXI$39 ;POP RESULT TO REGS EXI$39: TST (SP)+ ;POP SIGN FLAG RTS R5 ;RETURN TO USEANT BIAS CLR -(SP) MOV 2(R5),R4 ;GET ARG ADDRESS MOV 2(R4),-(SP) ;GET LOW ORDER ARG MOV @R4,-(SP) ;GET HIGH ORDER AT1$3R UP$39: MOV (SP)+,10.(SP) ;MOVE STACK ITEM UP MOV (SP)+,10.(SP) JMP @(R4)+ PLY$39: MOV (SP)+,R0 ;POP POLY ARG MOV (N2 ; BR A ; .WORD ARGUMENT 1 ADDRESS ; .WORD ARGUMENT 2 ADDRESS ;A: ; RETURNS ACRTAN(ARG1/ARG2) IN R0 AND R1. ; IF ABS(ARG9: BGE PLU$39 ;JUMP IF QUADRANT 1 OR 3 ADD #100000,@SP ;GET ABS VALUE INC 12.(SP) ;FLAG - PLU$39: CMP @SP,#40200 ;CHECK I1/ARG2) > 2**24, THE RESULT IS ; SIGN(ARG1)*PI/2. ; IF ARG2 <0 THE RESULT IS ARCTAN(ARG1/ARG2) + ; SIGN(ARG1)*PI. F0=%1 F <1. BLO LE1$39 ;JUMP IF <1. BGT GT1$39 ;>1. TST 2(SP) ;CHECK LOW ORDER BEQ LE1$39 ;=1. GT1$39: MOV #140311,4(SP) F1=%1 F2=%2 F3=%3 F4=%4 F5=%5 .IFNDF FPU ATAN2: CLR -(SP) ;CLEAR SIGN FLAG CLR -(SP) ;CLEAR ATAN2 BIAS CLR -(S;-PI/2 MOV #007733,6(SP) ;ATAN(X)=PI/2-ATAN(1/X) DEC 12.(SP) ;ADJUST SIGN MOV 2(SP),-(SP) ;MOVE ARG DOWN MOV 2(SP),-(SPP) CLR -(SP) ;CLEAR QUADRANT BIAS CLR -(SP) MOV 2(R5),R4 ;GET FIRST ARG ADDRESS MOV 2(R4),-(SP) ;GET FIRST ARG MOV @R) MOV #40200,4(SP) ;INSERT 1. CLR 6(SP) JSR R4,$POLSH ;COMPUTE 1./X $DVR,LE1$39 LE1$39: MOV 2(SP),-(SP) ;MOVE ARG DOWN 4,-(SP) MOV @SP,R0 ;ARG1 TO R0 MOV 4(R5),R4 ;GET SECOND ARG ADDRESS MOV 2(R4),-(SP) ;GET SECOND ARG MOV @R4,-(SP) MOV MOV 2(SP),-(SP) CLR 4(SP) CLR 6(SP) CMP @SP,#037611 ;TAN(15) BLO L15$39 ;JUMP IF LESS THAN TAN(15) BHI TNS$39 ;JUM @SP,R1 ;ARG2 TO R1 BEQ INF$39 ;JUMP IF DENOMINATOR IS 0 ASL R0 ;GET ABS VAL ARG1 CLRB R0 ;GET EXPONENT SWAB R0 ASP IF > CMP 2(SP),#030243 BLOS L15$39 TNS$39: MOV #040006,4(SP) ;INSERT PI/6 MOV #005222,6(SP) MOV @SP,R0 ;ARG TO REGS L R1 CLRB R1 ;GET EXPONENT ARG2 SWAB R1 SUB R1,R0 ;GET EXPONENT DIFFERENCE CMP #26.,R0 ;CHECK MAGNITUDE BLT INF$39 MOV 2(SP),R1 MOV #131727,-(SP) ;PUSH -ROOT 3 MOV #140335,-(SP) MOV R1,-(SP) MOV R0,-(SP) ;PUSH ARG CLR -(SP) ;PUSH ;TREAT AS INFINITY DIV$39: JSR R4,$POLSH $DVR,UPL$39 ;GET ARG1/ARG2 UPL$39: TST @4(R5) ;IF ARG2 >0, BIAS =0 BGE ATE$39 1. MOV #40200,-(SP) MOV #131727,-(SP) ;PUSH ROOT3 MOV #040335,-(SP) MOV R1,-(SP) ;PUSH ARG MOV R0,-(SP) JSR R4,$POLS ;IF ARG2<0, BIAS=SIGN(ARG1)*PI MOV #040511,8.(SP) ;PI MOV #007733,10.(SP) TST @2(R5) ;TEST ARG1 BGE ATE$39 ADD #1000H ;TRANSFORM ARG ; (ROOT3*X-1)/(ROOT3 +X) $MLR,$SBR,UP$39,$SBR,$DVR,L15$39 L15$39: MOV @SP,R0 ;GET ARG MOV 2(SP),R1 MOV00,8.(SP) ;-PI ATE$39: TST @SP ;SET CODES BR AT1$39 ;JOIN MAIN ROUTINE INF$39: ADD #18.,SP ;FLUSH STACK MOV #040311,R0 R1,-(SP) ;GET THREE COPIES MOV R0,-(SP) MOV R1,-(SP) MOV R0,-(SP) JSR R4,$POLSH $MLR ;GET ARG**2 PLY$39 ;SET UP;ANS = SIGN(ARG1)*PI/2 MOV #007733,R1 TST @2(R5) ;TEST ARG1 BGE INR$39 ;JUMP IF +PI/2 ADD #100000,R0 ;-PI/2 INR$39: R COEFFICIENTS $MLR,$ADR,$MLR,$ADR,$MLR,$ADR $MLR,$ADR,$MLR,$ADR $ADR ;P(X)+0 IF X<=1, P(X)-PI/2 IF X>1 SGN$39 ;ADJUSSET FLOAT CC BR AT1$39 ;JOIN MAIN ROUTINE INF$39: LDF PI2$39,F1 ;RESULT=SIGN(ARG1)*PI/2 TST @R3 ;TEST ARG1 BGE EXI$39;PI/6 RT3$39: 040335,131727 ;ROOT3 .ENDC FCO$39: 037305,035302 ;.0963034789 137421,056514 ;-.1419574624 037514,143333 ;. ;+PI/2 NEGF F1 ;-PI/2 BR EXI$39 ATAN: SETF ;SET FP MODE FOR FPU CLRF F3 ;CLEAR ATAN2 BIAS LDF @2(R5),F0 ;GET AR1999773201 137652,125244 ;-.3333331319 CON$39: 040200,000000 ;.9999999999 .ENDC ; .SBTTL $EXP04 .IFDF EXP$ ; EXP V00GUMENT AT1$39: CLR R4 ;CLEAR SIGN FLAG CFCC ;GET SIGN OF ARGUMENT STF F3,F5 ;F5=ATAN2 BIAS CLRF F3 ;CLEAR QUADRANT B4A .GLOBL EXP,$ERRA; .IFNDF FPU .GLOBL $ADR,$SBR,$MLR,$DVR,$IR,$RI,$POLSH; .ENDC ; EXP THE REAL EXPONENTIATION ROUTIIAS BGE PLU$39 ;JUMP IF QUADRANT 1 OR 3 ABSF F0 ;ABS(X) INC R4 ;FLAG - PLU$39: LDF #1.0,F1 ;1.0 CMPF F0,F1 ;CHECK NE ; CALLING SEQUENCE: ; JSR R5,EXP ; BR A ; .WORD ARG ADDRESS ;A: ; RETURNS EXPONENTIAL IN R0 AND R1. F0=%0 F1=%1 IF X<=1.0 CFCC BLE LE1$39 GT1$39: DEC R4 ;X>1.0, ADJUST SIGN FLAG DIVF F0,F1 ;1.0/X LDF F1,F0 ;ATAN(X)=PI/2-ATAN(1/X F2=%2 F3=%3 EXP: MOV 2(R5),R4 ;GET ARGUMENT POINTER MOV @R4,R0 ;GET HIGH ORDER ARG BGT POS$20 ;JUMP IF ARG + CMP R0,SP)+,R1 MOV #CON$39+4,R2 ;POINT TO COEFFICIENT TABLE MOV #5,R3 ;LOOP 5 BR PY1$39 PY2$39: MOV R1,-(SP) ;PUSH ARG MOV R0) LDF PI2$39,F3 ;QUADRANT BIAS=PI/2 LE1$39: STF F3,F4 ;F4=QUADRANT BIAS CLRF F3 ;F3=0.0 CMPF T15$39,F0 ;COMPARE TAN(1,-(SP) PY1$39: MOV -(R2),-(SP) ;PUSH CONSTANT MOV -(R2),-(SP) DEC R3 ;COUNT BGT PY2$39 JMP @(R4)+ SGN$39: TST 8.(SP5) : X CFCC BGE L15$39 ;X<= TAN(15) LDF PI6$39,F3 ;F3=PI/6 LDF F0,F1 MULF RT3$39,F0 SUBF #1.0,F0 ;X*ROOT3-1.0 AD) ;CHECK SIGN FLAG BEQ SG1$39 ADD #100000,@SP ;NEGATE RESULT FOR (-1,0) & (1,INF) SG1$39: JMP @(R4)+ .ENDC .IFDF FPUDF RT3$39,F1 ;X+ROOT3 DIVF F1,F0 ;(X*ROOT3-1.0)/(X+ROOT3) L15$39: LDF F0,F2 ;X MULF F0,F0 ;X**2 MOV #FCO$39,R0 ;POIN ATAN2: SETF ;SET FP MODE FOR FPU MOV 2(R5),R3 ;ADDRESS OF ARG1 MOV 4(R5),R4 ;ADDRESS OF ARG2 MOV @R3,R0 ;HIGH ORDER ATER TO POLYNOMIAL CONSTANTS MOV #4,R1 ;COUNT OF COEFFICIENTS LDF (R0)+,F1 ;INITIALIZE ACCUMULATOR XPD$39: MULF F0,F1 DECRG1 MOV @R4,R1 ;HIGH ORDER ARG2 BEQ INF$39 ;JUMP IF DENOMINATOR 0 ASL R0 CLRB R0 SWAB R0 ;EXPONENT OF ARG1 ASL R1 R1 ;COUNT ADDF (R0)+,F1 ;F1:= F1* X**2 + C(I) BGT XPD$39 ;LOOP MULF F2,F1 ;F1:= F1*X ADDF F3,F1 ;PI/6 OR 0.0 SUBF CLRB R1 SWAB R1 ;EXPONENT OF ARG2 SUB R1,R0 ;GET EXPONENT DIFFERENCE CMP #26.,R0 ;CHECK MAGNITUDE BLT INF$39 ;TRE F4,F1 ;P(X)-QUAD BIAS TST R4 ;TEST SIGN FLAG BEQ SG1$39 ;NO ADJUSTMENT NEGF F1 ;NEGATE RESULT FOR (-1,0)&(1,INF) SG1AT AS INFINITE LDF PI$39,F3 ;INITIALIZE BIAS=PI LDF @R3,F0 ;GET ARG1 CFCC BGE A1P$39 ;JUMP IF ARG1>0 NEGF F3 ;BIAS=$39: ADDF F5,F1 ;ATAN2 BIAS EXI$39: STF F1,-(SP) ;MOVE RESULT TO STACK MOV (SP)+,R0 ;AND THEN TO REGISTERS MOV (SP)+,R1 SIGN(ARG1)*PI A1P$39: LDF @R4,F1 ;GET ARG2 CFCC BLT A2M$39 CLRF F3 ;IF ARG2>0, BIAS=0 A2M$39: DIVF F1,F0 ;ARG1/ARG2, RTS R5 ;EXIT PI$39: 040511,007733 ;PI PI2$39: 040311,007733 ;PI/2 T15$39: 037611,030243 ;TAN(15) PI6$39: 040006,005222 ONSTANTS $MLR ;Y*Y $ADR ;B1+Y*Y $DVR ;A1/(B1+Y*Y) $ADR ;Y+A1/(B1+Y*Y) $ADR ;A0+Y+A1/(B1+Y*Y) $DVR ;Y/(A01,F2 ;Y/(A0+Y+A1/(B1+Y*Y)) MULF #2.0,F2 SUBF F2,F0 ;1-2*Y/. . . MULF F0,F0 ;(1-2*Y/. . . )**2 SC1$20: STF F0,-(SP) ;MO+Y+A1/(B1+Y*Y)) INC$20 ;-2*Y/(A0+Y+A1/(B1+Y*Y)) $ADR ;1-2*Y/......... DUP$20 ;DUPLICATE IT $MLR ;(1-2*Y/.....)**VE APPROXIMATION TO STACK .ENDC .IFNDF FPU ZFR$20: CMP (SP)+,(SP)+ ;FLUSH CFRACT ARG ;RESULT IS 1. .ENDC SCL$20: 2 SCL$20 ;EXIT POLISH MODE AND SCALE RESULT INC$20: ADD #100200,@SP ;MULTIPLY BY -2.0 JMP @(R4)+ ;GO BACK TO LIST DUPMOV (SP)+,R0 ;GET APPROXIMATION RESULT MOV (SP)+,R1 .IFNDF FPU MOV (SP)+,R4 ;GET INT(X*LOG2(E)) .ENDC SWAB R4 ;MAKE I$20: MOV 2(SP),-(SP) ;DUPLICATE STACK ITEM MOV 2(SP),-(SP) JMP @(R4)+ PLE$20: MOV #125073,-(SP) ;PUSH LOG2(E) MOV #4027NTO EXPONENT MODIFIER CLRB R4 ASR R4 ADD R4,R0 ;ADD IN EXPONENT MODIFIER BMI OVR$20 ;TEST OVERFLOW RTS R5 ONE$20:0,-(SP) JMP @(R4)+ ESV$20: MOV @SP,10.(SP) ;SAVE EXPONENT SCALE JMP @(R4)+ CFR$20: ROL @SP ;SHIFT MODIFIED ARG ROL CLR R1 MOV #40200,R0 ;EXP(TINY) = 1. RTS R5 OVR$20: MOV #2404,R0 ;ERROR 4,5 BR ECL$20 ZER$20: MOV #2405,R0 ;ERROR 5,5 R0 ;SAVE SIGN SUB #400,@SP ;DIVIDE BY 2. BLOS ZFR$20 ;UNDERFLOW. MAKE ARG 0 ROR R0 ;GET SIGN BACK ROR @SP MOV @SP,RECL$20: JSR R5,$ERRA CLR R0 ;RETURN 0 CLR R1 RTS R5 .IFDF FPU ; ORDER-DEPENDENT CONSTANTS FCO$20: 040270,125073 ;0 ;GET MODIFIED ARGUMENT MOV 2(SP),R1 ;IN REGISTERS MOV #036602,-(SP) ;PUSH -12.01501675 MOV #141100,-(SP) MOV R1,-(SP)LOG2(E) DOUBLE PRECISION 024534,013761 040470,125073 ;2*LOG2(E) DOUBLE PRECISION 024534,013761 041560,056133 ;B1=60.0901 MOV R0,-(SP) MOV #071571,-(SP) ;PUSH 601.8042667 MOV #042426,-(SP) MOV #056133,-(SP) ;PUSH 60.0901907 MOV #041560,-(S907 042426,071571 ;A1=601.8042667 141100,036602 ;A0=-12.01501675 .ENDC .ENDC ; .SBTTL $SQT03 .IFDF SQRT$ ; SQRT V#141662 BHI ZER$20 ;JUMP IF EXPONENT < -88.7 BR SMT$20 POS$20: CMP R0,#41660 BHI OVR$20 ;JUMP IF EXPONENT > 87 SMT$20:P) MOV R1,-(SP) MOV R0,-(SP) MOV R1,-(SP) MOV R0,-(SP) JMP @(R4)+ .ENDC .IFDF FPU SETD ;DOUBLE PRECISION ARG ASL R0 ;DUMP SIGN CMP R0,#63000 BLO ONE$20 ;JUMP IF EXPONENT MAGNITUDE < 2**-28 .IFNDF FPU TST -(SP) ;SAVE SPACE FORUMENT REDUCTION SETI ;SHORT INTEGERS MOV #FCO$20,R0 ;POINTER TO CONSTANTS LDCFD @R4,F2 ;GET ARGUMENT MODD (R0)+,F2 ;F SCALE CLR -(SP) ;PUSH A 1. MOV #40200,-(SP) MOV 2(R4),-(SP) ;GET LOW ORDER ARGUMENT MOV @R4,-(SP) ;HIGH ORDER MOV 2(2=FRACT(X*LOG2(E)) STCDI F3,R4 ;R4=INT (X*LOG2(E)) LDD #1.0,F0 ;F0=1.0 DIVD (R0)+,F2 ;Y=F2/(2*LOG2(E)) SETF LDCDF FR4),-(SP) ;NEED TWO COPIES OF IT MOV @R4,-(SP) JSR R4,$POLSH ;ENTER POLISH MODE PLE$20,$MLR ;PUSH LOG2(E) $RI ;FIX LO2,F2 ;REST IN SINGLE PRECISION CFCC ;TEST FOR UNDERFLOW BEQ SC1$20 ;APPROXIMATION RESULT IS 1.0 LDF F2,F3 MULF F3,F3G2(E)*X ESV$20 ;SAVE EXPONENT SCALE $IR ;FLOAT IT PLE$20,$DVR,$SBR ;PUSH LOG2(E) CFR$20 ;PUSH CONTINUED FRACTION C ;Y*Y ADDF (R0)+,F3 ;B1+Y*Y LDF (R0)+,F1 DIVF F3,F1 ;A1/(B1+Y*Y) ADDF F2,F1 ADDF (R0)+,F1 ;A0+Y+A1/(B1+Y*Y) DIVF F MOV @2(R5),R1 ;GET HIGH ORDER ARGUMENT .ENDC .IFNDF FPU SQRT: MOV R5,-(SP) MOV 2(R5),R5 ;GET ARGUMENT ADDRESS MOV @R5,FDF CAPS$ .GLOBL DEMXMN .ENDC .GLOBL DEDATA,$POLSH,$MLR,$CMR,DEDID,DEASGN .GLOBL $DVR,$SBR,SAVARG,RSTARG .GLOBL DELST,DEGER1 ;GET HIGH ORDER ARGUMENT .ENDC BMI ERR$41 ;ERROR IF ARGUMENT NEGATIVE BEQ ZER$41 ;FAST EXIT IF ZERO .IFNDF FPU MT,DEPUT .IFDF GT40$ .GLOBL GTRCAL,DISMPO .ENDC ;ROUTINES CALLED:DEMXMN,DESCA,$POLSH ; SAVARG,RSTARG ;---DEOV10--- OV #3,-(SP) ;PUSH ITERATION COUNT .ENDC ASR R1 ;FORM INITIAL ESTIMATE ADD #20100,R1 CLR -(SP) ;USE ONLY HIGH ORDER PAR ;THIS ROUTINE CHKS BUFRS POINTED TO BY 'DEDID & DEDID+2' TO SEE ;IF EITHER ONE IS A F.P. BUFR AND ;IF GT40 DISPLAY A FLAG IS TS FIRST MOV R1,-(SP) ;'CAUSE ADD AND DIVIDE ARE .IFNDF FPU CLR -(SP) ;FASTER THAT WAY MOV @R5,-(SP) CLR -(SP) MOV SET TO TELL GT40 DISPLY ROUTINE TO ;RECALCULATE ITS DISPLAY BUFR WHENEVER THE BUFR IN QUESTION ;IS BEING DISPLAYED. FOR BOTH R1,-(SP) LUP$41: JSR R4,$POLSH ;ENTER POLISH MODE $DVR,$ADR,UPL$41 ;(X/E+E) UPL$41: SUB #200,@SP ;(X/E+E)/2 DEC 4(SP) ;COGT40 & VR14 ;THE MULT & OFFSET IS CALC & STUCK IN THE CORRECT ASSIGN TBL ENTRY ;AND IN THE CORRECT I/D TBL. FOR VR14, THE DATUNT LOOP BEQ OUT$41 MOV 2(R5),-(SP) ;USE LOW ORDER PARTS MOV @R5,-(SP) ;TOO FROM NOW ON MOV 6(SP),-(SP) MOV 6(SP),-(SPA IS ;SCALED DOWN & PUT IN THE S.P. BUFR DEOV10: TSTB @#DEDID+1 BEQ DEFLC0 MOV #DEDID,R1 MOV (R1),(PC)+ TEMP2: 0 CL) BR LUP$41 ;GO FOR ANOTHER ITERATION OUT$41: MOV (SP)+,R0 ;GET RESULT INTO R0,R1 MOV (SP)+,R1 TST (SP)+ ;POP ITERATIONR (PC)+ TEMP1: 0 JSR PC,DEFLC1 DEFLC0: TSTB @#DEDID+3 BNE DEFLC2 RTS PC DEFLC2: MOV #DEDID+2,R1 MOV (R1),TEMP2 MOV COUNTER RTN$41: MOV (SP)+,R5 RTS R5 ;RETURN TO CALLER ERR$41: JSR R5,$ERR ;ERROR 4,11 BR RTN$41 .BYTE 4,11. ZER$41: #2,TEMP1 JSR PC,DEFLC1 RTS PC DEFLC1: .IFNDF SPNDI$ .IFDF GT40$ INCB @#GTRCAL .ENDC CLR R0 ;NEED START OF B2 CLR R0 CLR R1 BR RTN$41 .ENDC .IFDF FPU MOV #3,R0 ;ITERATION COUNT SETF ;SINGLE PRECISION FP LDF (SP)+,F0 ;GET MOV @#DEDATA,R5 DEC R5 ;NEED SIZE-1 OF B2 JSR PC,DEMXMN ;TO FIND MAX-MIN OF B2 JSR PC,DESCA ;TO FIND MULT & OFFSET OF B2 INITIAL ESTIMATE LDF @2(R5),F2 ;GET X LUP$41: LDF F0,F1 ;E=E' LDF F2,F0 ;X DIVF F1,F0 ;X/E ADDF F1,F0 ;X/E+E DE MOV TEMP1,R0 ADD #DELST,R0 MOV (R0),R0 MOV #DEASGN+2,R5 ;ADDR+2 OF 1ST ASSIGN ENTRY CMPB TEMP2,@#DEASGN ;CORRECT ASSIGC R0 ;COUNT DIVF #2.0,F0 ;E'=(X/E+E)/2 BGT LUP$41 STF F0,-(SP) ;RESULT TO STACK MOV (SP)+,R0 ;AND THENCE TO R0,R1 N TBL ENTRY IS 1ST ? BEQ DEFLC3 ;YES ADD #12,R5 ;NO, ADDR+2 OF 2ND ENTRY DEFLC3: .IFDF GT40$ ADD #DISMPO,R0 ;INDEX F003A .GLOBL SQRT,$ERR; .IFNDF FPU .GLOBL $ADR,$DVR,$POLSH; .ENDC ; SQRT THE REAL SQUARE ROOT FUNCTION ; CALLING SEQMOV (SP)+,R1 RTS R5 ;EXIT ERR$41: JSR R5,$ERR ;ERROR 4,11 RTS R5 ;EXIT .BYTE 4,11. ZER$41: CLR R0 CLR R1 RTS R5UENCE: ; JSR R5,SQRT ; BR A ; #ARG ;A: ; RETURNS THE SQUARE ROOT IN R0 AND R1. F0=%0 F1=%1 F2=%2 .IFDF FPU SQRT: .ENDC .ENDC .ENDC ;ASSEMBLY PARAMETERS ;GT40$ ;IF DEFINED ASSEMBLE CODE FOR GT40 ;VR14$ ;IF DF CODE FOR VR14 .I MOV R1,-(SP) BR DESCA2 DESCA1: TST R3 ;MIN VAL >= 0? BMI DESCA3 ;NO MOV R4,-(SP) ;YES, PUT OFFSET(MIN) ON STACK MOOR STORING: MOV R1,(R0)+ ;'MULT' IN I/D TBL MOV R2,(R0)+ MOV R3,(R0)+ ;'OFFSET' IN I/D TBL MOV R4,(R0) .ENDC .IFDF VV R3,-(SP) DESCA2: MOV @#DENORM+2,-(SP) ;PUT DENORM ON STACK MOV @#DENORM,-(SP) MOV R2,-(SP) ;PUT MAX ON STACK MOV R1,-(SR14$ CLR TEMP1 ;SET UP FOR S.P. BUFR TYPE AND #,THEN DEC R5 ;SAVE IN TEMP1 MOVB (R5),TEMP1 INC R5 .ENDC MOV R1,(R5P) MOV R4,-(SP) ;PUT MIN ON STACK MOV R3,-(SP) JSR R4,@#$POLSH ;MULT=DENORM/(MAX-MIN) $SBR,$DVR,.+2 BR DESCA6 DESCA3:)+ ;ALSO SAV 'MULT' IN ASIGN TBL MOV R2,(R5)+ MOV R3,(R5)+ ;AND 'OFFSET' IN ASSIGN TBL MOV R4,(R5) .IFDF VR14$ ;NOW SCA CLR -(SP) ;PUT OFFSET(0) ON STACK CLR -(SP) BIC #100000,R1 ;ABS VAL OF MAX BIC #100000,R3 ;ABS VAL OF MIN JSR PC,@#SAVLE THE DATA DOWN ;SCALED DATA = (DATUM - OFFSET)*SCAFAC MOV @#DEDATA,DEDICT ;DN CTR CLR R0 DEFLC4: MOV R0,(PC)+ DEDIR0:ARG MOV R2,-(SP) MOV R1,-(SP) ;PUT ABS VAL OF MAX ON STACK MOV R4,-(SP) MOV R3,-(SP) ;PUT ABS VAL OF MIN ON STACK JSR 0 JSR PC,@#SAVARG MOV R2,-(SP) MOV R1,-(SP) ;FL.PT. SCA FAC JSR R5,@#DEGET TEMP2 ;GET DATUM MOV R4,-(SP) MOV R3R4,@#$POLSH $CMR,.+2 BPL DESCA4 ;/MAX/>=/MIN/ JSR PC,@#RSTARG ;/MIN/ > /MAX/ MOV R3,R1 MOV R4,R2 ;PUT GREATER OF 2 A,-(SP) ;GET OFFSET JSR R4,@#$POLSH $SBR,$MLR,.+2 ;(DATUM-OFFSET)*SCA FAC MOV DEDIR0,R0 JSR R5,@#DEPUT TEMP1 ;PUT DABS VALS IN R1,R2 BR DESCA5 DESCA4: JSR PC,@#RSTARG ;GREATER OF 2 ABS VALS ALREADY IN R1,R2 DESCA5: MOV @#DENORM+2,-(SP) MOTUM IN S.P. BUFR JSR PC,@#RSTARG INC R0 DEC (PC)+ DEDICT: 0 BNE DEFLC4 .ENDC RTS PC ;---DESCA--- ;CALL: JSR PC,DV @#DENORM,-(SP) ;PUT 'DENORM' ON STACK MOV R2,-(SP) MOV R1,-(SP) ;PUT LARGER OF 2 ABS VALS ON STACK JSR R4,@#$POLSH ;'DENESCA ;INPUT: ; R1=H.ORD OF MAX VAL, R2=L.ORD OF MAX VAL ; R3=H.ORD OF MIN VAL, R4=L.ORD OF MIN VAL ;FUNCTION: ; IF MAX>MIN>ORM'/(MAX-MIN) IF POS-NEG DATA $DVR,.+2 ;OR DESCA6: MOV (SP)+,R1 MOV (SP)+,R2 ;RTNED IN R1,R2 = MULT MOV (SP)+,R3 MOV =0, OFFSET=MIN, MULT=DENORM/(MAX-MIN) ; IF MIN=0? BPL DESCA1 ;YES MOV R2,-(SP) ;NO, PUT OFFSET(MAX) ON STACK ON A GT40 & WRITES THEM BACK TO THE TERMINAL ;THE PURPOSE OF THIS PROGRAM IS TO ILLUSTRATE HOW ONE USES THE ;LAB APPLICATIONE MOV #2000,DISSZX(R1) ;USE FULL WIDTH OF SCREEN MOV #1377,DISTOP(R1) ;UPPER BOUND OF DISPLAY CLR DISBOT(R1) ;LOWER BOUND S MODULES(TTYR11.MAC,QA.MAC,OUTF.MAC,GENS.MAC,GTDISP.MAC) ;ASSEMBLY INSTRUCTIONS ;CHILD=PARAM.ASM,VTMAC,CHILD ;TTY=PARAMOF DISPLAY MOVB #1,DISSKP(R1) ;RECALCULATE DISPLAY BUFFER ;CALL THE 'GINIT' ROUTINE FOR EACH I/D TBL ;TO SET UP REMAINING .ASM,TTYR11 ;QA=PARAM.ASM,QA ;OUTF=PARAM.ASM,OUTF ;GENS=PARAM.ASM,GENS ;DISPLY=PARAM.ASM,GTDISP ;LINKING INSTRUCTIONS ;PARAMETERS IN THE I/D TBL FOR THE DISPLAY $GINIT #IDTAB1 ;SETUP BUFFER CONTROL BLOCK MOV FREE+2,BUFPNT ;1ST FREE LOCACHILD=CHILD,TTY,QA,OUTF,GENS,SPFPMP/C ;VTLIB,DISPLY ;RUNTIME INSTRUCTIONS ;BOOT UP RT11 ; .R CHILD ;GLOBAL SYMBOLS TION IN CORE MOV @#54,R0 ;USING RT11 TO FIND THE TOP OF TST -(R0) ;FREE CORE .MCALL .SETTOP .SETTOP SUB FREE+2,R0 ; .TITLE PARAM ;FILE NAME: PARAM.ASM ;THIS IS AN ASSEMBLY PARAMETER FILE TO BE ASSEMBLED ALONG ;WITH THE STANDARD LAB APP ;TTYR11 MODULE .GLOBL TTYICH,TTYOCH,TTYBFA,TTYBUF ;QA MODULE .GLOBL QADATF,QAERR,QAANS ;OUTF MODULE .GLOBL FORBUF ;LICATIONS MODULES, USED TO BUILD THE ;THE FOLLOWING PROGRAMS (BABY,CHILD,PARENT,GRAMP). RT11$=1 ;RT11 OPERATING SYSTEM IS IGTDISP MODULE .GLOBL GTRCAL ;EXTERNAL REF BY 'CHILD' TO 'SPFPMP' .GLOBL FLOAT ;DEFINITIONS BY MACROS .MCALL .REGDEF,$QN USE ;TTYR11 MODULE TTYR$2=1 ;LPT IS AVAILABLE ;OUTF MODULE FORTX$=1 ;ASCII TEXT OUTPUT FORSP$=1 ;SING PREC OUTPADEF,$OUTDE,$GTDEF .MCALL $MOV,$CALL,$CRLF,$TYPMS,$QA,$FRMAT .MCALL $GINIT,$GINT0,$GTDIS,$SAV05,$RST05 .REGDEF $QADEF $OUTDUT FORFL$=1 ;FL PT OUTPUT ;QA MODULE QASDO$=1 ;SING,DBL,OCTAL INPUT QAALP$=1 ;ALPHANUMERIC INPUT (LIST COMPARE) ;GEE ;DEFINE I/D TBL OFFSETS, GLOBALIZE ALL OFFSETS & SET I/D TBLSIZ $GTDEF BUFSIZ=10. ;DATA BUFFER HAS 10 POINTS ;START ONS MODULE SAVRG$=1 ;SAVE & RESTORE REGISTERS LISTC$=1 ;LIST COMPARE MULT$=1 ;MULTIPLY MULTS$=1 ;SIGNED MULTIPLY DIV$=1 ;DF PROGRAM 'CHILD' ;SETUP INIT/DISPLAY TABLE START: MOV #IDTAB1,R1 ;R1 = I/D TBL ADDR MOV #BUFSIZ,DISBUF(R1) ;STORE BUFFEIVIDE ;GTDISP MODULE GTD$7=1 ;ACCEPT SCOPE PARAMETERS GTD$C=1 ;CHECK 'DISSKP' FLG IN EACH I/D TBL ;ADSAM MODULE R SIZE IN TBL CLR DISXBU(R1) ;0=Y DATA DISPLAY ONLY MOV #DATABF,DISYBU(R1) ;STORE Y DATA BUF ADDR IN TBL MOV #1,DISTYP(R1) LPS11$=1 ;USING LPS HARDWARE AD$1=1 ;A DISPLAY IS SHOWN GT40$=1 ;DISPLAY IS ON GT40 AD$5=1 ;LED READOUT IS INCLUDED ;DISPLAY SING.PREC.DATA CLRB DISSC(R1) ;DONOT SCALE THE DATA CLRB DISCU(R1) ;DONOT DISPLAY FIX CURSORS CLR DISST(R1) ;DISPLAY BEGINS WITH 1ST BUF PT MOV #1,DISN(R1) ;DISPLAY EVERY POINT MOV #BUFSIZ,DIST(R1) ;DISPLAY ALL OF BUFFER MOV #7,DISCI( .TITLE CHILD ;FILE NAME: CHILD.MAC ;THIS IS A PROGRAM WHICH SIMPLY ACCEPTS 10 INTEGERS VIA THE ;TERMINAL, DISPLAYS THEMR1) ;CHOOSE HIGHEST INTENSITY CLR DISOFX(R1) ;START DISPLAY ON LF OF SCREEN MOV #600,DISOFY(R1) ;0 WILL BE AT CENTER OF SCOPN TSTB QAERR ;TEST FOR VALID DATA BEQ 3$ ;DATUM IS OKAY $TYPMS #MESS4 ;USE TTY MOD TO TYPE ERROR BR 1$ ;TRY EXAMPLE BR Z .WORD Y Y: 0 ;HOLDS DATUM TO BE FLOATED Z: MOV R0,9$ ;HIGH ORDER PART OF FL.PT.VALUE MOV R1,9$+2 ;LOW ORDER PART AGAIN 3$: MOV QAANS,(R1)+ ;PUT DATUM IN BUFFER DEC R2 ;10 INTEGERS READ IN YET? BEQ 4$ ;YES $QA QASP+QASIL ;REMAINING 9OF FL.PT.VALUE $RST05 ;RESTORE ALL REGISTERS JSR PC,7$ ;OUTPUT THE DATUM DEC R2 ;DONE YET? BEQ 11$ ;YES DEC R5 ; DATA RETRIEVED VIA ;SILENT QUESTION OPTION OF QA ;SILENT QUEST + SING PREC NUMBER BR 2$ ;AT THIS POINT ALL 10 INIS OUR LINE DONE YET? BEQ 5$ ;YES ADD #13.,R3 ;BUMP 'COLST' VALUE BY 10 BR 6$ ;ROUTINE CALLS FORMATTER TO OUTPUT A FLTEGERS ARE IN THE DATA BUFFER. ;NOW DISPLAY THE 10 INTEGERS ;CALL 'GINIT0' ROUTINE TO PASS 4 POINTERS VIA 'PNTR' TABLE 4$ PT NUMBER IN E-FMT 7$: $FRMAT .BYTE COLST 8$: .BYTE 0 ;COLUMN START VALUE .BYTE EXP ;E-FMT OUTPUT .BYTE 200+4,5 ;2: $GINT0 #PNTR ;SET 'GTRCAL' FLG AND CALL 'GTDISP' ROUTINE MOVB #1,GTRCAL ;CALCULATE THE DISPLAY BUFFER $GTDIS TST R0 DEC PLACES & 5 SIGN FIG .EVEN 9$: 0 ;FL PT DATUM TO BE OUTPUT 0 ;LOW ORDER PART .BYTE EXIT .EVEN RTS PC ;ROUT BNE ERROR ;DISPLAY BUFFER OVERFLOW ;TELL GT40 DISPLAY HANDLER ABOUT OUR DISPLAY BUFFER .LNKRT .INSRT BUFPNT ;DISPLINE TO OUTPUT WARNING IF ONE EXCEEDS LENGTH OF TTY LINE BUFOVR: MOV #MESS3,R0 10$: $TYPMS 11$: JMP START ;ERROR MESSAGE AY BUF ADDR .START ;TURN ON GT40 ;ASK USER WHEN TO CONTINUE $QA QANAOK,MESS5 ;NULL ANS - ONLY A CR IS EXPECTED ;A ERROR: MOV #MESS6,R0 BR 10$ .DSABL LSB ;MESSAGES MESS1: .ASCIZ /**CHILD EXAMPLE** ENTER 10 INTEGERS/ MESS2: .ASCIR0 = SIZE OF FREE CORE MOV R0,BUFPNT+2 ;PUT SIZE IN BUF CTRL BLK ;SETUP CONTROL INFORMATION FOR TTY MODULE CLRB TTYICH SK USER THE QUESTION .STOP ;TURN OFF GT40 WHEN USER HITS CR .REMOV BUFPNT ;REMOVE DISPLAY BUF FROM HANDLER ;USE THE OU ;0=INPUT IS FROM TERMINAL CLRB TTYOCH ;0=OUTPUT TO TERMINAL MOV #BUFOVR,TTYBFA ;SETUP 'BUFFER FULL' JMP ADDRESS ;USE FOTPUT FORMATTER TO WRITE BACK THE 10 INTEGERS MOV #DATABF,R1 ;R1=DATA BUFFER ADDRESS MOV #10.,R2 ;R2=DONE CTR CLR R4 ;RRMAT MODULE TO ISSUE 3 LINE FEEDS $FRMAT .BYTE LINES,3 .BYTE EXIT .EVEN ;USE TTY MODULE TO OUTPUT A MESSAGE $CR4=NUMBER OF DATA/TERMINAL LINE $FRMAT .BYTE CRLFC0 .BYTE TEXT .ASCIZ /USING EXPONENTIAL FORMAT/ .BYTE EXIT .EVEN .LF $TYPMS #MESS1 $CRLF ;USE QA TO TYPE OUT A '#' & RECEIVE TTY INPUT ; 10 INTEGERS WILL BE TYPED IN & STORED IN A DATA BDSABL LSB .ENABL LSB 5$: ADD #1,R4 ;INC NUMBER OF DATA/LINE MOV R4,R5 ;NUMBER OF DATA FOR CURRENT OUTPUT LINE MOV #1,R3UFFER .ENABL LSB 1$: MOV #DATABF,R1 ;R1 HOLDS DATA BUFFER ADDRESS MOV #10.,R2 ;R2=CTR FOR THE 10 INTEGERS $QA QASP,MES ;R3 HOLDS THE 'COLST' VALUE $FRMAT .BYTE CRLFC0,EXIT .EVEN 6$: MOVB R3,8$ ;PICKUP THE 'COLST' VALUE FOR NEXT DATUM MS2 ;ANSWER TYPE IS SING PREC & ADDR OF MESSAGE 2$: TSTB QADATF ;TEST FOR DATA FOUND BEQ 1$ ;NO DATA FOUND, TRY EXAMPLE AGAIOV (R1)+,Y ;GET NEXT DATUM FROM BUFFER $SAV05 ;FPMP DESTROYS ALL REGISTERS JSR R5,FLOAT ;CALL 'SPFPMP' TO FLOAT DATUM R ADDR 0 ;FREE CORE AVAILABLE 0 ;OFFSET VALUE DSPLST: IDTAB1 ;DISPLAY LIST 0 CRVLST: 0 ;LIST OF GT40 BUFFER VEC,LPSSAD,ADDTYB,ADDTAB,ADGTON,ADGTOF ;DEFINITIONS BY MACROS .MCALL .REGDEF,$QADEF,$OUTDE,$GTDEF .MCALL $MOV,$CALL,$CRLF,ADDRESSES 0 ;FILLED IN BY GTDISP MODULE PNTR: DSPLST DSPLST CRVLST BUFPNT FREE: .LIMIT ;1ST WRD GIVES START OF$TYPMS,$QA,$FRMAT .MCALL $GINIT,$GINT0,$GTDIS,$ADSAM,$FFTC .REGDEF $QADEF $OUTDE ;DEFINE I/D TBL OFFSETS, GLOBALIZE ALL OFF STACK ;2ND WRD GIVES START OF FREE CORE .END START SETS & SET I/D TBLSIZ $GTDEF BUFSIZ=64. ;DATA BUFFER HAS 64 POINTS ;START OF PROGRAM 'GRAMP' ;SETUP INIT/DISPLAY TABLES START: BIS #100,@#44 ;INHIBIT TT WAIT MOV #IDTAB1,R1 ;R1 = I/D TBL #1 ADDR MOV #BUFSIZ,DISBUF(R1) ;BUFFER SIZE CLR DISXBU(R1) ;0=Y-DATA DISPLAY MOV #DATABF,DISYBU(R1) ;Y-DATA BUF ADDR MOV #1,DISTYP(R1) ;DISPLAY TYPE = S.P. CLRB DISSC(R1) .TITLE GRAMP ;FILE NAME: GRAMP.MAC ;THIS PROGRAM COLLECTS 64 DATA VALUES FROM THE LPS VIA CHAN#0 ;IT THEN DISPLAYS THE ;SCA FAC =0 CLRB DISCU(R1) ;FIX CURSOR FLG IS OFF CLR DISST(R1) ;ST-1 =0 MOV #1,DISN(R1) ;DISPLAY EVERY POINT MOV #BUFSIVALUES USING A SINGLE DISPLAY. ;IT THEN USES A DUAL DISPLAY AND DOES AN FFT ON THE DATA,SHOWING ;REAL & IMAGINARY PARTS. THEN Z,DIST(R1) ;NUMBER OF PTS TO DISPLAY MOV #7,DISCI(R1) ;INTENSITY OF DISPLAY CLR DISOFX(R1) ;X-OFFSET =0 MOV #600,DISOFY(R1IT TYPES OUT THE REAL DATA BUFFER ;THE PURPOSE OF THIS EXAMPLE IS TO ILLUSTRATE HOW ONE USES ;THE LAB APPLICATIONS MODULES(TTY) ;Y-OFFSET = CENTER OF DISPLAY MOV #2000,DISSZX(R1) ;X-AXIS SIZE MOV #1377,DISTOP(R1) ;TOP OF DISPLAY CLR DISBOT(R1) ;BOTR11.MAC,QA.MAC,OUTF.MAC,GENS.MAC ;GTDISP.MAC,ADSAM.MAC,FFT.MAC) ;ASSEMBLY INSTRUCTIONS ;GRAMP=PARAM.ASM,VTMAC,GRAMP ;TTTOM OF DISPLAY MOVB #1,DISSKP(R1) ;RECALCULATE DISPLAY BUFFER MOV #IDTAB2,R1 ;NOW SET UP I/D TBL #2 MOV #BUFSIZ,DISBUF(RY=PARAM.ASM,TTYR11 ;QA=PARAM.ASM,QA ;OUTF=PARAM.ASM,OUTF ;GENS=PARAM.ASM,GENS ;DISPLY=PARAM.ASM,GTDISP ;ADSAM=PARAM.ASM,VTM1) CLR DISXBU(R1) MOV #IMAGBF,DISYBU(R1) MOV #1,DISTYP(R1) CLRB DISSC(R1) CLRB DISCU(R1) CLR DISST(R1) MOV #1,DISNZ /# / MESS3: .ASCIZ /INPUT LINE TOO LONG/ MESS4: .ASCIZ /BAD DATA/ MESS5: .ASCIZ /HIT 'CR' TO CONTINUE/ MESS6: .ASCIZ /DISPAC,ADSAM ;FFT=FFT ;LINKING INSTRUCTIONS ;GRAMP=GRAMP,TTY,QA,OUTF,GENS,SPFPMP/C ;VTLIB,DISPLY,ADSAM,FFT ;RUNTIME INSTRLAY BUFFER OVRFLO/ .EVEN ;BUFFERS TTYBUF: .BLKB 72. ;BUFFER USED BY TTY MODULE FORBUF=TTYBUF DATABF: .BLKW 10. ;DATAUCTIONS ;BOOT UP RT11 ; .R GRAMP ;GLOBAL SYMBOLS ;TTYR11 MODULE .GLOBL TTYICH,TTYOCH,TTYBFA,TTYBUF ;QA MODULE .GLO BUFFER IS 10 WORDS LONG IDTAB1: .BLKB TBLSIZ ;LOCATION OF I/D TABLE ;BUFFER CONTROL BLOCK BUFPNT: 0 ;DISPLAY BUFFEBL QADATF,QAERR,QAANS ;OUTF MODULE .GLOBL FORBUF ;GTDISP MODULE .GLOBL GTRCAL ;ADSAM MODULE .GLOBL ADSCAL,ADMAXV,LPS(R1) MOV #BUFSIZ,DIST(R1) MOV #7,DISCI(R1) CLR DISOFX(R1) MOV #600,DISOFY(R1) MOV #2000,DISSZX(R1) MOV #1377,DISTOP(/D TBL TO DISPLY LIST ;FIX UP I/D TBLS FOR THE DUAL DISPLAY MOV #IDTAB1,R1 MOV #1100,DISOFY(R1) ;CENTER OF TOP DISPLAYR1) CLR DISBOT(R1) MOVB #1,DISSKP(R1) ;CALL THE 'GINIT' ROUTINE FOR EACH I/D TBL $GINIT #IDTAB1 $GINIT #IDTAB2 ; MOV #600,DISBOT(R1) ;BOTTOM OF TOP DISPLAY MOV #IDTAB2,R1 MOV #600,DISTOP(R1) ;TOP OF BOTTOM DISPLAY MOV #300,DISOFY(R1SETUP BUFFER CONTROL BLOCK & COMPLETE A/D SAMPLING TBL MOV FREE+2,BUFPNT ;1ST FREE LOCATION IN CORE MOV @#54,R0 ;USING RT) ;CENTER OF BOTTOM DISPLAY MOVB #1,GTRCAL ;TELL DISPLAY MODULE TO $GTDIS ;RECALCULATE BOTH DISPLAYS TST R0 BNE ERROR11 TO FIND THE TOP OF TST -(R0) ;FREE CORE .MCALL .SETTOP .SETTOP SUB FREE+2,R0 ;R0 = SIZE OF FREE CORE MOV R0,BUFPNT ;DISPLAY BUFFER OVRFLO .START ;ADSAM JUST TURNED GT40 OFF ON EXITING ;THUS, IT MUST BE TURNED BACK ON ;ASK USER WH+2 ;PUT SIZE IN BUF CTRL BLK MOV R0,ADGRAS ;PUT SIZE IN A/D TBL MOV BUFPNT,ADGRAB ;DISPLY BUF ADDR IN A/D TBL ;SETUP CONTEN TO DO THE FFT $QA QANAOK,MESS7 ;NULL ANS - ONLY A CR IS EXPECTED ;TIME TO DO THE FFT IS RIGHT NOW $FFTC N ;FFT ROL INFORMATION FOR TTY MODULE CLRB TTYICH ;0=INPUT IS FROM TERMINAL CLRB TTYOCH ;0=OUTPUT TO TERMINAL MOV #BUFOVR,TTYIS DONE - MUST ASK DISPLAY MODULE TO RECALCULATE ;THE DISPLAY BUFFERS. FFT JUST CHANGED THEM. MOVB #1,GTRCAL $GTDIS TSTBFA ;SETUP 'BUFFER FULL' JMP ADDRESS ;USE FORMAT MODULE TO ISSUE 3 LINE FEEDS $FRMAT .BYTE LINES,3 .BYTE EXIT .EVEN R0 BNE ERROR ;DISPLAY BUFFER OVRFLO .DSABL LSB .ENABL LSB ;ASK USER WHEN TO CONTINUE $QA QANAOK,MESS5 ;NULL ANS ;USE TTY MODULE TO OUTPUT A MESSAGE $CRLF $TYPMS #MESS1 $CRLF .ENABL LSB ;CALL 'GINIT0' ROUTINE TO PASS 4 POI - ONLY A CR IS EXPECTED ;ASK USER THE QUESTION .STOP ;TURN OFF GT40 WHEN USER HITS CR .REMOV BUFPNT ;REMOV DISPLAY NTERS VIA 'PNTR' TABLE 4$: $GINT0 #PNTR ;SET 'GTRCAL' FLG AND CALL 'GTDISP' ROUTINE MOVB #1,GTRCAL ;CALCULATE THE DISPBUF FROM HANDLER ;USE THE OUTPUT FORMATTER TO WRITE BACK THE 64 INTEGERS MOV #DATABF,R1 ;R1=DATA BUFER ADDRESS MOV #BUFSLAY BUFFER $GTDIS TST R0 BNE ERROR ;DISPLAY BUFFER OVERFLOW ;TELL GT40 DISPLAY HANDLER ABOUT OUR DISPLAY BUFFER .LIZ,R2 ;R2=DONE CTR MOV #6,R4 ;R4=NUMBER OF DATA/TERMINAL LINE $FRMAT .BYTE CRLFC0 .BYTE TEXT .ASCIZ /THE REAL DATA/ NKRT .INSRT BUFPNT ;DISPALY BUFR ADDR .START ;TURN ON GT40 ;TIME TO DO A/D SAMPLING $ADSAM SAMTBL,ERROR ;DATA H .BYTE EXIT .EVEN 5$: MOV R4,R5 ;NUMBER OF DATA FOR CURRENT OUTPUT LINE MOV #1,R3 ;R3 HOLDS THE 'COLST' VALUE $FRMAT AS JUST BEEN READ INTO 'DATABF' ;SHOW DUAL DISPLAY OF 'DATABF' AND 'IMAGBF' ;FIRST CLEAR 'IMAGBF' MOV #IMAGBF,R0 ;R0 = BUF.BYTE CRLFC0,EXIT .EVEN 6$: MOVB R3,8$ ;PICKUP THE 'COLST' VALUE FOR NEXT DATUM MOV (R1)+,9$ ;GET NEXT DATUM FROM BUFFER FER ADDR MOV #BUFSIZ,R1 ;R1 = DN CTR 1$: CLR (R0)+ DEC R1 ;BUFFER CLR YET? BNE 1$ ;NO MOV #IDTAB2,DSPLST+2 ;ADD 2ND I JSR PC,7$ ;OUTPUT THE DATUM DEC R2 ;DONE YET? BEQ 11$ ;YES DEC R5 ;IS OUR LINE DONE YET? BEQ 5$ ;YES ADD #10.,R3 ;OFFSET VALUE DSPLST: IDTAB1 ;DISPLAY LIST 0 ;EVENTUALLY WILL HOLD 'IDTAB2' ADDR 0 CRVLST: 0 ;LIST OF GT40 BUFF ANY OTHER COPIES ;THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ;OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEMER ADDRESSES 0 ;FILLED IN BY GTDISP MODULE 0 PNTR: DSPLST DSPLST CRVLST BUFPNT ;SAMPLE TABLE FOR ADSAM MODULE AND TO ONE WHO AGREES ;TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE SOFTWARE ;SHALL AT ALL TIMES REMAIN IN DEC. ; SAMTBL: DATABF ;ADBUFA (DATA BUF ADDR) 103240 ;ADRATE (.1 SEC) HIGH ORD 1 ;ADRATE LOW ORD 0 ;ADDELY HIGH ORD THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE ;WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A ;COMMITMENT BY DIGITAL ;BUMP 'COLST' VALUE BY 10 BR 6$ ;ROUTINE CALLS FORMATTER TO OUTPUT A SING PREC NUMBER 7$: $FRMAT .BYTE COLST 8$: .B 0 ;ADDELY LOW ORD .BYTE 0 ;ADCHTY (REG CHAN SAMPLING) .BYTE 0 ;ADDOUP (SING PREC) 0 ;ADCHN (CH#0) 0 ;ADNOFC (#CYTE 0 ;COLUMN START VALUE .BYTE SING ;SING PREC OUTPUT .BYTE 200 .EVEN 9$: 0 ;DATUM TO BE OUTPUT .BYTE EXIT .EVENH - 1) BUFSIZ ;ADCOUT (# OF PTS) 1 ;ADNOFS (# SWEEPS) 0 ;ADBADM (DMA OPTION NOT USED) .BYTE 1 ;ADDTYP (GRAPH PLOT RTS PC ;ROUTINE TO OUTPUT WARNING IF ONE EXCEEDS LENGTH OF TTY LINE BUFOVR: MOV #MESS3,R0 10$: $TYPMS 11$: JMP START ) .EVEN ADGRAB: 0 ;ADDR OF DISPLY BUF-TO BE FILLED IN ADGRAS: 0 ;DISPLY BUF SIZE-TO BE FILLED IN ;THESE ROUTINES USED ;ERROR MESSAGE ERROR: MOV #MESS6,R0 BR 10$ .DSABL LSB ;MESSAGES MESS1: .ASCIZ /**GRAMP EXAMPLE** READY TO COLLE BY ADSAM MODULE ADGTON: .START ;TURN ON GT40 RTS PC ADGTOF: .STOP ;TURN OFF GT40 RTS PC ;PARAMETER TABLE FOR FFTCT DATA/ MESS3: .ASCIZ /INPUT LINE TOO LONG/ MESS5: .ASCIZ /HIT 'CR' TO CONTINUE/ MESS6: .ASCIZ /DISPLAY BUFFER OVRFLO/ MESS MODULE N: BUFSIZ ;#PT IN BUFFER DATABF ;ADDR OF REAL ARRAY IMAGBF ;ADDR IF IMAGINARY ARRAY 0 ;DIRECTION 0=FORW7: .ASCIZ /HIT 'CR' WHEN READY FOR FFT/ .EVEN ;BUFFERS TTYBUF: .BLKB 72. ;BUFFER USED BY TTY MODULE FORBUF=TTYBUF DATARD, 1=INVERSE 0 ;SCA FAC IS RETURNED HERE FREE: .LIMIT ;1ST WRD GIVES START OF STACK ;2ND WRD GIVES START OF FRABF: .BLKW 64. ;DATA BUFFER IS 64 WORDS LONG IMAGBF: .BLKW 64. ;IMAGINARY BUFFER USED FOR FFT IDTAB1: .BLKB TBLSIZ ;LOCATEE CORE .END START ION OF I/D TABLE #1 IDTAB2: .BLKB TBLSIZ ;LOCATION OF 1/D TABLE #2 ;DEFINITIONS & VECTORS USED BY ADSAM MODULE ADSCAL=ID.TITLE CONTRL CONTROL MODULE ;LAB-APPLICATIONS-11 ;DEC-11-SLABA-C-LA ;FILENAME CONTRL.MAC ;FILE ID CONTRL.5 .CSECT CONTRLTAB1+DISSC ADDTYB=IDTAB1+DISYBU ADDTAB=IDTAB1 ADMAXV: 1377 ;SCOPE SIZE IN Y-DIRECTION LPSVEC: 340 ;LPS A/D VECTOR LPS ;COPYRIGHT (C) 1975 ;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ;THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USESAD: 170400 ;LPS A/D STATUS REG ;BUFFER CONTROL BLOCK BUFPNT: 0 ;DISPLAY BUFFER ADDR 0 ;FREE CORE AVAILABLE 0 ONLY ON A ;SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLUSION ;OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR IF USING OTHER ; LAB-APPS MODULES ;MAXDP$ ;MUST BE DEFINED AND SET EQUAL TO THE GREATEST NO.OF DATA PATHS ;FG$ ;MUST BE DEFI9)POSITIVE WORD COUNT FOR OUTPUT BUFFER (WORD) ; ALSO CREATED AT THIS TIME IS A PRIORITY TABLE WHICH IS A ; LIST OF POINTENED FOR A FORGROUND JOB ;EIS ;IF DEFINED, HARDWARE MULTIPLY AND DIVIDE IS CONFIGURED WITH THE ;SYSTEM AND WILL BE USED BY MODRS TO THE FIRST INPUT BUFFER OF EACH ; PROCESS IN THE "PIT" IN THE ORDER IMPLIED BY CTPRIR ; FINALLY, ENTRIES IN THE DATA PAULE. IF NOT DEFINED, GLOBAL ;"MULR0" MUST BE PROVIDED BY GENERAL SUBROUTINE MODULE. PS=177776 .SBTTL CONTROL MODULE TH POINTER TABELE ARE FILLED ; AT AN ID NUMBER OF WORDS OFFSET INTO THE TABLE WITH A ; POINTER TO THE FIRST PROCESS ENTRY IN TINITIALIZATION ;FROM THE INPUT TABLE OF THE FORM ;1)NUMBER OF ACQUISITION ROUTINES USING THIS MODULE FOR THIS RUN ; HE "PIT" FOR THE ; ASSOCIATED DATA PATH CTINIT: JSR PC,SAVRG ;SAVE REG 1-4 MOV #DPTBAD,R1 ;GET ADDR OF DATA PATH ADDR TA(CTNOFA)(WORD) ;2)TOTAL NUMBER OF DATA PATH ENTRIES ; (CTNOFP)(WORD) ;3) NUMBER OF ALLOWED INPUT BUFFERS TO WAIT PER DATA PATBLE MOV #CTEROR,R2 ;GET ADDRS OF ERROR TABLE CLRB (R2)+ ;CLEAR ANY ERROR INDICATOR MOV #MAXDP$,R3 ;GET LENGTH OF TABLE CH ENTRY ; (CTNOFB)(BYTE) ;4) NUMBER OF DATA PATHS ; (CTNOFD)(BYTE) ;5'S)PARAMETERS/ A)I.D. NUMBER FOR PARTICULAR DATA PATH TICLR: CLR (R1)+ ;CLEAR ALL ENTRIES IN TABLES CLRB (R2)+ $SOB R3,CTICLR MOV (R5)+,CTIDON ;SAVE NO. OF DATA PRODUCING MODUEQUIPMENT CORPORATION. ;DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ;ITS SOFTWARE ON EQUIPMENT WHICH IS NOT ; NEEDED FOR/ (CTDPID)(BYTE) ; EACH DATA / B)NUMBER OF ENTRIES IN THIS DATA PATH ; PATH / (CTNOFE)(BYTE) ; SUPPLIED BY DEC. ;LDP SOFTWARE DEVELOPMENT, JUNE 1975 .SBTTL MACRO DEFS, GLOBALS, CONDITIONAL ASSEMBLY PARAMETERS / ; /PARAMETERS * I) PROCESS INFORMATION WORD ; /NEEDED FOR * (CTPIWD)(WORD) ; /EACH DATA *.MCALL ..V2..,.REGDEF,.SPND,$SOB,$SPL,$MUL ..V2.. .REGDEF ;EXTERNAL GLOBALS .GLOBL SAVRG,RSTRG,SAVARG,RSTARG ;GENERAL II) PROCESS ADDRESS ; /PATH ENTRY * (CTPRAD)(WORD) ; * III)PROCESS PRIORITY ; * (CTPRIR)(SUBROUTINE MODULE .GLOBL BAWDS,BAREL ;BUFFER ALLOCATOR MODULE ;INTERNAL GLOBALS .GLOBL CTINIT,CTOBUF,CTIBUF,CTSTRT,CTIDWORD) ; CREATE A "PROCESS INFORMATION TABLE"(PIT) ; IN WHICH EACN ENTRY FOR EACH PROCEES IS OF THE FORM ; CTNOFB /1) ADON,CTEROR .IF DF,FG$ .GLOBL CTRUN .ENDC ;CONDITIONALS ;CTREL$ ;MUST BE DEFINED FOR MODULE TO RELEASE INPUT ;BUFFERS DRESS OF WAITING INPUT BUFFER OR ZERO (WORD) ; PAIRS /2) WORD COUNT OF LAST BUFFER OR NEGATIVE NUMBER (WORD) ; / FOR ALL PRE-PROCESSING ROUTINES ON RETURN TO ;CONTROL MODULE ; IF CTREL$ IS DEFINED, ; CTLST$ ;MUST BE DEFINED IF THE LAST . ; / . ; / . ; 3)ZERO (0) (WORD) ; 4)PROCESS INFORMATION WORD (WORD) ; 5)DATA PATH ID NUMBER (BYTE) ; 6)D PRE-PROCESSING ROUTINE ; IN A DATA PATH IS TO RELEASE ITS OWN INPUT BUFFERS ; NOTE---THESE TWO PARAMETERS SHOULD BE DEFINEDATA PATH ENTRY POSITION (BYTE) ; 7)PROCESS ADDRESS (WORD) ; 8)ADDRESS OF CURRENT OUTPUT BUFFER FOR ENTRY OR ZERO (WORD) ; CTBFOS ;GET BYTES ADD #5,R0 ; AND ADD 4 TO FIND TABLE ENTRY SIZE $MUL CTNOFP,R0 ;GET LENGTH OF COM. TABLE MOV R1,R0 ; DECB CTNOFE ;DECREMENT ENTRIES IN DATA PATH BNE 4$ ;IF NOT EXHAUSTED, GET MORE INFO. NEGB -7(R0) ;INDICATE THE LAST ENTRPUT IN CORRECT REG FOR B.A. JSR PC,BAWDS ;GET SPACE FOR COM.TABLE FROM B.A. BCC 2$ ;IF NO ERRORS, CONTINUE CLR R0 ;INDICY IN DATA PATH DECB CTNOFD ;DECREMENT NO. OF DATA PATHS BNE 3$ ; IF NOT EXHAUSTED, CONTINUE CLR R0 ;IF DONE, INDICATE NATE NO ROOM FOR "PIT" BR RTINIT ;IF ERRORS, RETURN 2$: MOVB (R5)+,CTNOFD ;GET # OF DATA PATHS MOVB CTNOFD,CTNOFD+1 ;GET SEO ERRORS CLR BUFCTR ;INDICATE NO BUFFERS PENDING .IF DF,FG$ CLR CTRUN ;INDICATE CONTROL MODULE NOT RUNNING .ENDC COND COPY TO SAVE CMPB #MAXDP$,CTNOFD ;SEE IF ASSEMBLED LARGE ENOUGH BGE 25$ ;IF ALRIGHT, CONTINUE MOV #1,R0 ;OTHERWISE,RTINIT: JSR PC,RSTRG ;RESTORE REGS. RTS PC ;RETURN .SBTTL ROUTINE ACCEPTING BUFFERS FROM OUTSIDE MODULE ;R0 CONTAINS THE GET ERROR NO. BR RTINIT ;AND RETURN 25$: MOV PTBLAD,R3 ;GET PRIORITY TABLE ADDRESS MOV #DPTBAD,R4 ;GET ADDRESS OF DATA PA DATA PATH ID NO. ;R1 CONTAINS THE ADDRESS OF THE INPUT BUFFER ;R2 CONTAINS THE "LAST BUFFER INDICATOR" CTIBUF: MOV R3,-TH POINTERS 3$: MOVB (R5)+,R1 ;GET DATA PATH ID NUMBER MOVB R1,IDNO ;STORE ID NO. ASL R1 ;GET # OF WORDS OF TABLE OFFSET (SP) ;SAVE R3,4 MOV R4,-(SP) MOV #DPTBAD,R3 ;GET D.P. POINTER TABLE ADDRESS ASL R0 ;GET BYTE OFFSET FOR D.P. ADD R0,R3 ADD R4,R1 ;GET POSITION IN DATA PATH POINTERS MOV R0,(R1) ;STORE INITIAL BUFFER ADDRESS FOR D.P. MOVB (R5)+,CTNOFE ;GET ;GET POINTER TO DATA PATH MOV (R3),R3 ;GET ADDRESS OF D.P. START BNE CTIBFC ;IF A LEGAL ADDR, B+C MOV R0,R4 ;IF NOT,SA# OF ENTRIES IN DATA PATH CLR R2 ;SET COUNTER OF ENTRIES 4$: MOV R0,-(SP) ;SAVE PROCESS BUFFER POINTER ADDRESS MOVB CTNOFBVE R0 MOV R1,R0 ;GET BUFFER ADDRESS JSR PC,BAREL ;RELEASE BUFFER MOV R4,R0 ;RESTORE R0 INC R0 ;PREPARE TO SET CARRY I,R1 ;GET NO. OF SAVE BUFFERS 5$: CLR (R0)+ ;CLEAR POINTER TO INPUT BUFFER CLR (R0)+ ;CLEAR COUNTER FOR BUFFER $SOB R1,5$ ND. ERROR BR CT1 ; AND RETURN CTIBFC: JSR PC,INSRTB ;GO INSERT BUFFER IN D.P. CT1: ROR R0 ;RESTORE R0,AND IND. POS. ERROR LES MOV (R5)+,R0 ;GET TOTAL # OF PROCESSES MOV R0,CTNOFP ;SAVE VALUE JSR PC,BAWDS ;GET AREA FOR PRIORITY TABLE .ENABL L ; IF NOT DONE, CONTINUE CLR (R0)+ ;PUT ZER0 AT END OF TABLE MOV (R5)+,(R0)+ ;STORE PROCESS INFORMATION WORD MOVB IDNO,(RSB BCC 1$ ;IF NO ERRORS, CONTINUE CLR R0 ;INDICATE NO ROOM FOR PRIOR. TAB BR RTINIT ;IF ERRORS, RETURN 1$: MOV R0,PTBL0)+ ;STORE DATA PATH ID INC R2 ;INC. PROCESS COUNT FOR D.P. MOVB R2,(R0)+ ;STORE D.P. ENTRY NO. MOV (R5)+,(R0)+ ;STORE PRAD ;SAVE FIRST ADDRESS OF PRIORITY TABLE MOVB (R5)+,CTNOFB ;GET MAX # OF INP.BUFRS TO HOLD/ENTRY MOVB CTNOFB,R0 ;GET CTNOFB OCESS ADDRESS CLR (R0)+ ;CLEAR OUTPUT BUFFER ADDRESS CLR (R0)+ ;CLEAR OUTPUT WORD COUNT MOV (R5)+,R1 ;GET PROCESS PRIORI ASL R0 ; MULTITPLY IT BY TWO INC R0 ; ADD ONE FOR END OF INPUT BUFFER TABLE MOV R0,CTBFOS ;SAVE INPUT BUFFER OFSET ASLTY ASL R1 ;GET BYTES ADD R3,R1 ;GET PRIORITY TABLE ENTRY ADDRESS MOV (SP)+,(R1) ;STORE "PIT" ADDRESS IN PRIORITY TABLE INS THE BYTE OFFSET INTO THE DATA PATH POINTER TAB ;R1 CONTAINS THE INPUT BUFFER ADDRESS ;R2 CONTAINS THE "LAST BUFFER INDICMOVB -3(R3),R0 ;GET DATA PATH ID ASL R0 ;GET BYTE OFFSET INTO D.P.POINTER TABLE MOV (R3),R1 ;GET BUFFER ADDRESS CLR (R3)ATOR" ;R3 CONTAINS THE FIRST POSSIBLE LOCATION TO STORE THE BUF ADDR INSRTB: MOVB CTNOFB,R4 ;GET # OF BUFFERS ALLOWED TO W+ ;CLEAR OUTPUT BUFFER POINTER MOV (R3),R2 ;GET LAST BUFFER INDICATOR, AND CLR (R3)+ ; SET R3 POINTING TO NEXT PROCESS CAIT .ENABL LSB 1$: TST (R3)+ ;SEE IF BUFFER POINTER IS FREE BEQ 2$ ;IF FREE, GO INSERT BUFFER DEC R4 ;IF NOT, DEC. POITBUF1: JSR PC,INSRTB ;GO INSERT BUFFER IN COM.TAB. ROR R0 ;SET CARRY IF ERROR OCCURED .ENABL LSB BCC 5$ ;IF NO ERRORS FRNTER COUNT BEQ 3$ ;IF NO MORE POINTERS, ERROR TST (R3)+ ;INCR. TO NEXT POINTER BR 1$ ;GO TEST NEXT POINTER 2$: MOV R2,OM INSERT, NORMAL RETURN JSR PC,CLPROC ;IF ERROR,GO RELEASE PREVIOUS BUFFERS SEC ;SET CARRY(INDICATE ERROR) 5$: JSR PC,RS(R3) ;STORE "LAST BUFFER INDICATOR" MOV R1,-(R3) ;STORE ADDRESS OF BUFFER BEQ 25$ ;IF ZERO ADDRESS, ERROR INC BUFCTR ;ITARG ;RESTORE REGISTERS RTS PC ;RETURN .SBTTL ROUTINE TO REL. BFRS IN D.P. PREVIOUS TO PROBLEM ROUT. CLPROC: MOV CURNCR. DONE BUFFER COUNTER BR 5$ ;GO IND. NO ERROR, AND RETURN 25$: DEC (R3)+ ;PUT IN PHONY ADDRESS CLR (R3) ; FOR LAST BUOBF,R3 ;GET ADDRESS OF OUTPUT BUFFER POINTER .ENABL LSB BR 21$ ;GO GET RID OF BUFFER POINTERS 1$: CLR -(R3) ;CLEAR OUTPUTFFER 3$: MOV @#PS,-(SP) ;;SAVE OLD PS $SPL 7 ;;DISABLE INTERRUPTS MOV #DPTBAD,R4 ;;GET D.P. POINTER TABLE ADDRESS ADD R0 BUFFER WORD COUNT MOV -(R3),R0 ;GET OUTPUT BUFFER ADDRESS, IF ANY BEQ 2$ ;CONTINUE IF ZERO JSR PC,BAREL ;RELEASE BUFFER,R4 ;;GET POINTER TO D.P. ADDRESS CLR (R4) ;;DISABLE POINTER MOV (SP)+,@#PS ;;RESTORE PSW INCB CTEROR ;INCR. D.P. ABNOR IF NOT ZERO 2$: CLR (R3) ;CLEAR OUTPUT BUFFER POINTER 21$: SUB #6,R3 ;POSITION "PIT" POINTER MOVB CTNOFB,R4 ;GET TOTAL NUM. END COUNTER TST (R3) ;TEST FOR LAST BUFFER BGT 4$ ;IF ALREADY LAST BUFFER, CONTINUE NEG (R3) ;IF NOT, MAKE LAST BUFFMBER OF POSSIBLE INPUT BUFS 3$: CLR -(R3) ;CLEAR LAST BUFFER IND. FOR BUFFER PTR MOV -(R3),R0 ;GET NEXT BUFFER ADDRESS, IF IER 4$: MOV R0,R4 ;SAVE R0 ASR R0 ;GET BYTE COUNT INCB CTEROR+1(R0) ;INDICATE CHANNEL DISABLED MOV R1,R0 ;GET BUFFER ADT EXISTS BEQ 4$ ;IF ZERO, GO TO NEXT BUFFER POINTER JSR PC,BAREL ;IF IT EXISTS, RELEASE IT CLR (R3) ;CLEZR THE POINTER DRESS IN RIGHT REG. JSR PC,BAREL ;RELEASE BUFFER THROUGH BUFFER A. MOV R4,R0 ;RESTORE R0 INC R0 ;EFFECTIVELY SET CARRY W DEC BUFCTR ;ONE LESS BUFFER TO PROCESS 4$: $SOB R4,3$ ;LOOP IF NECCESSARY DECB PROCNO ;DECREMENT PREVIOUS PROCESS COUNT HEN ROTATED 5$: CLC ;CLEAR CARRY RTS PC ;RETURN .SBTTL ROUTINE TO PASS OUTPUT BUFFER TO NEXT PROCESS CTOBUF: JSR BNE 1$ ;CLEAR MORE ENTRIES IF MORE RTS PC .SBTTL CTSTRT OR CONTROL MODULE START CTSTRT: .IF DF,FG$ MOV #1,CTRUN ;INBY CARRY MOV (SP)+,R4 ;RESTORE R4,3 MOV (SP)+,R3 RTS PC ;RETURN ;ROUTINE TO INSERT BUFFERS IN THE "PIT" ;R0 CONTA PC,SAVARG ;SAVE REGISTERS MOV CUROBF,R3 ;GET ADDRESS OF CUR. PNTR. TO OUTPUT BUF. MOVB -4(R3),PROCNO ;GET PROCESS NUMBER R5 ;GET PROCESS INFORMATION WORD ADD #6,R0 ;GET POINTER TO OUTPUT BUFFER MOV R0,CUROBF ;SAVE IT MOV #BPASAD,R1 ;GET POINDDR. OF BUFR WAITING TST (R3) ;TEST NEXT BUFFER ADDR. BNE 6$ ;IF ADDR NOT ZERO, B+C SUB R4,R3 ;IF ADDR WAS 0,THEN PREV.TER TO INPUT BUFFER JSR PC,@-2(R0) ;GO TO PROCESS .IF DF,CTREL$ ROR R3 ;SAVE CARRY MOV (SP)+,R0 ;GET ADDRESS OF LAST WAS LAST BUF 61$: TST (R3)+ ;TEST TO SEE IF A "LAST BUFR" INDICATION BPL 7$ ;IF SO, THE B+C NEG (R3) ;IF NOT, MAKE A LADICATE CONTROL MODULE RUNNING .ENDC CTCONT: TST BUFCTR ;TEST FOR ANY WAITING INPUT BUFFERS BEQ CTEXIT ;IF NONE, EXIT ORINPUT BUFFER .IF NDF,CTLST$ MOV CUROBF,R4 ;GET PROCESS TSTB -3(R4) ; POSITION IN DATA PATH BMI 41$ ;IF LAST POSITION WAIT DEPENDING ON FG$ MOV PTBLAD,R0 ;IF SOME WAITING, GET PRIORITY TABLE ;NEEDED FOR TESTING ONLY MOV CTNOFP,R1 ;GET NUMB, B+C .ENDC JSR PC,BAREL ;RELEASE IT 41$: ROL R3 ;RESTORE CARRY .ENDC BCC CTCONT ;IF NO ERROR, CK FOR MORE BUFS TER OF PROCESSES OR PRIORITIES .ENABL LSB 1$: TST @(R0)+ ;TEST FOR WAITING BUFFER FOR PROCESS BNE 2$ ;IF BUFFER EXISTS GOO PROC. MOV @#PS,-(SP) ;SAVE OLD PSW $SPL 7 ;;DISABLE INTERRUPTS MOV CUROBF,R3 ;;FIND OUT WHERE WE WERE MOVB -4(R3),R0 RPOCESS $SOB R1,1$ ;LOOP IF NECCESSARY $SPL 7 ;DISABL INTERUPTS MOV #DPTBAD,R0 ;GET D.P. POINTER TABLE ADDRESS MOV #M;;GET DPID MOV R0,R2 ;;SAVE IT ASL R0 ;;GET BYTE OFFSET INTO ACTIV DP TABLE ADD #DPTBAD,R0 ;;GET ADR OF ACTIVE DP INDICAAXDP$,R1 ;GET DATA PATHS COUNT 15$: CLR (R0)+ ;DISABLE ALL FURTHER INPUT $SOB R1,15$ ;CONTINUE TILL FINISHED $SPL 0 ;ENATOR CLR (R0) ;;DISABLE ACCEPTANCE OF NEW BUFFERS MOV (SP)+,@#PS ;;ENABLE INTERRUPTS INCB CTEROR+1(R2) ;INDICATE CHANNEL CBLE INTERRUPTS MOVB #-1,CTEROR ;INDICATE FATAL ERROR RTS PC ;RETURN. CAUTION!!!!! INTERRUPTS STILL ; ENABLED 2$: MOV LOSED ABNORMALLY CMPB #1,CTEROR+1(R2) ;IS THIS THE FIRST TIME BNE 42$ ;IF SO, INC CHANL ENDING CNTR INCB CTEROR ;INDICAT-(R0),R0 ;GET "PIT" ADDRESS FOR PROCESS MOV R0,R1 MOV R1,R2 ;GET TWO MORE COPIES .IF DF,CTREL$ MOV (R0),-(SP) ;SAVE AE SOME CHANNEL TERMINATED ABNO. 42$: MOVB -3(R3),PROCNO ;GET PROCESS POSITION IN DATA PATH BPL 49$ ;IF POSITIVE, NOT LAST PRDDRESS OF INPUT BUFFER .ENDC MOV (R2)+,BPASAD ;GET ADDRESS OF INPUT BUFFER FOR PROCESS MOV (R2)+,BPASAD+2 ;GET LBI FOR IOCESS, SO B+C NEGB PROCNO ;IFNEG, LAST PROC. GET POSITION, B+C 49$: CLR (R3)+ ;CLEAR OUT BUFR ADDR(NORM. DONE ALREADY) CLNPUT BUFFER $SPL 7 ;;DISABLE INTERRUPTS 3$: MOV (R2)+,(R1)+ ;;IF NOT, MOVE UP NEXT INPUT BUFFER PTR BEQ 4$ ;;IF NO MORE FR (R3)+ ;CLEAR OUT BUFR INDEX TST (R3) ;IS THERE A WAITING BUFR FOR NXT PROCESS BNE 5$ ;IF SO, B+C COM (R3)+ ;IF NOT, ULL BUFFERS, DONE MOV (R2)+,(R1)+ ;;MOVE UP NEXT INPUT BUFFER LBI BR 3$ ;;GO CHECK FOR MORE INPUT BUFFER PNTRS 4$: DEC BUFMAKE A DUMMY CLR (R3) INC BUFCTR ;IND. A BUFR TO PROCESS BR 7$ 5$: MOVB CTNOFB,R1 ;GET NO. OF BUFRS POSSIBLY WAITING MCTR ;;DECREMENT DONE BUFFER COUNTER $SPL 0 ;LOWER PRIORITY ADD CTBFOS,R0 ;GET PROCESS INFORMATION WORD POINTER MOV (R0),OV #4,R4 ;GET OFFSET FOR QUICK PROCESS 6$: DEC R1 ;ANY MORE POSSIBLE BUFFERS BEQ 61$ ;IF NOT, B+C ADD R4,R3 ;GET NEXT APATHS ENDING ABONORMALLY CTNOFP: .BLKW 1 ;NUMBER OF PROCESSES PTBLAD: .BLKW 1 ;POINTER TO PRIORITY TABLE CTNOFB: .BLKB 1 IED BY DEC. ;LDP SOFTWARE DEVELOPMENT, 1974-5 ; CARL RALSTON ; ASSEMBLY PARAMETER: GT40$ IF DEFINED WILL ASSEMBLE CODE FO ;NUMBER OF INPUT BUFFER POINTERS/PROCESS IDNO: .BLKB 1 ;DATA PATH ID NO BUFCTR: .BLKW 1 ;DONE BUFFER COUNTER FLAG1: .BLR GT40 ; ELSE FOR VR14 ;GT40$=1 ;DEFINITIONS R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 .IFDF SPBST$ KB 1 ;GLAG INDICATING A LAST BUFFER PROCNO: .BLKB 1 ;DATA PATH PROCESS NUMBER CUROBF: .BLKW 1 ;POINTER TO CURRENT OUTPUT .IFDF CAPS$ .GLOBL DEFXCU,DEOPBU,DEFLCK,DEEOL .GLOBL DEFRCU,DEPVOT,DESTRP .ENDC .GLOBL DEST,DECMD,FLOAT,DECMD1,DETLE .G BUFFER BPASAD: .BLKW 2 ;STORAGE AREA FOR PROCESS INPUT ; BUFFER POINTER AND LBI DPTBAD: .BLKW MAXDP$ ;TABLE OF DATA LOBL DEGET,DEPUT,$POLSH,$ADR,$SBR,$DVR .GLOBL DEDATA,DEFORE,QA,QAERR ;ROUTINES CALLED: DEFXCU,$POLSH,FLOAT,DEGET,DEPUT,DEFOPATH POINTERS .END RE,DETLE ; DEFRCU,DEPVOT,DESTRP,DEOPBU,QA,DEFLCK,DEEOL ;---BST B1 B2 OPTION--- ;OPTION P - REPLACE THE DATA BETWEEN THEST BUFFER 7$: JSR PC,CLPROC ;GO CLEAR PRE PROCES'S BUFFERS CTCYCL: JMP CTCONT ;CONTIMUE CTEXIT: TST CTIDON ;HAS ALL PROCESSING BEEN DONE BLE CTFINI ;IF YES, RETURN TO USER,OTHERWISE CMPB CTEROR,CTNOFD+1 ;CHECK IF ALL DATA PATHS ARE DEAD BEQ CTF.TITLE SPOV4 ;LAB APPLICATIONS-11 STRIP COMMAND ;DEC-11-SLABA-C-LA18 ;FILE ID SPOV4.1 ;FILE: SPOV4.MAC .CSECT SPOV4 ;COPINI ;IF SO, LEAVE. CAUTION!!!!!!!! ; INTERRUPTS ARE STILL ENABLED!!!! .IF NDF,FG$ BR CTCYCL ;IN SJ JUST WAIT FOR DONEYRIGHT (C) 1974,1975 ;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ;THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY BUFFER .ENDC .IF DF,FG$ CLR CTRUN ;INDICATE CONTROL MODULE NOT RUNNING .SPND ;IN F/B SUSPEND TILL NEXT DONE BUFFER ON A ;SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLUSION ;OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANY BR CTCYCL ;WHEN RETURNING CHECK FOR BUFFER .ENDC CTFINI: TST BUFCTR ;CHECK ONE MORE TIME BNE CTCYCL ;IF MORE BUFFERS, OTHER COPIES ;THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ;OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM AND PROCESS LAST BUFRS RTS PC ;RETURN TO USER .SBTTL SAVE AREA .IF DF,FG$ CTRUN: .WORD 0 ;CONTROL MODULE RUNNING INDTO ONE WHO AGREES ;TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE SOFTWARE ;SHALL AT ALL TIMES REMAIN IN DEC. ;THE IICATOR .ENDC CTEROR: .BLKB MAXDP$+1 ;ABNORMAL TERMINATION TABLE .EVEN CTNOFD: .WORD 0 ;NO. OF DATA PATHS CTIDON: .BLKNFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE ;WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A ;COMMITMENT BY DIGITAL EQUIPW 1 ;# OF DATA PRODUCING MODULES STILL ACTIVE CTBFOS: .BLKW 1 ;OFSET TO PROCESS INFO. WORD CTNOFE: .BLKW 1 ;NO. OF DATA MENT CORPORATION. ;DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ;ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLLPHAN CMD DESTAD ;CMD LIST ADDR TSTB @#QAERR BEQ DEST2 MOV #15.,R0 JMP DESTEE ;(BAD OPTION) DEST2: TST R0 BNE EST8 ;NO DEST9: INC R0 ;YES CMP R0,@#DEDATA BNE DEST10 ;COPY REMAINING PTS OF B1 TO B2 JSR PC,@#DEFLCK RTS PC ;DEST20 ;OPTION #B WANTED JSR PC,@#DETLE ;CHK OTHER CMD STRING EXCESSES JSR PC,@#DEFXCU TST R4 BMI DESTE1 ;FIXED CURALL DONE DEST10: JSR R5,@#DEGET DECMD JSR R5,@#DEPUT DECMD+2 BR DEST9 ;OPTION #2 FOR STRIP IS CARRIED OUT HERE. DSORS NOT DESPL(ERR) MOV R5,@#DECMD1 SUB R4,@#DECMD1 ;'DECMD+6' HOLDS DX ;TIME TO COPY THE BEGINNING PTS NOT IN THE STRIP EST20: JSR PC,@#DETLE ;CHK OTHER CMD STRING EXCESSES JSR PC,@#DEFRCU ;CALL FREE CURSOR ROUTINE TST R0 BMI DESTE2 ;FREE CLR R0 DEST5: CMP R0,R4 ;MORE PTS TO COPY BHI DEST6 ;NO JSR R5,@#DEGET ;YES DECMD JSR R5,@#DEPUT DECMD+2 INC CURSORS NOT ACTIVE (ERR) JSR PC,@#DEPVOT ;GET PIVOT LINE (SLOPE + INTCPT) ;TIME TO DO BASELINE STRIP: CLR R0 ;R0=INDEX R0 BR DEST5 ;TIME TO DO STRIP -DO A LITTLE HOUSEKEEPING 1ST DEST6: MOV R5,R0 JSR R5,@#DEGET DECMD ;GET Y2 ONTO STACK FOR 'DEGET & DEPUT' DEST21: JSR PC,@#DESTRP ;STRIP A DATA PT. MOV @#DECMD1+16,-(SP) MOV @#DECMD1+14,-(SP) ;GET STRIPPED VA MOV R4,R0 JSR R5,@#DEGET DECMD ;GET Y1 ONTO STACK MOV (SP)+,@#DECMD1+4 MOV (SP),@#DECMD1+6 ;SAV AWAY F.P. Y1 MOVLUE JSR R5,DEPUT DECMD+2 ;STORE STRIPPED VALUE IN B2 INC R0 CMP R0,@#DEDATA ;R0=DATASIZE? BNE DEST21 ;NOT DONE Y @#DECMD1+4,-(SP) ;LEAVE Y1 ON STACK TOO MOV R0,@#DECMD1+10 ;SAVE R0 ($POLSH EATS REGS) MOV R5,@#DECMD1+12 ;SAVE R5 (CTR FET JSR PC,@#DEFLCK RTS PC ;ALL DONE ;ERRORS DESTE1: MOV #26.,R0 ;FIX CURSORS NOT UP BR DESTEE DESTE2: MOV #27.,R0OR E.O. STRIP) JSR R4,@#$POLSH $SBR,.+2 JSR R5,@#FLOAT BR DEST7 DECMD1 ;GET F.P. DX DEST7: MOV R1,-(SP) MOV R0,- ;FREE CURSORS NOT UP DESTEE: TST (SP)+ ;POP 'NORMAL RTN' OFF STACK. JMP @#DEFORE ;COMMAND LIST USED BY 'QA' TO FIND O 'FIXED' CURSORS ; WITH THE BEST STRAIGHT LINE ;OPTION B - SUBTRACT A SLOPING BASELINE,DETERMINED BY THE ; FREE CURSO(SP) ;PUT F.P. DX ON STACK JSR R4,@#$POLSH $DVR,.+2 ;SLOPE=(Y2-Y1)/DX MOV (SP)+,@#DECMD1 MOV (SP)+,@#DECMD1+2 ;SAVE FRS, FROM THE DATA OF B1 AND PLACE ; RESULTS IN B2. ; THE BASELINE BECOMES THE ZERO LINE. ; IF THE TWO FREE CURSOR.P. SLOPE AWAY ;HOUSEKEEPING IS OVER DEST8: MOV @#DECMD1+6,-(SP) MOV @#DECMD1+4,-(SP) ;PUT CURRENT Y1 ONTO STACK MOV @#DECS OR FIXED COINCIDE NO STRIP IS DONE ; AND AN ERROR MESSAGE IS OUTPUT ; THE SAME HAPPENS IF B1 IS NOT BEING DISPLAYED MD1+2,-(SP) MOV @#DECMD1,-(SP) ;PUT SLOPE ONTO STACK JSR R4,@#$POLSH $ADR,.+2 ;CURRENT YVAL + SLOPE = NEW YVAL INC @# ; THIS OPTION (USES FREE CURSORS) CAN APPLY ONLY TO ; 1ST ENTRY OF 'DELST' DEST: JSR R5,DEEOL ;CHK EXCESS BUFRS/CONSTDECMD1+10 MOV @#DECMD1+10,R0 ;SET INDEX FOR 'DEPUT' MOV (SP)+,@#DECMD1+4 MOV (SP),@#DECMD1+6 ;SAVE AWAY THIS NEW YVAL ANTS .BYTE 4,0 JSR PC,@#DEOPBU ;CHK OPTIONAL BUFRS B1,B2 ;CALL QA TO FIND OPTION JSR R5,QA 400+20 ;SILENT QUEST + AMOV @#DECMD1+4,-(SP) ;AND LEAVE IT ON STACK JSR R5,@#DEPUT DECMD+2 CMP R0,@#DECMD1+12 ;STRIP DONE? (R0=CURSOR#2) BNE DSH,$ADR,$MLR,DEFORE,QA,QAERR,DECMD1,DETLE ;ROUTINES CALLED: DEOPBU,SAVARG,RSTARG,DEGET,DEPUT ; $POLSH,DEFORE,QA,DEFLCK,DETLER PC,DESMO ;CALL COMMON SMOOTH ROUTINE JSR PC,@#DEFLCK ;CHK IF F.P. BUFR RTS PC ;ERRORS DESME1: MOV #28.,R0 BR DESME,DEEOL ;---BSM B1 B2 OPTION--- ;OPTION =3P(3PT) =NP(5,7,9,11 PT) =H1(HANNING#1) =H2(HANNING#2) ;HANNING #1 SMOOTHS ONLY E DESME2: MOV #29.,R0 ;NOT ENOUGH BUFR SPACE DESMEE: TST (SP)+ ;POP NORMAL RTN OFF STACK JMP @#DEFORE ;COMMAND LIST USE1 BUFR(REAL OR IMAG) ;HANNING #2 SMOOTHS BOTH BUFRS (REAL & IMAG) BUT ASSUMES THAT ; THE REAL BUFR IS IMMEDIATELY FOLLOWED BY D BY 'QA' TO FIND OPTION DESMAD: .BYTE 5,2 .BYTE '3,'N,'H,'H,0 ;3P,NP,H1,H2 .BYTE 'P,'P,'1,'2,0 .EVEN ;COMMON SMOOTH THE ASSOC IMAG BUFR. DESM: JSR R5,DEEOL ;CHK EXCESS BUFRS/CONSTANTS .BYTE 4,0 JSR PC,@#DEOPBU ;CHK OPTIONAL BUFRS B1,B2 ROUTIN DESMO: MOV R0,-(SP) ;SAVE OPTION # ON STACK ;TIME TO FIND NEW ADDR OF 'COEFF TBL' TO BE USED AND 'RING BUFR' ;TO B;CALL QA TO GET OPTION JSR R5,QA 400+20 ;SILENT QUEST + ALPHANU CMD DESMAD ;CMD LIST USED BY QA TSTB @#QAERR BEQ DE USED. ;REMEMBER THIS CODE COULD BE MOVED AROUND ASL R0 ;MAKE R0 (0,2,4, OR 6)'WORD CONSCIOUS' MOV DESMTB(R0),R2 DESMXESM1 MOV #15.,R0 JMP DESMEE ;(BAD OPTION) DESM1: JSR PC,@#DETLE ;CHK OTHER CMD STRING EXCESSES CMP R0,#3 BNE DESM6 ;H: ADD PC,R2 TST -(R2) ADD #DESM3P-DESMX,R2 ;R2 NOW HOLDS ADDR OF COEFF TBL MOV R2,@#DECMD1 ;SAVE LOC OF COEFF TBL DESMXX:ANNING #2 IS DESIRED--ASSUME LIKE BUFRS (BOTH F.P. OR BOTH S.P.) MOV @#DECMD+2,R2 SUB @#DECMD,R2 ;R2=B2-B1 BPL DESM2 ;B MOV PC,R5 TST -(R5) ADD #DESMRG-DESMXX,R5 ;R5 NOW HOLDS ADDR OF RING BUFR MOV R5,@#DECMD1+2 ;SAVE LOC OF RING BUFR ;1S1<=B2 (R2>=0) NEG R2 ;R2=-R2 (ABS VAL) MOVB @#DECMD,R1 ;R1=B1'S # (LARGEST OF 2 NUMBERS) BR DESM3 DESM2: MOVB @#DECMD+2T (#PTSMO-1)/2 CANNOT BE SMOOTHED. THEY ARE AVERAGED IN ;PAIRS INSTEAD CLR R0 ;INDEX FOR 'DEGET & DEPUT' MOV (R2),R3 ;R2 ,R1 ;R1=B2'S # (LARGEST OF 2 NUMBERS) DESM3: DEC R2 ;SEE IF R2 /B2-B1/ WAS 1 BEQ DESME1 ;B1 &B2 ARE CONTIGUOUS BUFRS (FMT PTS TO WD0 OF COEFF TBL ASR R3 ;R3=(#PTSMO-1)/2 DESMO1: JSR PC,@#SAVARG ;$POLSH DESTROYS REGS JSR PC,DESM10 ;COMMON ROUTINERR) INC R1 ;WILL NEED TO USE THE NXT # BUFR TSTB @#DECMD+1 ;SEE IF OKAY BEQ DESM4 ;S.P. BUFRS IN USE CMP R1,@#DEDATA+E TO DO AVERAGE JSR PC,@#RSTARG ;RESTORE R0-R5 MOV @#DECMD1+4,(R5)+ ;PUT'AV VAL' INTO RING BUFR MOV @#DECMD1+6,(R5)+ DEC10 ;F.P. BUFRS IN USE BHI DESME2 ;NOT ENOUGH F.P. BUFR SPACE (ERR) BR DESM5 DESM4: CMP R1,@#DEDATA+4 BHI DESME2 ;NOT E R3 ;ALL AVERAGED PAIRS DONE YET? BEQ DESMO2 ;YE INC R0 ;NO BR DESMO1 ;TIME TO DO ACTUAL SMOOTH DESMO2: MOV #1777PTION DESTAD: .BYTE 3,1 .BYTE 'P ;PEAK STRIP .BYTE 'B ;BASELINE STRIP .BYTE 0 .EVEN .ENDC ;---SMOOTH COMMAND--- NOUGH S.P. BUFR SPACE (ERR) DESM5: JSR PC,DESMO ;CALL COMMON SMOOTH ROUTINE INC @#DECMD ;B1 GOES TO B2 INC @#DECMD+2 ;B3 .IFDF SPBSM$ .IFDF CAPS$ .GLOBL DEOPBU,DEFLCK,DEEOL .ENDC .GLOBL DESM,DECMD,DEDATA,SAVARG,RSTARG,DEGET,DEPUT .GLOBL $POL GOES TO B4 ;ALL SMOOTHS REQUIRING EXACTLY 1 SMOOTH (OPTION 3P,NP,H1) OR A ;2ND SMOOTH (OPTION H2) COME HERE. DESM6: JS B2 MOV @#DECMD1,R3 MOV (R3),R3 ASR R3 ;R3=(#PTSMO-1)/2 DESMO7: INC R0 JSR PC,DESM20 ;COMMON ROUTINE TO PUT PT AWAY ,135307 ;C(N/2)-2 (F.P. .2429) 0,0 ;C(N/2)-3 0,0 ;C(N/2)-4 0,0 ;C(N/2)-5 ;HANNING DESMHN: 2 ;(#PT-1)SMOOTH 1377,R0 ;R0=-1 (INDEX PTR FOR DEGET ETC) MOV @#DEDATA,R3 SUB (R2),R3 ;R3=DATASIZE-(#PTSMO-1) [DNCTR] MOV @#DECMD1+2,R5 ;R5= DEC R3 BNE DESMO7 ;NOT DONE YET! MOV (SP)+,R0 ;RESTORE OPTION # RTS PC ;---DESM10--- ;THIS ROUTINE AVERAGES 2 CONSECPTR TO WD0 OF RING BUFR DESMO3: MOV @#DECMD1,R2 ;R2=PTR TO WD0 OF COEFF TBL MOV (R2)+,R4 ;R2 NOW PTS TO 1ST COEFF INC R4 ;UTIVE DATUMS FROM B1 AND STORES ;THE RESULT IN DECMD1+4 AND DECMD1+6 DESM10: CLR -(SP) MOV #40000,-(SP) ;PUT F.P. 1/2 ON SR4=#PTSMO INC R0 JSR PC,@#SAVARG ;SAV R0-R5 CLR -(SP) CLR -(SP) ;INITIATE 'RUNNING SUM'=0 DESMO4: MOV 2(R2),-(SP) MOTACK JSR R5,@#DEGET DECMD ;GET DATUM FROM B1 INC R0 JSR R5,@#DEGET DECMD ;GET NXT DATUM FROM B1 JSR R4,@#$POLSH V (R2)+,-(SP) ;PUT NXT 'COEFF' ON STACK TST (R2)+ ;MOV PTR TO NXT COEFF JSR R5,@#DEGET DECMD ;PUT DATUM FROM B1 ON STAC $ADR,$MLR,.+2 MOV (SP)+,@#DECMD1+4 MOV (SP)+,@#DECMD1+6 ;PUT AVE VAL AWAY FOR MINUTE RTS PC ;---DESM20--- ;(1)THIS RK = Y(I-) DEC R4 ADD R4,R0 JSR R5,@#DEGET DECMD ;PUT DATUM FROM B1 ON STACK = Y(I+) MOV R0,@#DECMD1+4 MOV R2,@#DECOUTINE GETS NXT SMOOTHED PT FROM RING BUFR (VIA R5) ;AND PUTS RESULT INTO B2 (R0 IS SET OK) ;(2) PUT THAT LAST SMOOTHED VALUE MD1+10 MOV R4,@#DECMD1+6 ;SAVE R0 & R2 & R4 JSR R4,@#$POLSH $ADR,$MLR,$ADR,.+2 ;(Y(I-) + Y(I+))*C + SUM MOV @#DECMD1+6,R(WAITING IN DECMD1+4 & DECMD1+6) ;INTO OPEN SLOT OF RING BUFR (VIA R5+) ;(3) DO AN E.O. RING BUFR CHK DESM20: MOV 2(R5),-(S4 MOV @#DECMD1+10,R2 MOV @#DECMD1+4,R0 ;RESTORE R0 & R2 & R4 TST R4 ;FINISHED SMOOTHING CURRENT PT? BEQ DESMO5 ;YES P) MOV (R5),-(SP) ;GET NXT SMO PT FROM RING BUFR JSR R5,@#DEPUT DECMD+2 ;PUT VAL IN B2 MOV @#DECMD1+4,(R5)+ MOV @#DEDEC R4 SUB R4,R0 ;R0=R0-R4 BR DESMO4 DESMO5: MOV (SP)+,@#DECMD1+4 MOV (SP)+,@#DECMD1+6 ;SAV 'SMOOTHED VAL' FOR MINUTE CMD1+6,(R5)+ ;PUT LAST SMO VAL IN OPEN SLOT MOV @#DECMD1,R1 ;PTR TO WD0 OF COEFF TBL =R1 MOV (R1),R1 ;R1=WD0 OF TBL (#PTSMJSR PC,@#RSTARG ;RESTORE R0-R5 JSR PC,DESM20 ;COMMON ROUTINE TO PUT PT AWAY DEC R3 ;SMOOTH IS DONE? BNE DESMO3 ;NO ;LO-1) ASL R1 ;R1=2*WD0 OF TBL ADD @#DECMD1+2,R1 ;R1=E.O. RING BUFR+2 CMP R5,R1 ;E.O.RING BUFR YET? BMI DESM21 ;NO MOAST (#PTSMO-1)/2 CANNOT BE SMOOTHED MOV @#DECMD1,R3 ;YES MOV (R3),R3 ASR R3 ;R3=(#PTSMO-1)/2 MOV R3,R4 DESMO6: JSR PV @#DECMD1+2,R5 ;YES--R5 PTS TO WD0 OF RING BUFR DESM21: RTS PC ;TABLES OF COEFFICIENTS FOR VARIOUS TYPES OF SMOOTHING ;3 PTC,@#SAVARG ;SAV R0-R5 ADD R4,R0 JSR PC,DESM10 ;COMMON ROUTINE TO DO AVERAGING JSR PC,@#RSTARG ;RESTORE R0-R5 INC R0 JS SMOOTH DESM3P: 2 ;(#PT-1)SMOOTH 37600,0 ;C1(F.P. .25) 37600,0 ;C0(F.P. .25) ;5 PT SMOOTH (ALSO USED FOR 7,9,11 PR PC,DESM20 ;COMMON ROUTINE TO PUT PT AWAY DEC R3 BNE DESMO6 ;NOT DONE YET! ;PUT THE LAST (#PTSMO-1)/2 OF RING BUFR INTOT SMOOTHS) DESMNP: 4 ;N=(#PT-1)SMOOTH 137257,101573 ;C(N/2) (F.P. -0.0857) 37657,110227 ;C(N/2)-1 (F.P. .3429) 37570 OTHER COPIES ;THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ;OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM AND PC DERR: .BYTE TEXTA .EVEN DERRAD: 0 ;ADDR OF MESSAGE PUT HERE 0 ;EXIT .IFDF RT11$ .NLIST BEX .ENDC DEM1 TO ONE WHO AGREES ;TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE SOFTWARE ;SHALL AT ALL TIMES REMAIN IN DEC. ;THE : .ASCII /ERR-SPECIFY DIFFERENT BUFR TYPES/ .BYTE 0 DEM2: .ASCII /ERR-SPECIFY A BUFR/ .BYTE 0 DEM3: .ASCII /ERR-SPECIFY A INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE ;WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A ;COMMITMENT BY DIGITAL EQUIBUFR SIZE>0/ .BYTE 0 DEM4: .ASCII /ERR-YOU HAVE NO DISPLAY-SPECIFY A BUFR/ .BYTE 0 DEM5: .ASCII /ERR-TOTAL BUFR NEEDS EXCEPMENT CORPORATION. ;DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ;ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPED FREE CORE/ .BYTE 0 DEM6: .ASCII /ERR-DDI CMD NEEDED PRIOR TO FULL-MODE/ .BYTE 0 DEM7: .ASCII /ERR-BUFR MUST BE SNGL PRE7600,0 ;C1 (F.P. -.25) 37600,0 ;C0 (F.P. .25) ;TBLS & TAGS DESMTB: 0 ;ADDR OF 'DESM3P' REL TO ITSELF DESMNP-DESM3P LIED BY DEC. ;LDP SOFTWARE DEVELOPMENT, 1974-5 ; CARL RALSTON ;---DERROR--- ;THIS COMMON ERROR ROUTINE IS CALLED BY THE D;ADDR OF 'DESMNP' REL TO 'DESM3P' DESMHN-DESM3P ;ADDR OF 'DESMHN' REL TO 'DESM3P' DESMHN-DESM3P ; " " " " " ATA EDITOR WITH THE ;# OF THE ERROR-MESSAGE-TO-BE-OUTPUT IN R0 (NEG,1,2,3...) ;DEFINITIONS R0=%0 R5=%5 PC=%7 CRLFC0=3 " DESMRG: 0,0,0,0,0,0,0,0,0,0 ;RING BUFFR .ENDC TEXT=7 TEXTA=10 SINGL=12 EXIT=0 .GLOBL DERROR,FORMAT,FORMAA,TTYOCH DERROR: CLRB @#TTYOCH ;ALWAYS OUTPUT ERROR TO TTY TST R0 ;FPMP ERROR? BPL DERR0 ;NO! NEG R0 ;GET SET TO OUTPUT FPMP'S # MOVB R0,DERRE ;ERROR CLASS SWAB R0 MOVB R0,DERREE ;ERROR # JSR R5,@#FORMAT .BYTE CRLFC0,TEXT .ASCII /ERR-NUMERICAL-FPMP= / .BYTE 0,SINGL,200 .EVEN DERRE: 0 ;HOLDS ERROR CLASS OF FPMP ERROR .BYTE TEXT .ASCII /,/ .BYTE 0,SINGL,200 .EVEN DERREE: 0 ;HOLDS ERROR # OF FPMP ERROR .TITLE SPOV6 ;LAB APPLICATIONS-11 ERROR MESSAGES ;DEC-11-SLABA-C-LA20 ;FILE ID SPOV6.1 ;FILE: SPOV6.MAC .CSECT SPOV6 ;CO.BYTE EXIT .EVEN RTS PC DERR0: .IFNDF SPERR$ MOV R0,DERR1 JSR R5,@#FORMAT .BYTE CRLFC0,TEXT .ASCII /E/ .BYTE 0,PYRIGHT (C) 1974,1975 ;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ;THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLSINGL,200 .EVEN DERR1: 0 .BYTE EXIT .EVEN RTS PC .ENDC .IFDF SPERR$ DEC R0 ASL R0 ;COMPUTE ADDR OF ERROR MESSY ON A ;SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLUSION ;OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANYAGE ADD #DEMESS,R0 MOV (R0),DERRAD ;SAV IT AWAY FOR 'FORMAA' MOV #DERR,R0 ;ADDR USED BY 'FORMAA' JSR PC,@#FORMAA RTS0 DEM22: .ASCII /ERR-NO ROOM FOR DISPLAY BUFR/ .BYTE 0 DEM23: .ASCII /ERR-SPECIFY A 2ND BUFR/ .BYTE 0 DEM24: .ASCII /ERR-DEM53: .ASCII /ERR-UNNECESSARY CONSTANT SPECIFIED/ .BYTE 0 DEM54: .ASCII /ERR-E.O. CASSETTE/ .BYTE 0 DEM55: .ASCII /ERR-MABUFR SIZE MUST BE > 4 PTS/ .BYTE 0 DEM25: .ASCII /ERR-FREE CURSORS HAVE SAME X-POSITION/ .BYTE 0 DEM26: .ASCII /ERR-FIX CUX FILES OPEN/ .BYTE 0 DEM56: .ASCII *ERR-I/O CONFLICT* .BYTE 0 .EVEN .IFDF RT11$ .LIST BEX .ENDC DEMESS: DEM1,DERSORS NOT UP/ .BYTE 0 DEM27: .ASCII /ERR-FREE CURSORS NOT UP/ .BYTE 0 DEM28: .ASCII /ERR-SPECIFIED BUFRS CANNOT BE CONTIGUM2,DEM3,DEM4,DEM5,DEM6,DEM7,DEM8,DEM9 DEM10,DEM11,DEM12,DEM13,DEM14,DEM15,DEM16,DEM17,DEM18,DEM19 DEM20,DEM21,DEM22,DEM23,DEOUS/ .BYTE 0 DEM29: .ASCII /ERR-INSUFFICIENT BUFR SPACE/ .BYTE 0 DEM30: .ASCII /ERR-FILE(S) STILL OPEN/ .BYTE 0 DEM31: M24,DEM25,DEM26,DEM27,DEM28,DEM29 DEM30,DEM31,DEM32,DEM33,DEM34,DEM35,DEM36,DEM37,DEM38,DEM39 DEM40,DEM41,DEM42,DEM43,DEM44,.ASCII /ERR-FILE NOT OPEN OR HARDWARE ERROR/ .BYTE 0 DEM32: .ASCII /ERR-E.O.FILE/ .BYTE 0 DEM33: .ASCII /ERR-DUAL DISPLAY DEM45,DEM46,DEM47,DEM48,DEM49 DEM50,DEM51,DEM52,DEM53,DEM54,DEM55,DEM56 .ENDC .END NEEDED/ .BYTE 0 DEM34: .ASCII /ERR-BUFR IS NOT DISPLAYED/ .BYTE 0 DEM35: .ASCII /ERR-BOTH CURVES NEED SAME CURSOR STATUS/ .TITLE SPOV8 ;LAB APPLICATIONS-11 AD CALL OVERLAY ;DEC-11-SLABA-C-LA22 ;FILE SPOV8.MAC ;FILE ID SPOV8.1 .CSECT SPOV8 ;CO .BYTE 0 DEM36: .ASCII /ERR-BUFR TYPE IS NOT SNGL PREC/ .BYTE 0 DEM37: .ASCII /ERR-BUFR SIZE MUST BE A POWER OF 2/ .BYTE PYRIGHT (C) 1974,1975 ;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ;THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLC/ .BYTE 0 DEM8: .ASCII /ERR-SPECIFY DEV & SU IN ORDER/ .BYTE 0 DEM9: .ASCII /ERR-ILLEGAL DEV ( OR SU SWITCH )/ .BYTE 0 0 DEM38: .ASCII /ERR-BUFR SIZE IS < 8/ .BYTE 0 DEM39: .ASCII /ERR-BUFR SIZE IS > PROGRAM LIMIT/ .BYTE 0 DEM40: .ASCII /ER DEM10: .ASCII /ERR-SPECIFY BOTH L & H/ .BYTE 0 DEM11: .ASCII /ERR-BUFPOSITION MUST BE >= 1/ .BYTE 0 DEM12: .ASCII /ERR-BUR-BAD CMD NAME/ .BYTE 0 DEM41: .ASCII /ERR-SPECIFY A NUMBER/ .BYTE 0 DEM42: .ASCII /ERR-INCORRECT CMD FMT/ .BYTE 0 DEM4FPOSITION + #PTS > BUFR SIZE +1/ .BYTE 0 DEM13: .ASCII /ERR-BAD DATA VALUE/ .BYTE 0 DEM14: .ASCII /ERR-E.O.PAPERTAPE/ .B3: .ASCII /ERR-BAD DELAY VALUE/ .BYTE 0 DEM44: .ASCII /ERR-BAD CLOCK RATE/ .BYTE 0 DEM45: .ASCII /ERR-BAD BUFR TYPE/ .BYYTE 0 DEM15: .ASCII /ERR-ILLEGAL OPTION NAME/ .BYTE 0 DEM16: .ASCII /ERR-OPTION 'O' NOT ALLOWED NOW/ .BYTE 0 DEM17: .ASCITE 0 DEM46: .ASCII /ERR-INCORRECT FMT OF INPUT DATA/ .BYTE 0 DEM47: .ASCII /ERR-NONEXISTENT BUFR/ .BYTE 0 DEM48: .ASCII /I /ERR-START CANNOT BE < 1/ .BYTE 0 DEM18: .ASCII /ERR-WINDOW CANNOT BE < 1/ .BYTE 0 DEM19: .ASCII /ERR-START + WINDOW > BERR-NONEXISTENT HARDWARE/ .BYTE 0 DEM49: .ASCII /ERR-127 BUFRS OF ONE TYPE IS MAX/ .BYTE 0 DEM50: .ASCII /ERR-#PTS + #SKPSUFR SIZE + 1/ .BYTE 0 DEM20: .ASCII /ERR-WINDOW > SCOPE SIZE/ .BYTE 0 DEM21: .ASCII /ERR-ASSIGN A SNGL PREC BUFR/ .BYTE > BUFR SIZE/ .BYTE 0 DEM51: .ASCII /ERR-SPECIFY 4 BUFRS/ .BYTE 0 DEM52: .ASCII /ERR-TOO MANY BUFRS SPECIFIED/ .BYTE 0 INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE ;WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A ;COMMITMENT BY DIGITAL EQUIAND ;DEFINES THE TYPE OF DISPLAY AND TYPE OF DATA ACQUISITION ;N FOR NO DISPLAY ;P FOR GRAPH PLOT ;F FOR FULL DISPLAY ;IF CPMENT CORPORATION. ;DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ;ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPP IS TYPED THE FOLLOWING DATA IS FETCHED ;NO ANSWER TO ANY OF THE FOLLOWING QUESTIONS, CAUSES THE ;REST OF THE DATA NOT TO BE FLIED BY DEC. ;LDP SOFTWARE DEVELOPMENT, 1974-5 ; CARL RALSTON ;AAD S# [S#] RATE [P,F,N] [C] ;T# #C S D F ;A/D SAMPLER ROETCHED. ;MIX,#1,#2,#3,ALP. ;MIX IS CHANNEL TYPE AND FIRST CHANNEL FROM QA MIXED MODE. ;#1 IS AN INTEGER =# OF CHANNELS ;#2 IUTINE ;SPAAD$ MUST BE DEFINED IN A CONDITIONAL ASSEMBLY FILE .IFDF SPAAD$ ;REGISTER DEFINITIONS R0=%0 R1=%1 R2=%2 R3S AN INTEGER =# OF SWEEPS ;#3 IS F.P. AND IS THE DELAY IN SECONDS ;ALP IS I FOR INTEGER OR F IS FOR F.P. OUTPUT ;THESE VALU=%3 R4=%4 R5=%5 SP=%6 PC=%7 ;ASSEMBLY PARAMETER ;AD$1=1 ;DISPLAY WHILE SAMPLING IF DEFINED ;NO DISPLAY IF NOT ;GT4ES ARE USED TO BUILD THE A/D SAMPLE TABLE. ;A/D SAMPLE ROUTINE IS CALLED ;THE OUTPUT IS RETURNED AS SINGLE PRECISION OR F.P. 0$=1 ;GT40 CODE ;VR14$=1 ;VR14 CODE ;RT11$ ;DEFINED = RT11 SYSTEM ;QA SYMBOL DEFINITIONS QAALP =20 QASIL =400 QANU ; ERROR CONDITIONS ;1. B#1, RATE MUST BE SPECIFIED ;2. RATE IS A NUMBER GREATER THAN .0003 AND LESS THAN 166,666 ;3. BLA =20000 QAMIX =100 QASPN =1 QAFLO =10 ;GLOBAL SYMBOLS .GLOBL QA,QADATF,QAANS,QAERR .GLOBL DEDATS,DEDATA,DEDATF,DECMD#1 MUST BE D.P. IF #OF SWEEPS IS GREATER THAN 16. ;4. THE BUFFER NUMBER MUST BE A VALUE SUCH THAT THE TOTAL BUFFER ; AREA ,DECMD1 .GLOBL DED1TY,DED1BA,DEDIT1,DEADSB .GLOBL CRLF,TYPCH,MULT .GLOBL $POLSH,$MLR,$DVR .GLOBL DEFORE,DEFLG1,ADSAM,TTYBUF,NEEDED DOES NOT EXCEED, BUFFER AVAILABILITY. ;5. B#2 IS SPECIFIED FOR DMA, IT CAN BE S.P. OR F.P. BUFFER. ;A SINGLE SWEEP DMADESAD .IFDF VR14$ .GLOBL DISET .ENDC .IFDF GT40$ .IFDF RT11$ .GLOBL DEDBCB .ENDC .GLOBL DEFREE,DETOP,DELST,DEONE,DEDI SAMPLE DOES NOT NEED B #2. ;6. C IS THE ONLY VALID CONTINUE CHAR. ;7. THE ANSWERS ON EACH COMMAND LINE MUST BE IN ORDER. ;1S .GLOBL GTSET .ENDC ;ROUTINES CALLED: QA, MULT, $POLSH,DEFORE ;THIS IS THE CALLING ROUTINE FOR THE DATA ANALYSIS MODUL8. CHANNEL TYPE AND FIRST CHANNEL IS C OR D AND A ;9. POSITIVE NUMBER. ;10. #OF CHANNELS IS A POSITIVE NON ZERO NUMBER, ; SY ON A ;SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLUSION ;OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANYE ;WHICH CALLS THE A/D SAMPLE ROUTINE. ;THE INPUT TO THIS ROUTINE IS FROM THE TELETYPE ;VIA THE COMMAND ; AD B#1 B#2 RATE DI OTHER COPIES ;THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ;OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM ANDSP-TYPE C ;B#1 IS THE FIRST SUM BUFFER TO BE USED, THE VALUE IS IN DECMD TABLE. ;B#2 IS FOR DMA ONLY, AND IS THE CURRENT SWEEP TO ONE WHO AGREES ;TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE SOFTWARE ;SHALL AT ALL TIMES REMAIN IN DEC. ;THE TEMP BUFFER ;AND IS THE SECOND ENTRY OF THE DECMD TABLE. ;RATE IS A F.P. # IN TABLE DECMD1. ;DISP-TYPE IS FOR GT40 AND VR14 UCH THAT THE AVAILABLE ; BUFFER SPACE IS NOT EXCEEDED. FOR EXAMPLE IF THESE ARE 4 ; S.P. BUFFERS AND 3 CHANNELS WILL BE: MOV #54,R0 ;TYPE ERROR-BAD CLOCK RATE BR AD2C AD1: JSR R5,QA ;GET CHANNEL TYPE AND QAMIX+QANULA ;FIRST CHANEL # ADME SAMPLED STARTING WITH ; BUFFER S3, THEN THE COMMAND IS IN ERROR, SINCE THE BUFFERS ; MUST BE CONTIGUOUS ;11. #OF SWEEPS ADCOM2 JSR PC,ADSUB2 MOVB R0,ADCHTY ;SET CHANNEL TYPE MOVB @#QAANS,ADCHN ;STORE 1ST CHANNEL #. BMI AD2A JSR R5,QA S MUST BE A NON ZERO, POSITIVE INTEGER, MAX IS 32767 ;12. DELAY IS A NUMBER LESS THAN 4294.967295 AND SUCH THAT THE RATE ; ;GET # OF CHANNELS QASIL+QASPN+QANULA JSR PC,ADSUB2 MOV @#QAANS,R0 ;STORE # OF CHANNELS -1. DEC R0 MOV R0,ADNOFC BMUSED FOR DELAY IS THE SAME OR SLOWER THAN THE SAMPLING RATE. ; A GOOD RUE OF THUMB IS 1-RATE, LT. ;13 THE OUTPUT TYPE MUST I AD2A JSR R5,QA ;GET # OF SWEEPS QASIL+QASPN+QANULA JSR PC,ADSUB2 MOV @#QAANS,ADNOFS ;STORE # OF SWEEPS BLE AD2A JBE I OR F, S.P. BUFFERS CAN NOT BE FLOATED. ;14. IF A DELAY ERROR IS FOUND. THE MESSAGE "DELAY RATE TOO ; FAST" IS PRINTEDSR R5,QA ;GET DELAY QASIL+QAFLO+QANULA JSR PC,ADSUB2 MOV @#QAANS,ADDELY ;STORE DELAY MOV @#QAANS+2,ADDELY+2 JSR R5,QA. ; ERRORS PRINTED BY SUBROUTINE ;DELAY VALUE BAD ;CLOCK RATE ERROR ;BAD BUFFER TYPE ;INCORRECT FORMAT ;NON-EXISTEN ;GET OUTPUT DATA TYPE. QASIL+QAALP+QANULA ADCOM1 JSR PC,ADSUB2 ;TEST FOR I,F COMMAND. MOVB R0,ADDATY ;STORE OUTPUT TYPT BUFFER ;AFTER AN ERROR THE DISPLAY COMMAND ;SHOULD BE GIVEN AGAIN TO RESET THE DISPLAY DESAD: CLR ADNOFC ;SET VALUES TO DE FLAG IF ;SET AD3: TSTB ADDTYP ;TEST DISP TYPE BNE AD3A CMPB #1,DEFLG1 ;IF TYPE F, A SINGLE ;DISPLAY MUST BE ONEFAULT VALUES. CLR ADDELY CLR ADDELY+2 CLR ADCHTY CLR (PC)+ ;DATA OUTPUT TYPE F.P.=1 ADDATY: .BYTE 0,0 ;LEAVE AS INTE BEQ AD3A MOV #6,R0 ;PRINT ERO:ROR JMP AD17 AD3A: MOVB @#DECMD+1,ADDOUP ;SET THE TYPE OF ;BUFFER TO USE BEQ AD4 GER=0 CLR ADCHN CLR ADDTYP MOV #1,ADNOFS ;# OF SWEEPS MOVB @#DECMD+1,ADDATY ;SET FORMAT TYPE ;GET INPUT .IFDF AD$1 MOV #177777,@#DED1TY ;SET DISPLAY TYPE TO D.P. AD4: MOV AD1ML+2,-(SP) ;FIND THE SAMPLE RATE MOV AD1ML,-(SP) ;IN MICROSECONDS JSR R5,QA ;TEST FOR DISPLAY TYPE,SAMPLE TYPE QASIL+QAALP ADCOM3 TSTB @#QAERR BNE AD2 DEC R0 ;SET DISPLAY,SAMPLE MOV @#DECMD1+2,-(SP) MOV @#DECMD1,-(SP) JSR R4,@#$POLSH $DVR,.+2 JSR PC,ADFIXD ;FIX TO A D.P. NUMBER. MOV R1,ADRATETYPE AND MOVB R0,ADDTYP ;STORE IT AWAY. .ENDC .IFNDF AD$1 MOVB #-1,ADDTYP ;SET DISPLAY TYPE TO NO DISPLAY .ENDC AD1 ;STORE RATE AS A D.P. #. MOV R2,ADRATE+2 BNE AD15 ;TEST FOR RATE CMP R1,#7 ;TOO FAST BLO AD2B AD15: MOV AD1ML+2,-(SPA: JSR R5,QA ;TEST FOR C COMMAND, ADD INPUT QASIL+QAALP+QANULA ADCOM2 TSTB @#QADATF ;TEST FOR NO C COMMAND BEQ AD3 TS) ;PUT DELAY IN MICRO SECONDS MOV AD1ML,-(SP) MOV ADDELY+2,-(SP) MOV ADDELY,-(SP) JSR R4,@#$POLSH $MLR,.+2 JSR PC,ADT R0 ;TEST FOR A COMMAND ERROR. BEQ AD1 AD2: MOV #17,R0 ;TYPE MESSAGE ILLEGAL OPTION AD2C: JMP AD17 AD2A: JMP ADSU2 AD2BFIXD ;FIX TO A D.P. #. MOV R1,ADDELY ;STORE DELAY AS D.P. #. MOV R2,ADDELY+2 CLR R1 ;FIND ADDRESS OF SUM BUFFER. JSR PC AD14A JSR PC,GTSET .ENDC AD14A: JSR R5,ADSAM ;CALL A/D SAMPLES ROUTINE ADBUFA-.-2 BR AD16 ;ERROR RETURN TSTB ADDATYOR FROM A/D AD17: MOV #1,@#DED1TY TST (SP)+ JMP @#DEFORE ;CALL ERROR EXIT AD20: MOV #57,R0 ;TYPE ERROR NONBUFFER. BR AD ;TEST TO CONVERT DATA TO F.P. BNE AD7 TSTB ADDOUP ;TEST FOR D.P. BEQ AD19 RTS PC AD19: MOV #1,@#DED1TY ;RESET THE DI17 ;A/D SAMPLE TABLE TO PASS TO A/D ROUTINE ADBUFA: 0 ;ADDRESS OF SUM BUFFER ADRATE: 0,0 ;RATE ADDELY: 0,0 ;DELAY SPLAY MOV #177777,R0 MOV R0,@#DECMD1 ;TO BUFFER DATA IS MOV R0,@#DECMD1+2 ;PUT INTO MOV R0,@#DECMD1+4 MOV R0,@#DECMD1+ADCHTY: .BYTE 0 ;=1 FOR DMA, OTHERWISE 0 ADDOUP: .BYTE 0 ;1 FOR D.P., 0 FOR S.P. ADCHN: 0 ;FIRST CHANNEL TO SAMPLE FROM ,ADFBA MOV R5,ADBUFA TST (R1)+ ;ADD 2 .IFDF GT40$ TSTB ADDTYP ;TEST FOR GRAPH PLOT DISPLAY BLE AD5A MOV @#DEFREE,R6 TST (SP)+ JMP @#DEADSB ;CONVERT D.P. DATA TO FLOATING POINT AD7: MOV ADCOUT,R5 ;MULT. # OF BUFFERS X SIZE MOV ADNOFC0 ;GET DISPLAY BUFFER ADDRESS AND SIZE MOV R0,ADGRAB NEG R0 ADD @#DETOP,R0 TST (R0)+ ;ADD 2 & C=0 ROR R0 ;UNSIGNED D,R0 INC R0 JSR PC,@#MULT ;R5 HAS THE # OF POINTS TO PROCESS. MOV ADBUFA,R4 ;ADDRESS OF BUFFERS. AD13: MOV (R4)+,R0 ;LOW OIV BY 2 MOV R0,ADGRAS MOV #DEDIT1,@#DELST ;SET DISPLAY ADDRESSES AND 0 SCALE CLR @#DELST+2 ;FOR GRAPHPLOT MOV #DEDIT1,@#RDER OF DATA MOV (R4)+,R1 ;HIGH ORDER MOV #230,R2 ;EXPONENT FOR 24 BITS OF MONITOR. AD9: BIT #177600,R1 ;TEST TO SHIFT LEFDEONE CLRB @#DEDI1S AD5A: .ENDC TSTB ADCHTY ;TEST FOR DMA BEQ AD5 TST DECMD(R1) BPL AD5B ;ERROR IF NO BUFFER INPUT BNE AD11 ASL R0 ;SHIFT LEFT AND REDUCE EXP. ROL R1 DEC R2 BEQ AD10A ;VALUE MUST HAVE BEEN ZERO BR AD9 AD11: BT ;FOR TEMP STORAGE, & # OF SWAP GT 1. CMP #1,ADNOFS ;TEST FOR 1 SWEEP BEQ AD5D AD18: JMP ADSU2 AD5D: TSTB ADDOUP IT #177400,R1 ;TEST IF DONE SHIFTING BEQ AD10 ASR R1 ;SHIFT RIGHT AND ADD 1 TO EXP. ROR R0 INC R2 BR AD11 AD10: BI;MUST BE S.P. BEQ AD5C BR AD18 ;GET ADDRESS OF TEMP BUFFER AD5B: JSR PC,ADFBA AD5C: MOV R5,ADBADM AD5: TSTB ADDATY C #177600,R1 ;CLEAR EXPONENT OF F.P. WORD. SWAB R2 ;GET EXP IN POSITION AND ADD CLC ;TO HIGH PART OF F.P. WORD ROR R2 ;TEST FOR F.P. OUTPUT BEQ AD6 TSTB ADDOUP ;ERROR IF USING S.P. BUFFER. BEQ AD18 AD6: MOVB @#DECMD,R0 ;TEST IF TOO MANY C ADD R2,R1 AD10A: SUB #4,R4 ;SET TO STORE DATA HIGH LOW. MOV R1,(R4)+ MOV R0,(R4)+ DEC R5 ;TEST IF DONE BNE AD13 BRHANNELS ADD ADNOFC,R0 ;ARE REQUESTED TO BE USED. MOV @#DEDATS,R1 TSTB @#DECMD+1 BEQ AD12 MOV @#DEDATF,R1 AD12: CMP R0 AD19 ADSUB2: TSTB @#QADATF ;TEST FOR NO ANSWER BNE ADSUB1 TST (SP)+ ;SKIP REST OF QUESTIONS JMP AD3 ADSUB1: TSTB @#QAE,R1 BLOS AD14 ;BRANCH IF NO ERROR. JMP AD20 AD14: MOV @#DEDATA+2,ADCOUT ;SET POINTS PER SWEEP. MOV ADBUFA,@#DED1BA ;SET RR ;TEST FOR ERROR BNE ADSU1 RTS PC ;ELSE EXIT ADSU1: TST (SP)+ ;ERROR, CALL ERROR ADSU2: MOV #56,R0 ;TYPE ERROR INCORDISPLAY ADDRESS. MOV #DEDIT1,R0 .IFDF VR14$ JSR PC,DISET .ENDC .IFDF GT40$ TSTB ADDTYP ;TEST FOR FULL DISPLAY BNERECT FORMAT BR AD17 AD16: CMP R0,#3 ;TEST FOR TYPE 3 ERROR BNE AD16A MOV #22.,R0 BR AD17 AD16A: ADD #53,R0 ;TYPE ERR ;ALWAYS ASSUMED SET. ASL R0 ;GET EXPONENT INTO BITS SWAB R0 ;0-7 OF R0 FROM BITS BIC #177400,R0 ;7-14 OF F.P. NUMBER.TITLE SPCOM1 ;LAB APPLICATIONS-11 ;DEC-11-SLABA-C-LA ;FILE ID SPCOM1.1 ;FILE: SPCOM1.MAC ;COPYRIGHT (C) 1974,1975 ;DIGI. SUB #200,R0 ;SUB. 200 TO GET REAL EXPONENT CMP R0,#1. BLO ADFXD5 ;EXPONENT MUST BE CMP R0,#32. ;1 .LE. EXP .LE. 32 TAL EQUIPMENT CORPORATION, MAYNARD, MASS. ;THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A ;SINGLE COMPUTER SYS BHI ADFXD5 CMP R0,#24. ;COMPARE EXPONENT, TO SHIFT BEQ ADFXD2 ;MONTISSA INTO A D.P. BHI ADFXD3 ;NUMBER MOV #24.,R3 TEM AND MAY BE COPIED ONLY WITH THE INCLUSION ;OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANY OTHER COPIES ;THEREOF, MAY SUB R0,R3 ADFXD1: ASR R2 ;SHIFT RIGHT ROR R1 DEC R3 BNE ADFXD1 BR ADFXD2 ADFXD3: SUB #24.,R0 ;SHIFT LEFT ADFXD4 NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ;OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO AGREES ;TO THES: ASL R1 ROL R2 DEC R0 BNE ADFXD4 ADFXD2: RTS PC ADFXD5: TST (SP)+ ;ERROR EXIT JMP AD2B ;SUBROUTINE TO FIND A BUFE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE SOFTWARE ;SHALL AT ALL TIMES REMAIN IN DEC. ;THE INFORMATION IN THIS DOCUMENTFER ADDRESS ;ENTER WITH ORDER OF BUFFER IN R1, =0 FOR FIRST BUFFER. ADFBA: MOV @#DEDATS+2,R2 ;ADDRESS OF S.P. BUFFERS MOV @ IS SUBJECT TO CHANGE ;WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A ;COMMITMENT BY DIGITAL EQUIPMENT CORPORATION. ;DEC A ADNOFC: 0 ;# OF CHANNELS -1 ADCOUT: 0 ;# OF POINTS PER SWEEP ADNOFS: 0 ;# OF SWEEPS ADBADM: 0 ;DMA TEMP BUFFER ADRES#DEDATA+2,R0 ;SIZE OF BUFFERS TSTB DECMD+1(R1) BEQ ADFBA1 MOV @#DEDATF+2,R2 ;ADDRESS OF F.P. BUFFERS ASL R0 ;DOUBLE SIZS ADDTYP: .BYTE 0 ;DISPLAY TYPE ;=0 FOR FULL DISPLAY ;=1 FOR GRAPH PLOT ;=-1 FOR NO DISPLAY .EVEN .IFDF GT4E FOR F.P. ADFBA1: MOVB DECMD(R1),R5 ;GET BUFFER NUMBER BMI ADFBA2 DEC R5 JSR PC,@#MULT ;MULTIPLY POSITION X SIZE ASL R0$ ADGRAB: 0 ;GRAPH PLOT BUFFER FOR GT-40 ADGRAS: 0 ;SIZE .ENDC ;ADFIXD ;SUBROUTINE TO FIX A FLOATING POINT NUMBER T5 ;MULT BY 2 FOR ADDRESS ADD R2,R5 ;ADDRESS IN R5 RTS PC ADFBA2: TST (SP)+ BR AD20 ;COMMAND LIST FOR INPUT ADCOM1:O ;A DOUBLE PRECISION INTEGER ;THE NUMBER IS ASSUMED TO BE POSITION ;REGISTING R0,R1,R2 AN DISTROYED ;CALLING SEQUENCES ;FL .BYTE 3,1,'I,'F,0 .IFDF LPS11$ ADCOM2: .BYTE 3,1,'C,'D,0 .ENDC .IFDF AR11$ ADCOM2: .BYTE 2,1,'C,0 .ENDC .IFDF GT4OATING POINT NUMBER IS ON THE STACK ;JSR PC, ADFIXD ;D.P. NUMBER RETURNED IN R1,R2, LOW ORDER IN R1 ADFIXD: MOV (SP)+,R2 ;SAV0$ ADCOM3: .BYTE 4,1,'N,'F,'P,0 .ENDC .IFDF VR14$ ADCOM3: .BYTE 3,1,'N,'F,0 .ENDC ADMES: .ASCII /T# #C S D F/ .BYTEE PC MOV (SP)+,R0 ;EXPONENT WORD OF F.P. #. MOV (SP)+,R1 ;LOWER MANTISSA OF F.P. #. MOV R2,-(SP) MOV R0,R2 BMI ADFXD5 15,12,0 .EVEN ;FLOATING VALUES AD1ML: 45164,22000 ;.FLT2 1000000 .ENDC .END ;ERROR IF F.P. # NEG. BEQ ADFXD2 ;DONE IF 0 BIC #177600,R2 ;HIGH MANTISSA IN R2 BIS #200,R2 ;SET MOST SIGNIFIGANT BIT LUES XC1 & XC2 OF ;A GIVEN I/D TBL TO THE ACTUAL LOCATION WITHIN THE ;BUFFER. APPLIES ONLY TO SNGL WD Y-DATA. ;ON RETURN, R4=START LOC AND R5=END LOC (START LOC=0 FOR 1ST PT) ;IF CURSORS ARE INACTIVE, R4=-1. DEFXCU: MOV #177777,R4 ;MAYBE CURSORS AR.TITLE SPCOM3 ;LAB APPLICATIONS-11 ;DEC-11-SLABA-C-LA ;FILE ID SPCOM3.1 ;FILE: SPCOM3.MAC ;COPYRIGHT (C) 1974,1975 ;DIGIE NOT ACTIVE ;OR BUFR NOT DISPLYED CMP @#DECMD,@#DEDID ;IS B ONE OF THE DISPLY BUFS? BNE DEFXC1 ;NOT SO FAR MOV @#DETAL EQUIPMENT CORPORATION, MAYNARD, MASS. ;THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A ;SINGLE COMPUTER SYSLST,R1 ;YES BR DEFXC2 DEFXC1: CMP @#DECMD,@#DEDID+2 BNE DEFX1 ;NO MOV @#DELST+2,R1 DEFXC2: TSTB DISCU(R1) ;WE'LL SEE IFTEM AND MAY BE COPIED ONLY WITH THE INCLUSION ;OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANY OTHER COPIES ;THEREOF, MAY CURSORS ARE ACTIVE. BEQ DEFX1 ;THE'RE NOT ACTIVE MOV DIST(R1),R0 ;GET T SUB DISXC1(R1),R0 ;(T-XC1) =R0 MOV DISN(R1),R5 NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ;OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO AGREES ;TO THES ;N =R5 JSR PC,@#MULT ;(T-XC1)*N =R5 ADD DISST(R1),R5 ;ST+(T-XC1)*N MOV R5,R4 ;SAVE 'START LOC' IN R4 MOV DISXC1(R1),R0E LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE SOFTWARE ;SHALL AT ALL TIMES REMAIN IN DEC. ;THE INFORMATION IN THIS DOCUMENT ;XC1 SUB DISXC2(R1),R0 ;XC1-XC2=R0 MOV DISN(R1),R5 ;N=R5 JSR PC,@#MULT ;(XC1-XC2)*N=R5 ADD R4,R5 ;ST+(T-XC2)*N='END LO IS SUBJECT TO CHANGE ;WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A ;COMMITMENT BY DIGITAL EQUIPMENT CORPORATION. ;DEC AC' DEFX1: RTS PC ;DONE RTN .ENDC .IFDF SPPWR$!SPDNO$!SPBMM$!SPSAD$!SPBDE$!SPBIN$!SPBST$!SPBSM$ ;---DEOPBU--- ;THIS SUSSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ;ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. ;LDP SOFTWARBROUTINE IS CALLED BY ANY DATA EDITING FUNCTION,ALL OF WHOSE ;BUFRS(1 OR 2) MAY BE OPTIONAL. ;IF B1 IS NOT SPECIFIED,IT DEFAULE DEVELOPMENT, 1974-5 ; CARL RALSTON .IFDF SPBIN$!SPBST$ .IFNDF SPNDI$ .GLOBL DEASGN,SAVARG,RSTARG,DECMD,$MLR,$ADR,DEGET,SSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ;ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. ;LDP SOFTWARTS TO 1ST ENTRY OF 'DEDID'. ;IF'DEDID' IS EMPTY (NO DISPLY IS UP),THEN ERROR. ;B2 DEFAULTS TO B1 .GLOBL DECMD,DEDID,DEFORE E DEVELOPMENT, 1974-5 ; CARL RALSTON .IFDF SPPWR$!SPBMM$!SPBIN$!SPBST$!SPBAL$ .GLOBL MULT,DECMD,DEDID,DELST .GLOBL DISST DEOPBU: TST @#DECMD BPL DEOPB1 ;B1 IS SPECIF MOV @#DEDID,@#DECMD ;B1 IS NOT SPECIF BEQ DEOBE1 ;'DEDID' IS EMPTY(ER,DISN,DIST,DISCU,DISXC1,DISXC2 ;ROUTINES CALLED: MULT ;---DEFXCU--- ;FIRST DETERMINE WHICH I/D TBL IS USED TO DISPLY THE R) DEOPB1: TST @#DECMD+2 BPL DEOPB2 ;BE IS SPECIF MOV @#DECMD,@#DECMD+2 ;B2 DEFAULTS TO B1 DEOPB2: RTS PC ;ERRORS BUFR POINTED TO ;BY'DECMD'AND PUT IT IN R1. IF THIS BUFR IS NOT A DISPLAYABLE BUFR ;RETURN R4=-1 ;CONVERT THE FIXED CURSOR VADEOBE1: CMP (SP)+,(SP)+ ;POP 2 RETURNS OFF STACK MOV #4,R0 JMP @#DEFORE .ENDC IST,DISST,DISSC,DEDYSZ,$IR,$RI,$ADR ;ROUTINES CALLED: MULT,DIVR,FLOAT,$POLSH,SAVARG,RSTARG,DEGET ; DEFORE ;---DEFRCU---EFR1 ;1ST ENTRY MOV #DEASGN+14,DEFRT1 ;2ND ENTRY BR DEFR2 DEFR1: MOV #DEASGN+2,DEFRT1 DEFR2: JSR PC,DEFRS3 ;NOW DO 'SCA ;IF FREE CURSORS ARE ACTIVE, CONVERT THEIR READINGS ;RELATIVE TO THE DISPLAY SPECIFIED BY THE 1ST ENTRY OF 'DELST' ;RETURN XLE BACK #2' ON Y2 MOV (SP)+,DEFRT MOV (SP)+,DEFRT+2 ;SAVE Y2 FOR A MOMENT JSR PC,DEFRS3 ;NOW DO 'SCALE BACK #2' ON Y1 1 IN R0, X2 IN R1, Y1 IN R2,R3, Y2 IN R4,R5 ;IF FREE CURSORS ARE NOT ACTIVE RETURN '100000' IN R0. DEFRCU: MOV #100000MOV DEFRT+2,-(SP) MOV DEFRT,-(SP) ;PUT Y2 BACK ON STACK ;AT THIS POINT THE STACK HOLDS F.P. Y2,Y1 AND S.P. X2,X1 ;IN THAT O,R0 ;MAYBE FREE CURSORS ARE INACTIVE CMP @#DECMD,@#DEDID ;IS B ONE OF THE DISPLY BUFS? BEQ DEFRC1 ;YES CMP @#DECMD,@#DRDER. DEFR3: MOV (SP)+,R4 ;RTN Y2 IN R4,R5 MOV (SP)+,R5 MOV (SP)+,R2 ;RTN Y1 IN R2,R3 MOV (SP)+,R3 MOV (SP)+,R1 ;REDID+2 ;NOT SO FAR BNE DEFR4 ;NO IT ISNOT DEFRC1: TSTB @#DEFLG1+1 BEQ DEFR4 ;THEY ARE INACTIVE MOV @#DELST,R2 ;GET ATN X2 IN R0 MOV (SP)+,R0 ;RTN X1 IN R1 DEFR4: RTS PC ;TAGS USED DEFRT: 0,0 ;HOLDS Y1 TEMPORARILY ; THIS SUBROUTINE CDDR OF 1ST I/D TBL ;TIME TO CALC X1 AND X2 MOV @#DEPOTS,(PC)+ ;POT0 DEFRT1: 0 ;TEMPORARY JSR PC,DEFRS1 MOV DEFRT,-(SALC (WINDOWSIZE)*POT*N/DEDXSZ + ST ; THE POT READING IS PASSED VIA DEFRT1. ; THE RESULT IS LEFT IN DEFRT DEFRS1: MOV DIST(RP) ;PUT X1 ON STACK MOV @#DEPOT1,DEFRT1 ;POT1 JSR PC,DEFRS1 MOV DEFRT,-(SP) ;PUT X2 ON STACK MOV R2,R5 ;LET R5=ADDR2),R5 ;WINDOWSIZE MOV DISN(R2),R0 ;N JSR PC,@#MULT MOV R5,DEFRT ;N*WINDOW JSR PC,@#SAVARG MOV DISST(R2),-(SP) ;PUT OF 1ST I/D TBL ;TIME TO CALC Y1 AND Y2 MOV @#DEPOT2,R0 ;R0=POT2 CMP R0,@#DEDYSZ ;POT READING > SCOPE SIZE Y? BLOS DEFR START ON STACK JSR R4,@#$POLSH $IR,.+2 ;FLOAT IT MOV DEFRT1,-(SP) ;PUT POT ON STACK JSR R4,@#$POLSH $IR,.+2 ;F00 ;NO MOV @#DEDYSZ,R0 ;YES DEFR00: SUB DISOFY(R5),R0 ;R0=Y1-OFFSET (I/D TBL) JSR PC,DEFRS2 ;NOW DO 'SCALE BACK #1' ONLOAT IT MOV DEFRT,-(SP) ;PUT (N*WINDOW) ON STACK JSR R4,@#$POLSH $IR,.+2 ;FLOAT IT MOV @#DEDXSZ,-(SP) ;PUT SCOPE SI Y1 MOV R1,-(SP) MOV R0,-(SP) ;SAVE Y1 FOR THE MOMENT. MOV @#DEPOT3,R0 ;R0=POT3 CMP R0,@#DEDYSZ ;POT READING > SCOPE ZE X ON STACK JSR R4,@#$POLSH ;FLOAT IT $IR,$DVR,$MLR,$ADR,$RI,.+2 MOV (SP)+,DEFRT ;SAVE X1 OR X2 TEMP JSR PC,@#RSTARGSIZE Y? BLOS DEFR01 ;NO MOV @#DEDYSZ,R0 ;YES DEFR01: SUB DISOFY(R5),R0 ;R0=Y2-OFSET (I/D TBL) JSR PC,DEFRS2 ;NOW DO RTS PC ;THIS SUBROUTINE CALC THE F.P. (POT-OFFSET)*2^(-SCA FAC)---I/D--- ;THE (POT-OFFSET) IS PASSED VIA R0 TO THIS ROUTI'SCALE BACK #1' ON Y2 MOV R1,-(SP) MOV R0,-(SP) ;SAVE Y2 FOR THE MOMENT ;SEE IF WE NEED TO SCALE FURTHER DUE TO A F.P. BUFNE ;THE SCALE BACK F.P. VALUE IS RETN IN R0,R1 DEFRS2: MOVB DISSC(R5),R3 ;GET 'I/D TBL' SCA. FAC. BEQ DEFR12 ;NO SCALING DEFLG1 .GLOBL DELST,DEPOTS,DEPOT1,DEPOT2,DEPOT3,DEDID,$POLSH .GLOBL $SBR,$DVR,MULT,FLOAT,DECMD1,DEDXSZ,DEFORE .GLOBL DISOFY,DFER TSTB @#DEDID+1 ;DISPLAYING A F.P. BUF? BEQ DEFR3 ;NO CMPB @#DEDID,@#DEASGN ;GET CORRECT ENTRY OF ASSIGN TBL BEQ D MOV @#DECMD1+2,-(SP) MOV @#DECMD1,-(SP) JSR R4,@#$POLSH $DVR,.+2 ;'MPIVOT'=(Y2-Y1)/DX MOV (SP)+,@#DECMD1 MOV (SP)+,@#DECMD1+2 ;SAME AWAY 'MPIVOT' JSR PC,RSTARG ;RSTR R0-R5 MOV R3,-(SP) MOV R2,-(SP) ;PUT 'Y1' BACK ON STACK MOV @#DECM'WAS' DONE BPL DEFR11 ;SCALING UP 'WAS' DONE DEFR10: ASL R0 ;SCALING DOWN 'WAS' DONE INC R3 ;THUS SCALE BACK UP BNED1+2,-(SP) MOV @#DECMD1,-(SP) ;PUT 'MPIVOT' ON STACK MOV R0,@#DECMD1+4 JSR R5,@#FLOAT BR DEPVT2 DECMD1+4 ;FLOAT 'X1 DEFR10 BR DEFR12 DEFR11: ASR R0 ;THUS SCALE BACK DOWN DEC R3 BNE DEFR11 DEFR12: MOV R0,DEFRT1 ;GET READY TO FLOAT TH' DEPVT2: MOV R1,-(SP) MOV R0,-(SP) ;PUT F.P. 'X1' ON STACK JSR R4,@#$POLSH $MLR,$SBR,.+2 MOV (SP)+,@#DECMD1+4 MOV (E VALUE. JSR R5,@#FLOAT BR DEFR13 DEFRT1 DEFR13: RTS PC ;THIS SUBROUTINE CALC F.P. (YVAL/SCA)+OFFSET---ASSIGN--- ;'DESP)+,@#DECMD1+6 ;SAV AWAY BPIVOT RTS PC ;ERRORS DEPVE1: MOV #25.,R0 ;CURSORS HAVE SAME X-POSITION CMP (SP)+,(SP)+ ;FRT1' HOLDS PTR TO CORRECT ASSIGN TBL SCA FAC ;YVAL IS ON TOP OF STACK DEFRS3: MOV (SP)+,DEFRS4+2 ;LET YVAL STILL BE ON TOP POP 2 RETURNS OFF STACK JMP @#DEFORE .ENDC ;---DESTRP--- ;GIVEN R0 (INDEX FOR DEGET & DEPUT) WHERE R0=0,1,2,... ;CALC Y MOV DEFRT1,R0 MOV 2(R0),-(SP) MOV (R0),-(SP) ;PUT SCA FAC ON STACK JSR R4,@#$POLSH $DVR,.+2 MOV DEFRT1,R0 MOV 6(R0(R0)=Y(R0)-(MPIVOT*X(R0)+BPIVOT). ;THIS GIVES THE DATA VALUE MINUS THE PIVOT LINE VALUE. ;THE NEW Y(R0) IS STORED DECMD1+14,DE),-(SP) MOV 4(R0),-(SP) ;PUT OFFSET ON STACK JSR R4,@#$POLSH $ADR,.+2 DEFRS4: JMP @#0 ;---DEPVOT-- ;THIS ROUTINE IS CMD1+16 .GLOBL SAVARG,DECMD1,DEGET,FLOAT,$POLSH,$MLR .GLOBL $ADR,$SBR,RSTARG,DECMD DESTRP: JSR PC,SAVARG ;SAVE R0-R5 TILCALLED IMMEDIATELY AFTER THE FREE CURSOR ;ROUTINE IS CALLED. THE SLOPE (MPIVOT) AND INTERCEPT (BPIVOT) ;OF THE LINE PASSING TL RETURN MOV R0,@#DECMD1+12 ;SAVE R0 FOR CURRENT USE JSR R5,@#DEGET DECMD ;GET Y(I) FROM B1 ONTO STACK MOV @#DECMD1+HRU THE 2 FREE CURSORS ARE CALC ;AND RETURNED IN DECMD1,DECMD1+2(MPIVOT) & DECMD1+4,DECMD1+6(BPIVOT) ;ON IMPUT, X1 (R0), X2(R16,-(SP) MOV @#DECMD1+4,-(SP) ;GET 'BPIVOT' ONTO STACK MOV @#DECMD1+2,-(SP) MOV @#DECMD1,-(SP) ;GET 'MPIVOT' ONTO STACK ), Y1(R2,R3), Y2(R4,R5) DEPVOT: SUB R0,R1 ;R1=DX BEQ DEPVE1 ;DX=0 (BAD!) JSR PC,@#SAVARG ;SAV R0-R5 MOV R5,-(SP) JSR R5,@#FLOAT ;R0=DECMD1+12=X(I) BR DESTR1 DECMD1+12 DESTR1: MOV R1,-(SP) MOV R0,-(SP) ;PUT X(I) ONTO STACK JSR R4,@ MOV R4,-(SP) ;PUT Y2 ON STACK MOV R3,-(SP) MOV R2,-(SP) ;PUT Y1 ON STACK MOV R1,@#DECMD1 ;SAV DX JSR R5,@#FLOAT ;FL#$POLSH $MLR,$ADR,$SBR,.+2 ;Y(I)=Y(I)-(MPIVOT*X(I)+BPIVOT) MOV (SP)+,@#DECMD1+14 MOV (SP)+,@#DECMD1+16 ;RETURN STRIPPED YOAT DX BR DEPVT1 DECMD1 DEPVT1: MOV R0,@#DECMD1 MOV R1,@#DECMD1+2 ;SAVE DX AWAY JSR R4,@#$POLSH $SBR,.+2 ;(Y2-Y1) (I) JSR PC,RSTARG RTS PC .ENDC : SAVARG,RSTARG,DEGET,$POLSH,DEFORE ;---DEMXMN--- ;CALL: JSR PC,DEMXMN ; ADR OF 'TYPE/#' OF BUF IN R1 ; ST.PT. WITHIN BUFR' BGT DEMMN1 ;NOT DONE YET DEMMN5: RTS PC ;BYE,BYE DEMMSV: 0,0 ;---DEEOL--- ;CALL: JSR R5,DEEOL ; .BYTE A,B WHERE IN R0, USED BY 'DEGET' ; (#PTS-1) TO SEARCH IN R5 ;THIS ROUTINE FINDS THE MAX /MIN VALUES OF A ;BUFFER GIVEN THE STA A= AN OFFSET TO 'DECMD' ; AND B=AN OFFSET TO DECMD1 ;THE PURPOSE OF THIS ROUTINE IS TO CHECK IF USER ENTERED TOO ;MANY BURTING PT AND # PTS TO SEARCH ;IN THE BUFFER. R0-R5 ARE NOT SAVED. ;MAXVAL IS IN R1,R2 AND MINVAL IS IN R3,R4 ON RTN. DEMXMFRS AND/OR CONSTANTS AS PART OF A CMD STRING DEEOL: MOVB (R5)+,R0 ;GET OFFSET TO 'DECMD' ADD #DECMD,R0 INC (R0) ;TOO MANN: MOV R1,DEMMX1 ;TYPE/# OF B MOV R1,DEMMX2 ;TYPE/# OF B JSR R5,@#DEGET ;GET 1ST/ DATUM DEMMX1: 0 ;PTR TO 'TYPE/#' OF B Y BUFRS? BEQ DEEOL1 ;NO MOV #52.,R0 ;YES BR DEEOL2 DEEOL1: MOVB (R5)+,R0 ;GET OFFSET TO 'DECMD1' BMI DEEOL3 ;IF NEG, MOV (SP),R1 MOV (SP)+,R3 ;MAXVAL: R1=H.ORD,R2=L.ORD MOV (SP),R2 ;MINVAL=MAXVAL TO START WITH MOV (SP)+,R4 TST R5 ;M OMIT THIS PART OF CHK ADD #DECMD1,R0 INC (R0) ;TOO MANY CONSTANTS? BEQ DEEOL3 ;NO MOV #53.,R0 ;YES DEEOL2: JMP @#DE.TITLE SPMXMN ;LAB APPLICATIONS-11 ;DEC-11-SLABA-C-LA ;FILE ID SPMXMN.1 ;FILE: SPMXMN.MAC ;COPYRIGHT (C) 1974,1975 ;DIGIAYBE WE ARE DONE BEQ DEMMN5 DEMMN1: INC R0 ;BMP BUF INDEX PTR JSR PC,@#SAVARG ;POLSH DONT SAV REGS. JSR R5,@#DEGET ;GET TAL EQUIPMENT CORPORATION, MAYNARD, MASS. ;THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A ;SINGLE COMPUTER SYSNXT DATUM DEMMX2: 0 ;PTR TO 'TYPE/#' OF B MOV (SP)+,DEMMSV ;SAVE FL.PT. RESULT MOV (SP),DEMMSV+2 ; ALSO MOV DEMMSV,-(SPTEM AND MAY BE COPIED ONLY WITH THE INCLUSION ;OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANY OTHER COPIES ;THEREOF, MAY) ;LEAVE RESULT ON STACK. MOV R2,-(SP) ;PUT MAXVAL ON STACK MOV R1,-(SP) JSR R4,@#$POLSH ;DO A COMPARE OF $CMR ;MAXVAL NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ;OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO AGREES ;TO THES WITH .+2 ;CURRENT VALUE BMI DEMMN2 ; CURRENT VALUE= MAXVAL ME LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE SOFTWARE ;SHALL AT ALL TIMES REMAIN IN DEC. ;THE INFORMATION IN THIS DOCUMENTOV DEMMSV+2,R2 ;REPLACE MAXVAL BR DEMMN4 DEMMN2: JSR PC,@#RSTARG ;POLSH DESTROYS REGS. JSR PC,@#SAVARG MOV DEMMSV+2,-(SP) IS SUBJECT TO CHANGE ;WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A ;COMMITMENT BY DIGITAL EQUIPMENT CORPORATION. ;DEC A ;PUT CURRENT VALUE BACK MOV DEMMSV,-(SP) ;ON STACK MOV R4,-(SP) ;PUT MINVAL ON STACK MOV R3,-(SP) JSR R4,@#$POLSH ;DO ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ;ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. ;LDP SOFTW COMPARE OF $CMR ;MINVAL WITH .+2 ;CURRENT VALUE BPL DEMMN3 ;CURRENT VALUE >= MINVAL JSR PC,@#RSTARG ;CURRENT VALUEARE DEVELOPMENT, 1974-5 ; CARL RALSTON .GLOBL SAVARG,RSTARG,DEGET,$POLSH,$CMR .GLOBL DEFORE,DECMD,DECMD1 ;ROUTINES CALLED < MINVAL MOV DEMMSV,R3 ;REPLACE MINVAL MOV DEMMSV+2,R4 BR DEMMN4 DEMMN3: JSR PC,@#RSTARG DEMMN4: DEC R5 ;DECR 'DONE CTHER COPIES ;THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ;OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM AND TOFLAG= 1 .MACRO TBL,A,B,C,D,E,F,G,H .WORD A .ENDM .ENDC .IF EQ,F.MAXN-2048. MFLAG= 1 .MACRO TBL,A,B,C,D,E,F,G,H ONE WHO AGREES ;TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE SOFTWARE ;SHALL AT ALL TIMES REMAIN IN DEC. ;THE INF .WORD A,E .ENDM .ENDC .IF EQ,F.MAXN-4096. MFLAG= 1 .MACRO TBL,A,B,C,D,E,F,G,H .WORD A,C,E,G .ENDM .ENDC .ORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE ;WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A ;COMMITMENT BY DIGITAL EQUIPMEIF EQ,F.MAXN-8192. MFLAG= 1 .MACRO TBL,A,B,C,D,E,F,G,H .WORD A,B,C,D,E,F,G,H .ENDM .ENDC .IF NDF,MFLAG .ERROR F.NT CORPORATION. ;DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ;ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIEMAXN;F.MAXN MUST BE 1024, 2048, 4096, OR 8192 .ENDC .SBTTL FFT INITALIZATION ;ERROR IN PARAMETERS F.ERR: JMP F.EXIT D BY DEC. ;LDP SOFTWARE DEVELOPMENT, 1974-5 ; BOB DAY DEC. 1972 ; LARRY PEARSON SEPT. 1973 ; CARL RALSTON MAR. 1975 ;D ;CALLING SEQUENCE: ; JSR R5,FFTC ; N-2-. ;PIC ARGUMENT POINTER ; ... ; ... ;N: VALUE ;CONTAINS NUMBER OF POINTS ;REPEFINITIONS ;R0 DEFINED IS INTERPRETED AS MEANING A SOURCE IS ;ASSEMBLED WITH FFTC AND PRECEEDS IT. IN THIS CASE, ;FFTC IS : POINTER ;CONTAINS ADDR OF REAL ARRAY ;IMP: POINTER ;CONTAINS ADDR OF IMAG ARRAY ;INV: VALUE ;CONTAINS TRANSFORM DIRECTIONNOT GLOBALIZED. .IF NDF,R0 .GLOBL FFTC R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 .ENDC .SBTTL ; ;=0 FWRD, =1 INVRS TRANSFORM ;SCLF: VARIABLE ;SCALE FACTOR. NUMBER OF TIMES DIVIDED BY 2 FFTC: MOV R1,-(SP) ;SAVE REFAST FOURIER TRANSFORM DEFINITIONS .IIF NDF,EAE,EAE=0 ;0 - NON-EAE, 1 - EAE .IIF NDF,EIS,EIS=0 ;0 - NON-EIS, 1 - EIS .IIGISTERS MOV R2,-(SP) MOV R3,-(SP) MOV R4,-(SP) ;CONVERT ARGUMENT TO AN ADDRESS. ARGUMENT IS OF ;THE FOLLOWING FORM: FORE DEEOL3: RTS R5 .END F NDF,NON,NON=1-EAE-EIS ;NON>0 FOR SOFTWARE MULTIPLY .IIF NDF,F.MAXN,F.MAXN=1024. ;MAXIMUM NUMBER OF POINTS ;THIS SUBROUTINE CAN PROCESS F.HMXN= F.MAXN/2 ;HALF MAXN .IFGT EAE F.PROD= 177302 F.MPLI= 177304 F.MCND= 177306 F.SHFT= 177316 .TITLE FFT ;LAB APPLICATIONS-11 FAST FOURIER TRANSFORM SUBROUTINE ;DEC-11-SLABA-C-LA2 ;FILE FFT.MAC ;FILE ID FFT.1 ;COPYR .ENDC ;MPYCNT IS AN OPTIMIZATION VARIABLE FOR PROCESSORS WITHOUT ;HARDWARE MULTIPLY. IT MAY BE LEGALLY DEFINED AS ONE OF IGHT (C) 1974,1975 ;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ;THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY O ;THE FOLLOWING OCTAL VALUES: 1, 2, 4, 10, OR 20. TO MINIMIZE ;STOREAGE REQUIREMENTS, SET MPYCNT=20 TO MAXIMIZE SPEED, ;SET N A ;SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLUSION ;OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANY OTMPYCNT=1. SEE THE MULTIPLY SUBROUTINE FOR MORE DETAILS. .IIF NDF,MPYCNT,MPYCNT=1 ;MAXIMUM SPEED .IF EQ,F.MAXN-1024. M IMAGINARY ARRAY F.IMP: 0 MOV (R0)+,(PC)+ ;=0 FOR FWRD, =1 FOR INVRS XFORM F.INV: 0 MOV R0,(PC)+ ;POINTER TO SCALE FACTOR INTER TO TOP HALF SUBGROUP F.A1: 0 MOV F.M,(PC)+ ;POINTER TO BOTTOM HALF SUBGROUP F.A2: 0 MOV F.LL,(PC)+ ;NUMBER OF SUBGRO F.SCLF: 0 MOV R5,-(SP) ;SAVE R5 FOR RETURN CLR R0 ;R0 USED FOR ERROR RETURN ;TEST FOR LEGAL VALUE OF N INC R0 ;SETUPS PER COL F.K: 0 F.NXTS: CLR (PC)+ ;START NEXT SUBGROUP F.H: 0 ;POWER OF W CLR (PC)+ ;J IS ADRS INDEX - STEP BY 2'S ERROR FOR ZERO N TST R3 ;TEST N BLE F.ERR INC R0 ;SET ERROR FOR N TOO BIG CMP #F.MAXN,R3 ;N GT MAX VALUE? BLT F.ERRF.J: 0 MOV F.A1,R2 ;SET UP SUBGP HALF ADDRESSES MOV R2,R4 ADD F.REP,R2 ;R2 POINTS TO 1ST HALF REAL ADD F.IMP,R4 ;R4 POI ;JMP IF ERROR INC R0 ;SET ERROR FOR N NOT A POWER OF 2 MOV R3,R1 ;CALCULATE POWER OF 2 & CLR R4 ;TEST N. COMPUTE R INTS TO 1ST HALF IMAG MOV F.A2,R3 ; " MOV R3,R5 ADD F.REP,R3 ;R3 POINTS TO 2ND HALF REAL ADD F.IMP,R5 ;R5 POINTS TON XR4 F.IN2: ROR R1 BCS F.IN3 INC R4 BR F.IN2 F.IN3: BNE F.ERR ;JMP IF N NOT PWR OF 2 INC R0 ;SET ERROR FOR N LESS T 2ND HALF IMAG F.SBGP: F.ORT1: MOV @R2,R0 ;GET 1ST HALF, REAL MOV @R4,R1 ;GET 1ST HALF, IMAG MOV R0,-(SP) ;TEMP ADD @RHAN 8 SUB #2,R4 ;ADJUST R FOR MAIN LOOP BLE F.ERR ;JMP IF N LT 8 MOV R4,(PC)+ ;STASH R F.R: 0 ;(LOG N)-2 ;CALCULAT3,(SP) ;DON'T ADD DIRECTLY, SINCE YOU BVS F.OFL4 ;DON'T WANT TO ALTER THE DATA MOV R1,-(SP) ;TEMP ADD @R5,(SP) ;BEFORE CHE INCREMENT FOR THE TRIG TABLE CLR R1 MOV #F.MAXN/2,R2 F.IN4: ASR R2 INC R1 CMP R4,R1 BGT F.IN4 MOV R2,(PC)+ ;TRIECKING FOR OVERFLOW BVS F.OFL2 SUB @R3,R0 ;FORM SR-TR BVS F.OFL2 SUB @R5,R1 ;FORM SI-TI BVS F.OFL2 MOV R2,-(SP) ;SG TABLE INCREMENT F.HH: 0 CLR @F.SCLF ;INITIALIZE SCALE FACTOR .SBTTL FFT MAIN LOOP PROCESSING F.MAIN: MOV #1,(PC)+ ;AVE REGISTERS 2-5 MOV R3,-(SP) MOV R4,-(SP) MOV R5,-(SP) MOV F.TRGP,R4 ;ADDR OF TRIG TBLE TO XR4 MOV R4,R5 CMP F.H,#1 SUBGROUP IN FIRST COLUMN F.LL: 0 ;# OF SUBGROUPS WITHIN COLUMN ASL R3 ;XR3 CONTAINS N. ADDRESSES ;GO BY 2'S MOV RF.HMXN ;LOOK UP SINE AND COSINE BLE F.HOP1 ;(2 BYTES = 1 WORD) SUB F.H,R4 ;H GT 512 MOV F.MAXN(R4),R3 ;SINE ADD F.H,R53,(PC)+ ;M IS POINTER TO NEXT SUBGP F.M: 0 MOV #F.ORT1-F.NXTI,F.ORTN ;SET UP RETURN FROM OFLOW RTN MOV R4,(PC)+ ;XR4 CONTAI MOV -F.HMXN(R5),R2 ;COSINE NEG R2 ;NEGATE COSINE BR F.HOP2 F.HOP1: ADD F.H,R4 ;H LE 512 MOV (R4),R3 ;SINE SUB F.HNS R. START MAIN F.L: 0 ;LOOP:(LOG N)-2 TIMES MOV PC,R0 ;ADDR OF F.REF1 TO R0 ADD #F.TRIG-.,R0 ;COMPUTE ADDR OF F.TRIG ,R5 MOV F.HMXN(R5),R2 ;COSINE F.HOP2: TST F.INV BEQ F.HOP3 ;NO, SKIP NEG R3 ;YES, NEGATE SINE .SBTTL FFT EAE CONDITI; ARGN-.-2 MOV (R5)+,R0 ; ARGN-.-2 TO R0 AND INCR R5 ADD R5,R0 ;COMPUTE ARGN MOV (R0)+,R3 ;GET NUMBER OF POINTS MOV R MOV R0,(PC)+ ;SAVE IT FOR TABLE LOOK-UP F.TRGP: 0 BR F.SKP8 F.OFL2: TST (SP)+ ;CLEAR STACK F.OFL4: TST (SP)+ JMP F.OFL3,(PC)+ ;STASH IT F.N: 0 ;NUMBER OF DATA PTS MOV (R0)+,(PC)+ ;POINTER TO REAL ARRAY F.REP: 0 MOV (R0)+,(PC)+ ;POINTER TO F.SKP8: F.NXTC: MOV F.M,(PC)+ ;OFFSET OF NEXT SUBGROUP F.ORG: 0 ;ORGIN OF EACH SUBGROUP ASR F.M ;M=M/2 CLR (PC)+ ;POJMP F.SBGP ; " F.SKP4: ADD F.ORG,F.A1 ;INIT FOR NEXT SUBGROUP ADD F.ORG,F.A2 DEC F.K BLE F.SKP5 ;GO DO NEXT SUBGRMENT POINTERS MOV R5,(R2)+ MOV R4,(R3)+ DEC (SP) BGT F.SPL1 TST (SP)+ ;CLEAR STACK ;END OF FIRST SPECIAL LOOP ONAL CODE F.HOP3: .IF GT,EAE MOV #F.PROD,R5 MOV #F.MPLI,R4 MOV R2,(R4)+ ;FORM 2ND HALF SUBGROUP ENTRY MOV R0,(R4) OUP JMP F.NXTS ; " F.SKP5: ASL F.LL ;#SUBGPS IS DOUBLE FOR NEXT COL ASL F.HH ;LOC. IN TRIG TBL IS DOUBLE TOO DEC INC @#F.SHFT MOV @R5,F.TRT MOV R3,-(R4) MOV R1,@#F.MCND INC @#F.SHFT ADD @R5,F.TRT BVS F.OFLO MOV R2,(R4)+ MOVF.L BLE F.SKP1 ;GO DO NEXT COLUMN JMP F.NXTC ; " F.OFLO: .IF GT NON CMP (SP)+,(SP)+ ;CLEAR STACK .ENDC F. R1,(R4) INC @#F.SHFT MOV @R5,R1 MOV R3,-(R4) MOV R0,@#F.MCND INC @#F.SHFT SUB @R5,R1 BVS F.OFLO .ENDC .SBTTOFLR: MOV (SP)+,R5 ;RESTORE REGISTERS MOV (SP)+,R4 MOV (SP)+,R3 MOV (SP)+,R2 CMP (SP)+,(SP)+ ;CLEAR STACK JMP F.OFL ;L FFT EIS CONDITIONAL CODE .IF GT,EIS MOV R2,R4 ;FORM 2ND HALF SUBGROUP ENTRY MUL R0,R4 ASHC #1,R4 ;LONG ARITHMATIC JUMP TO OVERFLOW ROUTINE .SBTTL FFT FIRST SPECIAL LOOP ;DONE WITH (LOG N)-2 COLUMNS ;NOW DO 2 SPECIAL LOOPS ;FIRST SPECISHIFT LEFT 1 MOV R4,F.TRT MOV R3,R4 MUL R1,R4 ASHC #1,R4 ADD R4,F.TRT BVS F.OFLO MOV R2,R4 MUL R1,R4 ASHC #1,AL LOOP F.SKP1: MOV F.N,-(SP) ;K=N/4 ASR (SP) MOV (SP),-(SP) ASR (SP) MOV F.REP,R2 ;R2 KEEPS TRACK OF CURRENT FOUR RER4 MOV R4,R1 MOV R3,R4 MUL R0,R4 ASHC #1,R4 SUB R4,R1 BVS F.OFLO .ENDC .SBTTL FFT NON CONDITIONAL CODE .IFAL MOV F.IMP,R3 ;R3 KEEPS TRACK OF CURRENT FOUR IMAG F.SPL1: MOV #F.ORT2-F.NXTI,F.ORTN ;SET UP OVERFLOW ROUTINE F.ORT2: MOV GT,NON MOV R3,-(SP) ;PUT SIN & COS ON THE STACK MOV R2,-(SP) MOV R2,R5 ;FORM 2ND HALF SUBGROUP ENTRY MOV R0,R4 JSR P@R2,R0 MOV @R3,R1 MOV R0,R4 MOV R1,R5 ADD 4(R2),R0 ;REAL PART OF FIRST HALF BVS F.OFL1 ADD 4(R3),R1 ;IMAG PART OF FIC,F.MUL MOV R3,F.TRT MOV 2(SP),R5 MOV R1,R4 JSR PC,F.MUL ADD R3,F.TRT BVS F.OFLO MOV (SP)+,R5 MOV R1,R4 JSR PCRST HALF BVS F.OFL1 SUB 4(R2),R4 ;1ST POINT IN 2ND HALF OF SBGP BVS F.OFL1 SUB 4(R3),R5 BVS F.OFL1 MOV R0,(R2)+ ;STO,F.MUL MOV R3,R1 MOV (SP)+,R5 MOV R0,R4 JSR PC,F.MUL SUB R3,R1 BVS F.OFLR .ENDC .SBTTL FFT END-OF-MAIN-LOOP CORE THE POINTS MOV R1,(R3)+ MOV R4,2(R2) MOV R5,2(R3) MOV #F.ORT4-F.NXTI,F.ORTN ;SET UP OVERFLOW ROUTINE F.ORT4: MOV (R2DE MOV (SP)+,R5 ;RESTORE REGISTERS MOV (SP)+,R4 MOV (SP)+,R3 MOV (SP)+,R2 MOV (SP)+,(R4)+ ;INSERT TRANSFORMED POINTS),R0 ;DO 2ND POINTS IN SUBGROUP MOV (R3),R1 MOV R0,R4 MOV R1,R5 ADD 4(R2),R0 BVS F.OFL1 ADD 4(R3),R1 BVS F.OFL1 MOV (SP)+,(R2)+ ; " MOV (PC)+,(R3)+ ; " F.TRT: 0 ;TEMPORARY MOV R1,(R5)+ ;INSERT TRANFORMED PTS ADD F.HH,F.H SUB 4(R3),R5 ;REAL PART BVS F.OFL1 NEG R4 ADD 4(R2),R4 ;IMAGINARY PART BVS F.OFL1 TST F.INV BEQ F.SP11 ;NO, SKIP ;INCREMENT POWER OF W ADD #2,F.J ;INC POINTER W/IN SUBGROUP CMP F.M,F.J BLE F.SKP4 ;CONTINUE XFORM OF THE SUBGROUP NEG R5 ;YES, NEGATE BOTTOM POINT NEG R4 ; " F.SP11: MOV R0,(R2)+ ;STORE THE POINTS MOV R1,(R3)+ CMP (R2)+,(R3)+ ;INCRE(SP)+,R5 ;RESTORE REGISTERS MOV (SP)+,R4 MOV (SP)+,R3 MOV (SP)+,R2 MOV (SP)+,R1 RTS R5 ;MAIN EXIT. R0 CONTAINS ERROR OF PRODUCT ADC R3 ;DO A DOUBLE PRECISION NEGATE NEG R3 F.MUL5: RTS PC .ENDC .SBTTL FFT SINE/COSINE TABLE ;SINE/COSINNO. .SBTTL FFT OVERFLOW SCALING ROUTINE ;OVERFLOW ROUTINE F.OFL: MOV R5,-(SP) MOV R2,-(SP) MOV R3,-(SP) MOV F.N,R5 E TABLE F.TRIG: TBL 00000,00031,00062,00113,00145,00176,00227,00260 TBL 00311,00342,00373,00424,00456,00507,00540,00571 TB ASR R5 ;DO 4 COMPLEX POINTS AT A TIME TO ASR R5 ;REDUCE LOOP OVERHEAD MOV F.REP,R2 MOV F.IMP,R3 F.OFLP: .REPT 4 AL 00622,00653,00704,00736,00767,01020,01051,01102 TBL 01133,01164,01215,01247,01300,01331,01362,01413 TBL 01444,01475,01526,01SR (R2)+ ASR (R3)+ .ENDR DEC R5 BNE F.OFLP MOV (SP)+,R3 MOV (SP)+,R2 INC @F.SCLF MOV PC,R5 ;SET R5 TO F.NXTI F560,01611,01642,01673,01724 TBL 01755,02006,02037,02071,02122,02153,02204,02235 TBL 02266,02317,02350,02401,02433,02464,02515,.SBTTL FFT SECOND SPECIAL LOOP ;SECOND SPECIAL LOOP BR F.SKP3 F.OFL1: JMP F.OFL F.SKP3: MOV F.REP,R2 MOV F.IMP,R3 MOV.NXTI: ADD (PC)+,R5 ;COMPUTE RESTART ADDRESS (RTN) F.ORTN: 0 ;CONTAINS "RTN-F.NXTI" WHERE RTN ;IS THE RESTART LOCATION #F.ORT3-F.NXTI,F.ORTN ;SET UP OVERFLOW RETURN F.SPL2: F.ORT3: MOV @R2,R0 MOV @R3,R1 MOV R0,R4 MOV R1,R5 ADD 2(R2),R0 RTS R5 ;RESTORES R5 AND XFERS TO RTN .SBTTL FFT SOFTWARE MULTIPLY SUBROUTINE ;MULTIPLY SUBROUTINE FOR FFT .IF GT,NON BVS F.OFL1 ADD 2(R3),R1 BVS F.OFL1 SUB 2(R2),R4 BVS F.OFL1 SUB 2(R3),R5 BVS F.OFL1 MOV R0,(R2)+ MOV R1,(R3)+ F.MUL: CLR R3 ;CLEAR PRODUCT SIGN TST R4 BPL F.MUL1 ;JUMP IF MULTIPLIER PLUS INC R3 ;NOTE MINUS NEG R4 ;MAKE PLUS MOV R4,(R2)+ MOV R5,(R3)+ DEC @SP BNE F.SPL2 TST (SP)+ ;CLEAR STACK ;END OF SECOND SPECIAL LOOP .SBTTL FFT BIT RF.MUL1: TST R5 BPL F.MUL2 ;JUMP IF MULTIPLICAND PLUS INC R3 ;NOTE MINUS NEG R5 ;MAKE PLUS F.MUL2: MOV R3,(PC)+ ;SAVE SEVERSAL ;DO BIT REVERSAL MOV #1,R2 MOV F.N,R5 ;ROUTINE TO REVERSE R+2 BITS F.REVS: MOV R2,R4 ;TEMPORARY ADD R5,IGN OF PRODUCT F.MULS: 0 CLR R3 ;CLEAR HIGH ORDER PRODUCT .IF NE,MPYCNT-1 ;NO LOOPING IF MPYCNT=1 MOV #MPYCNT,R2 ;SET LOR4 ;SET MARKER CLR R3 ;R3 HOLDS REVERSED BITS ASR R4 F.REV1: ROL R3 ;REVERSE THE BITS ASR R4 ; " BNE F.REV1 ; " OP COUNT F.MUL3: ROR R3 ;SHIFT PRODUCT .ENDC ROR R4 ;SHIFT MULTIPLIER BCC .+4 ;JUMP IF MULTIPLIER BIT ZERO ADD R5,R3CMP R3,R2 BLE F.NSCR ASL R2 ASL R3 MOV F.REP,R0 ;SWAP REAL VALUES MOV R0,R1 ADD R2,R0 ADD R3,R1 MOV @R0,R4 MOV ;ADD IN MULTIPLICAND .REPT <20/MPYCNT>-1 ROR R3 ;SHIFT PRODUCT ROR R4 ;SHIFT MULTIPLIER BCC .+4 ;JUMP IF MULTIPLIER @R1,@R0 MOV R4,@R1 MOV F.IMP,R0 ;SWAP IMAG VALUES MOV R0,R1 ADD R2,R0 ADD R3,R1 MOV @R0,R4 MOV @R1,@R0 MOV R4,@ BIT ZERO ADD R5,R3 ;ADD IN MULTIPLICAND .ENDR .IF NE,MPYCNT-1 ;NO LOOPING IF MPYCNT=1 DEC R2 ;DECREMENT LOOP CNT BNR1 ASR R2 F.NSCR: INC R2 CMP R5,R2 BGT F.REVS ;ALL DONE - RETURN TO CALLER CLR R0 ;CLEAR ERROR FLAG F.EXIT: MOV E F.MUL3 ;JUMP IF MORE TO GO .ENDC ROR F.MULS ;GET SIGN BCC F.MUL5 ;JUMP IF ANSWER IS PLUS NEG R4 ;NEGATE LOW ORDER 44,10275,10326,10357,10410,10441 TBL 10472,10523,10554,10605,10636,10666,10717,10750 TBL 11001,11032,11063,11114,11145,11175,124266,24316 TBL 24345,24375,24425,24455,24505,24534,24564,24614 TBL 24644,24674,24723,24753,25003,25033,25062,25112 TBL 251421226,11257 TBL 11310,11341,11372,11423,11453,11504,11535,11566 TBL 11617,11650,11701,11731,11762,12013,12044,12075 TBL 12125,,25171,25221,25251,25301,25330,25360,25410 TBL 25437,25467,25517,25546,25576,25625,25655,25705 TBL 25734,25764,26014,26043,26012156,12207,12240,12271,12321,12352,12403 TBL 12434,12465,12515,12546,12577,12630,12661,12711 TBL 12742,12773,13024,13054,131073,26122,26152,26201 TBL 26231,26261,26310,26340,26367,26417,26446,26476 TBL 26525,26555,26604,26634,26663,26713,26742,26772 5,13136,13167,13217 TBL 13250,13301,13332,13362,13413,13444,13474,13525 TBL 13556,13607,13637,13670,13721,13751,14002,14033 TTBL 27021,27050,27100,27127,27157,27206,27236,27265 TBL 27314,27344,27373,27423,27452,27501,27531,27560 TBL 27607,27637,27666,BL 14063,14114,14145,14175,14226,14257,14307,14340 TBL 14371,14421,14452,14503,14533,14564,14615,14645 TBL 14676,14726,14757,127715,27745,27774,30023,30052 TBL 30102,30131,30160,30210,30237,30266,30315,30345 TBL 30374,30423,30452,30501,30531,30560,30605010,15040,15071,15121,15152 TBL 15203,15233,15264,15314,15345,15376,15426,15457 TBL 15507,15540,15570,15621,15651,15702,157327,30636 TBL 30665,30714,30744,30773,31022,31051,31100,31127 TBL 31156,31205,31235,31264,31313,31342,31371,31420 TBL 31447,314,15763 TBL 16014,16044,16075,16125,16156,16206,16237,16267 TBL 16320,16350,16401,16431,16461,16512,16542,16573 TBL 16623,166576,31525,31554,31603,31632,31661,31710 TBL 31737,31766,32015,32044,32073,32122,32151,32200 TBL 32227,32255,32304,32333,32362,302546 TBL 02577,02630,02661,02712,02743,02775,03026,03057 TBL 03110,03141,03172,03223,03254,03305,03336,03370 TBL 03421,034524,16704,16735,16765,17016,17046,17076 TBL 17127,17157,17210,17240,17270,17321,17351,17402 TBL 17432,17462,17513,17543,17573,17,03503,03534,03565,03616,03647,03700 TBL 03731,03762,04014,04045,04076,04127,04160,04211 TBL 04242,04273,04324,04355,04406,044624,17654,17705 TBL 17735,17765,20016,20046,20076,20127,20157,20207 TBL 20237,20270,20320,20350,20401,20431,20461,20511 TBL 237,04470,04521 TBL 04553,04604,04635,04666,04717,04750,05001,05032 TBL 05063,05114,05145,05176,05227,05260,05311,05342 TBL 050542,20572,20622,20652,20703,20733,20763,21013 TBL 21044,21074,21124,21154,21204,21235,21265,21315 TBL 21345,21375,21426,21456373,05424,05455,05507,05540,05571,05622,05653 TBL 05704,05735,05766,06017,06050,06101,06132,06163 TBL 06214,06245,06276,06327,,21506,21536,21566,21616 TBL 21647,21677,21727,21757,22007,22037,22067,22117 TBL 22147,22200,22230,22260,22310,22340,22370,22406360,06411,06442,06473 TBL 06524,06555,06606,06637,06670,06721,06752,07003 TBL 07034,07065,07116,07147,07200,07231,07262,073120 TBL 22450,22500,22530,22560,22610,22640,22670,22720 TBL 22750,23000,23030,23060,23110,23140,23170,23220 TBL 23250,23300,233 TBL 07344,07374,07425,07456,07507,07540,07571,07622 TBL 07653,07704,07735,07766,10017,10050,10101,10132 TBL 10163,10214,102330,23360,23410,23440,23470,23520 TBL 23550,23600,23627,23657,23707,23737,23767,24017 TBL 24047,24077,24126,24156,24206,24236,052 TBL 35100,35127,35155,35203,35232,35260,35306,35335 TBL 35363,35411,35440,35466,35514,35542,35571,35617 TBL 35645,35673,347350,47373,47417,47443,47467,47512 TBL 47536,47562,47605,47631,47655,47700,47724,47750 TBL 47773,50017,50043,50066,50112,50135722,35750,35776,36024,36052,36101 TBL 36127,36155,36203,36231,36257,36305,36334,36362 TBL 36410,36436,36464,36512,36540,365665,50161,50204 TBL 50230,50254,50277,50323,50346,50371,50415,50440 TBL 50464,50507,50533,50556,50601,50625,50650,50673 TBL 507,36614,36642 TBL 36670,36716,36744,36772,37020,37046,37074,37122 TBL 37150,37176,37224,37252,37300,37326,37354,37401 TBL 374217,50742,50765,51011,51034,51057,51103,51126 TBL 51151,51174,51220,51243,51266,51311,51334,51357 TBL 51403,51426,51451,51474,57,37455,37503,37531,37557,37605,37632,37660 TBL 37706,37734,37761,40007,40035,40063,40110,40136 TBL 40164,40212,40237,40265,401517,51542,51565,51610 TBL 51633,51656,51701,51724,51747,51772,52015,52040 TBL 52063,52106,52131,52154,52177,52221,52244,52267313,40340,40366,40414 TBL 40441,40467,40515,40542,40570,40615,40643,40671 TBL 40716,40744,40771,41017,41044,41072,41117,41145 TBL 52312,52335,52360,52402,52425,52450,52473,52516 TBL 52540,52563,52606,52630,52653,52676,52720,52743 TBL 52766,53010,530 TBL 41172,41220,41245,41273,41320,41346,41373,41420 TBL 41446,41473,41521,41546,41573,41621,41646,41673 TBL 41721,41746,4177333,53055,53100,53123,53145,53170 TBL 53212,53235,53257,53302,53324,53347,53371,53414 TBL 53436,53460,53503,53525,53547,53572,5,42021,42046,42073,42120,42146 TBL 42173,42220,42245,42272,42320,42345,42372,42417 TBL 42444,42471,42517,42544,42571,42616,4263614,53637 TBL 53661,53703,53725,53750,53772,54014,54036,54061 TBL 54103,54125,54147,54171,54214,54236,54260,54302 TBL 54324,43,42670 TBL 42715,42742,42767,43014,43041,43066,43113,43140 TBL 43165,43212,43237,43264,43311,43336,43363,43410 TBL 43435,4354346,54370,54412,54434,54456,54500,54522 TBL 54544,54566,54610,54632,54654,54676,54720,54742 TBL 54764,55006,55030,55051,5507462,43507,43534,43560,43605,43632,43657 TBL 43704,43731,43755,44002,44027,44054,44100,44125 TBL 44152,44177,44223,44250,44275,3,55115,55137,55161 TBL 55202,55224,55246,55270,55311,55333,55355,55377 TBL 55420,55442,55464,55505,55527,55550,55572,55614 T44321,44346,44373 TBL 44417,44444,44471,44515,44542,44566,44613,44640 TBL 44664,44711,44735,44762,45006,45033,45057,45104 TBLBL 55635,55657,55700,55722,55743,55765,56006,56030 TBL 56051,56072,56114,56135,56157,56200,56221,56243 TBL 56264,56305,56327,52411,32440,32467 TBL 32516,32544,32573,32622,32651,32700,32727,32755 TBL 33004,33033,33062,33110,33137,33166,33215,33243 TBL 45130,45155,45201,45225,45252,45276,45323,45347 TBL 45373,45420,45444,45470,45515,45541,45565,45612 TBL 45636,45662,45707,45733272,33321,33350,33376,33425,33454,33502,33531 TBL 33560,33606,33635,33664,33712,33741,33767,34016 TBL 34045,34073,34122,341533,45757,46003,46027,46054 TBL 46100,46124,46150,46174,46221,46245,46271,46315 TBL 46341,46365,46411,46435,46461,46505,46531,40,34177,34225,34254,34302 TBL 34331,34360,34406,34435,34463,34511,34540,34566 TBL 34615,34643,34672,34720,34747,34775,35023,356555 TBL 46601,46625,46651,46675,46721,46745,46771,47015 TBL 47041,47065,47111,47135,47161,47204,47230,47254 TBL 47300,47324,6350,56371,56413,56434,56455 TBL 56476,56520,56541,56562,56603,56624,56645,56667 TBL 56710,56731,56752,56773,57014,57035,570561,66027 TBL 66044,66062,66077,66114,66132,66147,66165,66202 TBL 66217,66235,66252,66267,66304,66322,66337,66354 TBL 66371,664,57077 TBL 57120,57141,57162,57203,57224,57245,57266,57307 TBL 57327,57350,57371,57412,57433,57454,57474,57515 TBL 57536,575506,66424,66441,66456,66473,66510,66525 TBL 66542,66557,66574,66611,66626,66643,66660,66675 TBL 66712,66727,66744,66761,66776,67,57600,57620,57641,57662,57702,57723 TBL 57744,57764,60005,60026,60046,60067,60107,60130 TBL 60150,60171,60211,60232,60252,607012,67027,67044 TBL 67061,67076,67112,67127,67144,67161,67175,67212 TBL 67227,67243,67260,67275,67311,67326,67342,67357 TBL 273,60313,60334 TBL 60354,60375,60415,60435,60456,60476,60516,60537 TBL 60557,60577,60620,60640,60660,60700,60721,60741 TBL 667373,67410,67424,67441,67455,67472,67506,67523 TBL 67537,67553,67570,67604,67620,67635,67651,67665 TBL 67702,67716,67732,67740761,61001,61021,61041,61062,61102,61122,61142 TBL 61162,61202,61222,61242,61262,61302,61322,61342 TBL 61362,61402,61422,614426,67762,67777,70013,70027 TBL 70043,70057,70073,70107,70123,70137,70153,70167 TBL 70203,70217,70233,70247,70263,70277,70313,70,61462,61502,61521,61541 TBL 61561,61601,61621,61640,61660,61700,61720,61737 TBL 61757,61777,62017,62036,62056,62076,62115,621327 TBL 70343,70357,70372,70406,70422,70436,70452,70465 TBL 70501,70515,70530,70544,70560,70573,70607,70623 TBL 70636,70652,735 TBL 62154,62174,62213,62233,62253,62272,62312,62331 TBL 62351,62370,62407,62427,62446,62466,62505,62524 TBL 62544,62563,620665,70701,70714,70730,70743,70757 TBL 70772,71006,71021,71034,71050,71063,71077,71112 TBL 71125,71140,71154,71167,71202,71215602,62622,62641,62660,62700,62717 TBL 62736,62755,62774,63014,63033,63052,63071,63110 TBL 63127,63146,63165,63204,63223,63243,,71231,71244 TBL 71257,71272,71305,71320,71334,71347,71362,71375 TBL 71410,71423,71436,71451,71464,71477,71512,71525 TBL 715363262,63301 TBL 63320,63336,63355,63374,63413,63432,63451,63470 TBL 63507,63526,63544,63563,63602,63621,63640,63656 TBL 636757,71552,71565,71600,71613,71626,71640,71653 TBL 71666,71701,71713,71726,71741,71753,71766,72001 TBL 72013,72026,72041,72053,72,63714,63732,63751,63770,64006,64025,64044 TBL 64062,64101,64120,64136,64155,64173,64212,64230 TBL 64247,64265,64304,64322,643066,72100,72113,72125 TBL 72140,72152,72165,72177,72211,72224,72236,72250 TBL 72263,72275,72307,72322,72334,72346,72360,72373 40,64357,64375,64414 TBL 64432,64450,64467,64505,64523,64541,64560,64576 TBL 64614,64632,64651,64667,64705,64723,64741,64757 TBL 72405,72417,72431,72443,72455,72470,72502,72514 TBL 72526,72540,72552,72564,72576,72610,72622,72634 TBL 72646,72657,72671TBL 64775,65013,65032,65050,65066,65104,65122,65140 TBL 65156,65174,65211,65227,65245,65263,65301,65317 TBL 65335,65353,65370,,72703,72715,72727,72741,72752 TBL 72764,72776,73010,73021,73033,73045,73056,73070 TBL 73102,73113,73125,73136,73150,73162,73165406,65424,65442,65460,65475 TBL 65513,65531,65546,65564,65602,65617,65635,65652 TBL 65670,65706,65723,65741,65756,65774,660173,73205 TBL 73216,73230,73241,73252,73264,73275,73307,73320 TBL 73331,73343,73354,73365,73376,73410,73421,73432 TBL 73443,732,76310,76316,76323,76331,76336 TBL 76344,76351,76357,76364,76372,76377,76405,76412 TBL 76417,76425,76432,76437,76445,76452,767757,77760 TBL 77761,77761,77762,77763,77764,77764,77765,77766 TBL 77766,77767,77767,77770,77770,77771,77771,77772 TBL 77772,457,76464 TBL 76472,76477,76504,76511,76516,76523,76530,76535 TBL 76543,76550,76555,76562,76567,76574,76601,76605 TBL 76612,777773,77773,77774,77774,77775,77775,77775 TBL 77776,77776,77776,77776,77777,77777,77777,77777 TBL 77777,77777,77777,77777,77776617,76624,76631,76636,76643,76647,76654 TBL 76661,76666,76672,76677,76704,76711,76715,76722 TBL 76726,76733,76740,76744,767517,77777,77777,77777 .WORD 77777 .END 455,73466,73477,73510,73521,73532,73543 TBL 73554,73565,73576,73607,73620,73631,73642,73653 TBL 73664,73675,73706,73717,73730,,76755,76762,76766 TBL 76773,76777,77003,77010,77014,77021,77025,77031 TBL 77036,77042,77046,77052,77057,77063,77067,77073 TB73740,73751,73762 TBL 73773,74003,74014,74025,74036,74046,74057,74070 TBL 74100,74111,74121,74132,74143,74153,74164,74174 TBLL 77077,77103,77110,77114,77120,77124,77130,77134 TBL 77140,77144,77150,77154,77160,77164,77170,77173 TBL 77177,77203,77207,77 74205,74215,74225,74236,74246,74257,74267,74277 TBL 74310,74320,74330,74341,74351,74361,74371,74401 TBL 74412,74422,74432,744213,77216,77222,77226,77232 TBL 77235,77241,77245,77250,77254,77260,77263,77267 TBL 77272,77276,77301,77305,77310,77314,77317,42,74452,74462,74472,74502 TBL 74512,74523,74533,74542,74552,74562,74572,74602 TBL 74612,74622,74632,74642,74652,74661,74671,777323 TBL 77326,77331,77335,77340,77343,77347,77352,77355 TBL 77360,77364,77367,77372,77375,77400,77403,77406 TBL 77412,774154701 TBL 74711,74720,74730,74740,74747,74757,74767,74776 TBL 75006,75016,75025,75035,75044,75054,75063,75073 TBL 75102,75111,,77420,77423,77426,77431,77434,77437 TBL 77442,77444,77447,77452,77455,77460,77463,77466 TBL 77470,77473,77476,77501,77503,77575121,75130,75140,75147,75156,75166 TBL 75175,75204,75214,75223,75232,75241,75250,75260 TBL 75267,75276,75305,75314,75323,753306,77511,77513 TBL 77516,77520,77523,77526,77530,77533,77535,77540 TBL 77542,77545,77547,77552,77554,77556,77561,77563 TBL 772,75341,75350 TBL 75357,75366,75375,75404,75413,75422,75431,75440 TBL 75447,75456,75464,75473,75502,75511,75520,75526 TBL 755565,77570,77572,77574,77576,77601,77603,77605 TBL 77607,77611,77613,77616,77620,77622,77624,77626 TBL 77630,77632,77634,77636,35,75544,75552,75561,75570,75576,75605,75613 TBL 75622,75631,75637,75646,75654,75663,75671,75677 TBL 75706,75714,75723,75731,777640,77642,77643,77645 TBL 77647,77651,77653,77655,77656,77660,77662,77664 TBL 77665,77667,77671,77672,77674,77676,77677,77705737,75746,75754,75762 TBL 75771,75777,76005,76013,76021,76030,76036,76044 TBL 76052,76060,76066,76074,76102,76110,76116,761241 TBL 77702,77704,77705,77707,77710,77712,77713,77715 TBL 77716,77717,77721,77722,77723,77725,77726,77727 TBL 77731,77732,777 TBL 76132,76140,76146,76154,76162,76170,76176,76203 TBL 76211,76217,76225,76233,76240,76246,76254,76261 TBL 76267,76275,763033,77734,77735,77736,77740,77741 TBL 77742,77743,77744,77745,77746,77747,77750,77751 TBL 77752,77753,77754,77754,77755,77756,7N IN DEC. ;THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE ;WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A ;COMMITMETO POINT TO THE DESIRED BUFFER NUMBER - BUFFER TYPE ;BYTE PAIR IN THE DECMD LIST. R0 WILL BE INCREMENTED BY 2 ;WHEN IT RETURNNT BY DIGITAL EQUIPMENT CORPORATION. ;DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ;ITS SOFTWARE ON EQUIPMENTS. R1 MUST BE SET TO POINT TO THE FIRST ;SINGLE PRECISION BUFFER. R2 MUST BE SET TO THE BYTE ;INCREMENT BETWEEN BUFFERS. R1 WHICH IS NOT SUPPLIED BY DEC. ;LDP SOFTWARE DEVELOPMENT, 1974-5 ; LARRY PEARSON DEC. 1973 ; CARL RALSTON MAR. 1975 ;SP, R2, AND R5 ARE LEFT UNCHANGED. ;R4 CONTAINS THE ADDRESS OF THE S.P. BUFFER. C.SETA: MOVB (R0)+,R3 ;BUFFER NUMBER TO R3 TFAC$ MUST BE DEFINED IN AN ASSEMBLY FILE .IFDF SPFAC$ ;DEFINITIONS R0= %0 R1= %1 R2= %2 R3= %3 R4= %4 R5= %5 STB (R0)+ ;BUFFER TYPE MUST BE S.P. BNE C.ERR0 ;BR IF NOT S.P. MOV R1,R4 ;ADDR OF FIRST S.P. BUFFER CMPB R3,@#DEDATS ;L SP= %6 PC= %7 .IFDF CAPS$ .GLOBL FFTC,F.R,F.MUL .ENDC .GLOBL DEAC,DECC .GLOBL DECMD,DEDATA,DEDATS,DEFORE,FORMAT,EGAL BUFFER NUMBER BGT C.ERR1 ;BR IF A BAD BUFFER NUMBER C.STA1: DEC R3 ;DECR BUFFER NUMBER BEQ C.STAR ;BR IF BUFFER ADDDECMD1,DETLE .IFNDF EAE EAE=0 .ENDC .IFNDF EIS EIS=0 .ENDC .IFNDF NON NON=1-EAE-EIS .ENDC ; FORMAT COMMANR COMPUTED ADD R2,R4 ;COMPUTE ADDRESS OF NEXT BUFFER. BR C.STA1 C.STAR: RTS PC C.ERR0: BPL C.ERR2 ;BR IF FLOATING D DEFINITIONS CRLFC0= 3 ;CR-LF COMBINATION TEXT= 7 ;TEXT OUTPUT SING= 11 ;OUTPUT A S.P. DECIMAL VALUE EXIT= 0 ;EXIT INTERPRETER ; .SBTTL CORRELATION ENTRY AND INITIALIZATION ;AUTO CORRELATION ENTRY DEAC: MOV #-1,R0 ;SET FOR AUTOCORRELATI.TITLE SPCOR AUTO & CROSS ;LAB APPLICATIONS-11 CORRELATION COMMANDS ;DEC-11-SLABA-C-LA12 ;FILE SPCOR.MAC ;FILE ID SPCOR.1 .ON BR C.SETU ;CROSS CORRELATION ENTRY DECC: CLR R0 ;SET FOR CROSS CORRELATION ;SETUP ROUTINE - SAVE REGISTERS AND COCSECT SPCOR ;COPYRIGHT (C) 1974,1975 ;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ;THIS SOFTWARE IS FURNISHED UNDER A LMPUTE BUFFER ADDRESSES C.SETU: MOV R1,-(SP) ;SAVE REGISTERS MOV R2,-(SP) MOV R3,-(SP) MOV R4,-(SP) JSR R5,C.SET2 ;SAVICENSE FOR USE ONLY ON A ;SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLUSION ;OF THE ABOVE COPYRIGHT NOTICE. THIE R5 & LOAD IT WITH A PNTR ;TO THE FOLLOWING SUBROUTINE. ;SUBROUTINE TO TEST FOR S.P. BUFFERS AND TO CONVERT THEM TO ;AS SOFTWARE, OR ANY OTHER COPIES ;THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ;OTHER PERSON EXCEPT FOR USE DDRESSES. THIS SUBROUTINE MUST FOLLOW THE "JSR R5,C.SET2" ;INSTRUCTION ABOVE FOR THE "JSR PC,(R5)" INSTRUCTIONS TO WORK ;WHICON SUCH SYSTEM AND TO ONE WHO AGREES ;TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE SOFTWARE ;SHALL AT ALL TIMES REMAIH ARE USED AFTER "C.SET2:". REGISTERS R0, R1, AND R2 MUST ;BE INITIALIZED PRIOR TO CALLING THIS SUBROUTINE. R0 MUST BE ;SET @#DEDATS+2,R1 ;ADDR OF FIRST S.P. BUFFER MOV @#DEDATA+2,R2 ;NMBR OF ELEMENTS IN BUFFER ASL R2 ;MULTIPLY BY 2 FOR WORDS JSCALLS ;PERFORM TRANSFORM ON BUFFER 1 C.FF1: JSR R5,FFTC C.N1-.-2 MOV F.R,R1 ;R1 = LOG2(# POINTS)-2 CMPB (R1)+,(R1)+R PC,(R5) ;CONVERT BUFFER TYPE & # TO ADDR MOV R4,C.REP1 ;POINTER TO FIRST REAL BUFFER - SI TST (R0) ;IS BUFFER SJ SPECIFI ;R1 = LOG2(# POINTS) ASL R1 ;R1 = 2 * LOG2(# POINTS) SUB C.SCL1,R1 ;R1 = 2*LOG2(# POINTS)-SCL1 MOVB ERRTBL(R0),R0 ;TRANSED BMI C.SET3 ;BR IF NOT C.SET5: JSR PC,(R5) ;CONVERT BUFFER TYPE & NUMBER TO ADDR TST (SP) ;AUTO OR CROSS CORRELATION? LATE ANY FFT ERROR ;TO A SPARTA ERROR CODE BNE C.ERR TST (SP) ;AUTO OR CROSS CORRELATION? BNE C.CRSP ;BR IF AUTO BNE C.SET4 ;BR IF AUTO MOV R4,C.REP2 ;POINTER TO SECOND REAL BUFFER - SJ JSR PC,(R5) ;DO SAME FOR SK MOV R4,C.IMP1 ;SK ;PERFORM TRANSFORM ON BUFFER 2 JSR R5,FFTC C.N2-.-2 ;SINCE FFT TYPE ERRORS ARE FOUND IN THE CALL ABOVE, NO TEST ;IS N IS IMAG BUFFER USED WITH SI JSR PC,(R5) ;DO SAME FOR SL MOV R4,C.IMP2 ;SL IS IMAG BUFFER USED WITH SJ BR C.CLR ;GO CLEAEEDED HERE. SUB C.SCL2,R1 ;R1 = 2*LOG2(# POINTS)-SCL1-SCL2 BR C.CRSP ;GO DO CROSS POWER SPECTRUM C.ERR: TST (SP)+ ;CLR IMAG BUFFERS ; SPECIFY BUFFERS SJ, SK, AND SL C.SET3: MOV R0,R4 ;#DECMD+2 MOV R4,R3 TST -(R3) ;R3 = #DECMD MOV (EAR AUTO/CROSS CORR SWITCH FROM STACK MOV #DEFORE,12(SP) ;MAKE RETURN TO ERROR ROUTINE BR C.RTN ;FFT TO SPARTA ERROR CODER3)+,(R4)+ ;(DECMD+2)=(DECMD) INCB (R3) ;J = I + 1 TST (SP) ;AUTO OR CROSS? BNE C.SET5 ;BR IF AUTO MOV (R3)+,(R4)+ ;( CONVERSION TABLE ERRTBL: .BYTE 0,38.,39.,37.,38. .EVEN ; .SBTTL COMPUTATION OF CROSS POWER SPECTRUM - EAE VERSION ;CROSDECMD+4)=(DECMD+2) INCB (R3) ;K = I + 2 MOV (R3)+,(R4)+ ;(DECMD+6)=(DECMD+4) INCB (R3) ;L = I + 3 BR C.SET5 C.SET4:S POWER SPECTRUM OF COMPLEX FREQUENCY DOMAIN BUFFERS ;"A" (S1=REAL, S3=IMAG) AND "B" (S2=REAL, S4=IMAG) YIELDS "C" ;(S1=REAL, MOV R4,C.IMP1 TSTB (R0) ;CHECK FOR EXCESS BUF SPECS BPL C.ERR3 ;BR IF TOO MANY ; .SBTTL CLEAR IMAGINARY BUFFERS C.CLR: S2=IMAG). ;REAL(C) = REAL(A)*REAL(B) + IMAG(A)*IMAG(B) ;IMAG(C) = IMAG(A)*REAL(B) + REAL(A)*IMAG(B) C.CRSP: MOV R1,(PC)+ ;SMOV #2.,R0 ;SPECIFY A BUFFER ;COMMAND FORMAT BR C.STAE C.ERR1: MOV #47.,R0 ;BUFFER NON-EXISTENT C.STAE: TST (SP)+ ;CJSR PC,@#DETLE ;ONE LAST ERROR CHECK MOV @#DEDATA+2,R0 ;NMBR OF ELEMENTS IN BUFFER MOV C.IMP1,R1 MOV C.IMP2,R2 MOV R0,C.LEAR RTN FROM STACK BR C.ERR C.ERR2: MOV #7.,R0 ;BUFF MUST BE SP BR C.STAE C.ERR3: MOV #52.,R0 ;EXTRA BUFFER SPECIFIED N1 ;NMBR OF POINTS FOR FFT MOV R0,C.N2 MOV R0,(PC)+ ;USED IN FINAL CALCULATIONS C.TMPN: 0 ;COUNTS DOWN FROM N CLR C.IN BR C.ERR C.ERR4: MOV #53.,R0 ;UNNECESSARY CONSTANT SPECIFIED BR C.ERR C.SET2: MOV R0,-(SP) ;KEEP AUTO/CROSS CORR SWITCH OV1 ;DIRECTION OF FFT IS FWRD CLR C.INV2 TST (SP) ;AUTO OR CROSS CORR? BEQ C.CLR1 ;BR IF CROSS MOV R1,R2 ;WASTE SOME N STACK INC @#DECMD1 ;TEST FOR ANY CONST SPECIFIED BNE C.ERR4 ;BR IF ERROR MOV #DECMD,R0 ;POINTER TO COMMAND TABLE MOV TIME, SAVE SOME CORE. ;CLEAR IMAG1 TWICE. C.CLR1: CLR (R1)+ CLR (R2)+ DEC R0 BNE C.CLR1 ; .SBTTL CORRELATION FFT SWITCH C.SWIT: 0 BEQ C.CSP1 ;BR IF CROSS CORRELATION MOV R0,R2 ;C.REP1 REPLACED C.REP2 MOV R1,R3 ;C.IMP1 REPLACES C.IM*IMAG(B) BVS C.OFLO ;SCALE IF OVERFLOW MOV C.TMPR,(R0)+ ;STORE XPROD IN SI & SJ OR SK IF XCORR MOV C.TMPI,(R1)+ ;AND INCRP2 SUB C.SCL1,C.SCLF ;SCLF = 2*LOG2(# POINTS)-SCL1-SCL1 C.CSP1: .IFG EAE MOV #F.MPLI,R4 ;EAE HARDWARE ADDRESSES MOV #F.PREMENT POINTERS CMP (R2)+,(R3)+ DEC C.TMPN ;ARE WE DONE? BNE C.CSP1 ;BR IF MORE TO DO .ENDC ; .SBTTL DITTO - NON VEROD,R5 MOV (R0),(R4)+ ;MPLI=REAL(A) MOV (R2),(R4) ;MCND=REAL(B) INC @#F.SHFT MOV (R5),(PC)+ ;TMPR=REAL(A)*REAL(B) C.SWITSION .IFG NON MOV R2,-(SP) ;MULTIPLY SUBR ZAPS R2-R5 MOV R3,-(SP) MOV (R2),(PC)+ ;REAL(B) C.BR: 0 MOV (R3),(PC)+ ;I: 0 ;TEMPORARY FOR REAL PART OF XPROD MOV (R1),-(R4) ;MPLI=IMAG(A) MOV (R3),@#F.MCND ;MCND=IMAG(B) INC @#F.SHFT ADD (RMAG(B) C.BI: 0 MOV (R0),R4 ;MPLI=REAL(A) MOV C.BR,R5 ;MCND=REAL(B) JSR PC,F.MUL MOV R3,(PC)+ ;TMPR=REAL(A)*REAL(B) C5),C.TMPR ;TMPR=REAL(A)*REAL(B)+IMAG(A)*IMAG(B) BVS C.OFLO ;GO SCALE IF OVERFLOW MOV (R1),(R4)+ ;MPLI=IMAG(A) MOV (R2),(R.TMPR: 0 MOV (R1),R4 ;MPLI=IMAG(A) MOV C.BI,R5 ;MCND=IMAG(B) JSR PC,F.MUL ADD R3,C.TMPR ;TMPR=REAL(A)*REAL(B)+IMAG(A)*4) ;MCND=REAL(B) INC @#F.SHFT MOV (R5),(PC)+ ;TMPI=IMAG(A)*REAL(B) C.TMPI: 0 ;TEMPORARY FOR IMAG PART OF XPROD MOV (R0)IMAG(B) BVS C.OFLO ;SCALE IF OVERFLOW MOV (R1),R4 ;MPLI=IMAG(A) MOV C.BR,R5 ;MCND=REAL(B) JSR PC,F.MUL MOV R3,(PC)+,-(R4) ;MPLI=REAL(A) MOV (R3),@#F.MCND ;MCND=IMAG(B) INC @#F.SHFT SUB (R5),C.TMPI ;TMPI=IMAG(A)*REAL(B)-REAL(A)*IMAG(B) ;TMPI=IMAG(A)*REAL(B) C.TMPI: 0 MOV (R0),R4 ;MPLI=REAL(A) MOV C.BI,R5 ;MCND=IMAG(B) JSR PC,F.MUL SUB R3,C.TMPI ;TMPIBVS C.OFLO ;GO SCALE IF OVERFLOW MOV C.TMPR,(R0)+ ;STORE XPROD IN S1 AND S2 MOV C.TMPI,(R1)+ ;AND INCREMENT POINTERS CMP =IMAG(A)*REAL(B)-REAL(A)*IMAG(B) BVS C.OFLO ;SCALE IF OVERFLOW MOV (SP)+,R3 ;RESTORE POINTERS MOV (SP)+,R2 MOV C.TMPR,((R2)+,(R3)+ DEC C.TMPN ;ARE WE DONE? BNE C.CSP1 ;BR IF MORE TO DO .ENDC ; .SBTTL DITTO - EIS VERSION .IFG EIS MR0)+ ;STORE XPROD IN SI & SJ OR SK IF XCORR MOV C.TMPI,(R1)+ ;AND INCREMENT POINTERS CMP (R2)+,(R3)+ DEC C.TMPN ;ARE WE DOV (R0),R4 ;MPLI=REAL(A) MUL (R2),R4 ;MCND=REAL(B) ASHC #1,R4 MOV R4,(PC)+ ;TMPR=REAL(A)*REAL(B) C.TMPR: 0 MOV (R1),RONE? BNE C.CSP1 .ENDC ; .SBTTL COMPUTE CORRELATION COEFFICIENTS INC C.INV1 ;SET FOR INVERSE TRANSFORM JSR R5,FFTC 4 ;MPLI=IMAG(A) MUL (R3),R4 ;MCND=IMAG(B) ASHC #1,R4 ADD R4,C.TMPR ;TMPR=REAL(A)*REAL(B)+IMAG(A)*IMAG(B) BVS C.OFLO ; ;PRODUCE CORRELATION COEFFICIENTS C.N1-.-2 ;FROM THE CROSS POWER SPECTRUM ;NO FFT ERROR CHECKING IS DONE HERE SINCE FFT TGO SCALE IF OVERFLOW MOV (R1),R4 ;MPLI=IMAG(A) MUL (R2),R4 ;MCND=REAL(B) ASHC #1,R4 MOV R4,(PC)+ ;TMPI=IMAG(A)*REAL(B)YPE ERRORS WOULD ;HAVE BEEN DETECTED IN THE FIRST CALL. ADD C.SCL1,C.SCLF ;SCLF = SCL1 + SCL2 + SCLI + (-2 * LOG2(# POINTS)AVE SCALE FACTOR C.SCLF: 0 MOV C.REP1,R0 MOV C.IMP1,R1 MOV C.REP2,R2 MOV C.IMP2,R3 MOV (SP)+,(PC)+ ;STORE AUTO/CROSS C.TMPI: 0 MOV (R0),R4 ;MPLI=REAL(A) MUL (R3),R4 ;MCND=IMAG(B) ASHC #1,R4 SUB R4,C.TMPI ;TMPI=IMAG(A)*REAL(B)-REAL(A) MOV (SP)+,R2 BR C.CSP1 ;CORRELATION DATA AREA ;FFT TABLE FOR COMPLEX ARRAY A C.N1: 0 ;NUMBER OF POINTS C.REP1: 0 ;POITO ISSUE 3 LINE FEEDS $FRMAT .BYTE LINES,3 .BYTE EXIT .EVEN ;USE TTY MODULE TO OUTPUT A MESSAGE $CRLF $TYPMS NTER TO REAL(A) C.IMP1: 0 ;POINTER TO IMAG(A) C.INV1: 0 ;DIRECTION OF TRANSFORM C.SCL1: 0 ;SCALE FACTOR COMPUTED BY FFTC ;#MESS1 ;R0 = ADDR OF MESSAGE $CRLF ;USE QA TO TYPE OUT A '#' & RECEIVE TTY INPUT ; 10 INTEGERS WILL BE TYPED IN & STORED ) ;PRINT THE SCALE FACTOR JSR R5,FORMAT ;C.SCLF CONTAINS THE SCALE FACTOR .BYTE CRLFC0,TEXT .ASCII \SF = \ .BYTE 0,TABLE FOR COMPLEX ARRAY B C.N2: 0 C.REP2: 0 C.IMP2: 0 C.INV2: 0 C.SCL2: 0 .ENDC SING ;OUTPUT A DECIMAL VALUE .BYTE 0 ;NEXT PARM IS ADDR OF SIGNED INTEGER .EVEN C.SCLF .BYTE CRLFC0,EXIT .EVEN ;RETURN TO SPARTA C.RTN: MOV (SP)+,R5 MOV (SP)+,R4 MOV (SP)+,R3 MOV (SP)+,R2 MOV (SP)+,R1 RTS PC ;RETURN FROM WHENCE WE CAME UNLESS ;ERROR OCCURRED, THEN TO "DEFORE" ; .SBTTL SCALING ROUTINE C.OFLO: .IFG NON MOV (SP)+,R3 ;RESTORE PO .TITLE BABY ;FILE NAME: BABY.MAC ;THIS IS A PROGRAM WHICH SIMPLY ACCEPTS 10 INTEGERS VIA ;TERMINAL AND WRITES THEM BACKINTERS MOV (SP)+,R2 .ENDC SUB #2,C.SCLF ;UPDATE THE SCALE FACTOR MOV C.REP1,R4 MOV C.IMP1,R5 MOV C.N1,-(SP) ;TOTAL N TO THE TERMINAL ;THE PURPOSE OF THIS PROGRAM IS TO ILLUSTRATE HOW ONE USES THE ;LAB APPLICATIONS MODULES(TTYR11.MAC,QA.MAC,OUMBER OF POINTS SUB C.TMPN,(SP) ;MINUS NUMBER LEFT TO SQ & SUM BEQ C.OFL2 ;BR IF OVERFLOW ON FIRST POINTS C.OFL1: ASR (R4)UTF.MAC,GENS.MAC) ;ASSEMBLY INSTRUCTIONS ;BABY=BABY ;TTY=PARAM.ASM,TTYR11 ;QA=PARAM.ASM,QA ;OUTF=PARAM.ASM,OUTF ;GENS+ ;SCALE THE CROSS PRODUCTS ASR (R4)+ ;ALREADY CALCULATED TST C.SWIT ;AUTO OR CROSS CORR? BMI C.OFL4 ;BR IF AUTO ASR=PARAM.ASM,GENS ;LINKING INSTRUCTIONS ;BABY=BABY,TTY,QA,OUTF,GENS,SPFPMP ;RUNTIME INSTRUCTIONS ;BOOT UP RT11 ; .R BAB (R5)+ ASR (R5)+ C.OFL4: DEC (SP) ;REDUCE NUMBER OF XPRODS REMAINING BNE C.OFL1 ;BR IF MORE TO GO ;SCALE REMAINING FREY ;GLOBAL SYMBOLS ;TTYR11 MODULE .GLOBL TTYICH,TTYOCH,TTYBFA,TTYBUF ;QA MODULE .GLOBL QADATF,QAERR,QAANS ;OUTF MOQUENCY DOMAIN C.OFL2: MOV R2,(SP) ;TOP OF STACK IS TEMPORARY MOV R3,-(SP) ;WE NEED REGISTERS 2 & 3 MOV C.TMPN,-(SP) ;AGADULE .GLOBL FORBUF ;DEFINITIONS USING MACROS .MCALL .REGDEF,$QADEF,$OUTDE .MCALL $MOV,$CALL,$CRLF,$TYPMS,$QA,$FRMAT .REGIN TOP OF STACK IS TEMP C.OFL3: ASR (R2)+ ASR (R3)+ TST C.SWIT ;AUTO OR CROSS CORR? BMI C.OFL5 ;BR IF AUTO ASR (R4)+ DEF $QADEF $OUTDE ;START OF THE PROGRAM 'BABY' ;SETUP CONTROL INFORMATION FOR TTY MODULE START: CLRB TTYICH ;0=INPUT IS ASR (R5)+ C.OFL5: DEC (SP) BNE C.OFL3 TST (SP)+ ;CLEAR TEMPORARY OFF STACK MOV (SP)+,R3 ;RESTORE POINTERS IN R1 & R3 FROM TERMINAL CLRB TTYOCH ;0=OUTPUT TO TERMINAL MOV #BUFOVR,TTYBFA ;SETUP 'BUFFER FULL' JMP ADDRESS ;USE FORMAT MODULE ULE .EVEN 5$: ADD #1,R4 ;INC NUMBER OF DATA/LINE MOV R4,R5 ;NUMBER OF DATA FOR CURRENT OUTPUT LINE MOV #1,R3 ;R3 HOLDSY=PARAM.ASM,TTYR11 ;QA=PARAM.ASM,QA ;OUTF=PARAM.ASM,OUTF ;GENS=PARAM.ASM,GENS ;DISPLY=PARAM.ASM,GTDISP ;ADSAM=PARAM.ASM,VTM THE COLUMN START VALUE $FRMAT .BYTE CRLFC0,EXIT ;ISSUE A CR LF & THEN EXIT .EVEN 6$: MOVB R3,8$ ;PICKUP THE 'COLST' VALAC,ADSAM ;LINKING INSTRUCTIONS ;PARENT=PARENT,TTY,QA,OUTF,GENS,SPFPMP/C ;VTLIB,DISPLY,ADSAM ;RUNTIME INSTRUCTIONS ;BOUE FOR NEXT DATUM MOV (R1)+,9$ ;GET NEXT DATUM FROM BUFFER JSR PC,7$ ;OUTPUT THE DATUM DEC R2 ;DONE YET? BEQ START ;YOT UP RT11 ; .R PARENT ;GLOBAL SYMBOLS ;TTYR11 MODULE .GLOBL TTYICH,TTYOCH,TTYBFA,TTYBUF ;QA MODULE .GLOBL QADATF,QES DEC R5 ;IS OUR LINE DONE YET? BEQ 5$ ;YES ADD #10.,R3 ;MOVE OVER TO NEXT COLUMN BR 6$ ;ROUTINE CALLS FORMATTER AERR,QAANS ;OUTF MODULE .GLOBL FORBUF ;GTDISP MODULE .GLOBL GTRCAL ;ADSAM MODULE .GLOBL ADSCAL,ADMAXV,LPSVEC,LPSSAD,TO OUTPUT A SING PREC NUMBER 7$: $FRMAT .BYTE COLST ;POSITION THE COLUMN POINTER 8$: .BYTE 0 ;COLUMN START VALUE .BYTEADDTYB,ADDTAB,ADGTON,ADGTOF ;DEFINITIONS USING MACROS .MCALL .REGDEF,$QADEF,$OUTDE,$GTDEF .MCALL $MOV,$CALL,$CRLF,$TYPMS,$IN A DATA BUFFER 1$: MOV #DATABF,R1 ;R1 HOLDS DATA BUFFER ADDRESS MOV #10.,R2 ;R2=CTR FOR THE 10 INTEGERS $QA QASP,MESS2 SING ;SING PREC OUTPUT .BYTE 200 ;THE VALUE IS AT 9$: .EVEN 9$: 0 ;DATUM TO BE OUTPUT .BYTE EXIT .EVEN RTS PC ;ANSWER TYPE IS SING PREC & ADDR OF MESSAGE 2$: TSTB QADATF ;TEST FOR DATA FOUND BEQ 1$ ;NO DATA FOUND, TRY EXAMPLE AGAIN ;ROUTINE TO OUTPUT WARNING IF ONE EXCEEDS LENGTH OF TTY LINE BUFOVR: $TYPMS #MESS3 BR START ;MESSAGES MESS1: .ASCIZ TSTB QAERR ;TEST FOR VALID DATA BEQ 3$ ;DATUM IS OKAY $TYPMS #MESS4 ;USE TTY MOD TO TYPE ERROR BR 1$ ;TRY EXAMPLE AG/**BABY EXAMPLE** ENTER 10 INTEGERS/ MESS2: .ASCIZ /# / MESS3: .ASCIZ /INPUT LINE TOO LONG/ MESS4: .ASCIZ /BAD DATA/ .EVEN AIN 3$: MOV QAANS,(R1)+ ;PUT DATUM IN BUFFER DEC R2 ;10 INTEGERS READ IN YET? BEQ 4$ ;YES $QA QASP+QASIL ;REMAINING 9 D ;BUFFERS TTYBUF: .BLKB 72. ;BUFFER USED BY TTY MODULE FORBUF=TTYBUF DATABF: .BLKW 10. ;DATA BUFFER IS 10 WORDS LONG ATA RETRIEVED VIA ;SILENT QUESTION OPTION OF QA ;SILENT QUEST + SING PREC NUMBER BR 2$ ;AT THIS POINT ALL 10 INTE.END START GERS ARE IN THE DATA BUFFER. ;USE THE OUTPUT FORMATTER TO WRITE BACK THE 10 INTEGERS 4$: MOV #DATABF,R1 ;R1=DATA BUFFER ADDR .TITLE PARENT ;FILE NAME: PARENT.MAC ;THIS PROGRAM COLLECTS 64 DATA VALUES FROM THE LPS VIA CHAN#0 ;IT THEN DISPLAYS THESS MOV #10.,R2 ;R2=DONE CTR CLR R4 ;R4=NUMBER OF DATA/TERMINAL LINE $FRMAT ;CALL THE FORMATTER TO: .BYTE CRLFC0 ;IE VALUES AND LAST OF ALL TYPES THEM OUT ;THE PURPOSE OF THIS EXAMPLE IS TO ILLUSTRATE HOW ONE USES ;THE LAB APPLICATIONS MODULSSUE A CR LF .BYTE TEXT ;OUTPUT THE TEXT IN THE NEXT LINE .ASCIZ /USING INTEGER FORMAT/ .BYTE EXIT ;EXIT FROM FORMAT MODES(TTYR11.MAC,QA.MAC,OUTF.MAC,GENS.MAC ;GTDISP.MAC,ADSAM.MAC) ;ASSEMBLY INSTRUCTIONS ;PARENT=PARAM.ASM,VTMAC,PARENT ;TTBER OF PTS TO DISPLAY MOV #7,DISCI(R1) ;INTENSITY OF DISPLAY CLR DISOFX(R1) ;X-OFFSET =0 MOV #600,DISOFY(R1) ;Y-OFFSET = CCK ON ;ASK USER WHEN TO CONTINUE $QA QANAOK,MESS5 ;NULL ANS - ONLY A CR IS EXPECTED ;ASK USER THE QUESTION .STOP ENTER OF SCOPE MOV #2000,DISSZX(R1) ;X-AXIS SIZE MOV #1377,DISTOP(R1) ;TOP OF SCOPE CLR DISBOT(R1) ;BOTTOM OF DISPLAY MO ;TURN OFF GT40 WHEN USER HITS CR .REMOV BUFPNT ;REMOVE DISPLAY BUF FROM HANDLER ;USE THE OUTPUT FORMATTER TO WRITE BACK THEVB #1,DISSKP(R1) ;RECALCULATE DISPLAY BUFFER ;CALL THE 'GINIT' ROUTINE FOR EACH I/D TBL $GINIT #IDTAB1 ;SETUP BUFFER C 10 INTEGERS MOV #DATABF,R1 ;R1=DATA BUFFER ADDRESS MOV #BUFSIZ,R2 ;R2=DONE CTR MOV #6,R4 ;R4=NUMBER OF DATA/TERMINAL LONTROL BLOCK & COMPLETE A/D SAMPLING TBL MOV FREE+2,BUFPNT ;1ST FREE LOCATION IN CORE MOV @#54,R0 ;USING RT11 TO FIND TOPINE $FRMAT .BYTE CRLFC0 .BYTE TEXT .ASCIZ *YOUR A/D DATA* .BYTE EXIT .EVEN 5$: MOV R4,R5 ;NUMBER OF DATA FOR CURRE OF TST -(R0) ;FREE CORE .MCALL .SETTOP .SETTOP SUB FREE+2,R0 ;R0 = SIZE OF FREE CORE MOV R0,BUFPNT+2 ;PUT SIZE IN BNT OUTPUT LINE MOV #1,R3 ;R3 HOLDS THE 'COLST' VALUE $FRMAT .BYTE CRLFC0,EXIT .EVEN 6$: MOVB R3,8$ ;PICKUP THE 'COLSTUF CTRL BLK MOV R0,ADGRAS ;PUT FREE CORE SIZE IN A/D TBL MOV BUFPNT,ADGRAB ;DISPLY BUF ADDR IN A/D TBL ;SETUP CONTROL INF' VALUE FOR NXT DATUM MOV (R1)+,9$ ;GET NXT DATUM FROM BUFFER JSR PC,7$ ;OUTPUT THE DATUM DEC R2 ;DONE YET? BEQ 11$ ;ORMATION FOR TTY MODULE CLRB TTYICH ;0=INPUT IS FROM TERMINAL CLRB TTYOCH ;0=OUTPUT TO TERMINAL MOV #BUFOVR,TTYBFA ;SEYES DEC R5 ;IS OUR LINE DONE YET? BEQ 5$ ;YES ADD #10.,R3 ;BUMP 'COLST' VALUE BY 10 BR 6$ ;ROUTINE CALLS FORMATTERTUP 'BUFFER FULL' JMP ADDRESS ;USE FORMAT MODULE TO ISSUE 3 LINE FEEDS $FRMAT .BYTE LINES,3 .BYTE EXIT .EVEN ;US TO OUTPUT A SING PREC NUMBER 7$: $FRMAT .BYTE COLST 8$: .BYTE 0 ;COLUMN START VALUE .BYTE SING ;SING PREC OUTPUT .BQA,$FRMAT,$GINIT,$GINT0,$GTDIS .MCALL $ADSAM .REGDEF $QADEF $OUTDE ;DEFINE I/D TBL OFFSETS, GLOBALIZE ALL OFFSETS & SET IE TTY MODULE TO OUTPUT A MESSAGE $CRLF $TYPMS #MESS1 $CRLF .ENABL LSB ;CALL 'GINIT0' ROUTINE TO PASS 4 POINTERS VIA/D TBLSIZ $GTDEF BUFSIZ=64. ;DATA BUFFER HAS 64 POINTS ;START OF PROGRAM 'PARENT' ;SETUP INIT/DISPLAY TABLE START: 'PNTR' TABLE 4$: $GINT0 #PNTR ;SET 'GTRCAL' FLG AND CALL 'GTDISP' ROUTINE MOVB #1,GTRCAL ;CALCULATE THE DISPLAY BUFFE BIS #100,@#44 ;INHIBIT TT WAIT MOV #IDTAB1,R1 ;R1 = I/D TBL ADDR MOV #BUFSIZ,DISBUF(R1) ;BUFFER SIZE CLR DISXBU(R1) ;0=Y-R $GTDIS TST R0 BNE ERROR ;DISPLAY BUFFER OVERFLOW ;TELL GT40 DISPLAY HANDLER ABOUT OUR DISPLAY BUFFER .LNKRT .IDATA DISPLAY MOV #DATABF,DISYBU(R1) ;Y-DATA BUF ADDR MOV #1,DISTYP(R1) ;DISPLAY TYPE = S.P. CLRB DISSC(R1) ;SCA FAC =0 CNSRT BUFPNT ;DISPLAY BUF ADDR .START ;TURN ON GT40 ;TIME TO DO A/D SAMPLING ;UPON RETURN FROM SAMPLING A 64 WORD BUFFERLRB DISCU(R1) ;FIX CURSOR FLG IS OFF CLR DISST(R1) ;ST-1 =0 MOV #1,DISN(R1) ;DISPLAY EVERY POINT MOV #BUFSIZ,DIST(R1) ;NUM WILL CONTAIN THE DATA $ADSAM SAMTBL,ERROR .START ;ADSAM JUST TURNED GT40 OFF ON EXITING ;THUS,IT MUST BE TURNED BASB ;MESSAGES MESS1: .ASCIZ /**PARENT EXAMPLE** READY TO COLLECT DATA/ MESS3: .ASCIZ /INPUT LINE TOO LONG/ MESS5: .ASCIZRE .END START /HIT 'CR' TO CONTINUE/ MESS6: .ASCIZ /DISPLAY BUFFER OVRFLO/ .EVEN ;BUFFERS TTYBUF: .BLKB 72. ;BUFFER USED BY TTY MODULE FORBUF=TTYBUF DATABF: .BLKW 64. ;DATA BUFFER IS 64 WORDS LONG IDTAB1: .BLKB TBLSIZ ;LOCATION OF I/D TABLE ;DEFINITIONS & VECTORS USED BY ADSAM MODULE ADSCAL=IDTAB1+DISSC ADDTYB=IDTAB1+DISYBU ADDTAB=IDTAB1 ADMAXV: 1377 ;SCOPE SIZE IN ;LAB APPLICATIONS-11 SYSTEM MACRO FILE ;DEC-11-SLABA-C-LA ;FILENAME LABMAC.SML ;FILE ID LABMAC.4 .MACRO $MOV A,B .IF NB Y-DIRECTION LPSVEC: 340 ;LPS A/D VECTOR LPSSAD: 170400 ;LPS A/D STATUS REG ;BUFFER CONTROL BLOCK BUFPNT: 0 ;DISPLA .IIF DIF A,B MOV A,B .ENDC .ENDM .MACRO $CALL ENTRY .GLOBL ENTRY JSR PC,ENTRY .ENDM .MACRO $SOB RX,A .IFDF LVN40AY BUFFER ADDR 0 ;FREE CORE AVAILABLE 0 ;OFFSET VALUE DSPLST: IDTAB1 ;DISPLAY LIST 0 CRVLST: 0 ;LIST OF GT40!LVN45 SOB RX,A .IFF DEC RX BNE A .ENDC .ENDM .MACRO $SPL N .IFDF LVN45 SPL N .IFF .IIF NE N MOVB #N*^O40,@# BUFFER ADDRESSES 0 ;FILLED IN BY GTDISP MODULE PNTR: DSPLST DSPLST CRVLST BUFPNT ;SAMPLE TABLE FOR ADSAM MODUL-2 .IIF EQ N CLRB @#-2 .ENDC .ENDM .MACRO $SAV05 $CALL .ENDM .MACRO $RST05 $CALL .ENDM .MACRO $SE SAMTBL: DATABF ;ADBUFA (DATA BUF ADDR) 103240 ;ADRATE (10 DATA/SEC) HIGH ORD 1 ;ADRATE LOW ORD 0 ;ADDELY (0 DAV14 $CALL .ENDM .MACRO $RST14 $CALL .ENDM .MACRO $LSTCP COMPAR,CHAR $MOV ,<-(SP)> $MOV , $CALL .ENDM .MACRO $MULT A,B $MOV , $MOV , $CALL .ENDM .MACRO $MULTS A,B $MOSTART SAMPLING WITH CH#0) 0 ;ADNOFC (#CH-1 TO SAMPLE) BUFSIZ ;ADCOUT (# OF PTS TO SAMPLE) 1 ;ADNOFS (# SWEEPS TO TAKV , $MOV , $CALL .ENDM .MACRO $DIVR A,B $MOV , $MOV , $CALL .ENDM .MACRE) 0 ;ADBADM (DMA OPTION NOT USED) .BYTE 1 ;ADDTYP (GRAPH PLOT) .EVEN ADGRAB: 0 ;ADDR OF DISPLY BUF-TO BE FILLED IN O $MUL SRC,RX .IFDF EIS MUL SRC,RX .IFF .NTYPE .SYM,RX .IIF NE .SYM .ERROR ;REGISTER MUST BE R0 .IF NB SRC .IIF DIYTE 200 .EVEN 9$: 0 ;DATUM TO BE OUTPUT .BYTE EXIT .EVEN RTS PC ;ROUTINE TO OUTPUT WARNING IF ONE EXCEEDS LENGTH O ADGRAS: 0 ;DISPLY BUF SIZE-TO BE FILLED IN ;THESE ROUTINES USED BY ADSAM MODULE ADGTON: .START ;TURN ON GT40 RTS PCF TTY LINE BUFOVR: MOV #MESS3,R0 10$: $TYPMS 11$: JMP START ;ERROR MESSAGE ERROR: MOV #MESS6,R0 BR 10$ .DSABL L ADGTOF: .STOP ;TURN OFF GT40 RTS PC FREE: .LIMIT ;1ST WRD GIVES START OF STACK ;2ND WRD GIVES START OF FREE CO .ENDM .MACRO $CTOBU $CALL .ENDM .MACRO $CTSTR $CALL .ENDM .MACRO $BAINT BUFSIZ $MOV ,LPSDR$ DIOSAD =10+ADSAD DIBUF =12+ADSAD DOBUF =14+ADSAD .ENDC .IFDF DR11K$ .IIF NDF DRSR$ DRSR$=167770 DIOSAD =DRSR$ DIBF SRC,R1 MOV SRC,R1 .ENDC .GLOBL MULR0 JSR PC,MULR0 .ENDC .ENDM .MACRO $DIV SRC,RX .IFDF EIS DIV SRC,RX .IFF . $CALL .ENDM .MACRO $BAGET LOCPTR $MOV , $CALL .ENDM .MACRO $BAREL BUFADR $MOV ,NTYPE .SYM,RX .IIF NE .SYM,.ERROR ;REGISTER MUST BE R0 .IF NB SRC .IIF DIF SRC,-(SP) MOV SRC,-(SP) .ENDC .GLOBL DIVR0 $CALL .ENDM .MACRO $BAWDS NUMB $MOV , $CALL .ENDM .MACRO $BAGTM LOCPTR,NUMB $MOV .ENDM .MACRO $TYTST NODATA $CALL BR NODATA .ENDM PTR>, $MOV , $CALL .ENDM .MACRO $BARLM BUFADR,NUMB $MOV , $MOV , $CALL <.MACRO $TYPCH CHAR $MOV , $CALL .ENDM .MACRO $TYPMS ADDR $MOV , $CALL .ENDM .MACBARLM> .ENDM .MACRO $ATINT PARTBL $MOV , $CALL .ENDM .MACRO $ATSAM $CALL .ENDM .MACRO RO $CRLF $CALL .ENDM .MACRO $QA ANSTYP,MESPTR,CMDTBL .GLOBL QA JSR R5,QA ANSTYP .IIF NB MESPTR MESPTR .IIF $CSINT PARTBL $MOV , $CALL .ENDM .MACRO $CSAMP MASK $MOV , $CALL .ENDM .MACRNB CMDTBL CMDTBL .ENDM .MACRO $FRMAT .GLOBL FORMAT JSR R5,FORMAT .ENDM .MACRO $FRMAA CMDTBL $MOV , $CALLO $NVELO PARTBL $MOV , $CALL .ENDM .MACRO $PEAK PARTBL $MOV , $CALL .ENDM .M .ENDM .MACRO $FRMAB CMDTBL,BUF $MOV , $MOV , $CALL .ENDM .MACRO $FFTC N .GLOACRO $MERGE $CALL .ENDM .MACRO $HTPST PARTBL $MOV , $CALL .ENDM .MACRO $HTISI PARTBL $MOBL FFTC JSR R5,FFTC .WORD N-2-. .ENDM .MACRO $ADSAM PARTBL,ERR .GLOBL ADSAM JSR R5,ADSAM .WORD PARTBL-.-2 BR ERR V , $CALL .ENDM .MACRO $STINT PARTBL $MOV , $CALL .ENDM .MACRO $STGO $CALL <.ENDM .MACRO $GINIT IDTBL $MOV , $CALL .ENDM .MACRO $GINT0 PNTR $MOV , $CALL .STGO> .ENDM .MACRO $STSTO $CALL .ENDM .MACRO $QADEF QASP =1 QADP =2 QAOCT =4 QAFLO =10 QAALP =20 QASTRENDM .MACRO $GTDIS $CALL .ENDM .MACRO $DINIT IDTBL $MOV , $CALL .ENDM .MACRO $DINT0 PNTR G =40 QAMIX =100 QANOP =200 QASIL =400 QADWA =1000 QAMESO =2000 QAAO =4000 QANQ =10000 QANAOK =20000 QAOFF =40000 . $MOV , $CALL .ENDM .MACRO $DISPL $CALL .ENDM .MACRO $CTINT PARTBL $MOV , $ENDM .MACRO $ADDEF ;RELATIVE LPS11, DR11K, & AR11 STATUS REG. ADDR. .IIF NDF ADSR$ ADSR$=170400 ADSAD =ADSR$ ADBUF =2+ADSADCALL .ENDM .MACRO $CTIBU DPIDNO,INADR,LBI $MOV , $MOV , $MOV , $CALL CLKSAD =4+ADSAD CLKBUF =6+ADSAD .IFDF AR11$ VCSTAT =10+ADSAD VCX =12+ADSAD VCY =14+ADSAD CLKCTR =16+ADSAD .ENDC .IFDF TD$A .GLOBL DISMPO DISMPO=TBLSIZ TBLSIZ=TBLSIZ+10 .ENDC .IFDF GTD$8 .GLOBL DISSTC,DISNC,DISTC,DISCUC,DISSCC,GTBCMD DISSTC=TBLSIZ DISNC=TBLSIZ+2 DISTC=TBLSIZ+4 DISCUC=TBLSIZ+6 DISSCC=TBLSIZ+10 TBLSIZ=TBLSIZ+12 .ENDC .IFDF GTD$9 .GLOBL DISSTX,DISTX,GTXCMD DISSTX=TBLSIZ DISTX=TBLSIZ+2 TBLSIZ=TBLSIZ+4 .ENDC .IFDF GTD$C .GLOBL DISSKP DISSKP=TBLSIZ TBLSIZ=TBLSIZ+1 .ENDC .IFDF GTD$D .GLOBL DISGRA DISGRA=TBLSIZ TBLSIZ=TBLSIZ+1 .ENDC .IIF NE TBLSIZ & 1 TBLSIZ=TBLSIZ+1 .ENDM .MACRO $VRUF =2+DIOSAD DOBUF =4+DIOSAD .ENDC .IFDF LPS11$ VCSTAT =16+ADSAD VCX =20+ADSAD VCY =22+ADSAD DMAREG =36+ADSAD .ENDC ;REDEF .GLOBL DISBUF,DISXBU,DISYBU,DISTYP,DISST,DISN,DIST,DISCU,DISSC,DISR,DISDX .GLOBL DISYBS,DISDLT,DISCI,DISDDN,DISOFX,DISOFY,LATIVE VECTOR ADDR. .IIF NDF ADVEC$ ADVEC$=340 ADVEC =ADVEC$ CLKVEC =4+ADVEC .IFDF LPSDR$ DIVEC =10+ADVEC DOVEC =14+ADVEC DISSZX,DISTOP,DISBOT DISBUF=0 DISXBU=2 DISYBU=4 DISTYP=6 DISST=10 DISN=12 DIST=14 DISCU=16 DISSC=17 DISR=20 DISDX=22 .ENDC .IIF DF LPS11$ VCVEC=20+ADVEC .IIF DF AR11$ VCVEC=10+ADVEC .IFDF DR11K$ .IIF NDF DRVEC$ DRVEC$=300 DIVEC =DRVEC$ D DISYBS=24 DISDLT=26 DISCI=30 DISDDN=32 DISOFX=34 DISOFY=36 DISSZX=40 DISTOP=42 DISBOT=44 TBLSIZ=46 .IFDF DIS$1 .GLOBOVEC =4+DIVEC .ENDC .ENDM .MACRO $OUTDE EXIT =0 SPACE =1 LINES =2 CRLFC0 =3 CRC0 =4 COLEND =5 COLST =6 TEXT =7 TEXTAL DISCU1,DISCU2,DISXC1,DISXC2,DICCMD DISCU1=46 DISCU2=50 DISXC1=52 DISXC2=54 TBLSIZ=TBLSIZ+10 .ENDC .IFDF DIS$3 .GLOBL D =10 OCTAL =11 SING =12 DOOCT =13 DOUB =14 FLOT =15 EXP =16 .ENDM .MACRO $GTDEF .GLOBL DISBUF,DISXBU,DISYBU,DISTYP,DISISSTC,DISNC,DISTC,DISCUC,DISSCC,DIBCMD DISSTC=TBLSIZ DISNC=TBLSIZ+2 DISTC=TBLSIZ+4 DISCUC=TBLSIZ+6 DISSCC=TBLSIZ+10 TBLSIZST,DISN,DIST .GLOBL DISCU,DISSC,DISR,DISDX,DISYBS,DISDLT,DISCI DISBUF=0 DISXBU=2 DISYBU=4 DISTYP=6 DISST=10 DISN=12 DIST=TBLSIZ+12 .ENDC .IFDF DIS$4 .GLOBL DISSTX,DISTX,DIXCMD DISSTX=TBLSIZ DISTX=TBLSIZ+2 TBLSIZ=TBLSIZ+4 .ENDC .ENDM =14 DISCU=16 DISSC=17 DISR=20 DISDX=22 DISYBS=24 DISDLT=26 DISCI=30 TBLSIZ=32 .IFDF GTD$6 .GLOBL DISCU1,DISCU2,DISXC1,DISXC2,GTCCMD DISCU1=32 DISCU2=34 DISXC1=36 DISXC2=40 TBLSIZ=TBLSIZ+10 .ENDC .IFDF GTD$7 .GLOBL DISOFX,DISOFY,DISSZX,DISTOP,DISBOT DISOFX=TBLSIZ DISOFY=TBLSIZ+2 DISSZX=TBLSIZ+4 DISTOP=TBLSIZ+6 DISBOT=TBLSIZ+10 TBLSIZ=TBLSIZ+12 .ENDC .IFDF G