2 * FM-7 Main I/O [fm7_mainio.h]
4 * Author: K.Ohta <whatisthis.sowhat _at_ gmail.com>
7 * Jan 03, 2015 : Initial
11 #include "fm7_mainio.h"
13 #include "../mc6809.h"
16 #include "../datarec.h"
19 //#include <SDL2/SDL.h>
21 void FM7_MAINIO::initialize(void)
26 bootmode = config.boot_mode & 3;
27 #if defined(_FM77AV_VARIANTS)
30 //opn_psg_77av = true;
33 #if defined(_FM77_VARIANTS) || defined(_FM77AV_VARIANTS)
36 #if defined(_FM77AV_VARIANTS)
37 enable_initiator = true;
42 window_enabled = false;
44 for(i = 0x00; i < 0x80; i++) mmr_table[i] = 0;
45 // for(i = 0x00; i < 0x10; i++) mmr_table[i] = 0x30 + i;
48 switch(config.cpu_type){
56 this->write_signal(FM7_MAINIO_CLOCKMODE, clock_fast ? 1 : 0, 1);
59 void FM7_MAINIO::reset(void)
63 //if(event_beep >= 0) cancel_event(this, event_beep);
64 if(event_timerirq >= 0) cancel_event(this, event_timerirq);
70 stat_romrammode = true;
71 bootmode = config.boot_mode & 3;
72 if(bootmode == 0) { // IF BASIC BOOT THEN ROM
73 stat_romrammode = true;
75 stat_romrammode = false;
77 #if defined(_FM77_VARIANTS) || defined(_FM77AV_VARIANTS)
81 #if defined(_FM77AV_VARIANTS)
83 sub_monitor_type = 0x00;
89 window_enabled = false;
92 if(config.cpu_type == 0) clock_fast = true;
101 irqmask_timer = true;
102 irqmask_printer = true;
103 irqmask_keyboard = true;
105 irqstat_timer = false;
106 irqstat_printer = false;
107 irqstat_keyboard = false;
110 //firq_break_key = false; // bit1, ON = '0'.
111 firq_sub_attention = false; // bit0, ON = '0'.
114 sub_cancel = false; // bit6 : '1' Cancel req.
119 register_event(this, EVENT_TIMERIRQ_ON, 10000.0 / 4.9152, true, &event_timerirq); // TIMER IRQ
121 sub_busy = (display->read_signal(SIG_DISPLAY_BUSY) == 0) ? false : true;
126 void FM7_MAINIO::set_clockmode(uint8 flags)
129 if((flags & FM7_MAINCLOCK_SLOW) != 0) {
134 if(f != clock_fast) {
135 this->write_signal(FM7_MAINIO_CLOCKMODE, clock_fast ? 1 : 0, 1);
139 uint8 FM7_MAINIO::get_clockmode(void)
141 if(!clock_fast) return FM7_MAINCLOCK_SLOW;
142 return FM7_MAINCLOCK_HIGH;
146 uint8 FM7_MAINIO::get_port_fd00(void)
148 uint8 ret = 0x7e; //0b01111110;
149 if(kbd_bit8) ret |= 0x80; //0b10000000;
150 if(clock_fast) ret |= 0x01; //0b00000001;
154 void FM7_MAINIO::set_port_fd00(uint8 data)
156 drec->write_signal(SIG_DATAREC_OUT, data, 0x01);
157 drec->write_signal(SIG_DATAREC_REMOTE, data, 0x02);
160 uint8 FM7_MAINIO::get_port_fd02(void)
163 // Still unimplemented printer.
164 ret = (cmt_indat) ? 0xff : 0x7f; // CMT
168 void FM7_MAINIO::set_port_fd02(uint8 val)
171 bool keyirq_bak = irqmask_keyboard;
172 bool timerirq_bak = irqmask_timer;
173 bool printerirq_bak = irqmask_printer;
174 bool mfdirq_bak = irqmask_mfd;
176 // if((val & 0b00010000) != 0) {
177 if((val & 0x10) != 0) {
182 if(mfdirq_bak != irqmask_mfd) {
186 //if((val & 0b00000100) != 0) {
187 if((val & 0x04) != 0) {
188 irqmask_timer = false;
190 irqmask_timer = true;
192 if(timerirq_bak != irqmask_timer) {
193 flag = irqstat_timer;
196 //if((val & 0b00000010) != 0) {
197 if((val & 0x02) != 0) {
198 irqmask_printer = false;
200 irqmask_printer = true;
202 if(printerirq_bak != irqmask_printer) {
203 flag = irqstat_printer;
204 set_irq_printer(flag);
207 //if((val & 0b00000001) != 0) {
208 if((val & 0x01) != 0) {
209 irqmask_keyboard = false;
211 irqmask_keyboard = true;
213 if(keyirq_bak != irqmask_keyboard) {
214 flag = irqstat_keyboard;
215 flag = flag & !irqmask_keyboard;
216 display->write_signal(SIG_FM7_SUB_KEY_FIRQ, flag ? 1 : 0, 1);
217 //printf("KEYBOARD: Interrupted %d\n", flag);
218 irqmask_keyboard = flag;
226 uint32 FM7_MAINIO::get_keyboard(void)
228 uint32 kbd_data = (uint32) kbd_bit7_0;
230 if(kbd_bit8) kbd_data |= 0x0100;
236 void FM7_MAINIO::set_irq_timer(bool flag)
238 uint8 backup = irqstat_reg0;
239 if(flag && !(irqmask_timer)) {
240 irqstat_reg0 &= ~0x04;
241 irqstat_timer = true;
242 if(backup != irqstat_reg0) do_irq(true);
244 irqstat_reg0 |= 0x04;
245 irqstat_timer = false;
246 if(backup != irqstat_reg0) do_irq(false);
248 //printf("IRQ TIMER: %02x MASK=%d\n", irqstat_reg0, irqmask_timer);
251 void FM7_MAINIO::set_irq_printer(bool flag)
253 uint8 backup = irqstat_reg0;
254 if(flag && !(irqmask_printer)) {
255 irqstat_reg0 &= ~0x02;
256 irqstat_printer = true;
257 if(backup != irqstat_reg0) do_irq(true);
259 irqstat_reg0 |= 0x02;
260 irqstat_printer = false;
261 if(backup != irqstat_reg0) do_irq(false);
263 // if(!irqmask_printer || !flag) do_irq(flag);
266 void FM7_MAINIO::set_irq_keyboard(bool flag)
268 uint8 backup = irqstat_reg0;
269 if(irqmask_keyboard) return;
271 irqstat_reg0 &= ~0x01;
272 irqstat_keyboard = true;
273 if(backup != irqstat_reg0) do_irq(true);
275 //irqstat_reg0 &= 0b11111110;
276 irqstat_reg0 |= 0x01;
277 irqstat_keyboard = false;
278 if(backup != irqstat_reg0) do_irq(false);
280 //printf("MAIN: KEYBOARD: IRQ=%d\n", flag && !(irqmask_keyboard));
283 void FM7_MAINIO::set_keyboard(uint32 data)
285 if((data & 0x100) != 0){
290 kbd_bit7_0 = (data & 0xff);
294 void FM7_MAINIO::do_irq(bool flag)
297 intstat = irqstat_timer | irqstat_keyboard | irqstat_printer;
298 intstat = intstat | irqstat_fdc;
299 intstat = intstat | intstat_opn | intstat_whg | intstat_thg;
300 intstat = intstat | intstat_mouse;
302 if(irqstat_bak == intstat) return;
303 //printf("%08d : IRQ: REG0=%02x FDC=%02x, stat=%d\n", SDL_GetTicks(), irqstat_reg0, irqstat_fdc, intstat);
305 maincpu->write_signal(SIG_CPU_IRQ, 1, 1);
307 maincpu->write_signal(SIG_CPU_IRQ, 0, 1);
309 irqstat_bak = intstat;
312 void FM7_MAINIO::do_firq(bool flag)
315 firq_stat = firq_break_key || firq_sub_attention;
316 //printf("%08d : FIRQ: break=%d attn=%d stat = %d\n", SDL_GetTicks(), firq_break_key, firq_sub_attention, firq_stat);
317 //if(firqstat_bak == firq_stat) return;
319 maincpu->write_signal(SIG_CPU_FIRQ, 1, 1);
321 maincpu->write_signal(SIG_CPU_FIRQ, 0, 1);
323 firqstat_bak = firq_stat;
326 void FM7_MAINIO::do_nmi(bool flag)
329 if(nmi_count >= 0x7ff0) {
334 if(nmi_count <= 1) maincpu->write_signal(SIG_CPU_NMI, 1, 1);
341 if(nmi_count == 0) maincpu->write_signal(SIG_CPU_NMI, 0, 1);
346 void FM7_MAINIO::set_break_key(bool pressed)
348 firq_break_key = pressed;
352 void FM7_MAINIO::set_sub_attention(bool flag)
354 firq_sub_attention = flag;
359 uint8 FM7_MAINIO::get_fd04(void)
361 //uint8 val = display->read_signal(SIG_DISPLAY_BUSY) | ~0x83;
363 if(sub_busy) val |= 0x80;
364 if(!firq_break_key) val |= 0x02;
365 if(!firq_sub_attention) {
368 set_sub_attention(false);
372 void FM7_MAINIO::set_fd04(uint8 val)
375 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
376 display->write_signal(SIG_DISPLAY_EXTRA_MODE, val, 0xff);
381 uint8 FM7_MAINIO::get_fd05(void)
383 // uint8 val = (display->read_signal(SIG_DISPLAY_BUSY) == 0) ? 0x00 : 0x80;
385 val = (sub_busy) ? 0x80 : 0x00;
386 if(!extdet_neg) val |= 0x01;
390 void FM7_MAINIO::set_fd05(uint8 val)
392 display->write_signal(SIG_FM7_SUB_CANCEL, val, 0x40); // HACK
393 display->write_signal(SIG_DISPLAY_HALT, val, 0x80);
395 if((val & 0x01) != 0) {
396 //maincpu->write_signal(SIG_CPU_BUSREQ, 1, 1);
397 //z80->write_signal(SIG_CPU_BUSREQ, 0, 1);
399 //maincpu->write_signal(SIG_CPU_BUSREQ, 0, 1);
400 //z80->write_signal(SIG_CPU_BUSREQ, 1, 1);
405 void FM7_MAINIO::set_extdet(bool flag)
410 // Kanji ROM, FD20 AND FD21 (or SUBSYSTEM)
411 void FM7_MAINIO::write_kanjiaddr_hi(uint8 addr)
413 if(!connect_kanjiroml1) return;
418 void FM7_MAINIO::write_kanjiaddr_lo(uint8 addr)
420 if(!connect_kanjiroml1) return;
425 uint8 FM7_MAINIO::read_kanjidata_left(void)
429 if(!connect_kanjiroml1) return 0xff;
432 //printf("KANJI MAIN CLASS1 ADDR: %05x\n", kaddress.w.l);
434 return kanjiclass1->read_data8(addr);
440 uint8 FM7_MAINIO::read_kanjidata_right(void)
444 if(!connect_kanjiroml1) return 0xff;
446 addr = (addr << 1) + 1;
448 return kanjiclass1->read_data8(addr);
454 #ifdef CAPABLE_KANJICLASS2
455 // Kanji ROM, FD20 AND FD21 (or SUBSYSTEM)
456 void FM7_MAINIO::write_kanjiaddr_hi_l2(uint8 addr)
458 if(!connect_kanjiroml2) return;
459 kaddress_l2.b.h = addr;
463 void FM7_MAINIO::write_kanjiaddr_lo_l2(uint8 addr)
465 if(!connect_kanjiroml2) return;
466 kaddress_l2.b.l = addr;
470 uint8 FM7_MAINIO::read_kanjidata_left_l2(void)
474 if(!connect_kanjiroml2) return 0xff;
478 return kanjiclass2->read_data8(addr);
484 uint8 FM7_MAINIO::read_kanjidata_right_l2(void)
488 if(!connect_kanjiroml2) return 0xff;
489 addr = kaddress_l2.w.l;
490 addr = (addr << 1) + 0x01;
492 return kanjiclass2->read_data8(addr);
501 void FM7_MAINIO::write_signal(int id, uint32 data, uint32 mask)
504 val_b = ((data & mask) != 0);
507 case FM7_MAINIO_CLOCKMODE: // fd00
516 #if defined(_FM77AV_VARIANTS) || defined(_FM77_VARIANTS)
520 clocks = 2016000; // Hz
522 clocks = 1230502; // (2016 * 1095 / 1794)[KHz]
526 clocks = 1565000; // Hz
528 clocks = 955226; // (1565 * 1095 / 1794)[KHz]
533 clocks = 1794000; // Hz
535 clocks = 1095000; // Hz
540 clocks = 1794000; // Hz
542 clocks = 1095000; // Hz
545 p_vm->set_cpu_clock(this->maincpu, clocks);
546 display->write_signal(SIG_DISPLAY_CLOCK, clock_fast ? 1 : 0, 1);
549 case FM7_MAINIO_CMT_RECV: // FD02
550 cmt_indat = val_b ^ cmt_invert;
552 case FM7_MAINIO_CMT_INVERT: // FD02
555 case FM7_MAINIO_TIMERIRQ: //
556 set_irq_timer(val_b);
558 case FM7_MAINIO_LPTIRQ: //
559 set_irq_printer(val_b);
561 case FM7_MAINIO_KEYBOARDIRQ: //
562 set_irq_keyboard(val_b);
564 case FM7_MAINIO_PUSH_KEYBOARD:
565 set_keyboard(data & 0x1ff);
568 case FM7_MAINIO_PUSH_BREAK:
569 set_break_key(val_b);
571 case FM7_MAINIO_SUB_ATTENTION:
572 set_sub_attention(val_b);
575 case FM7_MAINIO_SUB_BUSY:
578 case FM7_MAINIO_EXTDET:
581 case FM7_MAINIO_BEEP:
584 case FM7_MAINIO_JOYPORTA_CHANGED:
585 joyport_a = data & mask;
587 case FM7_MAINIO_JOYPORTB_CHANGED:
588 joyport_b = data & mask;
590 case FM7_MAINIO_PSG_IRQ:
592 case FM7_MAINIO_OPN_IRQ:
593 if(!connect_opn) break;
597 case FM7_MAINIO_WHG_IRQ:
598 if(!connect_whg) break;
602 case FM7_MAINIO_THG_IRQ:
603 if(!connect_thg) break;
607 case FM7_MAINIO_FDC_DRQ:
610 case FM7_MAINIO_FDC_IRQ:
613 case FM7_MAINIO_KANJI1_ADDR_HIGH:
616 case FM7_MAINIO_KANJI1_ADDR_LOW:
619 #if defined(CAPABLE_KANJI_CLASS2)
620 case FM7_MAINIO_KANJI2_ADDR_HIGH:
621 kaddress_l2.b.h = data;
623 case FM7_MAINIO_KANJI2_ADDR_LOW:
624 kaddress_l2.b.l = data;
632 uint8 FM7_MAINIO::get_irqstat_fd03(void)
637 extirq = irqstat_fdc | intstat_opn | intstat_whg | intstat_thg;
639 //extirq = extirq | intstat_syndet | intstat_rxrdy | intstat_txrdy;
641 irqstat_reg0 &= ~0x08;
643 irqstat_reg0 |= 0x08;
645 val = irqstat_reg0 | 0xf0;
646 set_irq_timer(false);
647 set_irq_printer(false);
651 uint8 FM7_MAINIO::get_extirq_fd17(void)
654 if(intstat_opn) val &= ~0x08;
655 if(intstat_mouse) val &= ~0x04;
656 //if(!intstat_opn && !intstat_mouse) do_irq(false);
660 void FM7_MAINIO::set_ext_fd17(uint8 data)
662 if((data & 0x04) != 0) {
665 mouse_enable = false;
669 #if defined(_FM77AV_VARIANTS)
671 uint8 FM7_MAINIO::subsystem_read_status(void)
674 retval = (display->read_signal(SIG_DISPLAY_MODE320) != 0) ? 0x40 : 0;
675 retval |= display->read_signal(SIG_DISPLAY_VSYNC);
676 retval |= display->read_signal(SIG_DISPLAY_DISPLAY);
682 uint32 FM7_MAINIO::read_signal(uint32 addr)
684 uint32 retval = 0xffffffff;
690 uint32 FM7_MAINIO::read_data8(uint32 addr)
693 if(addr == FM7_MAINIO_IS_BASICROM) {
695 if(stat_bootsw_basic) retval = 0xffffffff;
697 } else if(addr == FM7_MAINIO_BOOTMODE) {
698 retval = bootmode & 0x03;
699 #if defined(_FM77) || defined(_FM77L2) || defined(_FM77L4) || defined(_FM77AV_VARIANTS)
700 if(boot_ram) retval = 4;
703 } else if(addr == FM7_MAINIO_READ_FD0F) {
704 if(stat_romrammode) return 0xffffffff;
706 } else if(addr == FM7_MAINIO_CLOCKMODE) {
707 return (uint32)get_clockmode();
710 else if(addr == FM7_MAINIO_MMR_ENABLED) {
711 retval = (mmr_enabled) ? 0xffffffff:0x00000000;
713 } else if(addr == FM7_MAINIO_WINDOW_ENABLED) {
714 retval = (window_enabled) ? 0xffffffff:0x00000000;
716 } else if(addr == FM7_MAINIO_WINDOW_OFFSET) {
717 retval = (uint32)window_offset;
719 } else if(addr == FM7_MAINIO_MMR_SEGMENT) {
720 retval = (uint32) mmr_segment;
722 } else if((addr >= FM7_MAINIO_MMR_BANK) && (addr < (FM7_MAINIO_MMR_BANK + 16))) {
723 #if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX)
724 retval = (uint32)mmr_table[(addr - FM7_MAINIO_MMR_BANK) | (mmr_segment & 7) * 16];
726 retval = (uint32)mmr_table[(addr - FM7_MAINIO_MMR_BANK) | (mmr_segment & 3) * 16] & 0x3f;
731 #if defined(_FM77AV_VARIANTS)
732 else if(addr == FM7_MAINIO_INITROM_ENABLED) {
733 retval = (enable_initiator) ? 0xffffffff : 0x00000000;
735 } else if(addr == FM7_MAINIO_MODE320) {
736 retval = display->read_signal(SIG_DISPLAY_MODE320);
738 } else if(addr == FM7_MAINIO_SUBMONITOR_ROM) {
739 retval = sub_monitor_type & 0x03;
741 } else if(addr == FM7_MAINIO_SUBMONITOR_RAM) {
742 #if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX)
743 retval = ((sub_monitor_type & 0x04) != 0) ? 0xffffffff : 0x00000000;
750 #if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX)
751 else if(addr == FM7_MAINIO_EXTBANK) {
752 } else if(addr == FM7_MAINIO_EXTROM) {
755 //if((addr >= 0x0006) && (addr != 0x1f)) printf("MAINIO: READ: %08x DATA=%08x\n", addr);
759 if((addr < 0x90) && (addr >= 0x80)) {
760 #if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX)
761 return mmr_table[addr - 0x80 + mmr_segment * 16];
763 return mmr_table[addr - 0x80 + (mmr_segment & 0x03) * 16];
767 // if((addr >= 0x0006) && !(addr == 0x1f) && !(addr == 0x0b)) printf("MAINIO: READ: %08x \n", addr);
770 retval = (uint32) get_port_fd00();
773 display->write_signal(SIG_FM7_SUB_KEY_FIRQ, 0, 1);
774 set_irq_keyboard(false);
775 retval = (uint32) kbd_bit7_0;
778 retval = (uint32) get_port_fd02();
781 retval = (uint32) get_irqstat_fd03();
784 retval = (uint32) get_fd04();
787 retval = (uint32) get_fd05();
789 case 0x06: // RS-232C
792 case 0x08: // Light pen
796 #if defined(_FM77AV_VARIANTS)
798 retval = (bootmode == 0) ? 0xfe : 0xff;
801 case 0x0e: // PSG DATA
802 retval = (uint32) get_psg();
803 //printf("PSG DATA READ val=%02x\n", retval);
809 #if defined(_FM77AV_VARIANTS)
811 retval = subsystem_read_status();
814 case 0x15: // OPN CMD
815 //printf("OPN CMD READ \n");
817 case 0x16: // OPN DATA
818 retval = (uint32) get_opn(0);
819 //printf("OPN DATA READ val=%02x\n", retval);
822 retval = (uint32) get_extirq_fd17();
824 case 0x18: // FDC: STATUS
825 retval = (uint32) get_fdc_stat();
826 //printf("FDC: READ STATUS %02x PC=%04x\n", retval, maincpu->get_pc());
828 case 0x19: // FDC: Track
829 retval = (uint32) get_fdc_track();
830 //printf("FDC: READ TRACK REG %02x\n", retval);
832 case 0x1a: // FDC: Sector
833 retval = (uint32) get_fdc_sector();
834 //printf("FDC: READ SECTOR REG %02x\n", retval);
836 case 0x1b: // FDC: Data
837 retval = (uint32) get_fdc_data();
840 retval = (uint32) get_fdc_fd1c();
841 //printf("FDC: READ HEAD REG %02x\n", retval);
844 retval = (uint32) get_fdc_motor();
845 //printf("FDC: READ MOTOR REG %02x\n", retval);
848 retval = (uint32) fdc_getdrqirq();
850 case 0x22: // Kanji ROM
851 retval = (uint32) read_kanjidata_left();
853 case 0x23: // Kanji ROM
854 retval = (uint32) read_kanjidata_right();
856 #if defined(CAPABLE_KANJI_CLASS2)
857 case 0x2e: // Kanji ROM Level2
858 retval = (uint32) read_kanjidata_left_l2();
860 case 0x2f: // Kanji ROM Level2
861 retval = (uint32) read_kanjidata_right_l2();
864 case 0x37: // Multi page
865 //retval = (uint32)display->read_data8(DISPLAY_ADDR_MULTIPAGE);
867 case 0x45: // WHG CMD
869 case 0x46: // WHG DATA
870 retval = (uint32) get_opn(1);
873 retval = (uint32) get_extirq_whg();
875 case 0x51: // THG CMD
877 case 0x52: // THG DATA
878 retval = (uint32) get_opn(2);
881 retval = (uint32) get_extirq_thg();
886 if(boot_ram) retval |= 0x01;
887 if(window_enabled) retval |= 0x40;
888 if(mmr_enabled) retval |= 0x80;
892 //printf("MAIN: Read another I/O Addr=%08x\n", addr);
895 if((addr < 0x40) && (addr >= 0x38)) {
896 addr = (addr - 0x38) + FM7_SUBMEM_OFFSET_DPALETTE;
897 return (uint32) display->read_data8(addr);
903 void FM7_MAINIO::write_data8(uint32 addr, uint32 data)
906 if(addr == FM7_MAINIO_BOOTMODE) {
907 bootmode = data & 0x03;
909 } else if(addr == FM7_MAINIO_CLOCKMODE) {
910 set_clockmode((uint8)data);
913 //if((addr >= 0x0006) && !(addr == 0x1f)) printf("MAINIO: WRITE: %08x DATA=%08x\n", addr, data);
918 if((addr < 0x90) && (addr >= 0x80)) {
919 #if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX)
920 mmr_table[addr - 0x80 + mmr_segment * 16] = data;
922 mmr_table[addr - 0x80 + (mmr_segment & 0x03) * 16] = data & 0x3f;
924 //printf("MMR: Write access segment=%02x addr=%02x page=%02x\n", mmr_segment, addr - 0x80, data);
930 set_port_fd00((uint8)data);
934 // set_lptdata_fd01((uint8)data);
937 set_port_fd02((uint8)data);
943 // set_flags_fd04(data);
946 set_fd05((uint8)data);
948 case 0x06: // RS-232C
951 case 0x08: // Light pen
956 //printf("PSG CMD WRITE val=%02x\n", data);
960 //printf("PSG DATA WRITE val=%02x\n", data);
966 #if defined(_FM77AV_VARIANTS)
968 flag = enable_initiator;
969 //printf("INITIATOR ENABLE = %02x\n", data);
970 enable_initiator = ((data & 0x02) == 0) ? true : false;
971 if(flag != enable_initiator) {
977 //mode320 = ((data & 0x40) != 0);
978 display->write_signal(SIG_DISPLAY_MODE320, data, 0x40);
981 display->write_signal(SIG_FM7_SUB_BANK, data, 0x07);
984 case 0x15: // OPN CMD
985 //printf("OPN CMD WRITE val=%02x\n", data);
986 set_opn_cmd(0, data);
988 case 0x16: // OPN DATA
989 //printf("OPN DATA WRITE val=%02x\n", data);
993 set_ext_fd17((uint8)data);
995 case 0x18: // FDC: COMMAND
996 set_fdc_cmd((uint8)data);
997 //printf("FDC: WRITE CMD %02x\n", data);
999 case 0x19: // FDC: Track
1000 set_fdc_track((uint8)data);
1001 //printf("FDC: WRITE TRACK REG %02x\n", data);
1003 case 0x1a: // FDC: Sector
1004 set_fdc_sector((uint8)data);
1005 //printf("FDC: WRITE SECTOR REG %02x\n", data);
1007 case 0x1b: // FDC: Data
1008 set_fdc_data((uint8)data);
1011 set_fdc_fd1c((uint8)data);
1012 //printf("FDC: WRITE HEAD REG %02x\n", data);
1015 set_fdc_fd1d((uint8)data);
1016 //printf("FDC: WRITE MOTOR REG %02x\n", data);
1021 case 0x20: // Kanji ROM
1022 case 0x2c: // Kanji ROM(DUP)
1023 write_kanjiaddr_hi((uint8)data);
1024 #if defined(CAPABLE_KANJI_CLASS2)
1025 write_kanjiaddr_hi_l2((uint8)data);
1028 case 0x21: // Kanji ROM
1029 case 0x2d: // Kanji ROM(DUP)
1030 write_kanjiaddr_lo((uint8)data);
1031 #if defined(CAPABLE_KANJI_CLASS2)
1032 write_kanjiaddr_lo_l2((uint8)data);
1035 #if defined(_FM77AV_VARIANTS)
1037 display->write_data8(FM7_SUBMEM_OFFSET_APALETTE_HI, data);
1040 display->write_data8(FM7_SUBMEM_OFFSET_APALETTE_LO, data);
1043 display->write_data8(FM7_SUBMEM_OFFSET_APALETTE_B, data);
1046 display->write_data8(FM7_SUBMEM_OFFSET_APALETTE_R, data);
1049 display->write_data8(FM7_SUBMEM_OFFSET_APALETTE_G, data);
1052 case 0x37: // Multi page
1053 display->write_signal(SIG_FM7_SUB_MULTIPAGE, data, 0x00ff);
1055 case 0x45: // WHG CMD
1056 set_opn_cmd(1, data);
1058 case 0x46: // WHG DATA
1063 case 0x51: // THG CMD
1064 set_opn_cmd(2, data);
1066 case 0x52: // THG DATA
1071 #if defined(HAS_MMR)
1073 #if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX)
1074 mmr_segment = data & 7;
1076 // printf("MMR SEGMENT: %02x\n", data & 3);
1077 mmr_segment = data & 3;
1081 window_offset = data & 0x00ff;
1084 if((data & 0x01) == 0) {
1089 if((data & 0x40) == 0) {
1090 window_enabled = false;
1092 window_enabled = true;
1095 if((data & 0x80) == 0) {
1096 mmr_enabled = false;
1100 if(flag != mmr_enabled) {
1101 this->write_signal(FM7_MAINIO_CLOCKMODE, clock_fast ? 1 : 0, 1);
1106 //printf("MAIN: Write I/O Addr=%08x DATA=%02x\n", addr, data);
1109 if((addr < 0x40) && (addr >= 0x38)) {
1110 addr = (addr - 0x38) | FM7_SUBMEM_OFFSET_DPALETTE;
1111 display->write_data8(addr, (uint8)data);
1117 void FM7_MAINIO::event_callback(int event_id, int err)
1119 // printf("MAIN EVENT id=%d\n", event_id);
1121 case EVENT_BEEP_OFF:
1124 case EVENT_BEEP_CYCLE:
1127 case EVENT_UP_BREAK:
1128 set_break_key(false);
1130 case EVENT_TIMERIRQ_ON:
1131 if(!irqmask_timer) set_irq_timer(true);
1132 //register_event(this, EVENT_TIMERIRQ_OFF, 10000.0 / (4.9152 * 2.0) , false, NULL); // TIMER IRQ
1134 case EVENT_TIMERIRQ_OFF:
1135 if(!irqmask_timer) set_irq_timer(false);
1136 //register_event(this, EVENT_TIMERIRQ_ON, 2035, false, NULL); // TIMER ON
1138 case EVENT_FD_MOTOR_ON:
1139 set_fdc_motor(true);
1141 case EVENT_FD_MOTOR_OFF:
1142 set_fdc_motor(false);
1150 void FM7_MAINIO::update_config(void)
1152 switch(config.cpu_type){
1160 // this->write_signal(FM7_MAINIO_CLOCKMODE, clock_fast ? 1 : 0, 1);