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#
<
<
< 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...
DIMSPH:: VAL 64 < RAYON MAXIMAL D'UNE SPHERE.
PAGE
<
<
< O P T I O N S D ' A S S E M B L A G E :
<
<
XOPT01: @
XWOR%1: VAL KOLF=FMASK+KOLTES=FVAL
XWOR%1: VAL KOLC=FMASK+KDP=FVAL?XWOR%1
XWOR%2: VAL KOLTED=FMASK+KOL0=FVAL
XWOR%2: VAL KOLTEF=FMASK+KOL0+KOLON=FVAL?XWOR%2
XWOR%3: VAL XWOR%2=XWOR%1-KOL0 < LONGUEUR DU SYMBOLE COURANT...
XWOR%4: VAL MSYMBI=FMASK+KOL0=FVAL
XWOR%4: VAL MSYMBL=FMASK+XWOR%3=FVAL?XWOR%4
XWOR%5: VAL XWOR%4=FCSYMT < ETAT DU SYMBOLE 'XOPT01'...
XWOR%6: VAL XWOR%5=FCSIGN
XWOR%7: VAL XWOR%5(MSYMBN)MSYMBN=FCSIGN
IF XWOR%6*XWOR%7,XEIF%,,XEIF%
XOPT01:: VAL EXIST < TRACE GRAPHIQUE, ET VERIFICATIONS CROI-
< SEES DES EQUATIONS CALCULEES...
XEIF%: VAL ENDIF
PAGE
<
<
< B A S D E L A M E M O I R E :
<
<
ZERO: EQU $
DZS PEPROG-D+Z
<
< POINT D'ENTREE :
<
ENTRY: EQU $
LRM A,K
WORD DEBUT < POINT D'ENTREE DU PROGRAMME,
WORD STACK-DEPILE < INITIALISATION DE LA PILE.
PSR A
RSR < ON EFFECTUE AINSI UN 'GOTO' 'DEBUT'...
PAGE
<
<
< D E F I N I T I O N D U B L O C D E S C R I P T E U R
< D ' U N P O I N T :
<
<
NPOINT:: VAL 400 < NOMBRE DE POINTS DU NUAGE A GENERER...
DSEC
DESCPT: EQU $
DCS3D: EQU $ < DEBUT DE LA LISTE DES COORDONNEES
< TRI-DIMENSIONNELLES DANS L'ESPACE
< EUCLIDIEN DE LA REPRESENTATION GRA-
< PHIQUE :
DFXS: FLOAT <NILK<NILK<NILK < COORDONNEE 'X',
DFYS: FLOAT <NILK<NILK<NILK < COORDONNEE 'Y',
DFZS: FLOAT <NILK<NILK<NILK < COORDONNEE 'Z'.
IF $-DCS3D/DFLOT-DIMGRA,,XEIF%,
IF ATTENTION : LA LISTE DES COORDONNEES EST MAUVAISE !!!
XEIF%: VAL ENDIF
DRAYON: WORD NILK < RAYON DE LA SPHERE.
<
< FIN DU DESCRIPTEUR :
<
LDESCP:: VAL $-DESCPT < LONGUEUR DU DESCRIPTEUR...
PAGE
<
<
< M E S S A G E S :
<
<
TABLE
<
<
< C O M M O N :
<
<
COMMON
COM: EQU $
<
< MOT DESTINE AU BLOC FLOTTANT :
<
COMFLO: WORD NILK < MOT "BIDON" DESTINE AU BLOC FLOTTANT
< POUR QU'IL Y FIT SES MERDES...
ATSFLO: WORD TSFLO < POUR TESTER DE TEMPS EN TEMPS 'COMFLO'...
<
< INDICATEURS DE CONTROLE :
<
ANPOIN: WORD NPOINT < NOMBRE COURANT DE POINTS DU NUAGE.
ADIMGR: WORD DIMGRA < DIMENSION DE L'ESPACE GRAPHIQUE DE
< REPRESENTATION.
XNIVP:: VAL 4 < PAS IMPLICITE DE PASSAGE D'UN NIVEAU
< A L'AUTRE.
AXNIVP: WORD XNIVP < PAS COURANT DE PASSAGE D'UN NIVEAU A
< L'AUTRE...
IERASE: WORD NEXIST < EFFACER ('EXIST'), OU NON ('NEXIST')
< L'ECRAN 512...
IF XOPT01-EXIST,XOPT1,,XOPT1
IWGPT: WORD EXIST < TRACER ('EXIST') OU PAS ('NEXIST') LE
< NUAGE DE POINTS GENERE.
XOPT1: VAL ENDIF
<
< CONSTANTES FLOTTANTES DE BASE :
<
F0: FLOAT <K<K<K < REMISE A ZERO FLOTTANTE...
F1: FLOAT <W<K<K < L'UNITE EN FLOTTANT...
XXXLOC: VAL YYYFLO < 'YYYFLO'.
CALL #SIP UTILITAIRES#
APWORK: EQU APFWOR < POUR LA COMPATIBILITE AVEC LES OVERLAYS
< DE " +" (CF. 'SIO...').
<
< DONNEES DE CALCUL D'UN
< PRODUIT SCALAIRE :
<
APRSCA: WORD PRSCA < CE SOUS-PROGRAMME CALCULE LE PRODUIT
< SCALAIRE DES 2 VECTEURS ARGUMENTS.
<
< POINT TRI-DIMENSIONNEL COURANT :
<
CS3D: EQU $ < DEBUT DES COORDONNEES 3D :
FXS: FLOAT <NILK<NILK<NILK < COORDONNEE 'X' 3D,
FYS: FLOAT <NILK<NILK<NILK < COORDONNEE 'Y' 3D,
FZS: FLOAT <NILK<NILK<NILK < COORDONNEE 'Z' 3D.
LBUF3D:: VAL $-CS3D < NOMBRE DE MOTS POUR UN POINT 3D...
IF LBUF3D/DFLOT-DIMGRA,,XEIF%,
IF ATTENTION : INCOHERENCE DANS LES
IF DIMENSIONS DE L'ESPACE DE TRACE GRAPHIQUE !!!
XEIF%: VAL ENDIF
<
< DONNEES DE 'MOVE' :
<
APMOV1: WORD PMOV1 < DEPLACEMENT DU POINT COURANT (DFXS,DFYS,
< DFZS) VERS (FXS,FYS,FZS).
<
< DONNEES DE LA PROJECTION :
<
FACT: FLOAT <NILK<NILK<NILK < FACTEUR D'ECHELLE...
SFACT: FLOAT <NILK<NILK<NILK < SAUVEGARDE DE 'FACT' A CAUSE DES
< ALT-MODES INTEMPESTIFS...
PZ: FLOAT <NILK<NILK<NILK < POSITION DU POINT DE VUE SUR L'AXE OZ,
< QUI EST DEVANT L'ECRAN...
TRX: WORD NILK < TRANSLATION DU
TRY: WORD NILK < TRACE (VISU ET RASTER).
CS2D: EQU $ < DEBUT DES COORDONNEES 2D :
YS: WORD NILK < COORDONNEES 2D DU
XS: WORD NILK < POINT 3D PROJETE...
LBUF2D:: VAL $-CS2D < NOMBRE DE MOTS NECESSAIRES POUR UN POINT,
LBUFGR:: VAL LBUF2D+LBUF2D < ET POUR UN VECTEUR.
COORDX:: VAL XS-CS2D < INDEX DE LA COORDONNEE 'X',
COORDY:: VAL YS-CS2D < INDEX DE LA COORDONNEE 'Y'.
APROJ: WORD PROJ < SOUS-PROGRAMME DE PROJECTION 3D --> 2D...
IF XOPT01-EXIST,XOPT1,,XOPT1
<
< DONNEES DU TRACE GRAPHIQUE :
<
BUFGR: EQU $
BUFGR1: DZS LBUF2D < ORIGINE D'UN VECTEUR,
BUFGR2: DZS LBUF2D < ET EXTREMITE.
DEMOG: BYTE NVPOUT;FAVOG < MISE EN GRAPHIQUE DE LA VISU.
DEMCG: BYTE NVPOUT;FAVCG < RETOUR EN ALPHA-NUMERIQUE DE LA VISU.
DEMWG: BYTE NVPOUT;FAVWG < ECRITURE GRAPHIQUE D'UN VECTEUR.
WORD BUFGR=FCTA*NOCMO
WORD LBUFGR*NOCMO
DEMWD0: BYTE NVPOUT;FAVWD < DEMANDE DE MISE EN MODE NORMAL...
BYTE KESC;'60;KEOT
DEMWD1: BYTE NVPOUT;FAVWD < DEMANDE DE MISE EN POINTILLES...
BYTE KESC;'61;KEOT
DEMWD2: BYTE NVPOUT;FAVWD < DEMANDE DE MISE EN TIRETES...
BYTE KESC;'63;KEOT
<
< DEMANDE D'EFFACEMENT
< DE L'ECRAN DE LA VISU :
<
DEMERA: BYTE NVPOUT;FAVER < DEMANDE D'EFFACEMENT DE L'ECRAN DE LA
< VISU DE DIALOGUE.
XOPT1: VAL ENDIF
<
< DEMANDE DE TEMPORISATION
< APRES EFFACEMENT :
<
TEMPO: BYTE NVPSER;FONDOR
WORD NILK < INUTILE...
WORD XXXMOY < 2 PETITES SECONDES...
XXXLOC: VAL YYYGOT < 'YYYGOT'.
CALL #SIP UTILITAIRES#
XXXVEC: VAL XXVEC2 < DEFINITION DES DONNEES DU VECTEUR 512...
CALL #SIP VECTEUR 512#
APOINT: WORD STORP < RANGEMENT D'UN POINT POUR 'POINT'...
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
<
< DONNEES POUR LE GENERATEUR ALEATOIRE :
<
XTYPX:: VAL 3571 < TYPE "COORDONNEE X",
XTYPY:: VAL XTYPX+567 < TYPE "COORDONNEE Y",
XTYPZ:: VAL XTYPY+2391 < TYPE "COORDONNEE Z",
XTYPR:: VAL XTYPZ+12491 < TYPE "RAYON DE LA SPHERE".
RDN7: WORD 793 < DECOMPTEUR D'ACCES A LA SECONDE,
RDN8: WORD 1 < VALEUR COURANTE DE 'RDN7'.
RDN9: WORD 0 < SECONDE COURANTE...
RDN: WORD 4397 < NOMBRE ALEATOIRE COURANT.
RDN1: WORD 5189 < CONSTANTES DE CALCUL
RDN3:: VAL 19 < DES NOMBRE ALEATOIRES...
RDN4: WORD 7993 < 2EME NOMBRE ALEATOIRE COURANT.
RDN5: WORD 4021
RDN6:: VAL 23
POINTS: WORD 16807
KRDN1: WORD 0
KRDN2: WORD 0
XKRDN1:: VAL 3 < INCREMENTEUR DE 'KRDN1'.
XKRDN2:: VAL 7 < DECOMPTEUR DE 'KRDN2'.
ASPRDN: WORD SPRDN < GENERATEUR DE NOMBRES ALEATOIRES.
<
< DEFINITION DU NUAGE :
<
AMPOIN: WORD NPOINT < NOMBRE MAXIMAL DE POINTS DU NUAGE.
<
< DEFINITION DES SPHERES,
< APPELEES AUSSI DISQUES :
<
XNIV0:: VAL 4 < PREMIER NIVEAU DU TRACE...
XEPAIS: VAL DIMSPH*XXXMOY+Z < DEFINITION DU PLUS GRAND CARRE CIRCONS-
< CRIT A UN DISQUE (SPHERE PROJETEE).
AEPAIS: WORD XEPAIS < DEFINITION DU COTE DU CARRE CIRCONS-
< CRIT AU DISQUE COURANT,
DEPAIS: WORD XEPAIS-Z/XXXMOY < DEFINITION DU RAYON DU DISQUE COURANT.
IF DIMSPH*XNIVP-XXN255-Z,XEIF%,XEIF%,
IF ATTENTION : IL VA Y AVOIR DEBORDEMENT
IF DES NIVEAUX DE GRIS REPRESENTATIFS !!!
XEIF%: VAL ENDIF
SAVEX: WORD NILK < COORDONNEES DU
SAVEY: WORD NILK < CENTRE.
ACERCL: WORD CERCLE < REMPLISSAGE D'UN DISQUE...
<
< VARAIBLES DE MANOEUVRE :
<
FWORK1: FLOAT <NILK<NILK<NILK
FWORK2: 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
PAGE
<
<
< P I L E D E T R A V A I L :
<
<
STACK: EQU $
DZS 64
PROG
USE W,DESCPT
XXXVEC: VAL XXVEC3 < DEFINITION DES PROGRAMMES VECTEUR 512...
CALL #SIP VECTEUR 512#
PAGE
<
<
< 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 $
$EQU ASTORP
WORD POINT < AFIN DE MARQUER VIA LA LISTE 'LNIVO'...
$EQU POINT
<
< TRANSCODAGE DU NIVEAU :
<
PSR X < SAUVEGARDE DE LA COORDONNEE 'X'...
LR A,X < (X)=NIVEAU ARGUMENT,
LBY &ALNIVO < (A)=NIVEAU TRANSCODE,
PLR X < RESTAURE :
< (X)=COORDONNEE 'X'.
<
< MARQUAGE DU POINT :
<
BSR APOINT < 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
XXXPRO: VAL YYYGOT < 'YYYGOT'.
CALL #SIP UTILITAIRES#
PAGE
<
<
< D E P L A C E M E N T D U P O I N T C O U R A N T :
<
<
< ARGUMENTS :
< (W)=ADRESSE DU DESCRIPTEUR DE POINT COURANT.
<
<
PMOV1: EQU $
<
< INITIALISATIONS :
<
PSR A,B,X
<
< DEPLACEMENT :
<
LAD DCS3D < (A)=ADRESSE DE L'EMETTEUR (DESCRIPTEUR
< COURANT),
LRM B,X
WORD CS3D < (B)=ADRESSE DU POINT COURANT,
WORD LBUF3D < (X)=NOMBRE DE POINTS A DEPLACER.
MOVE < ET MOVE : DESCRIPTEUR --> (FXS,FYS,FZS).
<
< ET RETOUR :
<
PLR A,B,X
RSR
PAGE
<
<
< P R O J E C T I O N 3 D --> 2 D :
<
<
< ARGUMENT :
< (FXS,FYS,FZS)=POINT 3D.
<
<
< RESULTAT :
< (XS,YS)=POINT 2D PROJETE SUIVANT 'IPROJ'.
<
<
PROJ: EQU $
<
< INITIALISATIONS :
<
PSR A,B < SAUVEGARDES...
#/FLD# FZS
<
< PROJECTION PERSPECTIVE SUR 'OX' :
<
FDV PZ
BSR ATSFLO
FSB F1
BSR AFNEG
BSR ASFWOR < 1-(FZS/PZ)
BSR AFCAZ
JNE EOK3 < OK, 1-(FZS/PZ)#0...
QUIT XXQUIT < E R R E U R P R O G R A M M E ...
EOK3: EQU $
#/FLD# FXS
FDV FWORK < FXS/(1-(FZS/PZ))
BSR ATSFLO
<
< CALCUL DE 'XS' :
<
FDV FACT < MISE A L'ECHELLE 2D...
BSR AROND
AD TRX < TRANSLATION 2D...
STA XS
<
< PROJECTION PERSPECTIVE SUR 'OY' :
<
#/FLD# FYS
FDV FWORK < FYS/(1-(FZS/PZ))
BSR ATSFLO
<
< CALCUL DE 'YS' :
<
FDV FACT < MISE A L'ECHELLE 2D...
BSR AROND
AD TRY < TRANSLATION 2D...
STA YS
<
< SORTIE :
<
PLR A,B < RESTAURATIONS...
RSR
XXXPRO: VAL YYYFLO < 'YYYFLO'.
CALL #SIP UTILITAIRES#
PAGE
<
<
< P R O D U I T S C A L A I R E D E 2 V E C T E U R S :
<
<
< ARGUMENTS :
< (A)=ADRESSE DU PREMIER VECTEUR 'VECT1',
< (B)=ADRESSE DU DEUXIEME VECTEUR 'VECT2'.
<
<
< RESULTAT :
< (A,B)=VALEUR DU PRODUIT SCALAIRE...
<
<
< ATTENTION :
< AUX BASES 'L' ET 'W' !!!
<
<
PRSCA: EQU $
VECT1X:: MOT O < X(VECT1),
VECT1Y:: MOT VECT1X+DFLOT < Y(VECT1),
VECT1Z:: MOT VECT1Y+DFLOT < Z(VECT1).
VECT2X:: MOT O < X(VECT2),
VECT2Y:: MOT VECT2X+DFLOT < Y(VECT2),
VECT2Z:: MOT VECT2Y+DFLOT < Z(VECT2).
<
< INITIALISATIONS :
<
PSR Y,L,W < SAUVEGARDE DE 2 BASES ; MAIS 'C' NE DOIT
< PAS ETRE UTILISEE A CAUSE DU BLOC FLOT-
< TANT...
LR L,Y < SAUVEGARDE DE 'L' DANS 'Y' POUR POUVOIR
< ACCEDER EVENTUELLEMENT LE 'LOCAL'...
LR A,L < (L)=BASE DU VECTEUR 'VECT1',
LR B,W < (W)=BASE DU VECTEUR 'VECT2'.
<
< CALCUL DU PRODUIT SCALAIRE :
<
#/FLD# VECT1X,L < X(1),
FMP VECT2X,W < X(1)*X(2),
BSR ASFWOR < ET SAVE...
#/FLD# VECT1Y,L < Y(1),
FMP VECT2Y,W < Y(1)*Y(2),
BSR APFWOR < X(1)*X(2)+Y(1)*Y(2),
< ET SAVE...
#/FLD# VECT1Z,L < Z(1),
FMP VECT2Z,W < Z(1)*Z(2),
BSR APFWOR < (A,B)=X(1)*X(2)+Y(1)*Y(2)+Z(1)*Z(2),
< SOIT LE PRODUIT SCALAIRE DES 2
< VECTEURS 'VECT1' ET 'VECT2'...
< ET MISE DANS 'FWORK', ON NE SAIT
< JAMAIS...
<
< ET RETOUR :
<
PLR Y,L,W
RSR
PAGE
<
<
< G E N E R A T E U R A L E A T O I R E :
<
<
< ARGUMENT :
< (X)=FONCTION DU NUMERO DU POINT COURANT,
< (Y)=CODE FONCTION DU TYPE DE COORDONNEE (X/Y/Z).
<
<
< RESULTAT :
< (A,B)=NOMBRE ALEATOIRE FLOTTANT.
<
<
SPRDN: EQU $
LA RDN < GENERATION DE NOMBRES ALEATOIRES :
EOR POINTS < ON INTRODUIT UN AUTRE PARAMETRE...
MP RDN1
SCRD RDN3
JANE SPMOYC
LR B,A
JANE SPMOYC
LA KRDN1
ADRI XKRDN1,A
SCRS XKRDN2
STA KRDN1 < PROGRESSION DE 'KRDN1'...
SPMOYC: EQU $
EORR X,A
STA RDN
DC RDN8
LA RDN9 < (A)=RDN9 A PRIORI...
JNE SPRDN1 < ET BIEN OUI... CE N'EST PAS L'HEURE...
LA RDN7 < C'EST L'HEURE D'ALLER CHERCHER
STA RDN8 < LA SECONDE COURANTE ??!?!??!
ACTD XXXTIM < (A)=HEURE COURANTE EN MULTIPLE DE 2S.
STA RDN9 < ET MEMORISATION...
SPRDN1: EQU $
EOR RDN
STA RDN
LA RDN4 < CALCUL D'UN 2EME NOMBRE ALEATOIRE...
MP RDN5
EOR POINTS
SCRD RDN6
JANE SPMOYF
LR B,A
JANE SPMOYF
LA KRDN2
ADRI -XKRDN2,A
SCRS XKRDN1
STA KRDN2 < PROGRESSION DE 'KRDN2'...
SPMOYF: EQU $
EORR Y,A
STA RDN4
EOR RDN
FLT < (A,B)=NOMBRE ALEATOIRE...
RSR
PAGE
<
<
< T R A C E D ' U N D I S Q U E :
<
<
< FONCTION :
< CE MODULE TRACE UN DISQUE EN
< DEGRADE DESTINE A REPRESENTER
< UNE SPHERE PROJETEE.
<
<
< ARGUMENTS :
< (X,Y)=CENTRE DU DISQUE (LE RAYON EST XEPAIS-Z/XXXMOY).
<
<
CERCLE: EQU $
<
< INITIALISATIONS :
<
PSR X,Y
LR X,B < (B)='X' DU CENTRE,
PSR Y < SAUVEGARDE DE 'Y' DU CENTRE.
LA DEPAIS
SBR A,X < ON SE PLACE EN HAUT ET A GAUCHE
SBR A,Y < D'UN CARRE CIRCONSCRIT AU DISQUE.
STX VECTX1 < INITIALISATION DE L'ABSCISSE INITIALE
< DE CHAQUE LIGNE,
STY VECTY1 < INITIALISATION DE LA COORDONNEE 'Y'.
PLR Y < ON A :
< (B,Y)=COORDONNEES DU CENTRE.
<
< BALAYAGE VERTICAL :
<
LX DEPAIS < (X)=NOMBRE DE LIGNES A BALAYER.
ADRI Z,X
CERCL1: EQU $
LA VECTX1
PSR A,X < SAUVEGARDE DE L'ABSCISSE INITIALE
< DE CHAQUE LIGNE (A) ET DU NOMBRE DE
< LIGNES A TRACER (X).
<
< BALAYAGE HORIZONTAL :
<
LX DEPAIS < (X)=NOMBRE DE POINTS PAR LIGNE.
ADRI Z,X
CERCL2: EQU $
PSR B < SAUVEGARDE DE LA COORDONNEE 'X'
< DU CENTRE.
LA VECTX1 < X1,
SBR B,A < X1-XC,
BSR AFLT
#/FST# FWORK1 < X1-XC,
FMP FWORK1 < (X1-XC)**2,
BSR ASFWOR
LA VECTY1 < Y1,
SBR Y,A < Y1-YC ((XC,YC) DESIGNE LE CENTRE).
BSR AFLT
#/FST# FWORK2 < Y1-YC,
FMP FWORK2 < (Y1-YC)**2,
BSR APFWOR < (X1-XC)**2+(Y1-YC)**2,
BSR ARAC < ET CALCUL DE LA DISTANCE DU POINT
< COURANT (X1,Y1) AU CENTRE (XC,YC) :
BSR ATSFLO
BSR AROND
CP DEPAIS < EST-ON HORS DU DISQUE ??
JGE CERCL3 < OUI, ON IGNORE CE POINT...
SB DEPAIS < NON :
NGR A,A < ON CALCULE DONC LE NIVEAU DU
< POINT QUE L'ON VA TRACER :
MP AXNIVP
ADRI XNIV0,B
STB VENIVO < CE NIVEAU EST PROPORTIONNEL A LA
< DISTANCE AU CENTRE...
LA VECTX1
LB VECTY1
PSR A,B < SAUVEGARDE DE (X1,Y1) VISU...
SARS XXDEDX
STA VECTX1 < PASSAGE AUX
LR B,A
SARS XXDEDY
STA VECTY1 < COORDONNEES 512...
BSR VECTA1 < ET ON MARQUE LE POINT (X1,Y1)...
PLR A,B
STA VECTX1 < RESTAURE LES
STB VECTY1 < COORDONNEES VISU...
CERCL3: EQU $
PLR B < RESTAURE L'ABSCISSE DU CENTRE,
DO BIT>XXDEDX
IC VECTX1 < ET PROGRESSION SUR LA LIGNE,
JDX CERCL2 < A CONDITION DE N'ETRE POINT EN BOUT
< DE LIGNE...
PLR A,X < RESTAURE :
< (A)='VECTX1' DE DEBUT DE LIGNE,
< (X)=NOMBRE DE LIGNES A TRACER...
STA VECTX1 < ON SE PLACE EN DEBUT
DO BIT>XXDEDY
IC VECTY1 < DE LA NOUVELLE LIGNE,
JDX CERCL1 < SI ELLE EXISTE...
<
< ET RETOUR :
<
PLR X,Y
RSR
PAGE
<
<
< P O I N T D ' E N T R E E :
<
<
DEBUT: EQU $
<
< INITIALISATION DES REGISTRES :
<
LRM C,K
WORD COM+DEPBAS < POSITIONNEMENT DE 'C',
WORD STACK-DEPILE < ET DE 'K'.
<
< CONNEXION A LA 'CDA' :
<
LAI PAGER
BSR AGPCDA < AFIN D'ATTEINDRE LA MEMOIRE DU '68000'
< ET LA MEMOIRE 'SOLAR' QUI LA PRECEDE
< AFIN D'Y METTRE 'BUF'...
<
<
< E N T R Y D E R E B O U C L A G E :
<
<
#/FLD# FACT < SAUVEGARDE DE 'FACT'
#/FST# SFACT < A CAUSE DES ALT-
< MODES INTEMPESTIFS...
DEBUT4: EQU $
#/FLD# SFACT
#/FST# FACT < AU CAS OU UN MALHEUREUX ALT-MODE...
<
< MODIFICATION A PRIORI DU 'PRESC' :
<
LRM A
WORD DEBUT5 < POUR 'XXXPRE'...
ACTD XXXPRE < ON CHANGE ALORS SYSTEMATIQUEMENT APRES
< PASSAGE ICI LE 'PRESC' DU PROGRAMME, AFIN
< DE REVENIR SUR LA VISUALISATION APRES
< CHAQUE ALT-MODE (VIA 'DEBUT5'...).
<
< VALIDATION DE 'ANPOIN' :
<
DEBUT9: EQU $
LA ANPOIN < ACCES A 'ANPOIN' :
JALE DEBUTA < ERREUR...
CP AMPOIN < VALIDATION :
JLE DEBUTB < OK...
DEBUTA: EQU $
QUIT XXQUIT < E R R E U R P R O G R A M M E ...
JMP DEBUT9 < ET ON RE-TESTE !!!
DEBUTB: EQU $
<
< VALIDATION DE 'AEPAIS' :
<
DEBUTC: EQU $
LA AEPAIS < (A)=EPAISSEUR DEMANDEE POUR LES
< RECTANGLES,
JALE DEBUTE < ERREUR...
CPI XEPAIS
JG DEBUTE < ERREUR...
ADRI -Z,A
SLRS XXXMOY=K < CALCUL DE XEPAIS-Z/XXXMOY :
JALE DEBUTE < ERREUR...
JNC DEBUTD < OK, LA DIVISION TOMBE JUSTE...
DEBUTE: EQU $
QUIT XXQUIT < 'AEPAIS' DOIT ETRE IMPAIR ET DE VALEUR
< VALEUR CONVENABLE...
JMP DEBUTC < ET ON RE-TESTE...
DEBUTD: EQU $
STA DEPAIS < ET MEMORISATION DE XEPAIS-Z/XXXMOY...
<
<
< G E N E R A T I O N D U N U A G E D E P O I N T S :
<
<
LX ANPOIN < (X)=NOMBRE DE POINTS A GENERER,
LRM W
WORD LPOINT < (W)=ADRESSE DE BASE DE LA LISTE DES
< DESCIPTEURS DE POINTS.
GEN1: EQU $
<
< GENERATION DES COORDONNEES :
<
LRM Y
WORD XTYPX < (Y)=TYPE "COORDONNEE X".
BSR ASPRDN < (A,B)=NOMBRE ALEATOIRE,
#/FST# DFXS < CE QUI DONNE 'X' ALEATOIRE.
LRM Y
WORD XTYPY < (Y)=TYPE "COORDONNEE Y",
BSR ASPRDN < (A,B)=NOMBRE ALEATOIRE,
#/FST# DFYS < CE QUI DONNE 'Y' ALEATOIRE.
#/FLD# F0
#/FST# DFZS < DFZS=0 A PRIORI...
LA ADIMGR
CPI DIMGRA < COMBIEN DE DIMENSIONS POUR LA VISUALI-
< SATION ???
JNE GEN5 < 2...
LRM Y < 3...
WORD XTYPZ < (Y)=TYPE "COORDONNEE Z",
BSR ASPRDN < (A,B)=NOMBRE ALEATOIRE,
#/FST# DFZS < CE QUI DONNE 'Z' ALEATOIRE.
GEN5: EQU $
<
< GENERATION DU RAYON :
<
LRM Y
WORD XTYPR < (Y)=TYPE "RAYON".
GEN4: EQU $
BSR ASPRDN < (A,B)=NOMBRE ALEATOIRE,
BSR AFABS < SEULE LA VALEUR ABSOLUE EST INTERESSANTE,
BSR AFIX < (A)=NOMBRE ENTIER POSITIF ALEATOIRE,
XWOR%1: VAL DIMSPH=K
IF BIT>XWOR%1-DIMSPH,,XEIF%,
IF ATTENTION : 'DIMSPH' DOIT ETRE UNE PUISSANCE DE 2 !!!
XEIF%: VAL ENDIF
ANDI DIMSPH-N < CALCUL MODULO 'DIMSPH' DU RAYON...
JAE GEN4 < NUL, REFUSE...
STA DRAYON < OK, MEMORISATION DU RAYON DE LA SPHERE
< CENTREE SUR LE POINT COURANT...
<
< PASSAGE AU DESCRIPTEUR SUIVANT :
<
ADRI LDESCP,W < PASSAGE AU DESCRIPTEUR SUIVANT,
JDX GEN1 < S'IL EXISTE...
IF XOPT01-EXIST,XOPT1,,XOPT1
<
<
< T R A C E D U N U A G E D E P O I N T S :
<
<
IF NEXIST-K,,XEIF%,
IF ATTENTION : LE TEST SUIVANT EST IDIOT !!!
XEIF%: VAL ENDIF
CPZ IWGPT < DOIT-ON TRACER LE NUAGE ???
JE GEN2 < NON...
#/FLD# FACT
PSR A,B < SAUVEGARDE DE 'FACT'...
FDV F05
#/FST# FACT < AFIN DE VOIR L'ENSEMBLE DU DESSIN...
LAD DEMERA < OUI :
SVC < ON EFFACE L'ECRAN.
LX ANPOIN < (X)=NOMBRE DE POINTS A TRACER,
LRM W
WORD LPOINT < (W)=ADRESSE DE LA LISTE DES DESCRIPTEURS.
GEN3: EQU $
PSR X
BSR APMOV1 < DEPLACEMENT DU DESCRIPTEUR COURANT (W)
< VERS LE POINT COURANT (FXS,FYS,FZS),
BSR APROJ < ET PROJECTION 2D --> 3D.
LRM A,B,X
WORD CS2D < (A)=ADRESSE DU POINT 2D COURANT,
WORD BUFGR1 < (B)=ADRESSE DU BUFFER ORIGINE GRAPHIQUE,
WORD LBUF2D < (X)=NOMBRE DE MOTS A DEPLACER,
MOVE < ET MISE EN PLACE DE L'ORIGINE.
LRM B,X
WORD BUFGR2 < (B)=ADRESSE DU BUFFER EXTREMITE GRAPHIQUE
WORD LBUF2D < (X)=NOMBRE DE MOTS A DEPLACER,
MOVE < ET MISE EN PLACE DE L'EXTREMITE.
LAD DEMOG
SVC < ET ON FAIT UNE MISE EN GRAPHIQUE, PERMET-
< TANT PAR LA MEME OCCASION DE NE PAS
< CHAINER LES POINTS ENTRE-EUX...
LAD DEMWG
SVC < TRACE DU POINT COURANT...
PLR X < RESTAURE LE DECOMPTE,
ADRI LDESCP,W < PASSAGE AU DESCRIPTEUR SUIVANT,
JDX GEN3 < S'IL EXISTE...
LAD DEMCG
SVC < ET RETOUR EN ALPHA-NUMERIQUE...
PLR A,B
#/FST# FACT < RESTAURATION DE 'FACT'...
GEN2: EQU $
XOPT1: VAL ENDIF
<
<
< G E N E R A T I O N D E L ' I M A G E :
<
<
GEN69: EQU $
QUIT XXQUIT < P O U R R E F L E C H I R ...
CPZ IERASE < FAUT-IL EFFACER ???
JE GEN69N < NON...
IF NEXIST-K,,XEIF%,
IF ATTENTION : LE TEST CI-DESSUS EST IDIOT !!!
XEIF%: VAL ENDIF
<
< EFFACEMENT DE L'ECRAN :
<
XWOR%1: VAL NIV256=K
IF BIT>XWOR%1-NIV256,,XWOR%,
IF ATTENTION : LE CALCUL DU MASQUE SELECTANT TOUS
IF LES PLANS EST ABSURDE !!!
XWOR%: VAL ENDIF
LAI NIV256-MASK)MOCD
STA MCDAJ
LA ARPLAN < (A)=ADRESSE DU REGISTRE DE SELECTION...
BSR APWCDA < ET ON SELECTIONNE TOUS LES PLANS...
LAI ERASE
STA MCDAJ
LA ARCMD
BSR APWCDA < EFFACEMENT DE L'ECRAN, ET REINITIALISA-
< TION DE TOUS LES REGISTRES...
LAD TEMPO
SVC < ET ON FAIT UN PETIT DODO...
LAI XCTRL1
STA MCDAJ
LA ACTRL1
BSR APWCDA < INITIALISATION DE 'CTRL1'.
LAI XCTRL2
STA MCDAJ
LA ACTRL2
BSR APWCDA < INITIALISATION DE 'CTRL2'.
<
< INITIALISATION DES
< CONDITIONS DE TRACE :
<
GEN69N: EQU $
LAI VECTSB
STA VECTRS < MISE EN MODE 'SBT', SOIT 'OU-FLOU',
LRM A
WORD XXN255+Z=K+I
STA VEDECA < AFIN D'ECRASER LE NIVEAU ANTERIEUR...
<
< VISUALISATION DES POINTS DU NUAGE :
<
LX ANPOIN < (X)=NOMBRE DE POINTS DANS LE NUAGE,
LRM W
WORD LPOINT < (W)=ADRESSE DE LA BASE DES DEXCRIPTEURS.
GEN70: EQU $
PSR X < SAUVEGARDE DU NOMBRE DE POINTS...
BSR APMOV1 < DEPLACEMENT DE P(I) --> (FXS,FYS),
BSR APROJ < QUE L'ON PROJETTE,
LRM A,B,X
WORD CS2D < (A)=ADRESSE DU POINT 2D COURANT,
WORD BUFGR1 < (B)=ADRESSE DU BUFFER ORIGINE GRAPHIQUE,
WORD LBUF2D < (X)=NOMBRE DE MOTS A DEPLACER,
MOVE < ET MISE EN PLACE DE L'ORIGINE P(I)...
LA DRAYON < (A)=RAYON DE LA SPHERE,
STA DEPAIS < CE QUI DONNE LE RAYON DU DISQUE,
SLLS XXXMOY=K
ADRI Z,A
STA AEPAIS < ET LE COTE DU CARRE CIRCONSCRIT...
LX BUFGR1+COORDX
LY BUFGR1+COORDY
BSR ACERCL < VISUALISATION DU POINT COURANT.
PLR X < RESTAURE :
< (X)=NOMBRE DE POINTS DU NUAGE...
ADRI LDESCP,W < PASSAGE AU POINT P(I) SUIVANT,
JDX GEN70 < S'IL EXISTE...
<
<
< E N T R Y A L T - M O D E :
<
<
DEBUT5: EQU $
QUIT XXQUIT < A T T E N T E ...
LRM C,K < ON REINITIALISE 'C' ET 'K' AU CAS
< D'UNE RE-ENTREE PAR UN 'ALT-MODE'...
WORD COM+DEPBAS < 'C',
WORD STACK-DEPILE < 'K'.
BSR AGOTO
WORD DEBUT4 < (A)=ADRESSE D'ITERATION SUR ALT-MODE...
PAGE
<
<
< L I S T E D E S D E S C R I P T E U R S D E P O I N T S :
<
<
LPOINT: EQU $
IF LPOINT=FCTA,,,XEIF%
IF ATTENTION : A CAUSE DE 'VOISEX', TOUTES LES
IF ADRESSES DE 'LPOINT' DOIVENT ETRE STRICTEMENT
IF POSITIVES !!!
XEIF%: VAL ENDIF
DO NPOINT
DZS LDESCP
IF $=FCTA-K,,,XEIF%
IF ATTENTION : A CAUSE DE 'VOISEX',
IF TOUTES LES ADRESSES DE 'LPOINT'
IF DOIVENT ETRE STRICTEMENT POSITIVES !!!
XEIF%: VAL ENDIF
PAGE
<
<
< U P D A T E S :
<
<
$EQU PZ
FLOAT 1000 < POINT DE VUE DE L'OBSERVATEUR.
$EQU FACT
FLOAT 70 < FACTEUR D'ECHELLE DE LA PROJECTION.
$EQU TRX
WORD SIZXVI/XXXMOY < X-TRANSLATION GRAPHIQUE.
$EQU TRY
WORD SIZYVI/XXXMOY < Y-TRANSLATION GRAPHIQUE.
$EQU ADIMGR
WORD DIMGR2 < DIMENSION DE L'ESPACE GRAPHIQUE.
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.