2 Skelton for retropc emulator
4 Author : Takeda.Toshiya
10 #ifndef _SCSI_CDROM_H_
11 #define _SCSI_CDROM_H_
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
24 class SCSI_CDROM : public SCSI_DEV
27 outputs_t outputs_done;
31 int32_t index0, index1, pregap;
37 _TCHAR track_data_path[99][_MAX_PATH];
41 uint32_t max_logical_block;
44 uint32_t cdda_start_frame, cdda_end_frame, cdda_playing_frame;
46 bool cdda_repeat, cdda_interrupt;
47 uint8_t cdda_buffer[2352 * 75];
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;
57 void set_cdda_status(uint8_t status);
58 int get_track(uint32_t lba);
59 double get_seek_time(uint32_t lba);
62 int volume_l, volume_r;
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);
70 SCSI_CDROM(VM_TEMPLATE* parent_vm, EMU* parent_emu) : SCSI_DEV(parent_vm, parent_emu)
72 initialize_output_signals(&outputs_done);
75 volume_l = volume_r = 1024;
77 my_sprintf_s(vendor_id, 9, "NECITSU");
78 my_sprintf_s(product_id, 17, "SCSI-CDROM");
79 device_type = 0x05; // CD-ROM drive
81 is_hot_swappable = false;
82 // seek_time = 400000; // 400msec (temporary)
84 bytes_per_sec = 2048 * 75; // speed x1
85 max_logical_block = 0;
88 set_device_name(_T("SCSI CDROM"));
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);
103 // virtual scsi functions
105 bool is_device_ready();
106 uint32_t physical_block_size()
110 uint32_t logical_block_size()
112 return read_mode ? 2340 : 2048;
114 uint32_t max_logical_block_addr()
116 if(max_logical_block > 0) {
117 return max_logical_block - 1;
121 int get_command_length(int value);
122 void start_command();
123 bool read_buffer(int length);
124 bool write_buffer(int length);
127 void set_context_done(DEVICE* device, int id, uint32_t mask)
129 register_output_signal(&outputs_done, device, id, mask);
131 void open(const _TCHAR* file_path);
135 void set_volume(int volume);