IDP         "GENERATEUR DE GALAXIES"
         TABLE
ZERO:    EQU         $
         DZS         'C

         ASCI        "STAR"
         BYTE        "S";'04
         WORD        0               < LONGUEUR DU PROGRAMME.
         WORD        STAR            < ENTRY POINT.
         PROG
         WORD        0
ENTRY:   EQU         $
         LRP         L
         BR          -2,L            < ENTREE DANS LE PROGRAMME.
         PAGE
<
<
<        F O R M A T   P I L E   R E C U R S I V I T E  :
<
<
         DSEC
FPILE:   EQU         $
CENTR:   EQU         $               < CENTRE COURANT.
X:       WORD        0
Y:       WORD        0
Z:       WORD        0
DIREC:   WORD        0               < VAUT +1 OU -1, SUIVANT QUE
                                     < L'ON INCREMENTE OU DECREMENTE
                                     < LES COORDONNEES.
LONG:    WORD        0               < LONGUEUR DE LA BARRE COURANTE.
DX:      WORD        0               < DEPLACEMENT
DY:      WORD        0               <             VERS LE
DZ:      WORD        0               <              CENTRE SUIVANT.
LPILE:   VAL         $-FPILE         < LONGUEUR DE L'ENTREE.
<
<        E N T R E E   P R E C E D E N T E  :
<
         DSEC
FPILEP:  EQU         $
XP:      WORD        0
YP:      WORD        0
ZP:      WORD        0
DIRECP:  WORD        0
LONGP:   WORD        0
DXP:     WORD        0
DYP:     WORD        0
DZP:     WORD        0
         PAGE
<
<
<        L O C A L  :
<
<
         LOCAL
LOC:     EQU         $
MODULO:  FLOAT       1000001
CTTE1:   FLOAT       23
FC360:   FLOAT       360
C360:    WORD        360
DEUXPI:  FLOAT       6.283185
CTTE2:   FLOAT       0.57
UN:      FLOAT       13
UN1:     DZS         2
ARG:     DZS         2               < ARGUMENT DES ROUTINES SIN/COS
                                     < EXPRIME EN RADIANS.
RESUL:   DZS         2               < RESULTAT DES ROUTINES SIN/COS.
ALPHA:   DZS         2               < ANGLE ALEATOIRE,
BETA:    DZS         2               < ANGLE ALEATOIRE.
TEMP1:   DZS         2               < VARIABLE TEMPORAIRE.
<
< RELAIS DE TABLES ET SOUS-PROGRAMMES :
<
APILE:   WORD        PILE            < PILE DE RECURSIVITE.
ARDN:    WORD        RDN             < CALCUL NOMBRE ALEATOIRE.
ASIN:    WORD        SIN             < CALCUL RSEUL=SIN(ARG).
ACOS:    WORD        COS             < CALCUL RESUL=COS(ARG).
ACAL:    WORD        CAL             < CALCUL RECURSIF DES ETOILES.
ALUM:    WORD        LUM,X           < BRILLANCE DE L'ETOILE.
<
< CONSTANTES D'EDITION GRAPHIQUE :
<
SEG:     DZS         4               < SEGMENT GRAPHIQUE COURANT.
SEGX:    VAL         1               < COORDONNEE X,
SEGY:    VAL         0               < COORDONNEE Y.
OG:      WORD        '0B03           < OPEN GRAPHIQUE.
WG:      WORD        '0B0A           < ECRITURE GRAPHIQUE.
         WORD        SEG-ZERO*2
         WORD        8
CG:      WORD        '0B04           < CLOSE GRAPHIQUE.
ESCFS:   WORD        '0B07           < MISE EN MODE 'SPECIAL POINT
         BYTE        '1B;'1C;'04;0   < MODE DU 4014.
WGPP:    WORD        '0B0A           < ENVOI D'UN POINT.
         WORD        SEG-ZERO*2
         WORD        4
