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