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"
15 void FM7_MAINIO::initialize(void)
22 // connect_fdc = true;
25 bootmode = config.boot_mode & 3;
26 register_event(this, EVENT_TIMERIRQ_ON, 4069.0, true, &event_timerirq); // TIMER IRQ
29 void FM7_MAINIO::reset(void)
31 if(event_beep >= 0) cancel_event(this, event_beep);
32 if(event_timerirq >= 0) cancel_event(this, event_timerirq);
34 register_event(this, EVENT_TIMERIRQ_ON, 4069.0, true, &event_timerirq); // TIMER IRQ
35 if(connect_fdc) fdc->reset();
36 if(connect_opn) opn[0]->reset();
37 if(connect_whg) opn[1]->reset();
38 if(connect_thg) opn[2]->reset();
39 #if !defined(_FM77AV_VARIANTS)
40 if(psg != NULL) psg->reset();
42 stat_romrammode = true;
43 bootmode = config.boot_mode & 3;
48 void FM7_MAINIO::set_clockmode(uint8 flags)
50 if(flags == FM7_MAINCLOCK_SLOW) {
57 uint8 FM7_MAINIO::get_clockmode(void)
59 if(clock_fast) return FM7_MAINCLOCK_SLOW;
60 return FM7_MAINCLOCK_HIGH;
64 uint8 FM7_MAINIO::get_port_fd00(void)
67 if(kbd_bit8) ret |= 0x80;
68 if(clock_fast) ret |= 0x01;
72 void FM7_MAINIO::set_port_fd00(uint8 data)
74 drec->write_signal(SIG_DATAREC_OUT, data, 0x01);
75 drec->write_signal(SIG_DATAREC_REMOTE, data, 0x02);
78 uint8 FM7_MAINIO::get_port_fd02(void)
81 // Still unimplemented printer.
82 ret = (cmt_indat) ? 0x80 : 0x00; // CMT
86 void FM7_MAINIO::set_port_fd02(uint8 val)
89 if((val & 0b00010000) != 0) {
94 if((val & 0b00000100) != 0) {
95 irqmask_timer = false;
99 if((val & 0b00000010) != 0) {
100 irqmask_printer = false;
102 irqmask_printer = true;
104 if((val & 0b00000001) != 0) {
105 irqmask_keyboard = false;
107 irqmask_keyboard = true;
113 uint32 FM7_MAINIO::get_keyboard(void)
115 uint32 kbd_data = (uint32) kbd_bit7_0;
117 if(kbd_bit8) kbd_data |= 0x0100;
121 void FM7_MAINIO::do_irq(bool flag)
124 maincpu->write_signal(SIG_CPU_IRQ, 1, 1);
126 maincpu->write_signal(SIG_CPU_IRQ, 0, 1);
131 void FM7_MAINIO::set_beep(uint32 data) // fd03
133 beep_flag = ((data & 0xc0) != 0);
134 beep_flag &= ((data & 0x01) != 0);
135 //beep->write_signal(SIG_BEEP_ON, data, 0b11000000);
136 //beep->write_signal(SIG_BEEP_MUTE, ~data , 0b00000001);
139 if(event_beep < 0) register_event(this, EVENT_BEEP_CYCLE, (1000.0 * 1000.0) / (1200.0 * 2.0), true, &event_beep);
140 pcm1bit->write_signal(SIG_PCM1BIT_ON, 1, 1);
142 if(event_beep >= 0) cancel_event(this, event_beep);
144 pcm1bit->write_signal(SIG_PCM1BIT_ON, 0, 1);
146 if((data & 0x40) != 0) {
147 // BEEP ON, after 205ms, BEEP OFF.
148 register_event(this, EVENT_BEEP_OFF, 205.0 * 1000.0, false, NULL); // NEXT CYCLE
152 void FM7_MAINIO::set_irq_timer(bool flag)
155 irqstat_reg0 &= 0b11111011;
156 if(!irqmask_timer) do_irq(true);
158 irqstat_reg0 |= 0b00000100;
159 if(!irqmask_timer) do_irq(false);
161 //printf("IRQ TIMER: %d MASK=%d\n", flag, irqmask_timer);
164 void FM7_MAINIO::set_irq_printer(bool flag)
166 if(flag && !irqmask_printer) {
167 irqstat_reg0 &= 0b11111101;
172 irqstat_reg0 |= 0b00000010;
177 void FM7_MAINIO::set_irq_keyboard(bool flag)
180 irqstat_reg0 &= 0b11111110;
181 if(!irqmask_keyboard) do_irq(true);
184 irqstat_reg0 |= 0b00000001;
185 if(!irqmask_keyboard) do_irq(false);
189 void FM7_MAINIO::set_irq_mfd(bool flag)
192 if(flag && connect_fdc) {
193 irqstat_fdc |= 0b01000000;
195 if((flag == false) && connect_fdc){
196 irqstat_fdc &= 0b10111111;
198 if(!irqmask_mfd) do_irq(flag);
202 void FM7_MAINIO::set_drq_mfd(bool flag)
205 if(flag && connect_fdc) {
206 irqstat_fdc |= 0b10000000;
208 if((flag == false) && connect_fdc){
209 irqstat_fdc &= 0b01111111;
211 if(!irqmask_mfd) do_irq(flag);
216 void FM7_MAINIO::set_keyboard(uint32 data)
218 if((data & 0x100) != 0){
223 kbd_bit7_0 = (data & 0xff);
226 void FM7_MAINIO::do_firq(bool flag)
229 maincpu->write_signal(SIG_CPU_FIRQ, 1, 1);
231 maincpu->write_signal(SIG_CPU_FIRQ, 0, 1);
235 void FM7_MAINIO::set_break_key(bool pressed)
237 firq_break_key = pressed;
240 void FM7_MAINIO::set_sub_attention(bool flag)
242 firq_sub_attention = flag;
247 uint8 FM7_MAINIO::get_fd04(void)
249 uint8 val = 0b11111100;
250 if(!firq_break_key) val |= 0b00000010;
251 if(!firq_sub_attention) val |= 0b00000001;
252 if(firq_sub_attention) {
253 firq_sub_attention = false;
259 void FM7_MAINIO::set_fd04(uint8 val)
265 uint8 FM7_MAINIO::get_fd05(void)
267 uint8 val = 0b01111110;
268 if(sub_busy) val |= 0b10000000;
269 if(!extdet_neg) val |= 0b00000001;
273 void FM7_MAINIO::set_fd05(uint8 val)
275 display->write_signal(SIG_FM7_SUB_HALT, val, 0b10000000);
276 display->write_signal(SIG_FM7_SUB_CANCEL, val, 0b01000000);
277 if((val & 0b10000000) == 0) {
283 if((val & 0b00000001) != 0) {
284 maincpu->write_signal(SIG_CPU_BUSREQ, 1, 1);
285 //z80->write_signal(SIG_CPU_BUSREQ, 0, 1);
287 maincpu->write_signal(SIG_CPU_BUSREQ, 0, 1);
288 //z80->write_signal(SIG_CPU_BUSREQ, 1, 1);
295 void FM7_MAINIO::set_extdet(bool flag)
300 void FM7_MAINIO::set_psg(uint8 val)
302 if(psg == NULL) return set_opn(val, 0); // 77AV ETC
303 switch(psg_cmdreg & 0x03){
304 case 0: // High inpedance
308 //psg_data = psg->read_io8(1);
310 case 2: // Write Data
311 psg->write_io8(1, val & 0x00ff);
312 psg->write_signal(SIG_YM2203_MUTE, 0x01, 0x01); // Okay?
314 case 3: // Register address
315 psg_address = val & 0x0f;
316 psg->write_io8(0, psg_address);
321 uint8 FM7_MAINIO::get_psg(void)
324 if(psg == NULL) return get_opn(0); // 77AV ETC
325 switch(psg_cmdreg & 0x03) {
330 val = psg->read_io8(1);
331 psg_data = val & 0x00ff;
334 val = 0xff; // Write conflict
337 val = psg->read_io8(1);
345 * $fd0d : After 77AV, this is OPN.
347 void FM7_MAINIO::set_psg_cmd(uint32 cmd)
353 psg_cmdreg = (uint8)(cmd & 0b00000011);
357 uint8 FM7_MAINIO::get_psg_cmd(void)
359 if(opn_psg_77av) return get_opn_cmd();
360 return ((psg_cmdreg & 0b00000011) | 0b11111100);
365 // Kanji ROM, FD20 AND FD21 (or SUBSYSTEM)
366 void FM7_MAINIO::write_kanjiaddr_hi(uint8 addr)
368 if(!connect_kanjiroml1) return;
373 void FM7_MAINIO::write_kanjiaddr_lo(uint8 addr)
375 if(!connect_kanjiroml1) return;
380 uint8 FM7_MAINIO::read_kanjidata_left(void)
384 if(!connect_kanjiroml1) return 0xff;
385 addr = ((uint32)kaddress_hi << 8) | (uint32)kaddress_lo;
388 return kanjiclass1->read_data8(addr);
394 uint8 FM7_MAINIO::read_kanjidata_right(void)
398 if(!connect_kanjiroml1) return 0xff;
399 addr = ((uint32)kaddress_hi << 8) | (uint32)kaddress_lo;
400 addr = (addr << 1) | 1;
402 return kanjiclass1->read_data8(addr);
408 #ifdef _FM77AV_VARIANTS
409 // Kanji ROM, FD20 AND FD21 (or SUBSYSTEM)
410 void FM7_MAINIO::write_kanjiaddr_hi_l2(uint8 addr)
412 if(!connect_kanjiroml2) return;
413 kaddress_hi_l2 = addr;
417 void FM7_MAINIO::write_kanjiaddr_lo_l2(uint8 addr)
419 if(!connect_kanjiroml2) return;
420 kaddress_lo_l2 = addr;
424 uint8 FM7_MAINIO::read_kanjidata_left_l2(void)
428 if(!connect_kanjiroml2) return 0xff;
429 addr = ((uint32)kaddress_hi_l2 << 8) | (uint32)kaddress_lo_l2;
432 return kanjiclass2->read_data8(addr);
438 uint8 FM7_MAINIO::read_kanjidata_right_l2(void)
442 if(!connect_kanjiroml2) return 0xff;
443 addr = ((uint32)kaddress_hi_l2 << 8) | (uint32)kaddress_lo_l2;
444 addr = (addr << 1) | 0x01;
446 return kanjiclass2->read_data8(addr);
453 // Write to FD16, same as
454 void FM7_MAINIO::set_opn(uint8 val, int index)
456 if((index > 2) || (index < 0)) return;
457 if(opn[index] == NULL) return;
458 if((opn_cmdreg[index] & 0b00001000) != 0) {
462 if((opn_cmdreg[index] & 0b00000100) != 0) {
466 switch(opn_cmdreg[index] & 0x03){
467 case 0: // High inpedance
471 //psg_data = psg->read_io8(1);
473 case 2: // Write Data
474 opn_data[index] = val & 0x00ff;
475 opn[index]->write_io8(1, val & 0x00ff);
476 opn[index]->write_signal(SIG_YM2203_MUTE, 0x01, 0x01); // Okay?
478 case 3: // Register address
479 opn_address[index] = val & 0x0f;
480 opn[index]->write_io8(0, psg_address);
485 uint8 FM7_MAINIO::get_opn(int index)
488 if((index > 2) || (index < 0)) return val;
489 if(opn[index] == NULL) return val;
490 if((opn_cmdreg[index] & 0b00001000) != 0) {
492 val = opn[index]->read_io8(1); // opn->joystick?
493 opn_data[index] = val & 0x00ff;
496 if((opn_cmdreg[index] & 0b00000100) != 0) {
498 val = opn[index]->read_io8(0);
499 opn_stat[index] = val & 0x00ff;
502 switch(opn_cmdreg[index] & 0x03) {
507 val = opn[index]->read_io8(1);
508 opn_data[index] = val & 0x00ff;
511 val = 0xff; // Write conflict
514 val = opn[index]->read_io8(1);
515 opn_address[index] = val;
523 void FM7_MAINIO::set_opn_cmd(uint32 cmd)
525 if(!connect_opn) return;
526 opn_cmdreg[0] = (uint8)(cmd & 0b00001111);
530 uint8 FM7_MAINIO::get_opn_cmd(void)
532 if(!connect_opn) return 0xff;
533 return ((opn_cmdreg[0] & 0b00001111) | 0b11110000);
536 void FM7_MAINIO::set_whg_cmd(uint32 cmd)
538 if(!connect_whg) return;
539 opn_cmdreg[1] = (uint8)(cmd & 0b00001111);
543 uint8 FM7_MAINIO::get_whg_cmd(void)
545 if(!connect_whg) return 0xff;
546 return ((opn_cmdreg[1] & 0b00001111) | 0b11110000);
549 void FM7_MAINIO::set_thg_cmd(uint32 cmd)
551 if(!connect_thg) return;
552 opn_cmdreg[2] = (uint8)(cmd & 0b00001111);
556 uint8 FM7_MAINIO::get_thg_cmd(void)
558 if(!connect_thg) return 0xff;
559 return ((opn_cmdreg[2] & 0b00001111) | 0b11110000);
562 void FM7_MAINIO::write_signal(int id, uint32 data, uint32 mask)
565 val_b = ((data & mask) != 0);
568 case FM7_MAINIO_CLOCKMODE: // fd00
577 #if defined(_FM77AV_VARIANTS) || defined(_FM77_VARIANTS)
581 clocks = 2016000; // Hz
583 clocks = 1230502; // (2016 * 1095 / 1794)[KHz]
587 clocks = 1565000; // Hz
589 clocks = 955226; // (1565 * 1095 / 1794)[KHz]
594 clocks = 1794000; // Hz
596 clocks = 1095000; // Hz
601 clocks = 1794000; // Hz
603 clocks = 1095000; // Hz
607 subclocks = 2000000; // Hz
609 subclocks = 999000; // Hz
611 p_vm->set_cpu_clock(this->maincpu, clocks);
612 p_vm->set_cpu_clock(this->subcpu, subclocks);
615 case FM7_MAINIO_CMT_RECV: // FD02
616 cmt_indat = val_b ^ cmt_invert;
618 case FM7_MAINIO_CMT_INVERT: // FD02
621 case FM7_MAINIO_TIMERIRQ: //
622 //set_irq_timer(val_b);
624 case FM7_MAINIO_LPTIRQ: //
625 set_irq_printer(val_b);
627 case FM7_MAINIO_KEYBOARDIRQ: //
628 set_irq_keyboard(val_b);
630 case FM7_MAINIO_PUSH_KEYBOARD:
631 set_keyboard(data & 0x1ff);
634 case FM7_MAINIO_PUSH_BREAK:
635 set_break_key(val_b);
637 case FM7_MAINIO_SUB_ATTENTION:
638 set_sub_attention(val_b);
641 case FM7_MAINIO_SUB_BUSY:
644 case FM7_MAINIO_EXTDET:
647 case FM7_MAINIO_BEEP:
650 register_event(this, EVENT_BEEP_CYCLE, (1000.0 * 1000.0) / (1200.0 * 2.0), true, &event_beep);
651 pcm1bit->write_signal(SIG_PCM1BIT_ON, 1, 1);
652 register_event(this, EVENT_BEEP_OFF, 205.0 * 1000.0, false, NULL); // NEXT CYCLE
654 case FM7_MAINIO_OPNPORTA_CHANGED:
655 opnport_a = data & mask;
657 case FM7_MAINIO_OPNPORTB_CHANGED:
658 opnport_a = data & mask;
660 case FM7_MAINIO_PSG_IRQ:
662 case FM7_MAINIO_OPN_IRQ:
666 case FM7_MAINIO_WHG_IRQ:
670 case FM7_MAINIO_THG_IRQ:
674 case FM7_MAINIO_FDC_DRQ:
677 case FM7_MAINIO_FDC_IRQ:
685 uint8 FM7_MAINIO::fdc_getdrqirq(void)
690 uint8 FM7_MAINIO::get_irqstat_fd03(void)
692 uint8 val = 0b11111000;
695 extirq = intstat_opn | intstat_mouse | fdc_irq;
696 extirq = extirq | intstat_thg | intstat_whg;
697 //extirq = extirq | intstat_syndet | intstat_rxrdy | intstat_txrdy;
698 if(extirq) val &= 0b11110111;
703 uint8 FM7_MAINIO::get_extirq_fd17(void)
706 if(intstat_opn) val &= 0b11110111;
707 if(intstat_mouse) val &= 0b11111011;
711 void FM7_MAINIO::set_ext_fd17(uint8 data)
713 if((data & 0b00000100) != 0) {
716 mouse_enable = false;
723 void FM7_MAINIO::set_fdc_cmd(uint8 val)
725 if(!connect_fdc) return;
727 fdc->write_io8(0, val & 0x00ff);
730 uint8 FM7_MAINIO::get_fdc_stat(void)
732 if(!connect_fdc) return 0xff;
733 this->write_signal(FM7_MAINIO_FDC_IRQ, 0, 1);
734 fdc_statreg = fdc->read_io8(0);
738 void FM7_MAINIO::set_fdc_track(uint8 val)
740 if(!connect_fdc) return;
741 // if mode is 2DD and type-of-image = 2D then val >>= 1;
743 fdc->write_io8(1, val & 0x00ff);
746 uint8 FM7_MAINIO::get_fdc_track(void)
748 if(!connect_fdc) return 0xff;
749 fdc_trackreg = fdc->read_io8(1);
753 void FM7_MAINIO::set_fdc_sector(uint8 val)
755 if(!connect_fdc) return;
757 fdc->write_io8(2, val & 0x00ff);
760 uint8 FM7_MAINIO::get_fdc_sector(void)
762 if(!connect_fdc) return 0xff;
763 fdc_sectreg = fdc->read_io8(2);
767 void FM7_MAINIO::set_fdc_data(uint8 val)
769 if(!connect_fdc) return;
771 fdc->write_io8(3, val & 0x00ff);
774 uint8 FM7_MAINIO::get_fdc_data(void)
776 if(!connect_fdc) return 0xff;
777 fdc_datareg = fdc->read_io8(3);
781 uint8 FM7_MAINIO::get_fdc_motor(void)
784 if(!connect_fdc) return 0xff;
785 if(fdc_motor) val = 0x80;
786 val = val | (fdc_drvsel & 0x03);
790 void FM7_MAINIO::set_fdc_fd1c(uint8 val)
792 if(!connect_fdc) return;
793 fdc_headreg = (val & 0x01) | 0xfe;
794 fdc->write_signal(SIG_MB8877_SIDEREG, val, 0x01);
797 uint8 FM7_MAINIO::get_fdc_fd1c(void)
799 if(!connect_fdc) return 0xff;
803 void FM7_MAINIO::set_fdc_fd1d(uint8 val)
805 if(!connect_fdc) return;
806 if((val & 0x80) != 0) {
811 // fdc->write_signal(SIG_MB8877_DRIVEREG, val, 0x07);
812 fdc->write_signal(SIG_MB8877_DRIVEREG, val, 0x03);
813 fdc->write_signal(SIG_MB8877_MOTOR, val, 0x80);
817 uint32 FM7_MAINIO::read_signal(uint32 addr)
819 uint32 retval = 0xffffffff;
825 uint32 FM7_MAINIO::read_data8(uint32 addr)
827 if(addr == FM7_MAINIO_IS_BASICROM) {
829 if(stat_bootsw_basic) retval = 0xffffffff;
831 } else if(addr == FM7_MAINIO_BOOTMODE) {
832 uint32 retval = bootmode & 0x03;
833 #if defined(_FM77) || defined(_FM77L2) || defined(_FM77L4) || defined(_FM77AV_VARIANTS)
834 if(bootram) retval = 4;
837 } else if(addr == FM7_MAINIO_READ_FD0F) {
838 if(stat_romrammode) return 0xffffffff;
840 } else if(addr == FM7_MAINIO_CLOCKMODE) {
841 return (uint32)get_clockmode();
844 else if(addr == FM7_MAINIO_MMR_ENABLED) {
845 uint32 retval = (mmr_enabled) ? 0xffffffff:0x00000000;
847 } else if(addr == FM7_MAINIO_WINDOW_ENABLED) {
848 uint32 retval = (window_enabled) ? 0xffffffff:0x00000000;
850 } else if(addr == FM7_MAINIO_MMR_SEGMENT) {
851 uint32 retval = (uint32) mmr_segment;
853 } else if((addr >= FM7_MAINIO_MMR_BANK) && (addr < (FM7_MAINIO_MMR_BANK + 64))) {
854 uint32 retval = (uint32)mmr_table[addr - FM7_MAINIO_MMR_BANK];
858 #if defined(_FM77AV_VARIANTS)
859 else if(addr == FM7_MAINIO_INITROM_ENABLED) {
862 #if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX)
863 else if(addr == FM7_MAINIO_EXTBANK) {
864 } else if(addr == FM7_MAINIO_EXTROM) {
867 //addr = addr & 0xff; //
868 // printf("Main I/O READ: %04x\n", addr);
871 case 0x100: // D400 (SUB)
872 return (uint32) get_port_fd00();
876 display->write_signal(SIG_FM7_SUB_KEY_FIRQ, 0, 1);
877 set_irq_keyboard(false);
878 return (uint32) kbd_bit7_0;
881 return (uint32) get_port_fd02();
884 return (uint32) get_irqstat_fd03();
887 return (uint32) get_fd04();
890 return (uint32) get_fd05();
892 case 0x06: // RS-232C
896 case 0x08: // Light pen
902 return (uint32) get_psg_cmd();
905 return (uint32) get_psg();
911 case 0x15: // OPN CMD
912 return (uint32) get_opn_cmd();
914 case 0x16: // OPN DATA
915 return (uint32) get_opn(0);
918 return (uint32) get_extirq_fd17();
920 case 0x18: // FDC: STATUS
921 return (uint32) get_fdc_stat();
923 case 0x19: // FDC: Track
924 return (uint32) get_fdc_track();
926 case 0x1a: // FDC: Sector
927 return (uint32) get_fdc_sector();
929 case 0x1b: // FDC: Data
930 return (uint32) get_fdc_data();
933 return (uint32) get_fdc_fd1c();
936 return (uint32) get_fdc_motor();
939 return (uint32) fdc_getdrqirq();
941 case 0x22: // Kanji ROM
942 return (uint32) read_kanjidata_left();
944 case 0x23: // Kanji ROM
945 return (uint32) read_kanjidata_right();
947 #if defined(_FM77AV_VARIANTS)
948 case 0x2e: // Kanji ROM Level2
949 return (uint32) read_kanjidata_left_l2();
951 case 0x2f: // Kanji ROM Level2
952 return (uint32) read_kanjidata_right_l2();
955 case 0x37: // Multi page
956 return (uint32)display->read_data8(DISPLAY_ADDR_MULTIPAGE);
961 if((addr < 0x40) && (addr >= 0x38)) {
962 addr = (addr - 0x38) + FM7_SUBMEM_OFFSET_DPALETTE;
963 return (uint32) display->read_data8(addr);
969 void FM7_MAINIO::write_data8(uint32 addr, uint32 data)
971 if(addr == FM7_MAINIO_BOOTMODE) {
972 bootmode = data & 0x03;
974 } else if(addr == FM7_MAINIO_CLOCKMODE) {
975 set_clockmode((uint8)data);
978 addr = addr & 0xff; //
982 set_port_fd00((uint8)data);
986 // set_lptdata_fd01((uint8)data);
989 set_port_fd02((uint8)data);
996 // set_flags_fd04(data);
999 set_fd05((uint8)data);
1001 case 0x06: // RS-232C
1004 case 0x08: // Light pen
1009 set_psg_cmd((uint8)data);
1012 set_psg((uint8)data);
1017 case 0x15: // OPN CMD
1018 set_opn_cmd((uint8)data);
1020 case 0x16: // OPN DATA
1021 set_opn(0, (uint8)data);
1024 set_ext_fd17((uint8)data);
1026 case 0x18: // FDC: COMMAND
1027 set_fdc_cmd((uint8)data);
1029 case 0x19: // FDC: Track
1030 set_fdc_track((uint8)data);
1032 case 0x1a: // FDC: Sector
1033 set_fdc_sector((uint8)data);
1035 case 0x1b: // FDC: Data
1036 set_fdc_data((uint8)data);
1039 set_fdc_fd1c((uint8)data);
1042 set_fdc_fd1d((uint8)data);
1047 case 0x20: // Kanji ROM
1048 write_kanjiaddr_hi((uint8)data);
1050 case 0x21: // Kanji ROM
1051 write_kanjiaddr_lo((uint8)data);
1053 #if defined(_FM77AV_VARIANTS)
1054 case 0x2c: // Kanji ROM
1055 write_kanjiaddr_hi_l2((uint8)data);
1057 case 0x2d: // Kanji ROM
1058 write_kanjiaddr_lo_l2((uint8)data);
1061 case 0x37: // Multi page
1062 display->write_signal(SIG_FM7_SUB_MULTIPAGE, data, 0x00ff);
1064 #if defined(_FM77) || defined(_FM77L2) || defined(_FM77L4) || defined(_FM77AV_VARIANTS)
1066 if((data & 0x01) == 0) {
1071 if((data & 0x40) == 0) {
1072 window_enabled = false;
1074 window_enabled = true;
1076 if((data & 0x80) == 0) {
1077 mmr_enabled = false;
1086 if((addr < 0x40) && (addr >= 0x38)) {
1087 addr = (addr - 0x38) | FM7_SUBMEM_OFFSET_DPALETTE;
1088 display->write_data8(addr, (uint8)data);
1094 void FM7_MAINIO::event_callback(int event_id, int err)
1096 // printf("MAIN EVENT id=%d\n", event_id);
1098 case EVENT_BEEP_OFF:
1099 //beep->write_signal(SIG_BEEP_ON, 0x00, 0x01);
1102 if(event_beep >= 0) {
1103 cancel_event(this, event_beep);
1106 pcm1bit->write_signal(SIG_PCM1BIT_ON, 0, 1);
1108 case EVENT_BEEP_CYCLE:
1109 beep_snd = !beep_snd;
1110 pcm1bit->write_signal(SIG_PCM1BIT_ON, beep_snd ? 1 : 0, 1);
1112 case EVENT_UP_BREAK:
1113 set_break_key(false);
1115 case EVENT_TIMERIRQ_ON:
1116 set_irq_timer(true);
1117 register_event(this, EVENT_TIMERIRQ_OFF, 2034, false, NULL); // TIMER OFF
1119 case EVENT_TIMERIRQ_OFF:
1120 set_irq_timer(false);
1121 //register_event(this, EVENT_TIMERIRQ_ON, 2035, false, NULL); // TIMER ON