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