- Fix memory initialize value to 0xFF.
- Fix register values when resetting.
- Also loading address register from ST[ch] when first accessing
REGISTER 08h (ON_OFF) .
- Add [read|write]_dma_dataXw() , 8bit and 16bit.
void RF5C68::initialize()
{
// DAC
- memset(wave_memory, 0x00, sizeof(wave_memory));
- dac_bank = 0;
- dac_ch = 0;
- for(int i = 0; i < 8; i++) {
- dac_addr_st[i].d = 0x00;
- dac_env[i] = 0x0000080;
- dac_pan[(i << 1) + 0] = 0x000000f;
- dac_pan[(i << 1) + 1] = 0x000000f;
- dac_ls[i].d = 0x0000;
- dac_fd[i].d = 0x0000;
- dac_onoff[i] = false;
- dac_addr[i] = 0x00000000;
- dac_force_load[i] = false;
- }
- dac_bank = 0;
- dac_ch = 0;
- sample_buffer = NULL;
+// memset(wave_memory, 0xff, sizeof(wave_memory));
if(d_debugger != NULL) {
d_debugger->set_device_name(_T("Debugger (RICOH RF5C68)"));
d_debugger->set_context_mem(this);
void RF5C68::reset()
{
is_mute = true; // OK?
+ memset(wave_memory, 0xff, sizeof(wave_memory));
for(int i = 0; i < 8; i++) {
dac_addr_st[i].d = 0x00;
- dac_env[i] = 0x0000080;
- dac_pan[(i << 1) + 0] = 0x0000008;
- dac_pan[(i << 1) + 1] = 0x0000008;
+ dac_env[i] = 0x00000ff;
+ dac_pan[(i << 1) + 0] = 0x0000000;
+ dac_pan[(i << 1) + 1] = 0x0000000;
dac_ls[i].d = 0x0000;
dac_fd[i].d = 0x0000;
dac_onoff[i] = false;
dac_addr[i] = 0x00000000;
- dac_force_load[i] = false;
+ dac_force_load[i] = true;
}
for(int i = 0; i < 16; i++) {
dac_tmpval[i] = 0x00000000;
dac_addr_st[dac_ch].d = 0;
dac_addr_st[dac_ch].b.h = data & 0xff;
dac_addr[dac_ch] = (uint32_t)(dac_addr_st[dac_ch].w.l) << 11;
+ dac_force_load[dac_ch] = false;
// out_debug_log(_T("DAC REG 06 (ADDR STEP HIGH) CH=%d RAW=%02X"),
// dac_ch, data);
break;
} else {
dac_onoff[i] = false;
}
- if(!(onoff) && (dac_onoff[i])) { // Force reload
+ if((!(onoff) && (dac_onoff[i])) || (dac_force_load[i])) { // Force reload
dac_addr[i] = (uint32_t)(dac_addr_st[i].w.l) << 11;
+ dac_force_load[i] = false;
}
mask <<= 1;
}
// Read PCM memory
uint32_t RF5C68::read_memory_mapped_io8(uint32_t addr)
{
- __UNLIKELY_IF((addr & 0xffff) >= 0x1000) return 0xff; // This is workaround.
+ __UNLIKELY_IF(addr >= 0x1000) return 0xff; // This is workaround.
addr = (addr & 0xfff) | dac_bank;
if(d_debugger != NULL && d_debugger->now_device_debugging) {
return d_debugger->read_via_debugger_data8(addr);
uint32_t RF5C68::read_memory_mapped_io16(uint32_t addr)
{
- __UNLIKELY_IF((addr & 0xffff) >= 0x1000) return 0xffff; // This is workaround.
+ __UNLIKELY_IF(addr >= 0x1000) return 0xffff; // This is workaround.
addr = (addr & 0xfff) | dac_bank;
if(d_debugger != NULL && d_debugger->now_device_debugging) {
return d_debugger->read_via_debugger_data16(addr);
void RF5C68::write_memory_mapped_io8(uint32_t addr, uint32_t data)
{
- __UNLIKELY_IF((addr & 0xffff) >= 0x1000) return; // This is workaround.
+ __UNLIKELY_IF(addr >= 0x1000) return; // This is workaround.
addr = (addr & 0xfff) | dac_bank;
// if(dac_on) don't write <- Is correct?
if(d_debugger != NULL && d_debugger->now_device_debugging) {
void RF5C68::write_memory_mapped_io16(uint32_t addr, uint32_t data)
{
- __UNLIKELY_IF((addr & 0xffff) >= 0x1000) return; // This is workaround.
+ __UNLIKELY_IF(addr >= 0x1000) return; // This is workaround.
addr = (addr & 0xfff) | dac_bank;
if(d_debugger != NULL && d_debugger->now_device_debugging) {
d_debugger->write_via_debugger_data16(addr, data);
}
}
+uint32_t RF5C68::read_dma_data8w(uint32_t addr, int* wait)
+{
+ __UNLIKELY_IF(addr >= 0x1000) return 0xff; // This is workaround.
+ addr = (addr & 0xfff) | dac_bank;
+ uint32_t val = read_via_debugger_data8(addr);
+ __LIKELY_IF(wait != NULL) { // Normally Ignore DMA wait.
+ *wait = 0;
+ }
+ return val;
+}
+
+uint32_t RF5C68::read_dma_data16w(uint32_t addr, int* wait)
+{
+ __UNLIKELY_IF(addr >= 0x1000) return 0xffff; // This is workaround.
+ addr = (addr & 0xfff) | dac_bank;
+ uint32_t val = read_via_debugger_data16(addr);
+ __LIKELY_IF(wait != NULL) { // Normally Ignore DMA wait.
+ *wait = 0;
+ }
+ return val;
+}
+
+void RF5C68::write_dma_data8w(uint32_t addr, uint32_t data, int* wait)
+{
+ __UNLIKELY_IF(addr >= 0x1000) return; // This is workaround.
+ addr = (addr & 0xfff) | dac_bank;
+ write_via_debugger_data8(addr, data);
+ __LIKELY_IF(wait != NULL) { // Normally Ignore DMA wait.
+ *wait = 0;
+ }
+}
+
+void RF5C68::write_dma_data16w(uint32_t addr, uint32_t data, int* wait)
+{
+ __UNLIKELY_IF(addr >= 0x1000) return; // This is workaround.
+ addr = (addr & 0xfff) | dac_bank;
+ write_via_debugger_data16(addr, data);
+ __LIKELY_IF(wait != NULL) { // Normally Ignore DMA wait.
+ *wait = 0;
+ }
+}
+
void RF5C68::set_volume(int ch, int decibel_l, int decibel_r)
{
volume_l = decibel_to_volume(decibel_l - 4);
return wave_memory[addr & 0xffff];
}
+
void RF5C68::write_via_debugger_data8(uint32_t addr, uint32_t data)
{
wave_memory[addr] = data;
void RF5C68::write_via_debugger_data16(uint32_t addr, uint32_t data)
{
- pair32_t _b;
- _b.d = data;
- wave_memory[addr + 0] = _b.b.l;
- wave_memory[(addr + 1) & 0xffff] = _b.b.h;
+ pair16_t _b;
+ _b.w = data;
+ __LIKELY_IF(addr < 0xffff) {
+ _b.write_2bytes_le_to(&(wave_memory[addr]));
+ } else {
+ _b.b.l = wave_memory[addr] = _b.b.l;
+ }
}
uint32_t RF5C68::read_via_debugger_data16(uint32_t addr)
{
pair16_t _b;
- _b.b.l = wave_memory[addr + 0];
- _b.b.h = wave_memory[(addr + 1) & 0xffff];
+ __LIKELY_IF(addr < 0xffff) {
+ _b.read_2bytes_le_from(&(wave_memory[addr]));
+ } else {
+ _b.b.l = wave_memory[addr + 0];
+ _b.b.h = 0xff;
+ }
return _b.w;
}
int sample_words;
int sample_pointer;
int read_pointer;
-
+
__DECL_ALIGNED(16) bool dac_onoff[8];
__DECL_ALIGNED(16) pair32_t dac_addr_st[8];
__DECL_ALIGNED(16) uint32_t dac_addr[8];
__DECL_ALIGNED(16) uint32_t dac_pan[16];
__DECL_ALIGNED(16) pair32_t dac_ls[8];
__DECL_ALIGNED(16) pair32_t dac_fd[8];
-
+
// TMP Values
bool dac_force_load[8];
int32_t* sample_buffer;
int sample_length;
-
+
int mix_rate;
double sample_tick_us;
// ToDo: Work correct LPF.
- void __FASTCALL get_sample(int32_t *v, int words);
+ virtual void __FASTCALL get_sample(int32_t *v, int words);
void __FASTCALL lpf_threetap(int32_t *v, int &lval, int &rval);
-
+
public:
RF5C68(VM_TEMPLATE* parent_vm, EMU_TEMPLATE* parent_emu) : DEVICE(parent_vm, parent_emu)
{
}
~RF5C68() {}
- void initialize();
- void release();
- void reset();
-
- uint32_t __FASTCALL read_memory_mapped_io8(uint32_t addr);
- void __FASTCALL write_memory_mapped_io8(uint32_t addr, uint32_t data);
- uint32_t __FASTCALL read_memory_mapped_io16(uint32_t addr);
- void __FASTCALL write_memory_mapped_io16(uint32_t addr, uint32_t data);
-
- uint32_t __FASTCALL read_debug_data8(uint32_t addr);
- void __FASTCALL write_debug_data8(uint32_t addr, uint32_t data);
-
- uint32_t __FASTCALL read_io8(uint32_t addr);
- void __FASTCALL write_io8(uint32_t addr, uint32_t data);
-
- uint32_t __FASTCALL read_signal(int ch);
- void __FASTCALL write_signal(int ch, uint32_t data, uint32_t mask);
-
- void __FASTCALL mix(int32_t* buffer, int cnt);
- void initialize_sound(int sample_rate, int samples);
-
- void set_volume(int ch, int decibel_l, int decibel_r);
- bool process_state(FILEIO* state_fio, bool loading);
-
- virtual bool get_debug_regs_info(_TCHAR *buffer, size_t buffer_len);
- void __FASTCALL write_via_debugger_data8(uint32_t addr, uint32_t data);
- uint32_t __FASTCALL read_via_debugger_data8(uint32_t addr);
- void __FASTCALL write_via_debugger_data16(uint32_t addr, uint32_t data);
- uint32_t __FASTCALL read_via_debugger_data16(uint32_t addr);
-
- void set_dac_rate(double freq)
+ virtual void initialize() override;
+ virtual void release() override;
+
+ virtual void reset() override;
+
+ virtual uint32_t __FASTCALL read_memory_mapped_io8(uint32_t addr) override;
+ virtual uint32_t __FASTCALL read_memory_mapped_io16(uint32_t addr) override;
+
+ virtual void __FASTCALL write_memory_mapped_io8(uint32_t addr, uint32_t data) override;
+ virtual void __FASTCALL write_memory_mapped_io16(uint32_t addr, uint32_t data) override;
+
+ virtual uint32_t __FASTCALL read_dma_data8w(uint32_t addr, int* wait) override;
+ virtual uint32_t __FASTCALL read_dma_data16w(uint32_t addr, int* wait) override;
+ virtual void __FASTCALL write_dma_data8w(uint32_t addr, uint32_t data, int* wait) override;
+ virtual void __FASTCALL write_dma_data16w(uint32_t addr, uint32_t data, int* wait) override;
+
+ virtual uint32_t __FASTCALL read_debug_data8(uint32_t addr) override;
+ virtual void __FASTCALL write_debug_data8(uint32_t addr, uint32_t data) override;
+
+ virtual uint32_t __FASTCALL read_io8(uint32_t addr) override;
+ virtual void __FASTCALL write_io8(uint32_t addr, uint32_t data) override;
+
+ virtual uint32_t __FASTCALL read_signal(int ch) override;
+ virtual void __FASTCALL write_signal(int ch, uint32_t data, uint32_t mask) override;
+
+ virtual bool get_debug_regs_info(_TCHAR *buffer, size_t buffer_len) override;
+
+ virtual uint32_t __FASTCALL read_via_debugger_data8(uint32_t addr) override;
+ virtual uint32_t __FASTCALL read_via_debugger_data16(uint32_t addr) override;
+ virtual void __FASTCALL write_via_debugger_data16(uint32_t addr, uint32_t data) override;
+ virtual void __FASTCALL write_via_debugger_data8(uint32_t addr, uint32_t data) override;
+
+ void *get_debugger() override
+ {
+ return d_debugger;
+ }
+ bool is_debugger_available() override
+ {
+ return ((d_debugger != NULL) ? true : false);
+ }
+ virtual uint32_t get_debug_data_addr_mask() override
+ {
+ return 0xffff;
+ }
+ virtual void __FASTCALL mix(int32_t* buffer, int cnt) override;
+ virtual void set_volume(int ch, int decibel_l, int decibel_r) override;
+ virtual bool process_state(FILEIO* state_fio, bool loading) override;
+
+ /*
+ unique functions
+ */
+ virtual void initialize_sound(int sample_rate, int samples);
+ virtual void set_dac_rate(double freq)
{
dac_rate = freq;
sample_words = 0;
memset(sample_buffer, 0x00, sample_length * sizeof(int32_t) * 2);
}
}
- void *get_debugger()
- {
- return d_debugger;
- }
- bool is_debugger_available()
- {
- return ((d_debugger != NULL) ? true : false);
- }
void set_context_debugger(DEBUGGER* device)
{
d_debugger = device;
}
- virtual uint32_t get_debug_data_addr_mask()
- {
- return 0xffff;
- }
-
+
void set_context_interrupt_boundary(DEVICE* device, int id, uint32_t mask)
{
register_output_signal(&interrupt_boundary, device, id, mask);
// REAL IS C2140000h - C2141FFFh, but grain may be 8000h bytes.
set_region_device_rw(0xc2140000, 0xc2140000 + memory_map_grain() - 1, d_dictionary, NOT_NEED_TO_OFFSET);
if(d_font_20pix != NULL) {
- set_region_device_r (0xc2180000, 0xc21fffff, d_font_20pix, NOT_NEED_TO_OFFSET);
+ set_region_device_r (0xc2180000, 0xc21fffff, d_font_20pix, 0);
}
// REAL IS C2200000h - C2200FFFh, but grain may be 8000h bytes.
- set_region_device_rw(0xc2200000, 0xc2200000 + memory_map_grain() - 1, d_pcm, NOT_NEED_TO_OFFSET);
+ set_region_device_rw(0xc2200000, 0xc2200000 + memory_map_grain() - 1, d_pcm, 0);
set_region_device_r (0xfffc0000, 0xffffffff, d_sysrom, 0);
// Another devices are blank