2 NEC PC-8201 Emulator 'ePC-8201'
4 Author : Takeda.Toshiya
12 #include "../datarec.h"
13 #include "../upd1990a.h"
15 #define SET_BANK(s, e, w, r) { \
16 int sb = (s) >> 12, eb = (e) >> 12; \
17 for(int i = sb; i <= eb; i++) { \
21 wbank[i] = (w) + 0x1000 * (i - sb); \
26 rbank[i] = (r) + 0x1000 * (i - sb); \
31 void MEMORY::initialize()
34 memset(ram, 0, sizeof(ram));
35 memset(ipl, 0xff, sizeof(ipl));
36 memset(ext, 0xff, sizeof(ext));
37 memset(rdmy, 0xff, sizeof(rdmy));
39 // load rom / ram images
40 FILEIO* fio = new FILEIO();
41 if(fio->Fopen(create_local_path(_T("IPL.ROM")), FILEIO_READ_BINARY)) {
42 fio->Fread(ipl, sizeof(ipl), 1);
45 if(fio->Fopen(create_local_path(_T("EXT.ROM")), FILEIO_READ_BINARY)) {
46 fio->Fread(ext, sizeof(ext), 1);
49 if(fio->Fopen(create_local_path(_T("RAM.BIN")), FILEIO_READ_BINARY)) {
50 fio->Fread(ram, sizeof(ram), 1);
56 void MEMORY::release()
59 FILEIO* fio = new FILEIO();
60 if(fio->Fopen(create_local_path(_T("RAM.BIN")), FILEIO_WRITE_BINARY)) {
61 fio->Fwrite(ram, sizeof(ram), 1);
73 void MEMORY::write_data8(uint32_t addr, uint32_t data)
76 wbank[addr >> 12][addr & 0xfff] = data;
79 uint32_t MEMORY::read_data8(uint32_t addr)
82 return rbank[addr >> 12][addr & 0xfff];
85 void MEMORY::write_io8(uint32_t addr, uint32_t data)
90 if((sio & 8) != (data & 8)) {
91 d_cmt->write_signal(SIG_CMT_REMOTE, data, 8);
92 d_drec->write_signal(SIG_DATAREC_REMOTE, data, 8);
94 if((sio & 0x10) != (data & 0x10)) {
95 d_rtc->write_signal(SIG_UPD1990A_STB, data, 0x10);
107 uint32_t MEMORY::read_io8(uint32_t addr)
110 return (sio & 0xc0) | (bank & 0xf);
113 void MEMORY::update_bank()
117 SET_BANK(0x0000, 0x7fff, wdmy, ipl);
120 SET_BANK(0x0000, 0x7fff, wdmy, ext);
123 SET_BANK(0x0000, 0x7fff, ram + 0x08000, ram + 0x08000);
126 SET_BANK(0x0000, 0x7fff, ram + 0x10000, ram + 0x10000);
129 switch((bank >> 2) & 3) {
131 SET_BANK(0x8000, 0xffff, ram + 0x00000, ram + 0x00000);
134 SET_BANK(0x8000, 0xffff, wdmy, rdmy);
137 SET_BANK(0x8000, 0xffff, ram + 0x08000, ram + 0x08000);
140 SET_BANK(0x8000, 0xffff, ram + 0x10000, ram + 0x10000);
145 #define STATE_VERSION 1
147 #include "../../statesub.h"
149 void MEMORY::decl_state()
151 enter_decl_state(STATE_VERSION);
153 DECL_STATE_ENTRY_1D_ARRAY(ram, sizeof(ram));
154 DECL_STATE_ENTRY_UINT8(sio);
155 DECL_STATE_ENTRY_UINT8(bank);
160 void MEMORY::save_state(FILEIO* state_fio)
162 if(state_entry != NULL) {
163 state_entry->save_state(state_fio);
165 // state_fio->FputUint32(STATE_VERSION);
166 // state_fio->FputInt32(this_device_id);
168 // state_fio->Fwrite(ram, sizeof(ram), 1);
169 // state_fio->FputUint8(sio);
170 // state_fio->FputUint8(bank);
173 bool MEMORY::load_state(FILEIO* state_fio)
176 if(state_entry != NULL) {
177 mb = state_entry->load_state(state_fio);
182 // if(state_fio->FgetUint32() != STATE_VERSION) {
185 // if(state_fio->FgetInt32() != this_device_id) {
188 // state_fio->Fread(ram, sizeof(ram), 1);
189 // sio = state_fio->FgetUint8();
190 // bank = state_fio->FgetUint8();
197 bool MEMORY::process_state(FILEIO* state_fio, bool loading)
199 if(!state_fio->StateCheckUint32(STATE_VERSION)) {
202 if(!state_fio->StateCheckInt32(this_device_id)) {
205 state_fio->StateBuffer(ram, sizeof(ram), 1);
206 state_fio->StateUint8(sio);
207 state_fio->StateUint8(bank);