Newsgroup: it.comp.retrocomputing
Titolo: Sorgente +o- definitivo

Salve, a seguire copia del sorgente in MikroC per la mia schedina di 
sostituzione del controller tastiera dell'apple2e.
Qui la formattazione ï¿œ un po' alterata, nell'editor del MikroC ï¿œ corretta.
direi che ï¿œ la versione definitiva, funzionano anche i tasti cursore e 
ho aggiunto un simpatico easter egg :-)
A giorni sarï¿œ disponibile anche nel sito insieme al progetto per MikroC 
e al codice .hex
 
ciao.
 
 
 
/*
 
	Programma sorgente per PIC16F877A nel kit di sostituzione dell' 
AY-5-3600 PRO
 
]
  +----------------------------------+
  |                                  |
  | Apple ][e Keyboard controller 2  |
  |                                  |
  +--------- by Paolo Carrer 2012 ---+
                                      \
]
 
 
*/
 
 
 
 
#define AKD     PortE.F1
#define KSTRD   PortE.F0
#define OUT0_7  PortD
#define OUT8    PortE.F2
#define Shift   PortA.F0
#define Control PortA.F1
#define SJ1     PortA.F3
#define SJ2     PortA.F2
 
 
unsigned char TASTO=0, TASTO_GIU=0, NO_TASTO=10, C_ROTATE=0xFE, A_OUT=0x30,
               EGG1=0, EGG2=0, Shft_DN=0, Ctrl_DN=0, ESC = 0, CURSOR = 0;
 
 
void SCAN_UP (void);
void SEND_KEY (void);
void EASTER1 (void);
void EASTER2 (void);
void WELCOME (void);
void SENDKEY (void);
 
 
 
void main()
{
 
adcon1=0x06;        // Porte A ed E configurate come digitali
option_reg.f7=0;    // Abilita pullup Port B
 
TrisA=0b11001111;
TrisB=0b11111111;
TrisC=0b00000000;
TrisD=0b00000000;
TrisE=0b11101000;
 
PortA=A_OUT;
PortC=C_ROTATE;
PortD=0;
PortE=0;
 
if (!SJ1) WELCOME();
 
while(1)
     {
         if (portb == 0xFF)
         {
            SCAN_UP();
            NO_TASTO ++;
            if (NO_TASTO == 11) NO_TASTO = 10;
         }
 
         else if (portb != 0xFF)
         {
            delay_ms(5);
            TASTO = portb;
            delay_ms(5);
 
            if (TASTO == portb & AKD == 0)
            {
               NO_TASTO = 0;
               AKD = 1;
               TASTO_GIU = TASTO;
               SEND_KEY();
            }
 
            else if (TASTO_GIU == portb & AKD == 1)
            {
               NO_TASTO = 0;
               SCAN_UP();
            }
 
            /*else if (TASTO == portb & AKD == 1) // & TASTO != TASTO_GIU)
            {
               NO_TASTO = 0;
               TASTO_GIU = TASTO;
               SEND_KEY();
            }  */
          }
     }
 
 
}
 
 
 
void SCAN_UP (void)
{
  // Modulo scansione sequenziale della matrice di tasti
 
      if (NO_TASTO == 10)
      {
         AKD = 0;
         OUT0_7 = 0;
         OUT8 = 0;
      }
 
      if (C_ROTATE != 0xFF)
      {
         C_ROTATE = ~ C_ROTATE;
         C_ROTATE = C_ROTATE << 1;
         C_ROTATE = ~ C_ROTATE;
         portc = C_ROTATE;
      }
 
      if (C_ROTATE == 0xFF)
      {
         A_OUT = A_OUT - 0x10;
 
         if (A_OUT == 0)
         {
            A_OUT = 0x30;
            C_ROTATE = 0xFE;
            portc = C_ROTATE;
         }
 
         porta = A_OUT;
      }
 
      delay_us(10);
}
 
 
 
