2 NEC PC-9801 Emulator 'ePC-9801'
3 NEC PC-9801E/F/M Emulator 'ePC-9801E'
4 NEC PC-9801U Emulator 'ePC-9801U'
5 NEC PC-9801VF Emulator 'ePC-9801VF'
6 NEC PC-9801VM Emulator 'ePC-9801VM'
7 NEC PC-9801VX Emulator 'ePC-9801VX'
8 NEC PC-9801RA Emulator 'ePC-9801RA'
9 NEC PC-98XA Emulator 'ePC-98XA'
10 NEC PC-98XL Emulator 'ePC-98XL'
11 NEC PC-98RL Emulator 'ePC-98RL'
12 NEC PC-98DO Emulator 'ePC-98DO'
14 Author : Takeda.Toshiya
24 // Microsoft Visual C++
25 #pragma warning( disable : 4065 )
31 A0000h - A1FFFh: TEXT VRAM
32 A2000h - A3FFFh: ATTRIBUTE
33 A4000h - A4FFFh: CG WINDOW
34 A8000h - BFFFFh: VRAM (BRG)
35 C0000h - DFFFFh: EXT BIOS
36 CC000h - CFFFFh: SOUND BIOS
37 D6000h - D6FFFh: 2DD FDD BIOS
38 D7000h - D7FFFh: 2HD FDD BIOS
39 D7000h - D7FFFh: SASI BIOS
40 D8000h - DBFFFh: IDE BIOS
41 DC000h - DCFFFh: SCSI BIOS
42 E0000h - E7FFFh: VRAM (I)
45 HIRESO PC-98XA/XL/XL^2/RL
47 80000h - BFFFFh: MEMORY WINDOW
49 E0000h - E1FFFh: TEXT VRAM
50 E2000h - E3FFFh: ATTRIBUTE
51 E4000h - E4FFFh: CG WINDOW
57 void MEMBUS::initialize()
62 memset(ram, 0x00, sizeof(ram));
63 #if !defined(SUPPORT_HIRESO)
64 set_memory_rw(0x00000, 0x9ffff, ram);
66 set_memory_rw(0x00000, 0xbffff, ram);
68 #if defined(SUPPORT_24BIT_ADDRESS) || defined(SUPPORT_32BIT_ADDRESS)
69 if(sizeof(ram) > 0x100000) {
70 set_memory_rw(0x100000, sizeof(ram) - 1, ram + 0x100000);
75 #if !defined(SUPPORT_HIRESO)
76 set_memory_mapped_io_rw(0xa0000, 0xa4fff, d_display);
77 set_memory_mapped_io_rw(0xa8000, 0xbffff, d_display);
78 #if defined(SUPPORT_16_COLORS)
79 set_memory_mapped_io_rw(0xe0000, 0xe7fff, d_display);
82 set_memory_mapped_io_rw(0xc0000, 0xe4fff, d_display);
86 memset(bios, 0xff, sizeof(bios));
87 if(!read_bios(_T("IPL.ROM"), bios, sizeof(bios))) {
88 read_bios(_T("BIOS.ROM"), bios, sizeof(bios));
90 #if defined(SUPPORT_BIOS_RAM)
91 memset(bios_ram, 0x00, sizeof(bios_ram));
93 #if defined(SUPPORT_ITF_ROM)
94 memset(itf, 0xff, sizeof(itf));
95 read_bios(_T("ITF.ROM"), itf, sizeof(itf));
98 #if !defined(SUPPORT_HIRESO)
100 #if defined(_PC9801) || defined(_PC9801E)
101 memset(fd_bios_2hd, 0xff, sizeof(fd_bios_2hd));
102 read_bios(_T("2HDIF.ROM"), fd_bios_2hd, sizeof(fd_bios_2hd));
103 set_memory_r(0xd6000, 0xd6fff, fd_bios_2dd);
105 memset(fd_bios_2dd, 0xff, sizeof(fd_bios_2dd));
106 read_bios(_T("2DDIF.ROM"), fd_bios_2dd, sizeof(fd_bios_2dd));
107 set_memory_r(0xd7000, 0xd7fff, fd_bios_2hd);
109 memset(sound_bios, 0xff, sizeof(sound_bios));
110 // memset(sound_bios_ram, 0x00, sizeof(sound_bios_ram));
111 sound_bios_selected = false;
112 // sound_bios_ram_selected = false;
113 if(config.sound_type == 0) {
114 sound_bios_selected = (read_bios(_T("SOUND.ROM"), sound_bios, sizeof(sound_bios)) != 0);
115 } else if(config.sound_type == 2) {
116 sound_bios_selected = (read_bios(_T("MUSIC.ROM"), sound_bios, sizeof(sound_bios)) != 0);
118 if(sound_bios_selected) {
119 d_display->sound_bios_ok();
122 #if defined(SUPPORT_SASI_IF)
123 memset(sasi_bios, 0xff, sizeof(sasi_bios));
124 memset(sasi_bios_ram, 0x00, sizeof(sasi_bios_ram));
125 sasi_bios_selected = (read_bios(_T("SASI.ROM"), sasi_bios, sizeof(sasi_bios)) != 0);
126 sasi_bios_ram_selected = false;
129 #if defined(SUPPORT_SCSI_IF)
130 memset(scsi_bios, 0xff, sizeof(scsi_bios));
131 memset(scsi_bios_ram, 0x00, sizeof(scsi_bios_ram));
132 scsi_bios_selected = (read_bios(_T("SCSI.ROM"), scsi_bios, sizeof(scsi_bios)) != 0);
133 scsi_bios_ram_selected = false;
136 #if defined(SUPPORT_IDE_IF)
137 memset(ide_bios, 0xff, sizeof(ide_bios));
138 // memset(ide_bios_ram, 0x00, sizeof(ide_bios_ram));
139 ide_bios_selected = (read_bios(_T("IDE.ROM"), ide_bios, sizeof(ide_bios)) != 0);
140 // ide_bios_ram_selected = false;
145 #if defined(SUPPORT_NEC_EMS)
146 memset(nec_ems, 0, sizeof(nec_ems));
156 #if defined(SUPPORT_BIOS_RAM)
157 bios_ram_selected = false;
159 #if defined(SUPPORT_ITF_ROM)
164 #if !defined(SUPPORT_HIRESO)
166 #if defined(SUPPORT_NEC_EMS)
167 nec_ems_selected = false;
172 #if defined(SUPPORT_24BIT_ADDRESS) || defined(SUPPORT_32BIT_ADDRESS)
173 #if !defined(SUPPORT_HIRESO)
174 dma_access_ctrl = 0xfe; // bit2 = 1, bit0 = 0
175 window_80000h = 0x80000;
176 window_a0000h = 0xa0000;
178 dma_access_ctrl = 0xfb; // bit2 = 0, bit0 = 1
179 window_80000h = 0x100000;
180 window_a0000h = 0x120000;
185 void MEMBUS::write_io8(uint32_t addr, uint32_t data)
188 #if defined(SUPPORT_ITF_ROM)
190 switch(data & 0xff) {
202 itf_selected = false;
209 #if !defined(SUPPORT_HIRESO)
211 switch(data & 0xff) {
213 #if defined(SUPPORT_NEC_EMS)
214 if(nec_ems_selected) {
215 nec_ems_selected = false;
221 #if defined(SUPPORT_NEC_EMS)
222 if(!nec_ems_selected) {
223 nec_ems_selected = true;
229 #if defined(SUPPORT_SASI_IF)
230 if(sasi_bios_ram_selected) {
231 sasi_bios_ram_selected = false;
232 if(sasi_bios_selected) {
237 #if defined(SUPPORT_SCSI_IF)
238 if(scsi_bios_ram_selected) {
239 scsi_bios_ram_selected = false;
240 if(scsi_bios_selected) {
247 #if defined(SUPPORT_SASI_IF)
248 if(!sasi_bios_ram_selected) {
249 sasi_bios_ram_selected = true;
250 if(sasi_bios_selected) {
257 #if defined(SUPPORT_SCSI_IF)
258 if(!scsi_bios_ram_selected) {
259 scsi_bios_ram_selected = true;
260 if(scsi_bios_selected) {
269 #if defined(SUPPORT_24BIT_ADDRESS) || defined(SUPPORT_32BIT_ADDRESS)
270 #if !defined(_PC98XA)
272 dma_access_ctrl = data;
275 #if !defined(SUPPORT_HIRESO)
285 window_80000h = (data & 0xfe) << 16;
287 #if !defined(SUPPORT_HIRESO)
297 window_a0000h = (data & 0xfe) << 16;
300 #if defined(SUPPORT_32BIT_ADDRESS)
302 #if !defined(SUPPORT_HIRESO)
303 if(sound_bios_selected != ((data & 0x80) != 0)) {
304 sound_bios_selected = ((data & 0x80) != 0);
307 #if defined(SUPPORT_SASI_IF)
308 if(sasi_bios_selected != ((data & 0x40) != 0)) {
309 sasi_bios_selected = ((data & 0x40) != 0);
313 #if defined(SUPPORT_SCSI_IF)
314 if(scsi_bios_selected != ((data & 0x20) != 0)) {
315 scsi_bios_selected = ((data & 0x20) != 0);
319 #if defined(SUPPORT_IDE_IF)
320 if(ide_bios_selected != ((data & 0x10) != 0)) {
321 ide_bios_selected = ((data & 0x10) != 0);
326 #if defined(SUPPORT_BIOS_RAM)
327 if(bios_ram_selected != ((data & 0x02) != 0)) {
328 bios_ram_selected = ((data & 0x02) != 0);
334 // dummy for no cases
340 uint32_t MEMBUS::read_io8(uint32_t addr)
343 #if defined(SUPPORT_24BIT_ADDRESS) || defined(SUPPORT_32BIT_ADDRESS)
344 #if !defined(_PC98XA)
346 return dma_access_ctrl;
348 #if !defined(SUPPORT_HIRESO)
353 return window_80000h >> 16;
354 #if !defined(SUPPORT_HIRESO)
359 return window_a0000h >> 16;
361 return (uint8_t)(sizeof(ram) >> 17);
363 // dummy for no cases
370 #if defined(SUPPORT_24BIT_ADDRESS) || defined(SUPPORT_32BIT_ADDRESS)
371 #if !defined(SUPPORT_HIRESO)
372 #define UPPER_MEMORY_24BIT 0x00fa0000
373 #define UPPER_MEMORY_32BIT 0xfffa0000
375 #define UPPER_MEMORY_24BIT 0x00fc0000
376 #define UPPER_MEMORY_32BIT 0xfffc0000
379 uint32_t MEMBUS::read_data8(uint32_t addr)
382 return MEMORY::read_data8(addr);
383 } else if(addr < 0xa0000) {
384 addr = (addr & 0x1ffff) | window_80000h;
385 } else if(addr < 0xc0000) {
386 addr = (addr & 0x1ffff) | window_a0000h;
388 if(addr < UPPER_MEMORY_24BIT) {
389 return MEMORY::read_data8(addr);
390 #if defined(SUPPORT_24BIT_ADDRESS)
393 } else if(addr < 0x1000000 || addr >= UPPER_MEMORY_32BIT) {
395 return MEMORY::read_data8(addr & 0xfffff);
400 void MEMBUS::write_data8(uint32_t addr, uint32_t data)
403 MEMORY::write_data8(addr, data);
405 } else if(addr < 0xa0000) {
406 addr = (addr & 0x1ffff) | window_80000h;
407 } else if(addr < 0xc0000) {
408 addr = (addr & 0x1ffff) | window_a0000h;
410 if(addr < UPPER_MEMORY_24BIT) {
411 MEMORY::write_data8(addr, data);
412 #if defined(SUPPORT_24BIT_ADDRESS)
415 } else if(addr < 0x1000000 || addr >= UPPER_MEMORY_32BIT) {
417 MEMORY::write_data8(addr & 0xfffff, data);
421 uint32_t MEMBUS::read_dma_data8(uint32_t addr)
423 if(dma_access_ctrl & 4) {
426 return MEMBUS::read_data8(addr);
429 void MEMBUS::write_dma_data8(uint32_t addr, uint32_t data)
431 if(dma_access_ctrl & 4) {
434 MEMBUS::write_data8(addr, data);
438 void MEMBUS::update_bios()
440 unset_memory_rw(0x100000 - sizeof(bios), 0xfffff);
441 #if defined(SUPPORT_ITF_ROM)
443 set_memory_r(0x100000 - sizeof(itf), 0xfffff, itf);
446 #if defined(SUPPORT_BIOS_RAM)
447 if(bios_ram_selected) {
448 set_memory_rw(0x100000 - sizeof(bios_ram), 0xfffff, bios_ram);
451 set_memory_r(0x100000 - sizeof(bios), 0xfffff, bios);
452 #if defined(SUPPORT_BIOS_RAM)
453 // set_memory_w(0x100000 - sizeof(bios_ram), 0xfffff, bios_ram);
456 #if defined(SUPPORT_ITF_ROM)
461 #if !defined(SUPPORT_HIRESO)
462 void MEMBUS::update_sound_bios()
464 if(sound_bios_selected) {
465 // if(sound_bios_selected) {
466 // set_memory_r(0xcc000, 0xcffff, sound_bios_ram);
468 set_memory_r(0xcc000, 0xcffff, sound_bios);
469 unset_memory_w(0xcc000, 0xcffff);
472 unset_memory_rw(0xcc000, 0xcffff);
476 #if defined(SUPPORT_SASI_IF)
477 void MEMBUS::update_sasi_bios()
479 if(sasi_bios_selected) {
480 if(sasi_bios_ram_selected) {
481 set_memory_rw(0xd7000, 0xd7fff, sasi_bios_ram);
483 set_memory_r(0xd7000, 0xd7fff, sasi_bios);
484 unset_memory_w(0xd7000, 0xd7fff);
487 unset_memory_rw(0xd7000, 0xd7fff);
492 #if defined(SUPPORT_SCSI_IF)
493 void MEMBUS::update_scsi_bios()
495 if(scsi_bios_selected) {
496 if(scsi_bios_ram_selected) {
497 set_memory_rw(0xdc000, 0xdcfff, scsi_bios_ram);
499 set_memory_r(0xdc000, 0xdcfff, scsi_bios);
500 unset_memory_w(0xdc000, 0xdcfff);
503 unset_memory_rw(0xdc000, 0xdcfff);
508 #if defined(SUPPORT_IDE_IF)
509 void MEMBUS::update_ide_bios()
511 if(ide_bios_selected) {
512 // if(ide_bios_selected) {
513 // set_memory_r(0xd8000, 0xdbfff, ide_bios_ram);
515 set_memory_r(0xd8000, 0xdbfff, ide_bios);
516 unset_memory_w(0xd8000, 0xdbfff);
519 unset_memory_rw(0xd8000, 0xdbfff);
524 #if defined(SUPPORT_NEC_EMS)
525 void MEMBUS::update_nec_ems()
527 if (nec_ems_selected) {
528 unset_memory_rw(0xb0000, 0xbffff);
529 set_memory_rw(0xb0000, 0xbffff, nec_ems);
531 unset_memory_rw(0xb0000, 0xbffff);
532 set_memory_mapped_io_rw(0xb0000, 0xbffff, d_display);
538 #define STATE_VERSION 4
540 bool MEMBUS::process_state(FILEIO* state_fio, bool loading)
542 if(!state_fio->StateCheckUint32(STATE_VERSION)) {
545 if(!state_fio->StateCheckInt32(this_device_id)) {
548 state_fio->StateBuffer(ram, sizeof(ram), 1);
549 #if defined(SUPPORT_BIOS_RAM)
550 state_fio->StateBuffer(bios_ram, sizeof(bios_ram), 1);
551 state_fio->StateBool(bios_ram_selected);
553 #if defined(SUPPORT_ITF_ROM)
554 state_fio->StateBool(itf_selected);
556 #if !defined(SUPPORT_HIRESO)
557 // state_fio->StateBuffer(sound_bios_ram, sizeof(sound_bios_ram), 1);
558 state_fio->StateBool(sound_bios_selected);
559 // state_fio->StateBool(sound_bios_ram_selected);
560 #if defined(SUPPORT_SASI_IF)
561 state_fio->StateBuffer(sasi_bios_ram, sizeof(sasi_bios_ram), 1);
562 state_fio->StateBool(sasi_bios_selected);
563 state_fio->StateBool(sasi_bios_ram_selected);
565 #if defined(SUPPORT_SCSI_IF)
566 state_fio->StateBuffer(scsi_bios_ram, sizeof(scsi_bios_ram), 1);
567 state_fio->StateBool(scsi_bios_selected);
568 state_fio->StateBool(scsi_bios_ram_selected);
570 #if defined(SUPPORT_IDE_IF)
571 // state_fio->StateBuffer(ide_bios_ram, sizeof(ide_bios_ram), 1);
572 state_fio->StateBool(ide_bios_selected);
573 // state_fio->StateBool(ide_bios_ram_selected);
575 #if defined(SUPPORT_NEC_EMS)
576 state_fio->StateBuffer(nec_ems, sizeof(nec_ems), 1);
577 state_fio->StateBool(nec_ems_selected);
580 #if defined(SUPPORT_24BIT_ADDRESS) || defined(SUPPORT_32BIT_ADDRESS)
581 state_fio->StateUint8(dma_access_ctrl);
582 state_fio->StateUint32(window_80000h);
583 state_fio->StateUint32(window_a0000h);
585 if(!MEMORY::process_state(state_fio, loading)) {
592 #if !defined(SUPPORT_HIRESO)
594 #if defined(SUPPORT_SASI_IF)
597 #if defined(SUPPORT_SCSI_IF)
600 #if defined(SUPPORT_IDE_IF)
603 #if defined(SUPPORT_EMS)