mirror of
https://github.com/holub/mame
synced 2025-06-03 03:16:30 +03:00
ay31015: Remove baud clock generation from device emulation (not a built-in UART feature)
This commit is contained in:
parent
2db96447bc
commit
0a20e27372
@ -116,14 +116,10 @@ ay31015_device::ay31015_device(const machine_config &mconfig, device_type type,
|
||||
m_rx_bit_count(0),
|
||||
m_rx_parity(0),
|
||||
m_rx_pulses(0),
|
||||
m_rx_clock(0),
|
||||
m_rx_timer(nullptr),
|
||||
m_tx_data(0),
|
||||
m_tx_buffer(0),
|
||||
m_tx_parity(0),
|
||||
m_tx_pulses(0),
|
||||
m_tx_clock(0),
|
||||
m_tx_timer(nullptr),
|
||||
m_read_si_cb(*this),
|
||||
m_write_so_cb(*this),
|
||||
m_write_pe_cb(*this),
|
||||
@ -173,14 +169,6 @@ void ay31015_device::device_resolve_objects()
|
||||
|
||||
void ay31015_device::device_start()
|
||||
{
|
||||
m_rx_timer = timer_alloc(TIMER_RX);
|
||||
m_rx_timer->adjust(attotime::never);
|
||||
update_rx_timer();
|
||||
|
||||
m_tx_timer = timer_alloc(TIMER_TX);
|
||||
m_tx_timer->adjust(attotime::never);
|
||||
update_tx_timer();
|
||||
|
||||
save_item(NAME(m_pins));
|
||||
save_item(NAME(m_control_reg));
|
||||
save_item(NAME(m_status_reg));
|
||||
@ -194,14 +182,12 @@ void ay31015_device::device_start()
|
||||
save_item(NAME(m_rx_bit_count));
|
||||
save_item(NAME(m_rx_parity));
|
||||
save_item(NAME(m_rx_pulses));
|
||||
save_item(NAME(m_rx_clock));
|
||||
|
||||
save_item(NAME(m_tx_state));
|
||||
save_item(NAME(m_tx_data));
|
||||
save_item(NAME(m_tx_buffer));
|
||||
save_item(NAME(m_tx_parity));
|
||||
save_item(NAME(m_tx_pulses));
|
||||
save_item(NAME(m_tx_clock));
|
||||
}
|
||||
|
||||
//-------------------------------------------------
|
||||
@ -270,14 +256,6 @@ void ay31015_device::update_status_pins()
|
||||
update_status_pin(STATUS_EOC, EOC, m_write_eoc_cb);
|
||||
}
|
||||
|
||||
void ay31015_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
|
||||
{
|
||||
if (id == TIMER_RX)
|
||||
rx_process();
|
||||
else if(id == TIMER_TX)
|
||||
tx_process();
|
||||
}
|
||||
|
||||
/*************************************************** RECEIVE CONTROLS *************************************************/
|
||||
|
||||
|
||||
@ -732,54 +710,6 @@ int ay31015_device::get_output_pin( ay31015_device::output_pin pin )
|
||||
}
|
||||
|
||||
|
||||
inline void ay31015_device::update_rx_timer()
|
||||
{
|
||||
if (m_rx_clock > 0.0)
|
||||
{
|
||||
m_rx_timer->adjust(attotime::from_hz(m_rx_clock), 0, attotime::from_hz(m_rx_clock));
|
||||
}
|
||||
else
|
||||
{
|
||||
m_rx_timer->enable(0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
inline void ay31015_device::update_tx_timer()
|
||||
{
|
||||
if (m_tx_clock > 0.0)
|
||||
{
|
||||
m_tx_timer->adjust(attotime::from_hz(m_tx_clock), 0, attotime::from_hz(m_tx_clock));
|
||||
}
|
||||
else
|
||||
{
|
||||
m_tx_timer->enable(0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*-------------------------------------------------
|
||||
ay31015_set_receiver_clock - set receive clock
|
||||
-------------------------------------------------*/
|
||||
|
||||
void ay31015_device::set_receiver_clock( double new_clock )
|
||||
{
|
||||
m_rx_clock = new_clock;
|
||||
update_rx_timer();
|
||||
}
|
||||
|
||||
|
||||
/*-------------------------------------------------
|
||||
ay31015_set_transmitter_clock - set transmit clock
|
||||
-------------------------------------------------*/
|
||||
|
||||
void ay31015_device::set_transmitter_clock( double new_clock )
|
||||
{
|
||||
m_tx_clock = new_clock;
|
||||
update_tx_timer();
|
||||
}
|
||||
|
||||
|
||||
/*-------------------------------------------------
|
||||
ay31015_get_received_data - return a byte to the computer
|
||||
-------------------------------------------------*/
|
||||
|
@ -20,10 +20,6 @@ class ay31015_device : public device_t
|
||||
public:
|
||||
ay31015_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
|
||||
|
||||
void set_tx_clock(double tx_clock) { m_tx_clock = tx_clock; }
|
||||
void set_tx_clock(const XTAL &xtal) { set_tx_clock(xtal.dvalue()); }
|
||||
void set_rx_clock(double rx_clock) { m_rx_clock = rx_clock; }
|
||||
void set_rx_clock(const XTAL &xtal) { set_rx_clock(xtal.dvalue()); }
|
||||
void set_auto_rdav(bool auto_rdav) { m_auto_rdav = auto_rdav; }
|
||||
|
||||
auto read_si_callback() { return m_read_si_cb.bind(); }
|
||||
@ -58,12 +54,6 @@ public:
|
||||
DECLARE_READ_LINE_MEMBER(eoc_r) { return get_output_pin(EOC); }
|
||||
DECLARE_READ_LINE_MEMBER(so_r) { return get_output_pin(SO); }
|
||||
|
||||
/* Set a new transmitter clock (new_clock is in Hz) */
|
||||
void set_transmitter_clock( double new_clock );
|
||||
|
||||
/* Set a new receiver clock (new_clock is in Hz) */
|
||||
void set_receiver_clock( double new_clock );
|
||||
|
||||
/* Reead the received data */
|
||||
/* The received data is available on RD8-RD1 (pins 5-12) */
|
||||
uint8_t get_received_data();
|
||||
@ -114,16 +104,12 @@ protected:
|
||||
PREP_TIME
|
||||
};
|
||||
|
||||
static constexpr device_timer_id TIMER_RX = 0;
|
||||
static constexpr device_timer_id TIMER_TX = 1;
|
||||
|
||||
ay31015_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
|
||||
|
||||
// device-level overrides
|
||||
virtual void device_resolve_objects() override;
|
||||
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;
|
||||
|
||||
void rx_process();
|
||||
void tx_process();
|
||||
@ -137,8 +123,6 @@ protected:
|
||||
void transfer_control_pins();
|
||||
void set_input_pin(input_pin pin, int data);
|
||||
int get_output_pin(output_pin pin);
|
||||
inline void update_rx_timer();
|
||||
inline void update_tx_timer();
|
||||
|
||||
int m_pins[41];
|
||||
|
||||
@ -154,16 +138,12 @@ protected:
|
||||
uint8_t m_rx_bit_count;
|
||||
uint8_t m_rx_parity;
|
||||
uint16_t m_rx_pulses; // total pulses left
|
||||
double m_rx_clock; /* RCP - pin 17 */
|
||||
emu_timer *m_rx_timer;
|
||||
|
||||
state_t m_tx_state;
|
||||
uint8_t m_tx_data; // byte being sent
|
||||
uint8_t m_tx_buffer; // next byte to send
|
||||
uint8_t m_tx_parity;
|
||||
uint16_t m_tx_pulses; // total pulses left
|
||||
double m_tx_clock; /* TCP - pin 40 */
|
||||
emu_timer *m_tx_timer;
|
||||
|
||||
devcb_read_line m_read_si_cb; // SI - pin 20 - This will be called whenever the SI pin is sampled. Optional
|
||||
devcb_write_line m_write_so_cb; // SO - pin 25 - This will be called whenever data is put on the SO pin. Optional
|
||||
|
@ -36,6 +36,7 @@ to be a save command.
|
||||
#include "emu.h"
|
||||
#include "cpu/i8085/i8085.h"
|
||||
#include "machine/ay31015.h"
|
||||
#include "machine/clock.h"
|
||||
#include "bus/rs232/rs232.h"
|
||||
|
||||
|
||||
@ -106,12 +107,14 @@ void cm1800_state::cm1800(machine_config &config)
|
||||
|
||||
/* video hardware */
|
||||
AY51013(config, m_uart); // exact uart type is unknown
|
||||
m_uart->set_tx_clock(153600);
|
||||
m_uart->set_rx_clock(153600);
|
||||
m_uart->read_si_callback().set("rs232", FUNC(rs232_port_device::rxd_r));
|
||||
m_uart->write_so_callback().set("rs232", FUNC(rs232_port_device::write_txd));
|
||||
m_uart->set_auto_rdav(true);
|
||||
|
||||
clock_device &uart_clock(CLOCK(config, "uart_clock", 153600));
|
||||
uart_clock.signal_handler().set(m_uart, FUNC(ay31015_device::write_tcp));
|
||||
uart_clock.signal_handler().append(m_uart, FUNC(ay31015_device::write_rcp));
|
||||
|
||||
RS232_PORT(config, "rs232", default_rs232_devices, "terminal");
|
||||
}
|
||||
|
||||
|
@ -62,6 +62,7 @@
|
||||
#include "machine/timer.h"
|
||||
#include "bus/rs232/rs232.h"
|
||||
#include "machine/ay31015.h"
|
||||
#include "machine/clock.h"
|
||||
#include "sound/beep.h"
|
||||
#include "emupal.h"
|
||||
#include "speaker.h"
|
||||
@ -170,6 +171,7 @@ private:
|
||||
required_device<timer_device> m_timer_cursor_blink_inh;
|
||||
required_device<rs232_port_device> m_rs232;
|
||||
required_device<ay51013_device> m_uart;
|
||||
required_device<clock_device> m_uart_clock;
|
||||
required_device<beep_device> m_beep;
|
||||
required_device<timer_device> m_timer_beep;
|
||||
|
||||
@ -231,6 +233,7 @@ hp2645_state::hp2645_state(const machine_config &mconfig, device_type type, cons
|
||||
m_timer_cursor_blink_inh(*this , "timer_cursor_blink_inh"),
|
||||
m_rs232(*this , "rs232"),
|
||||
m_uart(*this , "uart"),
|
||||
m_uart_clock(*this , "uart_clock"),
|
||||
m_beep(*this , "beep"),
|
||||
m_timer_beep(*this , "timer_beep"),
|
||||
m_chargen(*this , "chargen%u" , 0)
|
||||
@ -262,8 +265,7 @@ void hp2645_state::machine_reset()
|
||||
m_uart->write_cs(1);
|
||||
m_uart->write_nb2(1);
|
||||
m_async_control = 0;
|
||||
m_uart->set_receiver_clock(0);
|
||||
m_uart->set_transmitter_clock(0);
|
||||
m_uart_clock->set_unscaled_clock(0);
|
||||
update_async_control(0x00);
|
||||
m_rs232->write_dtr(0);
|
||||
async_txd_w(0);
|
||||
@ -699,8 +701,7 @@ void hp2645_state::update_async_control(uint8_t new_control)
|
||||
} else {
|
||||
rxc_txc_freq = SYS_CLOCK.dvalue() / baud_rate_divisors[ new_rate_idx ];
|
||||
}
|
||||
m_uart->set_receiver_clock(rxc_txc_freq);
|
||||
m_uart->set_transmitter_clock(rxc_txc_freq);
|
||||
m_uart_clock->set_unscaled_clock(rxc_txc_freq);
|
||||
m_uart->write_tsb(new_rate_idx == 1);
|
||||
LOG("ASYNC freq=%f\n" , rxc_txc_freq);
|
||||
}
|
||||
@ -996,6 +997,10 @@ MACHINE_CONFIG_START(hp2645_state::hp2645)
|
||||
m_uart->write_dav_callback().set(FUNC(hp2645_state::async_dav_w));
|
||||
m_uart->set_auto_rdav(true);
|
||||
|
||||
CLOCK(config, m_uart_clock, 19200 * 16);
|
||||
m_uart_clock->signal_handler().set(m_uart, FUNC(ay51013_device::write_rcp));
|
||||
m_uart_clock->signal_handler().append(m_uart, FUNC(ay51013_device::write_tcp));
|
||||
|
||||
// Beep
|
||||
SPEAKER(config, "mono").front_center();
|
||||
BEEP(config, m_beep, BEEP_FREQUENCY).add_route(ALL_OUTPUTS, "mono", 1.00);
|
||||
|
@ -44,6 +44,7 @@ Z nothing
|
||||
#include "emu.h"
|
||||
#include "cpu/z80/z80.h"
|
||||
#include "machine/ay31015.h"
|
||||
#include "machine/clock.h"
|
||||
#include "bus/rs232/rs232.h"
|
||||
|
||||
|
||||
@ -169,30 +170,31 @@ void hpz80unk_state::hpz80unk(machine_config &config)
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &hpz80unk_state::hpz80unk_mem);
|
||||
m_maincpu->set_addrmap(AS_IO, &hpz80unk_state::hpz80unk_io);
|
||||
|
||||
/* video hardware */
|
||||
AY51013(config, m_uart[0]); // COM2502
|
||||
m_uart[0]->set_tx_clock(153600);
|
||||
m_uart[0]->set_rx_clock(153600);
|
||||
m_uart[0]->read_si_callback().set("rs232a", FUNC(rs232_port_device::rxd_r));
|
||||
m_uart[0]->write_so_callback().set("rs232a", FUNC(rs232_port_device::write_txd));
|
||||
m_uart[0]->set_auto_rdav(true);
|
||||
RS232_PORT(config, "rs232a", default_rs232_devices, "terminal");
|
||||
|
||||
AY51013(config, m_uart[1]); // COM2502
|
||||
m_uart[1]->set_tx_clock(153600);
|
||||
m_uart[1]->set_rx_clock(153600);
|
||||
m_uart[1]->read_si_callback().set("rs232b", FUNC(rs232_port_device::rxd_r));
|
||||
m_uart[1]->write_so_callback().set("rs232b", FUNC(rs232_port_device::write_txd));
|
||||
m_uart[1]->set_auto_rdav(true);
|
||||
RS232_PORT(config, "rs232b", default_rs232_devices, nullptr);
|
||||
|
||||
AY51013(config, m_uart[2]); // COM2502
|
||||
m_uart[2]->set_tx_clock(153600);
|
||||
m_uart[2]->set_rx_clock(153600);
|
||||
m_uart[2]->read_si_callback().set("rs232c", FUNC(rs232_port_device::rxd_r));
|
||||
m_uart[2]->write_so_callback().set("rs232c", FUNC(rs232_port_device::write_txd));
|
||||
m_uart[2]->set_auto_rdav(true);
|
||||
RS232_PORT(config, "rs232c", default_rs232_devices, nullptr);
|
||||
|
||||
clock_device &uart_clock(CLOCK(config, "uart_clock", 153600));
|
||||
uart_clock.signal_handler().set(m_uart[0], FUNC(ay51013_device::write_tcp));
|
||||
uart_clock.signal_handler().append(m_uart[0], FUNC(ay51013_device::write_rcp));
|
||||
uart_clock.signal_handler().append(m_uart[1], FUNC(ay51013_device::write_tcp));
|
||||
uart_clock.signal_handler().append(m_uart[1], FUNC(ay51013_device::write_rcp));
|
||||
uart_clock.signal_handler().append(m_uart[2], FUNC(ay51013_device::write_tcp));
|
||||
uart_clock.signal_handler().append(m_uart[2], FUNC(ay51013_device::write_rcp));
|
||||
}
|
||||
|
||||
/* ROM definition */
|
||||
|
@ -57,6 +57,7 @@ Other things...
|
||||
#include "screen.h"
|
||||
#include "speaker.h"
|
||||
#include "machine/ay31015.h"
|
||||
#include "machine/clock.h"
|
||||
#include "bus/rs232/rs232.h"
|
||||
|
||||
|
||||
@ -410,10 +411,13 @@ MACHINE_CONFIG_START(micral_state::micral)
|
||||
//MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
|
||||
|
||||
AY31015(config, m_uart); // CDP6402
|
||||
m_uart->set_tx_clock(153600);
|
||||
m_uart->set_rx_clock(153600);
|
||||
m_uart->read_si_callback().set("rs232", FUNC(rs232_port_device::rxd_r));
|
||||
m_uart->write_so_callback().set("rs232", FUNC(rs232_port_device::write_txd));
|
||||
|
||||
clock_device &uart_clock(CLOCK(config, "uart_clock", 153600));
|
||||
uart_clock.signal_handler().set(m_uart, FUNC(ay31015_device::write_tcp));
|
||||
uart_clock.signal_handler().append(m_uart, FUNC(ay31015_device::write_rcp));
|
||||
|
||||
RS232_PORT(config, "rs232", default_rs232_devices, "keyboard");
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
|
@ -14,6 +14,7 @@
|
||||
#include "imagedev/cassette.h"
|
||||
#include "imagedev/snapquik.h"
|
||||
#include "machine/ay31015.h"
|
||||
#include "machine/clock.h"
|
||||
#include "machine/ram.h"
|
||||
#include "machine/z80pio.h"
|
||||
|
||||
@ -701,11 +702,13 @@ void nascom_state::nascom(machine_config &config)
|
||||
|
||||
// uart
|
||||
AY31015(config, m_hd6402);
|
||||
m_hd6402->set_tx_clock((16_MHz_XTAL / 16) / 256);
|
||||
m_hd6402->set_rx_clock((16_MHz_XTAL / 16) / 256);
|
||||
m_hd6402->read_si_callback().set(FUNC(nascom_state::nascom1_hd6402_si));
|
||||
m_hd6402->write_so_callback().set(FUNC(nascom_state::nascom1_hd6402_so));
|
||||
|
||||
clock_device &uart_clock(CLOCK(config, "uart_clock", (16_MHz_XTAL / 16) / 256));
|
||||
uart_clock.signal_handler().set(m_hd6402, FUNC(ay31015_device::write_tcp));
|
||||
uart_clock.signal_handler().append(m_hd6402, FUNC(ay31015_device::write_rcp));
|
||||
|
||||
// cassette is connected to the uart
|
||||
CASSETTE(config, m_cassette);
|
||||
m_cassette->set_interface("nascom_cass");
|
||||
|
@ -104,6 +104,7 @@ DONE:
|
||||
#include "cpu/i86/i86.h"
|
||||
#include "imagedev/floppy.h"
|
||||
#include "machine/ay31015.h"
|
||||
#include "machine/clock.h"
|
||||
#include "machine/pic8259.h"
|
||||
#include "machine/wd_fdc.h"
|
||||
#include "sound/dac.h"
|
||||
@ -847,15 +848,19 @@ MACHINE_CONFIG_START(notetaker_state::notetakr)
|
||||
m_crtc->set_screen("screen");
|
||||
|
||||
AY31015(config, m_kbduart); // HD6402, == AY-3-1015D
|
||||
m_kbduart->set_rx_clock(960_kHz_XTAL); // hard-wired to 960KHz xtal #f11 (60000 baud, 16 clocks per baud)
|
||||
m_kbduart->set_tx_clock(960_kHz_XTAL); // hard-wired to 960KHz xtal #f11 (60000 baud, 16 clocks per baud)
|
||||
m_kbduart->write_dav_callback().set(m_iop_pic, FUNC(pic8259_device::ir6_w)); // DataRecvd = KbdInt
|
||||
|
||||
clock_device &kbdclock(CLOCK(config, "kbdclock", 960_kHz_XTAL)); // hard-wired to 960KHz xtal #f11 (60000 baud, 16 clocks per baud)
|
||||
kbdclock.signal_handler().set(m_kbduart, FUNC(ay31015_device::write_rcp));
|
||||
kbdclock.signal_handler().append(m_kbduart, FUNC(ay31015_device::write_tcp));
|
||||
|
||||
AY31015(config, m_eiauart); // HD6402, == AY-3-1015D
|
||||
m_eiauart->set_rx_clock(((960_kHz_XTAL/10)/4)/5); // hard-wired through an mc14568b divider set to divide by 4, the result set to divide by 5; this resulting 4800hz signal being 300 baud (16 clocks per baud)
|
||||
m_eiauart->set_tx_clock(((960_kHz_XTAL/10)/4)/5); // hard-wired through an mc14568b divider set to divide by 4, the result set to divide by 5; this resulting 4800hz signal being 300 baud (16 clocks per baud)
|
||||
m_eiauart->write_dav_callback().set(m_iop_pic, FUNC(pic8259_device::ir3_w)); // EIADataReady = EIAInt
|
||||
|
||||
clock_device &eiaclock(CLOCK(config, "eiaclock", ((960_kHz_XTAL/10)/4)/5)); // hard-wired through an mc14568b divider set to divide by 4, the result set to divide by 5; this resulting 4800hz signal being 300 baud (16 clocks per baud)
|
||||
eiaclock.signal_handler().set(m_eiauart, FUNC(ay31015_device::write_rcp));
|
||||
eiaclock.signal_handler().append(m_eiauart, FUNC(ay31015_device::write_tcp));
|
||||
|
||||
/* Floppy */
|
||||
FD1791(config, m_fdc, (((24_MHz_XTAL/3)/2)/2)); // 2mhz, from 24mhz ip clock divided by 6 via 8284, an additional 2 by LS161 at #e1 on display/floppy board
|
||||
FLOPPY_CONNECTOR(config, "wd1791:0", notetaker_floppies, "525dd", floppy_image_device::default_floppy_formats);
|
||||
|
@ -121,6 +121,7 @@
|
||||
//#include "bus/s100/s100.h"
|
||||
#include "imagedev/cassette.h"
|
||||
#include "machine/ay31015.h"
|
||||
#include "machine/clock.h"
|
||||
#include "machine/keyboard.h"
|
||||
#include "sound/spkrdev.h"
|
||||
#include "sound/wave.h"
|
||||
@ -157,6 +158,8 @@ public:
|
||||
, m_cass2(*this, "cassette2")
|
||||
, m_uart(*this, "uart")
|
||||
, m_uart_s(*this, "uart_s")
|
||||
, m_uart_clock(*this, "uart_clock")
|
||||
, m_uart_s_clock(*this, "uart_s_clock")
|
||||
, m_rs232(*this, "rs232")
|
||||
, m_p_videoram(*this, "videoram")
|
||||
, m_p_chargen(*this, "chargen")
|
||||
@ -211,6 +214,8 @@ private:
|
||||
required_device<cassette_image_device> m_cass2;
|
||||
required_device<ay31015_device> m_uart;
|
||||
required_device<ay31015_device> m_uart_s;
|
||||
required_device<clock_device> m_uart_clock;
|
||||
required_device<clock_device> m_uart_s_clock;
|
||||
required_device<rs232_port_device> m_rs232;
|
||||
required_shared_ptr<uint8_t> m_p_videoram;
|
||||
required_region_ptr<u8> m_p_chargen;
|
||||
@ -420,8 +425,7 @@ WRITE8_MEMBER( sol20_state::sol20_fa_w )
|
||||
m_cassette_timer->adjust(attotime::zero);
|
||||
|
||||
// bit 5 baud rate */
|
||||
m_uart->set_receiver_clock((BIT(data, 5)) ? 4800.0 : 19200.0);
|
||||
m_uart->set_transmitter_clock((BIT(data, 5)) ? 4800.0 : 19200.0);
|
||||
m_uart_clock->set_unscaled_clock(BIT(data, 5) ? 4800 : 19200);
|
||||
}
|
||||
|
||||
WRITE8_MEMBER( sol20_state::sol20_fd_w )
|
||||
@ -613,8 +617,7 @@ void sol20_state::machine_reset()
|
||||
s_clock = s_bauds[s_count] << 4;
|
||||
|
||||
// these lines could be commented out for now if you want better performance
|
||||
m_uart_s->set_receiver_clock(s_clock);
|
||||
m_uart_s->set_transmitter_clock(s_clock);
|
||||
m_uart_s_clock->set_unscaled_clock(s_clock);
|
||||
|
||||
// boot-bank
|
||||
membank("boot")->set_entry(1);
|
||||
@ -769,19 +772,23 @@ void sol20_state::sol20(machine_config &config)
|
||||
m_cass2->set_interface("sol20_cass");
|
||||
|
||||
AY51013(config, m_uart); // TMS6011NC
|
||||
m_uart->set_tx_clock(4800.0);
|
||||
m_uart->set_rx_clock(4800.0);
|
||||
m_uart->set_auto_rdav(true); // ROD (pin 4) tied to RDD (pin 18)
|
||||
|
||||
CLOCK(config, m_uart_clock, 4800);
|
||||
m_uart_clock->signal_handler().set(m_uart, FUNC(ay51013_device::write_rcp));
|
||||
m_uart_clock->signal_handler().append(m_uart, FUNC(ay51013_device::write_tcp));
|
||||
|
||||
RS232_PORT(config, m_rs232, default_rs232_devices, nullptr);
|
||||
|
||||
AY51013(config, m_uart_s); // TMS6011NC
|
||||
m_uart_s->read_si_callback().set(m_rs232, FUNC(rs232_port_device::rxd_r));
|
||||
m_uart_s->write_so_callback().set(m_rs232, FUNC(rs232_port_device::write_txd));
|
||||
m_uart_s->set_tx_clock(4800.0);
|
||||
m_uart_s->set_rx_clock(4800.0);
|
||||
m_uart_s->set_auto_rdav(true); // ROD (pin 4) tied to RDD (pin 18)
|
||||
|
||||
CLOCK(config, m_uart_s_clock, 4800);
|
||||
m_uart_s_clock->signal_handler().set(m_uart_s, FUNC(ay51013_device::write_rcp));
|
||||
m_uart_s_clock->signal_handler().append(m_uart_s, FUNC(ay51013_device::write_tcp));
|
||||
|
||||
generic_keyboard_device &keyboard(GENERIC_KEYBOARD(config, "keyboard", 0));
|
||||
keyboard.set_keyboard_callback(FUNC(sol20_state::kbd_put));
|
||||
|
||||
|
@ -37,6 +37,7 @@ ZPS stands for "Základní Počítačová Sestava" (basic computer system).
|
||||
//#include "cpu/z80/z80.h"
|
||||
#include "bus/rs232/rs232.h"
|
||||
#include "machine/ay31015.h"
|
||||
#include "machine/clock.h"
|
||||
#include "machine/keyboard.h"
|
||||
#include "machine/ram.h"
|
||||
#include "video/mc6845.h"
|
||||
@ -57,6 +58,7 @@ public:
|
||||
m_line4(*this, "LINE4"),
|
||||
m_maincpu(*this, "maincpu"),
|
||||
m_uart(*this, "uart"),
|
||||
m_uart_clock(*this, "uart_clock"),
|
||||
m_v24(*this, "v24"),
|
||||
m_palette(*this, "palette")
|
||||
{
|
||||
@ -115,6 +117,7 @@ private:
|
||||
required_ioport m_line4;
|
||||
required_device<cpu_device> m_maincpu;
|
||||
optional_device<ay31015_device> m_uart;
|
||||
optional_device<clock_device> m_uart_clock;
|
||||
optional_device<rs232_port_device> m_v24;
|
||||
|
||||
optional_device<palette_device> m_palette;
|
||||
@ -625,7 +628,7 @@ void sapi1_state::init_sapizps3b()
|
||||
/* Machine driver */
|
||||
MACHINE_CONFIG_START(sapi1_state::sapi1)
|
||||
/* basic machine hardware */
|
||||
MCFG_DEVICE_ADD(m_maincpu, I8080A, XTAL(18'000'000) / 9) // Tesla MHB8080A + MHB8224 + MHB8228
|
||||
MCFG_DEVICE_ADD(m_maincpu, I8080A, 18_MHz_XTAL / 9) // Tesla MHB8080A + MHB8224 + MHB8228
|
||||
MCFG_DEVICE_PROGRAM_MAP(sapi1_mem)
|
||||
MCFG_MACHINE_RESET_OVERRIDE(sapi1_state, sapi1)
|
||||
|
||||
@ -696,19 +699,21 @@ DEVICE_INPUT_DEFAULTS_END
|
||||
|
||||
MACHINE_CONFIG_START(sapi1_state::sapi3a)
|
||||
/* basic machine hardware */
|
||||
MCFG_DEVICE_ADD("maincpu", I8080A, XTAL(18'000'000) / 9) // Tesla MHB8080A + MHB8224 + MHB8228
|
||||
MCFG_DEVICE_ADD("maincpu", I8080A, 18_MHz_XTAL / 9) // Tesla MHB8080A + MHB8224 + MHB8228
|
||||
MCFG_DEVICE_PROGRAM_MAP(sapi3a_mem)
|
||||
MCFG_DEVICE_IO_MAP(sapi3a_io)
|
||||
MCFG_MACHINE_RESET_OVERRIDE(sapi1_state, sapizps3 )
|
||||
|
||||
/* video hardware */
|
||||
AY51013(config, m_uart); // Tesla MHB1012
|
||||
m_uart->set_tx_clock(XTAL(12'288'000) / 80); // not actual rate?
|
||||
m_uart->set_rx_clock(XTAL(12'288'000) / 80); // not actual rate?
|
||||
m_uart->read_si_callback().set(m_v24, FUNC(rs232_port_device::rxd_r));
|
||||
m_uart->write_so_callback().set(m_v24, FUNC(rs232_port_device::write_txd));
|
||||
m_uart->set_auto_rdav(true); // RDAV not actually tied to RDE, but pulsed by K155AG3 (=74123N): R25=22k, C14=220
|
||||
|
||||
CLOCK(config, m_uart_clock, 12.288_MHz_XTAL / 80); // TODO: divider selectable by jumpers
|
||||
m_uart_clock->signal_handler().set(m_uart, FUNC(ay51013_device::write_tcp));
|
||||
m_uart_clock->signal_handler().append(m_uart, FUNC(ay51013_device::write_rcp));
|
||||
|
||||
RS232_PORT(config, m_v24, default_rs232_devices, "terminal").set_option_device_input_defaults("terminal", DEVICE_INPUT_DEFAULTS_NAME(terminal));
|
||||
|
||||
/* internal ram */
|
||||
|
@ -430,10 +430,12 @@ MACHINE_CONFIG_START(sorcerer_state::sorcerer)
|
||||
WAVE(config, "wave2", m_cassette2).add_route(ALL_OUTPUTS, "mono", 0.05); // cass2 speaker
|
||||
|
||||
AY31015(config, m_uart);
|
||||
m_uart->set_tx_clock(ES_UART_CLOCK);
|
||||
m_uart->set_rx_clock(ES_UART_CLOCK);
|
||||
m_uart->set_auto_rdav(true);
|
||||
|
||||
CLOCK(config, m_uart_clock, ES_UART_CLOCK);
|
||||
m_uart_clock->signal_handler().set(m_uart, FUNC(ay31015_device::write_tcp));
|
||||
m_uart_clock->signal_handler().append(m_uart, FUNC(ay31015_device::write_rcp));
|
||||
|
||||
RS232_PORT(config, "rs232", default_rs232_devices, "null_modem").set_option_device_input_defaults("terminal", DEVICE_INPUT_DEFAULTS_NAME(terminal));
|
||||
|
||||
/* printer */
|
||||
|
@ -571,7 +571,11 @@ MACHINE_CONFIG_START(trs80_state::sys80)
|
||||
model1(config);
|
||||
MCFG_DEVICE_MODIFY("maincpu")
|
||||
MCFG_DEVICE_IO_MAP(sys80_io)
|
||||
|
||||
config.device_remove("brg");
|
||||
CLOCK(config, m_uart_clock, 19200 * 16);
|
||||
m_uart_clock->signal_handler().set(m_uart, FUNC(ay31015_device::write_rcp));
|
||||
m_uart_clock->signal_handler().append(m_uart, FUNC(ay31015_device::write_tcp));
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
MACHINE_CONFIG_START(trs80_state::ht1080z)
|
||||
|
@ -424,8 +424,10 @@ MACHINE_CONFIG_START(z80ne_state::z80ne)
|
||||
MCFG_MACHINE_RESET_OVERRIDE(z80ne_state,z80ne)
|
||||
|
||||
AY31015(config, m_uart);
|
||||
m_uart->set_tx_clock(4800.0);
|
||||
m_uart->set_rx_clock(4800.0);
|
||||
|
||||
CLOCK(config, m_uart_clock, 4800);
|
||||
m_uart_clock->signal_handler().set(FUNC(z80ne_state::lx385_uart_tx_clock_w));
|
||||
m_uart_clock->signal_handler().append(m_uart, FUNC(ay31015_device::write_rcp));
|
||||
|
||||
CASSETTE(config, m_cassette1);
|
||||
m_cassette1->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED);
|
||||
@ -493,8 +495,10 @@ MACHINE_CONFIG_START(z80ne_state::z80netb)
|
||||
MCFG_MACHINE_RESET_OVERRIDE(z80ne_state,z80netb)
|
||||
|
||||
AY31015(config, m_uart);
|
||||
m_uart->set_tx_clock(4800.0);
|
||||
m_uart->set_rx_clock(4800.0);
|
||||
|
||||
CLOCK(config, m_uart_clock, 4800);
|
||||
m_uart_clock->signal_handler().set(FUNC(z80ne_state::lx385_uart_tx_clock_w));
|
||||
m_uart_clock->signal_handler().append(m_uart, FUNC(ay31015_device::write_rcp));
|
||||
|
||||
CASSETTE(config, m_cassette1);
|
||||
m_cassette1->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED);
|
||||
@ -543,8 +547,10 @@ MACHINE_CONFIG_START(z80netf_state::z80netf)
|
||||
MCFG_MACHINE_RESET_OVERRIDE(z80netf_state,z80netf)
|
||||
|
||||
AY31015(config, m_uart);
|
||||
m_uart->set_tx_clock(4800.0);
|
||||
m_uart->set_rx_clock(4800.0);
|
||||
|
||||
CLOCK(config, m_uart_clock, 4800);
|
||||
m_uart_clock->signal_handler().set(FUNC(z80netf_state::lx385_uart_tx_clock_w));
|
||||
m_uart_clock->signal_handler().append(m_uart, FUNC(ay31015_device::write_rcp));
|
||||
|
||||
CASSETTE(config, m_cassette1);
|
||||
m_cassette1->set_default_state(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED);
|
||||
|
@ -17,6 +17,7 @@ hardware, since no schematics or manuals have been found.
|
||||
#include "cpu/i8085/i8085.h"
|
||||
#include "bus/rs232/rs232.h"
|
||||
#include "machine/ay31015.h"
|
||||
#include "machine/clock.h"
|
||||
#include "screen.h"
|
||||
|
||||
class zms8085_state : public driver_device
|
||||
@ -26,6 +27,7 @@ public:
|
||||
: driver_device(mconfig, type, tag)
|
||||
, m_maincpu(*this, "maincpu")
|
||||
, m_uart(*this, "uart")
|
||||
, m_uart_clock(*this, "uart_clock")
|
||||
, m_rs232(*this, "rs232")
|
||||
, m_screen(*this, "screen")
|
||||
, m_mainram(*this, "mainram")
|
||||
@ -51,6 +53,7 @@ private:
|
||||
|
||||
required_device<cpu_device> m_maincpu;
|
||||
required_device<ay51013_device> m_uart;
|
||||
required_device<clock_device> m_uart_clock;
|
||||
required_device<rs232_port_device> m_rs232;
|
||||
required_device<screen_device> m_screen;
|
||||
required_shared_ptr<u8> m_mainram;
|
||||
@ -335,13 +338,15 @@ void zms8085_state::zephyr(machine_config &config)
|
||||
screen.screen_vblank().set_inputline(m_maincpu, I8085_RST55_LINE, ASSERT_LINE);
|
||||
|
||||
AY51013(config, m_uart); // SMC COM2017
|
||||
m_uart->set_tx_clock(153600); // should actually be configurable somehow
|
||||
m_uart->set_rx_clock(153600);
|
||||
m_uart->read_si_callback().set("rs232", FUNC(rs232_port_device::rxd_r));
|
||||
m_uart->write_so_callback().set("rs232", FUNC(rs232_port_device::write_txd));
|
||||
m_uart->write_dav_callback().set_inputline("maincpu", I8085_RST65_LINE);
|
||||
m_uart->set_auto_rdav(true);
|
||||
|
||||
CLOCK(config, m_uart_clock, 153600); // should actually be configurable somehow
|
||||
m_uart_clock->signal_handler().set(m_uart, FUNC(ay51013_device::write_tcp));
|
||||
m_uart_clock->signal_handler().append(m_uart, FUNC(ay51013_device::write_rcp));
|
||||
|
||||
RS232_PORT(config, "rs232", default_rs232_devices, nullptr);
|
||||
}
|
||||
|
||||
|
@ -13,6 +13,7 @@
|
||||
#include "cpu/z80/z80.h"
|
||||
#include "sound/wave.h"
|
||||
#include "machine/ay31015.h"
|
||||
#include "machine/clock.h"
|
||||
#include "bus/centronics/ctronics.h"
|
||||
#include "bus/rs232/rs232.h"
|
||||
#include "machine/ram.h"
|
||||
@ -54,6 +55,7 @@ public:
|
||||
, m_wave1(*this, "wave")
|
||||
, m_wave2(*this, "wave2")
|
||||
, m_uart(*this, "uart")
|
||||
, m_uart_clock(*this, "uart_clock")
|
||||
, m_rs232(*this, "rs232")
|
||||
, m_centronics(*this, "centronics")
|
||||
, m_cart(*this, "cartslot")
|
||||
@ -122,6 +124,7 @@ private:
|
||||
required_device<wave_device> m_wave1;
|
||||
required_device<wave_device> m_wave2;
|
||||
required_device<ay31015_device> m_uart;
|
||||
required_device<clock_device> m_uart_clock;
|
||||
required_device<rs232_port_device> m_rs232;
|
||||
required_device<centronics_device> m_centronics;
|
||||
required_device<generic_slot_device> m_cart;
|
||||
|
@ -14,6 +14,7 @@
|
||||
#include "imagedev/floppy.h"
|
||||
#include "imagedev/snapquik.h"
|
||||
#include "machine/ay31015.h"
|
||||
#include "machine/clock.h"
|
||||
#include "machine/com8116.h"
|
||||
#include "machine/i8255.h"
|
||||
#include "bus/rs232/rs232.h"
|
||||
@ -41,6 +42,7 @@ public:
|
||||
, m_cent_data_out(*this, "cent_data_out")
|
||||
, m_cent_status_in(*this, "cent_status_in")
|
||||
, m_uart(*this, "uart")
|
||||
, m_uart_clock(*this, "uart_clock")
|
||||
, m_ppi(*this, "ppi") // Radionic only
|
||||
, m_brg(*this, "brg")
|
||||
, m_fdc(*this, "fdc")
|
||||
@ -135,6 +137,7 @@ private:
|
||||
optional_device<output_latch_device> m_cent_data_out;
|
||||
optional_device<input_buffer_device> m_cent_status_in;
|
||||
optional_device<ay31015_device> m_uart;
|
||||
optional_device<clock_device> m_uart_clock;
|
||||
optional_device<i8255_device> m_ppi;
|
||||
optional_device<com8116_device> m_brg;
|
||||
optional_device<fd1793_device> m_fdc;
|
||||
|
@ -19,6 +19,7 @@
|
||||
#include "imagedev/cassette.h"
|
||||
#include "imagedev/floppy.h"
|
||||
#include "machine/ay31015.h"
|
||||
#include "machine/clock.h"
|
||||
#include "machine/kr2376.h"
|
||||
#include "machine/ram.h"
|
||||
#include "machine/wd_fdc.h"
|
||||
@ -69,6 +70,7 @@ public:
|
||||
m_vdg(*this, "mc6847"),
|
||||
m_videoram(*this, "videoram"),
|
||||
m_uart(*this, "uart"),
|
||||
m_uart_clock(*this, "uart_clock"),
|
||||
m_lx387_kr2376(*this, "lx387_kr2376"),
|
||||
m_maincpu(*this, "z80ne"),
|
||||
m_cassette1(*this, "cassette"),
|
||||
@ -109,6 +111,7 @@ protected:
|
||||
optional_device<mc6847_base_device> m_vdg;
|
||||
optional_shared_ptr<uint8_t> m_videoram;
|
||||
required_device<ay31015_device> m_uart;
|
||||
required_device<clock_device> m_uart_clock;
|
||||
optional_device<kr2376_device> m_lx387_kr2376;
|
||||
uint8_t m_lx383_scan_counter;
|
||||
uint8_t m_lx383_key[LX383_KEYS];
|
||||
@ -121,6 +124,7 @@ protected:
|
||||
DECLARE_WRITE8_MEMBER(lx383_w);
|
||||
DECLARE_READ8_MEMBER(lx385_ctrl_r);
|
||||
DECLARE_WRITE8_MEMBER(lx385_ctrl_w);
|
||||
DECLARE_WRITE_LINE_MEMBER(lx385_uart_tx_clock_w);
|
||||
DECLARE_READ_LINE_MEMBER(lx387_shift_r);
|
||||
DECLARE_READ_LINE_MEMBER(lx387_control_r);
|
||||
DECLARE_READ8_MEMBER(lx387_data_r);
|
||||
|
@ -272,8 +272,7 @@ WRITE8_MEMBER(sorcerer_state::port_fe_w)
|
||||
// bit 6 baud rate */
|
||||
if (BIT(changed_bits, 6))
|
||||
{
|
||||
m_uart->set_receiver_clock(BIT(data, 6) ? ES_UART_CLOCK*4 : ES_UART_CLOCK);
|
||||
m_uart->set_transmitter_clock(BIT(data, 6) ? ES_UART_CLOCK*4 : ES_UART_CLOCK);
|
||||
m_uart_clock->set_unscaled_clock(BIT(data, 6) ? ES_UART_CLOCK*4 : ES_UART_CLOCK);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -357,8 +357,7 @@ void trs80_state::machine_reset()
|
||||
{
|
||||
const uint16_t s_bauds[8]={ 110, 300, 600, 1200, 2400, 4800, 9600, 19200 };
|
||||
u16 s_clock = s_bauds[m_io_baud->read()] << 4;
|
||||
m_uart->set_receiver_clock(s_clock);
|
||||
m_uart->set_transmitter_clock(s_clock);
|
||||
m_uart_clock->set_unscaled_clock(s_clock);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -276,8 +276,7 @@ MACHINE_RESET_MEMBER(z80ne_state,z80ne_base)
|
||||
m_uart->write_eps(1);
|
||||
m_uart->write_np(m_io_lx_385->read() & 0x80 ? 1 : 0);
|
||||
m_uart->write_cs(1);
|
||||
m_uart->set_receiver_clock(m_cass_data.speed * 16.0);
|
||||
m_uart->set_transmitter_clock(m_cass_data.speed * 16.0);
|
||||
m_uart_clock->set_unscaled_clock(m_cass_data.speed * 16);
|
||||
|
||||
lx385_ctrl_w(m_maincpu->space(AS_PROGRAM), 0, 0);
|
||||
|
||||
@ -511,14 +510,13 @@ WRITE8_MEMBER(z80ne_state::lx385_ctrl_w)
|
||||
* 3 *TAPEA Enable (active low) (at reset: low)
|
||||
* 4 *TAPEB Enable (active low) (at reset: low)
|
||||
*/
|
||||
uint8_t uart_reset, uart_rdav, uart_tx_clock;
|
||||
uint8_t uart_reset, uart_rdav;
|
||||
uint8_t motor_a, motor_b;
|
||||
uint8_t changed_bits = (m_lx385_ctrl ^ data) & 0x1C;
|
||||
m_lx385_ctrl = data;
|
||||
|
||||
uart_reset = ((data & 0x03) == 0x00);
|
||||
uart_rdav = ((data & 0x03) == 0x01);
|
||||
uart_tx_clock = ((data & 0x04) == 0x04);
|
||||
motor_a = ((data & 0x08) == 0x00);
|
||||
motor_b = ((data & 0x10) == 0x00);
|
||||
|
||||
@ -537,10 +535,6 @@ WRITE8_MEMBER(z80ne_state::lx385_ctrl_w)
|
||||
|
||||
if (!changed_bits) return;
|
||||
|
||||
/* UART Tx Clock enable/disable */
|
||||
if (changed_bits & 0x04)
|
||||
m_uart->set_transmitter_clock(uart_tx_clock ? m_cass_data.speed * 16.0 : 0.0);
|
||||
|
||||
/* motors */
|
||||
if(changed_bits & 0x18)
|
||||
{
|
||||
@ -557,6 +551,12 @@ WRITE8_MEMBER(z80ne_state::lx385_ctrl_w)
|
||||
}
|
||||
}
|
||||
|
||||
WRITE_LINE_MEMBER(z80ne_state::lx385_uart_tx_clock_w)
|
||||
{
|
||||
if (BIT(m_lx385_ctrl, 2))
|
||||
m_uart->write_tcp(state);
|
||||
}
|
||||
|
||||
READ_LINE_MEMBER(z80ne_state::lx387_shift_r)
|
||||
{
|
||||
return BIT(m_io_modifiers->read(), 0) || BIT(m_io_modifiers->read(), 2);
|
||||
|
Loading…
Reference in New Issue
Block a user