_______________________________________________________________________________________________________________________________________
/*************************************************************************************************************************************/
/* */
/* 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
_______________________________________________________________________________________________________________________________________