_______________________________________________________________________________________________________________________________________
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        F O N C T I O N S   D E   B A S E   D ' E D I T I O N   D E S   I M A G E S                                                */
/*        S U R   L ' I M A G E U R   D U   S O L A R  :                                                                             */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Definition :                                                                                                               */
/*                                                                                                                                   */
/*                    Ce fichier contient toutes les fonctions                                                                       */
/*                  de base d'edition des images raster, quelle que                                                                  */
/*                  soit la definition.                                                                                              */
/*                                                                                                                                   */
/*                                                                                                                                   */
/*        Author of '$xiids/fonction$FON' :                                                                                          */
/*                                                                                                                                   */
/*                    Jean-Francois Colonna (LACTAMME, 19870000000000).                                                              */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N   D E   L ' I M A G E U R   6 8 0 0 0  :                                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   OFFSET_68000                                                                                                                  \
                    PARE(0x3f800)                                                                                                       \
                                        /* Definition de la base d'adressage des registres de commande de l'imageur.                 */
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N   D E S   P A R A M E T R E S  :                                                                       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   LINV_68000                                                                                                                    \
                    MMOT                                                                                                                \
                                        /* Afin de respecter la logique inverse...                                                   */
#define   PIS_68000(argument)                                                                                                           \
                    ETLO(OUEX(argument,LINV_68000),MOCD)                                                                                \
                                        /* Donne le complement a 1 de l'argument, en ne conservant que l'octet de droite.            */
#define   NOIR_68000                                                                                                                    \
                    NOIR_SOLAR                                                                                                          \
                                        /* Premiere entree des tables de coloriage,                                                  */
#define   N255_68000                                                                                                                    \
                    BLANC_SOLAR                                                                                                         \
                                        /* Deniere entree des tables de coloriage.                                                   */
#define   NIV256_68000                                                                                                                  \
                    LENG(NOIR_SOLAR,BLANC_SOLAR)                                                                                        \
                                        /* Nombre d'entree dans les tables de coloriage.                                             */
#define   C512_68000                                                                                                                    \
                    dimX                                                                                                                \
                                        /* Nombre de colonnes,                                                                       */
#define   L512_68000                                                                                                                    \
                    dimY                                                                                                                \
                                        /* Et nombre de lignes d'une image.                                                          */
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N   D E S   D I V E R S E S   C O M M A N D E S  :                                                       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   PVECT_68000                                                                                                                   \
                    PARE(0x08)                                                                                                          \
                                        /* Bit de 'RCMD' pour la mise en format "petits vecteurs".                                   */
#define   RASTER_68000                                                                                                                  \
                    SLLS(BIT,SOUS(SOUS(NBITHW,B),PVECT_68000))                                                                          \
                                        /* Commande a envoyer a 'RCMD' pour simuler un mode raster.                                  */
#define   ERASEG_68000                                                                                                                  \
                    PARE(0xf8)                                                                                                          \
                                        /* Commande de reinitialisation des differents registres et                                  */ \
                                        /* d'effacement de l'ecran.                                                                  */
#define   TEMPORISATION_68000                                                                                                           \
                    PARE(2)                                                                                                             \
                                        /* Duree en secondes de la temporisation d'effacement.                                       */
#define   ERASE_68000                                                                                                                   \
                    PARE(0xfb)                                                                                                          \
                                        /* Commande d'effacement seul de l'ecran.                                                    */
#define   XCTRL1_68000                                                                                                                  \
                    PARE(0x03)                                                                                                          \
                                        /* Pour activer les interruptions.                                                           */
#define   XCTRL2_68000                                                                                                                  \
                    PARE(0x00)                                                                                                          \
                                        /* Plume...                                                                                  */
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N   D E S   R E G I S T R E S  :                                                                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   IMPAIR_68000(registre)                                                                                                        \
                    PAR1(registre)                                                                                                      \
                                        /* Afin de rendre impair un numero de registre...                                            */
#define   XCD_68000                                                                                                                     \
                    IMPAIR_68000(0x00)                                                                                                  \
                                        /* Registre de commande et d'etat...                                                         */
#define   RSTAT_68000                                                                                                                   \
                    XCD_68000                                                                                                           \
                                        /* Registre d'etat,                                                                          */
#define   RCMD_68000                                                                                                                    \
                    XCD_68000                                                                                                           \
                                        /* Registre de commande.                                                                     */
#define   RCTRL1_68000                                                                                                                  \
                    IMPAIR_68000(0x02)                                                                                                  \
                                        /* Registre de controle de l'ecriture et des interruptions.                                  */
#define   RCTRL2_68000                                                                                                                  \
                    IMPAIR_68000(0x04)                                                                                                  \
                                        /* Registre d'orientation des symboles et de type des vecteurs.                              */
