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 'XXVEC'... CALL #SIP VECTEUR 512# XXXVEC: VAL XXVEC1 < DEFINITION DES CONSTANTES IMAGE/VECTEUR. CALL #SIP VECTEUR 512# 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 < < < 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 : < IERASE: WORD EXIST < EFFACER ('EXIST'), OU NON ('NEXIST') < L'ECRAN 512... IQUIT: WORD EXIST < S'ARRETER ('EXIST') OU PAS ('NEXIST') < APRES CHAQUE IMAGE (POINT D'ARRET). GRAINE: WORD NILK < GRAINE DU GENERATEUR ALEATOIRE... SUPRDN: WORD NILK < SUP(RDN), INFRDN: WORD NILK < INF(RDN). NPOIN1: WORD NILK < NOMBRE DE POINTS NPOIN2: WORD NILK < A GENERER (N1*N2)... ICONEX: WORD NEXIST < DOIT-ON EXTRAIRE LE SOUS-ENSEMBLE < CONNEXE : < 'EXIST' : OUI (DANS 'MAT2'), < 'NEXIST' : NON. IVISP: WORD EXIST < DOIT-ON VISUALISER AU PREALABLE PLAN < PAR PLAN SOUS FORME D'UNE MATRICE : < 'EXIST' : OUI, < 'NEXIST' : NON. IVISD: WORD NEXIST < TRACER ('EXIST') OU PAS ('NEXIST') LES < DISQUES SYMBOLISANT LES SITES. RAYON: WORD NILK < RAYON DES DISQUES. IVISK: WORD EXIST < DOIT-ON VISUALISER ('EXIST') OU PAS < ('NEXIST') DES PETITS CUBES. COTE: WORD NILK < COTE DES PETITS CUBES. IVISC: WORD NEXIST < TRACER ('EXIST') OU PAS ('NEXIST') LES < CONNEXIONS. INEW1: WORD EXIST < MODE DE CHOIX DES COULEURS DES DISQUES < ET DES CONNEXIONS : < 'NEXIST' : LES CONNEXIONS SONT 2 FOIS PLU < PLUS SOMBRES QUE LES PARTIES < LES PLUS LUMINEUSES DES < DISQUES, ET LES PARTIES DES < DISQUES LES PLUS SOMBRES (AU < BORD VONT PRATIQUEMENT JUS- < QU'AU NOIR) ET ENFIN, LES < CONNEXIONS UTILISENT DES < NIVEAUX PRIS PAR LES DISQUES. < 'EXIST' : LES COULEURS UTILISEES SONT < PROPRES A CHAQUE PLAN 'Z' ; < 2 PLANS PARALLELES NE PEUVENT < UTILISER LES MEMES... < < MATRICE DE TRANSFORMATION : < MAT11: FLOAT <NILK<NILK<NILK MAT12: FLOAT <NILK<NILK<NILK MAT13: FLOAT <NILK<NILK<NILK TRMATX: WORD NILK < TRANSLATION APRES MULTIPLICATION PAR LA < MATRICE 'MAT'. IMODX: WORD NEXIST < PAS DE MODULO SUR L'AXE 'OX' TRANSFORME, MAT21: FLOAT <NILK<NILK<NILK MAT22: FLOAT <NILK<NILK<NILK MAT23: FLOAT <NILK<NILK<NILK TRMATY: WORD NILK < TRANSLATION APRES MULTIPLICATION PAR LA < MATRICE 'MAT'. IMODY: WORD NEXIST < PAS DE MODULO SUR L'AYE 'OY' TRANSFORME, MAT31: FLOAT <NILK<NILK<NILK MAT32: FLOAT <NILK<NILK<NILK MAT33: FLOAT <NILK<NILK<NILK TRMATZ: WORD NILK < TRANSLATION APRES MULTIPLICATION PAR LA < MATRICE 'MAT'. IMODZ: WORD NEXIST < PAS DE MODULO SUR L'AZE 'OZ' TRANSFORME, < < RELAIS DIVERS : < ADEB9: WORD DEBUT9 < < 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# < < VARIABLES DE MANOEUVRE : < FWORK1: FLOAT <NILK<NILK<NILK FWORK2: FLOAT <NILK<NILK<NILK < < 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# APOINT: WORD POINT < SOUS-PROGRAMME DE MARQUAGE D'UN POINT < DE COORDONNEES (X), DONT LE NIVEAU EST < CALCULE VIA LA TABLE 'LNIVO'. ALNIVO: WORD LNIVO,X < TABLE DE CORRESPONDANCE DES NIVEAUX POUR < LE SOUS-PROGRAMME 'POINT'. < < ACCES AUX REGISTRES DE CONTROLE : < ACTRL1: WORD RCTRL1 ACTRL2: WORD RCTRL2 PAGE < < < L O C A L : < < LOCAL LOC: EQU $ < < DEFINITION DES MATRICES : < LOGZ:: VAL 4 < LOGARITHME BASE 2 DE LA DIMENSION 'Z', LOGY:: VAL 5 < LOGARITHME BASE 2 DE LA DIMENSION 'Y', LOGX:: VAL 5 < LOGARITHME BASE 2 DE LA DIMENSION 'X'. LONGZ:: VAL BIT>LOGZ < LONGUEUR DE L'AXE 'Z', LONGY:: VAL BIT>LOGY < LONGUEUR DE L'AXE 'Y', LONGX:: VAL BIT>LOGX < LONGUEUR DE L'AXE 'X'. XWOR%1: VAL LOGX+LOGY+LOGZ XWOR%2: VAL BIT>XWOR%1 LONMAT:: VAL XWOR%2 < NOMBRE D'ELEMENTS D'UNE MATRICE BINAIRE. IF LONMAT-K,,,XEIF% IF ATTENTION : L'ESPACE 3D EST TROP GRAND !!! XEIF%: VAL ENDIF AINDEX: WORD INDEX < CALCUL D'UN INDEX LINEAIRE A PARTIR < D'UN TRIPLET (X,Y,W) (SOIT (X,Y,Z)). ASBT3D: WORD SBT3D < MISE D'UN ELEMENT A 1, ARBT3D: WORD RBT3D < MISE D'UN ELEMENT A 0, ATBT3D: WORD TBT3D < TEST D'UN ELEMENT. AVALID: WORD VALID < TEST DE L'APPARTENANCE AU "CUBE" DU < POINT (X,Y,Z). < < PARAMETRES DU GENERATEUR ALEATOIRE : < RDNX:: VAL '1234 < INDICATIF 'OX', RDNY:: VAL '5678 < INDICATIF 'OY', RDNZ:: VAL '9ABC < INDICATIF 'OZ', RDNXZ:: VAL 'DEF0 < INDICATIF DU PLAN 'XOZ'. ERDNX: FLOAT <LONGX-Z<K<K < NORMALISATEUR SUR 'OX', ERDNY: FLOAT <LONGY-Z<K<K < NORMALISATEUR SUR 'OY', ERDNZ: FLOAT <LONGZ-Z<K<K < NORMALISATEUR SUR 'OZ'. SPOIN1: WORD NILK < SAUVEGARDE DE SPOIN2: WORD NILK < 'NPOIN1/2'... RDN: WORD 4397 < NOMBRE ALEATOIRE COURANT. RDN1: WORD 5189 < CONSTANTE RDN2: WORD 6791 < DE CALCUL DES RDN3:: VAL 19 < NOMBRE ALEATOIRES... RDN4: WORD 7993 < 2EME NOMBRE ALEATOIRE COURANT. RDN5: WORD 4021 RDN6:: VAL 23 POINTS: WORD 16807 INF32: FLOAT 32768 INF64: FLOAT 65536 FWORK4: FLOAT <NILK<NILK<NILK FWORK5: FLOAT <NILK<NILK<NILK FSUP: FLOAT <NILK<NILK<NILK < 'SUPRDN' EN FLOTTANT, FINF: FLOAT <NILK<NILK<NILK < 'INFRDN' EN FLOTTANT. SUP64: FLOAT <NILK<NILK<NILK < SUP/65536, UNMIS: FLOAT <NILK<NILK<NILK < 1-(INF/SUP), UNPIS: FLOAT <NILK<NILK<NILK < 32768*(1+(INF/SUP)). RDNSEU:: FLOAT <NILK<NILK<NILK < SEUIL DE GENERATION DU PLAN DE BASE < XOZ. ARDN: WORD SPRDN < GENERATEUR ALEATOIRE 3D. < < DEFINITION DE LA MATRICE '1' < DES SITES DU RESEAU : < AMAT1: WORD MAT1 < ADRESSE DE LA MATRICE. AMAT1X: WORD MAT1-IJIJDX,X < RELAI DE NETTOYAGE. ASBT1: WORD SBT1 < MISE D'UN ELEMENT A 1, ARBT1: WORD RBT1 < MISE D'UN ELEMENT A 0, ATBT1: WORD TBT1 < TEST D'UN ELEMENT. < < DEFINITION DE LA MATRICE '2' < DES SITES CONNECTES DU RESEAU : < AMAT2: WORD MAT2 < ADRESSE DE LA MATRICE. AMAT2X: WORD MAT2-IJIJDX,X < RELAI DE NETTOYAGE. ASBT2: WORD SBT2 < MISE D'UN ELEMENT A 1, ARBT2: WORD RBT2 < MISE D'UN ELEMENT A 0, ATBT2: WORD TBT2 < TEST D'UN ELEMENT. < < RECHERCHE DE LA CONNEXITE : < AREMP: WORD REMP < SOUS-PROGRAMME RECURSIF DE REMPLISSAGE. NREMP:: VAL 6 < ON RECONNAIT LES 6 VOISINS LES PLUS < PROCHES ("ORTHOGONAUX"). AINCX: WORD INCX,X < LISTE DES INCREMENTS DE 'X' : INCX: EQU $ WORD K;K;+I;-I;K;-I;+I IF $-INCX-I-NREMP,,XEIF%, IF ATTENTION : LA LONGUEUR DE 'INCX' EST MAUVAISE !!! XEIF%: VAL ENDIF AINCY: WORD INCY,X < LISTE DES INCREMENTS DE 'Y' : INCY: EQU $ WORD K;+I;-I;K;-I;+I;K IF $-INCY-I-NREMP,,XEIF%, IF ATTENTION : LA LONGUEUR DE 'INCY' EST MAUVAISE !!! XEIF%: VAL ENDIF AINCZ: WORD INCZ,X < LISTE DES INCREMENTS DE 'X' : INCZ: EQU $ WORD +I;-I;K;-I;+I;K;K IF $-INCZ-I-NREMP,,XEIF%, IF ATTENTION : LA LONGUEUR DE 'INCZ' EST MAUVAISE !!! XEIF%: VAL ENDIF XWOR%1: VAL K < INITIALISATION DU CUMUL, XWOR%2: VAL -I < POUR UN DECALAGE A DROITE, XWOR%3: VAL COSBT?BITSIG=FMASK(K=FCINST < POUR MARQUER LE PREMIER BIT... DO NREMP XWOR%1: VAL XWOR%1>XWOR%2?XWOR%3 LVALXY: WORD XWOR%1 < LISTE DES VOISINS A TESTER ; LE BIT < 'REMP+1' A 0 PERMET DE CLORE LA LISTE, ET < ASSURE LE RETOUR AU POINT DE DEPART... < < GESTION DE LA PILE VIRTUELLE : < SSTACK:: VAL K < ADRESSE EN 'CDAJ' DE LA PILE VIRTUELLE. KSSTAC: WORD NILK < POINTEUR DE LA PILE VIRTUELLE, ASSTAC: WORD SSTACK < ADRESSE EN 'CDAI' DE LA PILE VIRTUELLE. MSSTAC: WORD NILK < MOT COURANT DE LA PILE VIRTUELLE, AMSSTA: WORD MSSTAC < ET SON ADRESSE... ASPSTA: WORD SPSTAC < SOUS-PROGRAMME DE SIMULATION DES < EMPILEMENTS. < < DONNEES DE LA TRANSFORMATION < MATRICIELLE (MATIJ) : < APRMAT: WORD PRMAT < SOUS-PROGRAMME DE TRANSFORMATION. < < SAUVEGARDE DES COORDONNEES : < SAVEX: WORD NILK SAVEY: WORD NILK SAVEZ: WORD NILK < < DONNEES DE PROJECTION : < COST: FLOAT <NILK<NILK<NILK < COS(TETA) DONNE EN ARGUMENT, SINT: FLOAT <NILK<NILK<NILK < SIN(TETA) CALCULE A PARTIR DE COS(TETA). DECX:: VAL 4 < AMPLIFICATEUR DE 'X', DECY:: VAL DECX < AMPLIFICATEUR DE 'Y', DECZ:: VAL DECX-I < AMPLIFICATEUR DE 'Z'. TRANSX: WORD NILK < TRANSLATION DE 'X', TRANSY: WORD NILK < TRANSLATION DE 'Y' (PROJETES). < < DONNEES DE TRACE D'UN DISQUE : < XWOR%1: VAL XXN255+I XWOR%2: VAL BIT>LOGZ TRN XWOR%3: VAL XWOR%1/XWOR%2=K NTRN DECZDK:: VAL 4 < POUR AMPLIFIER LA COORDONNEE 'Z' LORS < DU TRACE DES DISQUES. IF DECZDK-XWOR%3,XEIF%,XEIF%, IF ATTENTION : 'DECZDK' EST TROP GRAND !!! XEIF%: VAL ENDIF SAVEZP: WORD NILK < POUR SAUVEGARDER LA COORDONNEE 'Z' < AMPLIFIEE... ACERCL: WORD CERCLE < SOUS-PROGRAMME DE TRACE. < < DONNEES DE TRACE DES PETITS CUBES : < COTEG: WORD NILK < COTE DU CUBE EN UNITE GRAPHIQUE... COTES2: WORD NILK < DEMI-COTE DES PETITS CUBES. PROJXG: WORD NILK < PROJECTION DU COTE PROJYG: WORD NILK < D'UN PETIT CUBE (EN < UNITE GRAPHIQUE...) PROXS2: WORD NILK < PROJECTION DU DEMI-COTE PROYS2: WORD NILK < D'UN CUBE (EN < UNITE TV...). ACUBE: WORD CUBE < SOUS-PROGRAMME DE TRACE DES PETITS CUBES. < < DONNEES DE TRACE DES CONNEXIONS : < DECZCO:: VAL DECZDK-I < POUR AMPLIFIER LA COORDONNEE 'Z' LORS < DU TRACE DES CONNEXIONS. IF DECZCO-XWOR%3,XEIF%,XEIF%, IF ATTENTION : 'DECZCO' EST TROP GRAND !!! XEIF%: VAL ENDIF PROJX: WORD NILK < PROJECTIONS DU VECTEUR UNITAIRE 'Z' PROJY: WORD NILK < EXPRIMEES EN COORDONNEES GRAPHIQUES. ACONEX: WORD CONEX < SOUS-PROGRAMME DE TRACE. < < < C O N S T A N T E M A G I Q U E : < < MAGIK:: VAL 7 < CONSTANTE MAGIQUE... IF K*MAGIK/BASE16(K=FCREST-K,,XEIF%, IF ATTENTION : IL FAUT MAGIK(K)=K POUR IF SIMPLIFIER LES CHOSES EN BASE 16 !!! XEIF%: VAL ENDIF XWOR%3: VAL MAGIK < CONSTANTE MAGIQUE... XWOR%7: VAL K < INITIALISATION DU CUMUL... NTRN DO BASE16 XWOR%7: VAL K=FCDO*XWOR%3/BASE16(K=FCREST?COSBT=FMASK(K?XWOR%7=FCINST XWOR%8: VAL K < INITIALISATION DU CUMUL... DO BASE16 XWOR%8: VAL K=FCDO?COSBT=FMASK(K?XWOR%8=FCINST TRN IF XWOR%7-XWOR%8,,XEIF%, IF ATTENTION : LA CONSTANTE MAGIQUE 'MAGIK' IF N'OPERE PAS UNE PERMUTATION DES 16 CHIFFRES IF DE 0 A F !!! XEIF%: VAL ENDIF IF K*MAGIK/BASE10(K=FCREST-K,,XEIF%, IF ATTENTION : IL FAUT MAGIK(K)=K POUR IF SIMPLIFIER LES CHOSES EN BASE 10 !!! XEIF%: VAL ENDIF XWOR%3: VAL MAGIK < CONSTANTE MAGIQUE... XWOR%7: VAL K < INITIALISATION DU CUMUL... NTRN DO BASE10 XWOR%7: VAL K=FCDO*XWOR%3/BASE10(K=FCREST?COSBT=FMASK(K?XWOR%7=FCINST XWOR%8: VAL K < INITIALISATION DU CUMUL... DO BASE10 XWOR%8: VAL K=FCDO?COSBT=FMASK(K?XWOR%8=FCINST TRN IF XWOR%7-XWOR%8,,XEIF%, IF ATTENTION : LA CONSTANTE MAGIQUE 'MAGIK' IF N'OPERE PAS UNE PERMUTATION DES 10 CHIFFRES IF DE 0 A 9 !!! XEIF%: VAL ENDIF AMAGIK: WORD MAGIK PAGE < < < M A T R I C E D E S S I T E S : < < MAT1: EQU $ DZS LONMAT/NBITMO PAGE < < < M A T R I C E D E S S I T E S C O N N E C T E S : < < MAT2: EQU $ DZS LONMAT/NBITMO PAGE < < < T A B L E D E T R A N S C O D A G E D E S N I V E A U X : < < < ARGUMENTS D'ASSEMBLAGE : < ND=DIVISEUR DES NIVEAUX DE 'LNIVO' (0 OU 2), < NI=TRANSLATION DES NIVEAUX DE 'LNIVO' (0 OU 128)... < < NI: @ 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 'NI'... XWOR%6: VAL XWOR%5=FCSIGN XWOR%7: VAL XWOR%5(MSYMBN)MSYMBN=FCSIGN IF XWOR%6*XWOR%7,XEIF%,,XEIF% NI:: VAL XXNOIR < LE NIVEAU INITIAL SERA LE NIVEAU NOIR. XEIF%: VAL ENDIF ND: @ 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 'ND'... XWOR%6: VAL XWOR%5=FCSIGN XWOR%7: VAL XWOR%5(MSYMBN)MSYMBN=FCSIGN IF XWOR%6*XWOR%7,XEIF%,,XEIF% ND:: VAL W < PAS DE DIVISEUR DES NIVEAUX... XEIF%: VAL ENDIF LNIVO: EQU $ NTRN XWOR%1: VAL NIV256+NOCMO-E/NOCMO XWOR%2: VAL NIV256/NOCMO(K=FCREST TRN XWOR%3: VAL NIV256+XWOR%2 < INCREMENT DES OCTETS GAUCHES, XWOR%4: VAL XWOR%3+NOCMO-Z < INCREMENT DES OCTETS DROITS. NTRN <******************************************************************************* DO XWOR%1 BYTE K=FCDO)MFFFF+N-Z*NOCMO+XWOR%3/ND+NI;K=FCDO)MFFFF+N-Z*NOCMO+XWOR%4/ND+NI XWOR%5: VAL '0000000@@@@ < RECUPERATION DU DERNIER MOT, <******************************************************************************* TRN IF XWOR%2-K,,XEIF%, XWOR%5: VAL XWOR%5(MOCG < DANS LE CAS D'UNE TABLE DE LONGUEUR < IMPAIRE, ON EFFACE LE DERNIER OCTET < GENERE, $EQU $-D < ON REVIENT D'UN MOT EN ARRIERE, WORD XWOR%5 < ET ON REGENERE LE DERNIER MOT... XEIF%: VAL ENDIF NLS DO XC512 FLOAT <NILK<NILK<NILK < LIGNE PRECEDENTE. LST PAGE < < < P I L E D E T R A V A I L : < < STACK: EQU $ DZS 64 PROG XXXVEC: VAL XXVEC3 < DEFINITION DES PROGRAMMES VECTEUR 512... CALL #SIP VECTEUR 512# PAGE < < < M A R Q U A G E D ' U N P O I N T : < < < FONCTION : < CE SOUS-PROGRAMME MARQUE < LE POINT ARGUMENT (X,Y) AVEC < COMME NIVEAU, LE NIVEAU ARGU- < MENT (A) TRANSCODE VIA LA TA- < BLE 'LNIVO', CE QUI PERMET PAR < EXEMPLE LA SUPERPOSITION DE < PLUSIEURS IMAGES, EN FAISANT < QUE LEURS TABLES 'LNIVO' SOIENT < COMPLEMENTAIRES... < < < ARGUMENTS : < (A)=NIVEAU, < (X,Y)=COORDONNEES DU POINT. < < < RESULTAT : < (A)=NIVEAU TRANSCODE. < < POINT: EQU $ PSR A,B LR A,B < (B)=NIVEAU DU TRACE. < < TEST DES "HORS-ECRAN" : < LR X,A < (A)=COORDONNEE 'X' ET VALIDATION : JAL POINT1 < HORS-ECRAN... CP VECTNC JG POINT1 < HORS-ECRAN... LR Y,A < (A)=COORDONNEE 'Y' ET VALIDATION : JAL POINT1 < HORS-ECRAN... CP VECTNL JG POINT1 < HORS-ECRAN... < < TRANSCODAGE DU NIVEAU : < PSR X < SAUVEGARDE DE LA COORDONNEE 'X'... LR B,X < (X)=NIVEAU ARGUMENT, LBY &ALNIVO < (A)=NIVEAU TRANSCODE, PLR X < RESTAURE : < (X)=COORDONNEE 'X'. < < MARQUAGE DU POINT : < BSR ASTORP < MARQUAGE : (X,Y) <-- (A)... < < ET RETOUR : < POINT1: EQU $ PLR A,B 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# XXXPRO: VAL YYYFLO < 'YYYFLO'. CALL #SIP UTILITAIRES# PAGE < < < I N D E X A T I O N D ' U N E M A T R I C E < B I N A I R E 3 D : < < < ARGUMENTS : < (X,Y,W)=TROIS INDICES D'UNE MATRICE BINAIRE 3D (.,.,.), < CORRESPONDANT EN FAIT AUX COORDONNEES < D'UN POINT DANS UN ESPACE 3D. < < < RESULTAT : < (X)=INDEX DU BIT CORRESPONDANT A L'ELEMENT (X,Y,W). < < INDEX: EQU $ PSR A < SAUVEGARDES... LR W,A < Z, SLLS LOGY < Z*DIMY, ORR Y,A < Z*DIMY+Y, SLLS LOGX < (Z*DIMY+Y)*DIMX, ORR A,X < (Z*DIMY+Y)*DIMX+X, < CE QUI DONNE DANS 'X' L'INDEX CHERCHE. PLR A < RESTAURATIONS... RSR < ET RETOUR... PAGE < < < M I S E A 1 D ' U N E L E M E N T D ' U N E < M A T R I C E B I N A I R E 3 D : < < < ARGUMENTS : < (A)=ADRESSE DE LA MATRICE. < (X,Y,W)=TROIS INDICES D'UNE MATRICE BINAIRE 3D. < < SBT3D: EQU $ PSR X < SAUVEGARDES... BSR AINDEX < CALCUL DE L'INDEX LINEAIRE EQUIVALENT < AU TRIPLET (X,Y,W) DANS 'X', SBTM O,X < ET MISE A 1... PLR X < RESTAURATIONS... RSR < ET RETOUR... PAGE < < < M I S E A 0 D ' U N E L E M E N T D ' U N E < M A T R I C E B I N A I R E 3 D : < < < ARGUMENTS : < (A)=ADRESSE DE LA MATRICE. < (X,Y,W)=TROIS INDICES D'UNE MATRICE BINAIRE 3D. < < RBT3D: EQU $ PSR X < SAUVEGARDES... BSR AINDEX < CALCUL DE L'INDEX LINEAIRE EQUIVALENT < AU TRIPLET (X,Y,W) DANS 'X', RBTM O,X < ET MISE A 0... PLR X < RESTAURATIONS... RSR < ET RETOUR... PAGE < < < T E S T D ' U N E L E M E N T D ' U N E M A T R I C E < B I N A I R E 3 D : < < < ARGUMENTS : < (A)=ADRESSE DE LA MATRICE, < (X,Y,W)=TROIS INDICES D'UNE MATRICE BINAIRE 3D. < < < RESULTAT : < LE CARRY EST POSITIONNE COMME PAR UN 'TBT'. < < TBT3D: EQU $ PSR A,B,X,Y < SAUVEGARDES... BSR AINDEX < CALCUL DE L'INDEX LINEAIRE EQUIVALENT < AU TRIPLET (X,Y,W) DANS 'X', LR X,B < ET SAUVEGARDE DANS 'B'... LRM Y WORD LONMAT < (Y)=INDEX LINEAIRE DU DERNIER ELEMENT < N'APPARTENANT PAS A LA MATRICE. DRBM < RECHERCHE DANS 'X' DU PREMIER ELEMENT < A 1 COMPRIS ENTRE LES INDEX (X) ET (Y). JC TBT3D1 < ON N'A TROUVE AUCUN ELEMENT A 1... SBTM O,X < LE PREMIER TROUVE DOIT ETRE RESTAURE, < CAR 'DRBM' LE MET A 0... TBT3D1: EQU $ LAI K < (A)=0 A PRIORI : CE QUI SIGNIFIE QUE < L'ELEMENT A T(B) ESTER (B) EST A 0... CPR B,X < LE PREMIER ELEMENT TROUVE A 1 (X) EST-IL < L'ELEMENT QUE L'ON TESTE (B) ??? JNE TBT3D2 < NON, DONC L'ELEMENT A TESTER (B) EST A 0. LAI MMOT < OUI. DONC L'ELEMENT A TESTER (B) EST A 1. TBT3D2: EQU $ TBT BITSIG < ET ON POSITIONNE LE 'CARRY'... PLR A,B,X,Y < RESTAURATIONS... RSR < ET RETOUR... PAGE < < < M O D U L E D ' A C C E S A L A M A T R I C E 1 : < < < ARGUMENTS : < (X,Y,W)=TROIS INDICES DE LA MATRICE BINAIRE 3D 'MAT1'. < < SBT1: EQU $ PSR A LA AMAT1 < (A)=ADRESSE DE LA MATRICE 1, BSR ASBT3D < MISE A 1 DE L'ELEMENT (X,Y,W). PLR A RSR RBT1: EQU $ PSR A LA AMAT1 < (A)=ADRESSE DE LA MATRICE 1, BSR ARBT3D < MISE A 0 DE L'ELEMENT (X,Y,W). PLR A RSR TBT1: EQU $ PSR A LA AMAT1 < (A)=ADRESSE DE LA MATRICE 1, BSR ATBT3D < TEST DE L'ELEMENT (X,Y,W). PLR A RSR PAGE < < < M O D U L E D ' A C C E S A L A M A T R I C E 2 : < < < ARGUMENTS : < (X,Y,W)=TROIS INDICES DE LA MATRICE BINAIRE 3D 'MAT2'. < < SBT2: EQU $ PSR A LA AMAT2 < (A)=ADRESSE DE LA MATRICE 1, BSR ASBT3D < MISE A 1 DE L'ELEMENT (X,Y,W). PLR A RSR RBT2: EQU $ PSR A LA AMAT2 < (A)=ADRESSE DE LA MATRICE 1, BSR ARBT3D < MISE A 0 DE L'ELEMENT (X,Y,W). PLR A RSR TBT2: EQU $ PSR A LA AMAT2 < (A)=ADRESSE DE LA MATRICE 1, BSR ATBT3D < TEST DE L'ELEMENT (X,Y,W). PLR A RSR PAGE < < < E X I S T E N C E D U P O I N T 3 D : < < < ARGUMENTS : < (X,Y,W)=COORDONNEES (X,Y,Z) D'UN POINT 3D. < < < RESULTATS : < LES INDICATEURS SONT POSITIONNES < TELS QUE L'ON PUISSE FAIRE AU RETOUR < DE CE SOUS-PROGRAMME : < 'JE' SI LE POINT ARGUMENT 'EXIST', < 'JNE' SI LE POINT ARGUMENT 'NEXIST'. < DE PLUS, (X,Y,Z) EST EVENTUELLEMENT < MODIFIE SI LE POINT N'EXISTE PAS, < ET QUE SUR UN OU PLUSIEURS AXES ON < TRAVAILLE EN MODULO... < < VALID: EQU $ PSR A < SAUVEGARDES... < < TEST D'APPARTENANCE AU CUBE 3D : < VALID4: EQU $ LR X,A < TEST DE 'X' : JAL VALIDX < ??? CPI LONGX JGE VALIDX < ??? VALID5: EQU $ LR Y,A < TEST DE 'Y' : JAL VALIDY < ??? CPI LONGY JGE VALIDY < ??? VALID6: EQU $ LR W,A < TEST DE 'Z' : JAL VALIDZ < ??? CPI LONGZ JGE VALIDZ < ??? < < LE POINT (X,Y,Z) EXISTE : < VALID3: EQU $ LAI EXIST < 'EXIST'. < < RETOUR : < VALID2: EQU $ CPI EXIST < POSITIONNEMENT DES INDICATEURS... PLR A < RESTAURATIONS... RSR < ET RETOUR... < < TEST DES 'MODULO' : < VALIDX: EQU $ CPZ IMODX < CALCULE-T'ON MODULO SUR 'OX' ??? JE VALID1 < NON ==> 'NEXIST"... ANDI BIT>LOGX-N < OUI... LR A,X JMP VALID5 < VERS LA SUITE DU TEST... VALIDY: EQU $ CPZ IMODY < CALCULE-T'ON MODULO SUR 'OY' ??? JE VALID1 < NON ==> 'NEXIST"... ANDI BIT>LOGY-N < OUI... LR A,Y JMP VALID6 < VERS LA SUITE DU TEST... VALIDZ: EQU $ CPZ IMODZ < CALCULE-T'ON MODULO SUR 'OZ' ??? JE VALID1 < NON ==> 'NEXIST"... ANDI BIT>LOGZ-N < OUI... LR A,W JMP VALID3 < ET 'EXIST'... < < LE POINT (X,Y,Z) N'EXISTE PAS : < VALID1: EQU $ LAI NEXIST < 'NEXIST'. JMP VALID2 < ET SORTIE... PAGE < < < T R A N S F O R M A T I O N M A T R I C I E L L E : < < < ARGUMENT : < (X,Y,W)=COORDONNEES (X,Y,Z). < < < RESULTAT : < (X)=A11*X+A12*Y+A13*Z+TRMATX EVENTUELLEMENT MODULO, < (Y)=A21*X+A22*Y+A23*Z+TRMATY EVENTUELLEMENT MODULO, < (W)=A31*X+A32*Y+A33*Z+TRMATZ EVENTUELLEMENT MODULO. < < PRMAT: EQU $ < < CALCUL DU NOUVEL 'X' : < LR X,A < X, FLT FMP MAT11 < A11*X, BSR ASFWOR LR Y,A < Y, FLT FMP MAT12 < A12*Y, BSR APFWOR < A11*X+A12*Y, LR W,A < Z, FLT FMP MAT13 < A13*Z, BSR APFWOR < A11*X+A12*Y+A13*Z, FAD TRMATX < A11*X+A12*Y+A13*Z+TRANSX, BSR AROND CPZ IMODX < FAUT-IL CALCULER MODULO SUR 'OX' ??? JE PRMAT1 < NON... ANDI BIT>LOGX-N < OUI... PRMAT1: EQU $ PSR A < SAUVEGARDE DU NOUVEL 'X'... < < CALCUL DU NOUVEL 'Y' : < LR X,A < X, FLT FMP MAT21 < A21*X, BSR ASFWOR LR Y,A < Y, FLT FMP MAT22 < A22*Y, BSR APFWOR < A21*X+A22*Y, LR W,A < Z, FLT FMP MAT23 < A23*Z, BSR APFWOR < A21*X+A22*Y+A23*Z, FAD TRMATY < A21*X+A22*Y+A23*Z+TRANSY, BSR AROND CPZ IMODY < FAUT-IL CALCULER MODULO SUR 'OY' ??? JE PRMAT2 < NON... ANDI BIT>LOGY-N < OUI... PRMAT2: EQU $ PSR A < SAUVEGARDE DU NOUVEL 'Y'... < < CALCUL DU NOUVEAU 'Z' : < LR X,A < X, FLT FMP MAT31 < A31*X, BSR ASFWOR LR Y,A < Y, FLT FMP MAT32 < A32*Y, BSR APFWOR < A31*X+A32*Y, LR W,A < Z, FLT FMP MAT33 < A33*Z, BSR APFWOR < A31*X+A32*Y+A33*Z, FAD TRMATZ < A31*X+A32*Y+A33*Z+TRANSZ, BSR AROND CPZ IMODZ < FAUT-IL CALCULER MODULO SUR 'OZ' ??? JE PRMAT3 < NON... ANDI BIT>LOGZ-N < OUI... PRMAT3: EQU $ LR A,W < Z, PLR A LR A,Y < Y, PLR A LR A,X < X. < < RETOUR : < RSR PAGE < < < R E M P L I S S A G E R E C U R S I F : < < < FONCTION : < CE SOUS-PROGRAMME RECURSIF < PARCOURS L'ENSEMBLE GENERE ET < MEMORISE DANS 'MAT1', ET NE GARDE < QUE LE SOUS-ENSEMBLE CONNEXE < RACCORDE AU POINT (0,0,0). < < < ARGUMENT : < (X,Y,W)=POINT COURANT. < < REMP: EQU $ < < TEST DES SORTIES DU "CUBE" : < BSR AVALID < TEST DES COORDONNEES (X,Y,Z) : JNE REMP1 < LE POINT (X,Y,Z) EST HORS DU CUBE, ON < ARRETE LA RECURSIVITE... < < TEST DU POINT COURANT : < BSR ATBT1 < TEST DU POINT COURANT (X,Y,Z) DANS < L'ESPACE 'MAT1' : JNC REMP1 < IL N'EST PAS OCCUPE : ON ARRETE LA < RECURSIVITE... BSR ATBT2 < IL EST OCCUPE, MAIS EST-ON DEJA PASSE < SUR LUI ??? JC REMP1 < OUI, DONC INUTILE DE LA RE-MARQUER, < ON ARRETE LA RECURSIVITE... BSR ASBT2 < NON, IL EST OCCUPE, NON ENCORE MARQUE < ET CONNECTE A LA SOURCE : ON LE MARQUE < DONC DANS 'MAT2'... < < ACCES AUX 6-VOISINS : < REMP2: EQU $ LAI K < (A)=NUMERO DU VOISIN COURANT. REMP30: EQU $ XR A,X < (X)=INDEX DES LISTES D'INCREMENT. AD &AINCX < MODIFICATION DE LA COORDONNEE 'X', XR A,Y AD &AINCY < MODIFICATION DE LA COORDONNEE 'Y', XR A,W AD &AINCZ < MODIFICATION DE LA COORDONNEE 'Z', XR A,W XR A,Y LB LVALXY < (B)=LISTE DE VALIDATION DES VOISINS... TBT NBITMO,X < LE VOISIN COURANT EST-IL A TESTER ??? XR A,X < RESTAURE : < (A)=NUMERO DE VOISIN COURANT, < (X,Y)=COORDONNEE DE CELUI-CI... JNC REMP31 < NON, ON PASSE AU SUIVANT... BSR ASPSTA < OUI, ON LE PREND EN COMPTE, JMP REMP < ET ON VA LE TRAITER... REMP31: EQU $ ADRI I,A < PASSAGE AU VOISIN SUIVANT... CPI NREMP+I < EST-CE FINI ??? < (ON FAIT +1, AFIN DE REVENIR SUR LE < POINT CENTRAL...) JL REMP30 < NON, PASSAGE AU VOISIN SUIVANT (OU < RETOUR AU POINT CENTRAL)... XWOR%1: VAL CODBT=FMASK(K?NREMP=FCINST)NREMP XWOR%2: VAL COSBT?XWOR%1=FMASK(K=FCINST IF XWOR%2-NREMP,,XEIF%,XEIF% XWOR%1: VAL XWOR%1-I < RECHERCHE DE LA PUISSANCE DE 2 < IMMEDIATEMENT SUPERIEURE. XEIF%: VAL ENDIF DREMP:: VAL NBITMO-XWOR%1 < DECALAGE D'ACCES... IF NBITMO/DREMP(K=FCREST,,XEIF%, DREMP: VAL DREMP+I < RECHERCHE D'UN DIVISEUR DE 'NBITMO'... XEIF%: VAL ENDIF IF NBITMO/DREMP(K=FCREST,,XEIF%, IF ATTENTION : 'DREMP' EST MAUVAIS !!! XEIF%: VAL ENDIF XWOR%1: VAL LONGX*LONGY*LONGZ < NOMBRE MAXIMUM D'APPELS RECURSIFS. XWOR%3: VAL NBITMO/DREMP < NOMBRE D'APPELS MEMORISES DANS UN MOT. XWOR%4: VAL XWOR%1/XWOR%3 < NOMBRE DE MOTS NECESSAIRES POUR UN < MAXIMUM D'APPELS (TOUS LES POINTS). XWOR%5: VAL SSTACK+XWOR%4 < TOP DE LA PILE VIRTUELLE... < < FIN DE LA RECURSIVITE : < REMP1: EQU $ LA KSSTAC < (A)=POINTEUR COURANT DE LA PILE : JAE REMP9 < C'EST FINI... ON RETOURNE A L'APPELANT... DC KSSTAC < NON, ON DEPILE DONC... PSR X < SAUVEGARDES... LBI K < CLEAR 'B' (SUITE DU SUPER-BUG...). SLRD NBITMO/DREMP=K < DECONCATENATION : < (A)=ADRESSE RELATIVE DANS LA PILE, < (B)=NUMERO DE ZONE, AD ASSTAC < (A)=ADRESSE ABSOLUE EN 'CDAI', PSR B LB AMSSTA < (B)=ADRESSE DE RECEPTION, LXI W < (X)=NOMBRE DE MOTS A DEPLACER. RCDA PLR B < RESTAURATION DU NUMERO DE ZONE, LAI K SLLD NBITMO=K < QUE L'ON CONVERTIT EN UN DECALAGE... LR A,X LA MSSTAC < (A)=MOT COURANT DE LA PILE, SCLS DREMP,X < QUE L'ON CADRE, ANDI BIT>DREMP-BIT < ET CE QUI NOUS DONNE LE NUMERO DE < L'APPEL DU TYPE "XREMP..." : < D'OU LES RETOURS SIMULES... PLR X CPI NREMP < VALIDATION... JL REMP31 < OK, AU VOISIN SUIVANT... QUIT XXQUIT < E R R E U R P R O G R A M M E ... REMP9: EQU $ RSR < RETOUR REEL A L'APPELANT... PAGE < < < S I M U L A T I O N D E S ' B S R ' : < < < FONCTION : < EN EFFET, LA PILE RESIDENTE < NE SUFFIT PAS : ON DOIT DONC < SIMULER LES 'BSR' RECURSIFS < DANS UNE PILE DANS LAQUELLE ON < PLACE DES NUMEROS D'APPELS LES < PLUS PETITS POSSIBLES ("XREMP..."). < < < ARGUMENT : < (A)=NUMERO D'APPEL ("XREMP..."). < < SPSTAC: EQU $ CPI BIT>DREMP-BIT < VALIDATION : JLE SPSTA2 < OK... QUIT XXQUIT < E R R E U R P R O G R A M M E ... SPSTA2: EQU $ < < PROGRESSION DU POINTEUR DE PILE : < IC KSSTAC < LE PSEUDO-POINTEUR PROGRESSE : JNE SPSTA1 < OK... QUIT XXQUIT < LORSQU'IL REPASSE PAR 0, IL Y A DEBOR- < DEMENT DE LA PILE VIRTUELLE... SPSTA1: EQU $ < < ACCES A L'ENTREE-MOT < COURANTE : < PSR A,B,X,Y LR A,Y < (Y)=NUMERO D'APPEL... LA KSSTAC < (A)=PSEUDO-POINTEUR COURANT : LBI K < CLEAR 'B' (OUFFF... BUG PAS FACILE !!!). SLRD NBITMO/DREMP=K < QUE L'ON DECONCATENE : < (A)=ADRESSE RELATIVE EN 'CDAI', < (B)=NUMERO DE ZONE. AD ASSTAC < (A)=ADRESSE ABSOLUE EN 'CDAI', PSR A < QUE L'ON MEMORISE... STZ MSSTAC < A PRIORI (AU CAS OU (B)=0)... CPZR B < EST-CE LA PREMIERE ZONE D'UN MOT QUE < L'ON VA ECRIRE ??? JE SPSTA3 < OUI, PAS DE 'RCDA', AINSI : CELA VA UN < PEU PLUS VITE, MAIS SURTOUT, ON EVITE DES < PARITES MEMOIRE AU CAS OU LA 'CDAI' < AURAIT ETE MISE HORS-TENSION... PSR B < SAUVEGARDE DU NUMERO DE ZONE. LB AMSSTA < (B)=ADRESSE DU MOT COURANT EN RESIDENT, LXI W < (X)=NOMBRE DE MOTS A DEPLACER, RCDA < ACCES A L'ENTREE COURANTE... < < MISE EN PLACE DU < NUMERO D'APPEL : < PLR B < (B)=NUMERO DE ZONE : SPSTA3: EQU $ LAI K SLLD NBITMO=K < QUE L'ON CONVERTIT EN UN DECALAGE : LR A,X LA MSSTAC < (A)=MOT COURANT DE LA PILE : SCLS DREMP,X < CADRAGE DE LA ZONE COURANTE, ANDI BIT>DREMP-BIT)MFFFF < ET NETTOYAGE, ORR Y,A < PUIS INSERTION DU NUMERO D'APPEL... SCRS DREMP,X < ET RECALAGE... STA MSSTAC < < MISE A JOUR DE LA PILE : < PLR A < (A)=ADRESSE ABSOLUE EN 'CDAI', LB AMSSTA < (B)=ADRESSE EN RESIDENT, LXI W < (X)=NOMBRE DE MOTS A DEPLACER, WCDA < MISE A JOUR DE LA PILE... < < ET RETOUR : < PLR A,B,X,Y RSR PAGE < < < G E N E R A T E U R R E D O N N A N T T O U J O U R S < L E M E M E V E C T E U R A L E A T O I R E E N < U N P O I N T D O N N E : < < < ARGUMENT : < (A)=INDICATIF CARACTERISTIQUE DE L'AXE CHOISIT, < (SPOINT)=NUMERO DU POINT GENERE. < < < RESULTAT : < (A,B)=RDN(SPOINT,GRAINE). < < SPRDN: EQU $ < < GENERATION ALEATOIRE : < EOR SPOIN1 < ON COMBINE LA NUMERO DU POINT COURANT < A L'INDICATIF DE L'AXE... FLT EORR B,A MP SPOIN2 EORR B,A MP GRAINE < D'OU F(GRAINE,X,Y,Z), TELLE QUE : < F(X,Y)#F(Y,X) AFIN D'EVITER UNE SYMETRIE < PAR RAPPORT A UNE DIAGONALE... EORR B,A MP AMAGIK < DONT ON FAIT UN "SHUFFLING"... EORR B,A < ON CUMULE LES 2 MOTS, < < MISE A L'ECHELLE : < < < NOTA : < ON DOIT POUR METTRE LA < VALEUR 'RDN' A L'ECHELLE < CALCULER L'EXPRESSION : < < (SUP/(-32768))*(-RDN/2+16384+(RDN/2-16384)*(INF/SUP)), < < QUI SE SIMPLIFIE EN : < < (SUP/65536)*(RDN*(1-(INF/SUP))+32768*(1+(INF/SUP))). < FLT < ON FLOTTE 'RDN', FMP UNMIS < RDN*(1-(INF/SUP)), FAD UNPIS < RDN*(1-(INF/SUP))+32768*(1+(INF/SUP)), FMP SUP64 < (SUP/65536)*(...). < < ET SORTIE : < 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 REPRESENTER < UNE SPHERE PROJETEE. < < < ARGUMENTS : < (X,Y)=CENTRE DU DISQUE. < < CERCLE: EQU $ CPZ IVISD < FAUT-IL TRACER LES DISQUES ??? JE CERCL4 < NON... < < INITIALISATIONS : < PSR X,Y LR X,B < (B)='X' DU CENTRE, PSR Y < SAUVEGARDE DE 'Y' DU CENTRE. LA RAYON 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'. LA SAVEZ ADRI Z,A < POUR EVITER LE NOIR... SLLS DECZDK < AMPLIFICATION... ADRI -Z,A < ET DESATURATION... STA SAVEZP < SAUVEGARDE DE LA COORDONNEE 'Z'. PLR Y < ON A : < (B,Y)=COORDONNEES DU CENTRE. < < BALAYAGE VERTICAL : < LX RAYON ADR X,X ADRI Z,X < (X)=NOMBRE DE LIGNES A BALAYER. 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 RAYON ADR X,X ADRI Z,X < (X)=NOMBRE DE LIGNES A BALAYER. 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 RAYON < EST-ON HORS DU DISQUE ?? JGE CERCL3 < OUI, ON IGNORE CE POINT... SB RAYON < NON : NGR A,A < (A)=DISTANCE DU POINT COURANT AU BORD < DU DISQUE. CPZ INEW1 < CHOIX DES NIVEAUX : JE CERCL5 < 2 PLANS 'Z' PARALLELES PEUVENT UTILISER < DES NIVEAUX COMMUNS... IF NEXIST-K,,XEIF%, IF ATTENTION : LE TEST CI-DESSUS EST IDIOT !!! XEIF%: VAL ENDIF ADRI Z,A < DANS CETTE METHODE, LES NIVEAUX SONT < PROPRES A UN PLAN 'Z'... CE QUI PERMET < DE LES DISTINGUER... LR A,B < (B)=DISTANCE AU BORD DU DISQUE TELLE < QU'ELLE NE SOIT PAS NULLE. LA SAVEZ < Z, SLLS DECZDK < CADRAGE, ORR B,A < (A)=NIVEAU FONCTION DE LA DISTANCE AU < BORD ET DU 'Z'... JMP CERCL6 < VERS LE TRACE... CERCL5: EQU $ MP SAVEZP < DANS CETTE METHODE, 2 PLANS 'Z' PEUVENT < UTILISER LES MEMES NIVEAUX (EN FAIT SE < RECOUVRIR...). DV RAYON < (A)=NIVEAU(DISTANCE AU CENTRE,Z). CERCL6: EQU $ PSR X,Y LX VECTX1 LY VECTY1 BSR APOINT < MARQUAGE DE (X,Y) AVEC LE NIVEAU (A). PLR X,Y CERCL3: EQU $ PLR B < RESTAURE L'ABSCISSE DU CENTRE, 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 IC VECTY1 < DE LA NOUVELLE LIGNE, JDX CERCL1 < SI ELLE EXISTE... < < ET RETOUR : < PLR X,Y CERCL4: EQU $ RSR PAGE < < < T R A C E D ' U N P E T I T C U B E : < < < FONCTION : < CE MODULE EST DESTINE < A MATERIALISER LES SITES < OCCUPES A L'AIDE DE PETITS < CUBES. < < < ARGUMENTS : < (X,Y)=COORDONNEES PROJETEES DU CENTRE DU CUBE. < < CUBE: EQU $ CPZ IVISK < FAUT-IL TRACER LES CUBES ??? JE CUBE1 < NON... < < OUI, INITILISATIONS : < PSR X,Y < SAUVEGARDES. LA PROXS2 ADR A,X < ABSCISSE DU CENTRE DE LA FACE AVANT, LA PROYS2 SBR A,Y < ORDONNEE DU CENTRE DE LA FACE AVANT. < < CALCUL DE LA COULEUR DU TRACE : < LA SAVEZ < Z, SLLS DECZDK < CADRAGE DE 'Z', ORI MMOT>DECZDK)MMOT < (A)=NIVEAU DE TRACE DE LA PREMIERE < CONNEXION. STA VECTNI < CE QUI DONNE LE NIVEAU DU TRACE... < < TRACE DE LA FACE AVANT : < DC VECTNI < CHOIX DE LA COULEUR... LR X,A SB COTES2 SLLS XXDEDX STA VECGX1 < ABSCISSE DU SOMMET HAUT-GAUCHE, STA VECGX2 < ET ABSCISSE DU SOMMET BAS-GAUCHE. LR Y,A AD COTES2 PSR A SLLS XXDEDY STA VECGY1 < ORDONNEE DU SOMMET HAUT-GAUCHE, PLR A SB COTE SLLS XXDEDY STA VECGY2 < ET ORDONNEE DU SOMMET BAS-GAUCHE. LX COTE < (X)=NOMBRE DE VECTEURS A TRACER. ADRI I,X CUBE2: EQU $ BSR AVE512 < TRACE PAR BALAYAGE VERTICAL. DO BIT>XXDEDX IC VECGX1 < PROGRESSION DE L'ABSCISSE HAUTE. DO BIT>XXDEDX IC VECGX2 < PROGRESSION DE L'ABSCISSE BASSE. JDX CUBE2 < ET BALAYAGE... DO BIT>XXDEDX DC VECGX1 < RE-POSITIONNEMENT ABSCISSE HAUTE. IC VECTNI < ET RESTAURATION DU NIVEAU... < < TRACE DE LA FACE DU DESSUS : < LA VECGX1 SB PROJXG STA VECGX2 < POSITIONNEMENT ABSCISSE ARRIERE. LA VECGY1 AD PROJYG STA VECGY2 < POSITIONNEMENT ORDONNEE ARRIERE. LX COTE < (X)=NOMBRE DE VECTEURS A TRACER. ADRI I,X CUBE3: EQU $ BSR AVE512 < TRACE PAR BALAYAGE OBLIQUE. DO BIT>XXDEDX DC VECGX1 < REGRESSION DE L'ABSCISSE HAUTE. DO BIT>XXDEDX DC VECGX2 < REGRESSION DE L'ABSCISSE ARRIERE. JDX CUBE3 < ET BALAYAGE... DO BIT>XXDEDX IC VECGX1 < RE-POSITIONNEMENT DE L'ABSCISSE HAUTE. DO BIT>XXDEDX IC VECGX2 < RE-POSITIONNEMENT DE L'ABSCISSE ARRIERE. < < TRACE DE LA FACE DE COTE : < DC VECTNI < CHOIX DU DC VECTNI < NIVEAU. LX COTE < (X)=NOMBRE DE VECTEURS A TRACER. ADRI I,X CUBE4: EQU $ BSR AVE512 < TRACE PAR BALAYAGE OBLIQUE... DO BIT>XXDEDY DC VECGY1 < REGRESSION DE L'ORDONNEE HAUTE. DO BIT>XXDEDY DC VECGY2 < REGRESSION DE L'ORDONNEE ARRIERE. JDX CUBE4 < ET BALAYAGE... DO BIT>XXDEDY IC VECGY1 < RE-POSITIONNEMENT ORDONNEE HAUTE. DO BIT>XXDEDY IC VECGY2 < RE-POSITIONNEMENT ORDONNEE ARRIERE. < < MARQUAGE DES ARETES : < DC VECTNI < CHOIX DU NIVEAU. BSR AVE512 < COTE HORIZONTAL BAS GAUCHE. LA VECGX2 STA VECGX1 LA VECGY2 AD COTEG STA VECGY1 BSR AVE512 < COTE VERTICAL ARRIERE GAUCHE. LA VECGY1 STA VECGY2 LA VECGX1 AD COTEG STA VECGX2 BSR AVE512 < COTE HORIZONTAL ARRIERE HAUT. LA VECGX2 AD PROJXG STA VECGX1 LA VECGY2 SB PROJYG STA VECGY1 BSR AVE512 < COTE HORIZONTAL HAUT DROIT. LA VECGX1 STA VECGX2 LA VECGY1 SB COTEG STA VECGY2 BSR AVE512 < COTE VERTICAL AVANT DROIT. LA VECGX2 SB COTEG STA VECGX1 LA VECGY2 STA VECGY1 BSR AVE512 < COTE HORIZONTAL AVANT BAS. LA VECGX1 STA VECGX2 LA VECGY1 AD COTEG STA VECGY2 BSR AVE512 < COTE VERTICAL AVANT GAUCHE. LA VECGX2 AD COTEG STA VECGX1 LA VECGY2 STA VECGY1 BSR AVE512 < COTE HORIZONTAL AVANT HAUT. LA VECGX2 SB PROJXG STA VECGX1 LA VECGY2 AD PROJYG STA VECGY1 BSR AVE512 < COTE HORIZONTAL HAUT GAUCHE. < < ET RETOUR : < PLR X,Y CUBE1: EQU $ RSR PAGE < < < T R A C E D E S C O N N E X I O N S : < < < FONCTION : < SUIVANT LE TRIEDRE UNITAIRE < (+I,-I,-I), ON REGARDE LES < VOISINS DU SITE COURANT, ET < SI LES CONNEXIONS EXISTENT, ON < LES VISUALISE... < < < AGUMENTS : < (X,Y)=COORDONNEES PROJETEES DU SITE COURANT. < < CONEX: EQU $ CPZ IVISC < FAUT-IL VISUALISER LES CONNEXIONS ??? JE CONEX9 < NON... PSR A,X,Y,W < SAUVEGARDES... < < CALCUL DE LA COULEUR DU TRACE : < LA SAVEZ < Z, CPZ INEW1 < CHOIX DE L'ATTRIBUTION DES NIVEAUX : JE CONEX4 < LES MEMES POUR LES 3 CONNEXIONS, ET PLUS < SOMBRE QUE LES DISQUES. SLLS DECZDK < CADRAGE DE 'Z', ORI MMOT>DECZDK)MMOT < (A)=NIVEAU DE TRACE DE LA PREMIERE < CONNEXION. JMP CONEX5 < VERS SA MEMORISATION... CONEX4: EQU $ ADRI Z,A < LES 3 CONNEXIONS ONT LE MEME NIVEAU, ET < MALHEUREUSEMENT CELUI-CI EST AUSSI UTI- < LISE POUR LES ISQUES... < (POUR EVITER LES NOIRS +Z...) SLLS DECZCO < AMPLIFICATION... ADRI -Z,A < ET DESATURATION... CONEX5: EQU $ STA VECTNI < CE QUI DONNE LE NIVEAU DU TRACE... < < MISE EN PLACE DE L'ORIGINE < DES 1,2 OU 3 VECTEURS A TRACER : < LR X,A SLLS XXDEDX STA VECGX1 < ABSCISSE GRAPHIQUE, LR Y,A SLLS XXDEDY STA VECGY1 < ET ORDONNEE (PASSAGE 'TV' --> GRAPHIQUE). < < MISE EN PLACE DU SITE COURANT : < LX SAVEX < X, LY SAVEY < Y, LA SAVEZ LR A,W < Z. < < TEST DE LA PREMIERE CONNEXION : < ADRI +I,W < Z+1, BSR AVALID < LE SITE EXISTE-T'IL ??? JNE CONEX1 < NON, ON L'IGNORE... BSR ATBT1 < OUI, EST-IL OCCUPE ??? JNC CONEX1 < NON, ON L'IGNORE... LA VECGX1 < OUI, AD PROJX STA VECGX2 < MISE EN PLACE LA VECGY1 SB PROJY STA VECGY2 < DE SA PROJECTION, BSR AVE512 < ET TRACE DE LA CONNEXION COURANTE < ((X,Y,Z),(X,Y,Z+1)). CONEX1: EQU $ CPZ INEW1 < CHOIX DES NIVEAUX : JE CONEX6 < LE MEME POUR LES 3 CONNEXIONS... DC VECTNI < UN PAR CONNEXION. CONEX6: EQU $ ADRI -I,W < ET RESTAURE 'Z'... < < TEST DE LA DEUXIEME CONNEXION : < ADRI +I,Y < Y+1, BSR AVALID < LE SITE EXISTE-T'IL ??? JNE CONEX2 < NON, ON L'IGNORE... BSR ATBT1 < OUI, EST-IL OCCUPE ??? JNC CONEX2 < NON, ON L'IGNORE... LA VECGX1 < OUI, STA VECGX2 < MISE EN PLACE LA VECGY1 XWOR%1: VAL +I>DECY>XXDEDY ADRI XWOR%1,A STA VECGY2 < DE SA PROJECTION, BSR AVE512 < ET TRACE DE LA CONNEXION COURANTE < ((X,Y,Z),(X,Y+1,Z)). CONEX2: EQU $ CPZ INEW1 < CHOIX DES NIVEAUX : JE CONEX7 < LE MEME POUR LES 3 CONNEXIONS... DC VECTNI < UN PAR CONNEXION. CONEX7: EQU $ ADRI -I,Y < ET RESTAURE 'Y'... < < TEST DE LA TROISIEME CONNEXION : < ADRI -I,X < X-1, BSR AVALID < LE SITE EXISTE-T'IL ??? JNE CONEX3 < NON, ON L'IGNORE... BSR ATBT1 < OUI, EST-IL OCCUPE ??? JNC CONEX3 < NON, ON L'IGNORE... LA VECGX1 < OUI, XWOR%1: VAL +I>DECX>XXDEDX XWOR%1: VAL -XWOR%1 ADRI XWOR%1,A STA VECGX2 < MISE EN PLACE LA VECGY1 STA VECGY2 < DE SA PROJECTION, BSR AVE512 < ET TRACE DE LA CONNEXION COURANTE < ((X,Y,Z),(X-1,Y,Z)). CONEX3: EQU $ ADRI +I,X < ET RESTAURE 'X'... < < ET RETOUR : < PLR A,X,Y,W CONEX9: EQU $ RSR PAGE < < < P O I N T D ' E N T R E E : < < DEBUT: EQU $ < < INITIALISATION DES REGISTRES : < LRM C,L,K WORD COM+DEPBAS < POSITIONNEMENT DE 'C', WORD LOC+DEPBAS < DE 'L', 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 : < < DEBUT4: EQU $ DEBUT9: EQU $ < < 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'...). < < < I N I T I A L I S A T I O N S : < < INIT01: EQU $ < < RE-INITIALISATION EVENTUELLE < DE CERTAINS RELAIS : < LRM A,B WORD MAT1 WORD MAT1-IJIJDX,X STA AMAT1 STB AMAT1X LRM A,B WORD MAT2 WORD MAT2-IJIJDX,X STA AMAT2 STB AMAT2X < < INITIALISATION A PRIORI < DU TRACE DES CONNEXIONS : < LRM A,B,X,Y WORD CORBT?BANTI=FMASK(K=FCINST WORD MMOT WORD K WORD COSBT?VELODD=FMASK(K?VECTSB=FCINST STA VECANT < PAS D'ANTI-ALIASING, STB VEPOIN < PAS DE POINTILLE, STX VEDECA < PAS DE DECALAGE DES NIVEAUX, STY VECTRS < MODE 'SBT' EN LOGIQUE BINAIRE. < < GENERATEUR ALEATOIRE : < LA SUPRDN FLT #/FST# FSUP < BORNE SUPERIEURE ('SUP'), LA INFRDN FLT #/FST# FINF < BORNE INFERIEURE ('INF'), FDV FSUP < INF/SUP, PSR A,B < ET SAVE... FSB F1 < (INF/SUP)-1, FNEG < 1-(INF/SUP), #/FST# UNMIS < UNMIS=1-(INF/SUP). PLR A,B < INF/SUP, FAD F1 < 1+(INF/SUP), FMP INF32 < 32768*(1+(INF/SUP)), #/FST# UNPIS < UNPIS=32768*(1+(INF/SUP)). #/FLD# FSUP < SUP, FDV INF64 < SUP/65536, #/FST# SUP64 < SUP64=SUP/65536. < < DONNEES DE PROJECTION : < #/FLD# COST < COS(TETA), FMP COST < COS(TETA)**2, FSB F1 FNEG < 1-COS(TETA)**2, BSR ARAC #/FST# SINT < SIN(TETA). < < INITIALISATIONS DE L'IMAGEUR : < GEN69: EQU $ 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'. GEN69N: EQU $ < < < P R O J E C T I O N D U V E C T E U R < U N I T A I R E D E L ' A X E ' Z ' : < < LAI +I < 'Z'. SLLS DECZ LR A,W < AMPLIFICATION DE 'Z'. FLT PSR A,B < PRISE EN COMPTE DE 'Z' : FMP COST BSR AROND SLLS XXDEDX < PASSAGE AUX COORDONNEES GRAPHIQUES, STA PROJX < ET MEMORISATION... PLR A,B < PRISE EN COMPTE DE 'Z' : FMP SINT BSR AROND SLLS XXDEDY < PASSAGE AUX COORDONNEES GRAPHIQUES, STA PROJY < ET MEMORISATION... < < PREPARATION DU TRACE < EVENTUEL DES PETITS CUBES : < LA COTE SLLS XXDEDX?XXDEDY STA COTEG < COTE EN UNITE GRAPHIQUE... LA COTE < (A)=COTE DES PETITS CUBES. SLRS XXXMOY=K STA COTES2 < ET MEMORISATION DU DEMI-COTE... LA COTE < COTE DU CARRE, SLRS DECX?DECY-DECZ < POUR SIMULER LA PERSPECTIVE... FLT PSR A,B < PRISE EN COMPTE DU COTE : FMP COST BSR AROND SLLS XXDEDX < PASSAGE AUX COORDONNEES GRAPHIQUES, STA PROJXG < ET MEMORISATION... SLRS XXXMOY=K+XXDEDX STA PROXS2 < ET MEMORISATION... PLR A,B < PRISE EN COMPTE DU COTE : FMP SINT BSR AROND SLLS XXDEDY < PASSAGE AUX COORDONNEES GRAPHIQUES, STA PROJYG < ET MEMORISATION... SLRS XXXMOY=K+XXDEDY STA PROYS2 < ET MEMORISATION... < < < G E N E R A T I O N D E L A M A T R I C E D E S S I T E S : < < GEN200: EQU $ < < NETTOYAGE DE LA MATRICE : < LRM W WORD K < (W)=COORDONNEE 'Z'. GEN401: EQU $ LRM Y WORD K < (Y)=COORDONNEE 'Y'. GEN402: EQU $ LRM X WORD K < (X)=COORDONNEE 'X'. GEN403: EQU $ BSR ARBT1 < NETTOYAGE DU SITE COURANT... ADRI I,X LR X,A CPI LONGX JL GEN403 < PARCOURS DE L'AXE DES 'X'. ADRI I,Y LR Y,A CPI LONGY JL GEN402 < PARCOURS DE L'AXE DES 'Y'. ADRI I,W LR W,A CPI LONGZ JL GEN401 < PARCOURS DE L'AXE DES 'Z'. < < GENERATION DES ARBRES : < LX NPOIN1 < (X)=NOMBRE DE POINTS A MARQUER. GEN001: EQU $ STX SPOIN1 < ET SAVE LE NUMERO DU POINT COURANT < POUR 'RDN'... PSR X < SAUVEGARDE DU DECOMPTE... LX NPOIN2 < (X)=NOMBRE DE POINTS A GENERER... GEN007: EQU $ STX SPOIN2 < ET SAVE POUR 'RDN'... PSR X < SAUVEGARDE DU DECOMPTE... LRM A WORD RDNX < (A)=GRAINE SUR 'OX', BSR ARDN < (A,B)=RDN(INDICATIF), FMP ERDNX < NORMALISATION SUR 'OX', BSR AROND LR A,X < (X)=COORDONNEE 'X' ALEATOIRE... LRM A WORD RDNY < (A)=GRAINE SUR 'OY', BSR ARDN < (A,B)=RDN(INDICATIF), FMP ERDNY < NORMALISATION SUR 'OY', BSR AROND LR A,Y < (Y)=COORDONNEE 'Y' ALEATOIRE... LRM A WORD RDNZ < (A)=GRAINE SUR 'OZ', BSR ARDN < (A,B)=RDN(INDICATIF), FMP ERDNZ < NORMALISATION SUR 'OZ', BSR AROND LR A,W < (W)=COORDONNEE 'Z' ALEATOIRE... CPZR Y < EST-ON SUR LE PLAN HORIZONTAL ??? JNE GEN004 < NON, ON VA COMPTER LES VOISINS... LRM A WORD RDNXZ < (A)=GRAINE SUR 'XOZ', BSR ARDN < (A,B)=RDN(INDICATIF), FCAM RDNSEU < PREND-ON CE POINT ??? JLE GEN002 < OUI... JMP GEN003 < NON... GEN004: EQU $ PSR Y < SAUVEGARDE DE LA COORDONNEE 'Y'... GEN061: EQU $ ADRI I,Y < PASSAGE AU POINT SUPERIEUR : BSR AVALID < EXISTE-T'IL ??? JNE GEN062 < NON, ON A DONC PARCOURU LIBREMENT LA < COLONNE VERTICALE SITUEE AU-DESSUS DU < POINT ALEATOIRE (X,Y,Z) COURANT ; CE < POINT EST MARQUABLE, ALLONS VOIR SON < VOISINNAGE... BSR ATBT1 < OUI, IL EXISTE : EST-IL OCCUPE ??? JNC GEN061 < NON, ALLONS VOIR LE POINT DU DESSUS... PLR Y < OUI, RESTAURONS LA COORDONNEE 'Y', ET < LE POINT ALEATOIRE COURANT (X,Y,Z) NE < PEUT-ETRE MARQUE, PUISQU'UN POINT SITUE < AU-DESSUS DE LUI EST OCCUPE... JMP GEN003 < ON NE MARQUE PAS... GEN062: EQU $ PLR Y < LE POINT COURANT (X,Y,Z) EST MARQUABLE, < EXAMINONS SON VOISINNAGE... LAI K < (A)=NUMERO DU VOISIN COURANT, LBI K < (B)=COMPTEUR DES VOISINS. GEN100: EQU $ XR A,X < (X)=INDEX DES LISTES D'INCREMENT. AD &AINCX < MODIFICATION DE LA COORDONNEE 'X', XR A,Y AD &AINCY < MODIFICATION DE LA COORDONNEE 'Y', XR A,W AD &AINCZ < MODIFICATION DE LA COORDONNEE 'Z', XR A,W XR A,Y PSR B < SAVE LE COMPTE DES VOISINS... LB LVALXY < (B)=LISTE DE VALIDATION DES VOISINS... TBT NBITMO,X < LE VOISIN COURANT EST-IL A TESTER ??? PLR B < RESTAURE LE COMPTE DES VOISINS... XR A,X < RESTAURE : < (A)=NUMERO DE VOISIN COURANT, < (X,Y)=COORDONNEE DE CELUI-CI... JNC GEN101 < NON, ON PASSE AU SUIVANT... BSR AVALID < LE POINT (X,Y,Z) EXISTE-T'IL ??? JNE GEN101 < NON, ON L'IGNORE... BSR ATBT1 < OUI, EST-IL OCCUPE ??? JNC GEN101 < NON, ON L'IGNORE... ADRI I,B < OUI, ON LE COMPTE... GEN101: EQU $ ADRI I,A < PASSAGE AU VOISIN SUIVANT... CPI NREMP+I < EST-CE FINI ??? < (ON FAIT +1, AFIN DE REVENIR SUR LE < POINT CENTRAL...) JL GEN100 < NON, PASSAGE AU VOISIN SUIVANT (OU CPZR B < Y-A-T'IL DES VOISINS ??? JE GEN003 < NON, ON NE TOUCHE PAS A CE POINT... GEN002: EQU $ BSR ASBT1 < OUI, ON LE MARQUE... GEN003: EQU $ PLR X < RESTAURATION DU DECOMPTE... JDX GEN007 < AU POINT SUIVANT... PLR X < RESTAURATION DU DECOMPTE... JDX GEN001 < AU POINT SUIVANT... < < < G E N E R A T I O N D U S O U S - E N S E M B L E < C O N N E X E : < < IF NEXIST-K,,XEIF%, IF ATTENTION : LE TEST SUIVANT EST IDIOT !!! XEIF%: VAL ENDIF CPZ ICONEX < FAUT-IL LE GENERER ??? JE GEN301 < NON... < < OUI, NETTOYAGE DE 'MAT2' : < LRM X WORD LONMAT/NBITMO GEN111: EQU $ STZ &AMAT2X < CLEAR DE TOUS LES SITES... JDX GEN111 < < GENERATION DU SOUS-ENSEMBLE < DES SITES CONNECTES : < LRM X,Y,W < (X,Y,Z)=(0,0,0). WORD K;K;K BSR AREMP < EXTRACTION DU SOUS-ENSEMBLE COONECTE < AU POINT-SOURCE (0,0,0). LA AMAT1 < AFIN LB AMAT1X < DE LX AMAT2 < VISUALISER LY AMAT2X < LE STY AMAT1X < SOUS- STX AMAT1 < ENSEMBLE STB AMAT2X < CONNEXE STA AMAT2 < DES SITES... GEN301: EQU $ < < < V I S U A L I S A T I O N P L A N P A R P L A N : < < IF NEXIST-K,,XEIF%, IF ATTENTION : LE TEST SUIVANT EST IDIOT !!! XEIF%: VAL ENDIF CPZ IVISP < FAUT-IL VISUALISER PLAN PAR PLAN ??? JE GEN201 < NON... LRM W WORD K < (W)=COORDONNEE 'Z'. GEN021: EQU $ LRM Y WORD K < (Y)=COORDONNEE 'Y'. GEN022: EQU $ LRM X WORD K < (X)=COORDONNEE 'X'. GEN023: EQU $ BSR ATBT1 < TEST DE L'ELEMENT COURANT (X,Y,W) : JNC GEN031 < 0 : ON NE LE MARQUE PAS... PSR X,Y < 1 : ON VA LE MARQUER... LR W,A < (A)=COORDONNEE 'Z' : TRN XWOR%1: VAL LOGZ/XXXMOY NTRN SLRD XWOR%1 < DECONCATENATION DE 'Z', SLLS LOGY ORR A,Y < DECALAGE DES 'Y' EN FONCTION DES < POIDS FORTS DE 'Z'. LAI K < CLEAR 'A', SLLD XWOR%1 < RECUPERATION DES POIDS FAIBLES, SLLS LOGX ORR A,X < DECALAGE DES 'X' EN FONCTION DES < POIDS FAIBLES DE 'Z'. LR W,A ADRI Z,A < (A)=NIVEAU DE TRACE. SLLS XXN255+Z/LONGZ=K ADRI -Z,A < CADRAGE DU NIVEAU DE TRACE... BSR APOINT < ET MARQUAGE... PLR X,Y < RESTAURATIONS DES COORDONNEES (X,Y). GEN031: EQU $ ADRI I,X LR X,A CPI LONGX JL GEN023 < PARCOURS DE L'AXE DES 'X'. ADRI I,Y LR Y,A CPI LONGY JL GEN022 < PARCOURS DE L'AXE DES 'Y'. ADRI I,W LR W,A CPI LONGZ JL GEN021 < PARCOURS DE L'AXE DES 'Z'. GEN201: EQU $ < < < V I S U A L I S A T I O N D U " C U B E " : < < LRM W WORD K < (W)=COORDONNEE 'Z'. GEN041: EQU $ LRM Y WORD K < (Y)=COORDONNEE 'Y'. GEN042: EQU $ LRM X WORD LONGX-I < (X)=COORDONNEE 'X'. GEN043: EQU $ < < TRANSFORMATION DES COORDONNEES : < PSR X,Y,W < SAUVEGARDE DU (X,Y,Z) REEL... BSR APRMAT < (X,Y,Z) <-- (MAT(I,J))*(X,Y,Z)+(TRMAT). < < TEST DE L'ELEMENT TRANSFORME (X,Y,Z) : < BSR AVALID < LE TRIPLET (X,Y,Z) TRANSFORME < EXISTE-T'IL ??? JNE GEN051 < NON, ON L'IGNORE... BSR ATBT1 < TEST DE L'ELEMENT COURANT (X,Y,W) : JNC GEN051 < 0 : ON NE LE MARQUE PAS... < < 1 : MARQUAGE DU POINT : < PLR X,Y,W < RESTAURATION DES COORDONNEES (X,Y,Z) < AFIN QUE LE TRACE SOIT BON... STX SAVEX STY SAVEY LR W,A STA SAVEZ < SAUVEGARDE DES 3 COORDONNEES. < < PROJECTION : < PSR X,Y,W < ET SAUVEGARDES... LR X,A SLLS DECX LR A,X < AMPLIFICATION DE 'X'. LR Y,A SLLS DECY LR A,Y < AMPLIFICATION DE 'Y'. LR W,A SLLS DECZ LR A,W < AMPLIFICATION DE 'Z'. FLT PSR A,B < PRISE EN COMPTE DE 'Z' : FMP COST BSR AROND AD TRANSX < ET TRANSLATION, ADR A,X < X(PROJETE)=X+Z*COS(TETA)+TRANSX. PLR A,B < PRISE EN COMPTE DE 'Z' : FMP SINT BSR AROND SB TRANSY < ET TRANSLATION, SBR A,Y < Y(PROJETE)=Y-Z*SIN(TETA)+TRANSY. < < MARQUAGE DU SITE : < BSR ACONEX < VISUALISATION DES CONNEXIONS, BSR ACERCL < ET MARQUAGE DU SITE COURANT PAR SPHERES, BSR ACUBE < OU PAR PETITS CUBES... PLR X,Y,W < RESTAURATION DES COORDONNEES... JMP GEN052 < VERS LA PROGRESSION... GEN051: EQU $ PLR X,Y,W < RESTAURATION DES COORDONNEES (X,Y,Z). GEN052: EQU $ ADRI -I,X LR X,A CPI K JGE GEN043 < PARCOURS DE L'AXE DES 'X'. < (AFIN DE FAVORISER LA GESTION 3D) ADRI I,Y LR Y,A CPI LONGY JL GEN042 < PARCOURS DE L'AXE DES 'Y'. ADRI I,W LR W,A CPI LONGZ JL GEN041 < FIN... < < < T R A I T E M E N T D E F I N : < < CPZ IQUIT < FAUT-IL S'ARRETER ??? JE GEN410 < NON... IF EXIST-K,XEIF%,,XEIF% IF ATTENTION : LE TEST CI-DESSUS EST IDIOT !!! XEIF%: VAL ENDIF QUIT XXQUIT < OUI... GEN410: EQU $ BR ADEB9 < A L'IMAGE SUIVANTE... < < < 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,L,K < ON REINITIALISE 'C', 'L' ET 'K' AU CAS < D'UNE RE-ENTREE PAR UN 'ALT-MODE'... WORD COM+DEPBAS < 'C', WORD LOC+DEPBAS < 'L', WORD STACK-DEPILE < 'K'. BSR AGOTO WORD DEBUT4 < (A)=ADRESSE D'ITERATION SUR ALT-MODE... PAGE < < < U P D A T E S : < < $EQU GRAINE WORD 4660 < GRAINE DU GENERATEUR ALEATOIRE. $EQU NPOIN1 WORD 3 < NOMBRE DE POINTS $EQU NPOIN2 WORD 20000 < A GENERER. $EQU SUPRDN WORD W < SUP(RDN). $EQU INFRDN NTRN WORD K < INF(RDN). TRN $EQU RDNSEU FLOAT 0.05 < SUIL D'IMPLANTATION DANS LE PLAN 'XOZ'. $EQU COST FLOAT 0.8 < COS(TETA). $EQU TRANSX WORD 16 < TRANSLATION DE X(PROJETE). $EQU TRANSY WORD 160 < TRANSLATION DE Y(PROJETE). $EQU RAYON WORD 8 < RAYON D'UN DISQUE DE MARQUAGE. $EQU COTE WORD 16 < COTE DES PETITS CUBES. $EQU MAT11 FLOAT 1.0 < A11, $EQU MAT12 FLOAT 0.0 < A12, $EQU MAT13 FLOAT 0.0 < A13. $EQU MAT21 FLOAT 0.0 < A11, $EQU MAT22 FLOAT 1.0 < A22, $EQU MAT23 FLOAT 0.0 < A23. $EQU MAT31 FLOAT 0.0 < A31, $EQU MAT32 FLOAT 0.0 < A32, $EQU MAT33 FLOAT 1.0 < A33. $EQU TRMATX WORD 0 < TRANSLATION SUR 'OX' TRANSFORME. $EQU TRMATY WORD 0 < TRANSLATION SUR 'OY' TRANSFORME. $EQU TRMATZ WORD 0 < TRANSLATION SUR 'OZ' TRANSFORME. 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