DF'SIO5 256-->512'
ED'SIO5 256-->512'
IN0
         PAGE
         IDP         "SIO5 256-->512"
<
<
<        C O N V E R S I O N   I M A G E   2 5 6
<                    -->   I M A G E   5 1 2  :
<
<
<        FONCTION :
<                      CE MODULE ASSURE LA CONVERSION
<                    D'UNE IMAGE 256 EN UNE IMAGE 512
<                    SUIVANT 3 MODES : LE PREMIER PAR
<                    DUPLICATION 1 POINT --> 4 POINTS
<                    LE SECOND PAR INTERPOLATION ENTRE
<                    LES POINTS (2 OU 4) VOISINS, ET
<                    ENFIN LE DERNIER, OU L'ON TRACE
<                    UN POINT POUR UN POINT, CE QUI
<                    PERMET D'AFFICHER 4 IMAGES COTE
<                    A COTE...
<                      ENFIN, LE NIVEAU DE CHAQUE
<                    POINT EST OBTENU EN FAIT PAR
<                    SOMMATION SUR UNE SPIRALE
<                    CENTREE AU POINT COURANT, ET
<                    DE PLUS, ON PEUT NE PAS MAR-
<                    QUER LES POINTS NOIRS, AFIN DE
<                    FACILITER LA SUPERPOSITION
<                    D'IMAGES...
<
<
<        DANS L'ORDRE, ON EFFECTUE :
<                    1 - UN DECALAGE DE 5 POSITIONS A DROITE DU NIVEAU,
<                    2 - UN MASQUAGE PAR 'AD',
<                    3 - UN DECALAGE DE 'A2' POSITIONS (DROITE OU GAUCHE),
<                    4 - UNE TRANSLATION DE 'A8'.
<
<
<        ARGUMENT :
A0::     VAL         0               < MODE DE CONVERSION :
                                     < =0 : PAR DUPLICATION,
                                     < >0 : PAR INTERPOLATION,
                                     < <0 : 1 POINT POUR 1 POINT.
A1::     VAL         A0+1            < SELECTION DES PLANS DE MEMOIRE ACTIFS,
                                     < AVEC UNE CONVENTION SOFT INVERSE DE LA
                                     < CONVENTION HARD :
                                     < 0 : PLAN DE MEME RANG INHIBE,
                                     < 1 : PLAN DE MEME RANG ACTIF.
A2::     VAL         A1+1            < APRES CALCUL DU NIVEAU 512*512 EQUIVA-
                                     < LENT AU NIVEAU 256*256 ARGUMENT DANS
                                     < 'PNIVO', IL DECALE DE 'A2', ET
                                     < A DROITE SI (A2)<0,
                                     < A GAUCHE SI (A2)>0.
                                     < N O T A  :  LA COMBINAISON DE 'A1' ET
                                     < 'A2' PERMET DE FAIRE DES SUPERPOSITIONS
                                     < DE 2 IMAGES 256*256 SUR UNE MEME 512*512
                                     < EN PRENANT POUR CHACUNE D'ELLE DES
                                     < MASQUES 'A1' COMPLEMENTAIRES, ET POUR
                                     < 'A2' LES VALEURS RESPECTIVES DE 0 ET -3.
A3::     VAL         A2+1            < ACTION INITIALE :
                                     < =0 : EFFACER L'ECRAN 512*512, ET REINI-
                                     <      TIALISER LES REGISTRES,
                                     < #0 : NE RIEN FAIRE...
A4::     VAL         A3+1            < TRANSLATION SUR X, SI (A0)<0,
A5::     VAL         A4+1            < TRANSLATION SUR Y, SI (A0)<0.
A6::     VAL         A5+1            < NOMBRE DE POINTS SUR CHAQUE SPIRALE,
A7::     VAL         A6+1            < PAS DE PARCOURS DES SPIRALES.
A8::     VAL         A7+1            < TRANSLATION DES NIVEAUX JUSTE AVANT LE
                                     < MARQUAGE DES POINTS.
A9::     VAL         A8+1            < FAUT-IL TRACER LES POINTS DE NIVEAU
                                     < NUL (NOIR) ???
                                     < =0 : OUI,
                                     < #0 : NON.
AA:      VAL         A9+1            < DOIT-ON TRANSLATER LES NIVEAUX NOIRS ???
                                     < =0 : OUI,
                                     < #0 : NON...
AB::     VAL         AA+1            < DECREMENT DU NIVEAU CENTRAL UTILISE
                                     < POUR CALCULER LE NIVEAU MIMIMUM TOLERABLE
                                     < SUR UNE SPIRALE,
AC::     VAL         AB+1            < DE MEME INCREMENT DU NIVEAU CENTRAL
                                     < POUR CALCULER LE NIVEAU MAXIMAL :
                                     < SOIT 'NC' LE NIVEAU DU POINT CENTRAL
                                     < D'UNE SPIRALE, ET 'N' LE NIVEAU DU
                                     < POINT COURANT ; 'N' EST PRIS EN COMPTE
                                     < DANS LA SOMMATION DE LA SPIRALE SI :
                                     < NC-AB <= N <= NC+AC.
AD::     VAL         AC+1            < MASQUE DES NIVEAUX.
<
<
XXXIMA:  VAL         1
         EOT         #SIP IMAGE 512#
YYYIMA:: VAL         YYYIM1          < 'STORP' FONCTIONNERA PAR ENVOI SEQUEN-
                                     < TIEL DU NIVEAU, DE 'X', DE 'Y' ET ENFIN
                                     < DE L'ORDRE DE TRACE RASTER...
<
<
<        L O C A L  :
<
<
         LOCAL
FLOC:    EQU         $
<
< CONSTANTES DIVERSES :
<
IPREM:   WORD        K-I             < INDICATEUR DE PREMIER PASSAGE.
FINFIN:  FLOAT       1000000         < POUR FAIRE UN OVER-SCREEN.
IMODE:   WORD        0               < MODE DE CONVERSION :
                                     < =0 : PAR DUPLICATION,
                                     < #0 : PAR INTERPOLATION.
ADECA2:  WORD        0               < ARGUMENT 'A2' : AMPLITUDE DE DECALAGE
                                     < DES NIVEAUX CALCULES PAR 'PNIVO'.
AXMAX:   WORD        XMAX            < COORDONNEE 'X' MAXIMALE,
AYMAX:   WORD        YMAX            < POUR INVERSER LES AXES 'Y' BASSE
                                     < ET MOYENNE DEFINITION ET COORDONNEE
                                     < 'Y' MAXIMALE.
NIV00:   FLOAT       0               < NIVEAU(XR,YR),
NIV10:   FLOAT       0               < NIVEAU(XR+1,YR),
NIV01:   FLOAT       0               < NIVEAU(XR,YR+1).
XWOR%3:  VAL         NIVMAX+I        < NOMBRE DE NIVEAUX EN 256*256.
XWOR%1:  VAL         NIV256/XWOR%3=K < DECALAGE POUR PASSER D'UN NIVEAU EN
                                     < 256*256 A UN NIVEAU EN 512*512.
XWOR%2:  VAL         XXXMOY+XXXMOY=K < POUR TENIR COMPTE DU FAIT QUE LE NIVEAU
                                     < ARGUMENT 256*256 EST MULTIPLIE PAR 4.
XWOR%4:  VAL         XWOR%1-XWOR%2
FNIVO:   FLOAT       <BIT>XWOR%4<K<K < POUR DECALER UN NOMBRE FLOTTANT A
                                     < GAUCHE DE 'XWOR%4' POSITIONS...
FWORK4:  FLOAT       0               < VARIABLE DE MANOEUVRE...
TRANPX:  WORD        0               < 'A4',
TRANPY:  WORD        0               < 'A5'.
INOIR:   WORD        0               < =0 : TRACER LES POINTS DE NIVEAU NUL,
                                     < #0 : NE PAS LES TRACER.
TRANIV:  WORD        0               < TRANSLATION DES NIVEAUX AVANT LE MAR-
                                     < QUAGE DES POINTS.
NIMASK:  WORD        0               < MASQUE DES NIVEAUX ('AD').
ITRANI:  WORD        0               < DOIT-ON TRANSLATER LES NIVEAUX NOIRS ???
                                     < =0 : OUI,
                                     < #0 : NON...
<
< DEFINITION DE LA SPIRALE :
<
CUMUL:   WORD        0               < SIGMA(NIVEAU(XS,YS)).
PASQ:    WORD        0               < ARGUMENT 'A4'.
DELTAX:  WORD        0
DELTAY:  WORD        0
LB:      WORD        0               < LONGUEUR DES
LB0:     WORD        0               <              BRANCHES DE LA SPIRALE.
NP:      WORD        0               < NOMBRE DE POINT COURANT,
NPM:     WORD        0               < NOMBRE DE POINTS ENTIER DE LA SPIRALE.
NPPC:    WORD        0               < NOMBRE DE POINTS PRIS EN COMPTE SUR LA
                                     < SPIRALE COURANTE,