#define   RCSIZE_68000                                                                                                                  \
                    IMPAIR_68000(0x06)                                                                                                  \
                                        /* Registre de taille des caracteres.                                                        */
#define   RDELTX_68000                                                                                                                  \
                    IMPAIR_68000(0x0a)                                                                                                  \
                                        /* Registre de 'delta(x)',                                                                   */
#define   RDELTY_68000                                                                                                                  \
                    IMPAIR_68000(0x0e)                                                                                                  \
                                        /* Registre de 'delta(y)'.                                                                   */
#define   RXH_68000                                                                                                                     \
                    IMPAIR_68000(0x10)                                                                                                  \
                                        /* Poids forts de la coordonnee 'x',                                                         */
#define   RXL_68000                                                                                                                     \
                    IMPAIR_68000(0x12)                                                                                                  \
                                        /* Poids faibles de la coordonnee 'x'.                                                       */
#define   RYH_68000                                                                                                                     \
                    IMPAIR_68000(0x14)                                                                                                  \
                                        /* Poids forts de la coordonnee 'y',                                                         */
#define   RYL_68000                                                                                                                     \
                    IMPAIR_68000(0x16)                                                                                                  \
                                        /* Poids faibles de la coordonnee 'y'.                                                       */
#define   RNIVO_68000                                                                                                                   \
                    IMPAIR_68000(0x20)                                                                                                  \
                                        /* Registre contenant le niveau de gris a attribuer a un point ; c'est                       */ \
                                        /* aussi l'index dans les tables de coloriage.                                               */
#define   RSLUT_68000                                                                                                                   \
                    IMPAIR_68000(0x80)                                                                                                  \
                                        /* Selection d'une ou plusieurs (R, V, B) tables de coloriage en parallele.                  */
#define   RPLAN_68000                                                                                                                   \
                    IMPAIR_68000(0x60)                                                                                                  \
                                        /* Registre d'autorisation/interdiction d'ecriture dans un ou plusieurs                      */ \
                                        /* plans de la memoire d'image.                                                              */
#define   RLUT_68000                                                                                                                    \
                    PARE(0x400)                                                                                                         \
                                        /* Premiere entree des tables de coloriage (les suivantes s'obtiennent                       */ \
                                        /* par incrementation).                                                                      */
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N   D E   L A   L I A I S O N   P H Y S I Q U E  :                                                       */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
#define   EOM_68000                                                                                                                     \
                    K_RC                                                                                                                \
                                        /* Definition du caractere de fin de message pour le MC68000.                                */
#define   SEND_EOM_68000                                                                                                                \
                    Bblock                                                                                                              \
                    CAL2(Prin1("%c",EOM_68000));                                                                                        \
                    Eblock                                                                                                              \
                                        /* Envoi d'une fin de message au MC68000.                                                    */
#define   SEND_COMMANDE_68000(commande)                                                                                                 \
                    Bblock                                                                                                              \
                    CAL2(Prin1("%s",commande));                                                                                         \
                    Eblock                                                                                                              \
                                        /* Envoi d'une commande au MC68000.                                                          */
#define   SEND_DESTINATAIRE_68000(destinataire)                                                                                         \
                    Bblock                                                                                                              \
                    CAL2(Prin1(" %X",destinataire));                                                                                    \
                    Eblock                                                                                                              \
                                        /* Envoi d'une adresse de destinataire au MC68000.                                           */
#define   SEND_ARGUMENT_68000(argument)                                                                                                 \
                    Bblock                                                                                                              \
                    CAL2(Prin1(" %X",argument));                                                                                        \
                    Eblock                                                                                                              \
                                        /* Envoi d'un argument au MC68000.                                                           */
#define   SEND_68000(commande,destinataire,argument)                                                                                    \
                    Bblock                                                                                                              \
                    SEND_COMMANDE_68000(commande);                                                                                      \
                    SEND_DESTINATAIRE_68000(destinataire);                                                                              \
                    SEND_ARGUMENT_68000(argument);                                                                                      \
                    SEND_EOM_68000;                                                                                                     \
                    Eblock                                                                                                              \
                                        /* Envoi d'une commande complete au MC68000.                                                 */
#define   SM_68000  "SM"                                                                                                                \
                                        /* Commande de positionnement de la memoire du MC68000.                                      */
#define   OF_68000  "OF"                                                                                                                \
                                        /* Commande de mise en place de la base d'adressage ("offset").                              */
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        D E F I N I T I O N   D E S   V A L E U R S   A N T E R I E U R E S  :                                                     */
/*                                                                                                                                   */
/*************************************************************************************************************************************/
DEFV(Local,DEFV(Int,INIT(snivop_68000,INFINI)));
                                        /* Niveau de gris envoye anterieurement.                                                     */
