OSDN Git Service

[VM][DEVICE] Make __FASTCALL run().
authorK.Ohta <whatisthis.sowhat@gmail.com>
Mon, 8 Jul 2019 08:19:38 +0000 (17:19 +0900)
committerK.Ohta <whatisthis.sowhat@gmail.com>
Mon, 8 Jul 2019 08:19:38 +0000 (17:19 +0900)
[VM][EVENT] Add remove_context_cpu().This may not effect to MAIN_CPU(id==0).

22 files changed:
source/src/vm/common_vm/CMakeLists.txt
source/src/vm/device.h
source/src/vm/event.cpp
source/src/vm/event.h
source/src/vm/huc6280.h
source/src/vm/i286.h
source/src/vm/i386.h
source/src/vm/i8080.h
source/src/vm/i8080_base.h
source/src/vm/i86.h
source/src/vm/libcpu_newdev/device.h
source/src/vm/m6502.h
source/src/vm/mc6800.h
source/src/vm/mc6801.h
source/src/vm/mc6809.h
source/src/vm/mcs48.h
source/src/vm/tms9995.h
source/src/vm/upd7801.h
source/src/vm/upd7810.h
source/src/vm/upd7907.h
source/src/vm/v30.h
source/src/vm/z80.h

index 7982e8f..8d99877 100644 (file)
@@ -1,6 +1,6 @@
 message("* vm/common_vm")
 
