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# < < CONSTANTES DES IMAGES (256,256) : < ORDI:: VAL "@" < TYPE DE L'ORDINATEUR... CALL #SIP IMAGE 256# NMOTL:: VAL CNMPL < NOMBRE DE MOTS PAR LIGNE D'IMAGE (256). NPOL:: VAL NMOTL*NBITMO < NOMBRE DE POINTS PAR LIGNE, NLIG:: VAL LIMAG/NMOTL < NOMBRE DE LIGNES PAR IMAGE (256,256). NPOLM1:: VAL NPOL-Z < ABSCISSE MAXIMALE. NLIGM1:: VAL NLIG-Z < ORDONNEE MAXIMALE. TV1:: MOT O < PREMIERE IMAGE (256,256), TV2:: MOT '5000 < DEUXIEME IMAGE (256,256). NCOOL:: VAL XNCOOL < NOMBRE DE COULEURS PRIMAIRES, NIVMX7:: VAL BIT>NCOOL-N < NIVEAU MAXIMAL EN (256,256)... < < < 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... 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 < < BUFFER BANDE : < LBUFMT: @ 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 'LBUFMT'... XWOR%6: VAL XWOR%5=FCSIGN XWOR%7: VAL XWOR%5(MSYMBN)MSYMBN=FCSIGN IF XWOR%6*XWOR%7,XEIF%,,XEIF% LBUFMT:: VAL 4096 XEIF%: VAL ENDIF BUFMT: EQU $ DZS LBUFMT/NOCMO < < < 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 : < ITEXT: WORD EXIST < GENERER UNE TEXTURE 2D ('EXIST') OU < UNE MONTAGNE 3D VUE D'AVION ('NEXIST'). AMPLIR: FLOAT <NILK<NILK<NILK < AMPLIFICATEUR DU RESULTAT FINAL. MOYENE: FLOAT <NILK<NILK<NILK < VALEUR MOYENEE DU RESULTAT FINAL. MAXREC:: VAL 100 < VALEUR MAXIMALE DE 'NRECUR'... MRECUR: WORD NILK < NOMBRE DE RECURSIONS MAXIMAL LORS DE LA < SOMMATION DES FONCTION ALEATOIRES. NPM: WORD NILK < NOMBRE DE POINTS DES SPIRALES GENEREES < A PARTIR DES IMAGES 'TV1'/'TV2'. EXPOP: FLOAT <NILK<NILK<NILK < EXPOSANT DE CALCUL DES EXPONENTIELLES. ALPHA: FLOAT <NILK<NILK<NILK < FACTEUR DE TENTATIVE D'ELIMINATION DES < PICS "VISUELS" PAR FILTRAGE... PASIX0: WORD NILK < PAS SUR OX, PASIY0: WORD NILK < PAS SUR OY. GRAINE: WORD NILK < GRAINE DE 'RDN'... SUPRDN: WORD NILK < SUP(RDN), INFRDN: WORD NILK < INF(RDN). MAXNIV: WORD NILK < MAXIMUM DES NIVEAUX TRACES, MINNIV: WORD NILK < MINIMUM DES NIVEAUX TRACES. TRONIV: WORD NEXIST < TRONQUER BRUTALEMENT ('EXIST') OU UTILI- < SER UNE FONCTION EN DENTS DE SCIE < ('NEXIST') POUR LES VALEURS DU CHAMP... IERASE: WORD NEXIST < EFFACER ('EXIST'), OU NON ('NEXIST') < L'ECRAN 512... IOMBRE: WORD EXIST < TRACER ('EXIST') OU PAS ('NEXIST') LES < OMBRES PORTEES... NPENOM: WORD NILK < LARGEUR DE LA ZONE DE PENOMBRE (DOIT < ETRE STRICTEMENT POSITIVE) ; SI LA VALEUR < EST 1, IL N'Y EN A PAS... IMODUL: WORD NEXIST < MARQUER UN NOUVEAU CHAMP ('NEXIST') OU < "MODULER" UN CHAMP PRE-EXISTANT, A CON- < DITION QUE CELUI-CI SOIT DEFINI PAR DES < NIVEAUX CONTENUS DANS LE SEGMENT : < (BORINF,BORSUP)=(NI,XXN255/ND+NI). TRDNX: WORD K < TRANSLATION EN 'X' DU CHAMP RDN, TRDNY: WORD K < TRANSLATION EN 'Y' DU CHAMP RDN. IBANDE: WORD NEXIST < CHOIX DU MODE D'"SORTIE" DE LA FONCTION : < 'NEXIST' : ON GENERE UNE IMAGE, < 'EXIST' : ON GENERE UNE BANDE. ABLOC0: WORD K < NUMERO DU PREMIER BLOC A LIRE SUR LA < BANDE MAGNETIQUE. IF XOPT01-EXIST,XOPT1,,XOPT1 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...'). < < POINT COURANT : < 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'. < < 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 < < CALCUL D'UN PRODUIT SCALAIRE : < APRSCA: WORD PRSCA < SOUS-PROGRAMME DE CALCUL D'UN PRODUIT < SCALAIRE DE 2 VECTEURS 3D... < < 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 < < DEFINITION DE LA NORMALE : < CN3D: EQU $ < DEBUT DES COORDONNEES DE LA NORMALE : FXN: FLOAT <NILK<NILK<NILK < X(N), FYN: FLOAT <NILK<NILK<NILK < Y(N), FZN: FLOAT <W+W<K<K < Z(N) : VAUT 2 (1+1) CAR LE VECTEUR < NORMAL EST EN FAIT LA SOMME DE < DEUX VECTEURS NORMAUX VOISINS... < < DEFINITION DE LA SOURCE LUMINEUSE : < CL3D: EQU $ < DEBUT DES COORDONNEES DE LA SOURCE 'L' : FXL: FLOAT <NILK<NILK<NILK < X(L), FYL: FLOAT <NILK<NILK<NILK < Y(L), FZL: FLOAT <NILK<NILK<NILK < Z(L). < < BUFFER DES LIGNES CONSECUTIVES : < ALIGP2: WORD LIGP2,X < RELAI VERS LA LIGNE SUIVANTE-SUIVANTE, ALIGP1: WORD LIGP1,X < RELAI VERS LA LIGNE SUIVANTE, ALIG: WORD LIG,X < RELAI VERS LA LIGNE COURANTE, ALIGM1: WORD LIGM1,X < RELAI VERS LA LIGNE PRECEDENTE. < < POUR CALCULER L'ECLAIRAGE : < FNIVC: FLOAT <NILK<NILK<NILK < NIVEAU MAXIMAL COURANT (VAUT 'FNIVMX' < OU 'FNIVMX' MOINS UNE FRACTION DE < 'FNIVOM' SUIVANT L'OMBRAGE...). FNIVMX: FLOAT <XXN255<K<K NTRN FNIVOM: FLOAT <-XXN255/XXXMOY<K<K TRN FPENOM: FLOAT <NILK<NILK<NILK < BAISSE MAXIMALE DU NIVEAU D'ECLAIRAGE < DANS LA ZONE D'OMBRE : 'FPENOM' DONNE EN < FAIT L'INVERSE DE 'FNIVOM/NPENOM'. < < POUR CALCULER LA FONCTION < EN DENTS DE SCIE : < F255: WORD XXN255 F511: WORD NIV256+NIV256-Z < < VARIABLES MONTAGNEUSES : < GXS: FLOAT <NILK<NILK<NILK < COORDONNEES ABSOLUES GYS: FLOAT <NILK<NILK<NILK < DU POINT COURANT. FCUMR: FLOAT <NILK<NILK<NILK < SIGMA DES FONCTIONS ALEATOIRES < SCALANTES. FPOND: FLOAT <NILK<NILK<NILK < POUR LES PONDERER... FPOND0: FLOAT <NILK<NILK<NILK < VALEUR INITIALE DE LA PONDERATION : < FPOND0=RAC(PASIX*PASIY). RENORM: FLOAT <NILK<NILK<NILK < DONNE LE SIGMA DES 'FPOND' SCALANTS < DIVISE PAR 'FPOND0', ET PERMET DE CAL- < CULER LA FONCTION ALEATOIRE DANS UN < SEGMENT PREDETERMINE, ET QUI EST : < (INFRDN*AMPLI*AMPLIR,SUPRDN*AMPLI*AMPLIR) < < RELAIS MONTAGNEUX : < AFONCT: WORD FONCT < CALCUL DE LA FONCTION COURANTE. < < DEFINITION DE LA GRILLE : < NRECUR: WORD NILK < NOMBRE COURANT DE RECURSIONS... PASIX: WORD NILK < PAS SUR 'OX', PASIY: WORD NILK < PAS SUR 'OY'. FPASIX: FLOAT <NILK<NILK<NILK < DE MEME FPASIY: FLOAT <NILK<NILK<NILK < EN FLOTTANT... XNOEUD: WORD NILK < X(NOEUD HAUT-GAUCHE) DE LA MAILLE, YNOEUD: WORD NILK < Y(NOEUD HAUT-GAUCHE) DE LA MAILLE. AFNIV1: FLOAT <NILK<NILK<NILK AFNIV2: FLOAT <NILK<NILK<NILK AFNIV3: FLOAT <NILK<NILK<NILK AFNIV4: FLOAT <NILK<NILK<NILK KITER: WORD NILK < COMPTAGE DES RECURSIONS... < < CONSTANTES DE CALCUL < DES OMBRES PORTEES : < PRAYON: FLOAT <NILK<NILK<NILK < PENTE DE LA DROITE "RAYON LUMINEUX" < ALLANT DE LA SOURCE LUMINEUSE AU POINT < DE COTE MAXIMALE COURANT, EN FAISANT LES < HYPOTHESES SUIVANTES : < 1 - ON TRACE DE DROITE A GAUCHE, < 2 - ON SUPPOSE CE RAYON LUMINEUX CONTENU < DANS LE PLAN DE PROJECTION (Z=0)... < ENFIN, ON A : < PRAYON=(YMAX-ZL)/(XMAX-XL). PAGE < < < L O C A L : < < LOCAL LOC: EQU $ < < PARAMETRES DU GENERATEUR ALEATOIRE : < 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 HINCU: FLOAT <NILK<NILK<NILK < POUR HINCV: FLOAT <NILK<NILK<NILK < L'INTERPOLATION... 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)). AMPLI: FLOAT <NILK<NILK<NILK < AMPLIFICATEUR DU SIGMA DES 'FPOND' < CALCULE A PARTIR DE 'NRECUR'. XAMPLI:: VAL 31 < POUR CALCULER 'KAMPLI'... KAMPLI: FLOAT <XAMPLI-I<K<K < POUR CALCULER 'AMPLI' A PARTIR DE < 'NRECUR'... < < POUR LE CALCUL DU LOGARITHME : < POLLO1: FLOAT <NILK<NILK<NILK < VARAIBLE DE MANOEUVRE... POLLO2: FLOAT <NILK<NILK<NILK POLLO3: FLOAT <NILK<NILK<NILK POLLO4: FLOAT 0.7071067 < RACINE(2)/2. POLLO5: FLOAT 1.2920088 < COEFFICIENTS POLLO6: FLOAT 2.6398577 < DU POLLO7: FLOAT 1.656763 < DEVELOPPEMENT. POLLO8: EQU F05 < CONSTANTE 1/2. POLLO9: FLOAT 0.6931472 < LN(2). < < POUR LE CALCUL DE L'EXPONENTIELLE : < POLEX1: EQU POLLO1 < VARIABLE DE MANOEUVRE... POLEX2: EQU POLLO2 POLEX3: EQU POLLO3 POLEX4: FLOAT 1.442695 < LOG2(E). POLEX5: WORD NILK < RELEVE DE L'EXPOSANT POLEX6: EQU F1 < 1.0 POLEX7: FLOAT 2 < 2. POLEX8: FLOAT 87.417488 < COEFFICIENTS POLEX9: FLOAT 0.0346573 < DU POLEY0: FLOAT -17830.91 < DEVELOPPEMENT. POLEY1: FLOAT 9.9545955 SIGNE: WORD NILK < POUR DETERMINER LE SIGNE DE X**Y... < < POUR CALCULER < LES EXPOSANTS : < XXMASK:: VAL MOCG XX7F:: VAL '7F < MAXIMUM POSITIF, XX80:: VAL -'80 < MIMIMUM NEGATIF. < < RELAIS DE SOUS-PROGRAMMES : < ASPRDN: WORD SPRDN < GENERATEUR ALEATOIRE DONNANT RDN(XS,YS). ARAK: WORD RAK < CALCUL DE LA PUISSANCE P/(2**Q) D'UN < NOMBRE... < < VARAIBLES DE MANOEUVRE : < FWORK1: FLOAT <NILK<NILK<NILK FWORK2: FLOAT <NILK<NILK<NILK < < POUR LE CALCUL D'UNE < INTENSITE LUMINEUSE : < AINTEN: WORD INTEN < SOUS-PROGRAMME DE CALCUL DE L'INTENSITE < LUMINEUSE AU POINT COURANT. NIVBAS:: VAL 1 < NIVEAU MINIMAL... FNIVBA: FLOAT <NIVBAS<K<K < POUR ELIMINER LA GENERATION DE POINTS < NOIRS... < < RELAIS D'ACCES AUX LISTES < DE DESCRIPTION DU MAILLAGE : < ALPASX: WORD LPASX,X < RELAI D'ACCES A 'PASIX' FLOTTANT, ALPSIX: WORD LPSIX,X < RELAI D'ACCES A 'PASIX' ENTIER. ALPASY: WORD LPASY,X < RELAI D'ACCES A 'PASIY' FLOTTANT, ALPSIY: WORD LPSIY,X < RELAI D'ACCES A 'PASIY' ENTIER. ALPOND: WORD LPOND,X < RELAI D'ACCES A 'FPOND'. < < POUR ACCEDER AUX IMAGES : < SAVER: WORD NILK < SAUVEGARDE D'UN MOT DE LA TRAME < RESIDENTE ROUGE, SAVEV: WORD NILK < DE MEME POUR LE VERT, SAVEB: WORD NILK < DE MEME POUR LE BLEU. MCDAR: EQU SAVER < SAUVEGARDE D'UN MOT DE LA TRAME < SCRATCH ROUGE, MCDAV: EQU SAVEV < DE MEME POUR LE VERT, MCDAB: EQU SAVEB < DE MEME POUR LE BLEU. XCTCDA: WORD NILK < CONSTANTE DE TRANSLATION PERMETTANT < D'ATTEINDRE INDIFFEREMMENT 'TV1' OU < 'TV2'... CTCDA: WORD TV2-TV1 < POUR ATTEINDRE 'TV2'... < < DEFINITION DE L'ACCELERATEUR < DES ACCES A 'TV1' ET 'TV2' : < ASHPR: @ 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 'ASHPR'... XWOR%6: VAL XWOR%5=FCSIGN XWOR%7: VAL XWOR%5(MSYMBN)MSYMBN=FCSIGN IF XWOR%6*XWOR%7,XEIF%,,XEIF% ASHPR:: VAL 123 < ON SE DONNE UN NOMBRE PREMIER... XEIF%: VAL ENDIF LASHT: WORD ASHPR < POUR FAIRE DES CALCULS MODULO 'ASHPR'. SAVYX: BYTE NILK;NILK < POUR MEMORISER UN COUPLE (Y,X). INOC:: VAL -EXIST < ETAT INOCCUPE D'UNE ENTREE DE LA TABLE. ASHT1:: MOT O < POUR ACCEDER A LA PARTIE (Y,X) DE LA < TABLE, ASHT2:: MOT ASHT1+ASHPR < POUR ACCEDER A LA PARTIE TV1/TV2/NIVEAU < DE LA TABLE. < < DEFINITION DE LA SPIRALE < DE CALCUL D'UN SIGMA(X,Y) : < PASQ: WORD NILK < PAS DE PARCOURS DE LA SPIRALE, DELTAX: WORD NILK < VECTEUR TRANSLATION DELTAY: WORD NILK < COMPLEXE COURANT. LB: WORD NILK < LONGUEUR DES LB0: WORD NILK < BRANCHES DE LA SPIRALE. NP: WORD NILK < NOMBRE DE POINT COURANT, FNPM: FLOAT <NILK<NILK<NILK < NOMBRE DE POINTS FLOTTANT DE LA SPIRALE. < < SIGMA(X,Y) SUR UNE SPIRALE : < F2:: FLOAT <XXXMOY<K<K F4:: FLOAT <XXXMOY*XXXMOY<K<K CUMUL: WORD NILK < SIGMA(NIVEAU(X,Y)). ASPIRL: WORD SPIRAL < SOUS-PROGRAMME DE CALCUL DE 'CUMUL'... < < PARTICIPATIONS RELATIVES DE < LA GENERATION ALEATOIRE ET < DE LA SOMMATION SUR UNE < SPIRALE CENTREE EN (256,256) : < PONRDN: FLOAT <NILK<NILK<NILK < CONTRIBUTION DE LA GENERATION ALEATOIRE, PONSPI: FLOAT <NILK<NILK<NILK < CONTRIBUTION DES SPIRALES. < < DONNEES DE "MODULATION" < D'UN CHAMP PRE-EXISTANT : < 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 BORINF: WORD NI < BORNE INFERIEUR DES NIVEAUX MARQUES, NTRN BORSUP: WORD XXN255/ND+NI < BORNE SUPERIEURE DES NIVEAUX MARQUES. TRN AXN255: WORD XXN255 < POUR FAIRE UNE REGLE DE TROIS... < < < 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 < < GESTION DU DEROULEUR : < NVPMT:: VAL '0B < 'NVP' D'ACCES AU DEROULEUR DE BANDES. DEMMT: BYTE NVPMT;XFMTWA < DEMANDE D'ECRITURE A ACCES DIRECT. WORD BUFMT=FCTA*NOCMO WORD LBUFMT WORD NILK < ADRESSE DU BLOC COURANT. DEMMTM: BYTE NVPMT;XFMTTM < DEMANDE D'ECRITURE D'UN 'TAPE-MARK'. IBUFMT: WORD LBUFMT-Z+I < INDEX COURANT DU BUFFER 'MT', ZBUFMT: WORD LBUFMT-Z+I < POUR LES TESTS "BUFFER PLEIN"... ABUFMT: WORD BUFMT,X < ET RELAI D'ACCES... PAGE < < < T A B L E A A C C E S A L E A T O I R E : < < ASHT: EQU $ DO ASHPR BYTE NILK;NILK < COUPLES (Y,X). IF INOC-K,XEIF%,, IF ATTENTION : LA VALEUR DE 'INOC' EST INACCEPTABLE !!! XEIF%: VAL ENDIF DO ASHPR WORD INOC < ETAT INOCCUPE. 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)... < < 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 PAGE < < < L I S T E S D E D E S C R I P T I O N < D U M A I L L A G E : < < LPASX: EQU $ NLS DO MAXREC FLOAT <NILK<NILK<NILK < 'PASIX'. LST LPSIX: EQU $ NLS DO MAXREC WORD NILK LST LPASY: EQU $ NLS DO MAXREC FLOAT <NILK<NILK<NILK < 'PASIY'. LST LPSIY: EQU $ NLS DO MAXREC WORD NILK LST LPOND: EQU $ NLS DO MAXREC FLOAT <NILK<NILK<NILK < 'FPOND'. LST PAGE < < < B U F F E R D E T R O I S L I G N E S C O N S E C U T I V E S < < LIGP2: EQU $ NLS DO XC512 FLOAT <NILK<NILK<NILK < LIGNE SUIVANTE-SUIVANTE. LST LIGP1: EQU $ NLS DO XC512 FLOAT <NILK<NILK<NILK < LIGNE SUIVANTE. LST LIG: EQU $ NLS DO XC512 FLOAT <NILK<NILK<NILK < LIGNE COURANTE. LST LIGM1: EQU $ 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 A DEUX MODES < DE FONCTIONNEMENT, SUIVANT LA < VALEUR DU MODE DE CONTROLE 'IMODUL' : < < 1 - (IMODUL)='NEXIST' : IL 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... < < 2 - (IMODUL)='EXIST' : IL RECUPERE < LE NIVEAU PRE-EXISTANT DU POINT DE < COORDONNEES (X,Y) ; SI CELUI-CI EST < HORS DU SEGMENT (NI,XXN255/ND+NI), < IL EST INCHANGE, SINON, IL EST RE- < ECRIT "MODULE" PAR NIVEAU/XXN255, < OU 'NIVEAU' DESIGNE LE NIVEAU ARGU- < MENT DU SOUS-PROGRAMME. < < < ARGUMENTS : < (A)=NIVEAU, < (X,Y)=COORDONNEES DU POINT. < < < RESULTAT : < (A)=NIVEAU TRANSCODE, OU NIVEAU PRE-EXISTANT, < (B) EST DETRUIT !!! < < POINT: EQU $ < < DISCRIMINATION ENTRE LE < MARQUAGE D'UN NOUVEAU < CHAMP ET LA "MODULATION" < D'UN CHAMP PRE-EXISTANT : < IF NEXIST-K,,XEIF%, IF ATTENTION : LE TEST CI-DESSOUS EST IDIOT !!! XEIF%: VAL ENDIF CPZ IMODUL < EST-CE LA "MODULATION" D'UN CHAMP PRE- < EXISTANT ??? JE POINT1 < NON, LE MARQUAGE D'UN NOUVEAU CHAMP... < < CAS DE LA "MODULATION" < D'UN CHAMP PRE-EXISTANT : < STA FWORK < SAUVEGARDE DU NIVEAU DE "MODULATION" < QUI EST DANS (XXNOIR,XXN255). BSR ALOADP < (A)=NIVEAU(X,Y) PRE-EXISTANT : CP BORINF < EST-ON DANS LES NIVEAUX A MARQUER ??? JL POINT2 < NON, ON IGNORE LE POINT (X,Y)... CP BORSUP < EST-ON DANS LES NIVEAUX A MARQUER ??? JG POINT2 < NON, ON IGNORE LE POINT (X,Y)... SB BORINF < OUI, ON SE RAMENE A L'ORIGINE, MP FWORK < ET ON "MODULE" PAR LE DV AXN255 < NIVEAU ARGUMENT, AD BORINF < PUIS, ON RE-TRANSLATE : < (A)=NIVEAU "MODULE"... JMP POINT3 < VERS LE MARQUAGE, SANS TRANSCODAGE BIEN < ENTENDU, PUISQUE LA REGLE DE TROIS CI- < DESSUS NOUS A FAIT RESTER DANS LE < SEGMENT (BORINF,BORSUP) QUI ETAIT CELUI < AUQUEL APPARTENAIT AUSSI LE NIVEAU < ANTERIEUR DU POINT (X,Y)... < < CAS DU MARQUAGE D'UN < NOUVEAU CHAMP : < POINT1: EQU $ < < TRANSCODAGE DU NIVEAU : < PSR X < SAUVEGARDE DE LA COORDONNEE 'X'... LR A,X < (X)=NIVEAU ARGUMENT, LBY &ALNIVO < (A)=NIVEAU TRANSCODE, PLR X < RESTAURE : < (X)=COORDONNEE 'X'. < < MARQUAGE DU POINT : < POINT3: EQU $ BSR ASTORP < MARQUAGE : (X,Y) <-- (A)... < < ET RETOUR : < POINT2: EQU $ 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 < < < 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 L,W < SAUVEGARDE DE 2 BASES ; MAIS 'C' NE DOIT < PAS ETRE UTILISEE A CAUSE DU BLOC FLOT- < TANT... 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), #/FST# FWORK < ET SAVE... #/FLD# VECT1Y,L < Y(1), FMP VECT2Y,W < Y(1)*Y(2), FAD FWORK < X(1)*X(2)+Y(1)*Y(2), #/FST# FWORK < ET SAVE... #/FLD# VECT1Z,L < Z(1), FMP VECT2Z,W < Z(1)*Z(2), FAD FWORK < (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 RETOUR : < PLR L,W 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 : < (X,Y)=COORDONNEES DU POINT COURANT. < < < RESULTAT : < (A,B)=RDN(XS,YS,KITER,GRAINE). < < SPRDN: EQU $ < < GENERATION ALEATOIRE : < LR X,A < (A)=COORDONNEE 'X', MP KITER < ON UTILISE 'KITER' AFIN DE FAIRE < VARIER LA GENERATION ALEATOIRE A (X,Y) < CONSTANT SUIVANT LE NIVEAU DE RECUR- < SIVITE... EORR B,A < ET ON SE RAMENE SUR UN MOT... STA FWORK4 < SAVE F1(XS)... LR Y,A < (A)=COORDONNEE 'Y', EOR RDN1 < ??!???! STA FWORK5 < SAVE F2(YS)... MP FWORK4 < ET ON CONSTRUIT XR A,B < UNE FONCTION UNIQUE AD FWORK5 < DU NOEUD COURANT, SB FWORK4 < TELLE QUE : < F(X,Y)#F(Y,X), < F(X,Y)=X*Y+Y-X. EORR B,A MP GRAINE < D'OU F(GRAINE,KITER,X,Y), 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 < < < S O M M A T I O N S U R U N E S P I R A L E < C E N T R E E S U R ( X S , Y S ) D E S < N I V E A U X D E S E S P O I N T S : < < < ARGUMENT : < (X,Y)=COORDONNEES DANS L'ESPACE (256,256). < < < RESULTAT : < (A,B)=CUMUL CENTRE SUR LE POINT ARGUMENT (X,Y). < < SPIRAL: EQU $ < < INITIALISATION DE LA SPIRALE : < PSR X,Y < SAUVEGARDE DU POINT (X,Y). STZ CUMUL < CUMUL <-- 0. STZ NP < NP=NOMBRE DE POINTS TRAITES. LA PASQ STA DELTAX < DELTAX <-- +1, STZ DELTAY < DELTAY <-- 0. LAI W STA LB0 < INITIALISATION DE LA LONGUEUR DU < PREMIER BRAS DE LA SPIRALE. < < PARCOURS D'UN BRAS : < SPIRL1: EQU $ LA LB0 STA LB < LONGUEUR DU BRAS COURANT. < < TRAITEMENT DU POINT COURANT : < SPIRL2: EQU $ IC NP < COMPTAGE DES POINTS TRAITES : LA NP CP NPM < FINI ??? JG SPIRL3 < OUI... LR X,A < NON, TEST DE LA COORDONNEE 'X' : JAL SPIRL4 < LE POINT EST HORS-ECRAN... CPI NPOLM1 JG SPIRL4 < HORS-ECRAN... LR Y,A < TEST DE LA COORDONNEE 'Y' : JAL SPIRL4 < HORS-ECRAN... CPI NLIGM1 JG SPIRL4 < HORS-ECRAN... < < ACCES AU NIVEAU DU POINT (X,Y) : < PSR X,Y < SAUVEGARDE DU POINT COURANT... < < TENTATIVE D'ACCELERATION : < SWBR Y,B ORR X,B < (B)=(Y,X), STB SAVYX < ET SAUVEGARDE... RBT NBITMO < SUPRESSION DU BIT DE SIGNE DE 'B' AFIN < QUE LE RESTE SOIT POSITIF OU NUL, LRM W WORD ASHT < (W)=ADRESSE DE LA TABLE D'ACCELERATION. LAI K DV LASHT < (B)=COUPLE (Y,X) MODULO 'ASHPR', ADR B,W < CE QUI DONNE DANS 'W' L'ADRESSE D'UNE < ENTREE : LA ASHT1,W CP SAVYX < L'ENTREE COURANTE CONTIENT-ELLE (Y,X) ??? JNE SPIRL6 < NON, IL FAUT ACCEDER REELLEMENT A 'TV1'/ < 'TV2'... LA ASHT2,W < OUI, MAIS EOR XCTCDA < ON VA ANSI REGARDER SIMULTANEMENT SI < L'ENTREE EST OCCUPEE, ET SI OUI, S'IL < Y A COINCIDENCE AVEC 'TV1'/'TV2'... JAL SPIRL6 < ET BIEN NON, CE N'EST PAS (X,Y)... CPI NIVMX7 < ALORS ??? JLE SPIRL7 < ON A TROUVE (X,Y), ET 'TV1'/'TV2' EST < LE MEME, ALORS : < (A)=NIVEAU(X,Y)... < < ACCES REEL AU POINT (X,Y) : < SPIRL6: EQU $ LR X,A LBI K XWOR%1: VAL NBITMO=K SCLD NBITMO-XWOR%1 < (B)=NUMERO DU MOT DANS LA LIGNE, SLRS NBITMO-XWOR%1 LXI NBITMO-BIT SBR A,X < (X)=DECALAGE D'ACCES AUX BITS, PSR X XR Y,B SLLD NMOTL=K+NBITMO ORR Y,A < (A)=NUMERO DU MOT DANS LA TRAME. AD XCTCDA < POUR PERMETTRE UN ACCES A TV1/TV2... LRM B,X,Y WORD MCDAR WORD D*W WORD LIMAG < (Y)=POUR PASSER D'UNE COULEUR A L'AUTRE. RCDA < ACCES AU MOT ROUGE, LRM B,X WORD MCDAV WORD D*W ADR Y,A RCDA < ACCES AU MOT VERT, LRM B,X WORD MCDAB WORD D*W ADR Y,A RCDA < ACCES AU MOT BLEU. PLR X < RESTAURATION DU DECALAGE, LA MCDAR SLRS L,X SLRD BIT < RECUPERATION D'UN BIT ROUGE, LA MCDAV SLRS L,X SLRD BIT < RECUPERATION D'UN BIT VERT, LA MCDAB SLRS L,X ANDI BIT < RECUPERATION D'UN BIT BLEU, SLLD NCOOL-BIT < (A)=NIVEAU DE GRIS DU POINT. < < MEMORISATION DE (X,Y) : < OR XCTCDA < (A)='TV1'/'TV2',NIVEAU(X,Y) : IF TV1?TV2(NIVMX7,,XEIF%, IF ATTENTION : LA CONCATENATION 'TV1'/'TV2' ET NIVEAU IF EST IMPOSSIBLE !!! XEIF%: VAL ENDIF STA ASHT2,W < MEMORISATION DE LA TRANSLATION ET DU < NIVEAU, ANDI NIVMX7 < ET RESTAURATION DU NIVEAU(X,Y)... LB SAVYX STB ASHT1,W < ET MEMORISATION DE (X,Y)... < < RESTAURATION DU POINT < COURANT ET CUMUL : < SPIRL7: EQU $ PLR X,Y AD CUMUL < ET STA CUMUL < CUMULE... < < PARCOURS DE LA SPIRALE : < SPIRL4: EQU $ LA DELTAX < CHANGEMENT DE ADR A,X LA DELTAY < POINT COURANT (X,Y). ADR A,Y DC LB < DECOMPTAGE DES POINTS SUR LA BRANCHE : JG SPIRL2 < OK, IL EN RESTE... CPZ DELTAX < NON, ON EST AU BOUT, FAUT-IL AUGMENTER < LA LONGUEUR COURANTE DES BRANCHES ??? JNE SPIRL5 < NON (DX#0) ... IC LB0 < OUI (DX=0) ... SPIRL5: EQU $ LA DELTAY < ON FAIT SUBIR AU NOMBRE COMPLEXE NGR A,A < (DX,DY) UNE ROTATION DE PI/2, SOIT LB DELTAX < UNE MULTIPLICATION PAR LA MATRICE < (0,-1,1,0)... STA DELTAX < DELTAX=-DELTAY, STB DELTAY < DELTAY=DELTAX. JMP SPIRL1 < VERS LA BRANCHE SUIVANTE < < GENERATION DU POINT (X,Y) : < SPIRL3: EQU $ PLR X,Y < RESTAURATION DU POINT COURANT (X,Y). < < NORMALISATION DU CUMUL : < LA CUMUL FLT FDV FNPM RSR PAGE < < < C A L C U L D E L A S O M M E P O N D E R E E < D E S F O N C T I O N S A L E A O I R E S : < < < ARGUMENT : < (A,B)=POINT COURANT. < < < RESULTAT : < (A,B)=((MOYENE)+(AMPLI)*F(XS,YS))*(CONTRIBUTION ALEATOIRE)+ < (F(SIGMA(NIVEAU(X,Y)))*(CONTRIBUTION DES SPIRALES). < < FONCT: EQU $ PSR X,Y < SAUVEGARDES... < < FLOTTAGE DU POINT COURANT : < LR X,A < COORDONNEE 'X' : AD TRDNX < TRANSLATION EN 'X' DU GENERATEUR, STA XS FLT #/FST# GXS < COORDONNEE 'XS' DU POINT COURANT. LR Y,A < COORDONNEE 'Y' : AD TRDNY < TRANSLATION EN 'Y' DU GENERATEUR, STA YS FLT #/FST# GYS < COORDONNEE 'YS' DU POINT COURANT. < < DISCRIMINATION DES < CONTRIBUTIONS ALEATOIRES < ET DES SPIRALES : < #/FLD# PONRDN < (A,B)=PONDERATION ALEATOIRE : FCAZ < EXISTE-T'ELLE ??? JNE FONCT1 < OUI, ALLONS LA CALCULER... BSR AGOTO WORD FONCT6 < NON, ALLONS VERS LA CONTRIBUTION DES < SPIRALES, EN NOTANT QUE L'ON A : < (A,B)=0... < < < C O N T R I B U T I O N A L E A T O I R E : < < FONCT1: EQU $ < < < G E N E R A T I O N D ' U N E S O M M A T I O N < R E C U R S I V E D E F O N C T I O N S < A L E A T O I R E S " D E C R O I S S A N T E S " : < < #/FLD# F0 #/FST# FCUMR < INITIALISATION DU CUMUL DES FONCTIONS < ALEATOIRES SCALANTES... < < ITERATION POUR CHAQUE < FONCTION ALEATOIRE : < STZ KITER < INITIALISATION DES RECURSIONS... LXI K < (X)=INDEX DES RECURSIONS... FONCT5: EQU $ IC KITER < COMPTAGE DES RECURSIONS... < < INITIALISATION DU MAILLAGE : < LA &ALPSIX STA PASIX < 'PASIX' ENTIER, LA &ALPSIY STA PASIY < 'PASIY' ENTIER. PSR X ADR X,X < PASSAGE A UN INDEX FLOTTANT... FLD &ALPASX #/FST# FPASIX < 'PASIX' FLOTTANT, FLD &ALPASY #/FST# FPASIY < 'PASIY' FLOTTANT. FLD &ALPOND #/FST# FPOND < 'FPOND'. < < RECHERCHE DU NOEUD < VOISIN PAR "DEFAUT" : < LA XS SARD NBITMO DV PASIX MP PASIX LR B,X < X(NOEUD HAUT-GAUCHE) DE LA MAILLE < COURANTE, LA YS SARD NBITMO DV PASIY MP PASIY LR B,Y < Y(NOEUD HAUT-GAUCHE) DE LA MAILLE < COURANTE. LA XS CPR A,X < EST-ON EN UN NOEUD ??? JNE FONCT3 < NON... LA YS < PEUT-ETRE : CPR A,Y < EST-ON EN UN NOEUD ??? JNE FONCT3 < NON, INTERPOLONS... < < CAS OU LE POINT (XS,YS) < COURANT EST UN NOEUD : < BSR ASPRDN < LE POINT COURANT EST UN NOEUD... JMP FONCT4 < VERS L'ACCES A LA VALEUR DU NOEUD... < < CAS OU LE POINT (XS,YS) < COURANT N'EST PAS UN NOEUD : < FONCT3: EQU $ NGR X,A < ABSCISSE DU NOEUD "HAUT-GAUCHE"... FLT FAD GXS < X-XNOEUD, FDV FPASIX < (X-XNOEUD)/PASIX, #/FST# HINCU < DISTANCE NORMALISEE A 1 LE LONG DE OX, < DU POINT COURANT AU NOEUD DE LA MAILLE. NGR Y,A < ORDONNEE DU NOEUD "HAUT-GAUCHE"... FLT FAD GYS < Y-YNOEUD, FDV FPASIY < (Y-YNOEUD)/PASIY, #/FST# HINCV < DISTANCE NORMALISEE A 1 LE LONG DE OY, < DU POINT COURANT AU NOEUD DE LA MAILLE. BSR ASPRDN #/FST# AFNIV1 < NIVEAU(XNOEUD,YNOEUD), LA PASIX ADR A,X BSR ASPRDN #/FST# AFNIV2 < NIVEAU(XNOEUD+PASIX,YNOEUD), LA PASIY ADR A,Y BSR ASPRDN #/FST# AFNIV3 < NIVEAU(XNOEUD+PASIX,YNOEUD+PASIY), LA PASIX SBR A,X BSR ASPRDN #/FST# AFNIV4 < NIVEAU(XNOEUD,YNOEUD+PASIY). < < INTERPOLATION ENTRE LES < QUATRE SOMMETS D'UN CARRE < PORTANT LES VALEURS (NIV1, < NIV2,NIV3,NIV4), LES COOR- < DONNEES DU POINT DANS LE < CARRE ETANT (HINCU,HINCV) : < < < NOTA : < ON DOIT INTERPOLER ENTRE < LES NIVEAUX (N1,N2,N3,N4) SUR < LES SOMMETS ((1-U,1-V),(U,1-V),(U,V),(1-U,V)), < CE QUI CONDUIT A CALCULER LA < FORMULE : < < (1-U)*(1-V)*N1+U*(1-V)*N2+U*V*N3+(1-U)*V*N4, < < QUI SE REECRIT, EN SUPPOSANT U#0 : < < (1-V)*((1-U)*N1+U*N2)+V*(U*N3+(1-U)*N4), < < SOIT : < < U*(1-V)*(N2+((1-U)/U)*N1)+U*V*(N3+((1-U)/U)*N4), < < ET ENFIN (SI U#0) : < < U*((1-V)*(N2+((1-U)/U)*N1)+V*(N3+((1-U)/U)*N4)). < < OU (SI V#0) : < < V*((1-U)*(N4+((1-V)/V)*N1)+U*(N3+((1-V)/V)*N2)). < FCMZ HINCU < 'U' EST-IL NUL ??? JNE FONCT8 < NON, ON PEUT DIVISER PAR LUI... FCMZ HINCV < 'V' EST-IL NUL ??? JNE FONCT9 < NON, ON PEUT DIVISER PAR LUI... QUIT XXQUIT < E R R E U R P R O G R A M M E ... JMP FONCT7 < ET ON SORT... < < CAS OU 'V' EST NON NUL : < FONCT9: EQU $ #/FLD# F1 < 1, FSB HINCU < 1-U, #/FST# FWORK1 < W1=1-U. #/FLD# F1 < 1, FSB HINCV < 1-V, FDV HINCV < (1-V)/V, PSR A,B < ET SAVE... FMP AFNIV1 < ((1-V)/V)*N1, FAD AFNIV4 < N4+((1-V)/V)*N1, FMP FWORK1 < (1-U)*(N4+((1-V)/V)*N1, #/FST# FWORK < ET SAVE... PLR A,B < (1-V)/V, FMP AFNIV2 < ((1-V)/V)*N2, FAD AFNIV3 < N3+((1-V)/V)*N2, FMP HINCU < U*(N3+((1-V)/V)*N2), FAD FWORK < (1-U)*(N4+((1-V)/V)*N1) < +U*(N3+((1-V)/V)*N2), FMP HINCV < V*(...). JMP FONCT7 < ET L'INTERPOLATION EST FINIE... < < CAS OU 'U' EST NON NUL : < FONCT8: EQU $ #/FLD# F1 < 1, FSB HINCV < 1-V, #/FST# FWORK1 < W1=1-V. #/FLD# F1 < 1, FSB HINCU < 1-U, FDV HINCU < (1-U)/U, PSR A,B < ET SAVE... FMP AFNIV1 < ((1-U)/U)*N1, FAD AFNIV2 < N2+((1-U)/U)*N1, FMP FWORK1 < (1-V)*(N2+((1-U)/U)*N1, #/FST# FWORK < ET SAVE... PLR A,B < (1-U)/U, FMP AFNIV4 < ((1-U)/U)*N4, FAD AFNIV3 < N3+((1-U)/U)*N4, FMP HINCV < V*(N3+((1-U)/U)*N4), FAD FWORK < (1-V)*(N2+((1-U)/U)*N1) < +V*(N3+((1-U)/U)*N4), FMP HINCU < U*(...). < < FIN DE L'INTERPOLATION : < FONCT7: EQU $ < < RESTAURATION DE (XS,YS) : < FONCT4: EQU $ PLR X < < CALCUL RECURSIF DE LA FONCTION : < FMP FPOND < ET ON PONDERE PAR LES 'FPOND' < AFIN D'OBTENIR DES VALEURS ALEATOIRES < DECROISSANTES STATISTIQUEMENT... < NOTA : ON NE DIVISE PLUS PAR 'FPOND0', < CAR LA DEFINITION DE 'RENORM' INCLUE < SON INVERSE, ET DONC : FPOND0/FPOND0=1... FAD FCUMR < QUE L'ON CUMULE, #/FST# FCUMR < ON A AINSI EN CHAQUE POINT UNE SOMME < DE FONCTION ALEATOIRE DONT LA FREQUENCE < AUGMENTE PROGRESSIVEMENT PAR REDUCTION < DE LA MAILLE, MAIS DONT L'AMPLITUDE < DIMINUE STATISTIQUEMENT... < < PASSAGE A LA COMPOSANTE SUIVANTE : < ADRI I,X < PROGRESSION DE L'INDEX DE RECURSION... LR X,A CP NRECUR < EST-CE FINI ??? JGE FONCT2 < OUI, ON ARRETE LA... BSR AGOTO WORD FONCT5 < NON, ON CONTINUE... FONCT2: EQU $ < < FIN DE RECURSION : < #/FLD# FCUMR < ET ON RENVOIE LA SOMME DES < FONCTIONS ALEATOIRES... FDV RENORM < ET ON MULTIPLIE PAR 'AMPLI', 'AMPLIR', < ET ON DIVISE PAR LE SIGMA DES 'FPOND'... < < CALCUL FINAL DE LA < CONTRIBUTION ALEATOIRE : < FAD MOYENE < ET TRANSLATION. FMP PONRDN < ET PONDERATION PAR LA CONTRIBUTION < ALEATOIRE... FONCT6: EQU $ < < TEST DE LA CONTRIBUTION < DES SPIRALES (256,256) : < FCMZ PONSPI < LES SPIRALES SONT-ELLES LA ??? JE FONCT0 < NON, (A,B) DONNE LA FONCTION... < < < C O N T R I B U T I O N D E S S P I R A L E S : < < PSR A,B < SAUVEGARDE DE LA CONTRIBUTION ALEATOIRE. < < TEST DE LA POSITION < DU POINT COURANT (XS,YS) < DE LA MAILLE (512,512) < PAR RAPPORT A LA MAILLE < DES SPIRALES 2*(256,256) : < LA XS < (A)=ABSCISSE '512', SLRS XC512/NPOL=K LR A,X < (X)=ABSCISSE '256'. JC FONC01 < ELLE NE "TOMBE PAS JUSTE"... LA YS < (A)=ORDONNEE '512', SB VECTNL NGR A,A < EN EFFET, LES AXES 'Y' '512' ET '256' < SONT INVERSES... SLRS XL512/NLIG=K LR A,Y < (Y)=ORDONNEE '256'. JC FONC02 < ELLE NE "TOMBE PAS JUSTE", ET LE POINT < '512' EST SUR SUR UNE HORIZONTALE ENTRE < DEUX POINTS '256'... < < CAS D'UN POINT '512' < COINCIDANT AVEC UN < POINT '256' : < BSR ASPIRL < (A,B)=SIGMA(NIVEAU(X,Y)). FMP F4 < ET ON LE QUADRUPLE : < (A,B)=4*SIGMA(NIVEAU(X,Y)). JMP FONC09 < VERS LA SORTIE... < < CAS D'UN POINT '512' < ENTRE DEUX POINTS '256' < SUR UNE VERTICALE : < FONC02: EQU $ BSR ASPIRL < (A,B)=SIGMA(NIVEAU(X,Y)), #/FST# FWORK < ET SAVE... ADRI I,Y BSR ASPIRL < (A,B)=SIGMA(NIVEAU(X,Y+1)). FAD FWORK < (A,B)=SIGMA(NIVEAU(X,Y))+ < SIGMA(NIVEAU(X,Y+1)). FMP F2 < ET ON LE DOUBLE : < (A,B)=2*(SIGMA(NIVEAU(X,Y))+ < SIGMA(NIVEAU(X,Y+1))). JMP FONC09 < VERS LA SORTIE... < < AUTRES CAS : < FONC01: EQU $ LA YS < (A)=ORDONNEE '512' : SB VECTNL NGR A,A < EN EFFET, LES AXES 'Y' '512' ET '256' < SONT INVERSES... SLRS XL512/NLIG=K LR A,Y < (Y)=ORDONNEE '256'. JC FONC03 < ELLE NE "TOMBE PAS JUSTE", ET LE POINT < '512' ET AU CENTRE D'UN CARRE DE QUATRE < POINTS '256'... < < CAS D'UN POINT '512' < ENTRE DEUX POINTS '256' < SUR UNE HORIZONTALE : < BSR ASPIRL < (A,B)=SIGMA(NIVEAU(X,Y)), #/FST# FWORK < ET SAVE... ADRI I,X BSR ASPIRL < (A,B)=SIGMA(NIVEAU(X+1,Y)). FAD FWORK < (A,B)=SIGMA(NIVEAU(X,Y))+ < SIGMA(NIVEAU(X+1,Y)). FMP F2 < ET ON LE DOUBLE : < (A,B)=2*(SIGMA(NIVEAU(X,Y))+ < SIGMA(NIVEAU(X+1,Y))). JMP FONC09 < VERS LA SORTIE... < < CAS D'UN POINT '512' AU < CENTRE D'UN CARRE FAIT < DE QUATRE POINTS '256' : < FONC03: EQU $ BSR ASPIRL < (A,B)=SIGMA(NIVEAU(X,Y)), #/FST# FWORK1 ADRI I,X BSR ASPIRL < (A,B)=SIGMA(NIVEAU(X+1,Y)), #/FST# FWORK2 ADRI I,Y BSR ASPIRL < (A,B)=SIGMA(NIVEAU(X+1,Y+1)), #/FST# FWORK ADRI -I,X BSR ASPIRL < (A,B)=SIGMA(NIVEAU(X,Y+1)). FAD FWORK FAD FWORK2 FAD FWORK1 < (A,B)=SIGMA(NIVEAU(X,Y))+ < SIGMA(NIVEAU(X+1,Y))+ < SIGMA(NIVEAU(X+1,Y+1))+ < SIGMA(NIVEAU(X,Y+1)). < < PONDERATION "SPIRALE" : < FONC09: EQU $ FMP PONSPI < ET CONTRIBUTION DES SPIRALES... < < < C A L C U L D E L A F O N C T I O N C O U R A N T E : < < #/FST# FWORK < SAUVEGARDE TEMPORAIRE... PLR A,B < (A,B)=CONTRIBUTION ALEATOIRE, FAD FWORK < (A,B)=CONTRIBUTION ALEATOIRE+ < CONTRIBUTION DES SPIRALES. FONCT0: EQU $ < < RETOUR : < PLR X,Y RSR PAGE < < < C A L C U L D ' U N E P U I S S A N C E < Q U E L C O N Q U E R E E L L E ' P ' : < < < ARGUMENT : < (A,B)=NOMBRE 'N' ARGUMENT, < < < RESULTAT : < (A,B)='N' A LA PUISSANCE P. < < RAK: EQU $ PSR Y < < < L O G N E P E R I E N : < < LOGN: EQU $ STZ SIGNE < =0 : SIGNE "+" A PRIORI... FCAZ JGE LOGN1 < POSITIF... IC SIGNE < =1 : SIGNE "-"... LOGN1: EQU $ LR A,Y FABS ANDI XXMASK #/FST# POLLO3 FAD POLLO4 #/FST# POLLO2 LR Y,A SWBR A SARS XXMASK=K FLT #/FST# POLLO1 #/FLD# POLLO3 FSB POLLO4 FDV POLLO2 #/FST# POLLO3 FMP POLLO3 FNEG FAD POLLO7 #/FST# POLLO2 #/FLD# POLLO6 FDV POLLO2 FAD POLLO5 FMP POLLO3 FSB POLLO8 FAD POLLO1 FMP POLLO9 < < < G E S T I O N D U S I G N E D E L ' E X P O S A N T : < < PSR A,B < SAVE LE 'LOG'... #/FLD# EXPOP FABS BSR AROND < ON PREND LA PARTIE ENTIERE (PAR EXCES < OU PAR DEFAUT) DE LA VALEUR ABSOLUE DE < L'EXPOSANT... TBT NBITMO-B < QUELLE EST SA PARITE ??? JC RAK1 < IMPAIRE, 'SIGNE' RESTE TEL QUEL... STZ SIGNE < PAIRE : ON FORCE "+" (SIGNE INCHANGE)... RAK1: EQU $ PLR A,B < RESTAURATION DU LOG, FMP EXPOP < ET ON CALCULE P*LOG... < < < E X P O N E N T I E L L E : < < EXP: EQU $ FMP POLEX4 #/FST# POLEX3 FIX STA POLEX5 FLT FCAM POLEX3 JNV EXPON3 #/FLD# POLEX6 #/FST# POLEX3 JMP EXPON5 EXPON3: EQU $ CPZ POLEX3 JGE EXPON4 DC POLEX5 LA POLEX5 FLT EXPON4: EQU $ FSB POLEX3 FNEG #/FST# POLEX2 FMP POLEX2 #/FST# POLEX1 FAD POLEX8 #/FST# POLEX3 #/FLD# POLEY0 FDV POLEX3 FAD POLEX1 FMP POLEX9 FAD POLEY1 FSB POLEX2 #/FST# POLEX3 #/FLD# POLEX7 FMP POLEX2 FDV POLEX3 FAD POLEX6 #/FST# POLEX3 EXPON5: EQU $ SWBR A SARS XXMASK=K AD POLEX5 CPI XX7F JG $ < E R R E U R P R O G R A M M E ... CPI XX80 JGE EXPON6 #/FLD# F0 < ON PREND LE MINIMUM... JMP EXPON7 EXPON6: EQU $ XWOR%1: VAL XXMASK=K XWOR%1: VAL -XWOR%1 ANDI XXMASK>XWOR%1 STA POLEX5 LA POLEX3 ANDI XXMASK AD POLEX5 EXPON7: EQU $ CPZ SIGNE < PRISE EN COMPTE DU SIGNE SIMULE : JE EXP1 < POSITIF, ON LAISSE LE RESULTAT TEL QUEL.. FNEG < NEGATIF, ON INVERSE... EXP1: EQU $ BSR ATSFLO PLR Y RSR PAGE < < < C A L C U L D ' U N E I N T E N S I T E L U M I N E U S E : < < < FONCTION : < ETANT DONNE LE POINT COURANT, < ET SA NORMALE, CE SOUS-PROGRAM- < ME CALCULE EN FONCTION DE LA < SOURCE LUMINEUSE L'INTENSITE < A ATTRIBUER AU POINT COURANT. < < < ARGUMENTS : < (X)=COORDONNEE 'X' (PERMET D'INDEXER LE 'Z'...), < (FXN,FYN,FZN)=COORDONNEES DU VECTEUR NORMAL, < (FXL,FYL,FZL)=COORDONNEES DE LA SOURCE LUMINEUSE. < < < RESULTAT : < (A,B)=INTENSITE LUMINEUSE. < < INTEN: EQU $ < < INITIALISATIONS : < PSR X < SAUVEGARDE DE LA COORDONNEE 'X'... ADR X,X < ET PASSAGE A UN INDEX FLOTTANT... < < NORME DE LA NORMALE : < LRM A,B WORD CN3D < (A)=ADRESSE DE LA NORMALE, WORD CN3D < (B)=ADRESSE DE LA NORMALE, BSR APRSCA < ET CALCUL DU CARRE DE SA NORME, #/FST# FWORK1 < (FWORK1)=NORME(X(N),Y(N),Z(N))**2, < < RECHERCHE DE Z(A) : < FLD &ALIG < Z(A), PLR X < (X)=COORDONNEE 'X'... < < CALCUL DU RAYON LUMINEUX : < FSB FZL < Z(A)-Z(L), FNEG #/FST# FZS < (FZS)=Z(L)-Z(A). LR Y,A < Y(A), FLT FSB FYL < Y(A)-Y(L), FNEG #/FST# FYS < (FYS)=Y(L)-Y(A). LR X,A < X(A), FLT FSB FXL < X(A)-X(L), FNEG #/FST# FXS < (FXS)=X(L)-X(A). < < NORME DU RAYON LUMINEUX : < LRM A,B WORD CS3D < (A)=ADRESSE DU RAYON LUMINEUX, WORD CS3D < (B)=ADRESSE DU RAYON LUMINEUX, BSR APRSCA < ET CALCUL DU CARRE DE SA NORME, FMP FWORK1 < CALCUL DU CARRE DU PRODUIT DU MODULE < DE LA NORMALE ET DU RAYON LUMINEUX, BSR ARAC #/FST# FWORK1 < (FWORK1)=PRODUIT DE LA NORME DE LA NOR- < MALE ET DE LA NORME DU RAYON < LUMINEUX. < < CALCUL DE L'ANGLE ENTRE LE < NORMALE ET LE RAYON LUMINEUX : < LRM A,B WORD CN3D < (A)=ADRESSE DE LA NORMALE, WORD CS3D < (B)=ADRESSE DU RAYON LUMINEUX, BSR APRSCA < (A,B)=PRODUIT SCALAIRE DE LA NORMALE, < ET DU RAYON LUMINEUX, FDV FWORK1 < (A,B)=COS(TETA), OU 'TETA' DESIGNE < L'ANGLE ENTRE LA NORMALE ET LE < RAYON LUMINEUX. < < CALCUL DE L'INTENSITE < LUMINEUSE AU POINT COURANT : < FAD F1 < (A,B)=1+COS(TETA), FMP F05 < (A,B)=(1+COS(TETA))/2, < SOIT UN NOMBRE DANS (0,1)... FMP FNIVC < (A,B)=NIVEAU FLOTTANT A DONNER AU POINT < COURANT. FCAM FNIVBA < NE VA-T'ON PAS CREER UN POINT NOIR ??? JGE GEN33 < NON, OK... #/FLD# FNIVBA < OUI, ON LE "SATURE"... GEN33: EQU $ < < ET RETOUR : < BSR ATSFLO 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 < POSITIONNEMENT 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 $ < < 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'...). < < INITIALISATION DU GESTIONNAIRE < DE BANDES MAGNETIQUES (A PRIORI) : < LA ABLOC0 JAL INIT20 < ON FERA DU SEQUENTIEL STRICT... STA DEMMT+ARGESC < ADRESSE DU PREMIER BLOC A LIRE, INIT20: EQU $ STZ IBUFMT < POUR FORCER LA PREMIERE LECTURE... < < INITIALISATION DES < DIFFERENTS BUFFERS : < LX VECTNC < (X)=INDEX DES INITIALISATIONS... ADR X,X < PASSAGE A UN INDEX FLOTTANT... IF DFLOT-W-W,,XEIF%, IF ATTENTION : CE QUI PRECEDE EST IDIOT !!! XEIF%: VAL ENDIF #/FLD# F0 < (A,B)=VALEUR D'INITIALISATION DES < BUFFERS DE LIGNE... INIT02: EQU $ FST &ALIGP2 < INITIALISATION FST &ALIGP1 < DES FST &ALIG < BUFFERS FST &ALIGM1 < DE LIGNE... ADRI -I*DFLOT,X < ET REGRESSION, CPZR X < EST-CE FINI ??? JGE INIT02 < NON... < < < I N I T I A L I S A T I O N S : < < INIT01: EQU $ < < 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. < < INITIALISATION DES < CALCULS DE SPIRALES : < LA NPM FLT #/FST# FNPM < FLOTTAGE DE 'NPM'... < < PAS INITIAUX DU MAILLAGE : < LA PASIX0 < VALEUR INITIALE DE 'PASIX' : JALE $ < ??? STA PASIX < PAS EN 'X', FLT #/FST# FWORK < ET SAUVEGARDE... LA PASIY0 < VALEUR INITIALE DE 'PASIY' : JALE $ < ??? STA PASIY < ET PAS EN 'Y'... FLT FMP FWORK < CALCUL DE PASIX*PASIY*K*K CE QUI DONNE < L'AIRE DE LA MAILLE ELEMENTAIRE... BSR ARAC #/FST# FPOND0 < LA PONDERATION INITIALE DES FONCTIONS < ALEATOIRES EST EN FAIT LA TAILLE DE LA < MAILLE... < < VALIDATION DES DEMANDES < D'OMBRES PORTEES : < IF NEXIST-K,,XEIF%, IF ATTENTION : LE TEST SUIVANT EST MAUVAIS !!! XEIF%: VAL ENDIF CPZ IOMBRE < A-T'ON DEMANDE LES OMBRES PORTEES ??? JE GEN500 < NON, RIEN A VALIDER... GEN501: EQU $ FCMZ FYL < OUI, DANS CE CAS, ON FAIT LES HYPOTHESES < SUIVANTES : < 1 - ON TRACE DE DROITE A GAUCHE, < 2 - LA SOURCE LUMINEUSE 'S' EST A DROITE < DE LA MONTAGNE (XL > XMAX), PUISQU'ON < TRACE DE DROITE A GAUCHE, ET DANS LE < PLAN DE PROJECTION (YL=0) POUR SIMPLIFIER < LES CALCULS (EN FAIT ON VA MEME LA SUP- < POSER A L'INFINI, EN IGNORANT SZLTEMATI- < QUEMENT LA TROISIEME COORDONNEE DU RAYON < LUMINEUX...). JNE GEN502 < ERREUR : 'YL' EST NON NUL !!! #/FLD# FXL BSR AROND CP VECTNC JG GEN500 < OK, LA SOURCE LUMINEUSE EST A DROITE DE < LA MONTAGNE... GEN502: EQU $ QUIT XXQUIT < ERREUR SUR LA SOURCE LUMINEUSE, ON < REDEMANDE LES PARAMETRES... JMP GEN501 < ET ON REVALIDE... GEN500: EQU $ #/FLD# FNIVMX #/FST# FNIVC < ON INITIALISE A PRIORI 'FNIVC' POUR < LE CAS OU L'OMBRAGE N'EST PAS DEMANDE... GEN541: EQU $ LA NPENOM < (A)=LARGEUR DE LA ZONE DE PENOMBRE : JAG GEN540 < OK, ELLE EST STRICTEMENT POSITIVE... QUIT XXQUIT < E R R E U R ... JMP GEN541 < ET ON RE-VALIDE... GEN540: EQU $ FLT FDV FNIVOM #/FST# FPENOM < FPENOM=NPENOM/FNIVOM. < < < I N I T I A L I S A T I O N D E S M A I L L A G E S : < < GEN200: EQU $ LA MRECUR < VALIDATION DE 'MRECUR' : JALE GEN201 < MAUVAIS... CPI MAXREC < ALORS ??? JLE GEN202 < OK... GEN201: EQU $ QUIT XXQUIT < E R R E U R U T I L I S A T E U R ... JMP GEN200 < ET ON RE-VALIDE... GEN202: EQU $ < < INITIALISATIONS : < LA PASIX FLT #/FST# FPASIX < 'PASIX', LA PASIY FLT #/FST# FPASIY < 'PASIY'. #/FLD# FPOND0 #/FST# FPOND < 'FPOND'. < < REDUCTION RECURSIVE DU MAILLAGE : < LXI K < (X)=INDEX DE RECURSION... GEN210: EQU $ PSR X LR X,Y < (Y)=INDEX ENTIER, ADR X,X < PASSAGE A UN INDEX FLOTTANT... #/FLD# FPOND FST &ALPOND < 'LPOND', BSR ARAK < EXPONENTIATION, #/FST# FPOND < ET REDUCTION... #/FLD# FPASIX FST &ALPASX < 'PASIX' FLOTTANT, PSR A,B,X LR Y,X BSR AROND STA &ALPSIX < 'PASIX' ENTIER. PLR A,B,X BSR ARAK < EXPONENTIATION, #/FST# FPASIX < ET REDUCTION... #/FLD# FPASIY FST &ALPASY < 'PASIY' FLOTTANT, PSR A,B,X LR Y,X BSR AROND STA &ALPSIY < 'PASIY' ENTIER. PLR A,B,X BSR ARAK < EXPONENTIATION, #/FST# FPASIY < ET REDUCTION... FAD FPASIX BSR AROND < (A)=PASIX+PASIY, PLR X < RESTAURE L'INDEX DE RECURSION... ADRI I,X < PASSAGE A LA RECURSION SUIVANTE... CPI W+W < EST-ON ARRIVE A UNE MAILLE IRREDUCTIBLE, < SOIT ELEMENTAIRE (1*1) ??? JE GEN220 < OUI, ON ARRETE LA... LR X,A < NON, CP MRECUR < MAIS A-T'ON ATTEINT LE MAXIMUM ??? JL GEN210 < NON, ON CONTINUE... GEN220: EQU $ STX NRECUR < MISE EN PLACE DU 'NRECUR' A UTILISER... < < CALCUL DU FACTEUR DE < RENORMALISATION DE LA < FONCTION ALEATOIRE : < LR X,A < (A)='NRECUR', FLT < QUE L'ON FLOTTE... FAD KAMPLI FSB F1 FDV KAMPLI #/FST# AMPLI < (AMPLI)=(NRECUR+30)/31... #/FLD# F0 < INITIALISATION DU SIGMA DES 'FPOND', GEN410: EQU $ PSR X ADRI -IJIJDX,X ADR X,X < PASSAGE A UN INDEX FLOTTANT... FAD &ALPOND < CALCUL DE SIGMA(FPOND), PLR X JDX GEN410 < AU SUIVANT... FDV AMPLI FDV AMPLIR #/FST# RENORM < RENORM=SIGMA(FPOND)/(AMPLI*AMPLIR). < < < G E N E R A T I O N D E L ' I M A G E : < < 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'. < < INITIALISATION DES < CONDITIONS DE TRACE : < GEN69N: EQU $ < < < G E N E R A T I O N D U C H A M P A L E A T O I R E : < < LYI K < (Y)=COORDONNEE 'Y'. GEN01: EQU $ LXI K < (X)=COORDONNEE 'X'. GEN02: EQU $ BSR AFONCT < CALCUL DANS (A,B) DE LA SOMME < PONDEREE DES FONCTIONS ALEATOIRES, < ASSOCIEE AU POINT COURANT (X,Y) < SANS OUBLIER LA CONTRIBUTION DES < SPIRALES... IF DFLOT-XXXMOY,,XEIF%, IF ATTENTION : LES 'ADR' VONT MERDER !!! XEIF%: VAL ENDIF PSR X ADR X,X < PASSAGE A UNE INDEX FLOTTANT... FST &ALIGP2 < ET ON MEMORISE Z(X,Y) DANS LA LIGNE < SUIVANTE-SUIVANTE... PLR X ADRI I,X < PROGRESSION SUR LA LIGNE : LR X,A CP VECTNC < EST-ON AU BOUT ??? JLE GEN02 < NON... < < < T E N T A T I V E D ' E L I M I N A T I O N < D E S P I C S P A R F I L T R A G E : < < < FONCTION : < CONSIDERONS 3 POINTS SUC- < CESSIFS : A(X-I), M(X), B(X+I). < POUR CHAQUE POINT M(X), ON VA < TESTER : < < SI : Z(M(X)) > Z(A(X-I)) ET Z(M(X)) > Z(B(X+I)), < ALORS : Z(M(X)) <-- ALPHA*(Z(A(X-I))+Z(B(X+I)))/2+ < (1-ALPHA)*Z(M(X)), < < PUIS, CONSIDERONS 3 POINTS SUC- < CESSIFS : A(Y), M(Y+I), B(Y+I+I). < POUR CHAQUE POINT M(Y+I), ON VA < TESTER : < < SI : Z(M(Y+I)) > Z(A(Y)) ET Z(M(Y+I)) > Z(B(Y+I+I)), < ALORS : Z(M(Y+I)) <-- ALPHA*(Z(A(Y))+Z(B(Y+I+I)))/2+ < (1-ALPHA)*Z(M(Y+I)), < < C'EST-A-DIRE QUE SI LE POINT 'M' < EST AU-DESSUS DE 'A' ET 'B', CE < QUI GENERE UN PLI, ALORS ON REDES- < CEND 'M'... < ENFIN, ON FAIT DE MEME, EN < TESTANT 'M' PAR RAPPORT A LA < POSITION EN-DESSOUS DE "A" ET < "B", AUQUEL CAS ON LE REMONTE... < < #/FLD# F1 FSB ALPHA #/FST# FWORK1 < (FWORK1)=1-ALPHA. #/FLD# ALPHA FMP F05 #/FST# FWORK2 < (FWORK2)=ALPHA/2. < < TRAITEMENT LE LONG DE 'X' : < LXI W < ON NE COMMENCE PAS SUR LE PREMIER POINT.. GEN120: EQU $ PSR X ADR X,X < PASSAGE A UN INDEX FLOTTANT... FLD &ALIGP2 < Z(M(X)), ADRI -DFLOT,X FCAM &ALIGP2 < COMPARAISON A Z(A(X-I)) : JL GEN122 < OK, 'M' EST AU-DESSOUS DE 'A'... ADRI DFLOT+DFLOT,X < 'M' EST AU-DESSUS DE 'A', FCAM &ALIGP2 < COMPARAISON A Z(B(X+I)) : JL GEN121 < OK, 'M' EST AU-DESSOUS DE 'B' ET AU- < DESSUS DE 'A'... GEN124: EQU $ < CAS OU 'M' EST AU-DESSUS DE 'A' ET 'B', < OU BIEN AU-DESSOUS DE 'A' ET 'B'... FMP FWORK1 < Z(M(X))*(1-ALPHA), #/FST# FWORK < ET SAUVEGARDE... FLD &ALIGP2 < Z(B(X+I)), ADRI -DFLOT-DFLOT,X FAD &ALIGP2 < Z(A(X-I))+Z(B(X+I)), FMP FWORK2 < ALPHA*(Z(A(X-I))+Z(B(X+I)))/2, FAD FWORK < +(1-ALPHA)*Z(M(X)), ADRI DFLOT,X FST &ALIGP2 < D'OU LE NOUVEAU Z(M(X))... JMP GEN121 < VERS LE POINT SUIVANT... GEN122: EQU $ ADRI DFLOT+DFLOT,X FCAM &ALIGP2 < COMPARAISON A Z(B(X+I)) : JL GEN124 < 'M' EST AU-DESSOUS DE 'B' (ET DE 'A'...). GEN121: EQU $ PLR X < RESTAURE LA COORDONNEE 'X', ADRI I,X < PASSAGE AU POINT SUIVANT, LR X,A CP VECTNC < S'IL EXISTE... JL GEN120 < OUI, MAIS ON NE TRAITE PAS LE DERNIER < POINT... < < DISCRIMINATION DE LA PREMIERE < ET DE LA DEUXIEME LIGNE : < LR Y,A < (A)=ORDONNEE COURANTE : CPI W < EST-ON SUR LA PREMIERE OU SUR LA < DEUXIEME LIGNE ??? JLE GEN300 < OUI, IL FAUT AU MOINS 3 LIGNES POUR < POUVOIR FILTRER, ON ATTEND DONC... < < TRAITEMENT LE LONG DE 'Y' : < LXI K < ON COMMENCE SUR LE PREMIER POINT... GEN130: EQU $ PSR X ADR X,X < PASSAGE A UN INDEX FLOTTANT... FLD &ALIGP1 < Z(M(Y+I)), FCAM &ALIG < COMPARAISON A Z(A(Y)) : JL GEN132 < OK, 'M' EST AU-DESSOUS DE 'A'... FCAM &ALIGP2 < COMPARAISON A Z(B(Y+I+I)) : JL GEN131 < OK, 'M' EST AU-DESSOUS DE 'B' ET AU- < DESSUS DE 'A'... GEN134: EQU $ < CAS OU 'M' EST AU-DESSUS DE 'A' ET 'B', < OU BIEN AU-DESSOUS DE 'A' ET 'B'... FMP FWORK1 < Z(M(Y+I))*(1-ALPHA), #/FST# FWORK < ET SAUVEGARDE... FLD &ALIGP2 < Z(B(Y+I+I)), FAD &ALIG < Z(A(Y))+Z(B(Y+I+I)), FMP FWORK2 < ALPHA*(Z(A(Y))+Z(B(Y+I+I)))/2, FAD FWORK < +(1-ALPHA)*Z(M(Y+I)), FST &ALIGP1 < D'OU LE NOUVEAU Z(M(Y+I))... JMP GEN131 < VERS LE POINT SUIVANT... GEN132: EQU $ FCAM &ALIGP2 < COMPARAISON A Z(B(Y+I+I)) : JL GEN134 < 'M' EST AU DESSOUS DE 'B' (ET DE 'A'...). GEN131: EQU $ PLR X < RESTAURE LA COORDONNEE 'X', ADRI I,X < PASSAGE AU POINT SUIVANT, LR X,A CP VECTNC < S'IL EXISTE... JLE GEN130 < OUI... GEN300: EQU $ CPZ IBANDE < EN FAIT DOIT-ON ECRIRE UNE BANDE ??? JE GEN90 < NON... < < OUI, GENERATION D'UNE BANDE : < PSR A,X LXI K < (X)=COORDONNEE 'X', GEN94: EQU $ PSR X ADR X,X < PASSAGE A UN INDEX FLOTTANT... FLD &ALIG BSR AROND < (A)=NIVEAU(X). LX IBUFMT < (X)=INDEX DE L'OCTET COURANT, STBY &ABUFMT < (A)=OCTET COURANT... ADRI I,X < ET PREPARATION DE STX IBUFMT < L'ACCES SUIVANT... < < TEST DE L'ETAT DU BUFFER : < LR X,A < (A)=INDEX COURANT : CP ZBUFMT < LE BUFFER A-T'IL ETE VIDE (OU EST-CE < L'ETAT INITIAL) ??? JL GEN91 < NON... < < CAS OU LE BUFFER EST PLEIN : < GEN92: EQU $ LAD DEMMT < (A)=ADRESSE DE LA DEMANDE, SVC < QUE L'ON ENVOIE... JE GEN93 < OK... QUIT XXQUIT < E R R E U R D ' A S S I G N A T I O N.. JMP GEN92 < ET ON RE-TENTE... GEN93: EQU $ IC DEMMT+ARGESC < PREPARATION DE L'ADRESSE DU BLOC SUIVANT, STZ IBUFMT < (A)=INDEX DU PREMIER OCTET. GEN91: EQU $ PLR X ADRI I,X < PROGRESSION DE 'X', LR X,A CP VECTNC < EST-CE FINI ??? JLE GEN94 < NON... PLR A,X GEN90: EQU $ < < DISCRIMINATION DE LA PREMIERE, DE LA < DEUXIEME ET DE LA TROISIEME LIGNE : < LR Y,A < (A)=ORDONNEE COURANTE : CPI W+W < EST-ON SUR LA PREMIERE, LA DEU- < XIEME OU LA TROISIEME LIGNE ??? JG GEN21 < NON, ON PEUT GENERER LE RELIEF... BSR AGOTO WORD GEN50 < OUI, ATTENDONS LA LIGNE SUIVANTE... < (MAIS ROTATION DES BUFFERS DE LIGNE < MALGRE TOUT...) GEN21: EQU $ < < < G E N E R A T I O N D U R E L I E F : < < STZ PRAYON < AU DEBUT DE CHAQUE NOUVELLE LIGNE, ON < ATTRIBUE A 'PRAYON' UNE VALEUR IMPOS- < SIBLE EN FLOTTANT... < ET CE AFIN DE FORCER SON CALCUL... LX VECTNC < ON COMMENCE SUR LE PREMIER POINT, MAIS < ATTENTION, ON NE FINIT PAS SUR LE PREMIER < AFIN DE POUVOIR SYSTEMATIQUEMENT TRAITER < UN TRIANGLE DU TYPE : < (A(X,Y),B(X-I,Y),C(X,Y-I)). GEN30: EQU $ PSR X ADR X,X < PASSAGE A UN INDEX FLOTTANT... FLD &ALIG PLR X BSR AROND < (A)=NIVEAU DU POINT COURANT (X,Y), < OU ALTITUDE DE CELUI-CI SUIVANT QUE < L'ON TRACE UNE TEXTURE, OU BIEN UNE < MONTAGNE VUE D'AVION... CPZ ITEXT < EST-CE UNE TEXTURE 2D OU 3D ??? JE GEN310 < CAS D'UNE MONTAGNE VUE D'AVION... IF NEXIST-K,,XEIF%, IF ATTENTION : LE TEST CI-DESSUS EST IDIOT !!! XEIF%: VAL ENDIF < < < C A S D ' U N E T E X T U R E 2 D : < < IF EXIST-K,XEIF%,,XEIF% IF ATTENTION : LE TEST QUI SUIT EST IDIOT !!! XEIF%: VAL ENDIF CPZ TRONIV < DOIT-ON TRONQUER BRUTALEMENT ??? JNE GEN400 < OUI... < < CAS DE LA FONCTION < EN DENTS DE SCIE : < GEN401: EQU $ JAGE GEN402 NGR A,A < ABS(NIVEAU), GEN402: EQU $ CP F255 JLE GEN400 < ON DOIT ETRE DANS (0,255)... SB F511 < SINON, ON S'Y RAMENE... JMP GEN401 < ET ON ATTEND DE S'ETRE STABILISER... < < TRONCAGE : < GEN400: EQU $ CP MINNIV < ET VALIDATION : JL GEN314 < TROP PETIT : ON TRONQUE INFERIEUREMENT... CP MAXNIV < ET VALIDATION : JG GEN315 < TROP GRAND : ON TRONQUE SUPERIEUREMENT... GEN311: EQU $ BSR AGOTO WORD GEN312 < VERS LE MARQUAGE DE (X,Y) AVEC (A). GEN314: EQU $ LA MINNIV < (A)=NIVEAU PLANCHER, JMP GEN311 < VERS SON MARQUAGE... GEN315: EQU $ LA MAXNIV < (A)=NIVEAU PLAFOND, JMP GEN311 < VERS SON MARQUAGE... < < < C A S D ' U N E M O N T A G N E V U E D ' A V I O N : < < GEN310: EQU $ < < TEST DES OMBRE PORTEES : < IF NEXIST-K,,XEIF%, IF ATTENTION : LE TEST CI-DESSOUS EST IDIOT !!! XEIF%: VAL ENDIF CPZ IOMBRE < L'OMBRAGE EST-IL DEMANDE ??? JE GEN520 < NON, RIEN A FAIRE... CPZ PRAYON < OUI, ALORS EST-ON EN DEBUT DE LIGNE ??? JE GEN512 < OUI, IL FAUT INITIALISER 'PRAYON'... < < TEST DE VISIBILITE DU < POINT COURANT DEPUIS < LA SOUCE LUMINEUSE : < PSR A < SAUVEGARDE DE L'ORDONNEE DU "HAUT" DU < VECTEUR COURANT, NOTEE 'YC'. LR X,A < ABSCISSE, NOTEE 'XC', FLT FSB FXL < XC-XL, FMP PRAYON < ((YH-ZL)/(XH-XL))*(XC-XL), FAD FZL < ZL+((YH-ZL)/(XH-XL))*(XC-XL), CE QUI < DONNE LE SEUIL DE VISIBILITE DEPUIS LA < SOURCE LUMINEUSE, FIX LR A,B < (B)=PLUS PETITE ORDONNEE "HAUTE" D'UN < VECTEUR QUE L'ON VOIT DEPUIS 'S', PLR A < (A)=ORDONNEE "HAUTE" DU VECTEUR COURANT, CPR B,A < ALORS LE VECTEUR COURANT EST-IL VU < DEPUIS LA SOURCE LUMINEUSE ??? JL GEN510 < (A) < (B) : NON, IL EST EN-DESSOUS DU < SEUIL DE VISIBILITE... < < CAS OU L'ON EST VISIBLE < DEPUIS LA SOURCE LUMINEUSE, < OU BIEN DE LA PREMIERE < FOIS : < GEN512: EQU $ PSR A < RE-SAUVEGARDE DE L'ORDONNEE "HAUTE"... LR X,A < ABSCISSE (NOTEE 'XH') DU VECTEUR "MAXI- < MAL" COURANT, C'EST-A-DIRE VU DEPUIS LA < SOURCE LUMINEUSE, SACHANT QUE L'ON TRACE < DE DROITE A GAUCHE... FLT FSB FXL < XH-XL, #/FST# FWORK < ET SAVE... PLR A < YH, FLT FSB FZL < YH-ZL, FDV FWORK < (YH-ZL)/(XH-XL), #/FST# PRAYON < PRAYON=(YH-ZL)/(XL-XH). #/FLD# FNIVMX < (A,B)=NIVEAU LUMINEUX MAXIMAL PUIQU'ON < EST VU, DONC AU SOLEIL... JMP GEN511 < VERS LA MISE EN PLACE DE 'FNIVC'... < < CAS OU L'ON EST INVISIBLE < DEPUIS LA SOURCE LUMINEUSE : < GEN510: EQU $ SBR B,A NGR A,A < (A)=DISTANCE D'INVISIBILITE (STRICTE- < MENT POSITIVE). CP NPENOM < EST-ON DANS LA PENOMBRE ??? JL GEN533 < OUI, IL FAUT INTERPOLER POUR OBTENIR < LE NIVEAU MAXIMAL... #/FLD# FNIVOM < NON, OU BIEN ON NE CALCULE PAS LA < PENOMBRE : < (A,B)=VALEUR DU DECREMENT DU NIVEAU < MAXIMAL D'ECLAIRAGE POUR PASSER < DANS LA ZONE D'OMBRE... JMP GEN534 GEN533: EQU $ FLT < (A,B)=DISTANCE D'INVISIBILITE, FDV FPENOM < (A,B)=VALEUR ABSOLUE DU DECREMENT DU < NIVEAU MAXIMAL D'ECLAIRAGE DANS LA < LA ZONE DE PENOMBRE COURANTE... GEN534: EQU $ FAD FNIVMX < (A,B)=NIVEAU LUMINEUX MAXIMAL DE LA < ZONE D'OMBRE OU DE PENOMBRE DANS < LAQUELLE ON SE SITUE... < < MISE EN PLACE DE 'FNIVC' : < GEN511: EQU $ #/FST# FNIVC GEN520: EQU $ < < GENERATION DE LA NORMALE "HAUTE" : < < < CALCUL : < ON CONSIDERE LA FACETTE TRIANGULAIRE : < (A(X,Y,Z(A)),B(X-I,Y,Z(B)),C(X,Y-I,Z(C))), < ELLE DEFINIT UN PLAN D'EQUATION : < < I X-XA Y-YA Z-ZA I < I XB-XA YB-YA ZB-ZA I = 0 < I XC-XA YC-YA ZC-ZA I < < SOIT, PAR DEFINITION : < < I X-XA Y-YA Z-ZA I < I -1 0 ZB-ZA I = 0 < I 0 -1 ZC-ZA I < < LA NORMALE DE CETTE FACETTE EST < DONC LE VECTEUR DE COORDONNEES : < < ((ZB-ZA),(ZC-ZA),1). < PSR X ADR X,X < PASSAGE A UN INDEX FLOTTANT... ADRI -DFLOT,X FLD &ALIG < Z(B), ADRI DFLOT,X FSB &ALIG < Z(B)-Z(A), #/FST# FXN < X(N)=Z(B)-Z(A). FLD &ALIGM1 < Z(C), FSB &ALIG < Z(C)-Z(A), #/FST# FYN < Y(N)=Z(C)-Z(A). < NOTA : Z(N) VAUT TOUJOURS 2... < < PASSAGE DU RESEAU TRIANGULAIRE < AU RESEAU CARRE DE BASE : < < < CALCUL : < ON CONSIDERE LA FACETTE TRIANGULAIRE : < (D(X-I,Y-I,Z(D)),B(X-I,Y,Z(B)),C(X,Y-I,Z(C))), < ELLE DEFINIT UN PLAN D'EQUATION : < < I X-XD Y-YD Z-ZD I < I XB-XD YB-YD ZB-ZD I = 0 < I XC-XD YC-YD ZC-ZD I < < SOIT, PAR DEFINITION : < < I X-XD Y-YD Z-ZD I < I 0 1 ZB-ZD I = 0 < I 1 0 ZC-ZD I < < LA NORMALE DE CETTE FACETTE EST < DONC LE VECTEUR DE COORDONNEES : < < ((ZC-ZD),(ZB-ZD),-1), < < OU EN INVERSANT L'ORIENTATION : < < (-(ZC-ZD),-(ZB-ZD),1). < < ENFIN, ON FAIT LA MOYENNE ENTRE < CETTE NORMALE (-(ZB-ZD),-(ZC-ZD),1), < ET LA NORMALE CALCULEE PRECEDEMMENT... < FLD &ALIGM1 < Z(C), ADRI -DFLOT,X FSB &ALIGM1 < Z(C)-Z(D), FSB FXN < -X(N)+(Z(C)-Z(D)), FNEG #/FST# FXN < CE QUI DONNE X(N) SUR LA MAILLE CARREE. FLD &ALIG < Z(B), FSB &ALIGM1 < Z(B)-Z(D), FSB FYN < -Y(N)+(Z(B)-Z(D)), FNEG #/FST# FYN < CE QUI DONNE Y(N) SUR LA MAILLE CARREE. < NOTA : Z(N) VAUT TOUJOURS 2... ADRI DFLOT,X < ET RETOUR SUR LE POINT 'A'... < < CALCUL DE L'INTENSITE LUMINEUSE "HAUTE" : < PLR X < RESTAURATION DE LA COORDONNEE 'X'... BSR AINTEN < (A,B)=INTENSITE LUMINEUSE "HAUTE", < < MARQUAGE DU POINT (X,Y) : < BSR AROND < (A)=NIVEAU VU D'AVION... GEN312: EQU $ CPZ IBANDE < EN FAIT DOIT-ON ECRIRE UNE BANDE ??? JNE GEN80 < OUI, PAS D'IMAGE... < < OUI, ON GENERE UNE IMAGE : < BSR APOINT < MARQUAGE DU POINT (X,Y) AVEC LE < NIVEAU (A)... GEN80: EQU $ GEN713: EQU $ < < PASSAGE AU POINT SUIVANT : < GEN32: EQU $ ADRI -I,X < REGRESSION DE L'ABSCISSSE, LR X,A CPI W < EST-ON EN DEBUT DE LIGNE ??? < ET CE AFIN DE POUVOIR TRAITER DES TRIAN- < GLES DU TYPE : < (A(X,Y),B(X-I,Y),C(X,Y-I))... JL GEN31 < OUI, ON ABANDONNE... BSR AGOTO WORD GEN30 < NON, ON CONTINUE LE TRACE... GEN31: EQU $ < < "ROTATION" DES BUFFERS DE LIGNES : < GEN50: EQU $ LA ALIGM1 < LIGNE PRECEDENTE, XM ALIGP2 < QUI EST ECRASEE... XM ALIGP1 < LA LIGNE SUIVANTE-SUIVANTE DEVIENT LA < LIGNE SUIVANTE, XM ALIG < LA LIGNE SUIVANTE DEVIENT LA LIGNE < COURANTE, STA ALIGM1 < ET LA LIGNE COURANTE DEVIENT LA LIGNE < PRECEDENTE... < < < P O U R S U I T E D E L A G E N E R A T I O N : < < GEN20: EQU $ ADRI I,Y < PASSAGE A LA LIGNE SUIVANTE : LR Y,A CP VECTNL < EST-ON AU BOUT DE L'IMAGE ??? JG GEN40 < OUI, C'EST FINI... BSR AGOTO WORD GEN01 < NON... GEN40: EQU $ BSR ATSFLO CPZ IBANDE < A-T'ON GENERE UNE BANDE ??? JE GEN41 < NON... LAD DEMMTM SVC < OUI, ON ECRIT UN 'TAPE-MARK'... GEN41: 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,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 AMPLIR FLOAT 1.5 < AMPLIFICATEUR DE LA FONCTION. $EQU MOYENE FLOAT <NIV256/XXXMOY<K<K < VALEUR MOYENNE DE LA FONCTION. $EQU EXPOP FLOAT 0.9 < EXPOSANT DE DECROISSANCE DE PONDERATION. $EQU PASIX0 WORD 200 < PAS INITIAL SUR 'OX'. $EQU PASIY0 WORD 200 < PAS INITIAL SUR 'OY'. $EQU MRECUR WORD 32 < PROFONDEUR MAXIMALE DE RECURENCE. $EQU GRAINE WORD 4660 < GRAINE DU GENERATEUR ALEATOIRE. $EQU SUPRDN NTRN WORD XXN255/XXXMOY < SUP(RDN). TRN $EQU INFRDN NTRN WORD -XXN255/XXXMOY < INF(RDN). TRN $EQU MAXNIV WORD XXN255 < NIVEAU MAXIMAL AUTORISE... $EQU MINNIV WORD XXNOIR < NIVEAU MINIMAL AUTORISE... $EQU FXL FLOAT 1000 < X(SOURCE LUMINEUSE). $EQU FYL FLOAT 0 < Y(SOURCE LUMINEUSE). $EQU FZL FLOAT 400 < Z(SOURCE LUMINEUSE). $EQU ALPHA FLOAT 0.5 < CONSTANTE D'ELIMINATION DES PICS. $EQU PASQ WORD W < PAS DE PARCOURS DE LA SPIRALE, $EQU NPM WORD 15 < NOMBRE DE POINTS DE CHAQUE SPIRALE. $EQU XCTCDA WORD TV1 < POUR ATTEINDRE L'IMAGE 'TV1'... $EQU PONRDN FLOAT <W<K<K < CONTRIBUTION DE LA GENERATION ALEATOIRE, $EQU PONSPI FLOAT <K<K<K < CONTRIBUTION DES SPIRALES. $EQU NPENOM WORD 12 < LARGEUR DE LA ZONE DE PENOMBRE. 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