2 Skelton for retropc emulator
4 Author : Takeda.Toshiya
7 [ SCSI/SASI hard disk drive ]
14 void SCSI_HDD::release()
16 for(int i = 0; i < 8; i++) {
25 void SCSI_HDD::reset()
27 if(!is_hot_swappable) {
28 for(int drv = 0; drv < 8; drv++) {
29 if(disk[drv] != NULL) {
30 if(image_path[drv][0] != _T('\0') && FILEIO::IsFileExisting(image_path[drv])) {
31 disk[drv]->open(image_path[drv], sector_size[drv]);
41 void SCSI_HDD::open(int drv, const _TCHAR* file_path, int default_sector_size)
43 if(drv < 8 && disk[drv] != NULL) {
44 if(!is_hot_swappable) {
45 my_tcscpy_s(image_path[drv], _MAX_PATH, file_path);
46 sector_size[drv] = default_sector_size;
48 disk[drv]->open(file_path, default_sector_size);
53 void SCSI_HDD::close(int drv)
55 if(drv < 8 && disk[drv] != NULL) {
56 if(!is_hot_swappable) {
57 image_path[drv][0] = _T('\0');
64 bool SCSI_HDD::mounted(int drv)
66 if(drv < 8 && disk[drv] != NULL) {
67 if(!is_hot_swappable) {
68 return (image_path[drv][0] != _T('\0'));
70 return disk[drv]->mounted();
76 bool SCSI_HDD::accessed(int drv)
78 if(drv < 8 && disk[drv] != NULL) {
79 return disk[drv]->accessed();
84 bool SCSI_HDD::is_device_existing()
86 for(int i = 0; i < 8; i++) {
87 if(disk[i] != NULL && disk[i]->mounted()) {
94 uint32_t SCSI_HDD::physical_block_size()
96 HARDDISK *unit = disk[get_logical_unit_number()];
98 if(unit != NULL && unit->mounted()) {
99 return unit->sector_size;
104 uint32_t SCSI_HDD::logical_block_size()
106 HARDDISK *unit = disk[get_logical_unit_number()];
108 if(unit != NULL && unit->mounted()) {
109 return unit->sector_size;
114 uint32_t SCSI_HDD::max_logical_block_addr()
116 HARDDISK *unit = disk[get_logical_unit_number()];
118 if(unit != NULL && unit->mounted() && unit->sector_num > 0) {
119 return unit->sector_num - 1;
124 bool SCSI_HDD::read_buffer(int length)
126 HARDDISK *unit = disk[get_logical_unit_number()];
128 if(!(unit != NULL && unit->mounted())) {
129 set_sense_code(SCSI_SENSE_NOTREADY);
133 uint8_t tmp_buffer[SCSI_BUFFER_SIZE];
134 int tmp_length = min(length, (int)sizeof(tmp_buffer));
136 if(!unit->read_buffer((long)position, tmp_length, tmp_buffer)) {
137 set_sense_code(SCSI_SENSE_ILLGLBLKADDR); //SCSI_SENSE_NORECORDFND
140 for(int i = 0; i < tmp_length; i++) {
141 buffer->write(tmp_buffer[i]);
143 length -= tmp_length;
144 position += tmp_length;
146 set_sense_code(SCSI_SENSE_NOSENSE);
150 bool SCSI_HDD::write_buffer(int length)
152 HARDDISK *unit = disk[get_logical_unit_number()];
154 if(!(unit != NULL && unit->mounted())) {
155 set_sense_code(SCSI_SENSE_NOTREADY);
159 uint8_t tmp_buffer[SCSI_BUFFER_SIZE];
160 int tmp_length = min(length, (int)sizeof(tmp_buffer));
162 for(int i = 0; i < tmp_length; i++) {
163 tmp_buffer[i] = buffer->read();
165 if(!unit->write_buffer((long)position, tmp_length, tmp_buffer)) {
166 set_sense_code(SCSI_SENSE_ILLGLBLKADDR); //SCSI_SENSE_NORECORDFND
169 length -= tmp_length;
170 position += tmp_length;
172 set_sense_code(SCSI_SENSE_NOSENSE);
176 #define STATE_VERSION 3
178 #include "../statesub.h"
180 void SCSI_HDD::decl_state()
182 enter_decl_state(STATE_VERSION);
184 for(int i = 0; i < 8; i++) {
185 DECL_STATE_ENTRY_STRING_MEMBER(&(image_path[i][0]), MAX_PATH, i);
187 DECL_STATE_ENTRY_1D_ARRAY(sector_size, sizeof(sector_size) / sizeof(int));
190 SCSI_DEV::decl_state();
193 void SCSI_HDD::save_state(FILEIO* state_fio)
195 uint32_t crc_value = 0xffffffff;
196 if(state_entry != NULL) {
197 state_entry->save_state(state_fio, &crc_value);
199 // state_fio->FputUint32(STATE_VERSION);
200 // state_fio->FputInt32(this_device_id);
202 for(int i = 0; i < 8; i++) {
203 if(disk[i] != NULL) {
204 disk[i]->save_state(state_fio);
208 // SCSI_DEV::save_state(state_fio);
211 bool SCSI_HDD::load_state(FILEIO* state_fio)
213 uint32_t crc_value = 0xffffffff;
216 if(state_entry != NULL) {
217 mb = state_entry->load_state(state_fio, &crc_value);
219 if(!mb) return false;
220 // if(state_fio->FgetUint32() != STATE_VERSION) {
223 // if(state_fio->FgetInt32() != this_device_id) {
227 for(int i = 0; i < 8; i++) {
228 if(disk[i] != NULL) {
229 if(!disk[i]->load_state(state_fio)) {
235 // return SCSI_DEV::load_state(state_fio);