OSDN Git Service

[VM] TRY:Use namespace {VMNAME} to separate around VMs. This feature still apply...
[csp-qt/common_source_project-fm7.git] / source / src / vm / bubcom80 / membus.cpp
1 /*
2         Systems Formulate BUBCOM80 Emulator 'eBUBCOM80'
3
4         Author : Takeda.Toshiya
5         Date   : 2018.05.08-
6
7         [ memory bus ]
8 */
9
10 #include "membus.h"
11
12 namespace BUBCOM80 {
13 void MEMBUS::initialize()
14 {
15         MEMORY::initialize();
16         
17         memset(ram, 0x00, sizeof(ram));
18         memset(boot, 0xff, sizeof(boot));
19         memset(basic, 0xff, sizeof(basic));
20         
21         if(!read_bios(_T("IPL.ROM"), boot, sizeof(boot))) {
22                 read_bios(_T("BOOT.ROM"), boot, sizeof(boot));
23         }
24         read_bios(_T("BASIC.ROM"), basic, sizeof(basic));
25         
26         set_memory_rw(0x0000, 0xffff, ram);
27 }
28
29 void MEMBUS::reset()
30 {
31         MEMORY::reset();
32         
33         basic_addr.d = 0;
34         ram_selected = false;
35         update_bank();
36 }
37
38 void MEMBUS::write_io8(uint32_t addr, uint32_t data)
39 {
40         switch(addr) {
41         case 0x0c:
42                 basic_addr.b.l = data;
43                 break;
44         case 0x0d:
45                 basic_addr.b.h = data;
46                 break;
47         case 0x0e:
48                 // error code ???
49                 break;
50         case 0x80:
51                 ram_selected = ((data & 0x80) != 0);
52                 update_bank();
53                 break;
54         }
55 }
56
57 uint32_t MEMBUS::read_io8(uint32_t addr)
58 {
59         switch(addr) {
60         case 0x0c:
61                 return basic[basic_addr.w.l];
62         }
63         return 0xff;
64 }
65
66 void MEMBUS::write_dma_data8(uint32_t addr, uint32_t data)
67 {
68         ram[addr & 0xffff] = data;
69 }
70
71 uint32_t MEMBUS::read_dma_data8(uint32_t addr)
72 {
73         return ram[addr & 0xffff];
74 }
75
76 void MEMBUS::update_bank()
77 {
78         set_memory_r(0x0000, 0x07ff, ram_selected ? ram : boot);
79 }
80
81 #define STATE_VERSION   1
82
83 bool MEMBUS::process_state(FILEIO* state_fio, bool loading)
84 {
85         if(!state_fio->StateCheckUint32(STATE_VERSION)) {
86                 return false;
87         }
88         if(!state_fio->StateCheckInt32(this_device_id)) {
89                 return false;
90         }
91         if(!MEMORY::process_state(state_fio, loading)) {
92                 return false;
93         }
94         state_fio->StateBuffer(ram, sizeof(ram), 1);
95         state_fio->StateUint32(basic_addr.d);
96         state_fio->StateBool(ram_selected);
97         
98         // post process
99         if(loading) {
100                 update_bank();
101         }
102         return true;
103 }
104 }