1 // license:BSD-3-Clause
2 // copyright-holders:Curt Coder, smf
3 /**********************************************************************
4 
5     SpeedDOS / Burst Nibbler 1541/1571 Parallel Cable emulation
6 
7 **********************************************************************/
8 
9 #ifndef MAME_BUS_C64_BN1541_H
10 #define MAME_BUS_C64_BN1541_H
11 
12 #pragma once
13 
14 
15 #include "user.h"
16 
17 
18 
19 //**************************************************************************
20 //  TYPE DEFINITIONS
21 //**************************************************************************
22 
23 // ======================> device_c64_floppy_parallel_interface
24 
25 class device_c64_floppy_parallel_interface
26 {
27 public:
28 	// construction/destruction
29 	device_c64_floppy_parallel_interface(const machine_config &mconfig, device_t &device);
30 	virtual ~device_c64_floppy_parallel_interface();
31 
32 	virtual void parallel_data_w(uint8_t data) = 0;
33 	virtual void parallel_strobe_w(int state) = 0;
34 
35 	device_c64_floppy_parallel_interface *m_other;
36 
37 protected:
38 	uint8_t m_parallel_data;
39 };
40 
41 
42 // ======================> c64_bn1541_device
43 
44 class c64_bn1541_device : public device_t,
45 		public device_pet_user_port_interface,
46 		public device_c64_floppy_parallel_interface
47 {
48 public:
49 	// construction/destruction
50 	c64_bn1541_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
51 
52 protected:
53 	// device-level overrides
54 	virtual void device_start() override;
55 
56 	// device_c64_floppy_parallel_interface overrides
57 	virtual void parallel_data_w(uint8_t data) override;
58 	virtual void parallel_strobe_w(int state) override;
59 
60 	// device_pet_user_port_interface overrides
61 	virtual DECLARE_WRITE_LINE_MEMBER(input_8) override;
WRITE_LINE_MEMBER(input_c)62 	virtual WRITE_LINE_MEMBER(input_c) override { if (state) m_parallel_output |= 1; else m_parallel_output &= ~1; update_output(); }
WRITE_LINE_MEMBER(input_d)63 	virtual WRITE_LINE_MEMBER(input_d) override { if (state) m_parallel_output |= 2; else m_parallel_output &= ~2; update_output(); }
WRITE_LINE_MEMBER(input_e)64 	virtual WRITE_LINE_MEMBER(input_e) override { if (state) m_parallel_output |= 4; else m_parallel_output &= ~4; update_output(); }
WRITE_LINE_MEMBER(input_f)65 	virtual WRITE_LINE_MEMBER(input_f) override { if (state) m_parallel_output |= 8; else m_parallel_output &= ~8; update_output(); }
WRITE_LINE_MEMBER(input_h)66 	virtual WRITE_LINE_MEMBER(input_h) override { if (state) m_parallel_output |= 16; else m_parallel_output &= ~16; update_output(); }
WRITE_LINE_MEMBER(input_j)67 	virtual WRITE_LINE_MEMBER(input_j) override { if (state) m_parallel_output |= 32; else m_parallel_output &= ~32; update_output(); }
WRITE_LINE_MEMBER(input_k)68 	virtual WRITE_LINE_MEMBER(input_k) override { if (state) m_parallel_output |= 64; else m_parallel_output &= ~64; update_output(); }
WRITE_LINE_MEMBER(input_l)69 	virtual WRITE_LINE_MEMBER(input_l) override { if (state) m_parallel_output |= 128; else m_parallel_output &= ~128; update_output(); }
70 
71 private:
72 	void update_output();
73 	uint8_t m_parallel_output;
74 };
75 
76 
77 // device type definition
78 DECLARE_DEVICE_TYPE(C64_BN1541, c64_bn1541_device)
79 
80 
81 #endif // MAME_BUS_C64_BN1541_H
82