From 6bc9dacb6f2f6d6dee466447dd4515a551310e04 Mon Sep 17 00:00:00 2001 From: "K.Ohta" Date: Sun, 22 Sep 2019 21:02:27 +0900 Subject: [PATCH] [VM][FM7][SOUND] Fix reading value of PSG register(s).Fix sound of FM-7's demonstration with FM-7/77 (not with 77AV variants). [VM][FM7][SOUND] Separate reset sequence for OPN/WHG/THG/PSG to a common function. [VM][FM7] Replace printf debug messages to out_debug_log(). --- source/src/vm/ay_3_891x.cpp | 1 - source/src/vm/fm7/display.cpp | 4 +- source/src/vm/fm7/fm7.cpp | 3 ++ source/src/vm/fm7/fm7_mainio.cpp | 74 +++++++++++++++++----------------- source/src/vm/fm7/fm7_mainio.h | 1 + source/src/vm/fm7/fm8_mainio.cpp | 2 +- source/src/vm/fm7/fm_bubblecasette.cpp | 4 +- source/src/vm/fm7/keyboard.cpp | 6 +-- source/src/vm/fm7/mainmem_mmr.cpp | 4 +- source/src/vm/fm7/mainmem_readseq.cpp | 2 +- source/src/vm/fm7/mb61vh010.cpp | 4 +- source/src/vm/fm7/sound.cpp | 73 +++++++++++++++++++++------------ 12 files changed, 101 insertions(+), 77 deletions(-) diff --git a/source/src/vm/ay_3_891x.cpp b/source/src/vm/ay_3_891x.cpp index 4cadc19e3..527fd5109 100644 --- a/source/src/vm/ay_3_891x.cpp +++ b/source/src/vm/ay_3_891x.cpp @@ -173,7 +173,6 @@ void AY_3_891X::write_signal(int id, uint32_t data, uint32_t mask) { if(id == SIG_AY_3_891X_MUTE) { mute = ((data & mask) != 0); - } else if(id == SIG_AY_3_891X_PORT_A) { if(_SUPPORT_AY_3_891X_PORT_A) { port[0].rreg = (port[0].rreg & ~mask) | (data & mask); diff --git a/source/src/vm/fm7/display.cpp b/source/src/vm/fm7/display.cpp index f2b36c13d..97b6ac7e3 100644 --- a/source/src/vm/fm7/display.cpp +++ b/source/src/vm/fm7/display.cpp @@ -1896,7 +1896,7 @@ void DISPLAY::write_signal(int id, uint32_t data, uint32_t mask) #endif case SIG_DISPLAY_EXTRA_MODE: // FD04 bit 4, 3 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) - //printf("Wrote $FD04: %02x\n", data); + //out_debug_log("Wrote $FD04: %02x\n", data); { int oldmode = display_mode; int mode; @@ -2024,7 +2024,7 @@ void DISPLAY::write_signal(int id, uint32_t data, uint32_t mask) case SIG_DISPLAY_MODE320: // FD12 bit 6 # if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) { - //printf("Wrote $FD12: %02x\n", data); + //out_debug_log("Wrote $FD12: %02x\n", data); int oldmode = display_mode; mode320 = flag; if(mode400line) { diff --git a/source/src/vm/fm7/fm7.cpp b/source/src/vm/fm7/fm7.cpp index ccf452976..0ef51083e 100644 --- a/source/src/vm/fm7/fm7.cpp +++ b/source/src/vm/fm7/fm7.cpp @@ -759,6 +759,7 @@ void VM::reset() } #if !defined(_FM77AV_VARIANTS) || defined(_FM8) # if defined(USE_AY_3_8910_AS_PSG) + psg->set_reg(0x27, 0); // set prescaler psg->set_reg(0x2e, 0); // set prescaler psg->write_signal(SIG_AY_3_891X_MUTE, 0x00, 0x01); // Okay? # else @@ -867,8 +868,10 @@ void VM::initialize_sound(int rate, int samples) opn[2]->initialize_sound(rate, (int)(4.9152 * 1000.0 * 1000.0 / 4.0), samples, 0, 0); # if !defined(_FM77AV_VARIANTS) psg->initialize_sound(rate, (int)(4.9152 * 1000.0 * 1000.0 / 4.0), samples, 0, 0); +# if defined(USE_AY_3_8910_AS_PSG) psg->set_low_pass_filter_freq(4500); psg->set_high_pass_filter_freq(50); +# endif # endif # if defined(_FM77AV_VARIANTS) keyboard_beep->initialize_sound(rate, 2400.0, 512); diff --git a/source/src/vm/fm7/fm7_mainio.cpp b/source/src/vm/fm7/fm7_mainio.cpp index c438d1163..87283ae57 100644 --- a/source/src/vm/fm7/fm7_mainio.cpp +++ b/source/src/vm/fm7/fm7_mainio.cpp @@ -586,7 +586,7 @@ void FM7_MAINIO::set_irq_printer(bool flag) void FM7_MAINIO::set_irq_keyboard(bool flag) { //uint8_t backup = irqstat_reg0; - //printf("MAIN: KEYBOARD: IRQ=%d MASK=%d\n", flag ,irqmask_keyboard); + //out_debug_log("MAIN: KEYBOARD: IRQ=%d MASK=%d\n", flag ,irqmask_keyboard); irqreq_keyboard = flag; if(flag && !irqmask_keyboard) { irqstat_reg0 &= 0xfe; @@ -699,7 +699,7 @@ uint8_t FM7_MAINIO::get_fd04(void) #endif if(firq_sub_attention) { set_sub_attention(false); - //printf("Attention \n"); + //out_debug_log("Attention \n"); } #if defined(_FM77AV_VARIANTS) if(hotreset) { @@ -840,7 +840,7 @@ uint8_t FM7_MAINIO::read_kanjidata_left(void) defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX) if(!stat_kanjirom) return 0xff; #endif - //printf("KANJI MAIN CLASS1 ADDR: %05x\n", kaddress.w.l); + //out_debug_log("KANJI MAIN CLASS1 ADDR: %05x\n", kaddress.w.l); if(kanjiclass1) { return kanjiclass1->read_data8(KANJIROM_DATA_HI); } else { @@ -1227,7 +1227,7 @@ 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)) out_debug_log("MAINIO: READ: %08x \n", addr); switch(addr) { case 0x00: // FD00 retval = (uint32_t) get_port_fd00(); @@ -1272,7 +1272,7 @@ uint32_t FM7_MAINIO::read_data8(uint32_t addr) #endif case 0x0e: // PSG DATA retval = (uint32_t) get_psg(); - //printf("PSG DATA READ val=%02x\n", retval); + //out_debug_log("PSG DATA READ reg=%d val=%02x\n", opn_address[3], retval); break; case 0x0f: // FD0F read_fd0f(); @@ -1283,7 +1283,7 @@ uint32_t FM7_MAINIO::read_data8(uint32_t addr) retval = subsystem_read_status(); break; #endif - //printf("OPN CMD READ \n"); + //out_debug_log("OPN CMD READ \n"); break; case 0x16: // OPN DATA retval = (uint32_t) get_opn(0); @@ -1300,7 +1300,7 @@ uint32_t FM7_MAINIO::read_data8(uint32_t addr) retval = (uint32_t) get_fdc_stat(); } break; - //printf("FDC: READ STATUS %02x PC=%04x\n", retval, maincpu->get_pc()); + //out_debug_log("FDC: READ STATUS %02x PC=%04x\n", retval, maincpu->get_pc()); break; case 0x19: // FDC: Track if(stat_fdmode_2hd) { @@ -1308,7 +1308,7 @@ uint32_t FM7_MAINIO::read_data8(uint32_t addr) } else { retval = (uint32_t) get_fdc_track(); } - //printf("FDC: READ TRACK REG %02x\n", retval); + //out_debug_log("FDC: READ TRACK REG %02x\n", retval); break; case 0x1a: // FDC: Sector if(stat_fdmode_2hd) { @@ -1316,7 +1316,7 @@ uint32_t FM7_MAINIO::read_data8(uint32_t addr) } else { retval = (uint32_t) get_fdc_sector(); } - //printf("FDC: READ SECTOR REG %02x\n", retval); + //out_debug_log("FDC: READ SECTOR REG %02x\n", retval); break; case 0x1b: // FDC: Data if(stat_fdmode_2hd) { @@ -1331,7 +1331,7 @@ uint32_t FM7_MAINIO::read_data8(uint32_t addr) } else { retval = (uint32_t) get_fdc_fd1c(); } - //printf("FDC: READ HEAD REG %02x\n", retval); + //out_debug_log("FDC: READ HEAD REG %02x\n", retval); break; case 0x1d: if(stat_fdmode_2hd) { @@ -1339,7 +1339,7 @@ uint32_t FM7_MAINIO::read_data8(uint32_t addr) } else { retval = (uint32_t) get_fdc_motor(); } - //printf("FDC: READ MOTOR REG %02x\n", retval); + //out_debug_log("FDC: READ MOTOR REG %02x\n", retval); break; case 0x1e: if(stat_fdmode_2hd) { @@ -1347,7 +1347,7 @@ uint32_t FM7_MAINIO::read_data8(uint32_t addr) } else { retval = (uint32_t) get_fdc_fd1e(); } - //printf("FDC: READ MOTOR REG %02x\n", retval); + //out_debug_log("FDC: READ MOTOR REG %02x\n", retval); break; case 0x1f: if(stat_fdmode_2hd) { @@ -1360,30 +1360,30 @@ uint32_t FM7_MAINIO::read_data8(uint32_t addr) case 0x18: // FDC: STATUS retval = (uint32_t) get_fdc_stat(); break; - //printf("FDC: READ STATUS %02x PC=%04x\n", retval, maincpu->get_pc()); + //out_debug_log("FDC: READ STATUS %02x PC=%04x\n", retval, maincpu->get_pc()); break; case 0x19: // FDC: Track retval = (uint32_t) get_fdc_track(); - //printf("FDC: READ TRACK REG %02x\n", retval); + //out_debug_log("FDC: READ TRACK REG %02x\n", retval); break; case 0x1a: // FDC: Sector retval = (uint32_t) get_fdc_sector(); - //printf("FDC: READ SECTOR REG %02x\n", retval); + //out_debug_log("FDC: READ SECTOR REG %02x\n", retval); break; case 0x1b: // FDC: Data retval = (uint32_t) get_fdc_data(); break; case 0x1c: retval = (uint32_t) get_fdc_fd1c(); - //printf("FDC: READ HEAD REG %02x\n", retval); + //out_debug_log("FDC: READ HEAD REG %02x\n", retval); break; case 0x1d: retval = (uint32_t) get_fdc_motor(); - //printf("FDC: READ MOTOR REG %02x\n", retval); + //out_debug_log("FDC: READ MOTOR REG %02x\n", retval); break; case 0x1e: retval = (uint32_t) get_fdc_fd1e(); - //printf("FDC: READ MOTOR REG %02x\n", retval); + //out_debug_log("FDC: READ MOTOR REG %02x\n", retval); break; case 0x1f: retval = (uint32_t) fdc_getdrqirq(); @@ -1504,7 +1504,7 @@ uint32_t FM7_MAINIO::read_data8(uint32_t addr) return retval; } #endif - //if((addr >= 0x0006) && (addr != 0x1f)) printf("MAINIO: READ: %08x DATA=%08x\n", addr); + //if((addr >= 0x0006) && (addr != 0x1f)) out_debug_log("MAINIO: READ: %08x DATA=%08x\n", addr); return 0xff; } @@ -1591,11 +1591,11 @@ void FM7_MAINIO::write_data8(uint32_t addr, uint32_t data) #endif break; case 0x0d: - //printf("PSG CMD WRITE val=%02x\n", data); + //out_debug_log("PSG CMD WRITE val=%02x\n", data); set_psg_cmd(data); break; case 0x0e: - //printf("PSG DATA WRITE val=%02x\n", data); + //out_debug_log("PSG DATA WRITE val=%02x\n", data); set_psg(data); break; case 0x0f: // FD0F @@ -1617,11 +1617,11 @@ void FM7_MAINIO::write_data8(uint32_t addr, uint32_t data) break; #endif case 0x15: // OPN CMD - //printf("OPN CMD WRITE val=%02x\n", data); + //out_debug_log("OPN CMD WRITE val=%02x\n", data); set_opn_cmd(0, data); break; case 0x16: // OPN DATA - //printf("OPN DATA WRITE val=%02x\n", data); + //out_debug_log("OPN DATA WRITE val=%02x\n", data); set_opn(0, data); break; case 0x17: @@ -1634,7 +1634,7 @@ void FM7_MAINIO::write_data8(uint32_t addr, uint32_t data) } else { set_fdc_cmd((uint8_t)data); } - //printf("FDC: WRITE CMD %02x\n", data); + //out_debug_log("FDC: WRITE CMD %02x\n", data); break; case 0x19: // FDC: Track if(stat_fdmode_2hd) { @@ -1642,7 +1642,7 @@ void FM7_MAINIO::write_data8(uint32_t addr, uint32_t data) } else { set_fdc_track((uint8_t)data); } - //printf("FDC: WRITE TRACK REG %02x\n", data); + //out_debug_log("FDC: WRITE TRACK REG %02x\n", data); break; case 0x1a: // FDC: Sector if(stat_fdmode_2hd) { @@ -1650,7 +1650,7 @@ void FM7_MAINIO::write_data8(uint32_t addr, uint32_t data) } else { set_fdc_sector((uint8_t)data); } - //printf("FDC: WRITE SECTOR REG %02x\n", data); + //out_debug_log("FDC: WRITE SECTOR REG %02x\n", data); break; case 0x1b: // FDC: Data if(stat_fdmode_2hd) { @@ -1665,7 +1665,7 @@ void FM7_MAINIO::write_data8(uint32_t addr, uint32_t data) } else { set_fdc_fd1c((uint8_t)data); } - //printf("FDC: WRITE HEAD REG %02x\n", data); + //out_debug_log("FDC: WRITE HEAD REG %02x\n", data); break; case 0x1d: if(stat_fdmode_2hd) { @@ -1673,7 +1673,7 @@ void FM7_MAINIO::write_data8(uint32_t addr, uint32_t data) } else { set_fdc_fd1d((uint8_t)data); } - //printf("FDC: WRITE MOTOR REG %02x\n", data); + //out_debug_log("FDC: WRITE MOTOR REG %02x\n", data); break; case 0x1e: if(stat_fdmode_2hd) { @@ -1688,26 +1688,26 @@ void FM7_MAINIO::write_data8(uint32_t addr, uint32_t data) #else case 0x18: // FDC: COMMAND set_fdc_cmd((uint8_t)data); - //printf("FDC: WRITE CMD %02x\n", data); + //out_debug_log("FDC: WRITE CMD %02x\n", data); break; case 0x19: // FDC: Track set_fdc_track((uint8_t)data); - //printf("FDC: WRITE TRACK REG %02x\n", data); + //out_debug_log("FDC: WRITE TRACK REG %02x\n", data); break; case 0x1a: // FDC: Sector set_fdc_sector((uint8_t)data); - //printf("FDC: WRITE SECTOR REG %02x\n", data); + //out_debug_log("FDC: WRITE SECTOR REG %02x\n", data); break; case 0x1b: // FDC: Data set_fdc_data((uint8_t)data); break; case 0x1c: set_fdc_fd1c((uint8_t)data); - //printf("FDC: WRITE HEAD REG %02x\n", data); + //out_debug_log("FDC: WRITE HEAD REG %02x\n", data); break; case 0x1d: set_fdc_fd1d((uint8_t)data); - //printf("FDC: WRITE MOTOR REG %02x\n", data); + //out_debug_log("FDC: WRITE MOTOR REG %02x\n", data); break; case 0x1e: set_fdc_fd1e((uint8_t)data); @@ -1808,7 +1808,7 @@ void FM7_MAINIO::write_data8(uint32_t addr, uint32_t data) defined(_FM77AV20) || defined(_FM77AV20SX) || defined(_FM77AV20EX) mmr_segment = data & 7; #else - // printf("MMR SEGMENT: %02x\n", data & 3); + // out_debug_log("MMR SEGMENT: %02x\n", data & 3); mmr_segment = data & 3; #endif mainmem->write_data8(FM7_MAINIO_MMR_SEGMENT, (uint32_t)mmr_segment); @@ -1857,7 +1857,7 @@ void FM7_MAINIO::write_data8(uint32_t addr, uint32_t data) } break; default: - //printf("MAIN: Write I/O Addr=%08x DATA=%02x\n", addr, data); + //out_debug_log("MAIN: Write I/O Addr=%08x DATA=%02x\n", addr, data); break; } if((addr < 0x40) && (addr >= 0x38)) { @@ -1870,12 +1870,12 @@ void FM7_MAINIO::write_data8(uint32_t addr, uint32_t data) set_clockmode((uint8_t)data); return; } - //if((addr >= 0x0006) && !(addr == 0x1f)) printf("MAINIO: WRITE: %08x DATA=%08x\n", addr, data); + //if((addr >= 0x0006) && !(addr == 0x1f)) out_debug_log("MAINIO: WRITE: %08x DATA=%08x\n", addr, data); } void FM7_MAINIO::event_callback(int event_id, int err) { -// printf("MAIN EVENT id=%d\n", event_id); +// out_debug_log("MAIN EVENT id=%d\n", event_id); switch(event_id) { case EVENT_BEEP_OFF: event_beep_off(); diff --git a/source/src/vm/fm7/fm7_mainio.h b/source/src/vm/fm7/fm7_mainio.h index 87d7e9ffb..0c2e2b59a 100644 --- a/source/src/vm/fm7/fm7_mainio.h +++ b/source/src/vm/fm7/fm7_mainio.h @@ -287,6 +287,7 @@ class FM7_MAINIO : public DEVICE { void set_beep(uint32_t data); // fd03 virtual void reset_sound(void); + void reset_opn_psg(int ch_num); void reset_printer(void); void reset_fdc(void); diff --git a/source/src/vm/fm7/fm8_mainio.cpp b/source/src/vm/fm7/fm8_mainio.cpp index 22f39d6e2..e8d7b92e3 100644 --- a/source/src/vm/fm7/fm8_mainio.cpp +++ b/source/src/vm/fm7/fm8_mainio.cpp @@ -366,7 +366,7 @@ uint32_t FM8_MAINIO::read_data8(uint32_t addr) break; case 0x0e: // PSG DATA retval = (uint32_t) get_psg(); - //printf("PSG DATA READ val=%02x\n", retval); + //out_debug_log("PSG DATA READ val=%02x\n", retval); return retval; break; case 0x0f: // FD0F diff --git a/source/src/vm/fm7/fm_bubblecasette.cpp b/source/src/vm/fm7/fm_bubblecasette.cpp index e9d60334c..f89b0f0a9 100644 --- a/source/src/vm/fm7/fm_bubblecasette.cpp +++ b/source/src/vm/fm7/fm_bubblecasette.cpp @@ -403,7 +403,7 @@ bool BUBBLECASETTE::open(_TCHAR* file_path, int bank) fio->Fopen(file_path, FILEIO_READ_WRITE_BINARY); file_length = fio->FileLength(); if(file_length == 0) return false; - //printf("Size=%d\n", file_length); + //out_debug_log("Size=%d\n", file_length); if(file_length == 0x8000) { // 32KB bubble_type = BUBBLE_TYPE_32KB; media_size = 0x8000; @@ -640,7 +640,7 @@ bool BUBBLECASETTE::write_one_page() return false; break; } - //printf("Write One Page: PAGE=%04x COUNT=%04x:\n ",page_address.w.l, page_count.w.l); + //out_debug_log("Write One Page: PAGE=%04x COUNT=%04x:\n ",page_address.w.l, page_count.w.l); if(remain < (int)(offset + page_size)) return false; fio->Fseek(f_pos + offset, FILEIO_SEEK_SET); fio->Fwrite(&bubble_data[offset], page_size, 1); diff --git a/source/src/vm/fm7/keyboard.cpp b/source/src/vm/fm7/keyboard.cpp index 6871c980a..3dad36c52 100644 --- a/source/src/vm/fm7/keyboard.cpp +++ b/source/src/vm/fm7/keyboard.cpp @@ -103,11 +103,11 @@ void KEYBOARD::set_modifiers(uint8_t sc, bool flag) } else if(sc == 0x53) { // LSHIFT lshift_pressed = flag; shift_pressed = lshift_pressed | rshift_pressed; - //printf("LSHIFT : %d\n", flag ? 1 : 0); + //out_debug_log("LSHIFT : %d\n", flag ? 1 : 0); } else if(sc == 0x54) { // RSHIFT rshift_pressed = flag; shift_pressed = lshift_pressed | rshift_pressed; - //printf("RSHIFT : %d\n", flag ? 1 : 0); + //out_debug_log("RSHIFT : %d\n", flag ? 1 : 0); } else if(sc == 0x56) { // GRPH graph_pressed = flag; } else if(sc == 0x55) { // CAPS @@ -718,7 +718,7 @@ void KEYBOARD::set_mode(void) mode = cmd_fifo->read(); if(mode <= KEYMODE_SCAN) { keymode = mode; - //printf("Keymode : %d\n", keymode); + //out_debug_log("Keymode : %d\n", keymode); //reset_unchange_mode(); beep_phase = 0; autokey_backup = 0x00; diff --git a/source/src/vm/fm7/mainmem_mmr.cpp b/source/src/vm/fm7/mainmem_mmr.cpp index d86d92dbc..351ac1390 100644 --- a/source/src/vm/fm7/mainmem_mmr.cpp +++ b/source/src/vm/fm7/mainmem_mmr.cpp @@ -19,7 +19,7 @@ int FM7_MAINMEM::window_convert(uint32_t addr, uint32_t *realaddr) raddr = ((window_offset * 256) + addr) & 0x0ffff; *realaddr = raddr; #ifdef _FM77AV_VARIANTS - //printf("TWR hit %04x -> %04x\n", addr, raddr); + //out_debug_log("TWR hit %04x -> %04x\n", addr, raddr); return FM7_MAINMEM_AV_PAGE0; // 0x00000 - 0x0ffff #else // FM77(L4 or others) *realaddr |= 0x20000; @@ -289,7 +289,7 @@ void FM7_MAINMEM::write_with_mmr(uint32_t addr, uint32_t segment, uint32_t data, void (__FASTCALL FM7_MAINMEM::*write_func)(uint32_t, uint32_t, bool); write_func = this->mmr_update_table_nor[n_pos].write_func; raddr = mmr_baseaddr_table_nor[n_pos] | (addr & 0xfff); - //printf("%08x %08x %08x\n", addr, raddr, n_pos); + //out_debug_log("%08x %08x %08x\n", addr, raddr, n_pos); (this->*write_func)(raddr, data, dmamode); } return; diff --git a/source/src/vm/fm7/mainmem_readseq.cpp b/source/src/vm/fm7/mainmem_readseq.cpp index 5bf00fc62..f87867ca4 100644 --- a/source/src/vm/fm7/mainmem_readseq.cpp +++ b/source/src/vm/fm7/mainmem_readseq.cpp @@ -134,7 +134,7 @@ uint32_t FM7_MAINMEM::read_data8_main(uint32_t addr, bool dmamode) } if((addr >= 0xfffe) && (addr < 0x10000)) { uint32_t raddr = addr - 0xe000; - //printf("%04x %02x\n", raddr, fm7_mainmem_initrom[raddr]); + //out_debug_log("%04x %02x\n", raddr, fm7_mainmem_initrom[raddr]); iowait(); return fm7_mainmem_initrom[raddr]; } diff --git a/source/src/vm/fm7/mb61vh010.cpp b/source/src/vm/fm7/mb61vh010.cpp index 520e0a6f0..fa1ae1779 100644 --- a/source/src/vm/fm7/mb61vh010.cpp +++ b/source/src/vm/fm7/mb61vh010.cpp @@ -373,7 +373,7 @@ void MB61VH010::do_alucmds_dmyread(uint32_t addr) do_compare(addr); break; } - //printf("ALU DMYREAD ADDR=%04x, CMD=%02x CMP STATUS=%02x DISABLE=%01x\n", addr, command_reg, cmp_status_reg, bank_disable_reg); + //out_debug_log("ALU DMYREAD ADDR=%04x, CMD=%02x CMP STATUS=%02x DISABLE=%01x\n", addr, command_reg, cmp_status_reg, bank_disable_reg); //if(eventid_busy >= 0) cancel_event(this, eventid_busy) ; //register_event(this, EVENT_MB61VH010_BUSY_OFF, 1.0 / 16.0, false, &eventid_busy) ; } @@ -413,7 +413,7 @@ void MB61VH010::do_alucmds(uint32_t addr) do_compare(addr); break; } - //printf("ALU CMDS ADDR=%04x, CMD=%02x CMP STATUS=%02x\n", addr, command_reg, cmp_status_reg); + //out_debug_log("ALU CMDS ADDR=%04x, CMD=%02x CMP STATUS=%02x\n", addr, command_reg, cmp_status_reg); return; } diff --git a/source/src/vm/fm7/sound.cpp b/source/src/vm/fm7/sound.cpp index 159e3dd84..b239c3de8 100644 --- a/source/src/vm/fm7/sound.cpp +++ b/source/src/vm/fm7/sound.cpp @@ -20,32 +20,42 @@ namespace FM7 { +void FM7_MAINIO::reset_opn_psg(int ch_num) +{ + if((ch_num < 0) || (ch_num > 3)) return; + opn_data[ch_num]= 0; + opn_cmdreg[ch_num] = 0; + opn_address[ch_num] = 0; + opn_stat[ch_num] = 0; + opn_prescaler_type[ch_num] = 1; + memset(opn_regs[ch_num], 0x00, 0x100 * sizeof(uint8_t)); + if(ch_num == 3) { +#if !defined(_FM77AV_VARIANTS) + if(psg != NULL) { + psg->reset(); + write_opn_reg(3, 0x2e, 0); + write_opn_reg(3, 0x27, 0); + write_opn_reg(3, 0, 0); + } +#endif + return; + } + if(opn[ch_num] != NULL) { + opn[ch_num]->reset(); + write_opn_reg(ch_num, 0x2e, 0); + write_opn_reg(ch_num, 0x27, 0); + } + return; +} + void FM7_MAINIO::reset_sound(void) { int i, j; -//#if !defined(_FM8) - for(i = 0; i < 3; i++) { - opn_data[i]= 0; - opn_cmdreg[i] = 0; - opn_address[i] = 0; - opn_stat[i] = 0; - opn_prescaler_type[i] = 1; - memset(opn_regs[i], 0x00, 0x100 * sizeof(uint8_t)); - if(opn[i] != NULL) { - opn[i]->reset(); - write_opn_reg(i, 0x2e, 0); - write_opn_reg(i, 0x27, 0); - } + for(i = 0; i < 4; i++) { + reset_opn_psg(i); } -//#endif -#if !defined(_FM77AV_VARIANTS) - if(psg != NULL) { - psg->reset(); - write_opn_reg(3, 0x2e, 0); - write_opn_reg(3, 0x27, 0); - } -#endif + #if defined(_FM77AV_VARIANTS) opn_psg_77av = true; #else @@ -240,7 +250,7 @@ void FM7_MAINIO::set_opn(int index, uint8_t val) uint8_t FM7_MAINIO::get_opn(int index) { uint8_t val = 0xff; - if((index > 2) || (index < 0)) return val; + if((index > 3) || (index < 0)) return val; if((index == 0) && (!connect_opn)) return val; if((index == 1) && (!connect_whg)) return val; if((index == 2) && (!connect_thg)) return val; @@ -250,10 +260,19 @@ uint8_t FM7_MAINIO::get_opn(int index) if(psg == NULL) return val; } else # endif - if(opn[index] == NULL) { - return val; - } + if(opn[index] == NULL) { + return val; + } + // 20190922 from XM7 3477a. + static const uint8_t opn_bitmask[16] = { + 0xff, 0x0f, 0xff, 0x0f, + 0xff, 0x0f, 0x1f, 0xff, + 0x1f, 0x1f, 0x1f, 0xff, + 0xff, 0x0f, 0xff, 0xff, + }; + if(index == 3) opn_cmdreg[index] = opn_cmdreg[index] & 0x03; + switch(opn_cmdreg[index]) { case 0: // Unavailable val = 0xff; @@ -267,7 +286,9 @@ uint8_t FM7_MAINIO::get_opn(int index) } else { # if !defined(_FM77AV_VARIANTS) if(index == 3) { - val = psg->read_io8(1); +// if(opn_address[index] < 0x10) { + val = psg->read_io8(1) & opn_bitmask[opn_address[index] & 15]; +// } } else # endif { -- 2.11.0