1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
|
// license:BSD-3-Clause
// copyright-holders:Ryan Holtz
/*************************************************************************
ldv1000hle.h
Pioneer LDV-1000 laserdisc player simulation.
*************************************************************************/
#ifndef MAME_MACHINE_LDV1000HLE_H
#define MAME_MACHINE_LDV1000HLE_H
#pragma once
#include "laserdsc.h"
//**************************************************************************
// GLOBAL VARIABLES
//**************************************************************************
// device type definition
DECLARE_DEVICE_TYPE(PIONEER_LDV1000HLE, pioneer_ldv1000hle_device)
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
class pioneer_ldv1000hle_device : public parallel_laserdisc_device
{
public:
// construction/destruction
pioneer_ldv1000hle_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0);
virtual void data_w(u8 data) override;
virtual u8 data_r() override;
virtual void enter_w(int state) override;
virtual int status_strobe_r() override { return m_status_strobe; }
virtual int ready_r() override { return m_command_strobe; }
protected:
// device-level overrides
virtual void device_start() override ATTR_COLD;
virtual void device_reset() override ATTR_COLD;
// laserdisc overrides
virtual void player_vsync(const vbi_metadata &vbi, int fieldnum, const attotime &curtime) override;
virtual s32 player_update(const vbi_metadata &vbi, int fieldnum, const attotime &curtime) override;
TIMER_CALLBACK_MEMBER(process_vbi_data);
TIMER_CALLBACK_MEMBER(resume_from_stop);
TIMER_CALLBACK_MEMBER(park_strobe_tick);
TIMER_CALLBACK_MEMBER(assert_status_strobe);
TIMER_CALLBACK_MEMBER(deassert_status_strobe);
TIMER_CALLBACK_MEMBER(assert_command_strobe);
TIMER_CALLBACK_MEMBER(deassert_command_strobe);
private:
enum player_command : u8
{
CMD_CLEAR = 0xbf,
CMD_0 = 0x3f,
CMD_1 = 0x0f,
CMD_2 = 0x8f,
CMD_3 = 0x4f,
CMD_4 = 0x2f,
CMD_5 = 0xaf,
CMD_6 = 0x6f,
CMD_7 = 0x1f,
CMD_8 = 0x9f,
CMD_9 = 0x5f,
CMD_STORE = 0xf5,
CMD_RECALL = 0x7f,
CMD_DISPLAY = 0xf1,
CMD_AUDIO1 = 0xf4,
CMD_AUDIO2 = 0xfc,
CMD_PLAY = 0xfd,
CMD_STOP = 0xfb,
CMD_AUTOSTOP = 0xf3,
CMD_SEARCH = 0xf7,
CMD_SCAN_FWD = 0xf0,
CMD_SCAN_REV = 0xf8,
CMD_STEP_FWD = 0xf6,
CMD_STEP_REV = 0xfe,
CMD_REJECT = 0xf9,
CMD_NO_ENTRY = 0xff,
CMD_LOAD = 0xcc,
CMD_DISPLAY_DISABLE = 0xcd,
CMD_DISPLAY_ENABLE = 0xce,
CMD_GET_FRAME_NUM = 0xc2,
CMD_GET_2ND_DISPLAY = 0xc3,
CMD_GET_1ST_DISPLAY = 0xc4,
CMD_TRANSFER_MEMORY = 0xc8,
CMD_FWD_X0 = 0xa0,
CMD_FWD_X1_4 = 0xa1,
CMD_FWD_X1_2 = 0xa2,
CMD_FWD_X1 = 0xa3,
CMD_FWD_X2 = 0xa4,
CMD_FWD_X3 = 0xa5,
CMD_FWD_X4 = 0xa6,
CMD_FWD_X5 = 0xa7,
CMD_SKIP_FWD_10 = 0xb1,
CMD_SKIP_FWD_20 = 0xb2,
CMD_SKIP_FWD_30 = 0xb3,
CMD_SKIP_FWD_40 = 0xb4,
CMD_SKIP_FWD_50 = 0xb5,
CMD_SKIP_FWD_60 = 0xb6,
CMD_SKIP_FWD_70 = 0xb7,
CMD_SKIP_FWD_80 = 0xb8,
CMD_SKIP_FWD_90 = 0xb9,
CMD_SKIP_FWD_100 = 0xba
};
enum player_status : u8
{
STATUS_PARK = 0x7c,
STATUS_PLAY = 0x64,
STATUS_STOP = 0x65,
STATUS_SEARCH = 0x50,
STATUS_SEARCH_FINISH = 0xd0,
STATUS_SEARCH_ERROR = 0x90,
STATUS_AUTOSTOP = 0x54,
STATUS_SCAN = 0x4c,
STATUS_FORWARD = 0x2e,
STATUS_LOAD = 0x48,
STATUS_LOAD_END = 0xc8,
STATUS_LOAD_ERROR = 0xc4,
STATUS_FOCUS_UNLOCK = 0xbc,
STATUS_LEADIN = 0x58,
STATUS_LEADOUT = 0x5c,
STATUS_REJECT = 0x60,
STATUS_READY = 0x80
};
enum player_mode : u8
{
MODE_PARK,
MODE_PLAY,
MODE_SCAN_FORWARD,
MODE_SCAN_REVERSE,
MODE_SEARCH,
MODE_STOP
};
void process_command_buffer();
bool is_command_byte(const u8 data);
bool is_command_number(const u8 data);
void process_command(size_t cmd_index);
static u32 bcd_to_literal(u32 bcd);
u32 literal_to_bcd(u32 value);
u32 cmd_number_to_bcd();
u8 cmd_to_number(const u8 cmd);
void set_mode(const u8 mode);
void set_playing(const u8 new_status, const double fields_per_vsync);
void set_stopped(const u8 new_status);
void cmd_play();
void cmd_stop();
void cmd_step(const int direction);
void cmd_play_forward(const double fields_per_vsync);
void cmd_search(const u32 frame);
void cmd_skip_forward(const s32 amount);
void update_video_enable();
void update_audio_enable();
// internal state
emu_timer * m_vbi_fetch;
emu_timer * m_stop_timer;
emu_timer * m_park_strobe_timer;
emu_timer * m_assert_status_strobe_timer;
emu_timer * m_deassert_status_strobe_timer;
emu_timer * m_assert_command_strobe_timer;
emu_timer * m_deassert_command_strobe_timer;
u8 m_cmd_buffer[21];
u32 m_cmd_length;
u8 m_status;
u8 m_pre_stop_status;
u8 m_mode; // current player mode
u32 m_curr_frame; // frame number
u32 m_search_frame;
u32 m_stop_frame;
u8 m_cmd_number[5];
u32 m_cmd_number_length;
u16 m_user_ram[1024];
u32 m_curr_register;
u32 m_scan_speed;
u32 m_scan_speed_accum;
double m_play_speed;
bool m_audio_enable[2];
bool m_status_strobe;
bool m_command_strobe;
};
#endif // MAME_MACHINE_LDV1000HLE_H
|