summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/m5.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/m5.cpp')
-rw-r--r--src/mame/drivers/m5.cpp1690
1 files changed, 0 insertions, 1690 deletions
diff --git a/src/mame/drivers/m5.cpp b/src/mame/drivers/m5.cpp
deleted file mode 100644
index b272dbc2ad1..00000000000
--- a/src/mame/drivers/m5.cpp
+++ /dev/null
@@ -1,1690 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Curt Coder, Ales Dlabac
-/***************************************************************************
-
- Sord m.5
-
- http://www.retropc.net/mm/m5/
- http://www.museo8bits.es/wiki/index.php/Sord_M5 not working
- http://k5.web.klfree.net/content/view/10/11/ not working
- http://k5.web.klfree.net/images/stories/sord/m5heap.htm not working
- http://k5.klfree.net/index.php?option=com_content&task=view&id=5&Itemid=3
- http://k5.klfree.net/index.php?option=com_content&task=view&id=10&Itemid=11
- http://k5.klfree.net/index.php?option=com_content&task=view&id=14&Itemid=3
- http://www.dlabi.cz/?s=sord
- https://www.facebook.com/groups/59667560188/
- http://www.oldcomp.cz/viewtopic.php?f=103&t=1164
-
-****************************************************************************/
-
-/***************************************************************************
-
-TODO:
-
- - fd5 floppy
- - SI-5 serial interface (8251, ROM)
- - ramdisk for KRX Memory expansion
- - rewrite fd5 floppy as unpluggable device
- - move dipswitch declaration to softwarelist file?
- - 64krx: get windows ROM version with cpm & ramdisk support (Stuchlik S.E.I. version)
-
- - brno mod: make the dsk image writeable
- - brno mod: in console version lost data on RAMDISK after soft reset
- - brno mod: add support for lzr floppy disc format
- - brno mod: include basic-i
-
-
-
-CHANGELOG:
-
-10.02.2016
- - fixed bug: crash if rom card was only cart
- - fixed bug: when em-5 selected monitor rom wasn't paged in
- - brno mod: spin motor on upon restart
- - brno mod: windowed boot as default rom
- - brno mod: fixed bug: tape command in menu now works
-
-05.02.2016
- - added BRNO modification - 1024kB Ramdisk + CP/M support
- - 32/64KB RAM expansions EM-5, 64KBI, 64KBF, 64KRX
- - since now own version of rom and slot handlers
- - 2 slots for carts
-
-
-******************************************************************************
-
-
-Controlling (paging) of homebrew 64KB RAM carts
-================================================
-
-Used ports:
-EM-64, 64KBI: OUT 6CH,00H - enables ROM
- OUT 6CH,01H - enables RAM
-64KBF: OUT 30H,00000xxxB - enables RAM or ROM, see bellow
-64KRD, 64KRX: OUT 7FH,00000000B - enables RAM
- OUT 7FH,11111111B - enables ROM
- OUT 7FH,xxxxxxxxB - enables RAM and ROM, see bellow
-
-===========================================================================================================================
-
-RAM/ROM modes of EM-64/64KBI cart
-------------------------------------------
-mode 0: 0x0000-0x6fff ROM 0x7000-0xffff RAM (it is possible to limit actual ROM size by DIP switch only to 32kb)
-mode 1: 0x0000-0xffff RAM
-
-===========================================================================================================================
-
-RAM/ROM modes of 64KBF version 2C cart
-------------------------------------------
-Memory paging is done by using "OUT &30,mod".
-
-MODE READ WRITE
-----------------------------------------------------------------------
- 00 8 KB MON + 20 KB BF + 36 KB RAM 28 KB DIS + 36 KB RAM
- 01 64 KB RAM 64 KB RAM
- 02 8 KB MON + 56 KB RAM 64 KB RAM
- 03 64 KB RAM 28 KB DIS + 36 KB RAM
- 04 64 KB RAM 16 KB DIS + 48 KB RAM
- 05 8 KB MON + 20 KB BF + 36 KB RAM 64 KB RAM
- 06 8 KB MON + 20 KB DIS + 36 KB RAM 64 KB RAM
- 07 64 KB DIS 64 KB DIS
-
-Version LZR ( 2C )
-================
-
-+------------+
-|////////////| READ ONLY AREA
-+------------+
-|\\\\\\\\\\\\| WRITE ONLY AREA
-+------------+
-|XXXXXXXXXXXX| R&W AREA
-+------------+
-| | DISABLED R&W
-+------------+
-
- 0 0 0 1 1 2 2 2 3 3 4 4 4 5 5 6 6
-kB 0 4 8 2 6 0 4 8 2 6 0 4 8 2 6 0 4
- +-------+-------------------+
-ROM |MONITOR| BASIC-F |
- +-------+-------+-------+---+---+-------+-------+-------+-------+
-RAM | | | | | | | | |
- +-------+-------+-------+-------+-------+-------+-------+-------+
-CART | | | | | | | | |
- +-------+-------+-------+-------+-------+-------+-------+-------+
-
-
-Mode
- +-------+-------------------+
- |///////|///////////////////|
- +-------+-------+-------+---+---+-------+-------+-------+-------+
-M0 | | | | |XXX|XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX|
- +-------+-------+-------+-------+-------+-------+-------+-------+
-
- +-------+-------------------+
- | | |
- +-------+-------+-------+---+---+-------+-------+-------+-------+
-M1 |XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX|
- +-------+-------+-------+-------+-------+-------+-------+-------+
-
- +-------+-------------------+
- |///////| |
- +-------+-------+-------+---+---+-------+-------+-------+-------+
-M2 |\\\\\\\|XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX|
- +-------+-------+-------+-------+-------+-------+-------+-------+
-
- +-------+-------------------+
- | | |
- +-------+-------+-------+---+---+-------+-------+-------+-------+
-M3 |///////|///////|///////|///|XXX|XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX|
- +-------+-------+-------+-------+-------+-------+-------+-------+
-
- +-------+-------------------+
- | | |
- +-------+-------+-------+---+---+-------+-------+-------+-------+
-M4 |///////|///////|XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX|
- +-------+-------+-------+-------+-------+-------+-------+-------+
-
- +-------+-------------------+
- |///////|///////////////////|
- +-------+-------+-------+---+---+-------+-------+-------+-------+
-M5 |\\\\\\\|\\\\\\\|\\\\\\\|\\\|XXX|XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX|
- +-------+-------+-------+-------+-------+-------+-------+-------+
-
- +-------+-------------------+
- |///////| |
- +-------+-------+-------+---+---+-------+-------+-------+-------+
-M6 |\\\\\\\|\\\\\\\|\\\\\\\|\\\|XXX|XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX|
- +-------+-------+-------+---+---+-------+-------+-------+-------+
- |///////|///////|///|
- +-------+-------+---+
-
- +-------+-------------------+
- | | |
- +-------+-------+-------+---+---+-------+-------+-------+-------+
-M7 | | | | | | | | |
- +-------+-------+-------+-------+-------+-------+-------+-------+
- |XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX|
- +---------------------------------------------------------------+
-
-===========================================================================================================
-
-Memory map of ROM and RAM in configuration SORD M5 + 64 KRX memory cart
------------------------------------------------------------------------
-
- cart inside Sord inside Sord cart cart
-FFFF +----------+ +----------+ +----------+ +----------+ +----------+
- | | | | | |
- | | | EPROM 16K| | EPROM 16K|
- | | | 5 | | 7 |
-C000 | DRAM | +----------+ +----------+
- | | | | | |
- | | | EPROM 16K| | EPROM 16K|
- | | | 4 | | 6 |
-7FFF +----------+ +----------+ +----------+ +----------+
- | SRAM |
-7000 +----------+ +----------+
- | |
-6000 | | +----------+
- | | | |
-5000 | | | EPROM 8K |
- | | | 3 |
-4000 | | +----------+ +----------+
- | | | |
-3000 | DRAM | | EPROM 8K |
- | | | 2 |
-2000 | | +----------+
- | | | |
-1000 | | | EPROM 8K |
- | | | 1 |
-0000 +----------+ +----------+ +----------+ +----------+ +----------+
-
-1 - MONITOR ROM
-2 - WINDOWS + BASIC-F 3rd part
-3 - BASIC-I
-4 - 2nd part of BASIC-F + 1st part of BASIC-F
-5 - 1st part of BASIC-G + 2nd part of BASIC-G
-6 - 1st part of MSX 1.C
-7 - 2nd part of MSX 1.C
-
-Note: position 3 could be replaced with SRAM 8KB with battery power backup!
-
-Upon powering up either SRAM + 1,2,3,4,5 or SRAM + 1,2,3,6,7 are selected.
-Switching between 4,5 and 6,7 is provided by hw switch, selecting ROM/RAM mode happens
-using OUT (7FH),A, where each bit of A means 8KB memory chunk ( state: 0=RAM,
-1=ROM, bit: 0=1, 1=2, 2=3, 3=always SRAM, 4=4, 5=5, 6=6, 7=7 ).
-
-
-*/
-
-/*
-*************************************************************
-* BRNO MOD *
-*************************************************************
-HW and SW was originally created by Pavel Brychta with help of Jiri Kubin and L. Novak
-This driver mod was implemented by Ales Dlabac with great help of Pavel Brychta. Without him this would never happen
-This mod exists in two versions. First one is "windows"(brno_rom12.rom) version and was created by Ladislav Novak.
-Second version version is "pure text" and was created by Pavel Brychta and Jiri Kubin
-
-Function:
-Whole Sord's address area (0000-FFFF) is divided to 16 4kB banks. To this 16 banks
-you can map any of possible 256 ramdisc blocks what allows user to have 1024kB large ramdisc.
-Of course to be able to realise this is necessary page out all roms
-
-As pagination port MMU(page select) is used.
-For RAM write protection port CASEN is used. 0=access to ramdisk enabled, 0xff=ramdisk access disabled(data protection), &80=ROM2+48k RAM, &81=ROM2+4k RAM(this is not implemented)
-For ROM page out port RAMEN is used. 0=rom enable; 0xff=rom+sord ram disabled (ramdisk visible)
-
-SORD M5 RAM memory map in address area 7000H-7FFFH
-7000H 7300H 7800H 7E00H 7FFFH
- +---------+-----------------------+----------------------------+---------+
- | a. | | c. | d. |
-
-a. SORD system variables and stack
-c. Area where the first sector of 1st track is loaded, simultaneously is reserved for Hook program
-d. Reserved for memory tests and ramdisk mapping(pagination). After boot is used as buffer for cursor position,
- type of floppy and so on. Area consists of:
-
-7FFFH .... bootloader version
-7FFEH .... identification byte of floppy - is transferred from EPROM, it might be changed by SETUP
-7FFDH .... number of last Ramdisk segment of RAM
-7FFBH .... address of cursor in VRAM in 40 columns CRT. For 80 columns CRT both bytes are zero
-7FF9H .... X,Y cursor actual position for 40 columns CRTs. In case of 80 columns CRT both bytes are zero
-7203H .... Actual memory bank buffer
-
-System floppy disk header on track 00 of 1st sector
- byte 0-1 ... system disk identification SY
- byte 2 ... # of physical sectors for BIOS or DOS plus # of segments for DIR
- byte 3-4 ... Start address for loading of BIOS or DOS
- byte 5 ... # of bytes for possible HOOK program
- byte 6- ... HOOK program, or either BIOS or DOS
-
-In case of HOOK, bytes 8 and 9 contains characters 'H' and 'O' for HOOK testing
-
-Few other notes:
- Ramdisc warm boot is provided by pressing Ctrl+C
-
-
- Floppy formats as follows:
-
- A: Ramdisk 1024kB, 8 sectors,
- B: Floppy format "Heat Magnolia" SingleSide SingleDensity , 40 tracks, 9 sectors, 512 sec. length, 128 dirs, offset 3, 166kB
- C: Floppy format "Robotron aka PC1715", DS DD, 80 tracks, 5 sectors, 1024 sec. length, 128 dirs, offset 2, 780kB
-
-**********************************************************************************************************************************/
-
-
-
-#include "emu.h"
-
-#include "cpu/z80/z80.h"
-#include "machine/i8251.h"
-#include "machine/i8255.h"
-#include "machine/ram.h"
-#include "machine/upd765.h"
-#include "machine/wd_fdc.h" //brno mod
-#include "machine/z80daisy.h"
-#include "machine/z80ctc.h"
-#include "sound/sn76496.h"
-#include "video/tms9928a.h"
-
-#include "bus/rs232/rs232.h"
-#include "bus/centronics/ctronics.h"
-#include "bus/m5/rom.h"
-#include "bus/m5/slot.h"
-
-#include "imagedev/cassette.h"
-#include "imagedev/floppy.h"
-#include "imagedev/snapquik.h"
-
-#include "softlist.h"
-#include "speaker.h"
-
-#include "formats/m5_dsk.h"
-#include "formats/sord_cas.h"
-
-//brno mod
-#define RAMDISK "ramdisk"
-
-
-class m5_state : public driver_device
-{
-public:
- m5_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag)
- , m_maincpu(*this, "maincpu")
- , m_ctc(*this, "ctc")
- , m_fd5cpu(*this, "z80fd5")
- , m_ppi(*this, "ppi")
- , m_fdc(*this, "upd765")
- , m_floppy0(*this, "upd765:0:525dd")
- , m_cassette(*this, "cassette")
- , m_cart1(*this, "cartslot1")
- , m_cart2(*this, "cartslot2")
- , m_centronics(*this, "centronics")
- , m_ram(*this, RAM_TAG)
- , m_reset(*this, "RESET")
- , m_DIPS(*this, "DIPS")
- , m_centronics_busy(0)
- { }
-
- void m5(machine_config &config);
- void pal(machine_config &config);
- void ntsc(machine_config &config);
-
-protected:
- required_device<z80_device> m_maincpu;
- required_device<z80ctc_device> m_ctc;
- //I've changed following devices to optional since we have to remove them in BRNO mod (I don't know better solution)
- optional_device<cpu_device> m_fd5cpu;
- optional_device<i8255_device> m_ppi;
- optional_device<upd765a_device> m_fdc;
- optional_device<floppy_image_device> m_floppy0;
- required_device<cassette_image_device> m_cassette;
- optional_device<m5_cart_slot_device> m_cart1;
- optional_device<m5_cart_slot_device> m_cart2;
- required_device<centronics_device> m_centronics;
- optional_device<ram_device> m_ram;
- required_ioport m_reset;
- optional_ioport m_DIPS;
- m5_cart_slot_device *m_cart_ram, *m_cart;
-
- u8 sts_r();
- void com_w(u8 data);
-
- virtual void machine_start() override;
- virtual void machine_reset() override;
-private:
- u8 ppi_pa_r();
- void ppi_pa_w(u8 data);
- void ppi_pb_w(u8 data);
- u8 ppi_pc_r();
- void ppi_pc_w(u8 data);
-
- u8 fd5_data_r();
- void fd5_data_w(u8 data);
- u8 fd5_com_r();
- void fd5_com_w(u8 data);
- void fd5_ctrl_w(u8 data);
- void fd5_tc_w(u8 data);
-
- static void floppy_formats(format_registration &fr);
-
- DECLARE_WRITE_LINE_MEMBER(write_centronics_busy);
-
- // memory
- u8 mem64KBI_r();
- void mem64KBI_w(offs_t offset, u8 data);
- void mem64KBF_w(u8 data);
- void mem64KRX_w(offs_t offset, u8 data);
-
- void fd5_io(address_map &map);
- void fd5_mem(address_map &map);
- void m5_io(address_map &map);
- void m5_mem(address_map &map);
-
- // video state
-// const TMS9928a_interface *m_vdp_intf;
-
-protected:
- bool m_centronics_busy;
-
-private:
- u8 m_ram_mode;
- u8 m_ram_type;
- memory_region *m_cart_rom;
-
- // floppy state for fd5
- u8 m_fd5_data;
- u8 m_fd5_com;
- int m_intra;
- int m_ibfa;
- int m_obfa;
-};
-
-
-class brno_state : public m5_state
-{
-public:
- brno_state(const machine_config &mconfig, device_type type, const char *tag)
- : m5_state(mconfig, type, tag)
- , m_rom_view(*this, "rom")
- , m_ram_view(*this, "ram")
- , m_wdfdc(*this, "wd")
- , m_floppy0(*this, "wd:0")
- , m_floppy1(*this, "wd:1")
- { }
-
- void brno(machine_config &config);
-
-protected:
- virtual void machine_start() override;
- virtual void machine_reset() override;
-
-private:
- u8 ramdisk_r(offs_t offset);
- void ramdisk_w(offs_t offset, u8 data);
- void mmu_w(offs_t offset, u8 data);
- void ramsel_w(u8 data);
- void romsel_w(u8 data);
- void fd_w(u8 data);
-
- static void floppy_formats(format_registration &fr);
-
- DECLARE_SNAPSHOT_LOAD_MEMBER(brno);
-
- void brno_io(address_map &map);
- void m5_mem_brno(address_map &map);
-
- memory_view m_rom_view;
- memory_view m_ram_view;
- required_device<wd2797_device> m_wdfdc;
- required_device<floppy_connector> m_floppy0;
- optional_device<floppy_connector> m_floppy1;
- floppy_image_device *m_floppy;
-
- u8 m_rammap[16]; // memory map
-};
-
-
-//**************************************************************************
-// MEMORY BANKING
-//**************************************************************************
-
-WRITE_LINE_MEMBER( m5_state::write_centronics_busy )
-{
- m_centronics_busy = state;
-}
-
-//-------------------------------------------------
-// sts_r -
-//-------------------------------------------------
-
-u8 m5_state::sts_r()
-{
- /*
-
- bit description
-
- 0 cassette input
- 1 busy
- 2
- 3
- 4
- 5
- 6
- 7 RESET key
-
- */
-
- u8 data = 0;
-
- // cassette input
- data |= m_cassette->input() >= 0 ? 1 : 0;
-
- // centronics busy
- if (m_centronics_busy)
- data |= 2;
-
- // RESET key
- data |= m_reset->read();
-
- return data;
-}
-
-
-//-------------------------------------------------
-// com_w -
-//-------------------------------------------------
-
-void m5_state::com_w(u8 data)
-{
- /*
-
- bit description
-
- 0 cassette output, centronics strobe
- 1 cassette remote
- 2
- 3
- 4
- 5
- 6
- 7
-
- */
-
- // cassette output
- m_cassette->output( BIT(data, 0) ? -1.0 : 1.0);
-
- // centronics strobe
- m_centronics->write_strobe(BIT(data, 0));
-
- // cassette remote
- m_cassette->change_state(BIT(data,1) ? CASSETTE_MOTOR_ENABLED : CASSETTE_MOTOR_DISABLED, CASSETTE_MASK_MOTOR);
-}
-
-
-
-//**************************************************************************
-// FD-5
-//**************************************************************************
-
-//-------------------------------------------------
-// fd5_data_r -
-//-------------------------------------------------
-
-u8 m5_state::fd5_data_r()
-{
- m_ppi->pc6_w(0);
-
- return m_fd5_data;
-}
-
-
-//-------------------------------------------------
-// fd5_data_w -
-//-------------------------------------------------
-
-void m5_state::fd5_data_w(u8 data)
-{
- m_fd5_data = data;
-
- m_ppi->pc4_w(0);
-}
-
-
-//-------------------------------------------------
-// fd5_com_r -
-//-------------------------------------------------
-
-u8 m5_state::fd5_com_r()
-{
- /*
-
- bit description
-
- 0 ?
- 1 1?
- 2 IBFA?
- 3 OBFA?
- 4
- 5
- 6
- 7
-
- */
-
- return m_obfa << 3 | m_ibfa << 2 | 0x02;
-}
-
-
-//-------------------------------------------------
-// fd5_com_w -
-//-------------------------------------------------
-
-void m5_state::fd5_com_w(u8 data)
-{
- /*
-
- bit description
-
- 0 PPI PC2
- 1 PPI PC0
- 2 PPI PC1
- 3
- 4
- 5
- 6
- 7
-
- */
-
- m_fd5_com = data;
-}
-
-
-//-------------------------------------------------
-// fd5_com_w -
-//-------------------------------------------------
-
-void m5_state::fd5_ctrl_w(u8 data)
-{
- /*
-
- bit description
-
- 0
- 1
- 2
- 3
- 4
- 5
- 6
- 7
-
- */
-
- m_floppy0->mon_w(!BIT(data, 0));
-}
-
-
-//-------------------------------------------------
-// fd5_com_w -
-//-------------------------------------------------
-
-void m5_state::fd5_tc_w(u8 data)
-{
- m_fdc->tc_w(true);
- m_fdc->tc_w(false);
-}
-
-//**************************************************************************
-// 64KBI support for oldest memory module
-//**************************************************************************
-
-u8 m5_state::mem64KBI_r() //in 0x6c
-{
- return BIT(m_ram_mode, 0);
-}
-
-void m5_state::mem64KBI_w(offs_t offset, u8 data) //out 0x6c
-{
- if (m_ram_type != MEM64KBI) return;
-
-#if 0 // FIXME: disabled for now
- address_space &program = m_maincpu->space(AS_PROGRAM);
- std::string region_tag;
- m_cart_rom = memregion(region_tag.assign(m_cart_ram->tag()).append(M5SLOT_ROM_REGION_TAG).c_str());
- memory_region *ram_region = memregion(region_tag.assign(m_cart_ram->tag()).append(":ram").c_str());
-
- if (m_ram_mode == BIT(data, 0))
- return;
-
- m_ram_mode = BIT(data, 0);
-
- //if 32kb only mode don't map top ram
- if (m_ram_mode && (m_DIPS->read() & 4) != 4)
- {
- program.install_ram(0x0000, 0x6fff, ram_region->base());
- }
- else
- {
- program.install_rom(0x0000, 0x1fff, memregion("maincpu")->base());
- program.unmap_write(0x0000, 0x1fff);
-
- //if AUTOSTART is on don't load any ROM cart
- if (m_cart && (m_DIPS->read() & 2) != 2)
- {
- program.install_read_handler(0x2000, 0x6fff, read8sm_delegate(*m_cart, FUNC(m5_cart_slot_device::read_rom)));
- program.unmap_write(0x2000, 0x3fff);
- }
- else
- program.unmap_readwrite(0x2000, 0x3fff);
- }
-#endif
-
- logerror("64KBI: ROM %s", m_ram_mode == 0 ? "enabled\n" : "disabled\n");
-}
-
-//**************************************************************************
-// 64KBF paging
-//**************************************************************************
-
-void m5_state::mem64KBF_w(u8 data) //out 0x30
-{
- if (m_ram_type != MEM64KBF) return;
-
-#if 0 // FIXME: disabled for now
- address_space &program = m_maincpu->space(AS_PROGRAM);
- std::string region_tag;
- m_cart_rom = memregion(region_tag.assign(m_cart_ram->tag()).append(M5SLOT_ROM_REGION_TAG).c_str()); //ROM region of the cart
- memory_region *ram_region=memregion(region_tag.assign(m_cart_ram->tag()).append(":ram").c_str()); //RAM region of the cart
- memory_region *rom_region=memregion(region_tag.assign(m_cart->tag()).append(M5SLOT_ROM_REGION_TAG).c_str()); //region where clasic ROM cartridge resides
-
- if (m_ram_mode == data)
- return;
-
- m_ram_mode = data;
-
- switch(m_ram_mode)
- {
- case 0:
- program.unmap_write(0x0000, 0x6fff);
- membank("bank1r")->set_base(memregion("maincpu")->base());
- membank("bank2r")->set_base(m_cart_rom->base());
- membank("bank3r")->set_base(m_cart_rom->base()+0x2000);
- membank("bank4r")->set_base(m_cart_rom->base()+0x4000);
- membank("bank5r")->set_base(ram_region->base()+0x8000); membank("bank5w")->set_base(ram_region->base()+0x8000);
- membank("bank6r")->set_base(ram_region->base()+0xc000); membank("bank6w")->set_base(ram_region->base()+0xc000);
- break;
- case 1:
- program.install_write_bank(0x0000,0x1fff,membank("bank1w"));
- program.install_write_bank(0x2000,0x3fff,membank("bank2w"));
- program.install_write_bank(0x4000,0x5fff,membank("bank3w"));
- program.install_write_bank(0x6000,0x6fff,membank("bank4w"));
- membank("bank1r")->set_base(ram_region->base()+0x0000); membank("bank1w")->set_base(ram_region->base()+0x0000);
- membank("bank2r")->set_base(ram_region->base()+0x2000); membank("bank2w")->set_base(ram_region->base()+0x2000);
- membank("bank3r")->set_base(ram_region->base()+0x4000); membank("bank3w")->set_base(ram_region->base()+0x4000);
- membank("bank4r")->set_base(ram_region->base()+0x6000); membank("bank4w")->set_base(ram_region->base()+0x6000);
- membank("bank5r")->set_base(ram_region->base()+0x8000); membank("bank5w")->set_base(ram_region->base()+0x8000);
- membank("bank6r")->set_base(ram_region->base()+0xc000); membank("bank6w")->set_base(ram_region->base()+0xc000);
- break;
- case 2:
- program.install_write_bank(0x0000,0x1fff,membank("bank1w"));
- program.install_write_bank(0x2000,0x3fff,membank("bank2w"));
- program.install_write_bank(0x4000,0x5fff,membank("bank3w"));
- program.install_write_bank(0x6000,0x6fff,membank("bank4w"));
- membank("bank1r")->set_base(memregion("maincpu")->base()); membank("bank1w")->set_base(ram_region->base()+0x0000);
- membank("bank2r")->set_base(ram_region->base()+0x2000); membank("bank2w")->set_base(ram_region->base()+0x2000);
- membank("bank3r")->set_base(ram_region->base()+0x4000); membank("bank3w")->set_base(ram_region->base()+0x4000);
- membank("bank4r")->set_base(ram_region->base()+0x6000); membank("bank4w")->set_base(ram_region->base()+0x6000);
- membank("bank5r")->set_base(ram_region->base()+0x8000); membank("bank5w")->set_base(ram_region->base()+0x8000);
- membank("bank6r")->set_base(ram_region->base()+0xc000); membank("bank6w")->set_base(ram_region->base()+0xc000);
- break;
- case 3:
- program.unmap_write(0x0000, 0x6fff);
- membank("bank1r")->set_base(ram_region->base()+0x0000);
- membank("bank2r")->set_base(ram_region->base()+0x2000);
- membank("bank3r")->set_base(ram_region->base()+0x4000);
- membank("bank4r")->set_base(ram_region->base()+0x6000);
- membank("bank5r")->set_base(ram_region->base()+0x8000); membank("bank5w")->set_base(ram_region->base()+0x8000);
- membank("bank6r")->set_base(ram_region->base()+0xc000); membank("bank6w")->set_base(ram_region->base()+0xc000);
- break;
- case 4:
- program.unmap_write(0x0000, 0x3fff);
- program.install_write_bank(0x4000,0x5fff,membank("bank3w"));
- program.install_write_bank(0x6000,0x6fff,membank("bank4w"));
- membank("bank1r")->set_base(ram_region->base()+0x0000);
- membank("bank2r")->set_base(ram_region->base()+0x2000);
- membank("bank3r")->set_base(ram_region->base()+0x4000); membank("bank3w")->set_base(ram_region->base()+0x4000);
- membank("bank4r")->set_base(ram_region->base()+0x6000); membank("bank4w")->set_base(ram_region->base()+0x6000);
- membank("bank5r")->set_base(ram_region->base()+0x8000); membank("bank5w")->set_base(ram_region->base()+0x8000);
- membank("bank6r")->set_base(ram_region->base()+0xc000); membank("bank6w")->set_base(ram_region->base()+0xc000);
- break;
- case 5:
- program.install_write_bank(0x0000,0x1fff,membank("bank1w"));
- program.install_write_bank(0x2000,0x3fff,membank("bank2w"));
- program.install_write_bank(0x4000,0x5fff,membank("bank3w"));
- program.install_write_bank(0x6000,0x6fff,membank("bank4w"));
- membank("bank1r")->set_base(memregion("maincpu")->base()); membank("bank1w")->set_base(ram_region->base()+0x0000);
- membank("bank2r")->set_base(m_cart_rom->base()); membank("bank2w")->set_base(ram_region->base()+0x2000);
- membank("bank3r")->set_base(m_cart_rom->base()+0x2000); membank("bank3w")->set_base(ram_region->base()+0x4000);
- membank("bank4r")->set_base(m_cart_rom->base()+0x4000); membank("bank4w")->set_base(ram_region->base()+0x6000);
- membank("bank5r")->set_base(ram_region->base()+0x8000); membank("bank5w")->set_base(ram_region->base()+0x8000);
- membank("bank6r")->set_base(ram_region->base()+0xc000); membank("bank6w")->set_base(ram_region->base()+0xc000);
- break;
- case 6:
- program.install_write_bank(0x0000,0x1fff,membank("bank1w"));
- program.install_write_bank(0x2000,0x3fff,membank("bank2w"));
- program.install_write_bank(0x4000,0x5fff,membank("bank3w"));
- program.install_write_bank(0x6000,0x6fff,membank("bank4w"));
- membank("bank1r")->set_base(memregion("maincpu")->base()); membank("bank1w")->set_base(ram_region->base()+0x0000);
- membank("bank2r")->set_base(rom_region->base()+0x0000); membank("bank2w")->set_base(ram_region->base()+0x2000);
- membank("bank3r")->set_base(rom_region->base()+0x2000); membank("bank3w")->set_base(ram_region->base()+0x4000);
- membank("bank4r")->set_base(rom_region->base()+0x4000); membank("bank4w")->set_base(ram_region->base()+0x6000);
- membank("bank5r")->set_base(ram_region->base()+0x8000); membank("bank5w")->set_base(ram_region->base()+0x8000);
- membank("bank6r")->set_base(ram_region->base()+0xc000); membank("bank6w")->set_base(ram_region->base()+0xc000);
- break;
- case 7: //probably this won't work - it should redirect rw to another ram module
- program.install_write_bank(0x0000,0x1fff,membank("bank1w"));
- program.install_write_bank(0x2000,0x3fff,membank("bank2w"));
- program.install_write_bank(0x4000,0x5fff,membank("bank3w"));
- program.install_write_bank(0x6000,0x6fff,membank("bank4w"));
- program.install_readwrite_bank(0x7000,0x7fff,membank("sram"));
- membank("bank1r")->set_base(rom_region->base()+0x0000); membank("bank1w")->set_base(rom_region->base()+0x0000);
- membank("bank2r")->set_base(rom_region->base()+0x2000); membank("bank2w")->set_base(rom_region->base()+0x2000);
- membank("bank3r")->set_base(rom_region->base()+0x4000); membank("bank3w")->set_base(rom_region->base()+0x4000);
- membank("bank4r")->set_base(rom_region->base()+0x6000); membank("bank4w")->set_base(rom_region->base()+0x6000);
- membank("sram")->set_base(rom_region->base()+0x7000);
- membank("bank5r")->set_base(rom_region->base()+0x8000); membank("bank5w")->set_base(rom_region->base()+0x8000);
- membank("bank6r")->set_base(rom_region->base()+0xc000); membank("bank6w")->set_base(rom_region->base()+0xc000);
- break;
- }
-#endif
-
- logerror("64KBF RAM mode set to %d\n", m_ram_mode);
-}
-
-//**************************************************************************
-// 64KRX paging
-//**************************************************************************
-
-void m5_state::mem64KRX_w(offs_t offset, u8 data) //out 0x7f
-{
- if (m_ram_type != MEM64KRX) return;
- if (m_ram_mode == data) return;
-
-#if 0 // FIXME: disabled for now
- address_space &program = m_maincpu->space(AS_PROGRAM);
- std::string region_tag;
- m_cart_rom = memregion(region_tag.assign(m_cart_ram->tag()).append(M5SLOT_ROM_REGION_TAG).c_str());
- memory_region *ram_region=memregion(region_tag.assign(m_cart_ram->tag()).append(":ram").c_str());
-
- m_ram_mode = data;
-
- BIT(m_ram_mode, 0) ? membank("bank1r")->set_base(memregion("maincpu")->base()) : membank("bank1r")->set_base(ram_region->base());
- BIT(m_ram_mode, 1) ? membank("bank2r")->set_base(m_cart_rom->base()) : membank("bank2r")->set_base(ram_region->base()+0x2000);
- BIT(m_ram_mode, 2) ? membank("bank3r")->set_base(m_cart_rom->base()+0x2000) : membank("bank3r")->set_base(ram_region->base()+0x4000);
-
- if ((m_DIPS->read() & 0x01))
- {
- BIT(m_ram_mode, 4) ? membank("bank5r")->set_base(m_cart_rom->base()+0x6000) : membank("bank5r")->set_base(ram_region->base()+0x8000);
- BIT(m_ram_mode, 5) ? membank("bank6r")->set_base(m_cart_rom->base()+0xa000) : membank("bank6r")->set_base(ram_region->base()+0xc000);
- }
- else
- {
- BIT(m_ram_mode, 6) ? membank("bank5r")->set_base(m_cart_rom->base()+0xe000) : membank("bank5r")->set_base(ram_region->base()+0x8000);
- BIT(m_ram_mode, 7) ? membank("bank6r")->set_base(m_cart_rom->base()+0x12000): membank("bank6r")->set_base(ram_region->base()+0xc000);
- }
-
- //if KRX ROM is paged out page in cart ROM if any
- if (m_cart && BIT(m_ram_mode, 1) == 0 )
- {
- program.install_read_handler(0x2000, 0x6fff, read8sm_delegate(*m_cart, FUNC(m5_cart_slot_device::read_rom)));
- program.unmap_write(0x2000, 0x6fff);
- }
-#endif
-
- logerror("64KRX RAM mode set to %02x\n", m_ram_mode);
-}
-
-
-//**************************************************************************
-// ADDRESS MAPS
-//**************************************************************************
-
-//-------------------------------------------------
-// ADDRESS_MAP( m5_mem )
-//-------------------------------------------------
-
-void m5_state::m5_mem(address_map &map)
-{
- map.unmap_value_high();
- map(0x0000, 0x1fff).rom().region("maincpu", 0); //monitor rom(bios)
- //map(0x0000, 0x1fff).bankr("bank1r").bankw("bank1w");
- //map(0x2000, 0x3fff).bankr("bank2r").bankw("bank2w");
- //map(0x4000, 0x5fff).bankr("bank3r").bankw("bank3w");
- //map(0x6000, 0x6fff).bankr("bank4r").bankw("bank4w");
- map(0x7000, 0x7fff).ram(); //4kb internal RAM
- //map(0x8000, 0xbfff).bankr("bank5r").bankw("bank5w");
- //map(0xc000, 0xffff).bankr("bank6r").bankw("bank6w");
-}
-
-
-//-------------------------------------------------
-// ADDRESS_MAP( m5_io )
-//-------------------------------------------------
-
-void m5_state::m5_io(address_map &map)
-{
- map.unmap_value_high();
- map.global_mask(0xff);
- map(0x00, 0x03).mirror(0x0c).rw(m_ctc, FUNC(z80ctc_device::read), FUNC(z80ctc_device::write));
- map(0x10, 0x11).mirror(0x0e).rw("tms9928a", FUNC(tms9928a_device::read), FUNC(tms9928a_device::write));
- map(0x20, 0x20).mirror(0x0f).w("sgc", FUNC(sn76489a_device::write));
- map(0x30, 0x30).mirror(0x08).portr("Y0").w(FUNC(m5_state::mem64KBF_w)); // 64KBF paging
- map(0x31, 0x31).mirror(0x08).portr("Y1");
- map(0x32, 0x32).mirror(0x08).portr("Y2");
- map(0x33, 0x33).mirror(0x08).portr("Y3");
- map(0x34, 0x34).mirror(0x08).portr("Y4");
- map(0x35, 0x35).mirror(0x08).portr("Y5");
- map(0x36, 0x36).mirror(0x08).portr("Y6");
- map(0x37, 0x37).mirror(0x08).portr("JOY");
- map(0x40, 0x40).mirror(0x0f).w("cent_data_out", FUNC(output_latch_device::write));
- map(0x50, 0x50).mirror(0x0f).rw(FUNC(m5_state::sts_r), FUNC(m5_state::com_w));
-// map(0x60, 0x63) SIO
- map(0x6c, 0x6c).rw(FUNC(m5_state::mem64KBI_r), FUNC(m5_state::mem64KBI_w)); //EM-64/64KBI paging
- map(0x70, 0x73) /*.mirror(0x0c) don't know if necessary mirror this*/ .rw(m_ppi, FUNC(i8255_device::read), FUNC(i8255_device::write));
- map(0x7f, 0x7f).w(FUNC(m5_state::mem64KRX_w)); //64KRD/64KRX paging
-}
-
-
-//-------------------------------------------------
-// ADDRESS_MAP( fd5_mem )
-//-------------------------------------------------
-
-void m5_state::fd5_mem(address_map &map)
-{
- map(0x0000, 0x3fff).rom();
- map(0x4000, 0xffff).ram();
-}
-
-
-//-------------------------------------------------
-// ADDRESS_MAP( fd5_io )
-//-------------------------------------------------
-
-void m5_state::fd5_io(address_map &map)
-{
- map.global_mask(0xff);
- map(0x00, 0x01).m(m_fdc, FUNC(upd765a_device::map));
- map(0x10, 0x10).rw(FUNC(m5_state::fd5_data_r), FUNC(m5_state::fd5_data_w));
- map(0x20, 0x20).w(FUNC(m5_state::fd5_com_w));
- map(0x30, 0x30).r(FUNC(m5_state::fd5_com_r));
- map(0x40, 0x40).w(FUNC(m5_state::fd5_ctrl_w));
- map(0x50, 0x50).w(FUNC(m5_state::fd5_tc_w));
-}
-
-
-
-//**************************************************************************
-// INPUT PORTS
-//**************************************************************************
-
-//-------------------------------------------------
-// INPUT_PORTS( m5 )
-//-------------------------------------------------
-
-static INPUT_PORTS_START( m5 )
- PORT_START("Y0")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Ctrl") PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_SHIFT_2)
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Func") PORT_CODE(KEYCODE_TAB) PORT_CHAR(UCHAR_MAMEKEY(F1))
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_MAMEKEY(RSHIFT))
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_UNUSED)
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_UNUSED)
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ')
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13)
-
- PORT_START("Y1")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!')
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('"')
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#')
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$')
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%')
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('&')
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('\'')
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('(')
-
- PORT_START("Y2")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q')
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W')
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E')
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R')
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T')
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y')
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U')
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I')
-
- PORT_START("Y3")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A')
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S')
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D')
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F')
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G')
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H')
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J')
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K')
-
- PORT_START("Y4")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z')
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X')
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C')
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V')
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B')
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N')
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M')
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<')
-
- PORT_START("Y5")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR(')')
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_0) PORT_CHAR('0')
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('=')
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('^') PORT_CHAR('~')
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>')
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?') PORT_CHAR(UCHAR_MAMEKEY(DOWN))
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("_ Triangle") PORT_CODE(KEYCODE_TILDE) PORT_CHAR('_')
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR('\\') PORT_CHAR('|') // backslash ok for m5p, shows as ¥ on m5.
-
- PORT_START("Y6")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O')
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P')
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('@') PORT_CHAR('`') PORT_CHAR(UCHAR_MAMEKEY(UP))
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR('[') PORT_CHAR('{')
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L')
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR('+') PORT_CHAR(UCHAR_MAMEKEY(LEFT))
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR(':') PORT_CHAR('*') PORT_CHAR(UCHAR_MAMEKEY(RIGHT))
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR(']') PORT_CHAR('}')
-
- PORT_START("JOY")
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT) PORT_PLAYER(1)
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP) PORT_PLAYER(1)
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT) PORT_PLAYER(1)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN) PORT_PLAYER(1)
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT) PORT_PLAYER(2)
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP) PORT_PLAYER(2)
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT) PORT_PLAYER(2)
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN) PORT_PLAYER(2)
-
- PORT_START("RESET")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Reset") PORT_CODE(KEYCODE_ESC) PORT_CHAR(UCHAR_MAMEKEY(ESC)) /* 1st line, 1st key from right! */
-
- PORT_START("DIPS")
- PORT_DIPNAME(0x01, 0x01, "KRX: BASIC[on]/MSX[off]") //switching between BASIC and MSX ROMs which share same address area
- PORT_DIPSETTING( 0x00, DEF_STR( Off ))
- PORT_DIPSETTING( 0x01, DEF_STR( On ))
- PORT_DIPNAME(0x02, 0x00, "KBI: AUTOSTART") //pages out cart and starts loading from tape
- PORT_DIPSETTING( 0x00, DEF_STR( Off ))
- PORT_DIPSETTING( 0x02, DEF_STR( On ))
- PORT_DIPNAME(0x04, 0x00, "KBI: 32kb only") //compatible with em-5
- PORT_DIPSETTING( 0x00, DEF_STR( Off ))
- PORT_DIPSETTING( 0x04, DEF_STR( On ))
-INPUT_PORTS_END
-
-//-------------------------------------------------
-// I8255 Interface
-//-------------------------------------------------
-
-u8 m5_state::ppi_pa_r()
-{
- return m_fd5_data;
-}
-
-u8 m5_state::ppi_pc_r()
-{
- /*
-
- bit description
-
- 0 ?
- 1 ?
- 2 ?
- 3
- 4 STBA
- 5
- 6 ACKA
- 7
-
- */
-
- return (
- /* FD5 bit 0-> M5 bit 2 */
- ((m_fd5_com & 0x01)<<2) |
- /* FD5 bit 2-> M5 bit 1 */
- ((m_fd5_com & 0x04)>>1) |
- /* FD5 bit 1-> M5 bit 0 */
- ((m_fd5_com & 0x02)>>1)
- );
-}
-
-void m5_state::ppi_pa_w(u8 data)
-{
- m_fd5_data = data;
-}
-
-void m5_state::ppi_pb_w(u8 data)
-{
- /*
-
- bit description
-
- 0
- 1
- 2
- 3
- 4
- 5
- 6
- 7
-
- */
-
- if (data == 0xf0)
- {
- m_fd5cpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
- m_fd5cpu->set_input_line(INPUT_LINE_RESET, CLEAR_LINE);
- }
-}
-
-void m5_state::ppi_pc_w(u8 data)
-{
- /*
-
- bit description
-
- 0
- 1
- 2
- 3 INTRA
- 4
- 5 IBFA
- 6
- 7 OBFA
-
- */
-
- m_intra = BIT(data, 3);
- m_ibfa = BIT(data, 5);
- m_obfa = BIT(data, 7);
-}
-
-//-------------------------------------------------
-// upd765_interface fdc_intf
-//-------------------------------------------------
-
-void m5_state::floppy_formats(format_registration &fr)
-{
- fr.add_mfm_containers();
- fr.add(FLOPPY_M5_FORMAT);
-}
-
-static void m5_floppies(device_slot_interface &device)
-{
- device.option_add("525dd", FLOPPY_525_DD);
-}
-
-static void m5_cart(device_slot_interface &device)
-{
- device.option_add_internal("std", M5_ROM_STD);
- device.option_add_internal("ram", M5_ROM_RAM);
-}
-
-//-------------------------------------------------
-// z80_daisy_config m5_daisy_chain
-//-------------------------------------------------
-
-static const z80_daisy_config m5_daisy_chain[] =
-{
- { "ctc" },
- { nullptr }
-};
-
-
-//-------------------------------------------------
-// BRNO mod code below
-//-------------------------------------------------
-
-
-//-------------------------------------------------
-// ADDRESS_MAP( m5_mem_brno )
-//-------------------------------------------------
-
-
-void brno_state::m5_mem_brno(address_map &map)
-{
- map.unmap_value_high();
- map(0x0000, 0xffff).view(m_ram_view);
- m_ram_view[0](0x0000, 0xffff).rw(FUNC(brno_state::ramdisk_r), FUNC(brno_state::ramdisk_w));
- map(0x0000, 0x7fff).view(m_rom_view);
- m_rom_view[0](0x0000, 0x3fff).rom().region("maincpu", 0).unmapw();
- m_rom_view[0](0x7000, 0x7fff).ram();
-}
-
-//-------------------------------------------------
-// ADDRESS_MAP( brno_io )
-//-------------------------------------------------
-void brno_state::brno_io(address_map &map)
-{
- map.unmap_value_high();
- map(0x00, 0x03).mirror(0xff0c).rw(m_ctc, FUNC(z80ctc_device::read), FUNC(z80ctc_device::write));
- map(0x10, 0x11).mirror(0xff0e).rw("tms9928a", FUNC(tms9928a_device::read), FUNC(tms9928a_device::write));
- map(0x20, 0x20).mirror(0xff0f).w("sgc", FUNC(sn76489a_device::write));
- map(0x30, 0x30).mirror(0xff00).portr("Y0");
- map(0x31, 0x31).mirror(0xff00).portr("Y1");
- map(0x32, 0x32).mirror(0xff00).portr("Y2");
- map(0x33, 0x33).mirror(0xff00).portr("Y3");
- map(0x34, 0x34).mirror(0xff00).portr("Y4");
- map(0x35, 0x35).mirror(0xff00).portr("Y5");
- map(0x36, 0x36).mirror(0xff00).portr("Y6");
- map(0x37, 0x37).mirror(0xff00).portr("JOY");
- map(0x40, 0x40).mirror(0xff0f).w("cent_data_out", FUNC(output_latch_device::write));
- map(0x50, 0x50).mirror(0xff0f).rw(FUNC(brno_state::sts_r), FUNC(brno_state::com_w));
- map(0x60, 0x61).mirror(0xff02).rw("sio", FUNC(i8251_device::read), FUNC(i8251_device::write));
- map(0x64, 0x64).select(0xf000).mirror(0x0f03).w(FUNC(brno_state::mmu_w)); // MMU - page select (ramdisk memory paging)
- map(0x68, 0x68).mirror(0xff03).w(FUNC(brno_state::ramsel_w)); // CASEN
- map(0x6c, 0x6c).mirror(0xff03).w(FUNC(brno_state::romsel_w)); // RAMEN
- map(0x70, 0x73).mirror(0xff00).rw("pio", FUNC(i8255_device::read), FUNC(i8255_device::write)); // PIO
- map(0x78, 0x7b).mirror(0xff00).rw(m_wdfdc, FUNC(wd_fdc_device_base::read), FUNC(wd_fdc_device_base::write)); // WD2797 registers -> 78 - status/cmd, 79 - track #, 7a - sector #, 7b - data
- map(0x7c, 0x7c).mirror(0xff03).w(FUNC(brno_state::fd_w)); // drive select
-}
-
-
-u8 brno_state::ramdisk_r(offs_t offset)
-{
- offset = (offset & 0x0fff) | u32(m_rammap[offset >> 12]) << 12;
- if (offset < m_ram->size())
- return m_ram->read(offset);
- else
- return 0xff;
-}
-
-void brno_state::ramdisk_w(offs_t offset, u8 data)
-{
- offset = (offset & 0x0fff) | u32(m_rammap[offset >> 12]) << 12;
- if (offset < m_ram->size())
- m_ram->write(offset, data);
-}
-
-void brno_state::mmu_w(offs_t offset, u8 data)
-{
- u8 ramcpu = offset >> 12;
- u8 rambank = ~data;
- m_rammap[ramcpu] = rambank;
-
- //logerror("RAMdisk page change(CPURAM<=BANK): &%X000<=%02X at %s\n", ramcpu, rambank, machine().describe_context());
-}
-
-void brno_state::ramsel_w(u8 data) //out 6b
-{
- // 0=access to ramdisk enabled, 0xff=ramdisk access disabled(data protection), &80=ROM2+48k RAM, &81=ROM2+4k RAM
- // Note that RAM disk is not banked in 0000-3FFF or 7000-7FFF unless ROM is disabled
- if (!BIT(data, 0))
- m_ram_view.select(0);
- else
- m_ram_view.disable();
-
- //logerror("CASEN change: out (&6b),%x\n",data);
-}
-
-void brno_state::romsel_w(u8 data) //out 6c
-{
- // 0=rom enable; 0xff=rom+sord ram disabled (ramdisk visible)
- if (!BIT(data, 0))
- m_rom_view.select(0);
- else
- m_rom_view.disable();
-
- //logerror("RAMEN change: out (&6c),%x\n",data);
-}
-
-
-//-------------------------------------------------
-// FD port 7c - Floppy select
-//-------------------------------------------------
-
-void brno_state::fd_w(u8 data)
-{
- floppy_image_device *floppy;
- m_floppy = nullptr;
- int disk = 0;
-
- floppy = m_floppy0->get_device();
- if (floppy)
- {
- if(BIT(data,0))
- {
- m_floppy= floppy;
- disk=1;
- }
- else
- {
- floppy->mon_w(1);
- }
- }
- floppy = m_floppy1->get_device();
- if (floppy)
- {
- if(BIT(data,1))
- {
- m_floppy= floppy;
- disk=2;
- }
- else
- {
- floppy->mon_w(1);
- }
- }
-
- m_wdfdc->set_floppy(m_floppy);
- if (m_floppy)
- {
- m_floppy->set_rpm(300);
- m_floppy->mon_w(0);
- logerror("Select floppy %d\n", disk);
- }
-}
-
-
-
-static void brno_floppies(device_slot_interface &device)
-{
- device.option_add("35hd", FLOPPY_35_DD);
-}
-
-
-//**************************************************************************
-// MACHINE INITIALIZATION
-//**************************************************************************
-
-//-------------------------------------------------
-// MACHINE_START( m5 )
-//-------------------------------------------------
-void m5_state::machine_start()
-{
- m_cart_ram = nullptr;
- m_cart = nullptr;
-
- // register for state saving
- save_item(NAME(m_fd5_data));
- save_item(NAME(m_fd5_com));
- save_item(NAME(m_intra));
- save_item(NAME(m_ibfa));
- save_item(NAME(m_obfa));
- save_item(NAME(m_centronics_busy));
-}
-
-void m5_state::machine_reset()
-{
- address_space &program = m_maincpu->space(AS_PROGRAM);
- std::string region_tag;
-
- //is ram/rom cart plugged in?
- if (m_cart1->exists())
- {
- if (m_cart1->get_type() > 0)
- m_cart_ram = m_cart1;
- else
- m_cart = m_cart1;
- }
-
- if (m_cart2->exists())
- {
- if (m_cart2->get_type() > 0)
- m_cart_ram = m_cart2;
- else
- m_cart = m_cart2;
- }
-
- // no cart inserted - there is nothing to do - not allowed in original Sord m5
- if (m_cart_ram == nullptr && m_cart == nullptr)
- {
- // membank("bank1r")->set_base(memregion("maincpu")->base());
- program.unmap_write(0x0000, 0x1fff);
- // program.unmap_readwrite(0x2000, 0x6fff); //if you uncomment this line Sord starts cassette loading but it is not correct on real hw
- program.unmap_readwrite(0x8000, 0xffff);
- return;
- }
-
- //cart is ram module
- if (m_cart_ram)
- {
- m_ram_type=m_cart_ram->get_type();
-
- m_cart_rom = memregion(region_tag.assign(m_cart_ram->tag()).append(M5SLOT_ROM_REGION_TAG).c_str());
- //memory_region *ram_region = memregion(region_tag.assign(m_cart_ram->tag()).append(":ram").c_str());
-
- switch (m_ram_type)
- {
- case EM_5:
- program.install_rom(0x0000, 0x1fff, memregion("maincpu")->base());
- program.unmap_write(0x0000, 0x1fff);
- program.install_readwrite_handler(0x8000, 0xffff, read8sm_delegate(*m_cart_ram, FUNC(m5_cart_slot_device::read_ram)), write8sm_delegate(*m_cart_ram, FUNC(m5_cart_slot_device::write_ram)));
- if (m_cart)
- {
- program.install_read_handler(0x2000, 0x6fff, read8sm_delegate(*m_cart, FUNC(m5_cart_slot_device::read_rom)));
- program.unmap_write(0x2000, 0x6fff);
- }
- break;
-#if 0 // FIXME: disabled for now
- case MEM64KBI:
- program.install_rom(0x0000, 0x1fff, memregion("maincpu")->base());
- program.unmap_write(0x0000, 0x1fff);
- program.install_ram(0x8000, 0xffff, ram_region->base()+0x8000);
-
- //if AUTOSTART is on then page out cart and start tape loading
- if (m_cart && ((m_DIPS->read() & 2) != 2))
- {
- program.install_read_handler(0x2000, 0x3fff, read8sm_delegate(*m_cart, FUNC(m5_cart_slot_device::read_rom)));
- program.unmap_write(0x2000, 0x3fff);
- }
- else
- program.unmap_readwrite(0x2000, 0x6fff); //monitor rom is testing this area for 0xFFs otherwise thinks there is some ROM cart plugged in
-
- break;
- case MEM64KBF:
- program.unmap_write(0x0000, 0x6fff);
- membank("bank1r")->set_base(memregion("maincpu")->base());
- membank("bank2r")->set_base(m_cart_rom->base());
- membank("bank3r")->set_base(m_cart_rom->base()+0x2000);
- membank("bank4r")->set_base(m_cart_rom->base()+0x4000);
- membank("bank5r")->set_base(ram_region->base()+0x8000); membank("bank5w")->set_base(ram_region->base()+0x8000);
- membank("bank6r")->set_base(ram_region->base()+0xc000); membank("bank6w")->set_base(ram_region->base()+0xc000);
- break;
- case MEM64KRX:
- membank("bank1r")->set_base(memregion("maincpu")->base()); membank("bank1w")->set_base(ram_region->base());
- membank("bank2r")->set_base(m_cart_rom->base()); membank("bank2w")->set_base(ram_region->base()+0x2000);
- membank("bank3r")->set_base(m_cart_rom->base()+0x2000); membank("bank3w")->set_base(ram_region->base()+0x4000);
- membank("bank4r")->set_base(ram_region->base()+0x6000); membank("bank4w")->set_base(ram_region->base()+0x6000);
-
- //page in BASIC or MSX
- if ((m_DIPS->read() & 0x01))
- {
- membank("bank5r")->set_base(m_cart_rom->base()+0x6000); membank("bank5w")->set_base(ram_region->base()+0x8000);
- membank("bank6r")->set_base(m_cart_rom->base()+0xa000); membank("bank6w")->set_base(ram_region->base()+0xc000);
- }
- else
- {
- membank("bank5r")->set_base(m_cart_rom->base()+0xe000); membank("bank5w")->set_base(ram_region->base()+0x8000);
- membank("bank6r")->set_base(m_cart_rom->base()+0x12000); membank("bank6w")->set_base(ram_region->base()+0xc000);
- }
- break;
-#endif
- default:
- program.unmap_readwrite(0x8000, 0xffff);
- }
- //I don't have idea what to do with savestates, please someone take care of it
- //m_cart_ram->save_ram();
- }
- else
- //ram cart wasn't found so if rom cart present install it
- if (m_cart)
- {
- program.install_rom(0x0000, 0x1fff, memregion("maincpu")->base());
- program.unmap_write(0x0000, 0x1fff);
- program.install_read_handler(0x2000, 0x6fff, read8sm_delegate(*m_cart, FUNC(m5_cart_slot_device::read_rom)));
- program.unmap_write(0x2000, 0x6fff);
- }
- m_ram_mode=0;
-}
-
-
-
-void brno_state::machine_start()
-{
- std::fill(std::begin(m_rammap), std::end(m_rammap), 0);
-
- save_item(NAME(m_rammap));
- save_item(NAME(m_centronics_busy));
-}
-
-void brno_state::machine_reset()
-{
- address_space &program = m_maincpu->space(AS_PROGRAM);
-
- //is ram/rom cart plugged in?
- if (m_cart1->exists())
- {
- if (m_cart1->get_type() > 0)
- m_cart_ram=m_cart1;
- else
- m_cart=m_cart1;
- }
- if (m_cart2->exists())
- {
- if (m_cart2->get_type() > 0)
- m_cart_ram=m_cart2;
- else
- m_cart=m_cart2;
- }
-
- if (m_cart)
- {
- program.install_read_handler(0x2000, 0x6fff, read8sm_delegate(*m_cart, FUNC(m5_cart_slot_device::read_rom)));
- //program.unmap_write(0x2000, 0x6fff);
- }
-
- // enable ROM1+ROM2
- m_rom_view.select(0);
- m_ram_view.disable();
-
- floppy_image_device *floppy = nullptr;
- floppy = m_floppy0->get_device();
- m_wdfdc->set_floppy(floppy);
- floppy->mon_w(0);
-}
-
-//**************************************************************************
-// MACHINE CONFIGURATION
-//**************************************************************************
-
-//-------------------------------------------------
-// machine_config( m5 )
-//-------------------------------------------------
-
-void m5_state::m5(machine_config &config)
-{
- // basic machine hardware
- Z80(config, m_maincpu, 10.738635_MHz_XTAL / 3);
- m_maincpu->set_addrmap(AS_PROGRAM, &m5_state::m5_mem);
- m_maincpu->set_addrmap(AS_IO, &m5_state::m5_io);
- m_maincpu->set_daisy_config(m5_daisy_chain);
-
- Z80(config, m_fd5cpu, 16_MHz_XTAL / 4);
- m_fd5cpu->set_addrmap(AS_PROGRAM, &m5_state::fd5_mem);
- m_fd5cpu->set_addrmap(AS_IO, &m5_state::fd5_io);
-
- // sound hardware
- SPEAKER(config, "mono").front_center();
- SN76489A(config, "sgc", 10.738635_MHz_XTAL / 3).add_route(ALL_OUTPUTS, "mono", 1.00);
-
- // devices
- Z80CTC(config, m_ctc, 10.738635_MHz_XTAL / 3);
- m_ctc->intr_callback().set_inputline(m_maincpu, INPUT_LINE_IRQ0);
- m_ctc->set_clk<2>(10.738635_MHz_XTAL / 24);
- // CK0 = EXINT, CK1 = GND, CK2 = TCK, CK3 = VDP INT
- // ZC2 = EXCLK
-
- CENTRONICS(config, m_centronics, centronics_devices, "printer");
- m_centronics->busy_handler().set(FUNC(m5_state::write_centronics_busy));
-
- output_latch_device &cent_data_out(OUTPUT_LATCH(config, "cent_data_out"));
- m_centronics->set_output_latch(cent_data_out);
-
- CASSETTE(config, m_cassette);
- m_cassette->set_formats(sordm5_cassette_formats);
- m_cassette->set_default_state(CASSETTE_PLAY);
- m_cassette->add_route(ALL_OUTPUTS, "mono", 0.05);
- m_cassette->set_interface("m5_cass");
-
- I8255(config, m_ppi);
- m_ppi->in_pa_callback().set(FUNC(m5_state::ppi_pa_r));
- m_ppi->out_pa_callback().set(FUNC(m5_state::ppi_pa_w));
- m_ppi->out_pb_callback().set(FUNC(m5_state::ppi_pb_w));
- m_ppi->in_pc_callback().set(FUNC(m5_state::ppi_pc_r));
- m_ppi->out_pc_callback().set(FUNC(m5_state::ppi_pc_w));
-
- UPD765A(config, m_fdc, 16_MHz_XTAL / 4, true, true); // clocked by SED9420C
- m_fdc->intrq_wr_callback().set_inputline(m_fd5cpu, INPUT_LINE_IRQ0);
- FLOPPY_CONNECTOR(config, "upd765:0", m5_floppies, "525dd", m5_state::floppy_formats);
-
- // cartridge
- M5_CART_SLOT(config, m_cart1, m5_cart, nullptr);
- M5_CART_SLOT(config, m_cart2, m5_cart, nullptr);
-
- // software lists
- SOFTWARE_LIST(config, "cart_list").set_original("m5_cart");
- SOFTWARE_LIST(config, "cass_list").set_original("m5_cass");
- //SOFTWARE_LIST(config, "flop_list").set_original("m5_flop");
-
- // internal ram
- //68K is not possible, 'cos internal ram always overlays any expansion memory in that area
- //RAM(config, m_ram).set_default_size("4K").set_extra_options("36K,64K");
-}
-
-
-//-------------------------------------------------
-// machine_config( ntsc )
-//-------------------------------------------------
-
-void m5_state::ntsc(machine_config &config)
-{
- m5(config);
- // video hardware
- tms9928a_device &vdp(TMS9928A(config, "tms9928a", 10.738635_MHz_XTAL));
- vdp.set_screen("screen");
- vdp.set_vram_size(0x4000);
- vdp.int_callback().set(m_ctc, FUNC(z80ctc_device::trg3)).invert();
- SCREEN(config, "screen", SCREEN_TYPE_RASTER);
-}
-
-
-//-------------------------------------------------
-// machine_config( pal )
-//-------------------------------------------------
-
-void m5_state::pal(machine_config &config)
-{
- m5(config);
- // video hardware
- tms9929a_device &vdp(TMS9929A(config, "tms9928a", 10.738635_MHz_XTAL));
- vdp.set_screen("screen");
- vdp.set_vram_size(0x4000);
- vdp.int_callback().set(m_ctc, FUNC(z80ctc_device::trg3)).invert();
- SCREEN(config, "screen", SCREEN_TYPE_RASTER);
-}
-
-//-------------------------------------------------
-// machine_config( m5p_brno )
-//-------------------------------------------------
-
-
-void brno_state::brno(machine_config &config)
-{
- m5(config);
-
- // basic machine hardware
- m_maincpu->set_addrmap(AS_PROGRAM, &brno_state::m5_mem_brno);
- m_maincpu->set_addrmap(AS_IO, &brno_state::brno_io);
-
-
- //remove devices used for fd5 floppy
- config.device_remove("z80fd5");
- config.device_remove("ppi");
- config.device_remove("upd765");
-
- // video hardware
- tms9929a_device &vdp(TMS9929A(config, "tms9928a", 10.738635_MHz_XTAL));
- vdp.set_screen("screen");
- vdp.set_vram_size(0x4000);
- vdp.int_callback().set(m_ctc, FUNC(z80ctc_device::trg3)).invert();
- SCREEN(config, "screen", SCREEN_TYPE_RASTER);
-
- // RAM disk (maximum is 1024kB 256x 4kB banks)
- RAM(config, m_ram).set_default_size("512K").set_extra_options("256K,768K,1M");
-
- i8251_device &sio(I8251(config, "sio", 10.738635_MHz_XTAL / 3));
- sio.txd_handler().set("serial", FUNC(rs232_port_device::write_txd));
- sio.rts_handler().set("serial", FUNC(rs232_port_device::write_rts));
-
- rs232_port_device &serial(RS232_PORT(config, "serial", default_rs232_devices, nullptr));
- serial.rxd_handler().set("sio", FUNC(i8251_device::write_rxd));
- serial.cts_handler().set("sio", FUNC(i8251_device::write_cts));
-
- m_ctc->zc_callback<2>().set("sio", FUNC(i8251_device::write_txc));
- m_ctc->zc_callback<2>().append("sio", FUNC(i8251_device::write_rxc));
-
- I8255(config, "pio");
-
- // floppy
- WD2797(config, m_wdfdc, 4_MHz_XTAL / 4);
- FLOPPY_CONNECTOR(config, m_floppy0, brno_floppies, "35hd", floppy_image_device::default_mfm_floppy_formats).enable_sound(true);
- FLOPPY_CONNECTOR(config, m_floppy1, brno_floppies, "35hd", floppy_image_device::default_mfm_floppy_formats).enable_sound(true);
- // only one floppy drive
- //config.device_remove("wd:1");
-
- //SNAPSHOT(config, "snapshot", "rmd", 0).set_load_callback(brno_state::snapshot_cb));
-
- // software list
- SOFTWARE_LIST(config, "flop_list").set_original("m5_flop");
-}
-
-
-//**************************************************************************
-// ROMS
-//**************************************************************************
-
-//-------------------------------------------------
-// ROM( m5 )
-//-------------------------------------------------
-
-ROM_START( m5 )
- ROM_REGION( 0x7000, "maincpu", ROMREGION_ERASEFF )
- ROM_LOAD( "sordjap.ic21", 0x0000, 0x2000, CRC(92cf9353) SHA1(b0a4b3658fde68cb1f344dfb095bac16a78e9b3e) )
-
- ROM_REGION( 0x4000, "z80fd5", 0 )
- ROM_LOAD( "sordfd5.rom", 0x0000, 0x4000, CRC(7263bbc5) SHA1(b729500d3d2b2e807d384d44b76ea5ad23996f4a))
-ROM_END
-
-
-//-------------------------------------------------
-// ROM( m5p )
-//-------------------------------------------------
-
-ROM_START( m5p )
- ROM_REGION( 0x7000, "maincpu", ROMREGION_ERASEFF )
- ROM_LOAD( "sordint.ic21", 0x0000, 0x2000, CRC(78848d39) SHA1(ac042c4ae8272ad6abe09ae83492ef9a0026d0b2) )
-
- ROM_REGION( 0x4000, "z80fd5", 0 )
- ROM_LOAD( "sordfd5.rom", 0x0000, 0x4000, CRC(7263bbc5) SHA1(b729500d3d2b2e807d384d44b76ea5ad23996f4a))
-ROM_END
-
-//-------------------------------------------------
-// ROM( brno )
-//-------------------------------------------------
-
-ROM_START( m5p_brno )
- ROM_REGION( 0x4000, "maincpu", 0 )
- ROM_LOAD( "sordint.ic21", 0x0000, 0x2000, CRC(78848d39) SHA1(ac042c4ae8272ad6abe09ae83492ef9a0026d0b2)) // monitor rom
- ROM_LOAD( "brno_win.rom", 0x2000, 0x2000, CRC(f4cfb2ee) SHA1(23f41d2d9ac915545409dd0163f3dc298f04eea2)) //windows
- //ROM_LOAD( "brno_rom12.rom", 0x2000, 0x4000, CRC(cac52406) SHA1(91f6ba97e85a2b3a317689635d425ee97413bbe3)) //windows+BI
- //ROM_LOAD( "brno_boot.rom", 0x2000, 0xd80, CRC(60008729) SHA1(fb26e2ae9f74b0ae0d723b417a038a8ef3d72782))
-ROM_END
-
-//**************************************************************************
-// SYSTEM DRIVERS
-//**************************************************************************
-
-// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
-COMP( 1983, m5, 0, 0, ntsc, m5, m5_state, empty_init, "Sord", "m.5 (Japan)", 0 )
-COMP( 1983, m5p, m5, 0, pal, m5, m5_state, empty_init, "Sord", "m.5 (Europe)", 0 )
-COMP( 1983, m5p_brno, m5, 0, brno, m5, brno_state, empty_init, "Sord", "m.5 (Europe) BRNO mod", 0 )