DEFV(Local,DEFV(Int,INIT(sXHp_68000,INFINI)));
                                        /* Partie haute de la coordonnee 'x' envoyee anterieurement,                                 */
DEFV(Local,DEFV(Int,INIT(sXLp_68000,INFINI)));
                                        /* Partie basse de la coordonnee 'x' envoyee anterieurement.                                 */
DEFV(Local,DEFV(Int,INIT(sYHp_68000,INFINI)));
                                        /* Partie haute de la coordonnee 'y' envoyee anterieurement,                                 */
DEFV(Local,DEFV(Int,INIT(sYLp_68000,INFINI)));
                                        /* Partie basse de la coordonnee 'y' envoyee anterieurement.                                 */

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        I N I T I A L I S A T I O N   D E S   O P E R A T I O N S  :                                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

DEFV(Common,DEFV(FonctionI,IMC_initialisation()))
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     INIT_ERROR;
     /*..............................................................................................................................*/
     EGAL(snivop_68000,INFINI);
                                        /* Pas de niveau de gris anterieur.                                                          */
     EGAL(sXHp_68000,INFINI);
                                        /* Pas de coordonnee 'x' haute anterieure,                                                   */
     EGAL(sXLp_68000,INFINI);
                                        /* Pas de coordonnee 'x' basse anterieure.                                                   */
     EGAL(sYHp_68000,INFINI);
                                        /* Pas de coordonnee 'y' haute anterieure,                                                   */
     EGAL(sYLp_68000,INFINI);
                                        /* Pas de coordonnee 'y' basse anterieure.                                                   */
     SEND_EOM_68000;
                                        /* Envoi d'une fin de message preventive, afin de nettoyer le                                */
                                        /* buffer d'entree du MC68000.                                                               */
     SEND_COMMANDE_68000(OF_68000);
                                        /* Envoi de la commande                                                                      */
     SEND_ARGUMENT_68000(OFFSET_68000);
                                        /*                      de mise en place de l'offset d'adressage.                            */
     SEND_EOM_68000;
                                        /* Puis, envoi d'une fin de message.                                                         */
     RETU_ERROR;
     Eblock

EFonctionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        E F F A C E M E N T   D E   L ' E C R A N  :                                                                               */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

DEFV(Common,DEFV(FonctionI,IMC_erase()))
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     INIT_ERROR;
     /*..............................................................................................................................*/
     CALS(IMC_initialisation());
                                        /* Reinitialisation des variables internes et externes...                                    */
     SEND_68000(SM_68000,RPLAN_68000,PIS_68000(P2_TO_MASK(NIV256_68000)));
                                        /* Selection de tous les plans de la memoire d'image.                                        */
     SEND_68000(SM_68000,RCMD_68000,ERASE_68000);
                                        /* Effacement de l'ecran.                                                                    */
     DODO(TEMPORISATION_68000);
                                        /* Et temporisation d'attente de fin d'effacement...                                         */
     SEND_68000(SM_68000,RCTRL1_68000,PIS_68000(XCTRL1_68000));
                                        /* Initialisation du registre de controle 1.                                                 */
     SEND_68000(SM_68000,RCTRL2_68000,PIS_68000(XCTRL2_68000));
                                        /* Initialisation du registre de controle 2.                                                 */
     RETU_ERROR;
     Eblock

EFonctionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        E N V O I   D ' U N   P O I N T  :                                                                                         */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

DEFV(Local,DEFV(FonctionI,IMC_storp(X,Y,niveau)))
DEFV(Argument,DEFV(Int,X));
DEFV(Argument,DEFV(Int,Y));
                                        /* Coordonnees entieres 'X' et 'Y',                                                          */
