kopia lustrzana https://github.com/Jean-MarcHarvengt/MCUME
99 wiersze
4.4 KiB
C
99 wiersze
4.4 KiB
C
![]() |
/** EMULib Emulation Library *********************************/
|
||
|
/** **/
|
||
|
/** AY8910.h **/
|
||
|
/** **/
|
||
|
/** This file contains emulation for the AY8910 sound chip **/
|
||
|
/** produced by General Instruments, Yamaha, etc. See **/
|
||
|
/** AY8910.c for the actual code. **/
|
||
|
/** **/
|
||
|
/** Copyright (C) Marat Fayzullin 1996-2014 **/
|
||
|
/** You are not allowed to distribute this software **/
|
||
|
/** commercially. Please, notify me, if you make any **/
|
||
|
/** changes to this file. **/
|
||
|
/*************************************************************/
|
||
|
#ifndef AY8910_H
|
||
|
#define AY8910_H
|
||
|
#ifdef __cplusplus
|
||
|
extern "C" {
|
||
|
#endif
|
||
|
|
||
|
#define AY8910_CHANNELS 6 /* 3 melodic + 3 noise chanls */
|
||
|
|
||
|
#define AY8910_ASYNC 0 /* Asynchronous emulation */
|
||
|
#define AY8910_SYNC 1 /* Synchronous emulation */
|
||
|
#define AY8910_FLUSH 2 /* Flush buffers only */
|
||
|
#define AY8910_DRUMS 0x80 /* Hit drums for noise chnls */
|
||
|
|
||
|
#ifndef BYTE_TYPE_DEFINED
|
||
|
#define BYTE_TYPE_DEFINED
|
||
|
typedef unsigned char byte;
|
||
|
#endif
|
||
|
|
||
|
/** AY8910 ***************************************************/
|
||
|
/** This data structure stores AY8910 state. **/
|
||
|
/*************************************************************/
|
||
|
typedef struct
|
||
|
{
|
||
|
byte R[16]; /* PSG registers contents */
|
||
|
int Freq[AY8910_CHANNELS]; /* Frequencies (0 for off) */
|
||
|
int Volume[AY8910_CHANNELS]; /* Volumes (0..255) */
|
||
|
int Clock; /* Base clock used by PSG */
|
||
|
int First; /* First used Sound() channel */
|
||
|
byte Changed; /* Bitmap of changed channels */
|
||
|
byte Sync; /* AY8910_SYNC/AY8910_ASYNC */
|
||
|
byte Latch; /* Latch for the register num */
|
||
|
int EPeriod; /* Envelope step in msecs */
|
||
|
int ECount; /* Envelope step counter */
|
||
|
int EPhase; /* Envelope phase */
|
||
|
} AY8910;
|
||
|
|
||
|
/** Reset8910() **********************************************/
|
||
|
/** Reset the sound chip and use sound channels from the **/
|
||
|
/** one given in First. **/
|
||
|
/*************************************************************/
|
||
|
void Reset8910(register AY8910 *D,int ClockHz,int First);
|
||
|
|
||
|
/** Write8910() **********************************************/
|
||
|
/** Call this function to output a value V into the sound **/
|
||
|
/** chip. **/
|
||
|
/*************************************************************/
|
||
|
void Write8910(register AY8910 *D,register byte R,register byte V);
|
||
|
|
||
|
/** WrCtrl8910() *********************************************/
|
||
|
/** Write a value V to the PSG Control Port. **/
|
||
|
/*************************************************************/
|
||
|
void WrCtrl8910(AY8910 *D,byte V);
|
||
|
|
||
|
/** WrData8910() *********************************************/
|
||
|
/** Write a value V to the PSG Data Port. **/
|
||
|
/*************************************************************/
|
||
|
void WrData8910(AY8910 *D,byte V);
|
||
|
|
||
|
/** RdData8910() *********************************************/
|
||
|
/** Read a value from the PSG Data Port. **/
|
||
|
/*************************************************************/
|
||
|
byte RdData8910(AY8910 *D);
|
||
|
|
||
|
/** Sync8910() ***********************************************/
|
||
|
/** Flush all accumulated changes by issuing Sound() calls **/
|
||
|
/** and set the synchronization on/off. The second argument **/
|
||
|
/** should be AY8910_SYNC/AY8910_ASYNC to set/reset sync, **/
|
||
|
/** or AY8910_FLUSH to leave sync mode as it is. To emulate **/
|
||
|
/** noise channels with MIDI drums, OR second argument with **/
|
||
|
/** AY8910_DRUMS. **/
|
||
|
/*************************************************************/
|
||
|
void Sync8910(register AY8910 *D,register byte Sync);
|
||
|
|
||
|
/** Loop8910() ***********************************************/
|
||
|
/** Call this function periodically to update volume **/
|
||
|
/** envelopes. Use mS to pass the time since the last call **/
|
||
|
/** of Loop8910() in milliseconds. **/
|
||
|
/*************************************************************/
|
||
|
void Loop8910(register AY8910 *D,int mS);
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
}
|
||
|
#endif
|
||
|
#endif /* AY8910_H */
|
||
|
|