TITLE LNKPLT - INTERFACE TO PLOTTER MODULE SUBTTL D.M.NIXON/DMN/JLd/SRM/JBC/JNG/DZN/PY 2-OCT-85 ;COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1973,1983,1986. ALL RIGHTS RESERVED. ; ; ;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED ;ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE ;INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER ;COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ;OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY ;TRANSFERRED. ; ; ;THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE ;AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT ;CORPORATION. ; ;DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS ;SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL. SEARCH LNKPAR,LNKLOW,MACTEN,UUOSYM,SCNMAC SALL ENTRY LNKPLT,GETSON CUSTVR==0 ;CUSTOMER VERSION DECVER==5 ;DEC VERSION DECMVR==1 ;DEC MINOR VERSION DECEVR==2027 ;DEC EDIT VERSION SEGMENT SUBTTL REVISION HISTORY ;START OF VERSION 2 ;137 INITIAL VERSION ;170 INTEGRATE WITH BLISS CODE ETC. ;START OF VERSION 2B ;261 Plot root if null structure ;263 Allow more words per level in stack size calculation ;315 FIX BUG CAUSED BY MACRO 50A ;342 INCLUDE EDIT 315 IN MAINTENANCE SOURCES ;START OF VERSION 2C ;557 Clean up listing for release. ;START OF VERSION 3A ;560 Release on both TOPS-10 and TOPS-20 as LINK version 3A(560) ;START OF VERSION 4 ;731 SEARCH MACTEN,UUOSYM ;765 Release on both TOPS-10 and TOPS-20 as LINK version 4(765) ;1113 Don't shrink back on TOPS-20, and add LNKPOT message. ;1174 Label and clean up all error messages. ;1217 Clean up the listings for release. ;1220 Release on both TOPS-10 and TOPS-20 as version 4A(1220). ;START OF VERSION 5.1 ;2002 Implement /PLTTYP switch ;2026 Update copyright notice ;2027 Update copyright notice SUBTTL BLISS CONVENTIONS FREG==13 VREG==15 ;LOCAL DEFINITIONS PC==17 ;REAL PLOTTER CHANNEL ;MATERIALIZE THESE SYMBOLS FOR PLOTTER CODE EXP INCHES,LEAVES,STEPS RELOC .-3 SUBTTL DEFAULTS P$LEAVES==^D16 L$LEAVES==^D8 P$INCHES==^D29 L$INCHES==^D12 P$STEPS==^D100 L$STEPS==^D20 L$BUFSIZ==^D2160 DEFINE KEYMAC (A,B)< IFIDN ,,< IRP B,< EXP P$'B >>> PLTTBL: KEYWORDS DEFINE KEYMAC (A,B)< IFIDN ,,< IRP B,< EXP L$'B >>> LPTTBL: KEYWORDS SUBTTL ENTRY LNKPLT: JFCL ;IN CASE CCL E$$POT::.ERR. (MS,0,V%L,L%I,S%I,POT,) ;[1174] ZAPTP2 ;[1264] CLEAR TEMP AREA ;NOW REDUCE CORE TO A MINIMUM MOVE T1,DY.AB ;WHAT WE NEED ADDI T1,2000 ;PLUS SPACE FOR BUFFERS IFN TOPS20,< ;[1113] SHRINK THEN EXPAND TO SAME SIZE ON TOPS-20 MOVE T2,.JBREL ;[1113] REMEMBER HOW BIG WE ARE CORE T1, ;[1113] SHRINK TO KILL PAGES JFCL ;[1113] MOVE T1,T2 ;[1113] NOW GROW TO OLD SIZE WITH EMPTY PAGES > CORE T1, ;[1113] SHRINK ON TOPS-10, GROW ON TOPS-20 JFCL ;TOO BAD SETZM CORFUL ;[1113] ALLOW LNKCOR TO WORK HARD FOR US MOVE T1,DY.UB ;PREVIOUS UPPER BOUND MOVE T2,.JBREL## ;CURRENT UPPER BOUND CAML T1,T2 ;REDUCED SIZE BUT NOT TOO FAR JRST [CAME T1,T2 ;DID WE DO ANYTHING? MOVEM T2,DY.UB ;YES, CUT BACK JRST LNKPL1] ;AND CLEAR TABLES HRL T1,T1 ADDI T1,1 ;FORM BLT PTR SETZM -1(T1) BLT T1,(T2) ;CLEAR REST OF CORE LNKPL1: ADDI T2,1 ;.JBREL+1 MOVEM T2,.JBFF## ;STOPS SCREW UPS MOVE T1,[TAB.LB+1,,TAB.LB+2] SETZM TAB.LB+1 ;CLEAR TABLES BLT T1,TAB.LB+HG.TAB MOVE T1,[TAB.AB+1,,TAB.AB+2] SETZM TAB.AB+1 BLT T1,TAB.AB+HG.TAB MOVE T1,[TAB.UB+1,,TAB.UB+2] SETZM TAB.UB+1 BLT T1,TAB.UB+HG.TAB MOVE T2,BRNMAX ;LONGEST BRANCH IMULI T2,^D50 ;50 WORDS PER LEVEL ADDI T2,^D100 ;PLUS FUDGE FACTOR PUSHJ P,DY.GET## ;GET SPACE MOVN T2,T2 ;- LENGTH HRL T1,T2 ;NEW PUSHDOWN STACK MOVEM T1,SAVEP ;WILL USE IT TO CALL PLOT ROUTINES WITH MOVEI T1,PC ;SET REAL CHAN # MOVEM T1,IO.CHN ;AS CHAN TO USE MOVE T1,IO.PTR+%PC ;GET FAKE CHAN MOVEM T1,IO.PTR+PC ;REAL CHAN SETZM IO.PTR+%PC ;JUST IN CASE ;NOW SET THE COMMON DEFAULTS MOVE T2,LODNAM ;DEFAULT NAME SKIPN I.NAM(T1) ;BUT NOT IF ALREADY SETUP MOVEM T2,I.NAM(T1) MOVSI T2,'PLT' ;DEFAULT EXT SKIPN I.EXT(T1) HLLZM T2,I.EXT(T1) MOVSI T2,(Z PC,) ;SET REAL CHAN MOVEM T2,I.CHN(T1) MOVSI T2,POB ;OUTPUT BUFFER HEADER MOVEM T2,I.BUF(T1) MOVE T2,VERNUM ;GET VERSION# SKIPN I.VER(T1) ;ALREADY SET BY SWITCH MOVEM T2,I.VER(T1) ;NOW TO SEE IF WE USE PLT OR LPT SIMULATOR MOVE T2,PPTYPE ;[2002] GET THE PLOTTER TYPE CAIN T2,$PTPPL ;[2002] EXPLICIT PLOTTER JRST PLTPLT ;[2002] YES CAIN T2,$PTPPR ;[2002] EXPLICIT PRINTER JRST LPTPLT ;[2002] YES PUSHJ P,DVCHK.## ;GET DEVCHR WORD MOVE T2,IO.CHR ;... TXNE T2,DV.DSK ;TEST FOR NUL: JRST .+3 TXNE T2,DV.LPT!DV.TTY ;NEED TO SIMULATE? JRST LPTPLT ;YES PLTPLT: MOVEI T2,.IOIBN ;[2002] REAL PLOTTER USES MODE 13 MOVEM T2,I.MOD(T1) DMOVE T1,PLTTBL ;GET DEFAULTS SKIPN PLTTAB ;AND SETUP IF NOT ALREADY MOVEM T1,PLTTAB ; BY SWITCHES SKIPN PLTTAB+1 MOVEM T2,PLTTAB+1 MOVE T1,PLTTBL+2 SKIPN PLTTAB+2 MOVEM T1,PLTTAB+2 PLTOPN: PUSHJ P,DVOPN.## ;OPEN DEVICE PUSHJ P,DVENT.## ;ENTER FILE NAME EXCH P,SAVEP ;USE NEW, LARGER PDL HRRZI FREG,1(P) ;SET UP FRAME PTR PUSHJ P,PLTO.F## ;CALL PLOTTER EXCH P,SAVEP ;PUT P BACK PUSHJ P,DVCLS.## ;CLOSE FILE JRST ENDSAV## ;AND GO BACK TO LNKXIT SUBTTL LPT SIMULATION SETUP LPTPLT: MOVEI T2,.IOASL ;LPT USES ASCII LINE MOVEM T2,I.MOD(T1) DMOVE T1,LPTTBL ;GET DEFAULTS SKIPN PLTTAB ;AND SETUP IF NOT ALREADY MOVEM T1,PLTTAB ; BY SWITCHES SKIPN PLTTAB+1 MOVEM T2,PLTTAB+1 MOVE T1,LPTTBL+2 SKIPN PLTTAB+2 MOVEM T1,PLTTAB+2 MOVEI T2,L$BUFSIZ ;NEEDED FOR SIMULATION PUSHJ P,DY.GET## MOVEM T1,LPBUF ;STORE FOR PLOTTER JRST PLTOPN ;JOIN COMMON CODE SUBTTL GETSON ROUTINE ;CALLED FROM BLISS WITH 3 ARGS ON STACK ;ARGS ARE ;1 PTR TO NODE TO BE BUILT (RETURNED) ;2 PTR TO CURRENT FATHER (0 FOR ROOT) ;3 INDEX TO WHICH SON ;ARG1 POINTS TO BLOCK OF FOLLOWING FORM LOC 0 P%HDR:! BLOCK 1 ;LENGTH ,, 0 P%UNU:! BLOCK 1 ;UNUSED P%SON:! BLOCK 1 ;ADDRESS OF SON ,, UNDEFINED P%NUM:! BLOCK 1 ;LENGTH OF NAME ,, NUMBER P%NAM:! BLOCK 2 ;NAME (2 WORDS) P%ZER:! BLOCK 1 ;SET TO ZERO RELOC GETSON: EXCH P1,-3(P) ;PICK UP THE ARGS EXCH P2,-2(P) ;... EXCH P3,-1(P) ;... SPUSH ;GET SOME ACCS SETO VREG, ;ASSUME WE WILL SUCCEED JUMPE P2,GETROO ;WANTS ROOT IF ZERO CAIN P2,-1 ;SPECIAL CASE OF NO LEAF? AOJA VREG,RET ;YES, GIVE FALSE RETURN HLRE T1,0(P2) ;GET - LENGTH MOVM T1,T1 CAIL P3,-2(T1) ;VALID INDEX? AOJA VREG,RET ;NO, GIVE ERROR RETURN MOVE T1,P2 ;PTR TO FATHER ADDI T1,2(P3) ;POINT TO SON WE WANT SKIPN T2,(T1) ;GET NUMBER & PTR AOJA VREG,RET ;HANDLES PATHOL. CASE OF 1 SON TRNN T2,-1 ;NO SON LEAF IORI T2,-1 ;YES, SET SPECIAL MARKER HLRZM T2,P%NUM(P1) ;STORE NUMBER HRLM T2,P%SON(P1) ;POINT TO ITS SON HLRZ T1,T2 ;NUMBER ONLY GETRST: MOVS T2,LNMPTR ;GET START OF NAME TABLE GETNXT: HLRZ T3,1(T2) ;GET NUMBER CAMN T1,T3 ;MATCH JRST GETNAM ;YES HRRZ T2,1(T2) ;GET NEXT ONE JUMPN T2,GETNXT ;IF THERE IS ONE SETZ T3, ;CLEAR SIZE STRNAM: HRLM T3,P%NUM(P1) ;LENGTH IN CHARS MOVEM T2,P%NAM(P1) ;STORE NAME SETZM P%NAM+1(P1) ;ZERO SECOND WORD SETZM P%ZER(P1) ;ALWAYS RET: SPOP ;RESTORE EXCH P1,-3(P) ;RESTORE ARGS EXCH P2,-2(P) ;... EXCH P3,-1(P) POPJ P, ;RETURN GETNAM: MOVE T2,(T2) ;GET NAME MOVEI T3,6 ;ASSUME SIX CHARS MOVEI T4,77 ;MASK TDNE T2,T4 ;SEE IF CHAR EXISTS JRST STRNAM ;YES, COUNT IN T3 LSH T4,6 ;SHIFT TO NEXT PLACE SOJA T3,.-3 ;ONE LESS GETROO: MOVE T1,FSTPTR ;GET START OF TREE SKIPN FSTPTR ;ZERO IF NO BRANCHES MOVEI T1,-1 ;FLAG ROOT AS END OF ALL HRLM T1,P%SON(P1) ;POINT TO IT SETZB T1,P%NUM(P1) ;SET NUMBER TO ZERO JRST GETRST ;SETUP REST OF DATA SUBTTL DATA STORAGE .ZZ==.TEMP2 ;[1264] U2 (SAVEP) ;[1264] STORE INITIAL PUSHDOWN STACK U2 (LPBUF) ;[1264] PTR TO LTP BUFFER IF NEEDED U2 (POB,3) ;[1264] PLOT OUTPUT BUFFER HEADER SUBTTL THE END PLTLIT: END