/************************************************************
 *
 * Alcuin: A HP48 emulator for Amiga Computer
 *
 * Copyright (c) 1995 by Stephan Schupfer <schupfer@sbox.tu-graz.ac.at>
 *
 */

#include "hp48.h"

#include <exec/types.h>
#include <exec/memory.h>
#include <devices/audio.h>

struct MsgPort *audport;
struct IOAudio *audout;
UBYTE *waveform;
char *APortName = "Alcuin Audio";
int audopen=0;

UBYTE Ton[16]={
	0,49,90,117,127,117,90,49,0,-49,-90,-117,-127,-117,-90,-49
};


/************************************************************/
void opensound()
{
int i;
UBYTE channel[]={1,2,4,8};

if ((audport = (struct MsgPort *) CreatePort(APortName,0))==NULL)
	stirb ("Can't create %s.",101,"MessagePort");
if ((audout= (struct IOAudio *) CreateIORequest(audport,sizeof(struct IOAudio))) ==NULL)
	stirb ("Can't create %s.",101,"AudioRequest");
audout->ioa_Request.io_Message.mn_ReplyPort   = audport;
audout->ioa_Request.io_Message.mn_Node.ln_Pri = 0;
audout->ioa_Request.io_Command                = ADCMD_ALLOCATE;
audout->ioa_Request.io_Flags                  = ADIOF_NOWAIT;
audout->ioa_AllocKey                          = 0;
audout->ioa_Data                              = channel;
audout->ioa_Length                            = sizeof(channel);
if ((audopen=!OpenDevice("audio.device",0,audout,0)) ==NULL) {
	sage ("Can't open %s.",100,"audio.device");
	}
audout->ioa_Request.io_Message.mn_ReplyPort=audport;
audout->ioa_Request.io_Command=CMD_WRITE;
audout->ioa_Request.io_Flags=ADIOF_PERVOL;
audout->ioa_Data=waveform;
audout->ioa_Length=8;
audout->ioa_Period=508;
audout->ioa_Volume=64;
audout->ioa_Cycles=50;
if ((waveform=(UBYTE *)AllocMem(16,MEMF_CHIP|MEMF_CLEAR))==NULL)
	stirb ("Can't alloc mem for %s.",102,"waveform");
for (i=0;i<16;i++) waveform[i]=Ton[i];
/*
waveform[0]=0;
waveform[1]=64;
waveform[2]=128;
waveform[3]=64;
waveform[0]=0;
waveform[1]=-64;
waveform[2]=-128;
waveform[3]=-64;
*/
}

/************************************************************/
void closesound()
{
if (audopen)		CloseDevice(audout);
if (audout)			DeleteIORequest(audout);
if (audport)		DeletePort(audport);
if (waveform)		FreeMem(waveform,16);
}

/************************************************************/
void check_out_register()
{
static int ON=0;

if (audopen) {
	if (ON>1) {ON--;return;}
	if (saturn_OUT[2] & 0x8) {
		if (!ON) {
			BeginIO(audout);
			}
		ON=20;
		}
	if (!(saturn_OUT[2] & 0x8) && ON) {
		WaitPort(audport);
		GetMsg(audport);
		ON=0;
		}
	}
}
/************************************************************/
