PAGE
         LOCAL
LOC:     EQU         $
TRX1:    DZS         1               < COORDONNEE X ORIGINE SEGMENT.
TRY1:    DZS         1               < COORDONNEE Y ORIGINE SEGMENT.
TRX2:    DZS         1               < COORDONNEE X EXTREMITE SEGMENT.
TRY2:    DZS         1               < COORDONNEE Y EXTREMITE SEGMENT.
TRDX:    DZS         1               < DELTA X.
TRDY:    DZS         1               < DELTA Y.
TRDXF:   DZS         2               < DELTA X EN FLOTTANT.
<
TRCFA:   DZS         2               < COEFFICIENT A FLOTTANT.
TRCFB:   DZS         2               < COEFFICIENT B FLOTTANT.
TRNPF:   DZS         2               < NOMBRE DE PAS POUR LE TRACE (POUR
                                     < FAIRE VARIER X). CETTE VALEUR = MAX
                                     < (DELTAX,DELTAY).
TRXC:    DZS         2               < X COURANT FLOTTANT.
TRYC:    DZS         2               < Y COURANT FLOTTANT.
NMPL:    WORD        16              < NOMBRE DE MOTS PAR LIGNE.
F05:     FLOAT       0.5
                                     < POUR ARRONDIS (CF S/P 'FIX').
                                     < !!!!!! ^^^ A PARAMETRER.
<
ATRP:    WORD        TRP             < TRACE POINT.
ATRPF:   WORD        TRPF            < TRACE POINT DONT LES COORDONNEES SONT
                                     < FLOTTANTES.
AFIX:    WORD        FIX             < PASSAGE FLOAT-->FIX AVEC ARRONDI.
<
DMDIFF:  WORD        '8A01           < DIFFUSION IMAGE RESIDENTE.
         WORD        'FEF*2
         WORD        '400*8
         WORD        '0001           < OUT ROUGE.
         PAGE
         PROG
TR:      EQU         $
<
<        T R A C E   D ' U N   S E G M E N T   E N   V I D E O.
<
<                      LES COORDONNEES (X1,Y1),(X2,Y2) SONT EN
<                    'TRX1' ET 'TRX2' DU LOCAL; ET 'C' = ADRESSE IMAGE.
<
         PSR         A,B,X,Y         < SAUVEGARDES...
         PSR         L,W
         LRM         L,W
         WORD        LOC+'80         < BASE DU LOCAL.
         WORD        TRX1            < POUR PLUS TARD.
<
< CALCUL DELTAX ET DELTAY.
<
         LA          TRX2
         SB          TRX1
         STA         TRDX            < DELTAX.
         FLT
         FST         TRDXF           < DELTAX FLOTTANT.
<
         LA          TRY2
         SB          TRY1
         STA         TRDY
         JAE         TR1
         CPZ         TRDX
         JNE         TR2
<
< ICI, DELTAX = 0 ET DELTAY # 0 : LIGNE VERTICALE.
<
         ADRI        1,W             < POUR FAIRE VARIER Y DANS LA BOUCLE.
         LX          TRDY
TR3:     EQU         $
         LAI         1               < PAS DE VARIATION = 1 A PRIORI.
         CPZR        X
         JGE         TR31
         NGR         A               < PAS DE VARIATION = -1.
         NGR         X               < COUNT POSITIF.
TR31:    EQU         $
         BSR         ATRP            < TRACE POINT.
         XM          0,W
         AD          0,W             < INCREMENTATION +/- 1.
         XM          0,W
         JDX         TR31            < POINT SUIVANT.
         BSR         ATRP            < POINT EXTREME.
         JMP         TRFIN           < C'EST FINI.
TR1:     EQU         $
<
< ICI, DELTAY = 0, VOYONS DELTAX.
<
         CPZ         TRDX
         JNE         TR4
<
< ICI, DELTAX = 0 ET DELTAY = 0, TRACER 1 POINT SEULEMENT.
<
         BSR         ATRP            < TRACE POINT.
         JMP         TRFIN           < C'EST FINI.
TR4:     EQU         $
<
< ICI, DELTAX #0 ET DELTAY = 0 : LIGNE HORIZONTALE.
<
         LX          TRDX
         JMP         TR3             < ET VOILA.
TR2:     EQU         $
<
< ICI, DELTAX # 0 ET DELTAY # 0 : IL FAUT DONC CALCULER L'EQUATION
< DE LA DROITE.
<
         FLD         TRDXF           < DELTAX FLOTTANT.
         FST         TRCFA
         LA          TRDY
         FLT
         FDV         TRCFA
         JNV         $+2
         ACTD
         FST         TRCFA           < A = DELTAY / DELTAX.
