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"
22 #include "bubblecasette.h"
25 FM7_MAINIO::FM7_MAINIO(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
33 for(i = 0; i < 4; i++) {
55 bubble_casette[0] = NULL;
56 bubble_casette[1] = NULL;
60 lpt_strobe = false; // bit6
61 lpt_slctin = false; // bit7
65 cmt_indat = true; // bit7
66 cmt_invert = false; // Invert signal
70 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
71 defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
72 stat_kanjirom = true; // R/W : bit5, '0' = sub, '1' = main. FM-77 Only.
73 #elif defined(_FM77_VARIANTS)
74 stat_fdmode_2hd = false; // R/W : bit6, '0' = 2HD, '1' = 2DD. FM-77 Only.
75 stat_kanjirom = true; // R/W : bit5, '0' = sub, '1' = main. FM-77 Only.
76 stat_400linecard = false;// R/W : bit4, '0' = connected. FM-77 Only.
78 firq_break_key = false; // bit1, ON = '0'.
79 firq_sub_attention = false; // bit0, ON = '0'.
80 intmode_fdc = false; // bit2, '0' = normal, '1' = SFD.
84 z80_sel = false; // bit0 : '1' = Z80. Maybe only FM-7/77.
87 intstat_syndet = false;
88 intstat_rxrdy = false;
89 intstat_txrdy = false;
90 irqstat_timer = false;
91 irqstat_printer = false;
92 irqstat_keyboard = false;
100 opn_address[0] = 0x00;
109 for(i = 0; i < 3; i++) {
110 opn_address[i] = 0x00;
118 intstat_mouse = false;
119 mouse_enable = false;
132 irqreg_fdc = 0xff; //0b11111111;
133 irqmask_syndet = true;
134 irqmask_rxrdy = true;
135 irqmask_txrdy = true;
137 irqmask_timer = true;
138 irqmask_printer = true;
139 irqmask_keyboard = true;
143 irqreq_syndet = false;
144 irqreq_rxrdy = false;
145 irqreq_txrdy = false;
146 irqreq_printer = false;
147 irqreq_keyboard = false;
149 // FD20, FD21, FD22, FD23
150 connect_kanjiroml1 = false;
151 #if defined(_FM77AV_VARIANTS)
152 // FD2C, FD2D, FD2E, FD2F
153 connect_kanjiroml2 = false;
155 #if defined(_FM77_VARIANTS) || defined(_FM77AV_VARIANTS)
162 bootmode = config.boot_mode & 3;
163 memset(io_w_latch, 0xff, 0x100);
164 initialize_output_signals(&clock_status);
165 initialize_output_signals(&printer_reset_bus);
166 initialize_output_signals(&printer_strobe_bus);
167 initialize_output_signals(&printer_select_bus);
170 FM7_MAINIO::~FM7_MAINIO()
175 void FM7_MAINIO::initialize()
178 event_beep_oneshot = -1;
180 event_fdc_motor = -1;
181 lpt_type = config.printer_device_type;
184 #if defined(_FM77_VARIANTS) || defined(_FM77AV_VARIANTS)
186 # if defined(_FM77_VARIANTS)
187 stat_fdmode_2hd = false;
188 stat_kanjirom = true;
189 stat_400linecard = false;
190 # if defined(_FM77L4)
191 stat_400linecard = true;
195 #if defined(_FM77AV_VARIANTS)
196 reg_fd12 = 0xbc; // 0b10111100
198 bootmode = config.boot_mode & 3;
202 void FM7_MAINIO::reset()
204 if(event_beep >= 0) cancel_event(this, event_beep);
206 if(event_beep_oneshot >= 0) cancel_event(this, event_beep_oneshot);
207 event_beep_oneshot = -1;
208 if(event_timerirq >= 0) cancel_event(this, event_timerirq);
211 register_event(this, EVENT_BEEP_CYCLE, (1000.0 * 1000.0) / (1200.0 * 2.0), true, &event_beep);
213 #if defined(_FM77AV_VARIANTS)
217 #if defined(_FM77_VARIANTS)
219 #elif defined(_FM77AV_VARIANTS)
223 sub_cancel = false; // bit6 : '1' Cancel req.
224 sub_halt = false; // bit6 : '1' Cancel req.
225 sub_cancel_bak = sub_cancel; // bit6 : '1' Cancel req.
226 sub_halt_bak = sub_halt; // bit6 : '1' Cancel req.
228 cmt_indat = true; // bit7
229 cmt_invert = false; // Invert signal
232 lpt_type = config.printer_device_type;
235 #if defined(_FM77AV_VARIANTS)
236 sub_monitor_type = 0x00;
238 if(config.cpu_type == 0) {
243 this->write_signals(&clock_status, clock_fast ? 0xffffffff : 0);
246 irqmask_syndet = true;
247 irqmask_rxrdy = true;
248 irqmask_txrdy = true;
250 irqmask_timer = true;
251 irqmask_printer = true;
252 irqmask_keyboard = true;
255 intstat_syndet = false;
256 intstat_rxrdy = false;
257 intstat_txrdy = false;
258 irqstat_timer = false;
259 irqstat_printer = false;
260 irqstat_keyboard = false;
262 irqreq_syndet = false;
263 irqreq_rxrdy = false;
264 irqreq_txrdy = false;
265 irqreq_printer = false;
266 irqreq_keyboard = false;
268 drec->write_signal(SIG_DATAREC_MIC, 0x00, 0x01);
269 drec->set_remote(false);
274 firq_break_key = (keyboard->read_signal(SIG_FM7KEY_BREAK_KEY) != 0x00000000); // bit1, ON = '0'.
275 set_sub_attention(false);
276 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
277 defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
278 stat_kanjirom = true; // R/W : bit5, '0' = sub, '1' = main. FM-77 Only.
279 #elif defined(_FM77_VARIANTS)
280 stat_fdmode_2hd = false; // R/W : bit6, '0' = 2HD, '1' = 2DD. FM-77 Only.
281 stat_kanjirom = true; // R/W : bit5, '0' = sub, '1' = main. FM-77 Only.
283 maincpu->write_signal(SIG_CPU_FIRQ, 0, 1);
288 #if defined(_FM77AV_VARIANTS)
289 reg_fd12 = 0xbc; // 0b10111100
292 // bubble_casette[0]->reset();
293 // bubble_casette[1]->reset();
298 register_event(this, EVENT_TIMERIRQ_ON, 10000.0 / 4.9152, true, &event_timerirq); // TIMER IRQ
300 bootmode = config.boot_mode & 3;
301 memset(io_w_latch, 0xff, 0x100);
304 void FM7_MAINIO::reset_printer()
310 this->write_signals(&printer_strobe_bus, 0);
311 this->write_signals(&printer_select_bus, 0xffffffff);
312 this->write_signals(&printer_reset_bus, 0xffffffff);
313 register_event(this, EVENT_PRINTER_RESET_COMPLETED, 5.0 * 1000.0, false, NULL);
315 printer->write_signal(SIG_PRINTER_STROBE, 0x00, 0xff);
318 lpt_error_inv = true;
319 lpt_ackng_inv = true;
324 void FM7_MAINIO::set_clockmode(uint8_t flags)
327 if((flags & FM7_MAINCLOCK_SLOW) != 0) {
332 if(f != clock_fast) {
333 this->write_signal(FM7_MAINIO_CLOCKMODE, clock_fast ? 1 : 0, 1);
337 uint8_t FM7_MAINIO::get_clockmode(void)
339 if(!clock_fast) return FM7_MAINCLOCK_SLOW;
340 return FM7_MAINCLOCK_HIGH;
344 uint8_t FM7_MAINIO::get_port_fd00(void)
346 uint8_t ret = 0x7e; //0b01111110;
350 if(keyboard->read_data8(0x00) != 0) ret |= 0x80; // High bit.
352 if(clock_fast) ret |= 0x01; //0b00000001;
356 void FM7_MAINIO::set_port_fd00(uint8_t data)
358 drec->write_signal(SIG_DATAREC_MIC, data, 0x01);
359 drec->set_remote(((data & 0x02) != 0));
360 lpt_slctin = ((data & 0x80) == 0);
361 lpt_strobe = ((data & 0x40) != 0);
362 this->write_signals(&printer_strobe_bus, lpt_strobe ? 0xffffffff : 0);
363 this->write_signals(&printer_select_bus, lpt_slctin ? 0xffffffff : 0);
364 if((lpt_type == 0) && (lpt_slctin)) {
365 printer->write_signal(SIG_PRINTER_STROBE, lpt_strobe ? 0xff : 0x00, 0xff);
369 uint8_t FM7_MAINIO::get_port_fd02(void)
372 bool ack_bak = lpt_ackng_inv;
374 ret = (cmt_indat) ? 0xff : 0x7f; // CMT
376 lpt_busy = (printer->read_signal(SIG_PRINTER_BUSY) != 0);
377 lpt_error_inv = true;
378 lpt_ackng_inv = (printer->read_signal(SIG_PRINTER_ACK) != 0);
380 } else if((lpt_type == 1) || (lpt_type == 2)) {
381 lpt_pe = (joystick->read_data8(lpt_type + 1) != 0); // check joy port;
383 lpt_error_inv = true;
384 lpt_ackng_inv = true;
387 lpt_error_inv = true;
388 lpt_ackng_inv = true;
391 ret &= (lpt_busy) ? 0xff : ~0x01;
392 ret &= (lpt_error_inv) ? 0xff : ~0x02;
393 ret &= (lpt_ackng_inv) ? 0xff : ~0x04;
394 ret &= (lpt_pe) ? 0xff : ~0x08;
395 ret &= (lpt_det1) ? 0xff : ~0x10;
396 ret &= (lpt_det2) ? 0xff : ~0x20;
397 if((lpt_ackng_inv == true) && (ack_bak == false)) set_irq_printer(true);
401 void FM7_MAINIO::set_port_fd02(uint8_t val)
405 bool syndetirq_bak = irqmask_syndet;
406 bool rxrdyirq_bak = irqmask_rxrdy;
407 bool txrdyirq_bak = irqmask_txrdy;
409 bool keyirq_bak = irqmask_keyboard;
410 bool timerirq_bak = irqmask_timer;
411 bool printerirq_bak = irqmask_printer;
412 bool mfdirq_bak = irqmask_mfd;
414 // if((val & 0b00010000) != 0) {
415 if((val & 0x80) != 0) {
416 irqmask_syndet = false;
418 irqmask_syndet = true;
420 if(syndetirq_bak != irqmask_syndet) {
421 set_irq_txrdy(irqreq_syndet);
423 if((val & 0x40) != 0) {
424 irqmask_rxrdy = false;
426 irqmask_rxrdy = true;
428 // if(rxrdyirq_bak != irqmask_rxrdy) {
429 // set_irq_rxrdy(irqreq_rxrdy);
431 if((val & 0x20) != 0) {
432 irqmask_txrdy = false;
434 irqmask_txrdy = true;
436 // if(txrdyirq_bak != irqmask_txrdy) {
437 // set_irq_txrdy(irqreq_txrdy);
440 if((val & 0x10) != 0) {
446 if((val & 0x04) != 0) {
447 irqmask_timer = false;
449 irqmask_timer = true;
451 // if(timerirq_bak != irqmask_timer) {
452 // set_irq_timer(false);
455 if((val & 0x02) != 0) {
456 irqmask_printer = false;
458 irqmask_printer = true;
460 // if(printerirq_bak != irqmask_printer) {
461 // set_irq_printer(irqreq_printer);
464 if((val & 0x01) != 0) {
465 irqmask_keyboard = false;
467 irqmask_keyboard = true;
469 if(keyirq_bak != irqmask_keyboard) {
470 display->write_signal(SIG_FM7_SUB_KEY_MASK, irqmask_keyboard ? 1 : 0, 1);
471 set_irq_keyboard(irqreq_keyboard);
477 void FM7_MAINIO::set_irq_syndet(bool flag)
479 bool backup = intstat_syndet;
480 irqreq_syndet = flag;
482 intstat_syndet = flag;
484 if(flag && !(irqmask_syndet)) {
485 //irqstat_reg0 &= ~0x80; //~0x20;
486 intstat_syndet = true;
488 // irqstat_reg0 |= 0x80;
489 intstat_syndet = false;
492 if(backup != intstat_syndet) do_irq();
496 void FM7_MAINIO::set_irq_rxrdy(bool flag)
498 bool backup = intstat_rxrdy;
501 intstat_rxrdy = flag;
503 if(flag && !(irqmask_rxrdy)) {
504 //irqstat_reg0 &= ~0x40; //~0x20;
505 intstat_rxrdy = true;
507 //irqstat_reg0 |= 0x40;
508 intstat_rxrdy = false;
511 if(backup != intstat_rxrdy) do_irq();
516 void FM7_MAINIO::set_irq_txrdy(bool flag)
518 bool backup = intstat_txrdy;
521 intstat_txrdy = flag;
523 if(flag && !(irqmask_txrdy)) {
524 //irqstat_reg0 &= ~0x20; //~0x20;
525 intstat_txrdy = true;
527 //irqstat_reg0 |= 0x20;
528 intstat_txrdy = false;
531 if(backup != intstat_txrdy) do_irq();
535 void FM7_MAINIO::set_irq_timer(bool flag)
538 bool backup = irqstat_timer;
540 irqstat_reg0 &= 0xfb; //~0x04;
541 irqstat_timer = true;
543 irqstat_reg0 |= 0x04;
544 irqstat_timer = false;
546 //if(backup != irqstat_timer) do_irq();
551 void FM7_MAINIO::set_irq_printer(bool flag)
554 uint8_t backup = irqstat_reg0;
555 irqreq_printer = flag;
556 if(flag && !(irqmask_printer)) {
557 irqstat_reg0 &= ~0x02;
558 irqstat_printer = true;
560 irqstat_reg0 |= 0x02;
561 irqstat_printer = false;
567 void FM7_MAINIO::set_irq_keyboard(bool flag)
569 //uint8_t backup = irqstat_reg0;
570 //printf("MAIN: KEYBOARD: IRQ=%d MASK=%d\n", flag ,irqmask_keyboard);
571 irqreq_keyboard = flag;
572 if(flag && !irqmask_keyboard) {
573 irqstat_reg0 &= 0xfe;
574 irqstat_keyboard = true;
576 irqstat_reg0 |= 0x01;
577 irqstat_keyboard = false;
583 void FM7_MAINIO::do_irq(void)
587 intstat = intstat_txrdy | intstat_rxrdy | intstat_syndet;
589 intstat = irqstat_timer | irqstat_keyboard | irqstat_printer;
590 intstat = intstat | irqstat_fdc;
591 intstat = intstat | intstat_opn | intstat_whg | intstat_thg;
592 intstat = intstat | intstat_txrdy | intstat_rxrdy | intstat_syndet;
593 intstat = intstat | intstat_mouse;
594 # if defined(HAS_DMA)
595 intstat = intstat | intstat_dma;
598 //printf("%08d : IRQ: REG0=%02x FDC=%02x, stat=%d\n", SDL_GetTicks(), irqstat_reg0, irqstat_fdc, intstat);
600 maincpu->write_signal(SIG_CPU_IRQ, 1, 1);
602 maincpu->write_signal(SIG_CPU_IRQ, 0, 1);
606 void FM7_MAINIO::do_firq(void)
609 firq_stat = firq_break_key | firq_sub_attention;
611 maincpu->write_signal(SIG_CPU_FIRQ, 1, 1);
613 maincpu->write_signal(SIG_CPU_FIRQ, 0, 1);
615 p_emu->out_debug_log(_T("IO: do_firq(). BREAK=%d ATTN=%d"), firq_break_key ? 1 : 0, firq_sub_attention ? 1 : 0);
619 void FM7_MAINIO::do_nmi(bool flag)
621 maincpu->write_signal(SIG_CPU_NMI, flag ? 1 : 0, 1);
625 void FM7_MAINIO::set_break_key(bool pressed)
627 firq_break_key = pressed;
631 void FM7_MAINIO::set_sub_attention(bool flag)
633 firq_sub_attention = flag;
638 uint8_t FM7_MAINIO::get_fd04(void)
641 if(display->read_signal(SIG_DISPLAY_BUSY) != 0) val |= 0x80;
642 if(!firq_break_key) val |= 0x02;
643 if(!firq_sub_attention) {
646 #if defined(_FM77_VARIANTS)
647 if(stat_fdmode_2hd) val |= 0x40;
648 if(stat_kanjirom) val |= 0x20;
649 if(stat_400linecard) val |= 0x10;
650 if((display->read_signal(SIG_DISPLAY_EXTRA_MODE) & 0x04) != 0x00) val |= 0x04;
654 if(firq_sub_attention) {
655 set_sub_attention(false);
656 //printf("Attention \n");
658 #if defined(_FM77AV_VARIANTS)
660 if(mainmem->read_signal(FM7_MAINIO_INITROM_ENABLED) == 0) {
661 set_break_key(false);
669 void FM7_MAINIO::set_fd04(uint8_t val)
672 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
673 display->write_signal(SIG_DISPLAY_EXTRA_MODE, val, 0xff);
674 stat_kanjirom = ((val & 0x20) != 0);
675 #elif defined(_FM77_VARIANTS)
676 display->write_signal(SIG_DISPLAY_EXTRA_MODE, val, 0xff);
677 stat_fdmode_2hd = ((val & 0x40) != 0);
678 stat_kanjirom = ((val & 0x20) != 0);
679 stat_400linecard = ((val & 0x10) != 0);
684 uint8_t FM7_MAINIO::get_fd05(void)
687 if(display->read_signal(SIG_DISPLAY_BUSY) != 0) val |= 0x80;
688 if(!extdet_neg) val |= 0x01;
692 void FM7_MAINIO::set_fd05(uint8_t val)
694 sub_cancel = ((val & 0x40) != 0) ? true : false;
695 sub_halt = ((val & 0x80) != 0) ? true : false;
696 //if(sub_halt != sub_halt_bak) {
697 display->write_signal(SIG_DISPLAY_HALT, (sub_halt) ? 0xff : 0x00, 0xff);
699 sub_halt_bak = sub_halt;
701 //if(sub_cancel != sub_cancel_bak) {
702 display->write_signal(SIG_FM7_SUB_CANCEL, (sub_cancel) ? 0xff : 0x00, 0xff); // HACK
704 sub_cancel_bak = sub_cancel;
706 if((val & 0x01) != 0) {
707 maincpu->write_signal(SIG_CPU_BUSREQ, 1, 1);
708 z80->write_signal(SIG_CPU_BUSREQ, 0, 1);
710 maincpu->write_signal(SIG_CPU_BUSREQ, 0, 1);
711 z80->write_signal(SIG_CPU_BUSREQ, 1, 1);
716 void FM7_MAINIO::set_extdet(bool flag)
721 void FM7_MAINIO::write_fd0f(void)
724 if((config.dipswitch & FM7_DIPSW_FM8_PROTECT_FD0F) != 0) {
727 bootmode = 1; // DOS : Where BUBBLE?
728 mainmem->write_signal(FM7_MAINIO_BOOTMODE, bootmode, 0xffffffff);
729 mainmem->write_signal(FM7_MAINIO_IS_BASICROM, 0, 0xffffffff);
731 mainmem->write_signal(FM7_MAINIO_PUSH_FD0F, 0, 0xffffffff);
733 uint8_t FM7_MAINIO::read_fd0f(void)
736 if((config.dipswitch & FM7_DIPSW_FM8_PROTECT_FD0F) != 0) {
739 bootmode = 0; // BASIC
740 mainmem->write_signal(FM7_MAINIO_BOOTMODE, bootmode, 0xffffffff);
741 mainmem->write_signal(FM7_MAINIO_IS_BASICROM, 0xffffffff, 0xffffffff);
743 mainmem->write_signal(FM7_MAINIO_PUSH_FD0F, 0xffffffff, 0xffffffff);
747 bool FM7_MAINIO::get_rommode_fd0f(void)
749 return (mainmem->read_signal(FM7_MAINIO_PUSH_FD0F) == 0) ? false : true;
753 // Kanji ROM, FD20 AND FD21 (or SUBSYSTEM)
754 void FM7_MAINIO::write_kanjiaddr_hi(uint8_t addr)
756 if(!connect_kanjiroml1) return;
757 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
758 defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
759 if(!stat_kanjirom) return;
761 kanjiclass1->write_data8(KANJIROM_ADDR_HI, addr);
765 void FM7_MAINIO::write_kanjiaddr_lo(uint8_t addr)
767 if(!connect_kanjiroml1) return;
768 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
769 defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
770 if(!stat_kanjirom) return;
772 kanjiclass1->write_data8(KANJIROM_ADDR_LO, addr);
776 uint8_t FM7_MAINIO::read_kanjidata_left(void)
778 if(!connect_kanjiroml1) return 0xff;
779 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
780 defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
781 if(!stat_kanjirom) return 0xff;
783 //printf("KANJI MAIN CLASS1 ADDR: %05x\n", kaddress.w.l);
785 return kanjiclass1->read_data8(KANJIROM_DATA_HI);
791 uint8_t FM7_MAINIO::read_kanjidata_right(void)
793 if(!connect_kanjiroml1) return 0xff;
794 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
795 defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
796 if(!stat_kanjirom) return 0xff;
799 return kanjiclass1->read_data8(KANJIROM_DATA_LO);
805 #ifdef CAPABLE_KANJI_CLASS2
806 // Kanji ROM, FD20 AND FD21 (or SUBSYSTEM)
807 void FM7_MAINIO::write_kanjiaddr_hi_l2(uint8_t addr)
809 if(!connect_kanjiroml2) return;
810 if(!stat_kanjirom) return;
811 kanjiclass2->write_data8(KANJIROM_ADDR_HI, addr);
815 void FM7_MAINIO::write_kanjiaddr_lo_l2(uint8_t addr)
817 if(!connect_kanjiroml2) return;
818 if(!stat_kanjirom) return;
819 kanjiclass2->write_data8(KANJIROM_ADDR_LO, addr);
824 uint8_t FM7_MAINIO::read_kanjidata_left_l2(void)
826 if(!connect_kanjiroml2) return 0xff;
827 if(!stat_kanjirom) return 0xff;
830 return kanjiclass2->read_data8(KANJIROM_DATA_HI);
836 uint8_t FM7_MAINIO::read_kanjidata_right_l2(void)
838 if(!connect_kanjiroml2) return 0xff;
839 if(!stat_kanjirom) return 0xff;
842 return kanjiclass2->read_data8(KANJIROM_DATA_LO);
850 uint32_t FM7_MAINIO::read_signal(int id)
854 case FM7_MAINIO_KEYBOARDIRQ_MASK:
855 retval = (irqmask_keyboard) ? 0xffffffff : 0x00000000;
865 void FM7_MAINIO::write_signal(int id, uint32_t data, uint32_t mask)
868 val_b = ((data & mask) != 0);
871 //case SIG_FM7_SUB_HALT:
872 // mainmem->write_signal(SIG_FM7_SUB_HALT, data, mask);
874 case FM7_MAINIO_CLOCKMODE: // fd00
880 this->write_signals(&clock_status, clock_fast ? 0xffffffff : 0);
882 case FM7_MAINIO_CMT_RECV: // FD02
883 cmt_indat = val_b ^ cmt_invert;
885 case FM7_MAINIO_CMT_INVERT: // FD02
888 case FM7_MAINIO_TIMERIRQ: //
889 set_irq_timer(val_b);
891 case FM7_MAINIO_LPTIRQ: //
892 set_irq_printer(val_b);
894 case FM7_MAINIO_LPT_BUSY:
897 case FM7_MAINIO_LPT_ERROR:
898 lpt_error_inv = val_b;
900 case FM7_MAINIO_LPT_ACK:
902 bool f = lpt_ackng_inv;
903 lpt_ackng_inv = val_b;
904 if((lpt_ackng_inv == true) && (f == false)) set_irq_printer(true);
907 case FM7_MAINIO_LPT_PAPER_EMPTY:
910 case FM7_MAINIO_LPT_DET1:
913 case FM7_MAINIO_LPT_DET2:
916 case FM7_MAINIO_KEYBOARDIRQ: //
917 set_irq_keyboard(val_b);
920 case FM7_MAINIO_PUSH_BREAK:
921 set_break_key(val_b);
923 #if defined(FM77AV_VARIANTS)
924 case FM7_MAINIO_HOT_RESET:
928 case FM7_MAINIO_SUB_ATTENTION:
929 if(val_b) set_sub_attention(true);
932 case FM7_MAINIO_EXTDET:
935 case FM7_MAINIO_BEEP:
938 case FM7_MAINIO_PSG_IRQ:
941 case FM7_MAINIO_OPN_IRQ:
942 if(!connect_opn) break;
946 case FM7_MAINIO_WHG_IRQ:
947 if(!connect_whg) break;
951 case FM7_MAINIO_THG_IRQ:
952 if(!connect_thg) break;
957 case FM7_MAINIO_FDC_DRQ:
960 case FM7_MAINIO_FDC_IRQ:
964 case FM7_MAINIO_DMA_INT:
969 #if defined(_FM77AV_VARIANTS)
970 case SIG_DISPLAY_DISPLAY:
977 case SIG_DISPLAY_VSYNC:
984 case SIG_DISPLAY_MODE320:
996 uint8_t FM7_MAINIO::get_irqstat_fd03(void)
1001 extirq = irqstat_fdc | intstat_opn | intstat_whg | intstat_thg;
1002 extirq = extirq | intstat_syndet | intstat_rxrdy | intstat_txrdy;
1003 # if defined(HAS_DMA)
1004 extirq = extirq | intstat_dma;
1007 irqstat_reg0 &= ~0x08;
1009 irqstat_reg0 |= 0x08;
1011 val = irqstat_reg0 | 0xf0;
1012 // Not call do_irq() twice. 20151221
1013 irqstat_timer = false;
1014 irqstat_printer = false;
1015 irqstat_reg0 |= 0x06;
1017 //p_emu->out_debug_log(_T("IO: Check IRQ Status."));
1024 uint8_t FM7_MAINIO::get_extirq_fd17(void)
1028 if(intstat_opn && connect_opn) val &= ~0x08;
1029 if(intstat_mouse) val &= ~0x04;
1034 void FM7_MAINIO::set_ext_fd17(uint8_t data)
1037 if((data & 0x04) != 0) {
1038 mouse_enable = true;
1040 mouse_enable = false;
1045 #if defined(_FM77AV_VARIANTS)
1047 uint8_t FM7_MAINIO::subsystem_read_status(void)
1054 uint32_t FM7_MAINIO::read_io8(uint32_t addr)
1055 { // This is only for debug.
1056 addr = addr & 0xfff;
1058 return io_w_latch[addr];
1059 } else if(addr < 0x500) {
1060 uint32_t ofset = addr & 0xff;
1061 uint opnbank = (addr - 0x100) >> 8;
1062 return opn_regs[opnbank][ofset];
1063 } else if(addr < 0x600) {
1064 return mainmem->read_data8(addr - 0x500 + FM7_MAINIO_MMR_BANK);
1069 uint32_t FM7_MAINIO::read_dma_io8(uint32_t addr)
1071 return this->read_data8(addr & 0xff);
1074 uint32_t FM7_MAINIO::read_dma_data8(uint32_t addr)
1076 return this->read_data8(addr & 0xff);
1079 uint32_t FM7_MAINIO::read_data8(uint32_t addr)
1082 uint32_t mmr_segment;
1083 if(addr < FM7_MAINIO_IS_BASICROM) {
1086 #if defined(HAS_MMR)
1087 if((addr < 0x90) && (addr >= 0x80)) {
1088 mmr_segment = mainmem->read_data8(FM7_MAINIO_MMR_SEGMENT);
1089 # if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX) || \
1090 defined(_FM77AV20) || defined(_FM77AV20SX) || defined(_FM77AV20EX)
1091 mmr_segment &= 0x07;
1093 mmr_segment &= 0x03;
1095 return mainmem->read_data8(addr - 0x80 + FM7_MAINIO_MMR_BANK + mmr_segment * 16);
1098 // if((addr >= 0x0006) && !(addr == 0x1f) && !(addr == 0x0b)) printf("MAINIO: READ: %08x \n", addr);
1101 retval = (uint32_t) get_port_fd00();
1105 retval = keyboard->read_data8(0x01) & 0xff;
1109 retval = (uint32_t) get_port_fd02();
1113 retval = (uint32_t) get_irqstat_fd03();
1117 retval = (uint32_t) get_fd04();
1120 retval = (uint32_t) get_fd05();
1122 case 0x06: // RS-232C
1125 case 0x08: // Light pen
1129 #if defined(_FM77AV_VARIANTS)
1131 retval = ((config.boot_mode & 3) == 0) ? 0xfe : 0xff;
1134 case 0x0e: // PSG DATA
1135 retval = (uint32_t) get_psg();
1136 //printf("PSG DATA READ val=%02x\n", retval);
1151 retval = bubble_casette[0]->read_data8(addr);
1154 #if defined(_FM77AV_VARIANTS)
1156 retval = subsystem_read_status();
1159 //printf("OPN CMD READ \n");
1161 case 0x16: // OPN DATA
1162 retval = (uint32_t) get_opn(0);
1165 retval = (uint32_t) get_extirq_fd17();
1168 case 0x18: // FDC: STATUS
1169 retval = (uint32_t) get_fdc_stat();
1170 //printf("FDC: READ STATUS %02x PC=%04x\n", retval, maincpu->get_pc());
1172 case 0x19: // FDC: Track
1173 retval = (uint32_t) get_fdc_track();
1174 //printf("FDC: READ TRACK REG %02x\n", retval);
1176 case 0x1a: // FDC: Sector
1177 retval = (uint32_t) get_fdc_sector();
1178 //printf("FDC: READ SECTOR REG %02x\n", retval);
1180 case 0x1b: // FDC: Data
1181 retval = (uint32_t) get_fdc_data();
1184 retval = (uint32_t) get_fdc_fd1c();
1185 //printf("FDC: READ HEAD REG %02x\n", retval);
1188 retval = (uint32_t) get_fdc_motor();
1189 //printf("FDC: READ MOTOR REG %02x\n", retval);
1192 retval = (uint32_t) get_fdc_fd1e();
1193 //printf("FDC: READ MOTOR REG %02x\n", retval);
1196 retval = (uint32_t) fdc_getdrqirq();
1198 case 0x22: // Kanji ROM
1199 retval = (uint32_t) read_kanjidata_left();
1201 case 0x23: // Kanji ROM
1202 retval = (uint32_t) read_kanjidata_right();
1204 #if defined(CAPABLE_KANJI_CLASS2)
1205 case 0x2e: // Kanji ROM Level2
1206 retval = (uint32_t) read_kanjidata_left_l2();
1208 case 0x2f: // Kanji ROM Level2
1209 retval = (uint32_t) read_kanjidata_right_l2();
1213 case 0x37: // Multi page
1214 //retval = (uint32_t)display->read_data8(DISPLAY_ADDR_MULTIPAGE);
1216 case 0x45: // WHG CMD
1218 case 0x46: // WHG DATA
1219 retval = (uint32_t) get_opn(1);
1222 retval = (uint32_t) get_extirq_whg();
1224 case 0x51: // THG CMD
1226 case 0x52: // THG DATA
1227 retval = (uint32_t) get_opn(2);
1230 retval = (uint32_t) get_extirq_thg();
1233 #if defined(HAS_MMR)
1237 if(mainmem->read_signal(FM7_MAINIO_BOOTRAM_RW) != 0) retval |= 0x01;
1238 if(mainmem->read_signal(FM7_MAINIO_WINDOW_ENABLED) != 0) retval |= 0x40;
1239 if(mainmem->read_signal(FM7_MAINIO_MMR_ENABLED) != 0) retval |= 0x80;
1242 #if defined(_FM77AV40SX) || defined(_FM77AV40EX)
1245 if(mainmem->read_signal(FM7_MAINIO_FASTMMR_ENABLED) != 0) retval |= 0x08;
1246 if(mainmem->read_signal(FM7_MAINIO_EXTROM) != 0) retval |= 0x80;
1249 #if defined(HAS_DMA)
1254 retval = dmac->read_data8(dma_addr);
1261 if((addr < 0x40) && (addr >= 0x38)) {
1262 addr = (addr - 0x38) + FM7_SUBMEM_OFFSET_DPALETTE;
1263 return (uint32_t) display->read_data8(addr);
1268 } else if(addr == FM7_MAINIO_CLOCKMODE) {
1269 return (uint32_t)get_clockmode();
1271 #if defined(_FM77AV_VARIANTS)
1272 else if(addr == FM7_MAINIO_SUBMONITOR_ROM) {
1273 retval = sub_monitor_type & 0x03;
1275 } else if(addr == FM7_MAINIO_SUBMONITOR_RAM) {
1276 #if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX) || \
1277 defined(_FM77AV20) || defined(_FM77AV20SX) || defined(_FM77AV20EX)
1278 retval = ((sub_monitor_type & 0x04) != 0) ? 0xffffffff : 0x00000000;
1285 //if((addr >= 0x0006) && (addr != 0x1f)) printf("MAINIO: READ: %08x DATA=%08x\n", addr);
1289 void FM7_MAINIO::write_dma_io8(uint32_t addr, uint32_t data)
1291 this->write_data8(addr & 0xff, data);
1294 void FM7_MAINIO::write_dma_data8(uint32_t addr, uint32_t data)
1296 this->write_data8(addr & 0xff, data);
1300 void FM7_MAINIO::write_data8(uint32_t addr, uint32_t data)
1303 uint32_t mmr_segment;
1304 if(addr < FM7_MAINIO_IS_BASICROM) {
1306 io_w_latch[addr] = data;
1307 #if defined(HAS_MMR)
1308 if((addr < 0x90) && (addr >= 0x80)) {
1309 mmr_segment = mainmem->read_data8(FM7_MAINIO_MMR_SEGMENT);
1310 # if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX) || \
1311 defined(_FM77AV20) || defined(_FM77AV20SX) || defined(_FM77AV20EX)
1312 mmr_segment &= 0x07;
1314 mmr_segment &= 0x03;
1316 mainmem->write_data8(FM7_MAINIO_MMR_BANK + mmr_segment * 16 + addr - 0x80, data);
1322 set_port_fd00((uint8_t)data);
1326 lpt_outdata = (uint8_t)data;
1328 case 0: // Write to file
1329 printer->write_signal(SIG_PRINTER_DATA, data, 0xff);
1333 joystick->write_data8(0x01, data);
1338 set_port_fd02((uint8_t)data);
1347 set_fd05((uint8_t)data);
1349 case 0x06: // RS-232C
1352 case 0x08: // Light pen
1357 //printf("PSG CMD WRITE val=%02x\n", data);
1361 //printf("PSG DATA WRITE val=%02x\n", data);
1376 bubble_casette[0]->write_data8(addr, data);
1379 #if defined(_FM77AV_VARIANTS)
1381 flag = ((data & 0x02) == 0) ? true : false;
1382 mainmem->write_signal(FM7_MAINIO_INITROM_ENABLED, (flag) ? 0xffffffff : 0 , 0xffffffff);
1385 display->write_signal(SIG_DISPLAY_MODE320, data, 0x40);
1387 reg_fd12 |= (data & 0x40);
1390 sub_monitor_type = data & 0x07;
1391 display->write_signal(SIG_FM7_SUB_BANK, sub_monitor_type, 0x07);
1394 case 0x15: // OPN CMD
1395 //printf("OPN CMD WRITE val=%02x\n", data);
1396 set_opn_cmd(0, data);
1398 case 0x16: // OPN DATA
1399 //printf("OPN DATA WRITE val=%02x\n", data);
1403 set_ext_fd17((uint8_t)data);
1406 case 0x18: // FDC: COMMAND
1407 set_fdc_cmd((uint8_t)data);
1408 //printf("FDC: WRITE CMD %02x\n", data);
1410 case 0x19: // FDC: Track
1411 set_fdc_track((uint8_t)data);
1412 //printf("FDC: WRITE TRACK REG %02x\n", data);
1414 case 0x1a: // FDC: Sector
1415 set_fdc_sector((uint8_t)data);
1416 //printf("FDC: WRITE SECTOR REG %02x\n", data);
1418 case 0x1b: // FDC: Data
1419 set_fdc_data((uint8_t)data);
1422 set_fdc_fd1c((uint8_t)data);
1423 //printf("FDC: WRITE HEAD REG %02x\n", data);
1426 set_fdc_fd1d((uint8_t)data);
1427 //printf("FDC: WRITE MOTOR REG %02x\n", data);
1430 set_fdc_fd1e((uint8_t)data);
1435 case 0x20: // Kanji ROM
1436 write_kanjiaddr_hi((uint8_t)data);
1438 case 0x2c: // Kanji ROM(DUP)
1439 #if defined(CAPABLE_KANJI_CLASS2)
1440 write_kanjiaddr_hi_l2((uint8_t)data);
1442 //write_kanjiaddr_hi((uint8_t)data);
1445 case 0x21: // Kanji ROM
1446 write_kanjiaddr_lo((uint8_t)data);
1448 case 0x2d: // Kanji ROM(DUP)
1449 #if defined(CAPABLE_KANJI_CLASS2)
1450 write_kanjiaddr_lo_l2((uint8_t)data);
1452 //write_kanjiaddr_lo((uint8_t)data);
1455 #if defined(CAPABLE_DICTROM)
1457 mainmem->write_signal(FM7_MAINIO_EXTBANK, data, 0xff);
1460 #if defined(_FM77AV_VARIANTS)
1462 display->write_data8(FM7_SUBMEM_OFFSET_APALETTE_HI, data);
1465 display->write_data8(FM7_SUBMEM_OFFSET_APALETTE_LO, data);
1468 display->write_data8(FM7_SUBMEM_OFFSET_APALETTE_B, data);
1471 display->write_data8(FM7_SUBMEM_OFFSET_APALETTE_R, data);
1474 display->write_data8(FM7_SUBMEM_OFFSET_APALETTE_G, data);
1478 case 0x37: // Multi page
1479 display->write_signal(SIG_DISPLAY_MULTIPAGE, data, 0x00ff);
1481 case 0x45: // WHG CMD
1482 set_opn_cmd(1, data);
1484 case 0x46: // WHG DATA
1489 case 0x51: // THG CMD
1490 set_opn_cmd(2, data);
1492 case 0x52: // THG DATA
1498 #if defined(HAS_MMR)
1500 #if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX) || \
1501 defined(_FM77AV20) || defined(_FM77AV20SX) || defined(_FM77AV20EX)
1502 mmr_segment = data & 7;
1504 // printf("MMR SEGMENT: %02x\n", data & 3);
1505 mmr_segment = data & 3;
1507 mainmem->write_data8(FM7_MAINIO_MMR_SEGMENT, (uint32_t)mmr_segment);
1510 mainmem->write_data8(FM7_MAINIO_WINDOW_OFFSET, (uint32_t)(data & 0x00ff));
1513 mainmem->write_signal(FM7_MAINIO_BOOTRAM_RW, data, 0x01);
1514 mainmem->write_signal(FM7_MAINIO_WINDOW_ENABLED, data , 0x40);
1515 //this->write_signal(FM7_MAINIO_CLOCKMODE, clock_fast ? 1 : 0, 1);
1516 //mainmem->write_signal(FM7_MAINIO_CLOCKMODE, clock_fast ? 1 : 0, 1);
1517 mainmem->write_signal(FM7_MAINIO_MMR_ENABLED, data, 0x80);
1521 #if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX) || \
1522 defined(_FM77AV20) || defined(_FM77AV20SX) || defined(_FM77AV20EX)
1524 mainmem->write_signal(FM7_MAINIO_MMR_EXTENDED, data, 0x80);
1525 mainmem->write_signal(FM7_MAINMEM_REFRESH_FAST, data, 0x04);
1526 mainmem->write_signal(FM7_MAINIO_WINDOW_FAST , data, 0x01);
1529 # if defined(_FM77AV40SX) || defined(_FM77AV40EX)
1531 mainmem->write_signal(FM7_MAINIO_FASTMMR_ENABLED, data, 0x08);
1532 mainmem->write_signal(FM7_MAINIO_EXTROM, data , 0x80);
1536 #if defined(HAS_DMA)
1538 dma_addr = data & 0x1f;
1541 dmac->write_data8(dma_addr, data);
1542 //p_emu->out_debug_log(_T("IO: Wrote DMA %02x to reg %02x\n"), data, dma_addr);
1546 //printf("MAIN: Write I/O Addr=%08x DATA=%02x\n", addr, data);
1550 if((addr < 0x40) && (addr >= 0x38)) {
1551 addr = (addr - 0x38) | FM7_SUBMEM_OFFSET_DPALETTE;
1552 display->write_data8(addr, (uint8_t)data);
1557 } else if(addr == FM7_MAINIO_CLOCKMODE) {
1558 set_clockmode((uint8_t)data);
1561 //if((addr >= 0x0006) && !(addr == 0x1f)) printf("MAINIO: WRITE: %08x DATA=%08x\n", addr, data);
1564 void FM7_MAINIO::event_callback(int event_id, int err)
1566 // printf("MAIN EVENT id=%d\n", event_id);
1568 case EVENT_BEEP_OFF:
1571 case EVENT_BEEP_CYCLE:
1574 case EVENT_UP_BREAK:
1575 set_break_key(false);
1578 case EVENT_TIMERIRQ_ON:
1579 //if(!irqmask_timer) set_irq_timer(true);
1580 set_irq_timer(!irqmask_timer);
1583 case EVENT_FD_MOTOR_ON:
1584 set_fdc_motor(true);
1585 event_fdc_motor = -1;
1587 case EVENT_FD_MOTOR_OFF:
1588 set_fdc_motor(false);
1589 event_fdc_motor = -1;
1591 case EVENT_PRINTER_RESET_COMPLETED:
1592 this->write_signals(&printer_reset_bus, 0x00);
1600 void FM7_MAINIO::update_config()
1602 switch(config.cpu_type){
1610 this->write_signals(&clock_status, clock_fast ? 0xffffffff : 0);
1613 if(config.boot_mode == 0) {
1614 mainmem->write_signal(FM7_MAINIO_IS_BASICROM, 0xffffffff, 0xffffffff);
1616 mainmem->write_signal(FM7_MAINIO_IS_BASICROM, 0, 0xffffffff);
1618 mainmem->write_signal(FM7_MAINIO_PUSH_FD0F, (config.boot_mode == 0) ? 1 : 0, 0x01);
1619 mainmem->write_signal(FM7_MAINIO_BOOTMODE, bootmode, 0xffffffff);
1623 void FM7_MAINIO::event_vline(int v, int clock)
1627 #define STATE_VERSION 6
1628 void FM7_MAINIO::save_state(FILEIO *state_fio)
1632 state_fio->FputUint32_BE(STATE_VERSION);
1633 state_fio->FputInt32_BE(this_device_id);
1637 for(addr = 0; addr < 0x100; addr++) state_fio->FputUint8(io_w_latch[addr]);
1639 state_fio->FputBool(clock_fast);
1640 state_fio->FputBool(lpt_strobe);
1641 state_fio->FputBool(lpt_slctin);
1642 state_fio->FputBool(beep_flag);
1643 state_fio->FputBool(beep_snd);
1646 state_fio->FputUint8(lpt_outdata);
1648 state_fio->FputBool(cmt_indat);
1649 state_fio->FputBool(cmt_invert);
1650 state_fio->FputBool(lpt_det2);
1651 state_fio->FputBool(lpt_det1);
1652 state_fio->FputBool(lpt_pe);
1653 state_fio->FputBool(lpt_ackng_inv);
1654 state_fio->FputBool(lpt_error_inv);
1655 state_fio->FputUint8(irqmask_reg0);
1657 state_fio->FputBool(irqmask_syndet);
1658 state_fio->FputBool(irqmask_rxrdy);
1659 state_fio->FputBool(irqmask_txrdy);
1660 state_fio->FputBool(irqmask_mfd);
1661 state_fio->FputBool(irqmask_timer);
1662 state_fio->FputBool(irqmask_printer);
1663 state_fio->FputBool(irqmask_keyboard);
1665 state_fio->FputBool(irqreq_syndet);
1666 state_fio->FputBool(irqreq_rxrdy);
1667 state_fio->FputBool(irqreq_txrdy);
1668 state_fio->FputBool(irqreq_printer);
1669 state_fio->FputBool(irqreq_keyboard);
1671 state_fio->FputUint8(irqstat_reg0);
1673 state_fio->FputBool(irqstat_timer);
1674 state_fio->FputBool(irqstat_printer);
1675 state_fio->FputBool(irqstat_keyboard);
1678 #if defined(_FM77_VARIANTS)
1679 state_fio->FputBool(stat_fdmode_2hd);
1680 state_fio->FputBool(stat_kanjirom);
1681 state_fio->FputBool(stat_400linecard);
1682 #elif defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
1683 defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
1684 state_fio->FputBool(stat_kanjirom);
1686 state_fio->FputBool(firq_break_key);
1687 state_fio->FputBool(firq_sub_attention);
1689 state_fio->FputBool(intmode_fdc);
1691 state_fio->FputBool(extdet_neg);
1692 state_fio->FputBool(sub_halt);
1693 state_fio->FputBool(sub_cancel);
1694 #if defined(WITH_Z80)
1695 state_fio->FputBool(z80_sel);
1698 state_fio->FputBool(intstat_syndet);
1699 state_fio->FputBool(intstat_rxrdy);
1700 state_fio->FputBool(intstat_txrdy);
1705 state_fio->FputBool(connect_psg);
1707 state_fio->FputBool(connect_opn);
1708 state_fio->FputBool(connect_whg);
1709 state_fio->FputBool(connect_thg);
1711 state_fio->FputBool(opn_psg_77av);
1715 state_fio->FputUint32_BE(opn_address[0]);
1716 state_fio->FputUint32_BE(opn_data[0]);
1717 state_fio->FputUint32_BE(opn_stat[0]);
1718 state_fio->FputUint32_BE(opn_cmdreg[0]);
1719 state_fio->FputUint32_BE(opn_ch3mode[0]);
1722 for(ch = 0; ch < 4; ch++) {
1723 state_fio->FputUint32_BE(opn_address[ch]);
1724 state_fio->FputUint32_BE(opn_data[ch]);
1725 state_fio->FputUint32_BE(opn_stat[ch]);
1726 state_fio->FputUint32_BE(opn_cmdreg[ch]);
1727 state_fio->FputUint32_BE(opn_ch3mode[ch]);
1731 state_fio->FputBool(intstat_opn);
1732 state_fio->FputBool(intstat_mouse);
1733 state_fio->FputBool(mouse_enable);
1735 state_fio->FputBool(intstat_whg);
1736 state_fio->FputBool(intstat_thg);
1739 state_fio->FputBool(connect_fdc);
1740 state_fio->FputUint8(fdc_statreg);
1741 state_fio->FputUint8(fdc_cmdreg);
1742 state_fio->FputUint8(fdc_trackreg);
1743 state_fio->FputUint8(fdc_sectreg);
1744 state_fio->FputUint8(fdc_datareg);
1745 state_fio->FputUint8(fdc_headreg);
1746 state_fio->FputUint8(fdc_drvsel);
1747 state_fio->FputUint8(irqreg_fdc);
1748 state_fio->FputBool(fdc_motor);
1749 state_fio->FputBool(irqstat_fdc);
1751 state_fio->FputBool(connect_kanjiroml1);
1752 #if defined(_FM77AV_VARIANTS)
1753 state_fio->FputBool(connect_kanjiroml2);
1755 state_fio->FputBool(boot_ram);
1756 state_fio->FputBool(hotreset);
1758 state_fio->FputUint8(sub_monitor_type);
1764 state_fio->FputInt32_BE(event_beep);
1765 state_fio->FputInt32_BE(event_beep_oneshot);
1766 state_fio->FputInt32_BE(event_timerirq);
1769 state_fio->FputInt32_BE(event_fdc_motor);
1770 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)|| \
1771 defined(_FM77AV20) || defined(_FM77AV20SX) || defined(_FM77AV20EX)
1772 for(ch = 0; ch < 4; ch++) state_fio->FputUint8(fdc_drive_table[ch]);
1773 state_fio->FputUint8(fdc_reg_fd1e);
1775 #if defined(HAS_DMA)
1776 state_fio->FputBool(intstat_dma);
1777 state_fio->FputUint8(dma_addr & 0x1f);
1779 #if defined(_FM77AV_VARIANTS)
1780 state_fio->FputUint8(reg_fd12);
1785 bool FM7_MAINIO::load_state(FILEIO *state_fio)
1789 //bool stat = false;
1792 version = state_fio->FgetUint32_BE();
1793 if(this_device_id != state_fio->FgetInt32_BE()) return false;
1796 for(addr = 0; addr < 0x100; addr++) io_w_latch[addr] = state_fio->FgetUint8();
1798 clock_fast = state_fio->FgetBool();
1799 lpt_strobe = state_fio->FgetBool();
1800 lpt_slctin = state_fio->FgetBool();
1801 beep_flag = state_fio->FgetBool();
1802 beep_snd = state_fio->FgetBool();
1805 lpt_outdata = state_fio->FgetUint8();
1807 cmt_indat = state_fio->FgetBool();
1808 cmt_invert = state_fio->FgetBool();
1809 lpt_det2 = state_fio->FgetBool();
1810 lpt_det1 = state_fio->FgetBool();
1811 lpt_pe = state_fio->FgetBool();
1812 lpt_ackng_inv = state_fio->FgetBool();
1813 lpt_error_inv = state_fio->FgetBool();
1814 irqmask_reg0 = state_fio->FgetUint8();
1816 irqmask_syndet = state_fio->FgetBool();
1817 irqmask_rxrdy = state_fio->FgetBool();
1818 irqmask_txrdy = state_fio->FgetBool();
1819 irqmask_mfd = state_fio->FgetBool();
1820 irqmask_timer = state_fio->FgetBool();
1821 irqmask_printer = state_fio->FgetBool();
1822 irqmask_keyboard = state_fio->FgetBool();
1824 irqreq_syndet = state_fio->FgetBool();
1825 irqreq_rxrdy = state_fio->FgetBool();
1826 irqreq_txrdy = state_fio->FgetBool();
1827 irqreq_printer = state_fio->FgetBool();
1828 irqreq_keyboard = state_fio->FgetBool();
1830 irqstat_reg0 = state_fio->FgetUint8();
1832 irqstat_timer = state_fio->FgetBool();
1833 irqstat_printer = state_fio->FgetBool();
1834 irqstat_keyboard = state_fio->FgetBool();
1837 #if defined(_FM77_VARIANTS)
1838 stat_fdmode_2hd = state_fio->FgetBool();
1839 stat_kanjirom = state_fio->FgetBool();
1840 stat_400linecard = state_fio->FgetBool();
1841 #elif defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
1842 defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
1843 stat_kanjirom = state_fio->FgetBool();
1845 firq_break_key = state_fio->FgetBool();
1846 firq_sub_attention = state_fio->FgetBool();
1848 intmode_fdc = state_fio->FgetBool();
1850 extdet_neg = state_fio->FgetBool();
1851 sub_halt = state_fio->FgetBool();
1852 sub_cancel = state_fio->FgetBool();
1853 #if defined(WITH_Z80)
1854 z80_sel = state_fio->FgetBool();
1857 intstat_syndet = state_fio->FgetBool();
1858 intstat_rxrdy = state_fio->FgetBool();
1859 intstat_txrdy = state_fio->FgetBool();
1864 connect_psg = state_fio->FgetBool();
1866 connect_opn = state_fio->FgetBool();
1867 connect_whg = state_fio->FgetBool();
1868 connect_thg = state_fio->FgetBool();
1870 opn_psg_77av = state_fio->FgetBool();
1874 opn_address[0] = state_fio->FgetUint32_BE();
1875 opn_data[0] = state_fio->FgetUint32_BE();
1876 opn_stat[0] = state_fio->FgetUint32_BE();
1877 opn_cmdreg[0] = state_fio->FgetUint32_BE();
1878 opn_ch3mode[0] = state_fio->FgetUint32_BE();
1881 for(ch = 0; ch < 4; ch++) {
1882 opn_address[ch] = state_fio->FgetUint32_BE();
1883 opn_data[ch] = state_fio->FgetUint32_BE();
1884 opn_stat[ch] = state_fio->FgetUint32_BE();
1885 opn_cmdreg[ch] = state_fio->FgetUint32_BE();
1886 opn_ch3mode[ch] = state_fio->FgetUint32_BE();
1889 intstat_opn = state_fio->FgetBool();
1890 intstat_mouse = state_fio->FgetBool();
1891 mouse_enable = state_fio->FgetBool();
1893 intstat_whg = state_fio->FgetBool();
1894 intstat_thg = state_fio->FgetBool();
1897 connect_fdc = state_fio->FgetBool();
1898 fdc_statreg = state_fio->FgetUint8();
1899 fdc_cmdreg = state_fio->FgetUint8();
1900 fdc_trackreg = state_fio->FgetUint8();
1901 fdc_sectreg = state_fio->FgetUint8();
1902 fdc_datareg = state_fio->FgetUint8();
1903 fdc_headreg = state_fio->FgetUint8();
1904 fdc_drvsel = state_fio->FgetUint8();
1905 irqreg_fdc = state_fio->FgetUint8();
1906 fdc_motor = state_fio->FgetBool();
1907 irqstat_fdc = state_fio->FgetBool();
1910 connect_kanjiroml1 = state_fio->FgetBool();
1911 #if defined(_FM77AV_VARIANTS)
1912 connect_kanjiroml2 = state_fio->FgetBool();
1913 boot_ram = state_fio->FgetBool();
1914 hotreset = state_fio->FgetBool();
1916 sub_monitor_type = state_fio->FgetUint8();
1920 event_beep = state_fio->FgetInt32_BE();
1921 event_beep_oneshot = state_fio->FgetInt32_BE();
1922 event_timerirq = state_fio->FgetInt32_BE();
1925 if(version >= 3) { // V3
1926 event_fdc_motor = state_fio->FgetInt32_BE();
1927 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)|| \
1928 defined(_FM77AV20) || defined(_FM77AV20SX) || defined(_FM77AV20EX)
1929 for(ch = 0; ch < 4; ch++) fdc_drive_table[ch] = state_fio->FgetUint8();
1930 fdc_reg_fd1e = state_fio->FgetUint8();
1932 #if defined(HAS_DMA)
1933 intstat_dma = state_fio->FgetBool();
1934 dma_addr = (uint32_t)(state_fio->FgetUint8() & 0x1f);
1936 #if defined(_FM77AV_VARIANTS)
1937 reg_fd12 = state_fio->FgetUint8();
1940 if(version != STATE_VERSION) return false;