summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/iq151/minigraf.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/bus/iq151/minigraf.c')
-rw-r--r--src/devices/bus/iq151/minigraf.c167
1 files changed, 167 insertions, 0 deletions
diff --git a/src/devices/bus/iq151/minigraf.c b/src/devices/bus/iq151/minigraf.c
new file mode 100644
index 00000000000..1cec65a47d1
--- /dev/null
+++ b/src/devices/bus/iq151/minigraf.c
@@ -0,0 +1,167 @@
+// license:BSD-3-Clause
+// copyright-holders:Sandro Ronco
+/***************************************************************************
+
+ IQ151 Aritma Minigraf 0507 module emulation
+
+***************************************************************************/
+
+#include "emu.h"
+#include "minigraf.h"
+
+#include "emuopts.h"
+#include "png.h"
+
+// paper is A4 (297x210mm)
+#define PAPER_WIDTH (210*8)
+#define PAPER_HEIGHT (297*8)
+
+// usable area is 187.5x262.5mm step is 0.125mm
+#define PAPER_MAX_X 1500
+#define PAPER_MAX_Y 2100
+
+// dump the m_paper bitmap into a png
+#define DUMP_PAPER_INTO_PNG 0
+
+/***************************************************************************
+ IMPLEMENTATION
+***************************************************************************/
+
+ROM_START( iq151_minigraf )
+ ROM_REGION(0x1000, "minigraf", 0)
+ ROM_LOAD( "minigraf_010787.rom", 0x0000, 0x0800, CRC(d854d203) SHA1(ae19c2859f8d78fda227a74ab50c6eb095d14014))
+ ROM_LOAD( "minigraf_050986.rom", 0x0800, 0x0800, CRC(e0559e9e) SHA1(475d294e4976f88ad13e77a39b1c607827c791dc))
+ROM_END
+
+//**************************************************************************
+// GLOBAL VARIABLES
+//**************************************************************************
+
+const device_type IQ151_MINIGRAF = &device_creator<iq151_minigraf_device>;
+
+//**************************************************************************
+// LIVE DEVICE
+//**************************************************************************
+
+//-------------------------------------------------
+// iq151_minigraf_device - constructor
+//-------------------------------------------------
+
+iq151_minigraf_device::iq151_minigraf_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : device_t(mconfig, IQ151_MINIGRAF, "IQ151 Minigraf", tag, owner, clock, "iq151_minigraf", __FILE__),
+ device_iq151cart_interface( mconfig, *this )
+{
+}
+
+//-------------------------------------------------
+// device_start - device-specific startup
+//-------------------------------------------------
+
+void iq151_minigraf_device::device_start()
+{
+ m_rom = (UINT8*)memregion("minigraf")->base();
+
+ // allocate a bitmap for represent the paper
+ m_paper = auto_bitmap_ind16_alloc(machine(), PAPER_WIDTH, PAPER_HEIGHT);
+ m_paper->fill(0);
+
+ m_pen = 0;
+ m_posx = m_posy = 0;
+}
+
+//-------------------------------------------------
+// device_stop - clean up anything that needs to
+// happen before the running_machine goes away
+//-------------------------------------------------
+
+void iq151_minigraf_device::device_stop()
+{
+#if DUMP_PAPER_INTO_PNG
+ emu_file file(machine().options().snapshot_directory(), OPEN_FLAG_WRITE | OPEN_FLAG_CREATE | OPEN_FLAG_CREATE_PATHS);
+ file_error filerr = file.open("iq151_minigraf.png");
+
+ if (filerr == FILERR_NONE)
+ {
+ static const rgb_t png_palette[] = { rgb_t::white, rgb_t::black };
+
+ // save the paper into a png
+ png_write_bitmap(file, NULL, *m_paper, 2, png_palette);
+ }
+#endif
+}
+
+//-------------------------------------------------
+// rom_region - device-specific ROM region
+//-------------------------------------------------
+
+const rom_entry *iq151_minigraf_device::device_rom_region() const
+{
+ return ROM_NAME( iq151_minigraf );
+}
+
+//-------------------------------------------------
+// read
+//-------------------------------------------------
+
+void iq151_minigraf_device::read(offs_t offset, UINT8 &data)
+{
+ // interal ROM is mapped at 0xc000-0xc7ff
+ if (offset >= 0xc000 && offset < 0xc800)
+ data = m_rom[offset & 0x7ff];
+}
+
+//-------------------------------------------------
+// IO write
+//-------------------------------------------------
+
+void iq151_minigraf_device::io_write(offs_t offset, UINT8 data)
+{
+ if (offset >= 0xf0 && offset < 0xf4)
+ {
+ /*
+ Plotter control lines
+
+ ---- -xxx horizontal step
+ --xx x--- vertical step
+ -x-- ---- ???
+ x--- ---- pen up/down
+ */
+
+ plotter_update(data);
+ }
+}
+
+
+//**************************************************************************
+// Aritma MINIGRAF 0507
+//**************************************************************************
+
+inline int iq151_minigraf_device::get_direction(UINT8 old_val, UINT8 new_val)
+{
+ if (new_val == 0 && old_val == 7) return +1;
+ if (new_val == 7 && old_val == 0) return -1;
+
+ return (new_val - old_val);
+}
+
+void iq151_minigraf_device::plotter_update(UINT8 control)
+{
+ // update pen and paper positions
+ m_posy += get_direction(m_control & 7, control & 7);
+ m_posx += get_direction((m_control>>3) & 7, (control>>3) & 7);
+
+ // bit 7 is pen up/down
+ m_pen = BIT(control, 7);
+
+ // clamp within range
+ m_posx = MAX(m_posx, 0);
+ m_posx = MIN(m_posx, PAPER_MAX_X);
+ m_posy = MAX(m_posy, 0);
+ m_posy = MIN(m_posy, PAPER_MAX_Y);
+
+ // if pen is down draws a point
+ if (m_pen)
+ m_paper->pix16(((PAPER_HEIGHT-PAPER_MAX_Y)/2) + m_posy, ((PAPER_WIDTH-PAPER_MAX_X)/2) + m_posx) = 1;
+
+ m_control = control;
+}