void SEND_KEY (void)
{
 
      const char CHT[] = 
{0xe6,0x53,0x4f,0x77,0x4f,0x07,0x23,0xc3,0x0f,0x07,0x27,
                         0x1f,0x1b};
      CURSOR = 0;
 
  // Controllo tasti cursore
 
      if (C_ROTATE == 0x7F)                     // Interrogata Colonna Y7
      {
         if (TASTO_GIU == 0xFE)                 // Riga X7 attiva
         {
         CURSOR = 1;
         if (!ESC)
         {
         OUT0_7 = 0x03;
         OUT8 = 0;
         KSTRD = 1;
         KSTRD = 0;
         ESC = 1;
         delay_us(50);
         }
         OUT0_7 = 0x93;                         // Tasto Down (keyboard)
         OUT8 = 0;
         }
 
         else if (TASTO_GIU == 0xFD)                 // Riga X6 attiva
         {
         CURSOR = 1;
         if (!ESC)
         {
         OUT0_7 = 0x03;
         OUT8 = 0;
         KSTRD = 1;
         KSTRD = 0;
         ESC = 1;
         delay_us(50);
         }
         OUT0_7 = 0x4B;                         // Tasto UP (keyboard)
         OUT8 = 0;
         }
      }
 
      else if (A_OUT == 0x20)                        // Interrogata 
Colonna Y8
      {
         if (TASTO_GIU == 0xFE)                 // Riga X7 attiva
         {
         CURSOR = 1;
         if (!ESC)
         {
         OUT0_7 = 0x03;
         OUT8 = 0;
         KSTRD = 1;
         KSTRD = 0;
         ESC = 1;
         delay_us(50);
         }
         OUT0_7 = 0x6B;                         // Tasto Left (keyboard)
         OUT8 = 0;
         }
      }
 
      else if (A_OUT == 0x10)                        // Interrogata 
Colonna Y9
      {
         if (TASTO_GIU == 0xFE)                 // Riga X7 attiva
         {
         CURSOR = 1;
         if (!ESC)
         {
         OUT0_7 = 0x03;
         OUT8 = 0;
         KSTRD = 1;
         KSTRD = 0;
         ESC = 1;
         delay_us(50);
         }
         OUT0_7 = 0x6F;                         // Tasto Right (keyboard)
         OUT8 = 0;
         }
      }
 
      else if (C_ROTATE == 0xFD)                    // Interrogata 
Colonna Y1
      {
         if (TASTO_GIU == 0xFE)                // Riga X7 attiva
         {
         CURSOR = 1;
         if (!ESC)
         {
         OUT0_7 = 0x03;
         OUT8 = 0;
         KSTRD = 1;
         KSTRD = 0;
         ESC = 1;
         delay_us(50);
         }
         OUT0_7 = 0x6F;                         // Tasto Right (keypad)
         OUT8 = 0;
         }
 
         else if (TASTO_GIU == 0xFD)                 // Riga X6 attiva
         {
         CURSOR = 1;
         if (!ESC)
         {
         OUT0_7 = 0x03;
         OUT8 = 0;
         KSTRD = 1;
         KSTRD = 0;
         ESC = 1;
         delay_us(50);
         }
         OUT0_7 = 0x6B;                         // Tasto Left (keypad)
         OUT8 = 0;
         }
 
         else if (TASTO_GIU == 0xFB)                 // Riga X5 attiva
         {
         CURSOR = 1;
         if (!ESC)
         {
         OUT0_7 = 0x03;
         OUT8 = 0;
         KSTRD = 1;
         KSTRD = 0;
         ESC = 1;
         delay_us(50);
         }
         OUT0_7 = 0x4B;                         // Tasto Up (keypad)
         OUT8 = 0;
         }
 
         else if (TASTO_GIU == 0xF7)                 // Riga X4 attiva
         {
         CURSOR = 1;
         if (!ESC)
         {
         OUT0_7 = 0x03;
         OUT8 = 0;
         KSTRD = 1;
         KSTRD = 0;
         ESC = 1;
         delay_us(50);
         }
         OUT0_7 = 0x93;                         // Tasto Down (keypad)
         OUT8 = 0;
         }
      }
 
 
 
      if (!CURSOR & ESC)
       {
         OUT0_7 = 0x03;
         OUT8 = 0;
         KSTRD = 1;
         KSTRD = 0;
         delay_us(50);
         ESC = 0;
       }
 
  // Controllo tasti alfanumerici
 
      if (!CURSOR & !ESC)
      {
 
      Shft_DN = 0;
      Ctrl_DN = 0;
 
      if (!Shift)
         {
         delay_ms(10);
         if (!Shift) Shft_DN = 1;
         }
 
      if (!Control)
         {
         delay_ms(10);
         if (!Control) Ctrl_DN = 1;
         }
 
 
      if (C_ROTATE == 0x7F)                     // Interrogata Colonna Y7
      {
         if (TASTO_GIU == 0xFB)                 // Riga X5 attiva
         {
         OUT0_7 = 0xE7;                         // Tasto P
         OUT8 = 0;
         }
         else if (TASTO_GIU == 0xF7)                 // Riga X4 attiva
         {
         OUT0_7 = 0xBF;                         // Tasto =+
         OUT8 = 0;
         }
         else if (TASTO_GIU == 0xEF)                 // Riga X3 attiva
         {
         OUT0_7 = 0x97;                         // Tasto ,<
         OUT8 = 0;
         }
         else if (TASTO_GIU == 0xDF)                 // Riga X2 attiva
         {
         OUT0_7 = 0x6F;                         // Tasto K
         OUT8 = 0;
         }
         else if (TASTO_GIU == 0xBF)                 // Riga X1 attiva
         {
         OUT0_7 = 0x47;                         // Tasto U
         OUT8 = 0;
         }
         else if (TASTO_GIU == 0x7F)                 // Riga X0 attiva
         {
         OUT0_7 = 0x1F;                         // Tasto 7&
         OUT8 = 0;
         }
       }
 
       else if (C_ROTATE == 0xBF)                    // Interrogata 
Colonna Y6
       {
         if (TASTO_GIU == 0xFE)                 // Riga X7 attiva
         {
         OUT0_7 = 0xA7;                         // Tasto Del
         OUT8 = 0;
         }
         else if (TASTO_GIU == 0xFD)                 // Riga X6 attiva
         {
         OUT0_7 = 0x2B;                         // Tasto CR (keyboard)
         OUT8 = 1;
         }
         else if (TASTO_GIU == 0xF7)                 // Riga X5 attiva
         {
         OUT0_7 = 0xBB;                         // Tasto \|
         OUT8 = 0;
         }
         else if (TASTO_GIU == 0xFB)                 // Riga X4 attiva
         {
         OUT0_7 = 0xE3;                         // Tasto `~
         OUT8 = 0;
         }
         else if (TASTO_GIU == 0xEF)                 // Riga X3 attiva
         {
         OUT0_7 = 0x93;                         // Tasto M
         OUT8 = 0;
         }
         else if (TASTO_GIU == 0xDF)                 // Riga X2 attiva
         {
         OUT0_7 = 0x6B;                         // Tasto J
         OUT8 = 0;
         }
         else if (TASTO_GIU == 0xBF)                 // Riga X1 attiva
         {
         OUT0_7 = 0x43;                         // Tasto T
         OUT8 = 0;
         }
         else if (TASTO_GIU == 0x7F)                 // Riga X0 attiva
         {
         OUT0_7 = 0x1B;                         // Tasto 5%
         OUT8 = 0;
         }
       }
 
       else if (C_ROTATE == 0xDF)                    // Interrogata 
Colonna Y5
       {
         if (TASTO_GIU == 0xFE)                 // Riga X7 attiva
         {
         OUT0_7 = 0x2F;                         // Tasto , (keypad)
         OUT8 = 1;
         }
         else if (TASTO_GIU == 0xFD)                 // Riga X6 attiva
         {
         OUT0_7 = 0x07;                         // Tasto + (keypad)
         OUT8 = 1;
         }
         else if (TASTO_GIU == 0xFB)                 // Riga X5 attiva
         {
         OUT0_7 = 0xDF;                         // Tasto 7 (keypad)
         OUT8 = 0;
         }
         else if (TASTO_GIU == 0xF7)                 // Riga X4 attiva
         {
         OUT0_7 = 0xB7;                         // Tasto 3 (keypad)
         OUT8 = 0;
         }
         else if (TASTO_GIU == 0xEF)                 // Riga X3 attiva
         {
         OUT0_7 = 0x8F;                         // Tasto N
         OUT8 = 0;
         }
         else if (TASTO_GIU == 0xDF)                 // Riga X2 attiva
         {
         OUT0_7 = 0x67;                         // Tasto G
         OUT8 = 0;
         }
         else if (TASTO_GIU == 0xBF)                 // Riga X1 attiva
         {
         OUT0_7 = 0x3F;                         // Tasto Y
         OUT8 = 0;
         }
         else if (TASTO_GIU == 0x7F)                 // Riga X0 attiva
         {
         OUT0_7 = 0x17;                         // Tasto 6^
         OUT8 = 0;
         }
       }
 
       else if (C_ROTATE == 0xEF)                    // Interrogata 
Colonna Y4
       {
         if (TASTO_GIU == 0xFE)                 // Riga X7 attiva
         {
         OUT0_7 = 0x0B;                         // Tasto CR (keypad)
         OUT8 = 1;
         }
         else if (TASTO_GIU == 0xFD)                 // Riga X6 attiva
         {
         OUT0_7 = 0x03;                         // Tasto . (keypad)
         OUT8 = 1;
         }
         else if (TASTO_GIU == 0xFB)                 // Riga X5 attiva
         {
         OUT0_7 = 0xDB;                         // Tasto 6 (keypad)
         OUT8 = 0;
         }
         else if (TASTO_GIU == 0xF7)                 // Riga X4 attiva
         {
         OUT0_7 = 0xB3;                         // Tasto 2 (keypad)
         OUT8 = 0;
         }
         else if (TASTO_GIU == 0xEF)                 // Riga X3 attiva
         {
         OUT0_7 = 0x8B;                         // Tasto B
         OUT8 = 0;
         }
         else if (TASTO_GIU == 0xDF)                 // Riga X2 attiva
         {
         OUT0_7 = 0x63;                         // Tasto F
         OUT8 = 0;
         }
         else if (TASTO_GIU == 0xBF)                 // Riga X1 attiva
         {
         OUT0_7 = 0x3B;                         // Tasto R
         OUT8 = 0;
         }
         else if (TASTO_GIU == 0x7F)                 // Riga X0 attiva
         {
         OUT0_7 = 0x13;                         // Tasto 4$
         OUT8 = 0;
         }
       }
 
       else if (C_ROTATE == 0xF7)                    // Interrogata 
Colonna Y3
       {
         if (TASTO_GIU == 0xFE)                 // Riga X7 attiva
         {
         OUT0_7 = 0x27;                         // Tasto - (keypad)
         OUT8 = 1;
         }
         else if (TASTO_GIU == 0xFD)                 // Riga X6 attiva
         {
         OUT0_7 = 0xFF;                         // Tasto 9 (keypad)
         OUT8 = 0;
         }
         else if (TASTO_GIU == 0xFB)                 // Riga X5 attiva
         {
         OUT0_7 = 0xD7;                         // Tasto 5 (keypad)
         OUT8 = 0;
         }
         else if (TASTO_GIU == 0xF7)                 // Riga X4 attiva
         {
         OUT0_7 = 0xAF;                         // Tasto 1 (keypad)
         OUT8 = 0;
         }
         else if (TASTO_GIU == 0xEF)                 // Riga X3 attiva
         {
         OUT0_7 = 0x87;                         // Tasto V
         OUT8 = 0;
         }
         else if (TASTO_GIU == 0xDF)                 // Riga X2 attiva
         {
         OUT0_7 = 0x5F;                         // Tasto H
         OUT8 = 0;
         }
         else if (TASTO_GIU == 0xBF)                 // Riga X1 attiva
         {
         OUT0_7 = 0x37;                         // Tasto E
         OUT8 = 0;
         }
         else if (TASTO_GIU == 0x7F)                 // Riga X0 attiva
         {
         OUT0_7 = 0x0F;                         // Tasto 3#
         OUT8 = 0;
         }
       }
 
       else if (C_ROTATE == 0xFB)                    // Interrogata 
Colonna Y2
       {
         if (TASTO_GIU == 0xFE)                 // Riga X7 attiva
         {
         OUT0_7 = 0x23;                         // Tasto ( (keypad)
         OUT8 = 1;
         }
         else if (TASTO_GIU == 0xFD)                 // Riga X6 attiva
         {
         OUT0_7 = 0xFB;                         // Tasto  8 (keypad)
         OUT8 = 0;
         }
         else if (TASTO_GIU == 0xFB)                 // Riga X5 attiva
         {
         OUT0_7 = 0xD3;                         // Tasto 4 (keypad)
         OUT8 = 0;
         }
         else if (TASTO_GIU == 0xF7)                 // Riga X4 attiva
         {
         OUT0_7 = 0xAB;                         // Tasto 0 (keypad)
         OUT8 = 0;
         }
         else if (TASTO_GIU == 0xEF)                 // Riga X3 attiva
         {
         OUT0_7 = 0x83;                         // Tasto C
         OUT8 = 0;
         }
         else if (TASTO_GIU == 0xDF)                 // Riga X2 attiva
         {
         OUT0_7 = 0x5B;                         // Tasto S
         OUT8 = 0;
         }
         else if (TASTO_GIU == 0xBF)                 // Riga X1 attiva
         {
         OUT0_7 = 0x33;                         // Tasto W
         OUT8 = 0;
         }
         else if (TASTO_GIU == 0x7F)                 // Riga X0 attiva
         {
         OUT0_7 = 0x0B;                         // Tasto 2@
         OUT8 = 0;
         }
       }
 
       else if (C_ROTATE == 0xFD)                    // Interrogata 
Colonna Y1
       {
         if (TASTO_GIU == 0xEF)                 // Riga X3 attiva
         {
         OUT0_7 = 0x7F;                         // Tasto X
         OUT8 = 0;
         }
         else if (TASTO_GIU == 0xDF)                 // Riga X2 attiva
         {
         OUT0_7 = 0x57;                         // Tasto D
         OUT8 = 0;
         }
         else if (TASTO_GIU == 0xBF)                 // Riga X1 attiva
         {
         OUT0_7 = 0x2F;                         // Tasto Q
         OUT8 = 0;
         }
         else if (TASTO_GIU == 0x7F)                 // Riga X0 attiva
         {
         OUT0_7 = 0x07;                         // Tasto 1!
         OUT8 = 0;
         }
       }
 
       else if (C_ROTATE == 0xFE)                    // Interrogata 
Colonna Y0
       {
         if (TASTO_GIU == 0xFE)                 // Riga X7 attiva
         {
         OUT0_7 = 0xCF;                         // Tasto ESC (keypad)
         OUT8 = 0;
         }
         else if (TASTO_GIU == 0xFD)                 // Riga X6 attiva
         {
         OUT0_7 = 0xF3;                         // Tasto * (keypad)
         OUT8 = 0;
         }
         else if (TASTO_GIU == 0xFB)                 // Riga X5 attiva
         {
         OUT0_7 = 0xCB;                         // Tasto ) (keypad)
         OUT8 = 0;
         }
         else if (TASTO_GIU == 0xF7)                 // Riga X4 attiva
         {
         OUT0_7 = 0xA3;                         // Tasto / (keypad)
         OUT8 = 0;
         }
         else if (TASTO_GIU == 0xEF)                 // Riga X3 attiva
         {
         OUT0_7 = 0x7B;                         // Tasto Z
         OUT8 = 0;
         }
         else if (TASTO_GIU == 0xDF)                 // Riga X2 attiva
         {
         OUT0_7 = 0x53;                         // Tasto A
         OUT8 = 0;
         }
         else if (TASTO_GIU == 0xBF)                 // Riga X1 attiva
         {
         OUT0_7 = 0x2B;                         // Tasto Tab
         OUT8 = 0;
         }
         else if (TASTO_GIU == 0x7F)                 // Riga X0 attiva
         {
         OUT0_7 = 0x03;                         // Tasto ESC (keyboard)
         OUT8 = 0;
         }
       }
 
      else  if (A_OUT == 0x20)                       // Interrogata 
Colonna Y8
       {
         if (TASTO_GIU == 0xFD)                 // Riga X6 attiva
         {
         OUT0_7 = 0x13;                         // Tasto Space
         OUT8 = 1;
         }
         else if (TASTO_GIU == 0xFB)                 // Riga X5 attiva
         {
         OUT0_7 = 0xEB;                         // Tasto [{
         OUT8 = 0;
         }
         else if (TASTO_GIU == 0xF7)                 // Riga X4 attiva
         {
         OUT0_7 = 0xC3;                         // Tasto 0)
         OUT8 = 0;
         }
         else if (TASTO_GIU == 0xEF)                 // Riga X3 attiva
         {
         OUT0_7 = 0x9B;                         // Tasto .>
         OUT8 = 0;
         }
         else if (TASTO_GIU == 0xDF)                 // Riga X2 attiva
         {
         OUT0_7 = 0x73;                         // Tasto ;:
         OUT8 = 0;
         }
         else if (TASTO_GIU == 0xBF)                 // Riga X1 attiva
         {
         OUT0_7 = 0x4B;                         // Tasto I
         OUT8 = 0;
         }
         else if (TASTO_GIU == 0x7F)                 // Riga X0 attiva
         {
         OUT0_7 = 0x23;                         // Tasto 8*
         OUT8 = 0;
         }
       }
 
       else if (A_OUT == 0x10)                       // Interrogata 
Colonna Y9
       {
         if (TASTO_GIU == 0xFD)                 // Riga X6 attiva
         {
         OUT0_7 = 0x17;                         // Tasto '"
         OUT8 = 1;
         }
         else if (TASTO_GIU == 0xFB)                 // Riga X5 attiva
         {
         OUT0_7 = 0xEF;                         // Tasto ]}
         OUT8 = 0;
         }
         else if (TASTO_GIU == 0xF7)                 // Riga X4 attiva
         {
         OUT0_7 = 0xC7;                         // Tasto -_
         OUT8 = 0;
         }
         else if (TASTO_GIU == 0xEF)                 // Riga X3 attiva
         {
         OUT0_7 = 0x9F;                         // Tasto /?
         OUT8 = 0;
         }
         else if (TASTO_GIU == 0xDF)                 // Riga X2 attiva
         {
         OUT0_7 = 0x77;                         // Tasto L
         OUT8 = 0;
         }
         else if (TASTO_GIU == 0xBF)                 // Riga X1 attiva
         {
         OUT0_7 = 0x4F;                         // Tasto O
         OUT8 = 0;
         }
         else if (TASTO_GIU == 0x7F)                 // Riga X0 attiva
         {
         OUT0_7 = 0x27;                         // Tasto 9(
         OUT8 = 0;
         }
       }
       }
 
  // Controllo combinazione con tasti Shift e Ctrl
 
       if (Shft_DN & !Ctrl_DN) OUT0_7 = OUT0_7 - 1;
       else if (!Shft_DN & Ctrl_DN) OUT0_7 = OUT0_7 - 3;
       else if (Shft_DN & Ctrl_DN) OUT0_7 = OUT0_7 - 2;
 
       delay_us(50);
 
  // Invio codice tasto premuto
 
       KSTRD = 1;
       KSTRD = 0;
       delay_us(50);
 
       if (OUT0_7 == CHT[EGG1]) EGG1++;
       else EGG1 = 0;
 
       if (EGG1 == 13) EASTER1();
 
}
 
 
 
 
 
