mirror of
https://github.com/holub/mame
synced 2025-06-07 13:23:50 +03:00
-am2901b: Added a skeleton device for the AMD Am2901B 4-bit Bipolar Microprocessor Slice. [Ryan Holtz]
This commit is contained in:
parent
0336a4c86b
commit
e9ea36bf28
@ -94,6 +94,18 @@ if (MACHINES["AKIKO"]~=null) then
|
|||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
---------------------------------------------------
|
||||||
|
--
|
||||||
|
--@src/devices/machine/am2901b.h,MACHINES["AM2901B"] = true
|
||||||
|
---------------------------------------------------
|
||||||
|
|
||||||
|
if (MACHINES["AM2901B"]~=null) then
|
||||||
|
files {
|
||||||
|
MAME_DIR .. "src/devices/machine/am2901b.cpp",
|
||||||
|
MAME_DIR .. "src/devices/machine/am2901b.h",
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
--------------------------------------------------
|
--------------------------------------------------
|
||||||
--
|
--
|
||||||
--@src/devices/machine/arm_iomd.h,MACHINES["ARM_IOMD"] = true
|
--@src/devices/machine/arm_iomd.h,MACHINES["ARM_IOMD"] = true
|
||||||
|
@ -383,6 +383,7 @@ VIDEOS["VRENDER0"] = true
|
|||||||
|
|
||||||
MACHINES["ACORN_VIDC"] = true
|
MACHINES["ACORN_VIDC"] = true
|
||||||
MACHINES["AKIKO"] = true
|
MACHINES["AKIKO"] = true
|
||||||
|
--MACHINES["AM2901B"] = true
|
||||||
MACHINES["ARM_IOMD"] = true
|
MACHINES["ARM_IOMD"] = true
|
||||||
MACHINES["AUTOCONFIG"] = true
|
MACHINES["AUTOCONFIG"] = true
|
||||||
MACHINES["BUSMOUSE"] = true
|
MACHINES["BUSMOUSE"] = true
|
||||||
|
@ -420,6 +420,7 @@ VIDEOS["BT431"] = true
|
|||||||
--------------------------------------------------
|
--------------------------------------------------
|
||||||
|
|
||||||
MACHINES["AKIKO"] = true
|
MACHINES["AKIKO"] = true
|
||||||
|
MACHINES["AM2901B"] = true
|
||||||
MACHINES["AUTOCONFIG"] = true
|
MACHINES["AUTOCONFIG"] = true
|
||||||
MACHINES["BUSMOUSE"] = true
|
MACHINES["BUSMOUSE"] = true
|
||||||
MACHINES["CR511B"] = true
|
MACHINES["CR511B"] = true
|
||||||
|
228
src/devices/machine/am2901b.cpp
Normal file
228
src/devices/machine/am2901b.cpp
Normal file
@ -0,0 +1,228 @@
|
|||||||
|
// license:BSD-3-Clause
|
||||||
|
// copyright-holders:Ryan Holtz
|
||||||
|
/***************************************************************************
|
||||||
|
|
||||||
|
am2901b.cpp
|
||||||
|
AMD Am2901B / Am2901C
|
||||||
|
Four-Bit Bipolar Microprocessor Slice
|
||||||
|
|
||||||
|
To Do:
|
||||||
|
- Opcode hookup
|
||||||
|
- Verification
|
||||||
|
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
#include "emu.h"
|
||||||
|
#include "am2901b.h"
|
||||||
|
|
||||||
|
#define VERBOSE (1)
|
||||||
|
#include "logmacro.h"
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
DEFINE_DEVICE_TYPE(AM2901B, am2901b_device, "am2901b", "AMD Am2901B Bitslice Processor")
|
||||||
|
|
||||||
|
//-------------------------------------------------
|
||||||
|
// am2901b_device - constructor
|
||||||
|
//-------------------------------------------------
|
||||||
|
|
||||||
|
am2901b_device::am2901b_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
|
||||||
|
: device_t(mconfig, AM2901B, tag, owner, clock)
|
||||||
|
, m_d(0)
|
||||||
|
, m_q(0)
|
||||||
|
, m_i(0)
|
||||||
|
, m_a_addr(0)
|
||||||
|
, m_b_addr(0)
|
||||||
|
, m_a_latch(0)
|
||||||
|
, m_b_latch(0)
|
||||||
|
, m_q0_in(false)
|
||||||
|
, m_q3_in(false)
|
||||||
|
, m_ram0_in(false)
|
||||||
|
, m_ram3_in(false)
|
||||||
|
, m_ci(false)
|
||||||
|
, m_cp(false)
|
||||||
|
, m_y_out(0)
|
||||||
|
, m_g_out(true)
|
||||||
|
, m_p_out(true)
|
||||||
|
, m_ovr_out(false)
|
||||||
|
, m_f0_out(true)
|
||||||
|
, m_f3_out(false)
|
||||||
|
, m_co_out(false)
|
||||||
|
, m_y(*this)
|
||||||
|
, m_g(*this)
|
||||||
|
, m_p(*this)
|
||||||
|
, m_q0(*this)
|
||||||
|
, m_q3(*this)
|
||||||
|
, m_ram0(*this)
|
||||||
|
, m_ram3(*this)
|
||||||
|
, m_ovr(*this)
|
||||||
|
, m_f0(*this)
|
||||||
|
, m_f3(*this)
|
||||||
|
, m_co(*this)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void am2901b_device::device_start()
|
||||||
|
{
|
||||||
|
save_item(NAME(m_a));
|
||||||
|
save_item(NAME(m_d));
|
||||||
|
save_item(NAME(m_q));
|
||||||
|
save_item(NAME(m_i));
|
||||||
|
|
||||||
|
save_item(NAME(m_a_addr));
|
||||||
|
save_item(NAME(m_b_addr));
|
||||||
|
|
||||||
|
save_item(NAME(m_a_latch));
|
||||||
|
save_item(NAME(m_b_latch));
|
||||||
|
|
||||||
|
save_item(NAME(m_q0_in));
|
||||||
|
save_item(NAME(m_q3_in));
|
||||||
|
save_item(NAME(m_ram0_in));
|
||||||
|
save_item(NAME(m_ram3_in));
|
||||||
|
save_item(NAME(m_ci));
|
||||||
|
save_item(NAME(m_cp));
|
||||||
|
|
||||||
|
save_item(NAME(m_y_out));
|
||||||
|
save_item(NAME(m_g_out));
|
||||||
|
save_item(NAME(m_p_out));
|
||||||
|
save_item(NAME(m_q0_out));
|
||||||
|
save_item(NAME(m_q3_out));
|
||||||
|
save_item(NAME(m_ram0_out));
|
||||||
|
save_item(NAME(m_ram3_out));
|
||||||
|
save_item(NAME(m_ovr_out));
|
||||||
|
save_item(NAME(m_f0_out));
|
||||||
|
save_item(NAME(m_f3_out));
|
||||||
|
save_item(NAME(m_co_out));
|
||||||
|
|
||||||
|
m_y.resolve_safe();
|
||||||
|
m_g.resolve_safe();
|
||||||
|
m_p.resolve_safe();
|
||||||
|
m_q0.resolve_safe();
|
||||||
|
m_q3.resolve_safe();
|
||||||
|
m_ram0.resolve_safe();
|
||||||
|
m_ram3.resolve_safe();
|
||||||
|
m_ovr.resolve_safe();
|
||||||
|
m_f0.resolve_safe();
|
||||||
|
m_f3.resolve_safe();
|
||||||
|
m_co.resolve_safe();
|
||||||
|
}
|
||||||
|
|
||||||
|
void am2901b_device::device_reset()
|
||||||
|
{
|
||||||
|
memset(m_a, 0, sizeof(uint8_t) * 16);
|
||||||
|
m_d = 0;
|
||||||
|
m_q = 0;
|
||||||
|
m_i = 0;
|
||||||
|
|
||||||
|
m_a_addr = 0;
|
||||||
|
m_b_addr = 0;
|
||||||
|
|
||||||
|
m_a_latch = 0;
|
||||||
|
m_b_latch = 0;
|
||||||
|
|
||||||
|
m_q0_in = false;
|
||||||
|
m_q3_in = false;
|
||||||
|
m_ram0_in = false;
|
||||||
|
m_ram3_in = false;
|
||||||
|
m_ci = false;
|
||||||
|
m_cp = false;
|
||||||
|
|
||||||
|
m_y_out = 0;
|
||||||
|
m_g_out = true;
|
||||||
|
m_p_out = true;
|
||||||
|
m_q0_out = false;
|
||||||
|
m_q3_out = false;
|
||||||
|
m_ram0_out = false;
|
||||||
|
m_ram3_out = false;
|
||||||
|
m_ovr_out = false;
|
||||||
|
m_f0_out = true;
|
||||||
|
m_f3_out = false;
|
||||||
|
m_co_out = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void am2901b_device::a_w(uint8_t data)
|
||||||
|
{
|
||||||
|
m_a_addr = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
void am2901b_device::b_w(uint8_t data)
|
||||||
|
{
|
||||||
|
m_b_addr = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
void am2901b_device::d_w(uint8_t data)
|
||||||
|
{
|
||||||
|
m_d = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
void am2901b_device::i_w(uint16_t data)
|
||||||
|
{
|
||||||
|
m_i = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
WRITE_LINE_MEMBER(am2901b_device::q0_w)
|
||||||
|
{
|
||||||
|
m_q0_in = (bool)state;
|
||||||
|
}
|
||||||
|
|
||||||
|
WRITE_LINE_MEMBER(am2901b_device::q3_w)
|
||||||
|
{
|
||||||
|
m_q3_in = (bool)state;
|
||||||
|
}
|
||||||
|
|
||||||
|
WRITE_LINE_MEMBER(am2901b_device::ram0_w)
|
||||||
|
{
|
||||||
|
m_ram0_in = (bool)state;
|
||||||
|
}
|
||||||
|
|
||||||
|
WRITE_LINE_MEMBER(am2901b_device::ram3_w)
|
||||||
|
{
|
||||||
|
m_ram3_in = (bool)state;
|
||||||
|
}
|
||||||
|
|
||||||
|
WRITE_LINE_MEMBER(am2901b_device::ci_w)
|
||||||
|
{
|
||||||
|
m_ci = (bool)state;
|
||||||
|
}
|
||||||
|
|
||||||
|
WRITE_LINE_MEMBER(am2901b_device::cp_w)
|
||||||
|
{
|
||||||
|
bool old = m_cp;
|
||||||
|
m_cp = (bool)state;
|
||||||
|
if (!old && m_cp)
|
||||||
|
{
|
||||||
|
m_a_latch = m_a[m_a_addr];
|
||||||
|
m_b_latch = m_a[m_b_addr];
|
||||||
|
execute();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void am2901b_device::execute()
|
||||||
|
{
|
||||||
|
disassemble();
|
||||||
|
}
|
||||||
|
|
||||||
|
void am2901b_device::disassemble()
|
||||||
|
{
|
||||||
|
static const char s_r_table[8] = { 'A', 'A', '0', '0', '0', 'D', 'D', 'D' };
|
||||||
|
static const char s_s_table[8] = { 'Q', 'B', 'Q', 'B', 'A', 'A', 'Q', '0' };
|
||||||
|
static const char *const s_func_table[8] =
|
||||||
|
{
|
||||||
|
"ADD", "SUBR", "SUBS", "OR", "AND", "NOTRS", "EXOR", "EXNOR"
|
||||||
|
};
|
||||||
|
static const char *const s_dst_table[8] =
|
||||||
|
{
|
||||||
|
"QREG", "NOP", "RAMA", "RAMF", "RAMQD", "RAMD", "RAMQU", "RAMU"
|
||||||
|
};
|
||||||
|
|
||||||
|
char dasm_buf[64];
|
||||||
|
int buf_idx = snprintf(dasm_buf, ARRAY_LENGTH(dasm_buf), "%s %s", s_func_table[(m_i >> 3) & 7], s_dst_table[(m_i >> 6) & 7]);
|
||||||
|
while (buf_idx < 12)
|
||||||
|
{
|
||||||
|
dasm_buf[buf_idx] = ' ';
|
||||||
|
buf_idx++;
|
||||||
|
}
|
||||||
|
snprintf(dasm_buf + buf_idx, ARRAY_LENGTH(dasm_buf) - 12, "%c,%c", s_r_table[m_i & 7], s_s_table[m_i & 7]);
|
||||||
|
|
||||||
|
LOG("%s: %s\n", machine().describe_context(), dasm_buf);
|
||||||
|
}
|
105
src/devices/machine/am2901b.h
Normal file
105
src/devices/machine/am2901b.h
Normal file
@ -0,0 +1,105 @@
|
|||||||
|
// license:BSD-3-Clause
|
||||||
|
// copyright-holders:Ryan Holtz
|
||||||
|
/***************************************************************************
|
||||||
|
|
||||||
|
am2901b.h
|
||||||
|
AMD Am2901B / Am2901C
|
||||||
|
Four-Bit Bipolar Microprocessor Slice
|
||||||
|
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
#ifndef MAME_MACHINE_AM2901B_H
|
||||||
|
#define MAME_MACHINE_AM2901B_H
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
//**************************************************************************
|
||||||
|
// TYPE DEFINITIONS
|
||||||
|
//**************************************************************************
|
||||||
|
|
||||||
|
// ======================> am2901b_device
|
||||||
|
|
||||||
|
class am2901b_device : public device_t
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
// construction/destruction
|
||||||
|
am2901b_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
|
||||||
|
|
||||||
|
auto y() { return m_y.bind(); }
|
||||||
|
auto g() { return m_g.bind(); }
|
||||||
|
auto p() { return m_p.bind(); }
|
||||||
|
auto q0() { return m_q0.bind(); }
|
||||||
|
auto q3() { return m_q3.bind(); }
|
||||||
|
auto ram0() { return m_ram0.bind(); }
|
||||||
|
auto ram3() { return m_ram3.bind(); }
|
||||||
|
auto ovr() { return m_ovr.bind(); }
|
||||||
|
auto f0() { return m_f0.bind(); }
|
||||||
|
auto f3() { return m_f3.bind(); }
|
||||||
|
|
||||||
|
void a_w(uint8_t data);
|
||||||
|
void b_w(uint8_t data);
|
||||||
|
void d_w(uint8_t data);
|
||||||
|
void i_w(uint16_t data);
|
||||||
|
|
||||||
|
DECLARE_WRITE_LINE_MEMBER(q0_w);
|
||||||
|
DECLARE_WRITE_LINE_MEMBER(q3_w);
|
||||||
|
DECLARE_WRITE_LINE_MEMBER(ram0_w);
|
||||||
|
DECLARE_WRITE_LINE_MEMBER(ram3_w);
|
||||||
|
DECLARE_WRITE_LINE_MEMBER(ci_w);
|
||||||
|
DECLARE_WRITE_LINE_MEMBER(cp_w);
|
||||||
|
|
||||||
|
private:
|
||||||
|
// device-level overrides
|
||||||
|
virtual void device_start() override;
|
||||||
|
virtual void device_reset() override;
|
||||||
|
|
||||||
|
void execute();
|
||||||
|
void disassemble();
|
||||||
|
|
||||||
|
uint8_t m_a[16];
|
||||||
|
uint8_t m_d;
|
||||||
|
uint8_t m_q;
|
||||||
|
uint16_t m_i;
|
||||||
|
|
||||||
|
uint8_t m_a_addr;
|
||||||
|
uint8_t m_b_addr;
|
||||||
|
|
||||||
|
uint8_t m_a_latch;
|
||||||
|
uint8_t m_b_latch;
|
||||||
|
|
||||||
|
bool m_q0_in;
|
||||||
|
bool m_q3_in;
|
||||||
|
bool m_ram0_in;
|
||||||
|
bool m_ram3_in;
|
||||||
|
bool m_ci;
|
||||||
|
bool m_cp;
|
||||||
|
|
||||||
|
uint8_t m_y_out;
|
||||||
|
bool m_g_out;
|
||||||
|
bool m_p_out;
|
||||||
|
bool m_q0_out;
|
||||||
|
bool m_q3_out;
|
||||||
|
bool m_ram0_out;
|
||||||
|
bool m_ram3_out;
|
||||||
|
bool m_ovr_out;
|
||||||
|
bool m_f0_out;
|
||||||
|
bool m_f3_out;
|
||||||
|
bool m_co_out;
|
||||||
|
|
||||||
|
devcb_write8 m_y;
|
||||||
|
devcb_write_line m_g;
|
||||||
|
devcb_write_line m_p;
|
||||||
|
devcb_write_line m_q0;
|
||||||
|
devcb_write_line m_q3;
|
||||||
|
devcb_write_line m_ram0;
|
||||||
|
devcb_write_line m_ram3;
|
||||||
|
devcb_write_line m_ovr;
|
||||||
|
devcb_write_line m_f0;
|
||||||
|
devcb_write_line m_f3;
|
||||||
|
devcb_write_line m_co;
|
||||||
|
};
|
||||||
|
|
||||||
|
// device type definition
|
||||||
|
DECLARE_DEVICE_TYPE(AM2901B, am2901b_device)
|
||||||
|
|
||||||
|
#endif // MAME_MACHINE_AM2901B_H
|
@ -15,6 +15,7 @@
|
|||||||
#include "imagedev/floppy.h"
|
#include "imagedev/floppy.h"
|
||||||
#include "machine/6850acia.h"
|
#include "machine/6850acia.h"
|
||||||
#include "machine/am25s55x.h"
|
#include "machine/am25s55x.h"
|
||||||
|
#include "machine/am2901b.h"
|
||||||
#include "machine/am2910.h"
|
#include "machine/am2910.h"
|
||||||
#include "machine/com8116.h"
|
#include "machine/com8116.h"
|
||||||
#include "machine/fdc_pll.h"
|
#include "machine/fdc_pll.h"
|
||||||
@ -76,6 +77,10 @@ public:
|
|||||||
, m_filter_multprom(*this, "filter_multprom")
|
, m_filter_multprom(*this, "filter_multprom")
|
||||||
, m_filter_signal(nullptr)
|
, m_filter_signal(nullptr)
|
||||||
, m_filter_mult(nullptr)
|
, m_filter_mult(nullptr)
|
||||||
|
, m_size_yl(*this, "filter_de")
|
||||||
|
, m_size_yh(*this, "filter_df")
|
||||||
|
, m_size_xl(*this, "filter_dg")
|
||||||
|
, m_size_xh(*this, "filter_dh")
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -300,6 +305,11 @@ private:
|
|||||||
uint8_t m_filter_abbb[16];
|
uint8_t m_filter_abbb[16];
|
||||||
|
|
||||||
// Size Card
|
// Size Card
|
||||||
|
required_device<am2901b_device> m_size_yl;
|
||||||
|
required_device<am2901b_device> m_size_yh;
|
||||||
|
required_device<am2901b_device> m_size_xl;
|
||||||
|
required_device<am2901b_device> m_size_xh;
|
||||||
|
|
||||||
uint8_t m_size_h;
|
uint8_t m_size_h;
|
||||||
uint8_t m_size_v;
|
uint8_t m_size_v;
|
||||||
|
|
||||||
@ -1825,6 +1835,12 @@ void dpb7000_state::dpb7000(machine_config &config)
|
|||||||
m_fdd_serial->rxd_handler().set(FUNC(dpb7000_state::fddcpu_debug_rx));
|
m_fdd_serial->rxd_handler().set(FUNC(dpb7000_state::fddcpu_debug_rx));
|
||||||
|
|
||||||
config.set_perfect_quantum(m_fddcpu);
|
config.set_perfect_quantum(m_fddcpu);
|
||||||
|
|
||||||
|
// Size Card
|
||||||
|
AM2901B(config, m_size_yl);
|
||||||
|
AM2901B(config, m_size_yh);
|
||||||
|
AM2901B(config, m_size_xl);
|
||||||
|
AM2901B(config, m_size_xh);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user