File: PXPLOT.SB of Tape: Sources/Other/new-14
(Source file text)
/ SABR SUBROUTINE PACKAGE TO HELP PLOT PROGRAMS / / PACKAGE ASSUMES A PLOT AREA OF 128 COLS BY 128 LINES / SPLIT INTO 384 BLOCKS (16 BLOCKS IN X-DIRECTION, 24 IN Y-DIRECTION) / EACH BLOCK IS (4 WORDS=8 CHARS=48 BITS) TIMES (64 LINES) / / THE WHOLE PLOT AREA IS HELD IN SWAP FILE SYS:PLOT.IM / 12 DIFFERENT MOST RECENTLY USED BLOCKS ARE IN CORE / / / CALL PLOTO INITIALISES PLOTTING ROUTINES. / / CALL PLOTC CLOSES THE PLOT AND CHAINS TO CCLDEV:PXPB.SV / TO SEND PLOT TO LPT: / / CALL PLOT(IF,IX,IY) DOES THE ACTUAL PLOTTING. IF IS A FUNCTION CODE / DEFINING WHAT PLOTTING FUNCTION IS TO BE INVOKED. / / IF=0 ESTABLISH ORIGIN AT ABSOLUTE COORDINATES IX,IY. / ANY FUTURE (X,Y) POINT WILL BE RELATIVE TO THE / ORIGIN RATHER THAN (0,0) (THE DEFAULT). / / IF=1 ESTABLISH ORIGIN AT RELATIVE COORDINATES IX,IY. / THE ORIGIN IS MOVED TO POINT (IX,IY) RELATIVE TO / ITS OLD POSITION. / / IF=2 START DRAWING AT POINT (IX,IY). THIS COMMAND / ESTABLISHES THE START OF A NEW LINE, / BUT DOES NOT DO ANY PLOTTING. / / IF=3 DRAW TO POINT (IX,IY). A STRAIGHT LINE IS DRAWN / FROM THE CURRENT POSITION TO THE GIVEN POINT. / THE NEW CURRENT POSITION IS AT THE FINAL POINT, / & ANOTHER "DRAW TO" COMMAND WILL DRAW FROM THE / END OF THE FIRST LINE. THE CURRENT POSITION IS / UNDEFINED AFTER AN ORIGIN COMMAND, OR AT THE / START OF PLOTTING, AND A "DRAW TO" COMMAND AT / THIS TIME WILL GIVE A NON-FATAL "PLTI" ERROR. / / ALL COORDINATES SPECIFIED FOR PLOTTING MUST LIE WITHIN THE PLOT, / OTHERWISE "PLTI" ERRORS WILL RESULT. \JPLOT, COMMN 3000 / RESERVE COMMON FOR PLOT IMAGE (12 BLOCKS) \JEXTR, COMMN 2600 / *KLUDGE* \JPLOT REALLY STARTS AT 10000 \JCHRS, COMMN 1400 / CHARACTER PICTURES (START AT 16000) \ICOMM, COMMN 1 / WILL BE AT 17400 \FNAME, COMMN 3 \IGREC, COMMN 1 \IGCHR, COMMN 1 \IDUDS, COMMN 33 \IDASH, COMMN 1 \IDSHC, COMMN 1 \IDSHP, COMMN 1 \X0, COMMN 3 \Y0, COMMN 3 /ONLY COMMON IN FIELD 1 !!!!! \FAKTX, COMMN 3 \FAKTY, COMMN 3 \IFONT, COMMN 1 \DXW, COMMN 3 \DYW, COMMN 3 \DXH, COMMN 3 \DYH, COMMN 3 OPDEF ANDI 0400 OPDEF TADI 1400 OPDEF ISZI 2400 OPDEF DCAI 3400 OPDEF JMSI 4400 OPDEF JMPI 5400 ENTRY PLOTO ENTRY PLOTC ENTRY PLOT LAP PLOTO, BLOCK 2 / OPEN PLOT TAD ^FN# DCA PSB IAC / SYS: 6212 / CIF 10 JMS I ^7700 / LOOKUP SYS:PLOT.IM 2 PSB, ^PLOT / BECOMES START BLOCK 0 / BECOMES - LENGTH JMP ERR TAD PSB# / CHECK LENGTH (MUST BE 384 BLOCKS) TAD (600 SZA CLA JMP ERR TAD (-6000 / CLEAR PLOT FILE DCA PSB# CLA CMA / STARTS AT 0 ! DCA 17 6211 CLR, DCAI 17 ISZ PSB# JMP CLR TAD (-40 DCA PSB# TAD PSB DCA CLRBL CLRPF, 6202 / CIF 0 JMS I ^SYSH 7010 / WRITE 12 BLOCKS F1 0000 CLRBL, 0 JMP ERR TAD (14 TAD CLRBL DCA CLRBL ISZ PSB# JMP CLRPF DCA AORGY / SET ORIGIN AT TOP LH CORNER (0,0) DCA AORGX DCA UNDEF / & POSITION UNDEFINED RETRN PLOTO PFW, 210 / 1 BLOCK FIELD 1 ^SYSH, 7607 / ADDR OF SYS: HANDLER SYSIO, 0 / READ/WRITE (RELATIVE) BLOCK TAD PSB DCA BL / SAVE ABS BLOCK NO RAR / LINK = 1 FOR WRITE, 0 FOR READ TAD PFW / ADD "1 BLOCK, FIELD 1" DCA FW 6202 / CIF 0 JMS I ^SYSH / CALL SYS HANDLER FW, 0 / READ/WRITE 1 BLOCK XBASE, 0000 / CURRENT BLOCK BASE BL, 0 / BLOCK ON DISK JMP ERR JMPI SYSIO / CLOSE PLOT PLOTC, BLOCK 2 JMS SFAC / RESTORE 'FAC' LOCATIONS TAD (-14 / 12 BLOCKS TO SAVE DCA PSB# TAD ^ADD0 / FIRST BLOCK (ANY ORDER) DCA PLOTO PLCLP, TADI PLOTO / GET BLOCK # DCA BL / TEMP INC PLOTO INC PLOTO / AT BASE TADI PLOTO DCA XBASE INC PLOTO INC PLOTO CLL CML TAD BL JMS SYSIO / WRITE ONE BLOCK ISZ PSB# / MORE ? JMP PLCLP TAD PSB / CHAIN ; SET UP CD TABLES 6211 DCAI (7620 TAD (4001 / 384 LENGTH MOD 256 = 128 DCAI (7617 / INPUT FROM PLOT FILE 6201 / CDF 0 TADI (7776 / GET CCL DEVNO XX1, 6212 / CIF 10 JMS I ^7700 / USR 2 / LOOKUP PBBLK, ^PXPB / FILE PXPB.SV 0 JMP ERR / FATAL TAD PBBLK DCA PBCHN 6201 / CDF 0 TADI (7756 / CCL ENTRY POINT 6212 / CIF 10 JMS I ^7700 6 / CHAIN PBCHN, 0 /------------------------------ ^7700, 7700 ^ADD0, ADD0 PAGE GPAR, 0 / GET PARAMETER CCDF, NOP / CDF TO CALLING FIELD TADI PLOT# INC PLOT# DCA PCDF TADI PLOT# INC PLOT# PCDF, NOP / CDF TO PARAMETER FIELD DCA PCDF TADI PCDF / GET PARAMETER JMP I GPAR PLOT, BLOCK 2 / MAIN PLOTTING ROUTINE TAD PLOT DCA CCDF JMS GPAR DCA MTEM JMS GPAR DCA NEWX JMS GPAR DCA NEWY TAD MTEM / WHAT OPERATION ? AND (7774 SZA CLA JMP PLIER / OUTSIDE VALID RANGE TAD MTEM TAD ^SWTAB DCA MTEM TADI MTEM DCA MTEM JMPI MTEM / SWITCH TO APPROPRIATE ROUTINE MTEM, 0 ^SWTAB, SWTAB SWTAB, AORG / SWITCH TABLE FOR PLOT CODES ORGN STRT TO XIT, CLA CLL CML RTL / 2; / EXIT FROM PLOT ROUTINES TAD CCDF DCA RCDI CALL 0,CLEAR / MESSY FAC RCDI, NOP / BECOMES CDF CIF RETURN FIELD JMPI PLOT# / RETURN CKX, 0 / SUBROUTINE TO CHECK X WITHIN BOUNDS SPA JMP PLIER / TOO SMALL TAD (-3000 / 1536 DEC SMA JMP PLIER / TOO BIG TAD (3000 JMPI CKX STRT, CLA IAC / START AT POINT DCA UNDEF / POSITION NOW DEFINED TAD NEWY TAD AORGY JMS CKY / CHECK Y WITHIN RANGE DCA THISY TAD AORGX TAD NEWX JMS CKX / CHECK X WITHIN RANGE DCA THISX TAD THISX / SET UP FOR OPTIMISED ARRAY ACCESS CALL 1,DIV ARG (100 CLL RTL RTL DCA NBLK / REQUIRED BLOCK LINE CALL 1,IREM ARG 0 DCA XBIT / LINE WITHIN BLOCK TAD XBIT CLL RTL DCA XPLOT / WORD LINE IN BLOCK TAD THISY CALL 1,DIV ARG (60 TAD NBLK DCA NBLK / REQUIRED BLOCK CALL 1,IREM ARG 0 LL, TAD (-14 SPA JMP LE INC XPLOT / WORD IN LINE JMP LL LE, TAD (14 DCA YBIT / BIT WITHIN WORD JMP XIT PAGE AORGY, 0 / SOME STORAGE HERE AORGX, 0 THISY, 0 THISX, 0 NEWY, 0 NEWX, 0 UNDEF, 0 TOTEM, 0 / TEMP STORE AORG, DCA AORGX / SET ABSOLUTE ORIGIN DCA AORGY ORGN, TAD AORGY / SET RELATIVE ORIGIN TAD NEWY DCA AORGY TAD AORGX TAD NEWX DCA AORGX DCA UNDEF / POSITION UNKNOWN JMP XIT TO, TAD UNDEF / DRAW TO POINT SNA CLA JMP STRT / START IF POSITION UNKNOWN TAD \IDASH / DASH LINE DEFINED ? SZA CLA JMP DSPEC / YES DCA \IDSHC / MAKE SURE OLDSH, DCA DPENDN / DASH PEN DOWN TAD THISY CIA DCA TOTEM TAD AORGY TAD NEWY JMS CKY / CHECK NEW Y WITHIN RANGE DCA THISY / UPDATE THISY PREMATURELY TAD THISY TAD TOTEM CLL CML SPA CLL CIA DCA YSTEP / MAKE + SNL CMA RAL IAC DCA YSIGN / 1 OR -1 TAD THISX CIA DCA TOTEM TAD AORGX TAD NEWX JMS CKX / CHECK NEW X WITHIN RANGE DCA THISX / UPDATE THISX PREMATURELY TAD THISX TAD TOTEM CLL CML SPA CLL CIA DCA XSTEP / MAKE + SNL CMA RAL IAC DCA XSIGN TAD XSTEP TAD YSTEP CMA DCA STEPS TAD YSTEP CIA TAD XSTEP DCA XSIDE TAD XSTEP CLL RAL DCA XSTEP TAD YSTEP CLL RAL CIA DCA YSTEP JMS SFAC / RESTORE 'FAC' LOCATIONS JMP BLKCHK / NEW BLOCK ? CKY, 0 / SUBROUTINE TO CHECK Y WITHIN BOUNDS SPA JMP PLIER / TOO SMALL TAD (-1400 / 768 DEC SMA JMP PLIER / TOO BIG TAD (1400 JMPI CKY PAGE XSIDE, 0 / STORAGE HERE TO SAVE TIME & SPACE XSTEP, 0 YSTEP, 0 YBIT, 0 YSIGN, 0 XBIT, 0 XSIGN, 0 STEPS, 0 OBLK, 0 /BLOCK 0 INITIALLY IN CORE AND FIRST NBLK, 0 XPLOT, 0 STLOOP, TAD XSIDE / DO NEXT STEP SMA SZA JMP STEPX TAD XSTEP / STEP Y DCA XSIDE TAD YBIT TAD YSIGN SPA JMP YLEFT / MOVE LEFT 1 WORD TAD (-14 SMA JMP YRITE / MOVE RIGHT 1 WORD TAD (14 DCA YBIT / SAME WORD JMP TRYX YLEFT, TAD (14 / MOVE LEFT 1 WORD DCA YBIT CLL CML IAC RAL / 3 AND XPLOT SZA CLA JMP YEND / SAME Y BLOCK CMA TAD NBLK / 1 BLOCK LEFT DCA NBLK CLL IAC RTL / 4 JMP YEND YRITE, DCA YBIT / MOVE RIGHT 1 WORD CLA IAC TAD XPLOT AND (3 SZA CLA JMP YEND / SAME Y BLOCK INC NBLK / 1 BLOCK RIGHT TAD (-4 YEND, TAD YSIGN TAD XPLOT DCA XPLOT TRYX, TAD XSIDE / STEP X AS WELL ? SPC JMP BLKCHK INC STEPS TAD XSIDE STEPX, TAD YSTEP / STEP X ( IA IN AC ) DCA XSIDE TAD XBIT TAD XSIGN SPA JMP XUP TAD (-100 SMA JMP XDWN TAD (100 DCA XBIT TAD XSIGN CLL RAL CLL RAL TAD XPLOT DCA XPLOT JMP BLKCHK XUP, TAD (100 / MOVE UP 1 BLOCK X-DIR DCA XBIT TAD (-20 TAD NBLK DCA NBLK TAD (374 JMP XEND XDWN, DCA XBIT / MOVE DOWN 1 BLOCK X-DIR TAD (20 TAD NBLK DCA NBLK TAD (-374 XEND, TAD XPLOT DCA XPLOT BLKCHK, TAD OBLK / SWAP BLOCKS IF NECESSARY CIA TAD NBLK / SAME BLOCK ? SNA CLA JMP PAINT / YES JMP ALLOC / NO, ALLOCATE BLOCK PAGE ^JPLOT, 0000 / POINTER INTO JPLOT ARRAY [TM, 0 / TEMP STORE ^INS, STEPS ^IDUD, \IDUDS DPENDN, 0 DSHPNT, 0 / SET APPROPRIATE BIT IN JPLOT PAINT, TAD DPENDN / PEN UP IN DASH PATTERN ? SZA CLA JMP NPAINT / YES, DON'T PAINT TAD XPLOT / REL . ADDRESS TAD XBASE / + BASE DCA ^JPLOT / = ABS TAD YBIT CLL CML CMA RAR DCA [TM SNL IAC RAR PNLOOP, RTL ISZ [TM JMP PNLOOP DCA [TM TAD [TM CMA 6211 / CDF TO COMMON ANDI ^JPLOT TAD [TM DCAI ^JPLOT NPAINT, ISZ \IDSHC SKP JMP DSHEND / END OF DASH SEGMENT DSHCNT, ISZ I ^INS / FORCE CDF HERE JMP STLOOP / ROUND AGAIN JMS CFAC JMP XIT DSPEC, TAD \IDSHP / POINTER UNDEFINED = NEW DASH SZA CLA JMP DSPEN TAD (-1 TAD \IDASH CLL RTL RAL TAD (-1 TAD \IDASH / * 9 TAD ^IDUD DCA \IDSHP / POINTER TO DASH-PAIRS TAD \IDSHP DCA DSHPNT / SET DYNAMIC POINTER TADI DSHPNT / GET FIRST SEGMENT LENGTH CIA SNA CMA / ZERO NOT ALLOWED DCA \IDSHC DCA DPENDN / PEN DOWN DSPEN, TAD DPENDN / TRICK FOR CDF JMP OLDSH DSHEND, INC DSHPNT / NEXT SEGMENT TADI DSHPNT SMA CLA JMP DSHMOR / MORE SEGMENTS TAD \IDSHP / RESET POINTER DCA DSHPNT CMA SKP / PEN DOWN FOR NEW SERIES DSHMOR, TAD DPENDN CMA DCA DPENDN / PEN INVERT TADI DSHPNT CIA SNA CMA / ZERO NOT ALLOWED DCA \IDSHC JMP DSHCNT SFAC, 0 TAD SACH DCA ACH TAD SACM DCA ACM TAD SACL DCA ACL AND [TM /*K* JMP I SFAC CFAC, 0 TAD ACH DCA SACH TAD ACM DCA SACM TAD ACL DCA SACL AND [TM /*K* JMP I CFAC SACH, 0 SACM, 0 SACL, 0 / FAC PRESERVATIVE PAGE /LINKED BLOCK LIST ADD0, 0 /INITIALLY BLOCK 0 ADD1 /FORWARD LINK 0000 /BUFFER ADDRESS (FIXED IN LIST) 0 /NO BACKLINK (FIRST) ADD1, 1 ADD2 0400 ADD0 ADD2, 2 ADD3 1000 ADD1 ADD3, 3 ADD4 1400 ADD2 ADD4, 4 ADD5 2000 ADD3 ADD5, 5 ADD6 2400 ADD4 ADD6, 6 ADD7 3000 ADD5 ADD7, 7 ADD10 3400 ADD6 ADD10, 10 ADD11 4000 ADD7 ADD11, 11 ADD12 4400 ADD10 ADD12, 12 ADD13 5000 ADD11 ADD13, 13 0000 /NO FORWARD LINK (LAST BLOCK) 5400 ADD12 ERR, CALL 1,ERROR / FATAL ERROR ^FN, ARG ^PLOT ^PLOT, TEXT /PLOT@@IM/ ^PXPB, TEXT /PXPB@@SV/ PLIER, CLA / NON-FATAL ERROR DCA UNDEF / POSITION UNKNOWN CALL 1,ERROR ARG PLE2 PLE2, TEXT /PLTI/ PAGE FIRST, ADD0 ATEM, 0 APNT, 0 ANF, 0 ALLOC, TAD FIRST / HERE WITH OBLK.NE.NBLK DCA APNT / POINT TO FIRST BLOCK TADI APNT / GET BLOCK INC APNT / POINT TO FLINK DCA OBLK / OLD 'OBLK' UNIMPORTANT TAD OBLK CIA TAD NBLK / BLOCK ALREADY RESIDENT ? SZA CLA TADI APNT / NOT THIS ONE, GET LINK SZA / EITHER GOT BLOCK OR END ? JMP ALLOC# / NO, LOOP TADI APNT / OK, SAVE FLINK OR (0 IF END) DCA ATEM TAD FIRST DCAI APNT / FLINK GETS OLD FIRST CMA / INCED ONCE TAD APNT DCA ANF / THIS IS NEW FIRST INC APNT / GO TO BUFFER ADD TADI APNT DCA XBASE / OUR NEW BLOCK BASE INC APNT / GO TO BACKLINK IAC TADI APNT / GET BACKBLOCK+1=FLINK DCA APNT / IN BACKBLOCK TAD ATEM / GET OLD FLINK OR 0 DCAI APNT TAD ATEM / GET LINKAGE SNA / END ? JMP ANBCK / YES, EASY TAD (3 / POINT TO BACKLINK OF NEXT DCA ATEM / ATEM STAYS NON-ZERO CMA TAD APNT / ADD OF BACKBLOCK DCAI ATEM / LINK OLD FORWBL TO OLD BACKBL ANBCK, TAD (3 TAD FIRST / POINT TO BACKLINK OF OLD FIRST DCA APNT TAD ANF / DCAI APNT / OLD FIRST BACKBL OF NEW TAD ANF DCA FIRST / SET NEW FIRST NOW !!! TAD ATEM / DO WE HAVE TO SWAP ? SZA CLA / HAVE TO SWAP IF LAST BLOCK (OLDEST) JMP ANSWP TAD OBLK / CONTAINS LAST BLOCK BLOCK CLL CML / WRITE JMS SYSIO / SYSIO USES XBASE ADDRESS TAD NBLK CLL / READ JMS SYSIO ANSWP, TAD NBLK / GET NEW BLOCK DCAI FIRST / TO FIRST BLOCK TAD NBLK DCA OBLK / OBLK=NBLK FOR COMPARE JMP PAINT END