/*
 
Contenuto della Keyboard ROM Apple:
Per ogni gruppo consecutivo di 4 bytes esistono i codici relativi ad ogni
singolo tasto, anche in combinazione con i tasti Shift e Control, secondo
il seguente prospetto:
 
    BASE     = Tasto premuto insieme a Ctrl
    BASE + 1 = Tasto premuto insieme a Shift + Ctrl
    BASE + 2 = Tasto premuto insieme a Shift
    BASE + 3 = Tasto semplice
 
Gli indirizzi seguenti sono generati dall'encoder tastiera e i bytes 
rispettivi
sono il contenuto della Keyboard ROM:
 
00000000 1b 1b 1b 1b 31 26 31 26 32 22 32 22 33 27 33 27 ....1&1&2"2"3'3'
00000010 34 28 34 28 36 7d 36 7d 1c 1c 35 5c 37 29 37 29 4(4(6}6}..5\7)7)
00000020 38 23 38 23 39 7b 39 7b 09 09 09 09 11 11 51 51 8#8#9{9{......QQ
00000030 1a 1a 5a 5a 05 05 45 45 12 12 52 52 19 19 59 59 ..ZZ..EE..RR..YY
00000040 14 14 54 54 15 15 55 55 09 09 49 49 0f 0f 4f 4f ..TT..UU..II..OO
00000050 01 01 41 41 04 04 44 44 13 13 53 53 08 08 48 48 ..AA..DD..SS..HH
00000060 06 06 46 46 07 07 47 47 0a 0a 4a 4a 0b 0b 4b 4b ..FF..GG..JJ..KK
00000070 0d 0d 4d 4d 0c 0c 4c 4c 17 17 57 57 18 18 58 58 ..MM..LL..WW..XX
00000080 03 03 43 43 16 16 56 56 02 02 42 42 0e 0e 4e 4e ..CC..VV..BB..NN
00000090 3f 2c 3f 2c 2e 3b 2e 3b 2f 3a 2f 3a 21 7c 21 7c ?,?,.;.;/:/:!|!|
000000a0 2f 2f 2f 2f 08 08 08 08 30 30 30 30 31 31 31 31 ////....00001111
000000b0 32 32 32 32 33 33 33 33 1b 00 5b 40 2b 3d 2b 3d 22223333..[@+=+=
000000c0 1d 1d 30 5d 1f 1f 5f 2d 29 29 29 29 1b 1b 1b 1b ..0].._-))))....
000000d0 34 34 34 34 35 35 35 35 36 36 36 36 37 37 37 37 4444555566667777
000000e0 3e 3c 3e 3c 10 10 50 50 1e 1e 5e 7e 2a 24 2a 24 ><><..PP..^~*$*$
000000f0 2a 2a 2a 2a 15 15 15 15 38 38 38 38 39 39 39 39 ****....88889999
00000100 2e 2e 2e 2e 2b 2b 2b 2b 0d 0d 0d 0d 0b 0b 0b 0b ....++++........
00000110 20 20 20 20 25 60 25 60 3f 3f 3f 3f 20 20 20 20 %`%`????
00000120 28 28 28 28 2d 2d 2d 2d 0d 0d 0d 0d 2c 2c 2c 2c ((((----....,,,,
00000130 7f 7f 7f 7f 0a 0a 0a 0a 08 08 08 08 15 15 15 15 iiii............
00000140 20 20 20 4a 20 20 4f 20 20 48 20 20 4e 20 20 20 J O H N
00000150 20 20 20 20 20 20 20 20 20 20 20 4d 20 20 41 20 M A
00000160 20 43 20 20 44 20 20 20 a0 a0 a0 a0 a0 a0 a0 a0 C D
00000170 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0
00000180 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0
00000190 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0
000001a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0
000001b0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0
000001c0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0
000001d0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0
000001e0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0
000001f0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0
00000200 1b 1b 1b 1b 31 26 31 26 32 22 32 22 33 27 33 27 ....1&1&2"2"3'3'
00000210 34 28 34 28 36 7d 36 7d 1c 1c 35 5c 37 29 37 29 4(4(6}6}..5\7)7)
00000220 38 23 38 23 39 7b 39 7b 09 09 09 09 11 11 51 71 8#8#9{9{......Qq
00000230 1a 1a 5a 7a 05 05 45 65 12 12 52 72 19 19 59 79 ..Zz..Ee..Rr..Yy
00000240 14 14 54 74 15 15 55 75 09 09 49 69 0f 0f 4f 6f ..Tt..Uu..Ii..Oo
00000250 01 01 41 61 04 04 44 64 13 13 53 73 08 08 48 68 ..Aa..Dd..Ss..Hh
00000260 06 06 46 66 07 07 47 67 0a 0a 4a 6a 0b 0b 4b 6b ..Ff..Gg..Jj..Kk
00000270 0d 0d 4d 6d 0c 0c 4c 6c 17 17 57 77 18 18 58 78 ..Mm..Ll..Ww..Xx
00000280 03 03 43 63 16 16 56 76 02 02 42 62 0e 0e 4e 6e ..Cc..Vv..Bb..Nn
00000290 3f 2c 3f 2c 2e 3b 2e 3b 2f 3a 2f 3a 21 7c 21 7c ?,?,.;.;/:/:!|!|
000002a0 2f 2f 2f 2f 08 08 08 08 30 30 30 30 31 31 31 31 ////....00001111
000002b0 32 32 32 32 33 33 33 33 1b 00 5b 40 2b 3d 2b 3d 22223333..[@+=+=
000002c0 1d 1d 30 5d 1f 1f 5f 2d 29 29 29 29 1b 1b 1b 1b ..0].._-))))....
000002d0 34 34 34 34 35 35 35 35 36 36 36 36 37 37 37 37 4444555566667777
000002e0 3e 3c 3e 3c 10 10 50 70 1e 1e 5e 7e 2a 24 2a 24 ><><..Pp..^~*$*$
000002f0 2a 2a 2a 2a 15 15 15 15 38 38 38 38 39 39 39 39 ****....88889999
00000300 2e 2e 2e 2e 2b 2b 2b 2b 0d 0d 0d 0d 0b 0b 0b 0b ....++++........
00000310 20 20 20 20 25 60 25 60 3f 3f 3f 3f 20 20 20 20 %`%`????
00000320 28 28 28 28 2d 2d 2d 2d 0d 0d 0d 0d 2c 2c 2c 2c ((((----....,,,,
00000330 7f 7f 7f 7f 0a 0a 0a 0a 08 08 08 08 15 15 15 15 iiii............
00000340 20 20 20 4a 20 20 4f 20 20 48 20 20 4e 20 20 20 J O H N
00000350 20 20 20 20 20 20 20 20 20 20 20 4d 20 20 41 20 M A
00000360 20 43 20 20 44 20 20 20 a0 a0 a0 a0 a0 a0 a0 a0 C D
00000370 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0
00000380 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0
00000390 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0
000003a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0
000003b0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0
000003c0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0
000003d0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0
000003e0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0
000003f0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0
00000400 1b 1b 1b 1b 21 31 21 31 00 00 40 32 23 33 23 33 ....!1!1..@2#3#3
00000410 24 34 24 34 1e 1e 5e 36 25 35 25 35 26 37 26 37 $4$4..^6%5%5&7&7
00000420 2a 38 2a 38 28 39 28 39 09 09 09 09 11 11 51 51 *8*8(9(9......QQ
00000430 17 17 57 57 05 05 45 45 12 12 52 52 19 19 59 59 ..WW..EE..RR..YY
00000440 14 14 54 54 15 15 55 55 09 09 49 49 0f 0f 4f 4f ..TT..UU..II..OO
00000450 01 01 41 41 04 04 44 44 13 13 53 53 08 08 48 48 ..AA..DD..SS..HH
00000460 06 06 46 46 07 07 47 47 0a 0a 4a 4a 0b 0b 4b 4b ..FF..GG..JJ..KK
00000470 3a 3b 3a 3b 0c 0c 4c 4c 1a 1a 5a 5a 18 18 58 58 :;:;..LL..ZZ..XX
00000480 03 03 43 43 16 16 56 56 02 02 42 42 0e 0e 4e 4e ..CC..VV..BB..NN
00000490 0d 0d 4d 4d 3c 2c 3c 2c 3e 2e 3e 2e 3f 2f 3f 2f ..MM<,<,>.>.?/?/
000004a0 2f 2f 2f 2f 08 08 08 08 30 30 30 30 31 31 31 31 ////....00001111
000004b0 32 32 32 32 33 33 33 33 7e 60 7e 60 2b 3d 2b 3d 22223333~`~`+=+=
000004c0 29 30 29 30 1f 1f 5f 2d 29 29 29 29 1b 1b 1b 1b )0)0.._-))))....
000004d0 34 34 34 34 35 35 35 35 36 36 36 36 37 37 37 37 4444555566667777
000004e0 1c 1c 7c 5c 10 10 50 50 1b 1b 7b 5b 1d 1d 7d 5d ..|\..PP..{[..}]
000004f0 2a 2a 2a 2a 15 15 15 15 38 38 38 38 39 39 39 39 ****....88889999
00000500 2e 2e 2e 2e 2b 2b 2b 2b 0d 0d 0d 0d 0b 0b 0b 0b ....++++........
00000510 20 20 20 20 22 27 22 27 3f 3f 3f 3f 20 20 20 20 "'"'????
00000520 28 28 28 28 2d 2d 2d 2d 0d 0d 0d 0d 2c 2c 2c 2c ((((----....,,,,
00000530 7f 7f 7f 7f 0a 0a 0a 0a 08 08 08 08 15 15 15 15 iiii............
00000540 20 20 20 4a 20 20 4f 20 20 48 20 20 4e 20 20 20 J O H N
00000550 20 20 20 20 20 20 20 20 20 20 20 4d 20 20 41 20 M A
00000560 20 43 20 20 44 20 20 20 a0 a0 a0 a0 a0 a0 a0 a0 C D
00000570 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0
00000580 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0
00000590 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0
000005a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0
000005b0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0
000005c0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0
000005d0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0
000005e0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0
000005f0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0
00000600 1b 1b 1b 1b 21 31 21 31 00 00 40 32 23 33 23 33 ....!1!1..@2#3#3
00000610 24 34 24 34 1e 1e 5e 36 25 35 25 35 26 37 26 37 $4$4..^6%5%5&7&7
00000620 2a 38 2a 38 28 39 28 39 09 09 09 09 11 11 51 71 *8*8(9(9......Qq
00000630 17 17 57 77 05 05 45 65 12 12 52 72 19 19 59 79 ..Ww..Ee..Rr..Yy
00000640 14 14 54 74 15 15 55 75 09 09 49 69 0f 0f 4f 6f ..Tt..Uu..Ii..Oo
00000650 01 01 41 61 04 04 44 64 13 13 53 73 08 08 48 68 ..Aa..Dd..Ss..Hh
00000660 06 06 46 66 07 07 47 67 0a 0a 4a 6a 0b 0b 4b 6b ..Ff..Gg..Jj..Kk
00000670 3a 3b 3a 3b 0c 0c 4c 6c 1a 1a 5a 7a 18 18 58 78 :;:;..Ll..Zz..Xx
00000680 03 03 43 63 16 16 56 76 02 02 42 62 0e 0e 4e 6e ..Cc..Vv..Bb..Nn
00000690 0d 0d 4d 6d 3c 2c 3c 2c 3e 2e 3e 2e 3f 2f 3f 2f ..Mm<,<,>.>.?/?/
000006a0 2f 2f 2f 2f 08 08 08 08 30 30 30 30 31 31 31 31 ////....00001111
000006b0 32 32 32 32 33 33 33 33 7e 60 7e 60 2b 3d 2b 3d 22223333~`~`+=+=
000006c0 29 30 29 30 1f 1f 5f 2d 29 29 29 29 1b 1b 1b 1b )0)0.._-))))....
000006d0 34 34 34 34 35 35 35 35 36 36 36 36 37 37 37 37 4444555566667777
000006e0 1c 1c 7c 5c 10 10 50 70 1b 1b 7b 5b 1d 1d 7d 5d ..|\..Pp..{[..}]
000006f0 2a 2a 2a 2a 15 15 15 15 38 38 38 38 39 39 39 39 ****....88889999
00000700 2e 2e 2e 2e 2b 2b 2b 2b 0d 0d 0d 0d 0b 0b 0b 0b ....++++........
00000710 20 20 20 20 22 27 22 27 3f 3f 3f 3f 20 20 20 20 "'"'????
00000720 28 28 28 28 2d 2d 2d 2d 0d 0d 0d 0d 2c 2c 2c 2c ((((----....,,,,
00000730 7f 7f 7f 7f 0a 0a 0a 0a 08 08 08 08 15 15 15 15 iiii............
00000740 20 20 20 4a 20 20 4f 20 20 48 20 20 4e 20 20 20 J O H N
00000750 20 20 20 20 20 20 20 20 20 20 20 4d 20 20 41 20 M A
00000760 20 43 20 20 44 20 20 20 a0 a0 a0 a0 a0 a0 a0 a0 C D
00000770 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0
00000780 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0
00000790 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0
000007a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0
000007b0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0
000007c0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0 a0
000007d0 a0 a0 a0 a0 a0 a0 a0 a0 33 34 31 2d 30 31 35 34 341-0154
000007e0 41 a0 a0 43 4f 50 59 52 49 47 48 54 a0 41 50 50 A COPYRIGHT APP
000007f0 4c 45 a0 43 4f 4d 50 55 54 45 52 a0 31 39 38 32 LE COMPUTER 1982
 
 
Paolo Carrer 2012
paol...@alice.it
 
 
*/
 
 
 
 
void EASTER1 (void)
{
      const char PRG[] = 
{0xfe,0x64,0x64,0x64,0x7c,0x2b,0x8e,0x36,0x32,0x2b,0x07,
 
0xc3,0x66,0x3a,0x2b,0x0b,0xc3,0x62,0x4e,0x3a,0x82,0xbf,0x07,0x42,0x4e,0x07,
 
0x1b,0x2b,0x0f,0xc3,0x82,0x4e,0x76,0x4e,0x3a,0xbf,0x82,0x2b,0x13,0xc3,0x62,
 
0x4e,0x3a,0x3e,0xbf,0xc3,0x42,0x4e,0x07,0x2b,0x1b,0xc3,0x62,0x4e,0x3a,0x7e,
 
0xbf,0xc3,0x42,0x4e,0x0f,0x27,0x2b,0x17,0xc3,0xe6,0x76,0x4e,0x42,0x7e,0x97,
 
0xfd,0x3e,0xbe,0x26,0x26,0x82,0xc7,0x07,0xc2,0x22,0x0b,0xc2,0x2b,0x1f,0xc3,
 
0x8e,0x36,0x7e,0x42,0x7e,0x2b,0x23,0xc3,0x8e,0x36,0x7e,0x42,0x3e,0x2b,0x27,
 
0xc3,0x8e,0x36,0x7e,0x42,0x82,0x2b,0xfd,0x76,0x4a,0x5a,0x42,0x2b,0xfd,0x3a,
 
0x46,0x8e,0x2b,0xff,0x8e,0x36,0x32,0x2b,0x72,0xc7,0xc2,0xfe,0x5e,0x37,0x3b,
 
0x57,0x33,0x53,0x3b,0x37,0xfe,0xfd,0xa7,0xa7,0xa7,0xa7,0xa7,0xa7,0xa7,0xa7,
 
0x53,0x3b,0x57,0x33,0x53,0x3b,0x37,0xfe,0x1e,0xfe,0x5a,0x4f,0x63,0x43,0x33,
 
0x53,0x3b,0x37,0xfe,0x57,0x37,0x5b,0x4b,0x67,0x8f,0xfe,0x7c,0xfe,0xfe,0xfe,
 
0xfe,0x8b,0x3f,0xfe,0xe6,0x53,0x4f,0x77,0x4f,0xfe,0x82,0x53,0x3b,0x3b,0x37,
 
0x3b,0xfe,0xfe,0xc7,0xfe,0xfe,0x4a,0x43,0x53,0x77,0x4b,0x53,0xfe,0xfe,0x64,
      0x64,0x7c,0xff};
 
      unsigned char K;
      EGG1 = 0;
 
      K=0;
 
      delay_ms(3000);
 
      while (PRG[K] != 0xff)
      {
 
      if (PRG[K] == 0xfe)
      {
         OUT0_7 = 0x13;
         OUT8 = 1;
      }
      else
      {
         OUT0_7 = PRG[K];
         OUT8 = 0;
      }
 
      if (PRG[K] == 0x2b)
      {
         OUT8 = 1;
         delay_ms(6000);
      }
 
      if (PRG[K] == 0xfd) delay_ms(20000);
      else SENDKEY();
 
      if (PRG[K] == 0xc3) delay_ms(3600);
 
      K++;
      if (PRG[K] == 0x64) delay_ms(300);
      else delay_ms(2000);
      }
 
      K++;
 
      delay_ms(65000);
 
      while (PRG[K] != 0xff)
      {
 
      if (PRG[K] == 0xfe)
      {
         OUT0_7 = 0x13;
         OUT8 = 1;
      }
      else
      {
         OUT0_7 = PRG[K];
         OUT8 = 0;
      }
 
      if (PRG[K] == 0x2b)
      {
         OUT8 = 1;
         delay_ms(8000);
      }
      if (PRG[K] == 0xfd) delay_ms(15000);
      else SENDKEY();
 
      K++;
      delay_ms(1000);
      }
}
 
 
 
