mirror of
https://github.com/holub/mame
synced 2025-07-08 03:12:37 +03:00
a2bus: Add (corrected) ROM dumps and emulation of CCS Model 7710 Asynchronous Serial Interface [AJR, Apple II Documentation Project]
This commit is contained in:
parent
5bf175cb05
commit
f7585b3cdb
@ -2395,6 +2395,8 @@ if (BUSES["A2BUS"]~=null) then
|
||||
MAME_DIR .. "src/devices/bus/a2bus/agat840k_hle.h",
|
||||
MAME_DIR .. "src/devices/bus/a2bus/byte8251.cpp",
|
||||
MAME_DIR .. "src/devices/bus/a2bus/byte8251.h",
|
||||
MAME_DIR .. "src/devices/bus/a2bus/ccs7710.cpp",
|
||||
MAME_DIR .. "src/devices/bus/a2bus/ccs7710.h",
|
||||
MAME_DIR .. "src/devices/bus/a2bus/cmsscsi.cpp",
|
||||
MAME_DIR .. "src/devices/bus/a2bus/cmsscsi.h",
|
||||
MAME_DIR .. "src/devices/bus/a2bus/computereyes2.cpp",
|
||||
|
155
src/devices/bus/a2bus/ccs7710.cpp
Normal file
155
src/devices/bus/a2bus/ccs7710.cpp
Normal file
@ -0,0 +1,155 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:AJR
|
||||
/*********************************************************************
|
||||
|
||||
California Computer Systems, Inc. Model 7710
|
||||
Asynchronous Serial Interface (ASI-1)
|
||||
|
||||
One unusual feature of this small RS-232-C communications card
|
||||
which is not relevant for emulation is that the DP8304B bus
|
||||
buffer and program ROMs are powered down when they are not being
|
||||
accessed. Another unemulated feature is a suggested modification
|
||||
to replace the two 256×4 program ROMs with like-sized 2112 RAMs
|
||||
(the R/W bus signal is enabled to these with a jumper connection)
|
||||
so that custom firmware can be uploaded instead.
|
||||
|
||||
The 7710-02 terminal firmware is incompatible with the Apple IIe
|
||||
due to the use of a II+-specific monitor location. One recommended
|
||||
way to work around this problem was to load the II+ monitor into
|
||||
the IIe's language card. The incompatibility was corrected in
|
||||
7710-03, and the 7710-03 ROMs were the only ones delivered after
|
||||
July 1983.
|
||||
|
||||
**********************************************************************/
|
||||
|
||||
#include "emu.h"
|
||||
#include "ccs7710.h"
|
||||
|
||||
#include "bus/rs232/rs232.h"
|
||||
|
||||
//**************************************************************************
|
||||
// GLOBAL VARIABLES
|
||||
//**************************************************************************
|
||||
|
||||
// device type definition
|
||||
DEFINE_DEVICE_TYPE(A2BUS_CCS7710, ccs7710_device, "ccs7710", "CCS Model 7710 Asynchronous Serial Interface")
|
||||
|
||||
//**************************************************************************
|
||||
// DEVICE IMPLEMENTATION
|
||||
//**************************************************************************
|
||||
|
||||
ccs7710_device::ccs7710_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
|
||||
: device_t(mconfig, A2BUS_CCS7710, tag, owner, clock)
|
||||
, device_a2bus_card_interface(mconfig, *this)
|
||||
, m_acia(*this, "acia")
|
||||
, m_brg(*this, "brg")
|
||||
, m_firmware(*this, "firmware")
|
||||
, m_baud_select(*this, "BAUD")
|
||||
, m_external_clock(false)
|
||||
{
|
||||
}
|
||||
|
||||
void ccs7710_device::device_start()
|
||||
{
|
||||
save_item(NAME(m_external_clock));
|
||||
}
|
||||
|
||||
u8 ccs7710_device::read_c0nx(u8 offset)
|
||||
{
|
||||
return m_acia->read(offset & 1);
|
||||
}
|
||||
|
||||
void ccs7710_device::write_c0nx(u8 offset, u8 data)
|
||||
{
|
||||
m_acia->write(offset & 1, data);
|
||||
}
|
||||
|
||||
u8 ccs7710_device::read_cnxx(u8 offset)
|
||||
{
|
||||
return m_firmware[offset];
|
||||
}
|
||||
|
||||
WRITE_LINE_MEMBER(ccs7710_device::acia_irq_w)
|
||||
{
|
||||
if (state == ASSERT_LINE)
|
||||
raise_slot_irq();
|
||||
else
|
||||
lower_slot_irq();
|
||||
}
|
||||
|
||||
WRITE_LINE_MEMBER(ccs7710_device::external_clock_w)
|
||||
{
|
||||
m_external_clock = state;
|
||||
if (!BIT(m_baud_select->read(), 0))
|
||||
m_brg->im_w(state);
|
||||
}
|
||||
|
||||
u8 ccs7710_device::baud_select_r(offs_t offset)
|
||||
{
|
||||
u8 baud = m_baud_select->read();
|
||||
m_brg->im_w(BIT(baud, 0) ? !BIT(offset, 2) : m_external_clock);
|
||||
return baud;
|
||||
}
|
||||
|
||||
static INPUT_PORTS_START(ccs7710)
|
||||
PORT_START("BAUD")
|
||||
PORT_DIPNAME(0xf, 0x8, "Baud Rate") PORT_DIPLOCATION("S1:1,2,3,4")
|
||||
PORT_DIPSETTING(0x0, "External")
|
||||
PORT_DIPSETTING(0x2, "50")
|
||||
PORT_DIPSETTING(0x3, "75")
|
||||
PORT_DIPSETTING(0xf, "110")
|
||||
PORT_DIPSETTING(0x4, "134.5")
|
||||
PORT_DIPSETTING(0xe, "150")
|
||||
PORT_DIPSETTING(0x5, "200")
|
||||
PORT_DIPSETTING(0xd, "300")
|
||||
PORT_DIPSETTING(0x6, "600")
|
||||
PORT_DIPSETTING(0xb, "1200")
|
||||
PORT_DIPSETTING(0xa, "1800")
|
||||
PORT_DIPSETTING(0x7, "2400")
|
||||
PORT_DIPSETTING(0x9, "4800")
|
||||
PORT_DIPSETTING(0x8, "9600")
|
||||
PORT_DIPSETTING(0x1, "19200")
|
||||
INPUT_PORTS_END
|
||||
|
||||
ioport_constructor ccs7710_device::device_input_ports() const
|
||||
{
|
||||
return INPUT_PORTS_NAME(ccs7710);
|
||||
}
|
||||
|
||||
void ccs7710_device::device_add_mconfig(machine_config &config)
|
||||
{
|
||||
ACIA6850(config, m_acia);
|
||||
m_acia->rts_handler().set("rs232", FUNC(rs232_port_device::write_rts));
|
||||
m_acia->txd_handler().set("rs232", FUNC(rs232_port_device::write_txd));
|
||||
m_acia->irq_handler().set(FUNC(ccs7710_device::acia_irq_w));
|
||||
|
||||
F4702(config, m_brg, 2.4576_MHz_XTAL);
|
||||
m_brg->s_callback().set(FUNC(ccs7710_device::baud_select_r));
|
||||
m_brg->z_callback().set(m_acia, FUNC(acia6850_device::write_rxc));
|
||||
m_brg->z_callback().append(m_acia, FUNC(acia6850_device::write_txc));
|
||||
|
||||
rs232_port_device &rs232(RS232_PORT(config, "rs232", default_rs232_devices, nullptr));
|
||||
rs232.rxd_handler().set(m_acia, FUNC(acia6850_device::write_rxd));
|
||||
rs232.cts_handler().set(m_acia, FUNC(acia6850_device::write_cts));
|
||||
rs232.dcd_handler().set(m_acia, FUNC(acia6850_device::write_dcd));
|
||||
rs232.txc_handler().set(FUNC(ccs7710_device::external_clock_w));
|
||||
}
|
||||
|
||||
ROM_START(ccs7710)
|
||||
ROM_REGION(0x100, "firmware", 0)
|
||||
ROM_DEFAULT_BIOS("7710-03")
|
||||
ROM_SYSTEM_BIOS(0, "7710-01", "CCS 7710-01")
|
||||
ROMX_LOAD("7710-01h.u5", 0x000, 0x100, CRC(4f4b1023) SHA1(4f96f9cbbad383c259d4a3f8762263d01532c735), ROM_BIOS(0) | ROM_NIBBLE | ROM_SHIFT_NIBBLE_HI)
|
||||
ROMX_LOAD("7710-01l.u6", 0x000, 0x100, CRC(1dab7113) SHA1(c9c7b8b73db90fa008c8779b1d75ac265ec6ca2f), ROM_BIOS(0) | ROM_NIBBLE | ROM_SHIFT_NIBBLE_LO)
|
||||
ROM_SYSTEM_BIOS(1, "7710-02", "CCS 7710-02")
|
||||
ROMX_LOAD("7710-02h.u5", 0x000, 0x100, CRC(46ded0cc) SHA1(62a087e3a1790a9910561d84001acaa9ec804194), ROM_BIOS(1) | ROM_NIBBLE | ROM_SHIFT_NIBBLE_HI)
|
||||
ROMX_LOAD("7710-02l.u6", 0x000, 0x100, CRC(d4922d69) SHA1(a651dbd3faba9476aff382952266188f3cb05f16), ROM_BIOS(1) | ROM_NIBBLE | ROM_SHIFT_NIBBLE_LO)
|
||||
ROM_SYSTEM_BIOS(2, "7710-03", "CCS 7710-03")
|
||||
ROMX_LOAD("7710-03h.u5", 0x000, 0x100, CRC(a2cdb6bd) SHA1(6ecfb6b145256d4787a943da8ef267303df562d6), ROM_BIOS(2) | ROM_NIBBLE | ROM_SHIFT_NIBBLE_HI)
|
||||
ROMX_LOAD("7710-03l.u6", 0x000, 0x100, CRC(18e3983f) SHA1(d0df2aaf0134f8c1b929a4de0036fedc7e7164e2), ROM_BIOS(2) | ROM_NIBBLE | ROM_SHIFT_NIBBLE_LO)
|
||||
ROM_END
|
||||
|
||||
const tiny_rom_entry *ccs7710_device::device_rom_region() const
|
||||
{
|
||||
return ROM_NAME(ccs7710);
|
||||
}
|
55
src/devices/bus/a2bus/ccs7710.h
Normal file
55
src/devices/bus/a2bus/ccs7710.h
Normal file
@ -0,0 +1,55 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:AJR
|
||||
/*********************************************************************
|
||||
|
||||
CCS Model 7710 Asynchronous Serial Interface
|
||||
|
||||
*********************************************************************/
|
||||
|
||||
#ifndef MAME_BUS_A2BUS_CCS7710_H
|
||||
#define MAME_BUS_A2BUS_CCS7710_H
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "a2bus.h"
|
||||
#include "machine/6850acia.h"
|
||||
#include "machine/f4702.h"
|
||||
|
||||
class ccs7710_device : public device_t, public device_a2bus_card_interface
|
||||
{
|
||||
public:
|
||||
// device type constructor
|
||||
ccs7710_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
|
||||
|
||||
protected:
|
||||
// device-level overrides
|
||||
virtual void device_start() override;
|
||||
virtual ioport_constructor device_input_ports() const override;
|
||||
virtual void device_add_mconfig(machine_config &config) override;
|
||||
virtual const tiny_rom_entry *device_rom_region() const override;
|
||||
|
||||
// device_a2bus_card_interface overrides
|
||||
virtual u8 read_c0nx(u8 offset) override;
|
||||
virtual void write_c0nx(u8 offset, u8 data) override;
|
||||
virtual u8 read_cnxx(u8 offset) override;
|
||||
|
||||
private:
|
||||
// miscellaneous handlers
|
||||
DECLARE_WRITE_LINE_MEMBER(acia_irq_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(external_clock_w);
|
||||
u8 baud_select_r(offs_t offset);
|
||||
|
||||
// object finders
|
||||
required_device<acia6850_device> m_acia;
|
||||
required_device<f4702_device> m_brg;
|
||||
required_region_ptr<u8> m_firmware;
|
||||
required_ioport m_baud_select;
|
||||
|
||||
// internal state
|
||||
bool m_external_clock;
|
||||
};
|
||||
|
||||
// device type declaration
|
||||
DECLARE_DEVICE_TYPE(A2BUS_CCS7710, ccs7710_device)
|
||||
|
||||
#endif // MAME_BUS_A2BUS_CCS7710_H
|
@ -83,6 +83,7 @@ II Plus: RAM options reduced to 16/32/48 KB.
|
||||
#include "bus/a2bus/a2zipdrive.h"
|
||||
#include "bus/a2bus/byte8251.h"
|
||||
#include "bus/a2bus/computereyes2.h"
|
||||
#include "bus/a2bus/ccs7710.h"
|
||||
#include "bus/a2bus/ezcgi.h"
|
||||
#include "bus/a2bus/grapplerplus.h"
|
||||
#include "bus/a2bus/laser128.h"
|
||||
@ -1330,6 +1331,7 @@ static void apple2_cards(device_slot_interface &device)
|
||||
device.option_add("byte8251", A2BUS_BYTE8251); /* BYTE Magazine 8251 serial card */
|
||||
device.option_add("suprterm", A2BUS_SUPRTERMINAL); /* M&R Enterprises SUP'R'TERMINAL 80-column card */
|
||||
device.option_add("uniprint", A2BUS_UNIPRINT); /* Videx Uniprint parallel printer card */
|
||||
device.option_add("ccs7710", A2BUS_CCS7710); /* California Computer Systems Model 7710 Asynchronous Serial Interface */
|
||||
}
|
||||
|
||||
void apple2_state::apple2_common(machine_config &config)
|
||||
|
@ -168,6 +168,7 @@ MIG RAM page 2 $CE02 is the speaker/slot bitfield and $CE03 is the paddle/accele
|
||||
#include "bus/a2bus/byte8251.h"
|
||||
#include "bus/a2bus/cmsscsi.h"
|
||||
#include "bus/a2bus/computereyes2.h"
|
||||
#include "bus/a2bus/ccs7710.h"
|
||||
#include "bus/a2bus/ezcgi.h"
|
||||
#include "bus/a2bus/grapplerplus.h"
|
||||
#include "bus/a2bus/laser128.h"
|
||||
@ -4562,6 +4563,7 @@ static void apple2_cards(device_slot_interface &device)
|
||||
device.option_add("sider2", A2BUS_SIDER2); /* Advanced Tech Systems / First Class Peripherals Sider 2 SASI card */
|
||||
device.option_add("sider1", A2BUS_SIDER1); /* Advanced Tech Systems / First Class Peripherals Sider 1 SASI card */
|
||||
device.option_add("uniprint", A2BUS_UNIPRINT); /* Videx Uniprint parallel printer card */
|
||||
device.option_add("ccs7710", A2BUS_CCS7710); /* California Computer Systems Model 7710 Asynchronous Serial Interface */
|
||||
}
|
||||
|
||||
static void apple2eaux_cards(device_slot_interface &device)
|
||||
|
@ -112,6 +112,7 @@
|
||||
#include "bus/a2bus/a2vulcan.h"
|
||||
#include "bus/a2bus/a2zipdrive.h"
|
||||
#include "bus/a2bus/byte8251.h"
|
||||
#include "bus/a2bus/ccs7710.h"
|
||||
#include "bus/a2bus/cmsscsi.h"
|
||||
#include "bus/a2bus/ezcgi.h"
|
||||
#include "bus/a2bus/grapplerplus.h"
|
||||
@ -4765,6 +4766,7 @@ static void apple2_cards(device_slot_interface &device)
|
||||
device.option_add("sider2", A2BUS_SIDER2); /* Advanced Tech Systems / First Class Peripherals Sider 2 SASI card */
|
||||
device.option_add("sider1", A2BUS_SIDER1); /* Advanced Tech Systems / First Class Peripherals Sider 1 SASI card */
|
||||
device.option_add("uniprint", A2BUS_UNIPRINT); /* Videx Uniprint parallel printer card */
|
||||
device.option_add("ccs7710", A2BUS_CCS7710); /* California Computer Systems Model 7710 Asynchronous Serial Interface */
|
||||
}
|
||||
|
||||
void apple2gs_state::apple2gs(machine_config &config)
|
||||
|
Loading…
Reference in New Issue
Block a user