OSDN Git Service

[VM][FMTOWNS][RF5C68] MEMORY accessing must be 0000h - 0FFFh.
authorK.Ohta <whatisthis.sowhat@gmail.com>
Sun, 10 Sep 2023 16:00:20 +0000 (01:00 +0900)
committerK.Ohta <whatisthis.sowhat@gmail.com>
Sun, 10 Sep 2023 16:00:20 +0000 (01:00 +0900)
- 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.

source/src/vm/fmtowns/rf5c68.cpp
source/src/vm/fmtowns/rf5c68.h
source/src/vm/fmtowns/towns_memory.cpp

index 577412d..8d37e64 100644 (file)
 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);
@@ -46,16 +30,17 @@ void RF5C68::release()
 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;
@@ -293,6 +278,7 @@ void RF5C68::write_io8(uint32_t addr, uint32_t data)
                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;
@@ -329,8 +315,9 @@ void RF5C68::write_io8(uint32_t addr, uint32_t data)
                                } 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;
                        }
@@ -351,7 +338,7 @@ uint32_t RF5C68::read_io8(uint32_t addr)
 // 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);
@@ -366,7 +353,7 @@ uint32_t RF5C68::read_memory_mapped_io8(uint32_t 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);
@@ -381,7 +368,7 @@ uint32_t RF5C68::read_memory_mapped_io16(uint32_t 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) {
@@ -396,7 +383,7 @@ void RF5C68::write_memory_mapped_io8(uint32_t addr, uint32_t data)
 
 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);
@@ -408,6 +395,48 @@ void RF5C68::write_memory_mapped_io16(uint32_t addr, uint32_t 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);
@@ -590,6 +619,7 @@ uint32_t RF5C68::read_debug_data8(uint32_t addr)
        return wave_memory[addr & 0xffff];
 }
 
+
 void RF5C68::write_via_debugger_data8(uint32_t addr, uint32_t data)
 {
        wave_memory[addr] = data;
@@ -597,10 +627,13 @@ void RF5C68::write_via_debugger_data8(uint32_t addr, uint32_t 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;
+       }
 }
 
 
@@ -612,8 +645,12 @@ uint32_t RF5C68::read_via_debugger_data8(uint32_t addr)
 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;
 }
 
index 91911b6..2bea8fe 100644 (file)
@@ -50,7 +50,7 @@ protected:
        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];
@@ -58,7 +58,7 @@ protected:
        __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];
@@ -68,15 +68,15 @@ protected:
        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)
        {
@@ -94,37 +94,59 @@ public:
        }
        ~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;
@@ -135,23 +157,11 @@ public:
                        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);
index a0d6987..f1ca969 100644 (file)
@@ -87,10 +87,10 @@ void TOWNS_MEMORY::initialize()
        // 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