summaryrefslogtreecommitdiffstatshomepage
path: root/src/mess/drivers/fb01.c
diff options
context:
space:
mode:
author Wilbert Pol <wilbert@jdg.info>2014-06-11 20:52:14 +0000
committer Wilbert Pol <wilbert@jdg.info>2014-06-11 20:52:14 +0000
commit938b97207f792f3b6af951ffb4ea3e902f3ced93 (patch)
treed4ad66e2c26806db725548f867d653e7b0847865 /src/mess/drivers/fb01.c
parent9a575cad91d511de23f584f5307baf7290d6dabe (diff)
(MESS) Added Yamaha FB-01
I haven't been able to test if this makes the expected sounds when a midi keyboard is hooked up the midi-in port of this device.
Diffstat (limited to 'src/mess/drivers/fb01.c')
-rw-r--r--src/mess/drivers/fb01.c159
1 files changed, 159 insertions, 0 deletions
diff --git a/src/mess/drivers/fb01.c b/src/mess/drivers/fb01.c
new file mode 100644
index 00000000000..50f9a3efcf6
--- /dev/null
+++ b/src/mess/drivers/fb01.c
@@ -0,0 +1,159 @@
+/***************************************************************************
+
+ Yamaha FB-01
+
+***************************************************************************/
+
+#include "emu.h"
+#include "cpu/z80/z80.h"
+#include "sound/2151intf.h"
+#include "machine/nvram.h"
+#include "video/hd44780.h"
+#include "machine/i8251.h"
+#include "machine/clock.h"
+#include "bus/midi/midi.h"
+#include "fb01.lh"
+
+
+class fb01_state : public driver_device
+{
+public:
+ fb01_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag)
+ , m_upd71051(*this, "upd71051")
+ , m_midi_thru(*this, "mdthru")
+ {
+ }
+
+ DECLARE_WRITE_LINE_MEMBER(write_usart_clock);
+ DECLARE_WRITE_LINE_MEMBER(midi_in);
+
+private:
+ required_device<i8251_device> m_upd71051;
+ required_device<midi_port_device> m_midi_thru;
+};
+
+
+static ADDRESS_MAP_START(fb01_mem, AS_PROGRAM, 8, fb01_state)
+ AM_RANGE(0x0000, 0x7fff) AM_ROM
+ AM_RANGE(0x8000, 0xbfff) AM_RAM AM_SHARE("nvram") // 2 * 8KB S-RAM
+ADDRESS_MAP_END
+
+
+static ADDRESS_MAP_START(fb01_io, AS_IO, 8, fb01_state)
+ ADDRESS_MAP_UNMAP_HIGH
+ ADDRESS_MAP_GLOBAL_MASK(0xff)
+ // 00-01 YM2164
+ AM_RANGE(0x00, 0x00) AM_DEVWRITE("ym2164", ym2151_device, register_w)
+ AM_RANGE(0x01, 0x01) AM_DEVREADWRITE("ym2164", ym2151_device, status_r, data_w)
+
+ // 10-11 USART uPD71051C 4MHz & 4MHz / 8
+ AM_RANGE(0x10, 0x10) AM_DEVREADWRITE("upd71051", i8251_device, data_r, data_w)
+ AM_RANGE(0x11, 0x11) AM_DEVREADWRITE("upd71051", i8251_device, status_r, control_w)
+
+ // 20 PANEL SWITCH
+ AM_RANGE(0x20, 0x20) AM_READ_PORT("PANEL")
+
+ // 30-31 HD44780A
+ AM_RANGE(0x30, 0x30) AM_DEVREADWRITE("hd44780", hd44780_device, control_read, control_write)
+ AM_RANGE(0x31, 0x31) AM_DEVREADWRITE("hd44780", hd44780_device, data_read, data_write)
+ADDRESS_MAP_END
+
+
+static INPUT_PORTS_START( fb01 )
+ PORT_START("PANEL")
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("System Set Up")
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Inst Select")
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Inst Assign")
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Inst Function")
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Voice Function")
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Voice Select")
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("-1/No")
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("+1/Yes")
+INPUT_PORTS_END
+
+
+WRITE_LINE_MEMBER(fb01_state::write_usart_clock)
+{
+ m_upd71051->write_txc(state);
+ m_upd71051->write_rxc(state);
+}
+
+
+WRITE_LINE_MEMBER(fb01_state::midi_in)
+{
+ m_midi_thru->write_txd(state);
+ m_upd71051->write_rxd(state);
+}
+
+
+static HD44780_PIXEL_UPDATE(fb01_pixel_update)
+{
+ if ( pos < 8 && line < 2 )
+ {
+ bitmap.pix16(y, line*6*8 + pos*6 + x) = state;
+ }
+}
+
+
+static MACHINE_CONFIG_START( fb01, fb01_state )
+ /* basic machine hardware */
+ MCFG_CPU_ADD("maincpu", Z80, XTAL_12MHz/2)
+ MCFG_CPU_PROGRAM_MAP(fb01_mem)
+ MCFG_CPU_IO_MAP(fb01_io)
+
+ /* video hardware */
+ MCFG_SCREEN_ADD("screen", LCD)
+ MCFG_SCREEN_REFRESH_RATE(50)
+ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
+ MCFG_SCREEN_SIZE(6*16, 9)
+ MCFG_SCREEN_VISIBLE_AREA(0, 6*16-1, 0, 9-1)
+ MCFG_DEFAULT_LAYOUT(layout_lcd)
+ MCFG_SCREEN_UPDATE_DEVICE("hd44780", hd44780_device, screen_update)
+ MCFG_SCREEN_PALETTE("palette")
+
+ MCFG_DEFAULT_LAYOUT( layout_fb01 )
+
+ MCFG_PALETTE_ADD_BLACK_AND_WHITE("palette")
+
+ MCFG_HD44780_ADD("hd44780")
+ MCFG_HD44780_LCD_SIZE(2, 8) // 2x8 displayed as 1x16
+ MCFG_HD44780_PIXEL_UPDATE_CB(fb01_pixel_update)
+
+ MCFG_DEVICE_ADD("upd71051", I8251, XTAL_4MHz)
+ MCFG_I8251_RXRDY_HANDLER(INPUTLINE("maincpu", INPUT_LINE_IRQ0)) MCFG_DEVCB_XOR(1) // inverted -> Z80 INT
+ MCFG_I8251_TXRDY_HANDLER(INPUTLINE("maincpu", INPUT_LINE_IRQ0)) MCFG_DEVCB_XOR(1) // inverted -> Z80 INT
+ MCFG_I8251_TXD_HANDLER(DEVWRITELINE("mdout", midi_port_device, write_txd))
+
+ MCFG_DEVICE_ADD("usart_clock", CLOCK, XTAL_4MHz / 8) // 500KHz
+ MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(fb01_state, write_usart_clock))
+
+ MCFG_MIDI_PORT_ADD("mdin", midiin_slot, "midiin")
+ MCFG_MIDI_RX_HANDLER(WRITELINE(fb01_state, midi_in))
+
+ MCFG_MIDI_PORT_ADD("mdout", midiout_slot, "midiout")
+
+ MCFG_MIDI_PORT_ADD("mdthru", midiout_slot, "midiout")
+
+ MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
+ MCFG_YM2151_ADD("ym2164", XTAL_4MHz)
+ MCFG_YM2151_IRQ_HANDLER(INPUTLINE("maincpu", INPUT_LINE_IRQ0))
+ MCFG_SOUND_ROUTE(0, "lspeaker", 1.00)
+ MCFG_SOUND_ROUTE(1, "rspeaker", 1.00)
+
+ MCFG_NVRAM_ADD_0FILL("nvram")
+MACHINE_CONFIG_END
+
+
+/* ROM definition */
+ROM_START( fb01 )
+ ROM_REGION( 0x8000, "maincpu", 0 )
+ ROM_LOAD("fb01.ic11", 0, 0x8000, CRC(7357e9a4) SHA1(049c482d6c91b7e2846757dd0f5138e0d8b687f0))
+ROM_END
+
+
+/* Driver */
+
+/* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME FLAGS */
+CONS( 1986, fb01, 0, 0, fb01, fb01, driver_device, 0, "Yamaha", "FB-01", GAME_NOT_WORKING )
+