OSDN Git Service

[VM][FMTOWNS][MEMORY] More correctness reset sequence.
authorK.Ohta <whatisthis.sowhat@gmail.com>
Wed, 27 May 2020 19:00:01 +0000 (04:00 +0900)
committerK.Ohta <whatisthis.sowhat@gmail.com>
Wed, 27 May 2020 19:00:01 +0000 (04:00 +0900)
source/src/vm/fmtowns/towns_memory.cpp
source/src/vm/fmtowns/towns_memory.h

index c66378f..0b40076 100644 (file)
@@ -211,6 +211,7 @@ void TOWNS_MEMORY::reset()
        // reset memory
        // ToDo
        is_compatible = true;
+       reset_happened = false;
 #if 1  
        if(d_cpu != NULL) {
                d_cpu->set_address_mask(0xffffffff);
@@ -243,7 +244,8 @@ uint32_t TOWNS_MEMORY::read_io8(uint32_t addr)
        case 0x0020: // Software reset ETC.
                // reset cause register
                if(d_cpu != NULL) {
-                       val = ((software_reset) ? 1 : 0) | ((d_cpu->get_shutdown_flag() != 0) ? 2 : 0);
+                       val = ((software_reset) ? 1 : 0) | ((reset_happened) ? 2 : 0);
+                       reset_happened = false;
                }
                software_reset = false;
                if(d_cpu != NULL) {
@@ -509,6 +511,9 @@ void TOWNS_MEMORY::write_io8(uint32_t addr, uint32_t data)
                        if(d_cpu != NULL) {
                                d_cpu->reset();
                        }
+                       //dma_is_vram = false;
+                       //d_sysrom->reset();
+                       //config_page00();
                }
                // Towns SEEMS to not set addreess mask (a.k.a A20 mask). 20200131 K.O  
                if(d_dmac != NULL) {
@@ -712,6 +717,7 @@ void TOWNS_MEMORY::write_signal(int ch, uint32_t data, uint32_t mask)
                }
        } else if(ch == SIG_FMTOWNS_NOTIFY_RESET) {
                out_debug_log("RESET FROM CPU!!!\n");
+               reset_happened = true;
                if(d_cpu != NULL) {
                        d_cpu->set_address_mask(0xffffffff);
                }
@@ -777,6 +783,7 @@ bool TOWNS_MEMORY::process_state(FILEIO* state_fio, bool loading)
        state_fio->StateValue(nmi_vector_protect);
        state_fio->StateValue(software_reset);
        state_fio->StateValue(poff_status);
+       state_fio->StateValue(reset_happened);
        
        state_fio->StateValue(extra_nmi_val);
        state_fio->StateValue(extra_nmi_mask);
index 9c363b0..83c209e 100644 (file)
@@ -110,6 +110,7 @@ protected:
        bool software_reset;
        bool nmi_vector_protect;
        bool poff_status;
+       bool reset_happened;
        
        // misc
        uint32_t vram_size; // Normally 512KB.