PROG
         IDP         "LAX2 - RELEASE 10 - 17/09/80"
         IDP         "P. FRANCONNET"
ZERO:    EQU         $
         DZS         '10
         WORD        RUN
         WORD        ENTRY
RUN:     EQU         $
         LRP         L
         BR          -1,L            < ALLONS-Y.
<
<
<        P R O G R A M M E   D E   C A L C U L   E T   D E
<
<        V I S U A L I S A T I O N   D E   L A   P R O P A G A T I O N
<
<        D ' U N E   S I N U S O I D E.
<
LNF:     VAL         2               < LONGUEUR MOTS D'UN NOMBRE EN FLOTTANT.
PILE:    DZS         50              < PILE POUR 'K'.
<
ENTIM:   EQU         $               < EN-TETE IMAGE VIDEO.
         DZS         1               < SPARE.
         WORD        1               < MODE TRACE = 'SBT'.
         DZS         4               < INUTILISE.
COORDV:  DZS         4               < (Y1,X1),(Y2,X2).
Y1V:     EQU         COORDV
X1V:     EQU         Y1V+1
Y2V:     EQU         X1V+1
X2V:     EQU         Y2V+1
IMAG:    DZS         256*16          < IMAGE VIDEO.
FIMAG:   EQU         $
LIMAG:   VAL         FIMAG-IMAG      < LONGUEUR MOTS IMAGE.
<
< MESSAGES STANDARD POUR LE S/P 'ENVOI'.
<
M:       EQU         $+256
MLAX2:   BYTE        '6D;"L"
         ASCI        "AX2"
         WORD        0
MPMEF:   BYTE        '6D;"P"
         ASCI        "ARAMETRES DE MISE EN FORME:"
         WORD        0
MSORVI:  BYTE        '6D;"V"
         ASCI        "ISU?"
         WORD        0
MVISU:   BYTE        '6D;"S"
         ASCI        "ORTIR SUR VI"
         WORD        0
MTV:     BYTE        '6D;"T";"V";"?";0
MCATAL:  BYTE        '6D;"C"
         ASCI        "ATALOGUER SUR DKU?"
         WORD        0
MNINI:   BYTE        '6D;"N"
         ASCI        "UMERO IM. INITIALE="
         WORD        0
MAIDKU:  BYTE        '6D;"A"
         ASCI        "DRESSE DKU="
         WORD        0
MTRACP:  BYTE        '6D;"T"
         ASCI        "RACE POINTS?"
         WORD        0
MNIMCR:  BYTE        '6D;"I"
         ASCI        "MAGE CREEE EN "
MNIMC:   DZS         3               < EDITION NUMERO IMAGE CREEE.
         WORD        0
MNBPH:   BYTE        '6D;"N"
         ASCI        "OMBRE DE PHENOMENES="
         WORD        0
MLAMBD:  BYTE        '6D;"L"
         ASCI        "AMBDA*10="
         WORD        0
MDXSL:   BYTE        '6D;"D"
         ASCI        "ELTAX/LAMBDA="
         WORD        0
MSLASH:  BYTE        "/";0
MAMORT:  BYTE        '6D;"A"
         ASCI        "MORTIR?"
         WORD        0
MCEA:    BYTE        '6D;"C"
         ASCI        "ALCUL EXACT OU APPROCHE (E/A)?"
         WORD        0
MNBE:    BYTE        '6D;"N"
         ASCI        "OMBRE D'ETAPES="
         WORD        0
MUESN:   BYTE        '6D;"U"
         ASCI        "NE ETAPE SUR "
         WORD        0
MGAM:    BYTE        '6D;"G"
         ASCI        "AMMA*10="
         WORD        0
MMULX:   BYTE        '6D;"M"
         ASCI        "ULX="
         WORD        0
MMULY:   BYTE        '6D;"M"
         ASCI        "ULY="
         WORD        0
MTX:     BYTE        '6D;"T";"X";"=";0
MTY:     BYTE        '6D;"T";"Y";"=";0
MPREM:   BYTE        '6D;"P"
         ASCI        "REMIER PHENOMENE:"
         WORD        0
MSEC:    BYTE        '6D;"S"
         ASCI        "ECOND PHENOMENE:"
         WORD        0
MTROIS:  BYTE        '6D;"T"
         ASCI        "ROISIEME PHENOMENE:"
         WORD        0
         PAGE
         DSEC
