/*---------------------------------------------------------------------------
 * Dateiname   : beep.c
 * Version     : 0.7
 * Zweck       : Implementation der Sound-Funktionen
 * Organiation : Fachhochschule Hamburg
 * Autor       : Clemens Drews
 * Datum       : 2.12.97
 *---------------------------------------------------------------------------
 */
#include "beep.h"

extern int timer_ticks ;


volatile static simstruct * sim = (simstruct *) 0xFFFA00 ;

int getTime(){
  return timer_ticks ;
}   

void delay ( unsigned int h_sec  ){
  int tmp ;
  tmp = getTime() ;
  while( getTime() < (tmp+h_sec) ){
    asm(" nop");
  }
}

void beep( int Hz , int len ){
  /* Prec: Hz < 500 */
  int i , j , T ;
  const int prop = 72 ;
  sim->PEPAR=sim->PEPAR&(~PORTE3) ;   /* PE3 = io     */
  sim->DDRE=sim->DDRE|PORTE3 ;        /* PE3 = output */
  T = 10000/Hz ;                       /* Periode in ms */
  for( i=getTime() ; len>(getTime()-i);){
    sim->PORTE=sim->PORTE|PORTE3 ;    /* Piezo = High */
    for(j=0;j<T*prop/2;j++)
      asm( " NOP");
    sim->PORTE=sim->PORTE&(~PORTE3) ; /* Piezo = Low  */
    for(j=0;j<T*prop/2;j++)
      asm( " NOP");
  }
}

void spiffySound( int len ){
  /* Prec: Hz < 500 */
  int i , j ;
  sim->PEPAR=sim->PEPAR&(~PORTE3) ;   /* PE3 = io     */
  sim->DDRE=sim->DDRE|PORTE3 ;        /* PE3 = output */
  for( i=getTime() ; len>(getTime()-i);){
    sim->PORTE=sim->PORTE|PORTE3 ;    /* Piezo = High */
    for(j=0;j<(getTime()-i);j++)
      asm( " NOP");
    sim->PORTE=sim->PORTE&(~PORTE3) ; /* Piezo = Low  */
    for(j=0;j<(getTime()-i);j++)
      asm( " NOP");
  }
}
