OSDN Git Service

Merge branch 'master' of github.com:Artanejp/common_source_project-fm7
[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 void MEMBUS::initialize()
13 {
14         MEMORY::initialize();
15         
16         memset(ram, 0x00, sizeof(ram));
17         memset(boot, 0xff, sizeof(boot));
18         memset(basic, 0xff, sizeof(basic));
19         
20         if(!read_bios(_T("IPL.ROM"), boot, sizeof(boot))) {
21                 read_bios(_T("BOOT.ROM"), boot, sizeof(boot));
22         }
23         read_bios(_T("BASIC.ROM"), basic, sizeof(basic));
24         
25         set_memory_rw(0x0000, 0xffff, ram);
26 }
27
28 void MEMBUS::reset()
29 {
30         MEMORY::reset();
31         
32         basic_addr.d = 0;
33         ram_selected = false;
34         update_bank();
35 }
36
37 void MEMBUS::write_io8(uint32_t addr, uint32_t data)
38 {
39         switch(addr) {
40         case 0x0c:
41                 basic_addr.b.l = data;
42                 break;
43         case 0x0d:
44                 basic_addr.b.h = data;
45                 break;
46         case 0x0e:
47                 // error code ???
48                 break;
49         case 0x80:
50                 ram_selected = ((data & 0x80) != 0);
51                 update_bank();
52                 break;
53         }
54 }
55
56 uint32_t MEMBUS::read_io8(uint32_t addr)
57 {
58         switch(addr) {
59         case 0x0c:
60                 return basic[basic_addr.w.l];
61         }
62         return 0xff;
63 }
64
65 void MEMBUS::write_dma_data8(uint32_t addr, uint32_t data)
66 {
67         ram[addr & 0xffff] = data;
68 }
69
70 uint32_t MEMBUS::read_dma_data8(uint32_t addr)
71 {
72         return ram[addr & 0xffff];
73 }
74
75 void MEMBUS::update_bank()
76 {
77         set_memory_r(0x0000, 0x07ff, ram_selected ? ram : boot);
78 }
79
80 #define STATE_VERSION   1
81
82 void MEMBUS::save_state(FILEIO* state_fio)
83 {
84         state_fio->FputUint32(STATE_VERSION);
85         state_fio->FputInt32(this_device_id);
86         
87         MEMORY::save_state(state_fio);
88         state_fio->Fwrite(ram, sizeof(ram), 1);
89         state_fio->FputUint32(basic_addr.d);
90         state_fio->FputBool(ram_selected);
91 }
92
93 bool MEMBUS::load_state(FILEIO* state_fio)
94 {
95         if(state_fio->FgetUint32() != STATE_VERSION) {
96                 return false;
97         }
98         if(state_fio->FgetInt32() != this_device_id) {
99                 return false;
100         }
101         if(!MEMORY::load_state(state_fio)) {
102                 return false;
103         }
104         state_fio->Fread(ram, sizeof(ram), 1);
105         basic_addr.d = state_fio->FgetUint32();
106         ram_selected = state_fio->FgetBool();
107         
108         // post process
109         update_bank();
110         return true;
111 }