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