OSDN Git Service

[VM][MEMORY] .
authorK.Ohta <whatisthis.sowhat@gmail.com>
Sun, 19 Mar 2023 13:10:03 +0000 (22:10 +0900)
committerK.Ohta <whatisthis.sowhat@gmail.com>
Sun, 19 Mar 2023 13:10:03 +0000 (22:10 +0900)
source/src/vm/memory.cpp
source/src/vm/memory.h

index b85b608..a0e9633 100644 (file)
@@ -15,6 +15,7 @@
 #define ADDR_MASK (space - 1)
 #define BANK_MASK (bank_size - 1)
 
+
 void MEMORY::initialize()
 {
        __UNLIKELY_IF((rd_table == NULL) || (wr_table == NULL)) {
@@ -559,7 +560,7 @@ void MEMORY::copy_table_w(uint32_t to, uint32_t start, uint32_t end)
        const uint32_t start_bank = start >> addr_shift;
        const uint32_t end_bank = end >> addr_shift;
        uint32_t to_bank = to >> addr_shift;
-       const uint64_t blocks = space / bank_size;
+       const uint64_t blocks = space >> addr_shift;
 
        for(uint64_t i = start_bank; i <= end_bank; i++) {
                if(to_bank >= blocks) break;
@@ -578,7 +579,7 @@ void MEMORY::copy_table_r(uint32_t to, uint32_t start, uint32_t end)
        const uint32_t start_bank = start >> addr_shift;
        const uint32_t end_bank = end >> addr_shift;
        uint32_t to_bank = to >> addr_shift;
-       const uint64_t blocks = space / bank_size;
+       const uint64_t blocks = space >> addr_shift;
 
        for(uint64_t i = start_bank; i <= end_bank; i++) {
                if(to_bank >= blocks) break;
index 135df06..21f5344 100644 (file)
@@ -64,7 +64,9 @@ public:
        // unique functions
        inline int get_bank(uint32_t addr) const
        {
-               return (addr & (space - 1)) >> addr_shift;
+               const uint64_t _mask = space - 1;
+
+               return (uint32_t)(((uint64_t)addr & _mask) >> addr_shift);
        }
        inline int bus_access_times_16(uint32_t addr) const
        {
@@ -136,7 +138,7 @@ public:
        bank_t *rd_table;
        bank_t *wr_table;
 
-       uint32_t space;
+       uint64_t space;
        uint32_t bank_size;
        int bus_width;
 };