robmcmullen-apple2/src/vay8910.h

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