mirror of
https://github.com/holub/mame
synced 2025-04-16 05:24:54 +03:00
isbc8024: new multibus card with unknown firmware [Andy Welburn]
This commit is contained in:
parent
30040351f1
commit
d016a6d409
@ -4667,6 +4667,8 @@ if (BUSES["MULTIBUS"]~=null) then
|
||||
MAME_DIR .. "src/devices/bus/multibus/multibus.h",
|
||||
MAME_DIR .. "src/devices/bus/multibus/isbc202.cpp",
|
||||
MAME_DIR .. "src/devices/bus/multibus/isbc202.h",
|
||||
MAME_DIR .. "src/devices/bus/multibus/isbc8024.cpp",
|
||||
MAME_DIR .. "src/devices/bus/multibus/isbc8024.h",
|
||||
MAME_DIR .. "src/devices/bus/multibus/cpuap.cpp",
|
||||
MAME_DIR .. "src/devices/bus/multibus/cpuap.h",
|
||||
MAME_DIR .. "src/devices/bus/multibus/serad.cpp",
|
||||
|
156
src/devices/bus/multibus/isbc8024.cpp
Normal file
156
src/devices/bus/multibus/isbc8024.cpp
Normal file
@ -0,0 +1,156 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Patrick Mackinlay
|
||||
|
||||
/*
|
||||
* Intel iSBC 80/24 Single Board Computer
|
||||
*
|
||||
* Sources:
|
||||
* - http://www.bitsavers.org/pdf/intel/iSBC/148437-001_iSBC_80_24A_Hardware_Reference_Manual_Nov85.pdf
|
||||
*
|
||||
* TODO:
|
||||
* - configurable eprom quantity/size
|
||||
* - configurable irq, clock and I/O
|
||||
* - reverse engineer unknown firmware
|
||||
* - led output
|
||||
*/
|
||||
|
||||
#include "emu.h"
|
||||
#include "isbc8024.h"
|
||||
|
||||
#define VERBOSE 0
|
||||
#include "logmacro.h"
|
||||
|
||||
DEFINE_DEVICE_TYPE(ISBC8024, isbc8024_device, "isbc8024", "Intel iSBC 80/24 Single Board Computer")
|
||||
|
||||
isbc8024_device::isbc8024_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock)
|
||||
: device_t(mconfig, ISBC8024, tag, owner, clock)
|
||||
, device_multibus_interface(mconfig, *this)
|
||||
, m_cpu(*this, "cpu")
|
||||
, m_pit(*this, "pit")
|
||||
, m_pci(*this, "pci")
|
||||
, m_ppi(*this, "ppi%u", 0U)
|
||||
, m_pic(*this, "pic")
|
||||
, m_j3(*this, "j3")
|
||||
, m_conf(*this, "CONF")
|
||||
, m_installed(false)
|
||||
{
|
||||
}
|
||||
|
||||
ROM_START(isbc8024)
|
||||
ROM_REGION(0x1000, "eprom", 0)
|
||||
ROM_SYSTEM_BIOS(0, "unknown", "unknown")
|
||||
ROMX_LOAD("unknown.u50", 0x000, 0x800, CRC(28b18721) SHA1(37526ed0a4f1e910fc0a8f6af0708c77a7358f69), ROM_BIOS(0))
|
||||
ROMX_LOAD("unknown.u51", 0x800, 0x800, CRC(9e49f6ad) SHA1(565ab4740d3151eb4d8ef9ff3e02570cf7804be1), ROM_BIOS(0))
|
||||
ROM_END
|
||||
|
||||
static INPUT_PORTS_START(isbc8024)
|
||||
PORT_START("CONF")
|
||||
PORT_CONFNAME(0x0003, 0x0003, "Size")
|
||||
PORT_CONFSETTING( 0x0000, "None")
|
||||
PORT_CONFSETTING( 0x0001, "2048")
|
||||
PORT_CONFSETTING( 0x0002, "4096")
|
||||
PORT_CONFSETTING( 0x0003, "8192")
|
||||
|
||||
PORT_CONFNAME(0xf000, 0xf000, "End")
|
||||
PORT_CONFSETTING( 0x3000, "3FFF")
|
||||
PORT_CONFSETTING( 0x7000, "7FFF")
|
||||
PORT_CONFSETTING( 0xb000, "BFFF")
|
||||
PORT_CONFSETTING( 0xf000, "FFFF")
|
||||
INPUT_PORTS_END
|
||||
|
||||
const tiny_rom_entry *isbc8024_device::device_rom_region() const
|
||||
{
|
||||
return ROM_NAME(isbc8024);
|
||||
}
|
||||
|
||||
ioport_constructor isbc8024_device::device_input_ports() const
|
||||
{
|
||||
return INPUT_PORTS_NAME(isbc8024);
|
||||
}
|
||||
|
||||
void isbc8024_device::device_start()
|
||||
{
|
||||
}
|
||||
|
||||
void isbc8024_device::device_reset()
|
||||
{
|
||||
if (!m_installed)
|
||||
{
|
||||
ioport_value const conf = m_conf->read();
|
||||
if (conf & 3)
|
||||
{
|
||||
size_t const ram_size = 1024 << (conf & 3);
|
||||
offs_t ram_end = (conf & 0xf000) | 0x0fff;
|
||||
|
||||
std::unique_ptr<u8[]> const ram = std::make_unique<u8[]>(ram_size);
|
||||
m_cpu->space(AS_PROGRAM).install_ram(ram_end - ram_size + 1, ram_end, ram.get());
|
||||
}
|
||||
|
||||
// TODO: what's exposed to the Multibus?
|
||||
m_bus->int_callback<2>().set(m_pic, FUNC(pic8259_device::ir1_w));
|
||||
|
||||
m_installed = true;
|
||||
}
|
||||
}
|
||||
|
||||
void isbc8024_device::device_add_mconfig(machine_config &config)
|
||||
{
|
||||
I8085A(config, m_cpu, 19'354'000 / 2);
|
||||
m_cpu->set_addrmap(AS_PROGRAM, &isbc8024_device::cpu_mem_map);
|
||||
m_cpu->set_addrmap(AS_IO, &isbc8024_device::cpu_pio_map);
|
||||
|
||||
PIT8254(config, m_pit);
|
||||
m_pit->set_clk<0>(19'354'000 / 18);
|
||||
m_pit->set_clk<1>(19'354'000 / 18);
|
||||
m_pit->set_clk<2>(19'354'000 / 18);
|
||||
m_pit->out_handler<0>().set(m_pic, FUNC(pic8259_device::ir2_w));
|
||||
//m_pit->out_handler<1>().set(m_pic, FUNC(pic8259_device::ir?));
|
||||
m_pit->out_handler<2>().append(m_pci, FUNC(i8251_device::write_rxc));
|
||||
m_pit->out_handler<2>().append(m_pci, FUNC(i8251_device::write_txc));
|
||||
|
||||
I8251(config, m_pci, 0);
|
||||
|
||||
I8255(config, m_ppi[0], 0); // j1
|
||||
I8255(config, m_ppi[1], 0); // j2
|
||||
|
||||
PIC8259(config, m_pic);
|
||||
m_pic->out_int_callback().set_inputline(m_cpu, I8085_INTR_LINE);
|
||||
|
||||
RS232_PORT(config, m_j3, default_rs232_devices, nullptr);
|
||||
|
||||
m_pci->txd_handler().set(m_j3, FUNC(rs232_port_device::write_txd));
|
||||
m_pci->dtr_handler().set(m_j3, FUNC(rs232_port_device::write_dtr));
|
||||
m_pci->rts_handler().set(m_j3, FUNC(rs232_port_device::write_rts));
|
||||
m_j3->rxd_handler().set(m_pci, FUNC(i8251_device::write_rxd));
|
||||
m_j3->dsr_handler().set(m_pci, FUNC(i8251_device::write_dsr));
|
||||
m_j3->cts_handler().set(m_pci, FUNC(i8251_device::write_cts));
|
||||
}
|
||||
|
||||
void isbc8024_device::cpu_mem_map(address_map &map)
|
||||
{
|
||||
// default off-board mem access to multibus
|
||||
map(0x0000, 0xffff).rw(FUNC(isbc8024_device::bus_mem_r), FUNC(isbc8024_device::bus_mem_w));
|
||||
|
||||
// TODO: variable number and size of EPROMs
|
||||
map(0x0000, 0x0fff).rom().region("eprom", 0);
|
||||
}
|
||||
|
||||
void isbc8024_device::cpu_pio_map(address_map &map)
|
||||
{
|
||||
// default off-board pio access to multibus
|
||||
map(0x00, 0xff).rw(FUNC(isbc8024_device::bus_pio_r), FUNC(isbc8024_device::bus_pio_w));
|
||||
|
||||
map(0xd4, 0xd4).noprw(); // TODO: power fail
|
||||
//map(0xd5, 0xd5); // system bus override
|
||||
map(0xd6, 0xd6).lw8([this](u8 data) { popmessage("LED"); }, "led_w"); // led diagnostic indicator
|
||||
map(0xd7, 0xd7).noprw(); // reserved
|
||||
map(0xd8, 0xd9).rw(m_pic, FUNC(pic8259_device::read), FUNC(pic8259_device::write)).mirror(0x02);
|
||||
map(0xdc, 0xdf).rw(m_pit, FUNC(pit8254_device::read), FUNC(pit8254_device::write));
|
||||
map(0xe4, 0xe7).rw(m_ppi[0], FUNC(i8255_device::read), FUNC(i8255_device::write));
|
||||
map(0xe8, 0xeb).rw(m_ppi[1], FUNC(i8255_device::read), FUNC(i8255_device::write));
|
||||
map(0xec, 0xed).rw(m_pci, FUNC(i8251_device::read), FUNC(i8251_device::write)).mirror(0x02);
|
||||
//map(0xc0, 0xc7); // mutimodule 1 mcs0/ j5
|
||||
//map(0xc8, 0xcf); // mutimodule 1 mcs1/ j5
|
||||
//map(0xf0, 0xf7); // mutimodule 2 mcs0/ j6
|
||||
//map(0xf8, 0xff); // mutimodule 2 mcs1/ j6
|
||||
}
|
57
src/devices/bus/multibus/isbc8024.h
Normal file
57
src/devices/bus/multibus/isbc8024.h
Normal file
@ -0,0 +1,57 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Patrick Mackinlay
|
||||
|
||||
#ifndef MAME_BUS_MULTIBUS_ISBC8024_H
|
||||
#define MAME_BUS_MULTIBUS_ISBC8024_H
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "multibus.h"
|
||||
|
||||
#include "cpu/i8085/i8085.h"
|
||||
#include "machine/pit8253.h"
|
||||
#include "machine/i8251.h"
|
||||
#include "machine/i8255.h"
|
||||
#include "machine/pic8259.h"
|
||||
|
||||
#include "bus/rs232/rs232.h"
|
||||
|
||||
class isbc8024_device
|
||||
: public device_t
|
||||
, public device_multibus_interface
|
||||
{
|
||||
public:
|
||||
isbc8024_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock);
|
||||
|
||||
protected:
|
||||
// device_t overrides
|
||||
virtual const tiny_rom_entry *device_rom_region() const override;
|
||||
virtual void device_add_mconfig(machine_config &config) override;
|
||||
virtual ioport_constructor device_input_ports() const override;
|
||||
virtual void device_start() override;
|
||||
virtual void device_reset() override;
|
||||
|
||||
private:
|
||||
void cpu_mem_map(address_map &map);
|
||||
void cpu_pio_map(address_map &map);
|
||||
|
||||
void bus_mem_w(offs_t offset, u8 data) { m_bus->space(AS_PROGRAM).write_byte(offset, data); }
|
||||
u8 bus_mem_r(offs_t offset) { return m_bus->space(AS_PROGRAM).read_byte(offset); }
|
||||
void bus_pio_w(offs_t offset, u8 data) { m_bus->space(AS_IO).write_byte(offset, data); }
|
||||
u8 bus_pio_r(offs_t offset) { return m_bus->space(AS_IO).read_byte(offset); }
|
||||
|
||||
required_device<i8085a_cpu_device> m_cpu;
|
||||
required_device<pit8254_device> m_pit;
|
||||
required_device<i8251_device> m_pci;
|
||||
required_device_array<i8255_device, 2> m_ppi;
|
||||
required_device<pic8259_device> m_pic;
|
||||
required_device<rs232_port_device> m_j3;
|
||||
|
||||
required_ioport m_conf;
|
||||
|
||||
bool m_installed;
|
||||
};
|
||||
|
||||
DECLARE_DEVICE_TYPE(ISBC8024, isbc8024_device)
|
||||
|
||||
#endif // MAME_BUS_MULTIBUS_ISBC8024_H
|
Loading…
Reference in New Issue
Block a user