summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/machine/apexc.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/machine/apexc.h')
-rw-r--r--src/mame/machine/apexc.h161
1 files changed, 161 insertions, 0 deletions
diff --git a/src/mame/machine/apexc.h b/src/mame/machine/apexc.h
new file mode 100644
index 00000000000..83d82ce09f6
--- /dev/null
+++ b/src/mame/machine/apexc.h
@@ -0,0 +1,161 @@
+// license:GPL-2.0+
+// copyright-holders:Raphael Nabet, Robbbert
+/*
+ machine/apexc.c : APEXC machine
+
+ By Raphael Nabet
+
+ see cpu/apexc.c for background and tech info
+*/
+
+#ifndef MAME_MACHINE_APEXC
+#define MAME_MACHINE_APEXC
+
+#pragma once
+
+#include "emu.h"
+
+/*
+ APEXC RAM loading/saving from cylinder image
+
+ Note that, in an actual APEXC, the RAM contents are not read from the cylinder :
+ the cylinder IS the RAM.
+
+ This feature is important : of course, the tape reader allows to enter programs, but you
+ still need an object code loader in memory. (Of course, the control panel enables
+ the user to enter such a loader manually, but it would take hours...)
+*/
+
+class apexc_cylinder_image_device : public device_t, public device_image_interface
+{
+public:
+ // construction/destruction
+ apexc_cylinder_image_device(const machine_config &mconfig, const char *tag, device_t *owner)
+ : apexc_cylinder_image_device(mconfig, tag, owner, (uint32_t)0)
+ {
+ }
+
+ apexc_cylinder_image_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ // image-level overrides
+ virtual iodevice_t image_type() const override { return IO_CYLINDER; }
+
+ virtual bool is_readable() const override { return true; }
+ virtual bool is_writeable() const override { return true; }
+ virtual bool is_creatable() const override { return false; }
+ virtual bool must_be_loaded() const override { return false; }
+ virtual bool is_reset_on_load() const override { return true; }
+ virtual const char *file_extensions() const override { return "apc"; }
+
+ virtual image_init_result call_load() override;
+ virtual void call_unload() override;
+
+private:
+ virtual void device_start() override { }
+
+ int m_writable;
+};
+
+/*
+ APEXC tape support
+
+ APEXC does all I/O on paper tape. There are 5 punch rows on tape.
+
+ Both a reader (read-only), and a puncher (write-only) are provided.
+
+ Tape output can be fed into a teletyper, in order to have text output :
+
+ code Symbol
+ (binary) Letters Figures
+ 00000 0
+ 00001 T 1
+ 00010 B 2
+ 00011 O 3
+ 00100 E 4
+ 00101 H 5
+ 00110 N 6
+ 00111 M 7
+ 01000 A 8
+ 01001 L 9
+ 01010 R +
+ 01011 G -
+ 01100 I z
+ 01101 P .
+ 01110 C d
+ 01111 V =
+ 10000 Space
+ 10001 Z y
+ 10010 D theta (greek letter)
+ 10011 Line Space (i.e. LF)
+ 10100 S ,
+ 10101 Y Sigma (greek letter)
+ 10110 F x
+ 10111 X /
+ 11000 Carriage Return
+ 11001 W phi (greek letter)
+ 11010 J - (dash ?)
+ 11011 Figures
+ 11100 U pi (greek letter)
+ 11101 Q )
+ 11110 K (
+ 11111 Letters
+*/
+
+class apexc_tape_puncher_image_device : public device_t, public device_image_interface
+{
+public:
+ // construction/destruction
+ apexc_tape_puncher_image_device(const machine_config &mconfig, const char *tag, device_t *owner)
+ : apexc_tape_puncher_image_device(mconfig, tag, owner, (uint32_t)0)
+ {
+ }
+
+ apexc_tape_puncher_image_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ // image-level overrides
+ virtual iodevice_t image_type() const override { return IO_PUNCHTAPE; }
+
+ virtual bool is_readable() const override { return false; }
+ virtual bool is_writeable() const override { return true; }
+ virtual bool is_creatable() const override { return true; }
+ virtual bool must_be_loaded() const override { return false; }
+ virtual bool is_reset_on_load() const override { return false; }
+ virtual const char *file_extensions() const override { return "tap"; }
+
+ DECLARE_WRITE8_MEMBER(write);
+
+private:
+ virtual void device_start() override { }
+};
+
+class apexc_tape_reader_image_device : public device_t, public device_image_interface
+{
+public:
+ // construction/destruction
+ apexc_tape_reader_image_device(const machine_config &mconfig, const char *tag, device_t *owner)
+ : apexc_tape_reader_image_device(mconfig, tag, owner, (uint32_t)0)
+ {
+ }
+
+ apexc_tape_reader_image_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+ // image-level overrides
+ virtual iodevice_t image_type() const override { return IO_PUNCHTAPE; }
+
+ virtual bool is_readable() const override { return true; }
+ virtual bool is_writeable() const override { return false; }
+ virtual bool is_creatable() const override { return false; }
+ virtual bool must_be_loaded() const override { return false; }
+ virtual bool is_reset_on_load() const override { return false; }
+ virtual const char *file_extensions() const override { return "tap"; }
+
+ DECLARE_READ8_MEMBER(read);
+private:
+ virtual void device_start() override { }
+};
+
+DECLARE_DEVICE_TYPE(APEXC_CYLINDER, apexc_cylinder_image_device)
+DECLARE_DEVICE_TYPE(APEXC_TAPE_PUNCHER, apexc_tape_puncher_image_device)
+DECLARE_DEVICE_TYPE(APEXC_TAPE_READER, apexc_tape_reader_image_device)
+
+#endif // MAME_MACHINE_APEXC \ No newline at end of file