SIZE:    WORD        '0B07           < TAILLE D'UNE ETOILE.
         BYTE        0;'04           < DANS LE 1ER OCTET.
ERASE:   WORD        '0B05           < EFFACEMENT ECRAN.
MAX:     WORD        1023            < VALIDATION COORDONNEES ECRAN.
LONGI:   WORD        200             < LONGUEUR DE LA 1ERE BARRE.
<
< DIVERS :
<
DEMCCI:  WORD        '0001           < RETOUR AU CCI.
<
< PILES DE TRAVAIL :
<
NIVEAU:  VAL         10              < NBRE MAX DE RECURSIVITE.
STACK:   DZS         8*NIVEAU        < PILE DE TRAVAIL.
PILE:    DZS         NIVEAU+2*LPILE  < PILE DE RECURSIVITE.
<
< TABLE DE BRILLANCE :
<
LUM:     EQU         $
         BYTE        '40;'40;'40;'40
         BYTE        '48;'48;'58;'60
         BYTE        '68;'70;'78;'78
         BYTE        '7D;'7D;'7D;'7D
         PAGE
         PROG
<
<
<        C A L C U L   R E C U R S I F   E T O I L E S  :
<
<
<        FONCTION :
<                      SI LA LONGUEUR DE LA BARRE COURANTE
<                    EST INSUFFISANTE, IL MARQUE LE POINT
<                    COURANT; PAR CONTRE SI ELLE EST SUFFI-
<                    SANTE, IL VA EN SES 2 EXTREMITES, OU
<                    IL GENERE 2 BARRES PLUS PETITES ET
<                    DE DIRECTIONS ALEATOIRES, ET REPREND
<                    RECURSIVEMENT LE PROCESSUS.
<
<
         USE         C,FPILEP        < C : ENTREE PRECEDENTE,
         USE         W,FPILE         < W : ENTREE COURANTE.
CAL:     EQU         $
         JMP         CAL3            < ????
<
< EDITION DE LA DEMI-BARRE COURANTE :
<
         LA          X
         STA         SEG+SEGX
         LA          Z
         STA         SEG+SEGY
         LA          XP
         STA         SEG+2+SEGX
         LA          ZP
         STA         SEG+2+SEGY
         LAD         OG
         SVC         0
         LAD         WG
         SVC         0
CAL3:    EQU         $
         BSR         ARDN
         ANDI        '1F
         ADRI        1,A             < A=SEUIL ALEATOIRE DE FIN.
         CP          LONG            < ARRET ???
         JL          CAL1            < NON, ON CONTINUE....
<
< NON, GENERATION D'UNE ETOILE :
<
         LA          X
         JAL         CAL2            < PROJECTION INVALIDE.
         CP          MAX
         JG          CAL2            < PROJECTION INVALIDE.
         STA         SEG+SEGX        < OK,
         STA         SEG+2+SEGX      < SEGX <-- (X).
         LA          Z
         JAL         CAL2            < PROJECTION INVALIDE.
         CP          MAX
         JG          CAL2            < PROJECTION INVALIDE.
         STA         SEG+SEGY        < OK,
         STA         SEG+2+SEGY      < SEGY <-- (Y).
         LAD         OG
         SVC         0
         LA          Y
         SLRS        6
         LR          A,X
         LBY         &ALUM           < A=BRILLANCE DE L'ETOILE.
         STBY        SIZE+1          < LA COORDONNEE Y DONNE LA TAILLE
         LAD         SIZE            < APPARENTE DE L'ETOILE.
         SVC         0
         LAD         WGPP
         SVC         0               < TRACE DE L'ETOILE.
CAL2:    EQU         $
         RSR                         < ET C'EST TOUT...
<
<        G E N E R A T I O N   D ' U N   N I V E A U
<                    I N F E R I E U R  :
<
CAL1:    EQU         $
         PSR         C               < SAVE L'ENTREE PRECEDENTE,
         LR          W,C             < C BASE TOUJOURS L'ENTREE
                                     < PRECEDENTE.
         ADRI        LPILE,W         < W BASE L'ENTREE COURANTE.
