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 = 0x10; 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)
70 #if defined(_FM77AV_VARIANTS)
72 sub_monitor_type = 0x00;
77 window_enabled = false;
80 if(config.cpu_type == 0) clock_fast = true;
90 irqmask_printer = true;
91 irqmask_keyboard = true;
93 irqstat_timer = false;
94 irqstat_printer = false;
95 irqstat_keyboard = false;
98 //firq_break_key = false; // bit1, ON = '0'.
99 firq_sub_attention = false; // bit0, ON = '0'.
102 sub_cancel = false; // bit6 : '1' Cancel req.
107 register_event(this, EVENT_TIMERIRQ_ON, 10000.0 / 4.9152, true, &event_timerirq); // TIMER IRQ
113 void FM7_MAINIO::set_clockmode(uint8 flags)
115 if(flags == FM7_MAINCLOCK_SLOW) {
122 uint8 FM7_MAINIO::get_clockmode(void)
124 if(!clock_fast) return FM7_MAINCLOCK_SLOW;
125 return FM7_MAINCLOCK_HIGH;
129 uint8 FM7_MAINIO::get_port_fd00(void)
131 uint8 ret = 0x7e; //0b01111110;
132 if(kbd_bit8) ret |= 0x80; //0b10000000;
133 if(clock_fast) ret |= 0x01; //0b00000001;
137 void FM7_MAINIO::set_port_fd00(uint8 data)
139 drec->write_signal(SIG_DATAREC_OUT, data, 0x01);
140 drec->write_signal(SIG_DATAREC_REMOTE, data, 0x02);
143 uint8 FM7_MAINIO::get_port_fd02(void)
146 // Still unimplemented printer.
147 ret = (cmt_indat) ? 0xff : 0x7f; // CMT
151 void FM7_MAINIO::set_port_fd02(uint8 val)
154 bool keyirq_bak = irqmask_keyboard;
155 bool timerirq_bak = irqmask_timer;
156 bool printerirq_bak = irqmask_printer;
157 bool mfdirq_bak = irqmask_mfd;
159 // if((val & 0b00010000) != 0) {
160 if((val & 0x10) != 0) {
165 if(mfdirq_bak != irqmask_mfd) {
169 //if((val & 0b00000100) != 0) {
170 if((val & 0x04) != 0) {
171 irqmask_timer = false;
173 irqmask_timer = true;
175 if(timerirq_bak != irqmask_timer) {
176 flag = irqstat_timer;
179 //if((val & 0b00000010) != 0) {
180 if((val & 0x02) != 0) {
181 irqmask_printer = false;
183 irqmask_printer = true;
185 if(printerirq_bak != irqmask_printer) {
186 flag = irqstat_printer;
187 set_irq_printer(flag);
190 //if((val & 0b00000001) != 0) {
191 if((val & 0x01) != 0) {
192 irqmask_keyboard = false;
194 irqmask_keyboard = true;
196 if(keyirq_bak != irqmask_keyboard) {
197 flag = irqstat_keyboard;
198 flag = flag & !irqmask_keyboard;
199 display->write_signal(SIG_FM7_SUB_KEY_FIRQ, flag ? 1 : 0, 1);
200 //printf("KEYBOARD: Interrupted %d\n", flag);
201 irqmask_keyboard = flag;
209 uint32 FM7_MAINIO::get_keyboard(void)
211 uint32 kbd_data = (uint32) kbd_bit7_0;
213 if(kbd_bit8) kbd_data |= 0x0100;
219 void FM7_MAINIO::set_irq_timer(bool flag)
221 uint8 backup = irqstat_reg0;
222 if(flag && !(irqmask_timer)) {
223 irqstat_reg0 &= ~0x04;
224 irqstat_timer = true;
225 if(backup != irqstat_reg0) do_irq(true);
227 irqstat_reg0 |= 0x04;
228 irqstat_timer = false;
229 if(backup != irqstat_reg0) do_irq(false);
231 //printf("IRQ TIMER: %02x MASK=%d\n", irqstat_reg0, irqmask_timer);
234 void FM7_MAINIO::set_irq_printer(bool flag)
236 uint8 backup = irqstat_reg0;
237 if(flag && !(irqmask_printer)) {
238 irqstat_reg0 &= ~0x02;
239 irqstat_printer = true;
240 if(backup != irqstat_reg0) do_irq(true);
242 irqstat_reg0 |= 0x02;
243 irqstat_printer = false;
244 if(backup != irqstat_reg0) do_irq(false);
246 // if(!irqmask_printer || !flag) do_irq(flag);
249 void FM7_MAINIO::set_irq_keyboard(bool flag)
251 uint8 backup = irqstat_reg0;
252 if(irqmask_keyboard) return;
254 irqstat_reg0 &= ~0x01;
255 irqstat_keyboard = true;
256 if(backup != irqstat_reg0) do_irq(true);
258 //irqstat_reg0 &= 0b11111110;
259 irqstat_reg0 |= 0x01;
260 irqstat_keyboard = false;
261 if(backup != irqstat_reg0) do_irq(false);
263 //printf("MAIN: KEYBOARD: IRQ=%d\n", flag && !(irqmask_keyboard));
266 void FM7_MAINIO::set_keyboard(uint32 data)
268 if((data & 0x100) != 0){
273 kbd_bit7_0 = (data & 0xff);
277 void FM7_MAINIO::do_irq(bool flag)
280 intstat = irqstat_timer | irqstat_keyboard | irqstat_printer;
281 intstat = intstat | irqstat_fdc;
282 intstat = intstat | intstat_opn | intstat_whg | intstat_thg;
283 intstat = intstat | intstat_mouse;
285 if(irqstat_bak == intstat) return;
286 //printf("%08d : IRQ: REG0=%02x FDC=%02x, stat=%d\n", SDL_GetTicks(), irqstat_reg0, irqstat_fdc, intstat);
288 maincpu->write_signal(SIG_CPU_IRQ, 1, 1);
290 maincpu->write_signal(SIG_CPU_IRQ, 0, 1);
292 irqstat_bak = intstat;
295 void FM7_MAINIO::do_firq(bool flag)
298 firq_stat = firq_break_key || firq_sub_attention;
299 //printf("%08d : FIRQ: break=%d attn=%d stat = %d\n", SDL_GetTicks(), firq_break_key, firq_sub_attention, firq_stat);
300 //if(firqstat_bak == firq_stat) return;
302 maincpu->write_signal(SIG_CPU_FIRQ, 1, 1);
304 maincpu->write_signal(SIG_CPU_FIRQ, 0, 1);
306 firqstat_bak = firq_stat;
309 void FM7_MAINIO::do_nmi(bool flag)
312 if(nmi_count >= 0x7ff0) {
317 if(nmi_count <= 1) maincpu->write_signal(SIG_CPU_NMI, 1, 1);
324 if(nmi_count == 0) maincpu->write_signal(SIG_CPU_NMI, 0, 1);
329 void FM7_MAINIO::set_break_key(bool pressed)
331 firq_break_key = pressed;
335 void FM7_MAINIO::set_sub_attention(bool flag)
337 firq_sub_attention = flag;
342 uint8 FM7_MAINIO::get_fd04(void)
344 uint8 val = display->read_signal(SIG_DISPLAY_BUSY) | ~0x03;
345 if(!firq_break_key) val |= 0x02;
346 if(!firq_sub_attention) {
349 set_sub_attention(false);
354 void FM7_MAINIO::set_fd04(uint8 val)
357 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
358 display->write_signal(SIG_DISPLAY_EXTRA_MODE, val, 0xff);
363 uint8 FM7_MAINIO::get_fd05(void)
365 uint8 val = display->read_signal(SIG_DISPLAY_BUSY) | ~0x81;
366 if(!extdet_neg) val |= 0x01;
370 void FM7_MAINIO::set_fd05(uint8 val)
372 display->write_signal(SIG_FM7_SUB_CANCEL, val, 0x40); // HACK
373 display->write_signal(SIG_DISPLAY_HALT, val, 0x80);
375 if((val & 0x01) != 0) {
376 //maincpu->write_signal(SIG_CPU_BUSREQ, 1, 1);
377 //z80->write_signal(SIG_CPU_BUSREQ, 0, 1);
379 //maincpu->write_signal(SIG_CPU_BUSREQ, 0, 1);
380 //z80->write_signal(SIG_CPU_BUSREQ, 1, 1);
385 void FM7_MAINIO::set_extdet(bool flag)
390 // Kanji ROM, FD20 AND FD21 (or SUBSYSTEM)
391 void FM7_MAINIO::write_kanjiaddr_hi(uint8 addr)
393 if(!connect_kanjiroml1) return;
398 void FM7_MAINIO::write_kanjiaddr_lo(uint8 addr)
400 if(!connect_kanjiroml1) return;
405 uint8 FM7_MAINIO::read_kanjidata_left(void)
409 if(!connect_kanjiroml1) return 0xff;
410 addr = ((uint32)kaddress_hi << 8) | (uint32)kaddress_lo;
413 return kanjiclass1->read_data8(addr);
419 uint8 FM7_MAINIO::read_kanjidata_right(void)
423 if(!connect_kanjiroml1) return 0xff;
424 addr = ((uint32)kaddress_hi << 8) | (uint32)kaddress_lo;
425 addr = (addr << 1) | 1;
427 return kanjiclass1->read_data8(addr);
433 #ifdef CAPABLE_KANJICLASS2
434 // Kanji ROM, FD20 AND FD21 (or SUBSYSTEM)
435 void FM7_MAINIO::write_kanjiaddr_hi_l2(uint8 addr)
437 if(!connect_kanjiroml2) return;
438 kaddress_hi_l2 = addr;
442 void FM7_MAINIO::write_kanjiaddr_lo_l2(uint8 addr)
444 if(!connect_kanjiroml2) return;
445 kaddress_lo_l2 = addr;
449 uint8 FM7_MAINIO::read_kanjidata_left_l2(void)
453 if(!connect_kanjiroml2) return 0xff;
454 addr = ((uint32)kaddress_hi_l2 << 8) | (uint32)kaddress_lo_l2;
457 return kanjiclass2->read_data8(addr);
463 uint8 FM7_MAINIO::read_kanjidata_right_l2(void)
467 if(!connect_kanjiroml2) return 0xff;
468 addr = ((uint32)kaddress_hi_l2 << 8) | (uint32)kaddress_lo_l2;
469 addr = (addr << 1) | 0x01;
471 return kanjiclass2->read_data8(addr);
480 void FM7_MAINIO::write_signal(int id, uint32 data, uint32 mask)
483 val_b = ((data & mask) != 0);
486 case FM7_MAINIO_CLOCKMODE: // fd00
495 #if defined(_FM77AV_VARIANTS) || defined(_FM77_VARIANTS)
499 clocks = 2016000; // Hz
501 clocks = 1230502; // (2016 * 1095 / 1794)[KHz]
505 clocks = 1565000; // Hz
507 clocks = 955226; // (1565 * 1095 / 1794)[KHz]
512 clocks = 1794000; // Hz
514 clocks = 1095000; // Hz
519 clocks = 1794000; // Hz
521 clocks = 1095000; // Hz
525 subclocks = 2000000; // Hz
527 subclocks = 999000; // Hz
529 p_vm->set_cpu_clock(this->maincpu, clocks);
530 p_vm->set_cpu_clock(this->subcpu, subclocks);
533 case FM7_MAINIO_CMT_RECV: // FD02
534 cmt_indat = val_b ^ cmt_invert;
536 case FM7_MAINIO_CMT_INVERT: // FD02
539 case FM7_MAINIO_TIMERIRQ: //
540 set_irq_timer(val_b);
542 case FM7_MAINIO_LPTIRQ: //
543 set_irq_printer(val_b);
545 case FM7_MAINIO_KEYBOARDIRQ: //
546 set_irq_keyboard(val_b);
548 case FM7_MAINIO_PUSH_KEYBOARD:
549 set_keyboard(data & 0x1ff);
552 case FM7_MAINIO_PUSH_BREAK:
553 set_break_key(val_b);
555 case FM7_MAINIO_SUB_ATTENTION:
556 set_sub_attention(val_b);
559 case FM7_MAINIO_SUB_BUSY:
561 case FM7_MAINIO_EXTDET:
564 case FM7_MAINIO_BEEP:
567 case FM7_MAINIO_JOYPORTA_CHANGED:
568 joyport_a = data & mask;
570 case FM7_MAINIO_JOYPORTB_CHANGED:
571 joyport_b = data & mask;
573 case FM7_MAINIO_PSG_IRQ:
575 case FM7_MAINIO_OPN_IRQ:
576 if(!connect_opn) break;
580 case FM7_MAINIO_WHG_IRQ:
581 if(!connect_whg) break;
585 case FM7_MAINIO_THG_IRQ:
586 if(!connect_thg) break;
590 case FM7_MAINIO_FDC_DRQ:
593 case FM7_MAINIO_FDC_IRQ:
601 uint8 FM7_MAINIO::get_irqstat_fd03(void)
606 extirq = irqstat_fdc | intstat_opn | intstat_whg | intstat_thg;
608 //extirq = extirq | intstat_syndet | intstat_rxrdy | intstat_txrdy;
610 irqstat_reg0 &= ~0x08;
612 irqstat_reg0 |= 0x08;
614 val = irqstat_reg0 | 0xf0;
615 set_irq_timer(false);
616 set_irq_printer(false);
620 uint8 FM7_MAINIO::get_extirq_fd17(void)
623 if(intstat_opn) val &= ~0x08;
624 if(intstat_mouse) val &= ~0x04;
625 //if(!intstat_opn && !intstat_mouse) do_irq(false);
629 void FM7_MAINIO::set_ext_fd17(uint8 data)
631 if((data & 0x04) != 0) {
634 mouse_enable = false;
638 #if defined(_FM77AV_VARIANTS)
640 uint8 FM7_MAINIO::subsystem_read_status(void)
643 retval = (display->read_signal(SIG_DISPLAY_MODE320) != 0) ? 0x40 : 0;
644 retval |= display->read_signal(SIG_DISPLAY_VSYNC);
645 retval |= display->read_signal(SIG_DISPLAY_DISPLAY);
651 uint32 FM7_MAINIO::read_signal(uint32 addr)
653 uint32 retval = 0xffffffff;
659 uint32 FM7_MAINIO::read_data8(uint32 addr)
662 if(addr == FM7_MAINIO_IS_BASICROM) {
664 if(stat_bootsw_basic) retval = 0xffffffff;
666 } else if(addr == FM7_MAINIO_BOOTMODE) {
667 retval = bootmode & 0x03;
668 #if defined(_FM77) || defined(_FM77L2) || defined(_FM77L4) || defined(_FM77AV_VARIANTS)
669 if(boot_ram) retval = 4;
672 } else if(addr == FM7_MAINIO_READ_FD0F) {
673 if(stat_romrammode) return 0xffffffff;
675 } else if(addr == FM7_MAINIO_CLOCKMODE) {
676 return (uint32)get_clockmode();
679 else if(addr == FM7_MAINIO_MMR_ENABLED) {
680 retval = (mmr_enabled) ? 0xffffffff:0x00000000;
682 } else if(addr == FM7_MAINIO_WINDOW_ENABLED) {
683 retval = (window_enabled) ? 0xffffffff:0x00000000;
685 } else if(addr == FM7_MAINIO_WINDOW_OFFSET) {
686 retval = (uint32)window_offset;
688 } else if(addr == FM7_MAINIO_MMR_SEGMENT) {
689 retval = (uint32) mmr_segment;
691 } else if((addr >= FM7_MAINIO_MMR_BANK) && (addr < (FM7_MAINIO_MMR_BANK + 16))) {
692 #if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX)
693 retval = (uint32)mmr_table[(addr - FM7_MAINIO_MMR_BANK) | (mmr_segment & 7) * 16];
695 retval = (uint32)mmr_table[(addr - FM7_MAINIO_MMR_BANK) | (mmr_segment & 3) * 16] & 0x3f;
700 #if defined(_FM77AV_VARIANTS)
701 else if(addr == FM7_MAINIO_INITROM_ENABLED) {
702 retval = (enable_initiator) ? 0xffffffff : 0x00000000;
704 } else if(addr == FM7_MAINIO_MODE320) {
705 retval = display->read_signal(SIG_DISPLAY_MODE320);
707 } else if(addr == FM7_MAINIO_SUBMONITOR_ROM) {
708 retval = sub_monitor_type & 0x03;
710 } else if(addr == FM7_MAINIO_SUBMONITOR_RAM) {
711 #if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX)
712 retval = ((sub_monitor_type & 0x04) != 0) ? 0xffffffff : 0x00000000;
719 #if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX)
720 else if(addr == FM7_MAINIO_EXTBANK) {
721 } else if(addr == FM7_MAINIO_EXTROM) {
724 //if((addr >= 0x0006) && (addr != 0x1f)) printf("MAINIO: READ: %08x DATA=%08x\n", addr);
728 if((addr < 0x90) && (addr >= 0x80)) {
729 #if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX)
730 return mmr_table[addr - 0x80 + mmr_segment * 16];
732 return mmr_table[addr - 0x80 + (mmr_segment & 0x03) * 16];
738 retval = (uint32) get_port_fd00();
741 display->write_signal(SIG_FM7_SUB_KEY_FIRQ, 0, 1);
742 set_irq_keyboard(false);
743 retval = (uint32) kbd_bit7_0;
746 retval = (uint32) get_port_fd02();
749 retval = (uint32) get_irqstat_fd03();
752 retval = (uint32) get_fd04();
755 retval = (uint32) get_fd05();
757 case 0x06: // RS-232C
760 case 0x08: // Light pen
764 case 0x0e: // PSG DATA
765 retval = (uint32) get_psg();
766 //printf("PSG DATA READ val=%02x\n", retval);
772 #if defined(_FM77AV_VARIANTS)
774 retval = subsystem_read_status();
777 case 0x15: // OPN CMD
778 //printf("OPN CMD READ \n");
780 case 0x16: // OPN DATA
781 retval = (uint32) get_opn(0);
782 //printf("OPN DATA READ val=%02x\n", retval);
785 retval = (uint32) get_extirq_fd17();
787 case 0x18: // FDC: STATUS
788 retval = (uint32) get_fdc_stat();
789 //printf("FDC: READ STATUS %02x PC=%04x\n", retval, maincpu->get_pc());
791 case 0x19: // FDC: Track
792 retval = (uint32) get_fdc_track();
793 //printf("FDC: READ TRACK REG %02x\n", retval);
795 case 0x1a: // FDC: Sector
796 retval = (uint32) get_fdc_sector();
797 //printf("FDC: READ SECTOR REG %02x\n", retval);
799 case 0x1b: // FDC: Data
800 retval = (uint32) get_fdc_data();
803 retval = (uint32) get_fdc_fd1c();
804 //printf("FDC: READ HEAD REG %02x\n", retval);
807 retval = (uint32) get_fdc_motor();
808 //printf("FDC: READ MOTOR REG %02x\n", retval);
811 retval = (uint32) fdc_getdrqirq();
813 case 0x22: // Kanji ROM
814 retval = (uint32) read_kanjidata_left();
816 case 0x23: // Kanji ROM
817 retval = (uint32) read_kanjidata_right();
819 #if defined(CAPABLE_KANJI_CLASS2)
820 case 0x2e: // Kanji ROM Level2
821 retval = (uint32) read_kanjidata_left_l2();
823 case 0x2f: // Kanji ROM Level2
824 retval = (uint32) read_kanjidata_right_l2();
827 case 0x37: // Multi page
828 //retval = (uint32)display->read_data8(DISPLAY_ADDR_MULTIPAGE);
830 case 0x45: // WHG CMD
832 case 0x46: // WHG DATA
833 retval = (uint32) get_opn(1);
836 retval = (uint32) get_extirq_whg();
838 case 0x51: // THG CMD
840 case 0x52: // THG DATA
841 retval = (uint32) get_opn(2);
844 retval = (uint32) get_extirq_thg();
849 if(boot_ram) retval |= 0x01;
850 if(window_enabled) retval |= 0x40;
851 if(mmr_enabled) retval |= 0x80;
855 //printf("MAIN: Read another I/O Addr=%08x\n", addr);
858 if((addr < 0x40) && (addr >= 0x38)) {
859 addr = (addr - 0x38) + FM7_SUBMEM_OFFSET_DPALETTE;
860 return (uint32) display->read_data8(addr);
866 void FM7_MAINIO::write_data8(uint32 addr, uint32 data)
869 if(addr == FM7_MAINIO_BOOTMODE) {
870 bootmode = data & 0x03;
872 } else if(addr == FM7_MAINIO_CLOCKMODE) {
873 set_clockmode((uint8)data);
876 //if((addr >= 0x0006) && !(addr == 0x1f)) printf("MAINIO: WRITE: %08x DATA=%08x\n", addr, data);
881 if((addr < 0x90) && (addr >= 0x80)) {
882 #if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX)
883 mmr_table[addr - 0x80 + mmr_segment * 16] = data;
885 mmr_table[addr - 0x80 + (mmr_segment & 0x03) * 16] = data & 0x3f;
887 //printf("MMR: Write access segment=%02x addr=%02x page=%02x\n", mmr_segment, addr - 0x80, data);
893 set_port_fd00((uint8)data);
897 // set_lptdata_fd01((uint8)data);
900 set_port_fd02((uint8)data);
906 // set_flags_fd04(data);
909 set_fd05((uint8)data);
911 case 0x06: // RS-232C
914 case 0x08: // Light pen
919 //printf("PSG CMD WRITE val=%02x\n", data);
923 //printf("PSG DATA WRITE val=%02x\n", data);
929 #if defined(_FM77AV_VARIANTS)
931 flag = enable_initiator;
932 //printf("INITIATOR ENABLE = %02x\n", data);
933 enable_initiator = ((data & 0x02) == 0) ? true : false;
934 if(flag != enable_initiator) {
940 //mode320 = ((data & 0x40) != 0);
941 display->write_signal(SIG_DISPLAY_MODE320, data, 0x40);
944 display->write_signal(SIG_FM7_SUB_BANK, data, 0x07);
947 case 0x15: // OPN CMD
948 //printf("OPN CMD WRITE val=%02x\n", data);
949 set_opn_cmd(0, data);
951 case 0x16: // OPN DATA
952 //printf("OPN DATA WRITE val=%02x\n", data);
956 set_ext_fd17((uint8)data);
958 case 0x18: // FDC: COMMAND
959 set_fdc_cmd((uint8)data);
960 //printf("FDC: WRITE CMD %02x\n", data);
962 case 0x19: // FDC: Track
963 set_fdc_track((uint8)data);
964 //printf("FDC: WRITE TRACK REG %02x\n", data);
966 case 0x1a: // FDC: Sector
967 set_fdc_sector((uint8)data);
968 //printf("FDC: WRITE SECTOR REG %02x\n", data);
970 case 0x1b: // FDC: Data
971 set_fdc_data((uint8)data);
974 set_fdc_fd1c((uint8)data);
975 //printf("FDC: WRITE HEAD REG %02x\n", data);
978 set_fdc_fd1d((uint8)data);
979 //printf("FDC: WRITE MOTOR REG %02x\n", data);
984 case 0x20: // Kanji ROM
985 write_kanjiaddr_hi((uint8)data);
987 case 0x21: // Kanji ROM
988 write_kanjiaddr_lo((uint8)data);
990 #if defined(CAPABLE_KANJI_CLASS2)
991 case 0x2c: // Kanji ROM
992 write_kanjiaddr_hi_l2((uint8)data);
994 case 0x2d: // Kanji ROM
995 write_kanjiaddr_lo_l2((uint8)data);
998 #if defined(_FM77AV_VARIANTS)
1000 display->write_data8(FM7_SUBMEM_OFFSET_APALETTE_HI, data);
1003 display->write_data8(FM7_SUBMEM_OFFSET_APALETTE_LO, data);
1006 display->write_data8(FM7_SUBMEM_OFFSET_APALETTE_B, data);
1009 display->write_data8(FM7_SUBMEM_OFFSET_APALETTE_R, data);
1012 display->write_data8(FM7_SUBMEM_OFFSET_APALETTE_G, data);
1015 case 0x37: // Multi page
1016 display->write_signal(SIG_FM7_SUB_MULTIPAGE, data, 0x00ff);
1018 case 0x45: // WHG CMD
1019 set_opn_cmd(1, data);
1021 case 0x46: // WHG DATA
1026 case 0x51: // THG CMD
1027 set_opn_cmd(2, data);
1029 case 0x52: // THG DATA
1034 #if defined(HAS_MMR)
1036 #if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX)
1037 mmr_segment = data & 7;
1039 mmr_segment = data & 3;
1043 window_offset = data & 0x00ff;
1046 if((data & 0x01) == 0) {
1051 if((data & 0x40) == 0) {
1052 window_enabled = false;
1054 window_enabled = true;
1056 if((data & 0x80) == 0) {
1057 mmr_enabled = false;
1064 //printf("MAIN: Write I/O Addr=%08x DATA=%02x\n", addr, data);
1067 if((addr < 0x40) && (addr >= 0x38)) {
1068 addr = (addr - 0x38) | FM7_SUBMEM_OFFSET_DPALETTE;
1069 display->write_data8(addr, (uint8)data);
1075 void FM7_MAINIO::event_callback(int event_id, int err)
1077 // printf("MAIN EVENT id=%d\n", event_id);
1079 case EVENT_BEEP_OFF:
1082 case EVENT_BEEP_CYCLE:
1085 case EVENT_UP_BREAK:
1086 set_break_key(false);
1088 case EVENT_TIMERIRQ_ON:
1089 if(!irqmask_timer) set_irq_timer(true);
1090 //register_event(this, EVENT_TIMERIRQ_OFF, 10000.0 / (4.9152 * 2.0) , false, NULL); // TIMER IRQ
1092 case EVENT_TIMERIRQ_OFF:
1093 if(!irqmask_timer) set_irq_timer(false);
1094 //register_event(this, EVENT_TIMERIRQ_ON, 2035, false, NULL); // TIMER ON
1096 case EVENT_FD_MOTOR_ON:
1097 set_fdc_motor(true);
1099 case EVENT_FD_MOTOR_OFF:
1100 set_fdc_motor(false);