ASMB,R,L,X ** RT/DOS PLOT PACKAGE - "PLOT" ** HED ** RT/DOS PLOT PACKAGE - "PLOT" ** * * NAM PLOT,7 760218 * * ENT WHERE,FACT,PLOTB,PLOT,PLTLU * * EXT .ENTR,EXEC,IFIX EXT FLOAT * * THIS IS THE CENTRAL PROGRAM IN THE * HP REAL-TIME/DISC OPERATING SYSTEM * PLOTTER PACKAGE. * * *********** *** *** *** * * * THERE ARE FIVE SECTIONS TO THE PLOT PROGRAM: * * 1-FACT; WHICH ESTABLISHES SCALING FACTOR OF PLOT * 2-PLOTB; ALLOWS THE USER TO ESTABLISH AN EXTERNAL * BUFFER AREA. * 3-PLOT; CONVERTS THE X,Y AND PEN DATA TO PLOT * COMMANDS. * 4-WHERE; ESTABLISHES WHERE PEN IS CURRENTLY. * 5-PLTLU; ALLOWS THE USER TO DECLARE THE * LOGICAL UNIT NUMBER OF THE * PLOTTER UNIT. THIS ALLOWS THE * USE OF MORE THAN ONE PLOTTER. * * * * SKP ********** *** *** *** * * **** ** WHERE **** * * THE -WHERE- CALL ALLOWS THE USER TO DETERMINE THE * CURRENT PLOTTER PEN POSITION. THE NUMBERS PROVIDED * TO THE USER WILL BE IN FLOATING POINT. * * * - FORTRAN LINKAGE - * * CALL WHERE(X,Y) * * X SPECIFIES THE 2 WORD BUFFER FOR X. * Y SPECIFIES THE 2 WORD BUFFER FOR Y. * * * * * * * - CALLING SEQUENCE - * * JSB WHERE WHERE ROUTINE ORIGIN * DEF *+3 RETURN * DEF XC LOCATION OF USER X 2 WD BUFFER * DEF YC LOCATION OF USER Y 2 WD BUFFER * * ** ** ** ** ** * * XC OCT 0 ADDRESS OF 2 WD BUFFER FOR X YC OCT 0 ADDRESS OF 2 WD BUFFER FOR Y * * WHERE NOP JSB .ENTR DEF WHERE-2 LDA XPEN FETCH CURRENT X POSITION JSB FLOAT CONVERT FROM FIXED TO FLOATING FDV CFAC DIVIDE BY 100 (CONVERSION FACTOR) DST XC,I STORE IN USERS BUFFER * LDA YPEN FETCH CURRENT Y POSITION JSB FLOAT CONVERT FROM FIXED TO FLOATING FDV CFAC DIVIDE BY 100 (CONVERSION FACTOR) DST YC,I STORE IN USERS BUFFER JMP WHERE,I EXIT * * * * SKP * *********** ***** * * ***** FACT **** * * * THE -FACT- CALL ALLOWS THE USER TO VARY THE SCALING * FACTOR USED FOR EACH PLOT. THE SCALING FACTOR WILL * BE INITIALIZED AT "1". THE FACTOR IS * MULTIPLIED BY 100.0 FOR USE WITH THE * .01 INCH INCREMENT PLOTTER. * * * - FORTRAN LINKAGE - * * CALL FACT(N) * * N SPECIFIES THE DESIRED SCALING FACTOR * * * * * * - CALLING SEQUENCE - * * JSB FACT FACTOR ROUTINE ORIGIN * DEF *+2 RETURN * DEF FCT LOCATION OF FACTOR MODIFIER * * ** ** ** ** ** ** * * * FCT OCT 0 ADDRESS OF 2 WD FP FACTOR FACT NOP JSB .ENTR DEF FACT-1 DLD FCT,I FMP F100 DST CFAC JMP FACT,I * CFAC DEC 100.0 F100 DEC 100.0 * * SKP *********** ***** * * ***** PLOTB **** * * * * THE -PLOTB- CALL ALLOWS THE USER TO ESTABLISH A * BUFFER AREA EXTERNAL TO THE PLOT ROUTINE. IF NO * EXTERNAL BUFFER IS ESTABLISHED, A TEN WORD PLOT * BUFFER WILL BE USED. A -0- BUFFER ADDRESS DEFINES * THE INTERNAL PLOT DRIVER. * * * - FORTRAN LINKAGE - * * CALL PLOTB(ADDRESS,LENGTH) * * THE ADDRESS AND LENGTH ARE 1 WORD INTEGERS. * * * * * * - CALLING SEQUENCE : * * JSB PLOTB PLOT BUFFER ROUTINE ORIGIN. * DEF *+3 RETURN * DEF BSA BUFFER STARTING LOCATION ADDRESS. * DEF BLG BUFFER LENGTH LOCATION ADDRESS. * *** *** *** *** * * BSA BSS 1 BUFFER STARTING ADDRESS--BINARY BLG BSS 1 BUFFER LENGTH--IN BINARY * * PLOTB NOP JSB .ENTR DEF PLOTB-2 LDA BSA LOAD BUFFER STARTING SZA JMP *+6 LDA PBSA BUFFER ADDRESS IS -0- STA PBSAC THEREFORE SET UP TO LDA PBLG USE THE 10 WORD PLOT STA PBLGC BUFFER. JMP PLOTB,I STA PBSAC SET UP EXTERNAL ADDRESS LDA BLG,I AND THE STA PBLGC BUFFER LENGTH JMP PLOTB,I * PBSA DEF PBUF DEFINES THE PLOT INTERNAL BUFFER. PBLG OCT 12 DEFINES INTERNAL BUFFER LENGTH. PBUF BSS 10 INTERNAL PLOT 10 WORD BUFFER. PBSAC DEF PBUF PBLGC OCT 12 CURRENT BUFFER LENGTH---ACTIVE. * * SKP *********** ******** ****** * * ***** PLOT **** * * * THE -PLOT- ROUTINE CONVERTS THE DEFINES X,Y * PARAMETERS TO PLOT INFORMATION THEN EXECUTES * THE PLOT. THE PLOT DATA WILL BE BUFFERED AS * FOLLOWS: * * -PLOT INTERNAL--10 WORDS * * -PLOT EXTERNAL--AS DEFINED BY THE USER IN * THE -PLOTB- CALL. * ** RESTRICTION--- NO PLOT LENGTH CAN EXCEED 16,383 * INCREMENTS. (APPROXIMATELY 163 INCHES) * * * - FORTRAN LINKAGE - * * CALL PLOT(X,Y,IC) * * -X,Y DEFINES THE NEW COORDINATE TO BE PLOTTED. * * -IC DEFINES THE PEN UP/DOWN COMMAND. * * * * * * - CALLING SEQUENCE - * * JSB PLOT PLOT ROUTINE ORIGIN * DEF *+4 * DEF X ADDRESS OF X COORDINATE. * DEF Y ADDRESS OF Y COORDINATE. * DEF IC ADDRESS OF PEN COMMAND. ****** ****** * * X OCT 0 ADDRESS OF X PLOT DATA. Y OCT 0 ADDRESS OF Y PLOT DATA. IC OCT 0 ADDRESS OF PEN COMMAND. * PLOT NOP JSB .ENTR DEF PLOT-3 * * DLD X,I LOAD X PLOT DATA JSB FPC CONVERT AND FACTOR STA IX STORE FIXED X #. * DLD Y,I LOAD Y PLOT DATA JSB FPC CONVERT AND FACTOR STA IY STORE FIXED Y #. * DLD XPEN LOAD OLD X,Y PLOT DATA * * XPEN AND YPEN ARE IN 2 CONSECUTIVE * LOCATIONS FOR THIS DOUBLE LOAD. * * THE NEW DX,DY (IDX,IDY) WILL BE * CALCULATED AS FOLLOWS: * * IX - XPEN = IDX * IY - YPEN = IDY * * WHERE IX = NEW X * IY = NEW Y * XPEN = OLD X * YPEN = OLD Y * CMA,INA 2'S COMPLEMENT XPEN CMB,INB 2'S COMPLEMENT YPEN ADA IX IX - XPEN ADB IY IY - YPEN DST IDX STORE XPEN,YPEN * DLD IX SET XPEN,YPEN = IX,IY DST XPEN * * AT THIS POINT XPEN,YPEN CONTAIN THE NEW X,Y * FOR REFERENCE AS THE "OLD" POINT FOR THE NEXT * PLOT CALL. * JSB PREST INITIALIZE COUNTERS & POINTERS. * **** * * * * * PLOT COMMAND ANALYSIS * * * * * * THIS SECTION DETERMINES THE X,Y AND X-Y PLOT * COMMANDS BASED ON THE SIGN OF IDX AND IDY. * * * THE COMMANDS AND RELATIVE DIRECTIONS ARE AS FOLLOWS: * * 04 * * 06 * 05 * * * * * * * * * *** * 02 *********** 01 * *** * * * * * * * * * 12 * 11 * * 10 * ******* ***** ***** * * LDB C01 SET B = 01 LDA IDX LOAD NEW DX SSA LDB C02 DX SIGN (-), SET B = 02 STB XPMC STORE B IN X PLOT MOVE CMD. * LDA IDY LOAD NEW DY LDB C04 SET B = 04 SSA LDB C10 DY SIGN (-), SET B = 10. STB YPMC STORE B IN Y PLOT MOVE CMD. * LDA 1 MOVE B TO A. IOR XPMC OR TOGETHER X AND Y PLOT CMDS. STA XYPMC STORE X-Y PLOT COMMAND * * LDA IDX JSB PABS CHANGE DX TO ABSOLUTE. STA IDX LDA IDY JSB PABS CHANGE DY TO ABSOLUTE. STA IDY * * NOW DETERMINE THE OCTANT IN WHICH TO MAKE THE PLOT. * CMA,INA 2'S COMPLEMENT IDY ADA IDX IDY - IDX SSA,RSS JMP P001 X > OR = Y * * X IS LESS THAN Y SO INTERCHANGE IDX AND IDY. * THEN SUBSTITUTE X PLOTTER MOVE COMMAND FOR * Y PLOTTER MOVE COMMAND (YPMC TO XPMC). * DLD IDX LOAD CONSECUTIVE IDX,IDY STA IDY PUT IDX IN IDY STB IDX PUT IDY IN IDX LDA YPMC REPLACE XPMC WITH YPMC STA XPMC * P001 LDA IC,I LOAD USER PEN COMMAND JSB PABS CHANGE PEN CODE TO ABSOLUTE. CPA IP NEW PEN POSITION = OLD ? JMP P003A =, DONT EXECUTE THE PEN CMD. STA IP SET ID TO NEW PEN POSITION CPA C02 IS THE PEN DOWN (2)? JMP P002 =2, MOVE WITH PEN DOWN LDA C03 SET PEN-UP CODE TO THE STA XPLT X PLOT BUFFER. (SET =3, NOT 20) JMP P003 * ** PEN DOWN * P002 LDA C07 LOAD PEN DOWN CODE (SET=7,NOT 40) STA XPLT AND STORE IN X PLOT BUFFER. * P003 CLA STA NR ZERO OUT POTENTIAL IDY. INA STA NA SET LOOP COUNT TO 1 LDA N02 SET COUNT FOR PEN AND STA TRA MOVE TO -2 JMP P005 * P003A LDA N01 SET COUNT TO -1 FOR STA TRA MOVE ONLY. P004 LDA IDX SZA,RSS WAS THIS A PEN ONLY MOVE? JMP P100 PEN ONLY, EXIT LDA XPMC PICK UP THE X MOVE COMMAND STA XPLT AND SET FOR PLOT. LDA IDX SET THIS PLOT DATA STA NA IN THE DIVIATION BUFFER * * MULTIPLY (IDY)(2) * LDA IDY ALS (IDY)(2) STA NR * P005 LDA NA LOAD THE # OF PLOTS CMA,INA 2'S COMPLEMENT FOR LOOP COUNT STA NC SET PLOT COUNT. LDA NA ALS (NA)(2) STA NT * * THIS SECTION PUTS THE PLOT DATA IN THE BUFFER. * ** ** ** * * SET UP PLOT DEVIATION. * P006 LDA NR PICK UP LINE CONSTANT (MINOR) ADA NA ADD OLD DEVIATION STA NA STORE NEW PLOT DEVIATION * LDA NT LOAD TRUE LINE CONSTANT CMA,INA 2'S COMPLEMENT ADA NA (NA-NT) SSA JMP P007 (NT > NA) STA NA STORE NEW DEVIATION (NA-NT) * * LOAD X-Y PLOT CODE FOR PLOT MOVE. (NT <,= NA) * LDA XYPMC PICK UP X-Y PLOT MOVE CODE. JMP PXJMP * * LOAD X PLOT CODE FOR PLOT MOVE. (NT > NA) * P007 LDA XPLT PICK UP X PLOT MODE CODE. * * PX WILL VARY TO ACCOMMODATE 1 OF 4 PLOT CODES * FOR EACH WORD. * * * * EACH COMPUTER WORD IS PACKED WITH UP TO 4 * PLOT CODES PER WORD, LEFT HAND JUSTIFIED * AS FOLLOWS: * * BITS 15--12,11--8,7--4,3--0 * CH1 CH2 CH3 CH4 * * * PEN UP-- WILL BE CONVERTED FROM A 20 TO 3. * * PEN DOWN--WILL BE CONVERTED FROM A 40 TO 7. * * BOTH MUST BE CONVERTED BACK TO THE CORRECT * CODE BY THE PLOTTER DRIVER. * * PXJMP JMP PX,I * PX DEF PX1 * PX1J DEF PX1 CH 1 SET UP PX2J DEF PX2 CH 2 SET UP PX3J DEF PX3 CH 3 SET UP PX4J DEF PX4 CH 4 SET UP * * CH 1 SET UP IS EXECUTED SO AS TO LEFT HAND JUSTIFY * THE CODE IN BITS 15-12 OF THE WORD. BITS 11-0 WILL * BE = 0 TO ALLOW THE DRIVER TO TERMINATE PLOTTING * ON A PARTIAL WORD AS THE PLOT COUNT SENT TO THE * DRIVER IS FOR WORDS ONLY. * PX1 ALF,ALF POSITION THE 4 BIT CODE ALF STA PXB,I STORE CH IN BUFFER LDA PX2J SET PX JUMP FOR STA PX 2ND PLOT CH OF THE WORD. JMP PX3A GO CHECK FOR LAST CH. * * CH 2 POSITIONS THE PLOT CH IN BITS * 11-8 OF THE WORD. * PX2 ALF,ALF POSITION THE 4 BIT CODE IOR PXB,I MERG CH'S 1,2 STA PXB,I RESTORE TO BUFFER LDA PX3J SET PX JUMP FOR STA PX 3RD PLOT CH OF THE WORD. JMP PX3A GO CHECK FOR LAST CH. * * CH 3 POSITIONS THE PLOT CH IN BITS 7-4 OF THE WORD. * PX3 ALF POSITION THE 4 BIT CODE IOR PXB,I MERG CH'S 1,2,3 STA PXB,I RESTORE TO BUFFER LDA PX4J SET UP PX JUMP FOR STA PX 4TH PLOT CH OF THE WORD. PX3A ISZ NC WAS THIS THE LAST CH? JMP P006 NO, CONTINUE PROCESSING ISZ PWDO LAST CH WITH ODD CH # IN WORD. * INCREMENT WORD COUNT. JMP P009 GO CLOSE OUT * * CH 4 POSITIONS THE PLOT CH IN BITS 3-0 OF THE WORD. * PX4 IOR PXB,I MERG CH'S 1,2,3,4 STA PXB,I RESTORE TO BUFFER LDA PX1J SET UP PX JUMP FOR STA PX 1ST PLOT CH OF THE WORD. ISZ PWDO INCREMENT WORD COUNT ISZ PXB INCREMENT BUFFER ADDRESS INDEX. ISZ PBUFI IS THE BUFFER FULL? JMP P008 NOT FULL * * FULL, OUT-PUT TO THE DRIVER * JSB POUT OUTPUT THIS BUFFER FULL ISZ NC WAS THIS THE LAST PLOT MOVE? JMP *+2 NOT LAST MOVE JMP P010 LAST MOVE JSB PREST RESTORE COUNTERS AND INDEX. * * THE PLOT ROUTINE WILL NOW SET UP THE NEXT GROUP * OF PLOT CODES. * JMP P006 * ** ** ** * * * AT THIS POINT THE BUFFER IS NOT FULL BUT IT IS * NOT KNOWN IF THERE IS MORE PLOT DATA. * PWDO OCT 0 WORD COUNT OF BUFFER WORD COUNT * P008 ISZ NC LAST PLOT CODE? JMP P006 NOT LAST CODE, CONTINUE. P009 LDA N02 SET DATA FLAG FOR CLOSE OUT STA PDATA * * * * * * * * * * * * * * * * THE PLOT IS BEING TERMINATED. CHECK IF THIS * PLOT WAS A PEN ONLY. IF SO GO TO P004 AND TEST * FOR A PEN ONLY OPERATION. IF THIS WAS A PLOT * THEN EXIT AND CLEAN UP. * * A PEN MOVE IS DETERMINED BY -TRA-. * IF TRA =-1 THEN THIS WAS A PLOT MOVE * IF TRA =-2 THEN THIS WAS A PEN MOVE. * * P010 ISZ TRA PLOT MOVE JMP P200 NOT A PLOT MOVE, TEST FURTHER. * * * * * * * * * CLOSE OUT * * LDA PDATA IS TJERE PLOT DATA FOR OUTPUT? SZA JSB POUT OUTPUT THE REMAINING PLOT DATA P100 LDA IC,I SSA IS THE NEW POINT TO BECOME ORIGIN? JMP *+2 YES (IC = -#) JMP PLOT,I NO, EXIT THE PLOT ROUTINE CLA NEW ORIGIN STA IP SO ZERO OUT IP STA XPEN XPEN AND STA YPEN YPEN FOR NEW ORIGIN STA PDATA CLEAR DATA FLAG JMP PLOT,I EXIT THE PLOT ROUTINE. * * PEN MOVE - ISSUE PEN COMMAND * P200 JSB POUT ISSUE PEN COMMAND JSB PREST RESET JMP P004 CONTINUE PROCESSING. * *** *** * * ***** POUT **** * * * THIS ROUTINE OUTPUTS TO THE PLOTTER DRIVER. * POUT NOP LDA PBSAC SET BUFFER ORIGIN STA POUT2 LDA PWDO SET WORD COUNT STA POUT3 JSB EXEC CALL DEF *+5 FOR DEF C02 OUTPUT DEF POUT1 TO PLOTTER, DEF POUT2,I BUFFER POINTER DEF POUT3 AND LENGTH. CLA CLEAR DATA FLAG SO DATA WILL STA PDATA NOT BE REPLOTTED. JMP POUT,I EXIT * POUT1 NOP PLOTTER LOGICAL UNIT # POUT2 NOP BUFFER ADDRESS. POUT3 DEC 10 INTERNAL BUFFER LENGTH. * ** ** ** ** * ***** **** * * ****** PREST ***** * * * THIS ROUTINE RESETS THE INDEX'S AND COUNTERS. * * PREST NOP LDA PBLGC LOAD ACTIVE BUFFER LENGTH CMA,INA 2'S COMPLEMENT STA PBUFI SET BUFFER LENGTH COUNTER * LDA PBSAC LOAD ACTIVE BUFFER ORIGIN ADDRESS STA PXB AND SET BUFFER INDEX. * LDA PX1J SET PX JUMP FOR 1ST BUFFER STA PX DATA CHARACTER. * * CLA CLEAR STA PDATA DATA FLAG STA PWDO WORD COUNT * JMP PREST,I EXIT * * * * THIS ROUTINE MULTIPLIES THE PLOT CO-ORDINATE * BY THE SCALE FACTOR THEN CONVERTS FROM * FLOATING POINT TO FIXED. * A= X OR Y PLOT CO-ORDINATE ON ENTRY. * FPC NOP FMP CFAC (CO-ORDINATE)(PLOT FACTOR) FAD FD05 JSB IFIX CONVERT TO FIXED POINT JMP FPC,I EXIT WITH A=FIXED PLOT #. * * * * THIS ROUTINE CHANGES THE CONTENTS OF "A" TO ABSOLUTE. * * PABS NOP SSA # NEGATIVE? CMA,INA YES (-), 2'S COMPLEMENT. JMP PABS,I EXIT * * * SKP * ******** ***** ***** * *** PLTLU *** * * * THE -PLTLU- CALL ALLOWS THE USER TO SET THE * LOGICAL UNIT NUMBER FOR THE DESIRED PLOTTER. * THIS CALL MUST BE MADE TO SET THE LU # BEFORE * THE FIRST CALL TO -PLOT-; OTHERWISE THE SYSTEM * WILL TERMINATE THE USER PROGRAM BECAUSE OF AN * I/O REQUEST ERROR "LOGICAL UNIT = ZERO". * * * - FORTRAN LINKAGE - * * CALL PLTLU(ILU) * * THE LOGICAL UNIT # MUST BE INTEGER * * * - CALLING SEQUENCE : * * JSB PLTLU PLOT LU ROUTINE * DEF *+2 RETURN * DEF ILU LOCATION OF INTEGER LU # * ***** *** ***** * * * ILU BSS 1 STORAGE FOR LU # ADDRESS * * PLTLU NOP JSB .ENTR SET ADDRESS OF DEF PLTLU-1 PARAMETER IN "ILU". * LDA ILU,I SET LU # STA POUT1 IN LOCAL STORAGE. * JMP PLTLU,I RETURN SKP * * * ****** ****** ****** * ***** WORKING STORAGE *** * * * THE FOLLOWING GROUPS OF TWO WORDS MUST BE * IN 2 CONSECUTIVE MEMORY LOCATIONS. * IDX OCT 0 MAJOR PLOT MOVE (NEW DX) IDY OCT 0 MINOR PLOT MOVE (NEW DY) * XPEN OCT 0 STORAGE FOR NEW DX,DY YPEN OCT 0 FOR THIS PLOT. * IX OCT 0 ACTUAL X PLOT DATA IY OCT 0 ACTUAL Y PLOT DATA * XPMC OCT 0 X PLOT MOVE COMMAND -DOUBLE LOAD XYPMC OCT 0 X-Y PLOT MOVE COMMAND-DOUBLE LOAD YPMC OCT 0 Y PLOT MOVE COMMAND * NR OCT 0 LINE CONSTANT * NA OCT 0 DEVIATION FROM LINE * NT OCT 0 (2)(NA) * TRA OCT 0 PEN OR PLOT INDICATOR * NC OCT 0 LOOP COUNT (# OF PLOT INCREMENTS) * IP OCT 0 LAST PEN POSITION * XPLT OCT 0 CURRENT X PLOT COMMAND * * * * C01 OCT 1 C02 OCT 2 C03 OCT 3 C04 OCT 4 C07 OCT 7 C10 OCT 10 C13 DEC 13 * FD05 DEC .5 * N01 OCT 177777 -1 N02 OCT 177776 -2 * PBUFI OCT 0 BUFFER LENGTH COUNTER PDATA OCT 0 FLAG FOR PLOT DATA IN BUFFER PWOO OCT 0 WORD COUNT OF BUFFER WORD COUNT PXB OCT 0 BUFFER ADDRESSING INDEX. * END