summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--src/mame/drivers/att630.cpp85
1 files changed, 77 insertions, 8 deletions
diff --git a/src/mame/drivers/att630.cpp b/src/mame/drivers/att630.cpp
index 6a9995ce819..883e2e04f68 100644
--- a/src/mame/drivers/att630.cpp
+++ b/src/mame/drivers/att630.cpp
@@ -9,6 +9,7 @@ Skeleton driver for AT&T 630 MTG terminal.
#include "emu.h"
#include "cpu/m68000/m68000.h"
#include "machine/mc68681.h"
+#include "machine/nvram.h"
#include "screen.h"
class att630_state : public driver_device
@@ -22,15 +23,40 @@ public:
void att630(machine_config &config);
+protected:
+ virtual void machine_start() override;
+
private:
u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
+ template<int Line> DECLARE_WRITE_LINE_MEMBER(irq_w);
+ TIMER_CALLBACK_MEMBER(update_interrupts);
+
+ u8 bram_r(offs_t offset);
+ void bram_w(offs_t offset, u8 data);
+ u8 irq_vec_r();
+
void mem_map(address_map &map);
+ void vec_map(address_map &map);
required_device<cpu_device> m_maincpu;
required_shared_ptr<u16> m_vram;
+
+ std::unique_ptr<u8[]> m_bram_data;
+ u8 m_pending_interrupts;
};
+void att630_state::machine_start()
+{
+ m_bram_data = std::make_unique<u8[]>(0x2000);
+ subdevice<nvram_device>("bram")->set_base(m_bram_data.get(), 0x2000);
+
+ m_pending_interrupts = 0;
+
+ save_pointer(NAME(m_bram_data), 0x2000);
+ save_item(NAME(m_pending_interrupts));
+}
+
u32 att630_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
for (int y = 0; y < 1024; y++)
@@ -40,6 +66,44 @@ u32 att630_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, con
return 0;
}
+template <int Line>
+WRITE_LINE_MEMBER(att630_state::irq_w)
+{
+ if (BIT(m_pending_interrupts, Line) == state)
+ return;
+
+ if (state)
+ m_pending_interrupts |= 0x01 << Line;
+ else
+ m_pending_interrupts &= ~(0x01 << Line);
+
+ machine().scheduler().synchronize(timer_expired_delegate(FUNC(att630_state::update_interrupts), this));
+}
+
+TIMER_CALLBACK_MEMBER(att630_state::update_interrupts)
+{
+ m_maincpu->set_input_line(M68K_IRQ_1, m_pending_interrupts != 0 ? ASSERT_LINE : CLEAR_LINE);
+}
+
+u8 att630_state::irq_vec_r()
+{
+ for (int level = 7; level > 0; level--)
+ if (BIT(m_pending_interrupts, level))
+ return 0x40 + level;
+
+ return 0x40;
+}
+
+u8 att630_state::bram_r(offs_t offset)
+{
+ return m_bram_data[offset];
+}
+
+void att630_state::bram_w(offs_t offset, u8 data)
+{
+ m_bram_data[offset] = data;
+}
+
void att630_state::mem_map(address_map &map)
{
map(0x000000, 0x03ffff).rom().region("maincpu", 0);
@@ -51,8 +115,12 @@ void att630_state::mem_map(address_map &map)
// map(0x700000, 0x75ffff).noprw(); // video controller
map(0x760000, 0x77ffff).ram().share("vram");
map(0x780000, 0x7fffff).ram(); // program ram
- map(0xe00000, 0xe03fff).noprw(); // 0x00ff mask (bram)
- map(0xfee000, 0xffffff).noprw(); // nvram (size unknown)
+ map(0xe00000, 0xe03fff).mirror(0x1fc000).rw(FUNC(att630_state::bram_r), FUNC(att630_state::bram_w)).umask16(0x00ff);
+}
+
+void att630_state::vec_map(address_map &map)
+{
+ map(0xfffff3, 0xfffff3).r(FUNC(att630_state::irq_vec_r));
}
static INPUT_PORTS_START( att630 )
@@ -62,17 +130,18 @@ void att630_state::att630(machine_config &config)
{
M68000(config, m_maincpu, 40_MHz_XTAL / 4); // clock not confirmed
m_maincpu->set_addrmap(AS_PROGRAM, &att630_state::mem_map);
- // TODO: interrupt vector callback
+ m_maincpu->set_addrmap(m68000_device::AS_CPU_SPACE, &att630_state::vec_map);
+
+ NVRAM(config, "bram", nvram_device::DEFAULT_ALL_0); // 5264 + battery
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
screen.set_raw(87.18336_MHz_XTAL, 1376, 0, 1024, 1056, 0, 1024);
+ screen.set_color(rgb_t::amber());
screen.set_screen_update(FUNC(att630_state::screen_update));
- scn2681_device &duart1(SCN2681(config, "duart1", 3.6864_MHz_XTAL));
- duart1.irq_cb().set_inputline(m_maincpu, M68K_IRQ_1);
+ SCN2681(config, "duart1", 3.6864_MHz_XTAL);
- scn2681_device &duart2(SCN2681(config, "duart2", 3.6864_MHz_XTAL));
- duart2.irq_cb().set_inputline(m_maincpu, M68K_IRQ_1);
+ SCN2681(config, "duart2", 3.6864_MHz_XTAL);
}
@@ -92,4 +161,4 @@ ROM_START( att630 )
ROM_LOAD16_BYTE( "460622-1.bin", 0x20001, 0x10000, CRC(c108c1e0) SHA1(ef01349e890b8a4117c01e78d1c23fbd113ba58f) )
ROM_END
-COMP( 1987, att630, 0, 0, att630, att630, att630_state, empty_init, "AT&T", "630 MTG", MACHINE_IS_SKELETON )
+COMP( 1986, att630, 0, 0, att630, att630, att630_state, empty_init, "AT&T", "630 MTG", MACHINE_IS_SKELETON )