• R/O
  • HTTP
  • SSH
  • HTTPS

common_source_project-fm7: Commit

Common Source Code Project for Qt (a.k.a for FM-7).


Commit MetaInfo

Revisionb6b4891bb7a59512448a02a77778111c484a9faa (tree)
Time2021-12-22 22:47:49
AuthorK.Ohta <whatisthis.sowhat@gmai...>
CommiterK.Ohta

Log Message

[VM][FMTOWNS][MEMORY] Reduce to update memory mapping.Fix eating a lot of HOST CPU USAGE changing bank 000c0000h , 000d0000h and 000f8000h .

Change Summary

Incremental Difference

--- a/source/src/vm/fmtowns/towns_memory.cpp
+++ b/source/src/vm/fmtowns/towns_memory.cpp
@@ -27,24 +27,36 @@ namespace FMTOWNS {
2727
2828 #define ADDR_MASK (addr_max - 1)
2929 #define BANK_MASK (bank_size - 1)
30-
31-void TOWNS_MEMORY::config_page00()
30+
31+void TOWNS_MEMORY::config_page_c0()
3232 {
3333 if(dma_is_vram) {
3434 // OK? From TSUGARU
3535 set_memory_mapped_io_rw(0x000c0000, 0x000c7fff, d_planevram);
36- set_memory_mapped_io_rw(0x000c8000, 0x000cbfff, d_sprite);
37- set_memory_mapped_io_rw(0x000ca000, 0x000cafff, d_sprite);
36+ set_memory_mapped_io_rw(0x000c8000, 0x000c9fff, d_sprite);
3837 if(ankcg_enabled) {
3938 set_memory_mapped_io_r(0x000ca000, 0x000ca7ff, d_font);
4039 set_memory_r (0x000ca800, 0x000cafff, rd_dummy);
4140 set_memory_mapped_io_r(0x000cb000, 0x000cbfff, d_font);
41+
42+ set_memory_w (0x000ca000, 0x000cafff, wr_dummy); // OK?
43+ //set_memory_mapped_io_w(0x000ca000, 0x000cbfff, d_sprite); // OK?
44+ } else {
45+ set_memory_mapped_io_rw(0x000ca000, 0x000cbfff, d_sprite);
4246 }
4347 set_memory_rw (0x000cc000, 0x000cffff, &(ram_pagec[0xc000]));
4448 set_memory_mapped_io_rw(0x000cfc00, 0x000cffff, this); // MMIO
49+ // ToDo: Correctness wait value.
50+ set_wait_rw(0x000c0000, 0x000cffff, vram_wait_val);
4551 } else {
4652 set_memory_rw (0x000c0000, 0x000cffff, ram_pagec);
53+ // ToDo: Correctness wait value.
54+ set_wait_rw(0x000c0000, 0x000cffff, mem_wait_val);
4755 }
56+}
57+
58+void TOWNS_MEMORY::config_page_d0_f8()
59+{
4860 if((select_d0_rom) && (select_d0_dict)) {
4961 set_memory_mapped_io_rw(0x000d0000, 0x000dffff, d_dictionary);
5062 } else {
@@ -58,12 +70,12 @@ void TOWNS_MEMORY::config_page00()
5870 } else {
5971 set_memory_rw (0x000f8000, 0x000fffff, &(ram_pagef[0x8000]));
6072 }
61- if(dma_is_vram) {
62- set_wait_rw(0x000c0000, 0x000cffff, vram_wait_val);
63- } else {
64- set_wait_rw(0x000c0000, 0x000cffff, mem_wait_val);
65- }
66-
73+}
74+
75+void TOWNS_MEMORY::config_page00()
76+{
77+ config_page_c0();
78+ config_page_d0_f8();
6779 }
6880
6981 void TOWNS_MEMORY::initialize()
@@ -575,13 +587,24 @@ void TOWNS_MEMORY::write_io8(uint32_t addr, uint32_t data)
575587 }
576588 break;
577589 case 0x0404: // System Status Reg.
578- dma_is_vram = ((data & 0x80) == 0);
579- config_page00();
590+ {
591+ bool _b = dma_is_vram;
592+ dma_is_vram = ((data & 0x80) == 0);
593+ if((_b != dma_is_vram) || (dma_is_vram)) {
594+ config_page_c0();
595+ }
596+ }
580597 break;
581598 case 0x0480:
582- select_d0_dict = ((data & 0x01) != 0) ? true : false;
583- select_d0_rom = ((data & 0x02) == 0) ? true : false;
584- config_page00();
599+ {
600+ bool _dict = select_d0_dict;
601+ bool _rom = select_d0_rom;
602+ select_d0_dict = ((data & 0x01) != 0) ? true : false;
603+ select_d0_rom = ((data & 0x02) == 0) ? true : false;
604+ if((_rom != select_d0_rom) || (_dict != select_d0_dict)) {
605+ config_page_d0_f8();
606+ }
607+ }
585608 break;
586609 case 0x05c0:
587610 extra_nmi_mask = ((data & 0x08) == 0);
@@ -590,16 +613,20 @@ void TOWNS_MEMORY::write_io8(uint32_t addr, uint32_t data)
590613 // From AB.COM
591614 if(machine_id < 0x0200) { // Towns 1/2
592615 uint8_t nval = data & 7;
616+ uint8_t val_bak = mem_wait_val;
593617 if(nval < 1) nval = 1;
594618 if(nval > 5) nval = 5;
595619 mem_wait_val = nval + 1;
596620 vram_wait_val = nval + 3 + 1;
597621 wait_register = nval;
598- set_wait_values();
622+ if(val_bak != mem_wait_val) {
623+ set_wait_values();
624+ }
599625 }
600626 break;
601627 case 0x05e2:
602628 if(machine_id >= 0x0200) { // After Towns 1H/2F. Hidden wait register.
629+ uint8_t val_bak = mem_wait_val;
603630 if(data != 0x83) {
604631 uint8_t nval = data & 7;
605632 if(machine_id <= 0x0200) { // Towns 1H/2F.
@@ -614,15 +641,21 @@ void TOWNS_MEMORY::write_io8(uint32_t addr, uint32_t data)
614641 vram_wait_val = 6;
615642 wait_register = data;
616643 }
617- set_wait_values();
644+ if(val_bak != mem_wait_val) {
645+ set_wait_values();
646+ }
618647 }
619648 break;
620649 case 0x05ec:
621650 if(machine_id >= 0x0500) { // Towns2 CX :
651+ uint8_t val_bak = mem_wait_val;
652+ uint32_t clk_bak = cpu_clock_val;
622653 vram_wait_val = ((data & 0x01) != 0) ? 3 : 6;
623654 mem_wait_val = ((data & 0x01) != 0) ? 0 : 3;
624655 cpu_clock_val = ((data & 0x01) != 0) ? (get_cpu_clocks(d_cpu)) : (16 * 1000 * 1000);
625- set_wait_values();
656+ if((val_bak != mem_wait_val) || (cpu_clock_val != clk_bak)) {
657+ set_wait_values();
658+ }
626659 }
627660 break;
628661 case 0xfda4:
@@ -653,8 +686,13 @@ void TOWNS_MEMORY::write_io8(uint32_t addr, uint32_t data)
653686 }
654687 break;
655688 case 0xff99:
656- ankcg_enabled = ((data & 1) != 0) ? true : false;
657- config_page00();
689+ {
690+ bool _b = ankcg_enabled;
691+ ankcg_enabled = ((data & 1) != 0) ? true : false;
692+ if((_b != ankcg_enabled) && (dma_is_vram)) {
693+ config_page_c0();
694+ }
695+ }
658696 break;
659697 case 0xff9e:
660698 if((machine_id >= 0x0600) && !(is_compatible)) { // After UG
@@ -1111,14 +1149,20 @@ void TOWNS_MEMORY::write_signal(int ch, uint32_t data, uint32_t mask)
11111149 d_dmac->write_signal(SIG_TOWNS_DMAC_WRAP_REG, wrap_val, 0xff);
11121150 }
11131151 } else if(ch == SIG_FMTOWNS_RAM_WAIT) {
1152+ uint8_t _bak = mem_wait_val;
11141153 mem_wait_val = (int)data;
1115- set_wait_values();
1154+ if(_bak != mem_wait_val) {
1155+ set_wait_values();
1156+ }
11161157 } else if(ch == SIG_FMTOWNS_ROM_WAIT) {
11171158 // mem_wait_val = (int)data;
11181159 set_wait_values();
11191160 } else if(ch == SIG_FMTOWNS_VRAM_WAIT) {
1161+ uint8_t _bak = vram_wait_val;
11201162 vram_wait_val = (int)data;
1121- set_wait_values();
1163+ if(_bak != vram_wait_val) {
1164+ set_wait_values();
1165+ }
11221166 }
11231167 }
11241168
--- a/source/src/vm/fmtowns/towns_memory.h
+++ b/source/src/vm/fmtowns/towns_memory.h
@@ -123,6 +123,8 @@ protected:
123123 uint8_t reg_misc3; // 0024
124124 uint8_t reg_misc4; // 0025
125125 virtual void set_wait_values();
126+ virtual void config_page_c0();
127+ virtual void config_page_d0_f8();
126128 virtual void config_page00();
127129 virtual void update_machine_features();
128130
Show on old repository browser