From 2e6abeccfab9b165675308943e82ee5aeec76395 Mon Sep 17 00:00:00 2001 From: Sandro Ronco Date: Sun, 21 Feb 2016 10:52:41 +0100 Subject: [PATCH] Convert avigo.cpp, mstation.cpp and rex6000.cpp to use bankdev. (nw) --- src/mame/drivers/avigo.cpp | 239 +++++++++------------------------- src/mame/drivers/mstation.cpp | 167 ++++++++---------------- src/mame/drivers/rex6000.cpp | 188 ++++++-------------------- src/mame/includes/avigo.h | 24 ++-- 4 files changed, 168 insertions(+), 450 deletions(-) diff --git a/src/mame/drivers/avigo.cpp b/src/mame/drivers/avigo.cpp index f8d23276a8b..e7b301eea5c 100644 --- a/src/mame/drivers/avigo.cpp +++ b/src/mame/drivers/avigo.cpp @@ -77,43 +77,6 @@ #define LOG(x) do { if (AVIGO_LOG) logerror x; } while (0) -/* memory 0x0000-0x03fff */ -READ8_MEMBER(avigo_state::flash_0x0000_read_handler) -{ - return m_flashes[0]->read(offset); -} - -/* memory 0x0000-0x03fff */ -WRITE8_MEMBER(avigo_state::flash_0x0000_write_handler) -{ - m_flashes[0]->write(offset, data); -} - -/* memory 0x04000-0x07fff */ -READ8_MEMBER(avigo_state::flash_0x4000_read_handler) -{ - return m_flashes[m_flash_at_0x4000]->read((m_bank1_l<<14) | offset); -} - -/* memory 0x04000-0x07fff */ -WRITE8_MEMBER(avigo_state::flash_0x4000_write_handler) -{ - m_flashes[m_flash_at_0x4000]->write((m_bank1_l<<14) | offset, data); -} - -/* memory 0x08000-0x0bfff */ -READ8_MEMBER(avigo_state::flash_0x8000_read_handler) -{ - return m_flashes[m_flash_at_0x8000]->read((m_bank2_l<<14) | offset); -} - -/* memory 0x08000-0x0bfff */ -WRITE8_MEMBER(avigo_state::flash_0x8000_write_handler) -{ - m_flashes[m_flash_at_0x8000]->write((m_bank2_l<<14) | offset, data); -} - - /* IRQ bits (port 3) ordered by priority: @@ -150,58 +113,6 @@ WRITE_LINE_MEMBER( avigo_state::tc8521_alarm_int ) //#endif } -void avigo_state::refresh_memory(UINT8 bank, UINT8 chip_select) -{ - address_space& space = m_maincpu->space(AS_PROGRAM); - int &active_flash = (bank == 1 ? m_flash_at_0x4000 : m_flash_at_0x8000); - char bank_tag[6]; - - LOG(("Chip %02x mapped at %04x - %04x\n", chip_select, bank * 0x4000, bank * 0x4000 + 0x3fff)); - - switch (chip_select) - { - case 0x06: // videoram - space.install_readwrite_handler(bank * 0x4000, bank * 0x4000 + 0x3fff, read8_delegate(FUNC(avigo_state::vid_memory_r), this), write8_delegate(FUNC(avigo_state::vid_memory_w), this)); - active_flash = -1; - break; - - case 0x01: // banked RAM - sprintf(bank_tag,"bank%d", bank); - membank(bank_tag)->set_base(m_ram_base + (((bank == 1 ? m_bank1_l : m_bank2_l) & 0x07)<<14)); - space.install_readwrite_bank (bank * 0x4000, bank * 0x4000 + 0x3fff, bank_tag); - active_flash = -1; - break; - - case 0x00: // flash 0 - case 0x03: // flash 1 - case 0x05: // flash 2 - case 0x07: // flash 0 - if (active_flash < 0) // to avoid useless calls to install_readwrite_handler that cause slowdowns - { - if (bank == 1) - space.install_readwrite_handler(0x4000, 0x7fff, read8_delegate(FUNC(avigo_state::flash_0x4000_read_handler), this), write8_delegate(FUNC(avigo_state::flash_0x4000_write_handler), this)); - else - space.install_readwrite_handler(0x8000, 0xbfff, read8_delegate(FUNC(avigo_state::flash_0x8000_read_handler), this), write8_delegate(FUNC(avigo_state::flash_0x8000_write_handler), this)); - } - - switch (chip_select) - { - case 0x00: - case 0x07: active_flash = 0; break; - case 0x03: active_flash = 1; break; - case 0x05: active_flash = 2; break; - } - break; - - default: - logerror("Unknown chip %02x mapped at %04x - %04x\n", chip_select, bank * 0x4000, bank * 0x4000 + 0x3fff); - space.unmap_readwrite(bank * 0x4000, bank * 0x4000 + 0x3fff); - active_flash = -1; - break; - } -} - - WRITE_LINE_MEMBER( avigo_state::com_interrupt ) { LOG(("com int\r\n")); @@ -218,38 +129,21 @@ WRITE_LINE_MEMBER( avigo_state::com_interrupt ) void avigo_state::machine_reset() { - /* if is a cold start initialize flash contents */ - if (!m_warm_start) - { - memcpy(m_flashes[0]->space().get_read_ptr(0), memregion("bios")->base() + 0x000000, 0x100000); - memcpy(m_flashes[1]->space().get_read_ptr(0), memregion("bios")->base() + 0x100000, 0x100000); - } - m_irq = 0; m_bank1_l = 0; m_bank1_h = 0; m_bank2_l = 0; m_bank2_h = 0; - m_flash_at_0x4000 = -1; - m_flash_at_0x8000 = -1; - refresh_memory(1, m_bank1_h & 0x07); - refresh_memory(2, m_bank2_h & 0x07); + m_bankdev1->set_bank(0); + m_bankdev2->set_bank(0); } void avigo_state::machine_start() { - m_ram_base = (UINT8*)m_ram->pointer(); - // bank3 always first ram bank - membank("bank3")->set_base(m_ram_base); + membank("bank2")->set_base(m_nvram); - /* keep machine pointers to flash devices */ - m_flashes[0] = machine().device("flash0"); - m_flashes[1] = machine().device("flash1"); - m_flashes[2] = machine().device("flash2"); - - machine().device("nvram")->set_base(m_ram_base, m_ram->size()); m_warm_start = 1; // register for state saving @@ -261,33 +155,27 @@ void avigo_state::machine_start() save_item(NAME(m_bank1_l)); save_item(NAME(m_bank1_h)); save_item(NAME(m_ad_control_status)); - save_item(NAME(m_flash_at_0x4000)); - save_item(NAME(m_flash_at_0x8000)); save_item(NAME(m_ad_value)); save_item(NAME(m_screen_column)); save_item(NAME(m_warm_start)); - - // save all flash contents - save_pointer(NAME((UINT8*)m_flashes[0]->space().get_read_ptr(0)), 0x100000); - save_pointer(NAME((UINT8*)m_flashes[1]->space().get_read_ptr(0)), 0x100000); - save_pointer(NAME((UINT8*)m_flashes[2]->space().get_read_ptr(0)), 0x100000); - - // register postload callback - machine().save().register_postload(save_prepost_delegate(FUNC(avigo_state::postload), this)); } -void avigo_state::postload() -{ - // refresh the bankswitch - refresh_memory(1, m_bank1_h & 0x07); - refresh_memory(2, m_bank2_h & 0x07); -} +static ADDRESS_MAP_START(avigo_banked_map, AS_PROGRAM, 8, avigo_state) + AM_RANGE(0x0000000, 0x00fffff) AM_MIRROR(0x0300000) AM_DEVREADWRITE("flash0", intelfsh8_device, read, write) + AM_RANGE(0x0400000, 0x041ffff) AM_MIRROR(0x03e0000) AM_RAM AM_SHARE("nvram") + + AM_RANGE(0x0c00000, 0x0cfffff) AM_MIRROR(0x0300000) AM_DEVREADWRITE("flash1", intelfsh8_device, read, write) + AM_RANGE(0x1400000, 0x14fffff) AM_MIRROR(0x0300000) AM_DEVREADWRITE("flash2", intelfsh8_device, read, write) + AM_RANGE(0x1c00000, 0x1cfffff) AM_MIRROR(0x0300000) AM_DEVREADWRITE("flash0", intelfsh8_device, read, write) + + AM_RANGE(0x1800000, 0x1803fff) AM_MIRROR(0x03fc000) AM_READWRITE(vid_memory_r, vid_memory_w) +ADDRESS_MAP_END static ADDRESS_MAP_START( avigo_mem , AS_PROGRAM, 8, avigo_state) - AM_RANGE(0x0000, 0x3fff) AM_READWRITE(flash_0x0000_read_handler, flash_0x0000_write_handler) - AM_RANGE(0x4000, 0x7fff) AM_READWRITE_BANK("bank1") - AM_RANGE(0x8000, 0xbfff) AM_READWRITE_BANK("bank2") - AM_RANGE(0xc000, 0xffff) AM_READWRITE_BANK("bank3") + AM_RANGE(0x0000, 0x3fff) AM_DEVREADWRITE("flash0", intelfsh8_device, read, write) + AM_RANGE(0x4000, 0x7fff) AM_DEVREADWRITE("bank0", address_map_bank_device, read8, write8) + AM_RANGE(0x8000, 0xbfff) AM_DEVREADWRITE("bank1", address_map_bank_device, read8, write8) + AM_RANGE(0xc000, 0xffff) AM_RAMBANK("bank2") ADDRESS_MAP_END @@ -378,7 +266,7 @@ WRITE8_MEMBER(avigo_state::bank1_w) m_bank1_l = data & 0x3f; } - refresh_memory(1, m_bank1_h & 0x07); + m_bankdev1->set_bank(((m_bank1_h & 0x07) << 8) | m_bank1_l); } WRITE8_MEMBER(avigo_state::bank2_w) @@ -394,7 +282,7 @@ WRITE8_MEMBER(avigo_state::bank2_w) m_bank2_l = data & 0x3f; } - refresh_memory(2, m_bank2_h & 0x07); + m_bankdev2->set_bank(((m_bank2_h & 0x07) << 8) | m_bank2_l); } READ8_MEMBER(avigo_state::ad_control_status_r) @@ -775,12 +663,12 @@ static const gfx_layout avigo_6_by_8 = }; static GFXDECODE_START( avigo ) - GFXDECODE_ENTRY( "bios", 0x08992, avigo_charlayout, 0, 1 ) - GFXDECODE_ENTRY( "bios", 0x0c020, avigo_8_by_14, 0, 1 ) - GFXDECODE_ENTRY( "bios", 0x0c020, avigo_16_by_15, 0, 1 ) - GFXDECODE_ENTRY( "bios", 0x14020, avigo_15_by_16, 0, 1 ) - GFXDECODE_ENTRY( "bios", 0x1c020, avigo_8_by_8, 0, 1 ) - GFXDECODE_ENTRY( "bios", 0x1e020, avigo_6_by_8, 0, 1 ) + GFXDECODE_ENTRY( "flash0", 0x08992, avigo_charlayout, 0, 1 ) + GFXDECODE_ENTRY( "flash0", 0x0c020, avigo_8_by_14, 0, 1 ) + GFXDECODE_ENTRY( "flash0", 0x0c020, avigo_16_by_15, 0, 1 ) + GFXDECODE_ENTRY( "flash0", 0x14020, avigo_15_by_16, 0, 1 ) + GFXDECODE_ENTRY( "flash0", 0x1c020, avigo_8_by_8, 0, 1 ) + GFXDECODE_ENTRY( "flash0", 0x1e020, avigo_6_by_8, 0, 1 ) GFXDECODE_END @@ -800,7 +688,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(avigo_state::avigo_1hz_timer) QUICKLOAD_LOAD_MEMBER( avigo_state,avigo) { - address_space& flash1 = m_flashes[1]->space(0); + address_space& flash1 = m_flash1->space(0); const char *systemname = machine().system().name; UINT32 first_app_page = (0x50000>>14); int app_page; @@ -833,7 +721,7 @@ QUICKLOAD_LOAD_MEMBER( avigo_state,avigo) logerror("Application loaded at 0x%05x-0x%05x\n", app_page<<14, (app_page<<14) + (UINT32)image.length()); // copy app file into flash memory - image.fread((UINT8*)m_flashes[1]->space().get_read_ptr(app_page<<14), image.length()); + image.fread((UINT8*)flash1.get_read_ptr(app_page<<14), image.length()); // update the application ID flash1.write_byte((app_page<<14) + 0x1a5, 0x80 + (app_page - (first_app_page>>14))); @@ -907,6 +795,18 @@ static MACHINE_CONFIG_START( avigo, avigo_state ) MCFG_RAM_ADD(RAM_TAG) MCFG_RAM_DEFAULT_SIZE("128K") + MCFG_DEVICE_ADD("bank0", ADDRESS_MAP_BANK, 0) + MCFG_DEVICE_PROGRAM_MAP(avigo_banked_map) + MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_LITTLE) + MCFG_ADDRESS_MAP_BANK_DATABUS_WIDTH(8) + MCFG_ADDRESS_MAP_BANK_STRIDE(0x4000) + + MCFG_DEVICE_ADD("bank1", ADDRESS_MAP_BANK, 0) + MCFG_DEVICE_PROGRAM_MAP(avigo_banked_map) + MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_LITTLE) + MCFG_ADDRESS_MAP_BANK_DATABUS_WIDTH(8) + MCFG_ADDRESS_MAP_BANK_STRIDE(0x4000) + MCFG_NVRAM_ADD_CUSTOM_DRIVER("nvram", avigo_state, nvram_init) // IRQ 1 is used for scan the pen and for cursor blinking @@ -926,87 +826,78 @@ MACHINE_CONFIG_END ***************************************************************************/ ROM_START(avigo) - ROM_REGION(0x200000, "bios", ROMREGION_ERASEFF) - + ROM_REGION(0x100000, "flash0", ROMREGION_ERASEFF) ROM_SYSTEM_BIOS( 0, "v1004", "v1.004" ) ROMX_LOAD("os_1004.rom", 0x000000, 0x0100000, CRC(62acd55c) SHA1(b2be12f5cc1053b6026bff2a265146ba831a7ffa), ROM_BIOS(1)) - ROMX_LOAD("english_1004.rom", 0x100000, 0x050000, CRC(c9c3a225) SHA1(7939993a5615ca59ff2047e69b6d85122d437dca), ROM_BIOS(1)) - ROM_SYSTEM_BIOS( 1, "v1002", "v1.002" ) ROMX_LOAD("os_1002.rom", 0x000000, 0x0100000, CRC(484bb95c) SHA1(ddc28f22f8cbc99f60f91c58ee0e2d15170024fb), ROM_BIOS(2)) - ROMX_LOAD("english_1002.rom", 0x100000, 0x050000, CRC(31cab0ac) SHA1(87d337830506a12514a4beb9a8502a0de94816f2), ROM_BIOS(2)) - ROM_SYSTEM_BIOS( 2, "v100", "v1.00" ) ROMX_LOAD("os_100.rom", 0x000000, 0x0100000, CRC(13ea7b38) SHA1(85566ff142d86d504ac72613f169d8758e2daa09), ROM_BIOS(3)) - ROMX_LOAD("english_100.rom", 0x100000, 0x050000, CRC(e2824b44) SHA1(3252454b05c3d3a4d7df1cb48dc3441ae82f2b1c), ROM_BIOS(3)) + ROM_REGION(0x100000, "flash1", ROMREGION_ERASEFF) + ROMX_LOAD("english_1004.rom", 0x000000, 0x050000, CRC(c9c3a225) SHA1(7939993a5615ca59ff2047e69b6d85122d437dca), ROM_BIOS(1)) + ROMX_LOAD("english_1002.rom", 0x000000, 0x050000, CRC(31cab0ac) SHA1(87d337830506a12514a4beb9a8502a0de94816f2), ROM_BIOS(2)) + ROMX_LOAD("english_100.rom", 0x000000, 0x050000, CRC(e2824b44) SHA1(3252454b05c3d3a4d7df1cb48dc3441ae82f2b1c), ROM_BIOS(3)) ROM_END ROM_START(avigo_de) - ROM_REGION(0x200000, "bios", ROMREGION_ERASEFF) - + ROM_REGION(0x100000, "flash0", ROMREGION_ERASEFF) ROM_SYSTEM_BIOS( 0, "v1004", "v1.004" ) ROMX_LOAD("os_1004.rom", 0x000000, 0x0100000, CRC(62acd55c) SHA1(b2be12f5cc1053b6026bff2a265146ba831a7ffa), ROM_BIOS(1)) - ROMX_LOAD("german_1004.rom", 0x100000, 0x060000, CRC(0fa437b3) SHA1(e9352aa8fee6d93b898412bd129452b82baa9a21), ROM_BIOS(1)) - ROM_SYSTEM_BIOS( 1, "v1002", "v1.002" ) ROMX_LOAD("os_1002.rom", 0x000000, 0x0100000, CRC(484bb95c) SHA1(ddc28f22f8cbc99f60f91c58ee0e2d15170024fb), ROM_BIOS(2)) - ROMX_LOAD("german_1002.rom", 0x100000, 0x060000, CRC(c6bf07ba) SHA1(d3185687aa510f6c3b3ab3baaabe7e8ce1a79e3b), ROM_BIOS(2)) - ROM_SYSTEM_BIOS( 2, "v100", "v1.00" ) ROMX_LOAD("os_100.rom", 0x000000, 0x0100000, CRC(13ea7b38) SHA1(85566ff142d86d504ac72613f169d8758e2daa09), ROM_BIOS(3)) - ROMX_LOAD("german_100.rom", 0x100000, 0x060000, CRC(117d9189) SHA1(7e959ab1381ba831821fcf87973b25d87f12d34e), ROM_BIOS(3)) + ROM_REGION(0x100000, "flash1", ROMREGION_ERASEFF) + ROMX_LOAD("german_1004.rom", 0x000000, 0x060000, CRC(0fa437b3) SHA1(e9352aa8fee6d93b898412bd129452b82baa9a21), ROM_BIOS(1)) + ROMX_LOAD("german_1002.rom", 0x000000, 0x060000, CRC(c6bf07ba) SHA1(d3185687aa510f6c3b3ab3baaabe7e8ce1a79e3b), ROM_BIOS(2)) + ROMX_LOAD("german_100.rom", 0x000000, 0x060000, CRC(117d9189) SHA1(7e959ab1381ba831821fcf87973b25d87f12d34e), ROM_BIOS(3)) ROM_END ROM_START(avigo_fr) - ROM_REGION(0x200000, "bios", ROMREGION_ERASEFF) - + ROM_REGION(0x100000, "flash0", ROMREGION_ERASEFF) ROM_SYSTEM_BIOS( 0, "v1004", "v1.004" ) ROMX_LOAD("os_1004.rom", 0x000000, 0x0100000, CRC(62acd55c) SHA1(b2be12f5cc1053b6026bff2a265146ba831a7ffa), ROM_BIOS(1)) - ROMX_LOAD("french_1004.rom", 0x100000, 0x050000, CRC(5e4d90f7) SHA1(07df3af8a431ba65e079d6c987fb5d544f6541d8), ROM_BIOS(1)) - ROM_SYSTEM_BIOS( 1, "v1002", "v1.002" ) ROMX_LOAD("os_1002.rom", 0x000000, 0x0100000, CRC(484bb95c) SHA1(ddc28f22f8cbc99f60f91c58ee0e2d15170024fb), ROM_BIOS(2)) - ROMX_LOAD("french_1002.rom", 0x100000, 0x050000,CRC(caa3eb91) SHA1(ab199986de301d933f069a5e1f5150967e1d7f59), ROM_BIOS(2)) - ROM_SYSTEM_BIOS( 2, "v100", "v1.00" ) ROMX_LOAD("os_100.rom", 0x000000, 0x0100000, CRC(13ea7b38) SHA1(85566ff142d86d504ac72613f169d8758e2daa09), ROM_BIOS(3)) - ROMX_LOAD("french_100.rom", 0x100000, 0x050000, CRC(fffa2345) SHA1(399447cede3cdd0be768952cb24f7e4431147e3d), ROM_BIOS(3)) + ROM_REGION(0x100000, "flash1", ROMREGION_ERASEFF) + ROMX_LOAD("french_1004.rom", 0x000000, 0x050000, CRC(5e4d90f7) SHA1(07df3af8a431ba65e079d6c987fb5d544f6541d8), ROM_BIOS(1)) + ROMX_LOAD("french_1002.rom", 0x000000, 0x050000,CRC(caa3eb91) SHA1(ab199986de301d933f069a5e1f5150967e1d7f59), ROM_BIOS(2)) + ROMX_LOAD("french_100.rom", 0x000000, 0x050000, CRC(fffa2345) SHA1(399447cede3cdd0be768952cb24f7e4431147e3d), ROM_BIOS(3)) ROM_END ROM_START(avigo_es) - ROM_REGION(0x200000, "bios", ROMREGION_ERASEFF) - + ROM_REGION(0x100000, "flash0", ROMREGION_ERASEFF) ROM_SYSTEM_BIOS( 0, "v1004", "v1.004" ) ROMX_LOAD("os_1004.rom", 0x000000, 0x0100000, CRC(62acd55c) SHA1(b2be12f5cc1053b6026bff2a265146ba831a7ffa), ROM_BIOS(1)) - ROMX_LOAD("spanish_1004.rom", 0x100000, 0x060000, CRC(235a7f8d) SHA1(94da4ecafb54dcd5d80bc5063cb4024e66e6a21f), ROM_BIOS(1)) - ROM_SYSTEM_BIOS( 1, "v1002", "v1.002" ) ROMX_LOAD("os_1002.rom", 0x000000, 0x0100000, CRC(484bb95c) SHA1(ddc28f22f8cbc99f60f91c58ee0e2d15170024fb), ROM_BIOS(2)) - ROMX_LOAD("spanish_1002.rom", 0x100000, 0x060000, CRC(a6e80cc4) SHA1(e741657558c11f7bce646ba3d7b5f845bfa275b7), ROM_BIOS(2)) - ROM_SYSTEM_BIOS( 2, "v100", "v1.00" ) ROMX_LOAD("os_100.rom", 0x000000, 0x0100000, CRC(13ea7b38) SHA1(85566ff142d86d504ac72613f169d8758e2daa09), ROM_BIOS(3)) - ROMX_LOAD("spanish_100.rom", 0x100000, 0x060000, CRC(953a5276) SHA1(b9ba1dbdc2127b1ef419c911ef66313024a7351a), ROM_BIOS(3)) + ROM_REGION(0x100000, "flash1", ROMREGION_ERASEFF) + ROMX_LOAD("spanish_1004.rom", 0x000000, 0x060000, CRC(235a7f8d) SHA1(94da4ecafb54dcd5d80bc5063cb4024e66e6a21f), ROM_BIOS(1)) + ROMX_LOAD("spanish_1002.rom", 0x000000, 0x060000, CRC(a6e80cc4) SHA1(e741657558c11f7bce646ba3d7b5f845bfa275b7), ROM_BIOS(2)) + ROMX_LOAD("spanish_100.rom", 0x000000, 0x060000, CRC(953a5276) SHA1(b9ba1dbdc2127b1ef419c911ef66313024a7351a), ROM_BIOS(3)) ROM_END ROM_START(avigo_it) - ROM_REGION(0x200000, "bios", ROMREGION_ERASEFF) - + ROM_REGION(0x100000, "flash0", ROMREGION_ERASEFF) ROM_SYSTEM_BIOS( 0, "v1004", "v1.004" ) ROMX_LOAD("os_1004.rom", 0x000000, 0x0100000, CRC(62acd55c) SHA1(b2be12f5cc1053b6026bff2a265146ba831a7ffa), ROM_BIOS(1)) - ROMX_LOAD("italian_1004.rom", 0x100000, 0x050000, CRC(fb7941ec) SHA1(230e8346a3b0da1ee24568ec090ce6860ebfe995), ROM_BIOS(1)) - ROM_SYSTEM_BIOS( 1, "v1002", "v1.002" ) ROMX_LOAD("os_1002.rom", 0x000000, 0x0100000, CRC(484bb95c) SHA1(ddc28f22f8cbc99f60f91c58ee0e2d15170024fb), ROM_BIOS(2)) - ROMX_LOAD("italian_1002.rom", 0x100000, 0x050000, CRC(093bc032) SHA1(2c75d950d356a7fd1d058808e5f0be8e15b8ea2a), ROM_BIOS(2)) - ROM_SYSTEM_BIOS( 2, "v100", "v1.00" ) ROMX_LOAD("os_100.rom", 0x000000, 0x0100000, CRC(13ea7b38) SHA1(85566ff142d86d504ac72613f169d8758e2daa09), ROM_BIOS(3)) - ROMX_LOAD("italian_100.rom", 0x100000, 0x050000, CRC(de359218) SHA1(6185727aba8ffc98723f2df74dda388fd0d70cc9), ROM_BIOS(3)) + + ROM_REGION(0x100000, "flash1", ROMREGION_ERASEFF) + ROMX_LOAD("italian_1004.rom", 0x000000, 0x050000, CRC(fb7941ec) SHA1(230e8346a3b0da1ee24568ec090ce6860ebfe995), ROM_BIOS(1)) + ROMX_LOAD("italian_1002.rom", 0x000000, 0x050000, CRC(093bc032) SHA1(2c75d950d356a7fd1d058808e5f0be8e15b8ea2a), ROM_BIOS(2)) + ROMX_LOAD("italian_100.rom", 0x000000, 0x050000, CRC(de359218) SHA1(6185727aba8ffc98723f2df74dda388fd0d70cc9), ROM_BIOS(3)) ROM_END /* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME */ diff --git a/src/mame/drivers/mstation.cpp b/src/mame/drivers/mstation.cpp index f1aa281aeb2..b7c1ac7af09 100644 --- a/src/mame/drivers/mstation.cpp +++ b/src/mame/drivers/mstation.cpp @@ -28,6 +28,7 @@ #include "emu.h" #include "cpu/z80/z80.h" +#include "machine/bankdev.h" #include "machine/intelfsh.h" #include "machine/rp5c01.h" #include "machine/ram.h" @@ -39,30 +40,28 @@ public: mstation_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), - m_ram(*this, RAM_TAG) + m_ram(*this, RAM_TAG), + m_bankdev1(*this, "bank0"), + m_bankdev2(*this, "bank1"), + m_keyboard(*this, "LINE"), + m_nvram(*this, "nvram") { } required_device m_maincpu; required_device m_ram; + required_device m_bankdev1; + required_device m_bankdev2; + required_ioport_array<10> m_keyboard; + required_shared_ptr m_nvram; - intelfsh8_device *m_flashes[2]; UINT8 m_bank1[2]; UINT8 m_bank2[2]; - UINT8 *m_ram_base; - int m_flash_at_0x4000; - int m_flash_at_0x8000; UINT8 *m_vram; UINT8 m_screen_column; UINT8 m_port2; UINT8 m_irq; UINT16 m_kb_matrix; - DECLARE_READ8_MEMBER( flash_0x0000_read_handler ); - DECLARE_WRITE8_MEMBER( flash_0x0000_write_handler ); - DECLARE_READ8_MEMBER( flash_0x4000_read_handler ); - DECLARE_WRITE8_MEMBER( flash_0x4000_write_handler ); - DECLARE_READ8_MEMBER( flash_0x8000_read_handler ); - DECLARE_WRITE8_MEMBER( flash_0x8000_write_handler ); DECLARE_READ8_MEMBER( modem_r ); DECLARE_WRITE8_MEMBER( modem_w ); @@ -73,7 +72,6 @@ public: DECLARE_READ8_MEMBER( lcd_left_r ); DECLARE_WRITE8_MEMBER( lcd_left_w ); - void refresh_memory(UINT8 bank, UINT8 chip_select); DECLARE_READ8_MEMBER( bank1_r ); DECLARE_WRITE8_MEMBER( bank1_w ); DECLARE_READ8_MEMBER( bank2_r ); @@ -97,35 +95,6 @@ public: TIMER_DEVICE_CALLBACK_MEMBER(mstation_kb_timer); }; -READ8_MEMBER( mstation_state::flash_0x0000_read_handler ) -{ - return m_flashes[0]->read(offset); -} - -WRITE8_MEMBER( mstation_state::flash_0x0000_write_handler ) -{ - m_flashes[0]->write(offset, data); -} - -READ8_MEMBER( mstation_state::flash_0x4000_read_handler ) -{ - return m_flashes[m_flash_at_0x4000]->read(((m_bank1[0] & 0x3f)<<14) | offset); -} - -WRITE8_MEMBER( mstation_state::flash_0x4000_write_handler ) -{ - m_flashes[m_flash_at_0x4000]->write(((m_bank1[0] & 0x3f)<<14) | offset, data); -} - -READ8_MEMBER( mstation_state::flash_0x8000_read_handler ) -{ - return m_flashes[m_flash_at_0x8000]->read(((m_bank2[0] & 0x3f)<<14) | offset); -} - -WRITE8_MEMBER( mstation_state::flash_0x8000_write_handler ) -{ - m_flashes[m_flash_at_0x8000]->write(((m_bank2[0] & 0x3f)<<14) | offset, data); -} READ8_MEMBER( mstation_state::modem_r ) { @@ -185,53 +154,6 @@ UINT32 mstation_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap // Bankswitch //***************************************************************************/ -void mstation_state::refresh_memory(UINT8 bank, UINT8 chip_select) -{ - address_space& program = m_maincpu->space(AS_PROGRAM); - int &active_flash = (bank == 1 ? m_flash_at_0x4000 : m_flash_at_0x8000); - char bank_tag[6]; - - switch (chip_select) - { - case 0: // flash 0 - case 3: // flash 1 - if (active_flash < 0) - { - if (bank == 1) - program.install_readwrite_handler(0x4000, 0x7fff, 0, 0, read8_delegate(FUNC(mstation_state::flash_0x4000_read_handler), this), write8_delegate(FUNC(mstation_state::flash_0x4000_write_handler), this)); - else - program.install_readwrite_handler(0x8000, 0xbfff, 0, 0, read8_delegate(FUNC(mstation_state::flash_0x8000_read_handler), this), write8_delegate(FUNC(mstation_state::flash_0x8000_write_handler), this)); - } - - active_flash = chip_select ? 1 : 0; - break; - case 1: // banked RAM - sprintf(bank_tag,"bank%d", bank); - membank(bank_tag)->set_base(m_ram_base + (((bank == 1 ? m_bank1[0] : m_bank2[0]) & 0x07)<<14)); - program.install_readwrite_bank (bank * 0x4000, bank * 0x4000 + 0x3fff, bank_tag); - active_flash = -1; - break; - case 2: // left LCD panel - program.install_readwrite_handler(bank * 0x4000, bank * 0x4000 + 0x3fff, 0, 0, read8_delegate(FUNC(mstation_state::lcd_left_r), this), write8_delegate(FUNC(mstation_state::lcd_left_w), this)); - active_flash = -1; - break; - case 4: // right LCD panel - program.install_readwrite_handler(bank * 0x4000, bank * 0x4000 + 0x3fff, 0, 0, read8_delegate(FUNC(mstation_state::lcd_right_r), this), write8_delegate(FUNC(mstation_state::lcd_right_w), this)); - active_flash = -1; - break; - case 5: // modem - program.install_readwrite_handler(bank * 0x4000, bank * 0x4000 + 0x3fff, 0x07, 0, read8_delegate(FUNC(mstation_state::modem_r), this), write8_delegate(FUNC(mstation_state::modem_w), this)); - active_flash = -1; - break; - - default: - logerror("Unknown chip %02x mapped at %04x - %04x\n", chip_select, bank * 0x4000, bank * 0x4000 + 0x3fff); - program.unmap_readwrite(bank * 0x4000, bank * 0x4000 + 0x3fff); - active_flash = -1; - break; - } -} - READ8_MEMBER( mstation_state::bank1_r ) { return m_bank1[offset]; @@ -246,14 +168,14 @@ WRITE8_MEMBER( mstation_state::bank1_w ) { m_bank1[offset] = data; - refresh_memory(1, m_bank1[1] & 0x07); + m_bankdev1->set_bank(((m_bank1[1] & 0x07) << 8) | m_bank1[0]); } WRITE8_MEMBER( mstation_state::bank2_w ) { m_bank2[offset] = data; - refresh_memory(2, m_bank2[1] & 0x07); + m_bankdev2->set_bank(((m_bank2[1] & 0x07) << 8) | m_bank2[0]); } @@ -314,25 +236,32 @@ WRITE8_MEMBER( mstation_state::kb_w ) READ8_MEMBER( mstation_state::kb_r ) { - static const char *const bitnames[] = { "LINE0", "LINE1", "LINE2", "LINE3", "LINE4", - "LINE5", "LINE6", "LINE7", "LINE8", "LINE9" }; UINT8 data = 0xff; for (int i=0; i<10; i++) { if (!(m_kb_matrix & (1<read(); + data &= m_keyboard[i]->read(); } return data; } +static ADDRESS_MAP_START(mstation_banked_map, AS_PROGRAM, 8, mstation_state) + AM_RANGE(0x0000000, 0x00fffff) AM_MIRROR(0x0300000) AM_DEVREADWRITE("flash0", intelfsh8_device, read, write) + AM_RANGE(0x0400000, 0x041ffff) AM_MIRROR(0x03e0000) AM_RAM AM_SHARE("nvram") + AM_RANGE(0x0c00000, 0x0c7ffff) AM_MIRROR(0x0380000) AM_DEVREADWRITE("flash1", intelfsh8_device, read, write) + AM_RANGE(0x0800000, 0x0803fff) AM_MIRROR(0x03fc000) AM_READWRITE(lcd_left_r, lcd_left_w) + AM_RANGE(0x1000000, 0x1003fff) AM_MIRROR(0x03fc000) AM_READWRITE(lcd_right_r, lcd_right_w) + AM_RANGE(0x1400000, 0x1403fff) AM_MIRROR(0x03fc000) AM_READWRITE(modem_r, modem_w) +ADDRESS_MAP_END + static ADDRESS_MAP_START(mstation_mem, AS_PROGRAM, 8, mstation_state) - AM_RANGE(0x0000, 0x3fff) AM_READWRITE(flash_0x0000_read_handler, flash_0x0000_write_handler) - AM_RANGE(0x4000, 0x7fff) AM_READWRITE_BANK("bank1") // bank 1 - AM_RANGE(0x8000, 0xbfff) AM_READWRITE_BANK("bank2") // bank 2 - AM_RANGE(0xc000, 0xffff) AM_READWRITE_BANK("sysram") // system ram always first RAM bank + AM_RANGE(0x0000, 0x3fff) AM_DEVREADWRITE("flash0", intelfsh8_device, read, write) + AM_RANGE(0x4000, 0x7fff) AM_DEVREADWRITE("bank0", address_map_bank_device, read8, write8) + AM_RANGE(0x8000, 0xbfff) AM_DEVREADWRITE("bank1", address_map_bank_device, read8, write8) + AM_RANGE(0xc000, 0xffff) AM_RAMBANK("sysram") // system ram always first RAM bank ADDRESS_MAP_END static ADDRESS_MAP_START(mstation_io , AS_IO, 8, mstation_state) @@ -350,7 +279,7 @@ ADDRESS_MAP_END /* Input ports */ static INPUT_PORTS_START( mstation ) - PORT_START( "LINE0" ) + PORT_START( "LINE.0" ) PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Main Menu") PORT_CODE( KEYCODE_HOME ) PORT_CHAR(UCHAR_MAMEKEY(HOME)) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Back") PORT_CODE( KEYCODE_DEL ) PORT_CHAR(UCHAR_MAMEKEY(END)) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Print") PORT_CODE( KEYCODE_F6 ) @@ -360,7 +289,7 @@ static INPUT_PORTS_START( mstation ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F4") PORT_CODE( KEYCODE_F4 ) PORT_CHAR(UCHAR_MAMEKEY(F4)) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("F5") PORT_CODE( KEYCODE_F5 ) PORT_CHAR(UCHAR_MAMEKEY(F5)) - PORT_START( "LINE1" ) + PORT_START( "LINE.1" ) PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) @@ -370,7 +299,7 @@ static INPUT_PORTS_START( mstation ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Get E-Mail") PORT_CODE( KEYCODE_F9 ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("PG Up") PORT_CODE( KEYCODE_PGUP ) PORT_CHAR(UCHAR_MAMEKEY(PGUP)) - PORT_START( "LINE2" ) + PORT_START( "LINE.2" ) PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("\xc2\xb4") PORT_CODE( KEYCODE_0_PAD ) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE( KEYCODE_1 ) PORT_CHAR('1') PORT_CHAR('!') PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE( KEYCODE_2 ) PORT_CHAR('2') PORT_CHAR('@') @@ -380,7 +309,7 @@ static INPUT_PORTS_START( mstation ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE( KEYCODE_6 ) PORT_CHAR('6') PORT_CHAR('^') PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE( KEYCODE_7 ) PORT_CHAR('7') PORT_CHAR('&') - PORT_START( "LINE3" ) + PORT_START( "LINE.3" ) PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE( KEYCODE_8 ) PORT_CHAR('8') PORT_CHAR('*') PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE( KEYCODE_9 ) PORT_CHAR('9') PORT_CHAR('(') PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE( KEYCODE_0 ) PORT_CHAR('0') PORT_CHAR(')') @@ -390,7 +319,7 @@ static INPUT_PORTS_START( mstation ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE( KEYCODE_BACKSLASH ) PORT_CHAR('\\') PORT_CHAR('|') PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("PG Down") PORT_CODE( KEYCODE_PGDN ) PORT_CHAR(UCHAR_MAMEKEY(PGDN)) - PORT_START( "LINE4" ) + PORT_START( "LINE.4" ) PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Tab") PORT_CODE( KEYCODE_TAB ) PORT_CHAR(9) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE( KEYCODE_Q ) PORT_CHAR('q') PORT_CHAR('Q') PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE( KEYCODE_W ) PORT_CHAR('w') PORT_CHAR('W') @@ -400,7 +329,7 @@ static INPUT_PORTS_START( mstation ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE( KEYCODE_Y ) PORT_CHAR('y') PORT_CHAR('Y') PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE( KEYCODE_U ) PORT_CHAR('u') PORT_CHAR('U') - PORT_START( "LINE5" ) + PORT_START( "LINE.5" ) PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE( KEYCODE_I ) PORT_CHAR('i') PORT_CHAR('I') PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE( KEYCODE_O ) PORT_CHAR('o') PORT_CHAR('O') PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE( KEYCODE_P ) PORT_CHAR('p') PORT_CHAR('P') @@ -410,7 +339,7 @@ static INPUT_PORTS_START( mstation ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE( KEYCODE_QUOTE ) PORT_CHAR('\'') PORT_CHAR('\"') PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Enter") PORT_CODE( KEYCODE_ENTER ) PORT_CHAR(UCHAR_MAMEKEY(ENTER)) - PORT_START( "LINE6" ) + PORT_START( "LINE.6" ) PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("CapsLock") PORT_CODE( KEYCODE_CAPSLOCK ) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE( KEYCODE_A ) PORT_CHAR('a') PORT_CHAR('A') PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE( KEYCODE_S ) PORT_CHAR('s') PORT_CHAR('S') @@ -420,7 +349,7 @@ static INPUT_PORTS_START( mstation ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE( KEYCODE_H ) PORT_CHAR('h') PORT_CHAR('H') PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE( KEYCODE_J ) PORT_CHAR('j') PORT_CHAR('J') - PORT_START( "LINE7" ) + PORT_START( "LINE.7" ) PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE( KEYCODE_K ) PORT_CHAR('K') PORT_CHAR('K') PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE( KEYCODE_L ) PORT_CHAR('l') PORT_CHAR('L') PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE( KEYCODE_COMMA ) PORT_CHAR(',') PORT_CHAR('<') @@ -430,7 +359,7 @@ static INPUT_PORTS_START( mstation ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Down") PORT_CODE( KEYCODE_DOWN ) PORT_CHAR(UCHAR_MAMEKEY(DOWN)) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Right") PORT_CODE( KEYCODE_RIGHT ) PORT_CHAR(UCHAR_MAMEKEY(RIGHT)) - PORT_START( "LINE8" ) + PORT_START( "LINE.8" ) PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Left Shift") PORT_CODE( KEYCODE_LSHIFT ) PORT_CHAR(UCHAR_MAMEKEY(LSHIFT)) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE( KEYCODE_Z ) PORT_CHAR('z') PORT_CHAR('Z') PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE( KEYCODE_X ) PORT_CHAR('x') PORT_CHAR('X') @@ -440,7 +369,7 @@ static INPUT_PORTS_START( mstation ) PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE( KEYCODE_N ) PORT_CHAR('n') PORT_CHAR('N') PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE( KEYCODE_M ) PORT_CHAR('m') PORT_CHAR('M') - PORT_START( "LINE9" ) + PORT_START( "LINE.9" ) PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("Function") PORT_CODE( KEYCODE_LCONTROL ) PORT_CHAR(UCHAR_MAMEKEY(LCONTROL)) PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED ) PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED ) @@ -453,29 +382,23 @@ INPUT_PORTS_END void mstation_state::machine_start() { - m_flashes[0] = machine().device("flash0"); - m_flashes[1] = machine().device("flash1"); - // allocate the videoram m_vram = (UINT8*)machine().memory().region_alloc( "vram", 9600, 1, ENDIANNESS_LITTLE )->base(); - m_ram_base = (UINT8*)m_ram->pointer(); // map firsh RAM bank at 0xc000-0xffff - membank("sysram")->set_base(m_ram_base); + membank("sysram")->set_base(m_nvram); } void mstation_state::machine_reset() { - m_flash_at_0x4000 = 0; - m_flash_at_0x8000 = 0; m_bank1[0] = m_bank1[1] = 0; m_bank2[0] = m_bank2[1] = 0; memset(m_vram, 0, 9600); // reset banks - refresh_memory(1, m_bank1[1]); - refresh_memory(2, m_bank2[1]); + m_bankdev1->set_bank(0); + m_bankdev2->set_bank(0); } WRITE_LINE_MEMBER( mstation_state::rtc_irq ) @@ -540,6 +463,18 @@ static MACHINE_CONFIG_START( mstation, mstation_state ) MCFG_DEVICE_ADD("rtc", RP5C01, XTAL_32_768kHz) MCFG_RP5C01_OUT_ALARM_CB(WRITELINE(mstation_state, rtc_irq)) + MCFG_DEVICE_ADD("bank0", ADDRESS_MAP_BANK, 0) + MCFG_DEVICE_PROGRAM_MAP(mstation_banked_map) + MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_LITTLE) + MCFG_ADDRESS_MAP_BANK_DATABUS_WIDTH(8) + MCFG_ADDRESS_MAP_BANK_STRIDE(0x4000) + + MCFG_DEVICE_ADD("bank1", ADDRESS_MAP_BANK, 0) + MCFG_DEVICE_PROGRAM_MAP(mstation_banked_map) + MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_LITTLE) + MCFG_ADDRESS_MAP_BANK_DATABUS_WIDTH(8) + MCFG_ADDRESS_MAP_BANK_STRIDE(0x4000) + /* internal ram */ MCFG_RAM_ADD(RAM_TAG) MCFG_RAM_DEFAULT_SIZE("128K") diff --git a/src/mame/drivers/rex6000.cpp b/src/mame/drivers/rex6000.cpp index 8709a578991..711571ea3c8 100644 --- a/src/mame/drivers/rex6000.cpp +++ b/src/mame/drivers/rex6000.cpp @@ -29,6 +29,7 @@ #include "emu.h" #include "cpu/z80/z80.h" #include "machine/rp5c01.h" +#include "machine/bankdev.h" #include "machine/ram.h" #include "machine/intelfsh.h" #include "imagedev/snapquik.h" @@ -46,14 +47,6 @@ #define IRQ_FLAG_IRQ1 0x40 #define IRQ_FLAG_EVENT 0x80 -//memory bank types -#define BANK_FLASH0_B0 0x00 -#define BANK_FLASH0_B1 0x01 -#define BANK_FLASH1_B0 0x02 -#define BANK_FLASH1_B1 0x03 -#define BANK_RAM 0x10 -#define BANK_UNKNOWN 0xff - #define TC8521_TAG "rtc" class rex6000_state : public driver_device @@ -63,13 +56,20 @@ public: : driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), m_ram(*this, RAM_TAG), - m_beep(*this, "beeper") + m_beep(*this, "beeper"), + m_bankdev0(*this, "bank0"), + m_bankdev1(*this, "bank1"), + m_flash0b(*this, "flash0b"), + m_nvram(*this, "nvram") { } required_device m_maincpu; required_device m_ram; required_device m_beep; - fujitsu_29dl16x_device *m_flash[4]; + required_device m_bankdev0; + required_device m_bankdev1; + optional_device m_flash0b; + required_shared_ptr m_nvram; UINT8 m_bank[4]; UINT8 m_beep_io[5]; @@ -77,19 +77,12 @@ public: UINT8 m_touchscreen[0x10]; UINT8 m_lcd_enabled; UINT8 m_lcd_cmd; - UINT8 *m_ram_base; UINT8 m_irq_mask; UINT8 m_irq_flag; UINT8 m_port6; UINT8 m_beep_mode; - struct - { - UINT8 type; - UINT16 page; - } m_banks[2]; - virtual void machine_start() override; virtual void machine_reset() override; UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); @@ -108,14 +101,6 @@ public: DECLARE_WRITE8_MEMBER( touchscreen_w ); DECLARE_WRITE_LINE_MEMBER( alarm_irq ); - DECLARE_READ8_MEMBER( flash_0x0000_r ); - DECLARE_WRITE8_MEMBER( flash_0x0000_w ); - DECLARE_READ8_MEMBER( flash_0x8000_r ); - DECLARE_WRITE8_MEMBER( flash_0x8000_w ); - DECLARE_READ8_MEMBER( flash_0xa000_r ); - DECLARE_WRITE8_MEMBER( flash_0xa000_w ); - - UINT8 identify_bank_type(UINT32 bank); DECLARE_PALETTE_INIT(rex6000); DECLARE_INPUT_CHANGED_MEMBER(trigger_irq); TIMER_DEVICE_CALLBACK_MEMBER(irq_timer1); @@ -125,34 +110,6 @@ public: }; -UINT8 rex6000_state::identify_bank_type(UINT32 bank) -{ - if (bank < 0x080) - { - return BANK_FLASH0_B0; - } - else if (bank >= 0x080 && bank < 0x100) - { - return BANK_FLASH0_B1; - } - else if ((bank >= 0xb00 && bank < 0xb80) || (bank >= 0x600 && bank < 0x680)) - { - return BANK_FLASH1_B0; - } - else if ((bank >= 0xb80 && bank < 0xc00) || (bank >= 0x680 && bank < 0x700)) - { - return BANK_FLASH1_B1; - } - else if (bank >= 0x1000 && bank < 0x1004) - { - return BANK_RAM; - } - else - { - //logerror("%04x: unkonwn memory bank %x\n", m_maincpu->pc(), bank); - return BANK_UNKNOWN; - } -} READ8_MEMBER( rex6000_state::bankswitch_r ) { @@ -161,8 +118,6 @@ READ8_MEMBER( rex6000_state::bankswitch_r ) WRITE8_MEMBER( rex6000_state::bankswitch_w ) { - address_space& program = m_maincpu->space(AS_PROGRAM); - m_bank[offset&3] = data; switch (offset) @@ -171,39 +126,13 @@ WRITE8_MEMBER( rex6000_state::bankswitch_w ) case 1: //bank 1 high { //bank 1 start at 0x8000 - m_banks[0].page = (MAKE_BANK(m_bank[0], m_bank[1]&0x0f) + 4); - m_banks[0].type = identify_bank_type(m_banks[0].page); - - if (m_banks[0].type != BANK_UNKNOWN) - { - program.install_readwrite_handler(0x8000, 0x9fff, 0, 0, read8_delegate(FUNC(rex6000_state::flash_0x8000_r), this), write8_delegate(FUNC(rex6000_state::flash_0x8000_w), this)); - } - else - { - program.unmap_readwrite(0x8000, 0x9fff); - } - + m_bankdev0->set_bank(MAKE_BANK(m_bank[0], m_bank[1]) + 4); break; } case 2: //bank 2 low case 3: //bank 2 high { - m_banks[1].page = MAKE_BANK(m_bank[2], m_bank[3]&0x1f); - m_banks[1].type = identify_bank_type(m_banks[1].page); - - if (m_banks[1].type == BANK_RAM) - { - program.install_ram(0xa000, 0xbfff, m_ram_base + ((m_banks[1].page & 0x03)<<13)); - } - else if (m_banks[1].type != BANK_UNKNOWN) - { - program.install_readwrite_handler(0xa000, 0xbfff, 0, 0, read8_delegate(FUNC(rex6000_state::flash_0xa000_r), this), write8_delegate(FUNC(rex6000_state::flash_0xa000_w), this)); - } - else - { - program.unmap_readwrite(0xa000, 0xbfff); - } - + m_bankdev1->set_bank(MAKE_BANK(m_bank[2], m_bank[3])); break; } } @@ -362,42 +291,24 @@ WRITE8_MEMBER( rex6000_state::touchscreen_w ) m_touchscreen[offset&0x0f] = data; } -READ8_MEMBER( rex6000_state::flash_0x0000_r ) -{ - return m_flash[0]->read(offset); -} -WRITE8_MEMBER( rex6000_state::flash_0x0000_w ) -{ - m_flash[0]->write(offset, data); -} +static ADDRESS_MAP_START(rex6000_banked_map, AS_PROGRAM, 8, rex6000_state) + AM_RANGE( 0x0000000, 0x00fffff ) AM_DEVREADWRITE("flash0a", intelfsh8_device, read, write) + AM_RANGE( 0x0100000, 0x01fffff ) AM_DEVREADWRITE("flash0b", intelfsh8_device, read, write) + AM_RANGE( 0x0c00000, 0x0cfffff ) AM_DEVREADWRITE("flash1a", intelfsh8_device, read, write) + AM_RANGE( 0x0d00000, 0x0dfffff ) AM_DEVREADWRITE("flash1b", intelfsh8_device, read, write) + AM_RANGE( 0x1600000, 0x16fffff ) AM_DEVREADWRITE("flash1a", intelfsh8_device, read, write) + AM_RANGE( 0x1700000, 0x17fffff ) AM_DEVREADWRITE("flash1b", intelfsh8_device, read, write) + AM_RANGE( 0x2000000, 0x2007fff ) AM_RAM AM_SHARE("nvram") +ADDRESS_MAP_END -READ8_MEMBER( rex6000_state::flash_0x8000_r ) -{ - return m_flash[m_banks[0].type]->read(((m_banks[0].page & 0x7f)<<13) | offset); -} - -WRITE8_MEMBER( rex6000_state::flash_0x8000_w ) -{ - m_flash[m_banks[0].type]->write(((m_banks[0].page & 0x7f)<<13) | offset, data); -} - -READ8_MEMBER( rex6000_state::flash_0xa000_r ) -{ - return m_flash[m_banks[1].type]->read(((m_banks[1].page & 0x7f)<<13) | offset); -} - -WRITE8_MEMBER( rex6000_state::flash_0xa000_w ) -{ - m_flash[m_banks[1].type]->write(((m_banks[1].page & 0x7f)<<13) | offset, data); -} static ADDRESS_MAP_START(rex6000_mem, AS_PROGRAM, 8, rex6000_state) ADDRESS_MAP_UNMAP_HIGH - AM_RANGE( 0x0000, 0x7fff ) AM_READWRITE(flash_0x0000_r, flash_0x0000_w) - AM_RANGE( 0x8000, 0x9fff ) AM_READWRITE(flash_0x8000_r, flash_0x8000_w) - AM_RANGE( 0xa000, 0xbfff ) AM_READWRITE(flash_0xa000_r, flash_0xa000_w) + AM_RANGE( 0x0000, 0x7fff ) AM_DEVREADWRITE("flash0a", intelfsh8_device, read, write) + AM_RANGE( 0x8000, 0x9fff ) AM_DEVREADWRITE("bank0", address_map_bank_device, read8, write8) + AM_RANGE( 0xa000, 0xbfff ) AM_DEVREADWRITE("bank1", address_map_bank_device, read8, write8) AM_RANGE( 0xc000, 0xffff ) AM_RAMBANK("ram") //system RAM ADDRESS_MAP_END @@ -450,27 +361,11 @@ INPUT_PORTS_END void rex6000_state::machine_start() { - m_flash[0] = machine().device("flash0a"); - m_flash[1] = machine().device("flash0b"); - m_flash[2] = machine().device("flash1a"); - m_flash[3] = machine().device("flash1b"); - - m_ram_base = m_ram->pointer(); - membank("ram")->set_base(m_ram_base + 0x4000); + membank("ram")->set_base((UINT8*)m_nvram + 0x4000); } + void rex6000_state::machine_reset() { - address_space& program = m_maincpu->space(AS_PROGRAM); - - program.install_readwrite_handler(0x8000, 0x9fff, 0, 0, read8_delegate(FUNC(rex6000_state::flash_0x8000_r), this), write8_delegate(FUNC(rex6000_state::flash_0x8000_w), this)); - program.install_readwrite_handler(0xa000, 0xbfff, 0, 0, read8_delegate(FUNC(rex6000_state::flash_0xa000_r), this), write8_delegate(FUNC(rex6000_state::flash_0xa000_w), this)); - - m_banks[0].type = 0x04; - m_banks[0].type = 0; - m_banks[1].type = 0x00; - m_banks[1].type = 0; - - memset(m_ram_base, 0, m_ram->size()); memset(m_bank, 0, sizeof(m_bank)); memset(m_beep_io, 0, sizeof(m_beep_io)); memset(m_lcd_base, 0, sizeof(m_lcd_base)); @@ -485,25 +380,14 @@ void rex6000_state::machine_reset() UINT32 rex6000_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { - UINT16 lcd_bank = MAKE_BANK(m_lcd_base[0], m_lcd_base[1]&0x1f); - UINT8 mem_type = identify_bank_type(lcd_bank); + UINT16 lcd_bank = MAKE_BANK(m_lcd_base[0], m_lcd_base[1]); - if (m_lcd_enabled && mem_type != BANK_UNKNOWN) + if (m_lcd_enabled) { for (int y=0; y<120; y++) for (int x=0; x<30; x++) { - UINT8 data = 0; - - if (mem_type == BANK_RAM) - { - data = (m_ram_base + ((lcd_bank & 0x03)<<13))[y*30 + x]; - } - else - { - data = m_flash[mem_type]->space(0).read_byte(((lcd_bank & 0x7f)<<13) | (y*30 + x)); - } - + UINT8 data = m_bankdev0->space(AS_PROGRAM).read_byte((lcd_bank << 13) + y*30 + x); for (int b=0; b<8; b++) { @@ -570,7 +454,7 @@ PALETTE_INIT_MEMBER(rex6000_state, rex6000) QUICKLOAD_LOAD_MEMBER( rex6000_state,rex6000) { static const char magic[] = "ApplicationName:Addin"; - address_space& flash = machine().device("flash0b")->memory().space(0); + address_space& flash = m_flash0b->space(0); UINT32 img_start = 0; dynamic_buffer data(image.length()); @@ -661,6 +545,18 @@ static MACHINE_CONFIG_START( rex6000, rex6000_state ) MCFG_PALETTE_INIT_OWNER(rex6000_state, rex6000) MCFG_GFXDECODE_ADD("gfxdecode", "palette", rex6000) + MCFG_DEVICE_ADD("bank0", ADDRESS_MAP_BANK, 0) + MCFG_DEVICE_PROGRAM_MAP(rex6000_banked_map) + MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_LITTLE) + MCFG_ADDRESS_MAP_BANK_DATABUS_WIDTH(8) + MCFG_ADDRESS_MAP_BANK_STRIDE(0x2000) + + MCFG_DEVICE_ADD("bank1", ADDRESS_MAP_BANK, 0) + MCFG_DEVICE_PROGRAM_MAP(rex6000_banked_map) + MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_LITTLE) + MCFG_ADDRESS_MAP_BANK_DATABUS_WIDTH(8) + MCFG_ADDRESS_MAP_BANK_STRIDE(0x2000) + /* quickload */ MCFG_QUICKLOAD_ADD("quickload", rex6000_state, rex6000, "rex,ds2", 0) diff --git a/src/mame/includes/avigo.h b/src/mame/includes/avigo.h index 6ef813906b6..b7556bb23d4 100644 --- a/src/mame/includes/avigo.h +++ b/src/mame/includes/avigo.h @@ -14,6 +14,7 @@ #include "machine/rp5c01.h" #include "machine/ins8250.h" #include "machine/intelfsh.h" +#include "machine/bankdev.h" #include "machine/nvram.h" #include "sound/speaker.h" #include "machine/ram.h" @@ -36,7 +37,11 @@ public: m_speaker(*this, "speaker"), m_uart(*this, "ns16550"), m_serport(*this, "serport"), - m_palette(*this, "palette") + m_palette(*this, "palette"), + m_bankdev1(*this, "bank0"), + m_bankdev2(*this, "bank1"), + m_flash1(*this, "flash1"), + m_nvram(*this, "nvram") { } required_device m_maincpu; @@ -45,25 +50,20 @@ public: required_device m_uart; required_device m_serport; required_device m_palette; + required_device m_bankdev1; + required_device m_bankdev2; + required_device m_flash1; + required_shared_ptr m_nvram; // defined in drivers/avigo.c virtual void machine_start() override; virtual void machine_reset() override; - void postload(); - void refresh_memory(UINT8 bank, UINT8 chip_select); void refresh_ints(); void nvram_init(nvram_device &nvram, void *base, size_t size); DECLARE_WRITE_LINE_MEMBER( tc8521_alarm_int ); DECLARE_WRITE_LINE_MEMBER( com_interrupt ); - DECLARE_READ8_MEMBER(flash_0x0000_read_handler); - DECLARE_WRITE8_MEMBER(flash_0x0000_write_handler); - DECLARE_READ8_MEMBER(flash_0x4000_read_handler); - DECLARE_WRITE8_MEMBER(flash_0x4000_write_handler); - DECLARE_READ8_MEMBER(flash_0x8000_read_handler); - DECLARE_WRITE8_MEMBER(flash_0x8000_write_handler); - DECLARE_READ8_MEMBER(key_data_read_r); DECLARE_WRITE8_MEMBER(set_key_line_w); DECLARE_WRITE8_MEMBER(port2_w); @@ -99,14 +99,10 @@ public: UINT8 m_bank1_l; UINT8 m_bank1_h; UINT8 m_ad_control_status; - intelfsh8_device * m_flashes[3]; - int m_flash_at_0x4000; - int m_flash_at_0x8000; UINT16 m_ad_value; UINT8 * m_video_memory; UINT8 m_screen_column; UINT8 m_warm_start; - UINT8 * m_ram_base; DECLARE_PALETTE_INIT(avigo); TIMER_DEVICE_CALLBACK_MEMBER(avigo_scan_timer); TIMER_DEVICE_CALLBACK_MEMBER(avigo_1hz_timer);