1 // license:BSD-3-Clause
2 // copyright-holders:Aaron Giles
3 /*************************************************************************
4 
5     ldv1000.h
6 
7     Pioneer LD-V1000 laserdisc emulation.
8 
9 *************************************************************************/
10 
11 #ifndef MAME_MACHINE_LDV1000_H
12 #define MAME_MACHINE_LDV1000_H
13 
14 #pragma once
15 
16 #include "laserdsc.h"
17 #include "cpu/z80/z80.h"
18 #include "cpu/mcs48/mcs48.h"
19 #include "machine/z80ctc.h"
20 
21 
22 //**************************************************************************
23 //  GLOBAL VARIABLES
24 //**************************************************************************
25 
26 // device type definition
DECLARE_DEVICE_TYPE(PIONEER_LDV1000,pioneer_ldv1000_device)27 DECLARE_DEVICE_TYPE(PIONEER_LDV1000, pioneer_ldv1000_device)
28 
29 
30 
31 //**************************************************************************
32 //  TYPE DEFINITIONS
33 //**************************************************************************
34 
35 // ======================> pioneer_ldv1000_device
36 
37 // base ldv1000 class
38 class pioneer_ldv1000_device : public laserdisc_device
39 {
40 public:
41 	// construction/destruction
42 	pioneer_ldv1000_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
43 
44 	auto command_strobe_callback() { return m_command_strobe_cb.bind(); }
45 
46 	// input and output
47 	void data_w(uint8_t data);
48 	void enter_w(uint8_t data);
49 	uint8_t status_r() const { return m_status; }
50 	uint8_t status_strobe_r() const { return (m_portc1 & 0x20) ? ASSERT_LINE : CLEAR_LINE; }
51 	uint8_t command_strobe_r() const { return (m_portc1 & 0x10) ? ASSERT_LINE : CLEAR_LINE; }
52 
53 protected:
54 	// timer IDs
55 	enum
56 	{
57 		TID_MULTIJUMP = TID_FIRST_PLAYER_TIMER,
58 		TID_VSYNC_OFF,
59 		TID_VBI_DATA_FETCH
60 	};
61 
62 	// device-level overrides
63 	virtual void device_start() override;
64 	virtual void device_reset() override;
65 	virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
66 	virtual const tiny_rom_entry *device_rom_region() const override;
67 	virtual void device_add_mconfig(machine_config &config) override;
68 
69 	// subclass overrides
70 	virtual void player_vsync(const vbi_metadata &vbi, int fieldnum, const attotime &curtime) override;
71 	virtual int32_t player_update(const vbi_metadata &vbi, int fieldnum, const attotime &curtime) override;
72 	virtual void player_overlay(bitmap_yuy16 &bitmap) override { }
73 
74 private:
75 	// internal helpers
76 	bool focus_on() const { return !(m_portb1 & 0x01); }
77 	bool spdl_on() const { return !(m_portb1 & 0x02); }
78 	bool laser_on() const { return (m_portb1 & 0x40); }
79 
80 	// internal read/write handlers
81 	void z80_decoder_display_port_w(offs_t offset, uint8_t data);
82 	uint8_t z80_decoder_display_port_r(offs_t offset);
83 	uint8_t z80_controller_r();
84 	void z80_controller_w(uint8_t data);
85 
86 	// internal read/write handlers
87 	void ctc_interrupt(int state);
88 	void ppi0_porta_w(uint8_t data);
89 	uint8_t ppi0_portb_r();
90 	uint8_t ppi0_portc_r();
91 	void ppi0_portc_w(uint8_t data);
92 	uint8_t ppi1_porta_r();
93 	void ppi1_portb_w(uint8_t data);
94 	void ppi1_portc_w(uint8_t data);
95 
96 	void ldv1000_map(address_map &map);
97 	void ldv1000_portmap(address_map &map);
98 
99 	// internal state
100 	required_device<z80_device> m_z80_cpu;                  /* CPU index of the Z80 */
101 	required_device<z80ctc_device> m_z80_ctc;                   /* CTC device */
102 	emu_timer *         m_multitimer;           /* multi-jump timer device */
103 	devcb_write_line    m_command_strobe_cb;
104 
105 	/* communication status */
106 	uint8_t               m_command;              /* command byte to the player */
107 	uint8_t               m_status;                   /* status byte from the player */
108 	bool                m_vsync;                    /* VSYNC state */
109 
110 	/* I/O port states */
111 	uint8_t               m_counter_start;            /* starting value for counter */
112 	uint8_t               m_counter;              /* current counter value */
113 	uint8_t               m_portc0;                   /* port C on PPI 0 */
114 	uint8_t               m_portb1;                   /* port B on PPI 1 */
115 	uint8_t               m_portc1;                   /* port C on PPI 1 */
116 
117 	/* display/decode circuit emulation */
118 	uint8_t               m_portselect;               /* selection of which port to access */
119 	uint8_t               m_display[2][20];           /* display lines */
120 	uint8_t               m_dispindex;                /* index within the display line */
121 	uint8_t               m_vbi[7*3];             /* VBI data */
122 	bool                m_vbiready;             /* VBI ready flag */
123 	uint8_t               m_vbiindex;             /* index within the VBI data */
124 
125 };
126 
127 #endif // MAME_MACHINE_LDV1000_H
128