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;
49 void FM7_MAINIO::reset(void)
53 //if(event_beep >= 0) cancel_event(this, event_beep);
54 if(event_timerirq >= 0) cancel_event(this, event_timerirq);
60 stat_romrammode = true;
61 bootmode = config.boot_mode & 3;
62 if(bootmode == 0) { // IF BASIC BOOT THEN ROM
63 stat_romrammode = true;
65 stat_romrammode = false;
67 #if defined(_FM77_VARIANTS) || defined(_FM77AV_VARIANTS)
71 #if defined(_FM77AV_VARIANTS)
73 sub_monitor_type = 0x00;
79 window_enabled = false;
82 if(config.cpu_type == 0) clock_fast = true;
92 irqmask_printer = true;
93 irqmask_keyboard = true;
95 irqstat_timer = false;
96 irqstat_printer = false;
97 irqstat_keyboard = false;
100 //firq_break_key = false; // bit1, ON = '0'.
101 firq_sub_attention = false; // bit0, ON = '0'.
104 sub_cancel = false; // bit6 : '1' Cancel req.
109 register_event(this, EVENT_TIMERIRQ_ON, 10000.0 / 4.9152, true, &event_timerirq); // TIMER IRQ
115 void FM7_MAINIO::set_clockmode(uint8 flags)
117 if(flags == FM7_MAINCLOCK_SLOW) {
124 uint8 FM7_MAINIO::get_clockmode(void)
126 if(!clock_fast) return FM7_MAINCLOCK_SLOW;
127 return FM7_MAINCLOCK_HIGH;
131 uint8 FM7_MAINIO::get_port_fd00(void)
133 uint8 ret = 0x7e; //0b01111110;
134 if(kbd_bit8) ret |= 0x80; //0b10000000;
135 if(clock_fast) ret |= 0x01; //0b00000001;
139 void FM7_MAINIO::set_port_fd00(uint8 data)
141 drec->write_signal(SIG_DATAREC_OUT, data, 0x01);
142 drec->write_signal(SIG_DATAREC_REMOTE, data, 0x02);
145 uint8 FM7_MAINIO::get_port_fd02(void)
148 // Still unimplemented printer.
149 ret = (cmt_indat) ? 0xff : 0x7f; // CMT
153 void FM7_MAINIO::set_port_fd02(uint8 val)
156 bool keyirq_bak = irqmask_keyboard;
157 bool timerirq_bak = irqmask_timer;
158 bool printerirq_bak = irqmask_printer;
159 bool mfdirq_bak = irqmask_mfd;
161 // if((val & 0b00010000) != 0) {
162 if((val & 0x10) != 0) {
167 if(mfdirq_bak != irqmask_mfd) {
171 //if((val & 0b00000100) != 0) {
172 if((val & 0x04) != 0) {
173 irqmask_timer = false;
175 irqmask_timer = true;
177 if(timerirq_bak != irqmask_timer) {
178 flag = irqstat_timer;
181 //if((val & 0b00000010) != 0) {
182 if((val & 0x02) != 0) {
183 irqmask_printer = false;
185 irqmask_printer = true;
187 if(printerirq_bak != irqmask_printer) {
188 flag = irqstat_printer;
189 set_irq_printer(flag);
192 //if((val & 0b00000001) != 0) {
193 if((val & 0x01) != 0) {
194 irqmask_keyboard = false;
196 irqmask_keyboard = true;
198 if(keyirq_bak != irqmask_keyboard) {
199 flag = irqstat_keyboard;
200 flag = flag & !irqmask_keyboard;
201 display->write_signal(SIG_FM7_SUB_KEY_FIRQ, flag ? 1 : 0, 1);
202 //printf("KEYBOARD: Interrupted %d\n", flag);
203 irqmask_keyboard = flag;
211 uint32 FM7_MAINIO::get_keyboard(void)
213 uint32 kbd_data = (uint32) kbd_bit7_0;
215 if(kbd_bit8) kbd_data |= 0x0100;
221 void FM7_MAINIO::set_irq_timer(bool flag)
223 uint8 backup = irqstat_reg0;
224 if(flag && !(irqmask_timer)) {
225 irqstat_reg0 &= ~0x04;
226 irqstat_timer = true;
227 if(backup != irqstat_reg0) do_irq(true);
229 irqstat_reg0 |= 0x04;
230 irqstat_timer = false;
231 if(backup != irqstat_reg0) do_irq(false);
233 //printf("IRQ TIMER: %02x MASK=%d\n", irqstat_reg0, irqmask_timer);
236 void FM7_MAINIO::set_irq_printer(bool flag)
238 uint8 backup = irqstat_reg0;
239 if(flag && !(irqmask_printer)) {
240 irqstat_reg0 &= ~0x02;
241 irqstat_printer = true;
242 if(backup != irqstat_reg0) do_irq(true);
244 irqstat_reg0 |= 0x02;
245 irqstat_printer = false;
246 if(backup != irqstat_reg0) do_irq(false);
248 // if(!irqmask_printer || !flag) do_irq(flag);
251 void FM7_MAINIO::set_irq_keyboard(bool flag)
253 uint8 backup = irqstat_reg0;
254 if(irqmask_keyboard) return;
256 irqstat_reg0 &= ~0x01;
257 irqstat_keyboard = true;
258 if(backup != irqstat_reg0) do_irq(true);
260 //irqstat_reg0 &= 0b11111110;
261 irqstat_reg0 |= 0x01;
262 irqstat_keyboard = false;
263 if(backup != irqstat_reg0) do_irq(false);
265 //printf("MAIN: KEYBOARD: IRQ=%d\n", flag && !(irqmask_keyboard));
268 void FM7_MAINIO::set_keyboard(uint32 data)
270 if((data & 0x100) != 0){
275 kbd_bit7_0 = (data & 0xff);
279 void FM7_MAINIO::do_irq(bool flag)
282 intstat = irqstat_timer | irqstat_keyboard | irqstat_printer;
283 intstat = intstat | irqstat_fdc;
284 intstat = intstat | intstat_opn | intstat_whg | intstat_thg;
285 intstat = intstat | intstat_mouse;
287 if(irqstat_bak == intstat) return;
288 //printf("%08d : IRQ: REG0=%02x FDC=%02x, stat=%d\n", SDL_GetTicks(), irqstat_reg0, irqstat_fdc, intstat);
290 maincpu->write_signal(SIG_CPU_IRQ, 1, 1);
292 maincpu->write_signal(SIG_CPU_IRQ, 0, 1);
294 irqstat_bak = intstat;
297 void FM7_MAINIO::do_firq(bool flag)
300 firq_stat = firq_break_key || firq_sub_attention;
301 //printf("%08d : FIRQ: break=%d attn=%d stat = %d\n", SDL_GetTicks(), firq_break_key, firq_sub_attention, firq_stat);
302 //if(firqstat_bak == firq_stat) return;
304 maincpu->write_signal(SIG_CPU_FIRQ, 1, 1);
306 maincpu->write_signal(SIG_CPU_FIRQ, 0, 1);
308 firqstat_bak = firq_stat;
311 void FM7_MAINIO::do_nmi(bool flag)
314 if(nmi_count >= 0x7ff0) {
319 if(nmi_count <= 1) maincpu->write_signal(SIG_CPU_NMI, 1, 1);
326 if(nmi_count == 0) maincpu->write_signal(SIG_CPU_NMI, 0, 1);
331 void FM7_MAINIO::set_break_key(bool pressed)
333 firq_break_key = pressed;
337 void FM7_MAINIO::set_sub_attention(bool flag)
339 firq_sub_attention = flag;
344 uint8 FM7_MAINIO::get_fd04(void)
346 uint8 val = display->read_signal(SIG_DISPLAY_BUSY) | ~0x03;
347 if(!firq_break_key) val |= 0x02;
348 if(!firq_sub_attention) {
351 set_sub_attention(false);
356 void FM7_MAINIO::set_fd04(uint8 val)
359 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
360 display->write_signal(SIG_DISPLAY_EXTRA_MODE, val, 0xff);
365 uint8 FM7_MAINIO::get_fd05(void)
367 uint8 val = display->read_signal(SIG_DISPLAY_BUSY) | ~0x81;
368 if(!extdet_neg) val |= 0x01;
372 void FM7_MAINIO::set_fd05(uint8 val)
374 display->write_signal(SIG_FM7_SUB_CANCEL, val, 0x40); // HACK
375 display->write_signal(SIG_DISPLAY_HALT, val, 0x80);
377 if((val & 0x01) != 0) {
378 //maincpu->write_signal(SIG_CPU_BUSREQ, 1, 1);
379 //z80->write_signal(SIG_CPU_BUSREQ, 0, 1);
381 //maincpu->write_signal(SIG_CPU_BUSREQ, 0, 1);
382 //z80->write_signal(SIG_CPU_BUSREQ, 1, 1);
387 void FM7_MAINIO::set_extdet(bool flag)
392 // Kanji ROM, FD20 AND FD21 (or SUBSYSTEM)
393 void FM7_MAINIO::write_kanjiaddr_hi(uint8 addr)
395 if(!connect_kanjiroml1) return;
400 void FM7_MAINIO::write_kanjiaddr_lo(uint8 addr)
402 if(!connect_kanjiroml1) return;
407 uint8 FM7_MAINIO::read_kanjidata_left(void)
411 if(!connect_kanjiroml1) return 0xff;
414 //printf("KANJI MAIN CLASS1 ADDR: %05x\n", kaddress.w.l);
416 return kanjiclass1->read_data8(addr);
422 uint8 FM7_MAINIO::read_kanjidata_right(void)
426 if(!connect_kanjiroml1) return 0xff;
428 addr = (addr << 1) + 1;
430 return kanjiclass1->read_data8(addr);
436 #ifdef CAPABLE_KANJICLASS2
437 // Kanji ROM, FD20 AND FD21 (or SUBSYSTEM)
438 void FM7_MAINIO::write_kanjiaddr_hi_l2(uint8 addr)
440 if(!connect_kanjiroml2) return;
441 kaddress_l2.b.h = addr;
445 void FM7_MAINIO::write_kanjiaddr_lo_l2(uint8 addr)
447 if(!connect_kanjiroml2) return;
448 kaddress_l2.b.l = addr;
452 uint8 FM7_MAINIO::read_kanjidata_left_l2(void)
456 if(!connect_kanjiroml2) return 0xff;
460 return kanjiclass2->read_data8(addr);
466 uint8 FM7_MAINIO::read_kanjidata_right_l2(void)
470 if(!connect_kanjiroml2) return 0xff;
471 addr = kaddress_l2.w.l;
472 addr = (addr << 1) + 0x01;
474 return kanjiclass2->read_data8(addr);
483 void FM7_MAINIO::write_signal(int id, uint32 data, uint32 mask)
486 val_b = ((data & mask) != 0);
489 case FM7_MAINIO_CLOCKMODE: // fd00
498 #if defined(_FM77AV_VARIANTS) || defined(_FM77_VARIANTS)
502 clocks = 2016000; // Hz
504 clocks = 1230502; // (2016 * 1095 / 1794)[KHz]
508 clocks = 1565000; // Hz
510 clocks = 955226; // (1565 * 1095 / 1794)[KHz]
515 clocks = 1794000; // Hz
517 clocks = 1095000; // Hz
522 clocks = 1794000; // Hz
524 clocks = 1095000; // Hz
528 subclocks = 2000000; // Hz
530 subclocks = 999000; // Hz
532 p_vm->set_cpu_clock(this->maincpu, clocks);
533 p_vm->set_cpu_clock(this->subcpu, subclocks);
536 case FM7_MAINIO_CMT_RECV: // FD02
537 cmt_indat = val_b ^ cmt_invert;
539 case FM7_MAINIO_CMT_INVERT: // FD02
542 case FM7_MAINIO_TIMERIRQ: //
543 set_irq_timer(val_b);
545 case FM7_MAINIO_LPTIRQ: //
546 set_irq_printer(val_b);
548 case FM7_MAINIO_KEYBOARDIRQ: //
549 set_irq_keyboard(val_b);
551 case FM7_MAINIO_PUSH_KEYBOARD:
552 set_keyboard(data & 0x1ff);
555 case FM7_MAINIO_PUSH_BREAK:
556 set_break_key(val_b);
558 case FM7_MAINIO_SUB_ATTENTION:
559 set_sub_attention(val_b);
562 case FM7_MAINIO_SUB_BUSY:
564 case FM7_MAINIO_EXTDET:
567 case FM7_MAINIO_BEEP:
570 case FM7_MAINIO_JOYPORTA_CHANGED:
571 joyport_a = data & mask;
573 case FM7_MAINIO_JOYPORTB_CHANGED:
574 joyport_b = data & mask;
576 case FM7_MAINIO_PSG_IRQ:
578 case FM7_MAINIO_OPN_IRQ:
579 if(!connect_opn) break;
583 case FM7_MAINIO_WHG_IRQ:
584 if(!connect_whg) break;
588 case FM7_MAINIO_THG_IRQ:
589 if(!connect_thg) break;
593 case FM7_MAINIO_FDC_DRQ:
596 case FM7_MAINIO_FDC_IRQ:
599 case FM7_MAINIO_KANJI1_ADDR_HIGH:
602 case FM7_MAINIO_KANJI1_ADDR_LOW:
605 #if defined(CAPABLE_KANJI_CLASS2)
606 case FM7_MAINIO_KANJI2_ADDR_HIGH:
607 kaddress_l2.b.h = data;
609 case FM7_MAINIO_KANJI2_ADDR_LOW:
610 kaddress_l2.b.l = data;
618 uint8 FM7_MAINIO::get_irqstat_fd03(void)
623 extirq = irqstat_fdc | intstat_opn | intstat_whg | intstat_thg;
625 //extirq = extirq | intstat_syndet | intstat_rxrdy | intstat_txrdy;
627 irqstat_reg0 &= ~0x08;
629 irqstat_reg0 |= 0x08;
631 val = irqstat_reg0 | 0xf0;
632 set_irq_timer(false);
633 set_irq_printer(false);
637 uint8 FM7_MAINIO::get_extirq_fd17(void)
640 if(intstat_opn) val &= ~0x08;
641 if(intstat_mouse) val &= ~0x04;
642 //if(!intstat_opn && !intstat_mouse) do_irq(false);
646 void FM7_MAINIO::set_ext_fd17(uint8 data)
648 if((data & 0x04) != 0) {
651 mouse_enable = false;
655 #if defined(_FM77AV_VARIANTS)
657 uint8 FM7_MAINIO::subsystem_read_status(void)
660 retval = (display->read_signal(SIG_DISPLAY_MODE320) != 0) ? 0x40 : 0;
661 retval |= display->read_signal(SIG_DISPLAY_VSYNC);
662 retval |= display->read_signal(SIG_DISPLAY_DISPLAY);
668 uint32 FM7_MAINIO::read_signal(uint32 addr)
670 uint32 retval = 0xffffffff;
676 uint32 FM7_MAINIO::read_data8(uint32 addr)
679 if(addr == FM7_MAINIO_IS_BASICROM) {
681 if(stat_bootsw_basic) retval = 0xffffffff;
683 } else if(addr == FM7_MAINIO_BOOTMODE) {
684 retval = bootmode & 0x03;
685 #if defined(_FM77) || defined(_FM77L2) || defined(_FM77L4) || defined(_FM77AV_VARIANTS)
686 if(boot_ram) retval = 4;
689 } else if(addr == FM7_MAINIO_READ_FD0F) {
690 if(stat_romrammode) return 0xffffffff;
692 } else if(addr == FM7_MAINIO_CLOCKMODE) {
693 return (uint32)get_clockmode();
696 else if(addr == FM7_MAINIO_MMR_ENABLED) {
697 retval = (mmr_enabled) ? 0xffffffff:0x00000000;
699 } else if(addr == FM7_MAINIO_WINDOW_ENABLED) {
700 retval = (window_enabled) ? 0xffffffff:0x00000000;
702 } else if(addr == FM7_MAINIO_WINDOW_OFFSET) {
703 retval = (uint32)window_offset;
705 } else if(addr == FM7_MAINIO_MMR_SEGMENT) {
706 retval = (uint32) mmr_segment;
708 } else if((addr >= FM7_MAINIO_MMR_BANK) && (addr < (FM7_MAINIO_MMR_BANK + 16))) {
709 #if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX)
710 retval = (uint32)mmr_table[(addr - FM7_MAINIO_MMR_BANK) | (mmr_segment & 7) * 16];
712 retval = (uint32)mmr_table[(addr - FM7_MAINIO_MMR_BANK) | (mmr_segment & 3) * 16] & 0x3f;
717 #if defined(_FM77AV_VARIANTS)
718 else if(addr == FM7_MAINIO_INITROM_ENABLED) {
719 retval = (enable_initiator) ? 0xffffffff : 0x00000000;
721 } else if(addr == FM7_MAINIO_MODE320) {
722 retval = display->read_signal(SIG_DISPLAY_MODE320);
724 } else if(addr == FM7_MAINIO_SUBMONITOR_ROM) {
725 retval = sub_monitor_type & 0x03;
727 } else if(addr == FM7_MAINIO_SUBMONITOR_RAM) {
728 #if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX)
729 retval = ((sub_monitor_type & 0x04) != 0) ? 0xffffffff : 0x00000000;
736 #if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX)
737 else if(addr == FM7_MAINIO_EXTBANK) {
738 } else if(addr == FM7_MAINIO_EXTROM) {
741 //if((addr >= 0x0006) && (addr != 0x1f)) printf("MAINIO: READ: %08x DATA=%08x\n", addr);
745 if((addr < 0x90) && (addr >= 0x80)) {
746 #if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX)
747 return mmr_table[addr - 0x80 + mmr_segment * 16];
749 return mmr_table[addr - 0x80 + (mmr_segment & 0x03) * 16];
753 // if((addr >= 0x0006) && !(addr == 0x1f) && !(addr == 0x0b)) printf("MAINIO: READ: %08x \n", addr);
756 retval = (uint32) get_port_fd00();
759 display->write_signal(SIG_FM7_SUB_KEY_FIRQ, 0, 1);
760 set_irq_keyboard(false);
761 retval = (uint32) kbd_bit7_0;
764 retval = (uint32) get_port_fd02();
767 retval = (uint32) get_irqstat_fd03();
770 retval = (uint32) get_fd04();
773 retval = (uint32) get_fd05();
775 case 0x06: // RS-232C
778 case 0x08: // Light pen
782 #if defined(_FM77AV_VARIANTS)
784 retval = (bootmode == 0) ? 0xfe : 0xff;
787 case 0x0e: // PSG DATA
788 retval = (uint32) get_psg();
789 //printf("PSG DATA READ val=%02x\n", retval);
795 #if defined(_FM77AV_VARIANTS)
797 retval = subsystem_read_status();
800 case 0x15: // OPN CMD
801 //printf("OPN CMD READ \n");
803 case 0x16: // OPN DATA
804 retval = (uint32) get_opn(0);
805 //printf("OPN DATA READ val=%02x\n", retval);
808 retval = (uint32) get_extirq_fd17();
810 case 0x18: // FDC: STATUS
811 retval = (uint32) get_fdc_stat();
812 //printf("FDC: READ STATUS %02x PC=%04x\n", retval, maincpu->get_pc());
814 case 0x19: // FDC: Track
815 retval = (uint32) get_fdc_track();
816 //printf("FDC: READ TRACK REG %02x\n", retval);
818 case 0x1a: // FDC: Sector
819 retval = (uint32) get_fdc_sector();
820 //printf("FDC: READ SECTOR REG %02x\n", retval);
822 case 0x1b: // FDC: Data
823 retval = (uint32) get_fdc_data();
826 retval = (uint32) get_fdc_fd1c();
827 //printf("FDC: READ HEAD REG %02x\n", retval);
830 retval = (uint32) get_fdc_motor();
831 //printf("FDC: READ MOTOR REG %02x\n", retval);
834 retval = (uint32) fdc_getdrqirq();
836 case 0x22: // Kanji ROM
837 retval = (uint32) read_kanjidata_left();
839 case 0x23: // Kanji ROM
840 retval = (uint32) read_kanjidata_right();
842 #if defined(CAPABLE_KANJI_CLASS2)
843 case 0x2e: // Kanji ROM Level2
844 retval = (uint32) read_kanjidata_left_l2();
846 case 0x2f: // Kanji ROM Level2
847 retval = (uint32) read_kanjidata_right_l2();
850 case 0x37: // Multi page
851 //retval = (uint32)display->read_data8(DISPLAY_ADDR_MULTIPAGE);
853 case 0x45: // WHG CMD
855 case 0x46: // WHG DATA
856 retval = (uint32) get_opn(1);
859 retval = (uint32) get_extirq_whg();
861 case 0x51: // THG CMD
863 case 0x52: // THG DATA
864 retval = (uint32) get_opn(2);
867 retval = (uint32) get_extirq_thg();
872 if(boot_ram) retval |= 0x01;
873 if(window_enabled) retval |= 0x40;
874 if(mmr_enabled) retval |= 0x80;
878 //printf("MAIN: Read another I/O Addr=%08x\n", addr);
881 if((addr < 0x40) && (addr >= 0x38)) {
882 addr = (addr - 0x38) + FM7_SUBMEM_OFFSET_DPALETTE;
883 return (uint32) display->read_data8(addr);
889 void FM7_MAINIO::write_data8(uint32 addr, uint32 data)
892 if(addr == FM7_MAINIO_BOOTMODE) {
893 bootmode = data & 0x03;
895 } else if(addr == FM7_MAINIO_CLOCKMODE) {
896 set_clockmode((uint8)data);
899 //if((addr >= 0x0006) && !(addr == 0x1f)) printf("MAINIO: WRITE: %08x DATA=%08x\n", addr, data);
904 if((addr < 0x90) && (addr >= 0x80)) {
905 #if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX)
906 mmr_table[addr - 0x80 + mmr_segment * 16] = data;
908 mmr_table[addr - 0x80 + (mmr_segment & 0x03) * 16] = data & 0x3f;
910 //printf("MMR: Write access segment=%02x addr=%02x page=%02x\n", mmr_segment, addr - 0x80, data);
916 set_port_fd00((uint8)data);
920 // set_lptdata_fd01((uint8)data);
923 set_port_fd02((uint8)data);
929 // set_flags_fd04(data);
932 set_fd05((uint8)data);
934 case 0x06: // RS-232C
937 case 0x08: // Light pen
942 //printf("PSG CMD WRITE val=%02x\n", data);
946 //printf("PSG DATA WRITE val=%02x\n", data);
952 #if defined(_FM77AV_VARIANTS)
954 flag = enable_initiator;
955 //printf("INITIATOR ENABLE = %02x\n", data);
956 enable_initiator = ((data & 0x02) == 0) ? true : false;
957 if(flag != enable_initiator) {
963 //mode320 = ((data & 0x40) != 0);
964 display->write_signal(SIG_DISPLAY_MODE320, data, 0x40);
967 display->write_signal(SIG_FM7_SUB_BANK, data, 0x07);
970 case 0x15: // OPN CMD
971 //printf("OPN CMD WRITE val=%02x\n", data);
972 set_opn_cmd(0, data);
974 case 0x16: // OPN DATA
975 //printf("OPN DATA WRITE val=%02x\n", data);
979 set_ext_fd17((uint8)data);
981 case 0x18: // FDC: COMMAND
982 set_fdc_cmd((uint8)data);
983 //printf("FDC: WRITE CMD %02x\n", data);
985 case 0x19: // FDC: Track
986 set_fdc_track((uint8)data);
987 //printf("FDC: WRITE TRACK REG %02x\n", data);
989 case 0x1a: // FDC: Sector
990 set_fdc_sector((uint8)data);
991 //printf("FDC: WRITE SECTOR REG %02x\n", data);
993 case 0x1b: // FDC: Data
994 set_fdc_data((uint8)data);
997 set_fdc_fd1c((uint8)data);
998 //printf("FDC: WRITE HEAD REG %02x\n", data);
1001 set_fdc_fd1d((uint8)data);
1002 //printf("FDC: WRITE MOTOR REG %02x\n", data);
1007 case 0x20: // Kanji ROM
1008 case 0x2c: // Kanji ROM(DUP)
1009 write_kanjiaddr_hi((uint8)data);
1010 #if defined(CAPABLE_KANJI_CLASS2)
1011 write_kanjiaddr_hi_l2((uint8)data);
1014 case 0x21: // Kanji ROM
1015 case 0x2d: // Kanji ROM(DUP)
1016 write_kanjiaddr_lo((uint8)data);
1017 #if defined(CAPABLE_KANJI_CLASS2)
1018 write_kanjiaddr_lo_l2((uint8)data);
1021 #if defined(_FM77AV_VARIANTS)
1023 display->write_data8(FM7_SUBMEM_OFFSET_APALETTE_HI, data);
1026 display->write_data8(FM7_SUBMEM_OFFSET_APALETTE_LO, data);
1029 display->write_data8(FM7_SUBMEM_OFFSET_APALETTE_B, data);
1032 display->write_data8(FM7_SUBMEM_OFFSET_APALETTE_R, data);
1035 display->write_data8(FM7_SUBMEM_OFFSET_APALETTE_G, data);
1038 case 0x37: // Multi page
1039 display->write_signal(SIG_FM7_SUB_MULTIPAGE, data, 0x00ff);
1041 case 0x45: // WHG CMD
1042 set_opn_cmd(1, data);
1044 case 0x46: // WHG DATA
1049 case 0x51: // THG CMD
1050 set_opn_cmd(2, data);
1052 case 0x52: // THG DATA
1057 #if defined(HAS_MMR)
1059 #if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX)
1060 mmr_segment = data & 7;
1062 // printf("MMR SEGMENT: %02x\n", data & 3);
1063 mmr_segment = data & 3;
1067 window_offset = data & 0x00ff;
1070 if((data & 0x01) == 0) {
1075 if((data & 0x40) == 0) {
1076 window_enabled = false;
1078 window_enabled = true;
1080 if((data & 0x80) == 0) {
1081 mmr_enabled = false;
1088 //printf("MAIN: Write I/O Addr=%08x DATA=%02x\n", addr, data);
1091 if((addr < 0x40) && (addr >= 0x38)) {
1092 addr = (addr - 0x38) | FM7_SUBMEM_OFFSET_DPALETTE;
1093 display->write_data8(addr, (uint8)data);
1099 void FM7_MAINIO::event_callback(int event_id, int err)
1101 // printf("MAIN EVENT id=%d\n", event_id);
1103 case EVENT_BEEP_OFF:
1106 case EVENT_BEEP_CYCLE:
1109 case EVENT_UP_BREAK:
1110 set_break_key(false);
1112 case EVENT_TIMERIRQ_ON:
1113 if(!irqmask_timer) set_irq_timer(true);
1114 //register_event(this, EVENT_TIMERIRQ_OFF, 10000.0 / (4.9152 * 2.0) , false, NULL); // TIMER IRQ
1116 case EVENT_TIMERIRQ_OFF:
1117 if(!irqmask_timer) set_irq_timer(false);
1118 //register_event(this, EVENT_TIMERIRQ_ON, 2035, false, NULL); // TIMER ON
1120 case EVENT_FD_MOTOR_ON:
1121 set_fdc_motor(true);
1123 case EVENT_FD_MOTOR_OFF:
1124 set_fdc_motor(false);