* (PL$MV) REV 1.0 INCREMENTAL PLOTTER ROUTINES * * * PROGRAM TITLE: * PL$MV (PL$MV,PL$RST,PL$LN) * * PLOTTER MOVEMENT ROUTINES * * * REVISIONS: * 1.0 (2007-05-28) * 1.1 (2007-11-08) - ADDED INTELLIGENT LINE DRAWING ROUTINE * * * * AUTHOR: * * PHILIPP HACHTMANN * * * PURPOSE: * * PROVIDE SIMPLE LIBRARY FUNCTIONS 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 * * CALL PL$LN - DRAW LINE AND LEAVE PEN DOWN * DAC X1 * DAC Y1 * DAC X2 * DAC Y2 * DAC 0 * * ******************************************************************************** * * SUBR PL$MV,MOVE SUBR PL$RST,RST SUBR PL$LN,LINE * * * REL THIS IS A RELOCATABLE OBJECT ORG '0 * ******************************************************************************** * LINE DAC 0 DRAW A LINE FROM NEAR 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 * LDA X SUB* X1P SPL SKIP IF SIGN PLUS TCA TWO'S COMPLEMENT IF NEEDED STA D1 LDA Y SUB* Y1P SPL TCA ADD D1 STA D1 * LDA X SUB* X2P SPL SKIP IF SIGN PLUS TCA TWO'S COMPLEMENT IF NEEDED STA D2 LDA Y SUB* Y2P SPL TCA ADD D2 CAS D1 JMP D2BG D2 IS BIGGER! NOP * D1BG LDA* X2P DIFFERENCE 1 IS BIGGER, SO START AT POINT X2,Y2 STA XA LDA* Y2P STA YA LDA* X1P STA XB LDA* Y1P STA YB JMP WOKI WORK! * D2BG LDA* X1P DIFFERENCE 2 IS BIGGER, SO START AT POINT X1,Y1 STA XA LDA* Y1P STA YA LDA* X2P STA XB LDA* Y2P 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 CALL PL$MV DAC XA DAC YA DAC 0 NM1 CALL PL$PD WE ARE AT BEGINNING OF LINE CALL PL$MV DAC XB DAC YB DAC 0 JMP* LINE END OF THE LINE :-) * * X1P DAC 0 ARGUMENT POINER TO X1 Y1P DAC 0 ARGUMENT POINER TO Y1 X2P DAC 0 ARGUMENT POINER TO X2 Y2P DAC 0 ARGUMENT POINER TO Y2 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 * * ******************************************************************************** * RST DAC ** SET POINT ZERO STA X CRA STA Y IMA X JMP* RST * * MOVE DAC ** MOVE YA! * LDA* MOVE GET PARAMETERS STA TMP LDA* TMP STA XN SUB X STA DX IRS MOVE LDA* MOVE STA TMP LDA* TMP STA YN SUB Y STA DY IRS MOVE IRS MOVE CORRECT RETURN ADDRESS * * HLT * LDA YN * IAB * LDA XN * HLT * JMP 1 * 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 LDA DY STA DL JMP GTE * XGTY LDA STPY STA STPS LDA STPX STA STPL LDA DX STA DL LDA DY STA DS * GTE LDA DL LONG DISTANCE LGR 1 DIVIDE BY TWO STA ERR INITIALIZE ERROR COUNTER * * * LOOP LDA DL SNZ JMP FNSH END OF WORK - HOPE SO.... SUB =1 DECREMENT DL STA DL LDA ERR SUB DS STA ERR SMI SKIP IF NOT OVERFLOWN (MINUS) JMP NDIA NO DIAG STEP ADD DL RELOAD STA ERR LDA DS SUB =1 STA DS JST* STPD JMP STEN END OF STEP NDIA JST* STPL LONG DIR STEP ONLY STEN JMP LOOP RELOOP * FNSH LDA XN STA X LDA YN STA Y JMP* MOVE END OF THE ROUTINE ********************** * * VARIABLES * X DEC 0 PEN POSITION, X VALUE Y DEC 0 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 * DL DEC 0 LONG DISTANCE NEGATIVE DS DEC 0 SHORT DISTANCE NEGATIVE 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 TMP DAC ** UNIVERSAL POINTER * * GLUE IN THE MOVEMENT 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 * * END