NLS
IDP "SIP VECTEUR 512"
< V E C T E U R 5 1 2 :
XXVEC1: VAL 1 < XXXVEC=1 : DEFINITION DES CONSTANTES.
XXVEC2: VAL 2 < XXXVEC=2 : DEFINITION DU LOCAL (OU DU
< COMMON).
XXVEC3: VAL 3 < XXXVEC=3 : DEFINITION DES SOUS-PROGRAMMES
< NECESSAIRES.
XXXIMA: VAL -1 < POUR NE DEFINIR QUE 'XXIMA'...
CALL #SIP IMAGE 512#
IF XXXVEC-XXVEC1,XWOR%9,,XWOR%9
LST
PAGE
<
<
< C O N S T A N T E S D I V E R S E S :
<
<
PROG
EDBT: DBT
CODBT: VAL '0000000@@@@
$EQU EDBT
ERBT: RBT 0,X
CORBT: VAL '0000000@@@@
$EQU ERBT
PAGE
XXXIMA: VAL XXIMA1
EOT #SIP IMAGE 512#
YYYIMA:: VAL YYYIM1 < POUR RANGER LES POINTS PAR 3 DIALOGUES
< AU 68000...
<
< CONVERSION GRAPHIQUE --> 512*512 :
<
XXVD4:: VAL LK < TAILLE DE L'ESPACE GRAPHIQUE...
XWOR%1: VAL XMAX+I
XXDEDX:: VAL XXVD4/XWOR%1=K < DECALAGE DE PASSAGE 1024-->512,
XWOR%1: VAL YMAX+I
XXDEDY:: VAL XXVD4/XWOR%1=K < IDEM...
NLS
XWOR%9: VAL ENDIF
IF XXXVEC-XXVEC2,XWOR%9,,XWOR%9
LST
<
<
< A R G U M E N T S :
<
<
VECTCO: WORD 0 < POUR LE BLOC FLOTTANT...
VECTNI: WORD 0 < NIVEAU DE GRIS MAX DU TRACE (ON DIT
< "MAX", CAR LORS D'UN TRACE ANTI-ALIASING,
< ON PRECISE AUSSI UN NIVEAU "MIN"...).
VECTRS: WORD 0 < MODE TRACE ('SBT',... 'FLOU',...).
VEDECA: WORD 0 < DECALAGE A APPORTER AU NIVEAU.
VEPOIN: WORD MMOT < PATTERN DE POINTILLES SUR 16 BITS ;
< CELLE-CI SUBIT UN DECALAGE CIRCULAIRE
< A CHAQUE PASSAGE DANS 'VECTP2'.
VECANT: WORD 0 < INDICATEUR DE TRACE ANTI-ALIASING PAR
< 'BANTI', ET NIVEAU "MIN" DE TRACE...
BANTI:: VAL BITSIG < INDICATEUR DE TRACE ANTI-ALIASING...
VECTY1: WORD 0 < COORDONNEE Y1,
VECTC: EQU VECTY1 < LISTE DES COORDONNEES (FORMAT 'TV').
VECTX1: WORD 0 < COORDONNEE X1 DU PREMIER POINT,
VECTY2: WORD 0 < COORDONNEE Y2,
VECTX2: WORD 0 < COORDONNEE X2 DU DEUXIEME POINT.
VECGY1: WORD 0 < COORDONNEE Y1,
VECGC: EQU VECGY1 < LISTE DES COORDONNEES (FORMAT 'VISU').
VECGX1: WORD 0 < COORDONNEE X1 DU PREMIER POINT,
VECGY2: WORD 0 < COORDONNEE Y2,
VECGX2: WORD 0 < COORDONNEE X2 DU DEUXIEME POINT.
XXXIMA: VAL XXIMA2
EOT #SIP IMAGE 512#
XXXIMA: VAL XXIMA4
EOT #SIP IMAGE 512#
<
< SUITE DES CONSTANTES DIVERSES :
<
NEXIST: VAL K
EXIST: VAL NEXIST+I
M000F: VAL '000F
M007F: VAL '007F
B: VAL BIT
L: VAL K < PREMIER BIT D'UN MOT...
W: VAL I < ELEMENT UNIQUE...
D: VAL I < LONGUEUR D'UN MOT...
PAGE
<
<
< S E G M E N T A T R A C E R :
<
<
INFINI: WORD '8000
<
< DONNEES DE L'INTERPOLATION ((X1,Y1),(X2,Y2)) :
<
VECTDX: WORD 0 < DELTAX=ABS(X2-X1).
VECTDY: WORD 0 < DELTAY=ABS(Y2-Y1).
VECTDF: FLOAT 0 < DELTAX EXPRIME EN FLOTTANT...
VECTA: FLOAT 0 < COEFFICIENT 'A' DE LA DROITE PORTANT
< LE SEGMENT A TRACER.
VECTB: FLOAT 0 < COEFFICIENT 'B' DE LA DROITE PORTANT
< LE SEGMENT A TRACER.
VECTN: FLOAT 0 < NOMBRE DE PAS POUR TRACER LE SEGMENT,
< SOIT MAX(ABS(DELTAX,DELTAY)).
VECTX: FLOAT 0 < COORDONNEE X DU POINT COURANT,
VECTY: FLOAT 0 < COORDONNEE Y DU POINT COURANT.
VECT05: FLOAT 0.5 < CONSTANTE D'EXCES OU DE DEFAUT...
VENIVO: WORD 0 < CONTIENT UN NIVEAU DE GRIS DE 0
< A NIV256-I.
NIVMIN: FLOAT 0 < NIVEAU "MIN" A UTILISER LORS D'UN
< TRACE ANTI-ALIASING,
NIVMAX: FLOAT 0 < ET DIFFERENCE "MAX"-"MIN" LORS DU
< MEME TRACE...
VEPTC: WORD 0 < PATTERN COURANTE DE POINTILLES EN ROTA-
< TION...
<
< VARIABLES DE MANOEUVRE :
<
FWORK8: FLOAT 0
FWORK9: FLOAT 0
<
< DONNEES DE FRUSTRATION :
<
XWOR%1: VAL BIT>XXDEDX-I < POUR LES DIVISIONS PAR EXCES SUR 'X',
XWOR%2: VAL BIT>XXDEDY-I < POUR LES DIVISIONS PAR EXCES SUR 'Y'.
IF XWOR%1-XWOR%2,,XEIF%,
IF ATTENTION : LA MISE DE L'INCREMENT DANS 'W' EST
IF MAUVAISE, IL FAUT DEUX REGISTRES !!!
XEIF%: VAL ENDIF
CFRUST: WORD XWOR%1?XWOR%2(K < CONSTANTE DE GESTION DE LA FRUSTRATION :
< =0 : LES PENTES NE VONT PAS ETRE RES-
< PECTEES EN PASSANT DU GRAPHIQUE
< A LA 'TV' BASSE-DEFINITION (DANS
< CERTAINS CAS : LORSQUE LES COORDON-
< NEES NE SONT PAS EXACTEMENT DIVISI-
< BLES...),
< #0 : UN MEME POINT GRAPHIQUE RISQUE DE
< DONNER NAISSANCE A PLUSIEURS POINTS
< 'TV' (LORSQUE LES COORDONNEES NE
< SONT PAS EXACTEMENT DIVISIBLES...),
< VOIR PAR EXEMPLE UN CARRE...
<
< DONNEES SPECIALES "ANTI-ALIASING" :
<
FPENTE: FLOAT 0 < COEFFICIENT DE PONDERATION (COMPRIS
< ENTRE 0 ET 1) PERMETTANT DE CALCULER
< LE NIVEAU DES 2 POINTS VOISINS DU POINT
< DIT "CENTRAL"...
APENTE: WORD 0 < REPRESENTATION ENTIERE DE LA VALEUR
< ABSOLUE (SAUF EXCEPTION) DE LA PENTE
< 'A' DE LA DROITE ; VAUT :
< =0 : FAIBLE PENTE (ANGLE < PI/4),
< >0 : FORTE PENTE (ANGLE > PI/4),
< <0 : DROITE VERTICALE.
VPTISO: WORD 0 < INDICATEUR DE POINT ISOLE :
< =0 : POINT D'UN VECTEUR,
< #0 : POINT ISOLE.
<
< SOUS-PROGRAMMES NECESSAIRES :
<
VECTA1: WORD VECTP1 < TRACE D'UN POINT DONNE PAR SES
< COORDONNEES ENTIERES,
VECTA2: WORD VECTP2 < TRACE DU POINT COURANT DONNE PAR
< SES COORDONNEES FLOTTANTES.
VECTA4: WORD VECTP4 < SOUS-PROGRAMME DE CHOIX DU NIVEAU DE
< GRIS D'UN POINT, ET DE SON TRACE.
VECTA3: WORD VECTP3 < "ARRONDI" D'UN NOMBRE FLOTTANT...
AVE512: WORD VEC512 < TRACE D'UN VECTEUR...
<
< TAILLE DE L'IMAGE :
<
VECTNC: WORD XMAX < POUR VALIDER LES ABSCISSES,
VECTNL: WORD YMAX < POUR VALIDER LES ORDONNEES.
<
< MODE DE TRACE :
<
VECTSB:: VAL EXIST < MODE 'SBT',
VECTRB:: VAL NEXIST < MODE 'RBT'.
VECTIB:: VAL -VECTRB-VECTSB < MODE 'IBT'.
IF BANTI-BITSIG,,XWOR%,
IF ATTENTION : LES TESTS D'ANTI-ALIASING VONT MERDER !!!
XWOR%: VAL ENDIF
<
< DISCRIMINATION LOGIQUE FLOUE
< ET LOGIQUE BINAIRE :
<
XWOR%1: VAL MMOT=K
XWOR%2: VAL NBITMO-B-XWOR%1 < DERNIER BIT DU CHAMP 'VECSRI',
VELOGD:: VAL XWOR%2-I < BIT ARGUMENT DISCRIMINATEUR DE LA LOGIQUE
< FLOUE ET DE LA LOGIQUE BINAIRE.
VELOGF:: VAL VELOGD-I < BIT DONNANT LA VALEUR DE 'VELOGD' DANS
< LE CAS DE LA LOGIQUE FLOUE ; DONC :
< 'VELOGD'='VELOGF' ==> LOGIQUE FLOUE,
< 'VELOGD'#'VELOGF' ==> LOGIQUE BINAIRE.
VELODD:: VAL VELOGD+XWOR%1 < IDEM A 'VELOGD', MAIS 'VECSRI' ETANT
< CADRE A DROITE,
VELODF:: VAL VELOGF+XWOR%1 < DE MEME POUR 'VELOGF'...
XWOR%3: VAL VECTSB=K
XWOR%3: VAL NBITMO-B-XWOR%3 < DERNIER BIT DE 'VECTSB'...
IF XWOR%3-VELODD,,,XEIF%
IF ATTENTION : LA POSITION DE 'VELOGD' EST MAUVAISE
IF SI L'ON VEUT UNE COMPATIBILTE AVEC LES VERSIONS
IF ANTERIEURES DE CMS5 ET DES PROGRAMMES !!!
XEIF%: VAL ENDIF
IF XWOR%3-VELODF,,,XEIF%
IF ATTENTION : IDEM, 'VELOGF' EST MAUVAIS !!!
XEIF%: VAL ENDIF
NLS
XWOR%9: VAL ENDIF
IF XXXVEC-XXVEC3,XWOR%9,,XWOR%9
LST
XXXIMA: VAL XXIMA3
EOT #SIP IMAGE 512#
XXXIMA: VAL XXIMA5
EOT #SIP IMAGE 512#
PAGE
<
<
< T R A C E D U P O I N T ( X 1 , Y 1 ) :
<
<
< ARGUMENT :
< VECTX1,VECTY1=COORDONNEES ENTIERES DU POINT A TRACER.
<
<
VECTP1: EQU $
PSR A,B,X,Y < SAUVEGARDES.
<
< LE POINT (X1,Y1) EST-IL DANS L'ECRAN ???
<
LA VECTX1 < COORDONNEE X1 :
JAL AKMTV9 < HORS-ECRAN...
CP VECTNC < ???
JG AKMTV9 < HORS-ECRAN...
LA VECTY1 < COORDONNEE Y1 :
JAL AKMTV9 < HORS-ECRAN...
CP VECTNL < ???
JG AKMTV9 < HORS-ECRAN...
<
< CAS OU LE POINT (X1,Y1) EST VISIBLE :
<
LX VECTX1 < (X)=COORDONNEE 'X',
LY VECTY1 < (Y)=COORDONNEE 'Y'.
<
< DETERMINATION DU NIVEAU COURANT DU POINT :
<
BSR ALOADP < (A)='NC'...
<
< TEST DU NIVEAU ANTERIEUR 'NC' :
<
PSR X
LX VEDECA < X=DECALAGE A APPLIQUER AU NIVEAU 'NC',
SLRS L,X < ON DECALE LE NIVEAU COURANT DU POINT
< COURANT, QUITTE A LE FAIRE DISPARAITRE...
< (NC) DECALE EST ENCORE APPELE 'NC'...
PLR X
LB VENIVO < B=NIVEAU DEMANDE,
< SOIT : B=N.
<
< DISCRIMINATION ENTRE LES 2 LOGIQUES :
<
PSR A,X
LA VECTRS < (A)=MODE DEMANDE :
LXI K < (X)=DISCRIMINATEUR DES LOGIQUES,
TBT VELODD
ADCR X
TBT VELODF
SBCR X < (X)=0 : 'VELODD'='VELODF' ==> LOGIQUE
< FLOUE...
< (X)#0 : 'VELODD'#'VELODF' ==> LOGIQUE
< BINAIRE...
CPZR X < ALORS QUELLE EST LA LOGIQUE DEMANDEE ???
< (A NOTER QUE 'VELOGD'='VELOGF' EST
< COMPATIBLE AVEC L'ANCIENNE VERSION...)
PLR A,X
JE VECTZ1 < CAS DE LA LOGIQUE FLOUE...
<
<
< L O G I Q U E B I N A I R E :
<
<
PSR A < SAUVEGARDE DU NIVEAU ANTERIEUR...
LA VECTRS < (A)=MODE DEMANDE EN LOGIQUE BINAIRE,
IBT VELODD < ET ON SE RAMENE AU FLOU...
CPI NEXIST < ALORS QUEL EST L'OPERATEUR ???
PLR A < (A)=NIVEAU ANTERIEUR...
IF VECTSB-K,,,XEIF%
IF ATTENTION : 'VECTSB' DOIT ETRE POSITIF !!!
XEIF%: VAL ENDIF
IF VECTRB-K,,XEIF%,
IF ATTENTION : 'VECTRB' DOIT ETRE NUL !!!
XEIF%: VAL ENDIF
IF VECTIB-K,XEIF%,,
IF ATTENTION : 'VECTIB' DOIT ETRE NEGATIF !!!
XEIF%: VAL ENDIF
IF NEXIST-K,,XEIF%,
IF ATTENTION : LES BRANCHEMENTS QUI SUIVENT SON IDIOTS !!!
XEIF%: VAL ENDIF
JG VECTZ7 < CAS DE .OR. LOGIQUE...
JE VECTZ6 < CAS DE .AND. LOGIQUE...
<
< .EOR. LOGIQUE :
<
EORR B,A < (A)=A.EOR.B,
JMP VECTWD < VERS L'ECRITURE DANS L'IMAGE...
<
< .OR. LOGIQUE :
<
VECTZ7: EQU $
ORR B,A < (A)=A.OR.B,
JMP VECTWD < VERS L'ECRITURE DANS L'IMAGE...
<
< .AND. LOGIQUE :
<
VECTZ6: EQU $
ANDR B,A < (A)=A.AND.B,
JMP VECTWD < VERS L'ECRITURE DANS L'IMAGE...
<
<
< L O G I Q U E F L O U E :
<
<
VECTZ1: EQU $
CPZ VECTRS < QUEL EST LE MODE DU TRACE ???
JG VECTW7 < 'SBT' : C'EST L'OPERATEUR .OR.
JE VECTW6 < 'RBT' : C'EST L'OPERATEUR .AND.
<
< 'IBT' FLOU : C'EST L'OPERATEUR .EOR. FLOU :
<
PSR X,Y
LXI NIV256-I
SBR A,X < X=.NOT.(A)=.NOT.(NC), QUE L'ON VA
< NOTER NA...
LYI NIV256-I
SBR B,Y < Y=.NOT.(B)=.NOT.(N), QUE L'ON VA
< NOTER NB...
CPR A,Y < CALCUL DE A.AND.NB :
JGE VECTWI < 'A' EST DEJA LE 'MIN'...
LR Y,A < C'EST 'Y' LE MIN...
VECTWI: EQU $
CPR B,X < CALCUL DE B.AND.NA :
JGE VECTWJ < 'B' EST DEJA LE 'MIN'...
LR X,B < C'EST 'X' LE MIN...
VECTWJ: EQU $
PLR X,Y
JMP VECTW7 < MAINTENANT, ON VA CALCULER :
< (A.AND.NB).OR.(NA.AND.B), C'EST-A-DIRE
< QUE L'ON EQUIVAUT MAINTENANT A 'SBT'...
<
< 'RBT' : C'EST L'OPERATEUR .AND. FLOU :
<
VECTW6: EQU $
CPR A,B < CALCUL DE A.AND.B :
JGE VECTWD < 'A' EST DEJA LE 'MIN'...
JMP VECTWH < C'EST 'B' LE 'MIN'...
<
< 'SBT' : C'EST L'OPERATEUR .OR. FLOU :
<
VECTW7: EQU $
CPR A,B < CALCUL DE A.OR.B :
JLE VECTWD < 'A' EST DEJA LE 'MAX'...
VECTWH: EQU $
LR B,A < C'EST 'B' LE 'MAX'...
<
< MISE EN PLACE DU NOUVEAU NIVEAU DU POINT COURANT :
<
VECTWD: EQU $
BSR ASTORP < (X,Y) <-- (A).
VECTWL: EQU $
AKMTV9: EQU $
VECTV9: EQU $ < CAS DES OVER-SCREEN...
PLR A,B,X,Y < RESTAURATIONS.
RSR
PAGE
<
<
< C A L C U L D U N I V E A U D E G R I S
< E T T R A C E D U P O I N T :
<
<
< FONCTION :
< CE SOUS-PROGRAMME CALCULE LA DISTANCE
< DU POINT ENTIER COURANT (X,Y)
< AU POINT FLOTTANT COURANT (VECTX,VECTY)
< SUIVANT LA NORME EUCLIDIENNE ;
< A PARTIR DE CETTE DISTANCE, ON EN DEDUIT
< UN NIVEAU DE GRIS : PLUS LE POINT ENTIER
< EST PRES DU POINT FLOTTANT, PLUS IL EST
< LUMINEUX...
<
<
< ARGUMENTS :
< (VECTX,VECTY)=COORDONNEES DU POINT FLOTTANT,
< (X,Y)=COORDONNEES DU POINT ENTIER.
< (FPENTE)=COEFFICIENT (ENTRE 0 ET 1) DE PONDE-
< RATION DES NIVEAUX...
<
<
VECTP4: EQU $
PSR A,B
STX VECTX1 < ARGUMENT 'X' DE 'VECTP1',
STY VECTY1 < ARGUMENT 'Y' DE 'VECTP1'.
FLD FPENTE < (A,B)=COEFFICIENT DE CALCUL DU NIVEAU
< DU POINT COURANT...
FMP NIVMAX < ET ON SE RAMENE
FAD NIVMIN < DANS ("MIN","MAX")...
FCMZ NIVMIN < LE MINIMUM DEMANDE ETAIT-IL NUL ???
JNE VECTWK < NON, DONC ON CONSERVE L'INTERPOLATION
< QUI A ETE FAITE DANS ("MIN","MAX") ;
FST FWORK9 < OUI, ON FAIT ON VA ALORS REMPLACER LE
< NIVEAU MINIMUM PAR LE NIVEAU ANTERIEUR
< DU POINT COURANT, SOIT "NA", ET INTER-
< POLER DANS ("NA","MAX") :
< FWORK9=FPENTE*NIVMAX (PUISQUE NIVMIN=0).
BSR VECTA3 < (A)=NIVEAU QUE PRENDRAIT LE POINT SI
< ON INTERPOLAIT ENTRE LE NOIR ET
< LE MAX,
PSR A < ET SAUVEGARDE...
LAI I
FLT
FSB FPENTE < 1-FPENTE,
FST FWORK8 < FWORK8=1-FPENTE,
BSR ALOADP < (A)=NIVEAU ANTERIEUR(X,Y), SOIT "NA"...
PLR B < (B)=VALEUR DE 'A' EMPILEE CI-DESSUS,
CPR A,B < LA VALEUR ANTERIEURE EST-ELLE EGALE A
< LA VALEUR QU'ON OBTIENDRAIT ENTRE LE
< NOIR ET LE MAX ???
JNE VECTWN < NON, ON VA INTERPOLER ENTRE 'NA' ET
< 'NIVMAX'...
LAI XXNOIR < OUI, C'EST NIVMAX*FPENTE QU'ON PREND...
< (ET CECI A CAUSE DU PROBLEME DES TRAITS
< QUI SE REPASSE DESSUS AU MOINS 2 FOIS
< DE SUITE)
VECTWN: EQU $
FLT
FMP FWORK8 < NA*(1-FPENTE),
FAD FWORK9 < NA*(1-FPENTE)+NIVMAX*FPENTE, SOIT
< DONC UNE VALEUR INTERPOLEE DANS LE
< SEGMENT ("NA","MAX")...
VECTWK: EQU $
BSR VECTA3 < A=NIVEAU A ATTRIBUER AU POINT (X,Y).
JAL VECTWA < ERREUR...
CPI NIV256-I < VALIDATION, SUITE...
JLE VECTW3 < OK...
VECTWA: EQU $
QUIT 1 < E R R E U R P R O G R A M M E...
VECTW3: EQU $
STA VENIVO < MEMORISATION DU NIVEAU...
BSR VECTA1 < ET TRACE DU POINT (VECTX1,VECTY1)
< AVEC LE NIVEAU 'VENIVO'...
PLR A,B
RSR
PAGE
<
<
< T R A C E D U P O I N T C O U R A N T ( X , Y ) :
<
<
< ARGUMENT :
< VECTX,VECTY=COORDONNEES DU POINT A TRACER EN FLOTTANT.
<
<
VECTP2: EQU $
PSR A,B,X,Y
<
< GESTION DES POINTILLES :
<
LA VEPTC < LE MOMENT EST-IL VENU ???
TBT BITSIG < ???
JNC VEKT42 < NON, ON NE TRACE RIEN...
LX VECTX1 < SAUVER 'VECTX1' ...
LY VECTY1 < ... ET 'VECTY1'.
LA VECTNI < OUI,
CPZ VECANT < EST-CE L'ANTI-ALIASING ???
JGE VECTVD < NON, IL S'AGIT BIEN D'UN NIVEAU DE GRIS..
<
< CAS D'UN TRACE ANTI-ALIASING :
<
PSR X,Y
LA INFINI
STA APENTE < DROITE VERTICALE A PRIORI...
FLD VECT05
FST FPENTE < A PRIORI, ON SUPPOSE QU'IL S'AGIT DE
< DROITES VERTICALES OU HORIZONTALES, OU
< DE POINTS ISOLES OU D'EXTREMITES.
FLD VECTA < (A,B)=PENTE FLOTTANTE,
FABS < DONT ON PREND LA VALEUR ABSOLUE,
FIX < PUIS LA VALEUR ENTIERE :
JV VECTZK < DEBORDEMENT, ON CONSIDERE LA DROITE
< VERTICALE...
STA APENTE < OK, CET INDICATEUR PRECISE :
< =0 : FAIBLE PENTE,
< >0 : FORTE PENTE,
< <0 : DROITE VERTICALE.
VECTZK: EQU $
PENT45:: VAL W/W < DEFINITION D'UNE PENTE A 45 DEGRE...
< NOTA IMPORTANT : ETANT DONNE L'INVER-
< SION DE L'AXE 'OY', LE REFERENTIEL
< N'EST PAS DIRECT : IL Y A SYMETRIE PAR
< RAPPORT A 'OX', ET ALORS TOUTES LES
< REFERENCES A 'PENT45' SERONT INVERSEES...
IF PENT45-K-I,,XEIF%,
IF ATTENTION : SI 'PENT45' NE VAUT PAS 1,
IF ON NE PEUT PAS DISTINGUER LES PENTES
IF FAIBLES (ANGLE INFERIEUR A PI/4) PAR
IF UN TEST DE NULLITE !!!
XEIF%: VAL ENDIF
FLD VECTX
FCAZ
JL VECTWC < HORS-ECRAN : ON EVITE DE PLUS UN
< MECHANT PROBLEME LIE A L'INSTRUCTION
< 'FIX' QUI TRONQUE PAR EXCES LES
< NOMBRES NEGATIFS...
CPZ APENTE < COMMENT EST-LA PENTE DE LA DROITE ???
JE VECTZG < FAIBLE...
FIX < FORTE : LA COORDONNEE 'X' EST DONC LA
< PARTIE ENTIERE PAR DEFAUT DE LA
< VALEUR FLOTTANTE 'VECTX'.
JMP VECTZH
VECTZG: EQU $
BSR VECTA3 < FAIBLE : LA COORDONNEE 'X' EST OBTENUE
< PAR LA PLUS PROCHE VALEUR ENTIERE DE
< 'VECTX' AFIN D'EVITER DES TROUS DANS
< LE TRACE...
VECTZH: EQU $
LR A,X < (X)=COORDONNEE DU PREMIER POINT ENTIER.
< (DIT "POINT CENTRAL")
FLD VECTY
FCAZ
JL VECTWC < HORS-ECRAN...
CPZ APENTE < COMMENT EST LA PENTE DE LA DROITE ???
JNE VECTZI < FORTE (>0) OU VERTICALE (<0)...
FIX < FAIBLE : LA COORDONNEE 'Y' EST LA
< VALEUR ENTIERE PAR DEFAUT DE LA VALEUR
< FLOTTANTE 'VECTY'.
JMP VECTZJ
VECTZI: EQU $
BSR VECTA3 < FORTE : LA COORDONNEE 'Y' EST LA VALEUR
< ENTIERE LA PLUS PROCHE DE LA VALEUR
< FLOTTANTE 'VECTY' AFIN D'EVITER DES
< TROUS...
VECTZJ: EQU $
LR A,Y < (Y)=COORDONNEE DU PREMIER POINT ENTIER.
< (DIT "POINT CENTRAL")
LA VECTNI
STA VENIVO
STX VECTX1
STY VECTY1
BSR VECTA1 < TRACE DU "POINT CENTRAL" (X,Y), AVEC
< LE NIVEAU MAXIMAL 'NIVMAX'...
<
< DISCRIMINATION SUIVANT LA
< PENTE DE LA DROITE :
<
FCMZ VECTA < COMMENT EST LA DROITE ???
JE VECTZO < HORIZONTALE, ON A DEJA : (FPENTE)=F05...
CPZ APENTE < ALORS, QUELLE FAMILLE ???
JL VECTZO < VERTICALE, ON A DEJA : (FPENTE)=F05...
JG VECTZQ < LA DROITE A UNE FORTE PENTE SANS ETRE
< VERTICALE...
<
< CAS DES DROITES DE FAIBLE
< PENTE NON HORIZONTALE :
<
LR Y,A
FLT
FSB VECTY
FABS
FST FPENTE < LA PENTE EST FAIBLE EN VALEUR ABSOLUE,
< ET ALORS :
< FPENTE=ABS(VECTY-Y), C'EST-A-DIRE LA
< MESURE EN VALEUR ABSOLUE SUR L'AXE
< DES 'Y' DE LA DISTANCE DU POINT FLOTTANT
< AU POINT ENTIER...
JMP VECTZO
<
< CAS DES DROITES DE FORTE
< PENTE NON VERTICALE :
<
VECTZQ: EQU $
LR X,A
FLT
FSB VECTX
FABS
FST FPENTE < A PRIORI, ON SUPPOSE QUE LA PENTE DE
< DROITE VA ETRE FORTE EN VALEUR ABSOLUE,
< ET ALORS :
< FPENTE=ABS(VECTX-X), C'EST-A-DIRE LA
< MESURE EN VALEUR ABSOLUE SUR L'AXE
< DES 'X' DE LA DISTANCE DU POINT FLOTTANT
< AU POINT ENTIER...
VECTZO: EQU $
CPZ VPTISO < EST-CE UN POINT ISOLE ???
JE VECTZN < NON...
<
< CAS DES POINTS ISOLES :
<
ADRI I,Y
BSR VECTA4 < (X,Y+1) <-- NIVMAX/2,
ADRI -I,X
BSR VECTA4 < (X-1,Y+1) <-- NIVMAX/2,
ADRI -I,Y
BSR VECTA4 < (X-1,Y) <-- NIVMAX/2,
ADRI -I,Y
BSR VECTA4 < (X-1,Y-1) <-- NIVMAX/2,
ADRI I,X
BSR VECTA4 < (X,Y-1) <-- NIVMAX/2,
ADRI I,X
BSR VECTA4 < (X+1,Y-1) <-- NIVMAX/2,
ADRI I,Y
BSR VECTA4 < (X+1,Y) <-- NIVMAX/2,
ADRI I,Y
JMP VECTZM < POUR :
< (X+1,Y+1) <-- NIVMAX/2.
<
< DISCRIMINATION DES PENTES :
<
VECTZN: EQU $
IF PENT45-K-I,,XEIF%,
IF ATTENTION : LE TEST SUIVANT EST IDIOT !!!
XEIF%: VAL ENDIF
CPZ APENTE < COMMENT EST LA PENTE DE LA DROITE ???
JNE VECTZC < FORTE (>0), OU VERTICALE (<0)....
<
< CAS DES FAIBLES PENTES :
<
ADRI I,Y
BSR VECTA4 < (X,Y+1) <-- NIVMAX*FPENTE,
ADRI -I-I,Y
JMP VECTZE < (X,Y-1) <-- NIVMAX*(1-FPENTE).
<
< CAS DES FORTES PENTES :
<
VECTZC: EQU $
ADRI I,X
BSR VECTA4 < (X+1,Y) <-- NIVMAX*FPENTE,
ADRI -I-I,X < POUR :
< (X-1,Y) <-- NIVMAX*(1-FPENTE).
<
< TRACE DU DEUXIEME POINT :
<
VECTZE: EQU $
LAI I < PAS DE PASSAGE D'UN POINT A L'AUTRE...
FLT
FSB FPENTE
FST FPENTE < FPENTE=1-FPENTE...
VECTZM: EQU $
BSR VECTA4 < ET MARQUAGE DU DEUXIEME POINT SUIVANT
< LE CONTENU DES REGISTRES 'X' ET 'Y', ET
< AVEC LE NIVEAU NIVMAX*(1-FPENTE)...
VECTWC: EQU $
PLR X,Y
JMP VECTW8 < VERS LA SORTIE...
<
< CAS D'UN TRACE AVEC NIVEAU DE GRIS :
<
VECTVD: EQU $
STA VENIVO < ON MEMORISE LE NIVEAU DE GRIS DEMANDE ;
< CETTE OPERATION EST D'AILLEURS SUREMENT
< INUTILE, PUISQUE REALISEE AU DEBUT DE LA
< PHASE D'INTERPOLATION, MAIS...
<
< TRACE SANS NIVEAU DE GRIS :
<
VECTW9: EQU $
FLD VECTX < X COURANT FLOTTANT.
BSR VECTA3
STA VECTX1 < X COURANT EN FIXE.
FLD VECTY < Y COURANT FLOTTANT.
BSR VECTA3
STA VECTY1 < Y COURANT EN FIXE.
BSR VECTA1 < TRACE POINT.
VECTW8: EQU $
STX VECTX1 < RESTAURATION 'VECTX1' ...
STY VECTY1 < ... ET 'VECTY1'.
<
< GESTION DES POINTILLES, ET SORTIE :
<
VEKT42: EQU $
LA VEPTC
SCLS BIT < ET ON ROTATE...
STA VEPTC
PLR A,B,X,Y
RSR
PAGE
<
<
< A R R O N D I D ' U N N O M B R E F L O T T A N T :
<
<
< ARGUMENT :
< (A,B)=NOMBRE FLOTTANT.
<
<
< RESULTAT :
< A=NOMBRE FLOTTANT ARGUMENT CONVERTI EN
< ENTIER PAR EXCES OU PAR DEFAUT SUIVANT
< LES CAS...
<
<
VECTP3: EQU $
FCAZ < LE NOMBRE EST-IL POSITIF OU NEGATIF ???
JL VECTWE < NEGATIF...
FAD VECT05 < POSITIF : ARRONDI PAR ADDITION DE 0.5...
JMP VECTWF < VERS LA CONVERSION ENTIERE...
VECTWE: EQU $
FSB VECT05 < NEGATIF : ARRONDI PAR SOUSTRACTION...
VECTWF: EQU $
FIX < CONVERSION ENTIERE...
RSR
PAGE
<
<
< T R A C E D U S E G M E N T ( ( X 1 , Y 1 ) , ( X 2 , Y 2 ) ) :
<
<
< FONCTION :
< CE MODULE EST CHARGE DE L'INTERPOLATION
< GRAPHIQUE ENTRE 2 POINTS ARGUMENTS (X1,Y1)
< ET (X2,Y2), SUIVANT LE MODE 'SBT'/'RBT' PRECISE
< PAR L'ARGUMENT 'VECTNI'.
<
<
< ARGUMENTS :
< VECTNI=NIVEAU PRINCIPAL OU "MAX" (DE 0 A 255),
< VECANT=INDICATEUR D'ANTI-ALIASING (BIT 'BANTI'=0),
< ET CADRE A DROITE LE NIVEAU "MIN",
< VEPOIN=PATTERN SUR 16 BITS DE POINTILLE,
< VEDECA=DECALAGE DU NIVEAU,
< VECTRS=MODE DU TRACE :
< 0001="OR" FLOU,
< 0000="AND" FLOU,
< FFFF="EOR" FLOU,
< 0003="OR" BINAIRE,
< 0002="AND" BINAIRE,
< FFFD="EOR" BINAIRE.
<
<
VEC512: EQU $ < POINT D'ENTREE...
PSR A,B,X,Y
PSR W
LAD VECTC
LR A,W < (W)=BASE DE LA LISTE DES SEGMENTS AU
< CAS OU LE SEGMENT COURANT SERAIT
< HORIZONTAL OU VERTICAL...
<
< TRAITEMENT DES ARGUMENTS :
<
LA VECTNI < (A)=NIVEAU "MAX"...
STA VENIVO < INITIALISATION DE 'VENIVO', AU CAS OU
< L'ON TOMBERAIT SUR UNE HORIZONTALE OU
< UNE VERTICALE...
LA VECANT
TBT BANTI < L'ANTI-ALIASING EST-IL DEMANDE ???
JNC VECTVE < NON...
RBT BANTI < OUI : RECUPERATION DU NIVEAU "MIN",
ANDI NIV256-I < CALCUL MODULO 'NIVMAX' ; EN EFFET, PAR
< EXEMPLE 'G5' PEUT CALCULER 'NIVMIN' ET
< 'NIVMAX' PAR ITERATION...
XWOR%1: VAL NIV256=K
IF BIT>XWOR%1-NIV256,,XEIF%,
IF ATTENTION : 'NIV256' DOIT ETRE UNE PUISSANCE DE 2
IF POUR QUE LE CALCUL MODULO FONCTIONNE CORRECTEMENT !!!
XEIF%: VAL ENDIF
FLT
FST NIVMIN < NIVEAU MINIMUM ANTI-ALIASING,
LA VENIVO < RECUPERATION DU "MAX" :
ANDI NIV256-I < ET CALCUL MODULO 'NIVMAX'...
FLT
FSB NIVMIN
FST NIVMAX < RANGEMENT DE "MAX"-"MIN"...
VECTVE: EQU $
LA VEPOIN
STA VEPTC < INITIALISATION DU GENERATEUR DE POINTIL-
< LES...
LA VECTRS < MEMORISATION DU MODE DE TRACE DEMANDE ;
< ON LE FAIT AVANT LA VALIDATION AFIN
< D'INCLURE LA NOUVELLE LOGIQUE BINAIRE...
RBT VELODD < METTONS NOUS A PRIORI EN LOGIQUE FLOUE
< (OU EN MODE 'SBT'/'RBT'/'IBT'), ET CECI
< AFIN DE NE PAS INTRODUIRE DE NOUVELLES
< FONCTIONS (AUTRES QUE 'VECTSB', 'VECTRB'
< ET 'VECTIB'),
TBT VELODF < ON DUPLIQUE LE BIT 'VELOGF' SUR 'VELOGD'
< AFIN DE SE METTRE EN FLOU...
JNC VECTVM < CAS DE 'VECTSB' OU 'VECTRB'...
SBT VELODD < CAS DE 'VECTIB'...
VECTVM: EQU $
CPI VECTSB < ???
JE VECTV7 < OK...
CPI VECTRB < ???
JE VECTV7 < OK...
CPI VECTIB < ???
JNE VEKT8 < NON, SORTIE EN ERREUR...
VECTV7: EQU $
<
< REDUCTION DES COORDONNEES (PASSAGE
< DE L'ECHELLE GRAPHIQUE A L'ECHELLE TV) :
<
< NOTA SUR LA "FRUSTRATION DES PIXELS" :
< RAISONNONS A UNE DIMENSION,
< SUR L'AXE DES 'X' PAR EXEMPLE :
< IMAGINONS 3 POINTS 'A', 'M' ET
< 'B' TELS QUE :
<
< X(A)='100,
< X(M)='1FF,
< X(B)='2FE,
< ON A :
< X(M)=(X(A)+X(B))/2,
< ET :
< X(M)-X(A)=X(B)-X(M)='FF,
< LE POINT 'M' EST AU MILIEU DU
< SEGMENT GRAPHIQUE 'AB' :
<
< AM=MB.
< APPLIQUONS LA REDUCTION 'TV',
< C'EST-A-DIRE DIVISONS LES COOR-
< DONNEES PAR 4 :
<
< XT(A)='100/4='40,
< XT(M)='1FF/4='7F,
< XT(B)='2FE/4='BF,
< ON A MAINTENANT :
< XT(M)-XT(A)='3F,
< XT(B)-XT(M)='40,
< LE POINT 'M' EN FORMAT 'TV' N'EST
< PLUS AU MILIEU DU SEGMENT 'AB' !!!
< IL Y A AINSI FRUSTRATION DU
< POINT 'M', ET SUIVANT LA METHODE DE
< CORRECTION APPLIQUEE, 'M' SE RAP-
< PROCHERA DE 'A' (CAS DES DIVISIONS
< PAR DEFAUT CI-DESSUS), OU DE 'B'
< (DIVISION PAR EXCES) ; ETENDU A
< DEUX DIMENSIONS, ON VOIT QU'AINSI
< LES PENTES DES VECTEURS RISQUENT
< DE NE PAS ETRE CONSERVEE LORS DU
< PASSAGE GRAPHIQUE-TV...
< DE PLUS, UNE METHODE DE CORRECTION
< "CONTEXTUELLE" (C'EST-A-DIRE TENANT
< COMPTE DU SEGMENT ENTIER POUR CORRIGER
< LES COORDONNEES INDIVIDUELLES DES
< EXTREMITES) FAIT QU'UN MEME POINT
< APPARTENANT A DEUX SEGMENTS DIFFERENTS
< (VOIR PAR EXEMPLE LES SOMMETS D'UN
< CARRE) RISQUE DE DONNER NAISSANCE A
< DEUX POINTS DIFFERENTS EN 'TV'...
<
LA VECGX1 < COORDONNEE X1 :
CP VECGX2
JGE VEKT45 < X1 >= X2...
AD CFRUST < X1 < X2...
VEKT45: EQU $
SARS XXDEDX < CONVERSION EN MODE 'TV',
LR A,X < ET STOCKAGE TEMPORAIRE : X=X1.
LA VECGY1 < COORDONNEE Y1 :
CP VECGY2
JGE VEKT46 < Y1 >= Y2...
AD CFRUST < Y1 < Y2...
VEKT46: EQU $
SARS XXDEDY < CONVERSION EN MODE 'TV',
LR A,Y < ET STOCKAGE TEMPORAIRE : Y=Y1.
LA VECGX2 < COORDONNEE X2 :
CP VECGX1
JGE VEKT47 < X2 >= X1...
AD CFRUST < X2 < X1...
VEKT47: EQU $
SARS XXDEDX < CONVERSION EN MODE 'TV,
LR A,B < ET STOCKAGE TEMPORAIRE : B=X2.
LA VECGY2 < COORDONNEE Y2 :
CP VECGY1
JGE VEKT48 < Y2 >= Y1...
AD CFRUST < Y2 < Y1...
VEKT48: EQU $
SARS XXDEDY < CONVERSION EN MODE 'TV'.
< A T T E N T I O N : LES COMMENTAIRES
< QUI SUIVENT N'ONT PLUS DE VALEUR :
STA VECTY2 < A=Y2 SI (X1)<=(X2), A=Y1 SINON,
STB VECTX2 < B=X2 SI (X1)<=(X2), B=X1 SINON,
STY VECTY1 < Y=Y1 SI (X1)<=(X2), Y=Y2 SINON,
STX VECTX1 < X=X1 SI (X1)<=(X2), X=X2 SINON.
<
< CALCUL DELTAX ET DELTAY.
<
STZ VPTISO < A PRIORI, IL NE S'AGIT PAS D'UN POINT
< ISOLE...
LA VECTX2
SB VECTX1
STA VECTDX < DELTAX=X2-X1.
FLT
FST VECTDF < DELTAX FLOTTANT.
LA VECTY2
SB VECTY1
STA VECTDY < DELTAY=Y2-Y1.
JAE VEKT1
CPZ VECTDX
JNE VEKT2
<
< ICI, DELTAX = 0 ET DELTAY # 0 : LIGNE VERTICALE.
<
IF VECTY1-VECTC-D,XEIF%,,XEIF%
ADRI D,W < POUR FAIRE VARIER Y DANS LA BOUCLE.
XEIF%: VAL ENDIF
LX VECTDY
LA INFINI < (A)=PENTE D'UNE DROITE VERTICALE...
VEKT3: EQU $
FLT
FST VECTA < MISE EN PLACE DE LA PENTE DES DROITES
< VERTICALES (INFINI) ET HORIZONTALE
< (NULLE)...
LAI I < PAS DE VARIATION = 1 A PRIORI.
CPZR X
JGE VEKT32
NGR A,A < PAS DE VARIATION = -1.
NGR X,X < COUNT POSITIF.
VEKT32: EQU $
ADRI I,X < AFIN DE TRACER LE POINT EXTREME (X2,Y2).
VEKT31: EQU $
PSR A < SAUVEGARDE DU PAS...
LA VECTX1
FLT
FST VECTX < FLOTTAGE
LA VECTY1
FLT
FST VECTY < DES COORDONNEES...
PLR A < RESTAURATION DU PAS...
BSR VECTA2 < ET TRACE DU POINT COURANT (X1,Y1)...
XM K,W
AD K,W < INCREMENTATION +/- 1.
XM K,W
JDX VEKT31 < POINT SUIVANT.
JMP VEKT40 < C'EST FINI.
VEKT8: JMP VECTV8 < RELAI...
<
< ICI, DELTAY=0 : LIGNE HORIZONTALE (OU POINT
< ISOLE SI DELTAX=0) :
<
VEKT1: EQU $
CPZ VECTDX < EST-CE UN POINT ISOLE ???
< (DELTAX)=(DELTAY)=0...
JNE VEKT1A < NON (ON A DEJA : (VPTISO)=0)...
IC VPTISO < OUI, ON LE MEMORISE...
VEKT1A: EQU $
IF VECTX1-VECTC-D,XEIF%,,XEIF%
ADRI D,W < POUR FAIRE VARIER X DANS LA BOUCLE.
XEIF%: VAL ENDIF
LX VECTDX
LAI K < (A)=PENTE D'UNE DROITE HORIZONTALE...
JMP VEKT3 < ET VOILA.
VEKT2: EQU $
<
< ICI, DELTAX # 0 ET DELTAY # 0 : IL FAUT DONC CALCULER L'EQUATION
< DE LA DROITE.
<
FLD VECTDF < DELTAX FLOTTANT.
FST VECTA
LA VECTDY
FLT
FDV VECTA
FST VECTA < A = DELTAY / DELTAX.
LA VECTX1
FLT
FMP VECTA
FST VECTB
LA VECTY1
FLT
FSB VECTB
FST VECTB < B = Y1 - AX1.
<
< TRACE DU SEGMENT A L'AIDE DE 'N' POINTS
< TEL QUE N=MAX(ABS(DELTAX,DELTAY)) :
<
LA VECTDX < DELTAX.
JAGE VEKT11
NGR A,A < VALEUR ABSOLUE.
VEKT11: EQU $
LR A,Y
LA VECTDY
JAGE VEKT12
NGR A,A
VEKT12: EQU $
CPR Y,A
JGE VEKT13
LR Y,A
VEKT13: EQU $
LR A,X < 'A'='X'=MAX(DELTAX,DELTAY) EN
< VALEUR ABSOLUE.
FLT
FST VECTN < NOMBRE DE PAS EN FLOTTANT.
LYI K < 'Y' = NUMERO DE PAS (DE 0 A N).
VEKT5: EQU $
LR Y,A < NUMERO DU PAS COURANT.
FLT
FMP VECTDF
FDV VECTN
FST VECTX < (NUMERO PAS * DELTAX)/NB PAS.
LA VECTX1
FLT
FAD VECTX
FST VECTX < X COURANT FLOTTANT.
FMP VECTA
FAD VECTB
FST VECTY < Y COURANT = A X + B.
BSR VECTA2 < TRACE POINT.
ADRI I,Y < PAS SUIVANT.
CPR X,Y
JLE VEKT5 < POINT SUIVANT.
<
< SORTIE NORMALE :
<
VEKT40: EQU $
PLR W
PLR A,B,X,Y
RSR < ET RETOUR...
<
< SORTIES EN ERREUR :
<
VECTV8: EQU $
JMP VEKT40 < VERS LA SORTIE EN ERREUR DU HANDLER...
NLS
XWOR%9: VAL ENDIF
LST
Copyright © Jean-François COLONNA, 2022-2024.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / École polytechnique, Institut Polytechnique de Paris, 2022-2024.