<
< LONGUEUR DE LA NOUVELLE BARRE :
<
         LA          LONGP
         FLT
         FMP         CTTE2
         FIX
         STA         LONG
<
< ORIENTATION DE LA NOUVELLE BARRE :
<
         BSR         ARDN            < A=ANGLE DE 0 A 359 DEGRE.
         FLT
         FDV         FC360
         FMP         DEUXPI
         FST         ALPHA           < ALPHA=ANGLE ALEATOIRE DE 0 A 2*PI.
         BSR         ARDN            < A=ANGLE DE 0 A 359 DEGRE.
         FLT
         FDV         FC360
         FMP         DEUXPI
         FST         BETA            < BETA=ANGLE ALEATOIRE DE 0 A 2*PI.
<
< CALCUL DES DEPLACEMENTS AUX NOUVEAUX CENTRES :
<
         FST         ARG             < ARG=BETA.
         LAD         ARG
         BSR         ASIN            < RESUL=SIN(BETA).
         LA          LONG
         SLRS        1               < LONG/2 : DEMI-BARRE.
         FLT
         FMP         RESUL
         FST         TEMP1           < TEMP1=LONG/2*SIN(BETA).
         FLD         ALPHA
         FST         ARG             < ARG=ALPHA.
         LAD         ARG
         BSR         ASIN            < RESUL=SIN(ALPHA).
         FLD         RESUL           < SIN(ALPHA).
         FMP         TEMP1
         FIX
         STA         DX              < DX=(LONG/2)*SIN(BETA)*SIN(ALPHA).
         LAD         ARG
         BSR         ACOS            < RESUL=COS(ALPHA).
         FLD         RESUL
         FMP         TEMP1
         FIX
         STA         DY              < DY=(LONG/2)*SIN(BETA)*COS(ALPHA).
         FLD         BETA
         FST         ARG             < ARG=BETA.
         LAD         ARG
         BSR         ACOS            < RESUL=COS(BETA).
         LA          LONG
         SLRS        1               < LONG/2 : DEMI-BARRE.
         FLT
         FMP         RESUL
         FIX
         STA         DZ              < DZ=(LONG/2)*COS(BETA).
<
< NOUVEAU CENTRE DANS LA DIRECTION +1 :
<
         LAI         1
         STA         DIREC
         LA          XP
         AD          DX
         STA         X               < X <-- XP+DX.
         LA          YP
         AD          DY
         STA         Y               < Y <-- YP+DY.
         LA          ZP
         AD          DZ
         STA         Z               < Z <-- ZP+DZ.
         BSR         ACAL            < VERS LE TRAITEMENT DE CE NOUVEAU
                                     < CENTRE COURANT.
<
< NOUVEAU CENTRE DANS LA DIRECTION -1 :
<
         LAI         -1
         STA         DIREC
         LA          XP
         SB          DX
         STA         X               < X <-- XP-DX.
         LA          YP
         SB          DY
         STA         Y               < Y <-- YP-DY.
         LA          ZP
         SB          DZ
         STA         Z               < Z <-- ZP-DZ.
         BSR         ACAL            < VERS LE TRAITEMENT DE CE NOUVEAU
                                     < CENTRE COURANT.
<
< RETOUR AU NIVEAU PRECEDENT :
<
         ADRI        -LPILE,W
         PLR         C
         RSR                         < ET C'EST TOUT...
         PAGE
<
<
<        P R O G R A M M E   P R I N C I P A L  :
<
<
         WORD        LOC+'80
STAR:    EQU         $
         LRP         L
         LA          -1,L
         LR          A,L             < INITIALISATION BASE L.
         LAD         STACK-1
         LR          A,K             < INITIALISATION K.
         LA          APILE
         LR          A,W             < INITIALISATION DES BASES W,
         LR          A,C             < ET C.
