summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/ti99_peb/ti_rs232.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/bus/ti99_peb/ti_rs232.h')
-rw-r--r--src/devices/bus/ti99_peb/ti_rs232.h168
1 files changed, 168 insertions, 0 deletions
diff --git a/src/devices/bus/ti99_peb/ti_rs232.h b/src/devices/bus/ti99_peb/ti_rs232.h
new file mode 100644
index 00000000000..7c75e208d65
--- /dev/null
+++ b/src/devices/bus/ti99_peb/ti_rs232.h
@@ -0,0 +1,168 @@
+// license:LGPL-2.1+
+// copyright-holders:Michael Zapf
+/****************************************************************************
+
+ TI-99 Serial and parallel interface card
+ See ti_rs232.c for documentation
+
+ Michael Zapf
+ February 2012: Rewritten as class
+
+*****************************************************************************/
+
+#ifndef __TIRS232__
+#define __TIRS232__
+
+#include "emu.h"
+#include "peribox.h"
+#include "machine/tms9902.h"
+
+extern const device_type TI99_RS232;
+extern const device_type TI99_RS232_DEV;
+extern const device_type TI99_PIO_DEV;
+
+class ti_rs232_attached_device;
+class ti_pio_attached_device;
+
+class ti_rs232_pio_device : public ti_expansion_card_device
+{
+ friend class ti_pio_attached_device;
+ friend class ti_rs232_attached_device;
+
+public:
+ ti_rs232_pio_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+ DECLARE_READ8Z_MEMBER(readz);
+ DECLARE_WRITE8_MEMBER(write);
+
+ DECLARE_READ8Z_MEMBER(crureadz);
+ DECLARE_WRITE8_MEMBER(cruwrite);
+
+ DECLARE_WRITE_LINE_MEMBER( int0_callback );
+ DECLARE_WRITE_LINE_MEMBER( int1_callback );
+ DECLARE_WRITE_LINE_MEMBER( rcv0_callback );
+ DECLARE_WRITE_LINE_MEMBER( rcv1_callback );
+ DECLARE_WRITE8_MEMBER( xmit0_callback );
+ DECLARE_WRITE8_MEMBER( xmit1_callback );
+ DECLARE_WRITE8_MEMBER( ctrl0_callback );
+ DECLARE_WRITE8_MEMBER( ctrl1_callback );
+ DECLARE_WRITE_LINE_MEMBER( senila );
+
+protected:
+ virtual void device_start(void);
+ virtual void device_reset(void);
+ virtual void device_stop(void);
+ virtual const rom_entry *device_rom_region(void) const;
+ virtual machine_config_constructor device_mconfig_additions() const;
+ virtual ioport_constructor device_input_ports() const;
+
+private:
+ void incoming_dtr(int uartind, line_state value);
+ void transmit_data(int uartind, UINT8 value);
+ UINT8 map_lines_out(int uartind, UINT8 value);
+ UINT8 map_lines_in(int uartind, UINT8 value);
+ void receive_data_or_line_state(int uartind);
+ void set_bit(int uartind, int line, int value);
+
+ void configure_interface(int uartind, int type, int value);
+ void output_line_state(int uartind, int mask, UINT8 value);
+ void output_exception(int uartind, int param, UINT8 value);
+ void ctrl_callback(int uartind, int type, UINT8 data);
+
+ // UART chips
+ tms9902_device* m_uart[2];
+ // Connected images (file or socket connection) that represent the
+ // devices that are connected to the serial adapters
+ ti_rs232_attached_device* m_serdev[2];
+ // Connected image (file) that represents the device connected to the
+ // parallel interface
+ ti_pio_attached_device* m_piodev;
+ UINT8* m_dsrrom;
+
+ // Input buffer for each UART. We have to copy the contents of sdlsocket here
+ // because the buffer in corefile will be lost on the next write operation
+ UINT8* m_recvbuf[2];
+ int m_bufpos[2], m_buflen[2];
+
+ // Latches the state of the output lines for UART0/UART1
+ UINT8 m_signals[2];
+ int m_recv_mode[2]; // May be NORMAL or ESC
+
+ // Baud rate management
+ // not part of the real device, but required for the connection to the
+ // real UART
+ double m_time_hold[2];
+
+ // PIO flags
+ bool m_pio_direction_in; // a.k.a. PIOOC pio in output mode if 0
+ bool m_pio_handshakeout;
+ bool m_pio_handshakein;
+ bool m_pio_spareout;
+ bool m_pio_sparein;
+ bool m_flag0; // spare
+ bool m_led; // a.k.a. flag3
+ int m_pio_out_buffer;
+ int m_pio_in_buffer;
+ bool m_pio_readable;
+ bool m_pio_writable;
+ bool m_pio_write; // true if image is to be written to
+
+ /* Keeps the value put on the bus when SENILA becomes active. */
+ UINT8 m_ila;
+};
+
+/****************************************************************************/
+
+/*
+ Defines the serial serdev. "TI99 RS232 attached serial device"
+*/
+class ti_rs232_attached_device : public device_t, public device_image_interface
+{
+public:
+ ti_rs232_attached_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ iodevice_t image_type() const { return IO_SERIAL; }
+ bool is_readable() const { return true; }
+ bool is_writeable() const { return true; }
+ bool is_creatable() const { return true; }
+ bool must_be_loaded() const { return false; }
+ bool is_reset_on_load() const { return false; }
+ const char *image_interface() const { return ""; }
+ const char *file_extensions() const { return ""; }
+ const option_guide *create_option_guide() const { return NULL; }
+
+protected:
+ virtual void device_start(void);
+ bool call_load();
+ void call_unload();
+ virtual void device_config_complete();
+
+private:
+ int get_index_from_tagname();
+};
+
+/*
+ Defines the PIO (parallel IO) "TI99 PIO attached device"
+*/
+class ti_pio_attached_device : public device_t, public device_image_interface
+{
+public:
+ ti_pio_attached_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ iodevice_t image_type() const { return IO_PARALLEL; }
+ bool is_readable() const { return true; }
+ bool is_writeable() const { return true; }
+ bool is_creatable() const { return true; }
+ bool must_be_loaded() const { return false; }
+ bool is_reset_on_load() const { return false; }
+ const char *image_interface() const { return ""; }
+ const char *file_extensions() const { return ""; }
+ const option_guide *create_option_guide() const { return NULL; }
+
+protected:
+ virtual void device_start(void);
+ bool call_load();
+ void call_unload();
+ virtual void device_config_complete();
+};
+
+#endif