DEFV(Argument,DEFV(genere_p,niveau));
                                        /* Et niveau de marquage.                                                                    */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     INIT_ERROR;
     DEFV(Int,INIT(lXHp,SLRS(X,NBITOC)));
                                        /* Partie haute de la coordonnee 'x',                                                        */
     DEFV(Int,INIT(lXLp,ETLO(X,MOCD)));
                                        /* Partie basse de la coordonnee 'x'.                                                        */
     DEFV(Int,INIT(lYHp,SLRS(Y,NBITOC)));
                                        /* Partie haute de la coordonnee 'y',                                                        */
     DEFV(Int,INIT(lYLp,ETLO(Y,MOCD)));
                                        /* Partie basse de la coordonnee 'y'.                                                        */
     /*..............................................................................................................................*/
     Test(IFNE(niveau,snivop_68000))
          Bblock
          EGAL(snivop_68000,niveau);
                                        /* Dans le cas ou la valeur courante 'niveau' n'est pas la valeur anterieure,                */
                                        /* on l'envoie au MC68000...                                                                 */
          SEND_68000(SM_68000,RNIVO_68000,niveau);
          Eblock
     ATes
          Bblock
          Eblock
     ETes
     Test(IFNE(lXHp,sXHp_68000))
          Bblock
          EGAL(sXHp_68000,lXHp);
                                        /* Dans le cas ou la valeur courante 'lXHp' n'est pas la valeur anterieure,                  */
                                        /* on l'envoie au MC68000...                                                                 */
          SEND_68000(SM_68000,RXH_68000,PIS_68000(lXHp));
          Eblock
     ATes
          Bblock
          Eblock
     ETes
     Test(IFNE(lXLp,sXLp_68000))
          Bblock
          EGAL(sXLp_68000,lXLp);
                                        /* Dans le cas ou la valeur courante 'lXLp' n'est pas la valeur anterieure,                  */
                                        /* on l'envoie au MC68000...                                                                 */
          SEND_68000(SM_68000,RXL_68000,PIS_68000(lXLp));
          Eblock
     ATes
          Bblock
          Eblock
     ETes
     Test(IFNE(lYHp,sYHp_68000))
          Bblock
          EGAL(sYHp_68000,lYHp);
                                        /* Dans le cas ou la valeur courante 'lYHp' n'est pas la valeur anterieure,                  */
                                        /* on l'envoie au MC68000...                                                                 */
          SEND_68000(SM_68000,RYH_68000,PIS_68000(lYHp));
          Eblock
     ATes
          Bblock
          Eblock
     ETes
     Test(IFNE(lYLp,sYLp_68000))
          Bblock
          EGAL(sYLp_68000,lYLp);
                                        /* Dans le cas ou la valeur courante 'lYLp' n'est pas la valeur anterieure,                  */
                                        /* on l'envoie au MC68000...                                                                 */
          SEND_68000(SM_68000,RYL_68000,PIS_68000(lYLp));
          Eblock
     ATes
          Bblock
          Eblock
     ETes
     SEND_68000(SM_68000,RCMD_68000,PIS_68000(RASTER_68000));
                                        /* Et enfin on marque le point argument {X,Y} avec le 'niveau'...                            */
     RETU_ERROR;
     Eblock

EFonctionI

/*===================================================================================================================================*/
/*************************************************************************************************************************************/
/*                                                                                                                                   */
/*        E N V O I   D ' U N E   I M A G E   A   L ' I M A G E U R   6 8 0 0 0  :                                                   */
/*                                                                                                                                   */
/*************************************************************************************************************************************/

BFonctionI

DEFV(Common,DEFV(FonctionI,IMC_display(imageA)))
DEFV(Argument,DEFV(image,imageA));
                                        /* Image argument a visualiser.                                                              */
/*-----------------------------------------------------------------------------------------------------------------------------------*/
     Bblock
     INIT_ERROR;
     /*..............................................................................................................................*/
     begin_image
          Bblock
          CALS(IMC_storp(X,Y,load_point(imageA,Y,X)));
                                        /*  transfert element par element.                                                           */
          Eblock
     end_image
     RETU_ERROR;
     Eblock

EFonctionI

#undef    OFFSET_68000
#undef    LINV_68000
#undef    PIS_68000
#undef    NOIR_68000
#undef    NIV256_68000
#undef    N255_68000
#undef    C512_68000
#undef    L512_68000
#undef    PVECT_68000
#undef    RASTER_68000
#undef    ERASEG_68000
#undef    TEMPORISATION_68000
#undef    ERASE_68000
#undef    XCTRL1_68000
#undef    XCTRL2_68000
#undef    IMPAIR_68000
#undef    XCD_68000
#undef    RSTAT_68000
#undef    RCMD_68000
#undef    RCTRL1_68000
#undef    RCTRL2_68000
#undef    RCSIZE_68000
#undef    RDELTX_68000
#undef    RDELTY_68000
#undef    RXH_68000
#undef    RXL_68000
#undef    RYH_68000
#undef    RYL_68000
#undef    RNIVO_68000
#undef    RSLUT_68000
#undef    RPLAN_68000
#undef    RLUT_68000
#undef    EOM_68000
#undef    SEND_EOM_68000
#undef    SEND_COMMANDE_68000
#undef    SEND_DESTINATAIRE_68000
#undef    SEND_ARGUMENT_68000
#undef    SEND_68000
#undef    SM_68000
#undef    OF_68000

_______________________________________________________________________________________________________________________________________



Copyright © Jean-François Colonna, 2019-2021.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / Ecole Polytechnique, 2019-2021.