2 TOSHIBA J-3100GT Emulator 'eJ-3100GT'
3 TOSHIBA J-3100SL Emulator 'eJ-3100SL'
5 Author : Takeda.Toshiya
12 #include "../../emu.h"
13 #include "../device.h"
16 #include "../hd46505.h"
18 //#include "../i8250.h"
28 #include "../pcm1bit.h"
29 #include "../upd765a.h"
31 #include "../rp5c01.h"
33 #include "../hd146818p.h"
41 #include "slkeyboard.h"
50 // ----------------------------------------------------------------------------
52 // ----------------------------------------------------------------------------
54 VM::VM(EMU* parent_emu) : emu(parent_emu)
57 first_device = last_device = NULL;
58 dummy = new DEVICE(this, emu); // must be 1st device
59 event = new EVENT(this, emu); // must be 2nd device
60 dummy->set_device_name(_T("1st Dummy"));
62 crtc = new HD46505(this, emu);
63 dma = new I8237(this, emu);
65 dma2 = new I8237(this, emu);
68 dma->set_device_name(_T("i8237 DMAC #1"));
69 dma2->set_device_name(_T("i8237 DMAC #2"));
71 // sio = new I8250(this, emu);
72 pit = new I8253(this, emu); // i8254
73 pic = new I8259(this, emu);
75 cpu = new I286(this, emu);
77 cpu = new I86(this, emu);
79 io = new IO(this, emu);
80 pcm = new PCM1BIT(this, emu);
81 fdc = new UPD765A(this, emu);
82 fdc->set_context_noise_seek(new NOISE(this, emu));
83 fdc->set_context_noise_head_down(new NOISE(this, emu));
84 fdc->set_context_noise_head_up(new NOISE(this, emu));
86 rtc = new RP5C01(this, emu);
88 rtc = new HD146818P(this, emu);
91 display = new DISPLAY(this, emu);
92 dmareg = new DMAREG(this, emu);
93 floppy = new FLOPPY(this, emu);
94 keyboard = new KEYBOARD(this, emu);
95 memory = new MEMORY(this, emu);
96 sasi = new SASI(this, emu);
97 system = new SYSTEM(this, emu);
99 event->set_context_cpu(cpu);
100 event->set_context_sound(pcm);
101 event->set_context_sound(fdc->get_context_noise_seek());
102 event->set_context_sound(fdc->get_context_noise_head_down());
103 event->set_context_sound(fdc->get_context_noise_head_up());
106 cpu->set_context_mem(memory);
107 cpu->set_context_io(io);
108 cpu->set_context_intr(pic);
111 io->set_iomap_range_rw(0x00, 0x0f, dma);
112 io->set_iomap_range_w(0x80, 0x8f, dmareg);
113 dma->set_context_memory(memory);
114 dma->set_context_ch2(fdc);
115 dmareg->set_context_dma(dma);
117 for(int i = 0xc0; i <= 0xde; i += 2) {
118 io->set_iomap_alias_rw(i, dma2, i >> 1);
120 dma2->set_context_memory(memory);
121 dma2->set_mode_word(true);
122 dmareg->set_context_dma2(dma2);
126 io->set_iomap_alias_rw(0x20, pic, I8259_ADDR_CHIP0 | 0);
127 io->set_iomap_alias_rw(0x21, pic, I8259_ADDR_CHIP0 | 1);
129 io->set_iomap_alias_rw(0xa0, pic, I8259_ADDR_CHIP1 | 0);
130 io->set_iomap_alias_rw(0xa1, pic, I8259_ADDR_CHIP1 | 1);
132 pic->set_context_cpu(cpu);
135 io->set_iomap_range_rw(0x40, 0x43, pit);
136 pit->set_constant_clock(0, 1190000);
137 pit->set_constant_clock(1, 1190000);
138 pit->set_constant_clock(2, 1190000);
139 pit->set_context_ch0(pic, SIG_I8259_IR0 | SIG_I8259_CHIP0, 1); // to PIC#0 IR0
140 pit->set_context_ch2(pcm, SIG_PCM1BIT_SIGNAL, 1);
142 pit->set_context_ch2(system, SIG_SYSTEM_TC2O, 1);
145 // system status/command
147 io->set_iomap_single_rw(0x61, system);
148 system->set_context_pcm(pcm);
149 system->set_context_pit(pit);
154 io->set_iomap_range_rw(0x2c0, 0x2cf, rtc);
156 io->set_iomap_alias_w(0x70, rtc, 1); // bit7 = nmi mask
157 io->set_iomap_alias_rw(0x71, rtc, 0);
158 rtc->set_context_intr(pic, SIG_I8259_IR0 | SIG_I8259_CHIP1, 1); // to PIC#1 IR0 (IR8)
163 io->set_iomap_single_w(0xa0, system);
165 // 0x70 bit7 (not implemented)
169 io->set_iomap_range_rw(0x3d0, 0x3d1, crtc);
170 io->set_iomap_range_rw(0x3d4, 0x3d5, crtc);
171 io->set_iomap_range_w(0x3d8, 0x3d9, display);
172 io->set_iomap_single_r(0x3da, display);
173 crtc->set_context_disp(display, SIG_DISPLAY_ENABLE, 1);
174 crtc->set_context_vblank(display, SIG_DISPLAY_VBLANK, 1);
175 display->set_regs_ptr(crtc->get_regs());
176 display->set_vram_ptr(memory->get_vram());
179 io->set_iomap_single_w(0x3f2, floppy);
180 io->set_iomap_range_rw(0x3f4, 0x3f5, fdc);
181 io->set_iomap_single_rw(0x3f7, floppy);
182 fdc->set_context_irq(pic, SIG_I8259_IR6 | SIG_I8259_CHIP0, 1); // to PIC#0 IR6
183 fdc->set_context_drq(dma, SIG_I8237_CH2, 1); // to DMA Ch.2
184 floppy->set_context_fdc(fdc);
187 io->set_flipflop_single_rw(0x378, 0x00);
188 io->set_iovalue_single_r(0x379, 0x78);
189 io->set_flipflop_single_rw(0x37a, 0x00);
193 io->set_iomap_range_rw(0x60, 0x61, keyboard);
196 keyboard->set_context_pic(pic);
201 #if defined(_J3100GT) || defined(TYPE_SL)
202 io->set_iomap_range_rw(0x1f0, 0x1f3, sasi);
203 sasi->set_context_pic(pic);
207 static const int ems_addr[] = {
208 0x208, 0x4208, 0x8208, 0xc208,
209 0x218, 0x4218, 0x8218, 0xc218,
210 0x258, 0x4258, 0x8258, 0xc258,
211 0x268, 0x4268, 0x8268, 0xc268,
213 0x2a8, 0x42a8, 0x82a8, 0xc2a8,
214 0x2b8, 0x42b8, 0x82b8, 0xc2b8,
215 0x2e8, 0x42e8, 0x82e8, 0xc2e8,
218 for(int i = 0; i < array_length(ems_addr); i++) {
219 io->set_iomap_single_rw(ems_addr[i], memory);
221 io->set_iomap_single_w(ems_addr[i] + 1, memory);
225 io->set_iomap_range_rw(0xee, 0xef, memory);
228 // special registers for J-3100SL/SS/SE
231 // bit1 1=8087
\82 \82è
232 io->set_iovalue_single_r(0x62, 0x26); // unknown
233 // io->set_flipflop_single_rw(0x63, 0x00); // unknown
234 static const int iovalues[0x20] = {
235 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x14, 0xff, 0xff, 0x00, 0xff, 0xe0, 0xff, 0x00, 0xff, 0xff,
236 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
238 for(int i = 0xe0; i <= 0xff; i++) {
239 if(i == 0xee && i == 0xef) {
242 io->set_flipflop_single_rw(i, iovalues[i & 0x1f]);
245 // initialize all devices
246 for(DEVICE* device = first_device; device; device = device->next_device) {
247 device->initialize();
250 pcm->set_realtime_render(true);
256 // delete all devices
257 for(DEVICE* device = first_device; device;) {
258 DEVICE *next_device = device->next_device;
261 device = next_device;
265 DEVICE* VM::get_device(int id)
267 for(DEVICE* device = first_device; device; device = device->next_device) {
268 if(device->this_device_id == id) {
275 // ----------------------------------------------------------------------------
276 // drive virtual machine
277 // ----------------------------------------------------------------------------
282 for(DEVICE* device = first_device; device; device = device->next_device) {
292 // ----------------------------------------------------------------------------
294 // ----------------------------------------------------------------------------
296 void VM::draw_screen()
298 display->draw_screen();
301 // ----------------------------------------------------------------------------
303 // ----------------------------------------------------------------------------
305 void VM::initialize_sound(int rate, int samples)
307 // init sound manager
308 event->initialize_sound(rate, samples);
311 pcm->initialize_sound(rate, 8000);
314 uint16_t* VM::create_sound(int* extra_frames)
316 return event->create_sound(extra_frames);
319 int VM::get_sound_buffer_ptr()
321 return event->get_sound_buffer_ptr();
324 #ifdef USE_SOUND_VOLUME
325 void VM::set_sound_device_volume(int ch, int decibel_l, int decibel_r)
328 pcm->set_volume(0, decibel_l, decibel_r);
330 fdc->get_context_noise_seek()->set_volume(0, decibel_l, decibel_r);
331 fdc->get_context_noise_head_down()->set_volume(0, decibel_l, decibel_r);
332 fdc->get_context_noise_head_up()->set_volume(0, decibel_l, decibel_r);
337 // ----------------------------------------------------------------------------
339 // ----------------------------------------------------------------------------
341 void VM::key_down(int code, bool repeat)
343 keyboard->key_down(code);
346 void VM::key_up(int code)
348 keyboard->key_up(code);
351 // ----------------------------------------------------------------------------
353 // ----------------------------------------------------------------------------
355 void VM::open_floppy_disk(int drv, const _TCHAR* file_path, int bank)
357 fdc->open_disk(drv, file_path, bank);
360 void VM::close_floppy_disk(int drv)
362 fdc->close_disk(drv);
365 bool VM::is_floppy_disk_inserted(int drv)
367 return fdc->is_disk_inserted(drv);
370 void VM::is_floppy_disk_protected(int drv, bool value)
372 fdc->is_disk_protected(drv, value);
375 bool VM::is_floppy_disk_protected(int drv)
377 return fdc->is_disk_protected(drv);
380 uint32_t VM::is_floppy_disk_accessed()
382 return fdc->read_signal(0);
385 bool VM::is_frame_skippable()
387 return event->is_frame_skippable();
390 void VM::update_config()
392 for(DEVICE* device = first_device; device; device = device->next_device) {
393 device->update_config();