FNP:     FLOAT       0               < ET SA VALEUR EN FLOTTANT...
DECNIV:  WORD        0               < PARAMETRE 'AB',
INCNIV:  WORD        0               < PARAMETRE 'AC'.
MINNIV:  WORD        0               < NIVEAU MINIMAL TOLERABLE SUR LA SPIRALE
                                     < COURANTE,
MAXNIV:  WORD        0               < NIVEAU MAXIMAL TOLERABLE SUR LA SPIRALE
                                     < COURANTE.
<
< RELAIS DIVERS :
<
APNIVO:  WORD        PNIVO           < CALCUL D'UN NIVEAU 512...
ASTORQ:  WORD        STORQ           < 'STORP' AVEC TEST PREALABLE DES NIVEAUX
                                     < NULS.
ASPIR:   WORD        SPIR            < RECUPERATION DU NIVEAU MOYEN SUR UNE
                                     < SPIRALE CENTREE SUR (XR,YR).
AADRAA:  WORD        ADRAA           < SIMULATION DE 'ADR''A,A' POUR DES
                                     < NOMBRES FLOTTANTS.
APTRXY:  WORD        PTRXY           < SOUS-PROGRAMME DE TRANSLATION DE (X,Y).
XXXIMA:  VAL         2
         EOT         #SIP IMAGE 512#
<
< ADRESSE DES REGISTRES DE CONTROLE :
<
ACTRL1:  WORD        RCTRL1
ACTRL2:  WORD        RCTRL2
XXXIMA:  VAL         4
         EOT         #SIP IMAGE 512#
<
<
<        P R O G R A M M E  :
<
<
         PROG
XXXIMA:  VAL         3
         EOT         #SIP IMAGE 512#
XXXIMA:  VAL         5
         EOT         #SIP IMAGE 512#
         PAGE
<
<
<        C A L C U L   D ' U N   N I V E A U   S U R   ( 0 , 2 5 5 )  :
<
<
<        ARGUMENT :
<                    (A,B)=NIVEAU DE GRIS DE (0,NIVMAX) MULTIPLIE PAR 4,
<
<
<        RESULTAT :
<                    (A)=NIVEAU ENTIER CADRE ET DECALE COMME DESIRE...
<
<
PNIVO:   EQU         $
         PSR         X               < SAUVEGARDES...
         FMP         FNIVO           < CONVERSION (0,7) --> (0,255).
         BSR         AFIX            < ET CONVERSION ENTIER...
         AND         NIMASK          < ET MASQUAGE, AFIN D'ELIMINER, PAR EXEM-
                                     < PLE DES BITS DE QUEUE, FACILITANT
                                     < AINSI LA SUPERPOSITION D'IMAGES, TOUT
                                     < EN UTILISANT L'INTERPOLATION...
         LX          ADECA2          < (X)=DECALAGE DEMANDE PAR 'A2' :
         CPZR        X               < QUEL SENS ???
         JE          PNIVO1          < RIEN A FAIRE...
         JG          PNIVO2          < A GAUCHE...
         NGR         X,X
         SLRS        K,X             < A DROITE SI NEGATIF...
         JMP         PNIVO1
PNIVO2:  EQU         $
         SLLS        K,X             < A GAUCHE SI POSITIF...
PNIVO1:  EQU         $
         JANE        PNIVO3          < OK, NIVEAU NON NUL...
         CPZ         ITRANI          < S'IL EST NOIR, DOIT-ON LE TRANSLATER ???
         JNE         PNIVO4          < NON...
PNIVO3:  EQU         $               < OUI...
         AD          TRANIV          < ET ENFIN, TRANSLATION...
PNIVO4:  EQU         $
         PLR         X               < RESTAURATIONS...
         RSR
         PAGE
<
<
<        S T O R E   P O I N T  :
<
<
<        ARGUMENTS :
<                    (X,Y)=COORDONNEES DE POINT,
<                    (A)=NIVEAU DU POINT.
<
<
STORQ:   EQU         $
         CPZR        X
         JL          STORQ2          < (X)<0...
         XR          A,X
         CP          AXMAX
         XR          A,X
         JG          STORQ2          < (X)>'XMAX'...
         CPZR        Y
         JL          STORQ2          < (Y)<0...
         XR          A,Y
         CP          AYMAX
         XR          A,Y
         JG          STORQ2          < (Y)>'YMAX'...
         CPZ         INOIR           < FAUT-IL TRACER LES POINTS NOIRS ???
         JE          STORQ1          < OUI, ALLONS-Y QUELQUE SOIT LE NIVEAU...
         JAE         STORQ2          < NON, ET LE NIVEAU COURANT EST NUL, ON
                                     < SORT SANS TRACER...
STORQ1:  EQU         $
         BSR         ASTORP          < TRACE DU POINT (X,Y) AVEC LE NIVEAU (A).
STORQ2:  EQU         $
         RSR
         PAGE
<
<
<        S I M U L A T I O N   D E   A D R   A ,A  :
<
<
<        FONCTION :
<                      CE MODULE DOUBLE LE NOMBRE
<                    FLOTTANT ARGUMENT (A,B).
<
<
ADRAA:   EQU         $
         FST         FWORK4
         FAD         FWORK4
         RSR
         PAGE
<
<
<        T R A N S L A T I O N   D E   ( X , Y )  :
<
<
<        ARGUMENTS :
<                    (X,Y)=COORDONNEES.
<
<
<        RESULTATS :
<                    (X,Y)=COORDONNEES TRANSLATEES DE (TRANPX,TRANPY).
<
<
PTRXY:   EQU         $
         XR          A,X
         AD          TRANPX          < TRANSLATION DE 'X',
         XR          A,X
         XR          A,Y
         AD          TRANPY          < TRANSLATION DE 'Y'.
         XR          A,Y
         RSR
         PAGE
<
<
<        S O M M A T I O N   S U R   U N E   S P I R A L E
<        C E N T R E E   S U R   ( X S , Y S )   D E S
<        N I V E A U X   D E   S E S   P O I N T S  :
<
<
SPIR:    EQU         $
<
< INITIALISATION DE LA SPIRALE :
<
         LA          XR
         LB          YR
         PSR         A,B             < SAUVEGARDE DU POINT (XR,YR).
         STZ         CUMUL           < CUMUL <-- 0.
         STZ         NP              < NP=NOMBRE DE POINTS TRAITES.
         STZ         NPPC            < NPPCNOMBRE DE POINTS PRIS EN COMPTE DANS
                                     <     LA SOMMATION, C'EST-A-DIRE QUI NE
                                     <     SONT PAS HORS-ECRAN, ET DONT LE
                                     <     NIVEAU EST DANS (MINNIV,MAXNIV)...
         LA          PASQ
         STA         DELTAX          < DELTAX <-- +1,
         STZ         DELTAY          < DELTAY <-- 0.
         LAI         1
         STA         LB0             < INITIALISATION DE LA LONGUEUR DU
                                     < PREMIER BRAS DE LA SPIRALE.
SPMOY8:  EQU         $
<
< PARCOURS D'UN BRAS :
<
SPMOY1:  EQU         $
         LA          LB0
         STA         LB              < LONGUEUR DU BRAS COURANT.
<
< TRAITEMENT DU POINT COURANT :
<
SPMOY2:  EQU         $
         IC          NP              < COMPTAGE DES POINTS TRAITES :
         LA          NP
         CP          NPM             < FINI ???
         JG          SPMOY3          < OUI...
         LA          XR              < NON :
         JAL         SPMOY4          < LE POINT EST HORS-ECRAN...
         CPI         NPOLM1
         JG          SPMOY4          < HORS-ECRAN...
         LA          YR
         JAL         SPMOY4          < HORS-ECRAN...
         CPI         NLIGM1
         JG          SPMOY4          < HORS-ECRAN...
<
< ACCES AU NIVEAU DU POINT COURANT :
<
         BSR         ASPGPR          < A=NIVEAU(XR,YR),
         LR          A,B             < (B)=SAUVEGARDE DU NIVEAU COURANT,
         LA          NP
         CPI         1               < EST-ON SUR LE PREMIER POINT (OU POINT
                                     < CENTRAL) ???
         LR          B,A             < RESTAURE : (A)=NIVEAU(XR,YR).
         JG          SPMOY7          < NON, IL S'AGIT DES AUTRES POINTS...
