mirror of
https://github.com/holub/mame
synced 2025-04-23 00:39:36 +03:00
jazz: new skeleton driver (nw)
A skeleton for the Microsoft Jazz architecture, which was implemented in the MIPS Magnum 4000, Olivetti M700-10 and was the base/origin of several other MIPS ARC systems. * added skeleton Inmos G300/G332/G364 device * added skeleton NatSemi DP83932C SONIC device * added skeleton MCT-ADR device
This commit is contained in:
parent
234a776832
commit
895ffe0763
@ -3178,6 +3178,18 @@ if (MACHINES["DP8390"]~=null) then
|
||||
}
|
||||
end
|
||||
|
||||
---------------------------------------------------
|
||||
--
|
||||
--@src/devices/machine/dp83932c.h,MACHINES["DP83932C"] = true
|
||||
---------------------------------------------------
|
||||
|
||||
if (MACHINES["DP83932C"]~=null) then
|
||||
files {
|
||||
MAME_DIR .. "src/devices/machine/dp83932c.cpp",
|
||||
MAME_DIR .. "src/devices/machine/dp83932c.h",
|
||||
}
|
||||
end
|
||||
|
||||
---------------------------------------------------
|
||||
--
|
||||
--@src/devices/machine/pc_lpt.h,MACHINES["PC_LPT"] = true
|
||||
|
@ -495,6 +495,18 @@ if (VIDEOS["I8275"]~=null) then
|
||||
}
|
||||
end
|
||||
|
||||
--------------------------------------------------
|
||||
--
|
||||
--@src/devices/video/ims_cvc.h,VIDEOS["IMS_CVC"] = true
|
||||
--------------------------------------------------
|
||||
|
||||
if (VIDEOS["IMS_CVC"]~=null) then
|
||||
files {
|
||||
MAME_DIR .. "src/devices/video/ims_cvc.cpp",
|
||||
MAME_DIR .. "src/devices/video/ims_cvc.h",
|
||||
}
|
||||
end
|
||||
|
||||
--------------------------------------------------
|
||||
--
|
||||
--@src/devices/video/m50458.h,VIDEOS["M50458"] = true
|
||||
|
@ -324,6 +324,7 @@ VIDEOS["HUC6272"] = true
|
||||
VIDEOS["I8244"] = true
|
||||
VIDEOS["I82730"] = true
|
||||
VIDEOS["I8275"] = true
|
||||
VIDEOS["IMS_CVC"] = true
|
||||
--VIDEOS["M50458"] = true
|
||||
--VIDEOS["MB90082"] = true
|
||||
--VIDEOS["MB_VCU"] = true
|
||||
@ -420,6 +421,7 @@ MACHINES["CS4031"] = true
|
||||
MACHINES["CS8221"] = true
|
||||
MACHINES["CXD1095"] = true
|
||||
MACHINES["DP8390"] = true
|
||||
MACHINES["DP83932C"] = true
|
||||
--MACHINES["DS1204"] = true
|
||||
MACHINES["DS1302"] = true
|
||||
MACHINES["DS1315"] = true
|
||||
@ -1064,6 +1066,7 @@ function linkProjects_mame_mess(_target, _subtarget)
|
||||
"interton",
|
||||
"intv",
|
||||
"isc",
|
||||
"jazz",
|
||||
"kaypro",
|
||||
"koei",
|
||||
"kontron",
|
||||
@ -2340,6 +2343,14 @@ files {
|
||||
MAME_DIR .. "src/mame/drivers/compucolor.cpp",
|
||||
}
|
||||
|
||||
createMESSProjects(_target, _subtarget, "jazz")
|
||||
files {
|
||||
MAME_DIR .. "src/mame/drivers/jazz.cpp",
|
||||
MAME_DIR .. "src/mame/includes/jazz.h",
|
||||
MAME_DIR .. "src/mame/machine/jazz_mct_adr.cpp",
|
||||
MAME_DIR .. "src/mame/machine/jazz_mct_adr.h",
|
||||
}
|
||||
|
||||
createMESSProjects(_target, _subtarget, "kaypro")
|
||||
files {
|
||||
MAME_DIR .. "src/mame/drivers/kaypro.cpp",
|
||||
|
140
src/devices/machine/dp83932c.cpp
Normal file
140
src/devices/machine/dp83932c.cpp
Normal file
@ -0,0 +1,140 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Patrick Mackinlay
|
||||
|
||||
/*
|
||||
* An implementation of the National Semiconductor DP83932C SONIC™ (Systems-
|
||||
* Oriented Network Interface Controller) device.
|
||||
*
|
||||
* References:
|
||||
*
|
||||
* http://bitsavers.org/components/national/_dataBooks/1995_National_Ethernet_Databook.pdf
|
||||
*
|
||||
* TODO
|
||||
* - everything (skeleton only)
|
||||
*/
|
||||
|
||||
#include "emu.h"
|
||||
#include "dp83932c.h"
|
||||
#include "hashing.h"
|
||||
|
||||
#define VERBOSE 0
|
||||
#include "logmacro.h"
|
||||
|
||||
DEFINE_DEVICE_TYPE(DP83932C_BE, dp83932c_be_device, "dp83932c_be", "National Semiconductor DP83932C SONIC (big)")
|
||||
DEFINE_DEVICE_TYPE(DP83932C_LE, dp83932c_le_device, "dp83932c_le", "National Semiconductor DP83932C SONIC (little)")
|
||||
|
||||
dp83932c_device::dp83932c_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, endianness_t endian)
|
||||
: device_t(mconfig, type, tag, owner, clock)
|
||||
, device_memory_interface(mconfig, *this)
|
||||
, device_network_interface(mconfig, *this, 10.0f)
|
||||
, m_space_config("shared", endian, 32, 32)
|
||||
, m_out_int(*this)
|
||||
{
|
||||
}
|
||||
|
||||
dp83932c_be_device::dp83932c_be_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
|
||||
: dp83932c_device(mconfig, DP83932C_BE, tag, owner, clock, ENDIANNESS_BIG)
|
||||
{
|
||||
}
|
||||
|
||||
dp83932c_le_device::dp83932c_le_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
|
||||
: dp83932c_device(mconfig, DP83932C_LE, tag, owner, clock, ENDIANNESS_LITTLE)
|
||||
{
|
||||
}
|
||||
|
||||
void dp83932c_device::map(address_map &map)
|
||||
{
|
||||
/*
|
||||
// command and status registers
|
||||
map(0x00, 0x03).rw(FUNC(dp83932c_device::cr_r), FUNC(dp83932c_device::cr_w));
|
||||
map(0x04, 0x07).rw(FUNC(dp83932c_device::dcr_r), FUNC(dp83932c_device::dcr_w));
|
||||
map(0x08, 0x0b).rw(FUNC(dp83932c_device::rcr_r), FUNC(dp83932c_device::rcr_w));
|
||||
map(0x0c, 0x0f).rw(FUNC(dp83932c_device::tcr_r), FUNC(dp83932c_device::tcr_w));
|
||||
map(0x10, 0x13).rw(FUNC(dp83932c_device::imr_r), FUNC(dp83932c_device::imr_w));
|
||||
map(0x14, 0x17).rw(FUNC(dp83932c_device::isr_r), FUNC(dp83932c_device::isr_w));
|
||||
|
||||
// transmit registers
|
||||
map(0x18, 0x1b).rw(FUNC(dp83932c_device::utda_r), FUNC(dp83932c_device::utda_w));
|
||||
map(0x1c, 0x1f).rw(FUNC(dp83932c_device::ctda_r), FUNC(dp83932c_device::ctda_w));
|
||||
|
||||
// tps
|
||||
// tfc
|
||||
// tsa0
|
||||
// tsa1
|
||||
// tfs
|
||||
|
||||
// receive registers
|
||||
map(0x34, 0x37).rw(FUNC(dp83932c_device::urda_r), FUNC(dp83932c_device::urda_w));
|
||||
map(0x38, 0x3b).rw(FUNC(dp83932c_device::crda_r), FUNC(dp83932c_device::crda_w));
|
||||
|
||||
// crba0
|
||||
// crba1
|
||||
// rbwc0
|
||||
// rbwc1
|
||||
// eobc
|
||||
// urra
|
||||
// rsa
|
||||
// rea
|
||||
// rrp
|
||||
// rwp
|
||||
// trba0
|
||||
// trba1
|
||||
// tbwc0
|
||||
// tbwc1
|
||||
// addr0
|
||||
// addr1
|
||||
// llfa
|
||||
// ttda
|
||||
// cep
|
||||
// cap2
|
||||
// cap1
|
||||
// cap0
|
||||
// ce
|
||||
// cdp
|
||||
// cdc
|
||||
// sr
|
||||
// wt0
|
||||
// wt1
|
||||
// rsc
|
||||
// crct
|
||||
// faet
|
||||
// mpt
|
||||
// mdt
|
||||
|
||||
// 30-3e internal use registers
|
||||
*/
|
||||
}
|
||||
|
||||
void dp83932c_device::device_start()
|
||||
{
|
||||
m_space = &space(0);
|
||||
m_out_int.resolve();
|
||||
}
|
||||
|
||||
void dp83932c_device::device_reset()
|
||||
{
|
||||
}
|
||||
|
||||
void dp83932c_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
|
||||
{
|
||||
}
|
||||
|
||||
device_memory_interface::space_config_vector dp83932c_device::memory_space_config() const
|
||||
{
|
||||
return space_config_vector {
|
||||
std::make_pair(0, &m_space_config)
|
||||
};
|
||||
}
|
||||
|
||||
void dp83932c_device::send_complete_cb(int result)
|
||||
{
|
||||
}
|
||||
|
||||
int dp83932c_device::recv_start_cb(u8 *buf, int length)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
void dp83932c_device::recv_complete_cb(int result)
|
||||
{
|
||||
}
|
59
src/devices/machine/dp83932c.h
Normal file
59
src/devices/machine/dp83932c.h
Normal file
@ -0,0 +1,59 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Patrick Mackinlay
|
||||
|
||||
#ifndef MAME_MACHINE_DP83932C_H
|
||||
#define MAME_MACHINE_DP83932C_H
|
||||
|
||||
#pragma once
|
||||
|
||||
class dp83932c_device :
|
||||
public device_t,
|
||||
public device_memory_interface,
|
||||
public device_network_interface
|
||||
{
|
||||
public:
|
||||
// callback configuration
|
||||
auto out_int_cb() { return m_out_int.bind(); }
|
||||
|
||||
void map(address_map &map);
|
||||
|
||||
protected:
|
||||
dp83932c_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, endianness_t endian);
|
||||
|
||||
// device_t overrides
|
||||
virtual void device_start() override;
|
||||
virtual void device_reset() override;
|
||||
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
|
||||
|
||||
// device_memory_interface overrides
|
||||
virtual space_config_vector memory_space_config() const override;
|
||||
|
||||
// device_network_interface overrides
|
||||
virtual void send_complete_cb(int result) override;
|
||||
virtual int recv_start_cb(u8 *buf, int length) override;
|
||||
virtual void recv_complete_cb(int result) override;
|
||||
|
||||
private:
|
||||
// device_memory_interface members
|
||||
const address_space_config m_space_config;
|
||||
address_space *m_space;
|
||||
|
||||
devcb_write_line m_out_int;
|
||||
};
|
||||
|
||||
class dp83932c_be_device : public dp83932c_device
|
||||
{
|
||||
public:
|
||||
dp83932c_be_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
|
||||
};
|
||||
|
||||
class dp83932c_le_device : public dp83932c_device
|
||||
{
|
||||
public:
|
||||
dp83932c_le_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
|
||||
};
|
||||
|
||||
DECLARE_DEVICE_TYPE(DP83932C_BE, dp83932c_be_device)
|
||||
DECLARE_DEVICE_TYPE(DP83932C_LE, dp83932c_le_device)
|
||||
|
||||
#endif // MAME_MACHINE_DP83932C_H
|
139
src/devices/video/ims_cvc.cpp
Normal file
139
src/devices/video/ims_cvc.cpp
Normal file
@ -0,0 +1,139 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Patrick Mackinlay
|
||||
|
||||
/*
|
||||
* An implementation of the INMOS G300, G332 and G364 CVC (Colour Video
|
||||
* Controller) devices.
|
||||
*
|
||||
* References:
|
||||
*
|
||||
* http://bitsavers.org/components/inmos/graphics/72-TRN-204-01_Graphics_Databook_Second_Edition_1990.pdf
|
||||
*
|
||||
* TODO
|
||||
* - everything (skeleton only)
|
||||
*/
|
||||
|
||||
#include "emu.h"
|
||||
#include "ims_cvc.h"
|
||||
|
||||
#include "screen.h"
|
||||
|
||||
#define VERBOSE 0
|
||||
#include "logmacro.h"
|
||||
|
||||
DEFINE_DEVICE_TYPE(G300, g300_device, "g300", "INMOS G300 Colour Video Controller")
|
||||
DEFINE_DEVICE_TYPE(G332, g332_device, "g332", "INMOS G332 Colour Video Controller")
|
||||
DEFINE_DEVICE_TYPE(G364, g364_device, "g364", "INMOS G364 Colour Video Controller")
|
||||
|
||||
ims_cvc_device::ims_cvc_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
|
||||
: device_t(mconfig, type, tag, owner, clock)
|
||||
, device_memory_interface(mconfig, *this)
|
||||
, device_palette_interface(mconfig, *this)
|
||||
, m_space_config("shared", ENDIANNESS_LITTLE, 32, 24)
|
||||
{
|
||||
}
|
||||
|
||||
g300_device::g300_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
|
||||
: ims_cvc_device(mconfig, G300, tag, owner, clock)
|
||||
{
|
||||
}
|
||||
|
||||
g332_device::g332_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
|
||||
: ims_cvc_device(mconfig, type, tag, owner, clock)
|
||||
{
|
||||
}
|
||||
|
||||
g332_device::g332_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
|
||||
: ims_cvc_device(mconfig, G332, tag, owner, clock)
|
||||
{
|
||||
}
|
||||
|
||||
g364_device::g364_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
|
||||
: g332_device(mconfig, G364, tag, owner, clock)
|
||||
{
|
||||
}
|
||||
|
||||
device_memory_interface::space_config_vector ims_cvc_device::memory_space_config() const
|
||||
{
|
||||
return space_config_vector{
|
||||
std::make_pair(0, &m_space_config)
|
||||
};
|
||||
}
|
||||
|
||||
void g300_device::map(address_map &map)
|
||||
{
|
||||
// datasheet gives unshifted addresses
|
||||
const int shift = 2;
|
||||
|
||||
// colour palette
|
||||
map(0x000 << shift, (0x0ff << shift) | 0x3).rw(FUNC(g300_device::colour_palette_r), FUNC(g300_device::colour_palette_w));
|
||||
|
||||
// data path registers
|
||||
map(0x121, (0x121 << shift) | 0x3).rw(FUNC(g300_device::halfsync_r), FUNC(g300_device::halfsync_w));
|
||||
map(0x122, (0x122 << shift) | 0x3).rw(FUNC(g300_device::backporch_r), FUNC(g300_device::backporch_w));
|
||||
map(0x123, (0x123 << shift) | 0x3).rw(FUNC(g300_device::display_r), FUNC(g300_device::display_w));
|
||||
map(0x124, (0x124 << shift) | 0x3).rw(FUNC(g300_device::shortdisplay_r), FUNC(g300_device::shortdisplay_w));
|
||||
map(0x125, (0x125 << shift) | 0x3).rw(FUNC(g300_device::broadpulse_r), FUNC(g300_device::broadpulse_w));
|
||||
map(0x126, (0x126 << shift) | 0x3).rw(FUNC(g300_device::vsync_r), FUNC(g300_device::vsync_w));
|
||||
map(0x127, (0x127 << shift) | 0x3).rw(FUNC(g300_device::vblank_r), FUNC(g300_device::vblank_w));
|
||||
map(0x128, (0x128 << shift) | 0x3).rw(FUNC(g300_device::vdisplay_r), FUNC(g300_device::vdisplay_w));
|
||||
map(0x129, (0x129 << shift) | 0x3).rw(FUNC(g300_device::linetime_r), FUNC(g300_device::linetime_w));
|
||||
map(0x12a, (0x12a << shift) | 0x3).rw(FUNC(g300_device::tos_r), FUNC(g300_device::tos_w));
|
||||
map(0x12b, (0x12b << shift) | 0x3).rw(FUNC(g300_device::meminit_r), FUNC(g300_device::meminit_w));
|
||||
map(0x12c, (0x12c << shift) | 0x3).rw(FUNC(g300_device::transferdelay_r), FUNC(g300_device::transferdelay_w));
|
||||
|
||||
map(0x140 << shift, (0x140 << shift) | 0x3).rw(FUNC(g300_device::mask_r), FUNC(g300_device::mask_w));
|
||||
map(0x160 << shift, (0x160 << shift) | 0x3).rw(FUNC(g300_device::control_r), FUNC(g300_device::control_w));
|
||||
map(0x180 << shift, (0x180 << shift) | 0x3).rw(FUNC(g300_device::tos_r), FUNC(g300_device::tos_w));
|
||||
map(0x1a0 << shift, (0x1a0 << shift) | 0x3).w(FUNC(g300_device::boot_w));
|
||||
}
|
||||
|
||||
void g332_device::map(address_map &map)
|
||||
{
|
||||
// datasheet gives unshifted addresses
|
||||
const int shift = 2; // TODO: 64 bit mode
|
||||
|
||||
map(0x000 << shift, (0x000 << shift) | 0x3).w(FUNC(g332_device::boot_w));
|
||||
|
||||
// data path registers
|
||||
map(0x021, (0x021 << shift) | 0x3).rw(FUNC(g332_device::halfsync_r), FUNC(g332_device::halfsync_w));
|
||||
map(0x022, (0x022 << shift) | 0x3).rw(FUNC(g332_device::backporch_r), FUNC(g332_device::backporch_w));
|
||||
map(0x023, (0x023 << shift) | 0x3).rw(FUNC(g332_device::display_r), FUNC(g332_device::display_w));
|
||||
map(0x024, (0x024 << shift) | 0x3).rw(FUNC(g332_device::shortdisplay_r), FUNC(g332_device::shortdisplay_w));
|
||||
map(0x025, (0x025 << shift) | 0x3).rw(FUNC(g332_device::broadpulse_r), FUNC(g332_device::broadpulse_w));
|
||||
map(0x026, (0x026 << shift) | 0x3).rw(FUNC(g332_device::vsync_r), FUNC(g332_device::vsync_w));
|
||||
map(0x027, (0x027 << shift) | 0x3).rw(FUNC(g332_device::vpreequalise_r), FUNC(g332_device::vpreequalise_w));
|
||||
map(0x028, (0x028 << shift) | 0x3).rw(FUNC(g332_device::vpostequalise_r), FUNC(g332_device::vpostequalise_w));
|
||||
map(0x029, (0x029 << shift) | 0x3).rw(FUNC(g332_device::vblank_r), FUNC(g332_device::vblank_w));
|
||||
map(0x02a, (0x02a << shift) | 0x3).rw(FUNC(g332_device::vdisplay_r), FUNC(g332_device::vdisplay_w));
|
||||
map(0x02b, (0x02b << shift) | 0x3).rw(FUNC(g332_device::linetime_r), FUNC(g332_device::linetime_w));
|
||||
map(0x02c, (0x02c << shift) | 0x3).rw(FUNC(g332_device::linestart_r), FUNC(g332_device::linestart_w));
|
||||
map(0x02d, (0x02d << shift) | 0x3).rw(FUNC(g332_device::meminit_r), FUNC(g332_device::meminit_w));
|
||||
map(0x02e, (0x02e << shift) | 0x3).rw(FUNC(g332_device::transferdelay_r), FUNC(g332_device::transferdelay_w));
|
||||
|
||||
map(0x040 << shift, (0x040 << shift) | 0x3).rw(FUNC(g332_device::mask_r), FUNC(g332_device::mask_w));
|
||||
map(0x060 << shift, (0x060 << shift) | 0x3).rw(FUNC(g332_device::control_a_r), FUNC(g332_device::control_a_w));
|
||||
map(0x070 << shift, (0x070 << shift) | 0x3).rw(FUNC(g332_device::control_b_r), FUNC(g332_device::control_b_w));
|
||||
map(0x080 << shift, (0x080 << shift) | 0x3).rw(FUNC(g332_device::tos_r), FUNC(g332_device::tos_w));
|
||||
|
||||
// cursor palette (0a1-0a3)
|
||||
// checksum registers (0c0-0c2)
|
||||
|
||||
// colour palette
|
||||
map(0x100 << shift, (0x1ff << shift) | 0x3).rw(FUNC(g332_device::colour_palette_r), FUNC(g332_device::colour_palette_w));
|
||||
|
||||
// cursor store (200-3ff)
|
||||
// cursor position (0c7)
|
||||
}
|
||||
|
||||
void ims_cvc_device::device_start()
|
||||
{
|
||||
}
|
||||
|
||||
void ims_cvc_device::device_reset()
|
||||
{
|
||||
}
|
||||
|
||||
void ims_cvc_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
}
|
142
src/devices/video/ims_cvc.h
Normal file
142
src/devices/video/ims_cvc.h
Normal file
@ -0,0 +1,142 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Patrick Mackinlay
|
||||
#ifndef MAME_VIDEO_IMS_CVC_H
|
||||
#define MAME_VIDEO_IMS_CVC_H
|
||||
|
||||
#pragma once
|
||||
|
||||
class ims_cvc_device :
|
||||
public device_t,
|
||||
public device_memory_interface,
|
||||
public device_palette_interface
|
||||
{
|
||||
public:
|
||||
virtual void map(address_map &map) = 0;
|
||||
|
||||
void screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
|
||||
|
||||
protected:
|
||||
ims_cvc_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
|
||||
|
||||
// device_t overrides
|
||||
virtual void device_start() override;
|
||||
virtual void device_reset() override;
|
||||
|
||||
// device_memory_interface overrides
|
||||
virtual space_config_vector memory_space_config() const override;
|
||||
|
||||
// device_palette_interface overrides
|
||||
virtual u32 palette_entries() const override { return 256; } // FIXME
|
||||
|
||||
u32 colour_palette_r(const offs_t offset) { return 0; }
|
||||
void colour_palette_w(const offs_t offset, const u32 data) {}
|
||||
u32 halfsync_r() { return m_halfsync; }
|
||||
void halfsync_w(const u32 data) { m_halfsync = data; }
|
||||
u32 backporch_r() { return m_backporch; }
|
||||
void backporch_w(const u32 data) { m_backporch = data; }
|
||||
u32 display_r() { return m_display; }
|
||||
void display_w(const u32 data) { m_display = data; }
|
||||
u32 shortdisplay_r() { return m_shortdisplay; }
|
||||
void shortdisplay_w(const u32 data) { m_shortdisplay = data; }
|
||||
u32 broadpulse_r() { return m_broadpulse; }
|
||||
void broadpulse_w(const u32 data) { m_broadpulse = data; }
|
||||
u32 vsync_r() { return m_vsync; }
|
||||
void vsync_w(const u32 data) { m_vsync = data; }
|
||||
u32 vblank_r() { return m_vblank; }
|
||||
void vblank_w(const u32 data) { m_vblank = data; }
|
||||
u32 vdisplay_r() { return m_vdisplay; }
|
||||
void vdisplay_w(const u32 data) { m_vdisplay = data; }
|
||||
u32 linetime_r() { return m_linetime; }
|
||||
void linetime_w(const u32 data) { m_linetime = data; }
|
||||
//u32 tos_r() { return m_tos; }
|
||||
//void tos_w(const u32 data) { m_tos = data; }
|
||||
u32 meminit_r() { return m_meminit; }
|
||||
void meminit_w(const u32 data) { m_meminit = data; }
|
||||
u32 transferdelay_r() { return m_transferdelay; }
|
||||
void transferdelay_w(const u32 data) { m_transferdelay = data; }
|
||||
|
||||
u32 mask_r() { return m_mask; }
|
||||
void mask_w(const u32 data) { m_mask = data; }
|
||||
u32 tos_r() { return m_tos; }
|
||||
void tos_w(const u32 data) { m_tos = data; }
|
||||
|
||||
void boot_w(const u32 data) { m_boot = data; }
|
||||
|
||||
private:
|
||||
// device_memory_interface members
|
||||
const address_space_config m_space_config;
|
||||
address_space *m_space;
|
||||
|
||||
// device state
|
||||
u32 m_halfsync;
|
||||
u32 m_backporch;
|
||||
u32 m_display;
|
||||
u32 m_shortdisplay;
|
||||
u32 m_broadpulse;
|
||||
u32 m_vsync;
|
||||
u32 m_vblank;
|
||||
u32 m_vdisplay;
|
||||
u32 m_linetime;
|
||||
u32 m_meminit;
|
||||
u32 m_transferdelay;
|
||||
|
||||
u32 m_mask;
|
||||
u32 m_tos;
|
||||
u32 m_boot;
|
||||
};
|
||||
|
||||
class g300_device : public ims_cvc_device
|
||||
{
|
||||
public:
|
||||
g300_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
|
||||
|
||||
virtual void map(address_map &map) override;
|
||||
|
||||
protected:
|
||||
u32 control_r() { return m_control; }
|
||||
void control_w(const u32 data) { m_control = data; }
|
||||
|
||||
private:
|
||||
u32 m_control;
|
||||
};
|
||||
|
||||
class g332_device : public ims_cvc_device
|
||||
{
|
||||
public:
|
||||
g332_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
|
||||
|
||||
virtual void map(address_map &map) override;
|
||||
|
||||
protected:
|
||||
g332_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
|
||||
|
||||
u32 vpreequalise_r() { return m_vpreequalise; }
|
||||
void vpreequalise_w(const u32 data) { m_vpreequalise = data; }
|
||||
u32 vpostequalise_r() { return m_vpostequalise; }
|
||||
void vpostequalise_w(const u32 data) { m_vpostequalise = data; }
|
||||
u32 linestart_r() { return m_linestart; }
|
||||
void linestart_w(const u32 data) { m_linestart = data; }
|
||||
u32 control_a_r() { return m_control_a; }
|
||||
void control_a_w(const u32 data) { m_control_a = data; }
|
||||
u32 control_b_r() { return m_control_b; }
|
||||
void control_b_w(const u32 data) { m_control_b = data; }
|
||||
|
||||
private:
|
||||
u32 m_vpreequalise;
|
||||
u32 m_vpostequalise;
|
||||
u32 m_linestart;
|
||||
u32 m_control_a;
|
||||
u32 m_control_b;
|
||||
};
|
||||
|
||||
class g364_device : public g332_device
|
||||
{
|
||||
public:
|
||||
g364_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
|
||||
};
|
||||
|
||||
DECLARE_DEVICE_TYPE(G300, g300_device)
|
||||
DECLARE_DEVICE_TYPE(G332, g332_device)
|
||||
DECLARE_DEVICE_TYPE(G364, g364_device)
|
||||
|
||||
#endif // MAME_VIDEO_IMS_CVC_H
|
206
src/mame/drivers/jazz.cpp
Normal file
206
src/mame/drivers/jazz.cpp
Normal file
@ -0,0 +1,206 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Patrick Mackinlay
|
||||
|
||||
/*
|
||||
* An emulation of systems based on the Jazz computer architecture, originally
|
||||
* developed by Microsoft. Specific systems which implemented this architecture
|
||||
* include the MIPS Magnum/Millenium 4000 and Olivetti M700-10.
|
||||
*
|
||||
* References:
|
||||
*
|
||||
* https://www.linux-mips.org/wiki/Jazz
|
||||
* http://gunkies.org/wiki/MIPS_Magnum
|
||||
* http://www.sensi.org/~alec/mips/mips-history.html
|
||||
*
|
||||
* TODO
|
||||
* - everything (skeleton only)
|
||||
*
|
||||
* Unconfirmed parts lists from ARCSystem reference design (which appears to
|
||||
* be very similar or identical to the Jazz system) taken from:
|
||||
* https://www.linux-mips.org/archives/riscy/1993-12/msg00013.html
|
||||
*
|
||||
* Ref Part Function
|
||||
*
|
||||
* System board:
|
||||
*
|
||||
* Dallas DS1287 RTC and NVRAM
|
||||
* Dallas DS1225Y 8k non-volatile SRAM
|
||||
* WD16C552 Dual serial and parallel port controller
|
||||
* Intel N82077A Floppy drive controller
|
||||
* National DP83932BFV Ethernet controller
|
||||
* Intel 82358 EISA Bus Controller
|
||||
* Intel 82357 EISA Integrated System Peripheral (ISP)
|
||||
* Intel 82352 x 2 EISA Bus Buffer (EBB)
|
||||
* Emulex FAS216 SCSI controller
|
||||
* 27C01 128k EPROM
|
||||
* 28F020 256k flash memory
|
||||
* NEC μPD31432 ARC address path ASIC
|
||||
* NEC μPD31431 x 2 ARC data path ASIC
|
||||
* NEC μPD30400 R4000PC/50 CPU
|
||||
*
|
||||
* Audio board:
|
||||
*
|
||||
* Crystal CS4215 Audio codec
|
||||
* Altera FPGA x 4 Audio DMA
|
||||
*
|
||||
* Video board:
|
||||
*
|
||||
* 27C010 128k EPROM
|
||||
* IMS G364-11S Video controller
|
||||
* NEC μPD42274V-80 x 16 256kx4 VRAM (2MiB)
|
||||
*/
|
||||
|
||||
#include "emu.h"
|
||||
|
||||
#include "includes/jazz.h"
|
||||
|
||||
#include "debugger.h"
|
||||
|
||||
#define VERBOSE 0
|
||||
#include "logmacro.h"
|
||||
|
||||
void jazz_state::machine_start()
|
||||
{
|
||||
}
|
||||
|
||||
void jazz_state::machine_reset()
|
||||
{
|
||||
}
|
||||
|
||||
void jazz_state::init_common()
|
||||
{
|
||||
// map the configured ram
|
||||
m_maincpu->space(AS_PROGRAM).install_ram(0, m_ram->mask(), m_ram->pointer());
|
||||
}
|
||||
|
||||
void jazz_state::jazz_common_map(address_map &map)
|
||||
{
|
||||
map(0x1fc00000, 0x1fc3ffff).r(m_flash, FUNC(amd_28f020_device::read));
|
||||
|
||||
// FIXME: lots of guesswork and assumptions here for now
|
||||
map(0x80000000, 0x80000fff).m(m_mct_adr, FUNC(jazz_mct_adr_device::map));
|
||||
map(0x80001000, 0x80001fff).m(m_network, FUNC(dp83932c_device::map));
|
||||
//map(0x80002000, 0x80002fff).m(m_scsi, FUNC(ncr5390_device::map)).umask32(0x000000ff);
|
||||
map(0x80003000, 0x80003fff).m(m_fdc, FUNC(n82077aa_device::map));
|
||||
//map(0x80004000, 0x80004fff).rw(m_rtc, FUNC(mc146818_device::read), FUNC(mc146818_device::write));
|
||||
//map(0x80005000, 0x80005fff).m() // keyboard/mouse
|
||||
//map(0x80006000, 0x80006fff).m() // serial1
|
||||
//map(0x80007000, 0x80007fff).m() // serial2
|
||||
//map(0x80008000, 0x80008fff).m() // parallel
|
||||
map(0x80009000, 0x80009fff).ram().share("nvram"); // unprotected?
|
||||
map(0x8000a000, 0x8000afff).ram().share("nvram"); // protected?
|
||||
map(0x8000b000, 0x8000bfff).ram().share("nvram"); // read-only? also sonic IO access?
|
||||
//map(0x8000c000, 0x8000cfff) // sound
|
||||
map(0x8000d000, 0x8000dfff).noprw(); // dummy dma device?
|
||||
|
||||
map(0x8000f000, 0x8000f001).rw(FUNC(jazz_state::led_r), FUNC(jazz_state::led_w));
|
||||
|
||||
//map(0x800e0000, 0x800e0000).rw(FUNC(jazz_state::dram_config_r), FUNC(jazz_state::dram_config_w));
|
||||
|
||||
map(0xe0800000, 0xe0bfffff).ram().share("vram"); // framebuffer?
|
||||
|
||||
map(0xfff00000, 0xfff3ffff).r(m_flash, FUNC(amd_28f020_device::read)); // mirror?
|
||||
}
|
||||
|
||||
static void jazz_scsi_devices(device_slot_interface &device)
|
||||
{
|
||||
device.option_add("harddisk", NSCSI_HARDDISK);
|
||||
device.option_add("cdrom", NSCSI_CDROM);
|
||||
}
|
||||
|
||||
void jazz_state::jazz(machine_config &config)
|
||||
{
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &jazz_state::jazz_common_map);
|
||||
|
||||
RAM(config, m_ram, 0);
|
||||
m_ram->set_default_size("8M");
|
||||
m_ram->set_extra_options("16M,32M,64M,128M,256M");
|
||||
m_ram->set_default_value(0);
|
||||
|
||||
// FIXME: may require big and little endian variants
|
||||
JAZZ_MCT_ADR(config, m_mct_adr, 0);
|
||||
|
||||
// scsi bus and devices
|
||||
NSCSI_BUS(config, m_scsibus, 0);
|
||||
|
||||
nscsi_connector &harddisk(NSCSI_CONNECTOR(config, "scsi:0", 0));
|
||||
jazz_scsi_devices(harddisk);
|
||||
harddisk.set_default_option("harddisk");
|
||||
|
||||
nscsi_connector &cdrom(NSCSI_CONNECTOR(config, "scsi:6", 0));
|
||||
jazz_scsi_devices(cdrom);
|
||||
cdrom.set_default_option("cdrom");
|
||||
|
||||
jazz_scsi_devices(NSCSI_CONNECTOR(config, "scsi:1", 0));
|
||||
jazz_scsi_devices(NSCSI_CONNECTOR(config, "scsi:2", 0));
|
||||
jazz_scsi_devices(NSCSI_CONNECTOR(config, "scsi:3", 0));
|
||||
jazz_scsi_devices(NSCSI_CONNECTOR(config, "scsi:4", 0));
|
||||
jazz_scsi_devices(NSCSI_CONNECTOR(config, "scsi:5", 0));
|
||||
|
||||
// scsi host adapter
|
||||
nscsi_connector &adapter(NSCSI_CONNECTOR(config, "scsi:7", 0));
|
||||
adapter.option_add_internal("host", NCR53C90A);
|
||||
adapter.set_default_option("host");
|
||||
adapter.set_fixed(true);
|
||||
|
||||
N82077AA(config, m_fdc, 24_MHz_XTAL);
|
||||
|
||||
MC146818(config, m_rtc, 32.768_kHz_XTAL);
|
||||
|
||||
NVRAM(config, m_nvram, nvram_device::DEFAULT_ALL_0);
|
||||
|
||||
AMD_28F020(config, m_flash);
|
||||
|
||||
// pc keyboard controller?
|
||||
pc_kbdc_device &kbdc(PC_KBDC(config, "pc_kbdc", 0));
|
||||
kbdc.out_clock_cb().set(m_kbdc, FUNC(at_keyboard_controller_device::keyboard_clock_w));
|
||||
kbdc.out_data_cb().set(m_kbdc, FUNC(at_keyboard_controller_device::keyboard_data_w));
|
||||
|
||||
// keyboard port
|
||||
pc_kbdc_slot_device &kbd(PC_KBDC_SLOT(config, "kbd", 0));
|
||||
pc_at_keyboards(kbd);
|
||||
kbd.set_default_option(STR_KBD_IBM_PC_AT_84);
|
||||
kbd.set_pc_kbdc_slot(&kbdc);
|
||||
|
||||
// at keyboard controller
|
||||
AT_KEYBOARD_CONTROLLER(config, m_kbdc, 12_MHz_XTAL);
|
||||
m_kbdc->system_reset_cb().set_inputline(m_maincpu, INPUT_LINE_RESET);
|
||||
m_kbdc->keyboard_clock_cb().set(kbdc, FUNC(pc_kbdc_device::clock_write_from_mb));
|
||||
m_kbdc->keyboard_data_cb().set(kbdc, FUNC(pc_kbdc_device::data_write_from_mb));
|
||||
|
||||
G364(config, m_ramdac, 0);
|
||||
}
|
||||
|
||||
void jazz_state::mmr4000be(machine_config &config)
|
||||
{
|
||||
R4000BE(config, m_maincpu, 50_MHz_XTAL);
|
||||
|
||||
jazz(config);
|
||||
|
||||
DP83932C_BE(config, m_network, 20_MHz_XTAL);
|
||||
}
|
||||
|
||||
void jazz_state::mmr4000le(machine_config &config)
|
||||
{
|
||||
R4000LE(config, m_maincpu, 50_MHz_XTAL);
|
||||
|
||||
jazz(config);
|
||||
|
||||
DP83932C_LE(config, m_network, 20_MHz_XTAL);
|
||||
}
|
||||
|
||||
ROM_START(mmr4000be)
|
||||
ROM_REGION32_BE(0x40000, "flash", 0)
|
||||
ROM_SYSTEM_BIOS(0, "riscos", "R4000 RISC/os PROM")
|
||||
ROMX_LOAD("riscos.bin", 0x00000, 0x40000, CRC(cea6bc8f) SHA1(3e47b4ad5d1a0c7aac649e6aef3df1bf86fc938b), ROM_BIOS(0))
|
||||
ROM_END
|
||||
|
||||
ROM_START(mmr4000le)
|
||||
ROM_REGION32_LE(0x40000, "flash", 0)
|
||||
ROM_SYSTEM_BIOS(0, "ntprom", "R4000 Windows NT PROM")
|
||||
ROMX_LOAD("ntprom.bin", 0x00000, 0x40000, CRC(d91018d7) SHA1(316de17820192c89b8ee6d9936ab8364a739ca53), ROM_BIOS(0))
|
||||
ROM_END
|
||||
|
||||
/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
|
||||
COMP( 1992, mmr4000be, 0, 0, mmr4000be, 0, jazz_state, init_common, "MIPS", "Magnum R4000 (big)", MACHINE_IS_SKELETON)
|
||||
COMP( 1992, mmr4000le, 0, 0, mmr4000le, 0, jazz_state, init_common, "MIPS", "Magnum R4000 (little)", MACHINE_IS_SKELETON)
|
97
src/mame/includes/jazz.h
Normal file
97
src/mame/includes/jazz.h
Normal file
@ -0,0 +1,97 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Patrick Mackinlay
|
||||
|
||||
#ifndef MAME_INCLUDES_JAZZ_H
|
||||
#define MAME_INCLUDES_JAZZ_H
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "cpu/mips/mips3.h"
|
||||
|
||||
// memory
|
||||
#include "machine/ram.h"
|
||||
#include "machine/nvram.h"
|
||||
#include "machine/28fxxx.h"
|
||||
|
||||
// various hardware
|
||||
#include "machine/jazz_mct_adr.h"
|
||||
#include "machine/dp83932c.h"
|
||||
#include "machine/mc146818.h"
|
||||
#include "machine/ncr5390.h"
|
||||
#include "machine/upd765.h"
|
||||
#include "machine/at_keybc.h"
|
||||
|
||||
// video
|
||||
#include "screen.h"
|
||||
#include "video/ims_cvc.h"
|
||||
|
||||
// busses and connectors
|
||||
#include "machine/nscsi_bus.h"
|
||||
#include "machine/nscsi_cd.h"
|
||||
#include "machine/nscsi_hd.h"
|
||||
#include "bus/rs232/rs232.h"
|
||||
#include "bus/pc_kbd/pc_kbdc.h"
|
||||
#include "bus/pc_kbd/keyboards.h"
|
||||
|
||||
class jazz_state : public driver_device
|
||||
{
|
||||
public:
|
||||
jazz_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||
: driver_device(mconfig, type, tag)
|
||||
, m_maincpu(*this, "cpu")
|
||||
, m_ram(*this, "ram")
|
||||
, m_mct_adr(*this, "mct_adr")
|
||||
, m_scsibus(*this, "scsi")
|
||||
, m_scsi(*this, "scsi:7:host")
|
||||
, m_fdc(*this, "fdc")
|
||||
, m_rtc(*this, "rtc")
|
||||
, m_nvram(*this, "nvram")
|
||||
, m_flash(*this, "flash")
|
||||
, m_kbdc(*this, "kbdc")
|
||||
, m_network(*this, "net")
|
||||
, m_ramdac(*this, "g364")
|
||||
{
|
||||
}
|
||||
|
||||
protected:
|
||||
// driver_device overrides
|
||||
virtual void machine_start() override;
|
||||
virtual void machine_reset() override;
|
||||
|
||||
// address maps
|
||||
void jazz_common_map(address_map &map);
|
||||
|
||||
// machine config
|
||||
void jazz(machine_config &config);
|
||||
public:
|
||||
void mmr4000be(machine_config &config);
|
||||
void mmr4000le(machine_config &config);
|
||||
|
||||
void init_common();
|
||||
|
||||
protected:
|
||||
// devices
|
||||
required_device<mips3_device> m_maincpu;
|
||||
required_device<ram_device> m_ram;
|
||||
required_device<jazz_mct_adr_device> m_mct_adr;
|
||||
required_device<nscsi_bus_device> m_scsibus;
|
||||
required_device<ncr5390_device> m_scsi;
|
||||
required_device<n82077aa_device> m_fdc;
|
||||
required_device<mc146818_device> m_rtc;
|
||||
required_device<nvram_device> m_nvram;
|
||||
required_device<amd_28f020_device> m_flash;
|
||||
required_device<at_keyboard_controller_device> m_kbdc;
|
||||
required_device<dp83932c_device> m_network;
|
||||
//required_device<screen_device> m_screen;
|
||||
required_device<g364_device> m_ramdac;
|
||||
|
||||
// helpers
|
||||
u8 led_r() { return m_led; }
|
||||
void led_w(const u8 data) { logerror("led 0x%02x\n", data); m_led = data; }
|
||||
|
||||
private:
|
||||
// machine state
|
||||
u8 m_led;
|
||||
};
|
||||
|
||||
#endif // MAME_INCLUDES_JAZZ_H
|
51
src/mame/machine/jazz_mct_adr.cpp
Normal file
51
src/mame/machine/jazz_mct_adr.cpp
Normal file
@ -0,0 +1,51 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Patrick Mackinlay
|
||||
|
||||
/*
|
||||
* An implementation of the MCT-ADR device found in Microsoft Jazz/MIPS
|
||||
* ARCSystem 100 architecture systems. This device was originally designed
|
||||
* by Microsoft, and then implemented and used in various forms by MIPS,
|
||||
* Olivetti, LSI Logic, NEC, Acer and others.
|
||||
*
|
||||
* Specific implementations/derivatives include:
|
||||
*
|
||||
* LSI Logic R4030/R4230
|
||||
* NEC μPD31432
|
||||
* ALI M6101-A1
|
||||
*
|
||||
* References:
|
||||
*
|
||||
* https://datasheet.datasheetarchive.com/originals/scans/Scans-054/DSAIH000102184.pdf
|
||||
* https://github.com/torvalds/linux/tree/master/arch/mips/jazz/
|
||||
* http://cvsweb.netbsd.org/bsdweb.cgi/src/sys/arch/arc/jazz/
|
||||
*
|
||||
* TODO
|
||||
* - everything (skeleton only)
|
||||
*/
|
||||
|
||||
#include "emu.h"
|
||||
#include "jazz_mct_adr.h"
|
||||
|
||||
#define VERBOSE 0
|
||||
#include "logmacro.h"
|
||||
|
||||
DEFINE_DEVICE_TYPE(JAZZ_MCT_ADR, jazz_mct_adr_device, "jazz_mct_adr", "Jazz MCT-ADR")
|
||||
|
||||
jazz_mct_adr_device::jazz_mct_adr_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
|
||||
: device_t(mconfig, JAZZ_MCT_ADR, tag, owner, clock)
|
||||
{
|
||||
}
|
||||
|
||||
void jazz_mct_adr_device::map(address_map &map)
|
||||
{
|
||||
map(0x000, 0x003).lr32("config", [](){ return 0x00000000; });
|
||||
map(0x008, 0x00b).lr32("revision", [](){ return 0xf0000000; });
|
||||
}
|
||||
|
||||
void jazz_mct_adr_device::device_start()
|
||||
{
|
||||
}
|
||||
|
||||
void jazz_mct_adr_device::device_reset()
|
||||
{
|
||||
}
|
25
src/mame/machine/jazz_mct_adr.h
Normal file
25
src/mame/machine/jazz_mct_adr.h
Normal file
@ -0,0 +1,25 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Patrick Mackinlay
|
||||
|
||||
#ifndef MAME_MACHINE_JAZZ_MCT_ADR_H
|
||||
#define MAME_MACHINE_JAZZ_MCT_ADR_H
|
||||
|
||||
#pragma once
|
||||
|
||||
class jazz_mct_adr_device : public device_t
|
||||
{
|
||||
public:
|
||||
jazz_mct_adr_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
|
||||
|
||||
virtual void map(address_map &map);
|
||||
|
||||
protected:
|
||||
// device_t overrides
|
||||
virtual void device_start() override;
|
||||
virtual void device_reset() override;
|
||||
};
|
||||
|
||||
// device type definition
|
||||
DECLARE_DEVICE_TYPE(JAZZ_MCT_ADR, jazz_mct_adr_device)
|
||||
|
||||
#endif // MAME_MACHINE_JAZZ_MCT_ADR_H
|
@ -15922,6 +15922,10 @@ jankenmn // (c) 1985 Sunwise
|
||||
@source:jantotsu.cpp
|
||||
jantotsu // (c) 1983 Sanritsu
|
||||
|
||||
@source:jazz.cpp
|
||||
mmr4000be // MIPS Magnum R4000 (big)
|
||||
mmr4000le // MIPS Magnum R4000 (little)
|
||||
|
||||
@source:jchan.cpp
|
||||
jchan // (c) 1995 Kaneko
|
||||
jchan2 // (c) 1995 Kaneko
|
||||
|
Loading…
Reference in New Issue
Block a user