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