<
< INITIALISATION DE LA PILE DE RECURSIVITE :
<
         LA          MAX
         SLRS        1
         STA         XP              < ON SE PLACE AU CENTRE
         STA         YP              < DE
         STA         ZP              < L'UNIVERS !!!!
<
< GENERATION DE LA GALAXIE :
<
STAR1:   EQU         $
         LAD         ERASE
         SVC         0
         JE          STAR2           < OK...
         LAD         DEMCCI          < ERREUR DE !ASSIGN...
         SVC         0
         JMP         STAR1
STAR2:   EQU         $
         LAD         ESCFS           < MISE EN MODE 'SPECIAL POINT
         SVC         0               < PLOT MODE'.
LOOP:    EQU         $
         BSR         ARDN
         SLLS        1
         CP          LONGP           < EST-CELLE QUE L'ON AVAIT
                                     < AU TOUR PRECEDENT ???
         JE          LOOP            < OUI, ON DOIT EN CHANGER...
         STA         LONGI           < LA LONGUEUR DE LA 1ERE BARRE
         STA         LONGP           < EST ALEATOIRE....
         BSR         ACAL            < TRAITEMENT 1ERE BARRE.
         JMP         LOOP            < ET ON RECOMMENCE...
         LAD         CG
         SVC         0
<
< C'EST FINI...
<
CCI:     EQU         $
         LAD         DEMCCI
         SVC         0
         JMP         CCI             < ET ON RESTE AU CCI....
         PAGE
<
<
<        G E N E R A T I O N   D ' U N   N O M B R E
<                    A L E A T O I R E  :
<
<
<        RESULTAT :
<                    A=NOMBRE ALEATOIRE ENTRE 0 ET 359.
<
<
RDN:     EQU         $
         FLD         UN
         FMP         CTTE1           < CALCUL DE U(N)*CTTE1.
         FST         UN1             < SAVE TEMPORAIRE.
         FDV         MODULO          < U(N)*CTTE1/MODULO.
         FIX
         FLT                         < ENT(U(N)*CTTE1/MODULO).
         FMP         MODULO
         FSB         UN1
         FNEG
         FST         UN              < U(N) <-- U(N)*CTTE1 MODULO.
         FDV         FC360
         FIX
         FLT
         FMP         FC360
         FSB         UN
         FNEG
         FIX                         < CALCUL DE U(N) MODULO 360.
         RSR
         PAGE
<
<
<        C O S I N U S  :
<
<
<        SOUS-PROGRAMME DE CALCUL DU COSINUS
<        TABLE DE TRANSMISSION POINTEE PAR REGISTRE A
<        - MOT1 ET MOT2 : X EN FLOTTANT
<        - MOT3 ET MOT4 : Y EN FLOTTANT(RESULTAT)
<
<
         LOCAL
ZZZ080:  EQU         $
ZZZ081:  DZS         2               < NB EN FLOTTANT
ZZZ082:  DZS         2
ZZZ083:  DZS         1               < SIGNE
ZZZ084:  WORD        '6403;'87ED     < 2*PI
ZZZ085:  WORD        '6402;'87ED     < PI
ZZZ086:  WORD        '6401;'87ED     < PI/2
ZZZ087:  EQU         ZZZ086          < CSTES DU POLYNOME
ZZZ088:  WORD        'AD00;'5110
ZZZ089:  WORD        '51FD;'9A2C
ZZZ090:  WORD        'B3F9;'6CCE
ZZZ091:  WORD        '4FF4;'6BDD
         WORD        ZZZ080+'80
         PROG
COS:     EQU         $
         PSR         A,B,L,W
         LRP         L               < INIT. DE LA BASE L
         LB          -2,L
         LR          B,L
         LR          A,W             < @ TABLE PARAM.
         FLD         0,W
         FSB         ZZZ086
         FNEG
         FST         ZZZ081
         STZ         ZZZ083
         JAGE        ZZZ092
         FNEG
         FST         ZZZ081
         IC          ZZZ083
