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 #if !defined(_MSC_VER)
27 FM7_MAINIO::FM7_MAINIO(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
42 cmt_indat = false; // bit7
43 cmt_invert = false; // Invert signal
47 lpt_ackng_inv = false;
48 lpt_error_inv = false;
51 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
52 defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
53 stat_kanjirom = true; // R/W : bit5, '0' = sub, '1' = main. FM-77 Only.
54 #elif defined(_FM77_VARIANTS)
55 stat_fdmode_2hd = false; // R/W : bit6, '0' = 2HD, '1' = 2DD. FM-77 Only.
56 stat_kanjirom = true; // R/W : bit5, '0' = sub, '1' = main. FM-77 Only.
57 stat_400linecard = false;// R/W : bit4, '0' = connected. FM-77 Only.
59 firq_break_key = false; // bit1, ON = '0'.
60 firq_sub_attention = false; // bit0, ON = '0'.
61 intmode_fdc = false; // bit2, '0' = normal, '1' = SFD.
65 z80_sel = false; // bit0 : '1' = Z80. Maybe only FM-7/77.
68 intstat_syndet = false;
69 intstat_rxrdy = false;
70 intstat_txrdy = false;
74 stat_romrammode = true; // ROM ON
81 for(i = 0; i < 3; i++) {
82 opn_address[i] = 0x00;
93 intstat_mouse = false;
106 // FD20, FD21, FD22, FD23
107 connect_kanjiroml1 = false;
108 #if defined(_FM77AV_VARIANTS)
109 // FD2C, FD2D, FD2E, FD2F
110 connect_kanjiroml2 = false;
112 #if defined(_FM77_VARIANTS) || defined(_FM77AV_VARIANTS)
118 memset(io_w_latch, 0xff, 0x100);
121 FM7_MAINIO::~FM7_MAINIO()
127 void FM7_MAINIO::initialize()
131 event_beep_oneshot = -1;
133 event_fdc_motor = -1;
134 #if defined(_FM77_VARIANTS) || defined(_FM77AV_VARIANTS)
136 # if defined(_FM77_VARIANTS)
137 stat_fdmode_2hd = false;
138 stat_kanjirom = true;
139 stat_400linecard = false;
140 # if defined(_FM77L4)
141 stat_400linecard = true;
148 window_enabled = false;
149 //mmr_segment = 0x00;
150 window_offset = 0x0000;
151 //for(i = 0x00; i < 0x80; i++) {
158 void FM7_MAINIO::reset()
161 if(event_beep >= 0) cancel_event(this, event_beep);
163 if(event_beep_oneshot >= 0) cancel_event(this, event_beep_oneshot);
164 event_beep_oneshot = -1;
165 if(event_timerirq >= 0) cancel_event(this, event_timerirq);
168 register_event(this, EVENT_BEEP_CYCLE, (1000.0 * 1000.0) / (1200.0 * 2.0), true, &event_beep);
170 #if defined(_FM77AV_VARIANTS)
174 opn_psg_77av = false;
179 #if defined(_FM77_VARIANTS)
180 boot_ram = (mainmem->read_signal(FM7_MAINIO_BOOTRAM_RW) == 0) ? false : true;
182 #if defined(_FM77AV_VARIANTS)
183 //enable_initiator = true;
184 //mainmem->write_signal(FM7_MAINIO_INITROM_ENABLED, (enable_initiator) ? 0xffffffff : 0 , 0xffffffff);
185 boot_ram = (mainmem->read_signal(FM7_MAINIO_BOOTRAM_RW) == 0) ? false : true;
189 sub_cancel = false; // bit6 : '1' Cancel req.
190 sub_halt = false; // bit6 : '1' Cancel req.
191 sub_cancel_bak = sub_cancel; // bit6 : '1' Cancel req.
192 sub_halt_bak = sub_halt; // bit6 : '1' Cancel req.
197 //stat_romrammode = true;
198 // IF BASIC BOOT THEN ROM
200 mainmem->write_signal(FM7_MAINIO_PUSH_FD0F, ((config.boot_mode & 3) == 0) ? 0xffffffff : 0, 0xffffffff);
201 #if defined(_FM77AV_VARIANTS)
202 sub_monitor_type = 0x00;
208 window_enabled = false;
209 //mmr_segment = 0x00;
210 window_offset = 0x0000;
211 mainmem->write_signal(FM7_MAINIO_WINDOW_ENABLED, (window_enabled) ? 0xffffffff : 0, 0xffffffff);
212 mainmem->write_data8(FM7_MAINIO_WINDOW_OFFSET, window_offset);
213 mainmem->write_signal(FM7_MAINIO_FASTMMR_ENABLED, (mmr_fast) ? 0xffffffff : 0, 0xffffffff);
214 mainmem->write_signal(FM7_MAINIO_MMR_ENABLED, (mmr_enabled) ? 0xffffffff : 0, 0xffffffff);
215 //mainmem->write_data8(FM7_MAINIO_MMR_SEGMENT, mmr_segment);
217 switch(config.cpu_type){
225 this->write_signal(FM7_MAINIO_CLOCKMODE, clock_fast ? 1 : 0, 1);
226 mainmem->write_signal(FM7_MAINIO_CLOCKMODE, clock_fast ? 1 : 0, 1);
229 irqmask_syndet = true;
230 irqmask_rxrdy = true;
231 irqmask_txrdy = true;
233 irqmask_timer = true;
234 irqmask_printer = true;
235 irqmask_keyboard = true;
240 intstat_syndet = false;
241 intstat_rxrdy = false;
242 intstat_txrdy = false;
243 irqstat_timer = false;
244 irqstat_printer = false;
245 irqstat_keyboard = false;
247 irqreq_syndet = false;
248 irqreq_rxrdy = false;
249 irqreq_txrdy = false;
250 irqreq_timer = false;
251 irqreq_printer = false;
252 irqreq_keyboard = false;
254 drec->write_signal(SIG_DATAREC_OUT, 0x00, 0x01);
255 drec->write_signal(SIG_DATAREC_REMOTE, 0x00, 0x02);
260 firq_break_key = (keyboard->read_signal(SIG_FM7KEY_BREAK_KEY) != 0x00000000); // bit1, ON = '0'.
261 set_sub_attention(false);
262 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
263 defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
264 stat_kanjirom = true; // R/W : bit5, '0' = sub, '1' = main. FM-77 Only.
265 #elif defined(_FM77_VARIANTS)
266 stat_fdmode_2hd = false; // R/W : bit6, '0' = 2HD, '1' = 2DD. FM-77 Only.
267 stat_kanjirom = true; // R/W : bit5, '0' = sub, '1' = main. FM-77 Only.
269 //display->write_signal(SIG_FM7_SUB_KEY_MASK, 1, 1);
270 //display->write_signal(SIG_FM7_SUB_KEY_FIRQ, 0, 1);
271 maincpu->write_signal(SIG_CPU_FIRQ, 0, 1);
276 register_event(this, EVENT_TIMERIRQ_ON, 10000.0 / 4.9152, true, &event_timerirq); // TIMER IRQ
277 memset(io_w_latch, 0xff, 0x100);
281 void FM7_MAINIO::set_clockmode(uint8 flags)
284 if((flags & FM7_MAINCLOCK_SLOW) != 0) {
289 if(f != clock_fast) {
290 this->write_signal(FM7_MAINIO_CLOCKMODE, clock_fast ? 1 : 0, 1);
291 mainmem->write_signal(FM7_MAINIO_CLOCKMODE, clock_fast ? 1 : 0, 1);
295 uint8 FM7_MAINIO::get_clockmode(void)
297 if(!clock_fast) return FM7_MAINCLOCK_SLOW;
298 return FM7_MAINCLOCK_HIGH;
302 uint8 FM7_MAINIO::get_port_fd00(void)
304 uint8 ret = 0x7e; //0b01111110;
305 if(keyboard->read_data8(0x00) != 0) ret |= 0x80; // High bit.
306 //if((keycode_7 & 0x100) != 0) ret |= 0x80; // High bit.
307 if(clock_fast) ret |= 0x01; //0b00000001;
311 void FM7_MAINIO::set_port_fd00(uint8 data)
313 drec->write_signal(SIG_DATAREC_OUT, data, 0x01);
314 drec->write_signal(SIG_DATAREC_REMOTE, data, 0x02);
317 uint8 FM7_MAINIO::get_port_fd02(void)
320 // Still unimplemented printer.
321 ret = (cmt_indat) ? 0xff : 0x7f; // CMT
325 void FM7_MAINIO::set_port_fd02(uint8 val)
328 bool syndetirq_bak = irqmask_syndet;
329 bool rxrdyirq_bak = irqmask_rxrdy;
330 bool txrdyirq_bak = irqmask_txrdy;
332 bool keyirq_bak = irqmask_keyboard;
333 bool timerirq_bak = irqmask_timer;
334 bool printerirq_bak = irqmask_printer;
335 bool mfdirq_bak = irqmask_mfd;
337 // if((val & 0b00010000) != 0) {
338 if((val & 0x80) != 0) {
339 irqmask_syndet = false;
341 irqmask_syndet = true;
343 if(syndetirq_bak != irqmask_syndet) {
344 set_irq_txrdy(irqreq_syndet);
346 if((val & 0x40) != 0) {
347 irqmask_rxrdy = false;
349 irqmask_rxrdy = true;
351 if(rxrdyirq_bak != irqmask_rxrdy) {
352 set_irq_rxrdy(irqreq_rxrdy);
354 if((val & 0x20) != 0) {
355 irqmask_txrdy = false;
357 irqmask_txrdy = true;
359 if(txrdyirq_bak != irqmask_txrdy) {
360 set_irq_txrdy(irqreq_txrdy);
363 if((val & 0x10) != 0) {
368 if(mfdirq_bak != irqmask_mfd) {
369 set_irq_mfd(irqreq_fdc);
372 if((val & 0x04) != 0) {
373 irqmask_timer = false;
375 irqmask_timer = true;
377 if(timerirq_bak != irqmask_timer) {
378 set_irq_timer(irqreq_timer);
381 if((val & 0x02) != 0) {
382 irqmask_printer = false;
384 irqmask_printer = true;
386 if(printerirq_bak != irqmask_printer) {
387 set_irq_printer(irqreq_printer);
390 if((val & 0x01) != 0) {
391 irqmask_keyboard = false;
393 irqmask_keyboard = true;
395 if(keyirq_bak != irqmask_keyboard) {
396 display->write_signal(SIG_FM7_SUB_KEY_MASK, irqmask_keyboard ? 1 : 0, 1);
397 set_irq_keyboard(irqreq_keyboard);
402 void FM7_MAINIO::set_irq_syndet(bool flag)
404 bool backup = intstat_syndet;
405 irqreq_syndet = flag;
406 if(flag && !(irqmask_syndet)) {
407 //irqstat_reg0 &= ~0x80; //~0x20;
408 intstat_syndet = true;
410 // irqstat_reg0 |= 0x80;
411 intstat_syndet = false;
413 if(backup != intstat_syndet) do_irq();
414 //printf("IRQ TIMER: %02x MASK=%d\n", irqstat_reg0, irqmask_timer);
418 void FM7_MAINIO::set_irq_rxrdy(bool flag)
420 bool backup = intstat_rxrdy;
422 if(flag && !(irqmask_rxrdy)) {
423 //irqstat_reg0 &= ~0x40; //~0x20;
424 intstat_rxrdy = true;
426 //irqstat_reg0 |= 0x40;
427 intstat_rxrdy = false;
429 if(backup != intstat_rxrdy) do_irq();
430 //printf("IRQ TIMER: %02x MASK=%d\n", irqstat_reg0, irqmask_timer);
435 void FM7_MAINIO::set_irq_txrdy(bool flag)
437 bool backup = intstat_txrdy;
439 if(flag && !(irqmask_txrdy)) {
440 //irqstat_reg0 &= ~0x20; //~0x20;
441 intstat_txrdy = true;
443 //irqstat_reg0 |= 0x20;
444 intstat_txrdy = false;
446 if(backup != intstat_txrdy) do_irq();
447 //printf("IRQ TIMER: %02x MASK=%d\n", irqstat_reg0, irqmask_timer);
451 void FM7_MAINIO::set_irq_timer(bool flag)
453 uint8 backup = irqstat_reg0;
455 if(flag && !(irqmask_timer)) {
456 irqstat_reg0 &= 0xfb; //~0x04;
457 irqstat_timer = true;
459 irqstat_reg0 |= 0x04;
460 irqstat_timer = false;
462 if(backup != irqstat_reg0) do_irq();
463 //printf("IRQ TIMER: %02x MASK=%d\n", irqstat_reg0, irqmask_timer);
466 void FM7_MAINIO::set_irq_printer(bool flag)
468 uint8 backup = irqstat_reg0;
469 irqreq_printer = flag;
470 if(flag && !(irqmask_printer)) {
471 irqstat_reg0 &= ~0x02;
472 irqstat_printer = true;
473 if(backup != irqstat_reg0) do_irq();
475 irqstat_reg0 |= 0x02;
476 irqstat_printer = false;
477 if(backup != irqstat_reg0) do_irq();
479 // if(!irqmask_printer || !flag) do_irq();
482 void FM7_MAINIO::set_irq_keyboard(bool flag)
484 uint8 backup = irqstat_reg0;
485 //printf("MAIN: KEYBOARD: IRQ=%d MASK=%d\n", flag ,irqmask_keyboard);
486 irqreq_keyboard = flag;
487 if(flag && !irqmask_keyboard) {
488 irqstat_reg0 &= 0xfe;
489 irqstat_keyboard = true;
491 irqstat_reg0 |= 0x01;
492 irqstat_keyboard = false;
494 //if(irqstat_reg0 != backup) do_irq();
499 void FM7_MAINIO::do_irq(void)
502 intstat = irqstat_timer | irqstat_keyboard | irqstat_printer;
503 intstat = intstat | irqstat_fdc;
504 intstat = intstat | intstat_opn | intstat_whg | intstat_thg;
505 intstat = intstat | intstat_txrdy | intstat_rxrdy | intstat_syndet;
506 intstat = intstat | intstat_mouse;
508 intstat = intstat | intstat_dma;
510 //printf("%08d : IRQ: REG0=%02x FDC=%02x, stat=%d\n", SDL_GetTicks(), irqstat_reg0, irqstat_fdc, intstat);
512 maincpu->write_signal(SIG_CPU_IRQ, 1, 1);
514 maincpu->write_signal(SIG_CPU_IRQ, 0, 1);
518 void FM7_MAINIO::do_firq(void)
521 firq_stat = firq_break_key | firq_sub_attention;
523 maincpu->write_signal(SIG_CPU_FIRQ, 1, 1);
525 maincpu->write_signal(SIG_CPU_FIRQ, 0, 1);
529 void FM7_MAINIO::do_nmi(bool flag)
531 maincpu->write_signal(SIG_CPU_NMI, flag ? 1 : 0, 1);
535 void FM7_MAINIO::set_break_key(bool pressed)
537 firq_break_key = pressed;
541 void FM7_MAINIO::set_sub_attention(bool flag)
543 firq_sub_attention = flag;
548 uint8 FM7_MAINIO::get_fd04(void)
551 if(display->read_signal(SIG_DISPLAY_BUSY) != 0) val |= 0x80;
552 if(!firq_break_key) val |= 0x02;
553 if(!firq_sub_attention) {
556 #if defined(_FM77_VARIANTS)
557 if(stat_fdmode_2hd) val |= 0x40;
558 if(stat_kanjirom) val |= 0x20;
559 if(stat_400linecard) val |= 0x10;
560 if((display->read_signal(SIG_DISPLAY_EXTRA_MODE) & 0x04) != 0x00) val |= 0x04;
564 if(firq_sub_attention) {
565 set_sub_attention(false);
566 //printf("Attention \n");
568 #if defined(_FM77AV_VARIANTS)
570 if(mainmem->read_signal(FM7_MAINIO_INITROM_ENABLED) == 0) {
571 set_break_key(false);
579 void FM7_MAINIO::set_fd04(uint8 val)
582 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
583 defined(_FM77AV20) || defined(_FM77AV20SX) || defined(_FM77AV20EX)
584 display->write_signal(SIG_DISPLAY_EXTRA_MODE, val, 0xff);
585 stat_kanjirom = ((val & 0x20) != 0);
586 #elif defined(_FM77_VARIANTS)
587 display->write_signal(SIG_DISPLAY_EXTRAMODE, val, 0xff);
588 stat_fdmode_2hd = ((val & 0x40) != 0);
589 stat_kanjirom = ((val & 0x20) != 0);
590 stat_400linecard = ((val & 0x10) != 0);
595 uint8 FM7_MAINIO::get_fd05(void)
598 //val = (sub_busy) ? 0xfe : 0x7e;
599 if(display->read_signal(SIG_DISPLAY_BUSY) != 0) val |= 0x80;
600 if(!extdet_neg) val |= 0x01;
601 //printf("FD05: READ: %d VAL=%02x\n", SDL_GetTicks(), val);
605 void FM7_MAINIO::set_fd05(uint8 val)
607 sub_cancel = ((val & 0x40) != 0) ? true : false;
608 sub_halt = ((val & 0x80) != 0) ? true : false;
609 //if(sub_halt != sub_halt_bak) {
610 display->write_signal(SIG_DISPLAY_HALT, (sub_halt) ? 0xff : 0x00, 0xff);
612 sub_halt_bak = sub_halt;
614 //if(sub_cancel != sub_cancel_bak) {
615 display->write_signal(SIG_FM7_SUB_CANCEL, (sub_cancel) ? 0xff : 0x00, 0xff); // HACK
617 sub_cancel_bak = sub_cancel;
619 if((val & 0x01) != 0) {
620 maincpu->write_signal(SIG_CPU_BUSREQ, 1, 1);
621 z80->write_signal(SIG_CPU_BUSREQ, 0, 1);
623 maincpu->write_signal(SIG_CPU_BUSREQ, 0, 1);
624 z80->write_signal(SIG_CPU_BUSREQ, 1, 1);
629 void FM7_MAINIO::set_extdet(bool flag)
634 void FM7_MAINIO::write_fd0f(void)
636 mainmem->write_signal(FM7_MAINIO_PUSH_FD0F, 0, 0xffffffff);
638 uint8 FM7_MAINIO::read_fd0f(void)
640 mainmem->write_signal(FM7_MAINIO_PUSH_FD0F, 0xffffffff, 0xffffffff);
644 bool FM7_MAINIO::get_rommode_fd0f(void)
646 return (mainmem->read_signal(FM7_MAINIO_PUSH_FD0F) == 0) ? false : true;
650 // Kanji ROM, FD20 AND FD21 (or SUBSYSTEM)
651 void FM7_MAINIO::write_kanjiaddr_hi(uint8 addr)
653 if(!connect_kanjiroml1) return;
654 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
655 defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
656 if(!stat_kanjirom) return;
658 kanjiclass1->write_data8(KANJIROM_ADDR_HI, addr);
662 void FM7_MAINIO::write_kanjiaddr_lo(uint8 addr)
664 if(!connect_kanjiroml1) return;
665 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
666 defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
667 if(!stat_kanjirom) return;
669 kanjiclass1->write_data8(KANJIROM_ADDR_LO, addr);
673 uint8 FM7_MAINIO::read_kanjidata_left(void)
675 if(!connect_kanjiroml1) return 0xff;
676 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
677 defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
678 if(!stat_kanjirom) return 0xff;
680 //printf("KANJI MAIN CLASS1 ADDR: %05x\n", kaddress.w.l);
682 return kanjiclass1->read_data8(KANJIROM_DATA_HI);
688 uint8 FM7_MAINIO::read_kanjidata_right(void)
692 if(!connect_kanjiroml1) return 0xff;
693 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
694 defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
695 if(!stat_kanjirom) return 0xff;
698 return kanjiclass1->read_data8(KANJIROM_DATA_LO);
704 #ifdef CAPABLE_KANJICLASS2
705 // Kanji ROM, FD20 AND FD21 (or SUBSYSTEM)
706 void FM7_MAINIO::write_kanjiaddr_hi_l2(uint8 addr)
708 if(!connect_kanjiroml2) return;
709 if(!stat_kanjirom) return;
710 kanjiclass2->write_data8(KANJIROM_ADDR_HI, addr);
714 void FM7_MAINIO::write_kanjiaddr_lo_l2(uint8 addr)
716 if(!connect_kanjiroml2) return;
717 if(!stat_kanjirom) return;
718 kanjiclass2->write_data8(KANJIROM_ADDR_LO, addr);
723 uint8 FM7_MAINIO::read_kanjidata_left_l2(void)
725 if(!connect_kanjiroml2) return 0xff;
726 if(!stat_kanjirom) return 0xff;
729 return kanjiclass2->read_data8(KANJIROM_DATA_HI);
735 uint8 FM7_MAINIO::read_kanjidata_right_l2(void)
737 if(!connect_kanjiroml2) return 0xff;
738 if(!stat_kanjirom) return 0xff;
741 return kanjiclass2->read_data8(KANJIROM_DATA_LO);
749 uint32 FM7_MAINIO::read_signal(int id)
753 case FM7_MAINIO_KEYBOARDIRQ_MASK:
754 retval = (irqmask_keyboard) ? 0xffffffff : 0x00000000;
764 void FM7_MAINIO::write_signal(int id, uint32 data, uint32 mask)
767 val_b = ((data & mask) != 0);
770 //case SIG_FM7_SUB_HALT:
771 // mainmem->write_signal(SIG_FM7_SUB_HALT, data, mask);
773 case FM7_MAINIO_CLOCKMODE: // fd00
780 uint32 clocks = 1794000;
781 #if defined(_FM77AV_VARIANTS) || defined(_FM77_VARIANTS)
785 clocks = 2016000; // Hz
787 clocks = 1230502; // (2016 * 1095 / 1794)[KHz]
791 clocks = 1565000; // Hz
793 clocks = 955226; // (1565 * 1095 / 1794)[KHz]
798 clocks = 1794000; // Hz
800 clocks = 1095000; // Hz
805 clocks = 1794000; // Hz
807 clocks = 1095000; // Hz
810 p_vm->set_cpu_clock(this->maincpu, clocks);
811 display->write_signal(SIG_DISPLAY_CLOCK, clock_fast ? 1 : 0, 1);
814 case FM7_MAINIO_CMT_RECV: // FD02
815 cmt_indat = val_b ^ cmt_invert;
817 case FM7_MAINIO_CMT_INVERT: // FD02
820 case FM7_MAINIO_TIMERIRQ: //
821 set_irq_timer(val_b);
823 case FM7_MAINIO_LPTIRQ: //
824 set_irq_printer(val_b);
826 case FM7_MAINIO_KEYBOARDIRQ: //
827 set_irq_keyboard(val_b);
829 case SIG_FM7KEY_PUSH_DATA: //
830 keycode_7 = data & 0x1ff;
833 case FM7_MAINIO_PUSH_BREAK:
834 set_break_key(val_b);
836 #if defined(FM77AV_VARIANTS)
837 case FM7_MAINIO_HOT_RESET:
841 case FM7_MAINIO_SUB_ATTENTION:
842 if(val_b) set_sub_attention(true);
845 case FM7_MAINIO_EXTDET:
848 case FM7_MAINIO_BEEP:
851 case FM7_MAINIO_JOYPORTA_CHANGED:
852 joyport_a = data & mask;
854 case FM7_MAINIO_JOYPORTB_CHANGED:
855 joyport_b = data & mask;
857 case FM7_MAINIO_PSG_IRQ:
859 case FM7_MAINIO_OPN_IRQ:
860 if(!connect_opn) break;
864 case FM7_MAINIO_WHG_IRQ:
865 if(!connect_whg) break;
869 case FM7_MAINIO_THG_IRQ:
870 if(!connect_thg) break;
874 case FM7_MAINIO_FDC_DRQ:
877 case FM7_MAINIO_FDC_IRQ:
881 case FM7_MAINIO_DMA_INT:
891 uint8 FM7_MAINIO::get_irqstat_fd03(void)
896 extirq = irqstat_fdc | intstat_opn | intstat_whg | intstat_thg;
897 extirq = extirq | intstat_syndet | intstat_rxrdy | intstat_txrdy;
899 irqstat_reg0 &= ~0x08;
901 irqstat_reg0 |= 0x08;
903 val = irqstat_reg0 | 0xf0;
904 set_irq_timer(false);
905 set_irq_printer(false);
909 uint8 FM7_MAINIO::get_extirq_fd17(void)
912 if(intstat_opn && connect_opn) val &= ~0x08;
913 if(intstat_mouse) val &= ~0x04;
914 //if(!intstat_opn && !intstat_mouse) do_irq(false);
918 void FM7_MAINIO::set_ext_fd17(uint8 data)
920 if((data & 0x04) != 0) {
923 mouse_enable = false;
927 #if defined(_FM77AV_VARIANTS)
929 uint8 FM7_MAINIO::subsystem_read_status(void)
932 retval = (display->read_signal(SIG_DISPLAY_MODE320) != 0) ? 0x40 : 0;
933 retval |= display->read_signal(SIG_DISPLAY_VSYNC);
934 retval |= display->read_signal(SIG_DISPLAY_DISPLAY);
941 uint32 FM7_MAINIO::read_io8(uint32 addr)
942 { // This is only for debug.
945 return io_w_latch[addr];
946 } else if(addr < 0x500) {
947 uint32 ofset = addr & 0xff;
948 uint opnbank = (addr - 0x100) >> 8;
949 return opn_regs[opnbank][ofset];
950 } else if(addr < 0x600) {
951 return mainmem->read_data8(addr - 0x500 + FM7_MAINIO_MMR_BANK);
956 uint32 FM7_MAINIO::read_dma_io8(uint32 addr)
958 return this->read_data8(addr & 0xff);
961 uint32 FM7_MAINIO::read_dma_data8(uint32 addr)
963 return this->read_data8(addr & 0xff);
966 uint32 FM7_MAINIO::read_data8(uint32 addr)
970 if(addr < FM7_MAINIO_IS_BASICROM) {
974 if((addr < 0x90) && (addr >= 0x80)) {
975 mmr_segment = mainmem->read_data8(FM7_MAINIO_MMR_SEGMENT);
976 # if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX) || \
977 defined(_FM77AV20) || defined(_FM77AV20SX) || defined(_FM77AV20EX)
982 return mainmem->read_data8(addr - 0x80 + FM7_MAINIO_MMR_BANK + mmr_segment * 16);
985 // if((addr >= 0x0006) && !(addr == 0x1f) && !(addr == 0x0b)) printf("MAINIO: READ: %08x \n", addr);
988 retval = (uint32) get_port_fd00();
991 retval = keyboard->read_data8(0x01) & 0xff;
992 //retval = keycode_7 & 0xff;
993 //set_irq_keyboard(false);
996 retval = (uint32) get_port_fd02();
999 retval = (uint32) get_irqstat_fd03();
1002 retval = (uint32) get_fd04();
1005 retval = (uint32) get_fd05();
1007 case 0x06: // RS-232C
1010 case 0x08: // Light pen
1014 #if defined(_FM77AV_VARIANTS)
1016 retval = ((config.boot_mode & 3) == 0) ? 0xfe : 0xff;
1019 case 0x0e: // PSG DATA
1020 retval = (uint32) get_psg();
1021 //printf("PSG DATA READ val=%02x\n", retval);
1027 #if defined(_FM77AV_VARIANTS)
1029 retval = subsystem_read_status();
1032 case 0x15: // OPN CMD
1033 //printf("OPN CMD READ \n");
1035 case 0x16: // OPN DATA
1036 retval = (uint32) get_opn(0);
1037 //printf("OPN DATA READ val=%02x\n", retval);
1040 retval = (uint32) get_extirq_fd17();
1042 case 0x18: // FDC: STATUS
1043 retval = (uint32) get_fdc_stat();
1044 //printf("FDC: READ STATUS %02x PC=%04x\n", retval, maincpu->get_pc());
1046 case 0x19: // FDC: Track
1047 retval = (uint32) get_fdc_track();
1048 //printf("FDC: READ TRACK REG %02x\n", retval);
1050 case 0x1a: // FDC: Sector
1051 retval = (uint32) get_fdc_sector();
1052 //printf("FDC: READ SECTOR REG %02x\n", retval);
1054 case 0x1b: // FDC: Data
1055 retval = (uint32) get_fdc_data();
1058 retval = (uint32) get_fdc_fd1c();
1059 //printf("FDC: READ HEAD REG %02x\n", retval);
1062 retval = (uint32) get_fdc_motor();
1063 //printf("FDC: READ MOTOR REG %02x\n", retval);
1066 retval = (uint32) get_fdc_fd1e();
1067 //printf("FDC: READ MOTOR REG %02x\n", retval);
1070 retval = (uint32) fdc_getdrqirq();
1072 case 0x22: // Kanji ROM
1073 retval = (uint32) read_kanjidata_left();
1075 case 0x23: // Kanji ROM
1076 retval = (uint32) read_kanjidata_right();
1078 #if defined(CAPABLE_KANJI_CLASS2)
1079 case 0x2e: // Kanji ROM Level2
1080 retval = (uint32) read_kanjidata_left_l2();
1082 case 0x2f: // Kanji ROM Level2
1083 retval = (uint32) read_kanjidata_right_l2();
1086 case 0x37: // Multi page
1087 //retval = (uint32)display->read_data8(DISPLAY_ADDR_MULTIPAGE);
1089 case 0x45: // WHG CMD
1091 case 0x46: // WHG DATA
1092 retval = (uint32) get_opn(1);
1095 retval = (uint32) get_extirq_whg();
1097 case 0x51: // THG CMD
1099 case 0x52: // THG DATA
1100 retval = (uint32) get_opn(2);
1103 retval = (uint32) get_extirq_thg();
1105 #if defined(HAS_MMR)
1109 if(mainmem->read_signal(FM7_MAINIO_BOOTRAM_RW) != 0) retval |= 0x01;
1110 if(mainmem->read_signal(FM7_MAINIO_WINDOW_ENABLED) != 0) retval |= 0x40;
1111 if(mainmem->read_signal(FM7_MAINIO_MMR_ENABLED) != 0) retval |= 0x80;
1114 #if defined(HAS_DMA)
1119 retval = dmac->read_data8(dma_addr);
1120 //p_emu->out_debug_log(_T("IO: Read DMA %02x from reg %02x\n"), retval, dma_addr);
1124 //printf("MAIN: Read another I/O Addr=%08x\n", addr);
1127 if((addr < 0x40) && (addr >= 0x38)) {
1128 addr = (addr - 0x38) + FM7_SUBMEM_OFFSET_DPALETTE;
1129 return (uint32) display->read_data8(addr);
1133 } else if(addr == FM7_MAINIO_CLOCKMODE) {
1134 return (uint32)get_clockmode();
1136 #if defined(_FM77AV_VARIANTS)
1137 else if(addr == FM7_MAINIO_SUBMONITOR_ROM) {
1138 retval = sub_monitor_type & 0x03;
1140 } else if(addr == FM7_MAINIO_SUBMONITOR_RAM) {
1141 #if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX) || \
1142 defined(_FM77AV20) || defined(_FM77AV20SX) || defined(_FM77AV20EX)
1143 retval = ((sub_monitor_type & 0x04) != 0) ? 0xffffffff : 0x00000000;
1150 //if((addr >= 0x0006) && (addr != 0x1f)) printf("MAINIO: READ: %08x DATA=%08x\n", addr);
1154 void FM7_MAINIO::write_dma_io8(uint32 addr, uint32 data)
1156 this->write_data8(addr & 0xff, data);
1159 void FM7_MAINIO::write_dma_data8(uint32 addr, uint32 data)
1161 this->write_data8(addr & 0xff, data);
1165 void FM7_MAINIO::write_data8(uint32 addr, uint32 data)
1169 if(addr < FM7_MAINIO_IS_BASICROM) {
1171 io_w_latch[addr] = data;
1172 #if defined(HAS_MMR)
1173 if((addr < 0x90) && (addr >= 0x80)) {
1174 mmr_segment = mainmem->read_data8(FM7_MAINIO_MMR_SEGMENT);
1175 # if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX) || \
1176 defined(_FM77AV20) || defined(_FM77AV20SX) || defined(_FM77AV20EX)
1177 mmr_segment &= 0x07;
1179 mmr_segment &= 0x03;
1181 mainmem->write_data8(FM7_MAINIO_MMR_BANK + mmr_segment * 16 + addr - 0x80, data);
1187 set_port_fd00((uint8)data);
1191 // set_lptdata_fd01((uint8)data);
1194 set_port_fd02((uint8)data);
1200 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
1201 defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
1202 display->write_signal(SIG_DISPLAY_EXTRA_MODE, data, 0xff);
1204 // set_flags_fd04(data);
1207 set_fd05((uint8)data);
1209 case 0x06: // RS-232C
1212 case 0x08: // Light pen
1217 //printf("PSG CMD WRITE val=%02x\n", data);
1221 //printf("PSG DATA WRITE val=%02x\n", data);
1227 #if defined(_FM77AV_VARIANTS)
1229 flag = ((data & 0x02) == 0) ? true : false;
1230 mainmem->write_signal(FM7_MAINIO_INITROM_ENABLED, (flag) ? 0xffffffff : 0 , 0xffffffff);
1233 display->write_signal(SIG_DISPLAY_MODE320, data, 0x40);
1236 sub_monitor_type = data & 0x07;
1237 //if(sub_monitor_type != sub_monitor_bak) {
1238 display->write_signal(SIG_FM7_SUB_BANK, sub_monitor_type, 0x07);
1240 //sub_monitor_bak = sub_monitor_type;
1243 case 0x15: // OPN CMD
1244 //printf("OPN CMD WRITE val=%02x\n", data);
1245 set_opn_cmd(0, data);
1247 case 0x16: // OPN DATA
1248 //printf("OPN DATA WRITE val=%02x\n", data);
1252 set_ext_fd17((uint8)data);
1254 case 0x18: // FDC: COMMAND
1255 set_fdc_cmd((uint8)data);
1256 //printf("FDC: WRITE CMD %02x\n", data);
1258 case 0x19: // FDC: Track
1259 set_fdc_track((uint8)data);
1260 //printf("FDC: WRITE TRACK REG %02x\n", data);
1262 case 0x1a: // FDC: Sector
1263 set_fdc_sector((uint8)data);
1264 //printf("FDC: WRITE SECTOR REG %02x\n", data);
1266 case 0x1b: // FDC: Data
1267 set_fdc_data((uint8)data);
1270 set_fdc_fd1c((uint8)data);
1271 //printf("FDC: WRITE HEAD REG %02x\n", data);
1274 set_fdc_fd1d((uint8)data);
1275 //printf("FDC: WRITE MOTOR REG %02x\n", data);
1278 set_fdc_fd1e((uint8)data);
1283 case 0x20: // Kanji ROM
1284 case 0x2c: // Kanji ROM(DUP)
1285 write_kanjiaddr_hi((uint8)data);
1286 #if defined(CAPABLE_KANJI_CLASS2)
1287 write_kanjiaddr_hi_l2((uint8)data);
1290 case 0x21: // Kanji ROM
1291 case 0x2d: // Kanji ROM(DUP)
1292 write_kanjiaddr_lo((uint8)data);
1293 #if defined(CAPABLE_KANJI_CLASS2)
1294 write_kanjiaddr_lo_l2((uint8)data);
1297 #if defined(_FM77AV_VARIANTS)
1299 display->write_data8(FM7_SUBMEM_OFFSET_APALETTE_HI, data);
1302 display->write_data8(FM7_SUBMEM_OFFSET_APALETTE_LO, data);
1305 display->write_data8(FM7_SUBMEM_OFFSET_APALETTE_B, data);
1308 display->write_data8(FM7_SUBMEM_OFFSET_APALETTE_R, data);
1311 display->write_data8(FM7_SUBMEM_OFFSET_APALETTE_G, data);
1314 case 0x37: // Multi page
1315 display->write_signal(SIG_DISPLAY_MULTIPAGE, data, 0x00ff);
1317 case 0x45: // WHG CMD
1318 set_opn_cmd(1, data);
1320 case 0x46: // WHG DATA
1325 case 0x51: // THG CMD
1326 set_opn_cmd(2, data);
1328 case 0x52: // THG DATA
1333 #if defined(HAS_MMR)
1335 #if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX) || \
1336 defined(_FM77AV20) || defined(_FM77AV20SX) || defined(_FM77AV20EX)
1337 mmr_segment = data & 7;
1339 // printf("MMR SEGMENT: %02x\n", data & 3);
1340 mmr_segment = data & 3;
1342 mainmem->write_data8(FM7_MAINIO_MMR_SEGMENT, (uint32)mmr_segment);
1345 window_offset = data & 0x00ff;
1346 mainmem->write_data8(FM7_MAINIO_WINDOW_OFFSET, (uint32)window_offset);
1349 mainmem->write_signal(FM7_MAINIO_BOOTRAM_RW, data, 0x01);
1350 mainmem->write_signal(FM7_MAINIO_WINDOW_ENABLED, data , 0x40);
1351 this->write_signal(FM7_MAINIO_CLOCKMODE, clock_fast ? 1 : 0, 1);
1352 mainmem->write_signal(FM7_MAINIO_CLOCKMODE, clock_fast ? 1 : 0, 1);
1353 mainmem->write_signal(FM7_MAINIO_MMR_ENABLED, data, 0x80);
1357 #if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX) || \
1358 defined(_FM77AV20) || defined(_FM77AV20SX) || defined(_FM77AV20EX)
1360 mainmem->write_signal(FM7_MAINIO_MMR_EXTENDED, data, 0x80);
1361 mainmem->write_signal(FM7_MAINMEM_REFRESH_FAST, data, 0x04);
1362 mainmem->write_signal(FM7_MAINIO_WINDOW_FAST , data, 0x01);
1366 mainmem->write_signal(FM7_MAINIO_FASTMMR_ENABLED, data, 0x08);
1367 mainmem->write_signal(FM7_MAINIO_EXTROM, data & 0x80, 0x80);
1370 #if defined(HAS_DMA)
1372 dma_addr = data & 0x1f;
1375 dmac->write_data8(dma_addr, data);
1376 //p_emu->out_debug_log(_T("IO: Wrote DMA %02x to reg %02x\n"), data, dma_addr);
1380 //printf("MAIN: Write I/O Addr=%08x DATA=%02x\n", addr, data);
1383 if((addr < 0x40) && (addr >= 0x38)) {
1384 addr = (addr - 0x38) | FM7_SUBMEM_OFFSET_DPALETTE;
1385 display->write_data8(addr, (uint8)data);
1389 } else if(addr == FM7_MAINIO_CLOCKMODE) {
1390 set_clockmode((uint8)data);
1393 //if((addr >= 0x0006) && !(addr == 0x1f)) printf("MAINIO: WRITE: %08x DATA=%08x\n", addr, data);
1396 void FM7_MAINIO::event_callback(int event_id, int err)
1398 // printf("MAIN EVENT id=%d\n", event_id);
1400 case EVENT_BEEP_OFF:
1403 case EVENT_BEEP_CYCLE:
1406 case EVENT_UP_BREAK:
1407 set_break_key(false);
1409 case EVENT_TIMERIRQ_ON:
1410 //if(!irqmask_timer) set_irq_timer(true);
1411 set_irq_timer(true);
1413 case EVENT_FD_MOTOR_ON:
1414 set_fdc_motor(true);
1415 event_fdc_motor = -1;
1417 case EVENT_FD_MOTOR_OFF:
1418 set_fdc_motor(false);
1419 event_fdc_motor = -1;
1427 void FM7_MAINIO::update_config()
1429 switch(config.cpu_type){
1437 this->write_signal(FM7_MAINIO_CLOCKMODE, clock_fast ? 1 : 0, 1);
1438 mainmem->write_signal(FM7_MAINIO_CLOCKMODE, clock_fast ? 1 : 0, 1);
1441 void FM7_MAINIO::event_vline(int v, int clock)
1445 #define STATE_VERSION 3
1446 void FM7_MAINIO::save_state(FILEIO *state_fio)
1450 state_fio->FputUint32_BE(STATE_VERSION);
1451 state_fio->FputInt32_BE(this_device_id);
1455 for(addr = 0; addr < 0x100; addr++) state_fio->FputUint8(io_w_latch[addr]);
1457 state_fio->FputBool(clock_fast);
1458 state_fio->FputBool(lpt_strobe);
1459 state_fio->FputBool(lpt_slctin);
1460 state_fio->FputBool(beep_flag);
1461 state_fio->FputBool(beep_snd);
1464 state_fio->FputUint8(lpt_outdata);
1466 state_fio->FputBool(cmt_indat);
1467 state_fio->FputBool(cmt_invert);
1468 state_fio->FputBool(lpt_det2);
1469 state_fio->FputBool(lpt_det1);
1470 state_fio->FputBool(lpt_pe);
1471 state_fio->FputBool(lpt_ackng_inv);
1472 state_fio->FputBool(lpt_error_inv);
1473 state_fio->FputUint8(irqmask_reg0);
1475 state_fio->FputBool(irqmask_syndet);
1476 state_fio->FputBool(irqmask_rxrdy);
1477 state_fio->FputBool(irqmask_txrdy);
1478 state_fio->FputBool(irqmask_mfd);
1479 state_fio->FputBool(irqmask_timer);
1480 state_fio->FputBool(irqmask_printer);
1481 state_fio->FputBool(irqmask_keyboard);
1483 state_fio->FputBool(irqreq_syndet);
1484 state_fio->FputBool(irqreq_rxrdy);
1485 state_fio->FputBool(irqreq_txrdy);
1486 state_fio->FputBool(irqreq_fdc);
1487 state_fio->FputBool(irqreq_timer);
1488 state_fio->FputBool(irqreq_printer);
1489 state_fio->FputBool(irqreq_keyboard);
1491 state_fio->FputUint8(irqstat_reg0);
1493 state_fio->FputBool(irqstat_timer);
1494 state_fio->FputBool(irqstat_printer);
1495 state_fio->FputBool(irqstat_keyboard);
1498 #if defined(_FM77_VARIANTS)
1499 state_fio->FputBool(stat_fdmode_2hd);
1500 state_fio->FputBool(stat_kanjirom);
1501 state_fio->FputBool(stat_400linecard);
1502 #elif defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
1503 defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
1504 state_fio->FputBool(stat_kanjirom);
1506 state_fio->FputBool(firq_break_key);
1507 state_fio->FputBool(firq_sub_attention);
1509 state_fio->FputBool(intmode_fdc);
1511 state_fio->FputBool(extdet_neg);
1512 //state_fio->FputBool(sub_busy);
1513 state_fio->FputBool(sub_halt);
1514 //state_fio->FputBool(sub_halt_bak);
1515 state_fio->FputBool(sub_cancel);
1516 //state_fio->FputBool(sub_cancel_bak);
1517 #if defined(WITH_Z80)
1518 state_fio->FputBool(z80_sel);
1521 state_fio->FputBool(intstat_syndet);
1522 state_fio->FputBool(intstat_rxrdy);
1523 state_fio->FputBool(intstat_txrdy);
1528 state_fio->FputBool(connect_opn);
1529 state_fio->FputBool(connect_whg);
1530 state_fio->FputBool(connect_thg);
1532 state_fio->FputBool(opn_psg_77av);
1534 for(ch = 0; ch < 4; ch++) {
1535 state_fio->FputUint32_BE(opn_address[ch]);
1536 state_fio->FputUint32_BE(opn_data[ch]);
1537 state_fio->FputUint32_BE(opn_stat[ch]);
1538 state_fio->FputUint32_BE(opn_cmdreg[ch]);
1539 state_fio->FputUint32_BE(opn_ch3mode[ch]);
1541 state_fio->FputUint32_BE(joyport_a);
1542 state_fio->FputUint32_BE(joyport_b);
1544 state_fio->FputBool(intstat_opn);
1545 state_fio->FputBool(intstat_mouse);
1546 state_fio->FputBool(mouse_enable);
1548 state_fio->FputBool(intstat_whg);
1549 state_fio->FputBool(intstat_thg);
1552 state_fio->FputBool(connect_fdc);
1553 state_fio->FputUint8(fdc_statreg);
1554 state_fio->FputUint8(fdc_cmdreg);
1555 state_fio->FputUint8(fdc_trackreg);
1556 state_fio->FputUint8(fdc_sectreg);
1557 state_fio->FputUint8(fdc_datareg);
1558 state_fio->FputUint8(fdc_headreg);
1559 state_fio->FputUint8(fdc_drvsel);
1560 state_fio->FputUint8(irqreg_fdc);
1561 state_fio->FputBool(fdc_motor);
1562 state_fio->FputBool(irqstat_fdc);
1564 state_fio->FputBool(connect_kanjiroml1);
1565 #if defined(_FM77AV_VARIANTS)
1566 state_fio->FputBool(connect_kanjiroml2);
1568 state_fio->FputBool(boot_ram);
1569 state_fio->FputBool(hotreset);
1571 state_fio->FputUint8(sub_monitor_type);
1572 //state_fio->FputUint8(sub_monitor_bak);
1578 state_fio->FputInt32_BE(event_beep);
1579 state_fio->FputInt32_BE(event_beep_oneshot);
1580 state_fio->FputInt32_BE(event_timerirq);
1583 state_fio->FputInt32_BE(event_fdc_motor);
1584 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)|| \
1585 defined(_FM77AV20) || defined(_FM77AV20SX) || defined(_FM77AV20EX)
1586 for(ch = 0; ch < 4; ch++) state_fio->FputUint8(fdc_drive_table[ch]);
1587 state_fio->FputUint8(fdc_reg_fd1e);
1589 #if defined(HAS_DMA)
1590 state_fio->FputBool(intstat_dma);
1591 state_fio->FputUint8(dma_addr & 0x1f);
1596 bool FM7_MAINIO::load_state(FILEIO *state_fio)
1603 version = state_fio->FgetUint32_BE();
1604 if(this_device_id != state_fio->FgetInt32_BE()) return false;
1607 for(addr = 0; addr < 0x100; addr++) io_w_latch[addr] = state_fio->FgetUint8();
1609 clock_fast = state_fio->FgetBool();
1610 lpt_strobe = state_fio->FgetBool();
1611 lpt_slctin = state_fio->FgetBool();
1612 beep_flag = state_fio->FgetBool();
1613 beep_snd = state_fio->FgetBool();
1616 lpt_outdata = state_fio->FgetUint8();
1618 cmt_indat = state_fio->FgetBool();
1619 cmt_invert = state_fio->FgetBool();
1620 lpt_det2 = state_fio->FgetBool();
1621 lpt_det1 = state_fio->FgetBool();
1622 lpt_pe = state_fio->FgetBool();
1623 lpt_ackng_inv = state_fio->FgetBool();
1624 lpt_error_inv = state_fio->FgetBool();
1625 irqmask_reg0 = state_fio->FgetUint8();
1627 irqmask_syndet = state_fio->FgetBool();
1628 irqmask_rxrdy = state_fio->FgetBool();
1629 irqmask_txrdy = state_fio->FgetBool();
1630 irqmask_mfd = state_fio->FgetBool();
1631 irqmask_timer = state_fio->FgetBool();
1632 irqmask_printer = state_fio->FgetBool();
1633 irqmask_keyboard = state_fio->FgetBool();
1635 irqreq_syndet = state_fio->FgetBool();
1636 irqreq_rxrdy = state_fio->FgetBool();
1637 irqreq_txrdy = state_fio->FgetBool();
1638 irqreq_fdc = state_fio->FgetBool();
1639 irqreq_timer = state_fio->FgetBool();
1640 irqreq_printer = state_fio->FgetBool();
1641 irqreq_keyboard = state_fio->FgetBool();
1643 irqstat_reg0 = state_fio->FgetUint8();
1645 irqstat_timer = state_fio->FgetBool();
1646 irqstat_printer = state_fio->FgetBool();
1647 irqstat_keyboard = state_fio->FgetBool();
1650 #if defined(_FM77_VARIANTS)
1651 stat_fdmode_2hd = state_fio->FgetBool();
1652 stat_kanjirom = state_fio->FgetBool();
1653 stat_400linecard = state_fio->FgetBool();
1654 #elif defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
1655 defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
1656 stat_kanjirom = state_fio->FgetBool();
1658 firq_break_key = state_fio->FgetBool();
1659 firq_sub_attention = state_fio->FgetBool();
1661 intmode_fdc = state_fio->FgetBool();
1663 extdet_neg = state_fio->FgetBool();
1664 //sub_busy = state_fio->FgetBool();
1665 sub_halt = state_fio->FgetBool();
1666 //sub_halt_bak = state_fio->FgetBool();
1667 sub_cancel = state_fio->FgetBool();
1668 //sub_cancel_bak = state_fio->FgetBool();
1669 #if defined(WITH_Z80)
1670 z80_sel = state_fio->FgetBool();
1673 intstat_syndet = state_fio->FgetBool();
1674 intstat_rxrdy = state_fio->FgetBool();
1675 intstat_txrdy = state_fio->FgetBool();
1679 connect_opn = state_fio->FgetBool();
1680 connect_whg = state_fio->FgetBool();
1681 connect_thg = state_fio->FgetBool();
1683 opn_psg_77av = state_fio->FgetBool();
1685 for(ch = 0; ch < 4; ch++) {
1686 opn_address[ch] = state_fio->FgetUint32_BE();
1687 opn_data[ch] = state_fio->FgetUint32_BE();
1688 opn_stat[ch] = state_fio->FgetUint32_BE();
1689 opn_cmdreg[ch] = state_fio->FgetUint32_BE();
1690 opn_ch3mode[ch] = state_fio->FgetUint32_BE();
1692 joyport_a = state_fio->FgetUint32_BE();
1693 joyport_b = state_fio->FgetUint32_BE();
1695 intstat_opn = state_fio->FgetBool();
1696 intstat_mouse = state_fio->FgetBool();
1697 mouse_enable = state_fio->FgetBool();
1699 intstat_whg = state_fio->FgetBool();
1700 intstat_thg = state_fio->FgetBool();
1703 connect_fdc = state_fio->FgetBool();
1704 fdc_statreg = state_fio->FgetUint8();
1705 fdc_cmdreg = state_fio->FgetUint8();
1706 fdc_trackreg = state_fio->FgetUint8();
1707 fdc_sectreg = state_fio->FgetUint8();
1708 fdc_datareg = state_fio->FgetUint8();
1709 fdc_headreg = state_fio->FgetUint8();
1710 fdc_drvsel = state_fio->FgetUint8();
1711 irqreg_fdc = state_fio->FgetUint8();
1712 fdc_motor = state_fio->FgetBool();
1713 irqstat_fdc = state_fio->FgetBool();
1716 connect_kanjiroml1 = state_fio->FgetBool();
1717 #if defined(_FM77AV_VARIANTS)
1718 connect_kanjiroml2 = state_fio->FgetBool();
1719 boot_ram = state_fio->FgetBool();
1720 hotreset = state_fio->FgetBool();
1722 sub_monitor_type = state_fio->FgetUint8();
1726 event_beep = state_fio->FgetInt32_BE();
1727 event_beep_oneshot = state_fio->FgetInt32_BE();
1728 event_timerirq = state_fio->FgetInt32_BE();
1731 if(version >= 3) { // V3
1732 event_fdc_motor = state_fio->FgetInt32_BE();
1733 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)|| \
1734 defined(_FM77AV20) || defined(_FM77AV20SX) || defined(_FM77AV20EX)
1735 for(ch = 0; ch < 4; ch++) fdc_drive_table[ch] = state_fio->FgetUint8();
1736 fdc_reg_fd1e = state_fio->FgetUint8();
1738 #if defined(HAS_DMA)
1739 intstat_dma = state_fio->FgetBool();
1740 dma_addr = (uint32)(state_fio->FgetUint8() & 0x1f);