summaryrefslogblamecommitdiffstatshomepage
path: root/src/devices/bus/ieee488/remote488.h
blob: 312fc260f423de3c30b487972ca156f0876c8d61 (plain) (tree)



































                                                                                                          

                                 

























































                                                                                                       
                              





                               
                          




                                                      
                          









                                                                        
                             











                                                
// license:BSD-3-Clause
// copyright-holders: F. Ulivi
/*********************************************************************

    remote488.h

*********************************************************************/

#ifndef MAME_BUS_IEEE488_REMOTE488_H
#define MAME_BUS_IEEE488_REMOTE488_H

#pragma once

#include "ieee488.h"
#include "imagedev/bitbngr.h"

class remote488_device : public device_t,
						 public device_ieee488_interface
{
public:
	// construction/destruction
	remote488_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);

	// device_ieee488_interface overrides
	virtual void ieee488_eoi(int state) override;
	virtual void ieee488_dav(int state) override;
	virtual void ieee488_nrfd(int state) override;
	virtual void ieee488_ndac(int state) override;
	virtual void ieee488_ifc(int state) override;
	virtual void ieee488_srq(int state) override;
	virtual void ieee488_atn(int state) override;
	virtual void ieee488_ren(int state) override;

	// Timers
	enum {
		TMR_ID_POLL,
		TMR_ID_HEARTBEAT,
		TMR_ID_AH
	};

protected:
	virtual void device_start() override;
	virtual void device_reset() override;
	virtual void device_add_mconfig(machine_config &config) override;
	virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;

private:
	// Position of signals in "S/R" msgs
	enum signal_bit {
		SIGNAL_ATN_BIT, // Bit 0
		SIGNAL_IFC_BIT, // Bit 1
		SIGNAL_REN_BIT, // Bit 2
		SIGNAL_SRQ_BIT, // Bit 3
		SIGNAL_COUNT
	};

	// Source handshake states
	enum {
		REM_SH_SIDS,
		REM_SH_SDYS,
		REM_SH_STRS
	};

	// Acceptor handshake states
	enum {
		REM_AH_AIDS,
		REM_AH_ACRS,
		REM_AH_ACDS,
		REM_AH_AWNS
	};

	// Stream rx states
	enum {
		REM_RX_WAIT_CH,
		REM_RX_WAIT_COLON,
		REM_RX_WAIT_1ST_HEX,
		REM_RX_WAIT_2ND_HEX,
		REM_RX_WAIT_SEP,
		REM_RX_WAIT_WS
	};

	required_device<bitbanger_device> m_stream;
	uint8_t m_in_signals;
	uint8_t m_out_signals;
	bool m_no_propagation;
	int m_sh_state;
	int m_ah_state;
	int m_rx_state;
	char m_rx_ch;
	uint8_t m_rx_data;
	bool m_flush_bytes;
	bool m_ibf;
	uint8_t m_ib;
	bool m_ib_eoi;
	emu_timer *m_poll_timer;
	emu_timer *m_hb_timer;
	emu_timer *m_ah_timer;
	unsigned m_connect_cnt;
	bool m_connected;
	uint8_t m_pp_data;
	bool m_pp_requested;
	uint8_t m_pp_dio;
	uint8_t m_sh_dio;
	bool m_waiting_cp;

	void bus_reset();
	void process_input_msgs();
	void set_connection(bool state);
	void recvd_data_byte(uint8_t data , bool eoi);
	void flush_data();
	void update_signals_from_rem(uint8_t to_set , uint8_t to_clear);
	void update_signal(signal_bit bit , int state);
	void update_state(uint8_t new_signals);
	void send_update(char type , uint8_t data);
	static bool a2hex(char c , uint8_t& out);
	static bool is_msg_type(char c);
	static bool is_terminator(char c);
	static bool is_space(char c);
	char recv_update(uint8_t& data);
	bool is_local_atn_active() const;
	void ah_checkpoint();
	void update_ah_fsm();
	void update_sh_fsm();
	bool is_local_pp_active() const;
	void update_pp();
	void update_pp_dio();
	void update_dio();
};

// device type definition
DECLARE_DEVICE_TYPE(REMOTE488, remote488_device)

#endif // MAME_BUS_IEEE488_REMOTE488_H