* (PL$MV) REV 1.0 INCREMENTAL PLOTTER ROUTINES * * * PROGRAM TITLE: * PL$MV (PL$MV,PL$RST,PL$LN,PL$X,PL$Y,PL$RMR) * * PLOTTER MOVEMENT ROUTINES * * * REVISIONS: * 1.0 (2007-05-28) - INITIAL REVISION * * 1.1 (2007-11-08) - ADDED INTELLIGENT LINE DRAWING ROUTINE * * 1.2 (2007-12-15) - ADDED PL$X and PL$Y POSITION EXPORTS * ADDED PL$RMR TRANSLATIION ROUTINE * * 1.3 (2007-12-19) - ADDED TRANSFORMATION MATRIX SUPPORT TO PL$MV. * MATRIX PL$MAT IS NOW APPLIED BEFORE * ANY MOVE INSTRUCTION. * * * AUTHOR: * * PHILIPP HACHTMANN * * * PURPOSE: * * PROVIDE DRAWING AND COORDINATE TRANSFORMATION * ROUTINES FOR INCREMENTAL PLOTTERS * * * STORAGE: * * ??? (OCTAL) * ??? (DECIMAL) * * * USAGE * * CALL PL$RST - SET VIRTUAL PLOT POSITION TO ZERO * * CALL PL$MV - MOVE TO POINT SPECIFIED * DAC XN BY XN * DAC YN AND YN VALUE * DAC 0 * * CALL PL$LN - DRAW LINE AND LEAVE PEN DOWN * DAC X1 * DAC Y1 * DAC X2 * DAC Y2 * DAC 0 * * CALL PL$RMR - MOVE ORIGIN RELATIVELY * DAC DX * DAC DY * DAC 0 * * CALL PL$SCL - SCALE TRANSFORMATION * DAC SCALE SCALE FACTOR, FLOAT * DAC 0 * * CALL PL$IDN - RESET TRANSFORMATION MATRIX * ******************************************************************************** * SUBR PL$MV,MOVE SUBR PL$RST,RST SUBR PL$X,XU SUBR PL$Y,YU SUBR PL$MVR,MVR SUBR PL$LN,LINE SUBR LINE SUBR PL$RMR,RMR SUBR PL$MAT,ATRA SUBR PL$SCL,SCLE SUBR PL$SCI,SCLI SUBR PL$ROT,ROT SUBR PL$ROI,ROTI SUBR PL$PUS,PUSH SUBR PL$POP,POP SUBR PL$INI,INIT * * * REL THIS IS A RELOCATABLE OBJECT ORG '0 * * ******************************************************************************** * **** PL$MVR - MOVE PEN RELATIVELY * MVR DAC ** * LDA* MVR STA TMPX IRS MVR LDA* MVR STA TMPY IRS MVR * LDA* TMPX * CALL OCT ADD XU STA XU * LDA* TMPY * CALL OCT ADD YU STA YU * IRS RELA SET FLAG NOP IRS MVR JMP* MVR RETURN * * * **** PL$INI - GRAPHICS INITIALISATION * * THIS ROUTINE SETS THE HARDWARE ORIGIN TO THE CURRENT PlOTTER POSITION. * IT ALSO INITIALISES THE TRANSFORMATION. * **************************************** * INIT DAC ** CRA STA XU STA YU STA X STA Y STA RELA CALL T$INIT DAC ATRA CALL PL$PU JMP* INIT * * **** PL$PUS - PUSH GRAPHIC CONTEXT ONTO THE STACK * PUSH DAC ** ENTRY LDA* PUSH STA SD1 IRS PUSH CALL S$PUSM PUSH MEMORY ROUTINE SD1 DAC ** DAC ATRA DEC 12 12 WORDS OF DATA. JMP* PUSH * * ******************************************************************************** * * **** PL$POP - POP GRAPHIC CONTEXT FROM THE STACK * POP DAC ** ENTRY LDA* POP STA SD2 IRS POP CALL S$POPM POP MEMORY ROUTINE SD2 DAC ** DAC ATRA DEC 12 12 WORDS OF DATA. JMP* POP * * * ******************************************************************************* * * **** PL$LN - DRAW A LINE * LINE DAC 0 DRAW A LINE FROM NEAREST STARTING POINT LDA* LINE X1 STA X1P IRS LINE LDA* LINE Y1 STA Y1P IRS LINE LDA* LINE X2 STA X2P IRS LINE LDA* LINE Y2 STA Y2P IRS LINE TALLY RETURN ADDRESS IRS LINE AGAIN FOR FORTRAN IV COMPATIBILITY * CALL T$APII APPLY MATRIX DAC ATRA DAC X1 DAC Y1 X1P DAC ** Y1P DAC ** DAC 0 * CALL T$APII APPLY MATRIX DAC ATRA DAC X2 DAC Y2 X2P DAC ** Y2P DAC ** DAC 0 * * LDA X SUB X1 SPL SKIP IF SIGN PLUS TCA TWO'S COMPLEMENT IF NEEDED STA D1 LDA Y SUB Y1 SPL TCA ADD D1 STA D1 * LDA X SUB X2 SPL SKIP IF SIGN PLUS TCA TWO'S COMPLEMENT IF NEEDED STA D2 LDA Y SUB Y2 SPL TCA ADD D2 CAS D1 JMP D2BG D2 IS BIGGER! NOP * D1BG LDA X2 DIFFERENCE 1 IS BIGGER, SO START AT POINT X2,Y2 STA XA LDA Y2 STA YA LDA X1 STA XB LDA Y1 STA YB JMP WOKI WORK! * D2BG LDA X1 DIFFERENCE 2 IS BIGGER, SO START AT POINT X1,Y1 STA XA LDA Y1 STA YA LDA X2 STA XB LDA Y2 STA YB * WOKI LDA X TEST IF STARTING POINT IST CURRENT POSITION CAS XA JMP MV1 JMP *+2 JMP MV1 LDA Y CAS YA JMP MV1 JMP *+2 JMP MV1 JMP NM1 * MV1 CALL PL$PU MOVE TO THE STARTING POSITION LDA XA STA XN LDA YA STA YN JST RMOV REAL MOVE * NM1 CALL PL$PD WE ARE AT BEGINNING OF LINE LDA XB STA XN LDA YB STA YN JST RMOV REAL MOVE JMP* LINE END OF THE LINE :-) * * ******************************************************************************** * **** MAKE CURRENT X AND Y THE ORIGIN * RST DAC ** * **** FIRST TRANSLATE THE CURRENT USER POSITION: CALL T$TRAN DAC ATRA DAC XU DAC YU DAC 0 CRA STA XU STA YU * JMP* RST * * ******************************************************************************** * * **** PL$MV - BASIC MOVE ROUTINE * MOVE DAC ** MOVE YA! * LDX MOVE GET PARAMETERS LDA* 0,1 X VALUE STA XU STA XN LDA* 1,1 Y VALUE STA YU STA YN LDA MOVE ADD =3 STA MOVE CORRECT RETURN ADDRESS * CALL T$APII APPLY TRANSFORMATION MATRIX TO POSITION DAC ATRA DAC XN DAC YN DAC XN DAC YN DAC 0 * JST RMOV CALL INTO REAL MOVE SUBROUTINE JMP* MOVE RETURN * **************************************** * RMOV DAC ** REAL MOVE SUBROUTINE LDA XN SUB X STA DX LDA YN SUB Y STA DY * LDA DX SMI JMP DXP DX POSITIVE * DX NEGATIVE TCA STA DX NOW, DX IS POSITIVE! LDA ML STA STPX LDA MUL STA DIYP LDA MDL STA DIYN JMP DXNP DXP LDA MR STA STPX LDA MUR STA DIYP LDA MDR STA DIYN JMP DXNP * DXNP LDA DY SMI JMP DYP DY POSITIVE * DY NEGATIVE TCA STA DY NOW, DY IS POSITIVE! LDA MD STA STPY LDA DIYN STA STPD JMP DYNP DYP LDA MU STA STPY LDA DIYP STA STPD * DYNP LDA DX CAS DY JMP XGTY DX GREATER DY YGTX NOP DY GREATER OR EQUAL DX LDA STPY STA STPL LDA STPX STA STPS LDA DX STA DS STA DS0 LDA DY STA DL STA DL0 JMP GTE * XGTY LDA STPY STA STPS LDA STPX STA STPL LDA DX STA DL STA DL0 LDA DY STA DS STA DS0 * **************************************** * * NOW ALL STEP ROUTINES, DL0, DS0, DL0, DS0 ETC. * ARE READY TO USE. * GTE LDA DL0 LONG DISTANCE LGR 1 DIVIDE BY TWO STA ERR INITIALIZE ERROR COUNTER * * *** MOVE LOOP * LOOP LDA DL LONG DISTANCE SNZ JMP FNSH END OF WORK - HOPE SO.... * SUB =1 DECREMENT LONG DISTANCE STA DL * LDA ERR ERROR COUNTER SUB DS0 STA ERR SMI SKIP IF NOT OVERFLOWN (MINUS) JMP NDIA NO DIAG STEP * *** DIAG STEP TO DO * ADD DL0 STA ERR LDA DS SUB =1 STA DS JST* STPD DO DIAGONAL STEP JMP LOOP RELOOP * *** NO DIAGONAL STEP TO DO * NDIA JST* STPL DO LONG DIRECTION STEP STEN JMP LOOP RELOOP * * *** END OF LOOP FNSH LDA XN STA X LDA YN STA Y JMP* RMOV END OF THE ROUTINE * * ******************************************************************************** * * **** SCALE OUTPUT * SCLE DAC ** LDA* SCLE STA FCTR IRS SCLE CALL T$SCLE DAC ATRA FCTR DAC 0 DAC 0 JMP* SCLE * * ******************************************************************************** * * **** ROTATE - RADIANT * ROT DAC ** LDA* ROT STA FCR2 IRS ROT IRS ROT CALL T$ROT DAC ATRA FCR2 DAC 0 DAC 0 JMP* ROT * * ******************************************************************************** * * **** RLUP - UPDATE LATENT POSITION TO REAL POSITION * RLUP DAC ** LDA RELA LOAD FLAG SNZ JMP* RLUP NOTHING TO DO JST MOVE DAC XU DAC YU DAC 0 CRA STA RELA CLEAR FLAG JMP* RLUP * * ******************************************************************************** * * **** ROTATE - INTEGER DEGREES * ROTI DAC ** LDA* ROTI STA FCR3 IRS ROTI CALL T$ROTI DAC ATRA FCR3 DAC 0 DAC 0 JMP* ROTI * * ******************************************************************************** * * **** SCALE - INTEGER PERCENTS * SCLI DAC ** LDA* SCLI STA FCR4 IRS SCLI * CALL T$SCLI DAC ATRA FCR4 DAC 0 DAC 0 JMP* SCLI * ******************************************************************************** * *** MOVE COORDINATE SYSTEM RELATIVELY * RMR DAC ** LDA* RMR STA XTR IRS RMR LDA* RMR STA YTR IRS RMR IRS RMR * CALL T$TRAN DAC ATRA XTR DAC ** YTR DAC ** DAC 0 * JMP* RMR * * ********************** * * VARIABLES * X DEC 0 HARDWARE VIEW PEN POSITION, X VALUE Y DEC 0 HARDWARE VIEW PEN POSITION, Y VALUE XN DEC 0 NEW PEN POSITION, X VALUE YN DEC 0 NEW PEN POSITION, Y VALUE DX DEC 0 X DIFFERENCE TO GO DY DEC 0 Y DIFFERENCE TO GO TMPX DEC 0 TEMPORARY X VALUE TMPY DEC 0 TEMPORARY Y VALUE * DL0 DEC 0 INITIAL LONG DISTANCE DS0 DEC 0 INITIAL SHORT DISTANCE DL DEC 0 LONG DISTANCE DS DEC 0 SHORT DISTANCE STPL DAC ** ROUTINE TO LONG DISTANCE STEP STPS DAC ** ROUTINE TO SHORT DISTANCE STEP STPD DAC ** ROUTINE TO DIAGONAL STEP ERR DEC 0 ERROR COUNTER * STPX DAC ** X STEP ROUTINE STPY DAC ** Y STEP ROUTINE DIYP DAC ** DIAGONAL X-DIR+UP STEP ROUTINE DIYN DAC ** DIAGONAL X-DIR+DOWN STEP ROUTINE * X1 DEC 0 LINE START POINT, X Y1 DEC 0 LINE START POINT, Y X2 DEC 0 LINE END POINT, X Y2 DEC 0 LINE END POINT, Y * XA DEC 0 REAL FIRST POINT X COORDINATE YA DEC 0 REAL FIRST POINT Y COORDINATE XB DEC 0 REAL SECOND POINT X COORDINATE YB DEC 0 REAL SECOND POINT Y COORDINATE D1 DEC 0 ORTHOGONAL WAY LENGTH FROM CURRENT POS TO P1 D2 DEC 0 ORTHOGONAL WAY LENGTH FROM CURRENT POS TO P2 RELA DEC 0 FLAG INDICATING THAT RELATIVE POSITIONING HAS OCCURED * **** GLUE IN THE MOVEMENT ROUTINES * MU XAC PL$U MD XAC PL$D ML XAC PL$L MR XAC PL$R MUL XAC PL$UL MUR XAC PL$UR MDL XAC PL$DL MDR XAC PL$DR * ******************************************************************************** * * **** AFFINE TRASFORMATION DATA AND REST OF GRAPHIC CONTEXT * * OLD PROGRAMS DON'T HAVE TO WORRY ABOUT THAT. NEWER PROGRAMS SHOULD. * *** HERE THE TRANSFORMATION MATRIX, INITIALLY NO TRANSFORMATION, OLD PROGRAMS *** DON'T HAVE TO CARE ABOUT THAT (HOPE SO) ATRA OCT '040300 A11 (CONSTANT 1.0) OCT '000000 OCT '000000 A12 OCT '000000 OCT '000000 A21 OCT '000000 OCT '040300 A22 (CONSTANT 1.0) OCT '000000 * VECT DEC 0 X TRANSLATION DEC 0 Y TRANSLATION XU DEC 0 USER VIEW PEN POSITION, X VALUE YU DEC 0 USER VIEW PEN POSITION, Y VALUE * VECX EQU VECT VECY EQU VECT+1 * ******************************************************************************** * * END