/***********************************************************
 *
 * Programmino per accendere e spegnere in modo graduale il
 * led di accensione dell'Amiga.
 *
 * Realizzato da Eugenio Ciceri espressamente per AMAZING #4
 * il 2 Dicembre 1988.
 *
 * Il programma ed il relativo listato sono di pubblico
 * dominio, percio' fanne subito una copia per i tuoi amici!
 *
 **********************************************************/

/* Per prima cosa includiamo la struttura contenente i nomi
   dei registri degli integrati CIA.
*/
#include "hardware/cia.h"

/* Le seguenti due definizioni servono per azzerare o
   settare il bit 1 del registro CIAPRA (e quindi ad
   accendere e spegnere il led di Amiga).
   Rendono il seguito del listato piu' comprensibile.
*/
#define LED_ON      *(&ciaa.ciapra)&=0xfd
#define LED_OFF     *(&ciaa.ciapra)|=0x02

/* Il registro CIAPRA controlla, tramite i bit 2 e 3, anche
   i contatti delle porte joystick relativi al tasto
   sinistro del mouse e del pulsante di sparo del joystick. 
   Le seguenti due definizioni sono delle espressioni
   booleane (che valgono dunque 0 o 1) che ci dicono se il
   tasto sinistro del mouse o il pulsante di sparo del
   joystick sono premuti o no; funzionano in modo inverso
   alla normale convenzione logica, ossia se il tasto e'
   premuto ritornano il valore 0.
*/
#define JOY1_SHOT   (*(&ciaa.ciapra)&0x40)
#define JOY2_SHOT   (*(&ciaa.ciapra)&0x80)

main()
{
    int ritardo,i,j;    /* contatori */
    
    ritardo=300;        /* aumentando questa variabile
                           diminuisce la frequenza di
                           lampeggio (e viceversa). */

/* Evitiamo che qualche altro programma interferisca con il
   nostro disabilitando il multitasking.
   (Ecco perche' il cursore del mouse si blocca e la
   tastiera non risponde).
*/
    Forbid();

/* Finche' non sono premuti ne' il tasto sinistro del mouse
   ne' il pulsante di sparo del joystick...
*/
    while (JOY1_SHOT && JOY2_SHOT)
    {
/* Sfumatura da acceso a spento.
*/
        for (i=0; i<ritardo; i++)
        {
/* Aumenta gradualmente il tempo di spegnimento del led...
*/
            LED_OFF;
            for (j=0; j<i; j++)
                ;
/* mentre ne diminuisce il tempo di accensione.
*/
            LED_ON;
            for (j=ritardo; j>i; j--)
                ;
        }
/* Sfumatura da spento ad acceso.
*/
        for (i=0; i<ritardo; i++)
        {
/* Aumenta gradualmente il tempo di accensione del led...
*/
            LED_ON;
            for (j=0; j<i; j++)
                ;
/* mentre ne diminuisce il tempo di spegnimento.
*/
            LED_OFF;
            for (j=ritardo; j>i; j--)
                ;
        }
    }

/* Prima di uscire riabilitiamo il multitasking per evitare
   di trovarci con l'Amiga paralizzato...
*/
    Permit();

/* e diamo una svegliatina al led.
*/
    LED_ON;

/* E questo e' tutto...
*/
    return NULL;
}
