*
* PURPOSE:
*
-* PROVIDE SIMPLE LIBRARY FUNCTIONS FOR INCREMENTAL PLOTTERS
+* PROVIDE DRAWING AND COORDINATE TRANSFORMATION
+* ROUTINES FOR INCREMENTAL PLOTTERS
*
*
* STORAGE:
*
*
SUBR PL$MV,MOVE
+ SUBR PL$MVR,MVR
SUBR PL$RST,RST
SUBR PL$LN,LINE
+ SUBR LINE
SUBR PL$RMR,RMR
- SUBR PL$X,X
- SUBR PL$Y,Y
- SUBR PL$MAT,MTRX
+ SUBR PL$X,UX
+ SUBR PL$Y,UY
+ SUBR PL$MAT,ATRA
SUBR PL$SCL,SCLE
- SUBR PL$IDN,IDEN
+ 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
+ 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
+*
+*
+* *******************************************************************************
*
-LINE DAC 0 DRAW A LINE FROM NEAR STARTING POINT
+*
+**** 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
+ STA X1P
+ IRS LINE
+ LDA* LINE Y1
+ STA Y1P
IRS LINE
LDA* LINE X2
- STA X2P
+ STA X2P
IRS LINE
LDA* LINE Y2
- STA Y2P
+ STA Y2P
IRS LINE TALLY RETURN ADDRESS
- NOP
IRS LINE AGAIN FOR FORTRAN IV COMPATIBILITY
- NOP
-*
- NOP
- NOP
- NOP
-*
- CALL M$APII
- DAC MTRX
-* JMP Y2P+2
-X2P DAC 0
-Y2P DAC 0
+*
+ CALL T$APII APPLY MATRIX
+ DAC ATRA
+ DAC X1
+ DAC Y1
+X1P DAC **
+Y1P DAC **
DAC 0
*
- NOP
- NOP
- NOP
-*
- CALL M$APII
- DAC MTRX
-X1P DAC 0
-Y1P DAC 0
+ CALL T$APII APPLY MATRIX
+ DAC ATRA
+ DAC X2
+ DAC Y2
+X2P DAC **
+Y2P DAC **
DAC 0
- NOP
- NOP
- NOP
-*
+*
+*
LDA X
- SUB* X1P
+ SUB X1
SPL SKIP IF SIGN PLUS
TCA TWO'S COMPLEMENT IF NEEDED
STA D1
LDA Y
- SUB* Y1P
+ SUB Y1
SPL
TCA
ADD D1
STA D1
*
LDA X
- SUB* X2P
+ SUB X2
SPL SKIP IF SIGN PLUS
TCA TWO'S COMPLEMENT IF NEEDED
STA D2
LDA Y
- SUB* Y2P
+ SUB Y2
SPL
TCA
ADD D2
JMP D2BG D2 IS BIGGER!
NOP
*
-D1BG LDA* X2P DIFFERENCE 1 IS BIGGER, SO START AT POINT X2,Y2
+D1BG LDA X2 DIFFERENCE 1 IS BIGGER, SO START AT POINT X2,Y2
STA XA
- LDA* Y2P
+ LDA Y2
STA YA
- LDA* X1P
+ LDA X1
STA XB
- LDA* Y1P
+ LDA Y1
STA YB
JMP WOKI WORK!
*
-D2BG LDA* X1P DIFFERENCE 2 IS BIGGER, SO START AT POINT X1,Y1
+D2BG LDA X1 DIFFERENCE 2 IS BIGGER, SO START AT POINT X1,Y1
STA XA
- LDA* Y1P
+ LDA Y1
STA YA
- LDA* X2P
+ LDA X2
STA XB
- LDA* Y2P
+ LDA Y2
STA YB
*
WOKI LDA X TEST IF STARTING POINT IST CURRENT POSITION
JST RMOV REAL MOVE
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
+**** 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 Y
- IMA X
+ STA XU
+ STA YU
+*
JMP* RST
*
- ABS
- ORG '3000
-*
+*
+********************************************************************************
+*
+*
+**** PL$MV - BASIC MOVE ROUTINE
+*
MOVE DAC ** MOVE YA!
*
-* JMP* MOVE
-*
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 M$APLI APPLY TRANSFORMATION MATRIX TO POSITION
- DAC MTRX
+ 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
STA STPS
LDA DX
STA DS
+ STA DS0
LDA DY
STA DL
+ STA DL0
JMP GTE
*
XGTY LDA STPY
STA STPL
LDA DX
STA DL
+ STA DL0
LDA DY
- STA DS
-*
-GTE LDA DL LONG DISTANCE
+ 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
*
*
-*
-LOOP LDA DL
+*** MOVE LOOP
+*
+LOOP LDA DL LONG DISTANCE
SNZ
JMP FNSH END OF WORK - HOPE SO....
- SUB =1 DECREMENT DL
+*
+ SUB =1 DECREMENT LONG DISTANCE
STA DL
- LDA ERR
- SUB DS
+*
+ LDA ERR ERROR COUNTER
+ SUB DS0
STA ERR
SMI SKIP IF NOT OVERFLOWN (MINUS)
JMP NDIA NO DIAG STEP
- ADD DL RELOAD
+*
+*** DIAG STEP TO DO
+*
+ ADD DL0
STA ERR
LDA DS
SUB =1
STA DS
- JST* STPD
- JMP STEN END OF STEP
-NDIA JST* STPL LONG DIR STEP ONLY
+ 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
********************************************************************************
*
*
-IDEN DAC ** RESET TRANSFORMATION MATRIX
- CALL M$INIT
- DAC MTRX
- JMP* IDEN
-*
-*
-********************************************************************************
+**** SCALE OUTPUT
*
SCLE DAC **
LDA* SCLE
STA FCTR
IRS SCLE
- CALL M$SCLE
- DAC MTRX
+ CALL T$SCLE
+ DAC ATRA
FCTR DAC 0
- NOP
- NOP
- JMP* SCLE
+ DAC 0
+ JMP* SCLE
+*
+*
+********************************************************************************
+*
+*
+**** ROTATE - RADIANT
+*
+ROT DAC **
+ LDA* ROT
+ STA FCR2
+ 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 PTR
- LDA X
- SUB* PTR
- STA X
+ STA XTR
IRS RMR
LDA* RMR
- STA PTR
- LDA Y
- SUB* PTR
- STA Y
+ STA YTR
IRS RMR
IRS RMR
+*
+ CALL T$TRAN
+ DAC ATRA
+XTR DAC **
+YTR DAC **
+ DAC 0
+*
JMP* RMR
-PTR DAC **
*
-*
+*
**********************
*
* VARIABLES
*
-X DEC 0 PEN POSITION, X VALUE
-Y DEC 0 PEN POSITION, Y VALUE
+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
*
-DL DEC 0 LONG DISTANCE NEGATIVE
-DS DEC 0 SHORT DISTANCE NEGATIVE
+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
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
+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
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)
-MTRX OCT '040300 A11
+ATRA OCT '040300 A11 (CONSTANT 1.0)
OCT '000000
OCT '000000 A12
OCT '000000
OCT '000000 A21
OCT '000000
- OCT '040300 A22
+ 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
*
********************************************************************************
*