summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
author Dirk Best <mail@dirk-best.de>2020-10-04 16:16:56 +0200
committer Dirk Best <mail@dirk-best.de>2020-10-04 16:41:54 +0200
commit632fd2b530453f83de464aa1e07d6cb9a93edf53 (patch)
tree02782702445e3dec6f572774583f688f4f8d075e /src
parent0c8938f584034551ee17ef0a367f776fb8e3ea6b (diff)
in213: Hook up banking and SCC
Diffstat (limited to 'src')
-rw-r--r--src/mame/drivers/informer_213.cpp89
1 files changed, 56 insertions, 33 deletions
diff --git a/src/mame/drivers/informer_213.cpp b/src/mame/drivers/informer_213.cpp
index c031b214484..f6d9268bbd8 100644
--- a/src/mame/drivers/informer_213.cpp
+++ b/src/mame/drivers/informer_213.cpp
@@ -20,8 +20,11 @@
#include "emu.h"
#include "cpu/m6809/m6809.h"
+#include "machine/nvram.h"
#include "machine/z80scc.h"
#include "machine/informer_213_kbd.h"
+#include "bus/rs232/rs232.h"
+#include "bus/rs232/printer.h"
#include "sound/beep.h"
#include "emupal.h"
#include "screen.h"
@@ -38,10 +41,12 @@ public:
informer_213_state(const machine_config &mconfig, device_type type, const char *tag) :
driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
+ m_nvram(*this, "nvram%u", 0U),
m_screen(*this, "screen"),
m_palette(*this, "palette"),
m_scc(*this, "scc"),
m_beep(*this, "beep"),
+ m_nvram_bank(*this, "banked"),
m_vram(*this, "vram"),
m_aram(*this, "aram"),
m_chargen(*this, "chargen")
@@ -55,10 +60,12 @@ protected:
private:
required_device<cpu_device> m_maincpu;
+ required_device_array<nvram_device, 2> m_nvram;
required_device<screen_device> m_screen;
required_device<palette_device> m_palette;
required_device<scc8530_device> m_scc;
required_device<beep_device> m_beep;
+ required_memory_bank m_nvram_bank;
required_shared_ptr<uint8_t> m_vram;
required_shared_ptr<uint8_t> m_aram;
required_region_ptr<uint8_t> m_chargen;
@@ -75,13 +82,12 @@ private:
void cursor_end_w(uint8_t data);
void screen_ctrl_w(uint8_t data);
- uint8_t unk_42_r();
- void unk_42_w(uint8_t data);
-
void bell_w(uint8_t data);
void kbd_int_w(int state);
- uint8_t vector_r();
+ uint8_t firq_vector_r();
+
+ std::unique_ptr<uint8_t[]> m_banked_ram;
uint16_t m_vram_start_addr;
uint16_t m_vram_end_addr;
@@ -90,8 +96,7 @@ private:
uint8_t m_cursor_end;
uint16_t m_cursor_addr;
uint8_t m_screen_ctrl;
- uint8_t m_unk_42;
- uint8_t m_vector;
+ uint8_t m_firq_vector;
};
@@ -109,15 +114,16 @@ void informer_213_state::mem_map(address_map &map)
map(0x000e, 0x000e).unmapr().w(FUNC(informer_213_state::cursor_end_w));
map(0x000f, 0x0010).unmapr().w(FUNC(informer_213_state::cursor_addr_w));
map(0x0021, 0x0021).w(FUNC(informer_213_state::screen_ctrl_w));
- map(0x0042, 0x0042).rw(FUNC(informer_213_state::unk_42_r), FUNC(informer_213_state::unk_42_w));
+ map(0x0040, 0x0043).rw(m_scc, FUNC(scc85c30_device::ab_dc_r), FUNC(scc85c30_device::ab_dc_w));
map(0x0060, 0x0060).w(FUNC(informer_213_state::bell_w));
- map(0x0100, 0x1fff).ram();
- map(0x2000, 0x3fff).ram();
- map(0x4000, 0x5fff).ram();
+ map(0x0100, 0x03ff).ram().share("nvram0"); // might not be all nvram
+ map(0x0400, 0x07ff).bankrw("banked"); // unknown size, data written 0x540 to 0x749
+ map(0x0800, 0x5fff).ram();
map(0x6000, 0x6fff).ram().share("vram");
map(0x7000, 0x7fff).ram().share("aram");
map(0x8000, 0xffff).rom().region("maincpu", 0);
- map(0xfff7, 0xfff7).r(FUNC(informer_213_state::vector_r));
+ map(0xfff7, 0xfff7).r(FUNC(informer_213_state::firq_vector_r));
+ map(0xfff9, 0xfff9).lr8(NAME([this] () { return m_scc->m1_r(); })); // irq vector
}
@@ -291,8 +297,11 @@ void informer_213_state::vblank_w(int state)
{
if (state)
{
- m_vector = 0x10;
+ // real source if this interrupt is unknown, deactivated for now
+#if 0
+ m_firq_vector = 0x10;
m_maincpu->set_input_line(M6809_FIRQ_LINE, HOLD_LINE);
+#endif
}
}
@@ -316,58 +325,52 @@ GFXDECODE_END
// MACHINE EMULATION
//**************************************************************************
-uint8_t informer_213_state::unk_42_r()
-{
- logerror("unk_42_r\n");
- return m_unk_42 | 4;
-}
-
-void informer_213_state::unk_42_w(uint8_t data)
-{
- logerror("unk_42_w: %02x\n", data);
- m_unk_42 = data;
-}
-
void informer_213_state::bell_w(uint8_t data)
{
logerror("bell_w: %02x\n", data);
- // 76543--- unknown
+ // 7654---- unknown
+ // ----3--- ram bank
// -----2-- beeper
// ------10 unknown
m_beep->set_state(BIT(data, 2));
+ m_nvram_bank->set_entry(BIT(data, 3));
}
void informer_213_state::kbd_int_w(int state)
{
- m_vector = 0x14;
+ m_firq_vector = 0x14;
m_maincpu->set_input_line(M6809_FIRQ_LINE, HOLD_LINE);
}
-uint8_t informer_213_state::vector_r()
+uint8_t informer_213_state::firq_vector_r()
{
- uint8_t tmp = m_vector;
- m_vector = 0x00;
+ uint8_t tmp = m_firq_vector;
+ m_firq_vector = 0x00;
return tmp;
}
void informer_213_state::machine_start()
{
+ m_banked_ram = make_unique_clear<uint8_t[]>(0x800);
+ membank("banked")->configure_entries(0, 2, m_banked_ram.get(), 0x400);
+
+ m_nvram[1]->set_base(m_banked_ram.get(), 0x800);
+
// register for save states
save_item(NAME(m_vram_start_addr));
save_item(NAME(m_vram_start_addr2));
save_item(NAME(m_vram_end_addr));
save_item(NAME(m_cursor_addr));
save_item(NAME(m_screen_ctrl));
- save_item(NAME(m_unk_42));
- save_item(NAME(m_vector));
+ save_item(NAME(m_firq_vector));
}
void informer_213_state::machine_reset()
{
- m_vector = 0x00;
+ m_firq_vector = 0x00;
}
@@ -375,12 +378,32 @@ void informer_213_state::machine_reset()
// MACHINE DEFINTIONS
//**************************************************************************
+void in213_printer_devices(device_slot_interface &device)
+{
+ device.option_add("printer", SERIAL_PRINTER);
+}
+
void informer_213_state::informer_213(machine_config &config)
{
MC6809(config, m_maincpu, 18.432_MHz_XTAL / 4); // unknown clock
m_maincpu->set_addrmap(AS_PROGRAM, &informer_213_state::mem_map);
- SCC8530N(config, m_scc, 0); // unknown clock
+ NVRAM(config, m_nvram[0], nvram_device::DEFAULT_ALL_0);
+ NVRAM(config, m_nvram[1], nvram_device::DEFAULT_ALL_0);
+
+ SCC8530N(config, m_scc, 18.432_MHz_XTAL / 5);
+ m_scc->out_txda_callback().set("host", FUNC(rs232_port_device::write_txd));
+ m_scc->out_dtra_callback().set("host", FUNC(rs232_port_device::write_dtr));
+ m_scc->out_rtsa_callback().set("host", FUNC(rs232_port_device::write_rts));
+ m_scc->out_txdb_callback().set("printer", FUNC(rs232_port_device::write_txd));
+ m_scc->out_int_callback().set_inputline(m_maincpu, M6809_IRQ_LINE);
+
+ rs232_port_device &rs232_host(RS232_PORT(config, "host", default_rs232_devices, nullptr));
+ rs232_host.rxd_handler().set(m_scc, FUNC(scc85c30_device::rxa_w));
+ rs232_host.dcd_handler().set(m_scc, FUNC(scc85c30_device::dcda_w));
+ rs232_host.cts_handler().set(m_scc, FUNC(scc85c30_device::ctsa_w));
+
+ RS232_PORT(config, "printer", in213_printer_devices, nullptr);
// video
SCREEN(config, m_screen, SCREEN_TYPE_LCD);