hazl1420: Add interrupts and hook up DIP switches through I/O expanders (nw)

This commit is contained in:
AJR 2018-09-24 15:38:59 -04:00
parent db0e5ab245
commit f65e1c2a32
3 changed files with 99 additions and 53 deletions

View File

@ -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.

View File

@ -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)

View File

@ -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("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("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("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)