mirror of
https://github.com/TomHarte/CLK.git
synced 2024-07-03 11:30:02 +00:00
81 lines
1.6 KiB
C++
81 lines
1.6 KiB
C++
//
|
|
// AY-3-8910.cpp
|
|
// Clock Signal
|
|
//
|
|
// Created by Thomas Harte on 14/10/2016.
|
|
// Copyright © 2016 Thomas Harte. All rights reserved.
|
|
//
|
|
|
|
#include "AY38910.hpp"
|
|
|
|
using namespace GI;
|
|
|
|
AY38910::AY38910() : _selected_register(0)
|
|
{
|
|
}
|
|
|
|
void AY38910::set_clock_rate(double clock_rate)
|
|
{
|
|
set_input_rate((float)clock_rate);
|
|
}
|
|
|
|
void AY38910::get_samples(unsigned int number_of_samples, int16_t *target)
|
|
{
|
|
printf("%d\n", number_of_samples);
|
|
for(int c = 0; c < number_of_samples; c++)
|
|
{
|
|
*target++ = (c & 64) * 64;
|
|
}
|
|
}
|
|
|
|
void AY38910::skip_samples(unsigned int number_of_samples)
|
|
{
|
|
}
|
|
|
|
void AY38910::select_register(uint8_t r)
|
|
{
|
|
_selected_register = r & 0xf;
|
|
}
|
|
|
|
void AY38910::set_register_value(uint8_t value)
|
|
{
|
|
_registers[_selected_register] = value;
|
|
if(value < 14)
|
|
{
|
|
int selected_register = _selected_register;
|
|
enqueue([=] () {
|
|
_output_registers[selected_register] = value;
|
|
switch(selected_register)
|
|
{
|
|
case 0: case 2: case 4:
|
|
_tone_generator_controls[selected_register >> 1] =
|
|
(_tone_generator_controls[selected_register >> 1] & ~0xff) | value;
|
|
break;
|
|
|
|
case 1: case 3: case 5:
|
|
_tone_generator_controls[selected_register >> 1] =
|
|
(_tone_generator_controls[selected_register >> 1] & 0xff) | (uint16_t)((value&0xf) << 8);
|
|
break;
|
|
|
|
case 11:
|
|
_envelope_period = (_envelope_period & ~0xff) | value;
|
|
break;
|
|
|
|
case 12:
|
|
_envelope_period = (_envelope_period & 0xff) | (uint16_t)(value << 8);
|
|
break;
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
uint8_t AY38910::get_register_value()
|
|
{
|
|
return _registers[_selected_register];
|
|
}
|
|
|
|
uint8_t AY38910::get_port_output(bool port_b)
|
|
{
|
|
return _registers[port_b ? 15 : 14];
|
|
}
|