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"
21 void FM7_MAINIO::initialize()
25 event_beep_oneshot = -1;
27 bootmode = config.boot_mode & 3;
28 #if defined(_FM77AV_VARIANTS)
31 //opn_psg_77av = true;
34 #if defined(_FM77_VARIANTS) || defined(_FM77AV_VARIANTS)
37 #if defined(_FM77AV_VARIANTS)
38 enable_initiator = true;
43 window_enabled = false;
45 for(i = 0x00; i < 0x80; i++) mmr_table[i] = 0;
46 // 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);
60 void FM7_MAINIO::reset()
64 if(event_beep >= 0) cancel_event(this, event_beep);
66 if(event_beep_oneshot >= 0) cancel_event(this, event_beep_oneshot);
67 event_beep_oneshot = -1;
68 if(event_timerirq >= 0) cancel_event(this, event_timerirq);
71 if(event_beep < 0) register_event(this, EVENT_BEEP_CYCLE, (1000.0 * 1000.0) / (1200.0 * 2.0), true, &event_beep);
75 stat_romrammode = true;
76 bootmode = config.boot_mode & 3;
77 if(bootmode == 0) { // IF BASIC BOOT THEN ROM
78 stat_romrammode = true;
80 stat_romrammode = false;
82 #if defined(_FM77_VARIANTS) || defined(_FM77AV_VARIANTS)
86 #if defined(_FM77AV_VARIANTS)
88 sub_monitor_type = 0x00;
89 sub_monitor_bak = sub_monitor_type;
90 display->write_signal(SIG_FM7_SUB_BANK, sub_monitor_type, 0x07);
96 window_enabled = false;
99 if(config.cpu_type == 0) clock_fast = true;
105 firqstat_bak = false;
108 irqmask_timer = true;
109 irqmask_printer = true;
110 irqmask_keyboard = true;
112 irqstat_timer = false;
113 irqstat_printer = false;
114 irqstat_keyboard = false;
117 //firq_break_key = false; // bit1, ON = '0'.
118 firq_sub_attention = false; // bit0, ON = '0'.
119 firq_sub_attention_bak = false; // bit0, ON = '0'.
122 sub_cancel = false; // bit6 : '1' Cancel req.
123 sub_halt = false; // bit6 : '1' Cancel req.
124 sub_cancel_bak = !sub_cancel; // bit6 : '1' Cancel req.
125 sub_halt_bak = !sub_halt; // bit6 : '1' Cancel req.
129 register_event(this, EVENT_TIMERIRQ_ON, 10000.0 / 4.9152, true, &event_timerirq); // TIMER IRQ
131 memset(io_w_latch, 0x00, 0x100);
132 sub_busy = (read_signal(SIG_DISPLAY_BUSY) == 0) ? false : true;
137 void FM7_MAINIO::set_clockmode(uint8 flags)
140 if((flags & FM7_MAINCLOCK_SLOW) != 0) {
145 if(f != clock_fast) {
146 this->write_signal(FM7_MAINIO_CLOCKMODE, clock_fast ? 1 : 0, 1);
150 uint8 FM7_MAINIO::get_clockmode(void)
152 if(!clock_fast) return FM7_MAINCLOCK_SLOW;
153 return FM7_MAINCLOCK_HIGH;
157 uint8 FM7_MAINIO::get_port_fd00(void)
159 uint8 ret = 0x7e; //0b01111110;
160 if(keyboard->read_data8(0) != 0) ret |= 0x80; // High bit.
161 if(clock_fast) ret |= 0x01; //0b00000001;
165 void FM7_MAINIO::set_port_fd00(uint8 data)
167 drec->write_signal(SIG_DATAREC_OUT, data, 0x01);
168 drec->write_signal(SIG_DATAREC_REMOTE, data, 0x02);
171 uint8 FM7_MAINIO::get_port_fd02(void)
174 // Still unimplemented printer.
175 ret = (cmt_indat) ? 0xff : 0x7f; // CMT
179 void FM7_MAINIO::set_port_fd02(uint8 val)
182 bool keyirq_bak = irqmask_keyboard;
183 bool timerirq_bak = irqmask_timer;
184 bool printerirq_bak = irqmask_printer;
185 bool mfdirq_bak = irqmask_mfd;
187 // if((val & 0b00010000) != 0) {
188 if((val & 0x10) != 0) {
193 if(mfdirq_bak != irqmask_mfd) {
197 //if((val & 0b00000100) != 0) {
198 if((val & 0x04) != 0) {
199 irqmask_timer = false;
201 irqmask_timer = true;
203 if(timerirq_bak != irqmask_timer) {
204 flag = irqstat_timer;
207 //if((val & 0b00000010) != 0) {
208 if((val & 0x02) != 0) {
209 irqmask_printer = false;
211 irqmask_printer = true;
213 if(printerirq_bak != irqmask_printer) {
214 flag = irqstat_printer;
215 set_irq_printer(flag);
218 //if((val & 0b00000001) != 0) {
219 if((val & 0x01) != 0) {
220 irqmask_keyboard = false;
222 irqmask_keyboard = true;
224 if(keyirq_bak != irqmask_keyboard) {
225 flag = irqstat_keyboard;
226 flag = flag & !irqmask_keyboard;
227 display->write_signal(SIG_FM7_SUB_KEY_FIRQ, flag ? 1 : 0, 1);
228 //printf("KEYBOARD: Interrupted %d\n", flag);
229 irqmask_keyboard = flag;
236 void FM7_MAINIO::set_irq_timer(bool flag)
238 uint8 backup = irqstat_reg0;
239 if(flag && !(irqmask_timer)) {
240 irqstat_reg0 &= 0xfb; //~0x04;
241 irqstat_timer = true;
242 if(backup != irqstat_reg0) do_irq();
244 irqstat_reg0 |= 0x04;
245 irqstat_timer = false;
246 if(backup != irqstat_reg0) do_irq();
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();
259 irqstat_reg0 |= 0x02;
260 irqstat_printer = false;
261 if(backup != irqstat_reg0) do_irq();
263 // if(!irqmask_printer || !flag) do_irq();
266 void FM7_MAINIO::set_irq_keyboard(bool flag)
268 uint8 backup = irqstat_reg0;
269 if(irqmask_keyboard) return;
271 irqstat_reg0 &= 0xfe;
272 irqstat_keyboard = true;
273 if(backup != irqstat_reg0) do_irq();
275 //irqstat_reg0 &= 0b11111110;
276 irqstat_reg0 |= 0x01;
277 irqstat_keyboard = false;
278 if(backup != irqstat_reg0) do_irq();
280 //printf("MAIN: KEYBOARD: IRQ=%d\n", flag && !(irqmask_keyboard));
284 void FM7_MAINIO::do_irq(void)
287 intstat = irqstat_timer | irqstat_keyboard | irqstat_printer;
288 intstat = intstat | irqstat_fdc;
289 intstat = intstat | intstat_opn | intstat_whg | intstat_thg;
290 intstat = intstat | intstat_mouse;
292 if(irqstat_bak == intstat) return;
293 //printf("%08d : IRQ: REG0=%02x FDC=%02x, stat=%d\n", SDL_GetTicks(), irqstat_reg0, irqstat_fdc, intstat);
295 maincpu->write_signal(SIG_CPU_IRQ, 1, 1);
297 maincpu->write_signal(SIG_CPU_IRQ, 0, 1);
299 irqstat_bak = intstat;
302 void FM7_MAINIO::do_firq(void)
305 firq_stat = firq_break_key | firq_sub_attention;
306 //printf("%08d : FIRQ: break=%d attn=%d stat = %d\n", SDL_GetTicks(), firq_break_key, firq_sub_attention, firq_stat);
307 if(firqstat_bak == firq_stat) return;
309 maincpu->write_signal(SIG_CPU_FIRQ, 1, 1);
311 maincpu->write_signal(SIG_CPU_FIRQ, 0, 1);
313 firqstat_bak = firq_stat;
316 void FM7_MAINIO::do_nmi(bool flag)
319 if(nmi_count >= 0x7ff0) {
324 if(nmi_count <= 1) maincpu->write_signal(SIG_CPU_NMI, 1, 1);
331 if(nmi_count == 0) maincpu->write_signal(SIG_CPU_NMI, 0, 1);
336 void FM7_MAINIO::set_break_key(bool pressed)
338 firq_break_key = pressed;
342 void FM7_MAINIO::set_sub_attention(bool flag)
344 firq_sub_attention = flag;
349 uint8 FM7_MAINIO::get_fd04(void)
352 if(sub_busy) val |= 0x80;
353 if(!firq_break_key) val |= 0x02;
354 if(!firq_sub_attention) {
357 set_sub_attention(false);
361 void FM7_MAINIO::set_fd04(uint8 val)
364 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
365 display->write_signal(SIG_DISPLAY_EXTRA_MODE, val, 0xff);
370 uint8 FM7_MAINIO::get_fd05(void)
373 val = (sub_busy) ? 0xfe : 0x7e;
374 if(!extdet_neg) val |= 0x01;
375 //printf("FD05: READ: %d VAL=%02x\n", SDL_GetTicks(), val);
379 void FM7_MAINIO::set_fd05(uint8 val)
381 sub_cancel = ((val & 0x40) != 0) ? true : false;
382 sub_halt = ((val & 0x80) != 0) ? true : false;
383 //display->write_signal(SIG_FM7_SUB_CANCEL, (sub_cancel) ? 0xff : 0x00, 0xff); // HACK
384 //if(sub_halt != sub_halt_bak) display->write_signal(SIG_DISPLAY_HALT, (sub_halt) ? 0xff : 0x00, 0xff); // HACK
385 if(sub_cancel != sub_cancel_bak) {
386 display->write_signal(SIG_FM7_SUB_CANCEL, (sub_cancel) ? 0xff : 0x00, 0xff); // HACK
388 sub_cancel_bak = sub_cancel;
389 //sub_halt_bak = sub_halt;
391 if((val & 0x01) != 0) {
392 //maincpu->write_signal(SIG_CPU_BUSREQ, 1, 1);
393 //z80->write_signal(SIG_CPU_BUSREQ, 0, 1);
395 //maincpu->write_signal(SIG_CPU_BUSREQ, 0, 1);
396 //z80->write_signal(SIG_CPU_BUSREQ, 1, 1);
401 void FM7_MAINIO::set_extdet(bool flag)
406 // Kanji ROM, FD20 AND FD21 (or SUBSYSTEM)
407 void FM7_MAINIO::write_kanjiaddr_hi(uint8 addr)
409 if(!connect_kanjiroml1) return;
414 void FM7_MAINIO::write_kanjiaddr_lo(uint8 addr)
416 if(!connect_kanjiroml1) return;
421 uint8 FM7_MAINIO::read_kanjidata_left(void)
425 if(!connect_kanjiroml1) return 0xff;
428 //printf("KANJI MAIN CLASS1 ADDR: %05x\n", kaddress.w.l);
430 return kanjiclass1->read_data8(addr);
436 uint8 FM7_MAINIO::read_kanjidata_right(void)
440 if(!connect_kanjiroml1) return 0xff;
442 addr = (addr << 1) + 1;
444 return kanjiclass1->read_data8(addr);
450 #ifdef CAPABLE_KANJICLASS2
451 // Kanji ROM, FD20 AND FD21 (or SUBSYSTEM)
452 void FM7_MAINIO::write_kanjiaddr_hi_l2(uint8 addr)
454 if(!connect_kanjiroml2) return;
455 kaddress_l2.b.h = addr;
459 void FM7_MAINIO::write_kanjiaddr_lo_l2(uint8 addr)
461 if(!connect_kanjiroml2) return;
462 kaddress_l2.b.l = addr;
466 uint8 FM7_MAINIO::read_kanjidata_left_l2(void)
470 if(!connect_kanjiroml2) return 0xff;
474 return kanjiclass2->read_data8(addr);
480 uint8 FM7_MAINIO::read_kanjidata_right_l2(void)
484 if(!connect_kanjiroml2) return 0xff;
485 addr = kaddress_l2.w.l;
486 addr = (addr << 1) + 0x01;
488 return kanjiclass2->read_data8(addr);
497 void FM7_MAINIO::write_signal(int id, uint32 data, uint32 mask)
500 val_b = ((data & mask) != 0);
503 case FM7_MAINIO_SUB_BUSY:
506 case FM7_MAINIO_CLOCKMODE: // fd00
515 #if defined(_FM77AV_VARIANTS) || defined(_FM77_VARIANTS)
519 clocks = 2016000; // Hz
521 clocks = 1230502; // (2016 * 1095 / 1794)[KHz]
525 clocks = 1565000; // Hz
527 clocks = 955226; // (1565 * 1095 / 1794)[KHz]
532 clocks = 1794000; // Hz
534 clocks = 1095000; // Hz
539 clocks = 1794000; // Hz
541 clocks = 1095000; // Hz
544 p_vm->set_cpu_clock(this->maincpu, clocks);
545 display->write_signal(SIG_DISPLAY_CLOCK, clock_fast ? 1 : 0, 1);
548 case FM7_MAINIO_CMT_RECV: // FD02
549 cmt_indat = val_b ^ cmt_invert;
551 case FM7_MAINIO_CMT_INVERT: // FD02
554 case FM7_MAINIO_TIMERIRQ: //
555 set_irq_timer(val_b);
557 case FM7_MAINIO_LPTIRQ: //
558 set_irq_printer(val_b);
560 case FM7_MAINIO_KEYBOARDIRQ: //
561 set_irq_keyboard(val_b);
564 case FM7_MAINIO_PUSH_BREAK:
565 set_break_key(val_b);
567 case FM7_MAINIO_SUB_ATTENTION:
568 if(val_b) set_sub_attention(true);
571 case FM7_MAINIO_EXTDET:
574 case FM7_MAINIO_BEEP:
577 case FM7_MAINIO_JOYPORTA_CHANGED:
578 joyport_a = data & mask;
580 case FM7_MAINIO_JOYPORTB_CHANGED:
581 joyport_b = data & mask;
583 case FM7_MAINIO_PSG_IRQ:
585 case FM7_MAINIO_OPN_IRQ:
586 if(!connect_opn) break;
590 case FM7_MAINIO_WHG_IRQ:
591 if(!connect_whg) break;
595 case FM7_MAINIO_THG_IRQ:
596 if(!connect_thg) break;
600 case FM7_MAINIO_FDC_DRQ:
603 case FM7_MAINIO_FDC_IRQ:
606 case FM7_MAINIO_KANJI1_ADDR_HIGH:
609 case FM7_MAINIO_KANJI1_ADDR_LOW:
612 #if defined(CAPABLE_KANJI_CLASS2)
613 case FM7_MAINIO_KANJI2_ADDR_HIGH:
614 kaddress_l2.b.h = data;
616 case FM7_MAINIO_KANJI2_ADDR_LOW:
617 kaddress_l2.b.l = data;
625 uint8 FM7_MAINIO::get_irqstat_fd03(void)
630 extirq = irqstat_fdc | intstat_opn | intstat_whg | intstat_thg;
632 //extirq = extirq | intstat_syndet | intstat_rxrdy | intstat_txrdy;
634 irqstat_reg0 &= ~0x08;
636 irqstat_reg0 |= 0x08;
638 val = irqstat_reg0 | 0xf0;
639 set_irq_timer(false);
640 set_irq_printer(false);
644 uint8 FM7_MAINIO::get_extirq_fd17(void)
647 if(intstat_opn) val &= ~0x08;
648 if(intstat_mouse) val &= ~0x04;
649 //if(!intstat_opn && !intstat_mouse) do_irq(false);
653 void FM7_MAINIO::set_ext_fd17(uint8 data)
655 if((data & 0x04) != 0) {
658 mouse_enable = false;
662 #if defined(_FM77AV_VARIANTS)
664 uint8 FM7_MAINIO::subsystem_read_status(void)
667 retval = (display->read_signal(SIG_DISPLAY_MODE320) != 0) ? 0x40 : 0;
668 retval |= display->read_signal(SIG_DISPLAY_VSYNC);
669 retval |= display->read_signal(SIG_DISPLAY_DISPLAY);
675 uint32 FM7_MAINIO::read_signal(uint32 addr)
677 uint32 retval = 0xffffffff;
683 uint32 FM7_MAINIO::read_data8(uint32 addr)
686 if(addr == FM7_MAINIO_IS_BASICROM) {
688 if(stat_bootsw_basic) retval = 0xffffffff;
690 } else if(addr == FM7_MAINIO_BOOTMODE) {
691 retval = bootmode & 0x03;
692 #if defined(_FM77) || defined(_FM77L2) || defined(_FM77L4) || defined(_FM77AV_VARIANTS)
693 if(boot_ram) retval = 4;
696 } else if(addr == FM7_MAINIO_READ_FD0F) {
697 if(stat_romrammode) return 0xffffffff;
699 } else if(addr == FM7_MAINIO_CLOCKMODE) {
700 return (uint32)get_clockmode();
703 else if(addr == FM7_MAINIO_MMR_ENABLED) {
704 retval = (mmr_enabled) ? 0xffffffff:0x00000000;
706 } else if(addr == FM7_MAINIO_WINDOW_ENABLED) {
707 retval = (window_enabled) ? 0xffffffff:0x00000000;
709 } else if(addr == FM7_MAINIO_WINDOW_OFFSET) {
710 retval = (uint32)window_offset;
712 } else if(addr == FM7_MAINIO_MMR_SEGMENT) {
713 retval = (uint32) mmr_segment;
715 } else if((addr >= FM7_MAINIO_MMR_BANK) && (addr < (FM7_MAINIO_MMR_BANK + 16))) {
716 #if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX)
717 retval = (uint32)mmr_table[(addr - FM7_MAINIO_MMR_BANK) | (mmr_segment & 7) * 16];
719 retval = (uint32)mmr_table[(addr - FM7_MAINIO_MMR_BANK) | (mmr_segment & 3) * 16] & 0x3f;
724 #if defined(_FM77AV_VARIANTS)
725 else if(addr == FM7_MAINIO_INITROM_ENABLED) {
726 retval = (enable_initiator) ? 0xffffffff : 0x00000000;
728 } else if(addr == FM7_MAINIO_MODE320) {
729 retval = display->read_signal(SIG_DISPLAY_MODE320);
731 } else if(addr == FM7_MAINIO_SUBMONITOR_ROM) {
732 retval = sub_monitor_type & 0x03;
734 } else if(addr == FM7_MAINIO_SUBMONITOR_RAM) {
735 #if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX)
736 retval = ((sub_monitor_type & 0x04) != 0) ? 0xffffffff : 0x00000000;
743 #if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX)
744 else if(addr == FM7_MAINIO_EXTBANK) {
745 } else if(addr == FM7_MAINIO_EXTROM) {
748 //if((addr >= 0x0006) && (addr != 0x1f)) printf("MAINIO: READ: %08x DATA=%08x\n", addr);
752 if((addr < 0x90) && (addr >= 0x80)) {
753 #if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX)
754 return mmr_table[addr - 0x80 + mmr_segment * 16];
756 return mmr_table[addr - 0x80 + (mmr_segment & 0x03) * 16];
760 // if((addr >= 0x0006) && !(addr == 0x1f) && !(addr == 0x0b)) printf("MAINIO: READ: %08x \n", addr);
763 retval = (uint32) get_port_fd00();
766 retval = (uint32) keyboard->read_data8(0x01);
769 retval = (uint32) get_port_fd02();
772 retval = (uint32) get_irqstat_fd03();
775 retval = (uint32) get_fd04();
778 retval = (uint32) get_fd05();
780 case 0x06: // RS-232C
783 case 0x08: // Light pen
787 #if defined(_FM77AV_VARIANTS)
789 retval = (bootmode == 0) ? 0xfe : 0xff;
792 case 0x0e: // PSG DATA
793 retval = (uint32) get_psg();
794 //printf("PSG DATA READ val=%02x\n", retval);
800 #if defined(_FM77AV_VARIANTS)
802 retval = subsystem_read_status();
805 case 0x15: // OPN CMD
806 //printf("OPN CMD READ \n");
808 case 0x16: // OPN DATA
809 retval = (uint32) get_opn(0);
810 //printf("OPN DATA READ val=%02x\n", retval);
813 retval = (uint32) get_extirq_fd17();
815 case 0x18: // FDC: STATUS
816 retval = (uint32) get_fdc_stat();
817 //printf("FDC: READ STATUS %02x PC=%04x\n", retval, maincpu->get_pc());
819 case 0x19: // FDC: Track
820 retval = (uint32) get_fdc_track();
821 //printf("FDC: READ TRACK REG %02x\n", retval);
823 case 0x1a: // FDC: Sector
824 retval = (uint32) get_fdc_sector();
825 //printf("FDC: READ SECTOR REG %02x\n", retval);
827 case 0x1b: // FDC: Data
828 retval = (uint32) get_fdc_data();
831 retval = (uint32) get_fdc_fd1c();
832 //printf("FDC: READ HEAD REG %02x\n", retval);
835 retval = (uint32) get_fdc_motor();
836 //printf("FDC: READ MOTOR REG %02x\n", retval);
839 retval = (uint32) fdc_getdrqirq();
841 case 0x22: // Kanji ROM
842 retval = (uint32) read_kanjidata_left();
844 case 0x23: // Kanji ROM
845 retval = (uint32) read_kanjidata_right();
847 #if defined(CAPABLE_KANJI_CLASS2)
848 case 0x2e: // Kanji ROM Level2
849 retval = (uint32) read_kanjidata_left_l2();
851 case 0x2f: // Kanji ROM Level2
852 retval = (uint32) read_kanjidata_right_l2();
855 case 0x37: // Multi page
856 //retval = (uint32)display->read_data8(DISPLAY_ADDR_MULTIPAGE);
858 case 0x45: // WHG CMD
860 case 0x46: // WHG DATA
861 retval = (uint32) get_opn(1);
864 retval = (uint32) get_extirq_whg();
866 case 0x51: // THG CMD
868 case 0x52: // THG DATA
869 retval = (uint32) get_opn(2);
872 retval = (uint32) get_extirq_thg();
877 if(boot_ram) retval |= 0x01;
878 if(window_enabled) retval |= 0x40;
879 if(mmr_enabled) retval |= 0x80;
883 //printf("MAIN: Read another I/O Addr=%08x\n", addr);
886 if((addr < 0x40) && (addr >= 0x38)) {
887 addr = (addr - 0x38) + FM7_SUBMEM_OFFSET_DPALETTE;
888 return (uint32) display->read_data8(addr);
894 void FM7_MAINIO::write_data8(uint32 addr, uint32 data)
897 if(addr == FM7_MAINIO_BOOTMODE) {
898 bootmode = data & 0x03;
900 } else if(addr == FM7_MAINIO_CLOCKMODE) {
901 set_clockmode((uint8)data);
904 //if((addr >= 0x0006) && !(addr == 0x1f)) printf("MAINIO: WRITE: %08x DATA=%08x\n", addr, data);
908 io_w_latch[addr] = data;
910 if((addr < 0x90) && (addr >= 0x80)) {
911 #if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX)
912 mmr_table[addr - 0x80 + mmr_segment * 16] = data;
914 mmr_table[addr - 0x80 + (mmr_segment & 0x03) * 16] = data & 0x3f;
916 //printf("MMR: Write access segment=%02x addr=%02x page=%02x\n", mmr_segment, addr - 0x80, data);
922 set_port_fd00((uint8)data);
926 // set_lptdata_fd01((uint8)data);
929 set_port_fd02((uint8)data);
935 // set_flags_fd04(data);
938 set_fd05((uint8)data);
940 case 0x06: // RS-232C
943 case 0x08: // Light pen
948 //printf("PSG CMD WRITE val=%02x\n", data);
952 //printf("PSG DATA WRITE val=%02x\n", data);
958 #if defined(_FM77AV_VARIANTS)
960 flag = enable_initiator;
961 //printf("INITIATOR ENABLE = %02x\n", data);
962 enable_initiator = ((data & 0x02) == 0) ? true : false;
963 if(flag != enable_initiator) {
969 //mode320 = ((data & 0x40) != 0);
970 display->write_signal(SIG_DISPLAY_MODE320, data, 0x40);
973 sub_monitor_type = data & 0x07;
976 case 0x15: // OPN CMD
977 //printf("OPN CMD WRITE val=%02x\n", data);
978 set_opn_cmd(0, data);
980 case 0x16: // OPN DATA
981 //printf("OPN DATA WRITE val=%02x\n", data);
985 set_ext_fd17((uint8)data);
987 case 0x18: // FDC: COMMAND
988 set_fdc_cmd((uint8)data);
989 //printf("FDC: WRITE CMD %02x\n", data);
991 case 0x19: // FDC: Track
992 set_fdc_track((uint8)data);
993 //printf("FDC: WRITE TRACK REG %02x\n", data);
995 case 0x1a: // FDC: Sector
996 set_fdc_sector((uint8)data);
997 //printf("FDC: WRITE SECTOR REG %02x\n", data);
999 case 0x1b: // FDC: Data
1000 set_fdc_data((uint8)data);
1003 set_fdc_fd1c((uint8)data);
1004 //printf("FDC: WRITE HEAD REG %02x\n", data);
1007 set_fdc_fd1d((uint8)data);
1008 //printf("FDC: WRITE MOTOR REG %02x\n", data);
1013 case 0x20: // Kanji ROM
1014 case 0x2c: // Kanji ROM(DUP)
1015 write_kanjiaddr_hi((uint8)data);
1016 #if defined(CAPABLE_KANJI_CLASS2)
1017 write_kanjiaddr_hi_l2((uint8)data);
1020 case 0x21: // Kanji ROM
1021 case 0x2d: // Kanji ROM(DUP)
1022 write_kanjiaddr_lo((uint8)data);
1023 #if defined(CAPABLE_KANJI_CLASS2)
1024 write_kanjiaddr_lo_l2((uint8)data);
1027 #if defined(_FM77AV_VARIANTS)
1029 display->write_data8(FM7_SUBMEM_OFFSET_APALETTE_HI, data);
1032 display->write_data8(FM7_SUBMEM_OFFSET_APALETTE_LO, data);
1035 display->write_data8(FM7_SUBMEM_OFFSET_APALETTE_B, data);
1038 display->write_data8(FM7_SUBMEM_OFFSET_APALETTE_R, data);
1041 display->write_data8(FM7_SUBMEM_OFFSET_APALETTE_G, data);
1044 case 0x37: // Multi page
1045 display->write_signal(SIG_DISPLAY_MULTIPAGE, data, 0x00ff);
1047 case 0x45: // WHG CMD
1048 set_opn_cmd(1, data);
1050 case 0x46: // WHG DATA
1055 case 0x51: // THG CMD
1056 set_opn_cmd(2, data);
1058 case 0x52: // THG DATA
1063 #if defined(HAS_MMR)
1065 #if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX)
1066 mmr_segment = data & 7;
1068 // printf("MMR SEGMENT: %02x\n", data & 3);
1069 mmr_segment = data & 3;
1073 window_offset = data & 0x00ff;
1076 if((data & 0x01) == 0) {
1081 if((data & 0x40) == 0) {
1082 window_enabled = false;
1084 window_enabled = true;
1087 if((data & 0x80) == 0) {
1088 mmr_enabled = false;
1092 if(flag != mmr_enabled) {
1093 this->write_signal(FM7_MAINIO_CLOCKMODE, clock_fast ? 1 : 0, 1);
1098 //printf("MAIN: Write I/O Addr=%08x DATA=%02x\n", addr, data);
1101 if((addr < 0x40) && (addr >= 0x38)) {
1102 addr = (addr - 0x38) | FM7_SUBMEM_OFFSET_DPALETTE;
1103 display->write_data8(addr, (uint8)data);
1109 void FM7_MAINIO::event_callback(int event_id, int err)
1111 // printf("MAIN EVENT id=%d\n", event_id);
1113 case EVENT_BEEP_OFF:
1116 case EVENT_BEEP_CYCLE:
1119 case EVENT_UP_BREAK:
1120 set_break_key(false);
1122 case EVENT_TIMERIRQ_ON:
1123 if(!irqmask_timer) set_irq_timer(true);
1124 //register_event(this, EVENT_TIMERIRQ_OFF, 10000.0 / (4.9152 * 2.0) , false, NULL); // TIMER IRQ
1126 case EVENT_TIMERIRQ_OFF:
1127 if(!irqmask_timer) set_irq_timer(false);
1128 //register_event(this, EVENT_TIMERIRQ_ON, 2035, false, NULL); // TIMER ON
1130 case EVENT_FD_MOTOR_ON:
1131 set_fdc_motor(true);
1133 case EVENT_FD_MOTOR_OFF:
1134 set_fdc_motor(false);
1142 void FM7_MAINIO::update_config()
1144 switch(config.cpu_type){
1152 // this->write_signal(FM7_MAINIO_CLOCKMODE, clock_fast ? 1 : 0, 1);
1155 void FM7_MAINIO::event_vline(int v, int clock)
1157 if(sub_halt != sub_halt_bak) {
1158 display->write_signal(SIG_DISPLAY_HALT, (sub_halt) ? 0xff : 0x00, 0xff);
1160 sub_halt_bak = sub_halt;
1161 //if(firq_sub_attention != firq_sub_attention_bak){
1164 //firq_sub_attention_bak = firq_sub_attention;
1166 #if defined(_FM77AV_VARIANTS)
1167 if(sub_monitor_type != sub_monitor_bak) {
1168 display->write_signal(SIG_FM7_SUB_BANK, sub_monitor_type, 0x07);
1170 sub_monitor_bak = sub_monitor_type;