PARC:    EQU         $
<
<        PARAMETRES DE CALCUL PROPRES A UN PHENOMENE A VISUALISER
<
<        (ON RAPPELLE QU'ON PEUT EN VISUALISER DEUX ENSEMBLE).
<
LAMBDA:  DZS         LNF
DELTAX:  DZS         LNF
IEXACT:  DZS         1               < INDICATEUR CALCUL EXACT / APPROCHE:
                                     < = 0 : CALCUL EXACT,
                                     < = 1 : CALCUL APPROCHE.
GAMMA:   DZS         LNF
MULX:    DZS         LNF
MULY:    DZS         LNF
TX:      DZS         LNF
TY:      DZS         LNF
K:       DZS         LNF             < 2.PI / LAMBDA.
DELTAT:  DZS         LNF
IAMORT:  DZS         1               < OPTION "AMORTISSEMENT":
                                     < = 0 : NON,NE PAS AMORTIR,
                                     < = 1 : AMORTIR.
A:       DZS         LNF
B:       DZS         LNF
FPARC:   EQU         $
LDPARC:  VAL         FPARC-PARC      < LONGUEUR DE CETTE DSEC.
         TABLE
JEU1:    DZS         LDPARC          < JEU DE DONNEES PHENOMENE 1.
JEU2:    DZS         LDPARC          < JEU DE DONNEES PHENOMENE 2.
JEU3:    DZS         LDPARC          < JEU DE DONNEES PHENOMENE 3.
         PAGE
         COMMON
COM:     EQU         $
         DZS         1               < POUR LE BLOC FLOTTANT.
<
< RELAIS DE SOUS-PROGRAMMES.
<
AINI:    WORD        INI             < INITIALISATIONS.
AINIC:   WORD        INIC            < INITIALISATIONS PARAMETRES DE CALCUL
                                     < POUR UN PHENOMENE.
ARAZ:    WORD        RAZ             < RAZ ECRAN GRAPHIQUE / IMAGE RESIDENTE.
ACAL:    WORD        CAL             < CALCUL SINUSOIDE INSTANT COURANT.
ATRACE:  WORD        TRACE           < TRACE D'UN SEGMENT VISU/TV.
ADIFC:   WORD        DIFC            < DIFFUSION / CATALOGAGE IMAGE COURANTE.
AQREP:   WORD        QREP            < ENVOI QUESTION DEMANDE REPONSE.
AQREPN:  WORD        QREPN           < MEME CHOSE AVEC REPONSE DECIMALE.
ACVAD:   WORD        CVAD            < CONVERSION ASCI-DECIMAL --> BINAIRE.
ACVDA:   WORD        CVDA            < CONVERSION BINAIRE --> ASCI-DECIMAL.
ACONVH:  WORD        CONVH           < CONVERSION ASCI --> HEXA.
AENVOI:  WORD        ENVOI           < ENVOI D'UN MESSAGE STANDARD.
ACAON:   WORD        CAON            < CALCUL DE A A L'ORDRE N.
ATAN:    WORD        TG              < TANGENTE.
ASIN:    WORD        SIN             < SINUS.
ACOS:    WORD        COS             < COSINUS.
AARCTG:  WORD        ARCTG           < ARCTANGENTE.
ASQRT:   WORD        SQRT            < RACINE CARREE.
<
< INDICATEURS.
<
NBPH:    DZS         1               < NOMBRE DE PHENOMENES A VISUALISER:
                                     < DE 1 A TROIS.
ISORVI:  DZS         1               < SORTIE VISU:
                                     < = 0 : INACTIVE,
                                     < = 1 : ACTIVE.
ISORTV:  DZS         1               < SORTIE VIDEO:
                                     < = 0 : INACTIVE,
                                     < = 1 : ACTIVE.
ICATAL:  DZS         1               < CATALOGAGE:
                                     < = 0 : INACTIF,
                                     < = 1 : ACTIF.
ITRACE:  DZS         1               < INDICATEUR PREMIER POINT IMAGE:
                                     < = 0 : OUI,
                                     < = 1 : NON.
ITRACP:  DZS         1               < INDICATEUR MODE TRACE POINTS:
                                     < = 0 : NON,
                                     < = 1 : OUI.
<
< CONSTANTES ET VARIABLES...
<
FZERO:   FLOAT       0.0
FDIX:    FLOAT       10.0
FMILLE:  FLOAT       1000.0
F2PI:    FLOAT       6.2831853
FUN:     FLOAT       1.0
F256:    FLOAT       256.0
<
TC:      DZS         LNF             < INSTANT T COURANT.
PASDET:  DZS         LNF             < PAS DE TEMPS (OU DELTAT-VISUALISATION).
PASX:    DZS         LNF             < PAS EN X (OU DELTAX-VISUALISATION).
TFINAL:  DZS         LNF             < INSTANT T FINAL.
X:       DZS         LNF             < COORDONNE X COURANTE.
XFINAL:  FLOAT       6.0             < X FINAL.
NBETAP:  DZS         1               < NOMBRE D'ETAPES.
UESN:    DZS         1               < IL FAUT CALCULER/VISUALISER UNE ETAPE
                                     < SUR 'UESN'.
ETAPEC:  DZS         1               < NUMERO D'ETAPE COURANTE (A PARTIR DE 0).
N:       DZS         1               < ORDRE COURANT... (CF: 'CALA').
RAPAC:   DZS         LNF             < RAPPORT D'ACCROISSEMENT (CF:'CALA').
AC:      DZS         LNF             < A COURANT.
BC:      DZS         LNF             < B COURANT.
< BORNES 1 ET 2 : ENTRE CES 2 BORNES, LA SINUSOIDE EST DE COULEUR DIFFERENTE.
BORNE1:  DZS         LNF
BORNE2:  DZS         LNF
<
< DEMANDES A CMS5.
<
MASVI:   ASCI        "!ASSIGN B=VI"
VISU:    BYTE        0;'04
FMASVI:  EQU         $
MASO:    ASCI        "!ASSIGN B="
         BYTE        "O";'04
FMASO:   EQU         $
MCLOS:   ASCI        "!CLOSE"
         BYTE        '04
FMCLOS:  EQU         $
<
REP:     DZS         1               < ZONE REPONSE.
AXTRAV:  WORD        ZERO,X          < RELAI DE TRAVAIL.
DMCLOS:  WORD        '0002           < !CLOSE.
         WORD        MCLOS-ZERO*2
         WORD        FMCLOS-MCLOS*2
DMASVI:  WORD        '0002           < !ASSIGN B=VIX.
         WORD        MASVI-ZERO*2
         WORD        FMASVI-MASVI*2
DMASO:   WORD        '0002           < !ASSIGN B=O.
         WORD        MASO-ZERO*2
         WORD        FMASO-MASO*2
DMREP:   WORD        '0101           < DEMANDE REPONSE 1 CARACTERE.
         WORD        REP-ZERO*2
         WORD        1
AM:      WORD        M               < POUR LE S/P 'ENVOI'.
DMOUT:   WORD        '0202           < ENVOI MESSAGE UL 2.
         DZS         1
         DZS         1
DMTRV:   WORD        '8A01           < TRACE VIDEO.
         WORD        ENTIM-ZERO*2
         WORD        FIMAG-ENTIM*2
         WORD        0               < PAS DE VISUALISATION.
DMDIFF:  WORD        '8A01           < DIFFUSION IMAGE.
         WORD        IMAG-ZERO*2
         WORD        LIMAG*2
COUL:    WORD        2               < COULEUR.
DMDIR:   WORD        '8A06           < ECRITURE DIRECTE SUR DKU.
         WORD        0               < ADRESSE STACK RVB.
         WORD        '4000           < 2 COMPOSANTES (3EME = TIMING).
         DZS         1               < ADRESSE SECTEUR QUANTA 3.
AIDKU:   DZS         1               < ADRESSE INITIALE DKU.
NBQSPI:  WORD        '17             < NOMBRE DE Q-SECTEURS PAR IMAGE.
DMRAZ:   WORD        '0B05           < RAZ ECRAN VISU.
DMOG:    WORD        '0B03           < OPEN GRAPHIQUE.
COORDG:  EQU         $               < COORDONNEES GRAPHIQUES.
Y1G:     DZS         1
X1G:     DZS         1
Y2G:     DZS         1
X2G:     DZS         1
DMTRGR:  WORD        '0B0A           < TRACE GRAPHIQUE.
         WORD        COORDG-ZERO*2
         WORD        4*2
NBD:     DZS         3               < NOMBRE DECIMAL SAISI EN ASCI.
FNBD:    EQU         $
DMNBD:   WORD        '0101           < LECTURE NOMBRE DECIMAL.
         WORD        NBD-ZERO*2
         WORD        FNBD-NBD*2
DMREP4:  WORD        '0101           < ENTREE DE 4 CARACTERES.
         WORD        NBD-ZERO*2
         WORD        4
AXNBD:   WORD        NBD,X           < RELAI D'ACCES A CE NOMBRE.
<
< DIVERS.
<
TABTRI:  DZS         LNF*2+1         < TABLE POUR ARGUMENTS DES FONCTIONS
                                     < TRIGONOMETRIQUES ET AUTRE...
Y:       EQU         TABTRI+LNF      < COORDONNEE Y COURANTE.
NIMC:    DZS         1               < NUMERO IMAGE COURANTE.
AX1V:    WORD        X1V
AX2V:    WORD        X2V
AY1V:    WORD        Y1V
AY2V:    WORD        Y2V
AXIM:    WORD        IMAG-1,X        < RELAI DE RAZ IMAGE.
ALIMAG:  WORD        LIMAG           < LONGUEUR MOTS IMAGE.
<
DIX0:    WORD        1               < DIX PUISSANCE ZERO.
DIX1:    WORD        10              < ... 1.
DIX2:    WORD        100             < ... 2.
DIX3:    WORD        1000            < ... 3.
DIX4:    WORD        10000           < ... 4.
DIX:     EQU         DIX1            < DIX.
C1024:   WORD        1024            < POUR VALIDATIONS (X,Y).
         PAGE
         PROG
ENTRY:   EQU         $
<
< INITIALISATIONS.
<
         LRM         C,K
         WORD        COM+'80
         WORD        PILE-1
         USE         W,PARC
         BSR         AINI            < INITIALISATIONS.
         FLD         FZERO
         FST         TC              < INSTANT COURANT = 0.
         LX          NBETAP
         ADRI        1,X             < PLUS L'ETAPE 0.
         STZ         ETAPEC          < ETAPE COURANTE = 0.
PP2:     EQU         $
<
< BOUCLE DE CALCUL, T VARIANT...
<
         PSR         X               < SAVE LE COUNT DE BOUCLE.
< FAUT-IL CALCULER / VISUALISER CETTE ETAPE?
         LAI         0
         LB          ETAPEC
         DV          UESN            < UNE ETAPE SUR N
         CPZR        B
         JNE         PP4
         BSR         ARAZ            < RAZ.
         CPZ         ISORTV
         JE          PP3
         LAD         DMDIFF
         LBI         1
         STB         COUL
         SVC         0
         LBI         2
         STB         COUL
         SVC         0
PP3:     EQU         $
         LRM         W
         WORD        JEU1            < PHENOMENE 1.
         BSR         ACAL            < CALCUL / TRACE PHENOMENE 1.
         LA          NBPH
         CPI         1               < 1 SEUL PHENOMENE?
         JE          PP1
         LRM         W
         WORD        JEU2            < PHENOMENE 2.
         BSR         ACAL            < CALCUL / TRACE PHENOMENE 2.
         LA          NBPH
         CPI         2               < SEULEMENT 2 PHENOMENES?
         JE          PP1
         LRM         W
         WORD        JEU3            < PHENOMENE 3.
         BSR         ACAL            < CALCUL / TRACE PHENOMENE 3.
PP1:     EQU         $
         BSR         ADIFC           < DIFFUSION / CATALOGAGE.
PP4:     EQU         $
         FLD         TC
         FAD         PASDET          < NOUVEAU T COURANT.
         FST         TC
         IC          ETAPEC
         PLR         X
         JDX         PP2             < ETAPE SUIVANTE SVP...
<
< FIN.
<
         WORD        '1E16
         JMP         ENTRY           < VERS NOUVELLE EXECUTION.
         PAGE
<
<        I N I T I A L I S A T I O N S.
<
<          ELLES SE PASSENT EN DEUX TEMPS:
<
<        1-ACQUISITION DES PARAMETRES DE MISE EN FORME (OU GENERAUX),
<
<        2-ACQUISITION DES PARAMETRES DE CALCUL, PROPRES A CHAQUE PHENOMENE
<          A VISUALISER (2 PHENOMENES AU PLUS).
<
INI:     EQU         $
< CHOIX DE LA SORTIE VISU.
         LAD         DMCLOS          < !CLOSE A PRIORI.
         SVC         0
INI0:    EQU         $
         STZ         ISORVI          < SORTIE VISU = NON A PRIORI.
         LAI         MSORVI-M
         BSR         AQREP           < QUESTION / REPONSE.
         CPI         "N"
         JE          INI2            < NON.
         CPI         "O"
         JNE         INI0            < REPONSE INCORRECTE.
         IC          ISORVI          < SORTIE VISU.
INI1:    EQU         $
         LAD         DMCLOS          < !CLOSE.
         SVC         0
         LAI         MVISU-M         < PROPOSITION.
         BSR         AQREP           < QUESTION / REPONSE.
         CPI         '04
         JE          INI11           < ASSIGNER L'OUTPUT.
         CPI         '0D
         JE          INI11           < ASSIGNER L'OUTPUT.
         STBY        VISU            < VISU A ASSIGNER.
         LAD         DMASVI          < !ASSIGN B=VIX.
         SVC         0
         JNE         INI1
         JMP         INI2
INI11:   EQU         $
         LAD         DMASO           < !ASSIGN B=O.
         SVC         0
INI2:    EQU         $
< CHOIX DE LA SORTIE TV.
         STZ         ISORTV          < SORTIE TV = NON A PRIORI.
         STZ         ICATAL          < PAS DE CATALOGAGE A PRIORI.
         LAI         MTV-M           < PROPOSITION.
         BSR         AQREP           < QUESTION / REPONSE.
         CPI         "N"
         JE          INI3            < PAS DE TV.
         CPI         "O"
         JNE         INI2
         IC          ISORTV          < OPTION TV ACTIVE.
< CHOIX DE L'OPTION CATALOGAGE.
INI21:   EQU         $
         LAI         MCATAL-M
         BSR         AQREP
         CPI         "N"
         JE          INI3
         CPI         "O"
         JNE         INI21
         IC          ICATAL          < CATALOGAGE =OUI.
INI22:   EQU         $
< CHOIX DE L'ADRESSE SECTEUR INITIALE SUR DKU.
         LAI         MAIDKU-M
         BSR         AENVOI
         LAD         DMREP4
         SVC         0
         LA          DMREP4+1        < ADRESSE OCTET REPONSE.
         BSR         ACONVH          < CONVERSION.
         JNE         INI22           < REPONSE INCORRECTE.
         STA         AIDKU           < ADRESSE INITIALE.
< CHOIX DU NUMERO DE LA PREMIERE IMAGE A GENERER.
         LAI         MNINI-M
         BSR         AQREPN
         STA         NIMC            < NUMERO IMAGE COURANTE.
INI3:    EQU         $
< CHOIX DE L'OPTION "TRACE POINTS".
         STZ         ITRACP          < NON A PRIORI.
         LAI         MTRACP-M
         BSR         AQREP
         CPI         "N"
         JE          INI6
         CPI         "O"
         JNE         INI3
         IC          ITRACP          < TRACE POINTS.
INI6:    EQU         $
< CHOIX DU NOMBRE DE PHENOMENES A VISUALISER.
         LAI         MNBPH-M
         BSR         AQREPN
         JALE        INI6
         CPI         3
         JG          INI6
         STA         NBPH
INI4:    EQU         $
< CHOIX DU NOMBRE D'ETAPES.
         LAI         MNBE-M
         BSR         AQREPN
         STA         NBETAP
< D'OU L'ON DEDUIT LE "PAS-DE-TEMPS-VISUALISATION", A PARTIR DU NOMBRE
< D'ETAPES DEMANDE ET DE "X-FINAL", SACHANT QUE VITESSE=1.
         FLT
         FST         TABTRI
         FLD         XFINAL
         FDV         TABTRI
         FST         PASDET          < PAS DE TEMPS VISUALISATION.
< CALCUL DU PAS EN X (OU DELTAX-VISUALISATION).
         FLD         XFINAL
         FDV         F256
         FST         PASX
<
< CHOIX DE LA VISUALISATION DE UNE ETAPE SUR N.
<
         LAI         MUESN-M
         BSR         AQREPN
         STA         UESN
<
< ACQUERIR LES PARAMETRES DE CALCUL POUR LES 1 A  3 PHENOMENES A VISUALISER,
< CES PARAMETRES SERONT STOCKES DANS LES ZONES 'JEU1' 'JEU2' ET 'JEU3' DECRITES
< DANS LA DSEC 'PARC'.
<
         LRM         W
         WORD        JEU1
         LAI         MPREM-M
         BSR         AINIC           < PARAMETRES DE CALCUL PHENOMENE 1.
         LA          NBPH
         CPI         1               < 1 SEUL PHENOMENE?
         JE          INI5
         LRM         W
         WORD        JEU2
         LAI         MSEC-M
         BSR         AINIC           < PARAMETRES DE CALCUL PHENOMENE 2.
         LA          NBPH
         CPI         2               < SEULEMENT 2 PHENOMENES?
         JE          INI5
         LRM         W
         WORD        JEU3
         LAI         MTROIS-M
         BSR         AINIC           < PARAMETRES DE CALCUL PHENOMENE 3.
INI5:    EQU         $
         RSR
<
<        A C Q U I S I T I O N   D ' U N   J E U   D E   P A R A M E T R E S
<
<        D E   C A L C U L.
<
<        ARGUMENTS:
<
<                    -'A' = ARGUMENT D'APPEL S/P 'ENVOI' (MESSAGE).
<                    -'W' = BASE DE LA ZONE DE STOCKAGE DES PARAMETRES
<                           DE CALCUL, DECRITE PAR LA DSEC 'PARC'.
<
INIC:    EQU         $
         BSR         AENVOI          < MESSAGE "PREMIER/SECOND/TROISIEME"...
< ACQUISITION DE LAMBDA.
         LAI         MLAMBD-M
         BSR         AQREPN
         FLT
         FDV         FDIX
         FST         LAMBDA
< CHOIX DU MODE DE CALCUL: EXACT OU APPROCHE.
INIC1:   EQU         $
         STZ         IEXACT          < EXACT A PRIORI.
         LAI         MCEA-M
         BSR         AQREP
         CPI         "E"
         JE          INIC2
         CPI         "A"
         JNE         INIC1
         IC          IEXACT          < APPROCHE.
< CALCUL APPROCHE: ACQUERIR GAMMA.
         LAI         MGAM-M
         BSR         AQREPN
         FLT
         FDV         FDIX
         FST         GAMMA
< CALCUL APPROCHE: ACQUISITION DE DELTAX/LAMBDA.
         LAI         MDXSL-M
         BSR         AQREPN
         PSR         A               < NUMERATEUR.
         LAI         MSLASH-M
         BSR         AQREPN
         FLT
         FST         DELTAX          < DENOMINATEUR
         PLR         A
         FLT
         FDV         DELTAX
         FMP         LAMBDA
         FST         DELTAX
INIC3:   EQU         $
< CALCUL APPROCHE: CHOIX DE AMORTISSEMENT OU PAS...
         STZ         IAMORT          < NON A PRIORI.
         LAI         MAMORT-M
         BSR         AQREP
         CPI         "N"
         JE          INIC2
         CPI         "O"
         JNE         INIC3
         IC          IAMORT          < AMORTIR.
INIC2:   EQU         $
<
< FACTEUR MULTIPLICATIF EN X.
<
         LAI         MMULX-M
         BSR         AQREPN          < QUESTION / REPONSE NB DECIMAL.
         FLT
         FST         MULX
<
< FACTEUR MULTIPLICATIF EN Y.
<
         LAI         MMULY-M
         BSR         AQREPN          < QUESTION / REPONSE NB DECIMAL.
         FLT
         FST         MULY
<
< TRANSLATION EN X.
<
         LAI         MTX-M
         BSR         AQREPN
         FLT
         FST         TX
<
< TRANSLATION EN Y.
<
         LAI         MTY-M
         BSR         AQREPN
         FLT
         FST         TY
< ET MAINTENANT, CALCUL DE CHOSES QUI SERVIRONT PAR LA SUITE...
<
< CALCUL DE K = 2PI / LAMBDA.
         FLD         F2PI
         FDV         LAMBDA
         FST         K
< CALCUL DE DELTAT = GAMMA * DELTAX (UTILE SSI CALCUL APPROCHE).
         FLD         GAMMA
         FMP         DELTAX
         FST         DELTAT
< CALCUL DE B (CF: DOCUMENTATION).
         FLD         K
         FMP         DELTAX
         FST         TABTRI
         LAD         TABTRI
         BSR         ATAN
         FLD         TABTRI+LNF
         FMP         GAMMA
         BSR         AARCTG
         FST         B
< CALCUL DE A (CF: DOCUMENTATION).
         LAD         TABTRI
         BSR         ACOS
         FLD         TABTRI+LNF
         FMP         TABTRI+LNF
         PSR         A,B
         LAD         TABTRI
         BSR         ASIN
         FLD         TABTRI+LNF
         FMP         TABTRI+LNF
         FMP         GAMMA
         FMP         GAMMA           < * GAMMA**2.
         FST         TABTRI
         PLR         A,B
         FAD         TABTRI
         FST         TABTRI
         LAD         TABTRI
         BSR         ASQRT
         CPZ         TABTRI+4
         JE          $+2
         ACTD
         FLD         TABTRI+LNF
< FAUT-IL BIEN AMORTIR ??
         CPZ         IAMORT
         JNE         INIC4
         FLD         FUN             < NON, DONC A RECOIT 1.
INIC4:   EQU         $
         FST         A
<
         RSR
         PAGE
<
<        C A L C U L   D E   L A   S I N U S O I D E   A   L ' I N S T A N T
<
<        C O U R A N T :   ' T C '.
<
CAL:     EQU         $
         FLD         FZERO
         FST         X               < X COURANT = 0.
         STZ         ITRACE          < POUR LE S/P TRACE: 1ER POINT.
         CPZ         IEXACT
         JNE         CALA            < CALCUL APPROCHE.
<
<        C A L C U L   E X A C T.
<
<        U(X,T) = COS K(CT-X)   [C=1].
<
< CALCUL DES BORNES 1 ET 2.
         FLD         TC
         FST         BORNE1
         FAD         LAMBDA
         FST         BORNE2
         FLD         X
CALE1:   EQU         $
         FST         X
         FCAM        XFINAL
         JG          CALFIN          < TERMINE.
         FLD         TC
         FSB         X
         FMP         K
         FST         TABTRI
         LAD         TABTRI
         BSR         ACOS
         BSR         ATRACE          < TRACE SEGMENT COURANT.
         FLD         X
         FAD         PASX            < NOUVEL X COURANT.
         JMP         CALE1
<
<        C A L C U L   A P P R O C H E.
<
<        U(X,T) = COS(B-COURANT - KX) * A-COURANT.
<
<        AVEC:
<
<        B-COURANT = I((N*B),((N+1)*B).
<        A-COURANT = I((A**N),(A**N+1))
<        N = E(TCOURANT/DELTAT)
<        I(G,H) SIGNIFIANT INTERPOLATION LINEAIRE ENTRE G ET H.
<
CALA:    EQU         $
         FLD         TC              < T COURANT.
         FDV         DELTAT
         FIX
         STA         N               < ORDRE COURANT.
         FLT                         < IL FAUDRA INTERPOLER ENTRE N ET N+1.
< CALCULER LE RAPPORT D'ACCROISEMENT DE T.
         FMP         DELTAT
         FST         RAPAC
         FLD         TC
         FSB         RAPAC
         FDV         DELTAT
         FST         RAPAC           < = (TC-N.DELTAT)/DELTAT.
< CALCULER A A L'ORDRE N ET N+1 ET INTERPOLER.
         LX          N
         BSR         ACAON           < A ORDRE N.
         FST         AC
         ADRI        1,X
         BSR         ACAON           < A ORDRE N+1.
         FSB         AC
         FMP         RAPAC           < DELTA A * RAPPORT D'ACCROISSEMENT.
         FAD         AC
         FST         AC              < A COURANT.
< CALCULER B A L'ORDRE N ET N+1 ET INTERPOLLER.
         LA          N
         FLT
         FMP         B
         FST         BC              < B ORDRE N.
         LA          N
         ADRI        1,A
         FLT
         FMP         B               < B ORDRE N+1.
         FSB         BC
         FMP         RAPAC           < DELTA B * RAPPORT D'ACCROISSEMENT.
         FAD         BC
         FST         BC              < B COURANT.
< CALCUL DES BORNES 1 ET 2 (MODE APPROCHE).
         FDV         K               < BORNE1 = B COURANT / K.
         FST         BORNE1
         FAD         LAMBDA
         FST         BORNE2
< CALCUL DE U(X,T) APPROCHE.
         FLD         X               < X COURANT.
CALA3:   EQU         $
         FST         X
         FCAM        XFINAL
         JG          CALFIN          < TERMINE.
         FMP         K
         FST         TABTRI
         FLD         BC
         FSB         TABTRI
         FST         TABTRI
         LAD         TABTRI
         BSR         ACOS
         FLD         TABTRI+LNF
         FMP         AC
         FST         Y
         BSR         ATRACE          < TRACE SEGMENT COURANT.
         FLD         X
         FAD         PASX            < NOUVEL X COURANT.
         JMP         CALA3
<
CALFIN:  EQU         $
         RSR
<
<        C A L C U L   D E   A   A   L ' O R D R E   N.
<
<        ARGUMENT:
<                    -'X' = ORDRE N.
<
<        IL SUFFIT D'ELEVER A A LA PUISSANCE N.
<
CAON:    EQU         $
         PSR         X
         FLD         FUN             < A PUISSANCE 0 A PRIORI.
         CPZR        X
         JE          CAONF
CAON3:   EQU         $
         FMP         A
         JDX         CAON3
CAONF:   EQU         $
         PLR         X
         RSR
         PAGE
TRACE:   EQU         $
<
<        T R A C E   G R A P H I Q U E   E T   /   O U   V I D E O.
<
<        (X,Y) FLOTTANTS SONT MULTIPLIES-TRANSLATES.
<
         PSR         A,B,X,L
< (X2,Y2) DEVIENT (X1,Y1).           < X2 VIDEO
         LA          &AX2V
         STA         &AX1V
         LA          &AY2V
         STA         &AY1V
         FLD         X
         FMP         MULX
         FAD         TX
         FIX
         STA         &AX2V           < NOUVEL X2.
         FLD         Y
         FMP         MULY
         FAD         TY
         FIX
         STA         &AY2V           < NOUVEL Y2.
<
         CPZ         ITRACP          < TEST MODE TRACE POINTS.
         JE          TRACE3
         IC          ITRACE          < CET INDICATEUR EST DANS CE CAS SANS
                                     < OBJET.
         LA          &AX2V
         STA         &AX1V
         LA          &AY2V
         STA         &AY1V
TRACE3:  EQU         $
         LRM         A,B,X
         WORD        COORDV
         WORD        COORDG
         WORD        4
         MOVE                        < COORDONNEES GRAPHIQUES.
<
         CPZ         ITRACE          < TEST PREMIER POINT (AUQUEL CAS IL
                                     < N'Y A PAS ENCORE A FAIDE DE TRACE).
         JNE         TRACE1
         IC          ITRACE          < MODIFIONS L'INDICATEUR.
         JMP         TRACEF          < TERMINE.
TRACE1:  EQU         $
         CPZ         ISORVI          < TEST SORTIE VISU.
         JNE         TRACE2
TRACE5:  EQU         $
         CPZ         ISORTV          < TEST SORTIE TV.
         JE          TRACEF
< TRACE VIDEO.
< DE X = BORNE1 A X = BORNE2 ,    ON TRACE LA SINUSOIDE DANS LE ROUGE AU
< LIEU DU VERT HABITUEL.
         FLD         X
         FCAM        BORNE1
         JL          TRACE6
         FCAM        BORNE2
         JG          TRACE6
< TRACER DANS LE ROUGE.
         LA          COUL
         CPI         1
         JE          TRACE7
< DIFFUSER LE VERT ET REPRENDRE LE ROUGE.
         LAD         DMDIFF
         SVC         0
         JE          $+2
         WORD        '1E16
         LBI         1
         SBT         16+9            < LECTURE ROUGE.
         STB         COUL
         SVC         0
         JE          $+2
         WORD        '1E16
         RBT         16+9
         STB         COUL
TRACE7:  EQU         $
         JMP         TRACE8
TRACE6:  EQU         $
< TRACER, OU CONTINUER DE TRACER, DANS LE VERT.
         LA          COUL
         CPI         2
         JE          TRACE8
< DIFFUSER LE ROUGE ET REPRENDRE LE VERT DANS LE STACK VERT.
         LAD         DMDIFF
         SVC         0
         JE          $+2
         WORD        '1E16
         LBI         2
         SBT         16+9            < LECTURE.
         STB         COUL
         SVC         0
         JE          $+2
         WORD        '1E16
         RBT         16+9
         STB         COUL
TRACE8:  EQU         $
         LAD         DMTRV
         SVC         0
         JE          $+2
         WORD        '1E16
         JMP         TRACEF
< TRACE GRAPHIQUE AU MOINS...
TRACE2:  EQU         $
< POUR LE TRACE GRAPHIQUE, IL FAUT FILTRER LES COORDONNEES HORS-ECRAN.
         LRM         X,L
         WORD        4
         WORD        COORDG
TRACE4:  EQU         $
         LA          0,L
         JAL         TRACEF
         CP          C1024
         JGE         TRACEF
         ADRI        1,L
         JDX         TRACE4
< ICI, TOUTES LES COORDONNEES SONT DANS L'ECRAN, ON PEUT TRACER.
         LAD         DMOG
         SVC         0
         JE          $+2
         WORD        '1E16
         LAD         DMTRGR
         SVC         0
         JE          $+2
         WORD        '1E16
         JMP         TRACE5          < VERS TRACE VIDEO EVENTUEL.
<
TRACEF:  EQU         $
         PLR         A,B,X,L
         RSR
         PAGE
<
<        R A Z   E C R A N   G R A P H I Q U E   E T / O U   V I D E O.
<
RAZ:     EQU         $
         PSR         A,X
         CPZ         ISORVI
         JE          RAZ1
         LAD         DMRAZ
< !!!!   SVC         0               < RAZ ECRAN VISU.
RAZ1:    EQU         $
         CPZ         ISORTV
         JE          RAZ2
         LX          ALIMAG
         STZ         &AXIM
         JDX         $-1
RAZ2:    EQU         $
         PLR         A,X
         RSR
         PAGE
<
<        D I F F U S I O N   /   C A T A L O G A G E.
<
DIFC:    EQU         $
         PSR         A,X
         CPZ         ISORTV
         JE          DIFCF
         LAD         DMDIFF
         SVC         0
         JE          $+2
         WORD        '1E16
         CPZ         ICATAL
         JE          DIFCF
<
< CATALOGAGE SUR DKU DE L'IMAGE COURANTE.
<
         LA          NIMC            < NUMERO IMAGE COURANTE.
         MP          NBQSPI          < * NB DE Q-SECTEURS PAR IMAGE.
         LR          B,A
         AD          AIDKU           < ADRESSE SECTEUR COURANTE.
         STA         DMDIR+3
         EOR         AIDKU
         TBT         0
         JNC         DIFC1           < AS INIT. ET AS COURANE DE MEME SIGNE,
                                     < C'EST BON.
         CPZ         AIDKU           < ADRESSE INITIALE POSITIVE?
         JGE         DIFC1           < OUI, C'EST BON.
         ACTD
DIFC1:   EQU         $
         LAD         DMDIR
         SVC         0
         JE          $+2
         WORD        '1E16
         LA          NIMC
         LRM         Y
         WORD        MNIMC-ZERO*2
         BSR         ACVDA           < EDITION NUMERO D'IMAGE.
         LAI         MNIMCR-M        < ENVOI MESSAGE.
         BSR         AENVOI
         IC          NIMC            < NOVEAU NUMERO D'IMAGE COURANTE.
DIFCF:   EQU         $
         PLR         A,X
         RSR
         NLS
         EOT         #SI SINUS#
<
<        SOUS-PROGRAMME DE CALCUL DE LA TANGENTE
<        TABLE DE TRANSMISSION POINTEE PAR REGISTRE A
<        - MOT1 ET MOT2 : X EN FLOTTANT
<        - MOT3 ET MOT4 : Y EN FLOTTANT(RESULTAT)
<
         LOCAL
ZZZ100:  EQU         $
ZZZ101:  DZS         2               < NB EN FLOTTANT
ZZZ102:  DZS         2
ZZZ116:  DZS         2
ZZZ117:  WORD        '7F7F;'FFFF     < +INFINI
ZZZ118:  WORD        '807F;'0001     < -INFINI
ZZZ119:  WORD        ZZZ120          < SP DE CALCUL DU SINUS
ZZZ103:  DZS         1               < SIGNE
ZZZ104:  WORD        '6403;'87ED     < 2*PI
ZZZ105:  WORD        '6402;'87ED     < PI
ZZZ106:  WORD        '6401;'87ED     < PI/2
ZZZ107:  EQU         ZZZ106          < CSTES DU POLYNOME
ZZZ108:  WORD        'AD00;'5110
ZZZ109:  WORD        '51FD;'9A2C
ZZZ110:  WORD        'B3F9;'6CCE
ZZZ111:  WORD        '4FF4;'6BDD
         WORD        ZZZ100+'80      <RELAI VERS LE LOCAL
         PROG
TG:      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         ZZZ106
         FNEG
         BSR         ZZZ119
         FST         ZZZ116
         FLD         0,W
         BSR         ZZZ119
         FCMZ        ZZZ116
         JE          ZZZ121
         FDV         ZZZ116
ZZZ123:  EQU         $
         FST         2,W
         PLR         A,B,L,W
         RSR
ZZZ121:  EQU         $
         FCAZ
         JL          ZZZ122
         FLD         ZZZ117
         JMP         ZZZ123
ZZZ122:  EQU         $
         FLD         ZZZ118
         JMP         ZZZ123
ZZZ120:  EQU         $
         FST         ZZZ101
         STZ         ZZZ103
         JAGE        ZZZ112
         FNEG
         FST         ZZZ101
         IC          ZZZ103
ZZZ112:  EQU         $
         FDV         ZZZ104
         FIX
         FLT
         FMP         ZZZ104
         FSB         ZZZ101
         FNEG
         FCAM        ZZZ105
         JL          ZZZ113
         FSB         ZZZ105
         IC          ZZZ103
ZZZ113:  EQU         $
         FCAM        ZZZ106
         JL          ZZZ114
         FSB         ZZZ105
         FNEG
ZZZ114:  EQU         $
         FDV         ZZZ106
         FST         ZZZ101
         FMP         ZZZ101
         FST         ZZZ102
         FMP         ZZZ111
         FAD         ZZZ110
         FMP         ZZZ102
         FAD         ZZZ109
         FMP         ZZZ102
         FAD         ZZZ108
         FMP         ZZZ102
         FAD         ZZZ107
         FMP         ZZZ101
         DC          ZZZ103
         JNE         ZZZ115
         FNEG
ZZZ115:  EQU         $
         RSR
         PAGE
<
<        A R C T G ( X ).
<
<        ARGUMENT:
<                    A-B = X ARGUMENT (FLOTTANT).
<
<        RESULTAT:
<                    A-B = ARCTG(X) (FLOTTANT), EXPRIME EN RADIANS.
<
<        ATTENTION:
<                    PREVOIR QUELQUES MOTS DANS LA PILE DE L'APPELANT.
<
<        NOTA:
<                    LA METHODE DE CALCUL UTILISEE EST TIREE DE L'OUVRAGE
<                    "CALCUL DES FONCTIONS DE BASE SUR L'IBM-360" - DEPARTEMENT
<                    DE CALCUL ELECTRONIQUE DE L'X, PAR J-M GUILLEMIN
<                    ET D. GRILLOT - AOUT 67.
<
         LOCAL
ATGLOC:  EQU         $
ATGT1:   DZS         LNF             < ZONE DE TRAVAIL 1.
ATGT2:   DZS         LNF             < ZONE DE TRAVAIL 2.
ATGT3:   DZS         LNF             < ZONE DE TRAVAIL 3.
ATGSDX:  DZS         1               < 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:   FLOAT       1.0
ATGR3:   FLOAT       1.7320508
                                     < ^^ RACINE DE 3.
< COEFFICIENTS P1, P2, P3, P4 DU POLYNOME:
ATGP1:   FLOAT       0.6031058
ATGP2:   FLOAT       0.0516045
ATGP3:   FLOAT       0.5591371
ATGP4:   FLOAT       1.4087812
         PROG
ARCTG:   EQU         $               < E N T R Y   ' A R C T G ( X ) '.
< SAUVEGARDES ET INITIALISATIONS.
         PSR         X,L
         LX          'FF80,C         < A CAUSE DU BLOC FLOTTANT.
         PSR         X
         LRM         L
         WORD        ATGLOC+'80
         STZ         ATGSDX          < X ARGUMENT POSITIF OU NUL A PRIORI.
         FCAZ
         JGE         ARCTG1
         DC          ATGSDX          < X ARGUMENT NEGATIF.
ARCTG1:  EQU         $
         FABS                        < U = ABS(X).
         FCAM        ATGUN
         JGE         ARCTG2
< U < 1 : J RECOIT 0.
         LXI         0
         JMP         ARCTG3
ARCTG2:  EQU         $
< U >= 1 : J RECOIT 2 ET U RECOIT 1/U.
         LXI         2               < 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        2,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        1,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        -2,X
         CPZR        X
         JE          ARCTG6
         JL          ARCTG7
         ADRI        -1,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
         STX         'FF80,C         < C'ETAIT A CAUSE DU BLOC FLOTTANT.
         PLR         X,L
         RSR
<
<        SOUS-PROGRAMME DE CALCUL DE LA RACINE CARREE
<        TABLE DE TRANSMISSION POINTEE PAR REGISTRE A
<        - MOT1 ET MOT2 : X EN FLOTTANT
<        - MOT3 ET MOT4 : Y EN FLOTTANT(RESULTAT)
<        - MOT5 : CODE RETOUR (0-BON;1-ERREUR)
<
         LOCAL
ZZZ040:  EQU         $
ZZZ041:  DZS         1               < MAX
ZZZ042:  WORD        'FF00           < MASQUE
ZZZ043:  DZS         2               < NB EN FLOTTANT
ZZZ044:  DZS         2
ZZZ045:  WORD        '4A00;'0000     < CSTES
ZZZ046:  WORD        '6CFF;'0000
ZZZ047:  WORD        '7000;'0000
ZZZ048:  WORD        '47FF;'544C
ZZZ049:  WORD        ZZZ050          < SS-PROG
ZZZ056:  WORD        '0080           < CSTE
         WORD        ZZZ040+'80      < RELAI VERS LE LOCAL
         PROG
SQRT:    EQU         $
         PSR         A,B,Y,L,W
         LRP         L               < INIT. DE LA BASE L
         LB          -2,L
         LR          B,L
         LR          A,W             < @ TABLE PARAM.
         STZ         4,W             < CODE DE RETOUR A ZERO
         FLD         0,W
         FCAZ
         JL          ZZZ054
         JE          ZZZ053
         LR          A,Y
         ANDI        'FF
         SWBR        A
         SARS        1
         AD          ZZZ056
         TBT         8
         JNC         ZZZ051
         RBT         8
         STA         ZZZ041
         LR          Y,A
         AND         ZZZ042
         FST         ZZZ044
         FMP         ZZZ045
         FAD         ZZZ046
         JMP         ZZZ052
ZZZ051:  EQU         $
         STA         ZZZ041
         LR          Y,A
         ORI         'FF
         FST         ZZZ044
         FMP         ZZZ047
         FAD         ZZZ048
ZZZ052:  EQU         $
         BSR         ZZZ049
         SWBR        A
         BSR         ZZZ049
         AD          ZZZ041
         SWBR        A
ZZZ053:  EQU         $
         FST         2,W
ZZZ055:  EQU         $
         PLR         A,B,Y,L,W
         RSR
ZZZ054:  EQU         $
         LAI         1               < ERREUR
         STA         4,W
         JMP         ZZZ055
ZZZ050:  EQU         $
         FST         ZZZ043
         FLD         ZZZ044
         FDV         ZZZ043
         FAD         ZZZ043
         SWBR        A
         AD          ZZZ042
         RSR
         PAGE
CVAD:    EQU         $
<
<        C O N V E R S I O N   E N   B I N A I R E   D A N S   ' A '
<
<        D ' U N   N O M B R E   D E C I M A L   S A I S I   E N   A S C I.
<
<        ARGUMENTS:
<                    - 'A' = ADRESSE MOT DE LA CHAINE DE CARACTERES ASCI
<                            TERMINEE PAR <EOT> OU <RETURN> ET DE LONGUEUR
<                            MAXIMUM 6 OCTETS.
<
<        RESULAT:
<                    - AU RETOUR, FAIRE:
<                      JE     OK     < 'A' = NOMBRE EN BINAIRE.
<                      JNE    ERREUR < NOMBRE INCORRECT.
<
         PSR         B,X,Y,W         < SAUVEGARDES.
<
         LR          A,B             < 'B' = ADRESSE DEBUT ZONE POUR SBS.
         LAI         '0D             < CARACTERE A RECHERCHER.
         LXI         0               < RANG DU PREMIER CARACTERE.
         LYI         FNBD-NBD*2      < NOMBRE D'OCTETS DE LA ZONE.
         IF          FNBD-NBD*2-6,XWOR%,XWOR%,
         IF          E R R E U R : 'NBD' TROP LONG.
XWOR%:   VAL         0
         SBS                         < SEARCH '0D.
         JNC         CVAD1           < '0D EXISTE.
         LXI         FNBD-NBD*2      < '0D N'EXISTE PAS.
CVAD1:   EQU         $
         PSR         X
         LAI         '04             < CHERCHONS AUSSI '04.
         LXI         0
         SBS                         < SEARCH '04.
         JNC         CVAD7           < '04 EXISTE.
         LXI         FNBD-NBD*2      < '04 N'EXISTE PAS.
CVAD7:   EQU         $
< NOUS ALLONS PRENDRE LE MIN DES INDEX '0D ET '04; SI CE MIN VAUT
< FNBD-NBD*2, ALORS C'EST QUE NI '0D NI '04 N'EXISTENT...
         PLR         A
         CPR         X,A
         JLE         CVAD3
         LR          X,A
CVAD3:   EQU         $
         LR          A,X             < CE SERA FAIT...
         CPI         FNBD-NBD*2
         JE          CVAD2           < NI '0D NI '04, ERREUR.
         JAE         CVAD4           < REPONSE VIDE, 0 SUPPOSE.
< REPONSE NON VIDE, CONVERSION DECIMAL --> BINAIRE.
         LYI         0               < NOMBRE COURANT.
         LRM         W
         WORD        DIX0            < 'W' BASE LES PUISSANCES DE DIX.
CVAD5:   EQU         $
         ADRI        -1,X            < CHIFFRE SUIVANT (DE DROITE A GAUCHE).
         LBY         &AXNBD          < CRACTERE COURANT.
         ADRI        -"0",A
         JAL         CVAD2           < ERREUR.
         CPI         9
         JG          CVAD2           < ERREUR.
         MP          0,W             < CHIFFRE COURANT * 10 PUISSANCE COURANTE.
         ADR         B,Y             < NOUVEAU NOMBRE COURANT.
         ADRI        1,W             < PISSANCE DE DIX SUIVANTE.
         CPZR        X
         JG          CVAD5           < AU SUIVANT.
         LR          Y,A             < 'A' = NOMBRE EN BINAIRE.
CVAD4:   EQU         $
         LBI         0               < OK.
         JMP         CVAD6
CVAD2:   EQU         $
         LBI         1               < ERREUR.
CVAD6:   EQU         $
         CPZR        B               < POUR TEST AU RETOUR.
         PLR         B,X,Y,W         < RESTAURATIONS.
         RSR
         PAGE
QREPN:   EQU         $
<
<        E N V O I   Q U E S T I O N   E T   D E M A N D E   V A L I D A T I O N
<
<        E T   C O N V E R S I O N   D E   L A   R E P O N S E   Q U I
<
<        D O I T   E T R E   U N   N O M B R E   D E C I M A L.
<
<        ARGUMENT:
<                    'A' = ARGUMENT D'APPEL POUR LE S/P 'ENVOI'.
<
<        RESULTAT:
<                    'A' = NOMBRE VALIDE, CONVERTI EN BINAIRE.
<
         PSR         X,Y             < SAUVEGARDES.
<
         LR          A,Y             < SAVE ARGUMENT D'APPEL S/P ENVOI.
QREPN1:  EQU         $
         BSR         AENVOI          < ENVOI QUESTION.
         LAD         DMNBD           < LECTURE REPONSE (NB DECIMAL).
         SVC         0
         LAD         NBD             < ADRESSE ZONE REPONSE.
         BSR         ACVAD           < CONVERSION EN BINAIRE DANS 'A'.
         JE          QREPN2          < REPONSE CORRECTE (CONVERSION OK).
         LR          Y,A             < REPONSE INCORRECTE, RECOMMENCER...
         JMP         QREPN1
QREPN2:  EQU         $
         PLR         X,Y             < RESTAURATIONS.
         RSR
         PAGE
QREP:    EQU         $
<
<        E N V O I   Q U E S T I O N   E T   D E M A N D E   R E P O N S E
<
<                      LA REPONSE EST DE 1 CARACTERE (PAR EXEMPLE
<                    OUI/NON).
<
<        ARGUMENT:
<                    'A' = ARGUMENT D'APPEL DU S/P ENVOI POUR
<                          POSER UNE QUESTION.
<
<        RESULTAT:
<                    'A' ( 8-15 ) = REPONSE.
<
         PSR         X
         BSR         AENVOI          < ENVOI QUESTION
         LAD         DMREP           < DEMANDE REPONSE
         SVC         0
         LBY         REP             < CHARGEMENT REPONSE DANS 'A'.
         PLR         X
         RSR
         PAGE
CVDA:    EQU         $
<
<        C O N V E R S I O N - E D I T I O N   E N   D E C I M A L
<
<        F O R M A T   A S C I   D ' U N   N O M B R E   B I N A I R E
<
<        C O N T E N U   D A N S   ' A '.
<
<        ARGUMENTS:
<                    - 'A' = NOMBRE EN BINAIRE.
<                    - 'Y' = ADRESSE OCTET D'EDITION DE CE NOMBRE
<                      ( ZONE D'EDITION DE 6 OCTETS MAXIMUM: 5 CHIFFRES
<                      PLUS LE SIGNE).
<
         PSR         A,B,X,Y         < SAUVEGARDES.
         PSR         W
<
         XR          Y,W
         LYI         " "             < SI POSITIF, PAS DE SIGNE.
         JAGE        $+2
         LYI         "-"             < NOMBRE NEGATIF, SIGNE MOINS.
         XR          Y,W             < 'W' CONTIENT LE SIGNE.
<
         LXI         5               < 5 CHIFFRES MAXI.
CVDA1:   EQU         $
         SARD        16
         DV          DIX
         CPZR        B               < TEST SIGNE DU RSTE.
         JGE         $+2
         NGR         B               < CHIFFRE POSITIF.
         ADRI        "0",B           < POUR EDITION FUTURE.
         PSR         B               < PUSH CHIFFRE COURANT.
         JDX         CVDA1
         PSR         W               < PUSH SIGNE.
<
         LXI         6               < SIGNE PLUS 5 CHIFFRES.
CVDA2:   EQU         $
         LR          X,W             < SAVE COUNT.
         LR          Y,X             < INDEX COURANT.
         PLR         A               < PULL SIGNE / CHIFFRE COURANT.
         STBY        &AXTRAV         < STOCKAGE SIGNE / CHIFFRE.
         LR          W,X             < RECUPERATION COUNT.
         ADRI        1,Y             < INDEX CHIFFRE SUIVANT.
         JDX         CVDA2
<
         PLR         W               < RESTAURATIONS.
         PLR         A,B,X,Y
         RSR
         PAGE
<
<        CONVERSION EN BINAIRE D'UN NOMBRE HEXADECIMAL SAISI
<        EN ASCI (PAR EXEMPLE, NUMERO DE SECTEUR)
<
<        ARGUMENTS:
<                    'A' = ADRESSE OCTET DES 4 CARACTERES ASCI
<
<        RESULTAT:
<                    'A' = NOMBRE EN BINAIRE, A VALIDER EN FAISANT AU RETOUR:
<                                         JE     OK         OU
<                                         JNE    ERREUR
<
CONVH:   EQU         $
         PSR         B,X,Y,W         < SAUVEGARDES
         LR          A,Y             < Y = ADRESSE CARACTERE EN COURS
         LXI         4               < INIT COUNT
CONVH1:  EQU         $
         LR          X,W             < SAUVEGARDE COUNT
         LR          Y,X             < INDEX CARACTERE
         LBY         &AXTRAV         < CARACTERE
         CPI         "0"
         JL          CONVH3          < ERREUR
         CPI         "9"
         JLE         CONVH2
         CPI         "A"
         JL          CONVH3          < ERREUR
         CPI         "F"
         JG          CONVH3          < ERREUR
         ADRI        -7,A
CONVH2:  EQU         $
         ADRI        -'30,A
         SLLS        12
         SCLD        4               < CHIFFRE HEXA DANS 'B'
         ADRI        1,Y             < CARACTERE SUIVANT
         LR          W,X             < RESTAURATION COUNT
         JDX         CONVH1          < AU SUIVANT
<
         SLLD        16              < CONVERSION OK
         JMP         CONVH9
<
CONVH3:  EQU         $
         LBI         1               < ERREUR
CONVH9:  EQU         $
         CPZR        B               < POUR TEST AU RETOUR.
         PLR         B,X,Y,W         < RESTAURATIONS
         RSR
         PAGE
ENVOI:   EQU         $
<
<        ENVOI D'UN MESSAGE SUR UL '02
<
<        EN ENTREE
<
<        A=DEPLACEMENT MOTS DU MESSAGE A ENVOYER PAR RAPPORT
<          A M. TOUT MESSAGE EST DELIMITE PAR '00
<
<
<        NOTA: ON A
<                    EN TABLE:     M:    EQU    $+256
<                                  MES1: ASCI   "TEXTE..."
<                                        WORD   0
<                    EN COMMON:    AM:  WORD   M
<                    APPEL PAR:          LAI    MESI-M
<                                        BSR    AENVOI
<
         PSR         A,X
         AD          AM              < @ MOT MESSAGE
         ADR         A,A             < @ OCT MESSAGE
         STA         DMOUT+1
         STZ         DMOUT+2
         LR          A,X
ENV1:    EQU         $               < BOUCLE JUSQU'A DELIM '00
         LBY         &AXTRAV
         JAE         ENV2
         IC          DMOUT+2         < LONGUEUR='+1
         ADRI        1,X
         JMP         ENV1
ENV2:    EQU         $
         LAD         DMOUT
         SVC         0
         PLR         A,X
         RSR
         LST
         END



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.