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(emu->bios_path(_T("IPL.ROM")), FILEIO_READ_BINARY)) {
42 fio->Fread(ipl, sizeof(ipl), 1);
45 if(fio->Fopen(emu->bios_path(_T("EXT.ROM")), FILEIO_READ_BINARY)) {
46 fio->Fread(ext, sizeof(ext), 1);
49 if(fio->Fopen(emu->bios_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(emu->bios_path(_T("RAM.BIN")), FILEIO_WRITE_BINARY)) {
61 fio->Fwrite(ram, sizeof(ram), 1);
73 void MEMORY::write_data8(uint32 addr, uint32 data)
76 wbank[addr >> 12][addr & 0xfff] = data;
79 uint32 MEMORY::read_data8(uint32 addr)
82 return rbank[addr >> 12][addr & 0xfff];
85 void MEMORY::write_io8(uint32 addr, uint32 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 MEMORY::read_io8(uint32 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 void MEMORY::save_state(FILEIO* state_fio)
149 state_fio->FputUint32(STATE_VERSION);
150 state_fio->FputInt32(this_device_id);
152 state_fio->Fwrite(ram, sizeof(ram), 1);
153 state_fio->FputUint8(sio);
154 state_fio->FputUint8(bank);
157 bool MEMORY::load_state(FILEIO* state_fio)
159 if(state_fio->FgetUint32() != STATE_VERSION) {
162 if(state_fio->FgetInt32() != this_device_id) {
165 state_fio->Fread(ram, sizeof(ram), 1);
166 sio = state_fio->FgetUint8();
167 bank = state_fio->FgetUint8();