summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/machine/coco3.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/machine/coco3.c')
-rw-r--r--src/mame/machine/coco3.c167
1 files changed, 167 insertions, 0 deletions
diff --git a/src/mame/machine/coco3.c b/src/mame/machine/coco3.c
new file mode 100644
index 00000000000..40624853dec
--- /dev/null
+++ b/src/mame/machine/coco3.c
@@ -0,0 +1,167 @@
+// license:BSD-3-Clause
+// copyright-holders:Nathan Woods
+/***************************************************************************
+
+ coco3.c
+
+ TRS-80 Radio Shack Color Computer 3
+
+ Functions to emulate general aspects of the machine (RAM, ROM, interrupts,
+ I/O ports)
+
+ The Dragon/CoCo2 have two PIAs. These PIAs can trigger interrupts. PIA0
+ is set up to trigger IRQ on the CPU, and PIA1 can trigger FIRQ. Each PIA
+ has two output lines, and an interrupt will be triggered if either of these
+ lines are asserted.
+
+ ----- IRQ
+ 6809 |-<----------- PIA0
+ |
+ |
+ |
+ |
+ |
+ |-<----------- PIA1
+ -----
+
+ The CoCo 3 still supports these interrupts, but the GIME can chose whether
+ "old school" interrupts are generated, or the new ones generated by the GIME
+
+ ----- IRQ
+ 6809 |-<----------- PIA0
+ | | ------
+ | -<-------<-------| |
+ | |GIME|
+ | -<-------<-------| |
+ | FIRQ | ------
+ |-<----------- PIA1
+ -----
+
+ In an email discussion with JK, he informs me that when GIME interrupts are
+ enabled, this actually does not prevent PIA interrupts. Apparently JeffV's
+ CoCo 3 emulator did not handle this properly.
+
+***************************************************************************/
+
+#include "includes/coco3.h"
+
+//-------------------------------------------------
+// ff20_write
+//-------------------------------------------------
+
+WRITE8_MEMBER( coco3_state::ff20_write )
+{
+ coco_state::ff20_write(space, offset, data, mem_mask);
+
+ if (offset == 0x02)
+ m_gime->ff22_write(data);
+}
+
+
+
+//-------------------------------------------------
+// ff40_read
+//-------------------------------------------------
+
+READ8_MEMBER( coco3_state::ff40_read )
+{
+ UINT8 result = 0x00;
+ if (m_gime->spare_chip_select_enabled())
+ result = coco_state::ff40_read(space, offset, mem_mask);
+ return result;
+}
+
+
+
+//-------------------------------------------------
+// ff40_write
+//-------------------------------------------------
+
+WRITE8_MEMBER( coco3_state::ff40_write )
+{
+ if (m_gime->spare_chip_select_enabled())
+ coco_state::ff40_write(space, offset, data, mem_mask);
+}
+
+
+
+//-------------------------------------------------
+// firq_get_line
+//-------------------------------------------------
+
+bool coco3_state::firq_get_line(void)
+{
+ return coco_state::firq_get_line() || m_gime->firq_r();
+}
+
+
+
+//-------------------------------------------------
+// irq_get_line
+//-------------------------------------------------
+
+bool coco3_state::irq_get_line(void)
+{
+ return coco_state::irq_get_line() || m_gime->irq_r();
+}
+
+
+
+//-------------------------------------------------
+// update_keyboard_input
+//-------------------------------------------------
+
+void coco3_state::update_keyboard_input(UINT8 value, UINT8 z)
+{
+ coco_state::update_keyboard_input(value, z);
+ m_gime->set_il1(value == 0xFF);
+}
+
+
+
+//-------------------------------------------------
+// cart_w
+//-------------------------------------------------
+
+void coco3_state::cart_w(bool state)
+{
+ coco_state::cart_w(state);
+ m_gime->set_il0(state);
+}
+
+
+
+//-------------------------------------------------
+// update_cart_base
+//-------------------------------------------------
+
+void coco3_state::update_cart_base(UINT8 *cart_base)
+{
+ m_gime->update_cart_rom();
+}
+
+
+
+//-------------------------------------------------
+// screen_update
+//-------------------------------------------------
+
+UINT32 coco3_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
+{
+ bool result;
+ if (!strcmp(screen.tag(), ":" COMPOSITE_SCREEN_TAG))
+ {
+ /* composite screen */
+ result = m_gime->update_composite(bitmap, cliprect);
+ }
+ else if (!strcmp(screen.tag(), ":" RGB_SCREEN_TAG))
+ {
+ /* rgb screen */
+ result = m_gime->update_rgb(bitmap, cliprect);
+ }
+ else
+ {
+ fatalerror("Called screen_update() with invalid tag '%s'\n", screen.tag());
+ }
+ return result;
+}