DATE PROG TRN < < < D E F I N I T I O N S G E N E R A L E S : < < XUNDEF:: VAL -1 < POUR NE DEFINIR QUE LES 'XX...' DANS LES < FICHIERS DE DEFINITION... CALL #SIP DEFINITION CTTE# < < PREPARATION DE L'APPEL DE #SIP UTILITAIRES# : < XXXDEF: VAL XUNDEF XXXLOC: VAL XUNDEF XXXTAB: VAL XUNDEF XXXPRO: VAL XUNDEF CALL #SIP UTILITAIRES# < < < D E F I N I T I O N D E L ' I M A G E : < < XXXVEC: VAL XUNDEF < AFIN DE NE DEFINIR QUE LES 'XXIMA'... CALL #SIP VECTEUR 512# XXXVEC: VAL XXVEC1 < DEFINITION DES CONSTANTES IMAGE/VECTEUR. CALL #SIP VECTEUR 512# < < < D E F I N I T I O N D E S E S P A C E S : < < DIMGRA:: VAL 3 < ON TRACE DANS L'ESPACE EUCLIDIEN < A 3 DIMENSIONS... DIMGR2:: VAL DIMGRA-I < ET UNE DIMENSION DE MOINS... DIMESP:: VAL 5 < DIMENSION MAXIMALE DE L'ESPACE MULTI- < CONNECTE QUE L'ON VEUT REPRESENTER. PAGE < < < O P T I O N S D ' A S S E M B L A G E : < < XOPT01: @ XWOR%1: VAL KOLF=FMASK+KOLTES=FVAL XWOR%1: VAL KOLC=FMASK+KDP=FVAL?XWOR%1 XWOR%2: VAL KOLTED=FMASK+KOL0=FVAL XWOR%2: VAL KOLTEF=FMASK+KOL0+KOLON=FVAL?XWOR%2 XWOR%3: VAL XWOR%2=XWOR%1-KOL0 < LONGUEUR DU SYMBOLE COURANT... XWOR%4: VAL MSYMBI=FMASK+KOL0=FVAL XWOR%4: VAL MSYMBL=FMASK+XWOR%3=FVAL?XWOR%4 XWOR%5: VAL XWOR%4=FCSYMT < ETAT DU SYMBOLE 'XOPT01'... XWOR%6: VAL XWOR%5=FCSIGN XWOR%7: VAL XWOR%5(MSYMBN)MSYMBN=FCSIGN IF XWOR%6*XWOR%7,XEIF%,,XEIF% XOPT01:: VAL EXIST < TRACE GRAPHIQUE, ET VERIFICATIONS CROI- < SEES DES EQUATIONS CALCULEES... XEIF%: VAL ENDIF PAGE < < < B A S D E L A M E M O I R E : < < ZERO: EQU $ DZS PEPROG-D+Z < < POINT D'ENTREE : < ENTRY: EQU $ LRM A,K WORD DEBUT < POINT D'ENTREE DU PROGRAMME, WORD STACK-DEPILE < INITIALISATION DE LA PILE. PSR A RSR < ON EFFECTUE AINSI UN 'GOTO' 'DEBUT'... PAGE < < < D E F I N I T I O N D U B L O C D E S C R I P T E U R < D ' U N P O I N T : < < NPOINT:: VAL 400 < NOMBRE DE POINTS DU NUAGE A GENERER... DSEC DESCPT: EQU $ DCS3D: EQU $ < DEBUT DE LA LISTE DES COORDONNEES < TRI-DIMENSIONNELLES DANS L'ESPACE < EUCLIDIEN DE LA REPRESENTATION GRA- < PHIQUE : DFXS: FLOAT <NILK<NILK<NILK < COORDONNEE 'X', DFYS: FLOAT <NILK<NILK<NILK < COORDONNEE 'Y', DFZS: FLOAT <NILK<NILK<NILK < COORDONNEE 'Z'. IF $-DCS3D/DFLOT-DIMGRA,,XEIF%, IF ATTENTION : LA LISTE DES COORDONNEES EST MAUVAISE !!! XEIF%: VAL ENDIF DFWORK: FLOAT <NILK<NILK<NILK < VARIABLE DE MANOEUVRE DESTINEE PAR EXEM- < PLE A CONTENIR UNE DISTANCE... NVOIS:: VAL W+W < NOMBRE DE VOISINS POSSIBLES POUR UN < POINT LE LONG D'UNE DIMENSION. DNVOIS: WORD NILK < NOMBRE DE VOISINS DU POINT COURANT < DANS L'ESPACE 'DIMESP'-CONNECTE. VOISEX:: VAL NEXIST < INDICATEUR DE VOISIN "INOCCUPPE". IF VOISEX-K,,XEIF%, IF ATTENTION : 'VOISEX' DOIT ETRE NUL !!! XEIF%: VAL ENDIF DLVOIS: EQU $ < LISTE DES VOISINS : DO NVOIS*DIMESP WORD VOISEX < IDENTITE DES VOISINS DU POINT COURANT. < < FIN DU DESCRIPTEUR : < LDESCP:: VAL $-DESCPT < LONGUEUR DU DESCRIPTEUR... PAGE < < < M E S S A G E S : < < TABLE < < < C O M M O N : < < COMMON COM: EQU $ < < MOT DESTINE AU BLOC FLOTTANT : < COMFLO: WORD NILK < MOT "BIDON" DESTINE AU BLOC FLOTTANT < POUR QU'IL Y FIT SES MERDES... ATSFLO: WORD TSFLO < POUR TESTER DE TEMPS EN TEMPS 'COMFLO'... < < INDICATEURS DE CONTROLE : < ANPOIN: WORD NPOINT < NOMBRE COURANT DE POINTS DU NUAGE. ADIMGR: WORD DIMGRA < DIMENSION DE L'ESPACE GRAPHIQUE DE < REPRESENTATION. RDNMIN: WORD K < MIN(NOMBRE DE VOISINS), RDNMAX: WORD NVOIS*DIMESP < MAX(NOMBRE DE VOISINS). ANVOIS: WORD NVOIS*DIMESP < NOMBRE DE VOISINS MAXIMAL QUE PEUT < POSSEDER UN POINT, XEPAIS:: VAL 16*XXXMOY+Z < EPAISSEUR MAXIMALE DES RECTANGLES. AEPAIS: WORD XEPAIS < EPAISSEUR COURANTE DES RECTANGLES. XNIVP:: VAL 4 < PAS IMPLICITE DE PASSAGE D'UN NIVEAU < A L'AUTRE. AXNIVP: WORD XNIVP < PAS COURANT DE PASSAGE D'UN NIVEAU A < L'AUTRE... IERASE: WORD EXIST < EFFACER ('EXIST'), OU NON ('NEXIST') < L'ECRAN 512... IF XOPT01-EXIST,XOPT1,,XOPT1 IWGPT: WORD EXIST < TRACER ('EXIST') OU PAS ('NEXIST') LE < NUAGE DE POINTS GENERE. IWGVOI: WORD EXIST < TRACER ('EXIST') OU PAS ('NEXIST') LES < VOISINS DU TYPE (P(I),P(J)). XOPT1: VAL ENDIF < < CONSTANTES FLOTTANTES DE BASE : < F0: FLOAT <K<K<K < REMISE A ZERO FLOTTANTE... F1: FLOAT <W<K<K < L'UNITE EN FLOTTANT... XXXLOC: VAL YYYFLO < 'YYYFLO'. CALL #SIP UTILITAIRES# APWORK: EQU APFWOR < POUR LA COMPATIBILITE AVEC LES OVERLAYS < DE " +" (CF. 'SIO...'). < < DONNEES DE CALCUL D'UN < PRODUIT SCALAIRE : < APRSCA: WORD PRSCA < CE SOUS-PROGRAMME CALCULE LE PRODUIT < SCALAIRE DES 2 VECTEURS ARGUMENTS. < < POINT TRI-DIMENSIONNEL COURANT : < CS3D: EQU $ < DEBUT DES COORDONNEES 3D : FXS: FLOAT <NILK<NILK<NILK < COORDONNEE 'X' 3D, FYS: FLOAT <NILK<NILK<NILK < COORDONNEE 'Y' 3D, FZS: FLOAT <NILK<NILK<NILK < COORDONNEE 'Z' 3D. LBUF3D:: VAL $-CS3D < NOMBRE DE MOTS POUR UN POINT 3D... IF LBUF3D/DFLOT-DIMGRA,,XEIF%, IF ATTENTION : INCOHERENCE DANS LES IF DIMENSIONS DE L'ESPACE DE TRACE GRAPHIQUE !!! XEIF%: VAL ENDIF < < DONNEES DE 'MOVE' : < APMOV1: WORD PMOV1 < DEPLACEMENT DU POINT COURANT (DFXS,DFYS, < DFZS) VERS (FXS,FYS,FZS). < < DONNEES DE LA PROJECTION : < FACT: FLOAT <NILK<NILK<NILK < FACTEUR D'ECHELLE... SFACT: FLOAT <NILK<NILK<NILK < SAUVEGARDE DE 'FACT' A CAUSE DES < ALT-MODES INTEMPESTIFS... PZ: FLOAT <NILK<NILK<NILK < POSITION DU POINT DE VUE SUR L'AXE OZ, < QUI EST DEVANT L'ECRAN... TRX: WORD NILK < TRANSLATION DU TRY: WORD NILK < TRACE (VISU ET RASTER). CS2D: EQU $ < DEBUT DES COORDONNEES 2D : YS: WORD NILK < COORDONNEES 2D DU XS: WORD NILK < POINT 3D PROJETE... LBUF2D:: VAL $-CS2D < NOMBRE DE MOTS NECESSAIRES POUR UN POINT, LBUFGR:: VAL LBUF2D+LBUF2D < ET POUR UN VECTEUR. COORDX:: VAL XS-CS2D < INDEX DE LA COORDONNEE 'X', COORDY:: VAL YS-CS2D < INDEX DE LA COORDONNEE 'Y'. APROJ: WORD PROJ < SOUS-PROGRAMME DE PROJECTION 3D --> 2D... IF XOPT01-EXIST,XOPT1,,XOPT1 < < DONNEES DU TRACE GRAPHIQUE : < BUFGR: EQU $ BUFGR1: DZS LBUF2D < ORIGINE D'UN VECTEUR, BUFGR2: DZS LBUF2D < ET EXTREMITE. DEMOG: BYTE NVPOUT;FAVOG < MISE EN GRAPHIQUE DE LA VISU. DEMCG: BYTE NVPOUT;FAVCG < RETOUR EN ALPHA-NUMERIQUE DE LA VISU. DEMWG: BYTE NVPOUT;FAVWG < ECRITURE GRAPHIQUE D'UN VECTEUR. WORD BUFGR=FCTA*NOCMO WORD LBUFGR*NOCMO DEMWD0: BYTE NVPOUT;FAVWD < DEMANDE DE MISE EN MODE NORMAL... BYTE KESC;'60;KEOT DEMWD1: BYTE NVPOUT;FAVWD < DEMANDE DE MISE EN POINTILLES... BYTE KESC;'61;KEOT DEMWD2: BYTE NVPOUT;FAVWD < DEMANDE DE MISE EN TIRETES... BYTE KESC;'63;KEOT < < DEMANDE D'EFFACEMENT < DE L'ECRAN DE LA VISU : < DEMERA: BYTE NVPOUT;FAVER < DEMANDE D'EFFACEMENT DE L'ECRAN DE LA < VISU DE DIALOGUE. XOPT1: VAL ENDIF < < DEMANDE DE TEMPORISATION < APRES EFFACEMENT : < TEMPO: BYTE NVPSER;FONDOR WORD NILK < INUTILE... WORD XXXMOY < 2 PETITES SECONDES... XXXLOC: VAL YYYGOT < 'YYYGOT'. CALL #SIP UTILITAIRES# XXXVEC: VAL XXVEC2 < DEFINITION DES DONNEES DU VECTEUR 512... CALL #SIP VECTEUR 512# < < SOUS-PROGRAMMES COMPLEMENTAIRES : < VECTAS: WORD VECTP1 < POUR ATTEINDRE 'VECTP1', CAR LE RELAI < GENERE PRECEDEMMENT VA ETRE ECRASE PAR < UN APPEL A 'VECTPS' QUI GENERE 4 POINTS < AU LIEU D'UN SEUL... < < COORDONNEES FLOTTANTES < DU VECTEUR A TRACER : < FECGX1: FLOAT <NILK<NILK<NILK < X1, FECGY1: FLOAT <NILK<NILK<NILK < Y1, FECGX2: FLOAT <NILK<NILK<NILK < X2, FECGY2: FLOAT <NILK<NILK<NILK < Y2. FECGXP: FLOAT <NILK<NILK<NILK < PAS SUR 'X', FECGYP: FLOAT <NILK<NILK<NILK < PAS SUR 'Y'. < < ACCES AUX REGISTRES DE CONTROLE : < ACTRL1: WORD RCTRL1 ACTRL2: WORD RCTRL2 < < DONNEES POUR LE GENERATEUR ALEATOIRE : < XTYPX:: VAL 3571 < TYPE "COORDONNEE X", XTYPY:: VAL XTYPX+567 < TYPE "COORDONNEE Y", XTYPZ:: VAL XTYPY+2391 < TYPE "COORDONNEE Z", XTYPN:: VAL XTYPZ+12491 < TYPE "NOMBRE DE VOISINS". RDN7: WORD 793 < DECOMPTEUR D'ACCES A LA SECONDE, RDN8: WORD 1 < VALEUR COURANTE DE 'RDN7'. RDN9: WORD 0 < SECONDE COURANTE... RDN: WORD 4397 < NOMBRE ALEATOIRE COURANT. RDN1: WORD 5189 < CONSTANTES DE CALCUL RDN3:: VAL 19 < DES NOMBRE ALEATOIRES... RDN4: WORD 7993 < 2EME NOMBRE ALEATOIRE COURANT. RDN5: WORD 4021 RDN6:: VAL 23 POINTS: WORD 16807 KRDN1: WORD 0 KRDN2: WORD 0 XKRDN1:: VAL 3 < INCREMENTEUR DE 'KRDN1'. XKRDN2:: VAL 7 < DECOMPTEUR DE 'KRDN2'. ASPRDN: WORD SPRDN < GENERATEUR DE NOMBRES ALEATOIRES. < < DEFINITION DU NUAGE : < AMPOIN: WORD NPOINT < NOMBRE MAXIMAL DE POINTS DU NUAGE. < < DONNEES NECESSAIRES A LA < RECHERCHE DES VOISINS : < ANVOIZ: WORD NVOIS*DIMESP+Z < NOMBRE DE VOISIN PAR EXCES MAXIMAL QUE < PEUT POSSEDER UN POINT. FWORK0: EQU $ < LISTE DE VARIABLES DE MANOEUVRE EN < NOMBRE EGAL A LA DIMENSION DE L'ESPACE < DE REPRESENTATION : DO DIMGRA FLOAT <NILK<NILK<NILK FWORK1: EQU FWORK0 FWORK2: EQU FWORK1+DFLOT FWORK3: EQU FWORK2+DFLOT XWOR%1: VAL BASE10=K XWOR%1: VAL NBITMO-B-XWOR%1 < RANG DU DERNIER BIT DE BASE10... XWOR%1: VAL CORBT?XWOR%1=FMASK(K?BASE10=FCINST XWOR%2: VAL XWOR%1=K XWOR%2: VAL NBITMO-B-XWOR%2 XWOR%3: VAL CORBT?XWOR%2=FMASK(K?XWOR%1=FCINST IF XWOR%3-K,,XEIF%, IF ATTENTION : IL Y A PLUS DE 2 BITS A 1 DANS 'BASE10' !!! XEIF%: VAL ENDIF XWOR%4: VAL COSBT?XWOR%2=FMASK(K=FCINST XWOR%4: VAL XWOR%4=K+E < 'XWOR%4' EST UNE VALEUR ENTIERE PAR < EXCES DE LOG(BASE10) EN BASE2... XWOR%5: VAL CORBT?BITPAR=FMASK(K?MOCD=FCINST NTRN XWOR%5: VAL XWOR%5/XWOR%4 < 'XWOR%5' EST UN EXPOSANT VOISIN DU < PLUS GRAND... XWOR%6: VAL XWOR%5/XXXMOY < AFIN DE PREVENIR UNE EVENTUELLE ELEVA- < TION AU CARRE... TRN XWOR%6: VAL XWOR%6-W < AFIN D'AVOIR UNE MARGE DE SECURITE < SUPPLEMENTAIRE... FINFIN: FLOAT <W<K<+XWOR%6 < (A,B)=UN NOMBRE FLOTTANT TRES GRAND < VOISIN DU PLUS GRAND NOMBRE < FLOTTANT REPRESENTABLE... < < DEFINITION DES RECTANGLES : < DEPAIS: WORD XEPAIS-Z/XXXMOY < FONCTION DE L'EPAISSEUR COURANTE DES < RECTANGLES. XNIV0:: VAL 4 < PREMIER NIVEAU. WEPAIS: WORD NILK < DONNE UNE VALEUR PROPORTIONNELLE A < L'EPAISSEUR A DONNER AUX RECTANGLES. < < DEFINITION DES DISQUES : < SAVEX: WORD NILK < COORDONNEES DU SAVEY: WORD NILK < CENTRE. ACERCL: WORD CERCLE < REMPLISSAGE D'UN DISQUE... PAGE < < < P I L E D E T R A V A I L : < < STACK: EQU $ DZS 64 PROG USE W,DESCPT XXXVEC: VAL XXVEC3 < DEFINITION DES PROGRAMMES VECTEUR 512... CALL #SIP VECTEUR 512# PAGE < < < T R A C E D ' U N P A V E D E 4 P O I N T S : < < < FONCTION : < AFIN DE BOUCHER LES TROUS CREES < LORS DU REMPLISSAGE DES RECTANGLES < PAR DES VECTEURS PARALLELES, ON < REMPLACE 'VECTP1' PAR 'VECTPS' QUI < TRACE UN PAVE DE 4 POINTS... < < VECTPS: EQU $ < PROGRAMME REMPLACANT 'VECTP1' DANS < L'INTERPOLATEUR... $EQU VECTA1 WORD VECTPS < POUR TROMPER L'INTERPOLATEUR : CROYANT < APPELER 'VECTP1', C'EST EN FAIT 'VECTPS' < QUI SERA REFERENCE... $EQU VECTPS < RETOUR A 'VECTPS'... < < INITIALISATION : < PSR A < < TRACE DU PAVE ((X,Y),(X+1,Y),(X+1,Y+1),(X,Y+1)) : < BSR VECTAS < TRACE DE (X,Y). LA VECTX1 ADRI I,A STA VECTX1 BSR VECTAS < TRACE DE (X+1,Y). LA VECTY1 ADRI I,A STA VECTY1 BSR VECTAS < TRACE DE (X+1,Y+1). LA VECTX1 ADRI -I,A STA VECTX1 BSR VECTAS < TRACE DE (X,Y+1). LA VECTY1 ADRI -I,A STA VECTY1 < ET RETOUR A (X,Y)... < < ET RETOUR : < PLR A RSR PAGE < < < T E S T P E R I O D I Q U E D E ' C O M F L O ' : < < < FONCTION : < CE SOUS-PROGRAMME EST < APPELE DERRIERE CHAQUE < 'FDV' EXPLICITE AINSI < QU'APRES LES APPELS DE < 'RAC' ET 'CRAMR'... < < TSFLO: EQU $ PSR A LA COMFLO < TEST DE 'COMFLO' PAR UN 'LA' AFIN DE NE < PAS MODIFIER LES CODES (CARY & CO)... JAE TSFLO1 < OK... QUIT XXQUIT < E R R E U R P R O G R A M M E ... < ON A : < (A)=INDICATEURS FLOTTANTS... < BIT 0 : UNDERFLOW, < BIT 1 : OVERFLOW, < BIT 2 : DIVISION PAR ZERO, < BIT 3 : 'FIX' IMPOSSIBLE. STZ COMFLO < PUIS RAZ, CAR CES INDICATEURS SONT < REMANENTS... TSFLO1: EQU $ PLR A RSR XXXPRO: VAL YYYGOT < 'YYYGOT'. CALL #SIP UTILITAIRES# PAGE < < < D E P L A C E M E N T D U P O I N T C O U R A N T : < < < ARGUMENTS : < (W)=ADRESSE DU DESCRIPTEUR DE POINT COURANT. < < PMOV1: EQU $ < < INITIALISATIONS : < PSR A,B,X < < DEPLACEMENT : < LAD DCS3D < (A)=ADRESSE DE L'EMETTEUR (DESCRIPTEUR < COURANT), LRM B,X WORD CS3D < (B)=ADRESSE DU POINT COURANT, WORD LBUF3D < (X)=NOMBRE DE POINTS A DEPLACER. MOVE < ET MOVE : DESCRIPTEUR --> (FXS,FYS,FZS). < < ET RETOUR : < PLR A,B,X RSR PAGE < < < P R O J E C T I O N 3 D --> 2 D : < < < ARGUMENT : < (FXS,FYS,FZS)=POINT 3D. < < < RESULTAT : < (XS,YS)=POINT 2D PROJETE SUIVANT 'IPROJ'. < < PROJ: EQU $ < < INITIALISATIONS : < PSR A,B < SAUVEGARDES... #/FLD# FZS < < PROJECTION PERSPECTIVE SUR 'OX' : < FDV PZ BSR ATSFLO FSB F1 BSR AFNEG BSR ASFWOR < 1-(FZS/PZ) BSR AFCAZ JNE EOK3 < OK, 1-(FZS/PZ)#0... QUIT XXQUIT < E R R E U R P R O G R A M M E ... EOK3: EQU $ #/FLD# FXS FDV FWORK < FXS/(1-(FZS/PZ)) BSR ATSFLO < < CALCUL DE 'XS' : < FDV FACT < MISE A L'ECHELLE 2D... BSR AROND AD TRX < TRANSLATION 2D... STA XS < < PROJECTION PERSPECTIVE SUR 'OY' : < #/FLD# FYS FDV FWORK < FYS/(1-(FZS/PZ)) BSR ATSFLO < < CALCUL DE 'YS' : < FDV FACT < MISE A L'ECHELLE 2D... BSR AROND AD TRY < TRANSLATION 2D... STA YS < < SORTIE : < PLR A,B < RESTAURATIONS... RSR XXXPRO: VAL YYYFLO < 'YYYFLO'. CALL #SIP UTILITAIRES# PAGE < < < P R O D U I T S C A L A I R E D E 2 V E C T E U R S : < < < ARGUMENTS : < (A)=ADRESSE DU PREMIER VECTEUR 'VECT1', < (B)=ADRESSE DU DEUXIEME VECTEUR 'VECT2'. < < < RESULTAT : < (A,B)=VALEUR DU PRODUIT SCALAIRE... < < < ATTENTION : < AUX BASES 'L' ET 'W' !!! < < PRSCA: EQU $ VECT1X:: MOT O < X(VECT1), VECT1Y:: MOT VECT1X+DFLOT < Y(VECT1), VECT1Z:: MOT VECT1Y+DFLOT < Z(VECT1). VECT2X:: MOT O < X(VECT2), VECT2Y:: MOT VECT2X+DFLOT < Y(VECT2), VECT2Z:: MOT VECT2Y+DFLOT < Z(VECT2). < < INITIALISATIONS : < PSR Y,L,W < SAUVEGARDE DE 2 BASES ; MAIS 'C' NE DOIT < PAS ETRE UTILISEE A CAUSE DU BLOC FLOT- < TANT... LR L,Y < SAUVEGARDE DE 'L' DANS 'Y' POUR POUVOIR < ACCEDER EVENTUELLEMENT LE 'LOCAL'... LR A,L < (L)=BASE DU VECTEUR 'VECT1', LR B,W < (W)=BASE DU VECTEUR 'VECT2'. < < CALCUL DU PRODUIT SCALAIRE : < #/FLD# VECT1X,L < X(1), FMP VECT2X,W < X(1)*X(2), BSR ASFWOR < ET SAVE... #/FLD# VECT1Y,L < Y(1), FMP VECT2Y,W < Y(1)*Y(2), BSR APFWOR < X(1)*X(2)+Y(1)*Y(2), < ET SAVE... #/FLD# VECT1Z,L < Z(1), FMP VECT2Z,W < Z(1)*Z(2), BSR APFWOR < (A,B)=X(1)*X(2)+Y(1)*Y(2)+Z(1)*Z(2), < SOIT LE PRODUIT SCALAIRE DES 2 < VECTEURS 'VECT1' ET 'VECT2'... < ET MISE DANS 'FWORK', ON NE SAIT < JAMAIS... < < ET RETOUR : < PLR Y,L,W RSR PAGE < < < G E N E R A T E U R A L E A T O I R E : < < < ARGUMENT : < (X)=FONCTION DU NUMERO DU POINT COURANT, < (Y)=CODE FONCTION DU TYPE DE COORDONNEE (X/Y/Z). < < < RESULTAT : < (A,B)=NOMBRE ALEATOIRE FLOTTANT. < < SPRDN: EQU $ LA RDN < GENERATION DE NOMBRES ALEATOIRES : EOR POINTS < ON INTRODUIT UN AUTRE PARAMETRE... MP RDN1 SCRD RDN3 JANE SPMOYC LR B,A JANE SPMOYC LA KRDN1 ADRI XKRDN1,A SCRS XKRDN2 STA KRDN1 < PROGRESSION DE 'KRDN1'... SPMOYC: EQU $ EORR X,A STA RDN DC RDN8 LA RDN9 < (A)=RDN9 A PRIORI... JNE SPRDN1 < ET BIEN OUI... CE N'EST PAS L'HEURE... LA RDN7 < C'EST L'HEURE D'ALLER CHERCHER STA RDN8 < LA SECONDE COURANTE ??!?!??! ACTD XXXTIM < (A)=HEURE COURANTE EN MULTIPLE DE 2S. STA RDN9 < ET MEMORISATION... SPRDN1: EQU $ EOR RDN STA RDN LA RDN4 < CALCUL D'UN 2EME NOMBRE ALEATOIRE... MP RDN5 EOR POINTS SCRD RDN6 JANE SPMOYF LR B,A JANE SPMOYF LA KRDN2 ADRI -XKRDN2,A SCRS XKRDN1 STA KRDN2 < PROGRESSION DE 'KRDN2'... SPMOYF: EQU $ EORR Y,A STA RDN4 EOR RDN FLT < (A,B)=NOMBRE ALEATOIRE... RSR PAGE < < < T R A C E D ' U N D I S Q U E : < < < FONCTION : < CE MODULE TRACE UN DISQUE EN < DEGRADE DESTINE A ETE PLACE A < CHAQUE EXTREMITE DE RECTANGLE < TRACE. < < < ARGUMENTS : < (X,Y)=CENTRE DU DISQUE (LE RAYON EST XEPAIS-Z/XXXMOY). < < CERCLE: EQU $ < < INITIALISATIONS : < PSR X,Y LR X,B < (B)='X' DU CENTRE, PSR Y < SAUVEGARDE DE 'Y' DU CENTRE. LA DEPAIS SBR A,X < ON SE PLACE EN HAUT ET A GAUCHE SBR A,Y < D'UN CARRE CIRCONSCRIT AU DISQUE. STX VECTX1 < INITIALISATION DE L'ABSCISSE INITIALE < DE CHAQUE LIGNE, STY VECTY1 < INITIALISATION DE LA COORDONNEE 'Y'. PLR Y < ON A : < (B,Y)=COORDONNEES DU CENTRE. < < BALAYAGE VERTICAL : < LX DEPAIS < (X)=NOMBRE DE LIGNES A BALAYER. ADRI Z,A CERCL1: EQU $ LA VECTX1 PSR A,X < SAUVEGARDE DE L'ABSCISSE INITIALE < DE CHAQUE LIGNE (A) ET DU NOMBRE DE < LIGNES A TRACER (X). < < BALAYAGE HORIZONTAL : < LX DEPAIS < (X)=NOMBRE DE POINTS PAR LIGNE. ADRI Z,A CERCL2: EQU $ PSR B < SAUVEGARDE DE LA COORDONNEE 'X' < DU CENTRE. LA VECTX1 < X1, SBR B,A < X1-XC, BSR AFLT #/FST# FWORK1 < X1-XC, FMP FWORK1 < (X1-XC)**2, BSR ASFWOR LA VECTY1 < Y1, SBR Y,A < Y1-YC ((XC,YC) DESIGNE LE CENTRE). BSR AFLT #/FST# FWORK2 < Y1-YC, FMP FWORK2 < (Y1-YC)**2, BSR APFWOR < (X1-XC)**2+(Y1-YC)**2, BSR ARAC < ET CALCUL DE LA DISTANCE DU POINT < COURANT (X1,Y1) AU CENTRE (XC,YC) : BSR ATSFLO BSR AROND CP DEPAIS < EST-ON HORS DU DISQUE ?? JGE CERCL3 < OUI, ON IGNORE CE POINT... SB DEPAIS < NON : NGR A,A < ON CALCULE DONC LE NIVEAU DU < POINT QUE L'ON VA TRACER : MP AXNIVP ADRI XNIV0,B STB VENIVO < CE NIVEAU EST PROPORTIONNEL A LA < DISTANCE AU CENTRE... LA VECTX1 LB VECTY1 PSR A,B < SAUVEGARDE DE (X1,Y1) VISU... SARS XXDEDX STA VECTX1 < PASSAGE AUX LR B,A SARS XXDEDY STA VECTY1 < COORDONNEES 512... BSR VECTA1 < ET ON MARQUE LE POINT (X1,Y1)... PLR A,B STA VECTX1 < RESTAURE LES STB VECTY1 < COORDONNEES VISU... CERCL3: EQU $ PLR B < RESTAURE L'ABSCISSE DU CENTRE, DO BIT>XXDEDX IC VECTX1 < ET PROGRESSION SUR LA LIGNE, JDX CERCL2 < A CONDITION DE N'ETRE POINT EN BOUT < DE LIGNE... PLR A,X < RESTAURE : < (A)='VECTX1' DE DEBUT DE LIGNE, < (X)=NOMBRE DE LIGNES A TRACER... STA VECTX1 < ON SE PLACE EN DEBUT DO BIT>XXDEDY IC VECTY1 < DE LA NOUVELLE LIGNE, JDX CERCL1 < SI ELLE EXISTE... < < ET RETOUR : < PLR X,Y RSR PAGE < < < P O I N T D ' E N T R E E : < < DEBUT: EQU $ < < INITIALISATION DES REGISTRES : < LRM C,K WORD COM+DEPBAS < POSITIONNEMENT DE 'C', WORD STACK-DEPILE < ET DE 'K'. < < CONNEXION A LA 'CDA' : < LAI PAGER BSR AGPCDA < AFIN D'ATTEINDRE LA MEMOIRE DU '68000' < ET LA MEMOIRE 'SOLAR' QUI LA PRECEDE < AFIN D'Y METTRE 'BUF'... < < < E N T R Y D E R E B O U C L A G E : < < #/FLD# FACT < SAUVEGARDE DE 'FACT' #/FST# SFACT < A CAUSE DES ALT- < MODES INTEMPESTIFS... DEBUT4: EQU $ #/FLD# SFACT #/FST# FACT < AU CAS OU UN MALHEUREUX ALT-MODE... < < MODIFICATION A PRIORI DU 'PRESC' : < LRM A WORD DEBUT5 < POUR 'XXXPRE'... ACTD XXXPRE < ON CHANGE ALORS SYSTEMATIQUEMENT APRES < PASSAGE ICI LE 'PRESC' DU PROGRAMME, AFIN < DE REVENIR SUR LA VISUALISATION APRES < CHAQUE ALT-MODE (VIA 'DEBUT5'...). < < VALIDATION DE 'ANVOIS' : < DEBUT6: EQU $ LA ANVOIS < ACCES A 'ANVOIS' : JALE DEBUT7 < ERREUR... CPI NVOIS*DIMESP < VALIDATION : JLE DEBUT8 < OK... DEBUT7: EQU $ QUIT XXQUIT < E R R E U R P R O G R A M M E ... JMP DEBUT6 < ET ON RE-TESTE !!! DEBUT8: EQU $ ADRI Z,A STA ANVOIZ < ET ON CALCULE 'ANVOIZ' AU CAS OU < 'DIMESP' AURAIT ETE MODIFIE SOUS < 'DEBUG' DANS 'ANVOIS'... < < VALIDATION DE 'ANPOIN' : < DEBUT9: EQU $ LA ANPOIN < ACCES A 'ANPOIN' : JALE DEBUTA < ERREUR... CP AMPOIN < VALIDATION : JLE DEBUTB < OK... DEBUTA: EQU $ QUIT XXQUIT < E R R E U R P R O G R A M M E ... JMP DEBUT9 < ET ON RE-TESTE !!! DEBUTB: EQU $ < < VALIDATION DE 'AEPAIS' : < DEBUTC: EQU $ LA AEPAIS < (A)=EPAISSEUR DEMANDEE POUR LES < RECTANGLES, JALE DEBUTE < ERREUR... CPI XEPAIS JG DEBUTE < ERREUR... ADRI -Z,A SLRS XXXMOY=K < CALCUL DE XEPAIS-Z/XXXMOY : JALE DEBUTE < ERREUR... JNC DEBUTD < OK, LA DIVISION TOMBE JUSTE... DEBUTE: EQU $ QUIT XXQUIT < 'AEPAIS' DOIT ETRE IMPAIR ET DE VALEUR < VALEUR CONVENABLE... JMP DEBUTC < ET ON RE-TESTE... DEBUTD: EQU $ STA DEPAIS < ET MEMORISATION DE XEPAIS-Z/XXXMOY... < < VALIDATION DE (RDNMIN,RDNMAX) : < DEBUTF: EQU $ LA RDNMIN CP RDNMAX JLE DEBUTG < OK : MIN <= MAX... QUIT XXQUIT < POUR CORRIGER... JMP DEBUTF < ET ON RE-TESTE... DEBUTG: EQU $ < < < G E N E R A T I O N D U N U A G E D E P O I N T S : < < LX ANPOIN < (X)=NOMBRE DE POINTS A GENERER, LRM W WORD LPOINT < (W)=ADRESSE DE BASE DE LA LISTE DES < DESCIPTEURS DE POINTS. GEN1: EQU $ < < GENERATION DES COORDONNEES : < LRM Y WORD XTYPX < (Y)=TYPE "COORDONNEE X". BSR ASPRDN < (A,B)=NOMBRE ALEATOIRE, #/FST# DFXS < CE QUI DONNE 'X' ALEATOIRE. LRM Y WORD XTYPY < (Y)=TYPE "COORDONNEE Y", BSR ASPRDN < (A,B)=NOMBRE ALEATOIRE, #/FST# DFYS < CE QUI DONNE 'Y' ALEATOIRE. #/FLD# F0 #/FST# DFZS < DFZS=0 A PRIORI... LA ADIMGR CPI DIMGRA < COMBIEN DE DIMENSIONS POUR LA VISUALI- < SATION ??? JNE GEN5 < 2... LRM Y < 3... WORD XTYPZ < (Y)=TYPE "COORDONNEE Z", BSR ASPRDN < (A,B)=NOMBRE ALEATOIRE, #/FST# DFZS < CE QUI DONNE 'Z' ALEATOIRE. GEN5: EQU $ < < INITIALISATION DES < DIVERS INDICATEURS : < PSR X #/FLD# F0 #/FST# DFWORK < DFWORK=0. STZ DNVOIS < DNVOIS=0. LAD DLVOIS LR A,L < (L)=BASE LA LISTE DES VOISINS. LRM A WORD VOISEX < (A)=INDICATEUR "PAS DE VOISIN", LX ANVOIS < (X)=NOMBRE MAXIMAL DE VOISINS. GEN4: EQU $ STA O,L < PAS DE VOISINS POUR LE POINT COURANT. ADRI D,L JDX GEN4 PLR X < RESTAURE : < (X)=NOMBRE DE POINTS ENCORE A INITIALISER ADRI LDESCP,W < PASSAGE AU DESCRIPTEUR SUIVANT, JDX GEN1 < S'IL EXISTE... IF XOPT01-EXIST,XOPT1,,XOPT1 < < < T R A C E D U N U A G E D E P O I N T S : < < IF NEXIST-K,,XEIF%, IF ATTENTION : LE TEST SUIVANT EST IDIOT !!! XEIF%: VAL ENDIF CPZ IWGPT < DOIT-ON TRACER LE NUAGE ??? JE GEN2 < NON... #/FLD# FACT PSR A,B < SAUVEGARDE DE 'FACT'... FDV F05 #/FST# FACT < AFIN DE VOIR L'ENSEMBLE DU DESSIN... LAD DEMERA < OUI : SVC < ON EFFACE L'ECRAN. LX ANPOIN < (X)=NOMBRE DE POINTS A TRACER, LRM W WORD LPOINT < (W)=ADRESSE DE LA LISTE DES DESCRIPTEURS. GEN3: EQU $ PSR X BSR APMOV1 < DEPLACEMENT DU DESCRIPTEUR COURANT (W) < VERS LE POINT COURANT (FXS,FYS,FZS), BSR APROJ < ET PROJECTION 2D --> 3D. LRM A,B,X WORD CS2D < (A)=ADRESSE DU POINT 2D COURANT, WORD BUFGR1 < (B)=ADRESSE DU BUFFER ORIGINE GRAPHIQUE, WORD LBUF2D < (X)=NOMBRE DE MOTS A DEPLACER, MOVE < ET MISE EN PLACE DE L'ORIGINE. LRM B,X WORD BUFGR2 < (B)=ADRESSE DU BUFFER EXTREMITE GRAPHIQUE WORD LBUF2D < (X)=NOMBRE DE MOTS A DEPLACER, MOVE < ET MISE EN PLACE DE L'EXTREMITE. LAD DEMOG SVC < ET ON FAIT UNE MISE EN GRAPHIQUE, PERMET- < TANT PAR LA MEME OCCASION DE NE PAS < CHAINER LES POINTS ENTRE-EUX... LAD DEMWG SVC < TRACE DU POINT COURANT... PLR X < RESTAURE LE DECOMPTE, ADRI LDESCP,W < PASSAGE AU DESCRIPTEUR SUIVANT, JDX GEN3 < S'IL EXISTE... LAD DEMCG SVC < ET RETOUR EN ALPHA-NUMERIQUE... PLR A,B #/FST# FACT < RESTAURATION DE 'FACT'... GEN2: EQU $ XOPT1: VAL ENDIF < < < G E N E R A T I O N D E S V O I S I N S D E < C H A Q U E P O I N T D U N U A G E : < < < FONCTION : < ON VIENT DE GENERER LA LISTE < DES POINTS P(I) DU NUAGE ; POUR < CHAQUE POINT P(I) 0<I<N, ON VA < RECHERCHER SES PLUS PROCHES < VOISINS P(J) I<J<N ; DE PLUS, < IL CONVIENT DE NE PAS OUBLIER < LA RELATION : D(P(I),P(J))=D(P(J),P(I)), < OU 'D' REPRESENTE LA DISTANCE < EUCLIDIENNE... < < LX ANPOIN < (X)=NOMBRE DE POINTS DU NUAGE, LRM W WORD LPOINT < (W)=ADRESSE DE LA LISTE DES DESCRIPTEURS < DES POINTS. < < BOUCLE DE PARCOURS DES P(I) : < GEN10: EQU $ < < GENERATION DU NOMBRE DE < VOISINS AUTORISES POUR < LE POINT COURANT P(I) : < GEN14: EQU $ LRM Y WORD XTYPN < (Y)=TYPE "NOMBRE DE VOISINS", BSR ASPRDN < (A,B)=NOMBRE ALEATOIRE FLOTTANT, BSR AFABS < (A,B)=NOMBRE ALEATOIRE POSITIF FLOTTANT, BSR AROND < (A)=NOMBRE ALEATOIRE POSITIF ENTIER, SARD NBITMO DV ANVOIZ LR B,A < (A)=NOMBRE ALEATOIRE SITUE DANS LE < SEGMENT (0,NVOIS*DIMESP). CP RDNMIN JL GEN14 < ON SOUHAITE CP RDNMAX JG GEN14 < ETRE DANS (MIN,MAX)... CP DNVOIS < P(I) N'AURAIT-IL PAS DEJA UN NOMBRE < VOISINS SUFFISANT, OBTENUS LORS DE LA < RECHERCHE DES P(J) DE P(I) ANTERIEURS ??? JLE GEN11 < OUI, PASSONS AU P(I) SUIVANT... XM DNVOIS < NON, ON MET DONC DANS 'DNVOIS' LE MAX < ENTRE LE NOMBRE ALEATOIRE (B), ET LE < 'DNVOIS' ANTERIEUR, SBR A,B < (B)=NOMBRE DE VOISINS ENCORE A GENERER, LR B,Y < (Y)=NOMBRE DE VOISINS A GENERER POUR LE < POINT P(I) COURANT. LR W,L < (L)=ADRESSE DU DESCRIPTEUR DU POINT < P(I) COURANT. < < BOUCLE DE PARCOURS DES < P(J), AVEC I<J<N : < PSR X,W ADRI -W,X < (X)=NOMBRE DE P(J) A TESTER (PUISQUE < L'ON A I<J). CPZR X < L'ENSEMBLE (P(J)) EST-IL VIDE ??? JE GEN12 < OUI, RIEN A FAIRE, ON A FINI... ADRI LDESCP,W < (W)=ADRESSE DU DESCRIPTEUR DU PREMIER < POINT P(J). < < CALCUL DE D(P(I),P(J)) < POUR TOUT J (I<J<N) : < PSR X,W < SAUVEGARDE DE LA BASE DES DESCRIPTEURS < DES P(J) (W), ET DU CARDINAL DE CET < ENSEMBLE (X). GEN13: EQU $ #/FLD# DFXS FSB DFXS-DESCPT,L #/FST# FWORK1 < FWORK1=X(P(J))-X(P(I)). #/FLD# DFYS FSB DFYS-DESCPT,L #/FST# FWORK2 < FWORK2=Y(P(J))-Y(P(I)). #/FLD# DFZS FSB DFZS-DESCPT,L #/FST# FWORK3 < FWORK3=Z(P(J))-Z(P(I)). LAD FWORK0 LR A,B < (A)=(B)=ADRESSE DE LA LISTE DES COOR- < DONNEES DU VECTEUR (P(I),P(J)). BSR APRSCA BSR ARAC < (A,B)=D(P(I),P(J)), BSR ATSFLO #/FST# DFWORK < DFWORK(P(J)) <-- D(P(I),P(J)). ADRI LDESCP,W < PASSAGE AU POINT P(J) SUIVANT, JDX GEN13 < S'IL EXISTE... PLR X,W < RESTAURE : < (X)=CARDINAL DE L'ENSEMBLE (P(J)), < (W)=ADRESSE DE BASE DES DESCRIPTEURS DE < L'ENSEMBLE (P(J)). < < RECHERCHE DES (Y) PLUS < PROCHES VOISINS DE P(I) : < GEN20: EQU $ CPZR Y < LES A-T'ON TOUS TROUVES ??? JE GEN21 < OUI, PASSONS AU POINT P(I) SUIVANT... GEN24: EQU $ #/FLD# FINFIN < NON, < (A,B)=MIN(D(P(I),P(J))) COURANT. PSR X,Y,W GEN22: EQU $ FCMZ DFWORK < EST-ON SUR P(I)=P(J) ??? JE GEN23 < OUI, ON DOIT DONC IGNORE CE POINT P(J)... FCAM DFWORK < TEST DE D(P(I),P(J)) POUR P(J) COURANT : JLE GEN23 < TROP GRAND... #/FLD# DFWORK < OK, D(P(I),P(J)) DEVIENT LE 'MIN' < COURANT, LR W,Y < ET ON MEMORISE DANS 'Y' L'ADRESSE DU < DESCRIPTEUR DE P(J). GEN23: EQU $ ADRI LDESCP,W < PASSAGE AU POINT P(J) SUIVANT, JDX GEN22 < S'IL EXISTE... FCAM FINFIN < A-T'ON TROUVE UN MINIMUM ??? JE GEN50 < NON, ON DOIT SE TROUVER PRES DE LA < FIN DE LA LISTE DES POINTS DU NUAGE... LR Y,W < (W)=ADRESSE DU DESCRIPTEUR DU PLUS < PROCHE VOISIN COURANT P(J) DU < POINT P(I) : #/FLD# FINFIN #/FST# DFWORK < ON MAJORE LOURDEMENT LA DISTANCE, AFIN < DE NE PLUS RETROUVER CE POINT P(J) LORS < DE L'ITERATION SUIVANTE POUR P(I)... LA DNVOIS < (A)=NOMBRE DE VOISINS COURANT DE P(J) : CP RDNMAX < MAIS P(J) NE SERAIT-IL PAS DEJA SATURE < EN VOISINS ??? JGE GEN79 < OUI, ON IGNORE P(J)... CP ANVOIS < MEME QUESTION ??? JL GEN29 < NON... GEN79: EQU $ PLR X,Y,W < OUI, RESTAURE : < (X)=CARDINAL DE (P(J)), < (Y)=NOMBRE DE VOISINS POUR P(I), < (W)=BASE DES DESCRIPTEURS DE L'ENSEM- < BLE (P(J)). JMP GEN24 < VERS LA RECHERCHE D'UN AUTRE PLUS PROCHE < VOISIN DE P(I) PUISQUE L'ON VIENT < D'ECHOUER ICI... GEN29: EQU $ IC DNVOIS < COMPTABILISONS LES VOISINS DE P(J), < PUISQUE L'ON A LA RELATION : < D(P(I),P(J))=D(P(J),P(I))... ADRI DLVOIS-DESCPT,W < PLACONS NOUS SUR LA LISTE DES VOISINS < DE P(J), LX ANVOIS < (X)=NOMBRE DE VOISINS MAXIMAL. GEN25: EQU $ IF VOISEX-K,,XEIF%, IF ATTENTION : LE TEST SUIVANT EST IDIOT !!! XEIF%: VAL ENDIF CPZ O,W < ET CHERCHONS UN EMPLACEMENT LIBRE... JE GEN26 < OK, TROUVE... ADRI D,W < NON, JDX GEN25 < AU SUIVANT... QUIT XXQUIT < E R R E U R P R O G R A M M E ... JMP GEN40 <ET ON SAUTE LA MISE A JOUR... GEN26: EQU $ NGR L,A < (A)=ADRESSE DU DESCRIPTEUR DE P(I), STA O,W < QUE L'ON INSERE DANS LA LISTE DES < VOISINS DE P(J) ; CELLE-CI EST INSEREE < EN NEGATIF, AFIN DE MEMORISER LE FAIT < QU'ELLE FIGURE DANS LA LISTE DES VOI- < SINS DE P(I)... LR L,W < (W)=ADRESSE DU DESCRIPTEUR DE P(I), ADRI DLVOIS-DESCPT,W < PLACONS-NOUS SUR LA LISTE DES VOISINS < DE P(I), LX ANVOIS < (X)=NOMBRE DE VOISINS MAXIMAL. GEN27: EQU $ IF VOISEX-K,,XEIF%, IF ATTENTION : LE TEST SUIVANT EST IDIOT !!! XEIF%: VAL ENDIF CPZ O,W < ET CHERCHONS UN EMPLACEMENT LIBRE... JE GEN28 < OK... ADRI D,W < NON, JDX GEN27 < AU SUIVANT... QUIT XXQUIT < E R R E U R P R O G R A M M E ... JMP GEN41 < ET ON SAUTE LA MISE A JOUR... GEN28: EQU $ STY O,W < ET L'ON INSERE L'ADRESSE DU DESCRIPTEUR < DE P(J) (Y) DANS LA LISTE DES VOISINS < DE P(I). GEN40: EQU $ GEN41: EQU $ GEN50: EQU $ PLR X,Y,W < RESTAURE : < (X)=CARDINAL DE L'ENSEMBLE (P(J)), < (Y)=NOMBRE DE VOISINS A TROUVER POUR < P(I), < (W)=ADRESSE DE BASE DES DESCRIPTEURS < DE L'ENSEMBLE (P(J)). ADRI -I,Y < ET UN VOISINS DE MOINS A TROUVER POUR < P(I)... JMP GEN20 < VERS LES VOISINS SUIVANTS... < < BOUCLE DE BALAYAGE DES P(I) : < GEN21: EQU $ GEN12: EQU $ PLR X,W < RESTAURE : < (X)=NOMBRE DE POINTS P(I), < (W)=ADRESSE DU P(I) COURANT. < < CALCUL DU 'DNVOIS' REEL : < PSR X,W < RE-SAUVEGARDE TEMPORAIRE... LX ANVOIS < (X)=NOMBRE DE VOISINS MAXIMAL, LYI K < (Y)=COMPTEUR DES VOISINS GENERES, ADRI DLVOIS-DESCPT,W < (W)=BASE DE LA LISTE DES VOISINS DE P(I), GEN42: EQU $ IF VOISEX-K,,XEIF%, IF ATTENTION : LE TEST SUIVANT EST IDIOT !!! XEIF%: VAL ENDIF CPZ O,W < A-T'ON ICI UN VOISIN ??? JE GEN43 < NON... ADRI I,Y < OUI, ON LE COMPTE, GEN43: EQU $ ADRI D,W < PASSAGE AU VOISIN SUIVANT EVENTUEL, JDX GEN42 < S'IL EXISTE... PLR X,W < RESTAURATIONS, STY DNVOIS < ET MISE EN PLACE DU NOMBRE DE VOISINS < REELLEMENT GENERE... < < TRI DES VOISINS PAR ADRESSE < DECROISSANTE DES DESCRIPTEURS : < PSR X,W LX DNVOIS < (X)=NOMBRE REEL DE VOISINS, ADRI DLVOIS-DESCPT,W < (W)=ADRESSE DE LA LISTE DES VOISINS. GEN73: EQU $ ADRI -I,X < (X)=NOMBRE DE TESTS A FAIRE POUR TRIER < PAR PERMUTATION 2 A 2... LR X,A CPI W < Y-A-T'IL AU MOINS 1 VOISIN ??? JL GEN74 < NON... PSR X,W GEN71: EQU $ LA O,W < ACCES A L'ELEMENT COURANT, CP O+D,W < ET COMPARAISON AU SUIVANT : JGE GEN72 < OK, LE PLUS GRAND EST DEJA DEVANT... XM O+D,W < NON, STA O,W < ON LES PERMUTE... GEN72: EQU $ ADRI D,W < PASSAGE A L'ELEMENT SUIVANT, JDX GEN71 < S'IL EXISTE... PLR X,W JMP GEN73 < MAINTENANT QUE LE MINIMUMM EST EN QUEUE, < PASSONS A UN UN MINIMUM INFERIEUR... GEN74: EQU $ PLR X,W < NON, ON A FINI LE TRI... GEN11: EQU $ ADRI LDESCP,W < PASSAGE AU POINT P(I) SUIVAT, JDX GEN110 < S'IL EXISTE... JMP GEN111 < VERS LA VISUALISATION... GEN110: EQU $ BSR AGOTO WORD GEN10 < VERS LE POINT P(I) SUIVANT... GEN111: EQU $ IF XOPT01-EXIST,XOPT1,,XOPT1 < < < V I S U A L I S A T I O N D E S V O I S I N A G E S : < < IF NEXIST-K,,XEIF%, IF ATTENTION : LE TEST SUIVANT EST IDIOT !!! XEIF%: VAL ENDIF CPZ IWGVOI < DOIT-ON TRACER LES VOISINAGES ??? JE GEN32 < NON... #/FLD# FACT PSR A,B < SAUVEGARDE DE 'FACT'... FDV F05 #/FST# FACT < AFIN DE VOIR L'ENSEMBLE DU DESIN... LX ANPOIN < (X)=NOMBRE DE POINTS DANS LE NUAGE, LRM W WORD LPOINT < (W)=ADRESSE DE LA BASE DES DEXCRIPTEURS. GEN30: EQU $ PSR X,W < SAUVEGARDES... LX DNVOIS < (X)=NOMBRE DE VOISINS DE P(I) COURANT, CPZR X < P(I) A-T'IL DES VOISINS ??? JE GEN31 < NON, RIEN A FAIRE... PSR X < SAUVEGARDE DU NOMBRE DE VOISINS P(J) < DE P(I). BSR APMOV1 < DEPLACEMENT DE P(I) --> (FXS,FYS), BSR APROJ < QUE L'ON PROJETTE, LRM A,B,X WORD CS2D < (A)=ADRESSE DU POINT 2D COURANT, WORD BUFGR1 < (B)=ADRESSE DU BUFFER ORIGINE GRAPHIQUE, WORD LBUF2D < (X)=NOMBRE DE MOTS A DEPLACER, MOVE < ET MISE EN PLACE DE L'ORIGINE P(I)... PLR X < RESTAURE : < (X)=NOMBRE DE VOISINS P(J) DE P(I). LR W,L ADRI DLVOIS-DESCPT,L < (L)=BASE DE LA LISTE DES VOISINS P(J) < DE P(I). GEN33: EQU $ PSR X < SAUVEGARDE DU NOMBRE DE VOISINS P(J) < DE P(I) ENCORE A TRACER... LA O,L < (A)=ADRESSE DU DESCRIPTEUR DE P(J). IF VOISEX-K,,XEIF%, IF ATTENTION : LE TEST SUIVANT EST IDIOT !!! XEIF%: VAL ENDIF JALE GEN34 < ET ON SAUTE LE TRACE SI LE VOISIN N'EXIS- < TE PAS, OU BIEN FIGURE DANS UNE LISTE < ANTERIEURE... LR A,W < (W)=ADRESSE D'UN VOISIN P(J) DE P(I), BSR APMOV1 < DEPLACEMENT DE P(J) -- (FXS,FYS,FZS), BSR APROJ < QUE L'ON PROJETTE, LRM A,B,X WORD CS2D < (A)=ADRESSE DU POINT 2D COURANT, WORD BUFGR2 < (B)=ADRESSE DU BUFFER EXTREMITE GRAPHIQUE WORD LBUF2D < (X)=NOMBRE DE MOTS A DEPLACER, MOVE < ET MISE EN PLACE DE L'EXTREMITE P(J)... LAD DEMOG SVC < OUVERTURE GRAPHIQUE, AFIN DE DECHAINER < LES VECTEURS. LAD DEMWG SVC < ET TRACE DU VECTEUR (P(I),P(J))... GEN34: EQU $ PLR X < RESTAURE : < (X)=NOMBRE DE VOISINS P(J) RESTANT A < VISUALISER... ADRI D,L < ACCES AU VOISIN P(J) SUIVANT, JDX GEN33 < S'IL EXISTE... GEN31: EQU $ PLR X,W < RESTAURE : < (X)=NOMBRE DE POINTS P(I) A TRAITER, < (W)=BASE COURANTE DE P(I). ADRI LDESCP,W < PASSAGE AU POINT P(I) SUIVANT, JDX GEN30 < S'IL EXISTE... LAD DEMCG SVC < ET RETOUR EN ALPHA-NUMERIQUE... PLR A,B #/FST# FACT < RESTAURATION DE 'FACT'... GEN32: EQU $ XOPT1: VAL ENDIF < < < G E N E R A T I O N D E L ' I M A G E : < < GEN69: EQU $ QUIT XXQUIT < P O U R R E F L E C H I R ... CPZ IERASE < FAUT-IL EFFACER ??? JE GEN69N < NON... IF NEXIST-K,,XEIF%, IF ATTENTION : LE TEST CI-DESSUS EST IDIOT !!! XEIF%: VAL ENDIF < < EFFACEMENT DE L'ECRAN : < XWOR%1: VAL NIV256=K IF BIT>XWOR%1-NIV256,,XWOR%, IF ATTENTION : LE CALCUL DU MASQUE SELECTANT TOUS IF LES PLANS EST ABSURDE !!! XWOR%: VAL ENDIF LAI NIV256-MASK)MOCD STA MCDAJ LA ARPLAN < (A)=ADRESSE DU REGISTRE DE SELECTION... BSR APWCDA < ET ON SELECTIONNE TOUS LES PLANS... LAI ERASE STA MCDAJ LA ARCMD BSR APWCDA < EFFACEMENT DE L'ECRAN, ET REINITIALISA- < TION DE TOUS LES REGISTRES... LAD TEMPO SVC < ET ON FAIT UN PETIT DODO... LAI XCTRL1 STA MCDAJ LA ACTRL1 BSR APWCDA < INITIALISATION DE 'CTRL1'. LAI XCTRL2 STA MCDAJ LA ACTRL2 BSR APWCDA < INITIALISATION DE 'CTRL2'. < < INITIALISATION DES < CONDITIONS DE TRACE : < GEN69N: EQU $ LAI VECTSB STA VECTRS < MISE EN MODE 'SBT', SOIT 'OU-FLOU', LRM A WORD XXN255+Z=K+I STA VEDECA < AFIN D'ECRASER LE NIVEAU ANTERIEUR... < < VISUALISATION DES POINTS DU NUAGE : < LX ANPOIN < (X)=NOMBRE DE POINTS DANS LE NUAGE, LRM W WORD LPOINT < (W)=ADRESSE DE LA BASE DES DEXCRIPTEURS. GEN70: EQU $ PSR X < SAUVEGARDE DU NOMBRE DE POINTS... BSR APMOV1 < DEPLACEMENT DE P(I) --> (FXS,FYS), BSR APROJ < QUE L'ON PROJETTE, LRM A,B,X WORD CS2D < (A)=ADRESSE DU POINT 2D COURANT, WORD BUFGR1 < (B)=ADRESSE DU BUFFER ORIGINE GRAPHIQUE, WORD LBUF2D < (X)=NOMBRE DE MOTS A DEPLACER, MOVE < ET MISE EN PLACE DE L'ORIGINE P(I)... LX BUFGR1+COORDX LY BUFGR1+COORDY BSR ACERCL < VISUALISATION DU POINT COURANT. PLR X < RESTAURE : < (X)=NOMBRE DE POINTS DU NUAGE... ADRI LDESCP,W < PASSAGE AU POINT P(I) SUIVANT, JDX GEN70 < S'IL EXISTE... QUIT XXQUIT < POUR POUVOIR ADMIRER L'IMAGE DES POINTS < DU NUAGE... < < PARCOURS DE LA LISTE < DES VOISINAGES ET < LEUR VISUALISATION : < LX ANPOIN < (X)=NOMBRE DE POINTS DANS LE NUAGE, LRM W WORD LPOINT < (W)=ADRESSE DE LA BASE DES DEXCRIPTEURS. GEN80: EQU $ PSR X,W < SAUVEGARDES... LX DNVOIS < (X)=NOMBRE DE VOISINS DE P(I) COURANT, CPZR X < P(I) A-T'IL DES VOISINS ??? JG GEN181 < OUI, ALLONS LES VISUALISER... BSR AGOTO WORD GEN81 < NON, 'GOTO' RIEN FAIRE... GEN181: EQU $ PSR X < SAUVEGARDE DU NOMBRE DE VOISINS P(J) < DE P(I). BSR APMOV1 < DEPLACEMENT DE P(I) --> (FXS,FYS), BSR APROJ < QUE L'ON PROJETTE, LRM A,B,X WORD CS2D < (A)=ADRESSE DU POINT 2D COURANT, WORD BUFGR1 < (B)=ADRESSE DU BUFFER ORIGINE GRAPHIQUE, WORD LBUF2D < (X)=NOMBRE DE MOTS A DEPLACER, MOVE < ET MISE EN PLACE DE L'ORIGINE P(I)... PLR X < RESTAURE : < (X)=NOMBRE DE VOISINS P(J) DE P(I). LR W,L ADRI DLVOIS-DESCPT,L < (L)=BASE DE LA LISTE DES VOISINS P(J) < DE P(I). GEN83: EQU $ PSR X < SAUVEGARDE DU NOMBRE DE VOISINS P(J) < DE P(I) ENCORE A TRACER... LA O,L < (A)=ADRESSE DU DESCRIPTEUR DE P(J). IF VOISEX-K,,XEIF%, IF ATTENTION : LE TEST SUIVANT EST IDIOT !!! XEIF%: VAL ENDIF JAG GEN85 < OK... BSR AGOTO WORD GEN84 < ET ON SAUTE LE TRACE S'IL N'Y A PAS DE < VOISINS OU BIEN S'IL FIGURE SUR UNE LISTE < ANTERIEURE... < < VISUALISATION D'UNE LIAISON (P(I),P(J)) : < GEN85: EQU $ LR A,W < (W)=ADRESSE D'UN VOISIN P(J) DE P(I), BSR APMOV1 < DEPLACEMENT DE P(J) -- (FXS,FYS,FZS), BSR APROJ < QUE L'ON PROJETTE, LRM A,B,X WORD CS2D < (A)=ADRESSE DU POINT 2D COURANT, WORD BUFGR2 < (B)=ADRESSE DU BUFFER EXTREMITE GRAPHIQUE WORD LBUF2D < (X)=NOMBRE DE MOTS A DEPLACER, MOVE < ET MISE EN PLACE DE L'EXTREMITE P(J)... < < TRACE D'UN RECTANGLE : < PSR X,Y LRM A,B,X WORD BUFGR < (A)=ADRESSE DU VECTEUR PROJETE, WORD VECGC < (B)=ADRESSE DU VECTEUR A TRACER EN 512, WORD LBUFGR < (X)=NOMBRE DE MOTS A DEPLACER. MOVE < PREPARATION DES ARGUMENTS DE L'INTER- < POLATEUR. < NOTA : LE VECTEUR (+(Y2-Y1),-(X2-X1)) < EST UN VECTEUR NORMAL AU VECTEUR < ((X2-X1),(Y2-Y1)) A TRACER ; ON VA DONC < LE REPRESENTER PAR UN RECTANGLE BALAYE < LE LONG DE CE VECTEUR NORMAL... < < TRACE DES DISQUES < DES 2 EXTREMITES : < LX VECGX1 LY VECGY1 BSR ACERCL < TRACE DU DISQUE DE CENTRE (X1,Y1). LX VECGX2 LY VECGY2 BSR ACERCL < TRACE DU DISQUE DE CENTRE (X2,Y2). < < CALCUL DU PAS EN 'X' ET 'Y' < DE GENERATION DU RECTANGLE : < LA VECGX2 < X2, SB VECGX1 < X2-X1, NGR A,Y < (Y)=-(X2-X1). LA VECGY2 < Y2, SB VECGY1 < Y2-Y1. LR A,X < (X)=+(Y2-Y1). PSR X,Y CPZR X < RECHERCHE DE ABS(X). JGE GEN93 NGR X,X GEN93: EQU $ CPZR Y < RECHERCHE DE ABS(Y). JGE GEN94 NGR Y,Y GEN94: EQU $ LR X,A CPR Y,X < RECHERCHE DU MAX((X),(Y)) : JGE GEN90 < 'X' EST LE MAXIMUM... LR Y,A < 'Y' EST LE MAXIMUM... GEN90: EQU $ PLR X,Y JANE GEN96 < OK, LE MAXIMUM EST NON NUL... BSR AGOTO WORD GEN97 < SI LE MAXIMUM EST NUL, CELA SIGNIFIE < QUE LES 2 POINTS P(I) ET P(J) SONT TRES < PROCHES (SANS ETRE CONFONDUS PUISQUE < L'ON ELIMINE LES D(P(I),P(J)) QUI SONT < NULLES...), ON N'A DONC PAS DE RECTANGLE < A TRACER... GEN96: EQU $ BSR AFLT #/FST# FWORK1 < ET MEMORISATION DANS 'FWORK1' < DE MAX(+(Y2-Y1),-(X2-X1)). LR X,A < +(Y2-Y1), BSR AFLT FDV FWORK1 #/FST# FECGXP < PAS LE LONG DE 'X' : < +(Y2-Y1)/MAX(+(Y2-Y1),-(X2-X1)). LR Y,A BSR AFLT FDV FWORK1 #/FST# FECGYP < PAS LE LONG DE 'Y' : < -(X2-X1)/MAX(+(Y2-Y1),-(X2-X1)). LA VECGX1 < X1, STA SAVEX < X(CENTRE DU DISQUE (X1,Y1)), BSR AFLT #/FST# FECGX1 LA VECGY1 < Y1. STA SAVEY < Y(CENTRE DU DISQUE (X1,Y1)). BSR AFLT #/FST# FECGY1 LA VECGX2 < X2, BSR AFLT #/FST# FECGX2 LA VECGY2 < Y2. BSR AFLT #/FST# FECGY2 LAI XNIV0 STA VECTNI < INITIALISATION DU PREMIER NIVEAU... < < CALCUL DE L'EPAISSEUR : < #/FLD# FECGXP < XP (PAS LE LONG DE 'X'), FMP FECGXP < XP*XP, BSR ASFWOR #/FLD# FECGYP < YP (PAS LE LONG DE 'Y'), FMP FECGYP < YP*YP, BSR APFWOR < XP*XP+YP*YP, BSR ARAC < RAC(XP*XP+YP*YP), BSR ATSFLO #/FST# FWORK2 < FWORK2=RAC(XP*XP+YP*YP), LA DEPAIS BSR AFLT < EPAIS, FDV FWORK2 < EPAIS/RAC(XP*XP+YP*YP), BSR AROND ADRI W,A < ON MAJORE D'UNE UNITE, AFIN DE FAVORISER < LE TEST DE RACCORDEMENT DU RECTANGLE ET < DES DISQUES D'EXTREMITE... LR A,X < (X)=NOMBRE DE DECALAGE A FAIRE SUR LE < VECTEUR ARGUMENT POUR L'AMENER SUR < L'UN DES COTES DU RECTANGLE. < < RECHERCHE D'UN GRAND < BORD DU RECTANGLE : < STX WEPAIS < (CORRESPOND A XEPAIS-Z/XXXMOY) GEN91: EQU $ #/FLD# FECGX1 FSB FECGXP #/FST# FECGX1 < TRANSLATION DE 'X1', #/FLD# FECGY1 FSB FECGYP #/FST# FECGY1 < TRANSLATION DE 'Y1'. #/FLD# FECGX2 FSB FECGXP #/FST# FECGX2 < TRANSLATION DE 'X2', #/FLD# FECGY2 FSB FECGYP #/FST# FECGY2 < TRANSLATION DE 'Y2'. JDX GEN91 < UN PEU LOURD COMME METHODE, MAIS JE < FAIS SIMPLE... < < GENERATION DU RECTANGLE : < LA WEPAIS LR A,X ADR X,X ADRI Z,X < (X)=NOMBRE DE VECTEURS A TRACER POUR < REMPLIR LE RECTANGLE, < (CORRESPOND A XEPAIS) ADRI Z,A STA WEPAIS < POUR LE TEST DE MILIEU... LY AXNIVP < (Y)=PAS INITIAL DE PROGRESSION DES < NIVEAUX DES VECTEURS. GEN92: EQU $ #/FLD# FECGX1 BSR AROND STA VECGX1 < GENERATION DE 'X1', #/FLD# FECGY1 BSR AROND STA VECGY1 < GENERATION DE 'Y1'. LA VECGX1 < X1, SB SAVEX < X1-XC, BSR AFLT #/FST# FWORK1 < X1-XC, FMP FWORK1 < (X1-XC)**2, BSR ASFWOR LA VECGY1 < Y1, SB SAVEY < Y1-YC ((XC,YC) DESIGNE LE CENTRE. BSR AFLT #/FST# FWORK2 < Y1-YC, FMP FWORK2 < (Y1-YC)**2, BSR APFWOR < (X1-XC)**2+(Y1-YC)**2, BSR ARAC < ET CALCUL DE LA DISTANCE DU POINT < COURANT (X1,Y1) AU CENTRE (XC,YC) : BSR ATSFLO BSR AROND CP DEPAIS < LE VECTEUR COURANT DE REMPLISSAGE < TOMBE-T'IL DANS LE DISQUE (SAVEX,SAVEY) ? JG GEN95 < NON, ON IGNORE CE VECTEUR... #/FLD# FECGX2 < NON, ON TRACE CE VECTEUR... BSR AROND STA VECGX2 < GENERATION DE 'X2', #/FLD# FECGY2 BSR AROND STA VECGY2 < GENERATION DE 'Y2'. BSR AVE512 < TRACE DU VECTEUR ((X1,Y1),(X2,Y2)) < COURANT... LR X,A < (A)=INDEX DE LA BOUCLE : CP WEPAIS < EST-ON AU MILIEU DU REMPLISSAGE ??? < (CORRESPOND A XEPAIS-Z/XXXMOY+Z) JNE GEN86 < NON... NGR Y,Y < OUI, ON INVERSE LE PAS DE PROGRESSION < DES NIVEAUX DES VECTEURS AFIN D'AVOIR < DU "RELIEF", ET D'EVITER A AVOIR A FAIRE < DE L'ANTI-ALIASING SUR LES BORDS !!! GEN86: EQU $ LA VECTNI ADR Y,A STA VECTNI < ET TRANSLATION DU NIVEAU DE TRACE... GEN95: EQU $ #/FLD# FECGX1 FAD FECGXP #/FST# FECGX1 < TRANSLATION DE 'X1', #/FLD# FECGY1 FAD FECGYP #/FST# FECGY1 < TRANSLATION DE 'Y1'. #/FLD# FECGX2 FAD FECGXP #/FST# FECGX2 < TRANSLATION DE 'X2', #/FLD# FECGY2 FAD FECGYP #/FST# FECGY2 < TRANSLATION DE 'Y2'. JDX GEN92 < ET AU VECTEUR SUIVANT DE REMPLISSAGE < DU RECTANGLE... GEN97: EQU $ PLR X,Y GEN84: EQU $ < < PASSAGE A UN VECTEUR (P(I),P(J)) SUIVANT : < PLR X < RESTAURE : < (X)=NOMBRE DE VOISINS P(J) RESTANT A < VISUALISER... ADRI D,L < ACCES AU VOISIN P(J) SUIVANT, JDX GEN183 < S'IL EXISTE... GEN81: EQU $ PLR X,W < RESTAURE : < (X)=NOMBRE DE POINTS P(I) A TRAITER, < (W)=BASE COURANTE DE P(I). ADRI LDESCP,W < PASSAGE AU POINT P(I) SUIVANT, JDX GEN180 < S'IL EXISTE... < < RELAIS : < JMP GEN200 < POUR LES SAUTER... GEN183: EQU $ BSR AGOTO WORD GEN83 GEN180: EQU $ BSR AGOTO WORD GEN80 GEN200: EQU $ < < < E N T R Y A L T - M O D E : < < DEBUT5: EQU $ QUIT XXQUIT < A T T E N T E ... LRM C,K < ON REINITIALISE 'C' ET 'K' AU CAS < D'UNE RE-ENTREE PAR UN 'ALT-MODE'... WORD COM+DEPBAS < 'C', WORD STACK-DEPILE < 'K'. BSR AGOTO WORD DEBUT4 < (A)=ADRESSE D'ITERATION SUR ALT-MODE... PAGE < < < L I S T E D E S D E S C R I P T E U R S D E P O I N T S : < < LPOINT: EQU $ IF LPOINT=FCTA,,,XEIF% IF ATTENTION : A CAUSE DE 'VOISEX', TOUTES LES IF ADRESSES DE 'LPOINT' DOIVENT ETRE STRICTEMENT IF POSITIVES !!! XEIF%: VAL ENDIF DO NPOINT DZS LDESCP IF $=FCTA-K,,,XEIF% IF ATTENTION : A CAUSE DE 'VOISEX', IF TOUTES LES ADRESSES DE 'LPOINT' IF DOIVENT ETRE STRICTEMENT POSITIVES !!! XEIF%: VAL ENDIF PAGE < < < U P D A T E S : < < $EQU PZ FLOAT 1000 < POINT DE VUE DE L'OBSERVATEUR. $EQU FACT FLOAT 70 < FACTEUR D'ECHELLE DE LA PROJECTION. $EQU TRX WORD SIZXVI/XXXMOY < X-TRANSLATION GRAPHIQUE. $EQU TRY WORD SIZYVI/XXXMOY < Y-TRANSLATION GRAPHIQUE. $EQU ADIMGR WORD DIMGR2 < DIMENSION DE L'ESPACE GRAPHIQUE. $EQU RDNMIN WORD NVOIS*DIMGR2 < MIN(NOMBRE DE VOISINS). $EQU RDNMAX WORD NVOIS*DIMGR2 < MAX(NOMBRE DE VOISINS). $EQU ANVOIS WORD NVOIS*DIMGR2 < NOMBRE DE VOISINS MAXIMAL D'UN POINT. PAGE < < < T A B L E D E S S Y M B O L E S : < < IF '00000000000@,XEIF%,,XEIF% EST XEIF%: VAL ENDIF DATE END DEBUT