mirror of
https://github.com/holub/mame
synced 2025-06-01 18:41:47 +03:00
luna_68k: additional board stubs and firmware [Plamen Mihaylov]
This commit is contained in:
parent
d06b901a49
commit
2af1193de4
@ -38,8 +38,22 @@
|
||||
|
||||
// busses and connectors
|
||||
#include "bus/rs232/rs232.h"
|
||||
#include "bus/nscsi/hd.h"
|
||||
|
||||
#include "debugger.h"
|
||||
// ioc2
|
||||
#include "cpu/m68000/m68000.h"
|
||||
#include "machine/hd63450.h"
|
||||
#include "machine/mb87030.h"
|
||||
#include "machine/wd_fdc.h"
|
||||
#include "machine/z80scc.h"
|
||||
#include "machine/z8536.h"
|
||||
|
||||
// gpu
|
||||
#include "cpu/m68000/m68020.h"
|
||||
#include "machine/mc68681.h"
|
||||
#include "machine/mc68901.h"
|
||||
#include "video/bt45x.h"
|
||||
#include "machine/nvram.h"
|
||||
|
||||
#define VERBOSE 0
|
||||
#include "logmacro.h"
|
||||
@ -58,11 +72,24 @@ public:
|
||||
, m_stc(*this, "stc")
|
||||
, m_serial(*this, "serial%u", 0U)
|
||||
, m_eprom(*this, "eprom")
|
||||
// ioc2
|
||||
, m_ioc_cpu(*this, "ioc")
|
||||
, m_ioc_dma(*this, "dma%u", 0U)
|
||||
, m_ioc_spc(*this, "scsi%u:7:spc", 0U)
|
||||
, m_ioc_fdc(*this, "fdc")
|
||||
, m_ioc_scc(*this, "scc")
|
||||
, m_ioc_cio(*this, "cio")
|
||||
// gpu
|
||||
, m_gpu_cpu(*this, "gpu")
|
||||
, m_gpu_dac(*this, "dac")
|
||||
, m_gpu_mfp(*this, "mfp")
|
||||
, m_gpu_tty(*this, "tty")
|
||||
, m_gpu_duart(*this, "duart%u", 0U)
|
||||
{
|
||||
}
|
||||
|
||||
// machine config
|
||||
void luna(machine_config &config);
|
||||
void init();
|
||||
|
||||
protected:
|
||||
// driver_device overrides
|
||||
@ -73,14 +100,17 @@ protected:
|
||||
void cpu_map(address_map &map) ATTR_COLD;
|
||||
void cpu_autovector_map(address_map &map) ATTR_COLD;
|
||||
|
||||
// machine config
|
||||
void common(machine_config &config);
|
||||
void ioc_cpu_map(address_map &map);
|
||||
void gpu_cpu_map(address_map &map);
|
||||
|
||||
private:
|
||||
u32 bus_error_r()
|
||||
u32 bus_error_r(offs_t offset)
|
||||
{
|
||||
if (!machine().side_effects_disabled())
|
||||
{
|
||||
LOG("bus_error_r 0x%x (%s)\n", offset << 2, machine().describe_context());
|
||||
m_cpu->set_input_line(M68K_LINE_BUSERROR, ASSERT_LINE);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -94,11 +124,22 @@ private:
|
||||
required_device_array<rs232_port_device, 2> m_serial;
|
||||
|
||||
required_region_ptr<u32> m_eprom;
|
||||
};
|
||||
|
||||
void luna_68k_state::init()
|
||||
{
|
||||
}
|
||||
// ioc2
|
||||
required_device<m68000_device> m_ioc_cpu;
|
||||
required_device_array<hd63450_device, 2> m_ioc_dma;
|
||||
required_device_array<mb89352_device, 2> m_ioc_spc;
|
||||
required_device<mb8877_device> m_ioc_fdc;
|
||||
required_device<z80scc_device> m_ioc_scc;
|
||||
required_device<z8536_device> m_ioc_cio;
|
||||
|
||||
// gpu
|
||||
required_device<m68020fpu_device> m_gpu_cpu;
|
||||
required_device<bt458_device> m_gpu_dac;
|
||||
required_device<mc68901_device> m_gpu_mfp;
|
||||
required_device<rs232_port_device> m_gpu_tty;
|
||||
required_device_array<mc68681_device, 2> m_gpu_duart;
|
||||
};
|
||||
|
||||
void luna_68k_state::machine_start()
|
||||
{
|
||||
@ -112,7 +153,12 @@ void luna_68k_state::machine_reset()
|
||||
|
||||
void luna_68k_state::cpu_map(address_map &map)
|
||||
{
|
||||
//map(0x20280080, 0x20280083).lr32([]() { return 1; }, "?");
|
||||
|
||||
map(0x30000000, 0x3fffffff).r(FUNC(luna_68k_state::bus_error_r));
|
||||
map(0x30000d00, 0x30000d1f).m(m_ioc_spc[0], FUNC(mb89352_device::map)).umask32(0x00ff00ff);
|
||||
map(0x30000d20, 0x30000d3f).m(m_ioc_spc[1], FUNC(mb89352_device::map)).umask32(0x00ff00ff);
|
||||
|
||||
map(0x40000000, 0x4001ffff).rom().region("eprom", 0);
|
||||
|
||||
map(0x50000000, 0x50000007).rw(m_sio, FUNC(upd7201_device::ba_cd_r), FUNC(upd7201_device::ba_cd_w)).umask32(0xff00ff00);
|
||||
@ -122,6 +168,9 @@ void luna_68k_state::cpu_map(address_map &map)
|
||||
map(0x70000000, 0x70000003).lr32([]() { return 0x000000fc; }, "sw3"); // FIXME: possibly CPU board DIP switch? (1=UP)
|
||||
map(0x78000000, 0x78000003).lw32(
|
||||
[this](u32 data) { m_cpu->space(0).install_ram(0, m_ram->mask(), m_ram->pointer()); }, "ram_size"); // FIXME: ram size/enable?
|
||||
|
||||
map(0xd01f8000, 0xd01f8003).r(FUNC(luna_68k_state::bus_error_r)); // acrtc graphics
|
||||
map(0xe1f00038, 0xe1f0003b).nopr(); // jrc graphics
|
||||
}
|
||||
|
||||
void luna_68k_state::cpu_autovector_map(address_map &map)
|
||||
@ -135,11 +184,51 @@ void luna_68k_state::cpu_autovector_map(address_map &map)
|
||||
map(0xffffffff, 0xffffffff).lr8(NAME([]() { return m68000_base_device::autovector(7); }));
|
||||
}
|
||||
|
||||
void luna_68k_state::ioc_cpu_map(address_map &map)
|
||||
{
|
||||
// am8530h-6pc scc @ 4.9152MHz
|
||||
// mb89352 x 2 scsi
|
||||
// mb8877a
|
||||
// hd63450ps10 x 2 dma
|
||||
// z0853606psc cio
|
||||
|
||||
map(0x000000, 0x03ffff).ram().mirror(0x100000); // HM62256LP-10x8 (32768x8) - 256KB
|
||||
map(0x000000, 0x000fff).rom().region("ioc", 0);
|
||||
map(0xfc0000, 0xfcffff).rom().region("ioc", 0);
|
||||
map(0xfe0000, 0xfe0fff).rom().region("ioc", 0);
|
||||
|
||||
map(0xfef400, 0xfef400).rw(m_ioc_scc, FUNC(z80scc_device::da_r), FUNC(z80scc_device::da_w));
|
||||
map(0xfef401, 0xfef401).rw(m_ioc_scc, FUNC(z80scc_device::ca_r), FUNC(z80scc_device::ca_w));
|
||||
map(0xfef402, 0xfef402).rw(m_ioc_scc, FUNC(z80scc_device::db_r), FUNC(z80scc_device::db_w));
|
||||
map(0xfef403, 0xfef403).rw(m_ioc_scc, FUNC(z80scc_device::cb_r), FUNC(z80scc_device::cb_w));
|
||||
}
|
||||
|
||||
void luna_68k_state::gpu_cpu_map(address_map &map)
|
||||
{
|
||||
map(0x00000000, 0x0003ffff).rom().region("gpu", 0);
|
||||
|
||||
map(0x80000000, 0x80bfffff).ram(); // M5M41000BJ 1mb (1m x 1) dynamic RAM (8x12) - 12MB
|
||||
|
||||
map(0xb0080000, 0xb008001f).rw(m_gpu_mfp, FUNC(mc68901_device::read), FUNC(mc68901_device::write));
|
||||
map(0xb0081000, 0xb008100f).rw(m_gpu_duart[0], FUNC(mc68681_device::read), FUNC(mc68681_device::write));
|
||||
map(0xb0082000, 0xb008200f).rw(m_gpu_duart[1], FUNC(mc68681_device::read), FUNC(mc68681_device::write));
|
||||
|
||||
map(0xb0090000, 0xb00900ff).ram().share("gpu_nvram"); // MBM2212-20 256x4 NVRAM x 2 - 256B
|
||||
|
||||
map(0xc0000000, 0xc000ffff).ram(); // M5M5178P-55 64kb (8k x 8) static RAM (2x4) - 64kB
|
||||
map(0xf0000000, 0xf003ffff).ram(); // M5M5258P-35 256kb (64k x 4) static RAM (x8) - 256kB
|
||||
}
|
||||
|
||||
static DEVICE_INPUT_DEFAULTS_START(terminal)
|
||||
DEVICE_INPUT_DEFAULTS("RS232_RXBAUD", 0xff, RS232_BAUD_19200)
|
||||
DEVICE_INPUT_DEFAULTS("RS232_TXBAUD", 0xff, RS232_BAUD_19200)
|
||||
DEVICE_INPUT_DEFAULTS_END
|
||||
|
||||
static void scsi_devices(device_slot_interface &device)
|
||||
{
|
||||
device.option_add("harddisk", NSCSI_HARDDISK);
|
||||
}
|
||||
|
||||
void luna_68k_state::luna(machine_config &config)
|
||||
{
|
||||
M68030(config, m_cpu, 50_MHz_XTAL / 2);
|
||||
@ -153,6 +242,7 @@ void luna_68k_state::luna(machine_config &config)
|
||||
DS1287(config, m_rtc, 32'768);
|
||||
|
||||
UPD7201(config, m_sio, 9'830'000); // D9.83B0
|
||||
m_sio->out_int_callback().set_inputline(m_cpu, M68K_IRQ_6);
|
||||
|
||||
// console
|
||||
RS232_PORT(config, m_serial[0], default_rs232_devices, "terminal");
|
||||
@ -172,11 +262,83 @@ void luna_68k_state::luna(machine_config &config)
|
||||
m_serial[1]->cts_handler().set(m_sio, FUNC(upd7201_device::ctsb_w));
|
||||
|
||||
AM9513(config, m_stc, 9'830'000); // FIXME: clock? sources?
|
||||
// TODO: clock interrupt 5?
|
||||
// TODO: soft interrupt 1?
|
||||
m_stc->fout_cb().set(m_stc, FUNC(am9513_device::gate1_w)); // assumption based on a common configuration
|
||||
m_stc->out1_cb().set_inputline(m_cpu, M68K_IRQ_7);
|
||||
m_stc->out4_cb().set(m_sio, FUNC(upd7201_device::rxca_w));
|
||||
m_stc->out4_cb().append(m_sio, FUNC(upd7201_device::txca_w));
|
||||
m_stc->out5_cb().set(m_sio, FUNC(upd7201_device::rxcb_w));
|
||||
m_stc->out5_cb().append(m_sio, FUNC(upd7201_device::txcb_w));
|
||||
|
||||
// IOC2
|
||||
M68000(config, m_ioc_cpu, 10_MHz_XTAL);
|
||||
m_ioc_cpu->set_addrmap(AS_PROGRAM, &luna_68k_state::ioc_cpu_map);
|
||||
|
||||
HD63450(config, m_ioc_dma[0], 20'000'000 / 2, "ioc");
|
||||
HD63450(config, m_ioc_dma[1], 20'000'000 / 2, "ioc");
|
||||
|
||||
// internal SCSI
|
||||
NSCSI_BUS(config, "scsi0");
|
||||
NSCSI_CONNECTOR(config, "scsi0:0", scsi_devices, nullptr);
|
||||
NSCSI_CONNECTOR(config, "scsi0:1", scsi_devices, nullptr);
|
||||
NSCSI_CONNECTOR(config, "scsi0:2", scsi_devices, nullptr);
|
||||
NSCSI_CONNECTOR(config, "scsi0:3", scsi_devices, nullptr);
|
||||
NSCSI_CONNECTOR(config, "scsi0:4", scsi_devices, nullptr);
|
||||
NSCSI_CONNECTOR(config, "scsi0:5", scsi_devices, nullptr);
|
||||
NSCSI_CONNECTOR(config, "scsi0:6", scsi_devices, "harddisk");
|
||||
NSCSI_CONNECTOR(config, "scsi0:7").option_set("spc", MB89352).machine_config(
|
||||
[](device_t *device)
|
||||
{
|
||||
mb89352_device &spc = downcast<mb89352_device &>(*device);
|
||||
|
||||
spc.set_clock(10'000'000);
|
||||
//spc.out_irq_callback().set(spc_irq, FUNC(input_merger_any_high_device::in_w<0>));
|
||||
});
|
||||
|
||||
// external SCSI
|
||||
NSCSI_BUS(config, "scsi1");
|
||||
NSCSI_CONNECTOR(config, "scsi1:0", scsi_devices, nullptr);
|
||||
NSCSI_CONNECTOR(config, "scsi1:1", scsi_devices, nullptr);
|
||||
NSCSI_CONNECTOR(config, "scsi1:2", scsi_devices, nullptr);
|
||||
NSCSI_CONNECTOR(config, "scsi1:3", scsi_devices, nullptr);
|
||||
NSCSI_CONNECTOR(config, "scsi1:4", scsi_devices, nullptr);
|
||||
NSCSI_CONNECTOR(config, "scsi1:5", scsi_devices, nullptr);
|
||||
NSCSI_CONNECTOR(config, "scsi1:6", scsi_devices, nullptr);
|
||||
NSCSI_CONNECTOR(config, "scsi1:7").option_set("spc", MB89352).machine_config(
|
||||
[](device_t *device)
|
||||
{
|
||||
mb89352_device &spc = downcast<mb89352_device &>(*device);
|
||||
|
||||
spc.set_clock(10'000'000);
|
||||
//spc.out_irq_callback().set(spc_irq, FUNC(input_merger_any_high_device::in_w<1>));
|
||||
});
|
||||
|
||||
MB8877(config, m_ioc_fdc, 0);
|
||||
SCC8530(config, m_ioc_scc, 4.9152_MHz_XTAL); // AM8530H-6PC
|
||||
m_ioc_scc->configure_channels(4'915'200, 4'915'200, 4'915'200, 4'915'200);
|
||||
Z8536(config, m_ioc_cio, 10'000'000);
|
||||
|
||||
// GPU
|
||||
M68020FPU(config, m_gpu_cpu, 33'340'000 / 2);
|
||||
m_gpu_cpu->set_addrmap(AS_PROGRAM, &luna_68k_state::gpu_cpu_map);
|
||||
|
||||
BT458(config, m_gpu_dac, 108'000'000);
|
||||
|
||||
MC68901(config, m_gpu_mfp, 3.6864_MHz_XTAL);
|
||||
m_gpu_mfp->set_timer_clock(3.6864_MHz_XTAL);
|
||||
m_gpu_mfp->out_tdo_cb().set(m_gpu_mfp, FUNC(mc68901_device::tc_w));
|
||||
m_gpu_mfp->out_tdo_cb().append(m_gpu_mfp, FUNC(mc68901_device::rc_w));
|
||||
//m_gpu_mfp->out_irq_cb().set_inputline(m_gpu_cpu, M68K_IRQ_7);
|
||||
|
||||
RS232_PORT(config, m_gpu_tty, default_rs232_devices, nullptr);
|
||||
m_gpu_mfp->out_so_cb().set(m_gpu_tty, FUNC(rs232_port_device::write_txd));
|
||||
m_gpu_tty->rxd_handler().set(m_gpu_mfp, FUNC(mc68901_device::si_w));
|
||||
|
||||
MC68681(config, m_gpu_duart[0], 3.6864_MHz_XTAL);
|
||||
MC68681(config, m_gpu_duart[1], 3.6864_MHz_XTAL);
|
||||
|
||||
NVRAM(config, "gpu_nvram");
|
||||
}
|
||||
|
||||
ROM_START(luna)
|
||||
@ -186,9 +348,17 @@ ROM_START(luna)
|
||||
// HACK: force firmware to reinitialize nvram at first boot
|
||||
ROM_REGION(64, "rtc", 0)
|
||||
ROM_FILL(0, 64, 0xff)
|
||||
|
||||
ROM_REGION16_BE(0x10000, "ioc", 0)
|
||||
ROM_LOAD16_BYTE("8145__h__3.24.ic108", 0x0000, 0x8000, CRC(d2dde582) SHA1(e34c15e43869be573272503d1f47e9e244536396))
|
||||
ROM_LOAD16_BYTE("8145__l__3.24.ic100", 0x0001, 0x8000, CRC(4863329b) SHA1(881623c3a64260f5cc1be066dbb47799d1f2ce14))
|
||||
|
||||
ROM_REGION32_BE(0x40000, "gpu", 0)
|
||||
ROM_LOAD("jaw-2500__rom0__v1.21.rom0", 0x00000, 0x20000, CRC(915e0e86) SHA1(1115a8d3101f6d16e397016ae02fc64202edfc3a))
|
||||
ROM_LOAD("jaw-2500__rom1__v1.21.rom1", 0x20000, 0x20000, CRC(b4c21f3f) SHA1(577833dfbbceba8ee32fd2ac5b1809f860143d44))
|
||||
ROM_END
|
||||
|
||||
} // anonymous namespace
|
||||
|
||||
/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
|
||||
COMP(1989?, luna, 0, 0, luna, 0, luna_68k_state, init, "Omron", "Luna", MACHINE_NO_SOUND | MACHINE_NOT_WORKING)
|
||||
/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
|
||||
COMP(1989?, luna, 0, 0, luna, 0, luna_68k_state, empty_init, "Omron", "Luna", MACHINE_NO_SOUND | MACHINE_NOT_WORKING)
|
||||
|
Loading…
Reference in New Issue
Block a user