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 PC8201_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 PC8201_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);
67 void PC8201_MEMORY::reset()
73 void PC8201_MEMORY::write_data8(uint32_t addr, uint32_t data)
76 wbank[addr >> 12][addr & 0xfff] = data;
79 uint32_t PC8201_MEMORY::read_data8(uint32_t addr)
82 return rbank[addr >> 12][addr & 0xfff];
85 void PC8201_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 PC8201_MEMORY::read_io8(uint32_t addr)
110 return (sio & 0xc0) | (bank & 0xf);
113 void PC8201_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 bool PC8201_MEMORY::process_state(FILEIO* state_fio, bool loading)
149 if(!state_fio->StateCheckUint32(STATE_VERSION)) {
152 if(!state_fio->StateCheckInt32(this_device_id)) {
155 state_fio->StateBuffer(ram, sizeof(ram), 1);
156 state_fio->StateUint8(sio);
157 state_fio->StateUint8(bank);