<
< CAS DU POINT CENTRAL :
< (NOTA : IL NE PEUT ETRE
< OVER-SCREEN, PUISQU'IL
< S'AGIT DE (XR,YR)
<
         AD          INCNIV
         STA         MAXNIV          < CALCUL DU NIVEAU MAXIMAL TOLERABLE,
         LR          B,A
         SB          DECNIV
         STA         MINNIV          < ET DU NIVEAU MINIMAL TOLERABLE...
         LR          B,A
         JMP         SPMOY9          < VERS LA PRISE EN COMPTE DU POINT CENTRAL.
<
< CAS DES AUTRES POINTS :
<
SPMOY7:  EQU         $
         CP          MAXNIV
         JG          SPMOY4          < IGNORE, CAR N > MAXNIV...
         CP          MINNIV
         JL          SPMOY4          < IGNORE, CAR N < MINNIV...
<
< CUMUL DES POINTS :
<
SPMOY9:  EQU         $
         IC          NPPC            < CUMUL DES POINTS PRIS EN COMPTE...
         AD          CUMUL           < ET
         STA         CUMUL           < CUMULE...
<
< PASSAGE AU POINT SUIVANT :
<
SPMOY4:  EQU         $
         LA          XR
         AD          DELTAX          < CHANGEMENT DE
         STA         XR
         LA          YR
         AD          DELTAY          < POINT COURANT (XR,YR).
         STA         YR
         DC          LB              < DECOMPTAGE DES POINTS SUR LA BRANCHE :
         JG          SPMOY2          < OK, IL EN RESTE...
         CPZ         DELTAX          < NON, ON EST AU BOUT, FAUT-IL AUGMENTER
                                     < LA LONGUEUR COURANTE DES BRANCHES ???
         JNE         SPMOY5          < NON (DX#0) ...
         IC          LB0             < OUI (DX=0) ...
SPMOY5:  EQU         $
         LA          DELTAY          < ON FAIT SUBIR AU NOMBRE COMPLEXE
         NGR         A,A             < (DX,DY) UNE ROTATION DE PI/2, SOIT
         LB          DELTAX          < UNE MULTIPLICATION PAR LA MATRICE
                                     < (0,-1,1,0)...
         STA         DELTAX          < DELTAX=-DELTAY,
         STB         DELTAY          < DELTAY=DELTAX.
         JMP         SPMOY1          < VERS LA BRANCHE SUIVANTE
<
< GENERATION DU POINT (XR,YR) :
<
SPMOY3:  EQU         $
         PLR         A,B
         STA         XR              < RESTAURATION
         STB         YR              < DE (XR,YR),
<
< NORMALISATION DU CUMUL :
<
         LA          NPPC
         FLT
         FST         FNP             < FNP=NOMBRE FLOTTANT DE POINTS PRIS EN
                                     <     COMPTE...
         LA          CUMUL
         FLT
         FDV         FNP
         RSR
         PAGE
<
<
<        C O M P O S A N T E   E N   ' U '  :
<
<
SPU:     EQU         $
         CPZ         IPREM           < EST-CE LE PREMIER PASSAGE ???
         JGE         SPU1            < NON...
<
< PREMIER PASSAGE : ENTREE DES ARGUMENTS :
<
         IC          IPREM           < MEMORISATION DE CETTE ENTREE...
         LXI         A0
         BSR         ASPCT
         BSR         AROND
         STA         IMODE
         LXI         A4
         BSR         ASPCT
         BSR         AROND
         STA         TRANPX          < A PRIORI, QUELQUE SOIT (A0)...
         LXI         A5
         BSR         ASPCT
         BSR         AROND
         STA         TRANPY          < A PRIORI, QUELQUE SOIT (A0)...
         LAI         PAGER
         BSR         AGPCDA          < POSITIONNEMENT SUR LA PAGE DES REGISTRES
                                     < DE LA 'CDAJ'...
<
< DEFINITION DE LA SPIRALE :
<
         LXI         A6
         BSR         ASPCT
         BSR         AROND
         STA         NPM             < NOMBRE DE POINTS MAX...
         LXI         A7
         BSR         ASPCT
         BSR         AROND
         STA         PASQ            < PAS DE PARCOURS...
         LXI         AB
         BSR         ASPCT
         BSR         AROND
         STA         DECNIV          < POUR CALCULER LE MINIMUM TOLERABLE,
         LXI         AC
         BSR         ASPCT
         BSR         AROND
         STA         INCNIV          < ET LE MAXIMUM...
<
< DEFINITION DU TRACE :
<
         LXI         A8
         BSR         ASPCT
         BSR         AROND
         STA         TRANIV          < ENTREE DE LA TRANSLATION DES NIVEAUX.
         LXI         AD
         BSR         ASPCT
         BSR         AROND
         STA         NIMASK          < ENTREE DU MASQUE DES NIVEAUX.
         LXI         AA
         BSR         ASPCT
         BSR         AROND
         STA         ITRANI          < DOIT-ON TRANSLATER LES NIVEAUX NOIRS ???
         LXI         A9
         BSR         ASPCT
         BSR         AROND
         STA         INOIR           < FAUT-IL MARQUER LES NOIRS (AU FER ROUGE)?
         LXI         A3
         BSR         ASPCT
         BSR         AROND
         JANE        SPU4            < (A3)#0 : ON N'EFFACE PAS...
<
< (A3)=0 : EFFACEMENT ET REINITIALISATION :
<
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...
         LAI         XCTRL1
         STA         MCDAJ
         LA          ACTRL1
         BSR         APWCDA          < INITIALISATION DE 'CTRL1'.
         LAI         XCTRL2
         STA         MCDAJ
         LA          ACTRL2
         BSR         APWCDA          < INITIALISATION DE 'CTRL2'.
SPU4:    EQU         $
<
< SELECTION DES PLANS ET DECALAGE :
<
         LXI         A1
         BSR         ASPCT
         BSR         AROND
         EORI        MOCD            < ON INVERSE LES CONVENTIONS DU SOFT
                                     < POUR ETRE COMPATIBLE HARD...
         STA         MCDAJ           < PREPARATION DE LA LISTE DE SELECTION
                                     < DES PLANS MEMOIRE,
         LA          ARPLAN          < (A)=ADRESSE DU REGSITRE 'RPLAN',
         BSR         APWCDA          < SELECTION DES PLANS DEMANDES...
         LXI         A2
         BSR         ASPCT
         BSR         AROND
         STA         ADECA2          < DECALAGE SUR CHAQUE NIVEAU...
<
< POSITIONNEMENT SUR LE POINT PRINCIPAL :
<
SPU1:    EQU         $
         LX          XR
         LY          YR
         ADR         X,X             < ON SE PLACE EN (XR,YR)
         ADR         Y,Y             < EN DOUBLANT LA DEFINITION...
         LA          AYMAX
         SBR         A,Y
         NGR         Y,Y             < LES AXES 'Y' BASSE ET MOYENNE DEFINITION
                                     < ETANT INVERSES...
         CPZ         IMODE           < QUEL EST LE MODE DE CONVERSION ???
         JG          SPU2            < PAR INTERPOLATION...
         JL          SPU5            < UN POINT POUR UN POINT...
<
< CONVERSION PAR DUPLICATION :
<
         BSR         APTRXY          < TRANSLATION DE (X,Y)...
         BSR         ASPIR           < (A)=NIVEAU(XR,YR),
         BSR         AADRAA          < ET ON LE MULTIPLIE PAR 4
         BSR         AADRAA          < PAR COMPATIBILITE AVEC L'INTERPOLATION...
         BSR         APNIVO          < CALIBRAGE.
         BSR         ASTORQ          < MARQUAGE DE (X,Y),
         ADRI        I,X
         BSR         ASTORQ          < MARQUAGE DE (X+1,Y),
         ADRI        -I,Y
         BSR         ASTORQ          < MARQUAGE DE (X+1,Y-1),
         ADRI        -I,X
         BSR         ASTORQ          < MARQUAGE DE (X,Y-1).
         ADRI        I,Y
         JMP         SPU3            < VERS LA SORTIE...
<
< UN POINT POUR UN POINT :
<
SPU5:    EQU         $
         LR          X,A
XWOR%1:  VAL         XMAX+I/NMOTL/NBITMO
         SLRS        XWOR%1=K        < REDUCTION DE 'X',
         LR          A,X
         LR          Y,A
XWOR%1:  VAL         YMAX+I/NLIG
         SLRS        XWOR%1=K        < REDUCTION DE 'Y',
         LR          A,Y
         BSR         APTRXY          < TRANSLATION DE (X,Y)...
         BSR         ASPIR           < (A)=NIVEAU(XR,YR),
         BSR         AADRAA          < ON LE
         BSR         AADRAA          <       MULTIPLIE PAR 4...
         BSR         APNIVO          < ON LE CALIBRE,
         BSR         ASTORQ          < ET ON MARQUE (X,Y)...
         JMP         SPU3            < VERS LA SORTIE...
<
< CONVERSION PAR INTERPOLATION :
<
SPU2:    EQU         $
         BSR         APTRXY          < TRANSLATION DE (X,Y)...
         BSR         ASPIR           < (A)=NIVEAU(XR,YR),
         FST         NIV00           < ET SAVE...
         BSR         AADRAA          < ON LE MULTIPLIE PAR 4
         BSR         AADRAA          < PAR COMPATIBILITE AVEC L'INTERPOLATION
                                     < ENTRE 4 POINTS POUR LE POINT "CENTRAL"...
         BSR         APNIVO          < CALIBRAGE,
         BSR         ASTORQ          < (2*XR,2*YR) <-- 4*NIVEAU(XR,YR).
         IC          XR
         ADRI        I,X
         BSR         ASPIR           < (A)=NIVEAU(XR+1,YR),
         FST         NIV10           < ET SAVE...
         FAD         NIV00           < (A)=NIVEAU(XR,YR)+NIVEAU(XR+1,YR),
         BSR         AADRAA          < ON LE MULTIPLIE PAR 2 PAR COMPATIBILITE
                                     < AVEC L'INTERPOLATION ENTRE 4 POINTS...
         BSR         APNIVO          < CALIBRAGE,
         BSR         ASTORQ          < (2*XR+1,2*YR) <-- 2*(NIVEAU(XR,YR)+
                                     <                      NIVEAU(XR+1,YR)).
         DC          XR
         ADRI        -I,X
         IC          YR
         ADRI        -I,Y
         BSR         ASPIR           < (A)=NIVEAU(XR,YR+1),
         FST         NIV01           < ET SAVE...
         FAD         NIV00           < (A)=NIVEAU(XR,YR)+NIVEAU(XR,YR+1),
         BSR         AADRAA          < ON LE MULTIPIE PAR 2 PAR COMPATIBILITE
                                     < AVEC L'INTERPOLATION ENTRE 4 POINTS.
         BSR         APNIVO          < CALIBRAGE,
         BSR         ASTORQ          < (2*XR,2*YR-1) <-- 2*(NIVEAU(XR,YR)+
                                     <                      NIVEAU(XR,YR+1)).
         IC          XR
         ADRI        I,X
         BSR         ASPIR           < (A)=NIVEAU(XR+1,YR+1),
         FAD         NIV00           < ET SOMMATION
         FAD         NIV10           <              SUR LES
         FAD         NIV01           <                      4 SOMMETS,
         BSR         APNIVO          < CALIBRAGE,
         BSR         ASTORQ          < (2*XR+1,2*YR-1) <-- NIVEAU(XR,YR)+
                                     <                     NIVEAU(XR+1,YR)+
                                     <                     NIVEAU(XR,YR+1)+
                                     <                     NIVEAU(XR+1,YR+1).
         DC          XR
         ADRI        -I,X
         DC          YR
         ADRI        I,Y
<
< ET SORTIE :
<
SPU3:    EQU         $
         FLD         FINFIN          < POUR FAIRE UN OVERSCREEN...
         RSR
<
<
<        C O M P O S A N T E   E N   ' V '  :
<
<
SPV:     EQU         $
         FLD         FINFIN          < POUR FAIRE UN OVERSCREEN...
         RSR
<
<
<        C O M P O S A N T E   E N   ' W '  :
<
<
SPW:     EQU         $
         FLD         F0
         RSR
:F
:F
< <<'SIO5 256-->512'
DF'SIO5 512 1'
ED'SIO5 512 1'
IN0
         PAGE
         IDP         "SIO5 512 1"
<
<
<        E N V O I   A U   S Y S T E M E   5 1 2 * 5 1 2   1  :
<
<
<        FONCTION :
<                      CE MODULE SQUELETTIQUE ENVOIE
<                    L'IMAGE COURANTE SEUILLEE SUR LE
<                    SYSTEME 512*512 VIA LA LIGNE
<                    ASSIGNEE A L'UNITE '0B.
<
<
<        ARGUMENT :
A0::     VAL         0               < SEUIL AU DELA DUQUEL ON EST BLANC,
                                     < ET EN DECA NOIR...
<
<
         LOCAL
FLOC:    EQU         $
S0::     VAL         "S0"
S2::     VAL         "S2"
S9::     VAL         "S9"
CHECK::  VAL         "00"            < CHECK-SUM BIDON...
MEM0::   VAL         "03"            < ADRESSE DE LA MEMOIRE ASSIGNEE
MEM1::   VAL         "F8"            < AU CONTROLEUR '365'.
CMD::    VAL         "01"            < NUMERO DU REGISTRE DE COMMANDE...
LONG3::  VAL         "03"
LONG5::  VAL         "05"
CR::     VAL         '0D
LF::     VAL         '0A
HEAD:    EQU         $               < EN-TETE DE L'ENVOI :
         WORD        S0;LONG3
         ASCI        "0000"
         WORD        CHECK
         BYTE        CR;LF
LHEAD::  VAL         $-HEAD*NOCMO
ERASE:   EQU         $               < EFFACEMENT DE L'IMAGEUR :
         WORD        S2;LONG5
         WORD        MEM0;MEM1;CMD
         ASCI        "F9"
         WORD        CHECK
         BYTE        CR;LF
LERASE:: VAL         $-ERASE*NOCMO
DELTX:   EQU         $               < ENVOI DE DELTAX=0 :
         WORD        S2;LONG5
         WORD        MEM0;MEM1;"0B"
         ASCI        "FF"
         WORD        CHECK
         BYTE        CR;LF
LDELTX:: VAL         $-DELTX*NOCMO
DELTY:   EQU         $               < ENVOI DE DELTAY=0 :
         WORD        S2;LONG5
         WORD        MEM0;MEM1;"0F"
         ASCI        "FF"
         WORD        CHECK
         BYTE        CR;LF
LDELTY:: VAL         $-DELTY*NOCMO
FORTX:   EQU         $               < ENVOI DE POIDS FORT DES X=0 :
         WORD        S2;LONG5
         WORD        MEM0;MEM1;"11"
         ASCI        "FF"
         WORD        CHECK
         BYTE        CR;LF
LFORTX:: VAL         $-FORTX*NOCMO
FORTY:   EQU         $               < ENVOI DE POIDS FORT DES Y=0 :
         WORD        S2
         WORD        LONG5
         WORD        MEM0;MEM1;"15"
         ASCI        "FF"
         WORD        CHECK
         BYTE        CR;LF
LFORTY:: VAL         $-FORTY*NOCMO
SENDX:   EQU         $               < ENVOI DE LA COORDONNEE X :
         WORD        S2;LONG5
         WORD        MEM0;MEM1;"13"
XSENDX:  WORD        0               < COORDONNEE X.
         WORD        CHECK
         BYTE        CR;LF
LSENDX:: VAL         $-SENDX*NOCMO
SENDY:   EQU         $               < ENVOI DE LA COORDONNEE Y :
         WORD        S2;LONG5
         WORD        MEM0;MEM1;"17"
YSENDY:  WORD        0               < COORDONNEE Y.
         WORD        CHECK
         BYTE        CR;LF
LSENDY:: VAL         $-SENDY*NOCMO
DRAW:    EQU         $               < TRACE DU POINT :
         WORD        S2;LONG5
         WORD        MEM0;MEM1;CMD
         ASCI        "EE"
         WORD        CHECK
         BYTE        CR;LF
LDRAW::  VAL         $-DRAW*NOCMO
TAIL:    EQU         $               < FIN DU TRACE :
         WORD        S9;LONG3
         ASCI        "0000"
         WORD        CHECK
         BYTE        CR;LF
LTAIL::  VAL         $-TAIL*NOCMO
<
< DEMANDES AU SYSTEME :
<
DEMSEN:  BYTE        '0B;'02         < ENVOI DES ORDRES AU 68000 :
         WORD        0               < ADRESSE DU BUFFER,
         WORD        0               < ET LONGUEUR DE L'ECHANGE.
<
< RELAI DE SOUS-PROGRAMMES :
<
ASEND:   WORD        SEND            < ENVOI D'UN MESSAGE.
AHEXA:   WORD        HEXA            < CONVERSIO HEXA --> BINAIRE.
<
< DIVERS :
<
ABUFVX:  WORD        0               < RELAI INDEXE VARIABLE.
PREM:    WORD        0               < POUR DETECTER LE PREMIER APPEL.
SEUIL:   WORD        0               < 'A0' : SEUIL BLANC/NOIR.
         PROG
<
<
<        C O M P O S A N T E   E N   ' U '  :
<
<
SPU:     EQU         $
         CPZ         PREM            < EST-CE LE PREMIER TOUR ???
         JNE         SPU1            < NON...
<
< INITIALISATIONS DU PREMIER TOUR :
<
         IC          PREM            < MEMORISATION...
         LAD         HEAD
         LXI         LHEAD
         BSR         ASEND           < ENVOI DE L'EN-TETE,
         LAD         ERASE
         LXI         LERASE
         BSR         ASEND           < EFFACEMENT DE L'ECRAN,
         LAD         DELTX
         LXI         LDELTX
         BSR         ASEND           < ENVOI DE DELTAX=0,
         LAD         DELTY
         LXI         LDELTY
         BSR         ASEND           < ENVOI DE DELTAY=0,
         LAD         FORTX
         LXI         LFORTX
         BSR         ASEND           < ENVOI DE POIDS FORT DES X=0,
         LAD         FORTY
         LXI         LFORTY
         BSR         ASEND           < ENVOI DE POIDS FORT DES Y=0.
         LXI         A0
         BSR         ASPCT
         BSR         AROND
         STA         SEUIL           < RECUPERATION DU SEUIL NOIR/BLANC.
<
< FOIS SUIVANTES :
<
SPU1:    EQU         $
         BSR         ASPGPR          < (A)=NIVEAU (XR,YR) :
         CP          SEUIL           < SEUILLAGE...
         JL          SPU2            < POINT "NOIR"...
         LAD         XSENDX
         LB          XR
         BSR         AHEXA           < ENVOI DES COORDONNEES DES POINTS
                                     < "BLANCS"...
         LAD         YSENDY
         LB          YR
         NGR         B,B
         ADRI        NLIGM1,B        < LES AXES DES 'Y' SONT INVERSES...
         BSR         AHEXA
         LAD         SENDX
         LXI         LSENDX
         BSR         ASEND           < ENVOI DE XR,
         LAD         SENDY
         LXI         LSENDY
         BSR         ASEND           < ENVOI DE YR,
         LAD         DRAW
         LXI         LDRAW
         BSR         ASEND           < ET MARQUAGE DU POINT (XR,YR).
SPU2:    EQU         $
<
< CAS DE LA DERNIERE FOIS :
<
         LA          XR
         AND         YR
         CPI         NLIGM1(NPOLM1   < EST-CE LE DERNIER POINT ???
         JNE         SPU3            < NON...
         LAD         TAIL
         LXI         LTAIL
         BSR         ASEND           < OUI, ON ENVOIE LA QUEUE...
SPU3:    EQU         $
         LA          XR
         FLT
         RSR
<
<
<        C O M P O S A N T E   E N   ' V '  :
<
<
SPV:     EQU         $
         LA          YR
         FLT
         RSR
<
<
<        C O M P O S A N T E   E N   ' W '  :
<
<
SPW:     EQU         $
         FLD         F0
         RSR
<
<
<        E N V O I   D ' U N   M E S S A G E  :
<
<
<        ARGUMENTS :
<                    A=ADDRESSE DU MESSAGE,
<                    X=LONGUEUR.
<
<
SEND:    EQU         $
         PSR         A,X
         SLLS        NOCMO=0
         STA         DEMSEN+1        < ADRESSE OCTET DU MESAGE,
         STX         DEMSEN+2        < ET SA LONGUEUR.
         LAD         DEMSEN
         SVC         0               < ON L'ENVOIE AU 68000...
         PLR         A,X
         RSR
<
<
<        C O N V E R S I O N   H E X A  -->  A S C I  :
<
<
<        ARGUMENTS :
<                    A=ADRESSE OU RANGER LE CODE ASCI,
<                    B=VALEUR A CONVERTIR.
<
<
HEXA:    EQU         $
         PSR         A,B,X
         SBT         0
         STA         ABUFVX          < GENERATION D'UN RELAI INDEXE VERS LA
                                     < ZONE DE RANGEMENT DE L'ASCI.
         LXI         0               < (X)=INDEX DE RANGEMENT,
         LAI         '00FF
         EORR        A,B             < EN EFFET, LE BUS 68000 EST INVERSE...
         SWBR        B,B             < CADRAGE DE L'OCTET A CODER.
HEXA1:   EQU         $
         LAI         0
         SLLD        4               < DECONCATENATION,
         CPI         9               < CHIFFRE OU LETTRE ???
         JLE         HEXA2           < CHIFFRE...
         ADRI        "A"-"9"-1,A     < LETTRE...
HEXA2:   EQU         $
         ADRI        "0",A           < CONVERSION ASCI,
         STBY        &ABUFVX         < ET RANGEMENT DANS LE BUFFER...
         ADRI        1,X             < AU SUIVANT,
         LR          X,A
         CPI         NOCMO           < S'IL EXISTE...
         JL          HEXA1           < OUI...
         PLR         A,B,X
         RSR
:F
:F
< <<'SIO5 512 1'
DF'SIO5 512-->256'
ED'SIO5 512-->256'
IN0
         PAGE
         IDP         "SIO5 512-->256"
<
<
<        C O N V E R S I O N   I M A G E   5 1 2
<                    -->   I M A G E   2 5 6  :
<
<
<        FONCTION :
<                      CE MODULE ASSURE LA CONVERSION
<                    D'UNE IMAGE 256 EN UNE IMAGE 512
<                    SUIVANT 2 MODES :
<
<                    1 - LE PREMIER PAR MOYENNAGE : ON PREND
<                    UN PAVE 2*2 DE L'IMAGE 512*512, ET ON
<                    Y FAIT LA MOYENNE DES NIVEAUX ; CETTE
<                    MOYENNE RAMENEE ENSUITE DANS (0,7) EST
<                    LE NIVEAU DE GRIS DU POINT RESIDENT
<                    COURANT (XR,YR).
<
<                    2 - LE SECOND : ON PREND DANS L'IMAGE
<                    512*512 UNE FENETRE 256*256, ET LES POINTS
<                    SONT ASSOCIES 1 A 1 ; LE NIVEAU (0,255)
<                    EST D'ABORD MASQUE PAR 'A3', PUIS DECALE
<                    A DROITE PAR 'A4'...
<
<
<        ARGUMENT :
A0::     VAL         0               < MODE DE CONVERSION :
                                     < =0 : PAR MOYENNAGE SUR UN PAVE 2*2,
                                     < #0 : UN POINT POUR UN POINT.
A1::     VAL         A0+1            < TRANSLATION SUR OX,
A2::     VAL         A1+1            < TRANSLATION SUR OY.
A3::     VAL         A2+1            < MASQUE DES NIVEAUX DANS (0,255) LORSQUE
                                     < (A0)#0,
A4::     VAL         A3+1            < DECALAGE A DROITE DES NIVEAUX APRES LE
                                     < MASQUAGE LORSQUE (A0)#0.
<
<
XXXIMA:  VAL         1
         EOT         #SIP IMAGE 512#
YYYIMA:: VAL         YYYIM1          < 'STORP' FONCTIONNERA PAR ENVOI SEQUEN-
                                     < TIEL DU NIVEAU, DE 'X', DE 'Y' ET ENFIN
                                     < DE L'ORDRE DE TRACE RASTER...
<
<
<        L O C A L  :
<
<
         LOCAL
FLOC:    EQU         $
<
< CONSTANTES DIVERSES :
<
IPREM:   WORD        K-I             < INDICATEUR DE PREMIER PASSAGE.
FINFIN:  FLOAT       1000000         < POUR FAIRE UN OVER-SCREEN.
IMODE:   WORD        0               < MODE DE CONVERSION :
                                     < =0 : PAR MOYENNAGE SUR UN PAVE 2*2,
                                     < #0 : UN POINT POUR UN POINT.
AMASKN:  WORD        0               < MASQUE 'A3',
ADECA:   WORD        0               < DECALAGE 'A4'.
AXMAX:   WORD        XMAX            < COORDONNEE 'X' MAXIMALE,
AYMAX:   WORD        YMAX            < POUR INVERSER LES AXES 'Y' BASSE
                                     < ET MOYENNE DEFINITION ET COORDONNEES
                                     < 'Y' MAXIMALE.
NIV00:   FLOAT       0               < NIVEAU(X,Y),
NIV10:   FLOAT       0               < NIVEAU(X+1,Y),
NIV01:   FLOAT       0               < NIVEAU(X,Y+1),
NIV11:   FLOAT       0               < NIVEAU(X+1,Y+1).
XWOR%3:  VAL         NIVMAX+I        < NOMBRE DE NIVEAUX EN 256*256.
XWOR%1:  VAL         NIV256/XWOR%3=K < DECALAGE POUR PASSER D'UN NIVEAU EN
                                     < 256*256 A UN NIVEAU EN 512*512.
XWOR%2:  VAL         XXXMOY+XXXMOY=K < POUR TENIR COMPTE DU FAIT QUE LE NIVEAU
                                     < ARGUMENT 256*256 EST MULTIPLIE PAR 4.
XWOR%4:  VAL         XWOR%1+XWOR%2
FNIVO:   FLOAT       <BIT>XWOR%4<K<K < POUR DECALER UN NOMBRE FLOTTANT A
                                     < DROITE DE 'XWOR%4' POSITIONS...
TRANPX:  WORD        0               < 'A1',
TRANPY:  WORD        0               < 'A2'.
<
< RELAIS DIVERS :
<
ALOADQ:  WORD        LOADQ           < 'LOADP' AVEC VALIDATION DE (X,Y).
APTRXY:  WORD        PTRXY           < SOUS-PROGRAMME DE TRANSLATION DE (X,Y).
XXXIMA:  VAL         2
         EOT         #SIP IMAGE 512#
XXXIMA:  VAL         4
         EOT         #SIP IMAGE 512#
<
<
<        P R O G R A M M E  :
<
<
         PROG
XXXIMA:  VAL         3
         EOT         #SIP IMAGE 512#
XXXIMA:  VAL         5
         EOT         #SIP IMAGE 512#
         PAGE
<
<
<        L O A D   P O I N T  :
<
<
<        ARGUMENTS :
<                    (X,Y)=COORDONNEES DU POINT.
<
<
<        RESULTATS :
<                    (A,B)=NIVEAU FLOTTANT DE CE POINT.
<
<
LOADQ:   EQU         $
         LR          X,A
         JAL         LOADQ1          < (X)<0...
         CP          AXMAX
         JG          LOADQ1          < (X)>'XMAX'...
         LR          Y,A
         JAL         LOADQ1          < (Y)<0...
         CP          AYMAX
         JG          LOADQ1          < (Y)>'YMAX'...
         BSR         ALOADP          < (A)=NIVEAU D'UN POINT DANS L'ECRAN,
LOADQ2:  EQU         $
         BSR         AFLT            < ET ON LE FLOTTE...
         RSR
LOADQ1:  EQU         $
         LAI         XXNOIR          < CAS DES POINTS HORS-ECRAN, ON LES REND
                                     < NOIR...
         JMP         LOADQ2
         PAGE
<
<
<        T R A N S L A T I O N   D E   ( X , Y )  :
<
<
<        ARGUMENTS :
<                    (X,Y)=COORDONNEES.
<
<
<        RESULTATS :
<                    (X,Y)=COORDONNEES TRANSLATEES DE (TRANPX,TRANPY).
<
<
PTRXY:   EQU         $
         XR          A,X
         AD          TRANPX          < TRANSLATION DE 'X',
         XR          A,X
         XR          A,Y
         AD          TRANPY          < TRANSLATION DE 'Y'.
         XR          A,Y
         RSR
         PAGE
<
<
<        C O M P O S A N T E   E N   ' U '  :
<
<
SPU:     EQU         $
         CPZ         IPREM           < EST-CE LE PREMIER PASSAGE ???
         JGE         SPU1            < NON...
<
< PREMIER PASSAGE : ENTREE DES ARGUMENTS :
<
         IC          IPREM           < MEMORISATION DE CETTE ENTREE...
         LXI         A0
         BSR         ASPCT
         BSR         AROND
         STA         IMODE
         LXI         A1
         BSR         ASPCT
         BSR         AROND
         STA         TRANPX          < TRANSLATION SUR OX,
         LXI         A2
         BSR         ASPCT
         BSR         AROND
         STA         TRANPY          < TRANSLATION SUR OY.
         LXI         A3
         BSR         ASPCT
         BSR         AROND
         STA         AMASKN          < MASQUE DES NIVEAUX (0,255),
         LXI         A4
         BSR         ASPCT
         BSR         AROND
         STA         ADECA           < DECALAGE A DROITE DES NIVEAUX (0,255).
<
< POSITIONNEMENT SUR LE POINT PRINCIPAL :
<
SPU1:    EQU         $
         LX          XR
         LY          YR
         ADR         X,X
         ADR         Y,Y
         LA          AYMAX
         SBR         A,Y             < INVERSION DES AXES OY...
         NGR         Y,Y             < ON SE PLACE AU POINT :
                                     < (X,Y)=(2*XR,2*YR)...
         CPZ         IMODE           < QUEL EST LE MODE DE CONVERSION ???
         JE          SPU2            < PAR MOYENNAGE...
<
< CONVERSION 1 POUR 1 :
<
         LR          X,A
XWOR%1:  VAL         XMAX+I/NMOTL/NBITMO
         SLRS        XWOR%1=K        < REDUCTION DE 'X',
         LR          A,X
         LR          Y,A
XWOR%1:  VAL         YMAX+I/NLIG
         SLRS        XWOR%1=K        < REDUCTION DE 'Y',
         LR          A,Y
         BSR         APTRXY          < TRANSLATION DE (X,Y),
         BSR         ALOADQ          < (A,B)=NIVEAU(X,Y) FLOTTANT,
         BSR         AFIX            < (A)=NIVEAU(X,Y),
         AND         AMASKN          < QUE L'ON MASQUE,
         PSR         X
         LX          ADECA
         SLRS        K,X             < QUE L'ON DECALE A GAUCHE,
         PLR         X
         ANDI        NIVMAX          < ET ENFIN QUE L'ON CALCULE MODULO...
         JMP         SPU5            < VERS LE MARQUAGE RESIDENT...
<
< MOYENNAGE :
<
SPU2:    EQU         $
         BSR         APTRXY          < ET TRANSLATION DE (X,Y).
         BSR         ALOADQ
         FST         NIV00           < NIVEAU(X,Y),
         ADRI        I,X
         BSR         ALOADQ
         FST         NIV01           < NIVEAU(X+1,Y),
         ADRI        -I,Y
         BSR         ALOADQ
         FST         NIV11           < NIVEAU(X+1,Y-1),
         ADRI        -I,X
         BSR         ALOADQ
         FST         NIV10           < NIVEAU(X,Y-1).
         ADRI        I,Y
         FAD         NIV11
         FAD         NIV01
         FAD         NIV00
         FDV         FNIVO           < ET MOYENNAGE...
         BSR         AROND           < ET ENFIN, CONVERSION ENTIERE...
<
< TRACE DU RESIDENT :
<
SPU5:    EQU         $
         BSR         ASPRPR          < (XR,YR) <-- (A)...
<
< ET SORTIE :
<
SPU3:    EQU         $
         FLD         FINFIN          < POUR FAIRE UN OVERSCREEN...
         RSR
<
<
<        C O M P O S A N T E   E N   ' V '  :
<
<
SPV:     EQU         $
         FLD         FINFIN          < POUR FAIRE UN OVERSCREEN...
         RSR
<
<
<        C O M P O S A N T E   E N   ' W '  :
<
<
SPW:     EQU         $
         FLD         F0
         RSR
:F
:F
< <<'SIO5 512-->256'
DF'SIO5 256<-->512'
ED'SIO5 256<-->512'
IN0
         PAGE
         IDP         "SIO5 256<-->512"
<
<
<        C O N V E R S I O N S   2 5 6   <-->   5 1 2  :
<
<
<        FONCTION :
<                      CE MODULE ASSURE DES
<                    CONVERSIONS SIMPLES DANS
<                    LES 2 SENS.
<
<
<        ARGUMENT :
A20::    VAL         '20             < CHOIX DU SENS DE LA CONVERSION :
                                     < =0 : 256 --> 512,
                                     < #0 : 512 --> 256.
<
<
<        C O N V E R S I O N   I M A G E   2 5 6
<                    -->   I M A G E   5 1 2  :
<
<
<        FONCTION :
<                      CE MODULE ASSURE LA CONVERSION
<                    D'UNE IMAGE 256 EN UNE IMAGE 512
<                    PAR DUPLICATION 1 POINT --> 4 POINTS.
<
<
<        DANS L'ORDRE, ON EFFECTUE :
<                    1 - UN DECALAGE DE 5 POSITIONS A DROITE DU NIVEAU,
<                    2 - UN MASQUAGE PAR 'AD',
<                    3 - UN DECALAGE DE 'A2' POSITIONS (DROITE OU GAUCHE).
<
<
<        ARGUMENT :
A1::     VAL         '01             < SELECTION DES PLANS DE MEMOIRE ACTIFS,
                                     < AVEC UNE CONVENTION SOFT INVERSE DE LA
                                     < CONVENTION HARD :
                                     < 0 : PLAN DE MEME RANG INHIBE,
                                     < 1 : PLAN DE MEME RANG ACTIF.
A2::     VAL         A1+1            < APRES CALCUL DU NIVEAU 512*512 EQUIVA-
                                     < LENT AU NIVEAU 256*256 ARGUMENT DANS
                                     < 'PNIVO', IL DECALE DE 'A2', ET
                                     < A DROITE SI (A2)<0,
                                     < A GAUCHE SI (A2)>0.
                                     < N O T A  :  LA COMBINAISON DE 'A1' ET
                                     < 'A2' PERMET DE FAIRE DES SUPERPOSITIONS
                                     < DE 2 IMAGES 256*256 SUR UNE MEME 512*512
                                     < EN PRENANT POUR CHACUNE D'ELLE DES
                                     < MASQUES 'A1' COMPLEMENTAIRES, ET POUR
                                     < 'A2' LES VALEURS RESPECTIVES DE 0 ET -3.
A3::     VAL         A2+1            < ACTION INITIALE :
                                     < =0 : EFFACER L'ECRAN 512*512, ET REINI-
                                     <      TIALISER LES REGISTRES,
                                     < #0 : NE RIEN FAIRE...
A4::     VAL         A3+1            < TRANSLATION SUR X, SI (A0)<0,
A5::     VAL         A4+1            < TRANSLATION SUR Y, SI (A0)<0.
AD::     VAL         '0D             < MASQUE DES NIVEAUX.
<
<
<        C O N V E R S I O N   I M A G E   5 1 2
<                    -->   I M A G E   2 5 6  :
<
<
<        FONCTION :
<                      CE MODULE ASSURE LA CONVERSION
<                    D'UNE IMAGE 256 EN UNE IMAGE 512
<                    SUIVANT LE MODE : ON PREND DANS L'IMAGE
<                    512*512 UNE FENETRE 256*256, ET LES POINTS
<                    SONT ASSOCIES 1 A 1 ; LE NIVEAU (0,255)
<                    EST D'ABORD MASQUE PAR 'A3', PUIS DECALE
<                    A DROITE PAR 'A4'...
<
<
<        ARGUMENT :
A11::    VAL         '11             < TRANSLATION SUR OX,
A12::    VAL         A11+1           < TRANSLATION SUR OY.
A13::    VAL         A12+1           < MASQUE DES NIVEAUX DANS (0,255) LORSQUE
                                     < (A0)#0,
A14::    VAL         A13+1           < DECALAGE A DROITE DES NIVEAUX APRES LE
                                     < MASQUAGE LORSQUE (A0)#0.
<
<
XXXIMA:  VAL         1
         EOT         #SIP IMAGE 512#
YYYIMA:: VAL         YYYIM1          < 'STORP' FONCTIONNERA PAR ENVOI SEQUEN-
                                     < TIEL DU NIVEAU, DE 'X', DE 'Y' ET ENFIN
                                     < DE L'ORDRE DE TRACE RASTER...
<
<
<        L O C A L  :
<
<
         LOCAL
FLOC:    EQU         $
<
< CONSTANTES DIVERSES :
<
IPREM:   WORD        K-I             < INDICATEUR DE PREMIER PASSAGE.
IMODE:   WORD        0               < SENS DE LA CONVERSION :
                                     < =0 : 256 --> 512,
                                     < #0 : 512 --> 256.
FINFIN:  FLOAT       1000000         < POUR FAIRE UN OVER-SCREEN.
ADECA2:  WORD        0               < ARGUMENT 'A2' : AMPLITUDE DE DECALAGE
                                     < DES NIVEAUX CALCULES PAR 'PNIVO'.
XWOR%3:  VAL         NIVMAX+I        < NOMBRE DE NIVEAUX EN 256*256.
XWOR%1:  VAL         NIV256/XWOR%3=K < DECALAGE POUR PASSER D'UN NIVEAU EN
                                     < 256*256 A UN NIVEAU EN 512*512.
XWOR%2:  VAL         XXXMOY+XXXMOY=K < POUR TENIR COMPTE DU FAIT QUE LE NIVEAU
                                     < ARGUMENT 256*256 EST MULTIPLIE PAR 4.
XWOR%4:  VAL         XWOR%1-XWOR%2
FNIVO1:  FLOAT       <BIT>XWOR%4<K<K < POUR DECALER UN NOMBRE FLOTTANT A
                                     < GAUCHE DE 'XWOR%4' POSITIONS...
FWORK4:  FLOAT       0               < VARIABLE DE MANOEUVRE...
TRANPX:  WORD        0               < 'A4'/'A11',
TRANPY:  WORD        0               < 'A5'/'A12'.
NIMASK:  WORD        0               < MASQUE DES NIVEAUX ('AD').
AMASKN:  WORD        0               < MASQUE 'A13',
ADECA:   WORD        0               < DECALAGE 'A14'.
AXMAX:   WORD        XMAX            < COORDONNEE 'X' MAXIMALE,
AYMAX:   WORD        YMAX            < POUR INVERSER LES AXES 'Y' BASSE
                                     < ET MOYENNE DEFINITION ET COORDONNEES
                                     < 'Y' MAXIMALE.
NIV00:   FLOAT       0               < NIVEAU(X,Y),
NIV10:   FLOAT       0               < NIVEAU(X+1,Y),
NIV01:   FLOAT       0               < NIVEAU(X,Y+1),
NIV11:   FLOAT       0               < NIVEAU(X+1,Y+1).
<
< RELAIS DIVERS :
<
APNIVO:  WORD        PNIVO           < CALCUL D'UN NIVEAU 512...
ASTORQ:  WORD        STORQ           < 'STORP' AVEC TEST PREALABLE DES NIVEAUX
                                     < NULS.
ALOADQ:  WORD        LOADQ           < 'LOADP' AVEC VALIDATION DE (X,Y).
AADRAA:  WORD        ADRAA           < SIMULATION DE 'ADR''A,A' POUR DES
                                     < NOMBRES FLOTTANTS.
APTRXY:  WORD        PTRXY           < SOUS-PROGRAMME DE TRANSLATION DE (X,Y).
XXXIMA:  VAL         2
         EOT         #SIP IMAGE 512#
<
< ADRESSE DES REGISTRES DE CONTROLE :
<
ACTRL1:  WORD        RCTRL1
ACTRL2:  WORD        RCTRL2
XXXIMA:  VAL         4
         EOT         #SIP IMAGE 512#
<
<
<        P R O G R A M M E  :
<
<
         PROG
XXXIMA:  VAL         3
         EOT         #SIP IMAGE 512#
XXXIMA:  VAL         5
         EOT         #SIP IMAGE 512#
         PAGE
<
<
<        C A L C U L   D ' U N   N I V E A U   S U R   ( 0 , 2 5 5 )  :
<
<
<        ARGUMENT :
<                    (A,B)=NIVEAU DE GRIS DE (0,NIVMAX) MULTIPLIE PAR 4,
<
<
<        RESULTAT :
<                    (A)=NIVEAU ENTIER CADRE ET DECALE COMME DESIRE...
<
<
PNIVO:   EQU         $
         PSR         X               < SAUVEGARDES...
         FMP         FNIVO1          < CONVERSION (0,7) --> (0,255).
         BSR         AFIX            < ET CONVERSION ENTIER...
         AND         NIMASK          < ET MASQUAGE, AFIN D'ELIMINER, PAR EXEM-
                                     < PLE DES BITS DE QUEUE, FACILITANT
                                     < AINSI LA SUPERPOSITION D'IMAGES, TOUT
                                     < EN UTILISANT L'INTERPOLATION...
         LX          ADECA2          < (X)=DECALAGE DEMANDE PAR 'A2' :
         CPZR        X               < QUEL SENS ???
         JE          PNIVO1          < RIEN A FAIRE...
         JG          PNIVO2          < A GAUCHE...
         NGR         X,X
         SLRS        K,X             < A DROITE SI NEGATIF...
         JMP         PNIVO1
PNIVO2:  EQU         $
         SLLS        K,X             < A GAUCHE SI POSITIF...
PNIVO1:  EQU         $
         PLR         X               < RESTAURATIONS...
         RSR
         PAGE
<
<
<        S T O R E   P O I N T  :
<
<
<        ARGUMENTS :
<                    (X,Y)=COORDONNEES DE POINT,
<                    (A)=NIVEAU DU POINT.
<
<
STORQ:   EQU         $
         CPZR        X
         JL          STORQ2          < (X)<0...
         XR          A,X
         CP          AXMAX
         XR          A,X
         JG          STORQ2          < (X)>'XMAX'...
         CPZR        Y
         JL          STORQ2          < (Y)<0...
         XR          A,Y
         CP          AYMAX
         XR          A,Y
         JG          STORQ2          < (Y)>'YMAX'...
         JAE         STORQ2          < NON, ET LE NIVEAU COURANT EST NUL, ON
                                     < SORT SANS TRACER...
         BSR         ASTORP          < TRACE DU POINT (X,Y) AVEC LE NIVEAU (A).
STORQ2:  EQU         $
         RSR
         PAGE
<
<
<        L O A D   P O I N T  :
<
<
<        ARGUMENTS :
<                    (X,Y)=COORDONNEES DU POINT.
<
<
<        RESULTATS :
<                    (A,B)=NIVEAU FLOTTANT DE CE POINT.
<
<
LOADQ:   EQU         $
         LR          X,A
         JAL         LOADQ1          < (X)<0...
         CP          AXMAX
         JG          LOADQ1          < (X)>'XMAX'...
         LR          Y,A
         JAL         LOADQ1          < (Y)<0...
         CP          AYMAX
         JG          LOADQ1          < (Y)>'YMAX'...
         BSR         ALOADP          < (A)=NIVEAU D'UN POINT DANS L'ECRAN,
LOADQ2:  EQU         $
         BSR         AFLT            < ET ON LE FLOTTE...
         RSR
LOADQ1:  EQU         $
         LAI         XXNOIR          < CAS DES POINTS HORS-ECRAN, ON LES REND
                                     < NOIR...
         JMP         LOADQ2
         PAGE
<
<
<        S I M U L A T I O N   D E   A D R   A ,A  :
<
<
<        FONCTION :
<                      CE MODULE DOUBLE LE NOMBRE
<                    FLOTTANT ARGUMENT (A,B).
<
<
ADRAA:   EQU         $
         FST         FWORK4
         FAD         FWORK4
         RSR
         PAGE
<
<
<        T R A N S L A T I O N   D E   ( X , Y )  :
<
<
<        ARGUMENTS :
<                    (X,Y)=COORDONNEES.
<
<
<        RESULTATS :
<                    (X,Y)=COORDONNEES TRANSLATEES DE (TRANPX,TRANPY).
<
<
PTRXY:   EQU         $
         XR          A,X
         AD          TRANPX          < TRANSLATION DE 'X',
         XR          A,X
         XR          A,Y
         AD          TRANPY          < TRANSLATION DE 'Y'.
         XR          A,Y
         RSR
         PAGE
<
<
<        C O M P O S A N T E   E N   ' U '  :
<
<
SPU:     EQU         $
         CPZ         IPREM           < EST-CE LE PREMIER PASSAGE ???
         JGE         SPU1            < NON...
<
< PREMIER PASSAGE : ENTREE DES ARGUMENTS :
<
         IC          IPREM           < MEMORISATION DE CETTE ENTREE...
<
< CHOIX DU SENS :
<
         LXI         A20
         BSR         ASPCT
         BSR         AROND
         STA         IMODE           < IMODE=0 : 256 --> 512,
                                     <      #0 : 512 --> 256.
         JAE         SPU20           < VERS LE 256 --> 512...
<
<
<        5 1 2   -->   2 5 6  :
<
<
         LXI         A11
         BSR         ASPCT
         BSR         AROND
         STA         TRANPX          < TRANSLATION SUR OX,
         LXI         A12
         BSR         ASPCT
         BSR         AROND
         STA         TRANPY          < TRANSLATION SUR OY.
         LXI         A13
         BSR         ASPCT
         BSR         AROND
         STA         AMASKN          < MASQUE DES NIVEAUX (0,255),
         LXI         A14
         BSR         ASPCT
         BSR         AROND
         STA         ADECA           < DECALAGE A DROITE DES NIVEAUX (0,255).
<
< POSITIONNEMENT SUR LE POINT PRINCIPAL :
<
SPU10:   EQU         $
         LX          XR
         LY          YR
         ADR         X,X
         ADR         Y,Y
         LA          AYMAX
         SBR         A,Y             < INVERSION DES AXES OY...
         NGR         Y,Y             < ON SE PLACE AU POINT :
                                     < (X,Y)=(2*XR,2*YR)...
<
< CONVERSION 1 POUR 1 :
<
         LR          X,A
XWOR%1:  VAL         XMAX+I/NMOTL/NBITMO
         SLRS        XWOR%1=K        < REDUCTION DE 'X',
         LR          A,X
         LR          Y,A
XWOR%1:  VAL         YMAX+I/NLIG
         SLRS        XWOR%1=K        < REDUCTION DE 'Y',
         LR          A,Y
         BSR         APTRXY          < TRANSLATION DE (X,Y),
         BSR         ALOADQ          < (A,B)=NIVEAU(X,Y) FLOTTANT,
         BSR         AFIX            < (A)=NIVEAU(X,Y),
         AND         AMASKN          < QUE L'ON MASQUE,
         PSR         X
         LX          ADECA
         SLRS        K,X             < QUE L'ON DECALE A GAUCHE,
         PLR         X
         ANDI        NIVMAX          < ET ENFIN QUE L'ON CALCULE MODULO...
<
< TRACE DU RESIDENT :
<
         BSR         ASPRPR          < (XR,YR) <-- (A)...
         JMP         SPU3            < VERS LA SORTIE...
<
<
<        2 5 6   -->   5 1 2  :
<
<
SPU20:   EQU         $
         LXI         A4
         BSR         ASPCT
         BSR         AROND
         STA         TRANPX          < A PRIORI, QUELQUE SOIT (A0)...
         LXI         A5
         BSR         ASPCT
         BSR         AROND
         STA         TRANPY          < A PRIORI, QUELQUE SOIT (A0)...
         LAI         PAGER
         BSR         AGPCDA          < POSITIONNEMENT SUR LA PAGE DES REGISTRES
                                     < DE LA 'CDAJ'...
<
< DEFINITION DU TRACE :
<
         LXI         AD
         BSR         ASPCT
         BSR         AROND
         STA         NIMASK          < ENTREE DU MASQUE DES NIVEAUX.
         LXI         A3
         BSR         ASPCT
         BSR         AROND
         JANE        SPU4            < (A3)#0 : ON N'EFFACE PAS...
<
< (A3)=0 : EFFACEMENT ET REINITIALISATION :
<
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...
         LAI         XCTRL1
         STA         MCDAJ
         LA          ACTRL1
         BSR         APWCDA          < INITIALISATION DE 'CTRL1'.
         LAI         XCTRL2
         STA         MCDAJ
         LA          ACTRL2
         BSR         APWCDA          < INITIALISATION DE 'CTRL2'.
SPU4:    EQU         $
<
< SELECTION DES PLANS ET DECALAGE :
<
         LXI         A1
         BSR         ASPCT
         BSR         AROND
         EORI        MOCD            < ON INVERSE LES CONVENTIONS DU SOFT
                                     < POUR ETRE COMPATIBLE HARD...
         STA         MCDAJ           < PREPARATION DE LA LISTE DE SELECTION
                                     < DES PLANS MEMOIRE,
         LA          ARPLAN          < (A)=ADRESSE DU REGSITRE 'RPLAN',
         BSR         APWCDA          < SELECTION DES PLANS DEMANDES...
         LXI         A2
         BSR         ASPCT
         BSR         AROND
         STA         ADECA2          < DECALAGE SUR CHAQUE NIVEAU...
<
< CHOIX DU SENS DE LA CONVERSION :
<
SPU1:    EQU         $
         CPZ         IMODE           < QUEL EST LE SENS ???
         JNE         SPU10           < 512 --> 256...
<
< CAS DU 256 --> 512 : POSITION-
< NEMENT SUR LE POINT PRINCIPAL :
<
         LX          XR
         LY          YR
         ADR         X,X             < ON SE PLACE EN (XR,YR)
         ADR         Y,Y             < EN DOUBLANT LA DEFINITION...
         LA          AYMAX
         SBR         A,Y
         NGR         Y,Y             < LES AXES 'Y' BASSE ET MOYENNE DEFINITION
                                     < ETANT INVERSES...
<
< UN POINT POUR UN POINT :
<
SPU5:    EQU         $
         LR          X,A
XWOR%1:  VAL         XMAX+I/NMOTL/NBITMO
         SLRS        XWOR%1=K        < REDUCTION DE 'X',
         LR          A,X
         LR          Y,A
XWOR%1:  VAL         YMAX+I/NLIG
         SLRS        XWOR%1=K        < REDUCTION DE 'Y',
         LR          A,Y
         BSR         APTRXY          < TRANSLATION DE (X,Y)...
         BSR         ASPGPR          < (A)=NIVEAU(XR,YR),
         BSR         AFLT            < QUE L'ON FLOTTE...
         BSR         AADRAA          < ON LE
         BSR         AADRAA          <       MULTIPLIE PAR 4...
         BSR         APNIVO          < ON LE CALIBRE,
         BSR         ASTORQ          < ET ON MARQUE (X,Y)...
<
< ET SORTIE :
<
SPU3:    EQU         $
         FLD         FINFIN          < POUR FAIRE UN OVERSCREEN...
         RSR
<
<
<        C O M P O S A N T E   E N   ' V '  :
<
<
SPV:     EQU         $
         FLD         FINFIN          < POUR FAIRE UN OVERSCREEN...
         RSR
<
<
<        C O M P O S A N T E   E N   ' W '  :
<
<
SPW:     EQU         $
         FLD         F0
         RSR
:F
:F
< <<'SIO5 256<-->512'



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.