58 lines
1.6 KiB
C
58 lines
1.6 KiB
C
//
|
|
// Virtual AY-3-8910 Emulator
|
|
//
|
|
// by James Hammons
|
|
// (C) 2018 Underground Software
|
|
//
|
|
|
|
#ifndef VAY8910_H
|
|
#define VAY8910_H
|
|
|
|
#include <stdint.h>
|
|
|
|
struct VAY_3_8910
|
|
{
|
|
// User visible registers
|
|
uint16_t period[3]; // Channel A-C period
|
|
int16_t volume[3]; // Channel A-C volume (non-envelope mode)
|
|
bool envEnable[3]; // Channel A-C envelope enable
|
|
bool toneEnable[3]; // Channel A-C tone enable
|
|
bool noiseEnable[3]; // Channel A-C noise enable
|
|
uint16_t noisePeriod; // Noise period (5 bits * 16)
|
|
uint32_t envPeriod; // Envelope period (16 bits * 256)
|
|
bool envAttack; // Envelope Attack bit
|
|
bool envAlternate; // Envelope Alternate bit
|
|
bool envHold; // Envelope Hold bit
|
|
// Internal registers
|
|
uint16_t count[3]; // Channel A-C current count
|
|
bool state[3]; // Channel A-C current state
|
|
uint16_t noiseCount; // Noise current count
|
|
bool noiseState; // Noise state
|
|
uint32_t envCount[3]; // Envelope current count
|
|
int16_t envDirection[3];// Envelope direction (rising, 0, or falling)
|
|
uint32_t prng; // Psuedo RNG (17 bits)
|
|
uint8_t regLatch; // Register latch (written by 6522VIA)
|
|
uint8_t data; // Data lines (written by 6522VIA)
|
|
uint8_t id; // Chip ID (optional)
|
|
|
|
VAY_3_8910();
|
|
void Reset(void);
|
|
void WriteControl(uint8_t);
|
|
void WriteData(uint8_t);
|
|
void SetRegister(void);
|
|
uint16_t GetSample(void);
|
|
|
|
// Class variables
|
|
|
|
// Maximum volume that can be generated by one voice
|
|
static float maxVolume;
|
|
// Normalized volumes (zero to one) for AY-3-8910 output, in 16 steps
|
|
static float normalizedVolume[16];
|
|
};
|
|
|
|
// Exported variables
|
|
extern bool logAYInternal;
|
|
|
|
#endif // VAY8910_H
|
|
|