trunk/src/emu/bus/msx_cart/bm_012.c
| r0 | r30879 | |
| 1 | /*********************************************************************************** |
| 2 | |
| 3 | Emulation for the MSX BM-012 Midi cartridge that was sold together with Midisaurus. |
| 4 | |
| 5 | TODO: |
| 6 | - hook up all the other signals for the CTC, SIO |
| 7 | - which type of SIO hookup is used? tmpz84c015af supports SIO/0, SIO/1, and SIO/2 |
| 8 | - since the SIO signals are not hooked up, the midi in/thru/out ports are also not |
| 9 | implemented yet |
| 10 | - proper irq handling taking the irq priority into account is not implemented |
| 11 | - the hookup between 2 PIOs is educated guess work; it could be incorrect |
| 12 | |
| 13 | ***********************************************************************************/ |
| 14 | |
| 15 | #include "emu.h" |
| 16 | #include "bm_012.h" |
| 17 | #include "cpu/z80/z80.h" |
| 18 | |
| 19 | |
| 20 | const device_type MSX_CART_BM_012 = &device_creator<msx_cart_bm_012>; |
| 21 | |
| 22 | |
| 23 | msx_cart_bm_012::msx_cart_bm_012(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 24 | : device_t(mconfig, MSX_CART_BM_012, "MSX Cartridge - BM-012", tag, owner, clock, "msx_cart_bm_012", __FILE__) |
| 25 | , msx_cart_interface(mconfig, *this) |
| 26 | , m_tmpz84c015af_pio(*this, "tmpz84_pio") |
| 27 | , m_tmpz84c015af_ctc(*this, "tmpz84_ctc") |
| 28 | , m_tmpz84c015af_sio(*this, "tmpz84_sio") |
| 29 | , m_irq_priority(0) |
| 30 | , m_bm012_pio(*this, "bm012_pio") |
| 31 | { |
| 32 | } |
| 33 | |
| 34 | |
| 35 | static ADDRESS_MAP_START( bm_012_memory_map, AS_PROGRAM, 8, msx_cart_bm_012 ) |
| 36 | AM_RANGE(0x0000, 0x7fff) AM_ROM |
| 37 | AM_RANGE(0xe000, 0xffff) AM_RAM |
| 38 | ADDRESS_MAP_END |
| 39 | |
| 40 | |
| 41 | static ADDRESS_MAP_START( bm_012_io_map, AS_IO, 8, msx_cart_bm_012 ) |
| 42 | ADDRESS_MAP_UNMAP_HIGH |
| 43 | ADDRESS_MAP_GLOBAL_MASK(0xff) |
| 44 | |
| 45 | // 10-13 - CTC channels 0-3 |
| 46 | AM_RANGE(0x10, 0x13) AM_DEVREADWRITE("tmpz84_ctc", z80ctc_device, read, write) |
| 47 | |
| 48 | // 18-1B - SIO |
| 49 | AM_RANGE(0x18, 0x1b) AM_DEVREADWRITE("tmpz84_sio", z80dart_device, ba_cd_r, ba_cd_w) |
| 50 | |
| 51 | // 1C-1F - PIO |
| 52 | AM_RANGE(0x1c, 0x1f) AM_DEVREADWRITE("tmpz84_pio", z80pio_device, read_alt, write_alt) |
| 53 | |
| 54 | // F0-F1 - WDT |
| 55 | // F4 - IRQ priority |
| 56 | AM_RANGE(0xf4, 0xf4) AM_WRITE(tmpz84c015af_f4_w) |
| 57 | ADDRESS_MAP_END |
| 58 | |
| 59 | |
| 60 | static const z80_daisy_config bm_012_daisy_chain[] = |
| 61 | { |
| 62 | { "tmpz84_pio" }, |
| 63 | { "tmpz84_sio" }, |
| 64 | { "tmpz84_ctc" }, |
| 65 | { NULL } |
| 66 | }; |
| 67 | |
| 68 | |
| 69 | static MACHINE_CONFIG_FRAGMENT( msx_cart_bm_012 ) |
| 70 | // 12MHz XTAL @ X1 |
| 71 | // Toshiba TMPZ84C015AF-6 (@U5) components: |
| 72 | // - Z80 |
| 73 | // - CTC |
| 74 | // - SIO |
| 75 | // - PIO |
| 76 | // - CGC |
| 77 | // - WDT |
| 78 | MCFG_CPU_ADD("tmpz84_cpu", Z80, XTAL_12MHz/2) /* 6 MHz */ |
| 79 | MCFG_CPU_PROGRAM_MAP(bm_012_memory_map) |
| 80 | MCFG_CPU_IO_MAP(bm_012_io_map) |
| 81 | MCFG_CPU_CONFIG(bm_012_daisy_chain) |
| 82 | |
| 83 | MCFG_DEVICE_ADD("tmpz84_pio", Z80PIO, XTAL_12MHz/2) |
| 84 | MCFG_Z80PIO_OUT_INT_CB(INPUTLINE("tmpz84_cpu", INPUT_LINE_IRQ0)) |
| 85 | MCFG_Z80PIO_IN_PA_CB(DEVREAD8("bm012_pio", z80pio_device, pa_r)) |
| 86 | MCFG_Z80PIO_OUT_PA_CB(DEVWRITE8("bm012_pio", z80pio_device, pa_w)) |
| 87 | MCFG_Z80PIO_IN_PB_CB(DEVREAD8("bm012_pio", z80pio_device, pb_r)) |
| 88 | MCFG_Z80PIO_OUT_PB_CB(DEVWRITE8("bm012_pio", z80pio_device, pb_w)) |
| 89 | MCFG_Z80PIO_OUT_BRDY_CB(DEVWRITELINE("bm012_pio", z80pio_device, strobe_b)) |
| 90 | |
| 91 | MCFG_DEVICE_ADD("tmpz84_ctc", Z80CTC, XTAL_12MHz/2) |
| 92 | MCFG_Z80CTC_INTR_CB(INPUTLINE("tmpz84_cpu", INPUT_LINE_IRQ0)) |
| 93 | |
| 94 | MCFG_Z80SIO0_ADD("tmpz84_sio", XTAL_12MHz/2, 0, 0, 0, 0) |
| 95 | MCFG_Z80DART_OUT_INT_CB(INPUTLINE("tmpz84_cpu", INPUT_LINE_IRQ0)) |
| 96 | |
| 97 | // Sony CXK5864BSP-10L (8KB ram) |
| 98 | // Sharp LH0081A Z80A-PIO-0 - For communicating between the MSX and the TMP |
| 99 | MCFG_DEVICE_ADD("bm012_pio", Z80PIO, XTAL_3_579545MHz) // ????? |
| 100 | MCFG_Z80PIO_OUT_PA_CB(DEVWRITE8("tmpz84_pio", z80pio_device, pa_w)) |
| 101 | MCFG_Z80PIO_IN_PA_CB(DEVREAD8("tmpz84_pio", z80pio_device, pa_r)) |
| 102 | MCFG_Z80PIO_OUT_PB_CB(DEVWRITE8("tmpz84_pio", z80pio_device, pb_w)) |
| 103 | MCFG_Z80PIO_IN_PB_CB(DEVREAD8("tmpz84_pio", z80pio_device, pb_r)) |
| 104 | MCFG_Z80PIO_OUT_BRDY_CB(DEVWRITELINE("tmpz84_pio", z80pio_device, strobe_b)) |
| 105 | |
| 106 | MACHINE_CONFIG_END |
| 107 | |
| 108 | |
| 109 | machine_config_constructor msx_cart_bm_012::device_mconfig_additions() const |
| 110 | { |
| 111 | return MACHINE_CONFIG_NAME( msx_cart_bm_012 ); |
| 112 | } |
| 113 | |
| 114 | |
| 115 | ROM_START( msx_cart_bm_012 ) |
| 116 | ROM_REGION(0x8000, "tmpz84_cpu", 0) |
| 117 | // The rom chip at U4 is a 27256, but it contains the same 8KB duplicated 4 times |
| 118 | ROM_LOAD("midi_v1.00.u4", 0x0, 0x8000, CRC(840c9e74) SHA1(6d07637ad3a61b509221ed4650eed18442371010)) |
| 119 | ROM_END |
| 120 | |
| 121 | |
| 122 | const rom_entry *msx_cart_bm_012::device_rom_region() const |
| 123 | { |
| 124 | return ROM_NAME( msx_cart_bm_012 ); |
| 125 | } |
| 126 | |
| 127 | |
| 128 | void msx_cart_bm_012::device_start() |
| 129 | { |
| 130 | // Install IO read/write handlers |
| 131 | address_space &space = machine().device<cpu_device>("maincpu")->space(AS_IO); |
| 132 | space.install_write_handler(0x70, 0x73, write8_delegate(FUNC(z80pio_device::write_alt), m_bm012_pio.target())); |
| 133 | space.install_read_handler(0x70, 0x73, read8_delegate(FUNC(z80pio_device::read_alt), m_bm012_pio.target())); |
| 134 | } |
| 135 | |
| 136 | |
| 137 | void msx_cart_bm_012::device_reset() |
| 138 | { |
| 139 | } |
| 140 | |
| 141 | |
| 142 | WRITE8_MEMBER(msx_cart_bm_012::tmpz84c015af_f4_w) |
| 143 | { |
| 144 | m_irq_priority = data; |
| 145 | } |
| 146 | |
| 147 | |