diff --git a/src/mame/drivers/fm7.cpp b/src/mame/drivers/fm7.cpp index 18c619c9a3e..0dde841737c 100644 --- a/src/mame/drivers/fm7.cpp +++ b/src/mame/drivers/fm7.cpp @@ -189,31 +189,41 @@ void fm7_state::device_timer(emu_timer &timer, device_timer_id id, int param, vo switch (id) { case TIMER_FM7_BEEPER_OFF: - fm7_beeper_off(ptr, param); - break; - case TIMER_FM77AV_ENCODER_ACK: - fm77av_encoder_ack(ptr, param); + beeper_off(ptr, param); break; case TIMER_FM7_IRQ: - fm7_timer_irq(ptr, param); + timer_irq(ptr, param); break; case TIMER_FM7_SUBTIMER_IRQ: - fm7_subtimer_irq(ptr, param); + subtimer_irq(ptr, param); break; case TIMER_FM7_KEYBOARD_POLL: - fm7_keyboard_poll(ptr, param); - break; - case TIMER_FM77AV_ALU_TASK_END: - fm77av_alu_task_end(ptr, param); - break; - case TIMER_FM77AV_VSYNC: - fm77av_vsync(ptr, param); + keyboard_poll(ptr, param); break; default: throw emu_fatalerror("Unknown id in fm7_state::device_timer"); } } +void fm77_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) +{ + switch (id) + { + case TIMER_FM77AV_ENCODER_ACK: + av_encoder_ack(ptr, param); + break; + case TIMER_FM77AV_ALU_TASK_END: + av_alu_task_end(ptr, param); + break; + case TIMER_FM77AV_VSYNC: + av_vsync(ptr, param); + break; + default: + fm7_state::device_timer(timer, id, param, ptr); + break; + } +} + /* * Main CPU: I/O port 0xfd02 @@ -230,7 +240,7 @@ void fm7_state::device_timer(emu_timer &timer, device_timer_id id, int param, vo * bit 7 - SYNDET * */ -void fm7_state::fm7_irq_mask_w(uint8_t data) +void fm7_state::irq_mask_w(uint8_t data) { m_irq_mask = data; logerror("IRQ mask set: 0x%02x\n",m_irq_mask); @@ -249,7 +259,7 @@ void fm7_state::fm7_irq_mask_w(uint8_t data) * bit 6 - buzzer on for 205ms * bit 7 - buzzer on/off */ -uint8_t fm7_state::fm7_irq_cause_r() +uint8_t fm7_state::irq_cause_r() { uint8_t ret = ~m_irq_flags; @@ -265,13 +275,13 @@ uint8_t fm7_state::fm7_irq_cause_r() return ret; } -TIMER_CALLBACK_MEMBER(fm7_state::fm7_beeper_off) +TIMER_CALLBACK_MEMBER(fm7_state::beeper_off) { m_beeper->set_state(0); logerror("timed beeper off\n"); } -void fm7_state::fm7_beeper_w(uint8_t data) +void fm7_state::beeper_w(uint8_t data) { m_speaker_active = data & 0x01; @@ -306,7 +316,7 @@ void fm7_state::fm7_beeper_w(uint8_t data) * Sub CPU: port 0xd403 (read-only) * On read: timed buzzer sound */ -uint8_t fm7_state::fm7_sub_beeper_r() +uint8_t fm7_state::sub_beeper_r() { if(m_speaker_active) { @@ -317,7 +327,7 @@ uint8_t fm7_state::fm7_sub_beeper_r() return 0xff; } -uint8_t fm7_state::vector_r(offs_t offset) +uint8_t fm77_state::vector_r(offs_t offset) { uint32_t init_size = m_rom_ptr.bytes(); @@ -327,28 +337,17 @@ uint8_t fm7_state::vector_r(offs_t offset) } else { - if(m_type == SYS_FM7) - return m_ram_ptr[0xfff0+offset]; - else - return m_ram_ptr[0x3fff0+offset]; + return m_vectors[offset]; } } -void fm7_state::vector_w(offs_t offset, uint8_t data) -{ - if(m_type == SYS_FM7) - m_ram_ptr[0xfff0+offset] = data; - else - m_ram_ptr[0x3fff0+offset] = data; -} - /* * Main CPU: I/O port 0xfd04 * * bit 0 - attention IRQ active, clears flag when read. * bit 1 - break key active */ -uint8_t fm7_state::fm7_fd04_r() +uint8_t fm7_state::fd04_r() { uint8_t ret = 0xff; @@ -370,13 +369,13 @@ uint8_t fm7_state::fm7_fd04_r() * On read, enables BASIC ROM at 0x8000 (default) * On write, disables BASIC ROM, enables RAM (if more than 32kB) */ -uint8_t fm7_state::fm7_rom_en_r(address_space &space) +uint8_t fm7_state::rom_en_r(address_space &space) { if(!machine().side_effects_disabled()) { - uint8_t* RAM = memregion("maincpu")->base(); + uint8_t* RAM = m_ram_ptr.target(); - m_basic_rom_en = 1; + m_basic_rom_en = true; if(m_type == SYS_FM7) { membank("bank1")->set_base(RAM+0x38000); @@ -388,11 +387,11 @@ uint8_t fm7_state::fm7_rom_en_r(address_space &space) return 0x00; } -void fm7_state::fm7_rom_en_w(address_space &space, uint8_t data) +void fm7_state::rom_en_w(address_space &space, uint8_t data) { - uint8_t* RAM = memregion("maincpu")->base(); + uint8_t* RAM = m_ram_ptr.target(); - m_basic_rom_en = 0; + m_basic_rom_en = false; if(m_type == SYS_FM7) { membank("bank1")->set_base(RAM+0x8000); @@ -408,16 +407,16 @@ void fm7_state::fm7_rom_en_w(address_space &space, uint8_t data) * Port is write-only. Initiate ROM is on by default. * */ -void fm7_state::fm7_init_en_w(address_space &space, uint8_t data) +void fm77_state::init_en_w(address_space &space, uint8_t data) { if(data & 0x02) { - m_init_rom_en = 0; + m_init_rom_en = false; fm7_mmr_refresh(space); } else { - m_init_rom_en = 1; + m_init_rom_en = true; fm7_mmr_refresh(space); } } @@ -426,17 +425,17 @@ void fm7_state::fm7_init_en_w(address_space &space, uint8_t data) * Main CPU: I/O ports 0xfd18 - 0xfd1f * Floppy Disk Controller (MB8877A) */ -WRITE_LINE_MEMBER(fm7_state::fm7_fdc_intrq_w) +WRITE_LINE_MEMBER(fm7_state::fdc_intrq_w) { m_fdc_irq_flag = state; } -WRITE_LINE_MEMBER(fm7_state::fm7_fdc_drq_w) +WRITE_LINE_MEMBER(fm7_state::fdc_drq_w) { m_fdc_drq_flag = state; } -uint8_t fm7_state::fm7_fdc_r(offs_t offset) +uint8_t fm7_state::fdc_r(offs_t offset) { uint8_t ret = 0; @@ -469,7 +468,7 @@ uint8_t fm7_state::fm7_fdc_r(offs_t offset) return 0x00; } -void fm7_state::fm7_fdc_w(offs_t offset, uint8_t data) +void fm7_state::fdc_w(offs_t offset, uint8_t data) { switch(offset) { @@ -533,7 +532,7 @@ void fm7_state::fm7_fdc_w(offs_t offset, uint8_t data) * CPU clock speed in bit 0 (0 = 1.2MHz, 1 = 2MHz) * Clears keyboard IRQ flag */ -uint8_t fm7_state::fm7_keyboard_r(offs_t offset) +uint8_t fm7_state::keyboard_r(offs_t offset) { uint8_t ret; switch(offset) @@ -550,7 +549,7 @@ uint8_t fm7_state::fm7_keyboard_r(offs_t offset) } } -uint8_t fm7_state::fm7_sub_keyboard_r(offs_t offset) +uint8_t fm7_state::sub_keyboard_r(offs_t offset) { uint8_t ret; switch(offset) @@ -591,7 +590,7 @@ uint8_t fm7_state::fm7_sub_keyboard_r(offs_t offset) * * ACK is received after 5us. */ -uint8_t fm7_state::fm77av_key_encoder_r(offs_t offset) +uint8_t fm77_state::av_key_encoder_r(offs_t offset) { uint8_t ret = 0xff; switch(offset) @@ -618,7 +617,7 @@ uint8_t fm7_state::fm77av_key_encoder_r(offs_t offset) return ret; } -void fm7_state::fm77av_encoder_setup_command() +void fm77_state::av_encoder_setup_command() { switch(m_encoder.buffer[0]) { @@ -663,12 +662,12 @@ void fm7_state::fm77av_encoder_setup_command() } } -TIMER_CALLBACK_MEMBER(fm7_state::fm77av_encoder_ack) +TIMER_CALLBACK_MEMBER(fm77_state::av_encoder_ack) { m_encoder.ack = 1; } -void fm7_state::fm77av_encoder_handle_command() +void fm77_state::av_encoder_handle_command() { switch(m_encoder.buffer[0]) { @@ -727,14 +726,14 @@ void fm7_state::fm77av_encoder_handle_command() m_encoder.position = 0; } -void fm7_state::fm77av_key_encoder_w(offs_t offset, uint8_t data) +void fm77_state::av_key_encoder_w(offs_t offset, uint8_t data) { m_encoder.ack = 0; if(offset == 0) // data register { if(m_encoder.position == 0) // first byte { - fm77av_encoder_setup_command(); + av_encoder_setup_command(); } if(m_encoder.position == 1) // second byte { @@ -747,7 +746,7 @@ void fm7_state::fm77av_key_encoder_w(offs_t offset, uint8_t data) m_encoder.position++; m_encoder.tx_count--; if(m_encoder.tx_count == 0) // last byte - fm77av_encoder_handle_command(); + av_encoder_handle_command(); // wait 5us to set ACK flag timer_set(attotime::from_usec(5), TIMER_FM77AV_ENCODER_ACK); @@ -776,7 +775,7 @@ WRITE_LINE_MEMBER(fm7_state::write_centronics_perror) m_centronics_perror = state; } -uint8_t fm7_state::fm7_cassette_printer_r() +uint8_t fm7_state::cassette_printer_r() { // bit 7: cassette input // bit 5: printer DET2 @@ -802,7 +801,7 @@ uint8_t fm7_state::fm7_cassette_printer_r() return ret; } -void fm7_state::fm7_cassette_printer_w(offs_t offset, uint8_t data) +void fm7_state::cassette_printer_w(offs_t offset, uint8_t data) { switch(offset) { @@ -831,7 +830,7 @@ void fm7_state::fm7_cassette_printer_w(offs_t offset, uint8_t data) * Main CPU: 0xfd0b * - bit 0: Boot mode: 0=BASIC, 1=DOS */ -uint8_t fm7_state::fm77av_boot_mode_r() +uint8_t fm77_state::av_boot_mode_r() { uint8_t ret = 0xff; @@ -850,90 +849,89 @@ uint8_t fm7_state::fm77av_boot_mode_r() */ void fm7_state::fm7_update_psg() { - if(m_type == SYS_FM7) + switch(m_psg_regsel) { - switch(m_psg_regsel) - { - case 0x00: - // High impedance - break; - case 0x01: - // Data read - m_psg_data = m_psg->data_r(); - break; - case 0x02: - // Data write - m_psg->data_w(m_psg_data); - break; - case 0x03: - // Address latch - m_psg->address_w(m_psg_data); - break; - } - } - else - { // FM-77AV and later use a YM2203 - switch(m_psg_regsel) - { - case 0x00: - // High impedance - break; - case 0x01: - // Data read - m_psg_data = m_ym->read(1); - break; - case 0x02: - // Data write - m_ym->write(1,m_psg_data); - logerror("YM: data write 0x%02x\n",m_psg_data); - break; - case 0x03: - // Address latch - m_ym->write(0,m_psg_data); - logerror("YM: address latch 0x%02x\n",m_psg_data); - break; - case 0x04: - // Status register - m_psg_data = m_ym->read(0); - break; - case 0x09: - // Joystick port read - m_psg_data = m_joy1->read(); - break; - } + case 0x00: + // High impedance + break; + case 0x01: + // Data read + m_psg_data = m_psg->data_r(); + break; + case 0x02: + // Data write + m_psg->data_w(m_psg_data); + break; + case 0x03: + // Address latch + m_psg->address_w(m_psg_data); + break; } } -uint8_t fm7_state::fm7_psg_select_r() +// FM-77AV and later use a YM2203 +void fm77_state::fm7_update_psg() +{ + switch(m_psg_regsel) + { + case 0x00: + // High impedance + break; + case 0x01: + // Data read + m_psg_data = m_ym->read(1); + break; + case 0x02: + // Data write + m_ym->write(1,m_psg_data); + logerror("YM: data write 0x%02x\n",m_psg_data); + break; + case 0x03: + // Address latch + m_ym->write(0,m_psg_data); + logerror("YM: address latch 0x%02x\n",m_psg_data); + break; + case 0x04: + // Status register + m_psg_data = m_ym->read(0); + break; + case 0x09: + // Joystick port read + m_psg_data = m_joy1->read(); + break; + } +} + +uint8_t fm7_state::psg_select_r() { return 0xff; } -void fm7_state::fm7_psg_select_w(uint8_t data) +void fm7_state::psg_select_w(uint8_t data) { m_psg_regsel = data & 0x03; fm7_update_psg(); } -void fm7_state::fm77av_ym_select_w(uint8_t data) +void fm77_state::av_ym_select_w(uint8_t data) { m_psg_regsel = data & 0x0f; fm7_update_psg(); } -uint8_t fm7_state::fm7_psg_data_r() +uint8_t fm7_state::psg_data_r() { // fm7_update_psg(); return m_psg_data; } -void fm7_state::fm7_psg_data_w(uint8_t data) +void fm7_state::psg_data_w(uint8_t data) { m_psg_data = data; // fm7_update_psg(); } -void fm7_state::fm77av_bootram_w(offs_t offset, uint8_t data) +void fm77_state::av_bootram_w(offs_t offset, uint8_t data) { if(!(m_mmr.mode & 0x01)) return; @@ -941,7 +939,7 @@ void fm7_state::fm77av_bootram_w(offs_t offset, uint8_t data) } // Shared RAM is only usable on the main CPU if the sub CPU is halted -uint8_t fm7_state::fm7_main_shared_r(offs_t offset) +uint8_t fm7_state::main_shared_r(offs_t offset) { if(m_video.sub_halt != 0) return m_shared_ram[offset]; @@ -949,13 +947,13 @@ uint8_t fm7_state::fm7_main_shared_r(offs_t offset) return 0xff; } -void fm7_state::fm7_main_shared_w(offs_t offset, uint8_t data) +void fm7_state::main_shared_w(offs_t offset, uint8_t data) { if(m_video.sub_halt != 0) m_shared_ram[offset] = data; } -uint8_t fm7_state::fm7_fmirq_r() +uint8_t fm77_state::fmirq_r() { uint8_t ret = 0xff; @@ -965,7 +963,7 @@ uint8_t fm7_state::fm7_fmirq_r() return ret; } -uint8_t fm7_state::fm7_unknown_r() +uint8_t fm7_state::unknown_r() { // Port 0xFDFC is read by Dig Dug. Controller port, perhaps? // Must return 0xff for it to read the keyboard. @@ -988,7 +986,7 @@ uint8_t fm7_state::fm7_unknown_r() * - bit 0: boot RAM read-write/read-only * */ -uint8_t fm7_state::fm7_mmr_r(offs_t offset) +uint8_t fm77_state::mmr_r(offs_t offset) { if(offset < 0x10) { @@ -999,10 +997,10 @@ uint8_t fm7_state::fm7_mmr_r(offs_t offset) return 0xff; } -void fm7_state::fm7_update_bank(address_space & space, int bank, uint8_t physical) +void fm77_state::fm7_update_bank(address_space & space, int bank, uint8_t physical) { m_avbank[bank]->set_bank(physical); -/* uint8_t* RAM = memregion("maincpu")->base(); +/* uint8_t* RAM = m_ram_ptr.target(); uint16_t size = 0xfff; char bank_name[10]; @@ -1016,40 +1014,40 @@ void fm7_state::fm7_update_bank(address_space & space, int bank, uint8_t physica switch(physical) { case 0x10: - space.install_readwrite_handler(bank*0x1000,(bank*0x1000)+size,read8_delegate(*this, FUNC(fm7_state::fm7_vram0_r)),write8_delegate(*this, FUNC(fm7_state::fm7_vram0_w))); + space.install_readwrite_handler(bank*0x1000,(bank*0x1000)+size,read8_delegate(*this, FUNC(fm77_state::vram0_r)),write8_delegate(*this, FUNC(fm77_state::vram0_w))); break; case 0x11: - space.install_readwrite_handler(bank*0x1000,(bank*0x1000)+size,read8_delegate(*this, FUNC(fm7_state::fm7_vram1_r)),write8_delegate(*this, FUNC(fm7_state::fm7_vram1_w))); + space.install_readwrite_handler(bank*0x1000,(bank*0x1000)+size,read8_delegate(*this, FUNC(fm77_state::vram1_r)),write8_delegate(*this, FUNC(fm77_state::vram1_w))); break; case 0x12: - space.install_readwrite_handler(bank*0x1000,(bank*0x1000)+size,read8_delegate(*this, FUNC(fm7_state::fm7_vram2_r)),write8_delegate(*this, FUNC(fm7_state::fm7_vram2_w))); + space.install_readwrite_handler(bank*0x1000,(bank*0x1000)+size,read8_delegate(*this, FUNC(fm77_state::vram2_r)),write8_delegate(*this, FUNC(fm77_state::vram2_w))); break; case 0x13: - space.install_readwrite_handler(bank*0x1000,(bank*0x1000)+size,read8_delegate(*this, FUNC(fm7_state::fm7_vram3_r)),write8_delegate(*this, FUNC(fm7_state::fm7_vram3_w))); + space.install_readwrite_handler(bank*0x1000,(bank*0x1000)+size,read8_delegate(*this, FUNC(fm77_state::vram3_r)),write8_delegate(*this, FUNC(fm77_state::vram3_w))); break; case 0x14: - space.install_readwrite_handler(bank*0x1000,(bank*0x1000)+size,read8_delegate(*this, FUNC(fm7_state::fm7_vram4_r)),write8_delegate(*this, FUNC(fm7_state::fm7_vram4_w))); + space.install_readwrite_handler(bank*0x1000,(bank*0x1000)+size,read8_delegate(*this, FUNC(fm77_state::vram4_r)),write8_delegate(*this, FUNC(fm77_state::vram4_w))); break; case 0x15: - space.install_readwrite_handler(bank*0x1000,(bank*0x1000)+size,read8_delegate(*this, FUNC(fm7_state::fm7_vram5_r)),write8_delegate(*this, FUNC(fm7_state::fm7_vram5_w))); + space.install_readwrite_handler(bank*0x1000,(bank*0x1000)+size,read8_delegate(*this, FUNC(fm77_state::vram5_r)),write8_delegate(*this, FUNC(fm77_state::vram5_w))); break; case 0x16: - space.install_readwrite_handler(bank*0x1000,(bank*0x1000)+size,read8_delegate(*this, FUNC(fm7_state::fm7_vram6_r)),write8_delegate(*this, FUNC(fm7_state::fm7_vram6_w))); + space.install_readwrite_handler(bank*0x1000,(bank*0x1000)+size,read8_delegate(*this, FUNC(fm77_state::vram6_r)),write8_delegate(*this, FUNC(fm77_state::vram6_w))); break; case 0x17: - space.install_readwrite_handler(bank*0x1000,(bank*0x1000)+size,read8_delegate(*this, FUNC(fm7_state::fm7_vram7_r)),write8_delegate(*this, FUNC(fm7_state::fm7_vram7_w))); + space.install_readwrite_handler(bank*0x1000,(bank*0x1000)+size,read8_delegate(*this, FUNC(fm77_state::vram7_r)),write8_delegate(*this, FUNC(fm77_state::vram7_w))); break; case 0x18: - space.install_readwrite_handler(bank*0x1000,(bank*0x1000)+size,read8_delegate(*this, FUNC(fm7_state::fm7_vram8_r)),write8_delegate(*this, FUNC(fm7_state::fm7_vram8_w))); + space.install_readwrite_handler(bank*0x1000,(bank*0x1000)+size,read8_delegate(*this, FUNC(fm77_state::vram8_r)),write8_delegate(*this, FUNC(fm77_state::vram8_w))); break; case 0x19: - space.install_readwrite_handler(bank*0x1000,(bank*0x1000)+size,read8_delegate(*this, FUNC(fm7_state::fm7_vram9_r)),write8_delegate(*this, FUNC(fm7_state::fm7_vram9_w))); + space.install_readwrite_handler(bank*0x1000,(bank*0x1000)+size,read8_delegate(*this, FUNC(fm77_state::vram9_r)),write8_delegate(*this, FUNC(fm77_state::vram9_w))); break; case 0x1a: - space.install_readwrite_handler(bank*0x1000,(bank*0x1000)+size,read8_delegate(*this, FUNC(fm7_state::fm7_vramA_r)),write8_delegate(*this, FUNC(fm7_state::fm7_vramA_w))); + space.install_readwrite_handler(bank*0x1000,(bank*0x1000)+size,read8_delegate(*this, FUNC(fm77_state::vramA_r)),write8_delegate(*this, FUNC(fm77_state::vramA_w))); break; case 0x1b: - space.install_readwrite_handler(bank*0x1000,(bank*0x1000)+size,read8_delegate(*this, FUNC(fm7_state::fm7_vramB_r)),write8_delegate(*this, FUNC(fm7_state::fm7_vramB_w))); + space.install_readwrite_handler(bank*0x1000,(bank*0x1000)+size,read8_delegate(*this, FUNC(fm77_state::vramB_r)),write8_delegate(*this, FUNC(fm77_state::vramB_w))); break; } // membank(bank+1)->set_base(RAM+(physical<<12)-0x10000); @@ -1057,12 +1055,12 @@ void fm7_state::fm7_update_bank(address_space & space, int bank, uint8_t physica } if(physical == 0x1c) { - space.install_readwrite_handler(bank*0x1000,(bank*0x1000)+size,read8_delegate(*this, FUNC(fm7_state::fm7_console_ram_banked_r)),write8_delegate(*this, FUNC(fm7_state::fm7_console_ram_banked_w))); + space.install_readwrite_handler(bank*0x1000,(bank*0x1000)+size,read8_delegate(*this, FUNC(fm77_state::console_ram_banked_r)),write8_delegate(*this, FUNC(fm77_state::console_ram_banked_w))); return; } if(physical == 0x1d) { - space.install_readwrite_handler(bank*0x1000,(bank*0x1000)+size,read8_delegate(*this, FUNC(fm7_state::fm7_sub_ram_ports_banked_r)),write8_delegate(*this, FUNC(fm7_state::fm7_sub_ram_ports_banked_w))); + space.install_readwrite_handler(bank*0x1000,(bank*0x1000)+size,read8_delegate(*this, FUNC(fm77_state::sub_ram_ports_banked_r)),write8_delegate(*this, FUNC(fm77_state::sub_ram_ports_banked_w))); return; } if(physical == 0x35) @@ -1103,11 +1101,11 @@ void fm7_state::fm7_update_bank(address_space & space, int bank, uint8_t physica */ } -void fm7_state::fm7_mmr_refresh(address_space& space) +void fm77_state::fm7_mmr_refresh(address_space &space) { int x; uint16_t window_addr; - uint8_t* RAM = memregion("maincpu")->base(); + uint8_t* RAM = m_ram_ptr.target(); if(m_mmr.enabled) { @@ -1159,7 +1157,7 @@ void fm7_state::fm7_mmr_refresh(address_space& space) } } -void fm7_state::fm7_mmr_w(address_space &space, offs_t offset, uint8_t data) +void fm77_state::mmr_w(address_space &space, offs_t offset, uint8_t data) { if(offset < 0x10) { @@ -1200,7 +1198,7 @@ void fm7_state::fm7_mmr_w(address_space &space, offs_t offset, uint8_t data) * * Kanji ROM is visible at 0x20000 (first half only?) */ -uint8_t fm7_state::fm7_kanji_r(offs_t offset) +uint8_t fm7_state::kanji_r(offs_t offset) { uint8_t* KROM = m_kanji->base(); uint32_t addr = m_kanji_address << 1; @@ -1221,7 +1219,7 @@ uint8_t fm7_state::fm7_kanji_r(offs_t offset) } } -void fm7_state::fm7_kanji_w(offs_t offset, uint8_t data) +void fm7_state::kanji_w(offs_t offset, uint8_t data) { uint16_t addr; @@ -1242,7 +1240,7 @@ void fm7_state::fm7_kanji_w(offs_t offset, uint8_t data) } } -TIMER_CALLBACK_MEMBER(fm7_state::fm7_timer_irq) +TIMER_CALLBACK_MEMBER(fm7_state::timer_irq) { if(m_irq_mask & IRQ_FLAG_TIMER) { @@ -1250,7 +1248,7 @@ TIMER_CALLBACK_MEMBER(fm7_state::fm7_timer_irq) } } -TIMER_CALLBACK_MEMBER(fm7_state::fm7_subtimer_irq) +TIMER_CALLBACK_MEMBER(fm7_state::subtimer_irq) { if(m_video.nmi_mask == 0 && m_video.sub_halt == 0) m_sub->pulse_input_line(INPUT_LINE_NMI, attotime::zero); @@ -1277,7 +1275,7 @@ void fm7_state::key_press(uint16_t scancode) logerror("KEY: sent scancode 0x%03x\n",scancode); } -void fm7_state::fm7_keyboard_poll_scan() +void fm7_state::keyboard_poll_scan() { int bit = 0; int x,y; @@ -1321,7 +1319,7 @@ void fm7_state::fm7_keyboard_poll_scan() m_mod_data = modifiers; } -TIMER_CALLBACK_MEMBER(fm7_state::fm7_keyboard_poll) +TIMER_CALLBACK_MEMBER(fm7_state::keyboard_poll) { int x,y; int bit = 0; @@ -1340,7 +1338,7 @@ TIMER_CALLBACK_MEMBER(fm7_state::fm7_keyboard_poll) if(m_key_scan_mode == KEY_MODE_SCAN) { // handle scancode mode - fm7_keyboard_poll_scan(); + keyboard_poll_scan(); return; } @@ -1373,20 +1371,20 @@ TIMER_CALLBACK_MEMBER(fm7_state::fm7_keyboard_poll) } } -IRQ_CALLBACK_MEMBER(fm7_state::fm7_irq_ack) +IRQ_CALLBACK_MEMBER(fm7_state::irq_ack) { if(irqline == M6809_FIRQ_LINE) m_maincpu->set_input_line(irqline,CLEAR_LINE); return -1; } -IRQ_CALLBACK_MEMBER(fm7_state::fm7_sub_irq_ack) +IRQ_CALLBACK_MEMBER(fm7_state::sub_irq_ack) { m_sub->set_input_line(irqline,CLEAR_LINE); return -1; } -WRITE_LINE_MEMBER(fm7_state::fm77av_fmirq) +WRITE_LINE_MEMBER(fm77_state::av_fmirq) { if(state == 1) { @@ -1418,28 +1416,28 @@ void fm7_state::fm7_mem(address_map &map) map(0x0000, 0x7fff).ram(); map(0x8000, 0xfbff).bankr("bank1").bankw("bank2"); // also F-BASIC ROM, when enabled map(0xfc00, 0xfc7f).ram(); - map(0xfc80, 0xfcff).rw(FUNC(fm7_state::fm7_main_shared_r), FUNC(fm7_state::fm7_main_shared_w)); + map(0xfc80, 0xfcff).rw(FUNC(fm7_state::main_shared_r), FUNC(fm7_state::main_shared_w)); // I/O space (FD00-FDFF) - map(0xfd00, 0xfd01).rw(FUNC(fm7_state::fm7_keyboard_r), FUNC(fm7_state::fm7_cassette_printer_w)); - map(0xfd02, 0xfd02).rw(FUNC(fm7_state::fm7_cassette_printer_r), FUNC(fm7_state::fm7_irq_mask_w)); // IRQ mask - map(0xfd03, 0xfd03).rw(FUNC(fm7_state::fm7_irq_cause_r), FUNC(fm7_state::fm7_beeper_w)); // IRQ flags - map(0xfd04, 0xfd04).r(FUNC(fm7_state::fm7_fd04_r)); - map(0xfd05, 0xfd05).rw(FUNC(fm7_state::fm7_subintf_r), FUNC(fm7_state::fm7_subintf_w)); - map(0xfd06, 0xfd0c).r(FUNC(fm7_state::fm7_unknown_r)); - map(0xfd0d, 0xfd0d).rw(FUNC(fm7_state::fm7_psg_select_r), FUNC(fm7_state::fm7_psg_select_w)); - map(0xfd0e, 0xfd0e).rw(FUNC(fm7_state::fm7_psg_data_r), FUNC(fm7_state::fm7_psg_data_w)); - map(0xfd0f, 0xfd0f).rw(FUNC(fm7_state::fm7_rom_en_r), FUNC(fm7_state::fm7_rom_en_w)); - map(0xfd10, 0xfd17).r(FUNC(fm7_state::fm7_unknown_r)); - map(0xfd18, 0xfd1f).rw(FUNC(fm7_state::fm7_fdc_r), FUNC(fm7_state::fm7_fdc_w)); - map(0xfd20, 0xfd23).rw(FUNC(fm7_state::fm7_kanji_r), FUNC(fm7_state::fm7_kanji_w)); - map(0xfd24, 0xfd36).r(FUNC(fm7_state::fm7_unknown_r)); - map(0xfd37, 0xfd37).w(FUNC(fm7_state::fm7_multipage_w)); - map(0xfd38, 0xfd3f).rw(FUNC(fm7_state::fm7_palette_r), FUNC(fm7_state::fm7_palette_w)); - map(0xfd40, 0xfdff).r(FUNC(fm7_state::fm7_unknown_r)); + map(0xfd00, 0xfd01).rw(FUNC(fm7_state::keyboard_r), FUNC(fm7_state::cassette_printer_w)); + map(0xfd02, 0xfd02).rw(FUNC(fm7_state::cassette_printer_r), FUNC(fm7_state::irq_mask_w)); // IRQ mask + map(0xfd03, 0xfd03).rw(FUNC(fm7_state::irq_cause_r), FUNC(fm7_state::beeper_w)); // IRQ flags + map(0xfd04, 0xfd04).r(FUNC(fm7_state::fd04_r)); + map(0xfd05, 0xfd05).rw(FUNC(fm7_state::subintf_r), FUNC(fm7_state::subintf_w)); + map(0xfd06, 0xfd0c).r(FUNC(fm7_state::unknown_r)); + map(0xfd0d, 0xfd0d).rw(FUNC(fm7_state::psg_select_r), FUNC(fm7_state::psg_select_w)); + map(0xfd0e, 0xfd0e).rw(FUNC(fm7_state::psg_data_r), FUNC(fm7_state::psg_data_w)); + map(0xfd0f, 0xfd0f).rw(FUNC(fm7_state::rom_en_r), FUNC(fm7_state::rom_en_w)); + map(0xfd10, 0xfd17).r(FUNC(fm7_state::unknown_r)); + map(0xfd18, 0xfd1f).rw(FUNC(fm7_state::fdc_r), FUNC(fm7_state::fdc_w)); + map(0xfd20, 0xfd23).rw(FUNC(fm7_state::kanji_r), FUNC(fm7_state::kanji_w)); + map(0xfd24, 0xfd36).r(FUNC(fm7_state::unknown_r)); + map(0xfd37, 0xfd37).w(FUNC(fm7_state::multipage_w)); + map(0xfd38, 0xfd3f).rw(FUNC(fm7_state::palette_r), FUNC(fm7_state::palette_w)); + map(0xfd40, 0xfdff).r(FUNC(fm7_state::unknown_r)); // Boot ROM map(0xfe00, 0xffdf).bankr("bank17"); map(0xffe0, 0xffef).ram(); - map(0xfff0, 0xffff).rw(FUNC(fm7_state::vector_r), FUNC(fm7_state::vector_w)); + map(0xfff0, 0xffff).ram().share("vectors"); } void fm7_state::fm8_mem(address_map &map) @@ -1447,26 +1445,26 @@ void fm7_state::fm8_mem(address_map &map) map(0x0000, 0x7fff).ram(); map(0x8000, 0xfbff).bankr("bank1").bankw("bank2"); // also F-BASIC ROM, when enabled map(0xfc00, 0xfc7f).ram(); - map(0xfc80, 0xfcff).rw(FUNC(fm7_state::fm7_main_shared_r), FUNC(fm7_state::fm7_main_shared_w)); + map(0xfc80, 0xfcff).rw(FUNC(fm7_state::main_shared_r), FUNC(fm7_state::main_shared_w)); // I/O space (FD00-FDFF) - map(0xfd00, 0xfd01).rw(FUNC(fm7_state::fm7_keyboard_r), FUNC(fm7_state::fm7_cassette_printer_w)); - map(0xfd02, 0xfd02).rw(FUNC(fm7_state::fm7_cassette_printer_r), FUNC(fm7_state::fm7_irq_mask_w)); // IRQ mask - map(0xfd03, 0xfd03).rw(FUNC(fm7_state::fm7_irq_cause_r), FUNC(fm7_state::fm7_beeper_w)); // IRQ flags - map(0xfd04, 0xfd04).r(FUNC(fm7_state::fm7_fd04_r)); - map(0xfd05, 0xfd05).rw(FUNC(fm7_state::fm7_subintf_r), FUNC(fm7_state::fm7_subintf_w)); - map(0xfd06, 0xfd0c).r(FUNC(fm7_state::fm7_unknown_r)); - map(0xfd0f, 0xfd0f).rw(FUNC(fm7_state::fm7_rom_en_r), FUNC(fm7_state::fm7_rom_en_w)); - map(0xfd10, 0xfd17).r(FUNC(fm7_state::fm7_unknown_r)); - map(0xfd18, 0xfd1f).rw(FUNC(fm7_state::fm7_fdc_r), FUNC(fm7_state::fm7_fdc_w)); - map(0xfd20, 0xfd23).rw(FUNC(fm7_state::fm7_kanji_r), FUNC(fm7_state::fm7_kanji_w)); - map(0xfd24, 0xfd36).r(FUNC(fm7_state::fm7_unknown_r)); - map(0xfd37, 0xfd37).w(FUNC(fm7_state::fm7_multipage_w)); - map(0xfd38, 0xfd3f).rw(FUNC(fm7_state::fm7_palette_r), FUNC(fm7_state::fm7_palette_w)); - map(0xfd40, 0xfdff).r(FUNC(fm7_state::fm7_unknown_r)); + map(0xfd00, 0xfd01).rw(FUNC(fm7_state::keyboard_r), FUNC(fm7_state::cassette_printer_w)); + map(0xfd02, 0xfd02).rw(FUNC(fm7_state::cassette_printer_r), FUNC(fm7_state::irq_mask_w)); // IRQ mask + map(0xfd03, 0xfd03).rw(FUNC(fm7_state::irq_cause_r), FUNC(fm7_state::beeper_w)); // IRQ flags + map(0xfd04, 0xfd04).r(FUNC(fm7_state::fd04_r)); + map(0xfd05, 0xfd05).rw(FUNC(fm7_state::subintf_r), FUNC(fm7_state::subintf_w)); + map(0xfd06, 0xfd0c).r(FUNC(fm7_state::unknown_r)); + map(0xfd0f, 0xfd0f).rw(FUNC(fm7_state::rom_en_r), FUNC(fm7_state::rom_en_w)); + map(0xfd10, 0xfd17).r(FUNC(fm7_state::unknown_r)); + map(0xfd18, 0xfd1f).rw(FUNC(fm7_state::fdc_r), FUNC(fm7_state::fdc_w)); + map(0xfd20, 0xfd23).rw(FUNC(fm7_state::kanji_r), FUNC(fm7_state::kanji_w)); + map(0xfd24, 0xfd36).r(FUNC(fm7_state::unknown_r)); + map(0xfd37, 0xfd37).w(FUNC(fm7_state::multipage_w)); + map(0xfd38, 0xfd3f).rw(FUNC(fm7_state::palette_r), FUNC(fm7_state::palette_w)); + map(0xfd40, 0xfdff).r(FUNC(fm7_state::unknown_r)); // Boot ROM map(0xfe00, 0xffdf).bankr("bank17"); map(0xffe0, 0xffef).ram(); - map(0xfff0, 0xffff).rw(FUNC(fm7_state::vector_r), FUNC(fm7_state::vector_w)); + map(0xfff0, 0xffff).ram().share("vectors"); } /* @@ -1482,98 +1480,98 @@ void fm7_state::fm8_mem(address_map &map) void fm7_state::fm7_sub_mem(address_map &map) { - map(0x0000, 0xbfff).rw(FUNC(fm7_state::fm7_vram_r), FUNC(fm7_state::fm7_vram_w)); // VRAM + map(0x0000, 0xbfff).rw(FUNC(fm7_state::vram_r), FUNC(fm7_state::vram_w)); // VRAM map(0xc000, 0xcfff).ram(); // Console RAM map(0xd000, 0xd37f).ram(); // Work RAM map(0xd380, 0xd3ff).ram().share("shared_ram"); // I/O space (D400-D4FF) - map(0xd400, 0xd401).r(FUNC(fm7_state::fm7_sub_keyboard_r)); - map(0xd402, 0xd402).r(FUNC(fm7_state::fm7_cancel_ack)); - map(0xd403, 0xd403).r(FUNC(fm7_state::fm7_sub_beeper_r)); - map(0xd404, 0xd404).r(FUNC(fm7_state::fm7_attn_irq_r)); - map(0xd408, 0xd408).rw(FUNC(fm7_state::fm7_crt_r), FUNC(fm7_state::fm7_crt_w)); - map(0xd409, 0xd409).rw(FUNC(fm7_state::fm7_vram_access_r), FUNC(fm7_state::fm7_vram_access_w)); - map(0xd40a, 0xd40a).rw(FUNC(fm7_state::fm7_sub_busyflag_r), FUNC(fm7_state::fm7_sub_busyflag_w)); - map(0xd40e, 0xd40f).w(FUNC(fm7_state::fm7_vram_offset_w)); + map(0xd400, 0xd401).r(FUNC(fm7_state::sub_keyboard_r)); + map(0xd402, 0xd402).r(FUNC(fm7_state::cancel_ack)); + map(0xd403, 0xd403).r(FUNC(fm7_state::sub_beeper_r)); + map(0xd404, 0xd404).r(FUNC(fm7_state::attn_irq_r)); + map(0xd408, 0xd408).rw(FUNC(fm7_state::crt_r), FUNC(fm7_state::crt_w)); + map(0xd409, 0xd409).rw(FUNC(fm7_state::vram_access_r), FUNC(fm7_state::vram_access_w)); + map(0xd40a, 0xd40a).rw(FUNC(fm7_state::sub_busyflag_r), FUNC(fm7_state::sub_busyflag_w)); + map(0xd40e, 0xd40f).w(FUNC(fm7_state::vram_offset_w)); map(0xd800, 0xffff).rom(); } -void fm7_state::fm11_mem(address_map &map) +void fm11_state::fm11_mem(address_map &map) { for (int bank = 0; bank < 16; bank++) { map(bank << 12, (bank << 12) | 0x0fff).rw(m_avbank[bank], FUNC(address_map_bank_device::read8), FUNC(address_map_bank_device::write8)); } map(0xfc00, 0xfc7f).ram(); - map(0xfc80, 0xfcff).rw(FUNC(fm7_state::fm7_main_shared_r), FUNC(fm7_state::fm7_main_shared_w)); + map(0xfc80, 0xfcff).rw(FUNC(fm11_state::main_shared_r), FUNC(fm11_state::main_shared_w)); // I/O space (FD00-FDFF) - map(0xfd00, 0xfd01).rw(FUNC(fm7_state::fm7_keyboard_r), FUNC(fm7_state::fm7_cassette_printer_w)); - map(0xfd02, 0xfd02).rw(FUNC(fm7_state::fm7_cassette_printer_r), FUNC(fm7_state::fm7_irq_mask_w)); // IRQ mask - map(0xfd03, 0xfd03).rw(FUNC(fm7_state::fm7_irq_cause_r), FUNC(fm7_state::fm7_beeper_w)); // IRQ flags - map(0xfd04, 0xfd04).r(FUNC(fm7_state::fm7_fd04_r)); - map(0xfd05, 0xfd05).rw(FUNC(fm7_state::fm7_subintf_r), FUNC(fm7_state::fm7_subintf_w)); - map(0xfd06, 0xfd0a).r(FUNC(fm7_state::fm7_unknown_r)); - map(0xfd0b, 0xfd0b).r(FUNC(fm7_state::fm77av_boot_mode_r)); - map(0xfd0c, 0xfd0c).r(FUNC(fm7_state::fm7_unknown_r)); - map(0xfd0f, 0xfd0f).rw(FUNC(fm7_state::fm7_rom_en_r), FUNC(fm7_state::fm7_rom_en_w)); - map(0xfd10, 0xfd10).w(FUNC(fm7_state::fm7_init_en_w)); - map(0xfd11, 0xfd11).r(FUNC(fm7_state::fm7_unknown_r)); - map(0xfd12, 0xfd12).rw(FUNC(fm7_state::fm77av_sub_modestatus_r), FUNC(fm7_state::fm77av_sub_modestatus_w)); - map(0xfd13, 0xfd13).w(FUNC(fm7_state::fm77av_sub_bank_w)); - map(0xfd14, 0xfd14).r(FUNC(fm7_state::fm7_unknown_r)); - map(0xfd17, 0xfd17).r(FUNC(fm7_state::fm7_fmirq_r)); - map(0xfd18, 0xfd1f).rw(FUNC(fm7_state::fm7_fdc_r), FUNC(fm7_state::fm7_fdc_w)); - map(0xfd20, 0xfd23).rw(FUNC(fm7_state::fm7_kanji_r), FUNC(fm7_state::fm7_kanji_w)); - map(0xfd24, 0xfd2b).r(FUNC(fm7_state::fm7_unknown_r)); - map(0xfd30, 0xfd34).w(FUNC(fm7_state::fm77av_analog_palette_w)); - map(0xfd35, 0xfd36).r(FUNC(fm7_state::fm7_unknown_r)); - map(0xfd37, 0xfd37).w(FUNC(fm7_state::fm7_multipage_w)); - map(0xfd38, 0xfd3f).rw(FUNC(fm7_state::fm7_palette_r), FUNC(fm7_state::fm7_palette_w)); - map(0xfd40, 0xfd7f).r(FUNC(fm7_state::fm7_unknown_r)); - map(0xfd80, 0xfd93).rw(FUNC(fm7_state::fm7_mmr_r), FUNC(fm7_state::fm7_mmr_w)); - map(0xfd94, 0xfdff).r(FUNC(fm7_state::fm7_unknown_r)); - map(0xfe00, 0xffdf).ram().w(FUNC(fm7_state::fm77av_bootram_w)).share("boot_ram"); + map(0xfd00, 0xfd01).rw(FUNC(fm11_state::keyboard_r), FUNC(fm11_state::cassette_printer_w)); + map(0xfd02, 0xfd02).rw(FUNC(fm11_state::cassette_printer_r), FUNC(fm11_state::irq_mask_w)); // IRQ mask + map(0xfd03, 0xfd03).rw(FUNC(fm11_state::irq_cause_r), FUNC(fm11_state::beeper_w)); // IRQ flags + map(0xfd04, 0xfd04).r(FUNC(fm11_state::fd04_r)); + map(0xfd05, 0xfd05).rw(FUNC(fm11_state::subintf_r), FUNC(fm11_state::subintf_w)); + map(0xfd06, 0xfd0a).r(FUNC(fm11_state::unknown_r)); + map(0xfd0b, 0xfd0b).r(FUNC(fm11_state::av_boot_mode_r)); + map(0xfd0c, 0xfd0c).r(FUNC(fm11_state::unknown_r)); + map(0xfd0f, 0xfd0f).rw(FUNC(fm11_state::rom_en_r), FUNC(fm11_state::rom_en_w)); + map(0xfd10, 0xfd10).w(FUNC(fm11_state::init_en_w)); + map(0xfd11, 0xfd11).r(FUNC(fm11_state::unknown_r)); + map(0xfd12, 0xfd12).rw(FUNC(fm11_state::av_sub_modestatus_r), FUNC(fm11_state::av_sub_modestatus_w)); + map(0xfd13, 0xfd13).w(FUNC(fm11_state::av_sub_bank_w)); + map(0xfd14, 0xfd14).r(FUNC(fm11_state::unknown_r)); + map(0xfd17, 0xfd17).r(FUNC(fm11_state::fmirq_r)); + map(0xfd18, 0xfd1f).rw(FUNC(fm11_state::fdc_r), FUNC(fm11_state::fdc_w)); + map(0xfd20, 0xfd23).rw(FUNC(fm11_state::kanji_r), FUNC(fm11_state::kanji_w)); + map(0xfd24, 0xfd2b).r(FUNC(fm11_state::unknown_r)); + map(0xfd30, 0xfd34).w(FUNC(fm11_state::av_analog_palette_w)); + map(0xfd35, 0xfd36).r(FUNC(fm11_state::unknown_r)); + map(0xfd37, 0xfd37).w(FUNC(fm11_state::multipage_w)); + map(0xfd38, 0xfd3f).rw(FUNC(fm11_state::palette_r), FUNC(fm11_state::palette_w)); + map(0xfd40, 0xfd7f).r(FUNC(fm11_state::unknown_r)); + map(0xfd80, 0xfd93).rw(FUNC(fm11_state::mmr_r), FUNC(fm11_state::mmr_w)); + map(0xfd94, 0xfdff).r(FUNC(fm11_state::unknown_r)); + map(0xfe00, 0xffdf).ram().w(FUNC(fm11_state::av_bootram_w)).share("boot_ram"); map(0xffe0, 0xffef).ram(); - map(0xfff0, 0xffff).rw(FUNC(fm7_state::vector_r), FUNC(fm7_state::vector_w)); + map(0xfff0, 0xffff).r(FUNC(fm11_state::vector_r)).writeonly().share("vectors"); } // Much of this is guesswork at the moment -void fm7_state::fm11_sub_mem(address_map &map) +void fm11_state::fm11_sub_mem(address_map &map) { - map(0x0000, 0x7fff).rw(FUNC(fm7_state::fm7_vram_r), FUNC(fm7_state::fm7_vram_w)); // VRAM + map(0x0000, 0x7fff).rw(FUNC(fm11_state::vram_r), FUNC(fm11_state::vram_w)); // VRAM map(0x8000, 0x8fff).ram(); // Console RAM(?) map(0x9000, 0x9f7f).ram(); // Work RAM(?) map(0x9f80, 0x9fff).ram().share("shared_ram"); map(0xafe0, 0xafe3).ram(); -// map(0xafe4, 0xafe4).rw(FUNC(fm7_state::fm7_sub_busyflag_r), FUNC(fm7_state::fm7_sub_busyflag_w)); - map(0xafe6, 0xafe6).rw(FUNC(fm7_state::fm77av_video_flags_r), FUNC(fm7_state::fm77av_video_flags_w)); - map(0xaff0, 0xaff0).rw(FUNC(fm7_state::fm7_sub_busyflag_r), FUNC(fm7_state::fm7_sub_busyflag_w)); +// map(0xafe4, 0xafe4).rw(FUNC(fm11_state::sub_busyflag_r), FUNC(fm11_state::sub_busyflag_w)); + map(0xafe6, 0xafe6).rw(FUNC(fm11_state::av_video_flags_r), FUNC(fm11_state::av_video_flags_w)); + map(0xaff0, 0xaff0).rw(FUNC(fm11_state::sub_busyflag_r), FUNC(fm11_state::sub_busyflag_w)); map(0xc000, 0xffff).rom(); // sybsystem ROM } -void fm7_state::fm11_x86_mem(address_map &map) +void fm11_state::fm11_x86_mem(address_map &map) { map.unmap_value_high(); map(0x00000, 0xfefff).ram(); map(0xff000, 0xfffff).rom(); } -void fm7_state::fm11_x86_io(address_map &map) +void fm11_state::fm11_x86_io(address_map &map) { - map(0xfd00, 0xfd01).rw(FUNC(fm7_state::fm7_keyboard_r), FUNC(fm7_state::fm7_cassette_printer_w)); - map(0xfd02, 0xfd02).rw(FUNC(fm7_state::fm7_cassette_printer_r), FUNC(fm7_state::fm7_irq_mask_w)); // IRQ mask - map(0xfd03, 0xfd03).rw(FUNC(fm7_state::fm7_irq_cause_r), FUNC(fm7_state::fm7_beeper_w)); // IRQ flags - map(0xfd04, 0xfd04).r(FUNC(fm7_state::fm7_fd04_r)); - map(0xfd05, 0xfd05).rw(FUNC(fm7_state::fm7_subintf_r), FUNC(fm7_state::fm7_subintf_w)); - map(0xfd06, 0xfd0c).r(FUNC(fm7_state::fm7_unknown_r)); - map(0xfd0f, 0xfd0f).rw(FUNC(fm7_state::fm7_rom_en_r), FUNC(fm7_state::fm7_rom_en_w)); - map(0xfd10, 0xfd17).r(FUNC(fm7_state::fm7_unknown_r)); - map(0xfd18, 0xfd1f).rw(FUNC(fm7_state::fm7_fdc_r), FUNC(fm7_state::fm7_fdc_w)); - map(0xfd20, 0xfd23).rw(FUNC(fm7_state::fm7_kanji_r), FUNC(fm7_state::fm7_kanji_w)); - map(0xfd24, 0xfd36).r(FUNC(fm7_state::fm7_unknown_r)); - map(0xfd37, 0xfd37).w(FUNC(fm7_state::fm7_multipage_w)); - map(0xfd38, 0xfd3f).rw(FUNC(fm7_state::fm7_palette_r), FUNC(fm7_state::fm7_palette_w)); - map(0xfd40, 0xfdff).r(FUNC(fm7_state::fm7_unknown_r)); + map(0xfd00, 0xfd01).rw(FUNC(fm11_state::keyboard_r), FUNC(fm11_state::cassette_printer_w)); + map(0xfd02, 0xfd02).rw(FUNC(fm11_state::cassette_printer_r), FUNC(fm11_state::irq_mask_w)); // IRQ mask + map(0xfd03, 0xfd03).rw(FUNC(fm11_state::irq_cause_r), FUNC(fm11_state::beeper_w)); // IRQ flags + map(0xfd04, 0xfd04).r(FUNC(fm11_state::fd04_r)); + map(0xfd05, 0xfd05).rw(FUNC(fm11_state::subintf_r), FUNC(fm11_state::subintf_w)); + map(0xfd06, 0xfd0c).r(FUNC(fm11_state::unknown_r)); + map(0xfd0f, 0xfd0f).rw(FUNC(fm11_state::rom_en_r), FUNC(fm11_state::rom_en_w)); + map(0xfd10, 0xfd17).r(FUNC(fm11_state::unknown_r)); + map(0xfd18, 0xfd1f).rw(FUNC(fm11_state::fdc_r), FUNC(fm11_state::fdc_w)); + map(0xfd20, 0xfd23).rw(FUNC(fm11_state::kanji_r), FUNC(fm11_state::kanji_w)); + map(0xfd24, 0xfd36).r(FUNC(fm11_state::unknown_r)); + map(0xfd37, 0xfd37).w(FUNC(fm11_state::multipage_w)); + map(0xfd38, 0xfd3f).rw(FUNC(fm11_state::palette_r), FUNC(fm11_state::palette_w)); + map(0xfd40, 0xfdff).r(FUNC(fm11_state::unknown_r)); } void fm7_state::fm16_mem(address_map &map) @@ -1584,117 +1582,117 @@ void fm7_state::fm16_mem(address_map &map) void fm7_state::fm16_io(address_map &map) { - map(0xfd00, 0xfd01).rw(FUNC(fm7_state::fm7_keyboard_r), FUNC(fm7_state::fm7_cassette_printer_w)); - map(0xfd02, 0xfd02).rw(FUNC(fm7_state::fm7_cassette_printer_r), FUNC(fm7_state::fm7_irq_mask_w)); // IRQ mask - map(0xfd03, 0xfd03).rw(FUNC(fm7_state::fm7_irq_cause_r), FUNC(fm7_state::fm7_beeper_w)); // IRQ flags - map(0xfd04, 0xfd04).r(FUNC(fm7_state::fm7_fd04_r)); - map(0xfd05, 0xfd05).rw(FUNC(fm7_state::fm7_subintf_r), FUNC(fm7_state::fm7_subintf_w)); -// map(0xfd06, 0xfd0c).r(FUNC(fm7_state::fm7_unknown_r)); - map(0xfd0f, 0xfd0f).rw(FUNC(fm7_state::fm7_rom_en_r), FUNC(fm7_state::fm7_rom_en_w)); -// map(0xfd10, 0xfd17).r(FUNC(fm7_state::fm7_unknown_r)); - map(0xfd18, 0xfd1f).rw(FUNC(fm7_state::fm7_fdc_r), FUNC(fm7_state::fm7_fdc_w)); - map(0xfd20, 0xfd23).rw(FUNC(fm7_state::fm7_kanji_r), FUNC(fm7_state::fm7_kanji_w)); -// map(0xfd24, 0xfd36).r(FUNC(fm7_state::fm7_unknown_r)); - map(0xfd37, 0xfd37).w(FUNC(fm7_state::fm7_multipage_w)); - map(0xfd38, 0xfd3f).rw(FUNC(fm7_state::fm7_palette_r), FUNC(fm7_state::fm7_palette_w)); -// map(0xfd40, 0xfdff).r(FUNC(fm7_state::fm7_unknown_r)); + map(0xfd00, 0xfd01).rw(FUNC(fm7_state::keyboard_r), FUNC(fm7_state::cassette_printer_w)); + map(0xfd02, 0xfd02).rw(FUNC(fm7_state::cassette_printer_r), FUNC(fm7_state::irq_mask_w)); // IRQ mask + map(0xfd03, 0xfd03).rw(FUNC(fm7_state::irq_cause_r), FUNC(fm7_state::beeper_w)); // IRQ flags + map(0xfd04, 0xfd04).r(FUNC(fm7_state::fd04_r)); + map(0xfd05, 0xfd05).rw(FUNC(fm7_state::subintf_r), FUNC(fm7_state::subintf_w)); +// map(0xfd06, 0xfd0c).r(FUNC(fm7_state::unknown_r)); + map(0xfd0f, 0xfd0f).rw(FUNC(fm7_state::rom_en_r), FUNC(fm7_state::rom_en_w)); +// map(0xfd10, 0xfd17).r(FUNC(fm7_state::unknown_r)); + map(0xfd18, 0xfd1f).rw(FUNC(fm7_state::fdc_r), FUNC(fm7_state::fdc_w)); + map(0xfd20, 0xfd23).rw(FUNC(fm7_state::kanji_r), FUNC(fm7_state::kanji_w)); +// map(0xfd24, 0xfd36).r(FUNC(fm7_state::unknown_r)); + map(0xfd37, 0xfd37).w(FUNC(fm7_state::multipage_w)); + map(0xfd38, 0xfd3f).rw(FUNC(fm7_state::palette_r), FUNC(fm7_state::palette_w)); +// map(0xfd40, 0xfdff).r(FUNC(fm7_state::unknown_r)); } void fm7_state::fm16_sub_mem(address_map &map) { - map(0x0000, 0xafff).rw(FUNC(fm7_state::fm7_vram_r), FUNC(fm7_state::fm7_vram_w)); // VRAM + map(0x0000, 0xafff).rw(FUNC(fm7_state::vram_r), FUNC(fm7_state::vram_w)); // VRAM map(0xb000, 0xffff).rom(); // subsystem ROM } -void fm7_state::fm77av_mem(address_map &map) +void fm77_state::fm77av_mem(address_map &map) { for (int bank = 0; bank < 16; bank++) { map(bank << 12, (bank << 12) | 0x0fff).rw(m_avbank[bank], FUNC(address_map_bank_device::read8), FUNC(address_map_bank_device::write8)); } map(0xfc00, 0xfc7f).ram(); - map(0xfc80, 0xfcff).rw(FUNC(fm7_state::fm7_main_shared_r), FUNC(fm7_state::fm7_main_shared_w)); + map(0xfc80, 0xfcff).rw(FUNC(fm77_state::main_shared_r), FUNC(fm77_state::main_shared_w)); // I/O space (FD00-FDFF) - map(0xfd00, 0xfd01).rw(FUNC(fm7_state::fm7_keyboard_r), FUNC(fm7_state::fm7_cassette_printer_w)); - map(0xfd02, 0xfd02).rw(FUNC(fm7_state::fm7_cassette_printer_r), FUNC(fm7_state::fm7_irq_mask_w)); // IRQ mask - map(0xfd03, 0xfd03).rw(FUNC(fm7_state::fm7_irq_cause_r), FUNC(fm7_state::fm7_beeper_w)); // IRQ flags - map(0xfd04, 0xfd04).r(FUNC(fm7_state::fm7_fd04_r)); - map(0xfd05, 0xfd05).rw(FUNC(fm7_state::fm7_subintf_r), FUNC(fm7_state::fm7_subintf_w)); - map(0xfd06, 0xfd0a).r(FUNC(fm7_state::fm7_unknown_r)); - map(0xfd0b, 0xfd0b).r(FUNC(fm7_state::fm77av_boot_mode_r)); - map(0xfd0c, 0xfd0c).r(FUNC(fm7_state::fm7_unknown_r)); - map(0xfd0d, 0xfd0d).rw(FUNC(fm7_state::fm7_psg_select_r), FUNC(fm7_state::fm7_psg_select_w)); - map(0xfd0e, 0xfd0e).rw(FUNC(fm7_state::fm7_psg_data_r), FUNC(fm7_state::fm7_psg_data_w)); - map(0xfd0f, 0xfd0f).rw(FUNC(fm7_state::fm7_rom_en_r), FUNC(fm7_state::fm7_rom_en_w)); - map(0xfd10, 0xfd10).w(FUNC(fm7_state::fm7_init_en_w)); - map(0xfd11, 0xfd11).r(FUNC(fm7_state::fm7_unknown_r)); - map(0xfd12, 0xfd12).rw(FUNC(fm7_state::fm77av_sub_modestatus_r), FUNC(fm7_state::fm77av_sub_modestatus_w)); - map(0xfd13, 0xfd13).w(FUNC(fm7_state::fm77av_sub_bank_w)); - map(0xfd14, 0xfd14).r(FUNC(fm7_state::fm7_unknown_r)); - map(0xfd15, 0xfd15).rw(FUNC(fm7_state::fm7_psg_select_r), FUNC(fm7_state::fm77av_ym_select_w)); - map(0xfd16, 0xfd16).rw(FUNC(fm7_state::fm7_psg_data_r), FUNC(fm7_state::fm7_psg_data_w)); - map(0xfd17, 0xfd17).r(FUNC(fm7_state::fm7_fmirq_r)); - map(0xfd18, 0xfd1f).rw(FUNC(fm7_state::fm7_fdc_r), FUNC(fm7_state::fm7_fdc_w)); - map(0xfd20, 0xfd23).rw(FUNC(fm7_state::fm7_kanji_r), FUNC(fm7_state::fm7_kanji_w)); - map(0xfd24, 0xfd2b).r(FUNC(fm7_state::fm7_unknown_r)); - map(0xfd30, 0xfd34).w(FUNC(fm7_state::fm77av_analog_palette_w)); - map(0xfd35, 0xfd36).r(FUNC(fm7_state::fm7_unknown_r)); - map(0xfd37, 0xfd37).w(FUNC(fm7_state::fm7_multipage_w)); - map(0xfd38, 0xfd3f).rw(FUNC(fm7_state::fm7_palette_r), FUNC(fm7_state::fm7_palette_w)); - map(0xfd40, 0xfd7f).r(FUNC(fm7_state::fm7_unknown_r)); - map(0xfd80, 0xfd93).rw(FUNC(fm7_state::fm7_mmr_r), FUNC(fm7_state::fm7_mmr_w)); - map(0xfd94, 0xfdff).r(FUNC(fm7_state::fm7_unknown_r)); + map(0xfd00, 0xfd01).rw(FUNC(fm77_state::keyboard_r), FUNC(fm77_state::cassette_printer_w)); + map(0xfd02, 0xfd02).rw(FUNC(fm77_state::cassette_printer_r), FUNC(fm77_state::irq_mask_w)); // IRQ mask + map(0xfd03, 0xfd03).rw(FUNC(fm77_state::irq_cause_r), FUNC(fm77_state::beeper_w)); // IRQ flags + map(0xfd04, 0xfd04).r(FUNC(fm77_state::fd04_r)); + map(0xfd05, 0xfd05).rw(FUNC(fm77_state::subintf_r), FUNC(fm77_state::subintf_w)); + map(0xfd06, 0xfd0a).r(FUNC(fm77_state::unknown_r)); + map(0xfd0b, 0xfd0b).r(FUNC(fm77_state::av_boot_mode_r)); + map(0xfd0c, 0xfd0c).r(FUNC(fm77_state::unknown_r)); + map(0xfd0d, 0xfd0d).rw(FUNC(fm77_state::psg_select_r), FUNC(fm77_state::psg_select_w)); + map(0xfd0e, 0xfd0e).rw(FUNC(fm77_state::psg_data_r), FUNC(fm77_state::psg_data_w)); + map(0xfd0f, 0xfd0f).rw(FUNC(fm77_state::rom_en_r), FUNC(fm77_state::rom_en_w)); + map(0xfd10, 0xfd10).w(FUNC(fm77_state::init_en_w)); + map(0xfd11, 0xfd11).r(FUNC(fm77_state::unknown_r)); + map(0xfd12, 0xfd12).rw(FUNC(fm77_state::av_sub_modestatus_r), FUNC(fm77_state::av_sub_modestatus_w)); + map(0xfd13, 0xfd13).w(FUNC(fm77_state::av_sub_bank_w)); + map(0xfd14, 0xfd14).r(FUNC(fm77_state::unknown_r)); + map(0xfd15, 0xfd15).rw(FUNC(fm77_state::psg_select_r), FUNC(fm77_state::av_ym_select_w)); + map(0xfd16, 0xfd16).rw(FUNC(fm77_state::psg_data_r), FUNC(fm77_state::psg_data_w)); + map(0xfd17, 0xfd17).r(FUNC(fm77_state::fmirq_r)); + map(0xfd18, 0xfd1f).rw(FUNC(fm77_state::fdc_r), FUNC(fm77_state::fdc_w)); + map(0xfd20, 0xfd23).rw(FUNC(fm77_state::kanji_r), FUNC(fm77_state::kanji_w)); + map(0xfd24, 0xfd2b).r(FUNC(fm77_state::unknown_r)); + map(0xfd30, 0xfd34).w(FUNC(fm77_state::av_analog_palette_w)); + map(0xfd35, 0xfd36).r(FUNC(fm77_state::unknown_r)); + map(0xfd37, 0xfd37).w(FUNC(fm77_state::multipage_w)); + map(0xfd38, 0xfd3f).rw(FUNC(fm77_state::palette_r), FUNC(fm77_state::palette_w)); + map(0xfd40, 0xfd7f).r(FUNC(fm77_state::unknown_r)); + map(0xfd80, 0xfd93).rw(FUNC(fm77_state::mmr_r), FUNC(fm77_state::mmr_w)); + map(0xfd94, 0xfdff).r(FUNC(fm77_state::unknown_r)); // Boot ROM (RAM on FM77AV and later) - map(0xfe00, 0xffdf).ram().w(FUNC(fm7_state::fm77av_bootram_w)).share("boot_ram"); + map(0xfe00, 0xffdf).ram().w(FUNC(fm77_state::av_bootram_w)).share("boot_ram"); map(0xffe0, 0xffef).ram(); - map(0xfff0, 0xffff).rw(FUNC(fm7_state::vector_r), FUNC(fm7_state::vector_w)); + map(0xfff0, 0xffff).r(FUNC(fm77_state::vector_r)).writeonly().share("vectors"); } -void fm7_state::fm77av_sub_mem(address_map &map) +void fm77_state::fm77av_sub_mem(address_map &map) { - map(0x0000, 0xbfff).rw(FUNC(fm7_state::fm7_vram_r), FUNC(fm7_state::fm7_vram_w)); // VRAM + map(0x0000, 0xbfff).rw(FUNC(fm77_state::vram_r), FUNC(fm77_state::vram_w)); // VRAM map(0xc000, 0xcfff).ram().region("maincpu", 0x1c000); // Console RAM map(0xd000, 0xd37f).ram().region("maincpu", 0x1d000); // Work RAM map(0xd380, 0xd3ff).ram().share("shared_ram"); // I/O space (D400-D4FF) - map(0xd400, 0xd401).r(FUNC(fm7_state::fm7_sub_keyboard_r)); - map(0xd402, 0xd402).r(FUNC(fm7_state::fm7_cancel_ack)); - map(0xd403, 0xd403).r(FUNC(fm7_state::fm7_sub_beeper_r)); - map(0xd404, 0xd404).r(FUNC(fm7_state::fm7_attn_irq_r)); - map(0xd408, 0xd408).rw(FUNC(fm7_state::fm7_crt_r), FUNC(fm7_state::fm7_crt_w)); - map(0xd409, 0xd409).rw(FUNC(fm7_state::fm7_vram_access_r), FUNC(fm7_state::fm7_vram_access_w)); - map(0xd40a, 0xd40a).rw(FUNC(fm7_state::fm7_sub_busyflag_r), FUNC(fm7_state::fm7_sub_busyflag_w)); - map(0xd40e, 0xd40f).w(FUNC(fm7_state::fm7_vram_offset_w)); - map(0xd410, 0xd42b).rw(FUNC(fm7_state::fm77av_alu_r), FUNC(fm7_state::fm77av_alu_w)); - map(0xd430, 0xd430).rw(FUNC(fm7_state::fm77av_video_flags_r), FUNC(fm7_state::fm77av_video_flags_w)); - map(0xd431, 0xd432).rw(FUNC(fm7_state::fm77av_key_encoder_r), FUNC(fm7_state::fm77av_key_encoder_w)); + map(0xd400, 0xd401).r(FUNC(fm77_state::sub_keyboard_r)); + map(0xd402, 0xd402).r(FUNC(fm77_state::cancel_ack)); + map(0xd403, 0xd403).r(FUNC(fm77_state::sub_beeper_r)); + map(0xd404, 0xd404).r(FUNC(fm77_state::attn_irq_r)); + map(0xd408, 0xd408).rw(FUNC(fm77_state::crt_r), FUNC(fm77_state::crt_w)); + map(0xd409, 0xd409).rw(FUNC(fm77_state::vram_access_r), FUNC(fm77_state::vram_access_w)); + map(0xd40a, 0xd40a).rw(FUNC(fm77_state::sub_busyflag_r), FUNC(fm77_state::sub_busyflag_w)); + map(0xd40e, 0xd40f).w(FUNC(fm77_state::vram_offset_w)); + map(0xd410, 0xd42b).rw(FUNC(fm77_state::av_alu_r), FUNC(fm77_state::av_alu_w)); + map(0xd430, 0xd430).rw(FUNC(fm77_state::av_video_flags_r), FUNC(fm77_state::av_video_flags_w)); + map(0xd431, 0xd432).rw(FUNC(fm77_state::av_key_encoder_r), FUNC(fm77_state::av_key_encoder_w)); map(0xd500, 0xd7ff).ram().region("maincpu", 0x1d500); // Work RAM map(0xd800, 0xdfff).bankr("bank20"); map(0xe000, 0xffff).bankr("bank21"); } -void fm7_state::fm7_banked_mem(address_map &map) +void fm77_state::fm7_banked_mem(address_map &map) { // Extended RAM map(0x00000, 0x0ffff).ram().region("maincpu", 0x00000); // Sub CPU space - map(0x10000, 0x1bfff).rw(FUNC(fm7_state::fm7_vram_r), FUNC(fm7_state::fm7_vram_w)); // VRAM + map(0x10000, 0x1bfff).rw(FUNC(fm77_state::vram_r), FUNC(fm77_state::vram_w)); // VRAM map(0x1c000, 0x1cfff).ram().region("maincpu", 0x1c000); // Console RAM map(0x1d000, 0x1d37f).ram().region("maincpu", 0x1d000); // Work RAM map(0x1d380, 0x1d3ff).ram().share("shared_ram"); // I/O space (D400-D4FF) - map(0x1d400, 0x1d401).r(FUNC(fm7_state::fm7_sub_keyboard_r)); - map(0x1d402, 0x1d402).r(FUNC(fm7_state::fm7_cancel_ack)); - map(0x1d403, 0x1d403).r(FUNC(fm7_state::fm7_sub_beeper_r)); - map(0x1d404, 0x1d404).r(FUNC(fm7_state::fm7_attn_irq_r)); - map(0x1d408, 0x1d408).rw(FUNC(fm7_state::fm7_crt_r), FUNC(fm7_state::fm7_crt_w)); - map(0x1d409, 0x1d409).rw(FUNC(fm7_state::fm7_vram_access_r), FUNC(fm7_state::fm7_vram_access_w)); - map(0x1d40a, 0x1d40a).rw(FUNC(fm7_state::fm7_sub_busyflag_r), FUNC(fm7_state::fm7_sub_busyflag_w)); - map(0x1d40e, 0x1d40f).w(FUNC(fm7_state::fm7_vram_offset_w)); - map(0x1d410, 0x1d42b).rw(FUNC(fm7_state::fm77av_alu_r), FUNC(fm7_state::fm77av_alu_w)); - map(0x1d430, 0x1d430).rw(FUNC(fm7_state::fm77av_video_flags_r), FUNC(fm7_state::fm77av_video_flags_w)); - map(0x1d431, 0x1d432).rw(FUNC(fm7_state::fm77av_key_encoder_r), FUNC(fm7_state::fm77av_key_encoder_w)); + map(0x1d400, 0x1d401).r(FUNC(fm77_state::sub_keyboard_r)); + map(0x1d402, 0x1d402).r(FUNC(fm77_state::cancel_ack)); + map(0x1d403, 0x1d403).r(FUNC(fm77_state::sub_beeper_r)); + map(0x1d404, 0x1d404).r(FUNC(fm77_state::attn_irq_r)); + map(0x1d408, 0x1d408).rw(FUNC(fm77_state::crt_r), FUNC(fm77_state::crt_w)); + map(0x1d409, 0x1d409).rw(FUNC(fm77_state::vram_access_r), FUNC(fm77_state::vram_access_w)); + map(0x1d40a, 0x1d40a).rw(FUNC(fm77_state::sub_busyflag_r), FUNC(fm77_state::sub_busyflag_w)); + map(0x1d40e, 0x1d40f).w(FUNC(fm77_state::vram_offset_w)); + map(0x1d410, 0x1d42b).rw(FUNC(fm77_state::av_alu_r), FUNC(fm77_state::av_alu_w)); + map(0x1d430, 0x1d430).rw(FUNC(fm77_state::av_video_flags_r), FUNC(fm77_state::av_video_flags_w)); + map(0x1d431, 0x1d432).rw(FUNC(fm77_state::av_key_encoder_r), FUNC(fm77_state::av_key_encoder_w)); map(0x1d500, 0x1d7ff).ram().region("maincpu", 0x1d500); // Work RAM map(0x1d800, 0x1dfff).bankr("bank20"); map(0x1e000, 0x1ffff).bankr("bank21"); @@ -1706,7 +1704,8 @@ void fm7_state::fm7_banked_mem(address_map &map) map(0x30000, 0x35fff).ram().region("maincpu", 0x30000); map(0x36000, 0x37fff).bankr("init_bank_r").bankw("init_bank_w"); map(0x38000, 0x3fbff).bankr("fbasic_bank_r").bankw("fbasic_bank_w"); - map(0x3fc00, 0x3ffff).ram().region("maincpu", 0x3fc00); + map(0x3fc00, 0x3ffef).ram().region("maincpu", 0x3fc00); + map(0x3fff0, 0x3ffff).ram().share("vectors"); } @@ -1874,18 +1873,15 @@ void fm7_state::init_fm7() m_timer = timer_alloc(TIMER_FM7_IRQ); m_subtimer = timer_alloc(TIMER_FM7_SUBTIMER_IRQ); m_keyboard_timer = timer_alloc(TIMER_FM7_KEYBOARD_POLL); - m_fm77av_vsync_timer = timer_alloc(TIMER_FM77AV_VSYNC); - m_init_rom_en = 0; + m_init_rom_en = false; } MACHINE_START_MEMBER(fm7_state,fm7) { // The FM-7 has no initialisation ROM, and no other obvious // way to set the reset vector, so for now this will have to do. - uint8_t* RAM = memregion("maincpu")->base(); - - RAM[0xfffe] = 0xfe; - RAM[0xffff] = 0x00; + m_vectors[0xe] = 0xfe; + m_vectors[0xf] = 0x00; memset(m_shared_ram,0xff,0x80); m_type = SYS_FM7; @@ -1893,36 +1889,36 @@ MACHINE_START_MEMBER(fm7_state,fm7) m_beeper->set_state(0); } -MACHINE_START_MEMBER(fm7_state,fm77av) +MACHINE_START_MEMBER(fm77_state,fm77av) { - uint8_t* RAM = memregion("maincpu")->base(); + m_vsync_timer = timer_alloc(TIMER_FM77AV_VSYNC); + uint8_t* ROM = memregion("init")->base(); memset(m_shared_ram,0xff,0x80); // last part of Initiate ROM is visible at the end of RAM too (interrupt vectors) - memcpy(RAM+0x3fff0,ROM+0x1ff0,16); + memcpy(&m_vectors[0],ROM+0x1ff0,16); m_video.subrom = 0; // default sub CPU ROM is type C. - RAM = memregion("subsyscg")->base(); - membank("bank20")->set_base(RAM); - RAM = memregion("subsys_c")->base(); - membank("bank21")->set_base(RAM+0x800); + membank("bank20")->set_base(memregion("subsyscg")->base()); + membank("bank21")->set_base(memregion("subsys_c")->base()+0x800); m_type = SYS_FM77AV; m_beeper->set_state(0); } -MACHINE_START_MEMBER(fm7_state,fm11) +MACHINE_START_MEMBER(fm11_state,fm11) { - uint8_t* RAM = memregion("maincpu")->base(); + m_vsync_timer = timer_alloc(TIMER_FM77AV_VSYNC); + uint8_t* ROM = memregion("init")->base(); memset(m_shared_ram,0xff,0x80); m_type = SYS_FM11; m_beeper->set_state(0); // last part of Initiate ROM is visible at the end of RAM too (interrupt vectors) - memcpy(RAM+0x3fff0,ROM+0x0ff0,16); + memcpy(&m_vectors[0],ROM+0x0ff0,16); } MACHINE_START_MEMBER(fm7_state,fm16) @@ -1936,35 +1932,33 @@ void fm7_state::machine_reset() m_timer->adjust(attotime::from_nsec(2034500),0,attotime::from_nsec(2034500)); m_subtimer->adjust(attotime::from_msec(20),0,attotime::from_msec(20)); m_keyboard_timer->adjust(attotime::zero,0,attotime::from_msec(10)); - if(m_type == SYS_FM77AV || m_type == SYS_FM77AV40EX || m_type == SYS_FM11) - m_fm77av_vsync_timer->adjust(m_screen->time_until_vblank_end()); m_irq_mask = 0x00; m_irq_flags = 0x00; m_video.attn_irq = 0; m_video.sub_busy = 0x80; // busy at reset - m_basic_rom_en = 1; // enabled at reset, if in BASIC mode + m_basic_rom_en = true; // enabled at reset, if in BASIC mode if(m_type == SYS_FM11 || m_type == SYS_FM16) - m_basic_rom_en = 0; // all FM11/16 systems have no BASIC ROM except for the FM-11 ST + m_basic_rom_en = false; // all FM11/16 systems have no BASIC ROM except for the FM-11 ST if(m_type == SYS_FM77AV || m_type == SYS_FM77AV40EX) { - m_init_rom_en = 1; + m_init_rom_en = true; // last part of Initiate ROM is visible at the end of RAM too (interrupt vectors) - memcpy(m_ram_ptr + 0x3fff0, m_rom_ptr + 0x1ff0, 16); + memcpy(&m_vectors[0], m_rom_ptr + 0x1ff0, 16); } else if (m_type == SYS_FM11) { - m_init_rom_en = 1; + m_init_rom_en = true; // last part of Initiate ROM is visible at the end of RAM too (interrupt vectors) - memcpy(m_ram_ptr + 0x3fff0, m_rom_ptr + 0x0ff0, 16); + memcpy(&m_vectors[0], m_rom_ptr + 0x0ff0, 16); } else - m_init_rom_en = 0; + m_init_rom_en = false; if(m_type == SYS_FM7) { if(!(m_dsw->read() & 0x02)) { - m_basic_rom_en = 0; // disabled for DOS mode + m_basic_rom_en = false; // disabled for DOS mode membank("bank1")->set_base(m_ram_ptr + 0x08000); } else @@ -1981,12 +1975,6 @@ void fm7_state::machine_reset() m_psg_data = 0; m_fdc_side = 0; m_fdc_drive = 0; - m_mmr.mode = 0; - m_mmr.segment = 0; - m_mmr.enabled = 0; - m_fm77av_ym_irq = 0; - m_encoder.latch = 1; - m_encoder.ack = 1; // set boot mode (FM-7 only, AV and later has boot RAM instead) if(m_type == SYS_FM7) { @@ -1999,21 +1987,36 @@ void fm7_state::machine_reset() membank("bank17")->set_base(memregion("basic")->base()); } } - if(m_type == SYS_FM77AV || m_type == SYS_FM77AV40EX || m_type == SYS_FM11) - { - fm7_mmr_refresh(m_maincpu->space(AS_PROGRAM)); - membank("fbasic_bank_w")->set_base(m_ram_ptr + 0x38000); - membank("init_bank_w")->set_base(m_ram_ptr + 0x36000); - } - if(m_type == SYS_FM11) - { - // Probably best to halt the 8088, I'm pretty sure it and the main 6809 should not be running at the same time - m_x86->set_input_line(INPUT_LINE_HALT,ASSERT_LINE); - } memset(m_video_ram.get(), 0, sizeof(uint8_t) * 0x18000); } +void fm77_state::machine_reset() +{ + fm7_state::machine_reset(); + + m_vsync_timer->adjust(m_screen->time_until_vblank_end()); + + m_mmr.mode = 0; + m_mmr.segment = 0; + m_mmr.enabled = 0; + fm7_mmr_refresh(m_maincpu->space(AS_PROGRAM)); + membank("fbasic_bank_w")->set_base(m_ram_ptr + 0x38000); + membank("init_bank_w")->set_base(m_ram_ptr + 0x36000); + + m_encoder.latch = 1; + m_encoder.ack = 1; + m_fm77av_ym_irq = 0; +} + +void fm11_state::machine_reset() +{ + fm77_state::machine_reset(); + + // Probably best to halt the 8088, I'm pretty sure it and the main 6809 should not be running at the same time + m_x86->set_input_line(INPUT_LINE_HALT,ASSERT_LINE); +} + static void fm7_floppies(device_slot_interface &device) { @@ -2026,11 +2029,11 @@ void fm7_state::fm7(machine_config &config) /* basic machine hardware */ MC6809(config, m_maincpu, 16.128_MHz_XTAL / 2); m_maincpu->set_addrmap(AS_PROGRAM, &fm7_state::fm7_mem); - m_maincpu->set_irq_acknowledge_callback(FUNC(fm7_state::fm7_irq_ack)); + m_maincpu->set_irq_acknowledge_callback(FUNC(fm7_state::irq_ack)); MC6809(config, m_sub, 16.128_MHz_XTAL / 2); m_sub->set_addrmap(AS_PROGRAM, &fm7_state::fm7_sub_mem); - m_sub->set_irq_acknowledge_callback(FUNC(fm7_state::fm7_sub_irq_ack)); + m_sub->set_irq_acknowledge_callback(FUNC(fm7_state::sub_irq_ack)); config.set_perfect_quantum(m_sub); SPEAKER(config, "mono").front_center(); @@ -2055,8 +2058,8 @@ void fm7_state::fm7(machine_config &config) SOFTWARE_LIST(config, "cass_list").set_original("fm7_cass"); MB8877(config, m_fdc, 8_MHz_XTAL / 8); - m_fdc->intrq_wr_callback().set(FUNC(fm7_state::fm7_fdc_intrq_w)); - m_fdc->drq_wr_callback().set(FUNC(fm7_state::fm7_fdc_drq_w)); + m_fdc->intrq_wr_callback().set(FUNC(fm7_state::fdc_intrq_w)); + m_fdc->drq_wr_callback().set(FUNC(fm7_state::fdc_drq_w)); FLOPPY_CONNECTOR(config, m_floppy0, fm7_floppies, "qd", floppy_image_device::default_floppy_formats); FLOPPY_CONNECTOR(config, m_floppy1, fm7_floppies, "qd", floppy_image_device::default_floppy_formats); @@ -2079,11 +2082,11 @@ void fm7_state::fm8(machine_config &config) /* basic machine hardware */ MC6809(config, m_maincpu, 4.9152_MHz_XTAL); // 1.2MHz 68A09 m_maincpu->set_addrmap(AS_PROGRAM, &fm7_state::fm8_mem); - m_maincpu->set_irq_acknowledge_callback(FUNC(fm7_state::fm7_irq_ack)); + m_maincpu->set_irq_acknowledge_callback(FUNC(fm7_state::irq_ack)); MC6809(config, m_sub, 16.128_MHz_XTAL / 2); m_sub->set_addrmap(AS_PROGRAM, &fm7_state::fm7_sub_mem); - m_sub->set_irq_acknowledge_callback(FUNC(fm7_state::fm7_sub_irq_ack)); + m_sub->set_irq_acknowledge_callback(FUNC(fm7_state::sub_irq_ack)); config.set_perfect_quantum(m_sub); SPEAKER(config, "mono").front_center(); @@ -2105,8 +2108,8 @@ void fm7_state::fm8(machine_config &config) m_cassette->set_interface("fm7_cass"); MB8877(config, m_fdc, 8_MHz_XTAL / 8); - m_fdc->intrq_wr_callback().set(FUNC(fm7_state::fm7_fdc_intrq_w)); - m_fdc->drq_wr_callback().set(FUNC(fm7_state::fm7_fdc_drq_w)); + m_fdc->intrq_wr_callback().set(FUNC(fm7_state::fdc_intrq_w)); + m_fdc->drq_wr_callback().set(FUNC(fm7_state::fdc_drq_w)); FLOPPY_CONNECTOR(config, m_floppy0, fm7_floppies, "qd", floppy_image_device::default_floppy_formats); FLOPPY_CONNECTOR(config, m_floppy1, fm7_floppies, "qd", floppy_image_device::default_floppy_formats); @@ -2121,37 +2124,37 @@ void fm7_state::fm8(machine_config &config) m_centronics->set_output_latch(*m_cent_data_out); } -void fm7_state::fm77av(machine_config &config) +void fm77_state::fm77av(machine_config &config) { /* basic machine hardware */ MC6809E(config, m_maincpu, 16.128_MHz_XTAL / 8); - m_maincpu->set_addrmap(AS_PROGRAM, &fm7_state::fm77av_mem); - m_maincpu->set_irq_acknowledge_callback(FUNC(fm7_state::fm7_irq_ack)); + m_maincpu->set_addrmap(AS_PROGRAM, &fm77_state::fm77av_mem); + m_maincpu->set_irq_acknowledge_callback(FUNC(fm77_state::irq_ack)); MC6809E(config, m_sub, 16.128_MHz_XTAL / 8); - m_sub->set_addrmap(AS_PROGRAM, &fm7_state::fm77av_sub_mem); - m_sub->set_irq_acknowledge_callback(FUNC(fm7_state::fm7_sub_irq_ack)); + m_sub->set_addrmap(AS_PROGRAM, &fm77_state::fm77av_sub_mem); + m_sub->set_irq_acknowledge_callback(FUNC(fm77_state::sub_irq_ack)); config.set_perfect_quantum(m_sub); SPEAKER(config, "mono").front_center(); YM2203(config, m_ym, 4.9152_MHz_XTAL / 4); - m_ym->irq_handler().set(FUNC(fm7_state::fm77av_fmirq)); + m_ym->irq_handler().set(FUNC(fm77_state::av_fmirq)); m_ym->port_a_read_callback().set_ioport("joy1"); m_ym->port_b_read_callback().set_ioport("joy2"); m_ym->add_route(ALL_OUTPUTS,"mono", 1.00); BEEP(config, "beeper", 1200).add_route(ALL_OUTPUTS, "mono", 0.50); - MCFG_MACHINE_START_OVERRIDE(fm7_state,fm77av) + MCFG_MACHINE_START_OVERRIDE(fm77_state,fm77av) for (int bank = 0; bank < 16; bank++) { - ADDRESS_MAP_BANK(config, m_avbank[bank]).set_map(&fm7_state::fm7_banked_mem).set_options(ENDIANNESS_LITTLE, 8, 32, 0x1000); + ADDRESS_MAP_BANK(config, m_avbank[bank]).set_map(&fm77_state::fm7_banked_mem).set_options(ENDIANNESS_LITTLE, 8, 32, 0x1000); } /* video hardware */ SCREEN(config, m_screen, SCREEN_TYPE_RASTER); m_screen->set_raw(16.128_MHz_XTAL, 1024, 0, 640, 262, 0, 200); - m_screen->set_screen_update(FUNC(fm7_state::screen_update_fm7)); + m_screen->set_screen_update(FUNC(fm77_state::screen_update_fm7)); PALETTE(config, m_palette, palette_device::BRG_3BIT); PALETTE(config, m_av_palette).set_entries(4096); @@ -2165,8 +2168,8 @@ void fm7_state::fm77av(machine_config &config) SOFTWARE_LIST(config, "cass_list").set_compatible("fm7_cass"); MB8877(config, m_fdc, 8_MHz_XTAL / 8); - m_fdc->intrq_wr_callback().set(FUNC(fm7_state::fm7_fdc_intrq_w)); - m_fdc->drq_wr_callback().set(FUNC(fm7_state::fm7_fdc_drq_w)); + m_fdc->intrq_wr_callback().set(FUNC(fm77_state::fdc_intrq_w)); + m_fdc->drq_wr_callback().set(FUNC(fm77_state::fdc_drq_w)); FLOPPY_CONNECTOR(config, m_floppy0, fm7_floppies, "qd", floppy_image_device::default_floppy_formats); FLOPPY_CONNECTOR(config, m_floppy1, fm7_floppies, "qd", floppy_image_device::default_floppy_formats); @@ -2175,45 +2178,45 @@ void fm7_state::fm77av(machine_config &config) SOFTWARE_LIST(config, "flop_list").set_compatible("fm7_disk"); CENTRONICS(config, m_centronics, centronics_devices, "printer"); - m_centronics->busy_handler().set(FUNC(fm7_state::write_centronics_busy)); - m_centronics->fault_handler().set(FUNC(fm7_state::write_centronics_fault)); - m_centronics->ack_handler().set(FUNC(fm7_state::write_centronics_ack)); - m_centronics->perror_handler().set(FUNC(fm7_state::write_centronics_perror)); + m_centronics->busy_handler().set(FUNC(fm77_state::write_centronics_busy)); + m_centronics->fault_handler().set(FUNC(fm77_state::write_centronics_fault)); + m_centronics->ack_handler().set(FUNC(fm77_state::write_centronics_ack)); + m_centronics->perror_handler().set(FUNC(fm77_state::write_centronics_perror)); OUTPUT_LATCH(config, m_cent_data_out); m_centronics->set_output_latch(*m_cent_data_out); } -void fm7_state::fm11(machine_config &config) +void fm11_state::fm11(machine_config &config) { /* basic machine hardware */ MC6809E(config, m_maincpu, 2000000); // 2MHz 68B09E - m_maincpu->set_addrmap(AS_PROGRAM, &fm7_state::fm11_mem); - m_maincpu->set_irq_acknowledge_callback(FUNC(fm7_state::fm7_irq_ack)); + m_maincpu->set_addrmap(AS_PROGRAM, &fm11_state::fm11_mem); + m_maincpu->set_irq_acknowledge_callback(FUNC(fm11_state::irq_ack)); MC6809(config, m_sub, 8000000); // 2MHz 68B09 - m_sub->set_addrmap(AS_PROGRAM, &fm7_state::fm11_sub_mem); - m_sub->set_irq_acknowledge_callback(FUNC(fm7_state::fm7_sub_irq_ack)); + m_sub->set_addrmap(AS_PROGRAM, &fm11_state::fm11_sub_mem); + m_sub->set_irq_acknowledge_callback(FUNC(fm11_state::sub_irq_ack)); config.set_perfect_quantum(m_sub); I8088(config, m_x86, 8000000); // 8MHz i8088 - m_x86->set_addrmap(AS_PROGRAM, &fm7_state::fm11_x86_mem); - m_x86->set_addrmap(AS_IO, &fm7_state::fm11_x86_io); + m_x86->set_addrmap(AS_PROGRAM, &fm11_state::fm11_x86_mem); + m_x86->set_addrmap(AS_IO, &fm11_state::fm11_x86_io); SPEAKER(config, "mono").front_center(); BEEP(config, m_beeper, 1200).add_route(ALL_OUTPUTS, "mono", 0.50); - MCFG_MACHINE_START_OVERRIDE(fm7_state,fm11) + MCFG_MACHINE_START_OVERRIDE(fm11_state,fm11) for (int bank = 0; bank < 16; bank++) { - ADDRESS_MAP_BANK(config, m_avbank[bank]).set_map(&fm7_state::fm7_banked_mem).set_options(ENDIANNESS_LITTLE, 8, 32, 0x1000); + ADDRESS_MAP_BANK(config, m_avbank[bank]).set_map(&fm11_state::fm7_banked_mem).set_options(ENDIANNESS_LITTLE, 8, 32, 0x1000); } /* video hardware */ SCREEN(config, m_screen, SCREEN_TYPE_RASTER); m_screen->set_raw(16128000, 1024, 0, 640, 262, 0, 200); - m_screen->set_screen_update(FUNC(fm7_state::screen_update_fm7)); + m_screen->set_screen_update(FUNC(fm11_state::screen_update_fm7)); PALETTE(config, m_palette, palette_device::BRG_3BIT); @@ -2224,17 +2227,17 @@ void fm7_state::fm11(machine_config &config) m_cassette->set_interface("fm7_cass"); MB8877(config, m_fdc, 8_MHz_XTAL / 8); - m_fdc->intrq_wr_callback().set(FUNC(fm7_state::fm7_fdc_intrq_w)); - m_fdc->drq_wr_callback().set(FUNC(fm7_state::fm7_fdc_drq_w)); + m_fdc->intrq_wr_callback().set(FUNC(fm11_state::fdc_intrq_w)); + m_fdc->drq_wr_callback().set(FUNC(fm11_state::fdc_drq_w)); FLOPPY_CONNECTOR(config, m_floppy0, fm7_floppies, "qd", floppy_image_device::default_floppy_formats); FLOPPY_CONNECTOR(config, m_floppy1, fm7_floppies, "qd", floppy_image_device::default_floppy_formats); CENTRONICS(config, m_centronics, centronics_devices, "printer"); - m_centronics->busy_handler().set(FUNC(fm7_state::write_centronics_busy)); - m_centronics->fault_handler().set(FUNC(fm7_state::write_centronics_fault)); - m_centronics->ack_handler().set(FUNC(fm7_state::write_centronics_ack)); - m_centronics->perror_handler().set(FUNC(fm7_state::write_centronics_perror)); + m_centronics->busy_handler().set(FUNC(fm11_state::write_centronics_busy)); + m_centronics->fault_handler().set(FUNC(fm11_state::write_centronics_fault)); + m_centronics->ack_handler().set(FUNC(fm11_state::write_centronics_ack)); + m_centronics->perror_handler().set(FUNC(fm11_state::write_centronics_perror)); OUTPUT_LATCH(config, m_cent_data_out); m_centronics->set_output_latch(*m_cent_data_out); @@ -2248,7 +2251,7 @@ void fm7_state::fm16beta(machine_config &config) m_maincpu->set_addrmap(AS_IO, &fm7_state::fm16_io); MC6809(config, m_sub, 8000000); - m_sub->set_irq_acknowledge_callback(FUNC(fm7_state::fm7_sub_irq_ack)); + m_sub->set_irq_acknowledge_callback(FUNC(fm7_state::sub_irq_ack)); m_sub->set_addrmap(AS_PROGRAM, &fm7_state::fm16_sub_mem); config.set_perfect_quantum(m_sub); @@ -2271,8 +2274,8 @@ void fm7_state::fm16beta(machine_config &config) m_cassette->set_interface("fm7_cass"); MB8877(config, m_fdc, 8_MHz_XTAL / 8); - m_fdc->intrq_wr_callback().set(FUNC(fm7_state::fm7_fdc_intrq_w)); - m_fdc->drq_wr_callback().set(FUNC(fm7_state::fm7_fdc_drq_w)); + m_fdc->intrq_wr_callback().set(FUNC(fm7_state::fdc_intrq_w)); + m_fdc->drq_wr_callback().set(FUNC(fm7_state::fdc_drq_w)); FLOPPY_CONNECTOR(config, m_floppy0, fm7_floppies, "qd", floppy_image_device::default_floppy_formats); FLOPPY_CONNECTOR(config, m_floppy1, fm7_floppies, "qd", floppy_image_device::default_floppy_formats); @@ -2449,13 +2452,13 @@ ROM_END /* Driver */ -/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */ -COMP( 1981, fm8, 0, 0, fm8, fm8, fm7_state, init_fm7, "Fujitsu", "FM-8", 0) -COMP( 1982, fm7, 0, 0, fm7, fm7, fm7_state, init_fm7, "Fujitsu", "FM-7", 0) -COMP( 1984, fmnew7, fm7, 0, fm7, fm7, fm7_state, init_fm7, "Fujitsu", "FM-NEW7", 0) -COMP( 1985, fm77av, fm7, 0, fm77av, fm7, fm7_state, init_fm7, "Fujitsu", "FM-77AV", MACHINE_IMPERFECT_GRAPHICS) -COMP( 1985, fm7740sx, fm7, 0, fm77av, fm7, fm7_state, init_fm7, "Fujitsu", "FM-77AV40SX", MACHINE_NOT_WORKING) +/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */ +COMP( 1981, fm8, 0, 0, fm8, fm8, fm7_state, init_fm7, "Fujitsu", "FM-8", 0) +COMP( 1982, fm7, 0, 0, fm7, fm7, fm7_state, init_fm7, "Fujitsu", "FM-7", 0) +COMP( 1984, fmnew7, fm7, 0, fm7, fm7, fm7_state, init_fm7, "Fujitsu", "FM-NEW7", 0) +COMP( 1985, fm77av, fm7, 0, fm77av, fm7, fm77_state, init_fm7, "Fujitsu", "FM-77AV", MACHINE_IMPERFECT_GRAPHICS) +COMP( 1985, fm7740sx, fm7, 0, fm77av, fm7, fm77_state, init_fm7, "Fujitsu", "FM-77AV40SX", MACHINE_NOT_WORKING) // These may be separated into a separate driver, depending on how different they are to the FM-8/FM-7 -COMP( 1982, fm11, 0, 0, fm11, fm7, fm7_state, init_fm7, "Fujitsu", "FM-11 EX", MACHINE_NOT_WORKING) -COMP( 1982, fm16beta, 0, 0, fm16beta, fm7, fm7_state, init_fm7, "Fujitsu", "FM-16\xCE\xB2", MACHINE_NOT_WORKING) +COMP( 1982, fm11, 0, 0, fm11, fm7, fm11_state, init_fm7, "Fujitsu", "FM-11 EX", MACHINE_NOT_WORKING) +COMP( 1982, fm16beta, 0, 0, fm16beta, fm7, fm7_state, init_fm7, "Fujitsu", "FM-16\xCE\xB2", MACHINE_NOT_WORKING) diff --git a/src/mame/includes/fm7.h b/src/mame/includes/fm7.h index 25da2b9aca7..ac9848a5910 100644 --- a/src/mame/includes/fm7.h +++ b/src/mame/includes/fm7.h @@ -22,107 +22,17 @@ #include "emupal.h" -// Interrupt flags -#define IRQ_FLAG_KEY 0x01 -#define IRQ_FLAG_PRINTER 0x02 -#define IRQ_FLAG_TIMER 0x04 -#define IRQ_FLAG_OTHER 0x08 -// the following are not read in port 0xfd03 -#define IRQ_FLAG_MFD 0x10 -#define IRQ_FLAG_TXRDY 0x20 -#define IRQ_FLAG_RXRDY 0x40 -#define IRQ_FLAG_SYNDET 0x80 - -// system types -#define SYS_FM7 1 -#define SYS_FM77AV 2 -#define SYS_FM77AV40EX 3 -#define SYS_FM11 4 -#define SYS_FM16 5 - -// keyboard scancode formats -#define KEY_MODE_FM7 0 // FM-7 ASCII type code -#define KEY_MODE_FM16B 1 // FM-16B (FM-77AV and later only) -#define KEY_MODE_SCAN 2 // Scancode Make/Break (PC-like) - -struct fm7_encoder_t -{ - uint8_t buffer[12]; - uint8_t tx_count; - uint8_t rx_count; - uint8_t command_length; - uint8_t answer_length; - uint8_t latch; // 0=ready to receive - uint8_t ack; - uint8_t position; -}; - -struct fm7_mmr_t -{ - uint8_t bank_addr[8][16]; - uint8_t segment; - uint8_t window_offset; - uint8_t enabled; - uint8_t mode; -}; - -struct fm7_video_t -{ - uint8_t sub_busy; - uint8_t sub_halt; - uint8_t sub_reset; // high if reset caused by subrom change - uint8_t attn_irq; - uint8_t vram_access; // VRAM access flag - uint8_t crt_enable; - uint16_t vram_offset; - uint16_t vram_offset2; - uint8_t fm7_pal[8]; - uint16_t fm77av_pal_selected; - uint8_t subrom; // currently active sub CPU ROM (AV only) - uint8_t cgrom; // currently active CGROM (AV only) - uint8_t modestatus; - uint8_t multi_page; - uint8_t fine_offset; - uint8_t nmi_mask; - uint8_t active_video_page; - uint8_t display_video_page; - uint8_t vsync_flag; -}; - -struct fm7_alu_t -{ - uint8_t command; - uint8_t lcolour; - uint8_t mask; - uint8_t compare_data; - uint8_t compare[8]; - uint8_t bank_disable; - uint8_t tilepaint_b; - uint8_t tilepaint_r; - uint8_t tilepaint_g; - uint16_t addr_offset; - uint16_t line_style; - uint16_t x0; - uint16_t x1; - uint16_t y0; - uint16_t y1; - uint8_t busy; -}; - - class fm7_state : public driver_device { public: fm7_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), m_shared_ram(*this, "shared_ram"), - m_boot_ram(*this, "boot_ram"), + m_vectors(*this, "vectors"), m_maincpu(*this, "maincpu"), m_sub(*this, "sub"), - m_x86(*this, "x86"), m_cassette(*this, "cassette"), m_beeper(*this, "beeper"), - m_ym(*this, "ym"), m_psg(*this, "psg"), m_screen(*this, "screen"), m_centronics(*this, "centronics"), @@ -140,20 +50,17 @@ public: m_joy1(*this, "joy1"), m_dsw(*this, "DSW"), m_palette(*this, "palette"), - m_av_palette(*this, "av_palette"), - m_avbank(*this, "av_bank%u", 1) + m_av_palette(*this, "av_palette") { } void fm16beta(machine_config &config); void fm8(machine_config &config); void fm7(machine_config &config); - void fm77av(machine_config &config); - void fm11(machine_config &config); void init_fm7(); -private: +protected: enum { TIMER_FM7_BEEPER_OFF, @@ -165,107 +72,134 @@ private: TIMER_FM77AV_VSYNC }; + // Interrupt flags + enum : uint8_t + { + IRQ_FLAG_KEY = 0x01, + IRQ_FLAG_PRINTER = 0x02, + IRQ_FLAG_TIMER = 0x04, + IRQ_FLAG_OTHER = 0x08, + // the following are not read in port 0xfd03 + IRQ_FLAG_MFD = 0x10, + IRQ_FLAG_TXRDY = 0x20, + IRQ_FLAG_RXRDY = 0x40, + IRQ_FLAG_SYNDET = 0x80 + }; + + // system types + enum + { + SYS_FM7 = 1, + SYS_FM77AV = 2, + SYS_FM77AV40EX = 3, + SYS_FM11 = 4, + SYS_FM16 = 5 + }; + + // keyboard scancode formats + enum + { + KEY_MODE_FM7 = 0, // FM-7 ASCII type code + KEY_MODE_FM16B = 1, // FM-16B (FM-77AV and later only) + KEY_MODE_SCAN = 2 // Scancode Make/Break (PC-like) + }; + + struct fm7_video_t + { + uint8_t sub_busy; + uint8_t sub_halt; + uint8_t sub_reset; // high if reset caused by subrom change + uint8_t attn_irq; + uint8_t vram_access; // VRAM access flag + uint8_t crt_enable; + uint16_t vram_offset; + uint16_t vram_offset2; + uint8_t fm7_pal[8]; + uint16_t fm77av_pal_selected; + uint8_t subrom; // currently active sub CPU ROM (AV only) + uint8_t cgrom; // currently active CGROM (AV only) + uint8_t modestatus; + uint8_t multi_page; + uint8_t fine_offset; + uint8_t nmi_mask; + uint8_t active_video_page; + uint8_t display_video_page; + uint8_t vsync_flag; + }; + + struct fm7_alu_t + { + uint8_t command; + uint8_t lcolour; + uint8_t mask; + uint8_t compare_data; + uint8_t compare[8]; + uint8_t bank_disable; + uint8_t tilepaint_b; + uint8_t tilepaint_r; + uint8_t tilepaint_g; + uint16_t addr_offset; + uint16_t line_style; + uint16_t x0; + uint16_t x1; + uint16_t y0; + uint16_t y1; + uint8_t busy; + }; + virtual void machine_reset() override; virtual void video_start() override; + virtual void fm7_alu_function(uint32_t offset) { } + virtual void fm7_mmr_refresh(address_space &space) { } + DECLARE_MACHINE_START(fm7); - DECLARE_MACHINE_START(fm77av); - DECLARE_MACHINE_START(fm11); DECLARE_MACHINE_START(fm16); - DECLARE_WRITE_LINE_MEMBER(fm7_fdc_intrq_w); - DECLARE_WRITE_LINE_MEMBER(fm7_fdc_drq_w); - DECLARE_WRITE_LINE_MEMBER(fm77av_fmirq); + DECLARE_WRITE_LINE_MEMBER(fdc_intrq_w); + DECLARE_WRITE_LINE_MEMBER(fdc_drq_w); - uint8_t fm7_subintf_r(); - void fm7_subintf_w(uint8_t data); - uint8_t fm7_sub_busyflag_r(); - void fm7_sub_busyflag_w(uint8_t data); - uint8_t fm7_cancel_ack(); - uint8_t fm7_attn_irq_r(); - uint8_t fm7_vram_access_r(); - void fm7_vram_access_w(uint8_t data); - uint8_t fm7_vram_r(offs_t offset); - void fm7_vram_w(offs_t offset, uint8_t data); - void fm7_vram_banked_w(offs_t offset, uint8_t data); - uint8_t fm7_vram0_r(offs_t offset); - uint8_t fm7_vram1_r(offs_t offset); - uint8_t fm7_vram2_r(offs_t offset); - uint8_t fm7_vram3_r(offs_t offset); - uint8_t fm7_vram4_r(offs_t offset); - uint8_t fm7_vram5_r(offs_t offset); - uint8_t fm7_vram6_r(offs_t offset); - uint8_t fm7_vram7_r(offs_t offset); - uint8_t fm7_vram8_r(offs_t offset); - uint8_t fm7_vram9_r(offs_t offset); - uint8_t fm7_vramA_r(offs_t offset); - uint8_t fm7_vramB_r(offs_t offset); - void fm7_vram0_w(offs_t offset, uint8_t data); - void fm7_vram1_w(offs_t offset, uint8_t data); - void fm7_vram2_w(offs_t offset, uint8_t data); - void fm7_vram3_w(offs_t offset, uint8_t data); - void fm7_vram4_w(offs_t offset, uint8_t data); - void fm7_vram5_w(offs_t offset, uint8_t data); - void fm7_vram6_w(offs_t offset, uint8_t data); - void fm7_vram7_w(offs_t offset, uint8_t data); - void fm7_vram8_w(offs_t offset, uint8_t data); - void fm7_vram9_w(offs_t offset, uint8_t data); - void fm7_vramA_w(offs_t offset, uint8_t data); - void fm7_vramB_w(offs_t offset, uint8_t data); - uint8_t fm7_crt_r(); - void fm7_crt_w(uint8_t data); - void fm7_vram_offset_w(offs_t offset, uint8_t data); - void fm7_multipage_w(uint8_t data); - uint8_t fm7_palette_r(offs_t offset); - void fm7_palette_w(offs_t offset, uint8_t data); - void fm77av_analog_palette_w(offs_t offset, uint8_t data); - uint8_t fm77av_video_flags_r(); - void fm77av_video_flags_w(uint8_t data); - uint8_t fm77av_sub_modestatus_r(); - void fm77av_sub_modestatus_w(uint8_t data); - void fm77av_sub_bank_w(uint8_t data); - uint8_t fm77av_alu_r(offs_t offset); - void fm77av_alu_w(offs_t offset, uint8_t data); - uint8_t fm7_sub_ram_ports_banked_r(offs_t offset); - void fm7_sub_ram_ports_banked_w(offs_t offset, uint8_t data); - uint8_t fm7_console_ram_banked_r(offs_t offset); - void fm7_console_ram_banked_w(offs_t offset, uint8_t data); - void fm7_irq_mask_w(uint8_t data); - uint8_t fm7_irq_cause_r(); - void fm7_beeper_w(uint8_t data); - uint8_t fm7_sub_beeper_r(); - uint8_t vector_r(offs_t offset); - void vector_w(offs_t offset, uint8_t data); - uint8_t fm7_fd04_r(); - uint8_t fm7_rom_en_r(address_space &space); - void fm7_rom_en_w(address_space &space, uint8_t data); - void fm7_init_en_w(address_space &space, uint8_t data); - uint8_t fm7_fdc_r(offs_t offset); - void fm7_fdc_w(offs_t offset, uint8_t data); - uint8_t fm7_keyboard_r(offs_t offset); - uint8_t fm7_sub_keyboard_r(offs_t offset); - uint8_t fm77av_key_encoder_r(offs_t offset); - void fm77av_key_encoder_w(offs_t offset, uint8_t data); - uint8_t fm7_cassette_printer_r(); - void fm7_cassette_printer_w(offs_t offset, uint8_t data); - uint8_t fm77av_boot_mode_r(); - uint8_t fm7_psg_select_r(); - void fm7_psg_select_w(uint8_t data); - void fm77av_ym_select_w(uint8_t data); - uint8_t fm7_psg_data_r(); - void fm7_psg_data_w(uint8_t data); - void fm77av_bootram_w(offs_t offset, uint8_t data); - uint8_t fm7_main_shared_r(offs_t offset); - void fm7_main_shared_w(offs_t offset, uint8_t data); - uint8_t fm7_fmirq_r(); - uint8_t fm7_unknown_r(); - uint8_t fm7_mmr_r(offs_t offset); - void fm7_mmr_w(address_space &space, offs_t offset, uint8_t data); - uint8_t fm7_kanji_r(offs_t offset); - void fm7_kanji_w(offs_t offset, uint8_t data); + uint8_t subintf_r(); + void subintf_w(uint8_t data); + uint8_t sub_busyflag_r(); + void sub_busyflag_w(uint8_t data); + uint8_t cancel_ack(); + uint8_t attn_irq_r(); + uint8_t vram_access_r(); + void vram_access_w(uint8_t data); + uint8_t vram_r(offs_t offset); + void vram_w(offs_t offset, uint8_t data); + uint8_t crt_r(); + void crt_w(uint8_t data); + void vram_offset_w(offs_t offset, uint8_t data); + void multipage_w(uint8_t data); + uint8_t palette_r(offs_t offset); + void palette_w(offs_t offset, uint8_t data); + void irq_mask_w(uint8_t data); + uint8_t irq_cause_r(); + void beeper_w(uint8_t data); + uint8_t sub_beeper_r(); + uint8_t fd04_r(); + uint8_t rom_en_r(address_space &space); + void rom_en_w(address_space &space, uint8_t data); + uint8_t fdc_r(offs_t offset); + void fdc_w(offs_t offset, uint8_t data); + uint8_t keyboard_r(offs_t offset); + uint8_t sub_keyboard_r(offs_t offset); + uint8_t cassette_printer_r(); + void cassette_printer_w(offs_t offset, uint8_t data); + uint8_t psg_select_r(); + void psg_select_w(uint8_t data); + uint8_t psg_data_r(); + void psg_data_w(uint8_t data); + uint8_t main_shared_r(offs_t offset); + void main_shared_w(offs_t offset, uint8_t data); + uint8_t unknown_r(); + uint8_t kanji_r(offs_t offset); + void kanji_w(offs_t offset, uint8_t data); - IRQ_CALLBACK_MEMBER(fm7_irq_ack); - IRQ_CALLBACK_MEMBER(fm7_sub_irq_ack); + IRQ_CALLBACK_MEMBER(irq_ack); + IRQ_CALLBACK_MEMBER(sub_irq_ack); DECLARE_WRITE_LINE_MEMBER(write_centronics_busy); DECLARE_WRITE_LINE_MEMBER(write_centronics_fault); @@ -274,30 +208,23 @@ private: uint32_t screen_update_fm7(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); - void fm11_mem(address_map &map); - void fm11_sub_mem(address_map &map); - void fm11_x86_io(address_map &map); - void fm11_x86_mem(address_map &map); void fm16_io(address_map &map); void fm16_mem(address_map &map); void fm16_sub_mem(address_map &map); - void fm77av_mem(address_map &map); - void fm77av_sub_mem(address_map &map); - void fm7_banked_mem(address_map &map); void fm7_mem(address_map &map); void fm7_sub_mem(address_map &map); void fm8_mem(address_map &map); optional_shared_ptr m_shared_ram; - optional_shared_ptr m_boot_ram; + required_shared_ptr m_vectors; uint8_t m_irq_flags; uint8_t m_irq_mask; emu_timer* m_timer; emu_timer* m_subtimer; emu_timer* m_keyboard_timer; - uint8_t m_basic_rom_en; - uint8_t m_init_rom_en; + bool m_basic_rom_en; + bool m_init_rom_en; unsigned int m_key_delay; unsigned int m_key_repeat; @@ -315,37 +242,26 @@ private: uint8_t m_fdc_irq_flag; uint8_t m_fdc_drq_flag; - uint8_t m_fm77av_ym_irq; uint8_t m_speaker_active; uint16_t m_kanji_address; - fm7_encoder_t m_encoder; - fm7_mmr_t m_mmr; uint8_t m_cp_prev; std::unique_ptr m_video_ram; - emu_timer* m_fm77av_vsync_timer; uint8_t m_type; fm7_video_t m_video; fm7_alu_t m_alu; int m_sb_prev; - void fm77av_encoder_setup_command(); - void fm77av_encoder_handle_command(); - TIMER_CALLBACK_MEMBER(fm7_beeper_off); - TIMER_CALLBACK_MEMBER(fm77av_encoder_ack); - TIMER_CALLBACK_MEMBER(fm7_timer_irq); - TIMER_CALLBACK_MEMBER(fm7_subtimer_irq); - TIMER_CALLBACK_MEMBER(fm7_keyboard_poll); - TIMER_CALLBACK_MEMBER(fm77av_alu_task_end); - TIMER_CALLBACK_MEMBER(fm77av_vsync); + TIMER_CALLBACK_MEMBER(beeper_off); + TIMER_CALLBACK_MEMBER(timer_irq); + TIMER_CALLBACK_MEMBER(subtimer_irq); + TIMER_CALLBACK_MEMBER(keyboard_poll); required_device m_maincpu; required_device m_sub; - optional_device m_x86; required_device m_cassette; required_device m_beeper; - optional_device m_ym; optional_device m_psg; required_device m_screen; @@ -361,25 +277,11 @@ private: optional_region_ptr m_rom_ptr; optional_region_ptr m_basic_ptr; - void fm7_alu_mask_write(uint32_t offset, int bank, uint8_t dat); - void fm7_alu_function_compare(uint32_t offset); - void fm7_alu_function_pset(uint32_t offset); - void fm7_alu_function_or(uint32_t offset); - void fm7_alu_function_and(uint32_t offset); - void fm7_alu_function_xor(uint32_t offset); - void fm7_alu_function_not(uint32_t offset); - void fm7_alu_function_invalid(uint32_t offset); - void fm7_alu_function_tilepaint(uint32_t offset); - void fm7_alu_function(uint32_t offset); - uint32_t fm7_line_set_pixel(int x, int y); - void fm77av_line_draw(); void main_irq_set_flag(uint8_t flag); void main_irq_clear_flag(uint8_t flag); - void fm7_update_psg(); - void fm7_update_bank(address_space & space, int bank, uint8_t physical); - void fm7_mmr_refresh(address_space& space); + virtual void fm7_update_psg(); void key_press(uint16_t scancode); - void fm7_keyboard_poll_scan(); + void keyboard_poll_scan(); int m_centronics_busy; int m_centronics_fault; @@ -394,9 +296,161 @@ private: required_device m_palette; optional_device m_av_palette; - optional_device_array m_avbank; - virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; }; +class fm77_state : public fm7_state +{ +public: + fm77_state(const machine_config &mconfig, device_type type, const char *tag) : + fm7_state(mconfig, type, tag), + m_avbank(*this, "av_bank%u", 1), + m_ym(*this, "ym"), + m_boot_ram(*this, "boot_ram") + { + } + + void fm77av(machine_config &config); + +protected: + struct fm7_encoder_t + { + uint8_t buffer[12]; + uint8_t tx_count; + uint8_t rx_count; + uint8_t command_length; + uint8_t answer_length; + uint8_t latch; // 0=ready to receive + uint8_t ack; + uint8_t position; + }; + + struct fm7_mmr_t + { + uint8_t bank_addr[8][16]; + uint8_t segment; + uint8_t window_offset; + uint8_t enabled; + uint8_t mode; + }; + + virtual void machine_reset() override; + virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; + + DECLARE_MACHINE_START(fm77av); + + void av_encoder_setup_command(); + void av_encoder_handle_command(); + TIMER_CALLBACK_MEMBER(av_encoder_ack); + TIMER_CALLBACK_MEMBER(av_alu_task_end); + TIMER_CALLBACK_MEMBER(av_vsync); + + DECLARE_WRITE_LINE_MEMBER(av_fmirq); + + void vram_banked_w(offs_t offset, uint8_t data); + uint8_t vram0_r(offs_t offset); + uint8_t vram1_r(offs_t offset); + uint8_t vram2_r(offs_t offset); + uint8_t vram3_r(offs_t offset); + uint8_t vram4_r(offs_t offset); + uint8_t vram5_r(offs_t offset); + uint8_t vram6_r(offs_t offset); + uint8_t vram7_r(offs_t offset); + uint8_t vram8_r(offs_t offset); + uint8_t vram9_r(offs_t offset); + uint8_t vramA_r(offs_t offset); + uint8_t vramB_r(offs_t offset); + void vram0_w(offs_t offset, uint8_t data); + void vram1_w(offs_t offset, uint8_t data); + void vram2_w(offs_t offset, uint8_t data); + void vram3_w(offs_t offset, uint8_t data); + void vram4_w(offs_t offset, uint8_t data); + void vram5_w(offs_t offset, uint8_t data); + void vram6_w(offs_t offset, uint8_t data); + void vram7_w(offs_t offset, uint8_t data); + void vram8_w(offs_t offset, uint8_t data); + void vram9_w(offs_t offset, uint8_t data); + void vramA_w(offs_t offset, uint8_t data); + void vramB_w(offs_t offset, uint8_t data); + uint8_t console_ram_banked_r(offs_t offset); + void console_ram_banked_w(offs_t offset, uint8_t data); + uint8_t sub_ram_ports_banked_r(offs_t offset); + void sub_ram_ports_banked_w(offs_t offset, uint8_t data); + void av_analog_palette_w(offs_t offset, uint8_t data); + uint8_t av_video_flags_r(); + void av_video_flags_w(uint8_t data); + uint8_t av_sub_modestatus_r(); + void av_sub_modestatus_w(uint8_t data); + void av_sub_bank_w(uint8_t data); + uint8_t av_alu_r(offs_t offset); + void av_alu_w(offs_t offset, uint8_t data); + void av_bootram_w(offs_t offset, uint8_t data); + uint8_t av_key_encoder_r(offs_t offset); + void av_key_encoder_w(offs_t offset, uint8_t data); + uint8_t av_boot_mode_r(); + void av_ym_select_w(uint8_t data); + uint8_t vector_r(offs_t offset); + void init_en_w(address_space &space, uint8_t data); + uint8_t fmirq_r(); + virtual void fm7_update_psg() override; + + uint8_t mmr_r(offs_t offset); + void mmr_w(address_space &space, offs_t offset, uint8_t data); + void fm7_update_bank(address_space &space, int bank, uint8_t physical); + virtual void fm7_mmr_refresh(address_space &space) override; + + void alu_mask_write(uint32_t offset, int bank, uint8_t dat); + void alu_function_compare(uint32_t offset); + void alu_function_pset(uint32_t offset); + void alu_function_or(uint32_t offset); + void alu_function_and(uint32_t offset); + void alu_function_xor(uint32_t offset); + void alu_function_not(uint32_t offset); + void alu_function_invalid(uint32_t offset); + void alu_function_tilepaint(uint32_t offset); + virtual void fm7_alu_function(uint32_t offset) override; + uint32_t av_line_set_pixel(int x, int y); + void av_line_draw(); + + void fm77av_mem(address_map &map); + void fm77av_sub_mem(address_map &map); + void fm7_banked_mem(address_map &map); + + required_device_array m_avbank; + optional_device m_ym; + required_shared_ptr m_boot_ram; + + fm7_encoder_t m_encoder; + fm7_mmr_t m_mmr; + + emu_timer* m_vsync_timer; + + uint8_t m_fm77av_ym_irq; +}; + +class fm11_state : public fm77_state +{ +public: + fm11_state(const machine_config &mconfig, device_type type, const char *tag) : + fm77_state(mconfig, type, tag), + m_x86(*this, "x86") + { + } + + void fm11(machine_config &config); + +protected: + virtual void machine_reset() override; + +private: + DECLARE_MACHINE_START(fm11); + + void fm11_mem(address_map &map); + void fm11_sub_mem(address_map &map); + void fm11_x86_io(address_map &map); + void fm11_x86_mem(address_map &map); + + required_device m_x86; +}; + #endif // MAME_INCLUDES_FM7_H diff --git a/src/mame/video/fm7.cpp b/src/mame/video/fm7.cpp index 9fff36ff0d6..6a728ab70db 100644 --- a/src/mame/video/fm7.cpp +++ b/src/mame/video/fm7.cpp @@ -24,7 +24,7 @@ * bit 6: Sub-CPU cancel IRQ */ -uint8_t fm7_state::fm7_subintf_r() +uint8_t fm7_state::subintf_r() { uint8_t ret = 0x00; @@ -37,7 +37,7 @@ uint8_t fm7_state::fm7_subintf_r() return ret; } -void fm7_state::fm7_subintf_w(uint8_t data) +void fm7_state::subintf_w(uint8_t data) { m_video.sub_halt = data & 0x80; if(data & 0x80) @@ -49,14 +49,14 @@ void fm7_state::fm7_subintf_w(uint8_t data) //popmessage("Sub CPU Interface write: %02x\n",data); } -uint8_t fm7_state::fm7_sub_busyflag_r() +uint8_t fm7_state::sub_busyflag_r() { if(m_video.sub_halt == 0) m_video.sub_busy = 0x00; return 0x00; } -void fm7_state::fm7_sub_busyflag_w(uint8_t data) +void fm7_state::sub_busyflag_w(uint8_t data) { m_video.sub_busy = 0x80; } @@ -65,7 +65,7 @@ void fm7_state::fm7_sub_busyflag_w(uint8_t data) * Sub-CPU port 0xd402 * Read-only: Acknowledge Cancel IRQ */ -uint8_t fm7_state::fm7_cancel_ack() +uint8_t fm7_state::cancel_ack() { m_sub->set_input_line(M6809_IRQ_LINE,CLEAR_LINE); return 0x00; @@ -74,7 +74,7 @@ uint8_t fm7_state::fm7_cancel_ack() /* * Reading from 0xd404 (sub-CPU) causes an "Attention" FIRQ on the main CPU */ -uint8_t fm7_state::fm7_attn_irq_r() +uint8_t fm7_state::attn_irq_r() { m_video.attn_irq = 1; m_maincpu->set_input_line(M6809_FIRQ_LINE,ASSERT_LINE); @@ -87,23 +87,23 @@ uint8_t fm7_state::fm7_attn_irq_r() * On read, enables VRAM access * On write, disables VRAM access */ -uint8_t fm7_state::fm7_vram_access_r() +uint8_t fm7_state::vram_access_r() { m_video.vram_access = 1; return 0xff; } -void fm7_state::fm7_vram_access_w(uint8_t data) +void fm7_state::vram_access_w(uint8_t data) { m_video.vram_access = 0; } -TIMER_CALLBACK_MEMBER(fm7_state::fm77av_alu_task_end) +TIMER_CALLBACK_MEMBER(fm77_state::av_alu_task_end) { m_alu.busy = 0; } -void fm7_state::fm7_alu_mask_write(uint32_t offset, int bank, uint8_t dat) +void fm77_state::alu_mask_write(uint32_t offset, int bank, uint8_t dat) { uint8_t temp; int page = 0; @@ -132,7 +132,7 @@ void fm7_state::fm7_alu_mask_write(uint32_t offset, int bank, uint8_t dat) m_video_ram[(offset & 0x3fff) + (bank * 0x4000) + (page * 0xc000)] = temp | dat; } -void fm7_state::fm7_alu_function_compare(uint32_t offset) +void fm77_state::alu_function_compare(uint32_t offset) { // COMPARE - compares which colors match those in the compare registers // can be used on its own, or when bit 6 of the command register is high. @@ -187,7 +187,7 @@ void fm7_state::fm7_alu_function_compare(uint32_t offset) m_alu.compare_data = dat; } -void fm7_state::fm7_alu_function_pset(uint32_t offset) +void fm77_state::alu_function_pset(uint32_t offset) { // PSET - simply sets the pixels to the selected logical colour int x; @@ -196,7 +196,7 @@ void fm7_state::fm7_alu_function_pset(uint32_t offset) uint8_t mask; if(m_alu.command & 0x40) - fm7_alu_function_compare(offset); + alu_function_compare(offset); if(offset >= 0xc000) { @@ -219,12 +219,12 @@ void fm7_state::fm7_alu_function_pset(uint32_t offset) dat &= ~m_alu.mask; dat |= mask; - fm7_alu_mask_write(offset,x,dat); + alu_mask_write(offset,x,dat); } } } -void fm7_state::fm7_alu_function_or(uint32_t offset) +void fm77_state::alu_function_or(uint32_t offset) { int x; uint8_t dat; @@ -232,7 +232,7 @@ void fm7_state::fm7_alu_function_or(uint32_t offset) uint8_t mask; if(m_alu.command & 0x40) - fm7_alu_function_compare(offset); + alu_function_compare(offset); if(offset >= 0xc000) { @@ -258,12 +258,12 @@ void fm7_state::fm7_alu_function_or(uint32_t offset) dat &= ~m_alu.mask; dat |= mask; - fm7_alu_mask_write(offset,x,dat); + alu_mask_write(offset,x,dat); } } } -void fm7_state::fm7_alu_function_and(uint32_t offset) +void fm77_state::alu_function_and(uint32_t offset) { int x; uint8_t dat; @@ -271,7 +271,7 @@ void fm7_state::fm7_alu_function_and(uint32_t offset) uint8_t mask; if(m_alu.command & 0x40) - fm7_alu_function_compare(offset); + alu_function_compare(offset); if(offset >= 0xc000) { @@ -297,12 +297,12 @@ void fm7_state::fm7_alu_function_and(uint32_t offset) dat &= ~m_alu.mask; dat |= mask; - fm7_alu_mask_write(offset,x,dat); + alu_mask_write(offset,x,dat); } } } -void fm7_state::fm7_alu_function_xor(uint32_t offset) +void fm77_state::alu_function_xor(uint32_t offset) { int x; uint8_t dat; @@ -310,7 +310,7 @@ void fm7_state::fm7_alu_function_xor(uint32_t offset) uint8_t mask; if(m_alu.command & 0x40) - fm7_alu_function_compare(offset); + alu_function_compare(offset); if(offset >= 0xc000) { @@ -336,12 +336,12 @@ void fm7_state::fm7_alu_function_xor(uint32_t offset) dat &= ~m_alu.mask; dat |= mask; - fm7_alu_mask_write(offset,x,dat); + alu_mask_write(offset,x,dat); } } } -void fm7_state::fm7_alu_function_not(uint32_t offset) +void fm77_state::alu_function_not(uint32_t offset) { int x; uint8_t dat; @@ -349,7 +349,7 @@ void fm7_state::fm7_alu_function_not(uint32_t offset) uint8_t mask; if(m_alu.command & 0x40) - fm7_alu_function_compare(offset); + alu_function_compare(offset); if(offset >= 0xc000) { @@ -375,12 +375,12 @@ void fm7_state::fm7_alu_function_not(uint32_t offset) dat &= ~m_alu.mask; dat |= mask; - fm7_alu_mask_write(offset,x,dat); + alu_mask_write(offset,x,dat); } } } -void fm7_state::fm7_alu_function_invalid(uint32_t offset) +void fm77_state::alu_function_invalid(uint32_t offset) { // Invalid function, still does something though (used by Laydock) int x; @@ -389,7 +389,7 @@ void fm7_state::fm7_alu_function_invalid(uint32_t offset) uint8_t mask; if(m_alu.command & 0x40) - fm7_alu_function_compare(offset); + alu_function_compare(offset); if(offset >= 0xc000) { @@ -407,12 +407,12 @@ void fm7_state::fm7_alu_function_invalid(uint32_t offset) dat = mask & m_alu.mask; - fm7_alu_mask_write(offset,x,dat); + alu_mask_write(offset,x,dat); } } } -void fm7_state::fm7_alu_function_tilepaint(uint32_t offset) +void fm77_state::alu_function_tilepaint(uint32_t offset) { // TILEPAINT - writes to VRAM based on the tilepaint colour registers int x; @@ -421,7 +421,7 @@ void fm7_state::fm7_alu_function_tilepaint(uint32_t offset) uint8_t mask; if(m_alu.command & 0x40) - fm7_alu_function_compare(offset); + alu_function_compare(offset); if(offset >= 0xc000) { @@ -451,43 +451,43 @@ void fm7_state::fm7_alu_function_tilepaint(uint32_t offset) mask = (m_video_ram[(offset & 0x3fff) + (x * 0x4000) + (page * 0xc000)]) & m_alu.mask; dat |= mask; - fm7_alu_mask_write(offset,x,dat); + alu_mask_write(offset,x,dat); } } } -void fm7_state::fm7_alu_function(uint32_t offset) +void fm77_state::fm7_alu_function(uint32_t offset) { switch(m_alu.command & 0x07) { case 0x00: // PSET - fm7_alu_function_pset(offset); + alu_function_pset(offset); break; case 0x02: // OR - fm7_alu_function_or(offset); + alu_function_or(offset); break; case 0x03: // AND - fm7_alu_function_and(offset); + alu_function_and(offset); break; case 0x04: // XOR - fm7_alu_function_xor(offset); + alu_function_xor(offset); break; case 0x05: // NOT - fm7_alu_function_not(offset); + alu_function_not(offset); break; case 0x06: // TILEPAINT - fm7_alu_function_tilepaint(offset); + alu_function_tilepaint(offset); break; case 0x07: // COMPARE - fm7_alu_function_compare(offset); + alu_function_compare(offset); break; case 0x01: default: - fm7_alu_function_invalid(offset); + alu_function_invalid(offset); } } -uint32_t fm7_state::fm7_line_set_pixel(int x, int y) +uint32_t fm77_state::av_line_set_pixel(int x, int y) { uint32_t addr; static const uint8_t pixel_mask[8] = {0x7f, 0xbf, 0xdf, 0xef, 0xf7, 0xfb, 0xfd, 0xfe }; @@ -515,7 +515,7 @@ uint32_t fm7_state::fm7_line_set_pixel(int x, int y) return addr; } -void fm7_state::fm77av_line_draw() +void fm77_state::av_line_draw() { int x1 = m_alu.x0; int x2 = m_alu.x1; @@ -541,7 +541,7 @@ void fm7_state::fm77av_line_draw() for(;;) { - fm7_line_set_pixel(x1, y1); + av_line_set_pixel(x1, y1); byte_count++; if(x1 == x2 && y1 == y2) @@ -565,7 +565,7 @@ void fm7_state::fm77av_line_draw() timer_set(attotime::from_usec(byte_count/16), TIMER_FM77AV_ALU_TASK_END); } -uint8_t fm7_state::fm7_vram_r(offs_t offset) +uint8_t fm7_state::vram_r(offs_t offset) { int offs; uint16_t page = 0x0000; @@ -602,7 +602,7 @@ uint8_t fm7_state::fm7_vram_r(offs_t offset) return m_video_ram[offs + page]; } -void fm7_state::fm7_vram_w(offs_t offset, uint8_t data) +void fm7_state::vram_w(offs_t offset, uint8_t data) { int offs; uint16_t page = 0x0000; @@ -642,7 +642,7 @@ void fm7_state::fm7_vram_w(offs_t offset, uint8_t data) } // not pretty, but it should work. -void fm7_state::fm7_vram_banked_w(offs_t offset, uint8_t data) +void fm77_state::vram_banked_w(offs_t offset, uint8_t data) { int offs; uint16_t page = 0x0000; @@ -683,148 +683,148 @@ void fm7_state::fm7_vram_banked_w(offs_t offset, uint8_t data) m_video_ram[offs+page] = data; } -uint8_t fm7_state::fm7_vram0_r(offs_t offset) +uint8_t fm77_state::vram0_r(offs_t offset) { if(!m_video.sub_halt) // no access if sub CPU is not halted. return 0xff; - return fm7_vram_r(offset); + return vram_r(offset); } -uint8_t fm7_state::fm7_vram1_r(offs_t offset) +uint8_t fm77_state::vram1_r(offs_t offset) { if(!m_video.sub_halt) // no access if sub CPU is not halted. return 0xff; - return fm7_vram_r(offset+0x1000); + return vram_r(offset+0x1000); } -uint8_t fm7_state::fm7_vram2_r(offs_t offset) +uint8_t fm77_state::vram2_r(offs_t offset) { if(!m_video.sub_halt) // no access if sub CPU is not halted. return 0xff; - return fm7_vram_r(offset+0x2000); + return vram_r(offset+0x2000); } -uint8_t fm7_state::fm7_vram3_r(offs_t offset) +uint8_t fm77_state::vram3_r(offs_t offset) { if(!m_video.sub_halt) // no access if sub CPU is not halted. return 0xff; - return fm7_vram_r(offset+0x3000); + return vram_r(offset+0x3000); } -uint8_t fm7_state::fm7_vram4_r(offs_t offset) +uint8_t fm77_state::vram4_r(offs_t offset) { if(!m_video.sub_halt) // no access if sub CPU is not halted. return 0xff; - return fm7_vram_r(offset+0x4000); + return vram_r(offset+0x4000); } -uint8_t fm7_state::fm7_vram5_r(offs_t offset) +uint8_t fm77_state::vram5_r(offs_t offset) { if(!m_video.sub_halt) // no access if sub CPU is not halted. return 0xff; - return fm7_vram_r(offset+0x5000); + return vram_r(offset+0x5000); } -uint8_t fm7_state::fm7_vram6_r(offs_t offset) +uint8_t fm77_state::vram6_r(offs_t offset) { if(!m_video.sub_halt) // no access if sub CPU is not halted. return 0xff; - return fm7_vram_r(offset+0x6000); + return vram_r(offset+0x6000); } -uint8_t fm7_state::fm7_vram7_r(offs_t offset) +uint8_t fm77_state::vram7_r(offs_t offset) { if(!m_video.sub_halt) // no access if sub CPU is not halted. return 0xff; - return fm7_vram_r(offset+0x7000); + return vram_r(offset+0x7000); } -uint8_t fm7_state::fm7_vram8_r(offs_t offset) +uint8_t fm77_state::vram8_r(offs_t offset) { if(!m_video.sub_halt) // no access if sub CPU is not halted. return 0xff; - return fm7_vram_r(offset+0x8000); + return vram_r(offset+0x8000); } -uint8_t fm7_state::fm7_vram9_r(offs_t offset) +uint8_t fm77_state::vram9_r(offs_t offset) { if(!m_video.sub_halt) // no access if sub CPU is not halted. return 0xff; - return fm7_vram_r(offset+0x9000); + return vram_r(offset+0x9000); } -uint8_t fm7_state::fm7_vramA_r(offs_t offset) +uint8_t fm77_state::vramA_r(offs_t offset) { if(!m_video.sub_halt) // no access if sub CPU is not halted. return 0xff; - return fm7_vram_r(offset+0xa000); + return vram_r(offset+0xa000); } -uint8_t fm7_state::fm7_vramB_r(offs_t offset) +uint8_t fm77_state::vramB_r(offs_t offset) { if(!m_video.sub_halt) // no access if sub CPU is not halted. return 0xff; - return fm7_vram_r(offset+0xb000); + return vram_r(offset+0xb000); } -void fm7_state::fm7_vram0_w(offs_t offset, uint8_t data) +void fm77_state::vram0_w(offs_t offset, uint8_t data) { - fm7_vram_banked_w(offset,data); + vram_banked_w(offset,data); } -void fm7_state::fm7_vram1_w(offs_t offset, uint8_t data) +void fm77_state::vram1_w(offs_t offset, uint8_t data) { - fm7_vram_banked_w(offset+0x1000,data); + vram_banked_w(offset+0x1000,data); } -void fm7_state::fm7_vram2_w(offs_t offset, uint8_t data) +void fm77_state::vram2_w(offs_t offset, uint8_t data) { - fm7_vram_banked_w(offset+0x2000,data); + vram_banked_w(offset+0x2000,data); } -void fm7_state::fm7_vram3_w(offs_t offset, uint8_t data) +void fm77_state::vram3_w(offs_t offset, uint8_t data) { - fm7_vram_banked_w(offset+0x3000,data); + vram_banked_w(offset+0x3000,data); } -void fm7_state::fm7_vram4_w(offs_t offset, uint8_t data) +void fm77_state::vram4_w(offs_t offset, uint8_t data) { - fm7_vram_banked_w(offset+0x4000,data); + vram_banked_w(offset+0x4000,data); } -void fm7_state::fm7_vram5_w(offs_t offset, uint8_t data) +void fm77_state::vram5_w(offs_t offset, uint8_t data) { - fm7_vram_banked_w(offset+0x5000,data); + vram_banked_w(offset+0x5000,data); } -void fm7_state::fm7_vram6_w(offs_t offset, uint8_t data) +void fm77_state::vram6_w(offs_t offset, uint8_t data) { - fm7_vram_banked_w(offset+0x6000,data); + vram_banked_w(offset+0x6000,data); } -void fm7_state::fm7_vram7_w(offs_t offset, uint8_t data) +void fm77_state::vram7_w(offs_t offset, uint8_t data) { - fm7_vram_banked_w(offset+0x7000,data); + vram_banked_w(offset+0x7000,data); } -void fm7_state::fm7_vram8_w(offs_t offset, uint8_t data) +void fm77_state::vram8_w(offs_t offset, uint8_t data) { - fm7_vram_banked_w(offset+0x8000,data); + vram_banked_w(offset+0x8000,data); } -void fm7_state::fm7_vram9_w(offs_t offset, uint8_t data) +void fm77_state::vram9_w(offs_t offset, uint8_t data) { - fm7_vram_banked_w(offset+0x9000,data); + vram_banked_w(offset+0x9000,data); } -void fm7_state::fm7_vramA_w(offs_t offset, uint8_t data) +void fm77_state::vramA_w(offs_t offset, uint8_t data) { - fm7_vram_banked_w(offset+0xa000,data); + vram_banked_w(offset+0xa000,data); } -void fm7_state::fm7_vramB_w(offs_t offset, uint8_t data) +void fm77_state::vramB_w(offs_t offset, uint8_t data) { - fm7_vram_banked_w(offset+0xb000,data); + vram_banked_w(offset+0xb000,data); } /* @@ -833,13 +833,13 @@ void fm7_state::fm7_vramB_w(offs_t offset, uint8_t data) * On read, enables the CRT display * On write, disables the CRT display */ -uint8_t fm7_state::fm7_crt_r() +uint8_t fm7_state::crt_r() { m_video.crt_enable = 1; return 0xff; } -void fm7_state::fm7_crt_w(uint8_t data) +void fm7_state::crt_w(uint8_t data) { m_video.crt_enable = 0; } @@ -850,7 +850,7 @@ void fm7_state::fm7_crt_w(uint8_t data) * 0xd40e: bits 0-6 - offset in bytes (high byte) (bit 6 is used for 400 line video only) * 0xd40f: bits 0-7 - offset in bytes (low byte) */ -void fm7_state::fm7_vram_offset_w(offs_t offset, uint8_t data) +void fm7_state::vram_offset_w(offs_t offset, uint8_t data) { uint16_t new_offset = 0; @@ -898,7 +898,7 @@ void fm7_state::fm7_vram_offset_w(offs_t offset, uint8_t data) * bits 6-4: VRAM planes to display (G,R,B) (1=disable) * bits 2-0: VRAM CPU access (G,R,B) (1=disable) */ -void fm7_state::fm7_multipage_w(uint8_t data) +void fm7_state::multipage_w(uint8_t data) { m_video.multi_page = data & 0x77; } @@ -911,12 +911,12 @@ void fm7_state::fm7_multipage_w(uint8_t data) * bit 1 = Red * bit 0 = Blue */ -uint8_t fm7_state::fm7_palette_r(offs_t offset) +uint8_t fm7_state::palette_r(offs_t offset) { return m_video.fm7_pal[offset]; } -void fm7_state::fm7_palette_w(offs_t offset, uint8_t data) +void fm7_state::palette_w(offs_t offset, uint8_t data) { m_palette->set_pen_color(offset, rgb_t(pal1bit(data >> 1), pal1bit(data >> 2), pal1bit(data >> 0))); m_video.fm7_pal[offset] = data & 0x07; @@ -933,7 +933,7 @@ void fm7_state::fm7_palette_w(offs_t offset, uint8_t data) * fd33: red level (4 bits) * fd34: green level (4 bits) */ -void fm7_state::fm77av_analog_palette_w(offs_t offset, uint8_t data) +void fm77_state::av_analog_palette_w(offs_t offset, uint8_t data) { int val; @@ -974,7 +974,7 @@ void fm7_state::fm77av_analog_palette_w(offs_t offset, uint8_t data) * bit 6 - display VRAM page * bit 7 - NMI mask register (1=mask) */ -uint8_t fm7_state::fm77av_video_flags_r() +uint8_t fm77_state::av_video_flags_r() { uint8_t ret = 0xff; @@ -993,7 +993,7 @@ uint8_t fm7_state::fm77av_video_flags_r() return ret; } -void fm7_state::fm77av_video_flags_w(uint8_t data) +void fm77_state::av_video_flags_w(uint8_t data) { uint8_t* RAM = memregion("subsyscg")->base(); @@ -1012,7 +1012,7 @@ void fm7_state::fm77av_video_flags_w(uint8_t data) * bit 1 (R/O) - DISPTMG status (0=blank) * bit 0 (R/O) - VSync status (1=sync?) */ -uint8_t fm7_state::fm77av_sub_modestatus_r() +uint8_t fm77_state::av_sub_modestatus_r() { uint8_t ret = 0x00; @@ -1028,7 +1028,7 @@ uint8_t fm7_state::fm77av_sub_modestatus_r() return ret; } -void fm7_state::fm77av_sub_modestatus_w(uint8_t data) +void fm77_state::av_sub_modestatus_w(uint8_t data) { m_video.modestatus = data & 0x40; if(data & 0x40) @@ -1050,7 +1050,7 @@ void fm7_state::fm77av_sub_modestatus_w(uint8_t data) * bits 1 and 0 select which subsys ROM to be banked into sub CPU space * on the FM-77AV40 and later, bit 2 can also selected to bank in sub monitor RAM. */ -void fm7_state::fm77av_sub_bank_w(uint8_t data) +void fm77_state::av_sub_bank_w(uint8_t data) { // uint8_t* RAM = memregion("sub")->base(); uint8_t* ROM; @@ -1122,7 +1122,7 @@ void fm7_state::fm77av_sub_bank_w(uint8_t data) * 0xd428-29(W): Line X1 (High-Low, X9-X0) * 0xd42a-2b(W): Line Y1 (High-Low, Y8-Y0) */ -uint8_t fm7_state::fm77av_alu_r(offs_t offset) +uint8_t fm77_state::av_alu_r(offs_t offset) { switch(offset) { @@ -1147,7 +1147,7 @@ uint8_t fm7_state::fm77av_alu_r(offs_t offset) } } -void fm7_state::fm77av_alu_w(offs_t offset, uint8_t data) +void fm77_state::av_alu_w(offs_t offset, uint8_t data) { uint16_t dat; @@ -1251,7 +1251,7 @@ void fm7_state::fm77av_alu_w(offs_t offset, uint8_t data) dat = (m_alu.y1 & 0xff00) | data; m_alu.y1 = dat; // draw line - fm77av_line_draw(); + av_line_draw(); // logerror("ALU: write to Y1 (low) register - %02x (%04x)\n",data,m_alu.y1); break; default: @@ -1259,24 +1259,24 @@ void fm7_state::fm77av_alu_w(offs_t offset, uint8_t data) } } -TIMER_CALLBACK_MEMBER(fm7_state::fm77av_vsync) +TIMER_CALLBACK_MEMBER(fm77_state::av_vsync) { if(param == 0) // start of vsync { m_video.vsync_flag = 1; - m_fm77av_vsync_timer->adjust(attotime::from_usec(510),1); // VSync length for 200 line modes = 0.51ms + m_vsync_timer->adjust(attotime::from_usec(510),1); // VSync length for 200 line modes = 0.51ms } else { m_video.vsync_flag = 0; - m_fm77av_vsync_timer->adjust(m_screen->time_until_vblank_end()); + m_vsync_timer->adjust(m_screen->time_until_vblank_end()); } } // called when banked into main CPU space by the MMR, available only if sub CPU is halted -uint8_t fm7_state::fm7_sub_ram_ports_banked_r(offs_t offset) +uint8_t fm77_state::sub_ram_ports_banked_r(offs_t offset) { - uint8_t* RAM = memregion("maincpu")->base(); + uint8_t* RAM = m_ram_ptr.target(); uint8_t* ROM; if(!m_video.sub_halt) @@ -1295,39 +1295,39 @@ uint8_t fm7_state::fm7_sub_ram_ports_banked_r(offs_t offset) } if(offset >= 0x410 && offset <= 0x42b) - return fm77av_alu_r(offset-0x410); + return av_alu_r(offset-0x410); switch(offset) { case 0x400: case 0x401: - return fm7_sub_keyboard_r(offset-0x400); + return sub_keyboard_r(offset-0x400); case 0x402: - return fm7_cancel_ack(); + return cancel_ack(); case 0x403: - return fm7_sub_beeper_r(); + return sub_beeper_r(); case 0x404: - return fm7_attn_irq_r(); + return attn_irq_r(); case 0x408: - return fm7_crt_r(); + return crt_r(); case 0x409: - return fm7_vram_access_r(); + return vram_access_r(); case 0x40a: - return fm7_sub_busyflag_r(); + return sub_busyflag_r(); case 0x430: - return fm77av_video_flags_r(); + return av_video_flags_r(); case 0x431: case 0x432: - return fm77av_key_encoder_r(offset-0x431); + return av_key_encoder_r(offset-0x431); default: logerror("Unmapped read from sub CPU port 0xd%03x via MMR banking\n",offset); return 0xff; } } -void fm7_state::fm7_sub_ram_ports_banked_w(offs_t offset, uint8_t data) +void fm77_state::sub_ram_ports_banked_w(offs_t offset, uint8_t data) { - uint8_t* RAM = memregion("maincpu")->base(); + uint8_t* RAM = m_ram_ptr.target(); if(!m_video.sub_halt) return; @@ -1350,40 +1350,40 @@ void fm7_state::fm7_sub_ram_ports_banked_w(offs_t offset, uint8_t data) if(offset >= 0x410 && offset <= 0x42b) { - fm77av_alu_w(offset-0x410,data); + av_alu_w(offset-0x410,data); return; } switch(offset) { case 0x408: - fm7_crt_w(data); + crt_w(data); break; case 0x409: - fm7_vram_access_w(data); + vram_access_w(data); break; case 0x40a: - fm7_sub_busyflag_w(data); + sub_busyflag_w(data); break; case 0x40e: case 0x40f: - fm7_vram_offset_w(offset-0x40e,data); + vram_offset_w(offset-0x40e,data); break; case 0x430: - fm77av_video_flags_w(data); + av_video_flags_w(data); break; case 0x431: case 0x432: - fm77av_key_encoder_w(offset-0x431,data); + av_key_encoder_w(offset-0x431,data); break; default: logerror("Unmapped write of 0x%02x to sub CPU port 0xd%03x via MMR banking\n",data,offset); } } -uint8_t fm7_state::fm7_console_ram_banked_r(offs_t offset) +uint8_t fm77_state::console_ram_banked_r(offs_t offset) { - uint8_t* RAM = memregion("maincpu")->base(); + uint8_t* RAM = m_ram_ptr.target(); if(!m_video.sub_halt) return 0xff; @@ -1391,9 +1391,9 @@ uint8_t fm7_state::fm7_console_ram_banked_r(offs_t offset) return RAM[0x1c000+offset]; } -void fm7_state::fm7_console_ram_banked_w(offs_t offset, uint8_t data) +void fm77_state::console_ram_banked_w(offs_t offset, uint8_t data) { - uint8_t* RAM = memregion("maincpu")->base(); + uint8_t* RAM = m_ram_ptr.target(); if(!m_video.sub_halt) return;