<
         LA          TRX1
         FLT
         FMP         TRCFA
         FST         TRCFB
         LA          TRY1
         FLT
         FSB         TRCFB
         FST         TRCFB           < B = Y1 - AX1.
<
< T R A C E   D U   S E G M E N T
<
< ON TRACERA LE SEGMENT EN CALCULANT N POINTS AVEC
< N = MAX (DELTAX,DELTAY) EN VALEUR ABSOLUE.
<
         LA          TRDX            < DELTAX.
         JAGE        $+2
         NGR         A               < VALEUR ABSOLUE.
         LR          A,Y
         LA          TRDY
         JAGE        $+2
         NGR         A
         CPR         Y,A
         JGE         $+2
         LR          Y,A
         LR          A,X             < 'A'='X'=MAX(DELTAX,DELTAY) EN
                                     < VALEUR ABSOLUE.
         FLT
         FST         TRNPF           < NOMBRE DE PAS EN FLOTTANT.
         LYI         0               < 'Y' = NUMERO DE PAS (DE 0 A N).
<
TR5:     EQU         $
         LR          Y,A             < NUMERO DU PAS COURANT.
         FLT
         FMP         TRDXF
         FDV         TRNPF
         FST         TRXC            < (NUMERO PAS * DELTAX)/NB PAS.
         LA          TRX1
         FLT
         FAD         TRXC
         FST         TRXC            < X COURANT FLOTTANT.
<
         FMP         TRCFA
         FAD         TRCFB
         FST         TRYC            < Y COURANT = A X + B.
         BSR         ATRPF           < TRACE POINT.
         ADRI        1,Y             < PAS SUIVANT.
         CPR         X,Y
         JLE         TR5             < POINT SUIVANT.
         JMP         TRFIN           < C'EST FINI.
<
TRFIN:   EQU         $
         PLR         L,W
         PLR         A,B,X,Y
         RSR
         PAGE
TRP:     EQU         $
<
<        T R A C E   D ' U N   P O I N T.
<
<        - ARGUMENTS:
<                    'TRX1','TRY1' COORDONNEES X,Y DU POINT.
<                    'C' ADRESSE MOT DE L'IMAGE.
<                    'L' BASE DU LOCAL.
<
         PSR         A,B,X,C         < SAUVEGARDES.
<
         LA          TRY1            < COORDONNEE Y.
         MP          NMPL            < * NB MOTS PAR LIGNE.
         ADR         B,C
<
         LA          TRX1            < COORDONNEE X.
         SLRS        4               < --> NB MOTS.
         ADR         A,C
<
         LAI         'F
         AND         TRX1            < NUMERO BIT DANS LE MOT.
         LR          A,X
<
         LA          0,C
         SBT         0,X             < SET BIT.
         STA         0,C
         LAD         DMDIFF          < DEMANDE DE DIFFUSION.
         SVC         0
<
         PLR         A,B,X,C         < RESTAURATIONS.
         RSR
TRPF:    EQU         $
<
<        T R A C E   D ' U N   P O I N T   D O N T   L E S
<
<        C O O R D O N N E E S   S O N T   E N   F L O T T A N T.
<
<        - ARGUMENTS:
<                    'TRXC' 'TRYC'  :  X ET Y  FLOTTANTS.
<
         PSR         A,B,X,Y
         LX          TRX1            < SAUVER 'TRX1' ...
         LY          TRY1            < ... ET 'TRY1'.
<
         FLD         TRXC            < X COURANT FLOTTANT.
         BSR         AFIX
         STA         TRX1            < X COURANT EN FIXE.
         FLD         TRYC            < Y COURANT FLOTTANT.
         BSR         AFIX
         STA         TRY1            < Y COURANT EN FIXE.
         BSR         ATRP            < TRACE POINT.
         STX         TRX1            < RESTAURATION 'TRX1' ...
         STY         TRY1            < ... ET 'TRY1'.
         PLR         A,B,X,Y
         RSR
FIX:     EQU         $
<
<        C O N V E R S I O N   F L O A T - - > F I X   A P R E S   A R R O N D I
<
         FAD         F05             < ARRONDI.
         FIX
         RSR



Copyright © Jean-François Colonna, 2022-2022.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / École polytechnique, Institut Polytechnique de Paris, 2022-2022.