-* (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