OSDN Git Service

[General] Merge Upstream 2018-12-27.
[csp-qt/common_source_project-fm7.git] / source / src / vm / scsi_cdrom.h
1 /*
2         Skelton for retropc emulator
3
4         Author : Takeda.Toshiya
5         Date   : 2016.03.06-
6
7         [ SCSI CD-ROM drive ]
8 */
9
10 #ifndef _SCSI_CDROM_H_
11 #define _SCSI_CDROM_H_
12
13 #include "scsi_dev.h"
14
15 #define SIG_SCSI_CDROM_PLAYING  0
16 #define SIG_SCSI_CDROM_SAMPLE_L 1
17 #define SIG_SCSI_CDROM_SAMPLE_R 2
18 #define SIG_SCSI_CDROM_CDDA_PLAY        3
19 #define SIG_SCSI_CDROM_CDDA_STOP        4
20 #define SIG_SCSI_CDROM_CDDA_PAUSE       5
21
22 class FILEIO;
23
24 class SCSI_CDROM : public SCSI_DEV
25 {
26 protected:
27         outputs_t outputs_done;
28         
29         FILEIO* fio_img;
30         struct {
31                 int32_t index0, index1, pregap;
32                 uint32_t lba_offset;
33                 uint32_t lba_size;
34                 bool is_audio;
35         } toc_table[1024];
36         bool is_cue;
37         _TCHAR track_data_path[99][_MAX_PATH];
38         int current_track;
39         
40         int track_num;
41         uint32_t max_logical_block;
42         bool access;
43         
44         uint32_t cdda_start_frame, cdda_end_frame, cdda_playing_frame;
45         uint8_t cdda_status;
46         bool cdda_repeat, cdda_interrupt;
47         uint8_t cdda_buffer[2352 * 75];
48         int read_sectors;
49         int cdda_buffer_ptr;
50         int cdda_sample_l, cdda_sample_r;
51         int event_cdda, mix_loop_num;
52         int event_cdda_delay_play;
53         int event_delay_interrupt;
54
55         bool read_mode;
56         
57         void set_cdda_status(uint8_t status);
58         int get_track(uint32_t lba);
59         double get_seek_time(uint32_t lba);
60         
61         int volume_m;
62         int volume_l, volume_r;
63
64         bool open_cue_file(const _TCHAR *file_path);
65         void get_track_by_track_num(int track);
66         int get_track_noop(uint32_t lba);
67         uint32_t lba_to_msf(uint32_t lba);
68         uint32_t lba_to_msf_alt(uint32_t lba);
69 public:
70         SCSI_CDROM(VM_TEMPLATE* parent_vm, EMU* parent_emu) : SCSI_DEV(parent_vm, parent_emu) 
71         {
72                 initialize_output_signals(&outputs_done);
73                 
74                 volume_m = 1024;
75                 volume_l = volume_r = 1024;
76                 
77                 my_sprintf_s(vendor_id, 9, "NECITSU");
78                 my_sprintf_s(product_id, 17, "SCSI-CDROM");
79                 device_type = 0x05; // CD-ROM drive
80                 is_removable = true;
81                 is_hot_swappable = false;
82 //              seek_time = 400000; // 400msec (temporary)
83                 seek_time = 10.0;
84                 bytes_per_sec = 2048 * 75; // speed x1
85                 max_logical_block = 0;
86                 access = false;
87
88                 set_device_name(_T("SCSI CDROM"));
89         }
90         ~SCSI_CDROM() {}
91         
92         // common functions
93         void initialize();
94         void release();
95         void reset();
96         uint32_t read_signal(int id);
97         void write_signal(int id, uint32_t data, uint32_t mask);
98         void event_callback(int event_id, int err);
99         void mix(int32_t* buffer, int cnt);
100         void set_volume(int ch, int decibel_l, int decibel_r);
101         bool process_state(FILEIO* state_fio, bool loading);
102         
103         // virtual scsi functions
104         void reset_device();
105         bool is_device_ready();
106         uint32_t physical_block_size()
107         {
108                 return 2352;
109         }
110         uint32_t logical_block_size()
111         {
112                 return read_mode ? 2340 : 2048;
113         }
114         uint32_t max_logical_block_addr()
115         {
116                 if(max_logical_block > 0) {
117                         return max_logical_block - 1;
118                 }
119                 return 0;
120         }
121         int get_command_length(int value);
122         void start_command();
123         bool read_buffer(int length);
124         bool write_buffer(int length);
125         
126         // unique functions
127         void set_context_done(DEVICE* device, int id, uint32_t mask)
128         {
129                 register_output_signal(&outputs_done, device, id, mask);
130         }
131         void open(const _TCHAR* file_path);
132         void close();
133         bool mounted();
134         bool accessed();
135         void set_volume(int volume);
136 };
137
138 #endif
139