// // Virtual AY-3-8910 Emulator // // by James Hammons // (C) 2018 Underground Software // #ifndef VAY8910_H #define VAY8910_H #include 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