-SET(THIS_LIB_VERSION 2.18.1)
+SET(THIS_LIB_VERSION 2.18.2)
 
 #include(cotire)
 set(s_vm_common_vm_srcs
index c1315d7..4da4784 100644 (file)
@@ -604,7 +604,7 @@ public:
        virtual void __FASTCALL do_dma() { }
        
        // cpu
-       virtual int run(int clock)
+       virtual int __FASTCALL run(int clock)
        {
                // when clock == -1, run one opecode
                return (clock == -1 ? 1 : clock);
index afc7e61..26246e6 100644 (file)
@@ -253,7 +253,7 @@ void EVENT::reset()
        return d_cpu[num].device->run(arg)
 
 
-int EVENT::run_cpu(uint32_t num, int cycles)
+int __FASTCALL EVENT::run_cpu(uint32_t num, int cycles)
 {
        if(num < MAX_CPU) {
                uint32_t dom_num = cpu_type[num];
index ce6f905..1d116ed 100644 (file)
@@ -136,7 +136,7 @@ private:
        
        void mix_sound(int samples);
        void* get_event(int index);
-       int run_cpu(uint32_t num, int cycles);
+       int __FASTCALL run_cpu(uint32_t num, int cycles);
 
 #ifdef _DEBUG_LOG
        bool initialize_done;
@@ -386,7 +386,7 @@ public:
        int rechannel_sound_in_data(int32_t*dst, int16_t* src, int dst_channels, int src_channels, int samples);
        
        template <class T>
-               void set_context_cpu(T* device, uint32_t clocks = CPU_CLOCKS)
+               int set_context_cpu(T* device, uint32_t clocks = CPU_CLOCKS)
        {
                assert(dcount_cpu < MAX_CPU);
                int index = dcount_cpu++;
@@ -395,6 +395,43 @@ public:
                d_cpu[index].accum_clocks = 0;
                set_cpu_type(device, index);
                for(int k = 0; k < 6; k++) cpu_update_clocks[index][k] = d_cpu[index].update_clocks * k;
+               return index;
+       }
+       template <class T>
+               bool remove_context_cpu(T* device, int num)
+       {
+               if(num <= 0) return false; // Number one must not be removed.
+               if(num >= MAX_CPU) return false;
+               if(num >= dcount_cpu) return false;
+               if(dcount_cpu <= 1) return false;
+               // Note: This function is dangerous.
+               if(d_cpu[num].device != device) return false;
+               if(d_cpu[num].device == NULL) return false;
+               if(dcount_cpu == 2) {
+                       d_cpu[1].device = (DEVICE *)NULL;
+                       d_cpu[1].cpu_clocks = 0;
+                       d_cpu[1].accum_clocks = 0;
+                       cpu_type[1] = EVENT_CPUTYPE_GENERIC;
+                       dcount_cpu = 1;
+                       for(int k = 0; k < 6; k++)      cpu_update_clocks[1][k] = d_cpu[1].update_clocks * k;
+               } else {
+                       for(int i = num; i < (dcount_cpu - 1); i++) {
+                               d_cpu[i].device = d_cpu[i + 1].device;
+                               d_cpu[i].cpu_clocks = d_cpu[i + 1].cpu_clocks;
+                               d_cpu[i].accum_clocks = d_cpu[i + 1].accum_clocks;
+                               cpu_type[i] = cpu_type[i + 1];
+                       }
+                       int n = dcount_cpu - 1;
+                       d_cpu[n].device = (DEVICE *)NULL;
+                       d_cpu[n].cpu_clocks = 0;
+                       d_cpu[n].accum_clocks = 0;
+                       cpu_type[n] = EVENT_CPUTYPE_GENERIC;
+                       for(int i = 1; i < dcount_cpu; i++) {
+                               for(int k = 0; k < 6; k++)      cpu_update_clocks[i][k] = d_cpu[i].update_clocks * k;
+                       }
+                       dcount_cpu = dcount_cpu - 1;
+               }
+               return true;
        }
        void set_secondary_cpu_clock(DEVICE* device, uint32_t clocks)
        {
index 435c644..2a2e060 100644 (file)
@@ -48,7 +48,7 @@ public:
        virtual void initialize();
        virtual void release();
        virtual void reset();
-       virtual int run(int clock);
+       virtual int __FASTCALL run(int clock);
        void __FASTCALL write_signal(int id, uint32_t data, uint32_t mask);
        uint32_t get_pc();
        uint32_t get_next_pc();
@@ -112,7 +112,7 @@ public:
        void initialize();
        void release();
        void reset();
-       int run(int clock);
+       int __FASTCALL run(int clock);
        bool process_state(FILEIO* state_fio, bool loading);
 
 #ifdef USE_DEBUGGER
index 7b4fd66..30056e3 100644 (file)
@@ -29,7 +29,7 @@ public:
        void initialize();
        void release();
        void reset();
-       int run(int icount);
+       int __FASTCALL run(int icount);
        uint32_t __FASTCALL read_signal(int id);
        void __FASTCALL write_signal(int id, uint32_t data, uint32_t mask);
        void set_intr_line(bool line, bool pending, uint32_t bit);
index 7762b5b..882ac24 100644 (file)
@@ -79,7 +79,7 @@ public:
        void initialize();
        void release();
        void reset();
-       int run(int cycles);
+       int __FASTCALL run(int cycles);
        uint32_t __FASTCALL read_signal(int id);
        void __FASTCALL write_signal(int id, uint32_t data, uint32_t mask);
        void set_intr_line(bool line, bool pending, uint32_t bit);
index f5d214a..622f209 100644 (file)
@@ -178,7 +178,7 @@ protected:
        /* ---------------------------------------------------------------------------
        opecodes
        --------------------------------------------------------------------------- */
-       void run_one_opecode();
+       void __FASTCALL run_one_opecode();
        void check_interrupt();
        //void OP(uint8_t code);
 public:
@@ -193,7 +193,7 @@ public:
        // common functions
        void initialize();
        void reset();
-       int run(int clock);
+       int __FASTCALL run(int clock);
        void __FASTCALL write_signal(int id, uint32_t data, uint32_t mask);
        bool process_state(FILEIO* state_fio, bool loading);
        
index 46a8c89..a9bbed2 100644 (file)
@@ -125,7 +125,7 @@ public:
        ~I8080_BASE() {}
        virtual void initialize();
        virtual void reset();
-       virtual int run(int clock);
+       virtual __FASTCALL int run(int clock);
        virtual void __FASTCALL write_signal(int id, uint32_t data, uint32_t mask);
        uint32_t __FASTCALL read_signal(int ch);
        void set_intr_line(bool line, bool pending, uint32_t bit);
index 5dd8b5c..38639c3 100644 (file)
@@ -55,7 +55,7 @@ public:
        virtual void initialize();
        virtual void release();
        virtual void reset();
-       virtual int run(int icount);
+       virtual int __FASTCALL run(int icount);
        virtual uint32_t __FASTCALL read_signal(int id);
        virtual void __FASTCALL write_signal(int id, uint32_t data, uint32_t mask);
        virtual void set_intr_line(bool line, bool pending, uint32_t bit);
index fa49db8..6916e1e 100644 (file)
@@ -501,7 +501,7 @@ public:
        virtual void __FASTCALL do_dma() {}
        
        // cpu
-       virtual int run(int clock)
+       virtual int __FASTCALL run(int clock)
        {
                // when clock == -1, run one opecode
                return (clock == -1 ? 1 : clock);
index 7a0cced..b1d8db1 100644 (file)
@@ -62,7 +62,7 @@ public:
        // common functions
        virtual void initialize();
        virtual void reset();
-       virtual int run(int clock);
+       virtual int __FASTCALL run(int clock);
        
        void __FASTCALL write_signal(int id, uint32_t data, uint32_t mask);
        void set_intr_line(bool line, bool pending, uint32_t bit)
@@ -125,7 +125,7 @@ public:
        ~M6502() {}
        void initialize();
        void reset();
-       int run(int clock);
+       int __FASTCALL run(int clock);
        int debug_dasm_with_userdata(uint32_t pc, _TCHAR *buffer, size_t buffer_len, uint32_t userdata = 0);
        bool process_state(FILEIO* state_fio, bool loading);
 };     
@@ -141,7 +141,7 @@ public:
        ~N2A03() {}
        void initialize();
        void reset();
-       int run(int clock);
+       int __FASTCALL run(int clock);
        int debug_dasm_with_userdata(uint32_t pc, _TCHAR *buffer, size_t buffer_len, uint32_t userdata = 0);
        bool process_state(FILEIO* state_fio, bool loading);
 };     
index ec5432b..6778df6 100644 (file)
@@ -333,7 +333,7 @@ public:
        // common functions
        virtual void initialize();
        virtual void reset();
-       virtual int run(int clock);
+       virtual int __FASTCALL run(int clock);
        
        virtual void __FASTCALL write_signal(int id, uint32_t data, uint32_t mask);
        uint32_t get_pc()
index 8d19138..36e0382 100644 (file)
@@ -149,7 +149,7 @@ public:
        void initialize() override;
        void release();
        void reset() override;
-       int run(int clock) override;
+       int __FASTCALL run(int clock) override;
        void __FASTCALL write_signal(int id, uint32_t data, uint32_t mask) override;
        bool process_state(FILEIO* state_fio, bool loading);
 
index 0d9cd99..9ab1d72 100644 (file)
@@ -618,7 +618,7 @@ public:
        // common functions
        void reset();
        virtual void initialize();
-       int run(int clock);
+       int __FASTCALL run(int clock);
        void __FASTCALL write_signal(int id, uint32_t data, uint32_t mask);
        bool process_state(FILEIO* state_fio, bool loading);
        
index 23b5949..8c307c7 100644 (file)
@@ -484,7 +484,7 @@ public:
        virtual void initialize();
        virtual void release();
        void reset();
-       virtual int run(int icount);
+       virtual int __FASTCALL run(int icount);
        void __FASTCALL write_signal(int id, uint32_t data, uint32_t mask);
        uint32_t get_pc();
        uint32_t get_next_pc();
@@ -740,7 +740,7 @@ public:
        ~MCS48() {}
        void initialize();
        void release();
-       int run(int icount);
+       int __FASTCALL run(int icount);
        bool process_state(FILEIO* state_fio, bool loading);
 #ifdef USE_DEBUGGER
        bool is_cpu()
index 3800c73..fd89374 100644 (file)
@@ -142,7 +142,7 @@ public:
        // common functions
        void initialize();
        void reset();
-       int run(int clock);
+       int __FASTCALL run(int clock);
        void __FASTCALL write_signal(int id, uint32_t data, uint32_t mask);
        uint32_t get_pc()
        {
index e891f83..8c16b77 100644 (file)
@@ -125,7 +125,7 @@ public:
        // common functions
        void initialize();
        void reset();
-       int run(int clock);
+       int __FASTCALL run(int clock);
        void __FASTCALL write_signal(int id, uint32_t data, uint32_t mask);
        uint32_t get_pc()
        {
index 3c17c98..57297e1 100644 (file)
@@ -54,7 +54,7 @@ public:
        void initialize();
        void release();
        void reset();
-       int run(int clock);
+       int __FASTCALL run(int clock);
        void __FASTCALL write_signal(int id, uint32_t data, uint32_t mask);
        uint32_t get_pc();
        uint32_t get_next_pc();
index e3c0f47..4343bb7 100644 (file)
@@ -54,7 +54,7 @@ public:
        void initialize();
        void release();
        void reset();
-       int run(int clock);
+       int __FASTCALL run(int clock);
        void __FASTCALL write_signal(int id, uint32_t data, uint32_t mask);
        uint32_t get_pc();
        uint32_t get_next_pc();
index 3d95b67..869fb00 100644 (file)
@@ -12,7 +12,7 @@ class V30 : public I8086
        virtual void initialize();
        virtual void release();
        virtual void reset();
-       virtual int run(int icount);
+       virtual int __FASTCALL run(int icount);
        virtual int debug_dasm_with_userdata(uint32_t pc, _TCHAR *buffer, size_t buffer_len, uint32_t userdata = 0);
 
 };
index 2a6348d..e479d66 100644 (file)
@@ -282,7 +282,7 @@ public:
        virtual void initialize();
        virtual void reset();
        void event_frame();
-       int run(int clock);
+       int __FASTCALL run(int clock);
 
        virtual bool process_state(FILEIO* state_fio, bool loading);
        
@@ -378,7 +378,7 @@ public:
        ~Z80();
        void initialize();
        void reset();
-       int run(int clock) override;
+       int __FASTCALL run(int clock) override;
 
        int debug_dasm_with_userdata(uint32_t pc, _TCHAR *buffer, size_t buffer_len, uint32_t userdata = 0);
 #ifdef USE_DEBUGGER