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 :
<
AMPLI: FLOAT <NILK<NILK<NILK < MULTIPLICATEUR 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.
NMM: WORD NILK < NOMBRE DE POINTS DES SPIR-MAPS GENEREES
< A PARTIR DES IMAGES 'TV1'/'TV2'.
EXPOP0: 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).
AMPLIR: FLOAT <NILK<NILK<NILK < AMPLIFICATEUR DES VALEURS ALEATOIRES
< CORRELEES...
MAXNIV: WORD NILK < MAXIMUM DES NIVEAUX TRACES,
MINNIV: WORD NILK < MINIMUM DES NIVEAUX TRACES.
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...
IALIAS: WORD NEXIST < FAIRE ('EXIST') OU PAS ('NEXIST') UN
< TRAITEMENT ANTI-ALIASING...
IBANDE: WORD NEXIST < CHOIX DU MODE D'"ENTREE" DE LA FONCTION :
< 'NEXIST' : ELLE EST CALCULEE A PARTIR
< DE LA FORMULE ALEATOIRE RECUR-
< SIVE,
< 'EXIST' : ELLE EST LUE SUR BANDE, ET
< ALORS ON A INTERET A FAIRE :
< (ALPHA)=0...
ABLOC0: WORD K < NUMERO DU PREMIER BLOC A LIRE SUR LA
< BANDE MAGNETIQUE.
< NOTA : SI (ABLOC0)<0 : ON TRAVAILLE EN
< SEQUENTIEL STRICT, SANS JAMAIS RE-
< INITIALISER L'ADRESSE COURANTE
< SUR LA BANDE...
IDEPTH: WORD NEXIST < FAIRE ('EXIST') OU PAS ('NEXIST') DU
< "DEPTH-CUEING" CONSISTANT A MODULER LES
< NIVEAUX PAR LA PROFONDEUR DE LA SCENE...
< NOTA : CETTE OPTION N'EST PRISE EN
< COMPTE QUE S'IL Y A "OMBRES PORTEES",
< C'EST-A-DIRE SI : (IOMBRE)='EXIST'...
TRDNX: WORD K < TRANSLATION EN 'X' DU CHAMP RDN,
TRDNY: WORD K < TRANSLATION EN 'Y' DU CHAMP RDN.
IRDNRC: WORD NEXIST < GENERER ('EXIST') ALEATOIREMENT LE
< NOMBRE D'ITERATIONS DE LA FONCTION
< 'NRECUR' OU PAS ('NEXIST').
GRAINR: WORD NILK < GRAINE DU GENERATEUR DE 'NRECUR'...
INFREC: WORD NILK < BORNE INFERIEURE DE 'NRECUR',
SUPREC: WORD NILK < BORNE SUPERIEURE DE 'NRECUR' LORSQUE
< CELUI-CI EST GENERE ALEATOIREMENT...
IMODTV: WORD NEXIST < MODULER ('EXIST') OU NE PAS MODULER
< ('NEXIST') L'INTENSITE LUMINEUSE MAXI-
< MALE PAR L'IMAGE 'TV2' ; CETTE OPTION
< N'A DE SENS QUE SI (IOMBRE)='EXIST'...
FH: FLOAT <NILK<NILK<NILK < POUR DEFINIR LA FONCTION DE MODULATION
< DU "DEPTH-CUEING" ; EN EFFET, ON CAL-
< CULE UN NOMBRE 'X' APPARTENANT A (0,255)
< FONCTION DE LA PROFONDEUR PAR RAPPORT
< A L'ECRAN. ENSUITE CET 'X' EST MODULE
< PAR UNE FONCTION LINEAIRE :
< Y=(255-'FH')*X/255+'FH', AVEC 'FH' DANS (
< 'Y' EST DONC DANS (FH,255) ; ET :
< SI FH=0 : "DEPTH-CUEING" MAXIMAL,
< SI FH=1 : PAS DE "DEPTH-CUEING"...
IVIDEO: WORD NEXIST < ECRIRE ('EXIST') L'IMAGE COURANTE SUR LE
< DISQUE VIDEO OU PAS ('NEXIST').
IQUIT: WORD EXIST < S'ARRETER ('EXIST') OU PAS ('NEXIST')
< APRES CHAQUE IMAGE (POINT D'ARRET).
IPERS: WORD EXIST < TRACER EN PERSPECTIVE ('EXIST') OU EN
< VUE D'AVION ('NEXIST').
FPERSB: FLOAT <NILK<NILK<NILK < CONSTANTE PERMETTANT DE SIMULER UNE
< "FUITE" DE LA PERSPECTIVE : EN EFFET,
< ON MULTIPLIERA LES NIVEAUX CALCULES PAR
< LA FONCTION :
< (1-B)*Y/255+B, OU 'B' EST 'FPERSB' ; DE
< PLUS, ON CHOISIRA 'B' DANS (0,1) ; AVEC
< B=1, IL N'Y AURA PAS DE FUITE...
ITEXTU: WORD NEXIST < DOIT-ON ('EXIST') OU PAS ('NEXIST')
< TEXTURER LA MONTAGNE AVEC UNE FONCTION
< ALEATOIRE RAN(X,Y,Z) ???
SCOUCH: WORD NILK < SEUIL DONNANT LE NIVEAU FRONTIERE ENTRE
< L'EXTERIEUR ET L'INTERIEUR DE LA SUR-
< FACE ALEATOIRE.
AMPLYR: FLOAT <NILK<NILK<NILK < AMPLYFICATEUR DU RESULTAT FINAL.
MOYENF: FLOAT <NILK<NILK<NILK < VALEUR MOYENFE DU RESULTAT FINAL.
MAXREK:: VAL MAXREC < VALEUR MAXIMALE DE 'NREKUR'...
MREKUR: WORD NILK < NOMBRE DE REKURSIONS MAXIMAL LORS DE LA
< SOMMATION DES FUNCTION ALEATOIRES.
EXPOQ0: FLOAT <NILK<NILK<NILK < EXPOSANT DE CALCUL DES EXPONENTIELLES.
PAZIX0: WORD NILK < PAZ SUR OX,
PAZIY0: WORD NILK < PAZ SUR OY,
PAZIZ0: WORD NILK < PAZ SUR OZ.
GRAINF: WORD NILK < GRAINF DE 'RAN'...
SUPRAN: WORD NILK < SUP(RAN),
INFRAN: WORD NILK < INF(RAN).
TRONIV: WORD NEXIST < TRONQUER BRUTALEMENT ('EXIST') OU UTILI-
< SER UNE FUNCTION EN DENTS DE SCIE
< ('NEXIST') POUR LES VALEURS DU CHAMP...
NFUNCT: WORD NEXIST < INDICATEUR DE MODULATION DE LA FUNCTION
< 'RAN' CALCULEE :
< 'NEXIST' : PAZ DE MODULATION,
< TOUTE AUTRE VALEUR INDEXE UNE FUNCTION
< DE MODULATION TELLE 'FGAUSS'...
FGAUSS:: VAL EXIST < INDEX DE LA MODULATION GAUSSIENNE QUI
< VA CENTRER LA GENERATION AU CENTRE DU
< CUBE VISUALISE...
TRANX: WORD K < TRANSLATION EN 'X' DU CHAMP RAN,
TRANY: WORD K < TRANSLATION EN 'Y' DU CHAMP RAN,
TRANZ: WORD K < TRANSLATION EN 'Z' DU CHAMP RAN.
IALEAT: WORD EXIST < LA TEXTURE SERA-T'ELLE ALEATOIRE
< ('EXIST') OU UTILISERA-T'ELLE UNE
< COMBINAISON LINEAIRE DES COORDONNEES
< (XS,YS,ZS) ('NEXIST'), DONT LES COEF-
< FICIENTS SUIVENT :
FALTX: FLOAT <NILK<NILK<NILK < COEFFICIENT DE 'XS',
FALTY: FLOAT <NILK<NILK<NILK < COEFFICIENT DE 'YS',
FALTZ: FLOAT <NILK<NILK<NILK < COEFFICIENT DE 'ZS',
FALTR: FLOAT <NILK<NILK<NILK < CONSTANTE DE TRANSLATION.
NDM: WORD NILK < NOMBRE DE POINTS DES SPIR-DEPS GENEREES
< A PARTIR DES IMAGES 'TV1'/'TV2'.
FCOEFA: FLOAT <NILK<NILK<NILK < POUR PONDERER LA SOMME DES POINTS SUR
< UNE SPIR-DEP DE DEPLACEMENT VERTICAL.
FCOEFB: FLOAT <NILK<NILK<NILK < POUR PONDERER LES EXPOSANTS DES EXPO-
< NENTIELLES DE PONDERATION DES POINTS
< D'UNE SPIR-DEP DE DEPLACEMENT VERTICAL.
IMODMT: WORD NEXIST < N'A DE SENS QUE SI (IBANDE)='EXIST',
< C'EST-A-DIRE SI L'ON FAIT UNE ENTREE
< A PARTIR DE LA BANDE MAGNETIQUE ; ALORS,
< 'IMODMT' INDIQUE SI L'ON DOIT N'UTILISER
< ('NEXIST') QUE LE CONTENU DE LA BANDE,
< OU BIEN ('EXIST') SI L'ON DOIT SOMMER
< CE DERNIER A UNE CONTRIBUTION ALEATOIRE
< ET/OU SPIRALE...
FHOMO: FLOAT <NILK<NILK<NILK < POUR AGRANDIR OU REDUIRE HOMOTHETIQUEMENT
< LE CHAMP ALEATOIRE...
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'.
FIVMX7: FLOAT <NIVMX7<K<K < POUR MODULER L'INTENSITE LUMINEUSE
< MAXIMALE PAR L'IMAGE 'TV2'...
FHP: FLOAT <NILK<NILK<NILK < FHP=255*FH,
F255MH: FLOAT <NILK<NILK<NILK < F255MH=255-FHP.
<
< 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 < POUR NORMALISER LA FONCTION ALEATOIRE.
<
< DEFINITION DE LA GRILLE :
<
NRECUR: WORD NILK < NOMBRE COURANT DE RECURSIONS...
SRECUR: WORD NILK < ET SAUVEGARDE AU CAS OU EN FAIT 'NRECUR'
< EST CALCULE ALEATOIREMENT...
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...
PAGE
<
<
< L O C A L :
<
<
LOCAL
LOC: EQU $
<
< RELAIS MONTAGNEUX :
<
AFONCT: WORD FONCT < CALCUL DE LA FONCTION COURANTE.
AFONKT: WORD FONCT < IDEM LORS DES ENTREES BANDES ET SI L'ON
< A : (IMODMT)='EXIST'.
<
< 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)).
SUP64R: FLOAT <NILK<NILK<NILK < SUPREC/65536,
UNMISR: FLOAT <NILK<NILK<NILK < 1-(INFREC/SUPREC),
UNPISR: FLOAT <NILK<NILK<NILK < 32768*(1+INFREC/SUPREC)).
<
< 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: EQU F05 < 2 (PAR L'INTERMEDIAIRE DE SON INVERSE).
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 UNE VALEUR
< RDN(XS,YS,KITER,GRAINE).
APRDNR: WORD SPRDNR < GENERATEUR ALEATOIRE DONNANT UNE VALEUR
< RDN(XS,YS,GRAINR) ET UTILISE LORS DE LA
< GENERATION ALEATOIRE DE 'NRECUR'...
EXPOP: FLOAT <NILK<NILK<NILK < EXPOSANT COURANT...
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 XXNOIR+I < NIVEAU MINIMAL...
FNIVBA: FLOAT <NIVBAS<K<K < POUR ELIMINER LA GENERATION DE POINTS
< NOIRS...
INTENH: FLOAT <NILK<NILK<NILK < INTENSITE "HAUTE",
INTENB: FLOAT <NILK<NILK<NILK < INTENSITE "BASSE",
PINTEN: FLOAT <NILK<NILK<NILK < PAS D'INTERPOLATION DE L'INTENSITE...
< (DE "HAUT" VERS "BAS"...)
AINT: WORD INTH,X < ACCES A LA LISTE DES 'INTH' DE LA LIGNE
< COURANTE (Y+I),
AINTM1: WORD INTHM1,X < ACCES A LA LISTE DES 'INTH' DE LA LIGNE
< PRECEDENTE (Y).
<
< DONNEES DE L'ANTI-ALIASING :
<
ASEGV: WORD SEGV < SOUS-PROGRAMME DE TRACE D'UN SEGMENT
< VERTICAL (SERT AUSSI POUR LE MODE
< NON ANTI-ALIASING...).
LSTENH: FLOAT <NILK<NILK<NILK < MEMORISE 'INTENH' DU VECTEUR VERTICAL
< PRECEDENT.
LSTGY2: WORD NILK < MEMORISE 'VECGY2' DU VECTEUR VERTICAL
< PRECEDENT.
ALISTY: WORD LISTY,X < RELAI D'ACCES A LA LSITE DE DETECTION
< DES DISCONTINUITES : POUR CHAQUE ABSCISSE
< 'X', ELLE MEMORISE L'ORDONNEE 'Y' DU
< DERNIER VECTEUR VERTICAL TRACE...
ALNOVI: WORD LNOVI,X < RELAI VERS LA TABLE INVERSE DE 'LNIVO',
< ET QUI PERMET DE RETROUVER APPROXIMATI-
< VEMENT (CORRESPONDANCE NON BIJECTIVE...)
< LE NIVEAU CALCULE A PARTIR DU NIVEAU
< TRACE.
<
< 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 53 < 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 SPIR-MAP
< DE CALCUL D'UN SIGMA(X,Y) :
<
PASM: WORD NILK < PAS DE PARCOURS DE LA SPIR-MAP,
DELTAX: WORD NILK < VECTEUR TRANSLATION
DELTAY: WORD NILK < COMPLEXE COURANT.
LB: WORD NILK < LONGUEUR DES
LB0: WORD NILK < BRANCHES DE LA SPIR-MAP.
NP: WORD NILK < NOMBRE DE POINT COURANT,
FNMM: FLOAT <NILK<NILK<NILK < NOMBRE DE POINTS FLOTTANT DE LA SPIR-MAP.
<
< SIGMA(X,Y) SUR UNE SPIR-MAP :
<
F2:: FLOAT <XXXMOY<K<K
F4:: FLOAT <XXXMOY*XXXMOY<K<K
CUMUL: WORD NILK < SIGMA(NIVEAU(X,Y)).
ASPIRM: WORD SPIRAM < SOUS-PROGRAMME DE CALCUL DE 'CUMUL'...
<
< DEFINITION DE LA SPIR-DEP
< DE CALCUL D'UN SIGMA(X,Y) :
<
XWOR%1: VAL XXXMOY=K
XWOR%1: VAL -XWOR%1
XCENTR: WORD NPOLM1>XWOR%1 < DEFINITION DU
YCENTR: WORD NLIGM1>XWOR%1 < CENTRE DE 'TV1'/'TV2'.
PASD: WORD NILK < PAS DE PARCOURS DE LA SPIR-DEP,
< NOTA : 'NP', 'DELTAX', 'DELTAY', 'LB' ET
< 'LB0' SONT COMMUNS AVEC LA SPIR-DEP DE CA
< DE L'IMAGE MAPPEE...
<
< SIGMA(X,Y) SUR UNE SPIR-DEP :
<
ALCOEF: WORD LCOEF,X < RELAI D'ACCES A LA LISTE DES COEFFICIENTS
< DE PONDERATION DES SPIR-DEPS...
FCOEFC: FLOAT <NILK<NILK<NILK < SIGMA(COEFFICIENTS)/FCOEFA.
FCUMUL: FLOAT <NILK<NILK<NILK < SIGMA(NIVEAU(X,Y)).
ASPIRD: WORD SPIRAD < SOUS-PROGRAMME DE CALCUL DE 'CUMUL'...
<
< PARTICIPATIONS RELATIVES DE
< LA GENERATION ALEATOIRE ET
< DE LA SOMMATION SUR UNE
< SPIR-MAP CENTREE EN (256,256) :
<
PONRDN: FLOAT <NILK<NILK<NILK < CONTRIBUTION DE LA GENERATION ALEATOIRE,
PONSPI: FLOAT <NILK<NILK<NILK < CONTRIBUTION DES SPIR-MAPS.
<
<
< 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;XFMTRA < DEMANDE DE LECTURE A ACCES DIRECT.
WORD BUFMT=FCTA*NOCMO
WORD LBUFMT
WORD NILK < ADRESSE DU BLOC COURANT.
IBUFMT: WORD LBUFMT-Z+I < INDEX COURANT DU BUFFER 'MT',
ZBUFMT: WORD LBUFMT-Z+I < ET POUR FORCER LA LECTURE DU PREMIER
< BLOC DE CHAQUE IMAGE...
ABUFMT: WORD BUFMT,X < ET RELAI D'ACCES...
<
< "CADRAGE" DES OCTETS :
<
TRANMT: FLOAT <NILK<NILK<NILK < TRANSLATION ET
MULTMT: FLOAT <NILK<NILK<NILK < MISE A L'ECHELLE...
<
< TRANSLATION DE LA FUNCTION :
<
ICOUCH: WORD NILK < VAUT F(SCOUCH) SUIVANT LA MODULATION
< DE RAN(X,Y,Z), VOIR A CE PROPOS LES
< FUNCTIONS DU TYPE 'FGAUS'...
<
< MISE D'UN NIVEAU DANS (MINNIV,MAXNIV) :
<
F255: WORD XXN255
F511: WORD NIV256+NIV256-Z
APNIV: WORD PNIV < SOUS-PROGRAMME DE MISE DANS (MINNIV,
< MAXNIV).
<
< VARIABLES TEXTUREUSES :
<
ZS: WORD NILK < AFIN DE COMPLETER (XS,YS)...
HXS: FLOAT <NILK<NILK<NILK < COORDONNEES
HYS: FLOAT <NILK<NILK<NILK < ABSOLUES
HZS: FLOAT <NILK<NILK<NILK < DU POINT COURANT.
FKUMR: FLOAT <NILK<NILK<NILK < SIGMA DES FUNCTIONS ALEATOIRES
< SCALANTES.
FPONT: FLOAT <NILK<NILK<NILK < POUR LES PONDERER...
FPONT0: FLOAT <NILK<NILK<NILK < VALEUR INITIALE DE LA PONDERATION :
< FPONT0=RAC(PAZIX*PAZIY).
RENORN: FLOAT <NILK<NILK<NILK < DONNE LE SIGMA DES 'FPONT' SCALANTS
< DIVISE PAR 'FPONT0', ET PERMET DE CAL-
< CULER LA FUNCTION ALEATOIRE DANS UN
< SEGMENT PREDETERMINE, ET QUI EST :
< (INFRAN*AMPLY*AMPLYR,SUPRAN*AMPLY*AMPLYR)
<
< RELAIS DE TEXTURAGE :
<
TEXTUR: WORD NILK < CONSTANTE DE TRANSLATION CALCULEE ET
< APPLIQUEE AU NIVEAU DES POINTS, CE QUI
< DEFINIT LA TEXTURE...
AFUNCT: WORD FUNCT < CALCUL DE LA FUNCTION COURANTE.
ANTEXT: WORD NTEXT < RELAI...
<
< DEFINITION DE LA GRILLE :
<
NREKUR: WORD NILK < NOMBRE COURANT DE REKURSIONS...
PAZIX: WORD NILK < PAZ SUR 'OX',
PAZIY: WORD NILK < PAZ SUR 'OY',
PAZIZ: WORD NILK < PAZ SUR 'OZ'.
FPAZIX: FLOAT <NILK<NILK<NILK < DE MEME
FPAZIY: FLOAT <NILK<NILK<NILK < EN
FPAZIZ: FLOAT <NILK<NILK<NILK < FLOTTANT...
AFNJV1: FLOAT <NILK<NILK<NILK
AFNJV2: FLOAT <NILK<NILK<NILK
AFNJV3: FLOAT <NILK<NILK<NILK
AFNJV4: FLOAT <NILK<NILK<NILK
AFNJV5: FLOAT <NILK<NILK<NILK
AFNJV6: FLOAT <NILK<NILK<NILK
AFNJV7: FLOAT <NILK<NILK<NILK
AFNJV8: FLOAT <NILK<NILK<NILK
KJTER: WORD NILK < COMPTAGE DES REKURSIONS...
<
< PARAMETRES DU GENERATEUR ALEATOIRE :
<
RAN: WORD 4397 < NOMBRE ALEATOIRE COURANT.
RAN1: WORD 5189 < CONSTANTE
RAN2: WORD 6791 < DE CALCUL DES
RAN3:: VAL 19 < NOMBRE ALEATOIRES...
RAN4: WORD 7993 < 2EME NOMBRE ALEATOIRE COURANT.
RAN5: WORD 4021
RAN6:: VAL 23
HJNCU: FLOAT <NILK<NILK<NILK < POUR
HJNCV: FLOAT <NILK<NILK<NILK
HJNCW: FLOAT <NILK<NILK<NILK < L'INTERPOLATION...
HJNCU1: FLOAT <NILK<NILK<NILK < HJNCU1=1-HJNCU,
HJNCV1: FLOAT <NILK<NILK<NILK < HJNCV1=1-HJNCV,
HJNCW1: FLOAT <NILK<NILK<NILK < HJNCW1=1-HJNCW.
GSUP: FLOAT <NILK<NILK<NILK < 'SUPRAN' EN FLOTTANT,
GINF: FLOAT <NILK<NILK<NILK < 'INFRAN' EN FLOTTANT.
ZUP64: FLOAT <NILK<NILK<NILK < SUP/65536,
UNMJS: FLOAT <NILK<NILK<NILK < 1-(INF/SUP),
UNPJS: FLOAT <NILK<NILK<NILK < 32768*(1+(INF/SUP)).
F3: FLOAT <DIMGRA<K<K < POUR CALCULER UNE RACINE CUBIQUE (PASSA-
< D'UN VOLUME A UNE DIMENSION...).
AMPLY: FLOAT <NILK<NILK<NILK < AMPLYFICATEUR DU SIGMA DES 'FPONT'
< CALCULE A PARTIR DE 'NREKUR'.
XAMPLY:: VAL 31 < POUR CALCULER 'KAMPLY'...
KAMPLY: FLOAT <XAMPLY-I<K<K < POUR CALCULER 'AMPLY' A PARTIR DE
< 'NREKUR'...
ASPRAN: WORD SPRAN < SOUS-PROGRAMME DE GENERATION ALEATOIRE
< TRI-DIMENSIONNELLE...
<
< DEFINITION DE LA MODULATION GAUSSIENNE :
<
TXGAUS: WORD NILK < TRANSLATION DES COORDONNEES 'X',
TYGAUS: WORD NILK < TRANSLATION DES COORDONNEES 'Y',
ZCOUCH:: VAL NIV256 < VALEUR MAXIMALE DE LA COORDONNEE 'Z' ;
< CETTE VALEUR EST LIEE A UNE UTILISATION
< EN MODE "DEPTH-CUEING"...
TZGAUS: WORD NILK < TRANSLATION DES COORDONNEES 'Z'.
DXGAUS: FLOAT <NILK<NILK<NILK < POUR "NORMALISER" (X-TX)**2,
DYGAUS: FLOAT <NILK<NILK<NILK < POUR "NORMALISER" (Y-TY)**2,
DZGAUS: FLOAT <NILK<NILK<NILK < POUR "NORMALISER" (Z-TZ)**2.
AEXPON: WORD EXPON < SOUS-PROGRAMME DE CALCUL D'UNE EXPO-
< NENTIELLE.
<
< PARTICIPATIONS RELATIVES DE
< LA GENERATION ALEATOIRE ET
< DE LA SOMMATION SUR UNE
< SPIR-MAP CENTREE EN (256,256) :
<
PONRAN: FLOAT <NILK<NILK<NILK < CONTRIBUTION DE LA GENERATION ALEATOIRE,
PONSPJ: FLOAT <NILK<NILK<NILK < CONTRIBUTION DES SPIR-MAPS.
<
< DONNEES DE TRANSCODAGE DES TEXTURES :
<
ALTIVO: WORD LTIVO,X < LISTE DE TRANSCODAGE.
FIV255: FLOAT <NIV256-Z<K<K < POUR OBTENIR UNE VALEUR DANS (0,1).
<
< RELAIS D'ACCES AUX LISTES
< DE DESCRIPTION DU MAILLAGE
< POUR LE TEXTURAGE TRI-DIMENSIONNEL :
<
ALPAZX: WORD LPAZX,X < RELAI D'ACCES A 'PAZIX' FLOTTANT,
ALPZIX: WORD LPZIX,X < RELAI D'ACCES A 'PAZIX' ENTIER.
ALPAZY: WORD LPAZY,X < RELAI D'ACCES A 'PAZIY' FLOTTANT,
ALPZIY: WORD LPZIY,X < RELAI D'ACCES A 'PAZIY' ENTIER.
ALPAZZ: WORD LPAZZ,X < RELAI D'ACCES A 'PAZIZ' FLOTTANT,
ALPZIZ: WORD LPZIZ,X < RELAI D'ACCES A 'PAZIZ' ENTIER.
ALPONT: WORD LPONT,X < RELAI D'ACCES A 'FPONT'.
<
< DONNEES DE "FUITE" :
<
FPERSA: FLOAT <NILK<NILK<NILK < FPERSA=(1-FPERSB)/255,
FPERSK: FLOAT <NILK<NILK<NILK < FPERSK=FPERSA*Y+FPERSB, OU 'Y' EST LA
< COORDONNEE 'Y'.
<
< 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-YL)/(XMAX-XL).
INCIX:: VAL -I < ON PARCOURT DONC LES LIGNES DE LA DROITE
< VERS LA GAUCHE...
<
< DONNEES DE PROJECTION :
<
TRX: WORD NILK < TRANSLATION EN 'X',
TRY: WORD NILK < TRANSLATION EN 'Y'.
PAGE
<
<
< G E S T I O N D U D I S Q U E - V I D E O :
<
<
BUFVIW: BYTE "J";KCR
XWOR%1: VAL '0000000@@@@(MOCD
XWOR%3: VAL $-BUFVIW*NOCMO
IF XWOR%1-K,XEIF%,,XEIF%
XWOR%3: VAL XWOR%3-W
XEIF%: VAL ENDIF
LBUFVW:: VAL XWOR%3 < LONGUEUR DE LA COMMANDE AU DISQUE
< VIDEO...
XWOR%2: VAL COSBT?XASSIM=FMASK(K?NVPVDK=FCINST
DEMVIW: BYTE XWOR%2;FAVW < COMMANDE DE L'ECRITURE SUR LE DISQUE
< VIDEO...
WORD BUFVIW=FCTA*NOCMO
WORD LBUFVW
BUFVIR: DZS W < BUFFER DE LECTURE DES ACQUITTEMENTS.
LBUFVR:: VAL $-BUFVIR*NOCMO
DEMVIR: BYTE XWOR%2;FAVR < LECTURE DES ACQUITTEMENTS DU DISQUE.
WORD BUFVIR=FCTA*NOCMO
WORD LBUFVR
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 S P O N D E R A T I O N S D E S
< P O I N T S D ' U N E S P I R - D E P D E
< D E P L A C E M E N T V E R T I C A L :
<
<
MAXNDM:: VAL 32 < NOMBRE DE POINTS MAX...
LCOEF: EQU $
DO MAXNDM
FLOAT <NILK<NILK<NILK
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
<
<
< T A B L E I N V E R S E D E ' L N I V O ' :
<
<
< NOTA :
< DANS LA MESURE OU PLUSIEURS
< NIVEAUX CALCULES PEUVENT DONNER
< NAISSANCE AU MEME NIVEAU TRACE,
< LA CORRESPONDANCE N'EST PAS BI-
< JECTIVE, ET DONC 'LNOVI' NE DON-
< QU'APPROXIMATIVEMENT L'INVERSE
< DE 'LNIVO'...
<
<
LNOVI: EQU $
DO XWOR%1
BYTE NILK;NILK
PAGE
<
<
< T A B L E D E T R A N S C O D A G E D E S T E X T U R E S :
<
<
< FONCTION :
< ON VA DECOUPER L'ESPACE DES TEXTURES
< EN 'N' BANDES DE 'BW' NIVEAUX DE LARGE,
< ET DONC TEL QUE : N*BW=256. PAR EXEMPLE
< S'IL N'Y A PAS DE TEXTURES (N=1), LA
< LARGEUR SERA : BW=256. SI L'ON SOUHAITE
< 4 TYPES DE TEXTURES, ON FERA BW=64, ET LES
< 4 TYPES UTILISERONT LES GROUPES DE NIVEAUX
< ('00,'3F), ('40,'7F), ('80,'BF) ET ('C0,'FF)
< EN SORTIE, ET ON REDUIRA LES NIVEAUX
< DISPONIBLES EN PRENANT : ND=4 ET NI=0.
<
<
< ARGUMENTS D'ASSEMBLAGE :
< BW=LARGEUR DES BANDES DE TEXTURAGE (256 SI PAS DE TEXTURE),
< TB=TRANSLATION DES NIVEAUX DE 'LTIVO'.
<
<
TB: @
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 'TB'...
XWOR%6: VAL XWOR%5=FCSIGN
XWOR%7: VAL XWOR%5(MSYMBN)MSYMBN=FCSIGN
IF XWOR%6*XWOR%7,XEIF%,,XEIF%
TB:: VAL XXNOIR < LE NIVEAU ITITIAL SERA LE NIVEAU NOIR.
XEIF%: VAL ENDIF
BW: @
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 'BW'...
XWOR%6: VAL XWOR%5=FCSIGN
XWOR%7: VAL XWOR%5(MSYMBN)MSYMBN=FCSIGN
IF XWOR%6*XWOR%7,XEIF%,,XEIF%
BW:: VAL NIV256 < UNE SEULE BANDE DE 256 NIVEAUX DE LARGE.
XEIF%: VAL ENDIF
LTIVO: 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.
X%3: VAL XWOR%3 < POUR REDUIRE LA LONGUEUR
X%4: VAL XWOR%4 < DU "...BYTE...".
NTRN
<*******************************************************************************
DO XWOR%1
BYTE K=FCDO)MFFFF+N-Z*NOCMO+X%3/BW*BW+TB;K=FCDO)MFFFF+N-Z*NOCMO+X%4/BW*BW+TB
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 D E T E X T U R A G E 3 D :
<
<
LPAZX: EQU $
NLS
DO MAXREK
FLOAT <NILK<NILK<NILK < 'PAZIX'.
LST
LPZIX: EQU $
NLS
DO MAXREK
WORD NILK
LST
LPAZY: EQU $
NLS
DO MAXREK
FLOAT <NILK<NILK<NILK < 'PAZIY',
LST
LPZIY: EQU $
NLS
DO MAXREK
WORD NILK
LST
LPAZZ: EQU $
NLS
DO MAXREK
FLOAT <NILK<NILK<NILK < 'PAZIZ'.
LST
LPZIZ: EQU $
NLS
DO MAXREK
WORD NILK
LST
LPONT: EQU $
NLS
DO MAXREK
FLOAT <NILK<NILK<NILK < 'FPONT'.
LST
PAGE
<
<
< T A B L E D E D E T E C T I O N D E S
< D I S C O N T I N U I T E S P O U R LE
< T R A I T E M E N T A N T I - A L I A S I N G :
<
<
LISTY: EQU $
DZS XC512
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
<
<
< L I S T E D E S I N T E N S I T E S H A U T E S :
<
<
INTH: EQU $
NLS
DO XC512
FLOAT <NILK<NILK<NILK < LIGNE COURANTE.
LST
INTHM1: EQU $
NLS
DO XC512
FLOAT <NILK<NILK<NILK < LIGNE PRECEDENTE.
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
NLS
XXXVEC: VAL XXVEC3 < DEFINITION DES PROGRAMMES VECTEUR 512...
CALL #SIP VECTEUR 512#
LST
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 $
<
< 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'.
<
< TEXTURAGE EVENTUEL :
<
CPZ ITEXTU < DOIT-ON TEXTURER ???
JE POINT1 < NON...
AD TEXTUR < OUI, ON TRANSLATE LE NIVEAU DU POINT,
BSR APNIV < ET ON LE MET DANS (MINNIV,MAXNIV)...
POINT1: EQU $
<
< MARQUAGE DU POINT :
<
BSR ASTORP < MARQUAGE : (X,Y) <-- (A)...
<
< ET RETOUR :
<
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
NLS
XXXPRO: VAL YYYGOT < 'YYYGOT'.
CALL #SIP UTILITAIRES#
XXXPRO: VAL YYYFLO < 'YYYFLO'.
CALL #SIP UTILITAIRES#
LST
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 :
<
<
< FONCTION :
< CE GENERATEUR EST UTILISE
< POUR LE CALCUL DES ALTITUDES
< ALEATOIRES.
<
<
< 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
<
<
< 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 :
<
<
< FONCTION :
< CE GENERATEUR EST UTILISE
< POUR LES CALCULS ALEATOIRES
< DE 'NRECUR'.
<
<
< ARGUMENT :
< (X,Y)=COORDONNEES DU POINT COURANT.
<
<
< RESULTAT :
< (A,B)=RDN(XS,YS,GRAINE).
<
<
SPRDNR: EQU $
<
< GENERATION ALEATOIRE :
<
LR X,A < (A)=COORDONNEE 'X',
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 GRAINR < D'OU F(GRAINF,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,
FLT < ON FLOTTE 'RDN',
<
< 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))).
<
FMP UNMISR < RDN*(1-(INF/SUP)),
FAD UNPISR < RDN*(1-(INF/SUP))+32768*(1+(INF/SUP)),
FMP SUP64R < (SUP/65536)*(...).
<
< ET RETOUR :
<
RSR
PAGE
<
<
< S O M M A T I O N S U R U N E S P I R - M A P
< 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).
<
<
SPIRAM: EQU $
<
< INITIALISATION DE LA SPIR-MAP :
<
PSR X,Y < SAUVEGARDE DU POINT (X,Y).
STZ CUMUL < CUMUL <-- 0.
STZ NP < NP=NOMBRE DE POINTS TRAITES.
LA PASM
STA DELTAX < DELTAX <-- +1,
STZ DELTAY < DELTAY <-- 0.
LAI W
STA LB0 < INITIALISATION DE LA LONGUEUR DU
< PREMIER BRAS DE LA SPIR-MAP.
<
< PARCOURS D'UN BRAS :
<
SPIRM1: EQU $
LA LB0
STA LB < LONGUEUR DU BRAS COURANT.
<
< TRAITEMENT DU POINT COURANT :
<
SPIRM2: EQU $
IC NP < COMPTAGE DES POINTS TRAITES :
LA NP
CP NMM < FINI ???
JG SPIRM3 < OUI...
LR X,A < NON, TEST DE LA COORDONNEE 'X' :
JAL SPIRM4 < LE POINT EST HORS-ECRAN...
CPI NPOLM1
JG SPIRM4 < HORS-ECRAN...
LR Y,A < TEST DE LA COORDONNEE 'Y' :
JAL SPIRM4 < HORS-ECRAN...
CPI NLIGM1
JG SPIRM4 < 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 SPIRM6 < 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 SPIRM6 < ET BIEN NON, CE N'EST PAS (X,Y)...
CPI NIVMX7 < ALORS ???
JLE SPIRM7 < ON A TROUVE (X,Y), ET 'TV1'/'TV2' EST
< LE MEME, ALORS :
< (A)=NIVEAU(X,Y)...
<
< ACCES REEL AU POINT (X,Y) :
<
SPIRM6: 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 :
<
SPIRM7: EQU $
PLR X,Y
AD CUMUL < ET
STA CUMUL < CUMULE...
<
< PARCOURS DE LA SPIR-MAP :
<
SPIRM4: 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 SPIRM2 < OK, IL EN RESTE...
CPZ DELTAX < NON, ON EST AU BOUT, FAUT-IL AUGMENTER
< LA LONGUEUR COURANTE DES BRANCHES ???
JNE SPIRM5 < NON (DX#0) ...
IC LB0 < OUI (DX=0) ...
SPIRM5: 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 SPIRM1 < VERS LA BRANCHE SUIVANTE
<
< GENERATION DU POINT (X,Y) :
<
SPIRM3: EQU $
PLR X,Y < RESTAURATION DU POINT COURANT (X,Y).
<
< NORMALISATION DU CUMUL :
<
LA CUMUL
FLT
FDV FNMM
RSR
PAGE
<
<
< S O M M A T I O N S U R U N E S P I R - D E P
< 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).
<
<
SPIRAD: EQU $
<
< INITIALISATION DE LA SPIR-DEP :
<
PSR X,Y < SAUVEGARDE DU POINT (X,Y).
#/FLD# F0
#/FST# FCUMUL < CUMUL <-- 0.
STZ NP < NP=NOMBRE DE POINTS TRAITES.
LA PASD
STA DELTAX < DELTAX <-- +1,
STZ DELTAY < DELTAY <-- 0.
LAI W
STA LB0 < INITIALISATION DE LA LONGUEUR DU
< PREMIER BRAS DE LA SPIR-DEP.
<
< PARCOURS D'UN BRAS :
<
SPIRD1: EQU $
LA LB0
STA LB < LONGUEUR DU BRAS COURANT.
<
< TRAITEMENT DU POINT COURANT :
<
SPIRD2: EQU $
IC NP < COMPTAGE DES POINTS TRAITES :
LA NP
CP NDM < FINI ???
JG SPIRD3 < OUI...
LR X,A < NON, TEST DE LA COORDONNEE 'X' :
JAL SPIRD4 < LE POINT EST HORS-ECRAN...
CPI NPOLM1
JG SPIRD4 < HORS-ECRAN...
LR Y,A < TEST DE LA COORDONNEE 'Y' :
JAL SPIRD4 < HORS-ECRAN...
CPI NLIGM1
JG SPIRD4 < 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 SPIRD6 < 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 SPIRD6 < ET BIEN NON, CE N'EST PAS (X,Y)...
CPI NIVMX7 < ALORS ???
JLE SPIRD7 < ON A TROUVE (X,Y), ET 'TV1'/'TV2' EST
< LE MEME, ALORS :
< (A)=NIVEAU(X,Y)...
<
< ACCES REEL AU POINT (X,Y) :
<
SPIRD6: 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 :
<
SPIRD7: EQU $
LX NP
ADRI -I,X
ADR X,X < (X)=INDEX FLOTTANT DU POINT COURANT...
FLT < FLOTTAGE DU NIVEAU CALCULE,
FMP &ALCOEF < PONDERATION,
FAD FCUMUL < ET
#/FST# FCUMUL < CUMUL...
PLR X,Y
<
< PARCOURS DE LA SPIR-DEP :
<
SPIRD4: 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 SPIRD2 < OK, IL EN RESTE...
CPZ DELTAX < NON, ON EST AU BOUT, FAUT-IL AUGMENTER
< LA LONGUEUR COURANTE DES BRANCHES ???
JNE SPIRD5 < NON (DX#0) ...
IC LB0 < OUI (DX=0) ...
SPIRD5: 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 SPIRD1 < VERS LA BRANCHE SUIVANTE
<
< GENERATION DU POINT (X,Y) :
<
SPIRD3: EQU $
PLR X,Y < RESTAURATION DU POINT COURANT (X,Y).
<
< NORMALISATION DU CUMUL :
<
#/FLD# FCUMUL
FDV FCOEFC
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 :
< (X,Y)=POINT COURANT.
<
<
< RESULTAT :
< (A,B)=((MOYENE)+(AMPLI)*F(XS,YS))*(CONTRIBUTION ALEATOIRE)+
< (F(SIGMA(NIVEAU(X,Y)))*(CONTRIBUTION DES SPIR-MAPS).
<
<
FONCT: EQU $
PSR X,Y < SAUVEGARDES...
<
< FLOTTAGE DU POINT COURANT :
<
LR X,A < COORDONNEE 'X' :
AD TRDNX < TRANSLATION EN 'X' DU GENERATEUR,
FLT
FMP FHOMO < HOMOTHETIE...
#/FST# GXS < COORDONNEE 'XS' DU POINT COURANT.
FIX
STA XS
LR Y,A < COORDONNEE 'Y' :
AD TRDNY < TRANSLATION EN 'Y' DU GENERATEUR,
FLT
FMP FHOMO < HOMOTHETIE...
#/FST# GYS < COORDONNEE 'YS' DU POINT COURANT.
FIX
STA YS
<
< DISCRIMINATION DES
< CONTRIBUTIONS ALEATOIRES
< ET DES SPIR-MAPS :
<
#/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
< SPIR-MAPS, 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 $
IF NEXIST-K,,XEIF%,
IF ATTENTION : LE TEST SUIVANT VA MERDER !!!
XEIF%: VAL ENDIF
CPZ IRDNRC < GENERE-T'ON 'NRECUR' ALEATOIREMENT ???
JNE FONCTA < OUI...
BSR AGOTO
WORD FONCTN < NON...
FONCTA: EQU $
<
<
< G E N E R A T I O N D E ' N R E C U R '
< 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 FONKTIONS
< ALEATOIRES SCALANTES...
<
< ITERATION POUR CHAQUE
< FONKTION ALEATOIRE :
<
STZ KITER < INITIALISATION DES RECURSIONS...
LXI K < (X)=INDEX DES RECURSIONS...
FONKT5: 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 FONKT3 < NON...
LA YS < PEUT-ETRE :
CPR A,Y < EST-ON EN UN NOEUD ???
JNE FONKT3 < NON, INTERPOLONS...
<
< CAS OU LE POINT (XS,YS)
< COURANT EST UN NOEUD :
<
BSR APRDNR < LE POINT COURANT EST UN NOEUD...
JMP FONKT4 < VERS L'ACCES A LA VALEUR DU NOEUD...
<
< CAS OU LE POINT (XS,YS)
< COURANT N'EST PAS UN NOEUD :
<
FONKT3: 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 APRDNR
#/FST# AFNIV1 < NIVEAU(XNOEUD,YNOEUD),
LA PASIX
ADR A,X
BSR APRDNR
#/FST# AFNIV2 < NIVEAU(XNOEUD+PASIX,YNOEUD),
LA PASIY
ADR A,Y
BSR APRDNR
#/FST# AFNIV3 < NIVEAU(XNOEUD+PASIX,YNOEUD+PASIY),
LA PASIX
SBR A,X
BSR APRDNR
#/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 FONKT8 < NON, ON PEUT DIVISER PAR LUI...
FCMZ HINCV < 'V' EST-IL NUL ???
JNE FONKT9 < NON, ON PEUT DIVISER PAR LUI...
QUIT XXQUIT < E R R E U R P R O G R A M M E ...
JMP FONKT7 < ET ON SORT...
<
< CAS OU 'V' EST NON NUL :
<
FONKT9: 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 FONKT7 < ET L'INTERPOLATION EST FINIE...
<
< CAS OU 'U' EST NON NUL :
<
FONKT8: 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 :
<
FONKT7: EQU $
<
< RESTAURATION DE (XS,YS) :
<
FONKT4: EQU $
PLR X
<
< CALCUL RECURSIF DE LA FONKTION :
<
FMP FPOND < ET ON PONDERE PAR LES 'FPOND'
< AFIN D'OBTENIR DES VALEURS ALEATOIRES
< DECROISSANTES STATISTIQUEMENT...
FAD FCUMR < QUE L'ON CUMULE,
#/FST# FCUMR < ON A AINSI EN CHAQUE POINT UNE SOMME
< DE FONKTION 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 SRECUR < EST-CE FINI ???
JGE FONKT2 < OUI, ON ARRETE LA...
BSR AGOTO
WORD FONKT5 < NON, ON CONTINUE...
FONKT2: EQU $
<
< FIN DE RECURSION :
<
#/FLD# FCUMR < (A,B)=SOMME DES FONCTION ALEATOIRES...
<
< 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))).
<
FMP UNMISR < RDN*(1-(INF/SUP)),
FAD UNPISR < RDN*(1-(INF/SUP))+32768*(1+(INF/SUP)),
FMP SUP64R < (SUP/65536)*(...).
BSR AROND
STA NRECUR < NOMBRE ALEATOIRE D'ITERATIONS...
FONCTN: 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...
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...
FMP RENORM < QUE L'ON NORMALISE...
<
< 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 SPIR-MAPS (256,256) :
<
FCMZ PONSPI < LES SPIR-MAPS 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 - D E P 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 SPIR-DEPS 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 ASPIRD < (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 ASPIRD < (A,B)=SIGMA(NIVEAU(X,Y)),
#/FST# FWORK < ET SAVE...
ADRI I,Y
BSR ASPIRD < (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 ASPIRD < (A,B)=SIGMA(NIVEAU(X,Y)),
#/FST# FWORK < ET SAVE...
ADRI I,X
BSR ASPIRD < (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 ASPIRD < (A,B)=SIGMA(NIVEAU(X,Y)),
#/FST# FWORK1
ADRI I,X
BSR ASPIRD < (A,B)=SIGMA(NIVEAU(X+1,Y)),
#/FST# FWORK2
ADRI I,Y
BSR ASPIRD < (A,B)=SIGMA(NIVEAU(X+1,Y-1)),
#/FST# FWORK
ADRI -I,X
BSR ASPIRD < (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 "SPIR-DEP" :
<
FONC09: EQU $
FMP PONSPI < ET CONTRIBUTION DES SPIR-DEPS...
<
<
< 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 SPIR-DEPS.
FONCT0: EQU $
<
< HOMOTHETIE :
<
FMP FHOMO
<
< RETOUR :
<
PLR 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 :
< (X,Y,W)=COORDONNEES DU POINT COURANT.
<
<
< RESULTAT :
< (A,B)=RAN(XS,YS,ZS,KJTER,GRAINF).
<
<
SPRAN: EQU $
<
< GENERATION ALEATOIRE :
<
LR X,A < (A)=COORDONNEE 'X',
MP KJTER < ON UTILISE 'KJTER' AFIN DE FAIRE
< VARIER LA GENERATION ALEATOIRE A (X,Y)
< CONSTANT SUIVANT LE NIVEAU DE REKUR-
< SIVITE...
EORR B,A < ET ON SE RAMENE SUR UN MOT...
STA FWORK4 < SAVE F1(XS)...
LR Y,A < (A)=COORDONNEE 'Y',
EOR RAN1 < ??!???!
STA FWORK5 < SAVE F2(YS)...
MP FWORK4 < ET ON CONSTRUIT
XR A,B < UNE FUNCTION 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
EORR W,A < ET ON RAJOUTE LA TROISIEME COORDONNEE...
MP GRAINF < D'OU F(GRAINF,KJTER,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 'RAN' A L'ECHELLE
< CALCULER L'EXPRESSION :
<
< (SUP/(-32768))*(-RAN/2+16384+(RAN/2-16384)*(INF/SUP)),
<
< QUI SE SIMPLIFIE EN :
<
< (SUP/65536)*(RAN*(1-(INF/SUP))+32768*(1+(INF/SUP))).
<
FLT < ON FLOTTE 'RAN',
FMP UNMJS < RAN*(1-(INF/SUP)),
FAD UNPJS < RAN*(1-(INF/SUP))+32768*(1+(INF/SUP)),
FMP ZUP64 < (SUP/65536)*(...).
<
< ET SORTIE :
<
RSR
PAGE
<
<
< C A L C U L D ' U N E T E X T U R E 3 D P A R
< 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 :
< (X,Y,W)=COORDONNEES DU POINT COURANT.
<
<
< RESULTAT :
< (TEXTUR)=((MOYENF)+(AMPLY)*F(XS,YS,ZS))*(CONTRIBUTION ALEAT
< (F(SIGMA(NIVEAU(X,Y)))*(CONTRIBUTION DES SPIR-MA
<
<
FUNCT: EQU $
PSR A,B < SAUVEGARDES...
PSR X,Y,W < SAUVEGARDES...
<
< FLOTTAGE DU POINT COURANT :
<
LR X,A < COORDONNEE 'X' :
AD TRANX < TRANSLATION EN 'X' DU GENERATEUR,
FLT
FMP FHOMO
#/FST# HXS < COORDONNEE 'XS' DU POINT COURANT.
FIX
STA XS
LR Y,A < COORDONNEE 'Y' :
AD TRANY < TRANSLATION EN 'Y' DU GENERATEUR,
FLT
FMP FHOMO
#/FST# HYS < COORDONNEE 'YS' DU POINT COURANT.
FIX
STA YS
LR W,A < COORDONNEE 'Z' :
AD TRANZ < TRANSLATION EN 'Z' DU GENERATEUR,
FLT
FMP FHOMO
#/FST# HZS < COORDONNEE 'ZS' DU POINT COURANT.
FIX
STA ZS
<
< CHOIX DU TYPE DE TEXTURE :
<
CPZ IALEAT < EST-ELLE ALEATOIRE ???
JNE FUNCT8 < OUI...
<
< CAS D'UNE TEXTURE QUI EST
< EN FAIT UNE COMBINAISON
< LINEAIRE DES COORDONNEES
< (XS,YS,ZS), CE QUI PERMET
< PAR EXEMPLE DE NE PRENDRE
< EN COMPTE QUE 'ZS'
< ET FAIRE AINSI DES LIGNES DE NIVEAUX :
<
#/FLD# FXS < XS,
FMP FALTX < FALTX*XS,
BSR ASFWOR
#/FLD# FYS < YS,
FMP FALTY < FALTY*YS,
BSR APFWOR < FALTX*XS+FALTY*YS,
#/FLD# FZS < ZS,
FMP FALTZ < FALTZ*ZS,
BSR APFWOR < FALTX*XS+FALTY*YS+FALTZ*ZS,
FAD FALTR < FALTX*XS+FALTY*YS+FALTZ*ZS+FALTR.
PLR X,Y,W < RESTAURATIONS,
BSR AGOTO
WORD FUNCT7 < ET VERS LA SORTIE...
<
< DISCRIMINATION DES
< CONTRIBUTIONS ALEATOIRES
< ET DES SPIR-MAPS :
<
FUNCT8: EQU $
#/FLD# PONRAN < (A,B)=PONDERATION ALEATOIRE :
FCAZ < EXISTE-T'ELLE ???
JNE FUNCT1 < OUI, ALLONS LA CALCULER...
BSR AGOTO
WORD FUNCT6 < NON, ALLONS VERS LA CONTRIBUTION DES
< SPIR-MAPS, 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 :
<
<
FUNCT1: 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# FKUMR < INITIALISATION DU CUMUL DES FUNCTIONS
< ALEATOIRES SCALANTES...
<
< ITERATION POUR CHAQUE
< FUNCTION ALEATOIRE :
<
STZ KJTER < INITIALISATION DES REKURSIONS...
LXI K < (X)=INDEX DES REKURSIONS...
FUNCT5: EQU $
IC KJTER < COMPTAGE DES REKURSIONS...
<
< INITIALISATION DU MAILLAGE :
<
LA &ALPZIX
STA PAZIX < 'PAZIX' ENTIER,
LA &ALPZIY
STA PAZIY < 'PAZIY' ENTIER,
LA &ALPZIZ
STA PAZIZ < 'PAZIZ' ENTIER.
PSR X
ADR X,X < PAZSAGE A UN INDEX FLOTTANT...
FLD &ALPAZX
#/FST# FPAZIX < 'PAZIX' FLOTTANT,
FLD &ALPAZY
#/FST# FPAZIY < 'PAZIY' FLOTTANT.
FLD &ALPAZZ
#/FST# FPAZIZ < 'PAZIZ' FLOTTANT.
FLD &ALPONT
#/FST# FPONT < 'FPONT'.
<
< REKHERCHE DU NOEUD
< VOISIN PAR "DEFAUT" :
<
LA XS
SARD NBITMO
DV PAZIX
MP PAZIX
LR B,X < X(NOEUD BAS-GAUCHE) DE LA MAILLE
< COURANTE,
LA YS
SARD NBITMO
DV PAZIY
MP PAZIY
LR B,Y < Y(NOEUD BAS-GAUCHE) DE LA MAILLE
< COURANTE.
LA ZS
SARD NBITMO
DV PAZIZ
MP PAZIZ
LR B,W < Z(NOEUD BAS-GAUCHE) DE LA MAILLE
< COURANTE.
LA XS
CPR A,X < EST-ON EN UN NOEUD ???
JNE FUNCT3 < NON...
LA YS < PEUT-ETRE :
CPR A,Y < EST-ON EN UN NOEUD ???
JNE FUNCT3 < NON, INTERPOLONS...
LA ZS < PEUT-ETRE :
CPR A,W < EST-ON EN UN NOEUD ???
JNE FUNCT3 < NON, INTERPOLONS...
<
< CAS OU LE POINT (XS,YS,ZS)
< COURANT EST UN NOEUD :
<
BSR ASPRAN < LE POINT COURANT EST UN NOEUD...
BSR AGOTO
WORD FUNCT4 < VERS L'ACCES A LA VALEUR DU NOEUD...
<
< CAS OU LE POINT (XS,YS,ZS)
< COURANT N'EST PAZ UN NOEUD :
<
FUNCT3: EQU $
NGR X,A < ABSCISSE DU NOEUD "BAS-GAUCHE"...
FLT
FAD HXS < X-XNOEUD,
FDV FPAZIX < (X-XNOEUD)/PAZIX,
#/FST# HJNCU < DISTANCE NORMALISEE A 1 LE LONG DE OX,
< DU POINT COURANT AU NOEUD DE LA MAILLE.
NGR Y,A < ORDONNEE DU NOEUD "BAS-GAUCHE"...
FLT
FAD HYS < Y-YNOEUD,
FDV FPAZIY < (Y-YNOEUD)/PAZIY,
#/FST# HJNCV < DISTANCE NORMALISEE A 1 LE LONG DE OY,
< DU POINT COURANT AU NOEUD DE LA MAILLE.
NGR W,A < Z-COORDONNEE DU NOEUD "BAS-GAUCHE"...
FLT
FAD HZS < Z-ZNOEUD,
FDV FPAZIZ < (Z-ZNOEUD)/PAZIZ,
#/FST# HJNCW < DISTANCE NORMALISEE A 1 LE LONG DE OZ,
< DU POINT COURANT AU NOEUD DE LA MAILLE.
< NOTA : PAR LA SUITE, 'XN', 'YN' ET 'ZN'
< DESIGNERONT LES 3 COORDONNEES DU
< NOEUD DE LA MAILLE COURANTE.
BSR ASPRAN
#/FST# AFNJV1 < NIVEAU(XN,YN,ZN),
LA PAZIX
ADR A,X
BSR ASPRAN
#/FST# AFNJV2 < NIVEAU(XN+PAZIX,YN,ZN),
LA PAZIY
ADR A,Y
BSR ASPRAN
#/FST# AFNJV3 < NIVEAU(XN+PAZIX,YN+PAZIY,ZN),
LA PAZIX
SBR A,X
BSR ASPRAN
#/FST# AFNJV4 < NIVEAU(XN,YN+PAZIY,ZN),
LA PAZIZ
ADR A,W
BSR ASPRAN
#/FST# AFNJV5 < NIVEAU(XN,YN+PAZIY,ZN+PAZIZ),
LA PAZIX
ADR A,X
BSR ASPRAN
#/FST# AFNJV6 < NIVEAU(XN+PAZIX,YN+PAZIY,ZN+PAZIZ),
LA PAZIY
SBR A,Y
BSR ASPRAN
#/FST# AFNJV7 < NIVEAU(XN+PAZIX,YN,ZN+PAZIZ),
LA PAZIX
SBR A,X
BSR ASPRAN
#/FST# AFNJV8 < NIVEAU(XN,YN,ZN+PAZIZ).
<
< INTERPOLATION ENTRE LES
< HUIT SOMMETS D'UN CUBE
< PORTANT LES VALEURS (NIV1,
< NIV2,NIV3,NIV4,NIV5,NIV6,
< NIV7,NIV8), LES COOR-
< DONNEES DU POINT DANS LE
< CUBE ETANT (HJNCU,HJNCV,HJNCW) :
<
<
< NOTA :
< ON DOIT INTERPOLER ENTRE LES
< HUIT NIVEAUX (NIV1,...,NIV8)
< PORTES PAR LES HUIT SOMMETS D'UN
< CUBE :
<
<
< (1-U,V,1-W) ----------------- (U,V,1-W)
< /I /I
< / I / I
< / I / I
< / I / I
< / I / I
< / I / I
< / I / I
< (1-U,V,W) ------------------- (U,V,W) I
< I I I I
< I I I I
< I I I I
< I I I I
< I (1-U,1-V,1-W) ----------- I - (U,1-V,1-W)
< I / I /
< I / I /
< I / I /
< I / I /
< I / I /
< I / I /
< I/ I/
< (1-U,1-V,W) ----------------- (U,1-V,W)
<
<
< NIV 4 --------------------- NIV 3
< /I /I
< / I / I
< / I / I
< / I / I
< / I / I
< / I / I
< / I / I
< NIV 5 --------------------- NIV 6 I
< I I I I
< I I I I
< I I I I
< I I I I
< I NIV 1 --------------- I --- NIV 2
< I / I /
< I / I /
< I / I /
< I / I /
< I / I /
< I / I /
< I/ I/
< NIV 8 --------------------- NIV 7
<
<
< CE QUI DONNE LA FORMULE
< D'INTERPOLATION POUR LE POINT
< INTERIEUR AU CUBE ET DE COOR-
< DONNEES (U,V,W) RELATIVES AU
< SOMMET '1' :
<
< NIVEAU(U,V,W) = (1-U)*(1-V)*(1-W)*NIV1
< +U*(1-V)*(1-W)*NIV2
< +U*V*(1-W)*NIV3
< +(1-U)*V*(1-W)*NIV4
< +(1-U)*V*W*NIV5
< +U*V*W*NIV6
< +U*(1-V)*W*NIV7
< +(1-U)*(1-V)*W*NIV8.
<
<
< CALCUL DE (1-U,1-V,1-W)
<
#/FLD# F1 < 1,
FSB HJNCU < 1-U,
#/FST# HJNCU1 < HJNCU1=1-HJNCU.
#/FLD# F1 < 1,
FSB HJNCV < 1-V,
#/FST# HJNCV1 < HJNCV1=1-HJNCV.
#/FLD# F1 < 1,
FSB HJNCW < 1-W,
#/FST# HJNCW1 < HJNCW1=1-HJNCW.
<
< INTERPOLATION TRI-DIMENSIONNELLE :
<
< 1-W,
FMP AFNJV1 < (1-W)*N1,
#/FST# FWORK
#/FLD# HJNCW < W,
FMP AFNJV8 < W*N8,
FAD FWORK < (1-W)*N1+W*N8,
FMP HJNCU1 < (1-U)*((1-W)*N1+W*N8),
#/FST# FWORK1 < ET SAVE...
#/FLD# HJNCW1 < 1-W,
FMP AFNJV2 < (1-W)*N2,
#/FST# FWORK
#/FLD# HJNCW < W,
FMP AFNJV7 < W*N7,
FAD FWORK < (1-W)*N2+W*N7,
FMP HJNCU < U*((1-W)*N2+W*N7),
FAD FWORK1 < U*((1-W)*N2+W*N7)+(1-U)*((1-W)*N1+W*N8),
FMP HJNCV1 < (1-V)*(U*((1-W)*N2+W*N7)
< +(1-U)*((1-W)*N1+W*N8)),
#/FST# FWORK1 < ET SAVE...
#/FLD# HJNCW1 < 1-W,
FMP AFNJV3 < (1-W)*N3,
#/FST# FWORK
#/FLD# HJNCW < W,
FMP AFNJV6 < W*N6,
FAD FWORK < (1-W)*N3+W*N6,
FMP HJNCU < U*((1-W)*N3+W*N6),
#/FST# FWORK2 < ET SAVE...
#/FLD# HJNCW1 < 1-W,
FMP AFNJV4 < (1-W)*N4,
#/FST# FWORK
#/FLD# HJNCW < W,
FMP AFNJV5 < W*N5,
FAD FWORK < (1-W)*N4+W*N5,
FMP HJNCU1 < (1-U)*((1-W)*N4+W*N5),
FAD FWORK2 < (1-U)*((1-W)*N4+W*N5)+U*((1-W)*N3+W*N6),
FMP HJNCV < V*((1-U)*((1-W)*N4+W*N5)
< +U*((1-W)*N3+W*N6)),
FAD FWORK1 < CUMUL GENERAL...
<
< FIN DE L'INTERPOLATION :
<
FUNCT4: EQU $
PLR X
<
< CALCUL REKURSIF DE LA FUNCTION :
<
FMP FPONT < ET ON PONDERE PAR LES 'FPONT'
< AFIN D'OBTENIR DES VALEURS ALEATOIRES
< DECROISSANTES STATISTIQUEMENT...
< NOTA : ON NE DIVISE PLUS PAR 'FPONT0',
< CAR LA DEFINITION DE 'RENORN' INCLUE
< SON INVERSE, ET DONC : FPONT0/FPONT0=1...
FAD FKUMR < QUE L'ON CUMULE,
#/FST# FKUMR < ON A AINSI EN CHAQUE POINT UNE SOMME
< DE FUNCTION ALEATOIRE DONT LA FREQUENCE
< AUGMENTE PROGRESSIVEMENT PAR REDUCTION
< DE LA MAILLE, MAIS DONT L'AMPLYTUDE
< DIMINUE STATISTIQUEMENT...
<
< PAZSAGE A LA COMPOSANTE SUIVANTE :
<
ADRI I,X < PROGRESSION DE L'INDEX DE REKURSION...
LR X,A
CP NREKUR < EST-CE FINI ???
JGE FUNCT2 < OUI, ON ARRETE LA...
BSR AGOTO
WORD FUNCT5 < NON, ON CONTINUE...
FUNCT2: EQU $
<
< FIN DE REKURSION :
<
#/FLD# FKUMR < ET ON RENVOIE LA SOMME DES
< FUNCTIONS ALEATOIRES...
FDV RENORN < ET ON MULTIPLIE PAR 'AMPLY', 'AMPLYR',
< ET ON DIVISE PAR LE SIGMA DES 'FPONT'...
<
< CALCUL FINAL DE LA
< CONTRIBUTION ALEATOIRE :
<
FAD MOYENF < ET TRANSLATION.
FMP PONRAN < ET PONDERATION PAR LA CONTRIBUTION
< ALEATOIRE...
FUNCT6: EQU $
<
< TEST DE LA CONTRIBUTION
< DES SPIR-MAPS (256,256) :
<
FCMZ PONSPJ < LES SPIR-MAPS SONT-ELLES LA ???
JE FUNCT0 < NON, (A,B) DONNE LA FUNCTION...
<
<
< C O N T R I B U T I O N D E S S P I R - D E P 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 SPIR-DEPS 2*(256,256) :
<
LA XS < (A)=ABSCISSE '512',
SLRS XC512/NPOL=K
LR A,X < (X)=ABSCISSE '256'.
JC FUNC01 < ELLE NE "TOMBE PAZ 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 FUNC02 < ELLE NE "TOMBE PAZ 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 ASPIRD < (A,B)=SIGMA(NIVEAU(X,Y)).
FMP F4 < ET ON LE QUADRUPLE :
< (A,B)=4*SIGMA(NIVEAU(X,Y)).
JMP FUNC09 < VERS LA SORTIE...
<
< CAS D'UN POINT '512'
< ENTRE DEUX POINTS '256'
< SUR UNE VERTICALE :
<
FUNC02: EQU $
BSR ASPIRD < (A,B)=SIGMA(NIVEAU(X,Y)),
#/FST# FWORK < ET SAVE...
ADRI I,Y
BSR ASPIRD < (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 FUNC09 < VERS LA SORTIE...
<
< AUTRES CAS :
<
FUNC01: 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 FUNC03 < ELLE NE "TOMBE PAZ 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 ASPIRD < (A,B)=SIGMA(NIVEAU(X,Y)),
#/FST# FWORK < ET SAVE...
ADRI I,X
BSR ASPIRD < (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 FUNC09 < VERS LA SORTIE...
<
< CAS D'UN POINT '512' AU
< CENTRE D'UN CARRE FAIT
< DE QUATRE POINTS '256' :
<
FUNC03: EQU $
BSR ASPIRD < (A,B)=SIGMA(NIVEAU(X,Y)),
#/FST# FWORK1
ADRI I,X
BSR ASPIRD < (A,B)=SIGMA(NIVEAU(X+1,Y)),
#/FST# FWORK2
ADRI I,Y
BSR ASPIRD < (A,B)=SIGMA(NIVEAU(X+1,Y+1)),
#/FST# FWORK
ADRI -I,X
BSR ASPIRD < (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 "SPIR-DEP" :
<
FUNC09: EQU $
FMP PONSPJ < ET CONTRIBUTION DES SPIR-DEPS...
<
<
< 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 SPIR-DEPS.
<
<
< M O D U L A T I O N :
<
<
FUNCT0: EQU $
PLR X,Y,W < RESTAURATION DES COORDONNEES (X,Y,Z)...
IF NEXIST-K,,XEIF%,
IF ATTENTION : CE QUI SUIT EST IDIOT !!!
XEIF%: VAL ENDIF
CPZ NFUNCT < Y-A-T'IL UNE MODULATION ???
JE FUNCT7 < NON, (A,B) EST BON...
PSR A,B < OUI, ON EMPILE LA VALEUR COURANTE DE
< LA FUNCTION RAN(X,Y,Z)...
PSR X,Y,W < ET SAUVEGARDE DES COORDONNEES, ON NE
< SAIT JAMAIS...
LA NFUNCT < (A)=INDEX DE LA FUNCTION DEMANDEE :
CPI FGAUSS < EST-CE UNE GAUSSIENNE ???
JE GAUS01 < OUI...
QUIT XXQUIT < E R R E U R P R O G R A M M E ...
PLR A,B < (A,B)=RAN(X,Y,Z) COURANTE,
JMP FUNCT7 < ET VERS LA SORTIE...
<
<
< G A U S S I E N N E :
<
<
GAUS01: EQU $
LR X,A < X,
SB TXGAUS < X-TX,
FLT
#/FST# FWORK
FMP FWORK < (X-TX)**2,
FDV DXGAUS < ((X-TX)**2)/DX.
#/FST# FWORK1
LR Y,A < Y,
SB TYGAUS < Y-TY,
FLT
#/FST# FWORK
FMP FWORK < (Y-TY)**2,
FDV DYGAUS < ((Y-TY)**2)/DY.
FAD FWORK1 < ((X-TX)**2)/DX+((Y-TY)**2)/DY.
#/FST# FWORK1
LR W,A < Z,
SB TZGAUS < Z-TZ,
FLT
#/FST# FWORK
FMP FWORK < (Z-TZ)**2,
FDV DZGAUS < ((Z-TZ)**2)/DZ.
FAD FWORK1 < ((X-TX)**2)/DX+((Y-TY)**2)/DY+
< +((Z-TZ)**2)/DZ,
FNEG
BSR AEXPON < EXP(-(((X-TX)**2)/DX+((Y-TY)**2)/DY+
< ((Z-TZ)**2)/DZ)).
<
< ET MODULATION :
<
GINFUN: EQU $
#/FST# FWORK < SAUVEGARDE DU FACTEUR MULTIPLICATIF,
PLR X,Y,W < RESTAURATION DES COORDONNEES (X,Y,Z)...
PLR A,B < (A,B)=RAN(X,Y,Z),
FMP FWORK < ET MODULATION...
FUNCT7: EQU $
<
< HOMOTHETIE :
<
FMP FHOMO
<
< CALCUL DE LA TRANSLATION DE TEXTURAGE :
<
PSR X
BSR AROND < (A)=VALEUR ALEATOIRE,
BSR APNIV < CORECTION...
< (NOTA : CE SOUS-PROGRAMME EST AUSSI
< APPELE AILLEURS, ET CES APPELS POUR-
< RAIENT ETRE SUPPRIMES, MAIS ON NE SAIT
< JAMAIS...).
LR A,X < (X)=INDEX ALEATOIRE,
LBY &ALTIVO < (A)=TRANSLATION DE TEXTURAGE...
STA TEXTUR < ET SAUVEGARDE POUR 'POINT'...
PLR X
<
< RETOUR :
<
PLR A,B < RESTAURATIONS...
RSR
PAGE
<
<
< M I S E D ' U N N I V E A U
< D A N S ( M I N N I V , M A X N I V ) :
<
<
< ARGUMENT :
< (A)=NIVEAU A VALIDER.
<
<
< RESULTAT :
< (A)=NIVEAU DANS (MINNIV,MAXNIV).
<
<
PNIV: EQU $
IF EXIST-K,XEIF%,,XEIF%
IF ATTENTION : LE TEST QUI SUIT EST IDIOT !!!
XEIF%: VAL ENDIF
CPZ TRONIV < DOIT-ON TRONQUER BRUTALEMENT ???
JNE PNI400 < OUI...
<
< CAS DE LA FONCTION
< EN DENTS DE SCIE :
<
PNI401: EQU $
JAGE PNI402
NGR A,A < ABS(NIVEAU),
PNI402: EQU $
CP F255
JLE PNI400 < ON DOIT ETRE DANS (0,255)...
SB F511 < SINON, ON S'Y RAMENE...
JMP PNI401 < ET ON ATTEND DE S'ETRE STABILISER...
<
< TRONCAGE :
<
PNI400: EQU $
CP MINNIV < ET VALIDATION :
JL PNI314 < TROP PETIT : ON TRONQUE INFERIEUREMENT...
CP MAXNIV < ET VALIDATION :
JG PNI315 < TROP GRAND : ON TRONQUE SUPERIEUREMENT...
PNI311: EQU $
JMP PNI312 < VERS LE MARQUAGE DE (X,Y) AVEC (A).
PNI314: EQU $
LA MINNIV < (A)=NIVEAU PLANCHER,
JMP PNI311 < VERS SON MARQUAGE...
PNI315: EQU $
LA MAXNIV < (A)=NIVEAU PLAFOND,
JMP PNI311 < VERS SON MARQUAGE...
<
< ET RETOUR :
<
PNI312: EQU $
RSR
PAGE
<
<
< A C C E S A U N I V E A U C O U R A N T :
<
<
< ARGUMENT :
< (IBUFMT)=INDEX DE L'OCTET COURANT.
<
<
< RESULTAT :
< (A,B)=OCTET COURANT EN FLOTTANT...
<
<
NIVO: EQU $
<
< INITIALISATIONS :
<
PSR X
<
< TEST DE L'ETAT DU BUFFER :
<
LA IBUFMT < (A)=INDEX COURANT :
CP ZBUFMT < LE BUFFER A-T'IL ETE VIDE (OU EST-CE
< L'ETAT INITIAL) ???
JL NIVO1 < NON...
<
< CAS OU LE BUFFER EST VIDE :
<
NIVO2: EQU $
LAD DEMMT < (A)=ADRESSE DE LA DEMANDE,
SVC < QUE L'ON ENVOIE...
JE NIVO3 < OK...
QUIT XXQUIT < E R R E U R D ' A S S I G N A T I O N..
JMP NIVO2 < ET ON RE-TENTE, OU BIEN ON ARRETE S'IL
< S'AGIT D'UN 'TAPE-MARK'...
NIVO3: EQU $
IC DEMMT+ARGESC < PREPARATION DE L'ADRESSE DU BLOC SUIVANT,
ACTD XXXSIZ < RECUPERATION DE LA 'BOX'...
LR B,A < (A)=NOMBRE D'OCTETS REELS DU BLOC :
CP DEMMT+COESC < LE BUFFER EST-IL BON ???
JNE NIVO2 < NON, ON LIT L'ENREGISTREMENT SUIVANT...
LAI K < (A)=INDEX DU PREMIER OCTET.
<
< ACCES A L'OCTET COURANT :
<
NIVO1: EQU $
LR A,X < (X)=INDEX DE L'OCTET COURANT,
LBY &ABUFMT < (A)=OCTET COURANT...
ADRI I,X < ET PREPARATION DE
STX IBUFMT < L'ACCES SUIVANT...
<
< MISE A L'ECHELLE :
<
FLT < ET PASSAGE EN FLOTTANT...
FAD TRANMT < TRANSLATION ET
FMP MULTMT < MISE A L'ECHELLE...
<
< PRISE EN COMPTE DE LA
< GENERATION ALEATOIRE
< ET DES SPIR-DEPS :
<
PLR X < RESTAURATION DE LA COORDONNEE 'X'...
CPZ IMODMT < FAUT-IL LES IGNORER ???
JE NIVO4 < OUI ('NEXIST')...
PSR A,B < NON : SAUVEGARDE DE L'ENTREE BANDE,
BSR AFONKT < (A,B)=CONTRIBUTION ALEATOIRE ET DES
< SPIR-DEPS,
#/FST# FWORK < QUE L'ON SAUVEGARDE,
PLR A,B
FAD FWORK < ET CUMUL GENERAL :
< 'BANDE'+'ALEATOIRE'+'SPIR-DEP'.
NIVO4: EQU $
<
< ET RETOUR :
<
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# POLEX2
FDV POLEX7
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
<
<
< E X P O N E N T I E L L E :
<
<
EXPON: EQU $
PSR Y
STZ SIGNE < "+" A PRIORI...
JMP EXP < VERS LE CALCUL DE L'EXPONENTIELLE...
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
<
<
< T R A C E D ' U N S E G M E N T V E R T I C A L :
<
<
< ARGUMENTS :
< (VECGX1,VECGY1)=COORDONNEES DU POINT "BAS",
< (VECGX2,VECGY2)=COORDONNEES DU POINT "HAUT",
< (INTENB)=NIVEAU "BAS",
< (INTENH)=NIVEAU "HAUT".
<
<
SEGV: EQU $
CPZ IPERS < EST-CE UNE VUE D'AVION ???
JNE SEGV20 < NON, UNE PERSPECTIVE...
IF EXIST-K,XEIF%,,XEIF%
IF ATTENTION : LE TEST CI-DESSUS VA MERDER !!!
XEIF%: VAL ENDIF
<
< CAS DE LA VUE D'AVION :
<
#/FLD# INTENH
BSR AROND < (A)=NIVEAU D'ECLAIRAGE DU POINT COURANT,
CPZ ITEXTU < DOIT-ON TEXTURER ???
JE SEGV30 < NON...
PSR A,W < OUI, SAUVEGARDE DE 'W' ET DU NIVEAU...
LA VECGY2
LR A,W < (X,Y,W)=COORDONNEES (X,Y,Z) DU POINT
< TRI-DIMENSIONNEL COURANT,
BSR AFUNCT < (TEXTUR)=TRANSLATION DE TEXTURAGE (X,Y,Z)
PLR A,W
SEGV30: EQU $
BSR APOINT < ET MARQUAGE DE CELUI-CI (X,Y).
JMP SEGV21 < ET C'EST TOUT...
<
< CAS DE LA PERSPECTIVE :
<
SEGV20: EQU $
<
< INITIALISATIONS :
<
PSR X,Y,W < SAUVEGARDE DES COORDONNEES 'X' ET 'Y'...
< ET DE 'W'...
LR Y,W < (W)=SAUVEGARDE DE LA COORDONNEE 'Y'...
<
< CALCUL DU NOMBRE DE POINTS :
<
LA VECGY2 < (A)=ORDONNEE "HAUTE",
SB VECGY1 < (A)=ORDONNEE "HAUTE"-ORDONNEE "BASSE",
LR A,X < (A)=NOMBRE D'INTERVALLES,
ADRI Z,X < (X)=NOMBRE DE POINTS A TRACER...
JAE SEGV00 < RIEN A FAIRE, PAS D'INTERVALLE...
JAG SEGV01 < OK...
QUIT XXQUIT < E R R E U R P R O G R A M M E ...
SEGV01: EQU $
<
< CALCUL DU PAS D'INTER-
< POLATION DES NIVEAUX :
<
FLT < IL Y A AU MOINS UN INTERVALLE :
#/FST# FWORK1
#/FLD# INTENB < (A,B)=INTENSITE "BASSE",
FSB INTENH < (A,B)=INTENSITE "BASSE"-INTENSITE "HAUTE"
FDV FWORK1 < (A,B)=PAS D'INTERPOLATION DE L'INTENSITE
< LUMINEUSE...
#/FST# PINTEN < ET MEMORISATION...
SEGV00: EQU $
<
< TRACE POINT A POINT :
<
LY VECGY2 < (Y)=ORDONNEE "HAUTE",
#/FLD# INTENH < (A,B)=INTENSITE LUMINEUSE COURANTE,
SEGV10: EQU $
PSR A,B,X < QUE L'ON SAUVEGARDE, AINSI QUE LE DE-
< COMPTE DES POINTS A TRACER...
BSR AROND < (A)=NIVEAU ENTIER DU POINT COURANT,
LX VECGX2 < (X)=(VECGX1)=(VECGX2)=ABSCISSE DU POINT
< COURANT,
< (Y)=ORDONNEE OK...
CPZ ITEXTU < DOIT-ON TEXTURER ???
JE SEGV31 < NON...
XR Y,W < OUI,
< (X,Y,W)=COORDONNEES (X,Y,Z) DU POINT
< TRI-DIMENSIONNEL COURANT,
BSR AFUNCT < (TEXTUR)=TRANSLATION DE TEXTURAGE (X,Y,Z)
XR Y,W < RESTAURE 'Y' ET 'W'...
SEGV31: EQU $
BSR APOINT < ET TRACE DU POINT COURANT...
PLR A,B,X < RESTAURE :
< (X)=DECOMPTE DES POINTS,
< (A,B)=NIVEAU COURANT,
FAD PINTEN < QUE L'ON MODIFIE...
ADRI -I,Y < ET MODIFICATION DE L'ORDONNEE...
JDX SEGV10 < VERS LE POINT COURANT, S'IL EXISTE...
<
< ET RETOUR :
<
PLR X,Y,W < ET ENFIN, RESTAURE :
< (X,Y)=COORDONNES COURANTES DE GENERATION.
SEGV21: 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 < 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'...).
<
<
< I N I T I A L I S A T I O N S :
<
<
INIT01: EQU $
<
< INITIALISATION DES DIFFERENTS
< POINTEURS "ROTATIFS" :
<
LRM A,B,X,Y
WORD LIGP2,X < RELAI VERS LA LIGNE SUIVANTE-SUIVANTE,
WORD LIGP1,X < RELAI VERS LA LIGNE SUIVANTE,
WORD LIG,X < RELAI VERS LA LIGNE COURANTE,
WORD LIGM1,X < RELAI VERS LA LIGNE PRECEDENTE.
STA ALIGP2
STB ALIGP1
STX ALIG
STY ALIGM1
LRM A,B
WORD INTH,X < ACCES A LA LISTE DES 'INTH' DE LA LIGNE
< COURANTE (Y+I),
WORD INTHM1,X < ACCES A LA LISTE DES 'INTH' DE LA LIGNE
< PRECEDENTE (Y).
STA AINT
STB AINTM1
<
< MISE EN PLACE DE LA
< SOURCE DE LA FONCTION :
<
LA AFONKT < (A)=ADRESSE DU SOUS-PROGRAMME DE CALCUL
< DE LA FONCTION ALEATOIRE RECURSIVE
< A PRIORI...
IF NEXIST-K,,XEIF%,
IF ATTENTION : LE TEST CI-DESSOUS EST IDIOT !!!
XEIF%: VAL ENDIF
CPZ IBANDE < EN FAIT DOIT-ON LIRE UNE BANDE ???
JE INIT10 < NON...
LRM A < OUI :
WORD NIVO < (A)=ADRESSE DU SOUS-PROGRAMME DE RECUPE-
< RATION DES VALEURS DE LA FONCTION
< SUR BANDE...
INIT10: EQU $
STA AFONCT < ET MISE EN PLACE DU RELAI D'ACCES A LA
< FONCTION...
<
< 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 $
LA ZBUFMT
STA 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...
FST &AINT < LISTE
FST &AINTM1 < DES 'INTH'...
ADRI -I*DFLOT,X < ET REGRESSION,
CPZR X < EST-CE FINI ???
JGE INIT02 < NON...
IF NEXIST-K,,XEIF%,
IF ATTENTION : LE TEST CI-DESSOUS EST IDIOT !!!
XEIF%: VAL ENDIF
CPZ IALIAS < L'ANTI-ALIASING EST-IL DEMANDE ???
JE INIT04 < NON, RIEN A FAIRE...
LX VECTNC < OUI, (X)=INDEX DES INITIALISATIONS...
LYI K-I-I < (Y)=VALEUR INEXISTANTE D'ORDONNEE...
INIT03: EQU $
STY &ALISTY < INITIALISATION DU BUFFER DE DETECTION
< DES DISCONTINUITES...
ADRI -I,X < ET REGRESSION,
CPZR X < EST-CE FINI ???
JGE INIT03 < NON...
INIT04: EQU $
<
< INVERSION DE 'LNIVO' :
<
XXINIT:: VAL NIVBAS < VALEUR TRES ARBITRAIRE D'INITIALISATION
< DES ENTREES DE 'LNOVI' QUI NE FIGURENT
< PAS DANS 'LNIVO' ; NOTONS MALGRE TOUT
< QU'IL EVITE L'UTILISATION DU NOIR...
IF NEXIST-K,,XEIF%,
IF ATTENTION : LE TEST CI-DESSOUS EST IDIOT !!!
XEIF%: VAL ENDIF
CPZ IALIAS < L'ANTI-ALIASING EST-IL DEMANDE ???
JE INIT07 < NON, RIEN A FAIRE...
LXI XXN255 < (X)=INDEX D'INITIALISATION DE 'LNOVI',
LAI XXINIT < (A)=VALEUR (FINALEMENT ASSEZ ARBITRAIRE)
< DES ENTREES NON UTILISEES DE 'LNOVI'.
INIT05: EQU $
STBY &ALNOVI < INITIALISATION,
ADRI -I,X < PASSAGE A L'ENTREE PRECEDENTE,
CPZR X < SI ELLE EXISTE...
JGE INIT05 < OUI...
IF XXNOIR-K,,XEIF%,
IF ATTENTION : LE TEST DE FIN EST MAUVAIS !!!
XEIF%: VAL ENDIF
LXI XXN255 < (X)=INDEX D'INVERSION DE 'LNIVO',
< DONNE LE 'NIVEAU CALCULE',
INIT06: EQU $
LBY &ALNIVO < (A)=NIVEAU TRACE(NIVEAU CALCULE),
XR A,X
STBY &ALNOVI < (A)=NIVEAU CALCULE(NIVEAU TRACE).
< NOTA : RAPPELONS QUE LA CORRESPONDANCE
< N'EST PAS BIJECTIVE, ET QUE LA MEME
< ENTREE PEUT ETRE POSITIONNE PLUSIEURS
< FOIS ; SEULE LA DERNIERE CORRESPONDANCE
< EST CONSERVEE...
XR A,X
ADRI -I,X < PASSAGE A L'ENTREE PRECEDENTE,
CPZR X < SI ELLE EXISTE...
JGE INIT06 < OUI...
IF XXNOIR-K,,XEIF%,
IF ATTENTION : LE TEST DE FIN EST MAUVAIS !!!
XEIF%: VAL ENDIF
INIT07: 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 SPIR-MAPS :
<
LA NMM
FLT
#/FST# FNMM < FLOTTAGE DE 'NMM'...
<
<
< I N I T I A L I S A T I O N D U C A L C U L
< D E S S P I R - D E P S D E D E P L A C E M E N T
< V E R T I C A L :
<
<
LA NDM
CPI MAXNDM < ET VALIDATION DE 'NDM'...
JLE SPIRI7 < OK...
QUIT XXQUIT < E R R E U R P A R A M E T R E ...
SPIRI7: EQU $
LX XCENTR < DEFINITION DU
LY YCENTR < CENTRE DE 'TV1'/'TV2'.
<
< INITIALISATION DE LA SPIR-DEP :
<
#/FLD# F0
#/FST# FCOEFC < CUMUL <-- 0.
STZ NP < NP=NOMBRE DE POINTS TRAITES.
LA PASD
STA DELTAX < DELTAX <-- +1,
STZ DELTAY < DELTAY <-- 0.
LAI W
STA LB0 < INITIALISATION DE LA LONGUEUR DU
< PREMIER BRAS DE LA SPIR-DEP.
<
< PARCOURS D'UN BRAS :
<
SPIRI1: EQU $
LA LB0
STA LB < LONGUEUR DU BRAS COURANT.
<
< TRAITEMENT DU POINT COURANT :
<
SPIRI2: EQU $
IC NP < COMPTAGE DES POINTS TRAITES :
LA NP
CP NDM < FINI ???
JG SPIRI3 < OUI...
LR X,A < NON, TEST DE LA COORDONNEE 'X' :
JAL SPIRI4 < LE POINT EST HORS-ECRAN...
CPI NPOLM1
JG SPIRI4 < HORS-ECRAN...
LR Y,A < TEST DE LA COORDONNEE 'Y' :
JAL SPIRI4 < HORS-ECRAN...
CPI NLIGM1
JG SPIRI4 < HORS-ECRAN...
<
< CALCUL DU COEFFICIENT
< DE PONDERATION DE CHAQUE
< POINT D'UNE SPIR-DEP :
<
PSR X
LR X,A
SB XCENTR
FLT
#/FST# FWORK1 < ON VA TRAVAILLER EN RELATIF PAR RAPPORT
< AU CENTRE D'UNE SPIR-DEP QUELCONQUE...
FMP FWORK1 < XR**2 (OU 'R' SIGNIFIE 'RELATIF'...),
#/FST# FWORK
LX NP
ADRI -I,X
ADR X,X < (X)=INDEX FLOTTANT DU FUTUR COEFFICIENT
< DE PONDERATION QUE L'ON CALCULE...
LR Y,A
SB YCENTR
FLT
#/FST# FWORK2 < YR,
FMP FWORK2 < YR**2,
FAD FWORK < XR**2+YR**2, SOIT LE CARRE DU RAYON
< POLAIRE DU POINT COURANT AU CENTRE DE
< LA SPIR-DEP...
FMP FCOEFB < QUE L'ON PONDERE (EN GENERAL PAR -1,
< AFIN D'AVOIR UNE GAUSSIENNE...),
BSR AEXPON < ET ON EXPONENTIE,
FST &ALCOEF < CE QUI DONNE LE COEFFICIENT DE PONDERA-
< TION DU POINT COURANT DE LA SPIR-DEP DE
< RANG (NP)-1.
FAD FCOEFC
#/FST# FCOEFC < ET L'ON CUMULE...
PLR X
<
< PARCOURS DE LA SPIR-DEP :
<
SPIRI4: 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 SPIRI2 < OK, IL EN RESTE...
CPZ DELTAX < NON, ON EST AU BOUT, FAUT-IL AUGMENTER
< LA LONGUEUR COURANTE DES BRANCHES ???
JNE SPIRI5 < NON (DX#0) ...
IC LB0 < OUI (DX=0) ...
SPIRI5: 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 SPIRI1 < VERS LA BRANCHE SUIVANTE
<
< FIN DU CALCUL DES COEFFICIENTS
< DE PONDERATION D'UNE SPIR-DEP :
<
SPIRI3: EQU $
#/FLD# FCOEFC
FDV FCOEFA
#/FST# FCOEFC < ET PONDERATION DE LA SOMME DES
< COEFFICIENTS...
<
< 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...
<
< PREPARATION A PRIORI DE LA
< MODULATION DU "DEPTH-CUEING" :
<
#/FLD# FH < FH,
FMP FNIVMX < 255*FH,
#/FST# FHP
#/FLD# FNIVMX < 255,
FSB FHP < 255-FHP,
FDV FNIVMX < (255-FHP)/255,
#/FST# F255MH < QUE L'ON MEMORISE SANS VALIDATION...
<
< INITIALISATION DU CALCUL DES "FUITES" :
<
LA VECTNL < 255,
FLT
#/FST# FWORK
#/FLD# F1 < 1,
FSB FPERSB < 1-FPERSB,
FDV FWORK < (1-FPERSB)/255,
#/FST# FPERSA < FPERSA=(1-FPERSB)/255.
<
< 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 GEN400 < NON, RIEN A VALIDER...
GEN401: EQU $
FCMZ FZL < 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 (ZL=0) POUR SIMPLIFIER
< LES CALCULS (EN FAIT ON VA MEME LA SUP-
< POSER A L'INFINI, EN IGNORANT SYLTEMATI-
< QUEMENT LA TROISIEME COORDONNEE DU RAYON
< LUMINEUX...).
JNE GEN402 < ERREUR : 'ZL' EST NON NUL !!!
#/FLD# FXL
BSR AROND
CP VECTNC
JG GEN400 < OK, LA SOURCE LUMINEUSE EST A DROITE DE
< LA MONTAGNE...
GEN402: EQU $
QUIT XXQUIT < ERREUR SUR LA SOURCE LUMINEUSE, ON
< REDEMANDE LES PARAMETRES...
JMP GEN401 < ET ON REVALIDE...
GEN400: EQU $
#/FLD# FNIVMX
#/FST# FNIVC < ON INITIALISE A PRIORI 'FNIVC' POUR
< LE CAS OU L'OMBRAGE N'EST PAS DEMANDE...
GEN441: EQU $
LA NPENOM < (A)=LARGEUR DE LA ZONE DE PENOMBRE :
JAG GEN440 < OK, ELLE EST STRICTEMENT POSITIVE...
QUIT XXQUIT < E R R E U R ...
JMP GEN441 < ET ON RE-VALIDE...
GEN440: 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 :
<
#/FLD# EXPOP0
#/FST# EXPOP < INITIALISATION DE L'EXPOSANT...
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...
STX SRECUR < ET DE SA SAUVEGARDE AU CAS OU EN FAIT
< IL SERAIT CALCULE ALEATOIREMENT...
<
< INITIALISATION DU GENERATEUR
< ALEATOIRE DE 'NRECUR' :
<
IF NEXIST-K,,XEIF%,
IF ATTENTION : LE TEST SUIVANT VA MERDER !!!
XEIF%: VAL ENDIF
CPZ IRDNRC < EST-CE NECESSAIRE ???
JE GEN223 < NON...
LA SUPREC < OUI :
CP NRECUR < ET VALIDATION :
JLE GEN221 < OK...
LA NRECUR < ON PREND MIN(NRECUR,SUPREC)...
GEN221: EQU $
LR A,Y < (Y)=MIN(NRECUR,SUPREC)...
FLT
#/FST# FSUP < BORNE SUPERIEURE ('SUP'),
LA INFREC
CPR Y,A < ET VALIDATION :
JLE GEN222 < OK...
LR Y,A < ON PREND MIN(MIN(NRECUR,SUPREC),INFREC)..
GEN222: EQU $
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# UNMISR < UNMIS=1-(INF/SUP).
PLR A,B < INF/SUP,
FAD F1 < 1+(INF/SUP),
FMP INF32 < 32768*(1+(INF/SUP)),
#/FST# UNPISR < UNPIS=32768*(1+(INF/SUP)).
#/FLD# FSUP < SUP,
FDV INF64 < SUP/65536,
#/FST# SUP64R < SUP64=SUP/65536.
GEN223: EQU $
<
< FACTEUR DE RENORMALISATION :
<
#/FLD# AMPLI
FMP AMPLIR
FDV FPOND0
#/FST# RENORM < RENORM=AMPLI*AMPLIR/FPOND0.
<
<
< I N I T I A L I S A T I O N S D E T E X T U R A G E
< T R I - D I M E N S I O N N E L :
<
<
CPZ ITEXTU < Y-AURA-T'IL TEXTURAGE ???
JNE GEN999 < OUI, INITIALISONS...
BR ANTEXT < NON...
GEN999: EQU $
<
< DEFINITION DU SEUIL
< DE DEFINITION DE LA
< SURFACE :
<
LB SCOUCH < (B)=SEUIL A PRIORI ('SCOUCH')...
LA NFUNCT < (A)=FUNCTION DE MODULATION DE LA FUNCTION
< ALEATOIRE RAN(X,Y,Z) :
CPI FGAUSS < EST-CE LA MODULATION GAUSSIENNE ???
JNE INIT30 < NON, (B) EST BON...
GCOUCH:: VAL 4 < LOGARITHME EN BASE 2 DU DIVISEUR DE
< 'SCOUCH' LORSQUE LA MODULATION GAUS-
< SIENNE EST UTILISEE ; EN EFFET, IL FAUT
< DIMINUER LE SEUIL DE DEFINITION DE LA
< SURFACE, CAR LA MODULATION GAUSSIENNE EST
< INFERIEURE A 1, ET ALORS PRATIQUEMENT
< TOUS LES POINTS SE TROUVERAIENT A L'EX-
< TERIEUR...
LAI K < CLEAR 'A',
SLRD GCOUCH < ET ON DIMINUE LE SEUIL...
INIT30: EQU $
STB ICOUCH < MISE A JOUR DU SEUIL COURANT DE DEFINI-
< TION DE LA SURFACE...
<
< GENERATEUR ALEATOIRE :
<
LA SUPRAN
FLT
#/FST# GSUP < BORNE SUPERIEURE ('SUP'),
LA INFRAN
FLT
#/FST# GINF < BORNE INFERIEURE ('INF'),
FDV GSUP < INF/SUP,
PSR A,B < ET SAVE...
FSB F1 < (INF/SUP)-1,
FNEG < 1-(INF/SUP),
#/FST# UNMJS < UNMJS=1-(INF/SUP).
PLR A,B < INF/SUP,
FAD F1 < 1+(INF/SUP),
FMP INF32 < 32768*(1+(INF/SUP)),
#/FST# UNPJS < UNPJS=32768*(1+(INF/SUP)).
#/FLD# GSUP < SUP,
FDV INF64 < SUP/65536,
#/FST# ZUP64 < ZUP64=SUP/65536.
<
< PAZ INITIAUX DU MAILLAGE :
<
#/FLD# F1
FDV F3
#/FST# EXPOP < POUR CALCULER UNE RACINE CUBIQUE POUR
< PAZSER D'UN VOLUME A UNE DIMENSION...
LA PAZIX0 < VALEUR INITIALE DE 'PAZIX' :
JALE $ < ???
STA PAZIX < PAZ EN 'X',
FLT
#/FST# FWORK < ET SAUVEGARDE...
LA PAZIY0 < VALEUR INITIALE DE 'PAZIY' :
JALE $ < ???
STA PAZIY < ET PAZ EN 'Y'...
FLT
FMP FWORK < CALCUL DE PAZIX*PAZIY...
#/FST# FWORK
LA PAZIZ0 < VALEUR INITIALE DE 'PAZIZ' :
JALE $ < ???
STA PAZIZ < ET PAZ EN 'Z'...
FLT
FMP FWORK < ET CALCUL DE PAZIX*PAZIY*PAZIZ, SOIT LE
< VOLUME DE LA PLUS GRANDE MAILLE INITIALE,
BSR ARAK
#/FST# FPONT0 < LA PONDERATION INITIALE DES FUNCTIONS
< ALEATOIRES EST EN FAIT LA TAILLE DE LA
< MAILLE...
<
< INITIALISATION DU REDUC-
< TEUR REKURSIF :
<
#/FLD# EXPOQ0
#/FST# EXPOP
<
<
< 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 :
<
<
GEN700: EQU $
LA MREKUR < VALIDATION DE 'MREKUR' :
JALE GEN701 < MAUVAIS...
CPI MAXREK < ALORS ???
JLE GEN702 < OK...
GEN701: EQU $
QUIT XXQUIT < E R R E U R U T I L I S A T E U R ...
JMP GEN700 < ET ON RE-VALIDE...
GEN702: EQU $
<
< INITIALISATIONS :
<
LA PAZIX
FLT
#/FST# FPAZIX < 'PAZIX',
LA PAZIY
FLT
#/FST# FPAZIY < 'PAZIY',
LA PAZIZ
FLT
#/FST# FPAZIZ < 'PAZIZ'.
#/FLD# FPONT0
#/FST# FPONT < 'FPONT'.
<
< REDUCTION REKURSIVE DU MAILLAGE :
<
LXI K < (X)=INDEX DE REKURSION...
GEN710: EQU $
PSR X
LR X,Y < (Y)=INDEX ENTIER,
ADR X,X < PAZSAGE A UN INDEX FLOTTANT...
#/FLD# FPONT
FST &ALPONT < 'LPONT',
BSR ARAK < EXPONENTIATION,
#/FST# FPONT < ET REDUCTION...
#/FLD# FPAZIX
FST &ALPAZX < 'PAZIX' FLOTTANT,
PSR A,B,X
LR Y,X
BSR AROND
STA &ALPZIX < 'PAZIX' ENTIER.
PLR A,B,X
BSR ARAK < EXPONENTIATION,
#/FST# FPAZIX < ET REDUCTION...
#/FLD# FPAZIY
FST &ALPAZY < 'PAZIY' FLOTTANT,
PSR A,B,X
LR Y,X
BSR AROND
STA &ALPZIY < 'PAZIY' ENTIER.
PLR A,B,X
BSR ARAK < EXPONENTIATION,
#/FST# FPAZIY < ET REDUCTION...
#/FLD# FPAZIZ
FST &ALPAZZ < 'PAZIZ' FLOTTANT,
PSR A,B,X
LR Y,X
BSR AROND
STA &ALPZIZ < 'PAZIZ' ENTIER.
PLR A,B,X
BSR ARAK < EXPONENTIATION,
#/FST# FPAZIZ < ET REDUCTION...
FAD FPAZIY
FAD FPAZIX
BSR AROND < (A)=PAZIX+PAZIY+PAZIZ,
PLR X < RESTAURE L'INDEX DE REKURSION...
ADRI I,X < PAZSAGE A LA REKURSION SUIVANTE...
CPI W+W+W < EST-ON ARRIVE A UNE MAILLE IRREDUCTIBLE,
< SOIT ELEMENTAIRE (1*1*1) ???
JE GEN720 < OUI, ON ARRETE LA...
LR X,A < NON,
CP MREKUR < MAIS A-T'ON ATTEINT LE MAXIMUM ???
JL GEN710 < NON, ON CONTINUE...
GEN720: EQU $
STX NREKUR < MISE EN PLACE DU 'NREKUR' A UTILISER...
<
< CALCUL DU FACTEUR DE
< RENORNALISATION DE LA
< FUNCTION ALEATOIRE :
<
LR X,A < (A)='NREKUR',
FLT < QUE L'ON FLOTTE...
FAD KAMPLY
FSB F1
FDV KAMPLY
#/FST# AMPLY < (AMPLY)=(NREKUR+30)/31...
#/FLD# F0 < INITIALISATION DU SIGMA DES 'FPONT',
GEN910: EQU $
PSR X
ADRI -IJIJDX,X
ADR X,X < PAZSAGE A UN INDEX FLOTTANT...
FAD &ALPONT < CALCUL DE SIGMA(FPONT),
PLR X
JDX GEN910 < AU SUIVANT...
FDV AMPLY
FDV AMPLYR
#/FST# RENORN < RENORN=SIGMA(FPONT)/(AMPLY*AMPLYR).
NTEXT: EQU $
<
<
< G E N E R A T I O N D E L ' I M A G E :
<
<
GEN69: EQU $
<
< REINITIALISATION DES REGISTRES
< DE L'IMAGEUR :
<
LRM A
WORD INFINY < AFIN DE BIEN REPARTIR...
STA SNIVOP
STA SXHP
STA SXLP
STA SYHP
STA SYLP
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 $
LR Y,A < Y,
FLT
FMP FPERSA < FPERSA*Y,
FAD FPERSB < FPERSA*Y+FPERSB,
#/FST# FPERSK < FPERSK=FPERSA*Y+FPERSB, SOIT LA CONSTANTE
< DE CALCUL DES "FUITES"...
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 LES CONTRIBUTIONS DES
< SPIR-MAPS EVENTUELLEMENT...
FMP FPERSK < ET MISE EN "FUITE", EN MULTIPLIANT PAR
< UNE CONSTANTE APPARTENANT A (FPERSB,1),
< ET FONCTION DE 'Y'...
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 $
<
< DISCRIMINATION DE LA PREMIERE, DE LA
< DEUXIEME ET DE LA TROISIEME LIGNE :
<
LR Y,A < (A)=ORDONNEE COURANTE :
YPLAN2:: VAL W+W < ORDONNEE DU PLAN VERTICAL 2...
CPI YPLAN2 < 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...
STZ LSTENH < AU DEBUT DE CHAQUE LIGNE, ON DONNE A
< 'LSTENH' UNE VALEUR INACESSIBLE EN
< FLOTTANT, QUI PERMETTRA DE SAVOIR
< ULTERIEUREMENT QU'ON EN EST OU PAS AU
< PREMIER VECTEUR VERTICAL D'UNE LIGNE...
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)).
IF INCIX+I,,XEIF%,
IF ATTENTION : L'INITIALISATION DE 'X'
IF DOIT ETRE FAITE AVEC 0 !!!
XEIF%: VAL ENDIF
GEN30: EQU $
<
< CALCUL DU VECTEUR "VERTICAL"
< A TRACER POUR CONSTRUIRE LE
< RELIEF DE LA MONTAGNE :
<
LR X,A < X(A),
AD TRX < TRANSLATION,
STA VECGX1 < (VECGX1)=ABSCISSE DU VECTEUR VECTICAL,
STA VECGX2 < (VECGX2)=(VECGX1), CAR VERTICAL...
PSR X
ADR X,X < PASSAGE A UN INDEX FLOTTANT...
FLD &ALIGP1 < Z(BAS),
BSR AROND
SBR Y,A < Z(BAS)-Y(A),
AD TRY < TRANSLATION,
STA VECGY1 < (VECGY1)=ORDONNEE DU "BAS" DU VECTEUR
< VERTICAL...
FLD &ALIG < Z(A)=Z(HAUT),
BSR AROND
LR A,B < (B)=SAUVEGARDE DE Z(HAUT)...
SBR Y,A < Z(HAUT)-Y(A),
ADRI I,A < Z(HAUT)-(Y(A)-1), (Y-1 POUR LA LIGNE
< D'AVANT LA LIGNE SUIVANTE...
PLR X
AD TRY < TRANSLATION,
STA VECGY2 < (VECGY2)=ORDONNEE DU "HAUT" DU VECTEUR
< VERTICAL...
<
< TEST DES OMBRES PORTEES :
<
IF NEXIST-K,,XEIF%,
IF ATTENTION : LE TEST CI-DESSOUS EST IDIOT !!!
XEIF%: VAL ENDIF
CPZ IOMBRE < L'OMBRAGE EST-IL DEMANDE ???
JNE AGN420 < OUI...
BSR AGOTO
WORD GEN420 < NON, RIEN A FAIRE...
AGN420: EQU $
LR B,A < (A)=Z(HAUT)...
CPZ PRAYON < OUI, ALORS EST-ON EN DEBUT DE LIGNE ???
JE GEN412 < 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-YL)/(XH-XL))*(XC-XL),
FAD FYL < YL+((YH-YL)/(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 ???
JLE GEN410 < (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 :
<
GEN412: 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 FYL < YH-YL,
FDV FWORK < (YH-YL)/(XH-XL),
#/FST# PRAYON < PRAYON=(YH-YL)/(XL-XH).
#/FLD# FNIVMX < (A,B)=NIVEAU LUMINEUX MAXIMAL PUIQU'ON
< EST VU, DONC AU SOLEIL...
JMP GEN411 < VERS LA MISE EN PLACE DE 'FNIVC'...
<
< CAS OU L'ON EST INVISIBLE
< DEPUIS LA SOURCE LUMINEUSE :
<
GEN410: EQU $
SBR B,A
NGR A,A < (A)=DISTANCE D'INVISIBILITE (STRICTE-
< MENT POSITIVE).
CP NPENOM < EST-ON DANS LA PENOMBRE ???
JL GEN433 < 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 GEN434
GEN433: 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...
GEN434: 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' :
<
GEN411: EQU $
IF NEXIST-K,,XEIF%,
IF ATTENTION : LE TEST SUIVANT EST IDIOT !!!
XEIF%: VAL ENDIF
CPZ IDEPTH < FAIT-ON DU "DEPTH-CUEING" ???
JE GEN421 < NON, (A,B) EST BON...
PSR A,B < OUI, SAUVEGARDE DE (A,B)...
< RAPPEL : L'OPTION "DEPTH-CUEING" N'EST
< PRISE EN COMPTE QU'AVEC LES OMBRES
< PORTEES A CAUSE DES PROBLEMES D'INI-
< TIALISATION DE 'FNIVC' SINON...
LR Y,A < Y,
SLRS XL512/NIV256=K < REDUCTION DE LA COORDONNEE 'Y',
JANE GEN422 < NON NUL...
LAI Z < ON NE PEUT CONSERVER LES VALEURS NULLES,
GEN422: EQU $
FLT
#/FST# FWORK
PLR A,B < RESTAURATION DU 'FNIVC',
FDV FNIVMX < ET MODULATION
FMP FWORK < PAR LA COORDONNEE 'Y'...
FMP F255MH < PUIS ON PLACE CETTE VALEUR DE (0,255)
FAD FHP < DANS LE SEGMENT (FHP,255)...
GEN421: EQU $
#/FST# FNIVC
<
<
< M O D U L A T I O N E V E N T U E L L E P A R ' T V 2 ' :
<
<
IF NEXIST-K,,XEIF%,
IF ATTENTION : LE TEST SUIVANT VA MERDER !!!
XEIF%: VAL ENDIF
CPZ IMODTV < FAUT-IL MODULER PAR 'TV2' ???
JE GEN423 < NON...
PSR X,Y < OUI, SAUVEGARDE DES COORDONNEES DU
< POINT COURANT (X,Y) EN 512*512...
<
< TEST DE LA POSITION
< DU POINT COURANT (X,Y) :
< DE LA MAILLE (512,512)
< PAR RAPPORT A LA MAILLE
< DES SPIR-MAPS 2*(256,256) :
<
LR X,A < (A)=ABSCISSE '512',
SLRS XC512/NPOL=K
LR A,X < (X)=ABSCISSE '256'.
JC MAPTV1 < ELLE NE "TOMBE PAS JUSTE"...
LR Y,A < (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 MAPTV2 < 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 ASPIRM < (A,B)=SIGMA(NIVEAU(X,Y)).
FMP F4 < ET ON LE QUADRUPLE :
< (A,B)=4*SIGMA(NIVEAU(X,Y)).
JMP MAPTV9 < VERS LA SORTIE...
<
< CAS D'UN POINT '512'
< ENTRE DEUX POINTS '256'
< SUR UNE VERTICALE :
<
MAPTV2: EQU $
BSR ASPIRM < (A,B)=SIGMA(NIVEAU(X,Y)),
#/FST# FWORK < ET SAVE...
ADRI I,Y
BSR ASPIRM < (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 MAPTV9 < VERS LA SORTIE...
<
< AUTRES CAS :
<
MAPTV1: EQU $
LR Y,A < (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 MAPTV3 < 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 ASPIRM < (A,B)=SIGMA(NIVEAU(X,Y)),
#/FST# FWORK < ET SAVE...
ADRI I,X
BSR ASPIRM < (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 MAPTV9 < VERS LA SORTIE...
<
< CAS D'UN POINT '512' AU
< CENTRE D'UN CARRE FAIT
< DE QUATRE POINTS '256' :
<
MAPTV3: EQU $
BSR ASPIRM < (A,B)=SIGMA(NIVEAU(X,Y)),
#/FST# FWORK1
ADRI I,X
BSR ASPIRM < (A,B)=SIGMA(NIVEAU(X+1,Y)),
#/FST# FWORK2
ADRI I,Y
BSR ASPIRM < (A,B)=SIGMA(NIVEAU(X+1,Y-1)),
#/FST# FWORK
ADRI -I,X
BSR ASPIRM < (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 "SPIR-MAP" :
<
MAPTV9: EQU $
FDV F4 < POUR SE RAMENER ULTERIEUREMENT DANS
< LE SEGMENT (0,1)...
FDV FIVMX7 < QUE L'ON NORMALISE,
FMP FNIVC < ET QUI MODULE
#/FST# FNIVC < L'INTENSITE LUMINEUSE...
PLR X,Y < RESTAURE LE POINT COURANT (X,Y)...
GEN423: EQU $
GEN420: EQU $
<
< CALCUL DE L'INTENSITE LUMINEUSE "HAUTE" :
<
LR Y,A < (A)=ORDONNEE COURANTE :
YPLAN3:: VAL YPLAN2+I < ORDONNEE DU PLAN VERTICAL 3...
CPI YPLAN3 < 'INTENH' EXISTE-T'ELLE ???
JLE GEN801 < NON, PAS ENCORE, ON NE VA PAS TRACER...
PSR X < OUI, SAUVEGARDE DE L'ABSCISSE 'X',
ADR X,X < PASSAGE A UN INDEX FLOTTANT,
FLD &AINTM1 < (A,B)=INTENSITE LUMINEUSE "HAUTE",
#/FST# INTENH < ET SAUVEGARDE...
PLR X < RESTAURATION DU POINT COURANT 'A'...
GEN801: EQU $
<
< GENERATION DE LA NORMALE "BASSE" :
<
<
< CALCUL :
< ON CONSIDERE LA FACETTE TRIANGULAIRE :
< (A(X,Y+I,Z(A)),B(X-I,Y+I,Z(B)),C(X,Y,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 &ALIGP1 < Z(B),
ADRI DFLOT,X
FSB &ALIGP1 < Z(B)-Z(A),
#/FST# FXN < X(N)=Z(B)-Z(A).
FLD &ALIG < Z(C),
FSB &ALIGP1 < 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,Z(D)),B(X-I,Y+I,Z(B)),C(X,Y,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 &ALIG < Z(C),
ADRI -DFLOT,X
FSB &ALIG < 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 &ALIGP1 < Z(B),
FSB &ALIG < 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 "BASSE" :
<
PLR X < RESTAURATION DE LA COORDONNEE 'X'...
BSR AINTEN < (A,B)=INTENSITE LUMINEUSE "BASSE",
#/FST# INTENB < ET SAUVEGARDE...
PSR X < RE-SAUVEGARDE DE 'X',
ADR X,X < PASSAGE A UN INDEX FLOTTANT,
FST &AINT < ET SAUVEGARDE DANS LA LIGNE COURANTE...
PLR X < ET RESTAURE 'X'...
<
< TEST DE VISIBILITE :
< (NOTA : AUTREFOIS, CE
< TEST SE TROUVAIT JUSTE
< DERRIERE 'GEN420', MAIS
< EN FAIT IL FAUT LE METTRE
< ICI AFIN QUE LA LISTE 'INT'
< SOIT A JOUR...)
<
CPZ IPERS < EST-CE UNE VUE D'AVION ???
JE GEN80 < OUI, DONC PAS DE LIGNES CACHEES !!!
LA VECGY2 < (A)=ORDONNEE DU "HAUT" DU VECTEUR
< VERTICAL...
CP VECGY1 < ALORS, LE "HAUT" EST-IL BIEN AU-DESSUS
< DU "BAS" ???
JGE GEN80 < OUI...
BSR AGOTO
WORD GEN32 < NON, ON IGNORE CE VECTEUR...
GEN80: EQU $
<
< TRACE DU VECTEUR :
<
LR Y,A < (A)=ORDONNEE COURANTE :
CPI YPLAN3 < CONNAIT-ON 'INTENH' ???
JLE GEN802 < NON, ON NE TRACE PAS...
BSR ASEGV < TRACE NORMAL...
<
< TEST DE L'ANTI-ALIASING :
<
IF NEXIST-K,,XEIF%,
IF ATTENTION : LES TESTS CI-DESSOUS SONT IDIOTS !!!
XEIF%: VAL ENDIF
CPZ IPERS < EST-CE UNE VUE D'AVION ???
JE GEN520 < OUI, DONC PAS D'ANTI-ALIASING...
CPZ IALIAS < NON, L'ANTI-ALIASING EST-IL DEMANDE ???
JE GEN520 < NON, RIEN A FAIRE...
<
< OUI, TRAITEMENT ANTI-ALIASING :
<
LA VECGY2 < (A)=ORDONNEE "HAUTE" COURANTE,
XM LSTGY2 < (A)=ORDONNEE "HAUTE" PRECEDENTE, ET MISE
< A JOUR DE 'LSTGY2'...
STA FWORK2 < ET SAUVEGARDE DE 'LSTGY2' AVANT SA MISE
< A JOUR POUR UNE UTILISATION ULTERIEURE...
#/FLD# LSTENH < (A,B)=INTENSITE LUMINEUSE "HAUTE" DU
< VECTEUR VERTICAL PRECEDENT A
< PRIORI...
#/FST# FWORK1 < ET SAUVEGARDE DE 'LSTENH' AVANT SA MISE
< A JOUR, POUR UNE UTILISATION ULTE-
< RIEURE...
#/FLD# INTENH
#/FST# LSTENH < ET MISE A JOUR DE 'LSTENH'...
LA &ALISTY < BON, MAINTENANT QUE L'ON A CORRECTEMENT
< POSITIONNE 'LSTGY2' ET 'LSTENH', EST-ON
< EN PRESENCE D'UNE DISCONTINUITE ???
< (A)=NUMERO DE LA LIGNE CORRESPONDANT
< AU DERNIER VECTEUR VERTICAL TRACE
< AVEC LE NUMERO DE COLONNE (X) OU
< ABSCISSE COURANTE,
ADRI I,A
STY &ALISTY < ET MISE-A-JOUR DE LA LISTE 'LISTY'...
CPR A,Y < Y-A-T'IL DISCONTINUITE ???
JE GEN520 < NON, PUISQU'IL Y A UNE DIFFERENCE D'UNE
< SEULE UNITE...
ADRI -INCIX,X < OUI :
LA &ALISTY < (A)=NUMERO DE LA LIGNE CORRESPONDANT
< A L'HYPOTHETIQUE VECTEUR VERTICAL
< PRECEDENT...
ADRI INCIX,X
CPR A,Y < A-T'ON EFFECTIVEMENT TRAITE LE VECTEUR
< VERTICAL PRECEDENT SUR CETTE MEME LIGNE
< D'ORDONNEE (Y) ???
JNE GEN520 < NON, ON NE PEUT DONC RIEN FAIRE...
CPZ FWORK1 < EST-CE EN FAIT LE PREMIER POINT DE LA
< LIGNE COURANTE ???
JE GEN520 < OUI, RIEN A FAIRE...
LA FWORK2 < (A)=ORDONNEE "HAUTE" PRECEDENTE,
STA VECGY1 < ET MISE EN PLACE A PRIORI DE L'ORDONNEE
< "BASSE" DU TRACE ANTI-ALIASING...
CP VECGY2 < ET COMPARAISON A L'ORDONNEE "HAUTE" DU
< POINT COURANT :
JE GEN520 < RIEN A FAIRE, ON EST SUR UN PALIER
< HORIZONTAL...
JG GEN501 < (LSTGY2) > (VECGY2) : LE POINT "HAUT"
< COURANT EST AU-DESSOUS DU POINT "HAUT"
< PRECEDENT, C'EST DONC LE VECTEUR COURANT
< QU'IL CONVIENT DE MODIFIER...
IF INCIX+I,,XEIF%,
IF ATTENTION : IL FAUT REMPLACER LES 'IC'
IF QUI SUIVENT PAR DES 'DC' !!!
XEIF%: VAL ENDIF
IC VECGX1 < ET PASSAGE SUR LE VECTEUR
IC VECGX2 < PRECEDENT...
#/FLD# FWORK1 < (A,B)=INTENSITE LUMINEUSE "HAUTE" DU
< VECTEUR VERTICAL COURANT...
JMP GEN502 < VERS LE TRACE...
GEN501: EQU $
LA VECGY1 < DANS LE CAS OU LE POINT "HAUT" COURANT
XM VECGY2 < EST AU-DESSOUS DU POINT "HAUT" PRECEDENT,
STA VECGY1 < ON PERMUTE 'VECGY1' ET 'VECGY2'...
< NOTA : (VECGX1)=(VECGX2), DONC IL EST
< INUTILE DE LES PERMUTER...
#/FLD# INTENH < (A,B)=INTENSITE LUMINEUSE "HAUTE"...
GEN502: EQU $
#/FST# INTENB < ET L'INTENSITE "BASSE" COURANTE EST
< SOIT L'INTENSITE "HAUTE", SOIT L'INTE-
< SITE "HAUTE" DU VECTEUR PRECEDENT,
< SUIVANT QUE L'ON MODIFIE LE VECTEUR
< COURANT OU LE VECTEUR PRECEDENT...
PSR X,Y < OUI, IL FAUT FAIRE DE L'ANTI-ALIASING...
LX VECGX2 < (X)=ABSCISSE DU POINT "HAUT",
LY VECGY2 < (Y)=ORDONNEE DU POINT "HAUT",
BSR ALOADP < RENVOIE :
< (A)=NIVEAU DE TRACE DU POINT (X,Y),
LR A,X
LBY &ALNOVI < (A)=NIVEAU CALCULE APPROXIMATIF DU
< POINT (X,Y),
FLT < QUE L'ON FLOTTE...
PLR X,Y
#/FST# INTENH < ET CECI AFIN D'INTERPOLER A PARTIR DU
< NIVEAU PRESENT ANTERIEUREMENT, OU A
< PARTIR DU NIVEAU DE NOIR, SI LE NIVEAU
< TROUVE PAR 'LOADP' NE FIGURE PAS DANS
< 'LNIVO' (C'EST LE CAS PAR EXEMPLE DE LA
< SUPERPOSITION DE 2 IMAGES...).
BSR ASEGV < ET CORRECTION ANTI-ALIASING SOIT DU
< VECTEUR COURANT, SOIT DU VECTEUR
< PRECEDENT, SUIVANT LEURS TAILLES
< RELATIVES...
GEN520: EQU $
GEN802: EQU $
<
< PASSAGE AU VECTEUR VERTICAL SUIVANT :
<
GEN32: EQU $
ADRI INCIX,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...
LA AINTM1 < LIGNE PRECEDENTE,
XM AINT < QUI EST ECRASEE,
STA AINTM1 < 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
<
< TRAITEMENT DE FIN...
<
CPZ IQUIT < FAUT-IL S'ARRETER ???
JE GEN610 < NON...
IF EXIST-K,XEIF%,,XEIF%
IF ATTENTION : LE TEST CI-DESSUS EST IDIOT !!!
XEIF%: VAL ENDIF
QUIT XXQUIT < OUI...
GEN610: EQU $
CPZ IVIDEO < FAUT-IL ECRIRE ???
JE GEN600 < NON...
IF EXIST-K,XEIF%,,XEIF%
IF ATTENTION : LE TEST CI-DESSUS EST IDIOT !!!
XEIF%: VAL ENDIF
PSR X < OUI :
LRM A
WORD DEMVIW
SVC < ON ECRIT L'IMAGE COURANTE...
LRM A
WORD DEMVIR
SVC < ET ON ATTEND L'ACQUITTEMENT...
PLR X
GEN600: EQU $
<
< PASSAGE A L'IMAGE SUIVANTE :
<
BSR AGOTO < ET ON ITERE EVENTUELLEMENT...
WORD DEBUT4
<
<
< 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 D E F I N I T I O N S U R F A C E 3 D :
<
<
$EQU AMPLI
FLOAT 1 < AMPLIFICATEUR DE LA FONCTION.
$EQU MOYENE
FLOAT <NIV256/XXXMOY<K<K
< VALEUR MOYENNE DE LA FONCTION.
$EQU EXPOP0
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 5713 < GRAINE DU GENERATEUR ALEATOIRE.
$EQU SUPRDN
NTRN
WORD XXN255/XXXMOY < SUP(RDN).
TRN
$EQU INFRDN
NTRN
WORD -XXN255/XXXMOY < INF(RDN).
TRN
$EQU AMPLIR
FLOAT <W<K<K < AMPLIFICATEUR DE L'ALEATOIRE.
<
<
< U P D A T E S T R A C E F I N A L :
<
<
$EQU MAXNIV
WORD XXN255 < NIVEAU MAXIMAL AUTORISE...
$EQU MINNIV
WORD XXNOIR+Z < NIVEAU MINIMAL AUTORISE...
<
<
< U P D A T E S E C L A I R A G E :
<
<
$EQU TRX
WORD 0 < TRANSLATION EN 'X'.
$EQU TRY
WORD 128 < TRANSLATION EN 'Y'.
$EQU FXL
FLOAT 1000 < X(SOURCE LUMINEUSE).
$EQU FYL
FLOAT 400 < Y(SOURCE LUMINEUSE).
$EQU FZL
FLOAT 0 < Z(SOURCE LUMINEUSE).
$EQU NPENOM
WORD 12 < LARGEUR DE LA ZONE DE PENOMBRE.
<
<
< U P D A T E S F I L T R A G E :
<
<
$EQU ALPHA
FLOAT 0.5 < CONSTANTE D'ELIMINATION DES PICS.
<
<
< M O D U L A T I N D E L A L U M I N A N C E :
< P A R ' T V 1 ' ( ' I M O D T V ' ) :
<
<
$EQU PASM
WORD W < PAS DE PARCOURS DE LA SPIR-MAP,
$EQU NMM
WORD 15 < NOMBRE DE POINTS DE CHAQUE SPIR-MAP.
$EQU XCTCDA
WORD TV1 < POUR ATTEINDRE L'IMAGE 'TV1'...
<
<
< C O N T R I B U T I O N A L E A T O I R E / ' T V 2 '
< A L A D E F I N I T I O N D E L A S U R F A C E :
<
<
$EQU PONRDN
FLOAT <W<K<K < CONTRIBUTION DE LA GENERATION ALEATOIRE,
$EQU PONSPI
FLOAT <K<K<K < CONTRIBUTION DES SPIR-MAPS.
<
<
< E N T R E E B A N D E M A G N E T I Q U E :
<
<
$EQU TRANMT
FLOAT <K<K<K < TRANSLATION FONCTION BANDE.
$EQU MULTMT
FLOAT <W<K<K < ECHELLE FONCTION BANDE.
<
<
< U P D A T E S T E X T U R A G E 3 D :
<
<
$EQU GRAINR
WORD 9237 < GRAINE DU GENERATEUR DE 'NRECUR'.
$EQU FH
FLOAT <K<K<K < "DEPTH-CUEING" MAXIMAL...
$EQU FPERSB
FLOAT <W<K<K < PAS DE MISE EN "FUITE" A PRIORI...
$EQU AMPLYR
FLOAT 1.5 < AMPLYFICATEUR DE LA FUNCTION.
$EQU MOYENF
FLOAT <NIV256/XXXMOY<K<K
< VALEUR MOYENNE DE LA FUNCTION.
$EQU EXPOQ0
FLOAT 0.5 < EXPOSANT DE DECROISSANCE DE PONDERATION.
$EQU PAZIX0
WORD 50 < PAZ INITIAL SUR 'OX'.
$EQU PAZIY0
WORD 50 < PAZ INITIAL SUR 'OY'.
$EQU PAZIZ0
WORD 50 < PAZ INITIAL SUR 'OZ'.
$EQU MREKUR
WORD 1 < PROFONDEUR MAXIMALE DE REKURENCE.
$EQU GRAINF
WORD 4660 < GRAINF DU GENERATEUR ALEATOIRE.
$EQU SUPRAN
NTRN
WORD XXN255/XXXMOY < SUP(RAN).
TRN
$EQU INFRAN
NTRN
WORD -XXN255/XXXMOY < INF(RAN).
TRN
<
<
< U P D A T E S G A U S S I E N N E T E X T U R A G E 3 D :
<
<
$EQU TXGAUS
XWOR%1: VAL XC512/XXXMOY
WORD XWOR%1 < TRANSLATION DES COORDONNEES 'X',
$EQU DXGAUS
XWOR%2: VAL XWOR%1/XXXMOY
FLOAT <XWOR%2*XWOR%2<NILK<NILK
< NORMALISATEUR DE (X-TX)**2.
$EQU TYGAUS
XWOR%1: VAL XL512/XXXMOY
WORD XWOR%1 < TRANSLATION DES COORDONNEES 'Y',
$EQU DYGAUS
XWOR%2: VAL XWOR%1/XXXMOY
FLOAT <XWOR%2*XWOR%2<NILK<NILK
< NORMALISATEUR DE (Y-TY)**2.
$EQU TZGAUS
XWOR%1: VAL ZCOUCH/XXXMOY
WORD XWOR%1 < TRANSLATION DES COORDONNEES 'Z',
$EQU DZGAUS
XWOR%2: VAL XWOR%1/XXXMOY
FLOAT <XWOR%2*XWOR%2<NILK<NILK
< NORMALISATEUR DE (Z-TZ)**2.
<
<
< C O N T R I B U T I O N S D E S T E X T U R A G E S 3 D
< ( ' I T E X T U ' ) :
<
<
$EQU PONRAN
FLOAT <W<K<K < CONTRIBUTION TEXTURE ALEATOIRE,
$EQU PONSPJ
FLOAT <K<K<K < CONTRIBUTION TEXTURE SPIR-MAP : PRENDRE
< 0 (ABSENCE) OU 256/7/4=8 (PRESENCE ; 256,
< AFIN DE BALAYER TOUTE LA PLAGE,
< DIVISE PAR 7 AFIN DE COMPENSER LA
< MULTIPLICATION PAR LA NIVEAU MAX DES
< IMAGES 'TV2' ET DIVISER PAR 4 POUR COM-
< PENSER LA MULTIPLICATION PAR 4 DES
< RESULTATS DE 'SPIRD'...).
<
<
< S E U I L L A G E P A R D E S P L A N S D E C O U P E :
<
<
$EQU FALTX
FLOAT <K<K<K
$EQU FALTY
FLOAT <K<K<K
$EQU FALTZ
FLOAT <W<K<K < AINSI, ON TEXTURE PAR 'ZS'...
$EQU FALTR
FLOAT <K<K<K
<
<
< S U P E R P O S I T I O N D ' U N C H A M P D ' A L T I T U D E S
< D E F I N I P A R ' T V 2 ' ( ' P O N S P I ' ) :
<
<
$EQU PASD
WORD W < PAS DE PARCOURS DE LA SPIR-DEP,
$EQU NDM
WORD 15 < NOMBRE DE POINTS DE CHAQUE SPIR-DEP.
$EQU FCOEFB
FLOAT -1.0 < COEFFICIENT DES EXPOSANTS DES EXPO-
< NENTIELLES DE PONDERATION DES POINTS
< DES SPIR-DEPS.
$EQU FCOEFA
FLOAT 1.0 < POUR PONDERER LA SOMME DES POINTS SUR
< UNE SPIR-DEP DE MODULATION VERTICALE...
<
<
< H O M O T H E T I E D U C H A M P :
<
<
$EQU FHOMO
FLOAT 1.0 < A PRIORI, PAS D'HOMOTHETIE...
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
Copyright © Jean-François COLONNA, 2022-2024.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / École polytechnique, Institut Polytechnique de Paris, 2022-2024.