.TITLE PLOTA ;PLOTTING PACKAGE .IDENT 'V001A' ; ;[PAGE #1] COLORS: .WORD 0 ;COLOR CONTROL (GLOBAL) FROM INIT(7) ;2 MAR 1972 ; ; ; ;ASSEMBLY PARAMETERS ASSEMBLY CONDITIONS ; ;PDP45 (DEFINED) 11/45 OPERATION PDP45=1 ;PDP45 (UNDEFINED) 11/20 OPERATION USING EAE ;NODUMP DECIMAL DUMP EXCLUDED NODUMP=1 ; ; ; ;CONTROL WORD #1: ;BIT OPERATION IF SET OPERATION IF NOT SET ; ; 15 ERASE OVERPRINT ; 14 NEW PLOT OLD PLOT ; 13 ROUND YMAX, YMIN NO ROUNDING ; 12 ROUND XMAX, XMIN NO ROUNDING ; 11 FIND YMIN SET YMIN ; 10 FIND YMAX SET YMAX ; 9 FIND XMIN SET XMIN ; 8 FIND XMAX SET XMAX ; ; 7 DRAW X SCALE NO X SCALE ; 6 DRAW Y SCALE NO Y SCALE ; 5 PRINT PARAMETERS NO PARAMETERS ; 4 PRINT TITLE NO TITLE ; 3 PRINT X UNDER/OVERFLOW NO X UNDER/OVERFLOW ; 2 PRINT Y UNDER/OVERFLOW NO Y UNDER/OVERFLOW ; 1 UNUSED ; 0 INDEX ENTRY NOT ENTERED IN INDEX ; ;CONTROL WORD# 2: ;BITS FUNCTION VALUE OPERATION ; ;15 PLOT MODE 0 LINEAR PLOT ; 1 LOG PLOT ; ;14 LETTER SIZE 0 SMALL LETTERS ; 1 LARGE LETTERS ; ;13-12 UNUSED ; ;11-9 DISPLAY FUNCTION 0 DECIMAL DUMP ; 1 HISTOGRAM ; 2 LINE GRAPH ; 3 SCATTERGRAM ; 4 SYMBOL PLOT ; 5 XYZ PLOT ; ; 8 UNUSED ; ; 7-6 ERROR DISPLAY CONTROL 0 NO ERRORS PLOTTED ; 1 ERROR = SQUARE ROOT(Y) ; 2 ERROR = YERR ; 3 ERROR = SQUARE ROOT(YERR) ; ; 5 EXPLICIT ERROR ARRAY IF 1 (Y,YERR) (X,Y,YERR) OR X&Y&YERR ; ; 4-3 STORAGE FORMAT 0 Y'S ONLY ; 1 (X,Y) PAIRS ; 2 X & Y INDEPENDENT ARRAYS ; ; ; 2-1 UNUSED ; ; 0 PACKING FORMAT 0 FULL WORD ; 1 DOUBLE WORD ; ; ; ; ;DISPATCH FUNCTIONS: ; ;FCN OPERATION PARAMETERS (POINTER) ; 0 ERASE/OVERPRINT CONTROL WORD #1 ; CONTROL WORD #2 ; NO. OF POINTS ; X-ARRAY OR "ARRAY" (PACKED) ; Y-ARRAY OR 0 ; ERRORS OR 0 ; ; 1 DRAW BORDER X-SIZE ; X-OFFSET ; Y-SIZE ; Y-OFFSET ; ; 2 FIND/SET EXTREMES XMAX ; XMIN ; YMAX (SINGLE/DOUBLE WORD) ; YMIN (SINGLE/DOUBLE WORD) ; ; 3 DRAW SCALES #HORIZONTAL MARKS #X BINS FOR X-Y-Z PLOT ; #VERTICAL MARKS #Y BINS FOR X-Y-Z PLOT ; ; 4 PARAMETER LISTING NO. OF PARAMETERS ; PARAMETER WORDS ADDRESS ; PARAMETER VALUES ADDRESS ; ; 5 TITLE LISTING NO. OF TITLE CHARACTERS ; TITLE ADDRESS ; ; 6 PLOT EXECUTION SYMBOL / UNIT NUMBER FOR DECIMAL DUMP ; ; 7 PRINT OVER/UNDERFLOWS ADDRESS OF (LOSTHI, LOSTLO) ; ; ; ;SYSTEM CONSTANTS: ; DIV=177300 AC=177302 MQ=177304 MUL=177306 SC=177310 SR=177311 NOR=177312 LSH=177314 ASH=177316 ; ; .PSECT PLTARO,RO ;SUBROUTINE TO OBTAIN LAST USED YMIN & YMAX ; .SBTTL SUBROUTINE YSCALE(IYMIN,IYMAX,IPOWER) ; ;CALL YSCALE(IYMIN,IYMAX,IPOWER) ; ; YSCALE::TST (R5)+ ; MOV YMIN,@(R5)+ MOV YMAX,@(R5)+ CLR @(R5) ;ASSUME SINGLE PRECISION ORDINARILY ; TSTB CODE ;DOUBLE WORDS ? BPL YSCEND ;NO ; MOV #TENTAB,R0 MOV POWER,R1 ; YSCPWR: TST (R0) ;BOTTOM OF TENS TABLE ? BEQ YSCEND ;YES, ERROR ? ; CMP (R0)+,R1 ;FOUND CORRECT POWER ? BNE YSCPWR ;NO, TRY NEXT ENTRY ; SUB #TENTAB+2,R0 ASR R0 ;RETURN N, POWER OF 10. IN IPOWER ; MOV R0,@(R5) ;IPOWER ; YSCEND: TST (R5)+ RTS PC ; ; ; ;**********( AUXILIARY ROUTINES )********** ; .SBTTL SUBROUTINES R0XR1, R0OVR1, ABC(R0*R1/R2) ; ; ; .IF NDF,PDP45 ; ;**********( PDP 11/20 VERSION )********** ; R0XR1: MOV R0,@#MQ ;R0*R1 R0*R1/R2 & R0/R1 MOV R1,@#MUL ABC0: MOV @#MQ,R0 ;R0=LSP R0=QUOTIENT MOV @#AC,R1 ;R1=MSP R1=REMAINDER RTS PC ; ABC: MOV R0,@#MQ ;R0*R1/R2 MOV R1,@#MUL MOV R2,@#DIV BR ABC0 ; R0OVR1: MOV R0,@#MQ ;R0/R1 MOV R1,@#DIV BR ABC0 ; ; ; .ENDC ;*** 11/20 *** ; ; .IF DF,PDP45 ; ;**********( PDP 11/45 VERSION )********** ; ; R0XR1: MUL R0,R1 ;R0*R1 [R0:R1] = [MSP:LSP] MOV R1,-(SP) ;EXCHANGE R0 & R1 MOV R0,R1 MOV (SP)+,R0 RTS PC ; R0OVR1: MOV R1,-(SP) ;R0/R1 MOV R0,R1 SXT R0 DIV (SP)+,R0 RTS PC ; ABC: MUL R1,R0 ;R0*R1/R2 DIV R2,R0 ;[R0:R1] = [QUOTIENT:REMAINDER] RTS PC ; ; ; ; .ENDC ;*** 11/45 *** ; ; ;CROSS REFERENCE TABLE AND STORAGE LOCATIONS: ; .SBTTL INTERNAL STORAGE (TEMPORARY) AND CROSS-REFERENCE TABLE ; .PSECT PLTARW,D ;NAME INITV BORDER XTREME SCALE PARMTR TITLE PLOTGO OUFLOW ; FCN0: 0; * MAX NBYTES ; YERR FCN1: 0; * MIN COLCNT ; LOGYMN FCN2: 0; * MARKS COLSAV ; LOGYSP FCN3: 0; * FCN4: 0; * ERRFLG FCN5: 0; * SAVE4 FCN6: 0; SYMB ; UNIT FCN7: 0; * ; HIMAX: 0; * DXSIZE LOMAX: 0; * DYSIZE HIMIN: 0; * HMARKS LOMIN: 0; * VMARKS POWER: 0; * * ; XMAX0: 0; * NX OUVLST ; XUSAGE XMIN0: 0; * YUSAGE OUFCN1 YMAX0: 0; * NXTOT OUFCN2 ; ERRLO-2 YMIN0: 0; * NYTOT OUWORD ; ERRLO ; DELTA: 0; XMAX1 * REMAIN: 0; XMIN1 * X TOTAL: 0; YMAX1 * Y DVISOR: 0; YMAX1 * XPRIME NVALUE: 0; YMIN1 * YPRIME * STEP: 0; YLIMS * XSPRED NXPOSN: 0; * NOPARS YSPRED * NYPOSN: 0; * NAMES HISTDX * MXPOSN: 0; * *(PAXNEW) XSTART * MYPOSN: 0; * * DX * NTAG: 0; * YSAVE MTAG: 0; * * XSAVE ; SUMHI: 0; ADJFLG * SUMLO: 0; * ; ; .PSECT PLTARO,RO ; ;FORTRAN ENTRY: CALL PLOTA(INIT, IBOX, ILIM, ITIX, IPAR, ITLE, ISYM) ; PLOTA:: MOV R5,-(SP) ;PUSH R5 TST (R5)+ ; MOV #FCN0,R0 ;INIT, IBOX, ILIM, ITIX, IPAR, ITLE, ISYM, INDX MOV #8.,R2 NXTFCN: MOV (R5)+,(R0)+ DEC R2 BGT NXTFCN ; ; ; ; ;**********< FCN# 0; INITV >********** ; .SBTTL **** FCN #0 **** INITV ; INITV: MOV FCN0,R5 ;INIT MOV #KWORD1,R4 MOV 14(R5),COLORS .GLOBL COLORS ;STORE COLOR CONTROLS FROM INIT(7) ;FOR HP PLOTTER ROUTINES TO USE. ; MOV (R5)+,(R4)+ ;CONTROL WORD #1 SOURCE (KWORD1) MOV (R5),(R4) ;CONTROL WORD #2 SOURCE (KWORD2) BPL INOLOG ;NO LOG ; BIS #026000,KWORD1 ;SET Y ROUNDING, YMAX & YMIN IN LOG MODE ; INOLOG: MOV -(R4),R0 ;KWORD1 BMI INERAS ;BIT #15 SET FOR ERASE ; ROL R0 ;BIT #15 _ BIT #14 SET FOR NEW PLOT & NO ERASE BMI INEW BR INOVRP ;OVERPRINT OLD PLOT ; INERAS: BIT #007000,(R5) ;DECIMAL DUMP ? BEQ INOERA ;YES, NO ERASE ; MOV R4,-(SP) MOV R5,-(SP) MOV #ZERARG,R5 JSR PC,VTINIT ;ERASE MOV (SP)+,R5 MOV (SP)+,R4 ; INEW: BIS #100000,(R4) ;SET BIT #15 (ERASE BIT SET) ; CLR PAXPOS ;CLEAR LAST PARAMETER POSITION CLR OUYPOS ;CLEAR LAST OVERFLOW POSITION ; BR INOVRP ; INOERA: BIC #100000,(R4) ;CLEAR ERASE BIT #15 ; INOVRP: MOV (R5)+,R0 ;KWORD2 SOURCE (NPTS SOURCE) ; CLR LETSIZ ;LETTER SIZE = 4(DEFAULT) BIT #040000,R0 ;BIT #14 SET ? BEQ INSMAL ;NO, SMALL LETTERS MOV #3000,LETSIZ ;YES, PUT 6 IN LEFT BYTE ; ; INSMAL: MOV R0,R1 ;MASK & EXTRACT STORAGE FORMAT BIC #177747,R1 ;BITS# 4-3 ASR R1 ;(0,4,10) _ (0,10,20) ASR R1 ;(0,2,4) _ (0,4,10) ASR R1 ;(0,1,2) _ (0,2,4) ; MOV R1,-(R4) ;SET CODE MOV R4,R2 ;CODE ADDRESS IN R2 MOV #INSTPA,R3 ;NON-ERROR "YSTEP" LIST ; BIC #177437,R0 ;MASK & EXTRACT ERROR CONTROL ASL R0 ASL R0 ;BITS #9-7 _ #7-5 SWAB R0 ;BITS #1-0 _ #9-8 & BIT #15 _ #7 MOV R0,ERRFMT ;ERROR FORMAT ; BEQ INSTEP ;ERRFMT = 0, NO ERRORS ; TSTB R0 ;ERRFMT BIT #15 = 1 & NO ERROR PLOT BEQ INOERR ;ARRAY INCLUDED BUT NO ERRORS ; BIS #100000,(R2) ;(CODE) SET ERROR DISPLAY FLAG ; CMP #1,R0 ;ERRFMT = 1? (BIT #15 = 0) BEQ INSTEP ;YES, ERROR=SQRT(Y) ; INOERR: MOV #INSTPB,R3 ;ERROR "YSTEP" LIST ; INSTEP: ADD R1,R3 ;FORM YSTEP ADDRESS CMP (R4)+,(R4)+ ;(CODE+4=KWORD2) MOV R4,R1 ;SAVE KWORD2 ADDRESS TST (R4)+ ;(YSTEP) ; MOVB (R3),R0 ;GET YSTEP BYTE FROM TABLE ; MOV R4,R3 TST (R3)+ ;(XSTEP) ; BIT #1,(R1) ;BIT #0 OF KWORD2 = 1 FOR DOUBLE WORD BEQ INODBL ;FULL WORD FORMAT ; TST (R0)+ ;ADD 2 TO R0 (YSTEP BYTE) MOV R0,(R3) ;ASSUME NOT X&Y OR X&Y&YERR ; BIS #200,(R2) ;SET BIT #7 FOR DOUBLE Y ARRAYS ; BIT #20,(R1) ;X&Y OR X&Y&YERR ? BEQ INODBL ;NO ; MOV #2,(R3) ;X & YERR ARE FULL WORD ARRAYS ; ; INODBL: MOVB R0,(R4) ;LOAD YSTEP ; MOV #4,R0 ;R0 = 4 - DOUBLE WORD ; TSTB (R2) ;DOUBLE WORD ? BMI INDUBL ;YES MOV (R4),(R3) ;NO, SET XSTEP = YSTEP FOR FULL WORDS ; ASR R0 ;R0 = 2 - FULL WORD ; INDUBL: CMP (R4)+,(R4)+ ;(NPTS) MOV (R5)+,(R4)+ ;NPTS (XARRAY) MOV R4,R2 ;R2 POINTS TO "ARRAY" OR XARRAY IN BLOCK ; MOV (R5)+,(R4)+ ;XARRAY (YARRAY) MOV R4,R3 ;R3 POINTS TO YARRAY IN BLOCK ; MOV (R5)+,(R4)+ ;YARRAY (YERRAY) MOV (R5),(R4) ;SET ERROR FROM SOURCE ; BIT #30,(R1) ;STORAGE FORMAT = 0 ? ; BEQ INFMT0 ;YES, Y'S OR (Y,DY) BIT #10,(R1) ;STORAGE FORMAT = 1 ? BNE INFMT1 ;YES, (X,Y) OR (X,Y,DY) ; CMPB #1,ERRFMT ;NO, X&Y OR X&Y&YERR - NO MODIFICATION, USE SQRT(Y) INSTEAD OF YERRAY ? BNE INDONE ;NO ; MOV -(R5),(R4) ;YES, SET YERRAY = YARRAY BR INDONE ; INFMT1: MOV (R2),(R3) ;XARRAY = "ARRAY" (X,Y) OR (X,Y,DY) ADD #2,(R3) ;YARRAY = "ARRAY" + 2 BR INYERR ; INFMT0: MOV (R2),(R3) ;YARRAY = "ARRAY" INYERR: MOV (R3),(R4) ;YERRAY = YARRAY ; ; CMPB #1,ERRFMT ;ERROR = SQRT(Y) ? BEQ INDONE ;NO ; ADD R0,(R4) ;NO, YERRAY = YARRAY + R0(2 OR 4) FOR (X,Y,DY) OR (Y,DY) ; INDONE: BR BORDER ; .SBTTL INTERNAL STORAGE (PERMANENT) ; .PSECT PLTARW,D ; ;INTERNAL STORAGE AREA: ; ;NAME USED IN: INTERPRETATION: CODE: 0 ;INITV CODE KWORD1: 0 ; CONTROL WORD #1 KWORD2: 0 ; CONTROL WORD #2 YSTEP: 0 ; Y-ARRAY INCREMENT XSTEP: 0 ; X-ARRAY & YERRAY INCREMENT NPTS: 0 ; NO. OF POINTS TO BE PLOTTED XARRAY: 0 ; CURRENT ADDRESS IN X ARRAY YARRAY: 0 ; CURRENT ADDRESS IN Y ARRAY YERRAY: 0 ; CURRENT ADDRESS IN ERROR ARRAY ; XSIZE: 0 ;BORDER WIDTH OF GRAPH XOFF: 0 ; HORIZONTAL GRAPH OFFSET YSIZE: 0 ; HEIGHT OF GRAPH YOFF: 0 ; VERTICAL GRAPH OFFSET ; OUYPOS: 0 ;OUFLOW LAST VERTICAL OVER/UNDERFLOW POSITION XOVER: 0 ; X OVERFLOW VALUE XUNDER: 0 ; X UNDERFLOW VALUE YOVER: 0 ; Y OVERFLOW VALUE YUNDER: 0 ; Y UNDERFLOW VALUE ; PAXPOS: 0 ;PARMTR LAST HORIZONTAL PARAMETER POSITION ; XMAX: 0 ;XTREME MAXIMUM X VALUE XMIN: 0 ; MINIMUM X VALUE YMAX: 0 ; MAXIMUM Y VALUE YMIN: 0 ; MINIMUM Y VALUE ; ;CODE WORD: ;BITS VALUE INTERPRETATION ; ;15 1 ERRORS ; 0 NO ERRORS ; ;7 1 DOUBLE WORD Y ARRAY ; 0 SINGLE WORD Y ARRAY ; ;2-0 0 Y'S OR (Y,YERR) ; 1 (X,Y) OR (X,Y,YERR) ; 2 X&Y OR X&Y&YERR ; LETSIZ: 0 .PSECT PLTARD,RO,D ; ; YSTEP CODE PACKING INSTPA: .BYTE 2 ; 0 Y'S .BYTE 4 ; 1 (X,Y) .BYTE 2 ; 2 X&Y ; INSTPB: .BYTE 4 ; 0 (Y,YERR) .BYTE 6 ; 1 (X,Y,YERR) .BYTE 2 ; 2 X&Y&YERR ; ; ; ;[PAGE #2] ; ; ; ;**********< FCN# 1; BORDER >********** ; .SBTTL **** FCN #1 **** BORDER ; .PSECT PLTARO,RO ; ; BORDER: MOV #XSIZE,R5 ;POINTER TO SIZES & OFFSETS MOV FCN1,R4 ;IBOX MOV (R4)+,(R5)+ ;XSIZE MOV (R4)+,(R5)+ ;XOFF MOV (R4)+,(R5)+ ;YSIZE MOV (R4),(R5) ;YOFF ; TST KWORD1 ;OVERPRINT? BPL BODONE ;YES, SKIP BORDER ; MOV (R5),R1 ;R1=YOFF TST -(R5) ;SKIP YSIZE MOV -(R5),R0 ;R0=XOFF MOV -(R5),R2 ;R2=XSIZE ADD R0,R2 ;R2=XSIZE+XOFF MOV R1,R3 ;R3=YOFF ; JSR PC,VTVCTR ; MOV (R5)+,R0 ;R0=XSIZE ADD (R5)+,R0 ;R0=XSIZE+XOFF MOV (R5)+,R3 ;R3=YSIZE MOV (R5),R1 ;R1=YOFF MOV R0,R2 ;R2=XSIZE+XOFF ADD R1,R3 ;R3=YSIZE+YOFF ; JSR PC,VTVCTR ; MOV (R5),R1 ;R1=YOFF ADD -(R5),R1 ;R1=YOFF+YSIZE MOV R1,R3 ;R3=YOFF+YSIZE MOV -(R5),R2 ;R2=XOFF MOV -(R5),R0 ;R0=XSIZE ADD R2,R0 ;R0=XSIZE+XOFF ; JSR PC,VTVCTR ; TST (R5)+ ;SKIP XSIZE MOV (R5)+,R0 ;R0=XOFF MOV R0,R2 ;R2=XOFF MOV (R5)+,R1 ;R1=YSIZE MOV (R5),R3 ;R3=YOFF ADD R3,R1 ;R1=YSIZE+YOFF ; JSR PC,VTVCTR ; ; BODONE: ; ; ;**********< FCN# 2; XTREME >********** ; .SBTTL **** FCN #2 **** XTREME ; XTREME: CLR ADJFLG ;FLAG FOR XMAX & XMIN IN LOG MODE ; MOV KWORD1,R5 ;OVERPRINT ? BMI XTOVR1 ;NO, BIT #15 = 1 JMP XTDONE ;YES, BIT #15 = 0 ; XTOVR1: BIC #140377,R5 ;EXTRACT BITS #13-8 SWAB R5 ; MOV #FULIMS,YLIMS ; TSTB CODE ;DOUBLE WORD Y'S ? BMI XTDOUB ;YES ; BIT #17,R5 ;ARE ALL FIND/SET BITS = 0 ? BNE XTGO ;NO, FIND SOME EXTREMA JMP XTSET ;YES, SET ALL EXTREMA ; XTDOUB: MOV #DBLIMS,YLIMS ; MOV #XMAX1,R1 ;DOUBLE WORD MOV FCN2,R0 ;USER SPECIFIES YMAX/YMIN MOV (R0)+,(R1)+ ;XMAX (SET) MOV (R0)+,(R1)+ ;XMIN (SET) ; MOV #HIMAX,R1 MOV (R0)+,(R1)+ ;HIMAX = YMAX HIGH MOV (R0)+,(R1)+ ;LOMAX = YMAX LOW MOV (R0)+,(R1)+ ;HIMIN = YMIN HIGH MOV (R0)+,(R1)+ ;LOMIN = YMIN LOW ; MOV R5,-(SP) ;SAVE KWORD1 ; JSR PC,DOUBLE ;GET POWER ; MOV (SP)+,R5 ;RESTORE KWORD1 ; MOV R4,POWER ;POWER (SET) MOV #YMAX1,R1 MOV R3,(R1)+ ;YMAX (SET) = YMAX1 MOV R2,(R1) ;YMIN (SET) = YMIN1 ; MOV #XMAX1,FCN2 ;ONE WORD EXTREMES ; ; XTGO: CLR R3 CLR R2 ; BIT #177,CODE ;Y'S ONLY ? BNE XANDYS ;YES, X ARRAY INCLUDED ; XTOVR2: BIC #3,R5 ;CLEAR X BITS #1-0 BR YSONLY ; ; XANDYS: MOV XARRAY,R0 MOV NPTS,R1 ; MOV #XSTEP,R4 JSR PC,FULIMS ; BIT #20,R5 ;ROUND XMAX, XMIN ? BEQ YSONLY ;NO ; JSR PC,ROUND ;YES ; YSONLY: MOV #XMAX0,R1 MOV R3,(R1)+ ;XMAX = R3 (FOUND) MOV R2,(R1)+ ;XMIN = R2 (FOUND) ; MOV YARRAY,R0 MOV NPTS,R1 ; MOV #YSTEP,R4 JSR PC,@YLIMS ;FULIMS OR DBLIMS ; TSTB CODE ;DOUBLE WORDS ? BPL XTRNDY ;NO, FULL WORDS BIT #4,R5 ;FIND YMAX ? BEQ XTRNDY ;NO, SET YMAX ; MOV R4,POWER ;YES, USE LATEST POWER (FOUND) ; XTRNDY: BIT #40,R5 ;ROUND YMAX, YMIN ? BEQ XTLOAD ;NO ; INC ADJFLG ;FLAG FOR YMAX & YMIN IN LOG MODE JSR PC,ROUND ;YES ; XTLOAD: MOV #YMAX0,R1 MOV R3,(R1)+ ;YMAX = R3 (FOUND) ; TST KWORD2 ;LOG PLOT ? BPL XTNOLG ;NO ; TST R2 ;YMIN > 0 IN LOG MODE ? BGT XTNOLG ;YES, OK ; MOV #1,R2 ;NO, SET YMIN = 1 ; XTNOLG: MOV R2,(R1)+ ;YMIN = R2 (FOUND) ; XTSET: MOV #4,R1 ;COUNT FOR LOOP MOV #XMAX0,R3 MOV #XMAX,R4 ; MOV FCN2,R0 ;ILIM (OR XMAX1 FOR DOUBLE WORDS) ; XTLOOP: ROR R5 ;C _ BIT #0 BCS XTFIND ;BIT #0 WAS 1 MOV (R0)+,(R4)+ ;BIT #0 WAS 0, SET LIMIT TST (R3)+ ; BR XTFIX ; XTFIND: MOV (R3)+,(R4)+ TST (R0)+ ;ADD 2 TO R0 ADDRESS ; XTFIX: DEC R1 BGT XTLOOP ; CMP -(R4),-(R4) ;(YMAX) CMP -(R4),-(R4) ;XMAX > XMIN ? BLT XTLOGY ;YES, OK ; MOV NPTS,(R4)+ ;YES, DEFAULT XMAX = NPTS CLR (R4) ;AND XMIN = 0 ; XTLOGY: TST KWORD2 ;LOG PLOT ? BPL XTDONE ;NO ; TSTB CODE ;DOUBLE WORD FORMAT ? BPL XTDONE ;NO ; MOV #YMAX,R4 ;LOG OF DOUBLE WORD ARRAY TST (R4) ;IS YMAX < 0 (OVERFLOW) ? BGE XTDONE ;NO, OK ; MOV #10000.,(R4) ;YES, SET YMAX = 10K MOV #POWER,R4 ;AND INCREASE POWER BY 10. MOV #TENTAB,R5 ; XTABLE: TST (R5) ;BOTTOM OF TABLE ? BEQ XTDONE ;YES, ERROR ; CMP (R5)+,(R4) ;POWER FOUND ? BNE XTABLE ;NO ; MOV (R5),(R4) ;YES, POWER _ POWER*10. ; XTDONE: JMP SCALE ; ; ; ; ;**********( MIN-MAX SEARCH SUBROUTINES )********** ; .SBTTL MIN-MAX SEARCH SUBROUTINES: ; ;*********( FULL WORD )************ ; .SBTTL FULL WORDS ; FULIMS: MOV #77777,R2 ;LARGEST IN R2 MOV #100000,R3 ;SMALLEST IN R3 ; FULOOP: CMP (R0),R2 ;NEW MINIMUM? BGT NOFMIN ;NO MOV (R0),R2 ;YES NOFMIN: CMP (R0),R3 ;NEW MAXIMUM? BLT NOFMAX ;NO MOV (R0),R3 ;YES NOFMAX: ADD (R4),R0 ;ADD XSTEP/YSTEP TO R0 ADDRESS DEC R1 BGT FULOOP RTS PC ;R2=MINIMUM, R3=MAXIMUM ; ; ; ;MAXIMUM POSITIVE DOUBLE WORD VALUE IS (2^30)-1 = (10^9) ;REDUCE DOUBLE TO SINGLE WORD BY DIVISION BY 10.^N WHERE: 0 < N < 6 ;BIT #15 OF POWER IS SET FOR SPECIAL SHIFT AND DIVISION BY 10.^5 OR 10.^6 ; ; ;**********( DOUBLE WORD )********** ; .SBTTL DOUBLE WORDS ; ;**********( DOUBLE PRECISION FOR 11/20 )********** ; ; DBLIMS: MOV R5,-(SP) ;SAVE R5 MOV R0,R5 ;Y ARRAY STARTING ADDRESS IN R0 ; MOV #HIMAX,R4 MOV #100000,(R4)+ ;INITIALIZE HIMAX:LOMAX = -2^32. CLR (R4)+ ;LOMAX MOV #77777,(R4)+ ;INITIALIZE HIMIN:LOMIN = 2^32.-1 MOV #-1,(R4) ;LOMIN ; MOV #62.,R3 ;SMALLEST SHIFT IN R3 _ MAXIMUM CLR R2 ;LARGEST SHIFT IN R2 _ MINIMUM ; DBLOOP: MOV R5,R0 ; .IF NDF,PDP45 ; ;**********( PDP 11/20 VERSION )********** ; JSR PC,DBLOAD ;AC:MQ _ (R0):(R0+2) ; INC @#NOR ;NORMALIZE MOV @#NOR,R4 ; TST (R0) ;Y < 0 ? ; .ENDC ;*** 11/20 *** ; ; .IF DF,PDP45 ; ;**********( PDP 11/45 VERSION )********** ; MOV R2,-(SP) ;SAVE R2 & R3 MOV R3,-(SP) ; MOV (R0)+,R2 ;HIGH PART MOV (R0),R3 ;LOW PART ; MOV #-1,R4 ;NORMALIZE COUNT ; BR DBSHFT ; DBNORM: BCS DBIT15 ;BITS #15 - 14 ARE 1 & ? BMI DBNEND ;BITS #15 - 14 ARE 0 & 1 ; DBSHFT: ASHC #-1,R2 ;BITS #15 - 14 ARE 0 & 0 OR 1 & 1, SHIFT AGAIN ; INC R4 ;INCREASE NORMALIZE COUNT CMP #31.,R4 ;SHIFTED 31. TIMES ? BEQ DBNEND ;YES, MUST BE 0 ; BR DBNORM ;SHIFT AGAIN ; DBIT15: BMI DBSHFT ;BITS #15 - 14 ARE 1 & 1, SHIFT AGAIN ; DBNEND: MOV (SP)+,R3 ;RESTORE R3 & R2 MOV (SP)+,R2 ;R4 CONTAINS NORMALIZE COUNT ; TST -(R0) ;Y < 0 ? ; ; .ENDC ;*** 11/45 *** ; BPL DBGE0 ;YES, 0(MAXIMUM) < NORM < 31(MINIMUM) ; SUB #62.,R4 ;NO, 32(MAXIMUM) < NORM < 62(MINIMUM) NEG R4 ; DBGE0: CMP R4,R2 ;NEW MINIMUM ? BLT NODMIN ;NO MOV R4,R2 ;YES CMP (R0)+,HIMIN ;LESS THAN LAST MINIMUM ? (HIGH PART) BGT NODMIN ;NO BNE NEWDMN ;HIGH PART IS NEW MINIMUM CMP (R0),LOMIN ;LESS THAN LAST MINIMUM ? (LOW PART) BHI NODMIN ;NO NEWDMN: MOV (R0),LOMIN ;SAVE LOW PART OF MINIMUM MOV -(R0),HIMIN ;SAVE HIGH PART OF MINIMUM ; NODMIN: MOV R5,R0 CMP R4,R3 ;NEW MAXIMUM BGT NODMAX ;NO MOV R4,R3 ;YES CMP (R0)+,HIMAX ;GREATER THAN LAST MAXIMUM ? (HIGH PART) BLT NODMAX ;NO BNE NEWDMX ;HIGH PART IS NEW MAXIMUM CMP (R0),LOMAX ;GREATER THAN LAST MAXIMUM ? (LOW PART) BLOS NODMAX ;NO NEWDMX: MOV (R0),LOMAX ;SAVE LOW PART OF MAXIMUM MOV -(R0),HIMAX ;SAVE HIGH PART OF MAXIMUM ; NODMAX: ADD YSTEP,R5 ;YARRAY + YSTEP POINTS TO NEXT Y DEC R1 BGT DBLOOP ; JSR PC,DOUBLE ; MOV (SP)+,R5 ;RESTORE R5 RTS PC ;LEAVE WITH R4 = POWER ; ; ;LOAD DOUBLE WORD AC _ (R0) & MQ _ (R0+2) ; .SBTTL SUBROUTINES FOR MANIPULATION OF DOUBLE WORDS: ; .IF NDF,PDP45 ; ;**********( PDP 11/20 USE ONLY )*********** ; .SBTTL DBLOAD (11/20) ; DBLOAD: TST (R0)+ ;LOAD MQ FIRST (SIGN EXTENDS TO AC) MOV (R0),@#MQ ;LOW PART MOV -(R0),@#AC ;HIGH PART RTS PC ; ; .ENDC ;*** 11/20 *** ; ;REDUCE DOUBLE WORD TO SINGLE WORD + POWER OF 10.^N, FOR 0 < N < 6 ; .SBTTL POWER FOR SINGLE _ DOUBLE WORDS ; ; DOUBLE: MOV #HIMAX,R0 MOV #TENTAB,R1 ;VALUES OF 10.^N FOR 0 < N < 6 ; .IF NDF,PDP45 ; ;**********( PDP 11/20 VERSION )********** ; DBOVFL: JSR PC,DBLOAD ;LOAD AC:MQ _ HIMAX:LOMAX ; TST (R1) ;FLAG SET FOR N > 4 ? BPL DBNLT5 ;NO, N < 5 ; MOV #-5,@#ASH ;DIVIDE DY 2^5 ; MOV (R1),R2 ;5^5 + FLAG BIC #100000,R2 ;CLEAR FLAG MOV R2,@#DIV ;DIVIDE BY 5^5 ; ROLB @#SR ;SET CONDITIONS: >0, OVERFLOW <0, OVERFLOW ; N=0, V=1 N=1, V=0 BGE DBDONE ;BRANCH IF EITHER V OR N = 1 ; ; TST (R1)+ ;NO, POWER = 5^6 + FLAG _ 10.^6 BY DEFAULT BR DBDONE ; DBNLT5: MOV (R1)+,@#DIV ;DIVIDE BY 10.^N, 0 < N < 4 ; ROLB @#SR BLT DBOVFL ;BRANCH IF V AND N = 1 OR V AND N = 0 (NO OVERFLOW) ; TST -(R1) ;CORRECT POWER OF 10. ; .ENDC ;*** 11/20 *** ; ; .IF DF,PDP45 ; ;**********( PDP 11/45 VERSION )********** ; DBOVFL: MOV (R0)+,R2 ;HIGH PART MOV (R0),R3 ;LOW PART TST -(R0) ; TST (R1) ;FLAG SET FOR N > 4 ? BPL DBNLT5 ;NO, N < 5 ; ASHC #-5,R2 ;DIVIDE R2:R3 BY 2^5 ; MOV (R1),R4 ;5^5 + FLAG BIC #100000,R4 ;CLEAR FLAG DIV R4,R2 ;DIVIDE BY 5^5 ; BVC DBDONE ;N = 5 DOES IT IF NO OVERFLOW ; TST (R1)+ ;OVERFLOW, POWER = 5^6 + FLAG _ 10.^6 BY DEFAULT BR DBDONE ; DBNLT5: DIV (R1)+,R2 ;DIVIDE BY 10.^N, 0 < N < 4 ; BVS DBOVFL ;OVERFLOW, POWER IS NOT LARGE ENOUGH ; TST -(R1) ;CORRECT POWER IS 10.^(N-1) ; .ENDC ;*** 11/45 *** ; ; ; DBDONE: MOV POWER,-(SP) ;SAVE POWER TEMPORARILY MOV (R1),R4 MOV R4,POWER ; JSR PC,REDUCE ; MOV R5,R3 ;YMAX IN R3 ; CMP (R0)+,(R0)+ ;(HIMIN) ; JSR PC,REDUCE ; MOV R5,R2 ;YMIN IN R2 ; MOV (SP)+,POWER ;RESTORE POWER ; RTS PC ;R2 = MINIMUM, R3 = MAXIMUM, R4 = POWER USED IN DOUBLE ; ; ;REDUCE SINGLE WORD _ DOUBLE WORD / 10.^N FOR 0 < N < 6 ; ; .SBTTL REDUCE SINGLE _ DOUBLE WORDS/POWER ; .IF NDF,PDP45 ; ;**********( PDP 11/20 VERSION )********** ; REDUCE: JSR PC,DBLOAD ;AC:MQ _ (R0):(R0+2) ; MOV POWER,R1 ;FLAG SET ? (BIT #15) BPL RDIVID ;NO, N < 5 ; BIC #100000,R1 ;CLEAR FLAG BIT #15 MOV #-5,@#ASH ;DIVIDE BY 2^5 ; CMP #3125.,R1 ;N = 5 ? BEQ RDIVID ;YES ; MOV #-1,@#ASH ;NO, DIVIDE BY 2 AGAIN ; RDIVID: MOV R1,@#DIV ;DIVIDE BY 10.^N ; MOV @#MQ,R5 ;RESULT IN R5 AT EXIT ; RTS PC ; .ENDC ;*** 11/20 *** ; ; .IF DF,PDP45 ; ;**********( PDP 11/45 VERSION )********** ; REDUCE: MOV R2,-(SP) ;SAVE R2 & R3 MOV R3,-(SP) ; MOV (R0)+,R2 ;HIGH PART MOV (R0),R3 ;LOW PART TST -(R0) ; MOV POWER,R1 ;FLAG SET ? (BIT #15) BPL RDIVID ;NO, N < 5 ; BIC #100000,R1 ;CLEAR FLAG BIT #15 ; ASHC #-5,R2 ;DIVIDE BY 2^5 ; CMP #3125.,R1 ;N = 5 ? BEQ RDIVID ;YES ; ASHC #-1,R2 ;NO, DIVIDE BY 2 AGAIN ; RDIVID: DIV R1,R2 ;DIVIDE BY 10.^N ; MOV R2,R5 ;RESULT IN R5 AT EXIT ; MOV (SP)+,R3 ;RESTORE R2 & R3 MOV (SP)+,R2 ; RTS PC ; .ENDC ;*** 11/45 *** ; ; ; ; ; .PSECT PLTARD,RO,D ; ONE=TENTAB TENTAB: 1 ; 10.^0 10. ; 10.^1 100. ; 10.^2 1000. ; 10.^3 10000. ; 10.^4 100000+3125. ; 10.^5 = (2*5)^5 _ 5^5 + FLAG (BIT #15) 100000+15625. ; 10.^6 = (2*5)^6 _ 5^6 + FLAG (BIT #15) ; ZERO: 0 ; BOTTOM OF TENS TABLE ; ; .PSECT PLTARO,RO ; XMAX1=DELTA XMIN1=REMAIN YMAX1=TOTAL YMIN1=DVISOR YLIMS=NVALUE ; ; .SBTTL ROUNDING ALGORITHM ; MAX=FCN0 MIN=FCN1 ; ; ROUND: MOV R2,MIN ;R2=MINIMUM, R3=MAXIMUM MOV R3,R0 ;ADJUST MAXIMUM MOV #1,R2 ;ROUND UPWARD ; JSR PC,ADJUST ;NEWMAX=[(OLDMAX/10^N)+(0,1)]*10^N ; MOV R0,MAX ;NEW MAXIMUM ; MOV MIN,R0 ;ADJUST MINIMUM NEG R2 ;ROUND DOWNWARD ; JSR PC,ADJUST ;NEWMIN=[(OLDMIN/10^N)-(0,1)]*10^N ; MOV R0,R2 MOV MAX,R3 ; RNDONE: RTS PC ;R2=MINIMUM, R3=MAXIMUM ; ; ; ADJUST: CLR R4 ;R2=ROUNDING ADJUSTMENT, +/-1 ; ADJDIV: MOV R0,R3 BEQ ADJEND ;NO ADJUSTMENT IF 0 INC R4 ;COUNT=COUNT+1 MOV #10.,R1 ; JSR PC,R0OVR1 ;DIVISION BY 10. ; TST R0 ;R0=0 WHEN DONE BNE ADJDIV ;REDUCE AGAIN ADD R2,R3 ;ADD +/-1 TO PREVIOUS DIVISION ; TST KWORD2 ;LOG PLOT ? BPL ADJNXT ;NO ; TST ADJFLG ;XMIN & XMAX ? BEQ ADJNXT ;YES, SKIP LOG ADJUSTMENT ; MOV #1,R3 INC R2 ;CHANGE COUNT FOR YMIN & YMAX IN LOG MODE: ASR R2 ;TO MINIMIZE USE 10.^(R4-1) = YMIN ADD R2,R4 ;TO MAXIMIZE USE 10.^R4 = YMAX ; ADJNXT: MOV R3,R0 ; ADJMPY: MOV #10.,R1 ; DEC R4 ;COUNT=COUNT-1 BEQ ADJEND ;POWER OF 10 RESTORED ; JSR PC,R0XR1 ;MULTIPLY BY 10. ; MOV R0,R3 BR ADJMPY ;MULTIPLY AGAIN ; ADJEND: MOV R3,R0 RTS PC ;RESULT IN R0 ; ADJFLG=SUMHI ; ;[PAGE #3] ; ; ; ;**********< FCN# 3; SCALE >********** ; .SBTTL **** FCN #3 **** SCALE ; ; SCALE: MOV KWORD1,R0 ;OVERPRINT ? BMI SCALGO ;NO JMP SCDONE ;YES, SKIP SCALES ; SCALGO: TSTB R0 ;BIT #7 SET ? BPL VSCALE ;NO, SKIP H-SCALE ; MOV FCN3,R2 ;ITIX, POINTER TO #HMARKS MOV (R2),HMARKS ;SAVE FOR XYZ MOV #XMAX,R4 ;POINTER TO XMAX, XMIN MOV #XSIZE,R3 ;POINTER TO XSIZE, XOFF, YSIZE ; JSR PC,SCSUB1 ;MYPOSN _ R5, XOFF _ R3 ; MOV #NXPOSN,R4 ADD #14.,(R4)+ ;NXPOSN = XOFF + 14. (HALF A CHR) SUB #36.,(R4)+ ;NYPOSN = YOFF - 36. SUB #6,(R4)+ ;MXPOSN = XOFF - 6 TST (R4)+ ;SKIP MYPOSN MOV #40,(R4)+ ;NTAG = BLANK MOV #41,(R4)+ ;MTAG = EXCLAMATION POINT ;; MOV #174,(R4)+ ;MTAG = VERTICAL BAR ; TST (R3)+ ;SKIP XOFF MOV (R3),R4 ;YSIZE SUB #28.,R4 ;R4 = YSIZE-28. ; JSR PC,SCSUB3 ;STEP _ R3 ; BR HSTEP ; HNEXT: TST (R5)+ MOV YOFF,(R5) ;BOTTOM VERTICAL BAR (MYPOSN) ; JSR PC,MARKXY ; JSR PC,NUMBER ;NUMBER UNDER BOTTOM ; ADD R4,(R5) ;TOP VERTICAL BAR (MYPOSN) ; JSR PC,SCSUB2 ;STEP _ R3 ; HSTEP: ADD (R3),-(R5) ;NEXT HOR. POSITION, ADD STEP TO MXPOSN ADD (R3)+,(R3) ;AND TO NXPOSN ; DEC MARKS BGT HNEXT ; VSCALE: BIT #100,KWORD1 ;BIT #6 SET ? BEQ SCDONE ;NO, SKIP V-SCALE ; MOV FCN3,R2 TST (R2)+ ;POINTER TO #VMARKS MOV (R2),VMARKS ;SAVE FOR XYZ ; TST KWORD2 ;LOG PLOT ? BPL VSCLIN ;NO ; MOV YMAX,R0 ;YES, NO. OF VMARKS = N+1 WHERE (YMAX/YMIN)/10.^N = 0 MOV YMIN,R1 ; MOV #VMARKS,R2 MOV #-3,@R2 ;INITIALIZE VMARKS = -3 BR VRATIO ; VLOGDV: MOV #10.,R1 ; VRATIO: JSR PC,R0OVR1 ;(YMAX/YMIN)/10.^N ; INC @R2 ;VMARKS = VMARKS + 1 ; TST R0 ;RESULT = 0 YET ? BNE VLOGDV ;NO, DIVIDE AGAIN ; TST R1 ;REMAINDER ? BEQ VDCADE ;NO ; INC @R2 ;1 MORE DECADE ; VDCADE: TST @R2 ;VMARKS > 0 ? BGT VSCLIN ;YES, OK ; MOV #1,@R2 ;NO, 1 DECADE MINIMUM ; VSCLIN: MOV #YMAX,R4 ;POINTER TO YMAX, YMIN MOV #YSIZE,R3 ;POINTER TO YSIZE, YOFF ; JSR PC,SCSUB1 ;MYPOSN _ R5, YOFF _ R3 ; CMP -(R3),-(R3) ;(XOFF) MOV #MTAG,R4 MOV #55,(R4) ;MTAG = "-" MOV (R4),-(R4) ;NTAG = "-" ; TST -(R4) ;SKIP MYPOSN MOV (R3),-(R4) ADD -(R3),(R4) SUB #20.,(R4) ;MXPOSN = XSIZE+XOFF-20. SUB #12.,-(R4) ;NYPOSN = YOFF-12. SUB #5,-(R4) ;NXPOSN = XOFF-5 TST (R4)+ ;(NYPOSN) ; VNEXT: JSR PC,NUMBER ;NUMBER AT LEFT SIDE WITH "-" ; MOV (R4),(R5) ;NEXT VERTICAL RIGHT "-" ; TST KWORD2 ;LOG PLOT ? BPL VNOLOG ;NO ; JSR PC,MARKXY ;RIGHT SIDE "-" IN LOG MODE ; MOV #NVALUE,R3 MOV (R3),R0 MOV #10.,R1 ; JSR PC,R0XR1 ;NVALUE * 10. ; MOV R0,(R3)+ ;NEXT NUMBER = NVALUE * 10. ; MOV #1,VMARKS ;SUB-DECADE MARKS FOR 2 < N < 9 ; VTICKS: MOV #VMARKS,R0 INC (R0) CMP #10.,(R0) ;IS VMARKS = 10. ? BEQ VLOG ;YES ; MOV (R0),R0 ;N IN R0 ; JSR PC,LOG2 ;R0 = LOG2(N)*1K ; MOV #3392.,R2 ;LOG2(10.)*1K MOV (R3),R1 ;STEP = YSIZE/VMARKS IS DECADE SIZE ; JSR PC,ABC ;R0 = (YSIZE/VMARKS)*(LOG2(N)*1K/LOG2(10.)*1K) ; ADD (R4),R0 ;R0 + NYPOSN MOV R0,(R5) ;MYPOSN = NYPOSN + R0 ; JSR PC,MARKXY ;SUB-DECADE MARK "-" ON RIGHT ; MOV MXPOSN,-(SP) ;SAVE RIGHT X POSITION MOV NXPOSN,MXPOSN ;LEFT X POSITION ; JSR PC,MARKXY ;LEFT "-" MARK ; MOV (SP)+,MXPOSN ;RESTORE RIGHT X POSITION ; MOV #STEP,R3 BR VTICKS ; ; VNOLOG: JSR PC,SCSUB2 ;STEP _ R3 ; VLOG: ADD (R3),(R4) ;NYPOSN = NYPOSN + STEP DEC MARKS BGT VNEXT ; SCDONE: BR PARMTR ; ; ;AUXILIARY SCALE SUBROUTINES: ; SCSUB1: MOV (R2),MARKS MOV (R4)+,R0 ;MAXIMUM SUB (R4),R0 ;MAX-MIN MOV (R2),R1 ;#MARKS ; JSR PC,R0OVR1 ; MOV #DELTA,R5 MOV R0,(R5)+ ;DELTA = (MAX-MIN)/#MARKS MOV R1,(R5) ;REMAINDER MOV (R5)+,(R5)+ ;TOTAL = REMAINDER MOV (R2),(R5)+ ;DVISOR = #MARKS MOV (R4),(R5)+ ;NVALUE = MINIMUM ; MOV (R2),R1 ;#MARKS MOV (R3)+,R0 ;SIZE (OFF) ; JSR PC,R0OVR1 ; MOV R0,(R5)+ ;STEP = SIZE/#MARKS MOV XOFF,R1 MOV YOFF,R2 MOV R1,(R5)+ ;NXPOSN = XOFF MOV R2,(R5)+ ;NYPOSN = YOFF MOV R1,(R5)+ ;MXPOSN = XOFF MOV R2,(R5) ;MYPOSN = YOFF ; RTS PC ;R5 _ MYPOSN, R3 _ OFF ; SCSUB2: JSR PC,MARKXY SCSUB3: MOV #DELTA,R0 MOV #NVALUE,R3 ADD (R0)+,(R3)+ ;NVALUE = NVALUE + DELTA ADD (R0)+,(R0) ;TOTAL = TOTAL + REMAIN CMP (R0)+,(R0)+ ;TOTAL > DVISOR ? BLT SC2END ;NO INC (R0) ;YES, INCREMENT NVALUE SUB -(R0),-(R0) ;AND SET TOTAL = TOTAL - DVISOR SC2END: RTS PC ;STEP _ R3 ; ; ; ; MARKS=FCN2 ; ; ; ;HEIGHT OF 1 CHARACTER = 7 LOGICAL / 28 RASTER UNITS ;WIDTH OF 1 CHARACTER = 5 LOGICAL / 20 RASTER UNITS ;(NORMAL SIZE: 4 RASTER UNITS = 1 LOGICAL UNIT) ;POSITION OF CHARACTER IS DISTANCE OF LOWER LEFT CORNER ;CENTER OF CHARACTER IS AT: NXPOSN+8 AND NYPOSN+12 ; ;VERT. & HOR. CHARACTER SEPARATION IS 2 LOGICAL / 8 RASTER UNITS ; ;UTILITY ROUTINES: ; .SBTTL UTILITY SUBROUTINES MARKXY & NUMBER ; ; MARKXY: MOV MTAG,R0 ;MTAG AT (MXPOSN,MYPOSN) MOV MXPOSN,R2 MOV MYPOSN,R3 BIS LETSIZ,R0 ; MOV R4,-(SP) JSR PC,VTVSYM MOV (SP)+,R4 ; RTS PC ; ; ; NUMBER: MOV NTAG,R0 ;DECIMAL VALUE & NTAG AT (NXPOSN,NYPOSN) AT RIGHT SIDE MOV NVALUE,R1 MOV NXPOSN,R2 MOV NYPOSN,R3 BIS LETSIZ,R0 ; MOV R4,-(SP) JSR PC,VTVNBR MOV (SP)+,R4 ; RTS PC ; ; ; ;**********< FCN# 4; PARMTR >********** ; .SBTTL **** FCN #4 **** PARMTR ; PARMTR: BIT #40,KWORD1 ;BIT #5 = 0 ? BEQ PADONE ;YES, SKIP PARAMETERS ; MOV #NOPARS,R2 ;POINTER TO NOPARS,NAMES MOV #MXPOSN,R4 ;POINTER TO MXPOSN,MYPOSN MOV FCN4,R3 ;IPAR MOV (R3)+,(R2)+ ;NO. OF PARAMETERS ; BLE PADONE ;NPARS = 0 ; MOV (R3)+,(R2) ;PARAMETER WORD ADDRESS MOV (R3),R5 ;PARAMETER VALUES ADDRESS ; MOV #PAXPOS,R0 ;ADDRESS OF LAST X TST (R0) ;EXTENSION? BNE PACTIV ; MOV XOFF,(R0) ;SET LAST X = XOFF ; PACTIV: MOV (R0),(R4)+ ;LAST X POSITION ; MOV YOFF,(R4) ADD YSIZE,(R4) ADD #15.,(R4) ;MYPOSN = YOFF + YSIZE + 15. TST -(R4) ;(MXPOSN) ; MOV #75,MTAG ;MTAG = "=" ; PAGAIN: MOV #6,R0 ;NO. OF CHARACTERS MOV (R2),R1 ;ADDRESS OF CHARACTERS ADD R0,(R2) ;ADDRESS+6 (6 1-BYTE CHRS) ; MOV (R4),R2 ;STARTING X POSITION MOV #28.,-(SP) ;28. UNITS/CHR TST LETSIZ ;BIG LETTERS? BEQ PASMAL ;NO, SMALL MOV (SP),-(SP) ;YES, GET CHR SIZE ASR (SP) ;DIVIDE BY 2 ADD (SP)+,(SP) ;NOW 1.5 TIMES SMALL SIZE PASMAL: MOV (SP),-(SP) ;GET CHR SIZE ASL (SP) ;TIMES 2 ADD 2(SP),(SP) ;(3 CHRS)*(CHR SIZE) MOV (SP),-(SP) ;DUPLICATE ASL (SP) ;(6 CHRS)*(CHR SIZE) ADD (SP)+,(R4)+ ;(6 CHRS)*(CHR SIZE) ; MOV (R4),R3 ;STARTING Y POSITION ; BIS LETSIZ,R0 ;SET CHARACTER SIZE MOV R4,-(SP) JSR PC,VTVTXT ;NAME MOV (SP)+,R4 ; JSR PC,MARKXY ;= SIGN ; MOV (R5)+,R1 ;CURRENT VALUE ; MOV R1,R3 ;CALCULATE #CHRS (3 OR 6) BPL PAPLUS ;R3 > 0 NEG R3 ;R3 < 0, MAKE IT POSITIVE PAPLUS: MOV (SP)+,R0 ;(3 CHRS)*(CHR SIZE) SUB #1000.,R3 ;R3 < 1000. ? BLT PA3CHR ;YES, 3 CHARACTERS ASL R0 ;(6 CHRS)*(CHR SIZE) PA3CHR: ADD R0,-(R4) ;ADD TO MXPOSN ADD (SP),(R4) ;EXTRA SPACE INSERTED ; MOV #54,R0 ;COMMA ; MOV (R4)+,R2 ;MXPOSN MOV (R4),R3 ;MYPOSN BIS LETSIZ,R0 ;SET CHARACTER SIZE ; MOV R4,-(SP) JSR PC,VTVNBR ;VALUE MOV (SP)+,R4 ; ADD (SP)+,-(R4) ;1 CHR INTER-SPACING (MXPOSN) ; MOV #NOPARS,R2 DEC (R2)+ BGT PAGAIN ;NEXT PARAMETER ; MOV (R4),PAXPOS ;LAST X UPDATED = MXPOSN ; PADONE: ; ; NOPARS=NXPOSN NAMES=NYPOSN ; ; ;THE FOLLOWING VERSION OF PARMTR MAY CAUSE VARIOUS INTERNAL BUFFERS TO OVERFLOW: ; ; OMIT=1 ; .IF EQ,OMIT ; ; PARMTR: BIT #40,KWORD1 ;BIT #5 = 0 ? BEQ PADONE ;YES, SKIP PARAMETERS ; MOV FCN4,R5 ;IPAR MOV (R5)+,R4 ;NO. OF PARAMETERS BLE PADONE ;NPARS = 0 ; MOV (R5)+,R0 ;PARAMETER WORD ADDRESS MOV (R5),R1 ;PARAMETER VALUES ADDRESS ; MOV #PAXPOS,R3 ;ADDRESS OF LAST X TST (R3) ;EXTENSION? BNE PACTIV ; MOV XOFF,(R3) ;SET LAST X = XOFF ; PACTIV: CLR PAXNEW ;X POSITION COUNT ; MOV #FORMAT,R3 MOV #LIST,R2 ; PANEXT: MOV R0,(R2)+ ;NEXT WORD ADDRESS ADD #6.,R0 ;6 CHARACTERS IN NAME WORD ; MOV #003201,(R3)+ ;6A1 [6:4:1] ; MOV #036741,(R3)+ ;1H= [75(8):7:1] ; MOV (R1),R5 ;PARAMETER VALUE > 0 ? BGE PAGT0 ;YES ; NEG R5 ;NO, MAKE POSITIVE ; PAGT0: MOV #003101,(R3) ;1I6 [6:2:1] LONG FORMAT ; ADD #420.,PAXNEW ;(6+1+6+2) * 28. = 420. RASTER UNITS ; CMP #1000.,R5 ;VALUE < 1K ? BLE PAGT1K ;YES, USE I6 ; SUB #56.,PAXNEW ;SUBTRACT 2 * 28. RASTER UNITS ; MOV #002101,(R3) ;1I4 [4:2:1] SHORT FORMAT PAGT1K: TST (R3)+ ; MOV (R1)+,(R2)+ ;INSERT VALUE ; MOV #020342,(R3)+ ;2(1H ) [40(8):7:2] ; DEC R4 ;NO. OF PARAMETERS - 1 BGT PANEXT ; CLR (R3) ;TERMINATOR ; JSR PC,FORM ;R0(EXIT) = BYTE COUNT ; MOV #BUFFER,R1 MOV PAXPOS,R2 MOV YOFF,R3 ADD YSIZE,R3 ADD #15.,R3 ;Y POSITION = YOFF + YSIZE + 15. ; JSR PC,VTVTXT ; ADD PAXNEW,PAXPOS ;UPDATE X POSITION ; ; PADONE: ; .ENDC ; ; ; ;**********< FCN #5; TITLE >********** ; .SBTTL **** FCN #5 **** TITLE ; ; TITLE: MOV KWORD1,R0 ;OVERPRINT ? BPL TIDONE ;YES, SKIP TITLE ; BIT #20,R0 ;BIT #4 = 0 ? BEQ TIDONE ;YES, SKIP TITLE ; MOV FCN5,R4 ;ITLE MOV (R4)+,R0 ;NO. OF CHARACTERS IN TITLE ; BLE TIDONE ;NCHRS = 0 ; MOV (R4)+,R1 ;FIRST ADDRESS OF TITLE ; MOV #XOFF,R4 MOV (R4)+,R2 ;XOFF MOV (R4)+,R3 ;YSIZE ADD (R4)+,R3 ;YSIZE+YOFF MOV #50.,R5 ; MOV LETSIZ,R4 ;SMALL LETTERS IF NON-0 BEQ TISIZE ;SKIP FOR SMALL LETTERS ASL R5 ;R5 = 100. TISIZE: ADD R5,R3 BIS R4,R0 ; JSR PC,VTVTXT ; TIDONE: ; ; ;[PAGE #4] ; ;**********< FCN# 6; PLOTGO >********** ; .SBTTL **** FCN #6 **** PLOTGO ; ; ;R5 POINTS TO: SYMBOL CODE FOR SYMBOL PLOT ; ; ; PLOTGO: CLR SUMHI ;CLEAR Y SUMS CLR SUMLO ; MOVB @FCN6,SYMB ; CLR ERRFLG ; MOV #XOVER,R4 ;CLEAR O/U FLOWS CLR (R4)+ CLR (R4)+ CLR (R4)+ CLR (R4) ; MOV #FULLY,R0 ;EXTRACT FULL Y TSTB CODE ;FULL WORDS ? BPL PLYFMT ;YES, FULL WORDS MOV #DUBLY,R0 ;NO, DOUBLE WORDS PLYFMT: MOV R0,YUSAGE ;USED TO PULL UP Y VALUES ; MOV #XPLUS,R0 BIT #177,CODE ;CODE = 0 (FOR Y'S ONLY) ? BEQ SPREDS ;YES, Y'S ONLY MOV #FULLX,R0 SPREDS: MOV R0,XUSAGE ;USED TO PULL UP X VALUES ; MOV NPTS,R1 MOV #XMAX,R4 MOV (R4)+,R0 ;XMAX SUB (R4),R0 ;XMAX-XMIN MOV #XSPRED,R3 MOV R0,(R3)+ ;XSPRED=XMAX-XMIN CMP (R3)+,(R3)+ ;POINT TO XSTART MOV (R4)+,(R3)+ ;XSTART=XMIN (DX) ; JSR PC,R0OVR1 ;(XMAX-XMIN)/NPTS = DX ; TST R0 ;DX=0? BNE DXNOT0 ;NO INC R0 ;YES, SET DX =1 DXNOT0: MOV R0,(R3) ;DX ; ASR R0 ADD R0,-(R3) ;XSTART = XMIN + DX/2 CLR -(R3) ;HISTDX=0 MOV (R4)+,-(R3) ;YMAX SUB (R4),(R3) ;YSPRED = YMAX - YMIN ; ; ; MOV KWORD2,R5 ;CONTROL WORD #2 BPL DSPTCH ;DISPATCH TO PLOT FCN IF NOT LOG ; MOV (R4),R0 ;ADJUSTMENTS FOR LOG PLOT: R0 = YMIN ; JSR PC,LOG2 ;R0 = LOG2(YMIN) ; MOV #LOGYMN,R3 MOV R0,(R3)+ ;LOGYMN _ LOG2(YMIN) MOV R0,(R3) ;LOGYSP _ LOG2(YMIN) MOV -(R4),R0 ;R0 = YMAX ; JSR PC,LOG2 ;R0 = LOG2(YMAX) ; SUB R0,(R3) NEG (R3) ;LOGYSP = LOG(YMAX/YMIN) ; DSPTCH: BIC #170777,R5 ;EXTRACT BITS #11-9 (PLOT FCN) SWAB R5 ;BITS #3-1 _ #11-9 ASL R5 ;FCN# * 4 ; ; ADD R5,PC ;DISPATCH JMP PLDUMP ;0 DECIMAL DUMP JMP PLHIST ;1 HISTOGRAM JMP PLINES ;2 LINE GRAPH JMP PLDOTS ;3 SCATTERGRAM JMP PLSYMB ;4 SYMBOL PLOT JMP PLXYZ ;5 X-Y-Z PLOT ; XUSAGE=XMAX0 YUSAGE=XMIN0 ; ; ; LOGYMN=FCN1 LOGSPR=FCN2 ; .PSECT PLTARW,D ; ERRFMT: 0 ;ERROR FORMAT ; ;ERRFMT BITS: ; ;15 1 FOR EXPLICIT ERROR ARRAY ; ;7-0 0 NO ERROR PLOT ; 1 ERROR =SQUARE ROOT(Y) ; 2 ERROR =YERR ; 3 ERROR =SQUARE ROOT(YERR) ; .PSECT PLTARO,RO ; X=REMAIN Y=TOTAL XPRIME=DVISOR YPRIME=NVALUE ; XSPRED=STEP ;XMAX-XMIN YSPRED=NXPOSN ;YMAX-YMIN HISTDX=NYPOSN XSTART=MXPOSN DX=MYPOSN ; ; ; ;SUBROUTINES FOR LOADING X & Y VALUES (EXTRACTED FROM ARRAYS): ; .SBTTL X & Y SUBROUTINES: ; ;**********( XUSAGE = XPLUS )********** ; .SBTTL XPLUS (NO X-ARRAY) ; XPLUS: MOV XSTART,X ;Y'S ONLY ADD DX,XSTART RTS PC ; ; ;**********( XUSAGE = FULLX )********** ; .SBTTL FULLX (FULL WORD X-ARRAY) ; FULLX: MOV @XARRAY,X ADD XSTEP,XARRAY RTS PC ; ;**********( YUSAGE = DUBLY )********** ; .SBTTL DUBLY (DOUBLE WORD Y-ARRAY) ; DUBLY: MOV YARRAY,R0 ; MOV #SUMLO,R1 TST (R0)+ ADD (R0),(R1) ;LOW PART OF TOTAL ADC -(R1) ADD -(R0),(R1) ;HIGH PART OF TOTAL ; JSR PC,REDUCE ;SINGLE _ DOUBLE ; MOV R5,Y ; CMPB #1,ERRFMT ;ERROR = SQRT(Y) ? BNE GETERR ;NO, ERROR = YERR OR SQRT(YERR) ; MOV #ERRLO,R0 ;LOAD YERR INTO TEMPORARY LOCATIONS MOV R5,(R0) CLR -(R0) ;ASSUME ALWAYS POSITIVE ; JSR PC,REDUCE ;REDUCE BY 10.^N AGAIN, YERR = "Y"/10.^N = Y/10.^2N ; MOV R5,YERR ;SO THAT YERR = SQRT("Y") = SQRT(Y)/10.^N ; BR BUMPY ; ERRLO=YMIN0 ;ERRHI=YMAX0 ; ;**********( YUSAGE = FULLY )********** ; .SBTTL FULLY (FULL WORD Y-ARRAY) ; ; FULLY: MOV @YARRAY,Y ;FULL WORD ADD Y,SUMLO ; GETERR: TST CODE ;BIT #15 SET? BPL BUMPY ;NO ; MOV @YERRAY,YERR ADD XSTEP,YERRAY ; BUMPY: ADD YSTEP,YARRAY ; BIT #1,ERRFMT ;TAKE SQUARE ROOT(YERR) ? BEQ YDONE ;NO ; MOV R5,-(SP) MOV #SQRARG,R5 JSR PC,ISQRT MOV (SP)+,R5 ; SQRTY: MOV R0,YERR ; YDONE: RTS PC ; ; ; ; ;PLOT FUNCTIONS: ; .SBTTL PLOT SUB-FUNCTIONS: ; ;**********[ DECIMAL DUMP ]********** ; ; .IF DF,NODUMP ; .SBTTL DUMP EXCLUDED ; ; .ENDC ;*** DUMP EXCLUDED *** ; ; .IF NDF,NODUMP ; .SBTTL DECIMAL DUMP (0) ; ; COLCNT=FCN1 COLSAV=FCN2 ; ; ; PLDUMP: MOV KWORD2,R0 MOV #5,R1 ;#COLUMNS = 5 FOR Y'S ONLY & FULL WORDS BIT #70,R0 ;Y'S ONLY ? BEQ PLDYSO ;YES MOV #2,R1 ;NO, #COLUMNS = 2 FOR ALL OTHER CASES ; PLDYSO: MOV R1,COLCNT ;NO. OF COLUMNS MOV R1,COLSAV ; MOV #FORMAT,R3 ;FORMAT DESCRIPTOR MOV #LIST,R2 ; MOV #020342,R1 ;2(1H ) [40(8):7:2] MOV #004201,R4 ;8A1 [8:4:1] ; PLDHDR: BIT #30,R0 ;X'S INCLUDED ? BEQ PLDY0 ;NO ; MOV #WORDX,(R2)+ ;" X-ARRAY" MOV R4,(R3)+ ;8A1 [8:4:1] MOV R1,(R3)+ ;2(1H ) [40(8):7:2] ; PLDY0: MOV #WORDY,(R2)+ ;" Y-ARRAY" ; BIT #1,R0 ;DOUBLE WORDS ? BEQ PLDYF0 ;NO ; MOV #020344,(R3)+ ;4(1H ) [40(8):7:4] ; PLDYF0: MOV R4,(R3)+ ;8A1 MOV R1,(R3)+ ;2(1H ) ; BIT #40,R0 ;EXPLICIT ERRORS INCLUDED ? ; BEQ PLDXY0 ;NO ; MOV #WORDZ,(R2)+ ;" ERRORS" MOV R4,(R3)+ ;8A1 MOV R1,(R3)+ ;2(1H ) ; PLDXY0: DEC COLCNT ;DONE WITH ALL COLUMNS ? BGT PLDHDR ;NO, FORM NEXT COLUMN HEADER ; PLDIO: CLR (R3) ;END OF FORMAT DESCRIPTOR ; JSR PC,FORM ;INSERT NEXT LINE ; MOV R0,NBYTES ; JSR PC,WRITE ;PRINT THIS LINE ; TST NPTS ;DONE WITH ALL POINTS ? BLE PLDSUM ;YES, PRINT TOTALS ; MOV COLSAV,COLCNT ;NO, FORM NEW LINE OF VALUES MOV KWORD2,R0 MOV #FORMAT,R3 ;FORMAT DESCRIPTOR MOV #LIST,R2 ;LIST OF VALUES (NOT ADDRESSES) MOV #020342,R1 ;2(1H ) [40(8):7:2] MOV #000510,R4 ;1I8 [1:2:8] ; PLDNXT: BIT #30,R0 ;X'S INCLUDED ? BEQ PLDY1 ;NO ; MOV @XARRAY,(R2)+ ;GET NEXT X ADD XSTEP,XARRAY ; MOV R4,(R3)+ ;1I8 MOV R1,(R3)+ ;2(1H ) ; PLDY1: MOV YARRAY,R5 ;GET NEXT Y MOV (R5)+,(R2)+ MOV R4,(R3) ;1I8 (ASSUME FULL WORD) ; BIT #1,R0 ;DOUBLE WORD ? BEQ PLDYF1 ;NO ; MOV (R5),(R2)+ MOV #000554,(R3) ;1I12 & DOUBLE WORD [1:3:12] ; ADD (R5),SUMLO ;UPDATE DOUBLE SUM ADC SUMHI ADD -(R5),SUMHI BR PLDYD0 ; PLDYF1: ADD -(R5),SUMLO ; PLDYD0: TST (R3)+ MOV R1,(R3)+ ;2(1H ) ADD YSTEP,YARRAY ; BIT #40,R0 ;EXPLICIT ERRORS INCLUDED ? BEQ PLDXY1 ;NO ; MOV @YERRAY,(R2)+ ADD XSTEP,YERRAY ; MOV R4,(R3)+ ;1I8 MOV R1,(R3)+ ;2(1H ) ; PLDXY1: DEC NPTS ;DONE WITH ALL POINTS ? BEQ PLDIO ;YES, END THE DUMP ; DEC COLCNT ;DONE WITH ALL COLUMNS ? BGT PLDNXT ;NO, FORM NEXT COLUMN ; BR PLDIO ;YES, OUTPUT CURRENT LINE & START NEXT ; .PSECT PLTARD,RO,D ; WORDX: .ASCII " X-ARRAY" WORDY: .ASCII " Y-ARRAY" WORDZ: .ASCII " ERRORS" ; .PSECT PLTARO,RO ; PLDSUM: MOV #FORMAT,R3 MOV #LIST,R2 ; MOV #SUMWRD,(R2)+ ;"TOTAL=" MOV #003201,(R3)+ ;6A1 [6:4:1] ; MOV #000510,R4 ;1I8 [1:2:8(10)] ; TSTB CODE ;DOUBLE WORDS ? BPL PLDYF2 ;NO ; MOV SUMHI,(R2)+ MOV #000554,R4 ;1I12 [1:3:12(10)] ; PLDYF2: MOV R4,(R3)+ MOV SUMLO,(R2)+ CLR (R3) ; JSR PC,FORM ; MOV R0,NBYTES ; JSR PC,WRITE ; JMP DONE ;ALL DONE ; ; .SBTTL WRITE (OUTPUT) ; WRITE: MOV R5,-(SP) MOV #OUTARG,R5 JSR PC,OUTPUT ;PRINT A LINE ON DEVICE #UNIT MOV (SP)+,R5 ; WROTE: RTS PC ; ; .ENDC ;*** DUMP INCLUDED *** ; ; .SBTTL FORM (INSERT) ; ; NBYTES=FCN0 UNIT=FCN6 ; FORM: MOV R5,-(SP) MOV #INSARG,R5 JSR PC,INSERT ;CONVERT (INSERT) CURRENT WORD INTO BUFFER MOV (SP)+,R5 ; FORMED: RTS PC ;LEAVE WITH R0 = BYTE COUNT, R4 = BUFFER LOCATION ; ; ; .PSECT PLTARW,D ; INSARG: .WORD 10. .WORD BUFFER ;BUFFER ADDRESS .WORD FORMAT ;FORMAT DESCRIPTOR LIST: .WORD 0,0,0,0,0,0,0,0 ;LIST OF VALUES (NOT ADDRESSES) TO BE INSERTED ; ; BUFFER: .=.+68. ;MAXIMUM SIZE = ; Y'S ONLY (FULL) 5 * (8+2) = 50. BYTES ; ALL OTHER CASES 2 * (8+2+12+2+8+2) = 68. BYTES ; FORMAT: .=.+26. ;MAXIMUM SIZE = ; Y'S ONLY (FULL) 5 * (1+1) +1 = 11. WORDS ; ALL OTHER CASES 2 * (1+1+1+1+1+1) +1 = 13. WORDS ; ; ; ; ; ; ; ; ; .PSECT PLTARO,RO ; ;**********[ HISTOGRAM ]********** ; .SBTTL HISTOGRAM (1) ; PLHIST: MOV XARRAY,-(SP) ;SAVE XARRAY MOV XSTART,-(SP) ;SAVE XSTART ; JSR PC,@XUSAGE ;GET X(1) ; MOV X,R0 ; JSR PC,@XUSAGE ;GET X(2) ; SUB X,R0 ;-DX = X(1)-X(2) < 0 ; MOV (SP)+,XSTART ;RESTORE XSTART MOV (SP)+,XARRAY ;AND XARRAY ; MOV XSIZE,R1 MOV XSPRED,R2 ;XMAX-XMIN ; JSR PC,ABC ;R0 = -DX*XSIZE/XSPRED ; ASR R0 ;DIVIDE BY 2 ; MOV R0,HISTDX ;HISTDX=-(DX*XSIZE)/(2*XSPRED), < 0 ; JSR PC,@XUSAGE ;GET FIRST X ; CLR Y ;FIRST Y =0 ; JSR PC,SQUEEZ ;FIND FIRST POINT ; BIT #2,R4 ;X UNDERFLOW ? BNE PLHNXT ;NO MOV X,R0 ;YES, CANCEL IT TWICE ASL R0 SUB R0,XUNDER ; PLHNXT: JSR PC,@YUSAGE ;GET NEXT Y ; JSR PC,LINE ;DRAW VERTICAL LINE ; JSR PC,PLERRS ;ERROR PLOT ; DEC NPTS ;NPTS = NPTS - 1 BEQ PLHEND ; JSR PC,@XUSAGE ;GET NEXT X ; JSR PC,LINE ;DRAW HORIZONTAL LINE ; BR PLHNXT ; PLHEND: NEG HISTDX ;HISTDX=+(DX*XSIZE)/(2*XSPRED), > 0 ; JSR PC,LINE ;LAST HORIZONTAL LINE ; CLR Y ;LAST Y =0 ; JSR PC,LINE ;DRAW LAST VERTICAL LINE ; MOV #XOVER,R2 ROR R4 ;X OVERFLOW ? BCC PLHALF ;NO MOV X,R0 ;YES, CANCEL IT TWICE ASL R0 SUB R0,(R2) ; PLHALF: ASR (R2)+ ;DIVIDE O/U FLOWS BY 2 ASR (R2)+ ASR (R2)+ ASR (R2) ; JMP OUFLOW ; ; ;**********[ LINE GRAPH ]********** ; .SBTTL LINES (2) ; PLINES: JSR PC,@XUSAGE ;GET FIRST X ; JSR PC,@YUSAGE ;GET FIRST Y ; JSR PC,POINT ;PLOT FIRST POINT ; DEC NPTS ; JSR PC,PLERRS ;ERROR PLOT ; PLINXT: JSR PC,@XUSAGE ;GET NEXT X ; JSR PC,@YUSAGE ;GET NEXT Y ; JSR PC,LINE ;DRAW LINE ; JSR PC,PLERRS ;ERROR PLOT ; DEC NPTS ;NPTS = NPTS - 1 BGT PLINXT ; JMP OUFLOW ; ; ;**********[ SCATTERGRAM ]********** ; .SBTTL SCATTERGRAM (3) ; PLDOTS: JSR PC,@XUSAGE ;GET NEXT X ; JSR PC,@YUSAGE ;GET NEXT Y ; JSR PC,POINT ;PLOT POINT ; JSR PC,PLERRS ;ERROR PLOT ; DEC NPTS ;NPTS = NPTS - 1 BGT PLDOTS ; JMP OUFLOW ; ; ;**********[ SYMBOL GRAPH ]********** ; .SBTTL SYMBOLS (4) ; PLSYMB: JSR PC,@XUSAGE ;GET NEXT X ; JSR PC,@YUSAGE ;GET NEXT Y ; JSR PC,SYMBOL ;PLOT SYMBOL ; JSR PC,PLERRS ;ERROR PLOT ; DEC NPTS ;NPTS = NPTS - 1 BGT PLSYMB ; JMP OUFLOW ; ;***********[ X-Y-Z PLOT ]********** ; .SBTTL CORR. PLOT (5) ; PLXYZ: MOV XSIZE,R0 ;HORIZONTAL DIMENSION MOV HMARKS,R1 ;NO. OF HORIZONTAL BINS MOV R1,NXTOT ; JSR PC,R0OVR1 ; MOV R0,DXSIZE ;DXSIZE = XSIZE/HMARKS ; MOV YSIZE,R0 ;VERTICAL DIMENSION MOV VMARKS,R1 ;NO. OF VERTICAL BINS MOV R1,NYTOT ; JSR PC,R0OVR1 ; MOV R0,DYSIZE ;DYSIZE = YSIZE/VMARKS ; MOV YOFF,YSAVE ; PLZVER: MOV YSAVE,YPRIME ;CURRENT Y-POSITION ADD DYSIZE,YSAVE ;NEXT Y-POSITION ; MOV XOFF,XPRIME ;LEFT X-POSITION MOV NXTOT,NX ; PLZHOR: ADD DXSIZE,XPRIME ;NEXT X-POSITION ; JSR PC,@YUSAGE ;GET Z VALUE ; MOV Y,R1 ;Z VALUE BEQ PLZEQ0 ;SKIP IF Z = 0 ; MOV YPRIME,R3 ;VERTICAL POSITION MOV DYSIZE,R5 ;ADJUST VERTICAL BY DYSIZE/2 & CENTER IT ASR R5 ADD R5,R3 SUB #14.,R3 ; MOV XPRIME,R2 ;HORIZONTAL POSITION MOV #40,R0 ;BLANK ; JSR PC,VTVNBR ; PLZEQ0: DEC NX ;NX = 0 ? BGT PLZHOR ;NO, GET NEXT X ; DEC NYTOT ;YES, NYTOT = 0 ? BGT PLZVER ;NO, GET NEXT Y ; JMP OUFLOW ; DXSIZE=HIMAX DYSIZE=LOMAX ; HMARKS=HIMIN VMARKS=LOMIN ; ; NXTOT=YMAX0 NYTOT=YMIN0 NX=XMAX0 ; ; ;GRAPHICS FUNCTIONS: ; .SBTTL GRAPHICS UTILITIES: ; ;**********( POINT )********** ; .SBTTL POINT ; POINT: JSR PC,SQUEEZ ;FIT X & Y INTO GRAPH MOV R5,-(SP) MOV #PLTARG,R5 JSR PC,VTPLOT ;DRAW ONE POINT MOV (SP)+,R5 ; PTCLR4: CLR R4 ;CLEAR OVER/UNDERFLOW FLAG ; RTS PC ; ; ; ;**********( LINE )********** ; .SBTTL LINE ; LINE: MOV XPRIME,XSAVE ;SAVE LAST X' MOV YPRIME,YSAVE ;SAVE LAST Y' ; JSR PC,SQUEEZ ;FIT X & Y INTO GRAPH ; MOV R4,SAVE4 ;SAVE OVER/UNDERFLOW FLAG ; MOV XSAVE,R0 ;OLD X' MOV YSAVE,R1 ;OLD Y' MOV (R5),R3 ;NEW Y' (R5 POINTS TO Y' AFTER SQUEEZ) MOV -(R5),R2 ;NEW X' ; JSR PC,VTVCTR ;DRAW LINE ; MOV SAVE4,R4 ;RESTORE OVER/UNDERFLOW FLAG ; RTS PC ; ; XSAVE=MTAG YSAVE=NTAG ; SAVE4=FCN5 ; ; ;**********( SYMBOL )********** ; .SBTTL SYMBOL ; SYMBOL: JSR PC,SQUEEZ ;FIT X & Y INTO GRAPH ; TST R4 ;OVER/UNDER FLOW? BNE SYDONE ;YES, SKIP SYMBOL PLOT ; MOVB SYMB,R0 ;SYMBOL TO BE PLOTTED JSR PC,CENTER ; CLR R4 ;CLEAR OVER/UNDERFLOW FLAG ; SYDONE: RTS PC ; SYMB=FCN6 ; .SBTTL CENTER ; CENTER: MOV XPRIME,R2 ;MOVE SYMBOL TO X CENTER SUB #8.,R2 ; MOV YPRIME,R3 ;MOVE SYMBOL TO Y CENTER SUB #12.,R3 ; JSR PC,VTVSYM ;R0 = [SIZE;SYMBOL] ; RTS PC ; ; ;**********( ERROR DRAWING ROUTINES )********** ; .SBTTL PLERRS ; PLERRS: TST CODE ;BIT #15 = 1 FOR ERRORS BPL NOERRS ;NO ERRORS ; TST YERR ;YERR < OR = 0 ? BLE NOERRS ;YES, NO ERRORS PLOTTED ; INC ERRFLG ;SET ERRFLG = 1 ; NOSQRT: MOV #Y,R0 ;SAVE Y, XPRIME, YPRIME MOV (R0)+,-(SP) ;Y MOV (R0)+,-(SP) ;XPRIME MOV (R0),-(SP) ;YPRIME ; ADD YERR,Y ;Y=Y+ERROR ; JSR PC,SQUEEZ ;FIND POINT AT (X,Y+ERROR) ; TST R4 ;OVER/UNDERFLOW? BNE ERSKP1 ;YES, SKIP TOP ; MOV #55,R0 ;MINUS SIGN FOR TOP OF ERROR JSR PC,CENTER ; ; ERSKP1: MOV YERR,R0 ASL R0 ;*2 SUB R0,Y ;Y=Y-ERROR ; JSR PC,LINE ;DRAW LINE AT X BETWEEN Y+ERROR & Y-ERROR ; TST R4 ;OVER/UNDERFLOW? BNE ERSKP2 ;YES, SKIP BOTTOM ; MOV #55,R0 ;MINUS SIGN AT BOTTOM OF ERROR JSR PC,CENTER ; ; ERSKP2: MOV #YPRIME+2,R0 ;RESTORE Y, XPRIME, YPRIME MOV (SP)+,-(R0) ;YPRIME MOV (SP)+,-(R0) ;XPRIME MOV (SP)+,-(R0) ;Y ; CLR ERRFLG ;SET ERRFLG = 0, ERRORS DONE ; NOERRS: RTS PC ; YERR=FCN0 ; ; ; ; ;SQUEEZE (X,Y) INTO DIMENSIONS OF THE PLOT: RESULT = (X',Y') ; .SBTTL SQUEEZ ; SQUEEZ: CLR R4 ;CLEAR UNDER/OVER FLOW FLAGS ; MOV #XPRIME,R5 ; MOV X,R0 ;ORIGINAL X VALUE SUB XMIN,R0 ;X-XMIN MOV XSPRED,R2 ;XMAX-XMIN ; MOV XSIZE,R1 MOV R1,R3 ;R3 CONTAINS OVERFLOW DEFAULT ; JSR PC,ABC ;X'=(X-XMIN)*XSIZE/(XMAX-XMIN) ; TST ERRFLG ;ERRFLG = 1 ? BNE SQSKIP ;YES, SKIP THIS ADJUSTMENT ; ADD HISTDX,R0 ;HISTDX NON-0 ONLY FOR HISTOGRAM ; SQSKIP: MOV R0,(R5) ;X'>0? BGE XGE0 ;YES ; CLR (R5) ;NO, SET X'=0 TST (R4)+ ;SET X UNDERFLOW (BIT #1) TST ERRFLG BNE XGE0 ADD X,XUNDER ;ADD X-UNDERFLOW ; XGE0: SUB R3,R0 ;X'-XSIZE BLE XLESIZ ;X'0? BGE YGE0 ;YES ; CLR (R5) ;NO, SET Y'=0 BIS #10,R4 ;SET Y UNDERFLOW (BIT #3) TST ERRFLG BNE YGE0 ADD Y,YUNDER ;ADD Y-UNDERFLOW ; YGE0: SUB R3,R0 ;Y'-YSIZE BLE YLESIZ ;Y'********** ; .SBTTL **** FCN #7 **** OUFLOW ; OUFLOW: MOV KWORD1,R5 ;CONTROL WORD #1 ; BIT #14,R5 ;BITS #3&2 = 0 ? BNE OUTITL ;NO, PRINT OVER/UNDERFLOWS JMP OUDONE ;YES, SKIP ; OUTITL: BIT #1,R5 ;INDEX ENTRY ? BEQ OUNOIX ;NO INDEX ENTRY ; MOV #XOVER,R1 MOV FCN7,R3 ;INDX (POINTER TO LOST X BINS) ADD (R3)+,(R1)+ ;LOST X-OVERFLOW FROM INDEX ADD (R3),(R1) ;LOST X-UNDERFLOW FROM INDEX ; OUNOIX: MOV #OUYPOS,R4 TST (R4) ;LAST Y POSITION = 0? BGT OUFLGO ;NO, SKIP WORDS ; MOV YOFF,(R4) ;SET UP LAST Y SUB #100.,(R4) ;LAST Y = YOFF - 100. ; MOV #FORMAT,R3 MOV #LIST,R2 ; MOV #007201,R1 ;14A1 [14(10):4:1] MOV #020342,R0 ;2(1H ) [40(8):7:2] ; BIT #10,R5 ;PRINT X OVER/UNDER ? BEQ OUYWRD ;NO ; MOV #OUWRDX,(R2)+ ;"X OVER X UNDER" MOV R1,(R3)+ ;14A1 MOV R0,(R3)+ ;2(1H ) ; OUYWRD: BIT #4,R5 ;PRINT Y OVER/UNDER ? BEQ OUHDR ;NO ; MOV #OUWRDY,(R2)+ ;"Y OVER Y UNDER" MOV R1,(R3)+ ;14A1 MOV R0,(R3)+ ;2(1H ) ; OUHDR: CLR (R3) ;TERMINATOR ; JSR PC,FORM ;R0 = BYTE COUNT ; MOV #BUFFER,R1 MOV XOFF,R2 MOV OUYPOS,R3 ; JSR PC,VTVTXT ;PRINT HEADER ; OUFLGO: MOV #OUYPOS,R4 SUB #40.,(R4)+ ; MOV #FORMAT,R3 MOV #LIST,R2 ; MOV #001107,R1 ;2I7 [2:2:7] MOV #020342,R0 ;2(1H ) [40(8):7:2] ; BIT #10,R5 ;PRINT X OVER/UNDER ? BEQ OUYFLO ;NO ; MOV (R4)+,(R2)+ ;XOVER (XUNDER) MOV (R4)+,(R2)+ ;XUNDER (YOVER) MOV R1,(R3)+ ;2I7 MOV R0,(R3)+ ;2(1H ) ; BR OUYGO ; ; .PSECT PLTARD,RO,D ; OUWRDX: .ASCII "X OVER X UNDER" OUWRDY: .ASCII "Y OVER Y UNDER" ; SUMWRD: .ASCII "TOTAL=" ; .PSECT PLTARO,RO ; OUYFLO: CMP (R4)+,(R4)+ ;(YOVER) ; OUYGO: BIT #4,R5 ;PRINT Y OVER/UNDER ? BEQ OUTOTL ;NO ; MOV (R4)+,(R2)+ ;YOVER (YUNDER) MOV (R4),(R2)+ ;YUNDER MOV R1,(R3)+ ;2I7 MOV R0,(R3)+ ;2(1H ) ; OUTOTL: MOV #SUMWRD,(R2)+ ;"TOTAL=" ADDRESS MOV #003201,(R3)+ ;6A1 [6:4:1] ; MOV #000510,R4 ;1I8 [1:2:8] MOV #SUMLO,R1 MOV (R1),(R2)+ ;LOW PART OF TOTAL IN FIRST WORD ; TSTB CODE ;DOUBLE WORDS ? BEQ OUFMT ;NO ; MOV (R1),(R2) ;LOW PART OF TOTAL IN SECOND WORD MOV -(R1),-(R2) ;HIGH PART OF TOTAL IN SECOND WORD MOV #000554,R4 ;1I12 [1:3:12(10)] ; OUFMT: MOV R4,(R3)+ CLR (R3)+ ;BOTTOM OF FORMAT ; JSR PC,FORM ;R0(EXIT) = NO. OF BYTES ; MOV #BUFFER,R1 MOV XOFF,R2 MOV OUYPOS,R3 ; JSR PC,VTVTXT ; OUDONE: ; .IF DF,NODUMP ; PLDUMP: ;DUMP EXCLUDED ; .ENDC DONE: MOV (SP)+,R5 ;POP R5 RTS PC ;FINAL EXIT ; ; OUVLST=XMAX0 OUFCN1=XMIN0 OUFCN2=YMAX0 OUWORD=YMIN0 ; ; ; ; ;LOG BASE 2 SUBROUTINE - R0 = LOG2(R0) ; .SBTTL LOG BASE 2 SUBROUTINE LOG2(R0) ; ; .IF NDF,PDP45 ; ;**********( PDP 11/20 VERSION )********** ; LOG2: MOV R0,@#MQ ;VALUE IN R0 BLE LOGERR ;VALUE IS ILLEGAL ; INC @#NOR ;NORMALIZE ; MOV @#NOR,R0 ;COUNT SUB #30.,R0 NEG R0 ;CHARACTERISTIC ; MOV @#AC,R2 ; .ENDC ;*** 11/20 *** ; ; .IF DF,PDP45 ; ;**********( PDP 11/45 VERSION )********** ; LOG2: MOV R0,R2 ;VALUE IN R0 BLE LOGERR ;VALUE IS ILLEGAL ; CLR R0 ;NORMALIZE COUNT ; LGSHFT: CLC ROL R2 BCS LGTEST ;BIT #15 = 1 BMI LGDONE ;BITS #15 -14 ARE 0 & 1 ; LGNEXT: INC R0 ;INCREASE NORMALIZE COUNT BR LGSHFT ;SHIFT AGAIN ; LGTEST: BMI LGNEXT ;BIT #15 IS 1 & BIT #14 IS NOT 0, SHIFT AGAIN ; LGDONE: SUB #14.,R0 NEG R0 ; ROR R2 ; ; .ENDC ;*** 11/45 *** ; ; MOV #1000.,R1 ; JSR PC,R0XR1 ;R0 = CHARACTERISTIC * 1K ; ; BIC #141777,R2 ;MASK & EXTRACT BITS #14 - 10 ASR R2 SWAB R2 ;BITS # 4 - 1 _ # 14 - 10 ; ADD #LOGTAB,R2 ADD (R2),R0 ;MANTISSA * 1K IN R0 BR LOGEND ; LOGERR: CLR R0 ;ERROR WHEN R0 = 0 ; LOGEND: RTS PC ; .PSECT PLTARD,RO,D ; ; MANTISSA * 1K BITS # 13 - 10 LOGTAB: 0 ; 0 87. ; 1 170. ; 2 248. ; 3 322. ; 4 392. ; 5 459. ; 6 526. ; 7 585. ; 8 (10) 644. ; 9 (11) 700. ; 10 (12) 754. ; 11 (13) 807. ; 12 (14) 858. ; 13 (15) 907. ; 14 (16) 954. ; 15 (17) ; ; ; ARGUMENT LISTS: ; ZERARG: .WORD 1 .WORD ZERO ; SQRARG: .WORD 1 .WORD YERR ; OUTARG: .WORD 3 .WORD UNIT ;BSX UNIT NUMBER .WORD BUFFER ;OUTPUT BUFFER STARTING ADDRESS .WORD NBYTES ;LENGTH OF BUFFER ; PLTARG: .WORD 3 .WORD ONE .WORD XPRIME .WORD YPRIME ; ; ; ;DATE OF MOST RECENT EDIT ; ; 14-JAN-73 ; ; ;LENGTH OF PLOTA.PAL: ; 6400(8) BYTES = 1664(10) WORDS ; ;LENGTH OF DUMP SEGMENT: ; 600(8) BYTES = 192(10) WORDS ; ; ; ; ; ; ;C. L. DOLNICK & K. Y. LEE ; ; .END