summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/rainbow.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/rainbow.cpp')
-rw-r--r--src/mame/drivers/rainbow.cpp93
1 files changed, 48 insertions, 45 deletions
diff --git a/src/mame/drivers/rainbow.cpp b/src/mame/drivers/rainbow.cpp
index 5e92ff76c5a..a3652544af6 100644
--- a/src/mame/drivers/rainbow.cpp
+++ b/src/mame/drivers/rainbow.cpp
@@ -360,9 +360,9 @@ W17 pulls J1 serial port pin 1 to GND when set (chassis to logical GND).
#include "bus/rs232/ser_mouse.h"
#include "machine/i8251.h"
-#include "machine/clock.h"
#include "machine/dec_lk201.h"
#include "machine/nvram.h"
+#include "machine/ripple_counter.h"
#include "machine/timer.h"
#include "machine/ds1315.h"
@@ -509,9 +509,8 @@ public:
m_hdc(*this, "hdc"),
m_corvus_hdc(*this, "corvus"),
- m_mpsc(*this, "upd7201"),
- m_dbrg_A(*this, "com8116_a"),
- m_dbrg_B(*this, "com8116_b"),
+ m_mpsc(*this, "mpsc"),
+ m_dbrg(*this, "dbrg"),
m_comm_port(*this, "comm"),
m_kbd8251(*this, "kbdser"),
@@ -601,10 +600,9 @@ public:
DECLARE_WRITE_LINE_MEMBER(mpsc_irq);
DECLARE_WRITE8_MEMBER(comm_bitrate_w);
DECLARE_WRITE8_MEMBER(printer_bitrate_w);
- DECLARE_WRITE_LINE_MEMBER( com8116_a_fr_w );
- DECLARE_WRITE_LINE_MEMBER( com8116_a_ft_w );
- DECLARE_WRITE_LINE_MEMBER( com8116_b_fr_w );
- DECLARE_WRITE_LINE_MEMBER( com8116_b_ft_w );
+ DECLARE_WRITE8_MEMBER(bitrate_counter_w);
+ DECLARE_WRITE_LINE_MEMBER(dbrg_fr_w);
+ DECLARE_WRITE_LINE_MEMBER(dbrg_ft_w);
DECLARE_WRITE8_MEMBER(GDC_EXTRA_REGISTER_w);
DECLARE_READ8_MEMBER(GDC_EXTRA_REGISTER_r);
@@ -612,7 +610,6 @@ public:
uint32_t screen_update_rainbow(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
IRQ_CALLBACK_MEMBER(irq_callback);
- DECLARE_WRITE_LINE_MEMBER(write_keyboard_clock);
TIMER_DEVICE_CALLBACK_MEMBER(hd_motor_tick);
DECLARE_FLOPPY_FORMATS(floppy_formats);
@@ -671,8 +668,7 @@ private:
required_device<corvus_hdc_device> m_corvus_hdc;
required_device<upd7201_new_device> m_mpsc;
- required_device<com8116_device> m_dbrg_A;
- required_device<com8116_device> m_dbrg_B;
+ required_device<com8116_003_device> m_dbrg;
required_device<rs232_port_device> m_comm_port;
required_device<i8251_device> m_kbd8251;
@@ -724,6 +720,8 @@ private:
bool m_z80_halted;
int m_z80_diskcontrol; // retains values needed for status register
+ uint8_t m_printer_bitrate;
+
bool m_kbd_tx_ready, m_kbd_rx_ready;
int m_KBD;
@@ -886,6 +884,7 @@ void rainbow_state::machine_start()
save_item(NAME(m_z80_mailbox));
save_item(NAME(m_8088_mailbox));
save_item(NAME(m_zflip));
+ save_item(NAME(m_printer_bitrate));
save_item(NAME(m_kbd_tx_ready));
save_item(NAME(m_kbd_rx_ready));
save_item(NAME(m_irq_high));
@@ -1268,6 +1267,7 @@ void rainbow_state::machine_reset()
// *********** SERIAL COMM. (7201)
m_mpsc->reset();
m_mpsc_irq = 0;
+ m_printer_bitrate = 0;
// *********** KEYBOARD + IRQ
m_kbd_tx_ready = m_kbd_rx_ready = false;
@@ -1417,42 +1417,52 @@ WRITE_LINE_MEMBER(rainbow_state::mpsc_irq)
// PORT 0x06 : Communication bit rates (see page 21 of PC 100 SPEC)
WRITE8_MEMBER(rainbow_state::comm_bitrate_w)
{
- m_dbrg_A->str_w(data & 0x0f); // PDF is wrong, low nibble is RECEIVE clock (verified in SETUP).
+ m_dbrg->str_w(data & 0x0f); // PDF is wrong, low nibble is RECEIVE clock (verified in SETUP).
logerror("\n(COMM.) receive bitrate = %d ($%02x)\n", comm_rates[data & 0x0f] , data & 0x0f);
- m_dbrg_A->stt_w( ((data & 0xf0) >> 4) );
+ m_dbrg->stt_w( ((data & 0xf0) >> 4) );
logerror("(COMM.) transmit bitrate = %d ($%02x)\n", comm_rates[((data & 0xf0) >> 4)] ,(data & 0xf0) >> 4);
}
// PORT 0x0e : Printer bit rates
WRITE8_MEMBER(rainbow_state::printer_bitrate_w)
{
- m_dbrg_B->str_w(data & 7); // bits 0 - 2
- m_dbrg_B->stt_w(data & 7); // TX and RX rate cannot be programmed independently.
+ m_printer_bitrate = data & 7;
+ // bits 0 - 2 = 0: nominally 75 bps, actually 75.35 bps
+ // bits 0 - 2 = 1: nominally 150 bps, actually 150.7 bps
+ // bits 0 - 2 = 2: nominally 300 bps, actually 301.4 bps
+ // bits 0 - 2 = 3: nominally 600 bps, actually 602.8 bps
+ // bits 0 - 2 = 4: nominally 1200 bps, actually 1205.6 bps
+ // bits 0 - 2 = 5: nominally 2400 bps, actually 2411.2 bps
+ // bits 0 - 2 = 6: nominally 4800 bps, actually 4822.4 bps (keyboard is tied to this rate)
+ // bits 0 - 2 = 7: nominally 9600 bps, actually 9644.8 bps
+ // TX and RX rate cannot be programmed independently.
logerror("\n(PRINTER) receive = transmit bitrate: %d ($%02x)", 9600 / ( 1 << (7 - (data & 7))) , data & 7);
// "bit 3 controls the communications port clock (RxC,TxC). External clock when 1, internal when 0"
logerror(" - CLOCK (0 = internal): %02x", data & 8);
}
-WRITE_LINE_MEMBER(rainbow_state::com8116_a_fr_w)
+WRITE_LINE_MEMBER(rainbow_state::dbrg_fr_w)
{
m_mpsc->rxca_w(state);
}
-WRITE_LINE_MEMBER(rainbow_state::com8116_a_ft_w)
+WRITE_LINE_MEMBER(rainbow_state::dbrg_ft_w)
{
m_mpsc->txca_w(state);
}
-WRITE_LINE_MEMBER(rainbow_state::com8116_b_fr_w)
+WRITE8_MEMBER(rainbow_state::bitrate_counter_w)
{
- m_mpsc->rxcb_w(state);
-}
+ bool prt_rxtxc = BIT(data, 7 - m_printer_bitrate);
+ bool kbd_rxtxc = BIT(data, 1);
-WRITE_LINE_MEMBER(rainbow_state::com8116_b_ft_w)
-{
- m_mpsc->txcb_w(state);
+ m_mpsc->rxcb_w(prt_rxtxc);
+ m_mpsc->txcb_w(prt_rxtxc);
+
+ m_kbd8251->write_rxc(kbd_rxtxc);
+ m_kbd8251->write_txc(kbd_rxtxc);
}
// Only Z80 * private SRAM * is wait state free
@@ -2815,12 +2825,6 @@ WRITE_LINE_MEMBER(rainbow_state::kbd_txready_w)
update_kbd_irq();
}
-WRITE_LINE_MEMBER(rainbow_state::write_keyboard_clock)
-{
- m_kbd8251->write_txc(state);
- m_kbd8251->write_rxc(state);
-}
-
TIMER_DEVICE_CALLBACK_MEMBER(rainbow_state::hd_motor_tick)
{
if (m_POWER_GOOD)
@@ -3203,7 +3207,7 @@ MACHINE_CONFIG_START(rainbow_state::rainbow)
MCFG_DEFAULT_LAYOUT(layout_rainbow)
/* basic machine hardware */
-MCFG_CPU_ADD("maincpu", I8088, XTAL(24'073'400) / 5)
+MCFG_CPU_ADD("maincpu", I8088, XTAL(24'073'400) / 5) // approximately 4.815 MHz
MCFG_CPU_PROGRAM_MAP(rainbow8088_map)
MCFG_CPU_IO_MAP(rainbow8088_io)
MCFG_CPU_IRQ_ACKNOWLEDGE_DRIVER(rainbow_state, irq_callback)
@@ -3294,28 +3298,24 @@ MCFG_HARDDISK_INTERFACE("corvus_hdd")
MCFG_DS1315_ADD("rtc") // DS1315 (ClikClok for DEC-100 B) * OPTIONAL *
-MCFG_DEVICE_ADD("com8116_a", COM8116, XTAL(5'068'800)) // Baud rate generator A
-MCFG_COM8116_FR_HANDLER(WRITELINE(rainbow_state, com8116_a_fr_w))
-MCFG_COM8116_FT_HANDLER(WRITELINE(rainbow_state, com8116_a_ft_w))
+MCFG_DEVICE_ADD("dbrg", COM8116_003, XTAL(24'073'400) / 4) // 6.01835 MHz (nominally 6 MHz)
+MCFG_COM8116_FR_HANDLER(WRITELINE(rainbow_state, dbrg_fr_w))
+MCFG_COM8116_FT_HANDLER(WRITELINE(rainbow_state, dbrg_ft_w))
-MCFG_DEVICE_ADD("com8116_b", COM8116, XTAL(5'068'800)) // Baud rate generator B
-MCFG_COM8116_FR_HANDLER(WRITELINE(rainbow_state, com8116_b_fr_w))
-MCFG_COM8116_FT_HANDLER(WRITELINE(rainbow_state, com8116_b_ft_w))
-
-MCFG_DEVICE_ADD("upd7201", UPD7201_NEW, XTAL(24'073'400) / 5 / 2) // 2.4073 MHz (nominally 2.5 MHz)
+MCFG_DEVICE_ADD("mpsc", UPD7201_NEW, XTAL(24'073'400) / 5 / 2) // 2.4073 MHz (nominally 2.5 MHz)
MCFG_Z80SIO_OUT_INT_CB(WRITELINE(rainbow_state, mpsc_irq))
MCFG_Z80SIO_OUT_TXDA_CB(DEVWRITELINE("comm", rs232_port_device, write_txd))
MCFG_Z80SIO_OUT_TXDB_CB(DEVWRITELINE("printer", rs232_port_device, write_txd))
// RTS and DTR outputs are not connected
MCFG_RS232_PORT_ADD("comm", default_rs232_devices, nullptr)
-MCFG_RS232_RXD_HANDLER(DEVWRITELINE("upd7201", upd7201_new_device, rxa_w))
-MCFG_RS232_CTS_HANDLER(DEVWRITELINE("upd7201", upd7201_new_device, ctsa_w))
-MCFG_RS232_DCD_HANDLER(DEVWRITELINE("upd7201", upd7201_new_device, dcda_w))
+MCFG_RS232_RXD_HANDLER(DEVWRITELINE("mpsc", upd7201_new_device, rxa_w))
+MCFG_RS232_CTS_HANDLER(DEVWRITELINE("mpsc", upd7201_new_device, ctsa_w))
+MCFG_RS232_DCD_HANDLER(DEVWRITELINE("mpsc", upd7201_new_device, dcda_w))
MCFG_RS232_PORT_ADD("printer", default_rs232_devices, nullptr)
-MCFG_RS232_RXD_HANDLER(DEVWRITELINE("upd7201", upd7201_new_device, rxb_w))
-MCFG_RS232_DCD_HANDLER(DEVWRITELINE("upd7201", upd7201_new_device, ctsb_w)) // actually DTR
+MCFG_RS232_RXD_HANDLER(DEVWRITELINE("mpsc", upd7201_new_device, rxb_w))
+MCFG_RS232_DCD_HANDLER(DEVWRITELINE("mpsc", upd7201_new_device, ctsb_w)) // actually DTR
MCFG_DEVICE_MODIFY("comm")
MCFG_SLOT_OPTION_ADD("microsoft_mouse", MSFT_SERIAL_MOUSE)
@@ -3333,8 +3333,11 @@ MCFG_I8251_TXRDY_HANDLER(WRITELINE(rainbow_state, kbd_txready_w))
MCFG_DEVICE_ADD(LK201_TAG, LK201, 0)
MCFG_LK201_TX_HANDLER(DEVWRITELINE("kbdser", i8251_device, write_rxd))
-MCFG_DEVICE_ADD("keyboard_clock", CLOCK, 4800 * 16) // 8251 is set to /16 on the clock input
-MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(rainbow_state, write_keyboard_clock))
+
+MCFG_DEVICE_ADD("prtbrg", RIPPLE_COUNTER, XTAL(24'073'400) / 6 / 13) // 74LS393 at E17 (both halves)
+// divided clock should ideally be 307.2 kHz, but is actually approximately 308.6333 kHz
+MCFG_RIPPLE_COUNTER_STAGES(8)
+MCFG_RIPPLE_COUNTER_COUNT_OUT_CB(WRITE8(rainbow_state, bitrate_counter_w))
MCFG_TIMER_DRIVER_ADD_PERIODIC("motor", rainbow_state, hd_motor_tick, attotime::from_hz(60))