/*
Listato 4: midi_routs.c
*/
/********************************************************************
 * midi_routs.c
 *
 * Alcune routinedi livello estremamente basso usate per testare
 * l'interfacccia MIDI.
 *
 * Compilare con   cc -n midi_routs
 *
 * Storia:
 *  21-04-89 creato da Steve Simpson
 *
 ********************************************************************/

#include "midi.h"

/* custom - indirizza la base dell'area registri dei chip custom */

/********************************************************************
 * midi_init()
 *
 * Inizializza l'interfaccia MIDI impostando la baud rate UART dei
 * custom chip a 31250 baud
 *
 * Il valore MIDI_BAUD e' derivato dall'equazione di pagina 199 del 
 * libro "Amiga System Programmer's Guide della Abacus.
 *
 ********************************************************************/

VOID midi_init()
{
/* stabilisce la baud rate (31250 baud)
 * impostiamo UART per la trasmissione a 8 bit */

custom.serper = MIDI_BAUD;

/* azzera il bit RBF in INTREQ (bit 11) e SERDATR */

custom.intreq = INTF_RBF;

} /* fine di midi_init() */



/********************************************************************
 * midi_send_byte()
 *
 * Invia un singolo byte MIDI.
 *
 *******************************************************************/

VOID midi_send_byte(b)
USHORT b;
{

/* Attende finche' il buffer di trasmissione e' vuoto */

midi_wait( TBEm );

/* pone il byte nel registro di trasmissione
 * abbiamo bisogno di impostare il bit 8 per indicare a UART
 * 8 bit di dati e 1 di stop */

custom.serdat = (b & 0xff) | 0x100;

} /* fine di midi_send_byte() */



/***********************************************ª***ª****************
 * midi_get_byte()
 *
 * Legge un singolo byte MIDI.
 *
 *******************************************************************/

VOID midi_get_byte()

{
USHORT b;

/* Attende finche' il buffer di ricezione e' vuoto */

midi_wait( RBFm );

/* copia il byte ricevuto */

b = custom.serdatr;

/* azzera il bit RBF in INTREQ ( bit 11) e SERDATR */

custom.intreq = INTF_RBF;

return(b);

} /* fine di midi_get_byte() */




/********************************************************************
 * midi_wait()
 *
 * Attende finche' il bit nel registro di stato viene posto a 1
 * per indicare una particolare condizione del buffer UART.
 *
 *******************************************************************/

VOID midi_wait(mask)
USHORT mask;

{
USHORT i;

/* attende finche' il bit e' impostato a 1 */

while((custom.serdatr & mask) == 0)
	{
	/* occorre un certo ritardo */
	
	for(i=0; i<10000;i++) ;
	}

} /* fine di midi_wait() */
