2 * FM-7 Main I/O [fm7_mainio.h]
4 * Author: K.Ohta <whatisthis.sowhat _at_ gmail.com>
7 * Jan 03, 2015 : Initial
12 #include "fm7_mainio.h"
14 #include "../mc6809.h"
17 #include "../datarec.h"
23 FM7_MAINIO::FM7_MAINIO(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
37 cmt_indat = false; // bit7
38 cmt_invert = false; // Invert signal
47 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
48 defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
49 stat_kanjirom = true; // R/W : bit5, '0' = sub, '1' = main. FM-77 Only.
50 #elif defined(_FM77_VARIANTS)
51 stat_fdmode_2hd = false; // R/W : bit6, '0' = 2HD, '1' = 2DD. FM-77 Only.
52 stat_kanjirom = true; // R/W : bit5, '0' = sub, '1' = main. FM-77 Only.
53 stat_400linecard = false;// R/W : bit4, '0' = connected. FM-77 Only.
55 firq_break_key = false; // bit1, ON = '0'.
56 firq_sub_attention = false; // bit0, ON = '0'.
57 intmode_fdc = false; // bit2, '0' = normal, '1' = SFD.
61 z80_sel = false; // bit0 : '1' = Z80. Maybe only FM-7/77.
64 intstat_syndet = false;
65 intstat_rxrdy = false;
66 intstat_txrdy = false;
70 stat_romrammode = true; // ROM ON
76 opn_address[0] = 0x00;
85 for(i = 0; i < 3; i++) {
86 opn_address[i] = 0x00;
94 intstat_mouse = false;
108 // FD20, FD21, FD22, FD23
109 connect_kanjiroml1 = false;
110 #if defined(_FM77AV_VARIANTS)
111 // FD2C, FD2D, FD2E, FD2F
112 connect_kanjiroml2 = false;
114 #if defined(_FM77_VARIANTS) || defined(_FM77AV_VARIANTS)
120 memset(io_w_latch, 0xff, 0x100);
121 initialize_output_signals(&clock_status);
122 initialize_output_signals(&printer_reset_bus);
123 initialize_output_signals(&printer_strobe_bus);
124 initialize_output_signals(&printer_select_bus);
127 FM7_MAINIO::~FM7_MAINIO()
133 void FM7_MAINIO::initialize()
136 event_beep_oneshot = -1;
138 event_fdc_motor = -1;
140 #if defined(_FM77_VARIANTS) || defined(_FM77AV_VARIANTS)
142 # if defined(_FM77_VARIANTS)
143 stat_fdmode_2hd = false;
144 stat_kanjirom = true;
145 stat_400linecard = false;
146 # if defined(_FM77L4)
147 stat_400linecard = true;
151 irqmask_syndet = true;
152 irqmask_rxrdy = true;
153 irqmask_txrdy = true;
155 irqmask_timer = true;
156 irqmask_printer = true;
157 irqmask_keyboard = true;
160 intstat_syndet = false;
161 intstat_rxrdy = false;
162 intstat_txrdy = false;
163 irqstat_timer = false;
164 irqstat_printer = false;
165 irqstat_keyboard = false;
167 irqreq_syndet = false;
168 irqreq_rxrdy = false;
169 irqreq_txrdy = false;
170 irqreq_printer = false;
171 irqreq_keyboard = false;
172 #if defined(_FM77AV_VARIANTS)
178 void FM7_MAINIO::reset()
180 if(event_beep >= 0) cancel_event(this, event_beep);
182 if(event_beep_oneshot >= 0) cancel_event(this, event_beep_oneshot);
183 event_beep_oneshot = -1;
184 if(event_timerirq >= 0) cancel_event(this, event_timerirq);
187 register_event(this, EVENT_BEEP_CYCLE, (1000.0 * 1000.0) / (1200.0 * 2.0), true, &event_beep);
189 #if defined(_FM77AV_VARIANTS)
193 #if defined(_FM77_VARIANTS)
194 //boot_ram = (mainmem->read_signal(FM7_MAINIO_BOOTRAM_RW) == 0) ? false : true;
196 #elif defined(_FM77AV_VARIANTS)
197 //boot_ram = (mainmem->read_signal(FM7_MAINIO_BOOTRAM_RW) == 0) ? false : true;
202 sub_cancel = false; // bit6 : '1' Cancel req.
203 sub_halt = false; // bit6 : '1' Cancel req.
204 sub_cancel_bak = sub_cancel; // bit6 : '1' Cancel req.
205 sub_halt_bak = sub_halt; // bit6 : '1' Cancel req.
208 cmt_indat = false; // bit7
209 cmt_invert = false; // Invert signal
213 lpt_ackng_inv = true;
214 lpt_error_inv = true;
216 lpt_type = config.printer_device_type;
219 //stat_romrammode = true;
220 // IF BASIC BOOT THEN ROM
222 //mainmem->write_signal(FM7_MAINIO_PUSH_FD0F, ((config.boot_mode & 3) == 0) ? 0xffffffff : 0, 0xffffffff);
223 #if defined(_FM77AV_VARIANTS)
224 sub_monitor_type = 0x00;
226 switch(config.cpu_type){
234 this->write_signals(&clock_status, clock_fast ? 0xffffffff : 0);
237 irqmask_syndet = true;
238 irqmask_rxrdy = true;
239 irqmask_txrdy = true;
241 irqmask_timer = true;
242 irqmask_printer = true;
243 irqmask_keyboard = true;
246 intstat_syndet = false;
247 intstat_rxrdy = false;
248 intstat_txrdy = false;
249 irqstat_timer = false;
250 irqstat_printer = false;
251 //irqstat_keyboard = false;
253 irqreq_syndet = false;
254 irqreq_rxrdy = false;
255 irqreq_txrdy = false;
256 irqreq_printer = false;
257 //irqreq_keyboard = false;
259 drec->write_signal(SIG_DATAREC_MIC, 0x00, 0x01);
260 drec->write_signal(SIG_DATAREC_REMOTE, 0x00, 0x02);
265 firq_break_key = (keyboard->read_signal(SIG_FM7KEY_BREAK_KEY) != 0x00000000); // bit1, ON = '0'.
266 set_sub_attention(false);
267 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
268 defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
269 stat_kanjirom = true; // R/W : bit5, '0' = sub, '1' = main. FM-77 Only.
270 #elif defined(_FM77_VARIANTS)
271 stat_fdmode_2hd = false; // R/W : bit6, '0' = 2HD, '1' = 2DD. FM-77 Only.
272 stat_kanjirom = true; // R/W : bit5, '0' = sub, '1' = main. FM-77 Only.
274 maincpu->write_signal(SIG_CPU_FIRQ, 0, 1);
279 #if defined(_FM77AV_VARIANTS)
283 register_event(this, EVENT_TIMERIRQ_ON, 10000.0 / 4.9152, true, &event_timerirq); // TIMER IRQ
285 memset(io_w_latch, 0xff, 0x100);
288 void FM7_MAINIO::reset_printer()
292 this->write_signals(&printer_strobe_bus, 0);
293 this->write_signals(&printer_select_bus, 0xffffffff);
294 this->write_signals(&printer_reset_bus, 0xffffffff);
295 register_event(this, EVENT_PRINTER_RESET_COMPLETED, 5.0 * 1000.0, false, NULL);
297 printer->write_signal(SIG_PRINTER_STROBE, 0x00, 0xff);
301 void FM7_MAINIO::set_clockmode(uint8 flags)
304 if((flags & FM7_MAINCLOCK_SLOW) != 0) {
309 if(f != clock_fast) {
310 this->write_signal(FM7_MAINIO_CLOCKMODE, clock_fast ? 1 : 0, 1);
311 //mainmem->write_signal(FM7_MAINIO_CLOCKMODE, clock_fast ? 1 : 0, 1);
315 uint8 FM7_MAINIO::get_clockmode(void)
317 if(!clock_fast) return FM7_MAINCLOCK_SLOW;
318 return FM7_MAINCLOCK_HIGH;
322 uint8 FM7_MAINIO::get_port_fd00(void)
324 uint8 ret = 0x7e; //0b01111110;
328 if(keyboard->read_data8(0x00) != 0) ret |= 0x80; // High bit.
330 if(clock_fast) ret |= 0x01; //0b00000001;
334 void FM7_MAINIO::set_port_fd00(uint8 data)
336 drec->write_signal(SIG_DATAREC_MIC, data, 0x01);
337 drec->write_signal(SIG_DATAREC_REMOTE, data, 0x02);
338 lpt_slctin = ((data & 0x80) == 0);
339 lpt_strobe = ((data & 0x40) != 0);
340 this->write_signals(&printer_strobe_bus, lpt_strobe ? 0xffffffff : 0);
341 this->write_signals(&printer_select_bus, lpt_slctin ? 0xffffffff : 0);
342 if((lpt_type == 0) && (lpt_slctin)) {
343 printer->write_signal(SIG_PRINTER_STROBE, lpt_strobe ? 0xff : 0x00, 0xff);
347 uint8 FM7_MAINIO::get_port_fd02(void)
350 bool ack_bak = lpt_ackng_inv;
351 // Still unimplemented printer.
352 ret = (cmt_indat) ? 0xff : 0x7f; // CMT
355 lpt_busy = (printer->read_signal(SIG_PRINTER_BUSY) != 0);
356 lpt_error_inv = true;
357 lpt_ackng_inv = (printer->read_signal(SIG_PRINTER_ACK) != 0);
359 } else if((lpt_type == 1) || (lpt_type == 2)) {
360 lpt_pe = (joystick->read_data8(lpt_type + 1) != 0); // check joy port;
362 lpt_error_inv = true;
363 lpt_ackng_inv = true;
366 lpt_error_inv = true;
367 lpt_ackng_inv = true;
370 ret &= (lpt_busy) ? 0xff : ~0x01;
371 ret &= (lpt_error_inv) ? 0xff : ~0x02;
372 ret &= (lpt_ackng_inv) ? 0xff : ~0x04;
373 ret &= (lpt_pe) ? 0xff : ~0x08;
374 ret &= (lpt_det1) ? 0xff : ~0x10;
375 ret &= (lpt_det2) ? 0xff : ~0x20;
376 if((lpt_ackng_inv == true) && (ack_bak == false)) set_irq_printer(true);
380 void FM7_MAINIO::set_port_fd02(uint8 val)
384 bool syndetirq_bak = irqmask_syndet;
385 bool rxrdyirq_bak = irqmask_rxrdy;
386 bool txrdyirq_bak = irqmask_txrdy;
388 bool keyirq_bak = irqmask_keyboard;
389 bool timerirq_bak = irqmask_timer;
390 bool printerirq_bak = irqmask_printer;
391 bool mfdirq_bak = irqmask_mfd;
393 // if((val & 0b00010000) != 0) {
394 if((val & 0x80) != 0) {
395 irqmask_syndet = false;
397 irqmask_syndet = true;
399 if(syndetirq_bak != irqmask_syndet) {
400 set_irq_txrdy(irqreq_syndet);
402 if((val & 0x40) != 0) {
403 irqmask_rxrdy = false;
405 irqmask_rxrdy = true;
407 // if(rxrdyirq_bak != irqmask_rxrdy) {
408 // set_irq_rxrdy(irqreq_rxrdy);
410 if((val & 0x20) != 0) {
411 irqmask_txrdy = false;
413 irqmask_txrdy = true;
415 // if(txrdyirq_bak != irqmask_txrdy) {
416 // set_irq_txrdy(irqreq_txrdy);
419 if((val & 0x10) != 0) {
424 // if(mfdirq_bak != irqmask_mfd) {
425 // set_irq_mfd(irqreq_fdc);
428 if((val & 0x04) != 0) {
429 irqmask_timer = false;
431 irqmask_timer = true;
433 // if(timerirq_bak != irqmask_timer) {
434 // set_irq_timer(false);
437 if((val & 0x02) != 0) {
438 irqmask_printer = false;
440 irqmask_printer = true;
442 // if(printerirq_bak != irqmask_printer) {
443 // set_irq_printer(irqreq_printer);
446 if((val & 0x01) != 0) {
447 irqmask_keyboard = false;
449 irqmask_keyboard = true;
451 if(keyirq_bak != irqmask_keyboard) {
452 display->write_signal(SIG_FM7_SUB_KEY_MASK, irqmask_keyboard ? 1 : 0, 1);
453 set_irq_keyboard(irqreq_keyboard);
459 void FM7_MAINIO::set_irq_syndet(bool flag)
461 bool backup = intstat_syndet;
462 irqreq_syndet = flag;
464 intstat_syndet = flag;
466 if(flag && !(irqmask_syndet)) {
467 //irqstat_reg0 &= ~0x80; //~0x20;
468 intstat_syndet = true;
470 // irqstat_reg0 |= 0x80;
471 intstat_syndet = false;
474 if(backup != intstat_syndet) do_irq();
478 void FM7_MAINIO::set_irq_rxrdy(bool flag)
480 bool backup = intstat_rxrdy;
483 intstat_rxrdy = flag;
485 if(flag && !(irqmask_rxrdy)) {
486 //irqstat_reg0 &= ~0x40; //~0x20;
487 intstat_rxrdy = true;
489 //irqstat_reg0 |= 0x40;
490 intstat_rxrdy = false;
493 if(backup != intstat_rxrdy) do_irq();
498 void FM7_MAINIO::set_irq_txrdy(bool flag)
500 bool backup = intstat_txrdy;
503 intstat_txrdy = flag;
505 if(flag && !(irqmask_txrdy)) {
506 //irqstat_reg0 &= ~0x20; //~0x20;
507 intstat_txrdy = true;
509 //irqstat_reg0 |= 0x20;
510 intstat_txrdy = false;
513 if(backup != intstat_txrdy) do_irq();
517 void FM7_MAINIO::set_irq_timer(bool flag)
520 bool backup = irqstat_timer;
522 irqstat_reg0 &= 0xfb; //~0x04;
523 irqstat_timer = true;
525 irqstat_reg0 |= 0x04;
526 irqstat_timer = false;
528 //if(backup != irqstat_timer) do_irq();
533 void FM7_MAINIO::set_irq_printer(bool flag)
536 uint8 backup = irqstat_reg0;
537 irqreq_printer = flag;
538 if(flag && !(irqmask_printer)) {
539 irqstat_reg0 &= ~0x02;
540 irqstat_printer = true;
542 irqstat_reg0 |= 0x02;
543 irqstat_printer = false;
549 void FM7_MAINIO::set_irq_keyboard(bool flag)
551 //uint8 backup = irqstat_reg0;
552 //printf("MAIN: KEYBOARD: IRQ=%d MASK=%d\n", flag ,irqmask_keyboard);
553 irqreq_keyboard = flag;
554 if(flag && !irqmask_keyboard) {
555 irqstat_reg0 &= 0xfe;
556 irqstat_keyboard = true;
558 irqstat_reg0 |= 0x01;
559 irqstat_keyboard = false;
565 void FM7_MAINIO::do_irq(void)
569 intstat = intstat_txrdy | intstat_rxrdy | intstat_syndet;
571 intstat = irqstat_timer | irqstat_keyboard | irqstat_printer;
572 intstat = intstat | irqstat_fdc;
573 intstat = intstat | intstat_opn | intstat_whg | intstat_thg;
574 intstat = intstat | intstat_txrdy | intstat_rxrdy | intstat_syndet;
575 intstat = intstat | intstat_mouse;
576 # if defined(HAS_DMA)
577 intstat = intstat | intstat_dma;
580 //printf("%08d : IRQ: REG0=%02x FDC=%02x, stat=%d\n", SDL_GetTicks(), irqstat_reg0, irqstat_fdc, intstat);
582 maincpu->write_signal(SIG_CPU_IRQ, 1, 1);
584 maincpu->write_signal(SIG_CPU_IRQ, 0, 1);
588 void FM7_MAINIO::do_firq(void)
591 firq_stat = firq_break_key | firq_sub_attention;
593 maincpu->write_signal(SIG_CPU_FIRQ, 1, 1);
595 maincpu->write_signal(SIG_CPU_FIRQ, 0, 1);
597 p_emu->out_debug_log(_T("IO: do_firq(). BREAK=%d ATTN=%d"), firq_break_key ? 1 : 0, firq_sub_attention ? 1 : 0);
601 void FM7_MAINIO::do_nmi(bool flag)
603 maincpu->write_signal(SIG_CPU_NMI, flag ? 1 : 0, 1);
607 void FM7_MAINIO::set_break_key(bool pressed)
609 firq_break_key = pressed;
613 void FM7_MAINIO::set_sub_attention(bool flag)
615 firq_sub_attention = flag;
620 uint8 FM7_MAINIO::get_fd04(void)
623 if(display->read_signal(SIG_DISPLAY_BUSY) != 0) val |= 0x80;
624 if(!firq_break_key) val |= 0x02;
625 if(!firq_sub_attention) {
628 #if defined(_FM77_VARIANTS)
629 if(stat_fdmode_2hd) val |= 0x40;
630 if(stat_kanjirom) val |= 0x20;
631 if(stat_400linecard) val |= 0x10;
632 if((display->read_signal(SIG_DISPLAY_EXTRA_MODE) & 0x04) != 0x00) val |= 0x04;
636 if(firq_sub_attention) {
637 set_sub_attention(false);
638 //printf("Attention \n");
640 #if defined(_FM77AV_VARIANTS)
642 if(mainmem->read_signal(FM7_MAINIO_INITROM_ENABLED) == 0) {
643 set_break_key(false);
651 void FM7_MAINIO::set_fd04(uint8 val)
654 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
655 display->write_signal(SIG_DISPLAY_EXTRA_MODE, val, 0xff);
656 stat_kanjirom = ((val & 0x20) != 0);
657 #elif defined(_FM77_VARIANTS)
658 display->write_signal(SIG_DISPLAY_EXTRA_MODE, val, 0xff);
659 stat_fdmode_2hd = ((val & 0x40) != 0);
660 stat_kanjirom = ((val & 0x20) != 0);
661 stat_400linecard = ((val & 0x10) != 0);
666 uint8 FM7_MAINIO::get_fd05(void)
669 //val = (sub_busy) ? 0xfe : 0x7e;
670 if(display->read_signal(SIG_DISPLAY_BUSY) != 0) val |= 0x80;
671 if(!extdet_neg) val |= 0x01;
672 //printf("FD05: READ: %d VAL=%02x\n", SDL_GetTicks(), val);
676 void FM7_MAINIO::set_fd05(uint8 val)
678 sub_cancel = ((val & 0x40) != 0) ? true : false;
679 sub_halt = ((val & 0x80) != 0) ? true : false;
680 //if(sub_halt != sub_halt_bak) {
681 display->write_signal(SIG_DISPLAY_HALT, (sub_halt) ? 0xff : 0x00, 0xff);
683 sub_halt_bak = sub_halt;
685 //if(sub_cancel != sub_cancel_bak) {
686 display->write_signal(SIG_FM7_SUB_CANCEL, (sub_cancel) ? 0xff : 0x00, 0xff); // HACK
688 sub_cancel_bak = sub_cancel;
690 if((val & 0x01) != 0) {
691 maincpu->write_signal(SIG_CPU_BUSREQ, 1, 1);
692 z80->write_signal(SIG_CPU_BUSREQ, 0, 1);
694 maincpu->write_signal(SIG_CPU_BUSREQ, 0, 1);
695 z80->write_signal(SIG_CPU_BUSREQ, 1, 1);
700 void FM7_MAINIO::set_extdet(bool flag)
705 void FM7_MAINIO::write_fd0f(void)
708 if((config.dipswitch & FM7_DIPSW_FM8_PROTECT_FD0F) != 0) {
711 config.boot_mode = 1; // DOS : Where BUBBLE?
712 mainmem->write_signal(FM7_MAINIO_BOOTMODE, config.boot_mode, 0xffffffff);
713 mainmem->write_signal(FM7_MAINIO_IS_BASICROM, 0, 0xffffffff);
715 mainmem->write_signal(FM7_MAINIO_PUSH_FD0F, 0, 0xffffffff);
717 uint8 FM7_MAINIO::read_fd0f(void)
720 if((config.dipswitch & FM7_DIPSW_FM8_PROTECT_FD0F) != 0) {
723 config.boot_mode = 0; // BASIC
724 mainmem->write_signal(FM7_MAINIO_BOOTMODE, config.boot_mode, 0xffffffff);
725 mainmem->write_signal(FM7_MAINIO_IS_BASICROM, 0xffffffff, 0xffffffff);
727 mainmem->write_signal(FM7_MAINIO_PUSH_FD0F, 0xffffffff, 0xffffffff);
731 bool FM7_MAINIO::get_rommode_fd0f(void)
733 return (mainmem->read_signal(FM7_MAINIO_PUSH_FD0F) == 0) ? false : true;
737 // Kanji ROM, FD20 AND FD21 (or SUBSYSTEM)
738 void FM7_MAINIO::write_kanjiaddr_hi(uint8 addr)
740 if(!connect_kanjiroml1) return;
741 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
742 defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
743 if(!stat_kanjirom) return;
745 kanjiclass1->write_data8(KANJIROM_ADDR_HI, addr);
749 void FM7_MAINIO::write_kanjiaddr_lo(uint8 addr)
751 if(!connect_kanjiroml1) return;
752 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
753 defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
754 if(!stat_kanjirom) return;
756 kanjiclass1->write_data8(KANJIROM_ADDR_LO, addr);
760 uint8 FM7_MAINIO::read_kanjidata_left(void)
762 if(!connect_kanjiroml1) return 0xff;
763 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
764 defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
765 if(!stat_kanjirom) return 0xff;
767 //printf("KANJI MAIN CLASS1 ADDR: %05x\n", kaddress.w.l);
769 return kanjiclass1->read_data8(KANJIROM_DATA_HI);
775 uint8 FM7_MAINIO::read_kanjidata_right(void)
777 if(!connect_kanjiroml1) return 0xff;
778 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
779 defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
780 if(!stat_kanjirom) return 0xff;
783 return kanjiclass1->read_data8(KANJIROM_DATA_LO);
789 #ifdef CAPABLE_KANJI_CLASS2
790 // Kanji ROM, FD20 AND FD21 (or SUBSYSTEM)
791 void FM7_MAINIO::write_kanjiaddr_hi_l2(uint8 addr)
793 if(!connect_kanjiroml2) return;
794 if(!stat_kanjirom) return;
795 kanjiclass2->write_data8(KANJIROM_ADDR_HI, addr);
799 void FM7_MAINIO::write_kanjiaddr_lo_l2(uint8 addr)
801 if(!connect_kanjiroml2) return;
802 if(!stat_kanjirom) return;
803 kanjiclass2->write_data8(KANJIROM_ADDR_LO, addr);
808 uint8 FM7_MAINIO::read_kanjidata_left_l2(void)
810 if(!connect_kanjiroml2) return 0xff;
811 if(!stat_kanjirom) return 0xff;
814 return kanjiclass2->read_data8(KANJIROM_DATA_HI);
820 uint8 FM7_MAINIO::read_kanjidata_right_l2(void)
822 if(!connect_kanjiroml2) return 0xff;
823 if(!stat_kanjirom) return 0xff;
826 return kanjiclass2->read_data8(KANJIROM_DATA_LO);
834 uint32 FM7_MAINIO::read_signal(int id)
838 case FM7_MAINIO_KEYBOARDIRQ_MASK:
839 retval = (irqmask_keyboard) ? 0xffffffff : 0x00000000;
849 void FM7_MAINIO::write_signal(int id, uint32 data, uint32 mask)
852 val_b = ((data & mask) != 0);
855 //case SIG_FM7_SUB_HALT:
856 // mainmem->write_signal(SIG_FM7_SUB_HALT, data, mask);
858 case FM7_MAINIO_CLOCKMODE: // fd00
864 this->write_signals(&clock_status, clock_fast ? 0xffffffff : 0);
866 case FM7_MAINIO_CMT_RECV: // FD02
867 cmt_indat = val_b ^ cmt_invert;
869 case FM7_MAINIO_CMT_INVERT: // FD02
872 case FM7_MAINIO_TIMERIRQ: //
873 set_irq_timer(val_b);
875 case FM7_MAINIO_LPTIRQ: //
876 set_irq_printer(val_b);
878 case FM7_MAINIO_LPT_BUSY:
881 case FM7_MAINIO_LPT_ERROR:
882 lpt_error_inv = val_b;
884 case FM7_MAINIO_LPT_ACK:
886 bool f = lpt_ackng_inv;
887 lpt_ackng_inv = val_b;
888 if((lpt_ackng_inv == true) && (f == false)) set_irq_printer(true);
891 case FM7_MAINIO_LPT_PAPER_EMPTY:
894 case FM7_MAINIO_LPT_DET1:
897 case FM7_MAINIO_LPT_DET2:
900 case FM7_MAINIO_KEYBOARDIRQ: //
901 set_irq_keyboard(val_b);
904 case FM7_MAINIO_PUSH_BREAK:
905 set_break_key(val_b);
907 #if defined(FM77AV_VARIANTS)
908 case FM7_MAINIO_HOT_RESET:
912 case FM7_MAINIO_SUB_ATTENTION:
913 if(val_b) set_sub_attention(true);
916 case FM7_MAINIO_EXTDET:
919 case FM7_MAINIO_BEEP:
922 case FM7_MAINIO_PSG_IRQ:
925 case FM7_MAINIO_OPN_IRQ:
926 if(!connect_opn) break;
930 case FM7_MAINIO_WHG_IRQ:
931 if(!connect_whg) break;
935 case FM7_MAINIO_THG_IRQ:
936 if(!connect_thg) break;
941 case FM7_MAINIO_FDC_DRQ:
944 case FM7_MAINIO_FDC_IRQ:
948 case FM7_MAINIO_DMA_INT:
953 #if defined(_FM77AV_VARIANTS)
954 case SIG_DISPLAY_DISPLAY:
961 case SIG_DISPLAY_VSYNC:
968 case SIG_DISPLAY_MODE320:
980 uint8 FM7_MAINIO::get_irqstat_fd03(void)
985 extirq = irqstat_fdc | intstat_opn | intstat_whg | intstat_thg;
986 extirq = extirq | intstat_syndet | intstat_rxrdy | intstat_txrdy;
987 # if defined(HAS_DMA)
988 extirq = extirq | intstat_dma;
991 irqstat_reg0 &= ~0x08;
993 irqstat_reg0 |= 0x08;
995 val = irqstat_reg0 | 0xf0;
996 // Not call do_irq() twice. 20151221
997 irqstat_timer = false;
998 irqstat_printer = false;
999 irqstat_reg0 |= 0x06;
1001 //p_emu->out_debug_log(_T("IO: Check IRQ Status."));
1008 uint8 FM7_MAINIO::get_extirq_fd17(void)
1012 if(intstat_opn && connect_opn) val &= ~0x08;
1013 if(intstat_mouse) val &= ~0x04;
1018 void FM7_MAINIO::set_ext_fd17(uint8 data)
1021 if((data & 0x04) != 0) {
1022 mouse_enable = true;
1024 mouse_enable = false;
1029 #if defined(_FM77AV_VARIANTS)
1031 uint8 FM7_MAINIO::subsystem_read_status(void)
1038 uint32 FM7_MAINIO::read_io8(uint32 addr)
1039 { // This is only for debug.
1040 addr = addr & 0xfff;
1042 return io_w_latch[addr];
1043 } else if(addr < 0x500) {
1044 uint32 ofset = addr & 0xff;
1045 uint opnbank = (addr - 0x100) >> 8;
1046 return opn_regs[opnbank][ofset];
1047 } else if(addr < 0x600) {
1048 return mainmem->read_data8(addr - 0x500 + FM7_MAINIO_MMR_BANK);
1053 uint32 FM7_MAINIO::read_dma_io8(uint32 addr)
1055 return this->read_data8(addr & 0xff);
1058 uint32 FM7_MAINIO::read_dma_data8(uint32 addr)
1060 return this->read_data8(addr & 0xff);
1063 uint32 FM7_MAINIO::read_data8(uint32 addr)
1067 if(addr < FM7_MAINIO_IS_BASICROM) {
1070 #if defined(HAS_MMR)
1071 if((addr < 0x90) && (addr >= 0x80)) {
1072 mmr_segment = mainmem->read_data8(FM7_MAINIO_MMR_SEGMENT);
1073 # if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX) || \
1074 defined(_FM77AV20) || defined(_FM77AV20SX) || defined(_FM77AV20EX)
1075 mmr_segment &= 0x07;
1077 mmr_segment &= 0x03;
1079 return mainmem->read_data8(addr - 0x80 + FM7_MAINIO_MMR_BANK + mmr_segment * 16);
1082 // if((addr >= 0x0006) && !(addr == 0x1f) && !(addr == 0x0b)) printf("MAINIO: READ: %08x \n", addr);
1085 retval = (uint32) get_port_fd00();
1089 retval = keyboard->read_data8(0x01) & 0xff;
1093 retval = (uint32) get_port_fd02();
1097 retval = (uint32) get_irqstat_fd03();
1101 retval = (uint32) get_fd04();
1104 retval = (uint32) get_fd05();
1106 case 0x06: // RS-232C
1109 case 0x08: // Light pen
1113 #if defined(_FM77AV_VARIANTS)
1115 retval = ((config.boot_mode & 3) == 0) ? 0xfe : 0xff;
1118 case 0x0e: // PSG DATA
1119 retval = (uint32) get_psg();
1120 //printf("PSG DATA READ val=%02x\n", retval);
1126 #if defined(_FM77AV_VARIANTS)
1128 retval = subsystem_read_status();
1131 //printf("OPN CMD READ \n");
1133 case 0x16: // OPN DATA
1134 retval = (uint32) get_opn(0);
1137 retval = (uint32) get_extirq_fd17();
1139 case 0x18: // FDC: STATUS
1140 retval = (uint32) get_fdc_stat();
1141 //printf("FDC: READ STATUS %02x PC=%04x\n", retval, maincpu->get_pc());
1143 case 0x19: // FDC: Track
1144 retval = (uint32) get_fdc_track();
1145 //printf("FDC: READ TRACK REG %02x\n", retval);
1147 case 0x1a: // FDC: Sector
1148 retval = (uint32) get_fdc_sector();
1149 //printf("FDC: READ SECTOR REG %02x\n", retval);
1151 case 0x1b: // FDC: Data
1152 retval = (uint32) get_fdc_data();
1155 retval = (uint32) get_fdc_fd1c();
1156 //printf("FDC: READ HEAD REG %02x\n", retval);
1159 retval = (uint32) get_fdc_motor();
1160 //printf("FDC: READ MOTOR REG %02x\n", retval);
1163 retval = (uint32) get_fdc_fd1e();
1164 //printf("FDC: READ MOTOR REG %02x\n", retval);
1167 retval = (uint32) fdc_getdrqirq();
1169 case 0x22: // Kanji ROM
1170 retval = (uint32) read_kanjidata_left();
1172 case 0x23: // Kanji ROM
1173 retval = (uint32) read_kanjidata_right();
1175 #if defined(CAPABLE_KANJI_CLASS2)
1176 case 0x2e: // Kanji ROM Level2
1177 retval = (uint32) read_kanjidata_left_l2();
1179 case 0x2f: // Kanji ROM Level2
1180 retval = (uint32) read_kanjidata_right_l2();
1184 case 0x37: // Multi page
1185 //retval = (uint32)display->read_data8(DISPLAY_ADDR_MULTIPAGE);
1187 case 0x45: // WHG CMD
1189 case 0x46: // WHG DATA
1190 retval = (uint32) get_opn(1);
1193 retval = (uint32) get_extirq_whg();
1195 case 0x51: // THG CMD
1197 case 0x52: // THG DATA
1198 retval = (uint32) get_opn(2);
1201 retval = (uint32) get_extirq_thg();
1204 #if defined(HAS_MMR)
1208 if(mainmem->read_signal(FM7_MAINIO_BOOTRAM_RW) != 0) retval |= 0x01;
1209 if(mainmem->read_signal(FM7_MAINIO_WINDOW_ENABLED) != 0) retval |= 0x40;
1210 if(mainmem->read_signal(FM7_MAINIO_MMR_ENABLED) != 0) retval |= 0x80;
1213 #if defined(_FM77AV40SX) || defined(_FM77AV40EX)
1216 if(mainmem->read_signal(FM7_MAINIO_FASTMMR_ENABLED) != 0) retval |= 0x08;
1217 if(mainmem->read_signal(FM7_MAINIO_EXTROM) != 0) retval |= 0x80;
1220 #if defined(HAS_DMA)
1225 retval = dmac->read_data8(dma_addr);
1232 if((addr < 0x40) && (addr >= 0x38)) {
1233 addr = (addr - 0x38) + FM7_SUBMEM_OFFSET_DPALETTE;
1234 return (uint32) display->read_data8(addr);
1239 } else if(addr == FM7_MAINIO_CLOCKMODE) {
1240 return (uint32)get_clockmode();
1242 #if defined(_FM77AV_VARIANTS)
1243 else if(addr == FM7_MAINIO_SUBMONITOR_ROM) {
1244 retval = sub_monitor_type & 0x03;
1246 } else if(addr == FM7_MAINIO_SUBMONITOR_RAM) {
1247 #if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX) || \
1248 defined(_FM77AV20) || defined(_FM77AV20SX) || defined(_FM77AV20EX)
1249 retval = ((sub_monitor_type & 0x04) != 0) ? 0xffffffff : 0x00000000;
1256 //if((addr >= 0x0006) && (addr != 0x1f)) printf("MAINIO: READ: %08x DATA=%08x\n", addr);
1260 void FM7_MAINIO::write_dma_io8(uint32 addr, uint32 data)
1262 this->write_data8(addr & 0xff, data);
1265 void FM7_MAINIO::write_dma_data8(uint32 addr, uint32 data)
1267 this->write_data8(addr & 0xff, data);
1271 void FM7_MAINIO::write_data8(uint32 addr, uint32 data)
1275 if(addr < FM7_MAINIO_IS_BASICROM) {
1277 io_w_latch[addr] = data;
1278 #if defined(HAS_MMR)
1279 if((addr < 0x90) && (addr >= 0x80)) {
1280 mmr_segment = mainmem->read_data8(FM7_MAINIO_MMR_SEGMENT);
1281 # if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX) || \
1282 defined(_FM77AV20) || defined(_FM77AV20SX) || defined(_FM77AV20EX)
1283 mmr_segment &= 0x07;
1285 mmr_segment &= 0x03;
1287 mainmem->write_data8(FM7_MAINIO_MMR_BANK + mmr_segment * 16 + addr - 0x80, data);
1293 set_port_fd00((uint8)data);
1298 case 0: // Write to file
1299 printer->write_signal(SIG_PRINTER_DATA, data, 0xff);
1303 joystick->write_data8(0x01, data);
1308 set_port_fd02((uint8)data);
1317 set_fd05((uint8)data);
1319 case 0x06: // RS-232C
1322 case 0x08: // Light pen
1327 //printf("PSG CMD WRITE val=%02x\n", data);
1331 //printf("PSG DATA WRITE val=%02x\n", data);
1337 #if defined(_FM77AV_VARIANTS)
1339 flag = ((data & 0x02) == 0) ? true : false;
1340 mainmem->write_signal(FM7_MAINIO_INITROM_ENABLED, (flag) ? 0xffffffff : 0 , 0xffffffff);
1343 display->write_signal(SIG_DISPLAY_MODE320, data, 0x40);
1345 reg_fd12 |= (data & 0x40);
1348 sub_monitor_type = data & 0x07;
1349 display->write_signal(SIG_FM7_SUB_BANK, sub_monitor_type, 0x07);
1352 case 0x15: // OPN CMD
1353 //printf("OPN CMD WRITE val=%02x\n", data);
1354 set_opn_cmd(0, data);
1356 case 0x16: // OPN DATA
1357 //printf("OPN DATA WRITE val=%02x\n", data);
1361 set_ext_fd17((uint8)data);
1363 case 0x18: // FDC: COMMAND
1364 set_fdc_cmd((uint8)data);
1365 //printf("FDC: WRITE CMD %02x\n", data);
1367 case 0x19: // FDC: Track
1368 set_fdc_track((uint8)data);
1369 //printf("FDC: WRITE TRACK REG %02x\n", data);
1371 case 0x1a: // FDC: Sector
1372 set_fdc_sector((uint8)data);
1373 //printf("FDC: WRITE SECTOR REG %02x\n", data);
1375 case 0x1b: // FDC: Data
1376 set_fdc_data((uint8)data);
1379 set_fdc_fd1c((uint8)data);
1380 //printf("FDC: WRITE HEAD REG %02x\n", data);
1383 set_fdc_fd1d((uint8)data);
1384 //printf("FDC: WRITE MOTOR REG %02x\n", data);
1387 set_fdc_fd1e((uint8)data);
1392 case 0x20: // Kanji ROM
1393 write_kanjiaddr_hi((uint8)data);
1395 case 0x2c: // Kanji ROM(DUP)
1396 #if defined(CAPABLE_KANJI_CLASS2)
1397 write_kanjiaddr_hi_l2((uint8)data);
1399 //write_kanjiaddr_hi((uint8)data);
1402 case 0x21: // Kanji ROM
1403 write_kanjiaddr_lo((uint8)data);
1405 case 0x2d: // Kanji ROM(DUP)
1406 #if defined(CAPABLE_KANJI_CLASS2)
1407 write_kanjiaddr_lo_l2((uint8)data);
1409 //write_kanjiaddr_lo((uint8)data);
1412 #if defined(CAPABLE_DICTROM)
1414 mainmem->write_signal(FM7_MAINIO_EXTBANK, data, 0xff);
1417 #if defined(_FM77AV_VARIANTS)
1419 display->write_data8(FM7_SUBMEM_OFFSET_APALETTE_HI, data);
1422 display->write_data8(FM7_SUBMEM_OFFSET_APALETTE_LO, data);
1425 display->write_data8(FM7_SUBMEM_OFFSET_APALETTE_B, data);
1428 display->write_data8(FM7_SUBMEM_OFFSET_APALETTE_R, data);
1431 display->write_data8(FM7_SUBMEM_OFFSET_APALETTE_G, data);
1435 case 0x37: // Multi page
1436 display->write_signal(SIG_DISPLAY_MULTIPAGE, data, 0x00ff);
1438 case 0x45: // WHG CMD
1439 set_opn_cmd(1, data);
1441 case 0x46: // WHG DATA
1446 case 0x51: // THG CMD
1447 set_opn_cmd(2, data);
1449 case 0x52: // THG DATA
1455 #if defined(HAS_MMR)
1457 #if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX) || \
1458 defined(_FM77AV20) || defined(_FM77AV20SX) || defined(_FM77AV20EX)
1459 mmr_segment = data & 7;
1461 // printf("MMR SEGMENT: %02x\n", data & 3);
1462 mmr_segment = data & 3;
1464 mainmem->write_data8(FM7_MAINIO_MMR_SEGMENT, (uint32)mmr_segment);
1467 mainmem->write_data8(FM7_MAINIO_WINDOW_OFFSET, (uint32)(data & 0x00ff));
1470 mainmem->write_signal(FM7_MAINIO_BOOTRAM_RW, data, 0x01);
1471 mainmem->write_signal(FM7_MAINIO_WINDOW_ENABLED, data , 0x40);
1472 //this->write_signal(FM7_MAINIO_CLOCKMODE, clock_fast ? 1 : 0, 1);
1473 //mainmem->write_signal(FM7_MAINIO_CLOCKMODE, clock_fast ? 1 : 0, 1);
1474 mainmem->write_signal(FM7_MAINIO_MMR_ENABLED, data, 0x80);
1478 #if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX) || \
1479 defined(_FM77AV20) || defined(_FM77AV20SX) || defined(_FM77AV20EX)
1481 mainmem->write_signal(FM7_MAINIO_MMR_EXTENDED, data, 0x80);
1482 mainmem->write_signal(FM7_MAINMEM_REFRESH_FAST, data, 0x04);
1483 mainmem->write_signal(FM7_MAINIO_WINDOW_FAST , data, 0x01);
1486 # if defined(_FM77AV40SX) || defined(_FM77AV40EX)
1488 mainmem->write_signal(FM7_MAINIO_FASTMMR_ENABLED, data, 0x08);
1489 mainmem->write_signal(FM7_MAINIO_EXTROM, data , 0x80);
1493 #if defined(HAS_DMA)
1495 dma_addr = data & 0x1f;
1498 dmac->write_data8(dma_addr, data);
1499 //p_emu->out_debug_log(_T("IO: Wrote DMA %02x to reg %02x\n"), data, dma_addr);
1503 //printf("MAIN: Write I/O Addr=%08x DATA=%02x\n", addr, data);
1507 if((addr < 0x40) && (addr >= 0x38)) {
1508 addr = (addr - 0x38) | FM7_SUBMEM_OFFSET_DPALETTE;
1509 display->write_data8(addr, (uint8)data);
1514 } else if(addr == FM7_MAINIO_CLOCKMODE) {
1515 set_clockmode((uint8)data);
1518 //if((addr >= 0x0006) && !(addr == 0x1f)) printf("MAINIO: WRITE: %08x DATA=%08x\n", addr, data);
1521 void FM7_MAINIO::event_callback(int event_id, int err)
1523 // printf("MAIN EVENT id=%d\n", event_id);
1525 case EVENT_BEEP_OFF:
1528 case EVENT_BEEP_CYCLE:
1531 case EVENT_UP_BREAK:
1532 set_break_key(false);
1535 case EVENT_TIMERIRQ_ON:
1536 //if(!irqmask_timer) set_irq_timer(true);
1537 set_irq_timer(!irqmask_timer);
1540 case EVENT_FD_MOTOR_ON:
1541 set_fdc_motor(true);
1542 event_fdc_motor = -1;
1544 case EVENT_FD_MOTOR_OFF:
1545 set_fdc_motor(false);
1546 event_fdc_motor = -1;
1548 case EVENT_PRINTER_RESET_COMPLETED:
1549 this->write_signals(&printer_reset_bus, 0x00);
1557 void FM7_MAINIO::update_config()
1559 switch(config.cpu_type){
1567 this->write_signals(&clock_status, clock_fast ? 0xffffffff : 0);
1570 if(config.boot_mode == 0) {
1571 mainmem->write_signal(FM7_MAINIO_IS_BASICROM, 0xffffffff, 0xffffffff);
1573 mainmem->write_signal(FM7_MAINIO_IS_BASICROM, 0, 0xffffffff);
1575 mainmem->write_signal(FM7_MAINIO_PUSH_FD0F, (config.boot_mode == 0) ? 1 : 0, 0x01);
1576 mainmem->write_signal(FM7_MAINIO_BOOTMODE, config.boot_mode, 0xffffffff);
1580 void FM7_MAINIO::event_vline(int v, int clock)
1584 #define STATE_VERSION 5
1585 void FM7_MAINIO::save_state(FILEIO *state_fio)
1589 state_fio->FputUint32_BE(STATE_VERSION);
1590 state_fio->FputInt32_BE(this_device_id);
1594 for(addr = 0; addr < 0x100; addr++) state_fio->FputUint8(io_w_latch[addr]);
1596 state_fio->FputBool(clock_fast);
1597 state_fio->FputBool(lpt_strobe);
1598 state_fio->FputBool(lpt_slctin);
1599 state_fio->FputBool(beep_flag);
1600 state_fio->FputBool(beep_snd);
1603 state_fio->FputUint8(lpt_outdata);
1605 state_fio->FputBool(cmt_indat);
1606 state_fio->FputBool(cmt_invert);
1607 state_fio->FputBool(lpt_det2);
1608 state_fio->FputBool(lpt_det1);
1609 state_fio->FputBool(lpt_pe);
1610 state_fio->FputBool(lpt_ackng_inv);
1611 state_fio->FputBool(lpt_error_inv);
1612 state_fio->FputUint8(irqmask_reg0);
1614 state_fio->FputBool(irqmask_syndet);
1615 state_fio->FputBool(irqmask_rxrdy);
1616 state_fio->FputBool(irqmask_txrdy);
1617 state_fio->FputBool(irqmask_mfd);
1618 state_fio->FputBool(irqmask_timer);
1619 state_fio->FputBool(irqmask_printer);
1620 state_fio->FputBool(irqmask_keyboard);
1622 state_fio->FputBool(irqreq_syndet);
1623 state_fio->FputBool(irqreq_rxrdy);
1624 state_fio->FputBool(irqreq_txrdy);
1625 state_fio->FputBool(irqreq_fdc);
1626 state_fio->FputBool(irqreq_printer);
1627 state_fio->FputBool(irqreq_keyboard);
1629 state_fio->FputUint8(irqstat_reg0);
1631 state_fio->FputBool(irqstat_timer);
1632 state_fio->FputBool(irqstat_printer);
1633 state_fio->FputBool(irqstat_keyboard);
1636 #if defined(_FM77_VARIANTS)
1637 state_fio->FputBool(stat_fdmode_2hd);
1638 state_fio->FputBool(stat_kanjirom);
1639 state_fio->FputBool(stat_400linecard);
1640 #elif defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
1641 defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
1642 state_fio->FputBool(stat_kanjirom);
1644 state_fio->FputBool(firq_break_key);
1645 state_fio->FputBool(firq_sub_attention);
1647 state_fio->FputBool(intmode_fdc);
1649 state_fio->FputBool(extdet_neg);
1650 //state_fio->FputBool(sub_busy);
1651 state_fio->FputBool(sub_halt);
1652 //state_fio->FputBool(sub_halt_bak);
1653 state_fio->FputBool(sub_cancel);
1654 //state_fio->FputBool(sub_cancel_bak);
1655 #if defined(WITH_Z80)
1656 state_fio->FputBool(z80_sel);
1659 state_fio->FputBool(intstat_syndet);
1660 state_fio->FputBool(intstat_rxrdy);
1661 state_fio->FputBool(intstat_txrdy);
1666 state_fio->FputBool(connect_psg);
1668 state_fio->FputBool(connect_opn);
1669 state_fio->FputBool(connect_whg);
1670 state_fio->FputBool(connect_thg);
1672 state_fio->FputBool(opn_psg_77av);
1676 state_fio->FputUint32_BE(opn_address[0]);
1677 state_fio->FputUint32_BE(opn_data[0]);
1678 state_fio->FputUint32_BE(opn_stat[0]);
1679 state_fio->FputUint32_BE(opn_cmdreg[0]);
1680 state_fio->FputUint32_BE(opn_ch3mode[0]);
1683 for(ch = 0; ch < 4; ch++) {
1684 state_fio->FputUint32_BE(opn_address[ch]);
1685 state_fio->FputUint32_BE(opn_data[ch]);
1686 state_fio->FputUint32_BE(opn_stat[ch]);
1687 state_fio->FputUint32_BE(opn_cmdreg[ch]);
1688 state_fio->FputUint32_BE(opn_ch3mode[ch]);
1692 state_fio->FputBool(intstat_opn);
1693 state_fio->FputBool(intstat_mouse);
1694 state_fio->FputBool(mouse_enable);
1696 state_fio->FputBool(intstat_whg);
1697 state_fio->FputBool(intstat_thg);
1700 state_fio->FputBool(connect_fdc);
1701 state_fio->FputUint8(fdc_statreg);
1702 state_fio->FputUint8(fdc_cmdreg);
1703 state_fio->FputUint8(fdc_trackreg);
1704 state_fio->FputUint8(fdc_sectreg);
1705 state_fio->FputUint8(fdc_datareg);
1706 state_fio->FputUint8(fdc_headreg);
1707 state_fio->FputUint8(fdc_drvsel);
1708 state_fio->FputUint8(irqreg_fdc);
1709 state_fio->FputBool(fdc_motor);
1710 state_fio->FputBool(irqstat_fdc);
1712 state_fio->FputBool(connect_kanjiroml1);
1713 #if defined(_FM77AV_VARIANTS)
1714 state_fio->FputBool(connect_kanjiroml2);
1716 state_fio->FputBool(boot_ram);
1717 state_fio->FputBool(hotreset);
1719 state_fio->FputUint8(sub_monitor_type);
1725 state_fio->FputInt32_BE(event_beep);
1726 state_fio->FputInt32_BE(event_beep_oneshot);
1727 state_fio->FputInt32_BE(event_timerirq);
1730 state_fio->FputInt32_BE(event_fdc_motor);
1731 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)|| \
1732 defined(_FM77AV20) || defined(_FM77AV20SX) || defined(_FM77AV20EX)
1733 for(ch = 0; ch < 4; ch++) state_fio->FputUint8(fdc_drive_table[ch]);
1734 state_fio->FputUint8(fdc_reg_fd1e);
1736 #if defined(HAS_DMA)
1737 state_fio->FputBool(intstat_dma);
1738 state_fio->FputUint8(dma_addr & 0x1f);
1740 #if defined(_FM77AV_VARIANTS)
1741 state_fio->FputUint8(reg_fd12);
1746 bool FM7_MAINIO::load_state(FILEIO *state_fio)
1750 //bool stat = false;
1753 version = state_fio->FgetUint32_BE();
1754 if(this_device_id != state_fio->FgetInt32_BE()) return false;
1757 for(addr = 0; addr < 0x100; addr++) io_w_latch[addr] = state_fio->FgetUint8();
1759 clock_fast = state_fio->FgetBool();
1760 lpt_strobe = state_fio->FgetBool();
1761 lpt_slctin = state_fio->FgetBool();
1762 beep_flag = state_fio->FgetBool();
1763 beep_snd = state_fio->FgetBool();
1766 lpt_outdata = state_fio->FgetUint8();
1768 cmt_indat = state_fio->FgetBool();
1769 cmt_invert = state_fio->FgetBool();
1770 lpt_det2 = state_fio->FgetBool();
1771 lpt_det1 = state_fio->FgetBool();
1772 lpt_pe = state_fio->FgetBool();
1773 lpt_ackng_inv = state_fio->FgetBool();
1774 lpt_error_inv = state_fio->FgetBool();
1775 irqmask_reg0 = state_fio->FgetUint8();
1777 irqmask_syndet = state_fio->FgetBool();
1778 irqmask_rxrdy = state_fio->FgetBool();
1779 irqmask_txrdy = state_fio->FgetBool();
1780 irqmask_mfd = state_fio->FgetBool();
1781 irqmask_timer = state_fio->FgetBool();
1782 irqmask_printer = state_fio->FgetBool();
1783 irqmask_keyboard = state_fio->FgetBool();
1785 irqreq_syndet = state_fio->FgetBool();
1786 irqreq_rxrdy = state_fio->FgetBool();
1787 irqreq_txrdy = state_fio->FgetBool();
1788 irqreq_fdc = state_fio->FgetBool();
1789 irqreq_printer = state_fio->FgetBool();
1790 irqreq_keyboard = state_fio->FgetBool();
1792 irqstat_reg0 = state_fio->FgetUint8();
1794 irqstat_timer = state_fio->FgetBool();
1795 irqstat_printer = state_fio->FgetBool();
1796 irqstat_keyboard = state_fio->FgetBool();
1799 #if defined(_FM77_VARIANTS)
1800 stat_fdmode_2hd = state_fio->FgetBool();
1801 stat_kanjirom = state_fio->FgetBool();
1802 stat_400linecard = state_fio->FgetBool();
1803 #elif defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
1804 defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
1805 stat_kanjirom = state_fio->FgetBool();
1807 firq_break_key = state_fio->FgetBool();
1808 firq_sub_attention = state_fio->FgetBool();
1810 intmode_fdc = state_fio->FgetBool();
1812 extdet_neg = state_fio->FgetBool();
1813 //sub_busy = state_fio->FgetBool();
1814 sub_halt = state_fio->FgetBool();
1815 //sub_halt_bak = state_fio->FgetBool();
1816 sub_cancel = state_fio->FgetBool();
1817 //sub_cancel_bak = state_fio->FgetBool();
1818 #if defined(WITH_Z80)
1819 z80_sel = state_fio->FgetBool();
1822 intstat_syndet = state_fio->FgetBool();
1823 intstat_rxrdy = state_fio->FgetBool();
1824 intstat_txrdy = state_fio->FgetBool();
1829 connect_psg = state_fio->FgetBool();
1831 connect_opn = state_fio->FgetBool();
1832 connect_whg = state_fio->FgetBool();
1833 connect_thg = state_fio->FgetBool();
1835 opn_psg_77av = state_fio->FgetBool();
1839 opn_address[0] = state_fio->FgetUint32_BE();
1840 opn_data[0] = state_fio->FgetUint32_BE();
1841 opn_stat[0] = state_fio->FgetUint32_BE();
1842 opn_cmdreg[0] = state_fio->FgetUint32_BE();
1843 opn_ch3mode[0] = state_fio->FgetUint32_BE();
1846 for(ch = 0; ch < 4; ch++) {
1847 opn_address[ch] = state_fio->FgetUint32_BE();
1848 opn_data[ch] = state_fio->FgetUint32_BE();
1849 opn_stat[ch] = state_fio->FgetUint32_BE();
1850 opn_cmdreg[ch] = state_fio->FgetUint32_BE();
1851 opn_ch3mode[ch] = state_fio->FgetUint32_BE();
1854 intstat_opn = state_fio->FgetBool();
1855 intstat_mouse = state_fio->FgetBool();
1856 mouse_enable = state_fio->FgetBool();
1858 intstat_whg = state_fio->FgetBool();
1859 intstat_thg = state_fio->FgetBool();
1862 connect_fdc = state_fio->FgetBool();
1863 fdc_statreg = state_fio->FgetUint8();
1864 fdc_cmdreg = state_fio->FgetUint8();
1865 fdc_trackreg = state_fio->FgetUint8();
1866 fdc_sectreg = state_fio->FgetUint8();
1867 fdc_datareg = state_fio->FgetUint8();
1868 fdc_headreg = state_fio->FgetUint8();
1869 fdc_drvsel = state_fio->FgetUint8();
1870 irqreg_fdc = state_fio->FgetUint8();
1871 fdc_motor = state_fio->FgetBool();
1872 irqstat_fdc = state_fio->FgetBool();
1875 connect_kanjiroml1 = state_fio->FgetBool();
1876 #if defined(_FM77AV_VARIANTS)
1877 connect_kanjiroml2 = state_fio->FgetBool();
1878 boot_ram = state_fio->FgetBool();
1879 hotreset = state_fio->FgetBool();
1881 sub_monitor_type = state_fio->FgetUint8();
1885 event_beep = state_fio->FgetInt32_BE();
1886 event_beep_oneshot = state_fio->FgetInt32_BE();
1887 event_timerirq = state_fio->FgetInt32_BE();
1890 if(version >= 3) { // V3
1891 event_fdc_motor = state_fio->FgetInt32_BE();
1892 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)|| \
1893 defined(_FM77AV20) || defined(_FM77AV20SX) || defined(_FM77AV20EX)
1894 for(ch = 0; ch < 4; ch++) fdc_drive_table[ch] = state_fio->FgetUint8();
1895 fdc_reg_fd1e = state_fio->FgetUint8();
1897 #if defined(HAS_DMA)
1898 intstat_dma = state_fio->FgetBool();
1899 dma_addr = (uint32)(state_fio->FgetUint8() & 0x1f);
1901 #if defined(_FM77AV_VARIANTS)
1902 reg_fd12 = state_fio->FgetUint8();