ZZZ092:  EQU         $
         FDV         ZZZ084
         FIX
         FLT
         FMP         ZZZ084
         FSB         ZZZ081
         FNEG
         FCAM        ZZZ085
         JL          ZZZ093
         FSB         ZZZ085
         IC          ZZZ083
ZZZ093:  EQU         $
         FCAM        ZZZ086
         JL          ZZZ094
         FSB         ZZZ085
         FNEG
ZZZ094:  EQU         $
         FDV         ZZZ086
         FST         ZZZ081
         FMP         ZZZ081
         FST         ZZZ082
         FMP         ZZZ091
         FAD         ZZZ090
         FMP         ZZZ082
         FAD         ZZZ089
         FMP         ZZZ082
         FAD         ZZZ088
         FMP         ZZZ082
         FAD         ZZZ087
         FMP         ZZZ081
         DC          ZZZ083
         JNE         ZZZ095
         FNEG
ZZZ095:  EQU         $
         FST         2,W
         PLR         A,B,L,W
         RSR
         PAGE
<
<
<        S I N U S  :
<
<
<        SOUS-PROGRAMME DE CALCUL DU SINUS
<        TABLE DE TRANSMISSION POINTEE PAR REGISTRE A
<        - MOT1 ET MOT2 : X EN FLOTTANT
<        - MOT3 ET MOT4 : Y EN FLOTTANT(RESULTAT)
<
<
         LOCAL
ZZZ060:  EQU         $
ZZZ061:  DZS         2               < NB EN FLOTTANT
ZZZ062:  DZS         2
ZZZ063:  DZS         1               < SIGNE
ZZZ064:  WORD        '6403;'87ED     < 2 PI
ZZZ065:  WORD        '6402;'87ED     < PI
ZZZ066:  WORD        '6401;'87ED     < PI/2
ZZZ067:  EQU         ZZZ066          < CSTES DU POLYNOME
ZZZ068:  WORD        'AD00;'5110
ZZZ069:  WORD        '51FD;'9A2C
ZZZ070:  WORD        'B3F9;'6CCE
ZZZ071:  WORD        '4FF4;'6BDD
         WORD        ZZZ060+'80      < RELAI VERS LE LOCAL
         PROG
SIN:     EQU         $
         PSR         A,B,L,W
         LRP         L               < INIT. DE LA BASE L
         LB          -2,L
         LR          B,L
         LR          A,W             < @ TABLE PARAM.
         FLD         0,W
         FST         ZZZ061
         STZ         ZZZ063
         JAGE        ZZZ072
         FNEG
         FST         ZZZ061
         IC          ZZZ063
ZZZ072:  EQU         $
         FDV         ZZZ064
         FIX
         FLT
         FMP         ZZZ064
         FSB         ZZZ061
         FNEG
         FCAM        ZZZ065
         JL          ZZZ073
         FSB         ZZZ065
         IC          ZZZ063
ZZZ073:  EQU         $
         FCAM        ZZZ066
         JL          ZZZ074
         FSB         ZZZ065
         FNEG
ZZZ074:  EQU         $
         FDV         ZZZ066
         FST         ZZZ061
         FMP         ZZZ061
         FST         ZZZ062
         FMP         ZZZ071
         FAD         ZZZ070
         FMP         ZZZ062
         FAD         ZZZ069
         FMP         ZZZ062
         FAD         ZZZ068
         FMP         ZZZ062
         FAD         ZZZ067
         FMP         ZZZ061
         DC          ZZZ063
         JNE         ZZZ075
         FNEG
ZZZ075:  EQU         $
         FST         2,W
         PLR         A,B,L,W
         RSR
         END         STAR



Copyright © Jean-François Colonna, 2022-2022.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / École polytechnique, Institut Polytechnique de Paris, 2022-2022.