2 * FM-7 Main I/O [fm7_mainio.h]
4 * Author: K.Ohta <whatisthis.sowhat _at_ gmail.com>
7 * Jan 03, 2015 : Initial
12 #include "fm7_mainio.h"
14 #include "../mc6809.h"
17 #include "../datarec.h"
23 FM7_MAINIO::FM7_MAINIO(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
37 cmt_indat = false; // bit7
38 cmt_invert = false; // Invert signal
47 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
48 defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
49 stat_kanjirom = true; // R/W : bit5, '0' = sub, '1' = main. FM-77 Only.
50 #elif defined(_FM77_VARIANTS)
51 stat_fdmode_2hd = false; // R/W : bit6, '0' = 2HD, '1' = 2DD. FM-77 Only.
52 stat_kanjirom = true; // R/W : bit5, '0' = sub, '1' = main. FM-77 Only.
53 stat_400linecard = false;// R/W : bit4, '0' = connected. FM-77 Only.
55 firq_break_key = false; // bit1, ON = '0'.
56 firq_sub_attention = false; // bit0, ON = '0'.
57 intmode_fdc = false; // bit2, '0' = normal, '1' = SFD.
61 z80_sel = false; // bit0 : '1' = Z80. Maybe only FM-7/77.
64 intstat_syndet = false;
65 intstat_rxrdy = false;
66 intstat_txrdy = false;
70 stat_romrammode = true; // ROM ON
76 opn_address[0] = 0x00;
85 for(i = 0; i < 3; i++) {
86 opn_address[i] = 0x00;
94 intstat_mouse = false;
108 // FD20, FD21, FD22, FD23
109 connect_kanjiroml1 = false;
110 #if defined(_FM77AV_VARIANTS)
111 // FD2C, FD2D, FD2E, FD2F
112 connect_kanjiroml2 = false;
114 #if defined(_FM77_VARIANTS) || defined(_FM77AV_VARIANTS)
120 memset(io_w_latch, 0xff, 0x100);
121 initialize_output_signals(&clock_status);
122 initialize_output_signals(&printer_reset_bus);
123 initialize_output_signals(&printer_strobe_bus);
124 initialize_output_signals(&printer_select_bus);
127 FM7_MAINIO::~FM7_MAINIO()
133 void FM7_MAINIO::initialize()
136 event_beep_oneshot = -1;
138 event_fdc_motor = -1;
140 #if defined(_FM77_VARIANTS) || defined(_FM77AV_VARIANTS)
142 # if defined(_FM77_VARIANTS)
143 stat_fdmode_2hd = false;
144 stat_kanjirom = true;
145 stat_400linecard = false;
146 # if defined(_FM77L4)
147 stat_400linecard = true;
151 irqmask_syndet = true;
152 irqmask_rxrdy = true;
153 irqmask_txrdy = true;
155 irqmask_timer = true;
156 irqmask_printer = true;
157 irqmask_keyboard = true;
160 intstat_syndet = false;
161 intstat_rxrdy = false;
162 intstat_txrdy = false;
163 irqstat_timer = false;
164 irqstat_printer = false;
165 irqstat_keyboard = false;
167 irqreq_syndet = false;
168 irqreq_rxrdy = false;
169 irqreq_txrdy = false;
170 irqreq_printer = false;
171 irqreq_keyboard = false;
172 #if defined(_FM77AV_VARIANTS)
175 bootmode = config.boot_mode & 3;
178 void FM7_MAINIO::reset()
180 if(event_beep >= 0) cancel_event(this, event_beep);
182 if(event_beep_oneshot >= 0) cancel_event(this, event_beep_oneshot);
183 event_beep_oneshot = -1;
184 if(event_timerirq >= 0) cancel_event(this, event_timerirq);
187 register_event(this, EVENT_BEEP_CYCLE, (1000.0 * 1000.0) / (1200.0 * 2.0), true, &event_beep);
189 #if defined(_FM77AV_VARIANTS)
193 #if defined(_FM77_VARIANTS)
194 //boot_ram = (mainmem->read_signal(FM7_MAINIO_BOOTRAM_RW) == 0) ? false : true;
196 #elif defined(_FM77AV_VARIANTS)
197 //boot_ram = (mainmem->read_signal(FM7_MAINIO_BOOTRAM_RW) == 0) ? false : true;
202 sub_cancel = false; // bit6 : '1' Cancel req.
203 sub_halt = false; // bit6 : '1' Cancel req.
204 sub_cancel_bak = sub_cancel; // bit6 : '1' Cancel req.
205 sub_halt_bak = sub_halt; // bit6 : '1' Cancel req.
208 cmt_indat = false; // bit7
209 cmt_invert = false; // Invert signal
213 lpt_ackng_inv = true;
214 lpt_error_inv = true;
216 lpt_type = config.printer_device_type;
219 //stat_romrammode = true;
220 // IF BASIC BOOT THEN ROM
222 //mainmem->write_signal(FM7_MAINIO_PUSH_FD0F, ((config.boot_mode & 3) == 0) ? 0xffffffff : 0, 0xffffffff);
223 #if defined(_FM77AV_VARIANTS)
224 sub_monitor_type = 0x00;
226 switch(config.cpu_type){
234 this->write_signals(&clock_status, clock_fast ? 0xffffffff : 0);
237 irqmask_syndet = true;
238 irqmask_rxrdy = true;
239 irqmask_txrdy = true;
241 irqmask_timer = true;
242 irqmask_printer = true;
243 irqmask_keyboard = true;
246 intstat_syndet = false;
247 intstat_rxrdy = false;
248 intstat_txrdy = false;
249 irqstat_timer = false;
250 irqstat_printer = false;
251 //irqstat_keyboard = false;
253 irqreq_syndet = false;
254 irqreq_rxrdy = false;
255 irqreq_txrdy = false;
256 irqreq_printer = false;
257 //irqreq_keyboard = false;
259 drec->write_signal(SIG_DATAREC_MIC, 0x00, 0x01);
260 drec->set_remote(false);
265 firq_break_key = (keyboard->read_signal(SIG_FM7KEY_BREAK_KEY) != 0x00000000); // bit1, ON = '0'.
266 set_sub_attention(false);
267 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
268 defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
269 stat_kanjirom = true; // R/W : bit5, '0' = sub, '1' = main. FM-77 Only.
270 #elif defined(_FM77_VARIANTS)
271 stat_fdmode_2hd = false; // R/W : bit6, '0' = 2HD, '1' = 2DD. FM-77 Only.
272 stat_kanjirom = true; // R/W : bit5, '0' = sub, '1' = main. FM-77 Only.
274 maincpu->write_signal(SIG_CPU_FIRQ, 0, 1);
279 #if defined(_FM77AV_VARIANTS)
283 register_event(this, EVENT_TIMERIRQ_ON, 10000.0 / 4.9152, true, &event_timerirq); // TIMER IRQ
285 bootmode = config.boot_mode & 3;
286 memset(io_w_latch, 0xff, 0x100);
289 void FM7_MAINIO::reset_printer()
293 this->write_signals(&printer_strobe_bus, 0);
294 this->write_signals(&printer_select_bus, 0xffffffff);
295 this->write_signals(&printer_reset_bus, 0xffffffff);
296 register_event(this, EVENT_PRINTER_RESET_COMPLETED, 5.0 * 1000.0, false, NULL);
298 printer->write_signal(SIG_PRINTER_STROBE, 0x00, 0xff);
302 void FM7_MAINIO::set_clockmode(uint8_t flags)
305 if((flags & FM7_MAINCLOCK_SLOW) != 0) {
310 if(f != clock_fast) {
311 this->write_signal(FM7_MAINIO_CLOCKMODE, clock_fast ? 1 : 0, 1);
312 //mainmem->write_signal(FM7_MAINIO_CLOCKMODE, clock_fast ? 1 : 0, 1);
316 uint8_t FM7_MAINIO::get_clockmode(void)
318 if(!clock_fast) return FM7_MAINCLOCK_SLOW;
319 return FM7_MAINCLOCK_HIGH;
323 uint8_t FM7_MAINIO::get_port_fd00(void)
325 uint8_t ret = 0x7e; //0b01111110;
329 if(keyboard->read_data8(0x00) != 0) ret |= 0x80; // High bit.
331 if(clock_fast) ret |= 0x01; //0b00000001;
335 void FM7_MAINIO::set_port_fd00(uint8_t data)
337 drec->write_signal(SIG_DATAREC_MIC, data, 0x01);
338 drec->set_remote(((data & 0x02) != 0));
339 lpt_slctin = ((data & 0x80) == 0);
340 lpt_strobe = ((data & 0x40) != 0);
341 this->write_signals(&printer_strobe_bus, lpt_strobe ? 0xffffffff : 0);
342 this->write_signals(&printer_select_bus, lpt_slctin ? 0xffffffff : 0);
343 if((lpt_type == 0) && (lpt_slctin)) {
344 printer->write_signal(SIG_PRINTER_STROBE, lpt_strobe ? 0xff : 0x00, 0xff);
348 uint8_t FM7_MAINIO::get_port_fd02(void)
351 bool ack_bak = lpt_ackng_inv;
352 // Still unimplemented printer.
353 ret = (cmt_indat) ? 0xff : 0x7f; // CMT
356 lpt_busy = (printer->read_signal(SIG_PRINTER_BUSY) != 0);
357 lpt_error_inv = true;
358 lpt_ackng_inv = (printer->read_signal(SIG_PRINTER_ACK) != 0);
360 } else if((lpt_type == 1) || (lpt_type == 2)) {
361 lpt_pe = (joystick->read_data8(lpt_type + 1) != 0); // check joy port;
363 lpt_error_inv = true;
364 lpt_ackng_inv = true;
367 lpt_error_inv = true;
368 lpt_ackng_inv = true;
371 ret &= (lpt_busy) ? 0xff : ~0x01;
372 ret &= (lpt_error_inv) ? 0xff : ~0x02;
373 ret &= (lpt_ackng_inv) ? 0xff : ~0x04;
374 ret &= (lpt_pe) ? 0xff : ~0x08;
375 ret &= (lpt_det1) ? 0xff : ~0x10;
376 ret &= (lpt_det2) ? 0xff : ~0x20;
377 if((lpt_ackng_inv == true) && (ack_bak == false)) set_irq_printer(true);
381 void FM7_MAINIO::set_port_fd02(uint8_t val)
385 bool syndetirq_bak = irqmask_syndet;
386 bool rxrdyirq_bak = irqmask_rxrdy;
387 bool txrdyirq_bak = irqmask_txrdy;
389 bool keyirq_bak = irqmask_keyboard;
390 bool timerirq_bak = irqmask_timer;
391 bool printerirq_bak = irqmask_printer;
392 bool mfdirq_bak = irqmask_mfd;
394 // if((val & 0b00010000) != 0) {
395 if((val & 0x80) != 0) {
396 irqmask_syndet = false;
398 irqmask_syndet = true;
400 if(syndetirq_bak != irqmask_syndet) {
401 set_irq_txrdy(irqreq_syndet);
403 if((val & 0x40) != 0) {
404 irqmask_rxrdy = false;
406 irqmask_rxrdy = true;
408 // if(rxrdyirq_bak != irqmask_rxrdy) {
409 // set_irq_rxrdy(irqreq_rxrdy);
411 if((val & 0x20) != 0) {
412 irqmask_txrdy = false;
414 irqmask_txrdy = true;
416 // if(txrdyirq_bak != irqmask_txrdy) {
417 // set_irq_txrdy(irqreq_txrdy);
420 if((val & 0x10) != 0) {
425 // if(mfdirq_bak != irqmask_mfd) {
426 // set_irq_mfd(irqreq_fdc);
429 if((val & 0x04) != 0) {
430 irqmask_timer = false;
432 irqmask_timer = true;
434 // if(timerirq_bak != irqmask_timer) {
435 // set_irq_timer(false);
438 if((val & 0x02) != 0) {
439 irqmask_printer = false;
441 irqmask_printer = true;
443 // if(printerirq_bak != irqmask_printer) {
444 // set_irq_printer(irqreq_printer);
447 if((val & 0x01) != 0) {
448 irqmask_keyboard = false;
450 irqmask_keyboard = true;
452 if(keyirq_bak != irqmask_keyboard) {
453 display->write_signal(SIG_FM7_SUB_KEY_MASK, irqmask_keyboard ? 1 : 0, 1);
454 set_irq_keyboard(irqreq_keyboard);
460 void FM7_MAINIO::set_irq_syndet(bool flag)
462 bool backup = intstat_syndet;
463 irqreq_syndet = flag;
465 intstat_syndet = flag;
467 if(flag && !(irqmask_syndet)) {
468 //irqstat_reg0 &= ~0x80; //~0x20;
469 intstat_syndet = true;
471 // irqstat_reg0 |= 0x80;
472 intstat_syndet = false;
475 if(backup != intstat_syndet) do_irq();
479 void FM7_MAINIO::set_irq_rxrdy(bool flag)
481 bool backup = intstat_rxrdy;
484 intstat_rxrdy = flag;
486 if(flag && !(irqmask_rxrdy)) {
487 //irqstat_reg0 &= ~0x40; //~0x20;
488 intstat_rxrdy = true;
490 //irqstat_reg0 |= 0x40;
491 intstat_rxrdy = false;
494 if(backup != intstat_rxrdy) do_irq();
499 void FM7_MAINIO::set_irq_txrdy(bool flag)
501 bool backup = intstat_txrdy;
504 intstat_txrdy = flag;
506 if(flag && !(irqmask_txrdy)) {
507 //irqstat_reg0 &= ~0x20; //~0x20;
508 intstat_txrdy = true;
510 //irqstat_reg0 |= 0x20;
511 intstat_txrdy = false;
514 if(backup != intstat_txrdy) do_irq();
518 void FM7_MAINIO::set_irq_timer(bool flag)
521 bool backup = irqstat_timer;
523 irqstat_reg0 &= 0xfb; //~0x04;
524 irqstat_timer = true;
526 irqstat_reg0 |= 0x04;
527 irqstat_timer = false;
529 //if(backup != irqstat_timer) do_irq();
534 void FM7_MAINIO::set_irq_printer(bool flag)
537 uint8_t backup = irqstat_reg0;
538 irqreq_printer = flag;
539 if(flag && !(irqmask_printer)) {
540 irqstat_reg0 &= ~0x02;
541 irqstat_printer = true;
543 irqstat_reg0 |= 0x02;
544 irqstat_printer = false;
550 void FM7_MAINIO::set_irq_keyboard(bool flag)
552 //uint8_t backup = irqstat_reg0;
553 //printf("MAIN: KEYBOARD: IRQ=%d MASK=%d\n", flag ,irqmask_keyboard);
554 irqreq_keyboard = flag;
555 if(flag && !irqmask_keyboard) {
556 irqstat_reg0 &= 0xfe;
557 irqstat_keyboard = true;
559 irqstat_reg0 |= 0x01;
560 irqstat_keyboard = false;
566 void FM7_MAINIO::do_irq(void)
570 intstat = intstat_txrdy | intstat_rxrdy | intstat_syndet;
572 intstat = irqstat_timer | irqstat_keyboard | irqstat_printer;
573 intstat = intstat | irqstat_fdc;
574 intstat = intstat | intstat_opn | intstat_whg | intstat_thg;
575 intstat = intstat | intstat_txrdy | intstat_rxrdy | intstat_syndet;
576 intstat = intstat | intstat_mouse;
577 # if defined(HAS_DMA)
578 intstat = intstat | intstat_dma;
581 //printf("%08d : IRQ: REG0=%02x FDC=%02x, stat=%d\n", SDL_GetTicks(), irqstat_reg0, irqstat_fdc, intstat);
583 maincpu->write_signal(SIG_CPU_IRQ, 1, 1);
585 maincpu->write_signal(SIG_CPU_IRQ, 0, 1);
589 void FM7_MAINIO::do_firq(void)
592 firq_stat = firq_break_key | firq_sub_attention;
594 maincpu->write_signal(SIG_CPU_FIRQ, 1, 1);
596 maincpu->write_signal(SIG_CPU_FIRQ, 0, 1);
598 p_emu->out_debug_log(_T("IO: do_firq(). BREAK=%d ATTN=%d"), firq_break_key ? 1 : 0, firq_sub_attention ? 1 : 0);
602 void FM7_MAINIO::do_nmi(bool flag)
604 maincpu->write_signal(SIG_CPU_NMI, flag ? 1 : 0, 1);
608 void FM7_MAINIO::set_break_key(bool pressed)
610 firq_break_key = pressed;
614 void FM7_MAINIO::set_sub_attention(bool flag)
616 firq_sub_attention = flag;
621 uint8_t FM7_MAINIO::get_fd04(void)
624 if(display->read_signal(SIG_DISPLAY_BUSY) != 0) val |= 0x80;
625 if(!firq_break_key) val |= 0x02;
626 if(!firq_sub_attention) {
629 #if defined(_FM77_VARIANTS)
630 if(stat_fdmode_2hd) val |= 0x40;
631 if(stat_kanjirom) val |= 0x20;
632 if(stat_400linecard) val |= 0x10;
633 if((display->read_signal(SIG_DISPLAY_EXTRA_MODE) & 0x04) != 0x00) val |= 0x04;
637 if(firq_sub_attention) {
638 set_sub_attention(false);
639 //printf("Attention \n");
641 #if defined(_FM77AV_VARIANTS)
643 if(mainmem->read_signal(FM7_MAINIO_INITROM_ENABLED) == 0) {
644 set_break_key(false);
652 void FM7_MAINIO::set_fd04(uint8_t val)
655 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
656 display->write_signal(SIG_DISPLAY_EXTRA_MODE, val, 0xff);
657 stat_kanjirom = ((val & 0x20) != 0);
658 #elif defined(_FM77_VARIANTS)
659 display->write_signal(SIG_DISPLAY_EXTRA_MODE, val, 0xff);
660 stat_fdmode_2hd = ((val & 0x40) != 0);
661 stat_kanjirom = ((val & 0x20) != 0);
662 stat_400linecard = ((val & 0x10) != 0);
667 uint8_t FM7_MAINIO::get_fd05(void)
670 //val = (sub_busy) ? 0xfe : 0x7e;
671 if(display->read_signal(SIG_DISPLAY_BUSY) != 0) val |= 0x80;
672 if(!extdet_neg) val |= 0x01;
673 //printf("FD05: READ: %d VAL=%02x\n", SDL_GetTicks(), val);
677 void FM7_MAINIO::set_fd05(uint8_t val)
679 sub_cancel = ((val & 0x40) != 0) ? true : false;
680 sub_halt = ((val & 0x80) != 0) ? true : false;
681 //if(sub_halt != sub_halt_bak) {
682 display->write_signal(SIG_DISPLAY_HALT, (sub_halt) ? 0xff : 0x00, 0xff);
684 sub_halt_bak = sub_halt;
686 //if(sub_cancel != sub_cancel_bak) {
687 display->write_signal(SIG_FM7_SUB_CANCEL, (sub_cancel) ? 0xff : 0x00, 0xff); // HACK
689 sub_cancel_bak = sub_cancel;
691 if((val & 0x01) != 0) {
692 maincpu->write_signal(SIG_CPU_BUSREQ, 1, 1);
693 z80->write_signal(SIG_CPU_BUSREQ, 0, 1);
695 maincpu->write_signal(SIG_CPU_BUSREQ, 0, 1);
696 z80->write_signal(SIG_CPU_BUSREQ, 1, 1);
701 void FM7_MAINIO::set_extdet(bool flag)
706 void FM7_MAINIO::write_fd0f(void)
709 if((config.dipswitch & FM7_DIPSW_FM8_PROTECT_FD0F) != 0) {
712 bootmode = 1; // DOS : Where BUBBLE?
713 mainmem->write_signal(FM7_MAINIO_BOOTMODE, bootmode, 0xffffffff);
714 mainmem->write_signal(FM7_MAINIO_IS_BASICROM, 0, 0xffffffff);
716 mainmem->write_signal(FM7_MAINIO_PUSH_FD0F, 0, 0xffffffff);
718 uint8_t FM7_MAINIO::read_fd0f(void)
721 if((config.dipswitch & FM7_DIPSW_FM8_PROTECT_FD0F) != 0) {
724 bootmode = 0; // BASIC
725 mainmem->write_signal(FM7_MAINIO_BOOTMODE, bootmode, 0xffffffff);
726 mainmem->write_signal(FM7_MAINIO_IS_BASICROM, 0xffffffff, 0xffffffff);
728 mainmem->write_signal(FM7_MAINIO_PUSH_FD0F, 0xffffffff, 0xffffffff);
732 bool FM7_MAINIO::get_rommode_fd0f(void)
734 return (mainmem->read_signal(FM7_MAINIO_PUSH_FD0F) == 0) ? false : true;
738 // Kanji ROM, FD20 AND FD21 (or SUBSYSTEM)
739 void FM7_MAINIO::write_kanjiaddr_hi(uint8_t addr)
741 if(!connect_kanjiroml1) return;
742 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
743 defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
744 if(!stat_kanjirom) return;
746 kanjiclass1->write_data8(KANJIROM_ADDR_HI, addr);
750 void FM7_MAINIO::write_kanjiaddr_lo(uint8_t addr)
752 if(!connect_kanjiroml1) return;
753 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
754 defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
755 if(!stat_kanjirom) return;
757 kanjiclass1->write_data8(KANJIROM_ADDR_LO, addr);
761 uint8_t FM7_MAINIO::read_kanjidata_left(void)
763 if(!connect_kanjiroml1) return 0xff;
764 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
765 defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
766 if(!stat_kanjirom) return 0xff;
768 //printf("KANJI MAIN CLASS1 ADDR: %05x\n", kaddress.w.l);
770 return kanjiclass1->read_data8(KANJIROM_DATA_HI);
776 uint8_t FM7_MAINIO::read_kanjidata_right(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;
784 return kanjiclass1->read_data8(KANJIROM_DATA_LO);
790 #ifdef CAPABLE_KANJI_CLASS2
791 // Kanji ROM, FD20 AND FD21 (or SUBSYSTEM)
792 void FM7_MAINIO::write_kanjiaddr_hi_l2(uint8_t addr)
794 if(!connect_kanjiroml2) return;
795 if(!stat_kanjirom) return;
796 kanjiclass2->write_data8(KANJIROM_ADDR_HI, addr);
800 void FM7_MAINIO::write_kanjiaddr_lo_l2(uint8_t addr)
802 if(!connect_kanjiroml2) return;
803 if(!stat_kanjirom) return;
804 kanjiclass2->write_data8(KANJIROM_ADDR_LO, addr);
809 uint8_t FM7_MAINIO::read_kanjidata_left_l2(void)
811 if(!connect_kanjiroml2) return 0xff;
812 if(!stat_kanjirom) return 0xff;
815 return kanjiclass2->read_data8(KANJIROM_DATA_HI);
821 uint8_t FM7_MAINIO::read_kanjidata_right_l2(void)
823 if(!connect_kanjiroml2) return 0xff;
824 if(!stat_kanjirom) return 0xff;
827 return kanjiclass2->read_data8(KANJIROM_DATA_LO);
835 uint32_t FM7_MAINIO::read_signal(int id)
839 case FM7_MAINIO_KEYBOARDIRQ_MASK:
840 retval = (irqmask_keyboard) ? 0xffffffff : 0x00000000;
850 void FM7_MAINIO::write_signal(int id, uint32_t data, uint32_t mask)
853 val_b = ((data & mask) != 0);
856 //case SIG_FM7_SUB_HALT:
857 // mainmem->write_signal(SIG_FM7_SUB_HALT, data, mask);
859 case FM7_MAINIO_CLOCKMODE: // fd00
865 this->write_signals(&clock_status, clock_fast ? 0xffffffff : 0);
867 case FM7_MAINIO_CMT_RECV: // FD02
868 cmt_indat = val_b ^ cmt_invert;
870 case FM7_MAINIO_CMT_INVERT: // FD02
873 case FM7_MAINIO_TIMERIRQ: //
874 set_irq_timer(val_b);
876 case FM7_MAINIO_LPTIRQ: //
877 set_irq_printer(val_b);
879 case FM7_MAINIO_LPT_BUSY:
882 case FM7_MAINIO_LPT_ERROR:
883 lpt_error_inv = val_b;
885 case FM7_MAINIO_LPT_ACK:
887 bool f = lpt_ackng_inv;
888 lpt_ackng_inv = val_b;
889 if((lpt_ackng_inv == true) && (f == false)) set_irq_printer(true);
892 case FM7_MAINIO_LPT_PAPER_EMPTY:
895 case FM7_MAINIO_LPT_DET1:
898 case FM7_MAINIO_LPT_DET2:
901 case FM7_MAINIO_KEYBOARDIRQ: //
902 set_irq_keyboard(val_b);
905 case FM7_MAINIO_PUSH_BREAK:
906 set_break_key(val_b);
908 #if defined(FM77AV_VARIANTS)
909 case FM7_MAINIO_HOT_RESET:
913 case FM7_MAINIO_SUB_ATTENTION:
914 if(val_b) set_sub_attention(true);
917 case FM7_MAINIO_EXTDET:
920 case FM7_MAINIO_BEEP:
923 case FM7_MAINIO_PSG_IRQ:
926 case FM7_MAINIO_OPN_IRQ:
927 if(!connect_opn) break;
931 case FM7_MAINIO_WHG_IRQ:
932 if(!connect_whg) break;
936 case FM7_MAINIO_THG_IRQ:
937 if(!connect_thg) break;
942 case FM7_MAINIO_FDC_DRQ:
945 case FM7_MAINIO_FDC_IRQ:
949 case FM7_MAINIO_DMA_INT:
954 #if defined(_FM77AV_VARIANTS)
955 case SIG_DISPLAY_DISPLAY:
962 case SIG_DISPLAY_VSYNC:
969 case SIG_DISPLAY_MODE320:
981 uint8_t FM7_MAINIO::get_irqstat_fd03(void)
986 extirq = irqstat_fdc | intstat_opn | intstat_whg | intstat_thg;
987 extirq = extirq | intstat_syndet | intstat_rxrdy | intstat_txrdy;
988 # if defined(HAS_DMA)
989 extirq = extirq | intstat_dma;
992 irqstat_reg0 &= ~0x08;
994 irqstat_reg0 |= 0x08;
996 val = irqstat_reg0 | 0xf0;
997 // Not call do_irq() twice. 20151221
998 irqstat_timer = false;
999 irqstat_printer = false;
1000 irqstat_reg0 |= 0x06;
1002 //p_emu->out_debug_log(_T("IO: Check IRQ Status."));
1009 uint8_t FM7_MAINIO::get_extirq_fd17(void)
1013 if(intstat_opn && connect_opn) val &= ~0x08;
1014 if(intstat_mouse) val &= ~0x04;
1019 void FM7_MAINIO::set_ext_fd17(uint8_t data)
1022 if((data & 0x04) != 0) {
1023 mouse_enable = true;
1025 mouse_enable = false;
1030 #if defined(_FM77AV_VARIANTS)
1032 uint8_t FM7_MAINIO::subsystem_read_status(void)
1039 uint32_t FM7_MAINIO::read_io8(uint32_t addr)
1040 { // This is only for debug.
1041 addr = addr & 0xfff;
1043 return io_w_latch[addr];
1044 } else if(addr < 0x500) {
1045 uint32_t ofset = addr & 0xff;
1046 uint opnbank = (addr - 0x100) >> 8;
1047 return opn_regs[opnbank][ofset];
1048 } else if(addr < 0x600) {
1049 return mainmem->read_data8(addr - 0x500 + FM7_MAINIO_MMR_BANK);
1054 uint32_t FM7_MAINIO::read_dma_io8(uint32_t addr)
1056 return this->read_data8(addr & 0xff);
1059 uint32_t FM7_MAINIO::read_dma_data8(uint32_t addr)
1061 return this->read_data8(addr & 0xff);
1064 uint32_t FM7_MAINIO::read_data8(uint32_t addr)
1067 uint32_t mmr_segment;
1068 if(addr < FM7_MAINIO_IS_BASICROM) {
1071 #if defined(HAS_MMR)
1072 if((addr < 0x90) && (addr >= 0x80)) {
1073 mmr_segment = mainmem->read_data8(FM7_MAINIO_MMR_SEGMENT);
1074 # if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX) || \
1075 defined(_FM77AV20) || defined(_FM77AV20SX) || defined(_FM77AV20EX)
1076 mmr_segment &= 0x07;
1078 mmr_segment &= 0x03;
1080 return mainmem->read_data8(addr - 0x80 + FM7_MAINIO_MMR_BANK + mmr_segment * 16);
1083 // if((addr >= 0x0006) && !(addr == 0x1f) && !(addr == 0x0b)) printf("MAINIO: READ: %08x \n", addr);
1086 retval = (uint32_t) get_port_fd00();
1090 retval = keyboard->read_data8(0x01) & 0xff;
1094 retval = (uint32_t) get_port_fd02();
1098 retval = (uint32_t) get_irqstat_fd03();
1102 retval = (uint32_t) get_fd04();
1105 retval = (uint32_t) get_fd05();
1107 case 0x06: // RS-232C
1110 case 0x08: // Light pen
1114 #if defined(_FM77AV_VARIANTS)
1116 retval = ((config.boot_mode & 3) == 0) ? 0xfe : 0xff;
1119 case 0x0e: // PSG DATA
1120 retval = (uint32_t) get_psg();
1121 //printf("PSG DATA READ val=%02x\n", retval);
1127 #if defined(_FM77AV_VARIANTS)
1129 retval = subsystem_read_status();
1132 //printf("OPN CMD READ \n");
1134 case 0x16: // OPN DATA
1135 retval = (uint32_t) get_opn(0);
1138 retval = (uint32_t) get_extirq_fd17();
1140 case 0x18: // FDC: STATUS
1141 retval = (uint32_t) get_fdc_stat();
1142 //printf("FDC: READ STATUS %02x PC=%04x\n", retval, maincpu->get_pc());
1144 case 0x19: // FDC: Track
1145 retval = (uint32_t) get_fdc_track();
1146 //printf("FDC: READ TRACK REG %02x\n", retval);
1148 case 0x1a: // FDC: Sector
1149 retval = (uint32_t) get_fdc_sector();
1150 //printf("FDC: READ SECTOR REG %02x\n", retval);
1152 case 0x1b: // FDC: Data
1153 retval = (uint32_t) get_fdc_data();
1156 retval = (uint32_t) get_fdc_fd1c();
1157 //printf("FDC: READ HEAD REG %02x\n", retval);
1160 retval = (uint32_t) get_fdc_motor();
1161 //printf("FDC: READ MOTOR REG %02x\n", retval);
1164 retval = (uint32_t) get_fdc_fd1e();
1165 //printf("FDC: READ MOTOR REG %02x\n", retval);
1168 retval = (uint32_t) fdc_getdrqirq();
1170 case 0x22: // Kanji ROM
1171 retval = (uint32_t) read_kanjidata_left();
1173 case 0x23: // Kanji ROM
1174 retval = (uint32_t) read_kanjidata_right();
1176 #if defined(CAPABLE_KANJI_CLASS2)
1177 case 0x2e: // Kanji ROM Level2
1178 retval = (uint32_t) read_kanjidata_left_l2();
1180 case 0x2f: // Kanji ROM Level2
1181 retval = (uint32_t) read_kanjidata_right_l2();
1185 case 0x37: // Multi page
1186 //retval = (uint32_t)display->read_data8(DISPLAY_ADDR_MULTIPAGE);
1188 case 0x45: // WHG CMD
1190 case 0x46: // WHG DATA
1191 retval = (uint32_t) get_opn(1);
1194 retval = (uint32_t) get_extirq_whg();
1196 case 0x51: // THG CMD
1198 case 0x52: // THG DATA
1199 retval = (uint32_t) get_opn(2);
1202 retval = (uint32_t) get_extirq_thg();
1205 #if defined(HAS_MMR)
1209 if(mainmem->read_signal(FM7_MAINIO_BOOTRAM_RW) != 0) retval |= 0x01;
1210 if(mainmem->read_signal(FM7_MAINIO_WINDOW_ENABLED) != 0) retval |= 0x40;
1211 if(mainmem->read_signal(FM7_MAINIO_MMR_ENABLED) != 0) retval |= 0x80;
1214 #if defined(_FM77AV40SX) || defined(_FM77AV40EX)
1217 if(mainmem->read_signal(FM7_MAINIO_FASTMMR_ENABLED) != 0) retval |= 0x08;
1218 if(mainmem->read_signal(FM7_MAINIO_EXTROM) != 0) retval |= 0x80;
1221 #if defined(HAS_DMA)
1226 retval = dmac->read_data8(dma_addr);
1233 if((addr < 0x40) && (addr >= 0x38)) {
1234 addr = (addr - 0x38) + FM7_SUBMEM_OFFSET_DPALETTE;
1235 return (uint32_t) display->read_data8(addr);
1240 } else if(addr == FM7_MAINIO_CLOCKMODE) {
1241 return (uint32_t)get_clockmode();
1243 #if defined(_FM77AV_VARIANTS)
1244 else if(addr == FM7_MAINIO_SUBMONITOR_ROM) {
1245 retval = sub_monitor_type & 0x03;
1247 } else if(addr == FM7_MAINIO_SUBMONITOR_RAM) {
1248 #if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX) || \
1249 defined(_FM77AV20) || defined(_FM77AV20SX) || defined(_FM77AV20EX)
1250 retval = ((sub_monitor_type & 0x04) != 0) ? 0xffffffff : 0x00000000;
1257 //if((addr >= 0x0006) && (addr != 0x1f)) printf("MAINIO: READ: %08x DATA=%08x\n", addr);
1261 void FM7_MAINIO::write_dma_io8(uint32_t addr, uint32_t data)
1263 this->write_data8(addr & 0xff, data);
1266 void FM7_MAINIO::write_dma_data8(uint32_t addr, uint32_t data)
1268 this->write_data8(addr & 0xff, data);
1272 void FM7_MAINIO::write_data8(uint32_t addr, uint32_t data)
1275 uint32_t mmr_segment;
1276 if(addr < FM7_MAINIO_IS_BASICROM) {
1278 io_w_latch[addr] = data;
1279 #if defined(HAS_MMR)
1280 if((addr < 0x90) && (addr >= 0x80)) {
1281 mmr_segment = mainmem->read_data8(FM7_MAINIO_MMR_SEGMENT);
1282 # if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX) || \
1283 defined(_FM77AV20) || defined(_FM77AV20SX) || defined(_FM77AV20EX)
1284 mmr_segment &= 0x07;
1286 mmr_segment &= 0x03;
1288 mainmem->write_data8(FM7_MAINIO_MMR_BANK + mmr_segment * 16 + addr - 0x80, data);
1294 set_port_fd00((uint8_t)data);
1299 case 0: // Write to file
1300 printer->write_signal(SIG_PRINTER_DATA, data, 0xff);
1304 joystick->write_data8(0x01, data);
1309 set_port_fd02((uint8_t)data);
1318 set_fd05((uint8_t)data);
1320 case 0x06: // RS-232C
1323 case 0x08: // Light pen
1328 //printf("PSG CMD WRITE val=%02x\n", data);
1332 //printf("PSG DATA WRITE val=%02x\n", data);
1338 #if defined(_FM77AV_VARIANTS)
1340 flag = ((data & 0x02) == 0) ? true : false;
1341 mainmem->write_signal(FM7_MAINIO_INITROM_ENABLED, (flag) ? 0xffffffff : 0 , 0xffffffff);
1344 display->write_signal(SIG_DISPLAY_MODE320, data, 0x40);
1346 reg_fd12 |= (data & 0x40);
1349 sub_monitor_type = data & 0x07;
1350 display->write_signal(SIG_FM7_SUB_BANK, sub_monitor_type, 0x07);
1353 case 0x15: // OPN CMD
1354 //printf("OPN CMD WRITE val=%02x\n", data);
1355 set_opn_cmd(0, data);
1357 case 0x16: // OPN DATA
1358 //printf("OPN DATA WRITE val=%02x\n", data);
1362 set_ext_fd17((uint8_t)data);
1364 case 0x18: // FDC: COMMAND
1365 set_fdc_cmd((uint8_t)data);
1366 //printf("FDC: WRITE CMD %02x\n", data);
1368 case 0x19: // FDC: Track
1369 set_fdc_track((uint8_t)data);
1370 //printf("FDC: WRITE TRACK REG %02x\n", data);
1372 case 0x1a: // FDC: Sector
1373 set_fdc_sector((uint8_t)data);
1374 //printf("FDC: WRITE SECTOR REG %02x\n", data);
1376 case 0x1b: // FDC: Data
1377 set_fdc_data((uint8_t)data);
1380 set_fdc_fd1c((uint8_t)data);
1381 //printf("FDC: WRITE HEAD REG %02x\n", data);
1384 set_fdc_fd1d((uint8_t)data);
1385 //printf("FDC: WRITE MOTOR REG %02x\n", data);
1388 set_fdc_fd1e((uint8_t)data);
1393 case 0x20: // Kanji ROM
1394 write_kanjiaddr_hi((uint8_t)data);
1396 case 0x2c: // Kanji ROM(DUP)
1397 #if defined(CAPABLE_KANJI_CLASS2)
1398 write_kanjiaddr_hi_l2((uint8_t)data);
1400 //write_kanjiaddr_hi((uint8_t)data);
1403 case 0x21: // Kanji ROM
1404 write_kanjiaddr_lo((uint8_t)data);
1406 case 0x2d: // Kanji ROM(DUP)
1407 #if defined(CAPABLE_KANJI_CLASS2)
1408 write_kanjiaddr_lo_l2((uint8_t)data);
1410 //write_kanjiaddr_lo((uint8_t)data);
1413 #if defined(CAPABLE_DICTROM)
1415 mainmem->write_signal(FM7_MAINIO_EXTBANK, data, 0xff);
1418 #if defined(_FM77AV_VARIANTS)
1420 display->write_data8(FM7_SUBMEM_OFFSET_APALETTE_HI, data);
1423 display->write_data8(FM7_SUBMEM_OFFSET_APALETTE_LO, data);
1426 display->write_data8(FM7_SUBMEM_OFFSET_APALETTE_B, data);
1429 display->write_data8(FM7_SUBMEM_OFFSET_APALETTE_R, data);
1432 display->write_data8(FM7_SUBMEM_OFFSET_APALETTE_G, data);
1436 case 0x37: // Multi page
1437 display->write_signal(SIG_DISPLAY_MULTIPAGE, data, 0x00ff);
1439 case 0x45: // WHG CMD
1440 set_opn_cmd(1, data);
1442 case 0x46: // WHG DATA
1447 case 0x51: // THG CMD
1448 set_opn_cmd(2, data);
1450 case 0x52: // THG DATA
1456 #if defined(HAS_MMR)
1458 #if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX) || \
1459 defined(_FM77AV20) || defined(_FM77AV20SX) || defined(_FM77AV20EX)
1460 mmr_segment = data & 7;
1462 // printf("MMR SEGMENT: %02x\n", data & 3);
1463 mmr_segment = data & 3;
1465 mainmem->write_data8(FM7_MAINIO_MMR_SEGMENT, (uint32_t)mmr_segment);
1468 mainmem->write_data8(FM7_MAINIO_WINDOW_OFFSET, (uint32_t)(data & 0x00ff));
1471 mainmem->write_signal(FM7_MAINIO_BOOTRAM_RW, data, 0x01);
1472 mainmem->write_signal(FM7_MAINIO_WINDOW_ENABLED, data , 0x40);
1473 //this->write_signal(FM7_MAINIO_CLOCKMODE, clock_fast ? 1 : 0, 1);
1474 //mainmem->write_signal(FM7_MAINIO_CLOCKMODE, clock_fast ? 1 : 0, 1);
1475 mainmem->write_signal(FM7_MAINIO_MMR_ENABLED, data, 0x80);
1479 #if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX) || \
1480 defined(_FM77AV20) || defined(_FM77AV20SX) || defined(_FM77AV20EX)
1482 mainmem->write_signal(FM7_MAINIO_MMR_EXTENDED, data, 0x80);
1483 mainmem->write_signal(FM7_MAINMEM_REFRESH_FAST, data, 0x04);
1484 mainmem->write_signal(FM7_MAINIO_WINDOW_FAST , data, 0x01);
1487 # if defined(_FM77AV40SX) || defined(_FM77AV40EX)
1489 mainmem->write_signal(FM7_MAINIO_FASTMMR_ENABLED, data, 0x08);
1490 mainmem->write_signal(FM7_MAINIO_EXTROM, data , 0x80);
1494 #if defined(HAS_DMA)
1496 dma_addr = data & 0x1f;
1499 dmac->write_data8(dma_addr, data);
1500 //p_emu->out_debug_log(_T("IO: Wrote DMA %02x to reg %02x\n"), data, dma_addr);
1504 //printf("MAIN: Write I/O Addr=%08x DATA=%02x\n", addr, data);
1508 if((addr < 0x40) && (addr >= 0x38)) {
1509 addr = (addr - 0x38) | FM7_SUBMEM_OFFSET_DPALETTE;
1510 display->write_data8(addr, (uint8_t)data);
1515 } else if(addr == FM7_MAINIO_CLOCKMODE) {
1516 set_clockmode((uint8_t)data);
1519 //if((addr >= 0x0006) && !(addr == 0x1f)) printf("MAINIO: WRITE: %08x DATA=%08x\n", addr, data);
1522 void FM7_MAINIO::event_callback(int event_id, int err)
1524 // printf("MAIN EVENT id=%d\n", event_id);
1526 case EVENT_BEEP_OFF:
1529 case EVENT_BEEP_CYCLE:
1532 case EVENT_UP_BREAK:
1533 set_break_key(false);
1536 case EVENT_TIMERIRQ_ON:
1537 //if(!irqmask_timer) set_irq_timer(true);
1538 set_irq_timer(!irqmask_timer);
1541 case EVENT_FD_MOTOR_ON:
1542 set_fdc_motor(true);
1543 event_fdc_motor = -1;
1545 case EVENT_FD_MOTOR_OFF:
1546 set_fdc_motor(false);
1547 event_fdc_motor = -1;
1549 case EVENT_PRINTER_RESET_COMPLETED:
1550 this->write_signals(&printer_reset_bus, 0x00);
1558 void FM7_MAINIO::update_config()
1560 switch(config.cpu_type){
1568 this->write_signals(&clock_status, clock_fast ? 0xffffffff : 0);
1571 if(config.boot_mode == 0) {
1572 mainmem->write_signal(FM7_MAINIO_IS_BASICROM, 0xffffffff, 0xffffffff);
1574 mainmem->write_signal(FM7_MAINIO_IS_BASICROM, 0, 0xffffffff);
1576 mainmem->write_signal(FM7_MAINIO_PUSH_FD0F, (config.boot_mode == 0) ? 1 : 0, 0x01);
1577 mainmem->write_signal(FM7_MAINIO_BOOTMODE, bootmode, 0xffffffff);
1581 void FM7_MAINIO::event_vline(int v, int clock)
1585 #define STATE_VERSION 5
1586 void FM7_MAINIO::save_state(FILEIO *state_fio)
1590 state_fio->FputUint32_BE(STATE_VERSION);
1591 state_fio->FputInt32_BE(this_device_id);
1595 for(addr = 0; addr < 0x100; addr++) state_fio->FputUint8(io_w_latch[addr]);
1597 state_fio->FputBool(clock_fast);
1598 state_fio->FputBool(lpt_strobe);
1599 state_fio->FputBool(lpt_slctin);
1600 state_fio->FputBool(beep_flag);
1601 state_fio->FputBool(beep_snd);
1604 state_fio->FputUint8(lpt_outdata);
1606 state_fio->FputBool(cmt_indat);
1607 state_fio->FputBool(cmt_invert);
1608 state_fio->FputBool(lpt_det2);
1609 state_fio->FputBool(lpt_det1);
1610 state_fio->FputBool(lpt_pe);
1611 state_fio->FputBool(lpt_ackng_inv);
1612 state_fio->FputBool(lpt_error_inv);
1613 state_fio->FputUint8(irqmask_reg0);
1615 state_fio->FputBool(irqmask_syndet);
1616 state_fio->FputBool(irqmask_rxrdy);
1617 state_fio->FputBool(irqmask_txrdy);
1618 state_fio->FputBool(irqmask_mfd);
1619 state_fio->FputBool(irqmask_timer);
1620 state_fio->FputBool(irqmask_printer);
1621 state_fio->FputBool(irqmask_keyboard);
1623 state_fio->FputBool(irqreq_syndet);
1624 state_fio->FputBool(irqreq_rxrdy);
1625 state_fio->FputBool(irqreq_txrdy);
1626 state_fio->FputBool(irqreq_fdc);
1627 state_fio->FputBool(irqreq_printer);
1628 state_fio->FputBool(irqreq_keyboard);
1630 state_fio->FputUint8(irqstat_reg0);
1632 state_fio->FputBool(irqstat_timer);
1633 state_fio->FputBool(irqstat_printer);
1634 state_fio->FputBool(irqstat_keyboard);
1637 #if defined(_FM77_VARIANTS)
1638 state_fio->FputBool(stat_fdmode_2hd);
1639 state_fio->FputBool(stat_kanjirom);
1640 state_fio->FputBool(stat_400linecard);
1641 #elif defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
1642 defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
1643 state_fio->FputBool(stat_kanjirom);
1645 state_fio->FputBool(firq_break_key);
1646 state_fio->FputBool(firq_sub_attention);
1648 state_fio->FputBool(intmode_fdc);
1650 state_fio->FputBool(extdet_neg);
1651 //state_fio->FputBool(sub_busy);
1652 state_fio->FputBool(sub_halt);
1653 //state_fio->FputBool(sub_halt_bak);
1654 state_fio->FputBool(sub_cancel);
1655 //state_fio->FputBool(sub_cancel_bak);
1656 #if defined(WITH_Z80)
1657 state_fio->FputBool(z80_sel);
1660 state_fio->FputBool(intstat_syndet);
1661 state_fio->FputBool(intstat_rxrdy);
1662 state_fio->FputBool(intstat_txrdy);
1667 state_fio->FputBool(connect_psg);
1669 state_fio->FputBool(connect_opn);
1670 state_fio->FputBool(connect_whg);
1671 state_fio->FputBool(connect_thg);
1673 state_fio->FputBool(opn_psg_77av);
1677 state_fio->FputUint32_BE(opn_address[0]);
1678 state_fio->FputUint32_BE(opn_data[0]);
1679 state_fio->FputUint32_BE(opn_stat[0]);
1680 state_fio->FputUint32_BE(opn_cmdreg[0]);
1681 state_fio->FputUint32_BE(opn_ch3mode[0]);
1684 for(ch = 0; ch < 4; ch++) {
1685 state_fio->FputUint32_BE(opn_address[ch]);
1686 state_fio->FputUint32_BE(opn_data[ch]);
1687 state_fio->FputUint32_BE(opn_stat[ch]);
1688 state_fio->FputUint32_BE(opn_cmdreg[ch]);
1689 state_fio->FputUint32_BE(opn_ch3mode[ch]);
1693 state_fio->FputBool(intstat_opn);
1694 state_fio->FputBool(intstat_mouse);
1695 state_fio->FputBool(mouse_enable);
1697 state_fio->FputBool(intstat_whg);
1698 state_fio->FputBool(intstat_thg);
1701 state_fio->FputBool(connect_fdc);
1702 state_fio->FputUint8(fdc_statreg);
1703 state_fio->FputUint8(fdc_cmdreg);
1704 state_fio->FputUint8(fdc_trackreg);
1705 state_fio->FputUint8(fdc_sectreg);
1706 state_fio->FputUint8(fdc_datareg);
1707 state_fio->FputUint8(fdc_headreg);
1708 state_fio->FputUint8(fdc_drvsel);
1709 state_fio->FputUint8(irqreg_fdc);
1710 state_fio->FputBool(fdc_motor);
1711 state_fio->FputBool(irqstat_fdc);
1713 state_fio->FputBool(connect_kanjiroml1);
1714 #if defined(_FM77AV_VARIANTS)
1715 state_fio->FputBool(connect_kanjiroml2);
1717 state_fio->FputBool(boot_ram);
1718 state_fio->FputBool(hotreset);
1720 state_fio->FputUint8(sub_monitor_type);
1726 state_fio->FputInt32_BE(event_beep);
1727 state_fio->FputInt32_BE(event_beep_oneshot);
1728 state_fio->FputInt32_BE(event_timerirq);
1731 state_fio->FputInt32_BE(event_fdc_motor);
1732 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)|| \
1733 defined(_FM77AV20) || defined(_FM77AV20SX) || defined(_FM77AV20EX)
1734 for(ch = 0; ch < 4; ch++) state_fio->FputUint8(fdc_drive_table[ch]);
1735 state_fio->FputUint8(fdc_reg_fd1e);
1737 #if defined(HAS_DMA)
1738 state_fio->FputBool(intstat_dma);
1739 state_fio->FputUint8(dma_addr & 0x1f);
1741 #if defined(_FM77AV_VARIANTS)
1742 state_fio->FputUint8(reg_fd12);
1747 bool FM7_MAINIO::load_state(FILEIO *state_fio)
1751 //bool stat = false;
1754 version = state_fio->FgetUint32_BE();
1755 if(this_device_id != state_fio->FgetInt32_BE()) return false;
1758 for(addr = 0; addr < 0x100; addr++) io_w_latch[addr] = state_fio->FgetUint8();
1760 clock_fast = state_fio->FgetBool();
1761 lpt_strobe = state_fio->FgetBool();
1762 lpt_slctin = state_fio->FgetBool();
1763 beep_flag = state_fio->FgetBool();
1764 beep_snd = state_fio->FgetBool();
1767 lpt_outdata = state_fio->FgetUint8();
1769 cmt_indat = state_fio->FgetBool();
1770 cmt_invert = state_fio->FgetBool();
1771 lpt_det2 = state_fio->FgetBool();
1772 lpt_det1 = state_fio->FgetBool();
1773 lpt_pe = state_fio->FgetBool();
1774 lpt_ackng_inv = state_fio->FgetBool();
1775 lpt_error_inv = state_fio->FgetBool();
1776 irqmask_reg0 = state_fio->FgetUint8();
1778 irqmask_syndet = state_fio->FgetBool();
1779 irqmask_rxrdy = state_fio->FgetBool();
1780 irqmask_txrdy = state_fio->FgetBool();
1781 irqmask_mfd = state_fio->FgetBool();
1782 irqmask_timer = state_fio->FgetBool();
1783 irqmask_printer = state_fio->FgetBool();
1784 irqmask_keyboard = state_fio->FgetBool();
1786 irqreq_syndet = state_fio->FgetBool();
1787 irqreq_rxrdy = state_fio->FgetBool();
1788 irqreq_txrdy = state_fio->FgetBool();
1789 irqreq_fdc = state_fio->FgetBool();
1790 irqreq_printer = state_fio->FgetBool();
1791 irqreq_keyboard = state_fio->FgetBool();
1793 irqstat_reg0 = state_fio->FgetUint8();
1795 irqstat_timer = state_fio->FgetBool();
1796 irqstat_printer = state_fio->FgetBool();
1797 irqstat_keyboard = state_fio->FgetBool();
1800 #if defined(_FM77_VARIANTS)
1801 stat_fdmode_2hd = state_fio->FgetBool();
1802 stat_kanjirom = state_fio->FgetBool();
1803 stat_400linecard = state_fio->FgetBool();
1804 #elif defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
1805 defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
1806 stat_kanjirom = state_fio->FgetBool();
1808 firq_break_key = state_fio->FgetBool();
1809 firq_sub_attention = state_fio->FgetBool();
1811 intmode_fdc = state_fio->FgetBool();
1813 extdet_neg = state_fio->FgetBool();
1814 //sub_busy = state_fio->FgetBool();
1815 sub_halt = state_fio->FgetBool();
1816 //sub_halt_bak = state_fio->FgetBool();
1817 sub_cancel = state_fio->FgetBool();
1818 //sub_cancel_bak = state_fio->FgetBool();
1819 #if defined(WITH_Z80)
1820 z80_sel = state_fio->FgetBool();
1823 intstat_syndet = state_fio->FgetBool();
1824 intstat_rxrdy = state_fio->FgetBool();
1825 intstat_txrdy = state_fio->FgetBool();
1830 connect_psg = state_fio->FgetBool();
1832 connect_opn = state_fio->FgetBool();
1833 connect_whg = state_fio->FgetBool();
1834 connect_thg = state_fio->FgetBool();
1836 opn_psg_77av = state_fio->FgetBool();
1840 opn_address[0] = state_fio->FgetUint32_BE();
1841 opn_data[0] = state_fio->FgetUint32_BE();
1842 opn_stat[0] = state_fio->FgetUint32_BE();
1843 opn_cmdreg[0] = state_fio->FgetUint32_BE();
1844 opn_ch3mode[0] = state_fio->FgetUint32_BE();
1847 for(ch = 0; ch < 4; ch++) {
1848 opn_address[ch] = state_fio->FgetUint32_BE();
1849 opn_data[ch] = state_fio->FgetUint32_BE();
1850 opn_stat[ch] = state_fio->FgetUint32_BE();
1851 opn_cmdreg[ch] = state_fio->FgetUint32_BE();
1852 opn_ch3mode[ch] = state_fio->FgetUint32_BE();
1855 intstat_opn = state_fio->FgetBool();
1856 intstat_mouse = state_fio->FgetBool();
1857 mouse_enable = state_fio->FgetBool();
1859 intstat_whg = state_fio->FgetBool();
1860 intstat_thg = state_fio->FgetBool();
1863 connect_fdc = state_fio->FgetBool();
1864 fdc_statreg = state_fio->FgetUint8();
1865 fdc_cmdreg = state_fio->FgetUint8();
1866 fdc_trackreg = state_fio->FgetUint8();
1867 fdc_sectreg = state_fio->FgetUint8();
1868 fdc_datareg = state_fio->FgetUint8();
1869 fdc_headreg = state_fio->FgetUint8();
1870 fdc_drvsel = state_fio->FgetUint8();
1871 irqreg_fdc = state_fio->FgetUint8();
1872 fdc_motor = state_fio->FgetBool();
1873 irqstat_fdc = state_fio->FgetBool();
1876 connect_kanjiroml1 = state_fio->FgetBool();
1877 #if defined(_FM77AV_VARIANTS)
1878 connect_kanjiroml2 = state_fio->FgetBool();
1879 boot_ram = state_fio->FgetBool();
1880 hotreset = state_fio->FgetBool();
1882 sub_monitor_type = state_fio->FgetUint8();
1886 event_beep = state_fio->FgetInt32_BE();
1887 event_beep_oneshot = state_fio->FgetInt32_BE();
1888 event_timerirq = state_fio->FgetInt32_BE();
1891 if(version >= 3) { // V3
1892 event_fdc_motor = state_fio->FgetInt32_BE();
1893 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)|| \
1894 defined(_FM77AV20) || defined(_FM77AV20SX) || defined(_FM77AV20EX)
1895 for(ch = 0; ch < 4; ch++) fdc_drive_table[ch] = state_fio->FgetUint8();
1896 fdc_reg_fd1e = state_fio->FgetUint8();
1898 #if defined(HAS_DMA)
1899 intstat_dma = state_fio->FgetBool();
1900 dma_addr = (uint32_t)(state_fio->FgetUint8() & 0x1f);
1902 #if defined(_FM77AV_VARIANTS)
1903 reg_fd12 = state_fio->FgetUint8();