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
<
< 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 :
<
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).
IVIDEO: WORD NEXIST < ECRIRE ('EXIST') L'IMAGE COURANTE SUR LE
< DISQUE VIDEO OU PAS ('NEXIST').
ABLOC0: WORD K < ADRESSE DU PREMIER BLOC A LIRE.
LBLOC: WORD LBUFMT < LONGUEUR DES BLOCS PHYSIQUES SUR LA
< BANDE.
IVISD: WORD EXIST < TRACER ('EXIST') OU PAS ('NEXIST') LES
< DISQUES SYMBOLISANT LES SITES.
TXMIN: WORD NILK < AFIN DE DEFINIR LA TRANCHE D'ESPACE
TXMAX: WORD NILK < A VISUALISER : X DANS (TXMIN,TXMAX).
TYMIN: WORD NILK < AFIN DE DEFINIR LA TRANCHE D'ESPACE
TYMAX: WORD NILK < A VISUALISER : Y DANS (TYMIN,TYMAX).
TZMIN: WORD NILK < AFIN DE DEFINIR LA TRANCHE D'ESPACE
TZMAX: WORD NILK < A VISUALISER : Z DANS (TZMIN,TZMAX).
RAYON: WORD NILK < RAYON DES ETOILES.
INEW1: WORD NEXIST < 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...
GRARDN: WORD NILK < GRAINEDU GENERATEUR ALEATOIRE...
SUPRDN: FLOAT <NILK<NILK<NILK < SUP(RDN),
INFRDN: FLOAT <NILK<NILK<NILK < INF(RDN).
GRARDM: WORD NILK < GRAINE DU GENERATEUR ALEATOIRE...
SUPRDM: FLOAT <NILK<NILK<NILK < SUP(RDM),
INFRDM: FLOAT <NILK<NILK<NILK < INF(RDM).
FA50: FLOAT <NILK<NILK<NILK
FA0: FLOAT <NILK<NILK<NILK
FA1: FLOAT <NILK<NILK<NILK
FA11: FLOAT <NILK<NILK<NILK
FA12: FLOAT <NILK<NILK<NILK
FA21: FLOAT <NILK<NILK<NILK
FA22: FLOAT <NILK<NILK<NILK
FA31: FLOAT <NILK<NILK<NILK
FA23: FLOAT <NILK<NILK<NILK
FA13: FLOAT <NILK<NILK<NILK
FA2: FLOAT <NILK<NILK<NILK
FA41: FLOAT <NILK<NILK<NILK
FA3: FLOAT <NILK<NILK<NILK
<
< 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
<
< SAUVEGARDE DES COORDONNEES :
<
COORD: EQU $ < LISTE DES COORDONNEES :
SAVEX: WORD NILK
SAVEY: WORD NILK
SAVEZ: WORD NILK
PAGE0:: VAL K < PREMIERE PAGE DE LA 'CDAJ'.
RANG: WORD NILK < RANG DE LA PARTICULE COURANTE...
<
< 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).
LOGX:: VAL 9 < LOG2(DIM(X)),
LOGY:: VAL 9 < LOG2(DIM(Y)),
LOGZ:: VAL 9 < LOG2(DIM(Z)).
DECX:: VAL K < AMPLIFICATEUR DE 'X',
DECY:: VAL DECX < AMPLIFICATEUR DE 'Y',
DECZ:: VAL LOGZ+I < AMPLIFICATEUR DE 'Z' (ON PREND CETTE
< VALEUR POUR SHUNTER LA PROJECTION, SINON
< IL FAUT PRENDRE 'DECX').
TRANSX: WORD NILK < TRANSLATION DE 'X',
TRANSY: WORD NILK < TRANSLATION DE 'Y' (PROJETES).
APROJ: WORD PROJ < SOUS-PROGRAMME DE PROJECTION :
< (X,Y,W) --> (X,Y).
<
< DONNEES DE TRACE D'UN DISQUE :
<
LONGX:: VAL BIT>LOGX < LONGUEUR DE L'AXE 'X',
LONGY:: VAL BIT>LOGY < LONGUEUR DE L'AXE 'Y',
LONGZ:: VAL BIT>LOGZ < LONGUEUR DE L'AXE 'Z'.
XWOR%1: VAL XXN255+I
XWOR%2: VAL BIT>LOGZ
TRN
XWOR%3: VAL XWOR%2/XWOR%1=K
NTRN
XWOR%4: VAL XWOR%1=K-LOGZ < POUR AMPLIFIER LA COORDONNEE 'Z' LORS
DECZDK:: VAL -XWOR%4 < 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.
PAGE
<
<
< L O C A L :
<
<
LOCAL
LOC: EQU $
<
< CONSTANTES DE CALCUL DES SINUS ET COSINUS :
<
ASIN: WORD SIN < S/P DE CALCUL DU SINUS,
ACOS: WORD COS < ET DU COSINUS.
SCWOR1: FLOAT <NILK<NILK<NILK
SCWOR2: FLOAT <NILK<NILK<NILK
ISIGSC: WORD NILK < SIGNE...
DEUXPI: FLOAT 6.2831853 < 2*PI.
PI3141: FLOAT 3.1415926 < PI.
PISUR2: FLOAT 1.5707963 < PI/2.
POLSC1: FLOAT -0.6459636 < COEFFICIENTS
POLSC2: FLOAT 0.7968969E-1 < DU
POLSC3: FLOAT -0.4673766E-2 < POLYNOME
POLSC4: FLOAT 0.1514842E-3 < SIN(X)/COS(X).
<
< DONNEES DE CALCUL DE 'ARCTG' :
<
ATGT1: FLOAT <NILK<NILK<NILK < ZONE DE TRAVAIL NUMERO 1,
ATGT2: FLOAT <NILK<NILK<NILK < ZONE DE TRAVAIL NUMERO 2,
ATGT3: FLOAT <NILK<NILK<NILK < ZONE DE TRAVAIL NUMERO 3.
ATGSDX: WORD NILK < INDICATEUR "SIGNE DE X ARGUMENT":
< = 0 : POSITIF OU NUL;
< < 0 : NEGATIF.
ATGPSC: FLOAT 0.0548862 < TG(PI/12).
ATGPS2: FLOAT 1.5707963 < PI/2.
ATGPS3: FLOAT 1.0471975 < PI/3.
ATGPS6: FLOAT 0.5235988 < PI/6.
ATGUN: EQU F1
ATGR3: FLOAT 1.7320508 < RACINE(3).
ATGP1: FLOAT 0.6031058 < COEFFICIENTS
ATGP2: FLOAT 0.0516045 < (P1,P2,P3,P4)
ATGP3: FLOAT 0.5591371 < DU
ATGP4: FLOAT 1.4087812 < POLYNOME.
AARCTG: WORD ARCTG < SOUS-PROGRAMME DE CALCUL.
PI: FLOAT 3.1415927 < PI,
<
< POUR LE CALCUL DU LOGARITHME :
<
POLLO1: FLOAT <NILK<NILK<NILK < VARAIBLE DE MANOEUVRE...
POLLO2: FLOAT <NILK<NILK<NILK
POLLO3: FLOAT <NILK<NILK<NILK
POLLO4: FLOAT 0.7071067 < RACINE(2)/2.
POLLO5: FLOAT 1.2920088 < COEFFICIENTS
POLLO6: FLOAT 2.6398577 < DU
POLLO7: FLOAT 1.656763 < DEVELOPPEMENT.
POLLO8: EQU F05 < CONSTANTE 1/2.
POLLO9: FLOAT 0.6931472 < LN(2).
<
< POUR LE CALCUL DE L'EXPONENTIELLE :
<
POLEX1: EQU POLLO1 < VARIABLE DE MANOEUVRE...
POLEX2: EQU POLLO2
POLEX3: EQU POLLO3
POLEX4: FLOAT 1.442695 < LOG2(E).
POLEX5: WORD NILK < RELEVE DE L'EXPOSANT
POLEX6: EQU F1 < 1.0
POLEX7: FLOAT 2 < 2.
POLEX8: FLOAT 87.417488 < COEFFICIENTS
POLEX9: FLOAT 0.0346573 < DU
POLEY0: FLOAT -17830.91 < DEVELOPPEMENT.
POLEY1: FLOAT 9.9545955
SIGNE: WORD NILK < POUR DETERMINER LE SIGNE DE X**Y...
<
< POUR CALCULER
< LES EXPOSANTS :
<
XXMASK:: VAL MOCG
XX7F:: VAL '7F < MAXIMUM POSITIF,
XX80:: VAL -'80 < MIMIMUM NEGATIF.
<
< RELAIS DE SOUS-PROGRAMMES :
<
ARAK: WORD RAK < CALCUL D'UNE PUISSANCE REELLE QUELCONQUE.
AEXP: WORD EXPON < CALCUL D'UNE EXPONENTIELLE (BASE 'E').
<
< VARIABLES DE MANOEUVRE :
<
EXPOP: FLOAT <NILK<NILK<NILK < EXPOSANT COURANT...
<
< PARAMETRES GENERAUX DES GENERATEURS ALEATOIRES :
<
INF32: FLOAT 32768
INF64: FLOAT 65536
FWORK4: FLOAT <NILK<NILK<NILK
FWORK5: FLOAT <NILK<NILK<NILK
<
< PARAMETRES DU GENERATEUR 'RDN' :
<
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
RDN64: FLOAT <NILK<NILK<NILK < SUPRDN/65536.
RDNMIS: FLOAT <NILK<NILK<NILK < 1-(INF/SUP),
RDNPIS: FLOAT <NILK<NILK<NILK < 32768*(1+(INF/SUP)).
ASPRDN: WORD SPRDN < GENERATEUR ALEATOIRE 2D.
<
< PARAMETRES DU GENERATEUR 'RDM' :
<
RDM: WORD 4397 < NOMBRE ALEATOIRE COURANT.
RDM1: WORD 5189 < CONSTANTE
RDM2: WORD 6791 < DE CALCUL DES
RDM3:: VAL 19 < NOMBRE ALEATOIRES...
RDM4: WORD 7993 < 2EME NOMBRE ALEATOIRE COURANT.
RDM5: WORD 4021
RDM6:: VAL 23
RDM64: FLOAT <NILK<NILK<NILK < SUPRDM/65536.
RDMMIS: FLOAT <NILK<NILK<NILK < 1-(INF/SUP),
RDMPIS: FLOAT <NILK<NILK<NILK < 32768*(1+(INF/SUP)).
ASPRDM: WORD SPRDM < GENERATEUR ALEATOIRE 2D.
<
< DONNEES DE CALCUL DU
< CHAMP F(RHO,TETA) :
<
CHAMP: FLOAT <NILK<NILK<NILK < VALEUR DU CHAMP F(RHO,TETA).
RHO: FLOAT <NILK<NILK<NILK < RAYON POLAIRE,
TETA: FLOAT <NILK<NILK<NILK < ANGLE POLAIRE.
ZR: FLOAT <NILK<NILK<NILK < ABSCISSE FLOTTANTE DU POINT COURANT,
ZI: FLOAT <NILK<NILK<NILK < ORDONNEE FLOTTANTE DU POINT COURANT.
XCENTR: FLOAT <NILK<NILK<NILK < ABSCISSE DU CENTRE DU CHAMP,
YCENTR: FLOAT <NILK<NILK<NILK < ORDONNEE DU CENTRE DU CHAMP.
F255: FLOAT <XXN255<K<K < DERNIERE COULEUR...
<
< GESTION DU DEROULEUR :
<
LBLOC0: WORD LBUFMT < POUR VALIDER 'LBLOC'...
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.
IF Z-I,,XEIF%,
IF ATTENTION : L'INITIALISATION DE 'IBUFMT' ET
IF 'ZBUFMT' SERA MAUVAISE !!!
XEIF%: VAL ENDIF
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...
AGOCT: WORD GOCT < SOUS-PROGRAMME D'ACCES AU NIVEAU COURANT.
AGMOT: WORD GMOT < RECUPERATION D'UN MOT (2 OCTETS).
<
< GESTION DU DISQUE VIDEO :
<
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
<
< GENERATION DES SEQUENCES PERIODIQUES :
<
< ARGUMENTS :
< (KP1,KP2,KP3)=CHIFFRES (CENTAINE,DIZAINE,UNITE)
< DU PAS, SOIT LA PERIODE DU MOUVEMENT
< EXPRIMEE EN NOMBRE D'IMAGES.
< (NPERIO) =LE NOMBRE DE PERIODES A REPRESENTER.
<
NPERIO: @
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 'NPERIO'...
XWOR%6: VAL XWOR%5=FCSIGN
XWOR%7: VAL XWOR%5(MSYMBN)MSYMBN=FCSIGN
IF XWOR%6*XWOR%7,XEIF%,,XEIF%
NPERIO:: VAL K < 'NPERIO' EST ABSENT...
XEIF%: VAL ENDIF
KP1: @
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 'KP1'...
XWOR%6: VAL XWOR%5=FCSIGN
XWOR%7: VAL XWOR%5(MSYMBN)MSYMBN=FCSIGN
IF XWOR%6*XWOR%7,XEIF%,,XEIF%
KP1:: VAL K < 'KP1' EST ABSENT...
XEIF%: VAL ENDIF
KP2: @
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 'KP2'...
XWOR%6: VAL XWOR%5=FCSIGN
XWOR%7: VAL XWOR%5(MSYMBN)MSYMBN=FCSIGN
IF XWOR%6*XWOR%7,XEIF%,,XEIF%
KP2:: VAL K < 'KP2' EST ABSENT...
XEIF%: VAL ENDIF
KP3: @
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 'KP3'...
XWOR%6: VAL XWOR%5=FCSIGN
XWOR%7: VAL XWOR%5(MSYMBN)MSYMBN=FCSIGN
IF XWOR%6*XWOR%7,XEIF%,,XEIF%
KP3:: VAL K < 'KP3' EST ABSENT...
XEIF%: VAL ENDIF
MULTIS: VAL EXIST < A PRIORI, ON VA GENERER LA SEQUENCE
< PLUSIEURS FOIS...
IF NPERIO-K,XEIF%1,,XEIF%1
IF KP1-K,XEIF%2,,XEIF%2
IF KP2-K,XEIF%3,,XEIF%3
IF KP3-K,XEIF%4,,XEIF%4
MULTIS: VAL NEXIST < ET BIEN NON, LA SEQUENCE NE SERA
< GENEREE QU'UNE SEULE FOIS...
XEIF%4: VAL ENDIF
XEIF%3: VAL ENDIF
XEIF%2: VAL ENDIF
XEIF%1: VAL ENDIF
IF MULTIS-EXIST,XEIF%9,,XEIF%9
BUFVIG: BYTE "(";KCR
XWOR%1: VAL '0000000@@@@(MOCD
XWOR%3: VAL $-BUFVIG*NOCMO
IF XWOR%1-K,XEIF%,,XEIF%
XWOR%3: VAL XWOR%3-W
XEIF%: VAL ENDIF
LBUVIG:: VAL XWOR%3 < LONGUEUR DE LA COMMANDE AU DISQUE
< VIDEO...
XWOR%2: VAL COSBT?XASSIM=FMASK(K?NVPVDK=FCINST
DEMVIG: BYTE XWOR%2;FAVW < COMMANDE DE MEMORISATION DE L'ADRESSE
< DE DEBUT D'ITERATION...
WORD BUFVIG=FCTA*NOCMO
WORD LBUVIG
BUFVIN: EQU $
IF KP1-K,,XEIF%2,
BYTE "P";KP1=FCBA(MOCD;KP2=FCBA(MOCD;KP3=FCBA(MOCD;KCR
XWOR%1: VAL '0000000@@@@(MOCD
XEIF%2: VAL ENDIF
IF KP1-K,XEIF%1,,XEIF%1
IF KP2-K,,XEIF%2,
BYTE "P";KP2=FCBA(MOCD;KP3=FCBA(MOCD;KCR
XWOR%1: VAL '0000000@@@@(MOCD
XEIF%2: VAL ENDIF
IF KP2-K,XEIF%2,,XEIF%2
IF KP3-K,,XEIF%3,
BYTE "P";KP3=FCBA(MOCD;KCR
XWOR%1: VAL '0000000@@@@(MOCD
XEIF%3: VAL ENDIF
IF KP3-K,XEIF%3,,XEIF%3
IF ATTENTION (KP1,KP2,KP3) EST NUL !!!
XEIF%3: VAL ENDIF
XEIF%2: VAL ENDIF
XEIF%1: VAL ENDIF
XWOR%3: VAL $-BUFVIN*NOCMO
IF XWOR%1-K,XEIF%,,XEIF%
XWOR%3: VAL XWOR%3-W
XEIF%: VAL ENDIF
LBUVIN:: VAL XWOR%3 < LONGUEUR DE LA COMMANDE AU DISQUE
< VIDEO...
XWOR%2: VAL COSBT?XASSIM=FMASK(K?NVPVDK=FCINST
DEMVIN: BYTE XWOR%2;FAVW < COMMANDE DE MISE EN PLACE DU PAS
< VARIABLE...
WORD BUFVIN=FCTA*NOCMO
WORD LBUVIN
BUFVI1: BYTE "P";"1";KCR;NILK
XWOR%1: VAL '0000000@@@@(MOCD
XWOR%3: VAL $-BUFVI1*NOCMO
IF XWOR%1-K,XEIF%,,XEIF%
XWOR%3: VAL XWOR%3-W
XEIF%: VAL ENDIF
LBUVI1:: VAL XWOR%3 < LONGUEUR DE LA COMMANDE AU DISQUE
< VIDEO...
XWOR%2: VAL COSBT?XASSIM=FMASK(K?NVPVDK=FCINST
DEMVI1: BYTE XWOR%2;FAVW < COMMANDE DE RETOUR AU PAS UNITE...
WORD BUFVI1=FCTA*NOCMO
WORD LBUVI1
BUFVID: BYTE ")";KCR
XWOR%1: VAL '0000000@@@@(MOCD
XWOR%3: VAL $-BUFVID*NOCMO
IF XWOR%1-K,XEIF%,,XEIF%
XWOR%3: VAL XWOR%3-W
XEIF%: VAL ENDIF
LBUVID:: VAL XWOR%3 < LONGUEUR DE LA COMMANDE AU DISQUE
< VIDEO...
XWOR%2: VAL COSBT?XASSIM=FMASK(K?NVPVDK=FCINST
DEMVID: BYTE XWOR%2;FAVW < COMMANDE DE RETOUR EN DEBUT D'ITERATION.
WORD BUFVID=FCTA*NOCMO
WORD LBUVID
BUFVIC: BYTE KCR;NILK
XWOR%1: VAL '0000000@@@@(MOCD
XWOR%3: VAL $-BUFVIC*NOCMO
IF XWOR%1-K,XEIF%,,XEIF%
XWOR%3: VAL XWOR%3-W
XEIF%: VAL ENDIF
LBUVIC:: VAL XWOR%3 < LONGUEUR DE LA COMMANDE AU DISQUE
< VIDEO...
XWOR%2: VAL COSBT?XASSIM=FMASK(K?NVPVDK=FCINST
DEMVIC: BYTE XWOR%2;FAVW < COMMANDE DE PASSAGE A L'IMAGE SUIVANTE.
WORD BUFVIC=FCTA*NOCMO
WORD LBUVIC
XEIF%9: VAL ENDIF
<
<
< 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
<
<
< 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
XXXVEC: VAL XXVEC3 < DEFINITION DES PROGRAMMES VECTEUR 512...
NLS
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 $
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'.
NLS
CALL #SIP UTILITAIRES#
LST
XXXPRO: VAL YYYFLO < 'YYYFLO'.
NLS
CALL #SIP UTILITAIRES#
LST
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...
<
< VOISINNAGE DU BORD DE L'ECRAN :
<
LR X,A < VALIDATION DE 'X' :
CP RAYON
JLE CERCL4 < TROP NEGATIF...
AD RAYON
CP VECTNC
JGE CERCL4 < TROP POSITIF...
LR Y,A < VALIDATION DE 'Y' :
CP RAYON
JLE CERCL4 < TROP NEGATIF...
AD RAYON
CP VECTNL
JGE CERCL4 < TROP POSITIF...
<
< 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...
SLRS DECZDK < AMPLIFICATION...
ADRI -Z,A < ET DESATURATION...
STA SAVEZP < SAUVEGARDE DE LA COORDONNEE 'Z'.
PLR Y < ON A :
< (B,Y)=COORDONNEES DU CENTRE.
CPZ RAYON < LE RAYON EST-IL NUL ???
JG CERCL8 < NON...
BSR APOINT < OUI, ON MARQUE LE CENTRE DU CERCLE (X,Y)
< AVEC LE NIVEAU 'SAVEZP'.
JMP CERCL9 < ET ON SORT...
CERCL8: EQU $
<
< 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,
SLRS DECZDK < CADRAGE,
ADR B,A < (A)=NIVEAU FONCTION DE LA DISTANCE AU
< BORD ET DU 'Z'...
< NOTA : AUTREFOIS, C'ETAIT UN 'ORR' POUR
< CONCATENER, MAIS DANS LA MESURE
< OU 'DECZDK' PEUT ETRE NUL, IL
< FAUT FAIRE UNE OPERATION ARITH-
< METIQUE...
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 $
JAG CERCL7 < OK...
ADRI Z,A < POUR EVITER LE NOIR...
CERCL7: 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 :
<
CERCL9: EQU $
PLR X,Y
CERCL4: EQU $
RSR
PAGE
<
<
< P R O J E C T I O N :
<
<
< ARGUMENTS :
< (X,Y,W)=POINT TRI-DIMENSIONNEL.
<
<
< RESULTATS :
< (X,Y)=POINT PROJETE.
<
<
PROJ: EQU $
PSR A,B
LR X,A
SLRS DECX
LR A,X < AMPLIFICATION DE 'X'.
LR Y,A
SLRS DECY
LR A,Y < AMPLIFICATION DE 'Y'.
LR W,A
SLRS DECZ
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.
PLR A,B
RSR
PAGE
<
<
< C A L C U L S I N U S E T C O S I N U S :
<
<
< ARGUMENT :
< (A,B)=ANGLE EN RADIANS,
<
<
< RESULTAT :
< (A,B)=LIGNE TRIGONOMETRIQUE DEMANDEE.
<
<
COS: EQU $ < ENTRY 'COSINUS' :
FSB PISUR2 < (A,B)=TETA-PI/2,
BSR AFNEG < (A,B)=PI/2-TETA.
SIN: EQU $ < ENTRY 'SINUS' :
<
< INITIALISATIONS ET
< PREPARATION DE L'ANGLE :
<
#/FST# SCWOR1 < SAVE TEMPORAIRE DE L'ANGLE.
STZ ISIGSC
JAGE PSC072
BSR AFNEG
#/FST# SCWOR1
IC ISIGSC
PSC072: EQU $
FDV DEUXPI
BSR AFIX
BSR AFLT
FMP DEUXPI
FSB SCWOR1
BSR AFNEG
FCAM PI3141
JL PSC073
FSB PI3141
IC ISIGSC
PSC073: EQU $
FCAM PISUR2
JL PSC074
FSB PI3141
BSR AFNEG
PSC074: EQU $
<
< CALCUL DU POLYNOME :
<
FDV PISUR2
#/FST# SCWOR1
FMP SCWOR1
#/FST# SCWOR2
FMP POLSC4
FAD POLSC3
FMP SCWOR2
FAD POLSC2
FMP SCWOR2
FAD POLSC1
FMP SCWOR2
FAD PISUR2
FMP SCWOR1
DC ISIGSC
JNE PSC075
BSR AFNEG
PSC075: EQU $
<
< ET RETOUR :
<
BSR ATSFLO
RSR
PAGE
<
<
< C A L C U L D E L A F O N C T I O N ' A R C T G ' :
<
<
< ARGUMENT:
< (A,B)=VALEUR ARGUMENT.
<
<
< RESULTAT:
< (A,B)='ARCTG' DE L'ARGUMENT EN RADIANS.
<
<
ARCTG: EQU $
<
< SAUVEGARDES ET INITIALISATIONS.
<
PSR X,L
STZ ATGSDX < ARGUMENT 'X' POSITIF OU NUL A PRIORI.
FCAZ
JGE ARCTG1
DC ATGSDX < ARGUMENT 'X' NEGATIF.
ARCTG1: EQU $
FABS < U = ABS(X).
FCAM ATGUN
JGE ARCTG2
<
< U < 1 : J RECOIT 0.
<
LXI K
JMP ARCTG3
ARCTG2: EQU $
<
< U >= 1 : J RECOIT 2 ET U RECOIT 1/U.
<
LXI W+W < J = 2.
FST ATGT1
FLD ATGUN
FDV ATGT1 < U = 1/U.
ARCTG3: EQU $
FCAM ATGPSC < COMPARER U A TG(PI/12).
JG ARCTG4
<
< U <= TG(PI/12) : J RECOIT J+2.
<
ADRI I+I,X < J = J + 2.
JMP ARCTG5
ARCTG4: EQU $
<
< U > TG(PI/12) : J RECOIT J+1 ET
< U RECOIT (U * RACINE(3) - 1) / (RACINE(3) + U).
<
ADRI I,X < J = J + 1.
FST ATGT1
FMP ATGR3
FSB ATGUN
PSR A,B
FLD ATGR3
FAD ATGT1
FST ATGT1
PLR A,B
FDV ATGT1 < U=(U*RACINE(3)-1)/(RACINE(3)+U).
ARCTG5: EQU $
<
< FORMER Y = U * P(U ** 2) LES COEFFICIENTS DU POLYNOME ETANT ATGP1, ATGP2
< ATGP3 ET ATGP4. ON CALCULE :
< Y = U * (P1 - P2 * U ** 2 + (P3 / (P4 + U ** 2)).
<
FST ATGT1 < TRAV1 = U.
FMP ATGT1
FST ATGT3 < TRAV3 = U ** 2.
FAD ATGP4
FST ATGT2
FLD ATGP3
FDV ATGT2
FAD ATGP1
PSR A,B
FLD ATGP2
FMP ATGT3
FST ATGT3
PLR A,B
FSB ATGT3 < Y = P(U ** 2).
FMP ATGT1 < Y = U * P( U ** 2).
FST ATGT1 < TRAV1 = U * P (U ** 2).
<
< BRANCHEMENT SELON VALEUR DE J (REGISTRE 'X').
<
ADRI -I-I,X
CPZR X
JE ARCTG6
JL ARCTG7
ADRI -I,X
CPZR X
JE ARCTG8
<
< FAIRE Y = PI / 2 - Y.
<
FLD ATGPS2
JMP ARCTG9
ARCTG8: EQU $
<
< FAIRE Y = PI / 3 - Y.
<
FLD ATGPS3
ARCTG9: EQU $
FSB ATGT1 < - Y.
JMP ARCTG6
ARCTG7: EQU $
<
< FAIRE Y = PI / 6 + Y.
<
FAD ATGPS6
ARCTG6: EQU $
<
< AFFECTER A Y LE SIGNE DU X ARGUMENT.
<
CPZ ATGSDX < SIGNE DU X ARGUMENT.
JL ARCTGA
<
< X ARGUMENT POSITIF OU NUL, IL FAUT QUE Y LE SOIT.
<
FCAZ
JGE ARCTGB
FNEG
JMP ARCTGB
ARCTGA: EQU $
<
< X ARGUMENT NEGATIF, IL FAUT QUE Y LE SOIT.
<
FCAZ
JL ARCTGB
FNEG
ARCTGB: EQU $
<
< RESTAURATIONS ET FIN...
<
PLR X,L
RSR
PAGE
<
<
< C A L C U L D ' U N E P U I S S A N C E
< Q U E L C O N Q U E R E E L L E ' P ' :
<
<
< ARGUMENT :
< (A,B)=NOMBRE 'N' ARGUMENT,
<
<
< RESULTAT :
< (A,B)='N' A LA PUISSANCE P.
<
<
RAK: EQU $
PSR Y
<
<
< L O G N E P E R I E N :
<
<
LOGN: EQU $
STZ SIGNE < =0 : SIGNE "+" A PRIORI...
FCAZ
JGE LOGN1 < POSITIF...
IC SIGNE < =1 : SIGNE "-"...
LOGN1: EQU $
LR A,Y
FABS
ANDI XXMASK
#/FST# POLLO3
FAD POLLO4
#/FST# POLLO2
LR Y,A
SWBR A
SARS XXMASK=K
FLT
#/FST# POLLO1
#/FLD# POLLO3
FSB POLLO4
FDV POLLO2
#/FST# POLLO3
FMP POLLO3
FNEG
FAD POLLO7
#/FST# POLLO2
#/FLD# POLLO6
FDV POLLO2
FAD POLLO5
FMP POLLO3
FSB POLLO8
FAD POLLO1
FMP POLLO9
<
<
< G E S T I O N D U S I G N E D E L ' E X P O S A N T :
<
<
PSR A,B < SAVE LE 'LOG'...
#/FLD# EXPOP
FABS
BSR AROND < ON PREND LA PARTIE ENTIERE (PAR EXCES
< OU PAR DEFAUT) DE LA VALEUR ABSOLUE DE
< L'EXPOSANT...
TBT NBITMO-B < QUELLE EST SA PARITE ???
JC RAK1 < IMPAIRE, 'SIGNE' RESTE TEL QUEL...
STZ SIGNE < PAIRE : ON FORCE "+" (SIGNE INCHANGE)...
RAK1: EQU $
PLR A,B < RESTAURATION DU LOG,
FMP EXPOP < ET ON CALCULE P*LOG...
<
<
< E X P O N E N T I E L L E :
<
<
EXP: EQU $
FMP POLEX4
#/FST# POLEX3
FIX
STA POLEX5
FLT
FCAM POLEX3
JNV EXPON3
#/FLD# POLEX6
#/FST# POLEX3
JMP EXPON5
EXPON3: EQU $
CPZ POLEX3
JGE EXPON4
DC POLEX5
LA POLEX5
FLT
EXPON4: EQU $
FSB POLEX3
FNEG
#/FST# POLEX2
FMP POLEX2
#/FST# POLEX1
FAD POLEX8
#/FST# POLEX3
#/FLD# POLEY0
FDV POLEX3
FAD POLEX1
FMP POLEX9
FAD POLEY1
FSB POLEX2
#/FST# POLEX3
#/FLD# POLEX7
FMP POLEX2
FDV POLEX3
FAD POLEX6
#/FST# POLEX3
EXPON5: EQU $
SWBR A
SARS XXMASK=K
AD POLEX5
CPI XX7F
JG $ < E R R E U R P R O G R A M M E ...
CPI XX80
JGE EXPON6
#/FLD# F0 < ON PREND LE MINIMUM...
JMP EXPON7
EXPON6: EQU $
XWOR%1: VAL XXMASK=K
XWOR%1: VAL -XWOR%1
ANDI XXMASK>XWOR%1
STA POLEX5
LA POLEX3
ANDI XXMASK
AD POLEX5
EXPON7: EQU $
CPZ SIGNE < PRISE EN COMPTE DU SIGNE SIMULE :
JE EXP1 < POSITIF, ON LAISSE LE RESULTAT TEL QUEL..
FNEG < NEGATIF, ON INVERSE...
EXP1: EQU $
BSR ATSFLO
PLR Y
RSR
<
<
< 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
<
<
< G E N E R A T E U R R E D O N N A N T T O U J O U R S
< L E M E M E V E C T E U R A L E A T O I R E E N
< U N P O I N T D O N N E :
<
<
< ARGUMENT :
< (X,Y)=COORDONNEES DU POINT COURANT.
<
<
< RESULTAT :
< (A,B)=RDN(XS,YS,GRARDN).
<
<
SPRDN: 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 GRARDN < D'OU F(GRARDN,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 RDNMIS < RDN*(1-(INF/SUP)),
FAD RDNPIS < RDN*(1-(INF/SUP))+32768*(1+(INF/SUP)),
FMP RDN64 < (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 :
<
<
< ARGUMENT :
< (X,Y)=COORDONNEES DU POINT COURANT.
<
<
< RESULTAT :
< (A,B)=RDM(XS,YS,GRARDM).
<
<
SPRDM: 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 RDM1 < ??!???!
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 GRARDM < D'OU F(GRARDM,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 'RDM' A L'ECHELLE
< CALCULER L'EXPRESSION :
<
< (SUP/(-32768))*(-RDM/2+16384+(RDM/2-16384)*(INF/SUP)),
<
< QUI SE SIMPLIFIE EN :
<
< (SUP/65536)*(RDM*(1-(INF/SUP))+32768*(1+(INF/SUP))).
<
FLT < ON FLOTTE 'RDM',
FMP RDMMIS < RDM*(1-(INF/SUP)),
FAD RDMPIS < RDM*(1-(INF/SUP))+32768*(1+(INF/SUP)),
FMP RDM64 < (SUP/65536)*(...).
<
< ET SORTIE :
<
RSR
PAGE
<
<
< A C C E S A L ' O C T E T C O U R A N T :
<
<
< ARGUMENT :
< (IBUFMT)=INDEX DE L'OCTET COURANT.
<
<
< RESULTAT :
< (A)=OCTET COURANT.
<
<
GOCT: EQU $
<
< INITIALISATIONS :
<
PSR B,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 GOCT1 < NON...
<
< CAS OU LE BUFFER EST VIDE :
<
GOCT2: EQU $
LAD DEMMT < (A)=ADRESSE DE LA DEMANDE,
SVC < QUE L'ON ENVOIE...
JE GOCT3 < OK...
QUIT XXQUIT < E R R E U R D ' A S S I G N A T I O N..
JMP GOCT2 < ET ON RE-TENTE, OU BIEN ON ARRETE S'IL
< S'AGIT D'UN 'TAPE-MARK'...
GOCT3: 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 GOCT2 < NON, ON LIT L'ENREGISTREMENT SUIVANT...
LAI K < (A)=INDEX DU PREMIER OCTET.
<
< ACCES A L'OCTET COURANT :
<
GOCT1: 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...
<
< ET RETOUR :
<
PLR B,X
RSR
PAGE
<
<
< R E C U P E R A T I O N D E 2 O C T E T S :
<
<
< RESULTAT :
< (A)=UN MOT (2 OCTETS).
<
<
GMOT: EQU $
PSR B
BSR AGOCT < RECUPERATION DU PREMIER OCTET,
SWBR A,B < ET MISE DANS 'B'.
BSR AGOCT < RECUPERATION DU SECOND OCTET,
ORR B,A < ET CONCATENATION DES 2 OCTETS.
PLR B
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 $
LA ABLOC0
STA DEMMT+ARGESC < MISE EN PLACE DE L'ADRESSE DU PREMIER
< BLOC A LIRE...
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 $
<
< GESTION DE LA BANDE :
<
INIT10: EQU $
LA LBLOC < (A)=LONGUEUR DES BLOCS PHYSIQUES SUR
< LA BANDE :
JALE INIT11 < BERKKK...
CP LBLOC0 < VALIDATION :
JLE INIT12 < OK...
INIT11: EQU $
QUIT XXQUIT < E R R E U R P A R A M E T R E ...
JMP INIT10 < ET ON RETENTE...
INIT12: EQU $
STA DEMMT+COESC < ET ON INITIALISE LA DEMANDE DE LECTURE...
STA ZBUFMT
STA IBUFMT < POUR PROVOQUER LA LECTURE DU PREMIER
< BLOC...
<
< INITIALISATION A PRIORI
< DES TRACES GRAPHIQUES :
<
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 :
<
#/FLD# INFRDN < BORNE INFERIEURE ('INF'),
FDV SUPRDN < INF/SUP,
PSR A,B < ET SAVE...
FSB F1 < (INF/SUP)-1,
FNEG < 1-(INF/SUP),
#/FST# RDNMIS < RDNMIS=1-(INF/SUP).
PLR A,B < INF/SUP,
FAD F1 < 1+(INF/SUP),
FMP INF32 < 32768*(1+(INF/SUP)),
#/FST# RDNPIS < RDNPIS=32768*(1+(INF/SUP)).
#/FLD# SUPRDN < SUP,
FDV INF64 < SUP/65536,
#/FST# RDN64 < SUP64=SUP/65536.
<
< GENERATEUR ALEATOIRE :
<
#/FLD# INFRDM < BORNE INFERIEURE ('INF'),
FDV SUPRDM < INF/SUP,
PSR A,B < ET SAVE...
FSB F1 < (INF/SUP)-1,
FNEG < 1-(INF/SUP),
#/FST# RDMMIS < RDMMIS=1-(INF/SUP).
PLR A,B < INF/SUP,
FAD F1 < 1+(INF/SUP),
FMP INF32 < 32768*(1+(INF/SUP)),
#/FST# RDMPIS < RDMPIS=32768*(1+(INF/SUP)).
#/FLD# SUPRDM < SUP,
FDV INF64 < SUP/65536,
#/FST# RDM64 < 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 $
<
<
< G E N E R A T I O N D U C H A M P F ( R H O , T E T A ) :
<
<
< DEFINITION :
< LE CHAMP F(RHO,TETA) CONTIENT TROIS
< COMPOSANTES : LA PREMIERE CORRESPOND
< A UNE SPIRALE A 'A21' BRANCHES, LA
< SECONDE A UNE TACHE GAUSSIENNE CENTREE,
< ET ENFIN, LA TROISIEME A UN NIVEAU
< CONSTANT ; ON A :
<
< F(RHO,TETA)=A0*(A1*((A11+A12*SIN(A21*TETA+A22*EXP(A31*RHO)+A23))/A13
< A2*EXP(A41*RHO*RHO)+
< A3),
<
< PUIS :
<
< F(RHO,TETA)=A50*(EXP(F(RHO,TETA))-1),
<
< ON NOTERA QUE LA PHASE DE L'ANGLE
< 'TETA' EST UNE FONCTION DU TYPE "SPIRALE
< LOGARITHMIQUE", ET DONC INDUIT LA
< STRUCTURE SPIRALEE.
<
<
LYI K < (Y)=ORDONNEE COURANTE,
GEN100: EQU $
LXI K < (X)=ABSCISSE COURANTE.
GEN101: EQU $
PSR X,Y
<
< PASSAGE AUX COORDONNEES CENTREES :
<
LR X,A < ABSCISSE :
FLT
FSB XCENTR
#/FST# ZR < ABSCISSE FLOTTANTE CENTREE...
LR Y,A < ORDONNEE :
FLT
FSB YCENTR
#/FST# ZI < ORDONNEE FLOTTANTE CENTREE...
<
< CALCUL DU RAYON POLAIRE :
<
FMP ZI < ZI**2,
#/FST# FWORK
#/FLD# ZR < ZR,
FMP ZR < ZR**2,
FAD FWORK < ZR**2+ZI**2,
BSR ARAC
#/FST# RHO < RAYON POLAIRE (RHO).
<
< CALCUL DE L'ANGLE POLAIRE :
<
FCMZ ZR < LA TANGENTE NE SERAIT-ELLE PAS INFINIE ??
JNE GEN81 < NON...
#/FLD# ATGPS2 < OUI, L'ARGUMENT VAUT DONC +/- PI/2.
FCMZ ZI < "+" OU "-" ???
JGE GEN82 < +PI/2.
FNEG < -PI/2,
FAD DEUXPI < OU 3*PI/2...
JMP GEN82 < VERS LE CALCUL DU NIVEAU...
GEN81: EQU $
#/FLD# ZI < 'ZR' N'EST PAS NUL,
FDV ZR < ON CALCULE DONC LA TANGENTE DE L'ARGUMENT
FABS < AFIN DE CALCULER L'ARC-TANGENTE DANS
< LE SEGMENT (0,PI/2)...
BSR AARCTG < PUIS L'ARC-TANGENTE.
FCMZ ZR
JGE GEN83
FCMZ ZI
JGE GEN84
FAD PI < ZR<0 ET ZI<0 : PI+ARCTG...
JMP GEN89
GEN84: EQU $
FSB PI
FNEG < ZR<0 ET ZI>=0 : PI-ARCTG...
JMP GEN89
GEN83: EQU $
FCMZ ZI
JGE GEN85
FSB DEUXPI
FNEG < ZR>=0 ET ZI<0 : 2*PI-ARCTG...
JMP GEN89
GEN85: EQU $ < ZR>=0 ET ZI>=0 : ARCTG...
GEN89: EQU $
GEN82: EQU $
#/FST# TETA < ANGLE POLAIRE (TETA).
<
< CALCUL DE LA PHASE "SPIRALEE" :
<
#/FLD# RHO < RHO,
FMP FA31 < A31*RHO,
BSR AEXP < EXP(A31*RHO),
FMP FA22 < A22*EXP(A31*RHO).
<
< CALCUL DE L'ANGLE :
<
FAD FA23 < A22*EXP(A31*RHO)+A23,
#/FST# FWORK
#/FLD# TETA < TETA,
FMP FA21 < A21*TETA,
FAD FWORK < A21*TETA+A22*EXP(A31*RHO)+A23, ANGLE
< QUE L'ON VA NOTER 'ALPHA'.
<
< CALCUL DE LA CONTRIBUTION
< "SPIRALEE" :
<
BSR ASIN < SIN(ALPHA),
FMP FA12 < A12*SIN(ALPHA),
FAD FA11 < A11+A12*SIN(ALPHA),
FDV FA13 < (A11+A12*SIN(ALPHA))/A13,
FMP FA1 < A1*(A11+A12*SIN(ALPHA))/A13, QUE L'ON
< VA NOTER "SPIRALE".
#/FST# FWORK
<
< CALCUL DE LA CONTRIBUTION
< "GAUSSIENNE" :
<
#/FLD# RHO < RHO,
FMP RHO < RHO*RHO,
FMP FA41 < A41*RHO*RHO,
BSR AEXP < EXP(A41*RHO*RHO),
FMP FA2 < A2*EXP(A41*RHO*RHO), QUE L'ON
< NOTE "GAUSS".
<
< CALCUL DU CHAMP F(RHO,TETA) :
<
FAD FWORK < SPIRALE+GAUSS,
FAD FA3 < SPIRALE+GAUSS+A3,
FMP FA0 < A0*(SPIRALE+GAUSS+A3),
<
< ACCENTUATION DES MAXIMUM :
<
BSR AEXP < EXP(A0*(SPIRALE+GAUSS+A3)),
FSB F1 < EXP(A0*(SPIRALE+GAUSS+A3))-1,
FMP FA50 < A50*(EXP(A0*(SPIRALE+GAUSS+A3))-1).
#/FST# CHAMP < CE QUI DONNE LE CHAMP...
<<
<< TEST :
<<
JMP TEST1 <<
FMP F255 <<
BSR AROND
ANDI 'FF <<
BSR APOINT <<
JMP GEN300 <<
TEST1: EQU $ <<
<
< GENERATION DE LA GALAXIE :
<
BSR ASPRDN < GENERATION D'UN NOMBRE ALEATOIRE :
FCAM CHAMP
JG GEN300 < RDN > CHAMP : PAS D'ETOILE...
BSR ASPRDM
BSR AROND < GENERATION D'UN
STA SAVEZ < NIVEAU ALEATOIRE...
BSR ACERCL < RDN < CHAMP : ON MARQUE UNE ETOILE...
GEN300: EQU $
<
< PASSAGE AU POINT SUIVANT :
<
PLR X,Y
ADRI I,X
LR X,A
CP VECTNC < EXISTE-T'IL ???
JG GEN201 < NON...
BSR AGOTO < OUI...
WORD GEN101 < OUI...
GEN201: EQU $
<
< NON, PASSAGE A LA LIGNE SUIVANTE :
<
ADRI I,Y
LR Y,A
CP VECTNL < EXISTE-T'ELLE ???
JG GEN200 < NON...
BSR AGOTO < OUI...
WORD GEN100 < OUI...
GEN200: EQU $
<
<
< 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 $
CPZ IVIDEO < FAUT-IL ECRIRE ???
JE GEN400 < NON...
IF EXIST-K,XEIF%,,XEIF%
IF ATTENTION : LE TEST CI-DESSUS EST IDIOT !!!
XEIF%: VAL ENDIF
PSR X < OUI :
IF MULTIS-NEXIST,XEIF%,,XEIF%
LAD DEMVIW
SVC < ON ECRIT L'IMAGE COURANTE...
LAD DEMVIR
SVC < ET ON ATTEND L'ACQUITTEMENT...
XEIF%: VAL ENDIF
IF MULTIS-EXIST,XEIF%,,XEIF%
LAD DEMVIG
SVC < ON MEMORISE L'ADRESSE COURANTE...
LAD DEMVIR
SVC < ATTENTE DE L'ACQUITTEMENT...
LAD DEMVIN
SVC < ON ENVOIE LE PAS (KP1,KP2,KP3)...
LAD DEMVIR
SVC < ATTENTE DE L'ACQUITTEMENT...
LRM X
WORD NPERIO < (X)=NOMBRE D'IMAGES A ECRIRE=NOMBRE
< DE PERIODES.
GEN999: EQU $
PSR X
LAD DEMVIW
SVC < ECRITURE D'UNE IMAGE...
LAD DEMVIR
SVC < ATTENTE DE L'ACQUITTEMENT...
PLR X
JDX GEN999 < VERS L'IMAGE SUIVANTE...
LAD DEMVI1
SVC < RESTAURATION DU PAS UNITE...
LAD DEMVIR
SVC < ATTENTE DE L'ACQUITTEMENT...
LAD DEMVID
SVC < RETOUR EN DEBUT DE SEQUENCE...
LAD DEMVIR
SVC < ATTENTE DE L'ACQUITTEMENT...
LAD DEMVIC
SVC < ET PROGRESSION UNITAIRE DE L'IMAGE
< COURANTE...
LAD DEMVIR
SVC < ATTENTE DE L'ACQUITTEMENT...
XEIF%: VAL ENDIF
PLR X
GEN400: 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' 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 COST
FLOAT 0.8 < COS(TETA).
$EQU TRANSX
WORD 0 < TRANSLATION DE X(PROJETE).
$EQU TRANSY
WORD 0 < TRANSLATION DE Y(PROJETE).
$EQU RAYON
WORD 0 < RAYON DES PARTICULES.
$EQU GRARDN
WORD '1234 < GRARDN DU GENERATEUR ALEATOIRE.
$EQU SUPRDN
NTRN
FLOAT 1 < SUP(RDN).
TRN
$EQU INFRDN
NTRN
FLOAT 0 < INF(RDN).
TRN
$EQU GRARDM
WORD '5678 < GRARDM DU GENERATEUR ALEATOIRE.
$EQU SUPRDM
NTRN
FLOAT <BIT>LOGZ-Z<K<K < SUP(RDM).
TRN
$EQU INFRDM
NTRN
FLOAT <W<K<K < INF(RDM).
TRN
$EQU XCENTR
FLOAT <XMAX+Z/XXXMOY<K<K
< ABSCISSE DU CENTRE DU CHAMP,
$EQU YCENTR
FLOAT <YMAX+Z/XXXMOY<K<K
< ORDONNEE DU CENTRE DU CHAMP.
$EQU FA0
FLOAT 4
$EQU FA1
FLOAT 0.8 < CONTRIBUTION DES SPIRALES.
$EQU FA2
FLOAT 0.8 < CONTRIBUTION GAUSSIENNE.
$EQU FA3
FLOAT 0
$EQU FA11
FLOAT 1
$EQU FA12
FLOAT 1
$EQU FA13
FLOAT 2
$EQU FA41
FLOAT -64.E-6 < CE QUI EST EN GROS 4*(1/256)**2...
$EQU FA21
FLOAT 2 < NOMBRE DE BRAS DE LA SPIRALE.
$EQU FA22
FLOAT 1
$EQU FA31
FLOAT 4.E-3 < CE QUI EST EN GROS 1/256...
$EQU FA23
FLOAT 0
$EQU FA50
FLOAT 0.02
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.