2 SHARP X1 Emulator 'eX1'
3 SHARP X1twin Emulator 'eX1twin'
4 SHARP X1turbo Emulator 'eX1turbo'
5 SHARP X1turboZ Emulator 'eX1turboZ'
7 Author : Takeda.Toshiya
14 #ifdef _X1TURBO_FEATURE
20 #define SET_BANK(s, e, w, r) { \
21 int sb = (s) >> 12, eb = (e) >> 12; \
22 for(int i = sb; i <= eb; i++) { \
23 wbank[i] = (w) + 0x1000 * (i - sb); \
24 rbank[i] = (r) + 0x1000 * (i - sb); \
28 void MEMORY::initialize()
31 memset(rom, 0xff, sizeof(rom));
32 memset(ram, 0, sizeof(ram));
35 FILEIO* fio = new FILEIO();
36 if(fio->Fopen(create_local_path(IPL_ROM_FILE_NAME), FILEIO_READ_BINARY)) {
38 fio->Fread(rom, IPL_ROM_FILE_SIZE, 1);
40 } else if(fio->Fopen(create_local_path(_T("IPL.ROM")), FILEIO_READ_BINARY)) {
41 fio->Fread(rom, IPL_ROM_FILE_SIZE, 1);
45 #ifndef _X1TURBO_FEATURE
46 for(int ofs = 0x1000; ofs < 0x8000; ofs += 0x1000) {
47 memcpy(rom + ofs, rom, 0x1000);
54 SET_BANK(0x0000, 0x7fff, ram, rom);
55 SET_BANK(0x8000, 0xffff, ram + 0x8000, ram + 0x8000);
57 #ifdef _X1TURBO_FEATURE
59 d_pio->write_signal(SIG_I8255_PORT_B, 0x00, 0x10);
65 void MEMORY::write_data8(uint32_t addr, uint32_t data)
68 wbank[addr >> 12][addr & 0xfff] = data;
71 uint32_t MEMORY::read_data8(uint32_t addr)
74 return rbank[addr >> 12][addr & 0xfff];
77 #ifndef _X1TURBO_FEATURE
78 uint32_t MEMORY::fetch_op(uint32_t addr, int *wait)
81 return read_data8(addr);
85 void MEMORY::write_io8(uint32_t addr, uint32_t data)
87 bool update_map_required = false;
89 switch(addr & 0xff00) {
90 #ifdef _X1TURBO_FEATURE
92 if((bank & 0x1f) != (data & 0x1f)) {
93 update_map_required = true;
101 update_map_required = true;
102 #ifdef _X1TURBO_FEATURE
103 d_pio->write_signal(SIG_I8255_PORT_B, 0x00, 0x10);
112 update_map_required = true;
113 #ifdef _X1TURBO_FEATURE
114 d_pio->write_signal(SIG_I8255_PORT_B, 0x10, 0x10);
121 if(update_map_required) {
126 uint32_t MEMORY::read_io8(uint32_t addr)
128 switch(addr & 0xff00) {
129 case 0x1e00: // thanks Mr.Sato
132 #ifdef _X1TURBO_FEATURE
133 d_pio->write_signal(SIG_I8255_PORT_B, 0x10, 0x10);
140 #ifdef _X1TURBO_FEATURE
148 void MEMORY::update_map()
150 #ifdef _X1TURBO_FEATURE
152 uint8_t *ptr = extram + 0x8000 * (bank & 0x0f);
153 SET_BANK(0x0000, 0x7fff, ptr, ptr);
157 SET_BANK(0x0000, 0x7fff, ram, rom);
159 SET_BANK(0x0000, 0x7fff, ram, ram);
163 #define STATE_VERSION 1
165 bool MEMORY::process_state(FILEIO* state_fio, bool loading)
167 if(!state_fio->StateCheckUint32(STATE_VERSION)) {
170 if(!state_fio->StateCheckInt32(this_device_id)) {
173 state_fio->StateBuffer(ram, sizeof(ram), 1);
174 state_fio->StateUint8(romsel);
175 #ifdef _X1TURBO_FEATURE
176 state_fio->StateBuffer(extram, sizeof(extram), 1);
177 state_fio->StateUint8(bank);
179 state_fio->StateInt32(m1_cycle);