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)
38 cmt_indat = false; // bit7
39 cmt_invert = false; // Invert signal
43 lpt_ackng_inv = false;
44 lpt_error_inv = false;
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
77 for(i = 0; i < 3; i++) {
78 opn_address[i] = 0x00;
89 intstat_mouse = false;
102 // FD20, FD21, FD22, FD23
103 connect_kanjiroml1 = false;
104 #if defined(_FM77AV_VARIANTS)
105 // FD2C, FD2D, FD2E, FD2F
106 connect_kanjiroml2 = false;
108 #if defined(_FM77_VARIANTS) || defined(_FM77AV_VARIANTS)
114 memset(io_w_latch, 0xff, 0x100);
117 FM7_MAINIO::~FM7_MAINIO()
123 void FM7_MAINIO::initialize()
126 event_beep_oneshot = -1;
128 event_fdc_motor = -1;
129 #if defined(_FM77_VARIANTS) || defined(_FM77AV_VARIANTS)
131 # if defined(_FM77_VARIANTS)
132 stat_fdmode_2hd = false;
133 stat_kanjirom = true;
134 stat_400linecard = false;
135 # if defined(_FM77L4)
136 stat_400linecard = true;
140 irqmask_syndet = true;
141 irqmask_rxrdy = true;
142 irqmask_txrdy = true;
144 irqmask_timer = true;
145 irqmask_printer = true;
146 irqmask_keyboard = true;
149 intstat_syndet = false;
150 intstat_rxrdy = false;
151 intstat_txrdy = false;
152 irqstat_timer = false;
153 irqstat_printer = false;
154 irqstat_keyboard = false;
156 irqreq_syndet = false;
157 irqreq_rxrdy = false;
158 irqreq_txrdy = false;
159 irqreq_timer = false;
160 irqreq_printer = false;
161 irqreq_keyboard = false;
162 #if defined(_FM77AV_VARIANTS)
168 void FM7_MAINIO::reset()
170 if(event_beep >= 0) cancel_event(this, event_beep);
172 if(event_beep_oneshot >= 0) cancel_event(this, event_beep_oneshot);
173 event_beep_oneshot = -1;
174 if(event_timerirq >= 0) cancel_event(this, event_timerirq);
177 register_event(this, EVENT_BEEP_CYCLE, (1000.0 * 1000.0) / (1200.0 * 2.0), true, &event_beep);
179 #if defined(_FM77AV_VARIANTS)
183 opn_psg_77av = false;
188 #if defined(_FM77_VARIANTS)
189 boot_ram = (mainmem->read_signal(FM7_MAINIO_BOOTRAM_RW) == 0) ? false : true;
191 #if defined(_FM77AV_VARIANTS)
192 //enable_initiator = true;
193 //mainmem->write_signal(FM7_MAINIO_INITROM_ENABLED, (enable_initiator) ? 0xffffffff : 0 , 0xffffffff);
194 boot_ram = (mainmem->read_signal(FM7_MAINIO_BOOTRAM_RW) == 0) ? false : true;
198 sub_cancel = false; // bit6 : '1' Cancel req.
199 sub_halt = false; // bit6 : '1' Cancel req.
200 sub_cancel_bak = sub_cancel; // bit6 : '1' Cancel req.
201 sub_halt_bak = sub_halt; // bit6 : '1' Cancel req.
206 //stat_romrammode = true;
207 // IF BASIC BOOT THEN ROM
209 mainmem->write_signal(FM7_MAINIO_PUSH_FD0F, ((config.boot_mode & 3) == 0) ? 0xffffffff : 0, 0xffffffff);
210 #if defined(_FM77AV_VARIANTS)
211 sub_monitor_type = 0x00;
215 mainmem->write_signal(FM7_MAINIO_WINDOW_ENABLED, 0, 0xffffffff);
216 mainmem->write_data8(FM7_MAINIO_WINDOW_OFFSET, 0x00);
217 mainmem->write_signal(FM7_MAINIO_FASTMMR_ENABLED, 0, 0xffffffff);
218 mainmem->write_signal(FM7_MAINIO_MMR_ENABLED, 0, 0xffffffff);
219 //mainmem->write_data8(FM7_MAINIO_MMR_SEGMENT, mmr_segment);
221 switch(config.cpu_type){
229 this->write_signal(FM7_MAINIO_CLOCKMODE, clock_fast ? 1 : 0, 1);
230 //mainmem->write_signal(FM7_MAINIO_CLOCKMODE, clock_fast ? 1 : 0, 1);
233 irqmask_syndet = true;
234 irqmask_rxrdy = true;
235 irqmask_txrdy = true;
237 irqmask_timer = true;
238 irqmask_printer = true;
239 irqmask_keyboard = true;
242 intstat_syndet = false;
243 intstat_rxrdy = false;
244 intstat_txrdy = false;
245 irqstat_timer = false;
246 irqstat_printer = false;
247 irqstat_keyboard = false;
249 irqreq_syndet = false;
250 irqreq_rxrdy = false;
251 irqreq_txrdy = false;
252 irqreq_timer = false;
253 irqreq_printer = false;
254 irqreq_keyboard = false;
256 drec->write_signal(SIG_DATAREC_MIC, 0x00, 0x01);
257 drec->write_signal(SIG_DATAREC_REMOTE, 0x00, 0x02);
262 firq_break_key = (keyboard->read_signal(SIG_FM7KEY_BREAK_KEY) != 0x00000000); // bit1, ON = '0'.
263 set_sub_attention(false);
264 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
265 defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
266 stat_kanjirom = true; // R/W : bit5, '0' = sub, '1' = main. FM-77 Only.
267 #elif defined(_FM77_VARIANTS)
268 stat_fdmode_2hd = false; // R/W : bit6, '0' = 2HD, '1' = 2DD. FM-77 Only.
269 stat_kanjirom = true; // R/W : bit5, '0' = sub, '1' = main. FM-77 Only.
271 //display->write_signal(SIG_FM7_SUB_KEY_MASK, 1, 1);
272 //display->write_signal(SIG_FM7_SUB_KEY_FIRQ, 0, 1);
273 maincpu->write_signal(SIG_CPU_FIRQ, 0, 1);
278 #if defined(_FM77AV_VARIANTS)
281 register_event(this, EVENT_TIMERIRQ_ON, 10000.0 / 4.9152, true, &event_timerirq); // TIMER IRQ
282 memset(io_w_latch, 0xff, 0x100);
286 void FM7_MAINIO::set_clockmode(uint8 flags)
289 if((flags & FM7_MAINCLOCK_SLOW) != 0) {
294 if(f != clock_fast) {
295 this->write_signal(FM7_MAINIO_CLOCKMODE, clock_fast ? 1 : 0, 1);
296 //mainmem->write_signal(FM7_MAINIO_CLOCKMODE, clock_fast ? 1 : 0, 1);
300 uint8 FM7_MAINIO::get_clockmode(void)
302 if(!clock_fast) return FM7_MAINCLOCK_SLOW;
303 return FM7_MAINCLOCK_HIGH;
307 uint8 FM7_MAINIO::get_port_fd00(void)
309 uint8 ret = 0x7e; //0b01111110;
310 if(keyboard->read_data8(0x00) != 0) ret |= 0x80; // High bit.
311 if(clock_fast) ret |= 0x01; //0b00000001;
315 void FM7_MAINIO::set_port_fd00(uint8 data)
317 drec->write_signal(SIG_DATAREC_MIC, data, 0x01);
318 drec->write_signal(SIG_DATAREC_REMOTE, data, 0x02);
321 uint8 FM7_MAINIO::get_port_fd02(void)
324 // Still unimplemented printer.
325 ret = (cmt_indat) ? 0xff : 0x7f; // CMT
329 void FM7_MAINIO::set_port_fd02(uint8 val)
332 bool syndetirq_bak = irqmask_syndet;
333 bool rxrdyirq_bak = irqmask_rxrdy;
334 bool txrdyirq_bak = irqmask_txrdy;
336 bool keyirq_bak = irqmask_keyboard;
337 bool timerirq_bak = irqmask_timer;
338 bool printerirq_bak = irqmask_printer;
339 bool mfdirq_bak = irqmask_mfd;
341 // if((val & 0b00010000) != 0) {
342 if((val & 0x80) != 0) {
343 irqmask_syndet = false;
345 irqmask_syndet = true;
347 if(syndetirq_bak != irqmask_syndet) {
348 set_irq_txrdy(irqreq_syndet);
350 if((val & 0x40) != 0) {
351 irqmask_rxrdy = false;
353 irqmask_rxrdy = true;
355 if(rxrdyirq_bak != irqmask_rxrdy) {
356 set_irq_rxrdy(irqreq_rxrdy);
358 if((val & 0x20) != 0) {
359 irqmask_txrdy = false;
361 irqmask_txrdy = true;
363 if(txrdyirq_bak != irqmask_txrdy) {
364 set_irq_txrdy(irqreq_txrdy);
367 if((val & 0x10) != 0) {
372 if(mfdirq_bak != irqmask_mfd) {
373 set_irq_mfd(irqreq_fdc);
376 if((val & 0x04) != 0) {
377 irqmask_timer = false;
379 irqmask_timer = true;
381 if(timerirq_bak != irqmask_timer) {
382 set_irq_timer(irqreq_timer);
385 if((val & 0x02) != 0) {
386 irqmask_printer = false;
388 irqmask_printer = true;
390 if(printerirq_bak != irqmask_printer) {
391 set_irq_printer(irqreq_printer);
394 if((val & 0x01) != 0) {
395 irqmask_keyboard = false;
397 irqmask_keyboard = true;
399 if(keyirq_bak != irqmask_keyboard) {
400 display->write_signal(SIG_FM7_SUB_KEY_MASK, irqmask_keyboard ? 1 : 0, 1);
401 set_irq_keyboard(irqreq_keyboard);
406 void FM7_MAINIO::set_irq_syndet(bool flag)
408 bool backup = intstat_syndet;
409 irqreq_syndet = flag;
410 if(flag && !(irqmask_syndet)) {
411 //irqstat_reg0 &= ~0x80; //~0x20;
412 intstat_syndet = true;
414 // irqstat_reg0 |= 0x80;
415 intstat_syndet = false;
417 if(backup != intstat_syndet) do_irq();
418 //printf("IRQ TIMER: %02x MASK=%d\n", irqstat_reg0, irqmask_timer);
422 void FM7_MAINIO::set_irq_rxrdy(bool flag)
424 bool backup = intstat_rxrdy;
426 if(flag && !(irqmask_rxrdy)) {
427 //irqstat_reg0 &= ~0x40; //~0x20;
428 intstat_rxrdy = true;
430 //irqstat_reg0 |= 0x40;
431 intstat_rxrdy = false;
433 if(backup != intstat_rxrdy) do_irq();
434 //printf("IRQ TIMER: %02x MASK=%d\n", irqstat_reg0, irqmask_timer);
439 void FM7_MAINIO::set_irq_txrdy(bool flag)
441 bool backup = intstat_txrdy;
443 if(flag && !(irqmask_txrdy)) {
444 //irqstat_reg0 &= ~0x20; //~0x20;
445 intstat_txrdy = true;
447 //irqstat_reg0 |= 0x20;
448 intstat_txrdy = false;
450 if(backup != intstat_txrdy) do_irq();
451 //printf("IRQ TIMER: %02x MASK=%d\n", irqstat_reg0, irqmask_timer);
455 void FM7_MAINIO::set_irq_timer(bool flag)
457 uint8 backup = irqstat_reg0;
459 if(flag && !(irqmask_timer)) {
460 irqstat_reg0 &= 0xfb; //~0x04;
461 irqstat_timer = true;
463 irqstat_reg0 |= 0x04;
464 irqstat_timer = false;
466 if(backup != irqstat_reg0) do_irq();
467 //printf("IRQ TIMER: %02x MASK=%d\n", irqstat_reg0, irqmask_timer);
470 void FM7_MAINIO::set_irq_printer(bool flag)
472 uint8 backup = irqstat_reg0;
473 irqreq_printer = flag;
474 if(flag && !(irqmask_printer)) {
475 irqstat_reg0 &= ~0x02;
476 irqstat_printer = true;
477 if(backup != irqstat_reg0) do_irq();
479 irqstat_reg0 |= 0x02;
480 irqstat_printer = false;
481 if(backup != irqstat_reg0) do_irq();
483 // if(!irqmask_printer || !flag) do_irq();
486 void FM7_MAINIO::set_irq_keyboard(bool flag)
488 //uint8 backup = irqstat_reg0;
489 //printf("MAIN: KEYBOARD: IRQ=%d MASK=%d\n", flag ,irqmask_keyboard);
490 irqreq_keyboard = flag;
491 if(flag && !irqmask_keyboard) {
492 irqstat_reg0 &= 0xfe;
493 irqstat_keyboard = true;
495 irqstat_reg0 |= 0x01;
496 irqstat_keyboard = false;
498 //if(irqstat_reg0 != backup) do_irq();
503 void FM7_MAINIO::do_irq(void)
506 intstat = irqstat_timer | irqstat_keyboard | irqstat_printer;
507 intstat = intstat | irqstat_fdc;
508 intstat = intstat | intstat_opn | intstat_whg | intstat_thg;
509 intstat = intstat | intstat_txrdy | intstat_rxrdy | intstat_syndet;
510 intstat = intstat | intstat_mouse;
512 intstat = intstat | intstat_dma;
514 //printf("%08d : IRQ: REG0=%02x FDC=%02x, stat=%d\n", SDL_GetTicks(), irqstat_reg0, irqstat_fdc, intstat);
516 maincpu->write_signal(SIG_CPU_IRQ, 1, 1);
518 maincpu->write_signal(SIG_CPU_IRQ, 0, 1);
522 void FM7_MAINIO::do_firq(void)
525 firq_stat = firq_break_key | firq_sub_attention;
527 maincpu->write_signal(SIG_CPU_FIRQ, 1, 1);
529 maincpu->write_signal(SIG_CPU_FIRQ, 0, 1);
533 void FM7_MAINIO::do_nmi(bool flag)
535 maincpu->write_signal(SIG_CPU_NMI, flag ? 1 : 0, 1);
539 void FM7_MAINIO::set_break_key(bool pressed)
541 firq_break_key = pressed;
545 void FM7_MAINIO::set_sub_attention(bool flag)
547 firq_sub_attention = flag;
552 uint8 FM7_MAINIO::get_fd04(void)
555 if(display->read_signal(SIG_DISPLAY_BUSY) != 0) val |= 0x80;
556 if(!firq_break_key) val |= 0x02;
557 if(!firq_sub_attention) {
560 #if defined(_FM77_VARIANTS)
561 if(stat_fdmode_2hd) val |= 0x40;
562 if(stat_kanjirom) val |= 0x20;
563 if(stat_400linecard) val |= 0x10;
564 if((display->read_signal(SIG_DISPLAY_EXTRA_MODE) & 0x04) != 0x00) val |= 0x04;
568 if(firq_sub_attention) {
569 set_sub_attention(false);
570 //printf("Attention \n");
572 #if defined(_FM77AV_VARIANTS)
574 if(mainmem->read_signal(FM7_MAINIO_INITROM_ENABLED) == 0) {
575 set_break_key(false);
583 void FM7_MAINIO::set_fd04(uint8 val)
586 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
587 display->write_signal(SIG_DISPLAY_EXTRA_MODE, val, 0xff);
588 stat_kanjirom = ((val & 0x20) != 0);
589 #elif defined(_FM77_VARIANTS)
590 display->write_signal(SIG_DISPLAY_EXTRA_MODE, val, 0xff);
591 stat_fdmode_2hd = ((val & 0x40) != 0);
592 stat_kanjirom = ((val & 0x20) != 0);
593 stat_400linecard = ((val & 0x10) != 0);
598 uint8 FM7_MAINIO::get_fd05(void)
601 //val = (sub_busy) ? 0xfe : 0x7e;
602 if(display->read_signal(SIG_DISPLAY_BUSY) != 0) val |= 0x80;
603 if(!extdet_neg) val |= 0x01;
604 //printf("FD05: READ: %d VAL=%02x\n", SDL_GetTicks(), val);
608 void FM7_MAINIO::set_fd05(uint8 val)
610 sub_cancel = ((val & 0x40) != 0) ? true : false;
611 sub_halt = ((val & 0x80) != 0) ? true : false;
612 //if(sub_halt != sub_halt_bak) {
613 display->write_signal(SIG_DISPLAY_HALT, (sub_halt) ? 0xff : 0x00, 0xff);
615 sub_halt_bak = sub_halt;
617 //if(sub_cancel != sub_cancel_bak) {
618 display->write_signal(SIG_FM7_SUB_CANCEL, (sub_cancel) ? 0xff : 0x00, 0xff); // HACK
620 sub_cancel_bak = sub_cancel;
622 if((val & 0x01) != 0) {
623 maincpu->write_signal(SIG_CPU_BUSREQ, 1, 1);
624 z80->write_signal(SIG_CPU_BUSREQ, 0, 1);
626 maincpu->write_signal(SIG_CPU_BUSREQ, 0, 1);
627 z80->write_signal(SIG_CPU_BUSREQ, 1, 1);
632 void FM7_MAINIO::set_extdet(bool flag)
637 void FM7_MAINIO::write_fd0f(void)
639 mainmem->write_signal(FM7_MAINIO_PUSH_FD0F, 0, 0xffffffff);
641 uint8 FM7_MAINIO::read_fd0f(void)
643 mainmem->write_signal(FM7_MAINIO_PUSH_FD0F, 0xffffffff, 0xffffffff);
647 bool FM7_MAINIO::get_rommode_fd0f(void)
649 return (mainmem->read_signal(FM7_MAINIO_PUSH_FD0F) == 0) ? false : true;
653 // Kanji ROM, FD20 AND FD21 (or SUBSYSTEM)
654 void FM7_MAINIO::write_kanjiaddr_hi(uint8 addr)
656 if(!connect_kanjiroml1) return;
657 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
658 defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
659 if(!stat_kanjirom) return;
661 kanjiclass1->write_data8(KANJIROM_ADDR_HI, addr);
665 void FM7_MAINIO::write_kanjiaddr_lo(uint8 addr)
667 if(!connect_kanjiroml1) return;
668 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
669 defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
670 if(!stat_kanjirom) return;
672 kanjiclass1->write_data8(KANJIROM_ADDR_LO, addr);
676 uint8 FM7_MAINIO::read_kanjidata_left(void)
678 if(!connect_kanjiroml1) return 0xff;
679 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
680 defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
681 if(!stat_kanjirom) return 0xff;
683 //printf("KANJI MAIN CLASS1 ADDR: %05x\n", kaddress.w.l);
685 return kanjiclass1->read_data8(KANJIROM_DATA_HI);
691 uint8 FM7_MAINIO::read_kanjidata_right(void)
693 if(!connect_kanjiroml1) return 0xff;
694 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
695 defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
696 if(!stat_kanjirom) return 0xff;
699 return kanjiclass1->read_data8(KANJIROM_DATA_LO);
705 #ifdef CAPABLE_KANJI_CLASS2
706 // Kanji ROM, FD20 AND FD21 (or SUBSYSTEM)
707 void FM7_MAINIO::write_kanjiaddr_hi_l2(uint8 addr)
709 if(!connect_kanjiroml2) return;
710 if(!stat_kanjirom) return;
711 kanjiclass2->write_data8(KANJIROM_ADDR_HI, addr);
715 void FM7_MAINIO::write_kanjiaddr_lo_l2(uint8 addr)
717 if(!connect_kanjiroml2) return;
718 if(!stat_kanjirom) return;
719 kanjiclass2->write_data8(KANJIROM_ADDR_LO, addr);
724 uint8 FM7_MAINIO::read_kanjidata_left_l2(void)
726 if(!connect_kanjiroml2) return 0xff;
727 if(!stat_kanjirom) return 0xff;
730 return kanjiclass2->read_data8(KANJIROM_DATA_HI);
736 uint8 FM7_MAINIO::read_kanjidata_right_l2(void)
738 if(!connect_kanjiroml2) return 0xff;
739 if(!stat_kanjirom) return 0xff;
742 return kanjiclass2->read_data8(KANJIROM_DATA_LO);
750 uint32 FM7_MAINIO::read_signal(int id)
754 case FM7_MAINIO_KEYBOARDIRQ_MASK:
755 retval = (irqmask_keyboard) ? 0xffffffff : 0x00000000;
765 void FM7_MAINIO::write_signal(int id, uint32 data, uint32 mask)
768 val_b = ((data & mask) != 0);
771 //case SIG_FM7_SUB_HALT:
772 // mainmem->write_signal(SIG_FM7_SUB_HALT, data, mask);
774 case FM7_MAINIO_CLOCKMODE: // fd00
782 uint32 clocks = 1794000;
783 #if defined(_FM77AV_VARIANTS) || defined(_FM77_VARIANTS)
784 if(mainmem->read_signal(FM7_MAINIO_MMR_ENABLED) != 0) {
785 if(mainmem->read_signal(FM7_MAINIO_FASTMMR_ENABLED)) {
787 clocks = 2016000; // Hz
789 clocks = 1230502; // (2016 * 1095 / 1794)[KHz]
793 clocks = 1565000; // Hz
795 clocks = 955226; // (1565 * 1095 / 1794)[KHz]
800 clocks = 1794000; // Hz
802 clocks = 1095000; // Hz
807 clocks = 1794000; // Hz
809 clocks = 1095000; // Hz
812 p_vm->set_cpu_clock(this->maincpu, clocks);
814 mainmem->write_signal(FM7_MAINIO_CLOCKMODE, clock_fast ? 1 : 0, 1);
815 display->write_signal(SIG_DISPLAY_CLOCK, clock_fast ? 1 : 0, 1);
818 case FM7_MAINIO_CMT_RECV: // FD02
819 cmt_indat = val_b ^ cmt_invert;
821 case FM7_MAINIO_CMT_INVERT: // FD02
824 case FM7_MAINIO_TIMERIRQ: //
825 set_irq_timer(val_b);
827 case FM7_MAINIO_LPTIRQ: //
828 set_irq_printer(val_b);
830 case FM7_MAINIO_KEYBOARDIRQ: //
831 set_irq_keyboard(val_b);
834 case FM7_MAINIO_PUSH_BREAK:
835 set_break_key(val_b);
837 #if defined(FM77AV_VARIANTS)
838 case FM7_MAINIO_HOT_RESET:
842 case FM7_MAINIO_SUB_ATTENTION:
843 if(val_b) set_sub_attention(true);
846 case FM7_MAINIO_EXTDET:
849 case FM7_MAINIO_BEEP:
852 case FM7_MAINIO_JOYPORTA_CHANGED:
853 joyport_a = data & mask;
855 case FM7_MAINIO_JOYPORTB_CHANGED:
856 joyport_b = data & mask;
858 case FM7_MAINIO_PSG_IRQ:
860 case FM7_MAINIO_OPN_IRQ:
861 if(!connect_opn) break;
865 case FM7_MAINIO_WHG_IRQ:
866 if(!connect_whg) break;
870 case FM7_MAINIO_THG_IRQ:
871 if(!connect_thg) break;
875 case FM7_MAINIO_FDC_DRQ:
878 case FM7_MAINIO_FDC_IRQ:
882 case FM7_MAINIO_DMA_INT:
887 #if defined(_FM77AV_VARIANTS)
888 case SIG_DISPLAY_DISPLAY:
895 case SIG_DISPLAY_VSYNC:
902 case SIG_DISPLAY_MODE320:
914 uint8 FM7_MAINIO::get_irqstat_fd03(void)
919 extirq = irqstat_fdc | intstat_opn | intstat_whg | intstat_thg;
920 extirq = extirq | intstat_syndet | intstat_rxrdy | intstat_txrdy;
922 extirq = extirq | intstat_dma;
925 irqstat_reg0 &= ~0x08;
927 irqstat_reg0 |= 0x08;
929 val = irqstat_reg0 | 0xf0;
930 set_irq_timer(false);
931 set_irq_printer(false);
935 uint8 FM7_MAINIO::get_extirq_fd17(void)
938 if(intstat_opn && connect_opn) val &= ~0x08;
939 if(intstat_mouse) val &= ~0x04;
940 //if(!intstat_opn && !intstat_mouse) do_irq(false);
944 void FM7_MAINIO::set_ext_fd17(uint8 data)
946 if((data & 0x04) != 0) {
949 mouse_enable = false;
953 #if defined(_FM77AV_VARIANTS)
955 uint8 FM7_MAINIO::subsystem_read_status(void)
962 uint32 FM7_MAINIO::read_io8(uint32 addr)
963 { // This is only for debug.
966 return io_w_latch[addr];
967 } else if(addr < 0x500) {
968 uint32 ofset = addr & 0xff;
969 uint opnbank = (addr - 0x100) >> 8;
970 return opn_regs[opnbank][ofset];
971 } else if(addr < 0x600) {
972 return mainmem->read_data8(addr - 0x500 + FM7_MAINIO_MMR_BANK);
977 uint32 FM7_MAINIO::read_dma_io8(uint32 addr)
979 return this->read_data8(addr & 0xff);
982 uint32 FM7_MAINIO::read_dma_data8(uint32 addr)
984 return this->read_data8(addr & 0xff);
987 uint32 FM7_MAINIO::read_data8(uint32 addr)
991 if(addr < FM7_MAINIO_IS_BASICROM) {
995 if((addr < 0x90) && (addr >= 0x80)) {
996 mmr_segment = mainmem->read_data8(FM7_MAINIO_MMR_SEGMENT);
997 # if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX) || \
998 defined(_FM77AV20) || defined(_FM77AV20SX) || defined(_FM77AV20EX)
1001 mmr_segment &= 0x03;
1003 return mainmem->read_data8(addr - 0x80 + FM7_MAINIO_MMR_BANK + mmr_segment * 16);
1006 // if((addr >= 0x0006) && !(addr == 0x1f) && !(addr == 0x0b)) printf("MAINIO: READ: %08x \n", addr);
1009 retval = (uint32) get_port_fd00();
1012 retval = keyboard->read_data8(0x01) & 0xff;
1015 retval = (uint32) get_port_fd02();
1018 retval = (uint32) get_irqstat_fd03();
1021 retval = (uint32) get_fd04();
1024 retval = (uint32) get_fd05();
1026 case 0x06: // RS-232C
1029 case 0x08: // Light pen
1033 #if defined(_FM77AV_VARIANTS)
1035 retval = ((config.boot_mode & 3) == 0) ? 0xfe : 0xff;
1038 case 0x0e: // PSG DATA
1039 retval = (uint32) get_psg();
1040 //printf("PSG DATA READ val=%02x\n", retval);
1046 #if defined(_FM77AV_VARIANTS)
1048 retval = subsystem_read_status();
1051 case 0x15: // OPN CMD
1052 //printf("OPN CMD READ \n");
1054 case 0x16: // OPN DATA
1055 retval = (uint32) get_opn(0);
1056 //printf("OPN DATA READ val=%02x\n", retval);
1059 retval = (uint32) get_extirq_fd17();
1061 case 0x18: // FDC: STATUS
1062 retval = (uint32) get_fdc_stat();
1063 //printf("FDC: READ STATUS %02x PC=%04x\n", retval, maincpu->get_pc());
1065 case 0x19: // FDC: Track
1066 retval = (uint32) get_fdc_track();
1067 //printf("FDC: READ TRACK REG %02x\n", retval);
1069 case 0x1a: // FDC: Sector
1070 retval = (uint32) get_fdc_sector();
1071 //printf("FDC: READ SECTOR REG %02x\n", retval);
1073 case 0x1b: // FDC: Data
1074 retval = (uint32) get_fdc_data();
1077 retval = (uint32) get_fdc_fd1c();
1078 //printf("FDC: READ HEAD REG %02x\n", retval);
1081 retval = (uint32) get_fdc_motor();
1082 //printf("FDC: READ MOTOR REG %02x\n", retval);
1085 retval = (uint32) get_fdc_fd1e();
1086 //printf("FDC: READ MOTOR REG %02x\n", retval);
1089 retval = (uint32) fdc_getdrqirq();
1091 case 0x22: // Kanji ROM
1092 retval = (uint32) read_kanjidata_left();
1094 case 0x23: // Kanji ROM
1095 retval = (uint32) read_kanjidata_right();
1097 #if defined(CAPABLE_KANJI_CLASS2)
1098 case 0x2e: // Kanji ROM Level2
1099 retval = (uint32) read_kanjidata_left_l2();
1101 case 0x2f: // Kanji ROM Level2
1102 retval = (uint32) read_kanjidata_right_l2();
1105 case 0x37: // Multi page
1106 //retval = (uint32)display->read_data8(DISPLAY_ADDR_MULTIPAGE);
1108 case 0x45: // WHG CMD
1110 case 0x46: // WHG DATA
1111 retval = (uint32) get_opn(1);
1114 retval = (uint32) get_extirq_whg();
1116 case 0x51: // THG CMD
1118 case 0x52: // THG DATA
1119 retval = (uint32) get_opn(2);
1122 retval = (uint32) get_extirq_thg();
1124 #if defined(HAS_MMR)
1128 if(mainmem->read_signal(FM7_MAINIO_BOOTRAM_RW) != 0) retval |= 0x01;
1129 if(mainmem->read_signal(FM7_MAINIO_WINDOW_ENABLED) != 0) retval |= 0x40;
1130 if(mainmem->read_signal(FM7_MAINIO_MMR_ENABLED) != 0) retval |= 0x80;
1133 #if defined(_FM77AV40SX) || defined(_FM77AV40EX)
1136 if(mainmem->read_signal(FM7_MAINIO_FASTMMR_ENABLED) != 0) retval |= 0x08;
1137 if(mainmem->read_signal(FM7_MAINIO_EXTROM) != 0) retval |= 0x80;
1140 #if defined(HAS_DMA)
1145 retval = dmac->read_data8(dma_addr);
1146 //p_emu->out_debug_log(_T("IO: Read DMA %02x from reg %02x\n"), retval, dma_addr);
1150 //printf("MAIN: Read another I/O Addr=%08x\n", addr);
1153 if((addr < 0x40) && (addr >= 0x38)) {
1154 addr = (addr - 0x38) + FM7_SUBMEM_OFFSET_DPALETTE;
1155 return (uint32) display->read_data8(addr);
1159 } else if(addr == FM7_MAINIO_CLOCKMODE) {
1160 return (uint32)get_clockmode();
1162 #if defined(_FM77AV_VARIANTS)
1163 else if(addr == FM7_MAINIO_SUBMONITOR_ROM) {
1164 retval = sub_monitor_type & 0x03;
1166 } else if(addr == FM7_MAINIO_SUBMONITOR_RAM) {
1167 #if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX) || \
1168 defined(_FM77AV20) || defined(_FM77AV20SX) || defined(_FM77AV20EX)
1169 retval = ((sub_monitor_type & 0x04) != 0) ? 0xffffffff : 0x00000000;
1176 //if((addr >= 0x0006) && (addr != 0x1f)) printf("MAINIO: READ: %08x DATA=%08x\n", addr);
1180 void FM7_MAINIO::write_dma_io8(uint32 addr, uint32 data)
1182 this->write_data8(addr & 0xff, data);
1185 void FM7_MAINIO::write_dma_data8(uint32 addr, uint32 data)
1187 this->write_data8(addr & 0xff, data);
1191 void FM7_MAINIO::write_data8(uint32 addr, uint32 data)
1195 if(addr < FM7_MAINIO_IS_BASICROM) {
1197 io_w_latch[addr] = data;
1198 #if defined(HAS_MMR)
1199 if((addr < 0x90) && (addr >= 0x80)) {
1200 mmr_segment = mainmem->read_data8(FM7_MAINIO_MMR_SEGMENT);
1201 # if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX) || \
1202 defined(_FM77AV20) || defined(_FM77AV20SX) || defined(_FM77AV20EX)
1203 mmr_segment &= 0x07;
1205 mmr_segment &= 0x03;
1207 mainmem->write_data8(FM7_MAINIO_MMR_BANK + mmr_segment * 16 + addr - 0x80, data);
1213 set_port_fd00((uint8)data);
1217 // set_lptdata_fd01((uint8)data);
1220 set_port_fd02((uint8)data);
1229 set_fd05((uint8)data);
1231 case 0x06: // RS-232C
1234 case 0x08: // Light pen
1239 //printf("PSG CMD WRITE val=%02x\n", data);
1243 //printf("PSG DATA WRITE val=%02x\n", data);
1249 #if defined(_FM77AV_VARIANTS)
1251 flag = ((data & 0x02) == 0) ? true : false;
1252 mainmem->write_signal(FM7_MAINIO_INITROM_ENABLED, (flag) ? 0xffffffff : 0 , 0xffffffff);
1255 display->write_signal(SIG_DISPLAY_MODE320, data, 0x40);
1257 reg_fd12 |= (data & 0x40);
1260 sub_monitor_type = data & 0x07;
1261 display->write_signal(SIG_FM7_SUB_BANK, sub_monitor_type, 0x07);
1264 case 0x15: // OPN CMD
1265 //printf("OPN CMD WRITE val=%02x\n", data);
1266 set_opn_cmd(0, data);
1268 case 0x16: // OPN DATA
1269 //printf("OPN DATA WRITE val=%02x\n", data);
1273 set_ext_fd17((uint8)data);
1275 case 0x18: // FDC: COMMAND
1276 set_fdc_cmd((uint8)data);
1277 //printf("FDC: WRITE CMD %02x\n", data);
1279 case 0x19: // FDC: Track
1280 set_fdc_track((uint8)data);
1281 //printf("FDC: WRITE TRACK REG %02x\n", data);
1283 case 0x1a: // FDC: Sector
1284 set_fdc_sector((uint8)data);
1285 //printf("FDC: WRITE SECTOR REG %02x\n", data);
1287 case 0x1b: // FDC: Data
1288 set_fdc_data((uint8)data);
1291 set_fdc_fd1c((uint8)data);
1292 //printf("FDC: WRITE HEAD REG %02x\n", data);
1295 set_fdc_fd1d((uint8)data);
1296 //printf("FDC: WRITE MOTOR REG %02x\n", data);
1299 set_fdc_fd1e((uint8)data);
1304 case 0x20: // Kanji ROM
1305 write_kanjiaddr_hi((uint8)data);
1307 case 0x2c: // Kanji ROM(DUP)
1308 #if defined(CAPABLE_KANJI_CLASS2)
1309 write_kanjiaddr_hi_l2((uint8)data);
1311 write_kanjiaddr_hi((uint8)data);
1314 case 0x21: // Kanji ROM
1315 write_kanjiaddr_lo((uint8)data);
1317 case 0x2d: // Kanji ROM(DUP)
1318 #if defined(CAPABLE_KANJI_CLASS2)
1319 write_kanjiaddr_lo_l2((uint8)data);
1321 write_kanjiaddr_lo((uint8)data);
1324 #if defined(CAPABLE_DICTROM)
1326 mainmem->write_signal(FM7_MAINIO_EXTBANK, data, 0xff);
1329 #if defined(_FM77AV_VARIANTS)
1331 display->write_data8(FM7_SUBMEM_OFFSET_APALETTE_HI, data);
1334 display->write_data8(FM7_SUBMEM_OFFSET_APALETTE_LO, data);
1337 display->write_data8(FM7_SUBMEM_OFFSET_APALETTE_B, data);
1340 display->write_data8(FM7_SUBMEM_OFFSET_APALETTE_R, data);
1343 display->write_data8(FM7_SUBMEM_OFFSET_APALETTE_G, data);
1346 case 0x37: // Multi page
1347 display->write_signal(SIG_DISPLAY_MULTIPAGE, data, 0x00ff);
1349 case 0x45: // WHG CMD
1350 set_opn_cmd(1, data);
1352 case 0x46: // WHG DATA
1357 case 0x51: // THG CMD
1358 set_opn_cmd(2, data);
1360 case 0x52: // THG DATA
1365 #if defined(HAS_MMR)
1367 #if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX) || \
1368 defined(_FM77AV20) || defined(_FM77AV20SX) || defined(_FM77AV20EX)
1369 mmr_segment = data & 7;
1371 // printf("MMR SEGMENT: %02x\n", data & 3);
1372 mmr_segment = data & 3;
1374 mainmem->write_data8(FM7_MAINIO_MMR_SEGMENT, (uint32)mmr_segment);
1377 mainmem->write_data8(FM7_MAINIO_WINDOW_OFFSET, (uint32)(data & 0x00ff));
1380 mainmem->write_signal(FM7_MAINIO_BOOTRAM_RW, data, 0x01);
1381 mainmem->write_signal(FM7_MAINIO_WINDOW_ENABLED, data , 0x40);
1382 //this->write_signal(FM7_MAINIO_CLOCKMODE, clock_fast ? 1 : 0, 1);
1383 //mainmem->write_signal(FM7_MAINIO_CLOCKMODE, clock_fast ? 1 : 0, 1);
1384 mainmem->write_signal(FM7_MAINIO_MMR_ENABLED, data, 0x80);
1388 #if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX) || \
1389 defined(_FM77AV20) || defined(_FM77AV20SX) || defined(_FM77AV20EX)
1391 mainmem->write_signal(FM7_MAINIO_MMR_EXTENDED, data, 0x80);
1392 mainmem->write_signal(FM7_MAINMEM_REFRESH_FAST, data, 0x04);
1393 mainmem->write_signal(FM7_MAINIO_WINDOW_FAST , data, 0x01);
1396 # if defined(_FM77AV40SX) || defined(_FM77AV40EX)
1398 mainmem->write_signal(FM7_MAINIO_FASTMMR_ENABLED, data, 0x08);
1399 mainmem->write_signal(FM7_MAINIO_EXTROM, data , 0x80);
1403 #if defined(HAS_DMA)
1405 dma_addr = data & 0x1f;
1408 dmac->write_data8(dma_addr, data);
1409 //p_emu->out_debug_log(_T("IO: Wrote DMA %02x to reg %02x\n"), data, dma_addr);
1413 //printf("MAIN: Write I/O Addr=%08x DATA=%02x\n", addr, data);
1416 if((addr < 0x40) && (addr >= 0x38)) {
1417 addr = (addr - 0x38) | FM7_SUBMEM_OFFSET_DPALETTE;
1418 display->write_data8(addr, (uint8)data);
1422 } else if(addr == FM7_MAINIO_CLOCKMODE) {
1423 set_clockmode((uint8)data);
1426 //if((addr >= 0x0006) && !(addr == 0x1f)) printf("MAINIO: WRITE: %08x DATA=%08x\n", addr, data);
1429 void FM7_MAINIO::event_callback(int event_id, int err)
1431 // printf("MAIN EVENT id=%d\n", event_id);
1433 case EVENT_BEEP_OFF:
1436 case EVENT_BEEP_CYCLE:
1439 case EVENT_UP_BREAK:
1440 set_break_key(false);
1442 case EVENT_TIMERIRQ_ON:
1443 //if(!irqmask_timer) set_irq_timer(true);
1444 set_irq_timer(true);
1446 case EVENT_FD_MOTOR_ON:
1447 set_fdc_motor(true);
1448 event_fdc_motor = -1;
1450 case EVENT_FD_MOTOR_OFF:
1451 set_fdc_motor(false);
1452 event_fdc_motor = -1;
1460 void FM7_MAINIO::update_config()
1462 switch(config.cpu_type){
1470 this->write_signal(FM7_MAINIO_CLOCKMODE, clock_fast ? 1 : 0, 1);
1471 //mainmem->write_signal(FM7_MAINIO_CLOCKMODE, clock_fast ? 1 : 0, 1);
1474 void FM7_MAINIO::event_vline(int v, int clock)
1478 #define STATE_VERSION 3
1479 void FM7_MAINIO::save_state(FILEIO *state_fio)
1483 state_fio->FputUint32_BE(STATE_VERSION);
1484 state_fio->FputInt32_BE(this_device_id);
1488 for(addr = 0; addr < 0x100; addr++) state_fio->FputUint8(io_w_latch[addr]);
1490 state_fio->FputBool(clock_fast);
1491 state_fio->FputBool(lpt_strobe);
1492 state_fio->FputBool(lpt_slctin);
1493 state_fio->FputBool(beep_flag);
1494 state_fio->FputBool(beep_snd);
1497 state_fio->FputUint8(lpt_outdata);
1499 state_fio->FputBool(cmt_indat);
1500 state_fio->FputBool(cmt_invert);
1501 state_fio->FputBool(lpt_det2);
1502 state_fio->FputBool(lpt_det1);
1503 state_fio->FputBool(lpt_pe);
1504 state_fio->FputBool(lpt_ackng_inv);
1505 state_fio->FputBool(lpt_error_inv);
1506 state_fio->FputUint8(irqmask_reg0);
1508 state_fio->FputBool(irqmask_syndet);
1509 state_fio->FputBool(irqmask_rxrdy);
1510 state_fio->FputBool(irqmask_txrdy);
1511 state_fio->FputBool(irqmask_mfd);
1512 state_fio->FputBool(irqmask_timer);
1513 state_fio->FputBool(irqmask_printer);
1514 state_fio->FputBool(irqmask_keyboard);
1516 state_fio->FputBool(irqreq_syndet);
1517 state_fio->FputBool(irqreq_rxrdy);
1518 state_fio->FputBool(irqreq_txrdy);
1519 state_fio->FputBool(irqreq_fdc);
1520 state_fio->FputBool(irqreq_timer);
1521 state_fio->FputBool(irqreq_printer);
1522 state_fio->FputBool(irqreq_keyboard);
1524 state_fio->FputUint8(irqstat_reg0);
1526 state_fio->FputBool(irqstat_timer);
1527 state_fio->FputBool(irqstat_printer);
1528 state_fio->FputBool(irqstat_keyboard);
1531 #if defined(_FM77_VARIANTS)
1532 state_fio->FputBool(stat_fdmode_2hd);
1533 state_fio->FputBool(stat_kanjirom);
1534 state_fio->FputBool(stat_400linecard);
1535 #elif defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
1536 defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
1537 state_fio->FputBool(stat_kanjirom);
1539 state_fio->FputBool(firq_break_key);
1540 state_fio->FputBool(firq_sub_attention);
1542 state_fio->FputBool(intmode_fdc);
1544 state_fio->FputBool(extdet_neg);
1545 //state_fio->FputBool(sub_busy);
1546 state_fio->FputBool(sub_halt);
1547 //state_fio->FputBool(sub_halt_bak);
1548 state_fio->FputBool(sub_cancel);
1549 //state_fio->FputBool(sub_cancel_bak);
1550 #if defined(WITH_Z80)
1551 state_fio->FputBool(z80_sel);
1554 state_fio->FputBool(intstat_syndet);
1555 state_fio->FputBool(intstat_rxrdy);
1556 state_fio->FputBool(intstat_txrdy);
1561 state_fio->FputBool(connect_opn);
1562 state_fio->FputBool(connect_whg);
1563 state_fio->FputBool(connect_thg);
1565 state_fio->FputBool(opn_psg_77av);
1567 for(ch = 0; ch < 4; ch++) {
1568 state_fio->FputUint32_BE(opn_address[ch]);
1569 state_fio->FputUint32_BE(opn_data[ch]);
1570 state_fio->FputUint32_BE(opn_stat[ch]);
1571 state_fio->FputUint32_BE(opn_cmdreg[ch]);
1572 state_fio->FputUint32_BE(opn_ch3mode[ch]);
1574 state_fio->FputUint32_BE(joyport_a);
1575 state_fio->FputUint32_BE(joyport_b);
1577 state_fio->FputBool(intstat_opn);
1578 state_fio->FputBool(intstat_mouse);
1579 state_fio->FputBool(mouse_enable);
1581 state_fio->FputBool(intstat_whg);
1582 state_fio->FputBool(intstat_thg);
1585 state_fio->FputBool(connect_fdc);
1586 state_fio->FputUint8(fdc_statreg);
1587 state_fio->FputUint8(fdc_cmdreg);
1588 state_fio->FputUint8(fdc_trackreg);
1589 state_fio->FputUint8(fdc_sectreg);
1590 state_fio->FputUint8(fdc_datareg);
1591 state_fio->FputUint8(fdc_headreg);
1592 state_fio->FputUint8(fdc_drvsel);
1593 state_fio->FputUint8(irqreg_fdc);
1594 state_fio->FputBool(fdc_motor);
1595 state_fio->FputBool(irqstat_fdc);
1597 state_fio->FputBool(connect_kanjiroml1);
1598 #if defined(_FM77AV_VARIANTS)
1599 state_fio->FputBool(connect_kanjiroml2);
1601 state_fio->FputBool(boot_ram);
1602 state_fio->FputBool(hotreset);
1604 state_fio->FputUint8(sub_monitor_type);
1610 state_fio->FputInt32_BE(event_beep);
1611 state_fio->FputInt32_BE(event_beep_oneshot);
1612 state_fio->FputInt32_BE(event_timerirq);
1615 state_fio->FputInt32_BE(event_fdc_motor);
1616 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)|| \
1617 defined(_FM77AV20) || defined(_FM77AV20SX) || defined(_FM77AV20EX)
1618 for(ch = 0; ch < 4; ch++) state_fio->FputUint8(fdc_drive_table[ch]);
1619 state_fio->FputUint8(fdc_reg_fd1e);
1621 #if defined(HAS_DMA)
1622 state_fio->FputBool(intstat_dma);
1623 state_fio->FputUint8(dma_addr & 0x1f);
1625 #if defined(_FM77AV_VARIANTS)
1626 state_fio->FputUint8(reg_fd12);
1631 bool FM7_MAINIO::load_state(FILEIO *state_fio)
1635 //bool stat = false;
1638 version = state_fio->FgetUint32_BE();
1639 if(this_device_id != state_fio->FgetInt32_BE()) return false;
1642 for(addr = 0; addr < 0x100; addr++) io_w_latch[addr] = state_fio->FgetUint8();
1644 clock_fast = state_fio->FgetBool();
1645 lpt_strobe = state_fio->FgetBool();
1646 lpt_slctin = state_fio->FgetBool();
1647 beep_flag = state_fio->FgetBool();
1648 beep_snd = state_fio->FgetBool();
1651 lpt_outdata = state_fio->FgetUint8();
1653 cmt_indat = state_fio->FgetBool();
1654 cmt_invert = state_fio->FgetBool();
1655 lpt_det2 = state_fio->FgetBool();
1656 lpt_det1 = state_fio->FgetBool();
1657 lpt_pe = state_fio->FgetBool();
1658 lpt_ackng_inv = state_fio->FgetBool();
1659 lpt_error_inv = state_fio->FgetBool();
1660 irqmask_reg0 = state_fio->FgetUint8();
1662 irqmask_syndet = state_fio->FgetBool();
1663 irqmask_rxrdy = state_fio->FgetBool();
1664 irqmask_txrdy = state_fio->FgetBool();
1665 irqmask_mfd = state_fio->FgetBool();
1666 irqmask_timer = state_fio->FgetBool();
1667 irqmask_printer = state_fio->FgetBool();
1668 irqmask_keyboard = state_fio->FgetBool();
1670 irqreq_syndet = state_fio->FgetBool();
1671 irqreq_rxrdy = state_fio->FgetBool();
1672 irqreq_txrdy = state_fio->FgetBool();
1673 irqreq_fdc = state_fio->FgetBool();
1674 irqreq_timer = state_fio->FgetBool();
1675 irqreq_printer = state_fio->FgetBool();
1676 irqreq_keyboard = state_fio->FgetBool();
1678 irqstat_reg0 = state_fio->FgetUint8();
1680 irqstat_timer = state_fio->FgetBool();
1681 irqstat_printer = state_fio->FgetBool();
1682 irqstat_keyboard = state_fio->FgetBool();
1685 #if defined(_FM77_VARIANTS)
1686 stat_fdmode_2hd = state_fio->FgetBool();
1687 stat_kanjirom = state_fio->FgetBool();
1688 stat_400linecard = state_fio->FgetBool();
1689 #elif defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
1690 defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
1691 stat_kanjirom = state_fio->FgetBool();
1693 firq_break_key = state_fio->FgetBool();
1694 firq_sub_attention = state_fio->FgetBool();
1696 intmode_fdc = state_fio->FgetBool();
1698 extdet_neg = state_fio->FgetBool();
1699 //sub_busy = state_fio->FgetBool();
1700 sub_halt = state_fio->FgetBool();
1701 //sub_halt_bak = state_fio->FgetBool();
1702 sub_cancel = state_fio->FgetBool();
1703 //sub_cancel_bak = state_fio->FgetBool();
1704 #if defined(WITH_Z80)
1705 z80_sel = state_fio->FgetBool();
1708 intstat_syndet = state_fio->FgetBool();
1709 intstat_rxrdy = state_fio->FgetBool();
1710 intstat_txrdy = state_fio->FgetBool();
1714 connect_opn = state_fio->FgetBool();
1715 connect_whg = state_fio->FgetBool();
1716 connect_thg = state_fio->FgetBool();
1718 opn_psg_77av = state_fio->FgetBool();
1720 for(ch = 0; ch < 4; ch++) {
1721 opn_address[ch] = state_fio->FgetUint32_BE();
1722 opn_data[ch] = state_fio->FgetUint32_BE();
1723 opn_stat[ch] = state_fio->FgetUint32_BE();
1724 opn_cmdreg[ch] = state_fio->FgetUint32_BE();
1725 opn_ch3mode[ch] = state_fio->FgetUint32_BE();
1727 joyport_a = state_fio->FgetUint32_BE();
1728 joyport_b = state_fio->FgetUint32_BE();
1730 intstat_opn = state_fio->FgetBool();
1731 intstat_mouse = state_fio->FgetBool();
1732 mouse_enable = state_fio->FgetBool();
1734 intstat_whg = state_fio->FgetBool();
1735 intstat_thg = state_fio->FgetBool();
1738 connect_fdc = state_fio->FgetBool();
1739 fdc_statreg = state_fio->FgetUint8();
1740 fdc_cmdreg = state_fio->FgetUint8();
1741 fdc_trackreg = state_fio->FgetUint8();
1742 fdc_sectreg = state_fio->FgetUint8();
1743 fdc_datareg = state_fio->FgetUint8();
1744 fdc_headreg = state_fio->FgetUint8();
1745 fdc_drvsel = state_fio->FgetUint8();
1746 irqreg_fdc = state_fio->FgetUint8();
1747 fdc_motor = state_fio->FgetBool();
1748 irqstat_fdc = state_fio->FgetBool();
1751 connect_kanjiroml1 = state_fio->FgetBool();
1752 #if defined(_FM77AV_VARIANTS)
1753 connect_kanjiroml2 = state_fio->FgetBool();
1754 boot_ram = state_fio->FgetBool();
1755 hotreset = state_fio->FgetBool();
1757 sub_monitor_type = state_fio->FgetUint8();
1761 event_beep = state_fio->FgetInt32_BE();
1762 event_beep_oneshot = state_fio->FgetInt32_BE();
1763 event_timerirq = state_fio->FgetInt32_BE();
1766 if(version >= 3) { // V3
1767 event_fdc_motor = state_fio->FgetInt32_BE();
1768 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)|| \
1769 defined(_FM77AV20) || defined(_FM77AV20SX) || defined(_FM77AV20EX)
1770 for(ch = 0; ch < 4; ch++) fdc_drive_table[ch] = state_fio->FgetUint8();
1771 fdc_reg_fd1e = state_fio->FgetUint8();
1773 #if defined(HAS_DMA)
1774 intstat_dma = state_fio->FgetBool();
1775 dma_addr = (uint32)(state_fio->FgetUint8() & 0x1f);
1777 #if defined(_FM77AV_VARIANTS)
1778 reg_fd12 = state_fio->FgetUint8();