void WELCOME (void)
{
      const char WLC[] = 
{0x13,0xbe,0xfe,34,0xc7,0xbe,0xfe,4,0x13,0xe2,0xfe,34,
 
0x13,0xe2,0xfe,4,0x13,0xe2,0x13,0x52,0xe7,0xe7,0x77,0x37,0x13,0xef,0xeb,
 
0x37,0x13,0x6f,0x37,0x3f,0x8b,0x4f,0x53,0x3b,0x57,0x13,0x83,0x4f,0x8f,0x43,
 
0x3b,0x4f,0x77,0x77,0x37,0x3b,0x13,0x0b,0x13,0x13,0xe2,0xfe,4,0x13,0xe2,
 
0xfe,34,0x13,0xe2,0xfe,4,0x13,0xbe,0xfe,9,0xc7,0x13,0x8b,0x3f,0x13,0xe6,
 
0x53,0x4f,0x77,0x4f,0x13,0x82,0x53,0x3b,0x3b,0x37,0x3b,0x13,0x0b,0xc3,0x07,
      0x0b,0x13,0xfe,3,0xc7,0xbe,0x03,0x93,0x03,0x7c,0xff};
 
      unsigned char K,L;
      delay_ms(4000);
 
      K=0;
 
      while (WLC[K] != 0xff)
      {
      while (WLC[K] != 0xfe & WLC[K] != 0xff)
      {
      OUT0_7 = WLC[K];
      if (WLC[K] == 0x13) OUT8 = 1;
      else OUT8 = 0;
 
      SENDKEY();
 
      K++;
      }
 
      if (WLC[K] != 0xff)
      {
      if (WLC[K] == 0xfe) K++;
      L = WLC[K];
      K++;
      do
          {
          OUT0_7 = WLC[K];
          if (WLC[K] == 0x13) OUT8 = 1;
          else OUT8 = 0;
 
          SENDKEY();
 
          L--;
          }
      while (L!=0);
      K++;
      }
      }
}
 
 
 
void SENDKEY (void)
{
      AKD = 1;
      KSTRD = 1;
      KSTRD = 0;
      delay_us(5000);
      AKD = 0;
      delay_us(5000);
}

 e al codice .hex
 
scusa, ma tutti quegli elseif.... non era meglio select...case ?
 
per il resto, easter() sarebbe il c.d. Terry's (o teri's ?) exercise ? 
(IIRC attivato premendo ctrl-mela-mela durante il boot in alcuni Apple)
 
Saluti,
dott. Piergiorgio.
 
 

 void EASTER2 (void);
 
Questa funzione non la usi, puoi rimuovere il prototipo :-)


 
ciao!
 


 
l'ho predisposta per i volonterosi :-)
 
ciao.
 

 non fare il sofisticato, io sono un novellino del C! :-)
 
 
Mi sa che non sei l'unico...
 
 
-- 
"640K dovrebbero essere sufficienti per chiunque"
 
              (No, Bill Gates non l'ha mai detto)

> Forse intendi "switch" ?
 
lo switch è in C, il select in VB

 e al codice .hex
 
Done.   :)