OSDN Git Service

[VM][FMTOWNS][MEMORY] Fix setup around memory banks by I/O 0404h and 0480h.
[csp-qt/common_source_project-fm7.git] / source / src / vm / ld700.h
1 /*
2         Skelton for retropc emulator
3
4         Author : Takeda.Toshiya
5         Date   : 2014.02.12-
6
7         [ Pioneer LD-700 ]
8 */
9
10 #ifndef _LD700_H_
11 #define _LD700_H_
12
13 #include "device.h"
14
15 #define SIG_LD700_REMOTE        0
16 #define SIG_LD700_MUTE_L        1
17 #define SIG_LD700_MUTE_R        2
18
19 #define MAX_TRACKS      1024
20 #define MAX_PAUSES      1024
21
22 class FIFO;
23
24 class LD700 : public DEVICE
25 {
26 private:
27         // output signals
28         outputs_t outputs_exv;
29         outputs_t outputs_ack;
30         outputs_t outputs_sound;
31         
32         bool prev_remote_signal;
33         uint32_t prev_remote_time;
34         uint32_t command, num_bits;
35         
36         int phase, status;
37         int seek_mode, seek_num;
38         bool accepted;
39         int cur_frame_raw;
40         int wait_frame_raw;
41         
42         int num_tracks, track_frame_raw[MAX_TRACKS];
43         int num_pauses, pause_frame_raw[MAX_PAUSES];
44         
45         bool prev_sound_signal;
46         FIFO *sound_buffer_l, *sound_buffer_r, *signal_buffer;
47         bool signal_buffer_ok;
48         int sound_event_id;
49         int16_t sound_sample_l, sound_sample_r;
50         int volume_l, volume_r;
51         bool sound_mute_l, sound_mute_r;
52         
53         int16_t *mix_buffer_l, *mix_buffer_r;
54         int mix_buffer_ptr, mix_buffer_length;
55         
56         void set_status(int value);
57         void set_ack(bool value);
58         void set_cur_frame(int frame, bool relative);
59         int get_cur_frame_raw();
60         void set_cur_track(int track);
61         
62 public:
63         LD700(VM_TEMPLATE* parent_vm, EMU_TEMPLATE* parent_emu) : DEVICE(parent_vm, parent_emu)
64         {
65                 initialize_output_signals(&outputs_exv);
66                 initialize_output_signals(&outputs_ack);
67                 initialize_output_signals(&outputs_sound);
68                 volume_l = volume_r = 1024;
69                 sound_mute_l = sound_mute_r = true;
70                 set_device_name(_T("LD-700 Laser Disc Player"));
71         }
72         ~LD700() {}
73         
74         // common functions
75         void initialize();
76         void release();
77         void __FASTCALL write_signal(int id, uint32_t data, uint32_t mask);
78         uint32_t __FASTCALL read_signal(int id);
79         void event_frame();
80         void __FASTCALL event_callback(int event_id, int err);
81         void __FASTCALL mix(int32_t* buffer, int cnt);
82         void set_volume(int ch, int decibel_l, int decibel_r);
83         
84         // unique functions
85         void set_context_exv(DEVICE* device, int id, uint32_t mask)
86         {
87                 register_output_signal(&outputs_exv, device, id, mask);
88         }
89         void set_context_ack(DEVICE* device, int id, uint32_t mask)
90         {
91                 register_output_signal(&outputs_ack, device, id, mask);
92         }
93         void set_context_sound(DEVICE* device, int id, uint32_t mask)
94         {
95                 register_output_signal(&outputs_sound, device, id, mask);
96         }
97         void open_disc(const _TCHAR* file_path);
98         void close_disc();
99         bool is_disc_inserted();
100         void initialize_sound(int rate, int samples);
101         void movie_sound_callback(uint8_t *buffer, long size);
102 };
103
104 #endif
105