summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author AJR <ajrhacker@users.noreply.github.com>2018-09-24 15:38:59 -0400
committer AJR <ajrhacker@users.noreply.github.com>2018-09-24 15:39:44 -0400
commitf65e1c2a32067b22a1a4e12347ce22b1980589a6 (patch)
treeb80d622ea7bdef32410257ad8496fb1feb9b59d1
parentdb0e5ab2459290ce09357899a27c4ec075dd3aa2 (diff)
hazl1420: Add interrupts and hook up DIP switches through I/O expanders (nw)
-rw-r--r--src/devices/machine/ins8250.cpp4
-rw-r--r--src/emu/diserial.cpp2
-rw-r--r--src/mame/drivers/hazl1420.cpp148
3 files changed, 100 insertions, 54 deletions
diff --git a/src/devices/machine/ins8250.cpp b/src/devices/machine/ins8250.cpp
index 07259c60a43..e6f44db4c59 100644
--- a/src/devices/machine/ins8250.cpp
+++ b/src/devices/machine/ins8250.cpp
@@ -97,6 +97,9 @@ History:
#include "emu.h"
#include "machine/ins8250.h"
+//#define VERBOSE 1
+#include "logmacro.h"
+
DEFINE_DEVICE_TYPE(INS8250, ins8250_device, "ins8250", "National Semiconductor INS8250 UART")
DEFINE_DEVICE_TYPE(NS16450, ns16450_device, "ns16450", "National Semiconductor NS16450 UART")
DEFINE_DEVICE_TYPE(NS16550, ns16550_device, "ns16550", "National Semiconductor NS16550 UART")
@@ -243,6 +246,7 @@ READ_LINE_MEMBER(ins8250_uart_device::intrpt_r)
// Baud rate generator is reset after writing to either byte of divisor latch
void ins8250_uart_device::update_baud_rate()
{
+ LOG("%.1f baud selected (divisor = %d)\n", double(clock()) / (m_regs.dl * 16), m_regs.dl);
set_rate(clock(), m_regs.dl * 16);
// FIXME: Baud rate generator should not affect transmitter or receiver, but device_serial_interface resets them regardless.
diff --git a/src/emu/diserial.cpp b/src/emu/diserial.cpp
index 8c1abb494fc..01bb07bf8c7 100644
--- a/src/emu/diserial.cpp
+++ b/src/emu/diserial.cpp
@@ -157,6 +157,8 @@ WRITE_LINE_MEMBER(device_serial_interface::clock_w)
void device_serial_interface::set_data_frame(int start_bit_count, int data_bit_count, parity_t parity, stop_bits_t stop_bits)
{
+ //device().logerror("Start bits: %d; Data bits: %d; Parity: %s; Stop bits: %s\n", start_bit_count, data_bit_count, parity_tostring(parity), stop_bits_tostring(stop_bits));
+
m_df_word_length = data_bit_count;
switch (stop_bits)
diff --git a/src/mame/drivers/hazl1420.cpp b/src/mame/drivers/hazl1420.cpp
index 6c9c56efb7e..28149828d96 100644
--- a/src/mame/drivers/hazl1420.cpp
+++ b/src/mame/drivers/hazl1420.cpp
@@ -10,7 +10,7 @@
//#include "bus/rs232/rs232.h"
#include "cpu/mcs48/mcs48.h"
#include "machine/bankdev.h"
-//#include "machine/i8243.h"
+#include "machine/i8243.h"
#include "machine/ins8250.h"
//#include "video/dp8350.h"
#include "screen.h"
@@ -22,6 +22,8 @@ public:
: driver_device(mconfig, type, tag)
, m_maincpu(*this, "maincpu")
, m_bankdev(*this, "bankdev")
+ , m_ioexp(*this, "ioexp%u", 0U)
+ , m_screen(*this, "screen")
{
}
@@ -31,6 +33,8 @@ protected:
virtual void machine_start() override;
private:
+ void p1_w(u8 data);
+ u8 p2_r();
void p2_w(u8 data);
void prog_map(address_map &map);
@@ -41,9 +45,23 @@ private:
required_device<mcs48_cpu_device> m_maincpu;
required_device<address_map_bank_device> m_bankdev;
- //required_device_array<i8243_device, 2> m_ioexp;
+ required_device_array<i8243_device, 2> m_ioexp;
+ required_device<screen_device> m_screen;
};
+void hazl1420_state::p1_w(u8 data)
+{
+ m_ioexp[0]->cs_w((data & 0xc0) == 0x80 ? 0 : 1);
+ m_ioexp[1]->cs_w((data & 0xc0) == 0xc0 ? 0 : 1);
+}
+
+u8 hazl1420_state::p2_r()
+{
+ u8 result = m_screen->vblank() ? 0xf0 : 0xe0;
+ result |= m_ioexp[0]->p2_r() & m_ioexp[1]->p2_r();
+ return result;
+}
+
void hazl1420_state::p2_w(u8 data)
{
m_bankdev->set_bank(data & 0x0f);
@@ -61,6 +79,7 @@ void hazl1420_state::io_map(address_map &map)
void hazl1420_state::bank_map(address_map &map)
{
+ map(0x000, 0x7ff).ram().share("videoram");
map(0x800, 0x807).mirror(0x10).rw("ace", FUNC(ins8250_device::ins8250_r), FUNC(ins8250_device::ins8250_w));
map(0xc48, 0xc48).ram();
}
@@ -78,56 +97,64 @@ static INPUT_PORTS_START(hazl1420)
// DIP switches are on access panel above keyboard
// "SW1" and "SW2" are not actual names
- PORT_START("SW1")
- PORT_DIPNAME(0x01, 0x00, DEF_STR(Unused)) PORT_DIPLOCATION("SW1:1")
- PORT_DIPSETTING(0x01, DEF_STR(Off))
- PORT_DIPSETTING(0x00, DEF_STR(On))
- PORT_DIPNAME(0x02, 0x00, DEF_STR(Unused)) PORT_DIPLOCATION("SW1:2")
- PORT_DIPSETTING(0x02, DEF_STR(Off))
- PORT_DIPSETTING(0x00, DEF_STR(On))
- PORT_DIPNAME(0x1c, 0x18, "Baud Rate") PORT_DIPLOCATION("SW1:3,4,5")
- PORT_DIPSETTING(0x00, "110")
- PORT_DIPSETTING(0x04, "300")
- PORT_DIPSETTING(0x08, "600")
- PORT_DIPSETTING(0x0c, "1200")
- PORT_DIPSETTING(0x10, "1800")
- PORT_DIPSETTING(0x14, "2400")
- PORT_DIPSETTING(0x18, "4800")
- PORT_DIPSETTING(0x1c, "9600")
- PORT_DIPNAME(0x20, 0x00, "Lead-In") PORT_DIPLOCATION("SW1:6")
- PORT_DIPSETTING(0x00, "ESC")
- PORT_DIPSETTING(0x20, "~")
- PORT_DIPNAME(0xc0, 0xc0, "Parity") PORT_DIPLOCATION("SW1:7,8")
- PORT_DIPSETTING(0x00, "Odd")
- PORT_DIPSETTING(0x40, "Even")
- PORT_DIPSETTING(0x80, "1")
- PORT_DIPSETTING(0xc0, "0")
-
- PORT_START("SW2")
- PORT_DIPNAME(0x01, 0x00, DEF_STR(Unused)) PORT_DIPLOCATION("SW2:1")
- PORT_DIPSETTING(0x01, DEF_STR(Off))
- PORT_DIPSETTING(0x00, DEF_STR(On))
- PORT_DIPNAME(0x02, 0x00, "Cursor") PORT_DIPLOCATION("SW2:2")
- PORT_DIPSETTING(0x00, "Wraparound")
- PORT_DIPSETTING(0x02, "No Wrap")
- PORT_DIPNAME(0x04, 0x00, DEF_STR(Unused)) PORT_DIPLOCATION("SW2:3")
- PORT_DIPSETTING(0x04, DEF_STR(Off))
- PORT_DIPSETTING(0x00, DEF_STR(On))
- PORT_DIPNAME(0x08, 0x08, "Font") PORT_DIPLOCATION("SW2:4")
- PORT_DIPSETTING(0x08, "Upper/Lower Case")
- PORT_DIPSETTING(0x00, "Upper Case Only")
- PORT_DIPNAME(0x10, 0x10, "Communication Mode") PORT_DIPLOCATION("SW2:5")
- PORT_DIPSETTING(0x00, "Half Duplex")
- PORT_DIPSETTING(0x10, "Full Duplex")
- PORT_DIPNAME(0x20, 0x20, "Automatic LF/CR") PORT_DIPLOCATION("SW2:6")
- PORT_DIPSETTING(0x20, "Auto LF")
- PORT_DIPSETTING(0x00, "Carriage Return")
- PORT_DIPNAME(0x40, 0x40, "On Line") PORT_DIPLOCATION("SW2:7")
- PORT_DIPSETTING(0x40, DEF_STR(Off))
- PORT_DIPSETTING(0x00, DEF_STR(On))
- PORT_DIPNAME(0x80, 0x00, DEF_STR(Unused)) PORT_DIPLOCATION("SW2:8")
- PORT_DIPSETTING(0x80, DEF_STR(Off))
- PORT_DIPSETTING(0x00, DEF_STR(On))
+ PORT_START("UNUSED")
+ PORT_DIPNAME(0x1, 0x0, DEF_STR(Unused)) PORT_DIPLOCATION("SW1:1")
+ PORT_DIPSETTING(0x1, DEF_STR(Off))
+ PORT_DIPSETTING(0x0, DEF_STR(On))
+ PORT_DIPNAME(0x2, 0x0, DEF_STR(Unused)) PORT_DIPLOCATION("SW1:2")
+ PORT_DIPSETTING(0x2, DEF_STR(Off))
+ PORT_DIPSETTING(0x0, DEF_STR(On))
+
+ PORT_START("INP4")
+ PORT_DIPNAME(0x7, 0x6, "Baud Rate") PORT_DIPLOCATION("SW1:3,4,5")
+ PORT_DIPSETTING(0x0, "110")
+ PORT_DIPSETTING(0x1, "300")
+ PORT_DIPSETTING(0x2, "600")
+ PORT_DIPSETTING(0x3, "1200")
+ PORT_DIPSETTING(0x4, "1800")
+ PORT_DIPSETTING(0x5, "2400")
+ PORT_DIPSETTING(0x6, "4800")
+ PORT_DIPSETTING(0x7, "9600")
+ PORT_DIPNAME(0x8, 0x0, "Lead-In") PORT_DIPLOCATION("SW1:6") // not verified
+ PORT_DIPSETTING(0x0, "ESC")
+ PORT_DIPSETTING(0x8, "~")
+
+ PORT_START("INP5")
+ PORT_DIPNAME(0x3, 0x3, "Parity") PORT_DIPLOCATION("SW1:7,8")
+ PORT_DIPSETTING(0x0, "Odd")
+ PORT_DIPSETTING(0x1, "Even")
+ PORT_DIPSETTING(0x2, "1")
+ PORT_DIPSETTING(0x3, "0")
+ PORT_DIPNAME(0x4, 0x0, DEF_STR(Unused)) PORT_DIPLOCATION("SW2:1")
+ PORT_DIPSETTING(0x4, DEF_STR(Off))
+ PORT_DIPSETTING(0x0, DEF_STR(On))
+ PORT_BIT(0x8, IP_ACTIVE_LOW, IPT_UNUSED)
+
+ PORT_START("INP6")
+ PORT_DIPNAME(0x1, 0x0, DEF_STR(Unused)) PORT_DIPLOCATION("SW2:8")
+ PORT_DIPSETTING(0x1, DEF_STR(Off))
+ PORT_DIPSETTING(0x0, DEF_STR(On))
+ PORT_DIPNAME(0x2, 0x2, "On Line") PORT_DIPLOCATION("SW2:7")
+ PORT_DIPSETTING(0x2, DEF_STR(Off))
+ PORT_DIPSETTING(0x0, DEF_STR(On))
+ PORT_DIPNAME(0x4, 0x4, "Automatic LF/CR") PORT_DIPLOCATION("SW2:6")
+ PORT_DIPSETTING(0x4, "Auto LF")
+ PORT_DIPSETTING(0x0, "Carriage Return")
+ PORT_DIPNAME(0x8, 0x8, "Communication Mode") PORT_DIPLOCATION("SW2:5")
+ PORT_DIPSETTING(0x0, "Half Duplex")
+ PORT_DIPSETTING(0x8, "Full Duplex")
+
+ PORT_START("INP7")
+ PORT_DIPNAME(0x1, 0x1, "Font") PORT_DIPLOCATION("SW2:4")
+ PORT_DIPSETTING(0x1, "Upper/Lower Case")
+ PORT_DIPSETTING(0x0, "Upper Case Only")
+ PORT_DIPNAME(0x2, 0x0, DEF_STR(Unused)) PORT_DIPLOCATION("SW2:3")
+ PORT_DIPSETTING(0x2, DEF_STR(Off))
+ PORT_DIPSETTING(0x0, DEF_STR(On))
+ PORT_DIPNAME(0x4, 0x0, "Cursor") PORT_DIPLOCATION("SW2:2")
+ PORT_DIPSETTING(0x0, "Wraparound")
+ PORT_DIPSETTING(0x4, "No Wrap")
+ PORT_BIT(0x8, IP_ACTIVE_LOW, IPT_UNKNOWN)
INPUT_PORTS_END
void hazl1420_state::hazl1420(machine_config &config)
@@ -135,7 +162,14 @@ void hazl1420_state::hazl1420(machine_config &config)
I8049(config, m_maincpu, 11_MHz_XTAL);
m_maincpu->set_addrmap(AS_PROGRAM, &hazl1420_state::prog_map);
m_maincpu->set_addrmap(AS_IO, &hazl1420_state::io_map);
+ m_maincpu->p1_out_cb().set(FUNC(hazl1420_state::p1_w));
+ m_maincpu->p2_in_cb().set(FUNC(hazl1420_state::p2_r));
m_maincpu->p2_out_cb().set(FUNC(hazl1420_state::p2_w));
+ m_maincpu->p2_out_cb().append(m_ioexp[0], FUNC(i8243_device::p2_w));
+ m_maincpu->p2_out_cb().append(m_ioexp[1], FUNC(i8243_device::p2_w));
+ m_maincpu->prog_out_cb().set(m_ioexp[0], FUNC(i8243_device::prog_w));
+ m_maincpu->prog_out_cb().append(m_ioexp[1], FUNC(i8243_device::prog_w));
+ m_maincpu->t1_in_cb().set("ace", FUNC(ins8250_device::intrpt_r));
ADDRESS_MAP_BANK(config, m_bankdev);
m_bankdev->set_addrmap(0, &hazl1420_state::bank_map);
@@ -143,8 +177,13 @@ void hazl1420_state::hazl1420(machine_config &config)
m_bankdev->set_addr_width(12);
m_bankdev->set_stride(0x100);
- //I8243(config, m_ioexp[0]);
- //I8243(config, m_ioexp[1]);
+ I8243(config, m_ioexp[0]);
+ m_ioexp[0]->p4_in_cb().set_ioport("INP4");
+ m_ioexp[0]->p5_in_cb().set_ioport("INP5");
+
+ I8243(config, m_ioexp[1]);
+ m_ioexp[1]->p6_in_cb().set_ioport("INP6");
+ m_ioexp[1]->p7_in_cb().set_ioport("INP7");
INS8250(config, "ace", 2'764'800);
@@ -153,6 +192,7 @@ void hazl1420_state::hazl1420(machine_config &config)
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
screen.set_raw(10.92_MHz_XTAL, 700, 0, 560, 260, 0, 240);
screen.set_screen_update(FUNC(hazl1420_state::screen_update));
+ screen.screen_vblank().set_inputline(m_maincpu, MCS48_INPUT_IRQ);
}
ROM_START(hazl1420)