From ab31f7b109c5b80ea08284fe3c4807e839b690c9 Mon Sep 17 00:00:00 2001 From: "K.Ohta" Date: Thu, 25 Jan 2018 17:19:36 +0900 Subject: [PATCH] [VM][FM8][MAINIO] Move FM-8 specified features to FM8_MAINIO:: . [VM][FM7][MAINIO][SOUND] Reduce hitting PCM1BIT:: when not sound buzzer. --- source/src/vm/fm7/CMakeLists.txt | 2 +- source/src/vm/fm7/floppy.cpp | 7 +- source/src/vm/fm7/fm7.cpp | 10 +- source/src/vm/fm7/fm7.h | 9 + source/src/vm/fm7/fm7_mainio.cpp | 758 ++++++++++++++------------------- source/src/vm/fm7/fm7_mainio.h | 135 +++--- source/src/vm/fm7/fm8_mainio.cpp | 497 +++++++++++++++++++++ source/src/vm/fm7/fm_bubblecasette.cpp | 5 +- source/src/vm/fm7/sound.cpp | 118 ++--- 9 files changed, 931 insertions(+), 610 deletions(-) create mode 100644 source/src/vm/fm7/fm8_mainio.cpp diff --git a/source/src/vm/fm7/CMakeLists.txt b/source/src/vm/fm7/CMakeLists.txt index fe4856aaa..56aa4c253 100644 --- a/source/src/vm/fm7/CMakeLists.txt +++ b/source/src/vm/fm7/CMakeLists.txt @@ -22,7 +22,7 @@ set(VM_FM7_LIB_SRCS ) if(BUILD_FM8) - set(VM_FM7_LIB_SRCS ${VM_FM7_LIB_SRCS} fm_bubblecasette.cpp) + set(VM_FM7_LIB_SRCS ${VM_FM7_LIB_SRCS} fm_bubblecasette.cpp fm8_mainio.cpp) elseif(BUILD_FM7) set(VM_FM7_LIB_SRCS ${VM_FM7_LIB_SRCS} jcommcard.cpp) elseif(BUILD_FMNEW7) diff --git a/source/src/vm/fm7/floppy.cpp b/source/src/vm/fm7/floppy.cpp index b3ac51a8b..727bee50d 100644 --- a/source/src/vm/fm7/floppy.cpp +++ b/source/src/vm/fm7/floppy.cpp @@ -95,7 +95,7 @@ void FM7_MAINIO::set_fdc_cmd(uint8_t val) uint8_t FM7_MAINIO::get_fdc_stat(void) { - uint32_t stat_backup = fdc_statreg; + //uint32_t stat_backup = fdc_statreg; if(!connect_fdc) return 0xff; fdc_statreg = fdc->read_io8(0); #ifdef _FM7_FDC_DEBUG @@ -286,6 +286,7 @@ void FM7_MAINIO::set_fdc_fd1e(uint8_t val) } #endif } + void FM7_MAINIO::set_irq_mfd(bool flag) { bool backup = irqstat_fdc; @@ -298,10 +299,10 @@ void FM7_MAINIO::set_irq_mfd(bool flag) #if defined(_FM77_VARIANTS) flag = flag & !(intmode_fdc); #endif -#if !defined(_FM8) // With FM8, $FD1F is alive and not do_irq(), Thanks to Anna_Wu. +//#if !defined(_FM8) // With FM8, $FD1F is alive and not do_irq(), Thanks to Anna_Wu. irqstat_fdc = flag & !irqmask_mfd; if(backup != irqstat_fdc) do_irq(); -#endif +//#endif return; } diff --git a/source/src/vm/fm7/fm7.cpp b/source/src/vm/fm7/fm7.cpp index 62dc54be6..6fabebde4 100644 --- a/source/src/vm/fm7/fm7.cpp +++ b/source/src/vm/fm7/fm7.cpp @@ -42,8 +42,11 @@ #if defined(_FM8) #include "./bubblecasette.h" #endif - +#if defined(_FM8) +#include "./fm8_mainio.h" +#else #include "./fm7_mainio.h" +#endif #include "./fm7_mainmem.h" #include "./fm7_display.h" #include "./fm7_keyboard.h" @@ -186,8 +189,11 @@ VM::VM(EMU* parent_emu): emu(parent_emu) #endif keyboard = new KEYBOARD(this, emu); display = new DISPLAY(this, emu); - +#if defined(_FM8) + mainio = new FM8_MAINIO(this, emu); +#else mainio = new FM7_MAINIO(this, emu); +#endif mainmem = new FM7_MAINMEM(this, emu); #if defined(_FM8) || defined(_FM7) || defined(_FMNEW7) diff --git a/source/src/vm/fm7/fm7.h b/source/src/vm/fm7/fm7.h index d1d139e2a..2a9817541 100644 --- a/source/src/vm/fm7/fm7.h +++ b/source/src/vm/fm7/fm7.h @@ -410,7 +410,12 @@ class HD6844; #endif class AND; class FM7_MAINMEM; +#if defined(_FM8) +class FM8_MAINIO; +#else class FM7_MAINIO; +#endif + class KEYBOARD; class KANJIROM; class JOYSTICK; @@ -432,7 +437,11 @@ protected: MC6809* maincpu; FM7_MAINMEM* mainmem; +#if defined(_FM8) + FM8_MAINIO* mainio; +#else FM7_MAINIO* mainio; +#endif MB8877* fdc; #if defined(_FM8) // FM8 diff --git a/source/src/vm/fm7/fm7_mainio.cpp b/source/src/vm/fm7/fm7_mainio.cpp index 5a766a6a6..3edbab9c4 100644 --- a/source/src/vm/fm7/fm7_mainio.cpp +++ b/source/src/vm/fm7/fm7_mainio.cpp @@ -23,18 +23,12 @@ #include "../and.h" #endif -#if defined(_FM8) -#include "bubblecasette.h" -#endif FM7_MAINIO::FM7_MAINIO(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu) { int i; p_vm = parent_vm; p_emu = parent_emu; -#if defined(_FM8) - psg = NULL; -#else for(i = 0; i < 3; i++) { opn[i] = NULL; } @@ -52,7 +46,7 @@ FM7_MAINIO::FM7_MAINIO(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, paren # if !defined(_FM77AV_VARIANTS) psg = NULL; #endif -#endif + drec = NULL; pcm1bit = NULL; joystick = NULL; @@ -73,10 +67,6 @@ FM7_MAINIO::FM7_MAINIO(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, paren #if defined(CAPABLE_JCOMMCARD) jcommcard = NULL; #endif -#if defined(_FM8) - bubble_casette[0] = NULL; - bubble_casette[1] = NULL; -#endif // FD00 clock_fast = true; lpt_strobe = false; // bit6 @@ -114,14 +104,6 @@ FM7_MAINIO::FM7_MAINIO(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, paren // FD0D // FD0F // FD15/ FD46 / FD51 -#if defined(_FM8) - connect_psg = false; - { - opn_address[0] = 0x00; - opn_data[0] = 0x00; - opn_cmdreg[0] = 0; - } -#else connect_opn = false; connect_whg = false; connect_thg = false; @@ -137,7 +119,6 @@ FM7_MAINIO::FM7_MAINIO(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, paren intstat_opn = false; intstat_mouse = false; mouse_enable = false; -#endif // FD18-FD1F connect_fdc = false; fdc_statreg = 0x00; @@ -333,11 +314,11 @@ void FM7_MAINIO::reset() maincpu->write_signal(SIG_CPU_HALTREQ, 0, 0xffffffff); -#if !defined(_FM8) - register_event(this, EVENT_TIMERIRQ_ON, 10000.0 / 4.9152, true, &event_timerirq); // TIMER IRQ -#endif - bootmode = config.boot_mode & 3; - memset(io_w_latch, 0xff, 0x100); +//#if !defined(_FM8) + register_event(this, EVENT_TIMERIRQ_ON, 10000.0 / 4.9152, true, &event_timerirq); // TIMER IRQ +//#endif + bootmode = config.boot_mode & 3; + memset(io_w_latch, 0xff, 0x100); } void FM7_MAINIO::reset_printer() @@ -383,11 +364,7 @@ uint8_t FM7_MAINIO::get_clockmode(void) uint8_t FM7_MAINIO::get_port_fd00(void) { uint8_t ret = 0x7e; //0b01111110; -#if defined(_FM8) - ret = 0xfe; -#else if(keyboard->read_data8(0x00) != 0) ret |= 0x80; // High bit. -#endif if(clock_fast) ret |= 0x01; //0b00000001; return ret; } @@ -441,7 +418,7 @@ uint8_t FM7_MAINIO::get_port_fd02(void) void FM7_MAINIO::set_port_fd02(uint8_t val) { -#if !defined(_FM8) +//#if !defined(_FM8) irqmask_reg0 = val; bool syndetirq_bak = irqmask_syndet; //bool rxrdyirq_bak = irqmask_rxrdy; @@ -511,25 +488,21 @@ void FM7_MAINIO::set_port_fd02(uint8_t val) display->write_signal(SIG_FM7_SUB_KEY_MASK, irqmask_keyboard ? 1 : 0, 1); set_irq_keyboard(irqreq_keyboard); } -#endif - return; +//#endif + return; } void FM7_MAINIO::set_irq_syndet(bool flag) { bool backup = intstat_syndet; irqreq_syndet = flag; -#if defined(_FM8) - intstat_syndet = flag; -#else if(flag && !(irqmask_syndet)) { - //irqstat_reg0 &= ~0x80; //~0x20; + //irqstat_reg0 &= ~0x80; //~0x20; intstat_syndet = true; } else { - // irqstat_reg0 |= 0x80; + // irqstat_reg0 |= 0x80; intstat_syndet = false; } -#endif if(backup != intstat_syndet) do_irq(); } @@ -538,17 +511,13 @@ void FM7_MAINIO::set_irq_rxrdy(bool flag) { bool backup = intstat_rxrdy; irqreq_rxrdy = flag; -#if defined(_FM8) - intstat_rxrdy = flag; -#else if(flag && !(irqmask_rxrdy)) { - //irqstat_reg0 &= ~0x40; //~0x20; + //irqstat_reg0 &= ~0x40; //~0x20; intstat_rxrdy = true; } else { - //irqstat_reg0 |= 0x40; + //irqstat_reg0 |= 0x40; intstat_rxrdy = false; } -#endif if(backup != intstat_rxrdy) do_irq(); } @@ -558,24 +527,19 @@ void FM7_MAINIO::set_irq_txrdy(bool flag) { bool backup = intstat_txrdy; irqreq_txrdy = flag; -#if defined(_FM8) - intstat_txrdy = flag; -#else if(flag && !(irqmask_txrdy)) { - //irqstat_reg0 &= ~0x20; //~0x20; + //irqstat_reg0 &= ~0x20; //~0x20; intstat_txrdy = true; } else { - //irqstat_reg0 |= 0x20; + //irqstat_reg0 |= 0x20; intstat_txrdy = false; } -#endif if(backup != intstat_txrdy) do_irq(); } void FM7_MAINIO::set_irq_timer(bool flag) { -#if !defined(_FM8) if(flag) { irqstat_reg0 &= 0xfb; //~0x04; irqstat_timer = true; @@ -584,12 +548,10 @@ void FM7_MAINIO::set_irq_timer(bool flag) irqstat_timer = false; } do_irq(); -#endif } void FM7_MAINIO::set_irq_printer(bool flag) { -#if !defined(_FM8) irqreq_printer = flag; if(flag && !(irqmask_printer)) { irqstat_reg0 &= ~0x02; @@ -599,7 +561,6 @@ void FM7_MAINIO::set_irq_printer(bool flag) irqstat_printer = false; } do_irq(); -#endif } void FM7_MAINIO::set_irq_keyboard(bool flag) @@ -623,21 +584,17 @@ void FM7_MAINIO::do_irq(void) bool intstat; uint32_t nval; -#if defined(_FM8) - intstat = intstat_txrdy | intstat_rxrdy | intstat_syndet; -#else intstat = irqstat_timer | irqstat_keyboard | irqstat_printer; intstat = intstat | irqstat_fdc; intstat = intstat | intstat_opn | intstat_whg | intstat_thg; intstat = intstat | intstat_txrdy | intstat_rxrdy | intstat_syndet; intstat = intstat | intstat_mouse; intstat = intstat | ((modem_irqmask_txrdy & modem_txrdy) | (modem_irqmask_rxrdy & modem_rxrdy) | modem_syndet); - intstat = intstat | (!(midi_uart_irqmask) & (midi_syndet | midi_txrdy | midi_rxrdy)); + intstat = intstat | ((!midi_uart_irqmask) & (midi_syndet | midi_txrdy | midi_rxrdy)); # if defined(HAS_DMA) intstat = intstat | intstat_dma; # endif -#endif nval = (intstat) ? 0xffffffff : 0; write_signals(&irq_bus, nval); } @@ -722,8 +679,8 @@ void FM7_MAINIO::set_fd04(uint8_t val) #endif } - // FD05 - uint8_t FM7_MAINIO::get_fd05(void) +// FD05 +uint8_t FM7_MAINIO::get_fd05(void) { uint8_t val = 0x7e; if(display->read_signal(SIG_DISPLAY_BUSY) != 0) val |= 0x80; @@ -731,17 +688,17 @@ void FM7_MAINIO::set_fd04(uint8_t val) return val; } - void FM7_MAINIO::set_fd05(uint8_t val) +void FM7_MAINIO::set_fd05(uint8_t val) { sub_cancel = ((val & 0x40) != 0) ? true : false; sub_halt = ((val & 0x80) != 0) ? true : false; //if(sub_halt != sub_halt_bak) { - display->write_signal(SIG_DISPLAY_HALT, (sub_halt) ? 0xff : 0x00, 0xff); + display->write_signal(SIG_DISPLAY_HALT, (sub_halt) ? 0xff : 0x00, 0xff); //} sub_halt_bak = sub_halt; //if(sub_cancel != sub_cancel_bak) { - display->write_signal(SIG_FM7_SUB_CANCEL, (sub_cancel) ? 0xff : 0x00, 0xff); // HACK + display->write_signal(SIG_FM7_SUB_CANCEL, (sub_cancel) ? 0xff : 0x00, 0xff); // HACK //} sub_cancel_bak = sub_cancel; #ifdef WITH_Z80 @@ -762,26 +719,11 @@ void FM7_MAINIO::set_extdet(bool flag) void FM7_MAINIO::write_fd0f(void) { -#if defined(_FM8) - if((config.dipswitch & FM7_DIPSW_FM8_PROTECT_FD0F) != 0) { - return; - } - bootmode = 1; // DOS : Where BUBBLE? - mainmem->write_signal(FM7_MAINIO_BOOTMODE, bootmode, 0xffffffff); - mainmem->write_signal(FM7_MAINIO_IS_BASICROM, 0, 0xffffffff); -#endif mainmem->write_signal(FM7_MAINIO_PUSH_FD0F, 0, 0xffffffff); } + uint8_t FM7_MAINIO::read_fd0f(void) { -#if defined(_FM8) - if((config.dipswitch & FM7_DIPSW_FM8_PROTECT_FD0F) != 0) { - return 0xff; - } - bootmode = 0; // BASIC - mainmem->write_signal(FM7_MAINIO_BOOTMODE, bootmode, 0xffffffff); - mainmem->write_signal(FM7_MAINIO_IS_BASICROM, 0xffffffff, 0xffffffff); -#endif mainmem->write_signal(FM7_MAINIO_PUSH_FD0F, 0xffffffff, 0xffffffff); return 0xff; } @@ -923,12 +865,12 @@ uint32_t FM7_MAINIO::read_signal(int id) { uint32_t retval; switch(id) { - case FM7_MAINIO_KEYBOARDIRQ_MASK: - retval = (irqmask_keyboard) ? 0xffffffff : 0x00000000; - break; - default: - retval = 0xffffffff; - break; + case FM7_MAINIO_KEYBOARDIRQ_MASK: + retval = (irqmask_keyboard) ? 0xffffffff : 0x00000000; + break; + default: + retval = 0xffffffff; + break; } return retval; } @@ -940,189 +882,189 @@ void FM7_MAINIO::write_signal(int id, uint32_t data, uint32_t mask) val_b = ((data & mask) != 0); switch(id) { - //case SIG_FM7_SUB_HALT: - // mainmem->write_signal(SIG_FM7_SUB_HALT, data, mask); - // break; - case FM7_MAINIO_CLOCKMODE: // fd00 - if(val_b) { - clock_fast = true; - } else { - clock_fast = false; - } - this->write_signals(&clock_status, clock_fast ? 0xffffffff : 0); - break; - case FM7_MAINIO_CMT_RECV: // FD02 - cmt_indat = val_b ^ cmt_invert; - break; - case FM7_MAINIO_CMT_INVERT: // FD02 - cmt_invert = val_b; - break; - case FM7_MAINIO_TIMERIRQ: // - set_irq_timer(val_b); - break; - case FM7_MAINIO_LPTIRQ: // - set_irq_printer(val_b); - break; - case FM7_MAINIO_LPT_BUSY: - lpt_busy = val_b; - break; - case FM7_MAINIO_LPT_ERROR: - lpt_error_inv = val_b; - break; - case FM7_MAINIO_LPT_ACK: - { - bool f = lpt_ackng_inv; - lpt_ackng_inv = val_b; - if((lpt_ackng_inv == true) && (f == false)) set_irq_printer(true); - } - break; - case FM7_MAINIO_LPT_PAPER_EMPTY: - lpt_busy = val_b; - break; - case FM7_MAINIO_LPT_DET1: - lpt_det1 = val_b; - break; - case FM7_MAINIO_LPT_DET2: - lpt_det2 = val_b; - break; - case FM7_MAINIO_KEYBOARDIRQ: // - set_irq_keyboard(val_b); - break; - // FD04 - case FM7_MAINIO_PUSH_BREAK: - set_break_key(val_b); - break; + //case SIG_FM7_SUB_HALT: + // mainmem->write_signal(SIG_FM7_SUB_HALT, data, mask); + // break; + case FM7_MAINIO_CLOCKMODE: // fd00 + if(val_b) { + clock_fast = true; + } else { + clock_fast = false; + } + this->write_signals(&clock_status, clock_fast ? 0xffffffff : 0); + break; + case FM7_MAINIO_CMT_RECV: // FD02 + cmt_indat = val_b ^ cmt_invert; + break; + case FM7_MAINIO_CMT_INVERT: // FD02 + cmt_invert = val_b; + break; + case FM7_MAINIO_TIMERIRQ: // + set_irq_timer(val_b); + break; + case FM7_MAINIO_LPTIRQ: // + set_irq_printer(val_b); + break; + case FM7_MAINIO_LPT_BUSY: + lpt_busy = val_b; + break; + case FM7_MAINIO_LPT_ERROR: + lpt_error_inv = val_b; + break; + case FM7_MAINIO_LPT_ACK: + { + bool f = lpt_ackng_inv; + lpt_ackng_inv = val_b; + if((lpt_ackng_inv == true) && (f == false)) set_irq_printer(true); + } + break; + case FM7_MAINIO_LPT_PAPER_EMPTY: + lpt_busy = val_b; + break; + case FM7_MAINIO_LPT_DET1: + lpt_det1 = val_b; + break; + case FM7_MAINIO_LPT_DET2: + lpt_det2 = val_b; + break; + case FM7_MAINIO_KEYBOARDIRQ: // + set_irq_keyboard(val_b); + break; + // FD04 + case FM7_MAINIO_PUSH_BREAK: + set_break_key(val_b); + break; #if defined(FM77AV_VARIANTS) - case FM7_MAINIO_HOT_RESET: - hotreset = val_b; - break; + case FM7_MAINIO_HOT_RESET: + hotreset = val_b; + break; #endif - case FM7_MAINIO_SUB_ATTENTION: - if(val_b) set_sub_attention(true); - break; - // FD05 - case FM7_MAINIO_EXTDET: - extdet_neg = !val_b; - break; - case FM7_MAINIO_BEEP: - set_beep_oneshot(); - break; - case FM7_MAINIO_PSG_IRQ: - break; + case FM7_MAINIO_SUB_ATTENTION: + if(val_b) set_sub_attention(true); + break; + // FD05 + case FM7_MAINIO_EXTDET: + extdet_neg = !val_b; + break; + case FM7_MAINIO_BEEP: + set_beep_oneshot(); + break; + case FM7_MAINIO_PSG_IRQ: + break; #if defined(WITH_Z80) - case FM7_MAINIO_RUN_Z80: - if((req_z80run)/* && (val_b) */) { - if(z80 != NULL) z80->write_signal(SIG_CPU_BUSREQ, 0, 1); - z80_run = true; - //z80->reset(); // OK? - } - break; - case FM7_MAINIO_RUN_6809: - if(!(req_z80run) /* && (val_b) */ && (z80_run)) { - z80_run = false; - // Wait dead cycle? - maincpu->write_signal(SIG_CPU_HALTREQ, 0, 1); - } - break; + case FM7_MAINIO_RUN_Z80: + if((req_z80run)/* && (val_b) */) { + if(z80 != NULL) z80->write_signal(SIG_CPU_BUSREQ, 0, 1); + z80_run = true; + //z80->reset(); // OK? + } + break; + case FM7_MAINIO_RUN_6809: + if(!(req_z80run) /* && (val_b) */ && (z80_run)) { + z80_run = false; + // Wait dead cycle? + maincpu->write_signal(SIG_CPU_HALTREQ, 0, 1); + } + break; #endif - case FM7_MAINIO_UART0_RXRDY: - set_irq_rxrdy(val_b & rs232c_enabled); - break; - case FM7_MAINIO_UART0_TXRDY: - set_irq_txrdy(val_b & rs232c_enabled); - break; - case FM7_MAINIO_UART0_SYNDET: - set_irq_syndet(val_b & rs232c_enabled); - break; - case FM7_MAINIO_UART0_DCD: - rs232c_dcd = val_b; - break; - case FM7_MAINIO_MODEM_TXRDY: - modem_txrdy = val_b; - do_irq(); - break; - case FM7_MAINIO_MODEM_RXRDY: - modem_rxrdy = val_b; - do_irq(); - break; - case FM7_MAINIO_MODEM_SYNDET: - modem_syndet = val_b; - do_irq(); - break; - case FM7_MAINIO_MIDI_TXRDY: - midi_txrdy = val_b; - do_irq(); - break; - case FM7_MAINIO_MIDI_RXRDY: - midi_rxrdy = val_b; - do_irq(); - break; - case FM7_MAINIO_MIDI_SYNDET: - midi_syndet = val_b; - do_irq(); - break; + case FM7_MAINIO_UART0_RXRDY: + set_irq_rxrdy(val_b & rs232c_enabled); + break; + case FM7_MAINIO_UART0_TXRDY: + set_irq_txrdy(val_b & rs232c_enabled); + break; + case FM7_MAINIO_UART0_SYNDET: + set_irq_syndet(val_b & rs232c_enabled); + break; + case FM7_MAINIO_UART0_DCD: + rs232c_dcd = val_b; + break; + case FM7_MAINIO_MODEM_TXRDY: + modem_txrdy = val_b; + do_irq(); + break; + case FM7_MAINIO_MODEM_RXRDY: + modem_rxrdy = val_b; + do_irq(); + break; + case FM7_MAINIO_MODEM_SYNDET: + modem_syndet = val_b; + do_irq(); + break; + case FM7_MAINIO_MIDI_TXRDY: + midi_txrdy = val_b; + do_irq(); + break; + case FM7_MAINIO_MIDI_RXRDY: + midi_rxrdy = val_b; + do_irq(); + break; + case FM7_MAINIO_MIDI_SYNDET: + midi_syndet = val_b; + do_irq(); + break; -#if !defined(_FM8) - case FM7_MAINIO_OPN_IRQ: - if(!connect_opn) break; - intstat_opn = val_b; - do_irq(); - break; - case FM7_MAINIO_WHG_IRQ: - if(!connect_whg) break; - intstat_whg = val_b; - do_irq(); - break; - case FM7_MAINIO_THG_IRQ: - if(!connect_thg) break; - intstat_thg = val_b; - do_irq(); - break; -#endif - case FM7_MAINIO_FDC_DRQ: - set_drq_mfd(val_b); - break; - case FM7_MAINIO_FDC_IRQ: - set_irq_mfd(val_b); - break; +//#if !defined(_FM8) + case FM7_MAINIO_OPN_IRQ: + if(!connect_opn) break; + intstat_opn = val_b; + do_irq(); + break; + case FM7_MAINIO_WHG_IRQ: + if(!connect_whg) break; + intstat_whg = val_b; + do_irq(); + break; + case FM7_MAINIO_THG_IRQ: + if(!connect_thg) break; + intstat_thg = val_b; + do_irq(); + break; +//#endif + case FM7_MAINIO_FDC_DRQ: + set_drq_mfd(val_b); + break; + case FM7_MAINIO_FDC_IRQ: + set_irq_mfd(val_b); + break; #if defined(HAS_DMA) - case FM7_MAINIO_DMA_INT: - intstat_dma = val_b; - do_irq(); - break; + case FM7_MAINIO_DMA_INT: + intstat_dma = val_b; + do_irq(); + break; #endif #if defined(_FM77AV_VARIANTS) - case SIG_DISPLAY_DISPLAY: - if(val_b) { - reg_fd12 |= 0x02; - } else { - reg_fd12 &= ~0x02; - } - break; - case SIG_DISPLAY_VSYNC: - if(val_b) { - reg_fd12 |= 0x01; - } else { - reg_fd12 &= ~0x01; - } - break; - case SIG_DISPLAY_MODE320: - if(val_b) { - reg_fd12 |= 0x40; - } else { - reg_fd12 &= ~0x40; - } - break; + case SIG_DISPLAY_DISPLAY: + if(val_b) { + reg_fd12 |= 0x02; + } else { + reg_fd12 &= ~0x02; + } + break; + case SIG_DISPLAY_VSYNC: + if(val_b) { + reg_fd12 |= 0x01; + } else { + reg_fd12 &= ~0x01; + } + break; + case SIG_DISPLAY_MODE320: + if(val_b) { + reg_fd12 |= 0x40; + } else { + reg_fd12 &= ~0x40; + } + break; #endif } } - uint8_t FM7_MAINIO::get_irqstat_fd03(void) +uint8_t FM7_MAINIO::get_irqstat_fd03(void) { uint8_t val; bool extirq; -#if !defined(_FM8) + extirq = irqstat_fdc | intstat_opn | intstat_whg | intstat_thg; extirq = extirq | intstat_syndet | intstat_rxrdy | intstat_txrdy; # if defined(HAS_DMA) @@ -1141,30 +1083,24 @@ void FM7_MAINIO::write_signal(int id, uint32_t data, uint32_t mask) do_irq(); //this->out_debug_log(_T("IO: Check IRQ Status.")); return val; -#else - return 0xff; -#endif + } uint8_t FM7_MAINIO::get_extirq_fd17(void) { uint8_t val = 0xff; -#if !defined(_FM8) if(intstat_opn && connect_opn) val &= ~0x08; if(intstat_mouse) val &= ~0x04; -#endif return val; } void FM7_MAINIO::set_ext_fd17(uint8_t data) { -#if !defined(_FM8) if((data & 0x04) != 0) { mouse_enable = true; } else { mouse_enable = false; } -#endif } #if defined(_FM77AV_VARIANTS) @@ -1212,7 +1148,7 @@ uint32_t FM7_MAINIO::read_data8(uint32_t addr) if((addr < 0x90) && (addr >= 0x80)) { mmr_segment = mainmem->read_data8(FM7_MAINIO_MMR_SEGMENT); # if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX) || \ - defined(_FM77AV20) || defined(_FM77AV20SX) || defined(_FM77AV20EX) + defined(_FM77AV20) || defined(_FM77AV20SX) || defined(_FM77AV20EX) mmr_segment &= 0x07; # else mmr_segment &= 0x03; @@ -1220,29 +1156,29 @@ uint32_t FM7_MAINIO::read_data8(uint32_t addr) return mainmem->read_data8(addr - 0x80 + FM7_MAINIO_MMR_BANK + mmr_segment * 16); } #endif - // if((addr >= 0x0006) && !(addr == 0x1f) && !(addr == 0x0b)) printf("MAINIO: READ: %08x \n", addr); + // if((addr >= 0x0006) && !(addr == 0x1f) && !(addr == 0x0b)) printf("MAINIO: READ: %08x \n", addr); switch(addr) { case 0x00: // FD00 retval = (uint32_t) get_port_fd00(); break; case 0x01: // FD01 -#if !defined(_FM8) +//#if !defined(_FM8) retval = keyboard->read_data8(0x01) & 0xff; -#endif - break; +//#endif + break; case 0x02: // FD02 retval = (uint32_t) get_port_fd02(); break; case 0x03: // FD03 -#if !defined(_FM8) +//#if !defined(_FM8) retval = (uint32_t) get_irqstat_fd03(); -#endif - break; +//#endif + break; case 0x04: // FD04 retval = (uint32_t) get_fd04(); break; case 0x05: // FD05 - retval = (uint32_t) get_fd05(); + retval = (uint32_t) get_fd05(); break; case 0x06: // RS-232C case 0x07: @@ -1271,18 +1207,6 @@ uint32_t FM7_MAINIO::read_data8(uint32_t addr) read_fd0f(); retval = 0xff; break; -#if defined(_FM8) - case 0x10: - case 0x11: - case 0x12: - case 0x13: - case 0x14: - case 0x15: - case 0x16: - case 0x17: - retval = bubble_casette[0]->read_data8(addr); - break; -#else #if defined(_FM77AV_VARIANTS) case 0x12: retval = subsystem_read_status(); @@ -1296,7 +1220,7 @@ uint32_t FM7_MAINIO::read_data8(uint32_t addr) case 0x17: retval = (uint32_t) get_extirq_fd17(); break; -#endif + #if defined(HAS_2HD) case 0x18: // FDC: STATUS if(stat_fdmode_2hd) { @@ -1422,7 +1346,7 @@ uint32_t FM7_MAINIO::read_data8(uint32_t addr) retval = (uint32_t) read_kanjidata_right_l2(); break; #endif -#if !defined(_FM8) +//#if !defined(_FM8) case 0x37: // Multi page //retval = (uint32_t)display->read_data8(DISPLAY_ADDR_MULTIPAGE); break; @@ -1445,12 +1369,12 @@ uint32_t FM7_MAINIO::read_data8(uint32_t addr) case 0x51: // THG CMD break; case 0x52: // THG DATA - retval = (uint32_t) get_opn(2); + retval = (uint32_t) get_opn(2); break; case 0x53: retval = (uint32_t) get_extirq_thg(); break; -#endif +//#endif #if defined(HAS_MMR) case 0x93: retval = 0x3e; @@ -1484,14 +1408,14 @@ uint32_t FM7_MAINIO::read_data8(uint32_t addr) default: break; } -#if !defined(_FM8) - if((addr < 0x40) && (addr >= 0x38)) { - addr = (addr - 0x38) + FM7_SUBMEM_OFFSET_DPALETTE; - return (uint32_t) display->read_data8(addr); - } -#endif - // Another: - return retval; +//#if !defined(_FM8) + if((addr < 0x40) && (addr >= 0x38)) { + addr = (addr - 0x38) + FM7_SUBMEM_OFFSET_DPALETTE; + return (uint32_t) display->read_data8(addr); + } +//#endif + // Another: + return retval; } else if(addr == FM7_MAINIO_CLOCKMODE) { return (uint32_t)get_clockmode(); } @@ -1510,7 +1434,7 @@ uint32_t FM7_MAINIO::read_data8(uint32_t addr) } #endif //if((addr >= 0x0006) && (addr != 0x1f)) printf("MAINIO: READ: %08x DATA=%08x\n", addr); - return 0xff; + return 0xff; } void FM7_MAINIO::write_dma_io8(uint32_t addr, uint32_t data) @@ -1535,7 +1459,7 @@ void FM7_MAINIO::write_data8(uint32_t addr, uint32_t data) if((addr < 0x90) && (addr >= 0x80)) { mmr_segment = mainmem->read_data8(FM7_MAINIO_MMR_SEGMENT); # if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX) || \ - defined(_FM77AV20) || defined(_FM77AV20SX) || defined(_FM77AV20EX) + defined(_FM77AV20) || defined(_FM77AV20SX) || defined(_FM77AV20EX) mmr_segment &= 0x07; # else mmr_segment &= 0x03; @@ -1606,18 +1530,6 @@ void FM7_MAINIO::write_data8(uint32_t addr, uint32_t data) case 0x0f: // FD0F write_fd0f(); break; -#if defined(_FM8) - case 0x10: - case 0x11: - case 0x12: - case 0x13: - case 0x14: - case 0x15: - case 0x16: - case 0x17: - bubble_casette[0]->write_data8(addr, data); - break; -#else #if defined(_FM77AV_VARIANTS) case 0x10: flag = ((data & 0x02) == 0) ? true : false; @@ -1644,7 +1556,6 @@ void FM7_MAINIO::write_data8(uint32_t addr, uint32_t data) case 0x17: set_ext_fd17((uint8_t)data); break; -#endif #if defined(HAS_2HD) case 0x18: // FDC: COMMAND if(stat_fdmode_2hd) { @@ -1787,7 +1698,7 @@ void FM7_MAINIO::write_data8(uint32_t addr, uint32_t data) display->write_data8(FM7_SUBMEM_OFFSET_APALETTE_G, data); break; #endif -#if !defined(_FM8) +//#if !defined(_FM8) case 0x37: // Multi page display->write_signal(SIG_DISPLAY_MULTIPAGE, data, 0x00ff); break; @@ -1819,7 +1730,7 @@ void FM7_MAINIO::write_data8(uint32_t addr, uint32_t data) break; case 0x53: break; -#endif +//#endif #if defined(HAS_MMR) case 0x90: #if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX) || \ @@ -1878,13 +1789,11 @@ void FM7_MAINIO::write_data8(uint32_t addr, uint32_t data) //printf("MAIN: Write I/O Addr=%08x DATA=%02x\n", addr, data); break; } -#if !defined(_FM8) if((addr < 0x40) && (addr >= 0x38)) { addr = (addr - 0x38) | FM7_SUBMEM_OFFSET_DPALETTE; display->write_data8(addr, (uint8_t)data); return; }// Another: -#endif return; } else if(addr == FM7_MAINIO_CLOCKMODE) { set_clockmode((uint8_t)data); @@ -1897,44 +1806,44 @@ void FM7_MAINIO::event_callback(int event_id, int err) { // printf("MAIN EVENT id=%d\n", event_id); switch(event_id) { - case EVENT_BEEP_OFF: - event_beep_off(); - break; - case EVENT_BEEP_CYCLE: - event_beep_cycle(); - break; - case EVENT_UP_BREAK: - set_break_key(false); - break; -#if !defined(_FM8) - case EVENT_TIMERIRQ_ON: - //if(!irqmask_timer) set_irq_timer(true); - set_irq_timer(!irqmask_timer); - break; -#endif - case EVENT_FD_MOTOR_ON: - set_fdc_motor(true); - event_fdc_motor = -1; - break; - case EVENT_FD_MOTOR_OFF: - set_fdc_motor(false); - event_fdc_motor = -1; - break; + case EVENT_BEEP_OFF: + event_beep_off(); + break; + case EVENT_BEEP_CYCLE: + event_beep_cycle(); + break; + case EVENT_UP_BREAK: + set_break_key(false); + break; +//#if !defined(_FM8) + case EVENT_TIMERIRQ_ON: + //if(!irqmask_timer) set_irq_timer(true); + set_irq_timer(!irqmask_timer); + break; +//#endif + case EVENT_FD_MOTOR_ON: + set_fdc_motor(true); + event_fdc_motor = -1; + break; + case EVENT_FD_MOTOR_OFF: + set_fdc_motor(false); + event_fdc_motor = -1; + break; #if defined(HAS_2HD) - case EVENT_FD_MOTOR_ON_2HD: - set_fdc_motor_2HD(true); - event_fdc_motor_2HD = -1; - break; - case EVENT_FD_MOTOR_OFF_2HD: - set_fdc_motor_2HD(false); - event_fdc_motor_2HD = -1; - break; + case EVENT_FD_MOTOR_ON_2HD: + set_fdc_motor_2HD(true); + event_fdc_motor_2HD = -1; + break; + case EVENT_FD_MOTOR_OFF_2HD: + set_fdc_motor_2HD(false); + event_fdc_motor_2HD = -1; + break; #endif - case EVENT_PRINTER_RESET_COMPLETED: - this->write_signals(&printer_reset_bus, 0x00); - break; - default: - break; + case EVENT_PRINTER_RESET_COMPLETED: + this->write_signals(&printer_reset_bus, 0x00); + break; + default: + break; } } @@ -1942,39 +1851,24 @@ void FM7_MAINIO::event_callback(int event_id, int err) void FM7_MAINIO::update_config() { switch(config.cpu_type){ - case 0: - clock_fast = true; - break; - case 1: - clock_fast = false; - break; + case 0: + clock_fast = true; + break; + case 1: + clock_fast = false; + break; } this->write_signals(&clock_status, clock_fast ? 0xffffffff : 0); -#if defined(_FM8) - // BASIC - if(config.boot_mode == 0) { - mainmem->write_signal(FM7_MAINIO_IS_BASICROM, 0xffffffff, 0xffffffff); - } else { - mainmem->write_signal(FM7_MAINIO_IS_BASICROM, 0, 0xffffffff); - } - mainmem->write_signal(FM7_MAINIO_PUSH_FD0F, (config.boot_mode == 0) ? 1 : 0, 0x01); - mainmem->write_signal(FM7_MAINIO_BOOTMODE, bootmode, 0xffffffff); -#endif } void FM7_MAINIO::event_vline(int v, int clock) { } -#define STATE_VERSION 10 -void FM7_MAINIO::save_state(FILEIO *state_fio) +#define STATE_VERSION 11 +void FM7_MAINIO::save_state_main(FILEIO *state_fio) { - int ch; - int addr; - state_fio->FputUint32_BE(STATE_VERSION); - state_fio->FputInt32_BE(this_device_id); - this->out_debug_log(_T("Save State: MAINIO: id=%d ver=%d\n"), this_device_id, STATE_VERSION); - + uint32_t addr; // Version 1 { for(addr = 0; addr < 0x100; addr++) state_fio->FputUint8(io_w_latch[addr]); @@ -2022,7 +1916,7 @@ void FM7_MAINIO::save_state(FILEIO *state_fio) state_fio->FputBool(stat_fdmode_2hd); state_fio->FputBool(stat_kanjirom); #elif defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \ - defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX) + defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX) state_fio->FputBool(stat_kanjirom); #endif state_fio->FputBool(firq_break_key); @@ -2038,34 +1932,6 @@ void FM7_MAINIO::save_state(FILEIO *state_fio) state_fio->FputBool(intstat_rxrdy); state_fio->FputBool(intstat_txrdy); - // FD0B - // FD0F -#if defined(_FM8) - state_fio->FputBool(connect_psg); -#else - state_fio->FputBool(connect_opn); - state_fio->FputBool(connect_whg); - state_fio->FputBool(connect_thg); - - state_fio->FputBool(opn_psg_77av); -#endif -#if defined(_FM8) - { - state_fio->FputUint32_BE(opn_address[0]); - state_fio->FputUint32_BE(opn_data[0]); - state_fio->FputUint32_BE(opn_stat[0]); - state_fio->FputUint32_BE(opn_cmdreg[0]); - state_fio->FputUint32_BE(opn_ch3mode[0]); - } -#else - for(ch = 0; ch < 4; ch++) { - state_fio->FputUint32_BE(opn_address[ch]); - state_fio->FputUint32_BE(opn_data[ch]); - state_fio->FputUint32_BE(opn_stat[ch]); - state_fio->FputUint32_BE(opn_cmdreg[ch]); - state_fio->FputUint32_BE(opn_ch3mode[ch]); - } -#endif state_fio->FputBool(intstat_opn); state_fio->FputBool(intstat_mouse); @@ -2074,7 +1940,7 @@ void FM7_MAINIO::save_state(FILEIO *state_fio) state_fio->FputBool(intstat_whg); state_fio->FputBool(intstat_thg); - // FDC + // FDC state_fio->FputBool(connect_fdc); state_fio->FputUint8(fdc_statreg); state_fio->FputUint8(fdc_cmdreg); @@ -2153,17 +2019,35 @@ void FM7_MAINIO::save_state(FILEIO *state_fio) #endif } -bool FM7_MAINIO::load_state(FILEIO *state_fio) +void FM7_MAINIO::save_state(FILEIO *state_fio) { int ch; int addr; - //bool stat = false; - uint32_t version; + state_fio->FputUint32_BE(STATE_VERSION); + state_fio->FputInt32_BE(this_device_id); + this->out_debug_log(_T("Save State: MAINIO: id=%d ver=%d\n"), this_device_id, STATE_VERSION); + + save_state_main(state_fio); + // FD0B + // FD0F + state_fio->FputBool(connect_opn); + state_fio->FputBool(connect_whg); + state_fio->FputBool(connect_thg); - version = state_fio->FgetUint32_BE(); - if(this_device_id != state_fio->FgetInt32_BE()) return false; - this->out_debug_log(_T("Load State: MAINIO: id=%d ver=%d\n"), this_device_id, version); + state_fio->FputBool(opn_psg_77av); + for(ch = 0; ch < 4; ch++) { + state_fio->FputUint32_BE(opn_address[ch]); + state_fio->FputUint32_BE(opn_data[ch]); + state_fio->FputUint32_BE(opn_stat[ch]); + state_fio->FputUint32_BE(opn_cmdreg[ch]); + state_fio->FputUint32_BE(opn_ch3mode[ch]); + } +} +bool FM7_MAINIO::load_state_main(FILEIO *state_fio, uint32_t version) +{ + int ch; + int addr; if(version >= 1) { for(addr = 0; addr < 0x100; addr++) io_w_latch[addr] = state_fio->FgetUint8(); // FD00 @@ -2210,7 +2094,7 @@ bool FM7_MAINIO::load_state(FILEIO *state_fio) stat_fdmode_2hd = state_fio->FgetBool(); stat_kanjirom = state_fio->FgetBool(); #elif defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \ - defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX) + defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX) stat_kanjirom = state_fio->FgetBool(); #endif firq_break_key = state_fio->FgetBool(); @@ -2226,34 +2110,6 @@ bool FM7_MAINIO::load_state(FILEIO *state_fio) intstat_rxrdy = state_fio->FgetBool(); intstat_txrdy = state_fio->FgetBool(); - // FD0B - // FD0F -#if defined(_FM8) - connect_psg = state_fio->FgetBool(); -#else - connect_opn = state_fio->FgetBool(); - connect_whg = state_fio->FgetBool(); - connect_thg = state_fio->FgetBool(); - - opn_psg_77av = state_fio->FgetBool(); -#endif -#if defined(_FM8) - { - opn_address[0] = state_fio->FgetUint32_BE(); - opn_data[0] = state_fio->FgetUint32_BE(); - opn_stat[0] = state_fio->FgetUint32_BE(); - opn_cmdreg[0] = state_fio->FgetUint32_BE(); - opn_ch3mode[0] = state_fio->FgetUint32_BE(); - } -#else - for(ch = 0; ch < 4; ch++) { - opn_address[ch] = state_fio->FgetUint32_BE(); - opn_data[ch] = state_fio->FgetUint32_BE(); - opn_stat[ch] = state_fio->FgetUint32_BE(); - opn_cmdreg[ch] = state_fio->FgetUint32_BE(); - opn_ch3mode[ch] = state_fio->FgetUint32_BE(); - } -#endif intstat_opn = state_fio->FgetBool(); intstat_mouse = state_fio->FgetBool(); mouse_enable = state_fio->FgetBool(); @@ -2337,7 +2193,35 @@ bool FM7_MAINIO::load_state(FILEIO *state_fio) fdc_2HD_motor = state_fio->FgetBool(); //state_fio->FputBool(irqstat_fdc); #endif + return true; +} + +bool FM7_MAINIO::load_state(FILEIO *state_fio) +{ + int ch; + int addr; + //bool stat = false; + uint32_t version; + version = state_fio->FgetUint32_BE(); + if(this_device_id != state_fio->FgetInt32_BE()) return false; + this->out_debug_log(_T("Load State: MAINIO: id=%d ver=%d\n"), this_device_id, version); + + if(!load_state_main(state_fio, version)) return false; + // FD0B + // FD0F + connect_opn = state_fio->FgetBool(); + connect_whg = state_fio->FgetBool(); + connect_thg = state_fio->FgetBool(); + + opn_psg_77av = state_fio->FgetBool(); + for(ch = 0; ch < 4; ch++) { + opn_address[ch] = state_fio->FgetUint32_BE(); + opn_data[ch] = state_fio->FgetUint32_BE(); + opn_stat[ch] = state_fio->FgetUint32_BE(); + opn_cmdreg[ch] = state_fio->FgetUint32_BE(); + opn_ch3mode[ch] = state_fio->FgetUint32_BE(); + } if(version != STATE_VERSION) return false; return true; } diff --git a/source/src/vm/fm7/fm7_mainio.h b/source/src/vm/fm7/fm7_mainio.h index 51fa7dac4..dbbef4576 100644 --- a/source/src/vm/fm7/fm7_mainio.h +++ b/source/src/vm/fm7/fm7_mainio.h @@ -27,15 +27,12 @@ class MB8877; class I8251; class AND; -#if defined(_FM8) -class BUBBLECASETTE; -#endif #if defined(HAS_DMA) class HD6844; #endif class FM7_MAINIO : public DEVICE { - private: + protected: bool opn_psg_77av; bool beep_flag; bool beep_snd; @@ -157,13 +154,13 @@ class FM7_MAINIO : public DEVICE { #endif /* FD15 / FD46 / FD51 : W */ -#if defined(_FM8) +//#if defined(_FM8) bool connect_psg; // [0] -#else +//#else bool connect_opn; // [0] bool connect_whg; // [1] bool connect_thg; // [2] -#endif +//#endif uint32_t opn_address[4]; uint32_t opn_data[4]; uint32_t opn_stat[4]; @@ -263,16 +260,16 @@ class FM7_MAINIO : public DEVICE { void set_cmt_motor(uint8_t flag); bool get_cmt_motor(void); - uint8_t get_port_fd00(void); - void set_port_fd00(uint8_t data); - uint8_t get_port_fd02(void); - void set_port_fd02(uint8_t val); - uint8_t get_irqstat_fd03(void); - uint8_t get_extirq_fd17(void); - void set_ext_fd17(uint8_t data); + virtual uint8_t get_port_fd00(void); + virtual void set_port_fd00(uint8_t data); + virtual uint8_t get_port_fd02(void); + virtual void set_port_fd02(uint8_t val); + virtual uint8_t get_irqstat_fd03(void); + virtual uint8_t get_extirq_fd17(void); + virtual void set_ext_fd17(uint8_t data); void set_beep(uint32_t data); // fd03 - void reset_sound(void); + virtual void reset_sound(void); void reset_printer(void); void reset_fdc(void); @@ -281,21 +278,21 @@ class FM7_MAINIO : public DEVICE { void reset_fdc_2HD(void); void set_fdc_motor_2HD(bool flag); - void do_irq(void); - void set_irq_syndet(bool flag); - void set_irq_rxrdy(bool flag); - void set_irq_txrdy(bool flag); - - void set_irq_timer(bool flag); - void set_irq_printer(bool flag); - void set_irq_keyboard(bool flag); - void set_irq_opn(bool flag); - void set_irq_mfd(bool flag); - void set_drq_mfd(bool flag); + virtual void do_irq(void); + virtual void set_irq_syndet(bool flag); + virtual void set_irq_rxrdy(bool flag); + virtual void set_irq_txrdy(bool flag); + + virtual void set_irq_timer(bool flag); + virtual void set_irq_printer(bool flag); + virtual void set_irq_keyboard(bool flag); + //virtual void set_irq_opn(bool flag); + virtual void set_irq_mfd(bool flag); + virtual void set_drq_mfd(bool flag); // FD04 - void do_firq(void); - void do_nmi(bool flag); + virtual void do_firq(void); + virtual void do_nmi(bool flag); void set_break_key(bool pressed); void set_sub_attention(bool flag); @@ -307,27 +304,27 @@ class FM7_MAINIO : public DEVICE { void set_extdet(bool flag); // FD0D - void set_psg(uint8_t val); - uint8_t get_psg(void); + virtual void set_psg(uint8_t val); + virtual uint8_t get_psg(void); // FD0E - void set_psg_cmd(uint8_t cmd); + virtual void set_psg_cmd(uint8_t cmd); - void write_fd0f(void); - uint8_t read_fd0f(void); + virtual void write_fd0f(void); + virtual uint8_t read_fd0f(void); bool get_rommode_fd0f(void); #if defined(_FM77AV_VARIANTS) // FD12 uint8_t subsystem_read_status(void); #endif // OPN - void opn_note_on(int index); - void set_opn(int index, uint8_t val); - uint8_t get_opn(int index); - void set_opn_cmd(int index, uint8_t cmd); - void write_opn_reg(int index, uint32_t addr, uint32_t data); + virtual void opn_note_on(int index); + virtual void set_opn(int index, uint8_t val); + virtual uint8_t get_opn(int index); + virtual void set_opn_cmd(int index, uint8_t cmd); + virtual void write_opn_reg(int index, uint32_t addr, uint32_t data); - uint8_t get_extirq_whg(void); - uint8_t get_extirq_thg(void); + virtual uint8_t get_extirq_whg(void); + virtual uint8_t get_extirq_thg(void); void write_kanjiaddr_lo(uint8_t addr); void write_kanjiaddr_hi(uint8_t addr); @@ -395,13 +392,7 @@ class FM7_MAINIO : public DEVICE { void event_beep_off(void); void event_beep_cycle(void); /* Devices */ -#if defined(_FM8) -# if defined(USE_AY_3_8910_AS_PSG) - AY_3_891X *psg; -# else - YM2203* opn[1]; // Optional PSG. -# endif -#else + YM2203* opn[3]; // 0=OPN 1=WHG 2=THG # if !defined(_FM77AV_VARIANTS) # if defined(USE_AY_3_8910_AS_PSG) @@ -410,7 +401,7 @@ class FM7_MAINIO : public DEVICE { YM2203* psg; // Optional PSG. # endif #endif -#endif + DATAREC* drec; DEVICE* pcm1bit; DEVICE* joystick; @@ -454,9 +445,6 @@ class FM7_MAINIO : public DEVICE { #if defined(CAPABLE_JCOMMCARD) DEVICE *jcommcard; #endif -#if defined(_FM8) - BUBBLECASETTE *bubble_casette[2]; -#endif public: FM7_MAINIO(VM* parent_vm, EMU* parent_emu); ~FM7_MAINIO(); @@ -465,24 +453,27 @@ public: uint8_t opn_regs[4][0x100]; uint32_t read_io8(uint32_t addr); // This is only for debug. - void initialize(); + virtual void initialize(); - void write_data8(uint32_t addr, uint32_t data); + virtual void write_data8(uint32_t addr, uint32_t data); void write_dma_data8(uint32_t addr, uint32_t data); void write_dma_io8(uint32_t addr, uint32_t data); - uint32_t read_data8(uint32_t addr); + virtual uint32_t read_data8(uint32_t addr); uint32_t read_dma_data8(uint32_t addr); uint32_t read_dma_io8(uint32_t addr); - void write_signal(int id, uint32_t data, uint32_t mask); - uint32_t read_signal(int id); + virtual void write_signal(int id, uint32_t data, uint32_t mask); + virtual uint32_t read_signal(int id); - void event_callback(int event_id, int err); - void reset(); - void update_config(); - void save_state(FILEIO *state_fio); - bool load_state(FILEIO *state_fio); + virtual void event_callback(int event_id, int err); + virtual void reset(); + virtual void update_config(); + virtual void save_state(FILEIO *state_fio); + virtual bool load_state(FILEIO *state_fio); + void save_state_main(FILEIO *state_fio); + bool load_state_main(FILEIO *state_fio, uint32_t version); + void set_context_printer(DEVICE *p) { printer = p; @@ -492,7 +483,7 @@ public: kanjiclass1 = p; if(p != NULL) connect_kanjiroml1 = true; } - void set_context_kanjirom_class2(DEVICE *p) + virtual void set_context_kanjirom_class2(DEVICE *p) { #if defined(_FM77AV_VARIANTS) kanjiclass2 = p; @@ -508,7 +499,7 @@ public: { drec = p; } -#if !defined(_FM8) +//#if !defined(_FM8) void set_context_opn(YM2203 *p, int ch) { if((ch < 0) || (ch > 2)) return; @@ -528,23 +519,17 @@ public: opn[ch] = p; extdet_neg = true; } -#endif +//#endif #if !defined(_FM77AV_VARIANTS) # if defined(USE_AY_3_8910_AS_PSG) - void set_context_psg(AY_3_891X *p) + virtual void set_context_psg(AY_3_891X *p) { psg = p; -# if defined(_FM8) - connect_psg = true; -# endif } # else - void set_context_psg(YM2203 *p) + virtual void set_context_psg(YM2203 *p) { psg = p; -# if defined(_FM8) - connect_psg = true; -# endif } # endif #endif @@ -599,12 +584,6 @@ public: void set_context_nmi(DEVICE *p, int id, uint32_t mask) { register_output_signal(&nmi_bus, p, id, mask); } -#if defined(_FM8) - void set_context_bubble(BUBBLECASETTE *p, int drive) { - if(drive > 2) return; - bubble_casette[drive] = p; - } -#endif void set_context_z80cpu(Z80 *p) { #ifdef WITH_Z80 diff --git a/source/src/vm/fm7/fm8_mainio.cpp b/source/src/vm/fm7/fm8_mainio.cpp new file mode 100644 index 000000000..bd59d1268 --- /dev/null +++ b/source/src/vm/fm7/fm8_mainio.cpp @@ -0,0 +1,497 @@ +/* + * FM-7 -> FM-8 Main I/O [fm8_mainio.h] + * + * Author: K.Ohta + * License: GPLv2 + * History: + * Jan 03, 2015 : Initial + * Jan 25, 2018 : Move some routines from fm7_mainio.h + * + */ + +#include "fm7.h" +#include "fm8_mainio.h" + +#include "../mc6809.h" +#include "../z80.h" + +#include "../datarec.h" +#include "../i8251.h" +#if defined(HAS_DMA) +#include "hd6844.h" +#endif +#include "../ym2203.h" +#include "../ay_3_891x.h" +#include "../pcm1bit.h" + +#include "bubblecasette.h" + +FM8_MAINIO::FM8_MAINIO(VM* parent_vm, EMU* parent_emu) : FM7_MAINIO(parent_vm, parent_emu) +{ + psg = NULL; + bubble_casette[0] = NULL; + bubble_casette[1] = NULL; + + // FD15/ FD46 / FD51 + connect_psg = false; + { + opn_address[0] = 0x00; + opn_data[0] = 0x00; + opn_cmdreg[0] = 0; + } +#if defined(HAS_DMA) + dmac = NULL; +#endif + set_device_name(_T("FM-8 MAIN I/O")); +} + +FM8_MAINIO::~FM8_MAINIO() +{ +} + + +void FM8_MAINIO::initialize() +{ + FM7_MAINIO::initialize(); +} + +void FM8_MAINIO::reset() +{ + FM7_MAINIO::reset(); + cancel_event(this, event_timerirq); +} + +uint8_t FM8_MAINIO::get_port_fd00(void) +{ + uint8_t ret = 0xfe; + if(clock_fast) ret |= 0x01; //0b00000001; + return ret; +} + +void FM8_MAINIO::set_port_fd02(uint8_t val) +{ + return; +} + +uint8_t FM8_MAINIO::get_irqstat_fd03(void) +{ + return 0xff; +} + +uint8_t FM8_MAINIO::get_extirq_fd17(void) +{ + uint8_t val = 0xff; + return val; +} + +void FM8_MAINIO::set_ext_fd17(uint8_t data) +{ +} + +void FM8_MAINIO::set_irq_syndet(bool flag) +{ + bool backup = intstat_syndet; + irqreq_syndet = flag; + intstat_syndet = flag; + if(backup != intstat_syndet) do_irq(); +} + +void FM8_MAINIO::set_irq_rxrdy(bool flag) +{ + bool backup = intstat_rxrdy; + irqreq_rxrdy = flag; + intstat_rxrdy = flag; + if(backup != intstat_rxrdy) do_irq(); +} + +void FM8_MAINIO::set_irq_txrdy(bool flag) +{ + bool backup = intstat_txrdy; + irqreq_txrdy = flag; + intstat_txrdy = flag; + if(backup != intstat_txrdy) do_irq(); +} + + +void FM8_MAINIO::set_irq_timer(bool flag) +{ +} + +void FM8_MAINIO::set_irq_printer(bool flag) +{ +} + +void FM8_MAINIO::set_irq_mfd(bool flag) +{ + //bool backup = irqstat_fdc; + if(!connect_fdc) return; + if(flag) { + irqreg_fdc |= 0x40; //0b01000000; + } else { + irqreg_fdc &= 0xbf; //0b10111111; + } + // With FM8, $FD1F is alive and not do_irq(), Thanks to Anna_Wu. +} + +void FM8_MAINIO::do_irq(void) +{ + bool intstat; + uint32_t nval; + intstat = intstat_txrdy | intstat_rxrdy | intstat_syndet; + nval = (intstat) ? 0xffffffff : 0; + write_signals(&irq_bus, nval); +} + +void FM8_MAINIO::write_fd0f(void) +{ + if((config.dipswitch & FM7_DIPSW_FM8_PROTECT_FD0F) != 0) { + return; + } + bootmode = 1; // DOS : Where BUBBLE? + mainmem->write_signal(FM7_MAINIO_BOOTMODE, bootmode, 0xffffffff); + mainmem->write_signal(FM7_MAINIO_IS_BASICROM, 0, 0xffffffff); + mainmem->write_signal(FM7_MAINIO_PUSH_FD0F, 0, 0xffffffff); +} + +uint8_t FM8_MAINIO::read_fd0f(void) +{ + if((config.dipswitch & FM7_DIPSW_FM8_PROTECT_FD0F) != 0) { + return 0xff; + } + bootmode = 0; // BASIC + mainmem->write_signal(FM7_MAINIO_BOOTMODE, bootmode, 0xffffffff); + mainmem->write_signal(FM7_MAINIO_IS_BASICROM, 0xffffffff, 0xffffffff); + mainmem->write_signal(FM7_MAINIO_PUSH_FD0F, 0xffffffff, 0xffffffff); + return 0xff; +} + +void FM8_MAINIO::reset_sound(void) +{ + if(psg != NULL) { + psg->reset(); + } + connect_psg = false; + if(config.sound_type == 0) { + connect_psg = false; + } else { + connect_psg = true; + } +# if defined(USE_AY_3_8910_AS_PSG) + psg->write_signal(SIG_AY_3_891X_MUTE, !connect_psg ? 0xffffffff : 0x00000000, 0xffffffff); +# else + psg->write_signal(SIG_YM2203_MUTE, !connect_psg ? 0xffffffff : 0x00000000, 0xffffffff); +# endif + pcm1bit->write_signal(SIG_PCM1BIT_MUTE, 0x01, 0x01); + pcm1bit->write_signal(SIG_PCM1BIT_ON, 0x00, 0x01); + +} + +void FM8_MAINIO::set_psg(uint8_t val) +{ + if(connect_psg) return set_opn(0, val); +} + +uint8_t FM8_MAINIO::get_psg(void) +{ + if(connect_psg) return get_opn(0); + return 0xff; +} +/* + * $fd0d : After 77AV, this is OPN. + */ +void FM8_MAINIO::set_psg_cmd(uint8_t cmd) +{ + cmd = cmd & 0x03; + if(connect_psg) set_opn_cmd(0, cmd); + return; +} +// OPN +// Write to FD16, same as +void FM8_MAINIO::write_opn_reg(int index, uint32_t addr, uint32_t data) +{ + if(connect_psg) { + opn_regs[0][addr] = data; + psg->write_io8(0, addr & 0x0f); + psg->write_io8(1, data); + return; + } +} + +void FM8_MAINIO::set_opn(int index, uint8_t val) +{ + if(!connect_psg) { + return; + } + if(index != 0) return; + if(psg == NULL) return; + opn_data[index] = val; + switch(opn_cmdreg[index]){ + case 0: // High inpedance + case 1: // Read Data + break; + case 2: // Write Data + write_opn_reg(index, opn_address[index], opn_data[index]); + break; + case 3: // Register address + if(index == 3) { + opn_address[index] = val & 0x0f; + } else { + opn_address[index] = val; + } + break; + default: + break; + } +} + +uint8_t FM8_MAINIO::get_opn(int index) +{ + uint8_t val = 0xff; + if(!connect_psg) return val; + if(index != 0) return val; + if(psg == NULL) return val; + switch(opn_cmdreg[index]) { + case 0: + case 1: + case 2: + case 3: + val = opn_data[index]; + break; + default: + break; + } + return val; +} + /* + * $fd16? + */ +void FM8_MAINIO::set_opn_cmd(int index, uint8_t cmd) +{ + if(!connect_psg) return; + if(index != 0) return; + if(psg == NULL) return; + uint32_t mask[16] = { // Parameter is related by XM7. Thanks Ryu. + 0xff, 0x0f, 0xff, 0x0f, + 0xff, 0x0f, 0x1f, 0xff, + 0x1f, 0x1f, 0x1f, 0xff, + 0xff, 0x0f, 0xff, 0xff + }; + opn_cmdreg[index] = cmd & 0x0f; + uint8_t val = opn_data[index]; + switch(opn_cmdreg[index]) { + case 0: + break; + case 1: + if(index == 0) { + psg->write_io8(0, opn_address[index]); + opn_data[index] = psg->read_io8(1); + } + if(opn_address[index] <= 0x0f) { + opn_data[index] &= mask[opn_address[index]]; + } + break; + case 2: + write_opn_reg(index, opn_address[index], opn_data[index]); + break; + case 3: // Register address + if(index == 3) { + opn_address[index] = val & 0x0f; + } else { + opn_address[index] = val; + } + + break; + default: + break; + } + return; +} +uint8_t FM8_MAINIO::get_extirq_whg(void) +{ + uint8_t val = 0xff; + return val; +} +uint8_t FM8_MAINIO::get_extirq_thg(void) +{ + uint8_t val = 0xff; + return val; +} +void FM8_MAINIO::opn_note_on(int index) +{ +} + +void FM8_MAINIO::write_signal(int id, uint32_t data, uint32_t mask) +{ + bool val_b = ((data & mask) != 0); + switch(id) { + case FM7_MAINIO_OPN_IRQ: + return; + break; + case FM7_MAINIO_WHG_IRQ: + return; + break; + case FM7_MAINIO_THG_IRQ: + return; + break; + case FM7_MAINIO_FDC_IRQ: + set_irq_mfd(val_b); + return; + break; + default: + break; + } + FM7_MAINIO::write_signal(id, data, mask); +} + +uint32_t FM8_MAINIO::read_data8(uint32_t addr) +{ + uint32_t retval = 0xff; + switch(addr) { + case 0x00: + retval = (uint32_t)get_port_fd00(); + return retval; + break; + case 0x01: // FD01 + retval = 0xff; + return retval; + break; + case 0x03: // FD03 + retval = 0xff; + return retval; + break; + case 0x0e: // PSG DATA + retval = (uint32_t) get_psg(); + //printf("PSG DATA READ val=%02x\n", retval); + return retval; + break; + case 0x0f: // FD0F + read_fd0f(); + retval = 0xff; + break; + case 0x10: + case 0x11: + case 0x12: + case 0x13: + case 0x14: + case 0x15: + case 0x16: + case 0x17: + retval = bubble_casette[0]->read_data8(addr); + return retval; + break; + case 0x37: // Multi page + retval = 0xff; + return; + break; + default: + break; + } + if((addr < 0x40) && (addr >= 0x38)) return 0xff; // Palette + if((addr < 0x54) && (addr >= 0x45)) return 0xff; // WHG, THG + if((addr >= 0x40) && (addr < 0x100)) return 0xff; // Another devices. + + return FM7_MAINIO::read_data8(addr); +} + +void FM8_MAINIO::write_data8(uint32_t addr, uint32_t data) +{ + switch(addr) { + case 0x02: + return set_port_fd02(data); + break; + case 0x10: + case 0x11: + case 0x12: + case 0x13: + case 0x14: + case 0x15: + case 0x16: + case 0x17: + bubble_casette[0]->write_data8(addr, data); + return; + break; + case 0x28: + case 0x29: + case 0x2a: + case 0x2b: + case 0x2c: + case 0x2d: + case 0x2e: + return; + break; + case 0x37: // Multi page + return; + break; + default: + break; + } + if((addr < 0x40) && (addr >= 0x38)) return; // palette + if((addr < 0x54) && (addr >= 0x45)) return; // WHG, THG + if((addr < 0x100) && (addr >= 0x40)) return; + FM7_MAINIO::write_data8(addr, data); +} + +void FM8_MAINIO::event_callback(int event_id, int err) +{ + if(event_id == EVENT_TIMERIRQ_ON) { + return; + } + FM7_MAINIO::event_callback(event_id, err); +} + +void FM8_MAINIO::update_config() +{ + FM7_MAINIO::update_config(); + // BASIC + if(config.boot_mode == 0) { + mainmem->write_signal(FM7_MAINIO_IS_BASICROM, 0xffffffff, 0xffffffff); + } else { + mainmem->write_signal(FM7_MAINIO_IS_BASICROM, 0, 0xffffffff); + } + mainmem->write_signal(FM7_MAINIO_PUSH_FD0F, (config.boot_mode == 0) ? 1 : 0, 0x01); + mainmem->write_signal(FM7_MAINIO_BOOTMODE, bootmode, 0xffffffff); +} + +#define STATE_VERSION 11 + +void FM8_MAINIO::save_state(FILEIO *state_fio) +{ + int ch; + int addr; + state_fio->FputUint32_BE(STATE_VERSION); + state_fio->FputInt32_BE(this_device_id); + this->out_debug_log(_T("Save State: MAINIO(FM8): id=%d ver=%d\n"), this_device_id, STATE_VERSION); + + FM7_MAINIO::save_state_main(state_fio); + // FD0B + // FD0F + state_fio->FputBool(connect_psg); + { + state_fio->FputUint32_BE(opn_address[0]); + state_fio->FputUint32_BE(opn_data[0]); + state_fio->FputUint32_BE(opn_stat[0]); + state_fio->FputUint32_BE(opn_cmdreg[0]); + state_fio->FputUint32_BE(opn_ch3mode[0]); + } +} + +bool FM8_MAINIO::load_state(FILEIO *state_fio) +{ + uint32_t version; + + version = state_fio->FgetUint32_BE(); + if(this_device_id != state_fio->FgetInt32_BE()) return false; + this->out_debug_log(_T("Load State: MAINIO(FM8): id=%d ver=%d\n"), this_device_id, version); + + if(!FM7_MAINIO::load_state_main(state_fio, version)) return false; + connect_psg = state_fio->FgetBool(); + { + opn_address[0] = state_fio->FgetUint32_BE(); + opn_data[0] = state_fio->FgetUint32_BE(); + opn_stat[0] = state_fio->FgetUint32_BE(); + opn_cmdreg[0] = state_fio->FgetUint32_BE(); + opn_ch3mode[0] = state_fio->FgetUint32_BE(); + } + if(version != STATE_VERSION) return false; + return true; +} diff --git a/source/src/vm/fm7/fm_bubblecasette.cpp b/source/src/vm/fm7/fm_bubblecasette.cpp index 61d900f34..81b3ba477 100644 --- a/source/src/vm/fm7/fm_bubblecasette.cpp +++ b/source/src/vm/fm7/fm_bubblecasette.cpp @@ -90,6 +90,7 @@ uint32_t BUBBLECASETTE::read_data8(uint32_t address) media_size_tmp = 0x20000; } else { //return val; // Not inserted. + mask = 0; } switch(address & 7) { case 0: // Data Resistor @@ -170,7 +171,7 @@ uint32_t BUBBLECASETTE::read_data8(uint32_t address) void BUBBLECASETTE::bubble_command(uint8_t cmd) { - uint16_t mask; + uint16_t mask = 0; uint16_t page_size_tmp; uint32_t media_size_tmp; if(bubble_type == BUBBLE_TYPE_32KB) { @@ -236,7 +237,7 @@ void BUBBLECASETTE::write_data8(uint32_t address, uint32_t data) { uint8_t val; uint32_t offset; - uint16_t mask; + uint16_t mask = 0; uint16_t page_size_tmp; uint32_t media_size_tmp; if(bubble_type == BUBBLE_TYPE_32KB) { diff --git a/source/src/vm/fm7/sound.cpp b/source/src/vm/fm7/sound.cpp index 5385eef56..ac6177e3d 100644 --- a/source/src/vm/fm7/sound.cpp +++ b/source/src/vm/fm7/sound.cpp @@ -20,7 +20,7 @@ void FM7_MAINIO::reset_sound(void) { int i, j; -#if !defined(_FM8) +//#if !defined(_FM8) for(i = 0; i < 3; i++) { opn_data[i]= 0; opn_cmdreg[i] = 0; @@ -40,15 +40,12 @@ void FM7_MAINIO::reset_sound(void) } } -#endif +//#endif #if !defined(_FM77AV_VARIANTS) if(psg != NULL) { psg->reset(); } #endif -#if defined(_FM8) - connect_psg = false; -#else #if defined(_FM77AV_VARIANTS) opn_psg_77av = true; #else @@ -56,15 +53,7 @@ void FM7_MAINIO::reset_sound(void) #endif connect_opn = connect_whg = connect_thg = false; if(opn_psg_77av) connect_opn = true; -#endif -#if defined(_FM8) - if(config.sound_type == 0) { - connect_psg = false; - } else { - connect_psg = true; - } -#else connect_thg = false; connect_whg = false; #if defined(_FM77AV_VARIANTS) @@ -102,17 +91,9 @@ void FM7_MAINIO::reset_sound(void) connect_opn = true; break; } -#endif pcm1bit->write_signal(SIG_PCM1BIT_MUTE, 0x01, 0x01); pcm1bit->write_signal(SIG_PCM1BIT_ON, 0x00, 0x01); -#if defined(_FM8) -# if defined(USE_AY_3_8910_AS_PSG) - psg->write_signal(SIG_AY_3_891X_MUTE, !connect_psg ? 0xffffffff : 0x00000000, 0xffffffff); -# else - psg->write_signal(SIG_YM2203_MUTE, !connect_psg ? 0xffffffff : 0x00000000, 0xffffffff); -# endif -#else opn[0]->write_signal(SIG_YM2203_MUTE, !connect_opn ? 0xffffffff : 0x00000000, 0xffffffff); opn[1]->write_signal(SIG_YM2203_MUTE, !connect_whg ? 0xffffffff : 0x00000000, 0xffffffff); opn[2]->write_signal(SIG_YM2203_MUTE, !connect_thg ? 0xffffffff : 0x00000000, 0xffffffff); @@ -123,32 +104,21 @@ void FM7_MAINIO::reset_sound(void) psg->write_signal(SIG_YM2203_MUTE, 0x00000000, 0xffffffff); # endif # endif -#endif } void FM7_MAINIO::set_psg(uint8_t val) { -#if defined(_FM8) - if(connect_psg) return set_opn(0, val); -#else if(opn_psg_77av) return set_opn(0, val); // 77AV ETC set_opn(3, val); -#endif } uint8_t FM7_MAINIO::get_psg(void) { - //uint8_t val = 0xff; -#if defined(_FM8) - if(connect_psg) return get_opn(0); - return 0xff; -#else if(opn_psg_77av) { return get_opn(0); } return get_opn(3); -#endif } /* @@ -157,31 +127,18 @@ uint8_t FM7_MAINIO::get_psg(void) void FM7_MAINIO::set_psg_cmd(uint8_t cmd) { cmd = cmd & 0x03; -#if defined(_FM8) - if(connect_psg) set_opn_cmd(0, cmd); - return; -#else if(opn_psg_77av) { set_opn_cmd(0, cmd); return; } set_opn_cmd(3, cmd); return; -#endif } // OPN // Write to FD16, same as void FM7_MAINIO::write_opn_reg(int index, uint32_t addr, uint32_t data) { -#if defined(_FM8) - if(connect_psg) { - opn_regs[0][addr] = data; - psg->write_io8(0, addr & 0x0f); - psg->write_io8(1, data); - return; - } -#else # if !defined(_FM77AV_VARIANTS) if(index == 3) { // PSG psg->write_io8(0, addr & 0x0f); @@ -200,18 +157,10 @@ void FM7_MAINIO::write_opn_reg(int index, uint32_t addr, uint32_t data) opn[index]->write_io8(1, data); opn_regs[index][addr] = data; return; -#endif } void FM7_MAINIO::set_opn(int index, uint8_t val) { -#if defined(_FM8) - if(!connect_psg) { - return; - } - if(index != 0) return; - if(psg == NULL) return; -#else if((index > 3) || (index < 0)) return; if((index == 0) && (!connect_opn)) return; if((index == 1) && (!connect_whg)) return; @@ -225,7 +174,7 @@ void FM7_MAINIO::set_opn(int index, uint8_t val) if(opn[index] == NULL) { return; } -#endif + opn_data[index] = val; switch(opn_cmdreg[index]){ case 0: // High inpedance @@ -239,13 +188,13 @@ void FM7_MAINIO::set_opn(int index, uint8_t val) opn_address[index] = val & 0x0f; } else { opn_address[index] = val; -#if !defined(_FM8) +//#if !defined(_FM8) if((val > 0x2c) && (val < 0x30)) { opn_data[index] = 0; opn[index]->write_io8(0, val); opn[index]->write_io8(1, 0); } -#endif +//#endif } break; default: @@ -256,11 +205,6 @@ void FM7_MAINIO::set_opn(int index, uint8_t val) uint8_t FM7_MAINIO::get_opn(int index) { uint8_t val = 0xff; -#if defined(_FM8) - if(!connect_psg) return val; - if(index != 0) return val; - if(psg == NULL) return val; -#else if((index > 2) || (index < 0)) return val; if((index == 0) && (!connect_opn)) return val; if((index == 1) && (!connect_whg)) return val; @@ -274,7 +218,7 @@ uint8_t FM7_MAINIO::get_opn(int index) if(opn[index] == NULL) { return val; } -#endif + switch(opn_cmdreg[index]) { case 0: case 1: @@ -282,7 +226,7 @@ uint8_t FM7_MAINIO::get_opn(int index) case 3: val = opn_data[index]; break; -#if !defined(_FM8) +//#if !defined(_FM8) case 4: opn_stat[index] = opn[index]->read_io8(0) & 0x03; if(index != 3) val = opn_stat[index]; @@ -295,7 +239,7 @@ uint8_t FM7_MAINIO::get_opn(int index) } return 0x00; break; -#endif +//#endif default: break; } @@ -306,11 +250,6 @@ uint8_t FM7_MAINIO::get_opn(int index) */ void FM7_MAINIO::set_opn_cmd(int index, uint8_t cmd) { -#if defined(_FM8) - if(!connect_psg) return; - if(index != 0) return; - if(psg == NULL) return; -#else if((index >= 4) || (index < 0)) return; if((index == 0) && (!connect_opn)) return; if((index == 1) && (!connect_whg)) return; @@ -321,7 +260,6 @@ void FM7_MAINIO::set_opn_cmd(int index, uint8_t cmd) if(psg == NULL) return; } # endif -#endif uint32_t mask[16] = { // Parameter is related by XM7. Thanks Ryu. 0xff, 0x0f, 0xff, 0x0f, 0xff, 0x0f, 0x1f, 0xff, @@ -334,12 +272,7 @@ void FM7_MAINIO::set_opn_cmd(int index, uint8_t cmd) case 0: break; case 1: -#if defined(_FM8) - if(index == 0) { - psg->write_io8(0, opn_address[index]); - opn_data[index] = psg->read_io8(1); - } -#elif !defined(_FM77AV_VARIANTS) +#if !defined(_FM77AV_VARIANTS) if(index == 3) { psg->write_io8(0, opn_address[index]); opn_data[index] = psg->read_io8(1); @@ -363,21 +296,21 @@ void FM7_MAINIO::set_opn_cmd(int index, uint8_t cmd) opn_address[index] = val & 0x0f; } else { opn_address[index] = val; -#if !defined(_FM8) +//#if !defined(_FM8) if((val > 0x2c) && (val < 0x30)) { opn_data[index] = 0; opn[index]->write_io8(0, val); opn[index]->write_io8(1, 0); } -#endif +//#endif } break; -#if !defined(_FM8) +//#if !defined(_FM8) case 4: opn_stat[index] = opn[index]->read_io8(0) & 0x03; break; -#endif +//#endif default: break; } @@ -387,25 +320,21 @@ void FM7_MAINIO::set_opn_cmd(int index, uint8_t cmd) uint8_t FM7_MAINIO::get_extirq_whg(void) { uint8_t val = 0xff; -#if !defined(_FM8) if(intstat_whg && connect_whg) val &= ~0x08; -#endif return val; } uint8_t FM7_MAINIO::get_extirq_thg(void) { uint8_t val = 0xff; -#if !defined(_FM8) if(intstat_thg && connect_thg) val &= ~0x08; -#endif return val; } void FM7_MAINIO::opn_note_on(int index) { uint8_t r; -#if !defined(_FM8) +//#if !defined(_FM8) if((index < 0) || (index >= 2)) return; // Not on for CSM mode. From XM7. Thanks, Ryu. r = opn_ch3mode[index]; @@ -413,7 +342,7 @@ void FM7_MAINIO::opn_note_on(int index) opn[index]->write_io8(0, 0x27); opn[index]->write_io8(1, opn_ch3mode[index] & 0xc0); } -#endif +//#endif } @@ -426,10 +355,17 @@ void FM7_MAINIO::set_beep(uint32_t data) // fd03 beep_snd = true; pcm1bit->write_signal(SIG_PCM1BIT_SIGNAL, 1, 1); pcm1bit->write_signal(SIG_PCM1BIT_ON, 1, 1); + //if(event_beep <= -1) { + // register_event(this, EVENT_BEEP_CYCLE, (1000.0 * 1000.0) / (1200.0 * 2.0), true, &event_beep); + //} } else { beep_snd = false; pcm1bit->write_signal(SIG_PCM1BIT_SIGNAL, 0, 1); pcm1bit->write_signal(SIG_PCM1BIT_ON, 0, 1); + //if(event_beep > -1) { + // cancel_event(this, event_beep); + // event_beep = -1; + //} } beep_flag = flag; } @@ -443,9 +379,13 @@ void FM7_MAINIO::set_beep(uint32_t data) // fd03 void FM7_MAINIO::set_beep_oneshot(void) // SUB:D4xx { beep_snd = true; + beep_flag = true; pcm1bit->write_signal(SIG_PCM1BIT_ON, 1, 1); if(event_beep_oneshot >= 0) cancel_event(this, event_beep_oneshot); register_event(this, EVENT_BEEP_OFF, 205.0 * 1000.0, false, &event_beep_oneshot); // NEXT CYCLE + //if(event_beep <= -1) { + // register_event(this, EVENT_BEEP_CYCLE, (1000.0 * 1000.0) / (1200.0 * 2.0), true, &event_beep); + //} } // EVENT_BEEP_OFF @@ -455,11 +395,15 @@ void FM7_MAINIO::event_beep_off(void) beep_snd = false; pcm1bit->write_signal(SIG_PCM1BIT_ON, 0, 1); event_beep_oneshot = -1; + //if(event_beep >= 0) cancel_event(this, event_beep); + //event_beep = -1; } // EVENT_BEEP_CYCLE void FM7_MAINIO::event_beep_cycle(void) { beep_snd = !beep_snd; - pcm1bit->write_signal(SIG_PCM1BIT_SIGNAL, beep_snd ? 1 : 0, 1); + if(beep_flag) { + pcm1bit->write_signal(SIG_PCM1BIT_SIGNAL, beep_snd ? 1 : 0, 1); + } } -- 2.11.0