7 #include <devices/ramdisk.h>
8 #include <palacios/vmm.h>
12 //#define Ramdisk_Print(_f, _a...) PrintTrace("\nramdisk.c(%d) " _f, __LINE__, ## _a)
13 #define Ramdisk_Print(_f, _a...) PrintTrace("\nramdisk.c " _f, ## _a)
15 #define Ramdisk_Print(_f, _a...)
18 #define RD_PANIC(_f, _a...) \
20 PrintDebug("ramdisk.c(%d) " _f, __LINE__, ## _a); \
25 #define RD_ERROR(_f, _a...) PrintTrace("\nramdisk.c(%d) " _f, __LINE__, ## _a)
30 * Data type definitions
33 #define INDEX_PULSE_CYCLE 10
35 #define MAX_ATA_CHANNEL 4
36 #define RD_LITTLE_ENDIAN
39 #define INTR_REASON_BIT_ERR 0x01
40 #define UNABLE_FIND_TAT_CHANNEL_ERR 0x02
42 #define READ_BUF_GT_512 0x04
46 SENSE_NONE = 0, SENSE_NOT_READY = 2, SENSE_ILLEGAL_REQUEST = 5,
47 SENSE_UNIT_ATTENTION = 6
51 ASC_INV_FIELD_IN_CMD_PACKET = 0x24,
52 ASC_MEDIUM_NOT_PRESENT = 0x3a,
53 ASC_SAVING_PARAMETERS_NOT_SUPPORTED = 0x39,
54 ASC_LOGICAL_BLOCK_OOR = 0x21
59 // Open a image. Returns non-negative if successful.
60 //int open (const char* pathname);
62 // Open an image with specific flags. Returns non-negative if successful.
63 int rd_open (const char* pathname, int flags);
68 // Position ourselves. Return the resulting offset from the
69 // beginning of the file.
70 off_t rd_lseek (off_t offset, int whence);
72 // Read count bytes to the buffer buf. Return the number of
73 // bytes read (count).
74 ssize_t rd_read (void* buf, size_t count);
76 // Write count bytes from buf. Return the number of bytes
78 ssize_t rd_write (const void* buf, size_t count);
98 rd_bool seek_complete ;
100 rd_bool corrected_data ;
101 rd_bool index_pulse ;
102 unsigned int index_pulse_count ;
105 Bit8u error_register ;
110 #ifdef RD_LITTLE_ENDIAN
116 #else /* RD_BIG_ENDIAN */
130 Bit8u buffer[2048]; ;
131 Bit32u buffer_index ;
133 Bit8u current_command ;
134 Bit8u sectors_per_block ;
137 // 0=normal, 1=reset controller
139 // 0=allow irq, 1=disable irq
140 rd_bool disable_irq ;
142 Bit8u reset_in_progress ;
162 struct error_recovery_t {
163 unsigned char data[8] ;
165 // error_recovery_t ();
168 uint16 rd_read_16bit(const uint8* buf); //__attribute__(regparm(1))
169 uint32 rd_read_32bit(const uint8* buf); //__attribute__(regparm(1))
176 struct cdrom_interface *cd ;
180 int remaining_blocks ;
181 struct currentStruct {
182 struct error_recovery_t error_recovery ;
189 int total_bytes_remaining ;
194 IDE_NONE, IDE_DISK, IDE_CDROM
199 // For each ATA channel we should have one controller struct
200 // and an array of two drive structs
203 device_image_t hard_drive ;
204 device_type_t device_type ;
205 // 512 byte buffer for ID drive command
206 // These words are stored in native word endian format, as
207 // they are fetched and returned via a return(), so
208 // there's no need to keep them in x86 endian format.
209 Bit16u id_drive[256] ;
211 struct controller_t controller ;
212 struct cdrom_t cdrom ;
213 struct sense_info_t sense ;
214 struct atapi_t atapi ;
218 unsigned drive_select ;
227 struct ramdisk_ctrl_ops {
228 Bit32u (*init)(struct ramdisk_t *ramdisk,
229 struct vm_device *dev);
230 void (*close)(struct ramdisk_t *ramdisk);
231 void (*reset)(struct ramdisk_t *ramdisk, unsigned type);
235 struct ramdisk_emu_ops {
237 int (*read_port)(ushort_t port,
240 struct vm_device *dev);
242 int (*write_port)(ushort_t port,
245 struct vm_device *dev);
247 int (*read_port_ignore)(ushort_t port,
250 struct vm_device *dev);
252 int (*write_port_ignore)(ushort_t port,
255 struct vm_device *dev);
261 struct channel_t channels[MAX_ATA_CHANNEL];
263 struct ramdisk_ctrl_ops cops;
265 struct ramdisk_emu_ops eops;
268 // struct vm_device *dev;
276 #define ATA_DETECT 0xf0 //0X3E8
277 #define ATA_RESET 0xf1 //0X3E9
278 #define ATA_CMD_DATA_IN 0xf2 //0X3EA
279 #define ATA_CMD_DATA_OUT 0xf3 //0X3EB
280 #define ATA_CMD_PACKET 0xf4 //0X3EC
281 #define ATAPI_GET_SENSE 0xf5 //0X3ED
282 #define ATAPI_IS_READY 0xf6 //0X3EE
283 #define ATAPI_IS_CDROM 0xf7 //0X3EF
285 #define CDEMU_INIT 0xf8 //0X2E8
286 #define CDEMU_ISACTIVE 0xf9 //0X2E9
287 #define CDEMU_EMULATED_DRIVE 0xfa //0X2EA
288 #define CDROM_BOOT 0xfb //0X2EB
291 #define HARD_DRIVE_POST 0xfc //0X2EC
294 #define ATA_DEVICE_NO 0xfd //0X2ED
295 #define ATA_DEVICE_TYPE 0xfe //0X2ED
297 #define INT13_HARDDISK 0xff //0x2ef
298 #define INT13_CDROM 0xe0 //0x2f8
299 #define INT13_CDEMU 0xe1 //0x2f9
300 #define INT13_ELTORITO 0xe2 //0x2fa
301 #define INT13_DISKETTE_FUNCTION 0xe3 //0x2fb
303 // some packet handling macros
304 #define EXTRACT_FIELD(arr,byte,start,num_bits) (((arr)[(byte)] >> (start)) & ((1 << (num_bits)) - 1))
305 #define get_packet_field(c,b,s,n) (EXTRACT_FIELD((SELECTED_CONTROLLER((c)).buffer),(b),(s),(n)))
306 #define get_packet_byte(c,b) (SELECTED_CONTROLLER((c)).buffer[(b)])
307 #define get_packet_word(c,b) (((uint16)SELECTED_CONTROLLER((c)).buffer[(b)] << 8) | SELECTED_CONTROLLER((c)).buffer[(b)+1])
310 #define CONTROLLER(c,a) (channels[(c)].drives[(a)]).controller
311 #define DRIVE(c,a) (channels[(c)].drives[(a)])
312 #define SELECTED_CONTROLLER(c) (CONTROLLER((c), channels[(c)].drive_select))
313 #define SELECTED_DRIVE(c) (DRIVE((c), channels[(c)].drive_select))
316 #define DRIVE_IS_PRESENT(c,a) (channels[(c)].drives[(a)].device_type != IDE_NONE)
317 #define DRIVE_IS_HD(c,a) (channels[(c)].drives[(a)].device_type == IDE_DISK)
318 #define DRIVE_IS_CD(c,a) (channels[(c)].drives[(a)].device_type == IDE_CDROM)
319 #define SELECTED_MODEL(c) (channels[(c)].drives[channels[(c)].drive_select].model_no)
321 #define MASTER_SELECTED(c) (!channels[(c)].drive_select)
322 #define SLAVE_SELECTED(c) (channels[(c)].drive_select)
324 #define SELECTED_IS_PRESENT(c) (DRIVE_IS_PRESENT((c),SLAVE_SELECTED((c))))
325 #define SELECTED_IS_HD(c) (DRIVE_IS_HD((c),SLAVE_SELECTED((c))))
326 #define SELECTED_IS_CD(c) (DRIVE_IS_CD((c),SLAVE_SELECTED((c))))
328 #define ANY_IS_PRESENT(c) (DRIVE_IS_PRESENT((c),0) || DRIVE_IS_PRESENT((c),1))
329 #define SELECTED_TYPE_STRING(channel) ((SELECTED_IS_CD(channel)) ? "CD-ROM" : "NONE")
331 #define WRITE_FEATURES(c,a) do { uint8 _a = a; CONTROLLER((c),0).features = _a; CONTROLLER((c),1).features = _a; } while(0)
332 #define WRITE_SECTOR_COUNT(c,a) do { uint8 _a = a; CONTROLLER((c),0).sector_count = _a; CONTROLLER((c),1).sector_count = _a; } while(0)
333 #define WRITE_SECTOR_NUMBER(c,a) do { uint8 _a = a; CONTROLLER((c),0).sector_no = _a; CONTROLLER((c),1).sector_no = _a; } while(0)
334 #define WRITE_CYLINDER_LOW(c,a) do { uint8 _a = a; CONTROLLER((c),0).cylinder_no = (CONTROLLER((c),0).cylinder_no & 0xff00) | _a; CONTROLLER((c),1).cylinder_no = (CONTROLLER((c),1).cylinder_no & 0xff00) | _a; } while(0)
335 #define WRITE_CYLINDER_HIGH(c,a) do { uint16 _a = a; CONTROLLER((c),0).cylinder_no = (_a << 8) | (CONTROLLER((c),0).cylinder_no & 0xff); CONTROLLER((c),1).cylinder_no = (_a << 8) | (CONTROLLER((c),1).cylinder_no & 0xff); } while(0)
336 #define WRITE_HEAD_NO(c,a) do { uint8 _a = a; CONTROLLER((c),0).head_no = _a; CONTROLLER((c),1).head_no = _a; } while(0)
337 #define WRITE_LBA_MODE(c,a) do { uint8 _a = a; CONTROLLER((c),0).lba_mode = _a; CONTROLLER((c),1).lba_mode = _a; } while(0)
341 #define GOTO_RETURN_VALUE if(io_len==4){\
342 goto return_value32;\
345 value16=(Bit16u)value32;\
346 goto return_value16;\
349 value8=(Bit8u)value32;\
353 #define UNUSED(x) ((void)x)
355 #define PACKET_SIZE 12
357 static struct ramdisk_t *ramdisk_state;
364 ////////////////////////////////////////////////////////////////////////////
371 int ramdisk_read_port(ushort_t port,
374 struct vm_device *dev);
377 int ramdisk_write_port(ushort_t port,
380 struct vm_device *dev);
383 int ramdisk_read_port_ignore(ushort_t port,
386 struct vm_device *dev);
389 int ramdisk_write_port_ignore(ushort_t port,
392 struct vm_device *dev);
396 Bit32u rd_read_handler(struct channel_t *channels, Bit32u address, unsigned io_len);
399 void rd_write_handler(struct channel_t *channels, Bit32u address,
400 Bit32u value, unsigned io_len);
409 void rd_identify_ATAPI_drive(struct channel_t *channels, Bit8u channel);
413 void rd_init_send_atapi_command(struct channel_t *channels, Bit8u channel, Bit8u command, int req_length, int alloc_length, bool lazy /*= false*/);
416 void rd_ready_to_send_atapi(struct channel_t *channels, Bit8u channel);
420 void rd_atapi_cmd_error(struct channel_t *channels, Bit8u channel, sense_t sense_key, asc_t asc);
423 void rd_init_mode_sense_single(struct channel_t *channels, Bit8u channel, const void* src, int size);
426 void rd_atapi_cmd_nop(struct channel_t *channels, Bit8u channel);
429 void rd_command_aborted(struct channel_t *channels, Bit8u channel, unsigned value);
437 void rd_raise_interrupt(struct channel_t *channels, Bit8u channel);
440 void rd_lower_irq(struct vm_device *dev, Bit32u irq);
448 uint16 rd_read_16bit(const uint8* buf)
450 return (buf[0] << 8) | buf[1];
455 uint32 rd_read_32bit(const uint8* buf)
457 return (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
460 ////////////////////////////////////////////////////////////////////
463 void rd_print_state(struct ramdisk_t *ramdisk,
464 struct vm_device *dev)
465 //Bit32u rd_init_harddrive(struct channel_t *channels)
470 struct channel_t *channels = (struct channel_t *)(&(ramdisk->channels));
472 for (channel = 0; channel < MAX_ATA_CHANNEL; channel++)
473 memset((char *)(channels + channel), 0, sizeof(struct channel_t));
475 Ramdisk_Print("sizeof(*channels) = %d\n", sizeof((*channels)));
476 Ramdisk_Print("sizeof(channles->drives[0].controller) = %d\n", sizeof((channels->drives[0].controller)));
477 Ramdisk_Print("sizeof(channles->drives[0].cdrom) = %d\n", sizeof((channels->drives[0].cdrom)));
478 Ramdisk_Print("sizeof(channles->drives[0].sense) = %d\n", sizeof((channels->drives[0].sense)));
479 Ramdisk_Print("sizeof(channles->drives[0].atapi) = %d\n", sizeof((channels->drives[0].atapi)));
482 Ramdisk_Print("sizeof(channles->drives[0].controller.status) = %d\n", sizeof((channels->drives[0].controller.status)));
483 Ramdisk_Print("sizeof(channles->drives[0].controller.sector_count) = %d\n", sizeof((channels->drives[0].controller.sector_count)));
484 Ramdisk_Print("sizeof(channles->drives[0].controller.interrupt_reason) = %d\n", sizeof((channels->drives[0].controller.interrupt_reason)));
486 Ramdisk_Print("sizeof(channles->drives[0].controller.cylinder_no) = %d\n", sizeof((channels->drives[0].controller.cylinder_no)));
487 Ramdisk_Print("sizeof(channles->drives[0].controller.byte_count) = %d\n", sizeof((channels->drives[0].controller.byte_count)));
490 Ramdisk_Print("sizeof(channles->drives[0].controller.control) = %d\n", sizeof((channels->drives[0].controller.control)));
493 for (channel = 0; channel < MAX_ATA_CHANNEL; channel++){
495 for (device = 0; device < 2; device++){
497 // Initialize controller state, even if device is not present
498 Ramdisk_Print("channels[%d].drives[%d].controller.status.busy = %d\n",channel, device, channels[channel].drives[device].controller.status.busy);
499 Ramdisk_Print("channels[%d].drives[%d].controller.status.drive_ready = %d\n", channel, device, channels[channel].drives[device].controller.status.drive_ready);
500 Ramdisk_Print("channels[%d].drives[%d].controller.status.write_fault = %d\n", channel, device, channels[channel].drives[device].controller.status.write_fault);
501 Ramdisk_Print("channels[%d].drives[%d].controller.status.seek_complete = %d\n", channel, device, channels[channel].drives[device].controller.status.seek_complete);
502 Ramdisk_Print("channels[%d].drives[%d].controller.status.drq = %d\n", channel, device, channels[channel].drives[device].controller.status.drq);
503 Ramdisk_Print("channels[%d].drives[%d].controller.status.corrected_data = %d\n", channel, device, channels[channel].drives[device].controller.status.corrected_data);
504 Ramdisk_Print("channels[%d].drives[%d].controller.status.index_pulse = %d\n", channel, device, channels[channel].drives[device].controller.status.index_pulse);
505 Ramdisk_Print("channels[%d].drives[%d].controller.status.index_pulse_count = %d\n", channel, device, channels[channel].drives[device].controller.status.index_pulse_count);
506 Ramdisk_Print("channels[%d].drives[%d].controller.status.err = %d\n", channel, device, channels[channel].drives[device].controller.status.err);
509 Ramdisk_Print("channels[%d].drives[%d].controller.error_register = %d\n", channel, device, channels[channel].drives[device].controller.error_register);
510 Ramdisk_Print("channels[%d].drives[%d].controller.head_no = %d\n", channel, device, channels[channel].drives[device].controller.head_no);
511 Ramdisk_Print("channels[%d].drives[%d].controller.sector_count = %d\n", channel, device, channels[channel].drives[device].controller.sector_count);
512 Ramdisk_Print("channels[%d].drives[%d].controller.sector_no = %d\n", channel, device, channels[channel].drives[device].controller.sector_no);
513 Ramdisk_Print("channels[%d].drives[%d].controller.cylinder_no = %d\n", channel, device, channels[channel].drives[device].controller.cylinder_no);
514 Ramdisk_Print("channels[%d].drives[%d].controller.current_command = %02x\n", channel, device, channels[channel].drives[device].controller.current_command);
515 Ramdisk_Print("channels[%d].drives[%d].controller.buffer_index = %d\n", channel, device, channels[channel].drives[device].controller.buffer_index);
518 Ramdisk_Print("channels[%d].drives[%d].controller.control.reset = %d\n", channel, device, channels[channel].drives[device].controller.control.reset);
519 Ramdisk_Print("channels[%d].drives[%d].controller.control.disable_irq = %d\n", channel, device, channels[channel].drives[device].controller.control.disable_irq);
522 Ramdisk_Print("channels[%d].drives[%d].controller.reset_in_progress = %d\n", channel, device, channels[channel].drives[device].controller.reset_in_progress);
523 Ramdisk_Print("channels[%d].drives[%d].controller.sectors_per_block = %02x\n", channel, device, channels[channel].drives[device].controller.sectors_per_block);
524 Ramdisk_Print("channels[%d].drives[%d].controller.lba_mode = %d\n", channel, device, channels[channel].drives[device].controller.lba_mode);
525 Ramdisk_Print("channels[%d].drives[%d].controller.features = %d\n", channel, device, channels[channel].drives[device].controller.features);
528 Ramdisk_Print("channels[%d].drives[%d].model_no = %s\n", channel, device, channels[channel].drives[device].model_no);
529 Ramdisk_Print("channels[%d].drives[%d].device_type = %d\n", channel, device, channels[channel].drives[device].device_type);
530 Ramdisk_Print("channels[%d].drives[%d].cdrom.locked = %d\n", channel, device, channels[channel].drives[device].cdrom.locked);
531 Ramdisk_Print("channels[%d].drives[%d].sense.sense_key = %d\n", channel, device, channels[channel].drives[device].sense.sense_key);
532 Ramdisk_Print("channels[%d].drives[%d].sense.asc = %d\n", channel, device, channels[channel].drives[device].sense.asc);
533 Ramdisk_Print("channels[%d].drives[%d].sense.ascq = %d\n", channel, device, channels[channel].drives[device].sense.ascq);
537 Ramdisk_Print("channels[%d].drives[%d].controller.interrupt_reason.c_d = %02x\n", channel, device, channels[channel].drives[device].controller.interrupt_reason.c_d);
539 Ramdisk_Print("channels[%d].drives[%d].controller.interrupt_reason.i_o = %02x\n", channel, device, channels[channel].drives[device].controller.interrupt_reason.i_o);
541 Ramdisk_Print("channels[%d].drives[%d].controller.interrupt_reason.rel = %02x\n", channel, device, channels[channel].drives[device].controller.interrupt_reason.rel);
543 Ramdisk_Print("channels[%d].drives[%d].controller.interrupt_reason.tag = %02x\n", channel, device, channels[channel].drives[device].controller.interrupt_reason.tag);
545 Ramdisk_Print("channels[%d].drives[%d].cdrom.ready = %d\n", channel, device, channels[channel].drives[device].cdrom.ready);
554 Bit32u rd_init_harddrive(struct ramdisk_t *ramdisk,
555 struct vm_device *dev)
561 struct channel_t *channels = (struct channel_t *)(&(ramdisk->channels));
563 Ramdisk_Print("[rd_init_harddrive]\n");
564 for (channel = 0; channel < MAX_ATA_CHANNEL; channel++)
565 memset((char *)(channels + channel), 0, sizeof(struct channel_t));
568 for (channel = 0; channel < MAX_ATA_CHANNEL; channel++){
570 channels[channel].ioaddr1 = 0x0;
571 channels[channel].ioaddr2 = 0x0;
572 channels[channel].irq = 0;
574 for (device = 0; device < 2; device++){
577 CONTROLLER(channel,device).status.busy = 0;
578 CONTROLLER(channel,device).status.drive_ready = 1;
579 CONTROLLER(channel,device).status.write_fault = 0;
580 CONTROLLER(channel,device).status.seek_complete = 1;
581 CONTROLLER(channel,device).status.drq = 0;
582 CONTROLLER(channel,device).status.corrected_data = 0;
583 CONTROLLER(channel,device).status.index_pulse = 0;
584 CONTROLLER(channel,device).status.index_pulse_count = 0;
585 CONTROLLER(channel,device).status.err = 0;
587 CONTROLLER(channel,device).error_register = 0x01; // diagnostic code: no error
588 CONTROLLER(channel,device).head_no = 0;
589 CONTROLLER(channel,device).sector_count = 1;
590 CONTROLLER(channel,device).sector_no = 1;
591 CONTROLLER(channel,device).cylinder_no = 0;
592 CONTROLLER(channel,device).current_command = 0x00;
593 CONTROLLER(channel,device).buffer_index = 0;
595 CONTROLLER(channel,device).control.reset = 0;
596 CONTROLLER(channel,device).control.disable_irq = 0;
597 CONTROLLER(channel,device).reset_in_progress = 0;
599 CONTROLLER(channel,device).sectors_per_block = 0x80;
600 CONTROLLER(channel,device).lba_mode = 0;
602 CONTROLLER(channel,device).features = 0;
605 channels[channel].drives[device].device_type = IDE_NONE;
608 strncpy((char*)channels[channel].drives[device].model_no,
610 while(strlen((char *)channels[channel].drives[device].model_no) < 40) {
611 strcat ((char*)channels[channel].drives[device].model_no, " ");
614 // Ramdisk_Print("channels[%d].drives[%d].controller.current_command = %02x\n", channel, device, channels[channel].drives[device].controller.current_command);
615 // Ramdisk_Print("channels[%d].drives[%d].controller.interrupt_reason.c_d = %02x\n", channel, device, channels[channel].drives[device].controller.interrupt_reason.c_d);
617 // Ramdisk_Print("channels[%d].drives[%d].controller.interrupt_reason.i_o = %02x\n", channel, device, channels[channel].drives[device].controller.interrupt_reason.i_o);
619 // Ramdisk_Print("channels[%d].drives[%d].controller.interrupt_reason.rel = %02x\n", channel, device, channels[channel].drives[device].controller.interrupt_reason.rel);
621 // Ramdisk_Print("channels[%d].drives[%d].controller.interrupt_reason.tag = %02x\n", channel, device, channels[channel].drives[device].controller.interrupt_reason.tag);
623 // Ramdisk_Print("channels[%d].drives[%d].controller.control.disable_irq = %d\n", channel, device, channels[channel].drives[device].controller.control.disable_irq);
629 channels[channel].ioaddr1 = 0x170;
630 channels[channel].ioaddr2 = 0x370;
631 channels[channel].irq = 15;
632 channels[channel].drive_select = 0;
636 strncpy((char*)channels[channel].drives[device].model_no,
637 "Zheng's Ramdisk", 40);
638 while (strlen((char *)channels[channel].drives[device].model_no) < 40) {
639 strcat ((char*)channels[channel].drives[device].model_no, " ");
642 Ramdisk_Print("CDROM on target %d/%d\n", channel, device);
644 channels[channel].drives[device].device_type = IDE_CDROM;
645 channels[channel].drives[device].cdrom.locked = 0;
646 channels[channel].drives[device].sense.sense_key = SENSE_NONE;
647 channels[channel].drives[device].sense.asc = 0;
648 channels[channel].drives[device].sense.ascq = 0;
652 channels[channel].drives[device].controller.sector_count = 0;
653 channels[channel].drives[device].controller.interrupt_reason.c_d = 1;
654 if (channels[channel].drives[device].controller.sector_count != 0x01) {
655 Ramdisk_Print("interrupt reason bit field error\n");
656 return INTR_REASON_BIT_ERR;
659 channels[channel].drives[device].controller.sector_count = 0;
660 channels[channel].drives[device].controller.interrupt_reason.i_o = 1;
661 if (channels[channel].drives[device].controller.sector_count != 0x02) {
662 Ramdisk_Print("interrupt reason bit field error\n");
663 return INTR_REASON_BIT_ERR;
666 channels[channel].drives[device].controller.sector_count = 0;
667 channels[channel].drives[device].controller.interrupt_reason.rel = 1;
668 if (channels[channel].drives[device].controller.sector_count != 0x04) {
669 Ramdisk_Print("interrupt reason bit field error\n");
670 return INTR_REASON_BIT_ERR;
673 channels[channel].drives[device].controller.sector_count = 0;
674 channels[channel].drives[device].controller.interrupt_reason.tag = 3;
675 if (channels[channel].drives[device].controller.sector_count != 0x18) {
676 Ramdisk_Print("interrupt reason bit field error\n");
677 return INTR_REASON_BIT_ERR;
681 channels[channel].drives[device].controller.sector_count = 0;
683 // allocate low level driver
684 channels[channel].drives[device].cdrom.cd = (struct cdrom_interface*)V3_Malloc(sizeof(struct cdrom_interface));
685 Ramdisk_Print("cd = %x\n", channels[channel].drives[device].cdrom.cd);
686 V3_ASSERT(channels[channel].drives[device].cdrom.cd != NULL);
688 struct cdrom_interface *cdif = channels[channel].drives[device].cdrom.cd;
689 memset(cdif, 0, sizeof(struct cdrom_interface));
691 cdif->ops.init(cdif);
693 Ramdisk_Print("\t\tCD on ata%d-%d: '%s'\n",channel, device, "");
695 if((channels[channel].drives[device].cdrom.cd->ops).insert_cdrom(cdif, NULL)) {
696 Ramdisk_Print("\t\tMedia present in CD-ROM drive\n");
697 channels[channel].drives[device].cdrom.ready = 1;
698 channels[channel].drives[device].cdrom.capacity = channels[channel].drives[device].cdrom.cd->ops.capacity(cdif);
700 Ramdisk_Print("\t\tCould not locate CD-ROM, continuing with media not present\n");
701 channels[channel].drives[device].cdrom.ready = 0;
709 ramdisk->private_data = dev;
710 ramdisk_state = ramdisk;
711 Ramdisk_Print("ramdisk_state = %x\n", ramdisk_state);
712 Ramdisk_Print("ramdisk = %x\n", ramdisk);
713 // rd_print_state(ramdisk, dev);
718 void rd_reset_harddrive(struct ramdisk_t *ramdisk, unsigned type)
724 void rd_close_harddrive(struct ramdisk_t *ramdisk)
730 ////////////////////////////////////////////////////////////////////
734 Bit32u rd_read_handler(struct channel_t *channels, Bit32u address, unsigned io_len)
740 unsigned drive_select;
742 unsigned increment = 0;
744 Bit8u channel = MAX_ATA_CHANNEL;
745 Bit32u port = 0xff; // undefined
747 //Ramdisk_Print("[rd_read_handler]\n");
749 for (channel=0; channel<MAX_ATA_CHANNEL; channel++) {
750 if ((address & 0xfff8) == channels[channel].ioaddr1) {
751 port = address - channels[channel].ioaddr1;
754 else if ((address & 0xfff8) == channels[channel].ioaddr2) {
755 port = address - channels[channel].ioaddr2 + 0x10;
760 if (channel == MAX_ATA_CHANNEL) {
761 if ((address < 0x03f6) || (address > 0x03f7)) {
762 RD_PANIC("Error: read: unable to find ATA channel, ioport=0x%04x\n", address);
766 port = address - 0x03e0;
770 drive_select = channels[channel].drive_select;
772 Ramdisk_Print("[R_handler] IO read addr at %x, on drive %d/%d, curcmd = %02x\n", address, channel, drive_select, SELECTED_CONTROLLER(channel).current_command);
778 struct cdrom_interface *cdif = channels[channel].drives[drive_select].cdrom.cd;
781 case 0x00: // hard disk data (16bit) 0x1f0
783 switch (SELECTED_CONTROLLER(channel).current_command) {
784 case 0xec: // IDENTIFY DEVICE
788 SELECTED_CONTROLLER(channel).status.busy = 0;
789 SELECTED_CONTROLLER(channel).status.drive_ready = 1;
790 SELECTED_CONTROLLER(channel).status.write_fault = 0;
791 SELECTED_CONTROLLER(channel).status.seek_complete = 1;
792 SELECTED_CONTROLLER(channel).status.corrected_data = 0;
793 SELECTED_CONTROLLER(channel).status.err = 0;
795 index = SELECTED_CONTROLLER(channel).buffer_index;
796 value32 = SELECTED_CONTROLLER(channel).buffer[index];
800 value32 |= (SELECTED_CONTROLLER(channel).buffer[index] << 8);
804 value32 |= (SELECTED_CONTROLLER(channel).buffer[index] << 16);
805 value32 |= (SELECTED_CONTROLLER(channel).buffer[index+1] << 24);
808 SELECTED_CONTROLLER(channel).buffer_index = index;
810 if (SELECTED_CONTROLLER(channel).buffer_index >= 512) {
812 SELECTED_CONTROLLER(channel).status.drq = 0;
816 case 0xa0: //send packet cmd
818 index = SELECTED_CONTROLLER(channel).buffer_index;
820 Ramdisk_Print("\t\tatapi.command(%02x), index(%d), cdrom.remaining_blocks(%d)\n", SELECTED_DRIVE(channel).atapi.command, index, SELECTED_DRIVE(channel).cdrom.remaining_blocks);
821 // Load block if necessary
824 RD_PANIC("\t\tindex > 2048 : 0x%x\n",index);
825 switch (SELECTED_DRIVE(channel).atapi.command) {
826 case 0x28: // read (10)
827 case 0xa8: // read (12)
829 if (!SELECTED_DRIVE(channel).cdrom.ready) {
830 RD_PANIC("\t\tRead with CDROM not ready\n");
832 SELECTED_DRIVE(channel).cdrom.cd->ops.read_block(cdif, SELECTED_CONTROLLER(channel).buffer,
833 SELECTED_DRIVE(channel).cdrom.next_lba);
834 SELECTED_DRIVE(channel).cdrom.next_lba++;
835 SELECTED_DRIVE(channel).cdrom.remaining_blocks--;
838 if (!SELECTED_DRIVE(channel).cdrom.remaining_blocks)
839 Ramdisk_Print("\t\tLast READ block loaded {CDROM}\n");
841 Ramdisk_Print("\t\tREAD block loaded (%d remaining) {CDROM}\n",
842 SELECTED_DRIVE(channel).cdrom.remaining_blocks);
844 // one block transfered, start at beginning
848 default: // no need to load a new block
853 value32 = SELECTED_CONTROLLER(channel).buffer[index+increment];
856 value32 |= (SELECTED_CONTROLLER(channel).buffer[index+increment] << 8);
860 value32 |= (SELECTED_CONTROLLER(channel).buffer[index+increment] << 16);
861 value32 |= (SELECTED_CONTROLLER(channel).buffer[index+increment+1] << 24);
864 SELECTED_CONTROLLER(channel).buffer_index = index + increment;
865 SELECTED_CONTROLLER(channel).drq_index += increment;
867 if (SELECTED_CONTROLLER(channel).drq_index >= (unsigned)SELECTED_DRIVE(channel).atapi.drq_bytes) {
868 SELECTED_CONTROLLER(channel).status.drq = 0;
869 SELECTED_CONTROLLER(channel).drq_index = 0;
871 SELECTED_DRIVE(channel).atapi.total_bytes_remaining -= SELECTED_DRIVE(channel).atapi.drq_bytes;
873 if (SELECTED_DRIVE(channel).atapi.total_bytes_remaining > 0) {
874 // one or more blocks remaining (works only for single block commands)
876 Ramdisk_Print("\t\tPACKET drq bytes read\n");
877 SELECTED_CONTROLLER(channel).interrupt_reason.i_o = 1;
878 SELECTED_CONTROLLER(channel).status.busy = 0;
879 SELECTED_CONTROLLER(channel).status.drq = 1;
880 SELECTED_CONTROLLER(channel).interrupt_reason.c_d = 0;
882 // set new byte count if last block
883 if (SELECTED_DRIVE(channel).atapi.total_bytes_remaining < SELECTED_CONTROLLER(channel).byte_count) {
884 SELECTED_CONTROLLER(channel).byte_count = SELECTED_DRIVE(channel).atapi.total_bytes_remaining;
886 SELECTED_DRIVE(channel).atapi.drq_bytes = SELECTED_CONTROLLER(channel).byte_count;
888 rd_raise_interrupt(channels, channel);
891 Ramdisk_Print("\t\tPACKET all bytes read\n");
892 SELECTED_CONTROLLER(channel).interrupt_reason.i_o = 1;
893 SELECTED_CONTROLLER(channel).interrupt_reason.c_d = 1;
894 SELECTED_CONTROLLER(channel).status.drive_ready = 1;
895 SELECTED_CONTROLLER(channel).interrupt_reason.rel = 0;
896 SELECTED_CONTROLLER(channel).status.busy = 0;
897 SELECTED_CONTROLLER(channel).status.drq = 0;
898 SELECTED_CONTROLLER(channel).status.err = 0;
900 rd_raise_interrupt(channels, channel);
907 Ramdisk_Print("\t\tread need support more command: %02x\n", SELECTED_CONTROLLER(channel).current_command);
910 ///////////////////////////////////////////
912 case 0x01: // hard disk error register 0x1f1
914 SELECTED_CONTROLLER(channel).status.err = 0;
915 value8 = (!SELECTED_IS_PRESENT(channel)) ? 0 : SELECTED_CONTROLLER(channel).error_register;
918 case 0x02: // hard disk sector count / interrupt reason 0x1f2
919 value8 = (!SELECTED_IS_PRESENT(channel)) ? 0 : SELECTED_CONTROLLER(channel).sector_count;
922 case 0x03: // sector number 0x1f3
923 value8 = (!SELECTED_IS_PRESENT(channel)) ? 0 : SELECTED_CONTROLLER(channel).sector_no;
925 case 0x04: // cylinder low 0x1f4
926 // -- WARNING : On real hardware the controller registers are shared between drives.
927 // So we must respond even if the select device is not present. Some OS uses this fact
928 // to detect the disks.... minix2 for example
929 value8 = (!ANY_IS_PRESENT(channel)) ? 0 : (SELECTED_CONTROLLER(channel).cylinder_no & 0x00ff);
931 case 0x05: // cylinder high 0x1f5
932 // -- WARNING : On real hardware the controller registers are shared between drives.
933 // So we must respond even if the select device is not present. Some OS uses this fact
934 // to detect the disks.... minix2 for example
935 value8 = (!ANY_IS_PRESENT(channel)) ? 0 : SELECTED_CONTROLLER(channel).cylinder_no >> 8;
938 case 0x06: // hard disk drive and head register 0x1f6
939 // b7 Extended data field for ECC
940 // b6/b5: Used to be sector size. 00=256,01=512,10=1024,11=128
941 // Since 512 was always used, bit 6 was taken to mean LBA mode:
942 // b6 1=LBA mode, 0=CHS mode
947 ((SELECTED_CONTROLLER(channel).lba_mode>0) << 6) |
948 (1 << 5) | // 01b = 512 sector size
949 (channels[channel].drive_select << 4) |
950 (SELECTED_CONTROLLER(channel).head_no << 0);
953 //CONTROLLER(channel,0).lba_mode
955 case 0x07: // Hard Disk Status 0x1f7
956 case 0x16: // Hard Disk Alternate Status 0x3f6
957 if (!ANY_IS_PRESENT(channel)) {
958 // (mch) Just return zero for these registers
962 (SELECTED_CONTROLLER(channel).status.busy << 7) |
963 (SELECTED_CONTROLLER(channel).status.drive_ready << 6) |
964 (SELECTED_CONTROLLER(channel).status.write_fault << 5) |
965 (SELECTED_CONTROLLER(channel).status.seek_complete << 4) |
966 (SELECTED_CONTROLLER(channel).status.drq << 3) |
967 (SELECTED_CONTROLLER(channel).status.corrected_data << 2) |
968 (SELECTED_CONTROLLER(channel).status.index_pulse << 1) |
969 (SELECTED_CONTROLLER(channel).status.err) );
970 SELECTED_CONTROLLER(channel).status.index_pulse_count++;
971 SELECTED_CONTROLLER(channel).status.index_pulse = 0;
972 if (SELECTED_CONTROLLER(channel).status.index_pulse_count >= INDEX_PULSE_CYCLE) {
973 SELECTED_CONTROLLER(channel).status.index_pulse = 1;
974 SELECTED_CONTROLLER(channel).status.index_pulse_count = 0;
978 rd_lower_irq((struct vm_device *)(ramdisk_state->private_data), channels[channel].irq);
983 case 0x17: // Hard Disk Address Register 0x3f7
984 // Obsolete and unsupported register. Not driven by hard
985 // disk controller. Report all 1's. If floppy controller
986 // is handling this address, it will call this function
987 // set/clear D7 (the only bit it handles), then return
988 // the combined value
994 RD_PANIC("hard drive: io read to address %x unsupported\n",
998 ////////////////////////////////////////////
1001 Ramdisk_Print("\t\tError: hard drive: shouldnt get here!\n");
1005 Ramdisk_Print("\t\t32-bit read from %04x = %08x {%s}\n",
1006 (unsigned) address, value32, SELECTED_TYPE_STRING(channel));
1010 Ramdisk_Print("\t\t16-bit read from %04x = %04x {%s}\n",
1011 (unsigned) address, value16, SELECTED_TYPE_STRING(channel));
1015 Ramdisk_Print("\t\t8-bit read from %x = %02x {%s}\n",
1016 (unsigned) address, value8, SELECTED_TYPE_STRING(channel));
1022 void rd_write_handler(struct channel_t *channels, Bit32u address,
1023 Bit32u value, unsigned io_len)
1026 // off_t logical_sector;
1028 rd_bool prev_control_reset;
1033 Bit8u channel = MAX_ATA_CHANNEL;
1034 Bit32u port = 0xff; // undefined
1036 //Ramdisk_Print("[rd_write_handler]\n");
1037 // Bit8u atapi_command;
1040 for (channel=0; channel<MAX_ATA_CHANNEL; channel++) {
1041 if ((address & 0xfff8) == channels[channel].ioaddr1) {
1042 port = address - channels[channel].ioaddr1;
1045 else if ((address & 0xfff8) == channels[channel].ioaddr2) {
1046 port = address - channels[channel].ioaddr2 + 0x10;
1051 if (channel == MAX_ATA_CHANNEL) {
1052 if (address != 0x03f6) {
1053 RD_PANIC("Panic: write: unable to find ATA channel, ioport=0x%04x\n", address);
1056 port = address - 0x03e0;
1060 Ramdisk_Print("[W_handler] IO write to %x = %02x, channel = %d\n", (unsigned) address, (unsigned) value, channel);
1062 struct cdrom_interface *cdif = SELECTED_DRIVE(channel).cdrom.cd;
1067 Ramdisk_Print("\t\twrite port 170\n");
1069 //////////////////////////////////////////////////////////
1070 switch (SELECTED_CONTROLLER(channel).current_command) {
1071 case 0x30: // WRITE SECTORS
1072 RD_PANIC("\t\tneed to implement 0x30(write sector) to port 0x170\n");
1075 case 0xa0: // PACKET
1076 if (SELECTED_CONTROLLER(channel).buffer_index >= PACKET_SIZE)
1077 RD_PANIC("IO write(0x%04x): buffer_index >= PACKET_SIZE", address);
1078 SELECTED_CONTROLLER(channel).buffer[SELECTED_CONTROLLER(channel).buffer_index] = value;
1079 SELECTED_CONTROLLER(channel).buffer[SELECTED_CONTROLLER(channel).buffer_index+1] = (value >> 8);
1080 SELECTED_CONTROLLER(channel).buffer_index += 2;
1082 /* if packet completely writtten */
1083 if (SELECTED_CONTROLLER(channel).buffer_index >= PACKET_SIZE) {
1084 // complete command received
1085 Bit8u atapi_command = SELECTED_CONTROLLER(channel).buffer[0];
1087 Ramdisk_Print("\t\tcdrom: ATAPI command 0x%x started\n", atapi_command);
1089 switch (atapi_command) {
1090 case 0x00: // test unit ready
1091 if (SELECTED_DRIVE(channel).cdrom.ready) {
1092 rd_atapi_cmd_nop(channels, channel);
1094 rd_atapi_cmd_error(channels, channel, SENSE_NOT_READY, ASC_MEDIUM_NOT_PRESENT);
1096 rd_raise_interrupt(channels, channel);
1099 case 0x03: { // request sense
1100 int alloc_length = SELECTED_CONTROLLER(channel).buffer[4];
1101 rd_init_send_atapi_command(channels, channel, atapi_command, 18, alloc_length, false);
1104 SELECTED_CONTROLLER(channel).buffer[0] = 0x70 | (1 << 7);
1105 SELECTED_CONTROLLER(channel).buffer[1] = 0;
1106 SELECTED_CONTROLLER(channel).buffer[2] = SELECTED_DRIVE(channel).sense.sense_key;
1107 SELECTED_CONTROLLER(channel).buffer[3] = SELECTED_DRIVE(channel).sense.information.arr[0];
1108 SELECTED_CONTROLLER(channel).buffer[4] = SELECTED_DRIVE(channel).sense.information.arr[1];
1109 SELECTED_CONTROLLER(channel).buffer[5] = SELECTED_DRIVE(channel).sense.information.arr[2];
1110 SELECTED_CONTROLLER(channel).buffer[6] = SELECTED_DRIVE(channel).sense.information.arr[3];
1111 SELECTED_CONTROLLER(channel).buffer[7] = 17-7;
1112 SELECTED_CONTROLLER(channel).buffer[8] = SELECTED_DRIVE(channel).sense.specific_inf.arr[0];
1113 SELECTED_CONTROLLER(channel).buffer[9] = SELECTED_DRIVE(channel).sense.specific_inf.arr[1];
1114 SELECTED_CONTROLLER(channel).buffer[10] = SELECTED_DRIVE(channel).sense.specific_inf.arr[2];
1115 SELECTED_CONTROLLER(channel).buffer[11] = SELECTED_DRIVE(channel).sense.specific_inf.arr[3];
1116 SELECTED_CONTROLLER(channel).buffer[12] = SELECTED_DRIVE(channel).sense.asc;
1117 SELECTED_CONTROLLER(channel).buffer[13] = SELECTED_DRIVE(channel).sense.ascq;
1118 SELECTED_CONTROLLER(channel).buffer[14] = SELECTED_DRIVE(channel).sense.fruc;
1119 SELECTED_CONTROLLER(channel).buffer[15] = SELECTED_DRIVE(channel).sense.key_spec.arr[0];
1120 SELECTED_CONTROLLER(channel).buffer[16] = SELECTED_DRIVE(channel).sense.key_spec.arr[1];
1121 SELECTED_CONTROLLER(channel).buffer[17] = SELECTED_DRIVE(channel).sense.key_spec.arr[2];
1123 rd_ready_to_send_atapi(channels, channel);
1127 case 0x1b: { // start stop unit
1128 //bx_bool Immed = (SELECTED_CONTROLLER(channel).buffer[1] >> 0) & 1;
1129 rd_bool LoEj = (SELECTED_CONTROLLER(channel).buffer[4] >> 1) & 1;
1130 rd_bool Start = (SELECTED_CONTROLLER(channel).buffer[4] >> 0) & 1;
1132 if (!LoEj && !Start) { // stop the disc
1133 RD_ERROR("FIXME: Stop disc not implemented\n");
1134 rd_atapi_cmd_nop(channels, channel);
1135 rd_raise_interrupt(channels, channel);
1136 } else if (!LoEj && Start) { // start (spin up) the disc
1138 SELECTED_DRIVE(channel).cdrom.cd->ops.start_cdrom(cdif);
1140 RD_ERROR("FIXME: ATAPI start disc not reading TOC\n");
1141 rd_atapi_cmd_nop(channels, channel);
1142 rd_raise_interrupt(channels, channel);
1143 } else if (LoEj && !Start) { // Eject the disc
1144 rd_atapi_cmd_nop(channels, channel);
1146 if (SELECTED_DRIVE(channel).cdrom.ready) {
1148 SELECTED_DRIVE(channel).cdrom.cd->ops.eject_cdrom(cdif);
1150 SELECTED_DRIVE(channel).cdrom.ready = 0;
1151 //bx_options.atadevice[channel][SLAVE_SELECTED(channel)].Ostatus->set(EJECTED);
1152 //bx_gui->update_drive_status_buttons();
1154 rd_raise_interrupt(channels, channel);
1155 } else { // Load the disc
1156 // My guess is that this command only closes the tray, that's a no-op for us
1157 rd_atapi_cmd_nop(channels, channel);
1158 rd_raise_interrupt(channels, channel);
1163 case 0xbd: { // mechanism status
1164 uint16 alloc_length = rd_read_16bit(SELECTED_CONTROLLER(channel).buffer + 8);
1166 if (alloc_length == 0)
1167 RD_PANIC("Zero allocation length to MECHANISM STATUS not impl.\n");
1169 rd_init_send_atapi_command(channels, channel, atapi_command, 8, alloc_length, false);
1171 SELECTED_CONTROLLER(channel).buffer[0] = 0; // reserved for non changers
1172 SELECTED_CONTROLLER(channel).buffer[1] = 0; // reserved for non changers
1174 SELECTED_CONTROLLER(channel).buffer[2] = 0; // Current LBA (TODO!)
1175 SELECTED_CONTROLLER(channel).buffer[3] = 0; // Current LBA (TODO!)
1176 SELECTED_CONTROLLER(channel).buffer[4] = 0; // Current LBA (TODO!)
1178 SELECTED_CONTROLLER(channel).buffer[5] = 1; // one slot
1180 SELECTED_CONTROLLER(channel).buffer[6] = 0; // slot table length
1181 SELECTED_CONTROLLER(channel).buffer[7] = 0; // slot table length
1183 rd_ready_to_send_atapi(channels, channel);
1187 case 0x5a: { // mode sense
1188 uint16 alloc_length = rd_read_16bit(SELECTED_CONTROLLER(channel).buffer + 7);
1190 Bit8u PC = SELECTED_CONTROLLER(channel).buffer[2] >> 6;
1191 Bit8u PageCode = SELECTED_CONTROLLER(channel).buffer[2] & 0x3f;
1194 case 0x0: // current values
1196 case 0x01: // error recovery
1197 rd_init_send_atapi_command(channels, channel, atapi_command, sizeof(struct error_recovery_t) + 8, alloc_length, false);
1199 rd_init_mode_sense_single(channels, channel, &SELECTED_DRIVE(channel).cdrom.current.error_recovery,
1200 sizeof(struct error_recovery_t));
1201 rd_ready_to_send_atapi(channels, channel);
1204 case 0x2a: // CD-ROM capabilities & mech. status
1205 rd_init_send_atapi_command(channels, channel, atapi_command, 28, alloc_length, false);
1206 rd_init_mode_sense_single(channels, channel, &SELECTED_CONTROLLER(channel).buffer[8], 28);
1207 SELECTED_CONTROLLER(channel).buffer[8] = 0x2a;
1208 SELECTED_CONTROLLER(channel).buffer[9] = 0x12;
1209 SELECTED_CONTROLLER(channel).buffer[10] = 0x00;
1210 SELECTED_CONTROLLER(channel).buffer[11] = 0x00;
1211 // Multisession, Mode 2 Form 2, Mode 2 Form 1
1212 SELECTED_CONTROLLER(channel).buffer[12] = 0x70;
1213 SELECTED_CONTROLLER(channel).buffer[13] = (3 << 5);
1214 SELECTED_CONTROLLER(channel).buffer[14] = (unsigned char)
1216 (SELECTED_DRIVE(channel).cdrom.locked ? (1 << 1) : 0) |
1219 SELECTED_CONTROLLER(channel).buffer[15] = 0x00;
1220 SELECTED_CONTROLLER(channel).buffer[16] = (706 >> 8) & 0xff;
1221 SELECTED_CONTROLLER(channel).buffer[17] = 706 & 0xff;
1222 SELECTED_CONTROLLER(channel).buffer[18] = 0;
1223 SELECTED_CONTROLLER(channel).buffer[19] = 2;
1224 SELECTED_CONTROLLER(channel).buffer[20] = (512 >> 8) & 0xff;
1225 SELECTED_CONTROLLER(channel).buffer[21] = 512 & 0xff;
1226 SELECTED_CONTROLLER(channel).buffer[22] = (706 >> 8) & 0xff;
1227 SELECTED_CONTROLLER(channel).buffer[23] = 706 & 0xff;
1228 SELECTED_CONTROLLER(channel).buffer[24] = 0;
1229 SELECTED_CONTROLLER(channel).buffer[25] = 0;
1230 SELECTED_CONTROLLER(channel).buffer[26] = 0;
1231 SELECTED_CONTROLLER(channel).buffer[27] = 0;
1232 rd_ready_to_send_atapi(channels, channel);
1235 case 0x0d: // CD-ROM
1236 case 0x0e: // CD-ROM audio control
1238 RD_ERROR("cdrom: MODE SENSE (curr), code=%x not implemented yet\n",
1240 rd_atapi_cmd_error(channels, channel, SENSE_ILLEGAL_REQUEST,
1241 ASC_INV_FIELD_IN_CMD_PACKET);
1242 rd_raise_interrupt(channels, channel);
1246 // not implemeted by this device
1247 Ramdisk_Print("\t\tcdrom: MODE SENSE PC=%x, PageCode=%x, not implemented by device\n",
1249 rd_atapi_cmd_error(channels, channel, SENSE_ILLEGAL_REQUEST,
1250 ASC_INV_FIELD_IN_CMD_PACKET);
1251 rd_raise_interrupt(channels, channel);
1256 case 0x1: // changeable values
1258 case 0x01: // error recovery
1259 case 0x0d: // CD-ROM
1260 case 0x0e: // CD-ROM audio control
1261 case 0x2a: // CD-ROM capabilities & mech. status
1263 RD_ERROR("cdrom: MODE SENSE (chg), code=%x not implemented yet\n",
1265 rd_atapi_cmd_error(channels, channel, SENSE_ILLEGAL_REQUEST,
1266 ASC_INV_FIELD_IN_CMD_PACKET);
1267 rd_raise_interrupt(channels, channel);
1271 // not implemeted by this device
1272 Ramdisk_Print("\t\tcdrom: MODE SENSE PC=%x, PageCode=%x, not implemented by device\n",
1274 rd_atapi_cmd_error(channels, channel, SENSE_ILLEGAL_REQUEST,
1275 ASC_INV_FIELD_IN_CMD_PACKET);
1276 rd_raise_interrupt(channels, channel);
1281 case 0x2: // default values
1283 case 0x01: // error recovery
1284 case 0x0d: // CD-ROM
1285 case 0x0e: // CD-ROM audio control
1286 case 0x2a: // CD-ROM capabilities & mech. status
1288 RD_PANIC("cdrom: MODE SENSE (dflt), code=%x\n",
1293 // not implemeted by this device
1294 Ramdisk_Print("\t\tcdrom: MODE SENSE PC=%x, PageCode=%x, not implemented by device\n",
1296 rd_atapi_cmd_error(channels, channel, SENSE_ILLEGAL_REQUEST,
1297 ASC_INV_FIELD_IN_CMD_PACKET);
1298 rd_raise_interrupt(channels, channel);
1303 case 0x3: // saved values not implemented
1304 rd_atapi_cmd_error(channels, channel, SENSE_ILLEGAL_REQUEST, ASC_SAVING_PARAMETERS_NOT_SUPPORTED);
1305 rd_raise_interrupt(channels, channel);
1309 RD_PANIC("Should not get here!\n");
1315 case 0x12: { // inquiry
1316 uint8 alloc_length = SELECTED_CONTROLLER(channel).buffer[4];
1318 rd_init_send_atapi_command(channels, channel, atapi_command, 36, alloc_length, false);
1320 SELECTED_CONTROLLER(channel).buffer[0] = 0x05; // CD-ROM
1321 SELECTED_CONTROLLER(channel).buffer[1] = 0x80; // Removable
1322 SELECTED_CONTROLLER(channel).buffer[2] = 0x00; // ISO, ECMA, ANSI version
1323 SELECTED_CONTROLLER(channel).buffer[3] = 0x21; // ATAPI-2, as specified
1324 SELECTED_CONTROLLER(channel).buffer[4] = 31; // additional length (total 36)
1325 SELECTED_CONTROLLER(channel).buffer[5] = 0x00; // reserved
1326 SELECTED_CONTROLLER(channel).buffer[6] = 0x00; // reserved
1327 SELECTED_CONTROLLER(channel).buffer[7] = 0x00; // reserved
1330 const char* vendor_id = "VTAB ";
1332 for (i = 0; i < 8; i++)
1333 SELECTED_CONTROLLER(channel).buffer[8+i] = vendor_id[i];
1336 const char* product_id = "Turbo CD-ROM ";
1337 for (i = 0; i < 16; i++)
1338 SELECTED_CONTROLLER(channel).buffer[16+i] = product_id[i];
1340 // Product Revision level
1341 const char* rev_level = "1.0 ";
1342 for (i = 0; i < 4; i++)
1343 SELECTED_CONTROLLER(channel).buffer[32+i] = rev_level[i];
1345 rd_ready_to_send_atapi(channels, channel);
1349 case 0x25: { // read cd-rom capacity
1350 // no allocation length???
1351 rd_init_send_atapi_command(channels, channel, atapi_command, 8, 8, false);
1353 if (SELECTED_DRIVE(channel).cdrom.ready) {
1354 uint32 capacity = SELECTED_DRIVE(channel).cdrom.capacity;
1355 Ramdisk_Print("\t\tCapacity is %d sectors (%d bytes)\n", capacity, capacity * 2048);
1356 SELECTED_CONTROLLER(channel).buffer[0] = (capacity >> 24) & 0xff;
1357 SELECTED_CONTROLLER(channel).buffer[1] = (capacity >> 16) & 0xff;
1358 SELECTED_CONTROLLER(channel).buffer[2] = (capacity >> 8) & 0xff;
1359 SELECTED_CONTROLLER(channel).buffer[3] = (capacity >> 0) & 0xff;
1360 SELECTED_CONTROLLER(channel).buffer[4] = (2048 >> 24) & 0xff;
1361 SELECTED_CONTROLLER(channel).buffer[5] = (2048 >> 16) & 0xff;
1362 SELECTED_CONTROLLER(channel).buffer[6] = (2048 >> 8) & 0xff;
1363 SELECTED_CONTROLLER(channel).buffer[7] = (2048 >> 0) & 0xff;
1364 rd_ready_to_send_atapi(channels, channel);
1366 rd_atapi_cmd_error(channels, channel, SENSE_NOT_READY, ASC_MEDIUM_NOT_PRESENT);
1367 rd_raise_interrupt(channels, channel);
1372 case 0xbe: { // read cd
1373 if (SELECTED_DRIVE(channel).cdrom.ready) {
1374 RD_ERROR("Read CD with CD present not implemented\n");
1375 rd_atapi_cmd_error(channels, channel, SENSE_ILLEGAL_REQUEST, ASC_INV_FIELD_IN_CMD_PACKET);
1376 rd_raise_interrupt(channels, channel);
1378 rd_atapi_cmd_error(channels, channel, SENSE_NOT_READY, ASC_MEDIUM_NOT_PRESENT);
1379 rd_raise_interrupt(channels, channel);
1384 case 0x43: { // read toc
1385 if (SELECTED_DRIVE(channel).cdrom.ready) {
1387 bool msf = (SELECTED_CONTROLLER(channel).buffer[1] >> 1) & 1;
1388 uint8 starting_track = SELECTED_CONTROLLER(channel).buffer[6];
1390 uint16 alloc_length = rd_read_16bit(SELECTED_CONTROLLER(channel).buffer + 7);
1392 uint8 format = (SELECTED_CONTROLLER(channel).buffer[9] >> 6);
1397 if (!(SELECTED_DRIVE(channel).cdrom.cd->ops.read_toc(cdif, SELECTED_CONTROLLER(channel).buffer,
1398 &toc_length, msf, starting_track))) {
1399 rd_atapi_cmd_error(channels, channel, SENSE_ILLEGAL_REQUEST,
1400 ASC_INV_FIELD_IN_CMD_PACKET);
1401 rd_raise_interrupt(channels, channel);
1403 rd_init_send_atapi_command(channels, channel, atapi_command, toc_length, alloc_length, false);
1404 rd_ready_to_send_atapi(channels, channel);
1409 // multi session stuff. we ignore this and emulate a single session only
1410 rd_init_send_atapi_command(channels, channel, atapi_command, 12, alloc_length, false);
1412 SELECTED_CONTROLLER(channel).buffer[0] = 0;
1413 SELECTED_CONTROLLER(channel).buffer[1] = 0x0a;
1414 SELECTED_CONTROLLER(channel).buffer[2] = 1;
1415 SELECTED_CONTROLLER(channel).buffer[3] = 1;
1416 for (i = 0; i < 8; i++)
1417 SELECTED_CONTROLLER(channel).buffer[4+i] = 0;
1419 rd_ready_to_send_atapi(channels, channel);
1424 RD_PANIC("(READ TOC) Format %d not supported\n", format);
1428 rd_atapi_cmd_error(channels, channel, SENSE_NOT_READY, ASC_MEDIUM_NOT_PRESENT);
1429 rd_raise_interrupt(channels, channel);
1434 case 0x28: // read (10)
1435 case 0xa8: // read (12)
1438 uint32 transfer_length;
1439 if (atapi_command == 0x28)
1440 transfer_length = rd_read_16bit(SELECTED_CONTROLLER(channel).buffer + 7);
1442 transfer_length = rd_read_32bit(SELECTED_CONTROLLER(channel).buffer + 6);
1444 uint32 lba = rd_read_32bit(SELECTED_CONTROLLER(channel).buffer + 2);
1446 if (!SELECTED_DRIVE(channel).cdrom.ready) {
1447 rd_atapi_cmd_error(channels, channel, SENSE_NOT_READY, ASC_MEDIUM_NOT_PRESENT);
1448 rd_raise_interrupt(channels, channel);
1452 if (transfer_length == 0) {
1453 rd_atapi_cmd_nop(channels, channel);
1454 rd_raise_interrupt(channels, channel);
1455 Ramdisk_Print("\t\tREAD(%d) with transfer length 0, ok\n", atapi_command==0x28?10:12);
1459 if (lba + transfer_length > SELECTED_DRIVE(channel).cdrom.capacity) {
1460 rd_atapi_cmd_error(channels, channel, SENSE_ILLEGAL_REQUEST, ASC_LOGICAL_BLOCK_OOR);
1461 rd_raise_interrupt(channels, channel);
1465 Ramdisk_Print("\t\tcdrom: READ (%d) LBA=%d LEN=%d\n", atapi_command==0x28?10:12, lba, transfer_length);
1468 rd_init_send_atapi_command(channels, channel, atapi_command, transfer_length * 2048,
1469 transfer_length * 2048, true);
1470 SELECTED_DRIVE(channel).cdrom.remaining_blocks = transfer_length;
1471 SELECTED_DRIVE(channel).cdrom.next_lba = lba;
1472 rd_ready_to_send_atapi(channels, channel);
1476 case 0x2b: { // seek
1477 uint32 lba = rd_read_32bit(SELECTED_CONTROLLER(channel).buffer + 2);
1478 if (!SELECTED_DRIVE(channel).cdrom.ready) {
1479 rd_atapi_cmd_error(channels, channel, SENSE_NOT_READY, ASC_MEDIUM_NOT_PRESENT);
1480 rd_raise_interrupt(channels, channel);
1484 if (lba > SELECTED_DRIVE(channel).cdrom.capacity) {
1485 rd_atapi_cmd_error(channels, channel, SENSE_ILLEGAL_REQUEST, ASC_LOGICAL_BLOCK_OOR);
1486 rd_raise_interrupt(channels, channel);
1489 Ramdisk_Print("\t\tcdrom: SEEK (ignored)\n");
1490 rd_atapi_cmd_nop(channels, channel);
1491 rd_raise_interrupt(channels, channel);
1495 case 0x1e: { // prevent/allow medium removal
1496 if (SELECTED_DRIVE(channel).cdrom.ready) {
1497 SELECTED_DRIVE(channel).cdrom.locked = SELECTED_CONTROLLER(channel).buffer[4] & 1;
1498 rd_atapi_cmd_nop(channels, channel);
1500 rd_atapi_cmd_error(channels, channel, SENSE_NOT_READY, ASC_MEDIUM_NOT_PRESENT);
1502 rd_raise_interrupt(channels, channel);
1506 case 0x42: { // read sub-channel
1507 bool msf = get_packet_field(channel,1, 1, 1);
1508 bool sub_q = get_packet_field(channel,2, 6, 1);
1509 uint8 data_format = get_packet_byte(channel,3);
1510 uint8 track_number = get_packet_byte(channel,6);
1511 uint16 alloc_length = get_packet_word(channel,7);
1513 UNUSED(data_format);
1514 UNUSED(track_number);
1516 if (!SELECTED_DRIVE(channel).cdrom.ready) {
1517 rd_atapi_cmd_error(channels, channel, SENSE_NOT_READY, ASC_MEDIUM_NOT_PRESENT);
1518 rd_raise_interrupt(channels, channel);
1520 SELECTED_CONTROLLER(channel).buffer[0] = 0;
1521 SELECTED_CONTROLLER(channel).buffer[1] = 0; // audio not supported
1522 SELECTED_CONTROLLER(channel).buffer[2] = 0;
1523 SELECTED_CONTROLLER(channel).buffer[3] = 0;
1525 int ret_len = 4; // header size
1527 if (sub_q) { // !sub_q == header only
1528 RD_ERROR("Read sub-channel with SubQ not implemented\n");
1529 rd_atapi_cmd_error(channels, channel, SENSE_ILLEGAL_REQUEST,
1530 ASC_INV_FIELD_IN_CMD_PACKET);
1531 rd_raise_interrupt(channels, channel);
1534 rd_init_send_atapi_command(channels, channel, atapi_command, ret_len, alloc_length, false);
1535 rd_ready_to_send_atapi(channels, channel);
1540 case 0x51: { // read disc info
1541 // no-op to keep the Linux CD-ROM driver happy
1542 rd_atapi_cmd_error(channels, channel, SENSE_ILLEGAL_REQUEST, ASC_INV_FIELD_IN_CMD_PACKET);
1543 rd_raise_interrupt(channels, channel);
1547 case 0x55: // mode select
1548 case 0xa6: // load/unload cd
1549 case 0x4b: // pause/resume
1550 case 0x45: // play audio
1551 case 0x47: // play audio msf
1552 case 0xbc: // play cd
1553 case 0xb9: // read cd msf
1554 case 0x44: // read header
1556 case 0xbb: // set cd speed
1557 case 0x4e: // stop play/scan
1560 RD_ERROR("ATAPI command 0x%x not implemented yet\n",
1562 rd_atapi_cmd_error(channels, channel, SENSE_ILLEGAL_REQUEST, ASC_INV_FIELD_IN_CMD_PACKET);
1563 rd_raise_interrupt(channels, channel);
1566 RD_PANIC("Unknown ATAPI command 0x%x (%d)\n",
1567 atapi_command, atapi_command);
1568 // We'd better signal the error if the user chose to continue
1569 rd_atapi_cmd_error(channels, channel, SENSE_ILLEGAL_REQUEST, ASC_INV_FIELD_IN_CMD_PACKET);
1570 rd_raise_interrupt(channels, channel);
1579 RD_PANIC("\t\tIO write(0x%x): current command is %02xh\n", address,
1580 (unsigned) SELECTED_CONTROLLER(channel).current_command);
1583 /////////////////////////////////////////////////////////
1585 case 0x01: // hard disk write precompensation 0x1f1
1586 WRITE_FEATURES(channel,value);
1589 case 0x02: // hard disk sector count 0x1f2
1590 WRITE_SECTOR_COUNT(channel,value);
1593 case 0x03: // hard disk sector number 0x1f3
1594 WRITE_SECTOR_NUMBER(channel,value);
1597 case 0x04: // hard disk cylinder low 0x1f4
1598 WRITE_CYLINDER_LOW(channel,value);
1601 case 0x05: // hard disk cylinder high 0x1f5
1602 WRITE_CYLINDER_HIGH(channel,value);
1605 case 0x06: // hard disk drive and head register 0x1f6
1606 // b7 Extended data field for ECC
1607 // b6/b5: Used to be sector size. 00=256,01=512,10=1024,11=128
1608 // Since 512 was always used, bit 6 was taken to mean LBA mode:
1609 // b6 1=LBA mode, 0=CHS mode
1614 if ( (value & 0xa0) != 0xa0 ) // 1x1xxxxx
1615 Ramdisk_Print("\t\tIO write 0x%x (%02x): not 1x1xxxxxb\n", address, (unsigned) value);
1617 Bit32u drvsel = channels[channel].drive_select = (value >> 4) & 0x01;
1618 WRITE_HEAD_NO(channel,value & 0xf);
1619 if (SELECTED_CONTROLLER(channel).lba_mode == 0 && ((value >> 6) & 1) == 1){
1620 Ramdisk_Print("\t\tenabling LBA mode\n");
1622 WRITE_LBA_MODE(channel,(value >> 6) & 1);
1623 SELECTED_DRIVE(channel).cdrom.cd->lba = (value >> 6) & 1;
1626 if (!SELECTED_IS_PRESENT(channel)) {
1627 Ramdisk_Print ("\t\tError: device set to %d which does not exist! channel = %d\n",drvsel, channel);
1628 SELECTED_CONTROLLER(channel).error_register = 0x04; // aborted
1629 SELECTED_CONTROLLER(channel).status.err = 1;
1635 case 0x07: // hard disk command 0x1f7
1639 case 0xa1: // IDENTIFY PACKET DEVICE
1640 if (SELECTED_IS_CD(channel)) {
1641 SELECTED_CONTROLLER(channel).current_command = value;
1642 SELECTED_CONTROLLER(channel).error_register = 0;
1644 SELECTED_CONTROLLER(channel).status.busy = 0;
1645 SELECTED_CONTROLLER(channel).status.drive_ready = 1;
1646 SELECTED_CONTROLLER(channel).status.write_fault = 0;
1647 SELECTED_CONTROLLER(channel).status.drq = 1;
1648 SELECTED_CONTROLLER(channel).status.err = 0;
1650 SELECTED_CONTROLLER(channel).status.seek_complete = 1;
1651 SELECTED_CONTROLLER(channel).status.corrected_data = 0;
1653 SELECTED_CONTROLLER(channel).buffer_index = 0;
1654 rd_raise_interrupt(channels, channel);
1655 rd_identify_ATAPI_drive(channels, channel);
1657 rd_command_aborted(channels, channel, 0xa1);
1661 case 0xa0: // SEND PACKET (atapi)
1662 if (SELECTED_IS_CD(channel)) {
1664 if (SELECTED_CONTROLLER(channel).features & (1 << 0))
1665 RD_PANIC("\t\tPACKET-DMA not supported");
1666 if (SELECTED_CONTROLLER(channel).features & (1 << 1))
1667 RD_PANIC("\t\tPACKET-overlapped not supported");
1669 // We're already ready!
1670 SELECTED_CONTROLLER(channel).sector_count = 1;
1671 SELECTED_CONTROLLER(channel).status.busy = 0;
1672 SELECTED_CONTROLLER(channel).status.write_fault = 0;
1674 SELECTED_CONTROLLER(channel).status.drq = 1;
1675 SELECTED_CONTROLLER(channel).status.err = 0;
1677 // NOTE: no interrupt here
1678 SELECTED_CONTROLLER(channel).current_command = value;
1679 SELECTED_CONTROLLER(channel).buffer_index = 0;
1681 rd_command_aborted (channels, channel, 0xa0);
1686 Ramdisk_Print("\t\tneed translate command %2x\n", value);
1691 case 0x16: // hard disk adapter control 0x3f6
1692 // (mch) Even if device 1 was selected, a write to this register
1693 // goes to device 0 (if device 1 is absent)
1695 prev_control_reset = SELECTED_CONTROLLER(channel).control.reset;
1696 channels[channel].drives[0].controller.control.reset = value & 0x04;
1697 channels[channel].drives[1].controller.control.reset = value & 0x04;
1698 // CGS: was: SELECTED_CONTROLLER(channel).control.disable_irq = value & 0x02;
1699 channels[channel].drives[0].controller.control.disable_irq = value & 0x02;
1700 channels[channel].drives[1].controller.control.disable_irq = value & 0x02;
1702 Ramdisk_Print("\t\tadpater control reg: reset controller = %d\n",
1703 (unsigned) (SELECTED_CONTROLLER(channel).control.reset) ? 1 : 0);
1704 Ramdisk_Print("\t\tadpater control reg: disable_irq(X) = %d\n",
1705 (unsigned) (SELECTED_CONTROLLER(channel).control.disable_irq) ? 1 : 0);
1707 if (!prev_control_reset && SELECTED_CONTROLLER(channel).control.reset) {
1708 // transition from 0 to 1 causes all drives to reset
1709 Ramdisk_Print("\t\thard drive: RESET\n");
1711 // (mch) Set BSY, drive not ready
1712 for (id = 0; id < 2; id++) {
1713 CONTROLLER(channel,id).status.busy = 1;
1714 CONTROLLER(channel,id).status.drive_ready = 0;
1715 CONTROLLER(channel,id).reset_in_progress = 1;
1717 CONTROLLER(channel,id).status.write_fault = 0;
1718 CONTROLLER(channel,id).status.seek_complete = 1;
1719 CONTROLLER(channel,id).status.drq = 0;
1720 CONTROLLER(channel,id).status.corrected_data = 0;
1721 CONTROLLER(channel,id).status.err = 0;
1723 CONTROLLER(channel,id).error_register = 0x01; // diagnostic code: no error
1725 CONTROLLER(channel,id).current_command = 0x00;
1726 CONTROLLER(channel,id).buffer_index = 0;
1728 CONTROLLER(channel,id).sectors_per_block = 0x80;
1729 CONTROLLER(channel,id).lba_mode = 0;
1731 CONTROLLER(channel,id).control.disable_irq = 0;
1732 rd_lower_irq((struct vm_device *)(ramdisk_state->private_data), channels[channel].irq);
1734 } else if (SELECTED_CONTROLLER(channel).reset_in_progress &&
1735 !SELECTED_CONTROLLER(channel).control.reset) {
1736 // Clear BSY and DRDY
1737 Ramdisk_Print("\t\tReset complete {%s}\n", SELECTED_TYPE_STRING(channel));
1738 for (id = 0; id < 2; id++) {
1739 CONTROLLER(channel,id).status.busy = 0;
1740 CONTROLLER(channel,id).status.drive_ready = 1;
1741 CONTROLLER(channel,id).reset_in_progress = 0;
1744 if (DRIVE_IS_HD(channel,id)) {
1745 Ramdisk_Print("\t\tdrive %d/%d is harddrive\n", channel, id);
1746 CONTROLLER(channel,id).head_no = 0;
1747 CONTROLLER(channel,id).sector_count = 1;
1748 CONTROLLER(channel,id).sector_no = 1;
1749 CONTROLLER(channel,id).cylinder_no = 0;
1751 CONTROLLER(channel,id).head_no = 0;
1752 CONTROLLER(channel,id).sector_count = 1;
1753 CONTROLLER(channel,id).sector_no = 1;
1754 CONTROLLER(channel,id).cylinder_no = 0xeb14;
1758 Ramdisk_Print("\t\ts[0].controller.control.disable_irq = %02x\n", (channels[channel].drives[0]).controller.control.disable_irq);
1759 Ramdisk_Print("\t\ts[1].controller.control.disable_irq = %02x\n", (channels[channel].drives[1]).controller.control.disable_irq);
1763 RD_PANIC("\t\thard drive: io write to address %x = %02x\n",
1764 (unsigned) address, (unsigned) value);
1772 void rd_identify_ATAPI_drive(struct channel_t *channels, Bit8u channel)
1775 const char* serial_number = " VT00001\0\0\0\0\0\0\0\0\0\0\0\0";
1776 const char* firmware = "ALPHA1 ";
1778 SELECTED_DRIVE(channel).id_drive[0] = (2 << 14) | (5 << 8) | (1 << 7) | (2 << 5) | (0 << 0); // Removable CDROM, 50us response, 12 byte packets
1780 for (i = 1; i <= 9; i++)
1781 SELECTED_DRIVE(channel).id_drive[i] = 0;
1784 for (i = 0; i < 10; i++) {
1785 SELECTED_DRIVE(channel).id_drive[10+i] = (serial_number[i*2] << 8) |
1786 serial_number[i*2 + 1];
1789 for (i = 20; i <= 22; i++)
1790 SELECTED_DRIVE(channel).id_drive[i] = 0;
1793 for (i = 0; i < strlen(firmware)/2; i++) {
1794 SELECTED_DRIVE(channel).id_drive[23+i] = (firmware[i*2] << 8) |
1797 V3_ASSERT((23+i) == 27);
1799 for (i = 0; i < strlen((char *) SELECTED_MODEL(channel))/2; i++) {
1800 SELECTED_DRIVE(channel).id_drive[27+i] = (SELECTED_MODEL(channel)[i*2] << 8) |
1801 SELECTED_MODEL(channel)[i*2 + 1];
1803 V3_ASSERT((27+i) == 47);
1805 SELECTED_DRIVE(channel).id_drive[47] = 0;
1806 SELECTED_DRIVE(channel).id_drive[48] = 1; // 32 bits access
1808 SELECTED_DRIVE(channel).id_drive[49] = (1 << 9); // LBA supported
1810 SELECTED_DRIVE(channel).id_drive[50] = 0;
1811 SELECTED_DRIVE(channel).id_drive[51] = 0;
1812 SELECTED_DRIVE(channel).id_drive[52] = 0;
1814 SELECTED_DRIVE(channel).id_drive[53] = 3; // words 64-70, 54-58 valid
1816 for (i = 54; i <= 62; i++)
1817 SELECTED_DRIVE(channel).id_drive[i] = 0;
1819 // copied from CFA540A
1820 SELECTED_DRIVE(channel).id_drive[63] = 0x0103; // variable (DMA stuff)
1821 SELECTED_DRIVE(channel).id_drive[64] = 0x0001; // PIO
1822 SELECTED_DRIVE(channel).id_drive[65] = 0x00b4;
1823 SELECTED_DRIVE(channel).id_drive[66] = 0x00b4;
1824 SELECTED_DRIVE(channel).id_drive[67] = 0x012c;
1825 SELECTED_DRIVE(channel).id_drive[68] = 0x00b4;
1827 SELECTED_DRIVE(channel).id_drive[69] = 0;
1828 SELECTED_DRIVE(channel).id_drive[70] = 0;
1829 SELECTED_DRIVE(channel).id_drive[71] = 30; // faked
1830 SELECTED_DRIVE(channel).id_drive[72] = 30; // faked
1831 SELECTED_DRIVE(channel).id_drive[73] = 0;
1832 SELECTED_DRIVE(channel).id_drive[74] = 0;
1834 SELECTED_DRIVE(channel).id_drive[75] = 0;
1836 for (i = 76; i <= 79; i++)
1837 SELECTED_DRIVE(channel).id_drive[i] = 0;
1839 SELECTED_DRIVE(channel).id_drive[80] = 0x1e; // supports up to ATA/ATAPI-4
1840 SELECTED_DRIVE(channel).id_drive[81] = 0;
1841 SELECTED_DRIVE(channel).id_drive[82] = 0;
1842 SELECTED_DRIVE(channel).id_drive[83] = 0;
1843 SELECTED_DRIVE(channel).id_drive[84] = 0;
1844 SELECTED_DRIVE(channel).id_drive[85] = 0;
1845 SELECTED_DRIVE(channel).id_drive[86] = 0;
1846 SELECTED_DRIVE(channel).id_drive[87] = 0;
1847 SELECTED_DRIVE(channel).id_drive[88] = 0;
1849 for (i = 89; i <= 126; i++)
1850 SELECTED_DRIVE(channel).id_drive[i] = 0;
1852 SELECTED_DRIVE(channel).id_drive[127] = 0;
1853 SELECTED_DRIVE(channel).id_drive[128] = 0;
1855 for (i = 129; i <= 159; i++)
1856 SELECTED_DRIVE(channel).id_drive[i] = 0;
1858 for (i = 160; i <= 255; i++)
1859 SELECTED_DRIVE(channel).id_drive[i] = 0;
1861 // now convert the id_drive array (native 256 word format) to
1862 // the controller buffer (512 bytes)
1864 for (i = 0; i <= 255; i++) {
1865 temp16 = SELECTED_DRIVE(channel).id_drive[i];
1866 SELECTED_CONTROLLER(channel).buffer[i*2] = temp16 & 0x00ff;
1867 SELECTED_CONTROLLER(channel).buffer[i*2+1] = temp16 >> 8;
1876 void rd_raise_interrupt(struct channel_t *channels, Bit8u channel)
1879 struct vm_device *dev;
1881 Ramdisk_Print("[raise_interrupt] disable_irq = %02x\n", SELECTED_CONTROLLER(channel).control.disable_irq);
1883 if (!SELECTED_CONTROLLER(channel).control.disable_irq) {
1884 Ramdisk_Print("\t\traising interrupt\n");
1886 Ramdisk_Print("\t\tNot raising interrupt\n");
1888 if (!SELECTED_CONTROLLER(channel).control.disable_irq) {
1889 irq = channels[channel].irq;
1890 Ramdisk_Print("\t\tRaising interrupt %d {%s}\n\n", irq, SELECTED_TYPE_STRING(channel));
1891 // DEV_pic_raise_irq(irq);
1892 dev = (struct vm_device*) ramdisk_state->private_data;
1893 Ramdisk_Print("\t\tdev = %x\n", dev);
1894 dev->vm->vm_ops.raise_irq(dev->vm, irq);
1896 Ramdisk_Print("\t\tirq is disabled\n");
1903 void rd_lower_irq(struct vm_device *dev, Bit32u irq)// __attribute__(regparm(1))
1905 Ramdisk_Print("[lower_irq] irq = %d\n", irq);
1906 dev->vm->vm_ops.lower_irq(dev->vm, irq);
1914 int ramdisk_read_port(ushort_t port,
1917 struct vm_device *dev)
1920 //Ramdisk_Print("[ramdisk_read_port] port = %x, length = %d\n", port, length);
1923 ((uchar_t*)src)[0] = rd_read_handler(ramdisk_state->channels, port, length);
1926 ((ushort_t*)src)[0] = rd_read_handler(ramdisk_state->channels, port, length);
1929 ((uint_t*)src)[0] = rd_read_handler(ramdisk_state->channels, port, length);
1932 for (i = 0; i < length; i++) {
1933 ((uchar_t*)src)[i] = rd_read_handler(ramdisk_state->channels, port, 1);
1942 int ramdisk_write_port(ushort_t port,
1945 struct vm_device *dev)
1947 //Ramdisk_Print("[ramdisk_write_port] port = %x, length = %d\n", port, length);
1951 for (i = 0; i < length; i++)
1952 Ramdisk_Print("\t\tsrc[%d] = 0x%02x\n", i, ((uchar_t*)src)[i]);
1957 rd_write_handler(ramdisk_state->channels, port, *((uchar_t *)src), length);
1960 rd_write_handler(ramdisk_state->channels, port, *((ushort_t *)src), length);
1963 rd_write_handler(ramdisk_state->channels, port, *((uint_t *)src), length);
1966 rd_write_handler(ramdisk_state->channels, port, *((uchar_t *)src), length);
1974 static void trace_info(ushort_t port, void *src, uint_t length)
1979 if (length == 1 && *((uchar_t*) src) == ATA_DETECT)
1980 Ramdisk_Print("ata_dectect()\n");
1984 if (length == 1 && *((uchar_t*) src) == ATA_RESET)
1985 Ramdisk_Print("ata_reset()\n");
1989 if (length == 1 && *((uchar_t*) src) == ATA_CMD_DATA_IN)
1990 Ramdisk_Print("ata_cmd_data_in()\n");
1994 if (length == 1 && *((uchar_t*) src) == ATA_CMD_DATA_OUT)
1995 Ramdisk_Print("ata_cmd_data_out()\n");
1999 if (length == 1 && *((uchar_t*) src) == ATA_CMD_PACKET)
2000 Ramdisk_Print("ata_cmd_packet()\n");
2004 if (length == 1 && *((uchar_t*) src) == ATAPI_GET_SENSE)
2005 Ramdisk_Print("atapi_get_sense()\n");
2009 if (length == 1 && *((uchar_t*) src) == ATAPI_IS_READY)
2010 Ramdisk_Print("atapi_is_ready()\n");
2014 if (length == 1 && *((uchar_t*) src) == ATAPI_IS_CDROM)
2015 Ramdisk_Print("atapi_is_cdrom()\n");
2020 if (length == 1 && *((uchar_t*) src) == CDEMU_INIT)
2021 Ramdisk_Print("cdemu_init()\n");
2025 if (length == 1 && *((uchar_t*) src) == CDEMU_ISACTIVE)
2026 Ramdisk_Print("cdemu_isactive()\n");
2030 if (length == 1 && *((uchar_t*) src) == CDEMU_EMULATED_DRIVE)
2031 Ramdisk_Print("cdemu_emulated_drive()\n");
2035 if (length == 1 && *((uchar_t*) src) == CDROM_BOOT)
2036 Ramdisk_Print("cdrom_boot()\n");
2040 if (length == 1 && *((uchar_t*) src) == HARD_DRIVE_POST)
2041 Ramdisk_Print("ata_hard_drive_post()\n");
2046 Ramdisk_Print("ata_device_no(%d)\n", *((uchar_t*) src));
2051 Ramdisk_Print("ata_device_type(%d)\n", *((uchar_t*) src));
2055 if (length == 1 && *((uchar_t*) src) == INT13_HARDDISK)
2056 Ramdisk_Print("int13_harddrive()\n");
2060 if (length == 1 && *((uchar_t*) src) == INT13_CDROM)
2061 Ramdisk_Print("int13_cdrom()\n");
2065 if (length == 1 && *((uchar_t*) src) == INT13_CDEMU)
2066 Ramdisk_Print("int13_cdemu()\n");
2070 if (length == 1 && *((uchar_t*) src) == INT13_ELTORITO)
2071 Ramdisk_Print("int13_eltorito()\n");
2075 if (length == 1 && *((uchar_t*) src) == INT13_DISKETTE_FUNCTION)
2076 Ramdisk_Print("int13_diskette_function()\n");
2086 int ramdisk_read_port_ignore(ushort_t port,
2089 struct vm_device *dev)
2091 // Ramdisk_Print("[ramdisk_read_port_ignore] port = %x, length = %d\n", port, length);
2095 int ramdisk_write_port_ignore(ushort_t port,
2098 struct vm_device *dev)
2101 // Ramdisk_Print("[ramdisk_write_port_ignore] port = %x, length = %d\n", port, length);
2103 trace_info(port, src, length);
2107 //////////////////////////////////////////////////////////////////////////
2114 void rd_init_send_atapi_command(struct channel_t *channels, Bit8u channel, Bit8u command, int req_length, int alloc_length, bool lazy)
2116 // SELECTED_CONTROLLER(channel).byte_count is a union of SELECTED_CONTROLLER(channel).cylinder_no;
2117 // lazy is used to force a data read in the buffer at the next read.
2119 Ramdisk_Print("[rd_init_send_atapi_cmd]\n");
2120 if (SELECTED_CONTROLLER(channel).byte_count == 0xffff)
2121 SELECTED_CONTROLLER(channel).byte_count = 0xfffe;
2123 if ((SELECTED_CONTROLLER(channel).byte_count & 1)
2124 && !(alloc_length <= SELECTED_CONTROLLER(channel).byte_count)) {
2125 Ramdisk_Print("\t\tOdd byte count (0x%04x) to ATAPI command 0x%02x, using 0x%x\n",
2126 SELECTED_CONTROLLER(channel).byte_count, command, SELECTED_CONTROLLER(channel).byte_count - 1);
2127 SELECTED_CONTROLLER(channel).byte_count -= 1;
2130 if (SELECTED_CONTROLLER(channel).byte_count == 0)
2131 RD_PANIC("\t\tATAPI command with zero byte count\n");
2133 if (alloc_length < 0)
2134 RD_PANIC("\t\tAllocation length < 0\n");
2135 if (alloc_length == 0)
2136 alloc_length = SELECTED_CONTROLLER(channel).byte_count;
2138 SELECTED_CONTROLLER(channel).interrupt_reason.i_o = 1;
2139 SELECTED_CONTROLLER(channel).interrupt_reason.c_d = 0;
2140 SELECTED_CONTROLLER(channel).status.busy = 0;
2141 SELECTED_CONTROLLER(channel).status.drq = 1;
2142 SELECTED_CONTROLLER(channel).status.err = 0;
2144 // no bytes transfered yet
2146 SELECTED_CONTROLLER(channel).buffer_index = 2048;
2148 SELECTED_CONTROLLER(channel).buffer_index = 0;
2149 SELECTED_CONTROLLER(channel).drq_index = 0;
2151 if (SELECTED_CONTROLLER(channel).byte_count > req_length)
2152 SELECTED_CONTROLLER(channel).byte_count = req_length;
2154 if (SELECTED_CONTROLLER(channel).byte_count > alloc_length)
2155 SELECTED_CONTROLLER(channel).byte_count = alloc_length;
2157 SELECTED_DRIVE(channel).atapi.command = command;
2158 SELECTED_DRIVE(channel).atapi.drq_bytes = SELECTED_CONTROLLER(channel).byte_count;
2159 SELECTED_DRIVE(channel).atapi.total_bytes_remaining = (req_length < alloc_length) ? req_length : alloc_length;
2162 // // bias drq_bytes and total_bytes_remaining
2163 // SELECTED_DRIVE(channel).atapi.drq_bytes += 2048;
2164 // SELECTED_DRIVE(channel).atapi.total_bytes_remaining += 2048;
2170 void rd_atapi_cmd_error(struct channel_t *channels, Bit8u channel, sense_t sense_key, asc_t asc)
2172 Ramdisk_Print("[rd_atapi_cmd_error]\n");
2173 Ramdisk_Print("Error: atapi_cmd_error channel=%02x key=%02x asc=%02x\n", channel, sense_key, asc);
2175 SELECTED_CONTROLLER(channel).error_register = sense_key << 4;
2176 SELECTED_CONTROLLER(channel).interrupt_reason.i_o = 1;
2177 SELECTED_CONTROLLER(channel).interrupt_reason.c_d = 1;
2178 SELECTED_CONTROLLER(channel).interrupt_reason.rel = 0;
2179 SELECTED_CONTROLLER(channel).status.busy = 0;
2180 SELECTED_CONTROLLER(channel).status.drive_ready = 1;
2181 SELECTED_CONTROLLER(channel).status.write_fault = 0;
2182 SELECTED_CONTROLLER(channel).status.drq = 0;
2183 SELECTED_CONTROLLER(channel).status.err = 1;
2185 SELECTED_DRIVE(channel).sense.sense_key = sense_key;
2186 SELECTED_DRIVE(channel).sense.asc = asc;
2187 SELECTED_DRIVE(channel).sense.ascq = 0;
2192 void rd_atapi_cmd_nop(struct channel_t *channels, Bit8u channel)
2194 Ramdisk_Print("[rd_atapi_cmd_nop]\n");
2195 SELECTED_CONTROLLER(channel).interrupt_reason.i_o = 1;
2196 SELECTED_CONTROLLER(channel).interrupt_reason.c_d = 1;
2197 SELECTED_CONTROLLER(channel).interrupt_reason.rel = 0;
2198 SELECTED_CONTROLLER(channel).status.busy = 0;
2199 SELECTED_CONTROLLER(channel).status.drive_ready = 1;
2200 SELECTED_CONTROLLER(channel).status.drq = 0;
2201 SELECTED_CONTROLLER(channel).status.err = 0;
2206 void rd_init_mode_sense_single(struct channel_t *channels,
2207 Bit8u channel, const void* src, int size)
2209 Ramdisk_Print("[rd_init_mode_sense_single]\n");
2211 SELECTED_CONTROLLER(channel).buffer[0] = (size+6) >> 8;
2212 SELECTED_CONTROLLER(channel).buffer[1] = (size+6) & 0xff;
2213 SELECTED_CONTROLLER(channel).buffer[2] = 0x70; // no media present
2214 SELECTED_CONTROLLER(channel).buffer[3] = 0; // reserved
2215 SELECTED_CONTROLLER(channel).buffer[4] = 0; // reserved
2216 SELECTED_CONTROLLER(channel).buffer[5] = 0; // reserved
2217 SELECTED_CONTROLLER(channel).buffer[6] = 0; // reserved
2218 SELECTED_CONTROLLER(channel).buffer[7] = 0; // reserved
2221 memcpy(SELECTED_CONTROLLER(channel).buffer + 8, src, size);
2226 void rd_ready_to_send_atapi(struct channel_t *channels, Bit8u channel)
2228 Ramdisk_Print("[rd_ready_to_send_atapi]\n");
2229 rd_raise_interrupt(ramdisk_state->channels, channel);
2234 void rd_command_aborted(struct channel_t *channels,
2235 Bit8u channel, unsigned value)
2237 Ramdisk_Print("[rd_command_aborted]\n");
2238 Ramdisk_Print("\t\taborting on command 0x%02x {%s}\n", value, SELECTED_TYPE_STRING(channel));
2239 SELECTED_CONTROLLER(channel).current_command = 0;
2240 SELECTED_CONTROLLER(channel).status.busy = 0;
2241 SELECTED_CONTROLLER(channel).status.drive_ready = 1;
2242 SELECTED_CONTROLLER(channel).status.err = 1;
2243 SELECTED_CONTROLLER(channel).error_register = 0x04; // command ABORTED
2244 SELECTED_CONTROLLER(channel).status.drq = 0;
2245 SELECTED_CONTROLLER(channel).status.seek_complete = 0;
2246 SELECTED_CONTROLLER(channel).status.corrected_data = 0;
2247 SELECTED_CONTROLLER(channel).buffer_index = 0;
2248 rd_raise_interrupt(ramdisk_state->channels, channel);
2252 static int ramdisk_init_device(struct vm_device *dev)
2254 struct ramdisk_t *ramdisk_state = (struct ramdisk_t *)dev->private_data;
2256 ramdisk_state->cops.init(ramdisk_state, dev);
2258 //hook ports IDE 0x170-0x177, 0x376 & 0x377
2259 dev_hook_io(dev, 0x170,
2260 (ramdisk_state->eops.read_port),
2261 (ramdisk_state->eops.write_port));
2263 dev_hook_io(dev, 0x171,
2264 (ramdisk_state->eops.read_port),
2265 (ramdisk_state->eops.write_port));
2267 dev_hook_io(dev, 0x172,
2268 (ramdisk_state->eops.read_port),
2269 (ramdisk_state->eops.write_port));
2271 dev_hook_io(dev, 0x173,
2272 (ramdisk_state->eops.read_port),
2273 (ramdisk_state->eops.write_port));
2275 dev_hook_io(dev, 0x174,
2276 (ramdisk_state->eops.read_port),
2277 (ramdisk_state->eops.write_port));
2279 dev_hook_io(dev, 0x175,
2280 (ramdisk_state->eops.read_port),
2281 (ramdisk_state->eops.write_port));
2283 dev_hook_io(dev, 0x176,
2284 (ramdisk_state->eops.read_port),
2285 (ramdisk_state->eops.write_port));
2287 dev_hook_io(dev, 0x177,
2288 (ramdisk_state->eops.read_port),
2289 (ramdisk_state->eops.write_port));
2291 dev_hook_io(dev, 0x376,
2292 (ramdisk_state->eops.read_port),
2293 (ramdisk_state->eops.write_port));
2295 dev_hook_io(dev, 0x377,
2296 (ramdisk_state->eops.read_port),
2297 (ramdisk_state->eops.write_port));
2299 //Debug ports: 0x3e8-0x3ef & 0x2e8-0x2ef
2301 #ifdef DEBUG_RAMDISK
2303 dev_hook_io(dev, 0x3e8,
2304 (ramdisk_state->eops.read_port_ignore),
2305 (ramdisk_state->eops.write_port_ignore));
2307 dev_hook_io(dev, 0x3e9,
2308 (ramdisk_state->eops.read_port_ignore),
2309 (ramdisk_state->eops.write_port_ignore));
2311 dev_hook_io(dev, 0x3ea,
2312 (ramdisk_state->eops.read_port_ignore),
2313 (ramdisk_state->eops.write_port_ignore));
2315 dev_hook_io(dev, 0x3eb,
2316 (ramdisk_state->eops.read_port_ignore),
2317 (ramdisk_state->eops.write_port_ignore));
2319 dev_hook_io(dev, 0x3ec,
2320 (ramdisk_state->eops.read_port_ignore),
2321 (ramdisk_state->eops.write_port_ignore));
2323 dev_hook_io(dev, 0x3ed,
2324 (ramdisk_state->eops.read_port_ignore),
2325 (ramdisk_state->eops.write_port_ignore));
2327 dev_hook_io(dev, 0x3ee,
2328 (ramdisk_state->eops.read_port_ignore),
2329 (ramdisk_state->eops.write_port_ignore));
2331 dev_hook_io(dev, 0x3ef,
2332 (ramdisk_state->eops.read_port_ignore),
2333 (ramdisk_state->eops.write_port_ignore));
2335 dev_hook_io(dev, 0x2e8,
2336 (ramdisk_state->eops.read_port_ignore),
2337 (ramdisk_state->eops.write_port_ignore));
2339 dev_hook_io(dev, 0x2e9,
2340 (ramdisk_state->eops.read_port_ignore),
2341 (ramdisk_state->eops.write_port_ignore));
2343 dev_hook_io(dev, 0x2ea,
2344 (ramdisk_state->eops.read_port_ignore),
2345 (ramdisk_state->eops.write_port_ignore));
2347 dev_hook_io(dev, 0x2eb,
2348 (ramdisk_state->eops.read_port_ignore),
2349 (ramdisk_state->eops.write_port_ignore));
2351 dev_hook_io(dev, 0x2ec,
2352 (ramdisk_state->eops.read_port_ignore),
2353 (ramdisk_state->eops.write_port_ignore));
2355 dev_hook_io(dev, 0x2ed,
2356 (ramdisk_state->eops.read_port_ignore),
2357 (ramdisk_state->eops.write_port_ignore));
2359 dev_hook_io(dev, 0x2ee,
2360 (ramdisk_state->eops.read_port_ignore),
2361 (ramdisk_state->eops.write_port_ignore));
2363 dev_hook_io(dev, 0x2ef,
2364 (ramdisk_state->eops.read_port_ignore),
2365 (ramdisk_state->eops.write_port_ignore));
2372 static int ramdisk_deinit_device(struct vm_device *dev)
2374 struct ramdisk_t *ramdisk_state = (struct ramdisk_t *)(dev->private_data);
2375 ramdisk_state->cops.close(ramdisk_state);
2380 static struct vm_device_ops dev_ops = {
2381 .init = ramdisk_init_device,
2382 .deinit = ramdisk_deinit_device,
2391 * Success: return 0;
2392 * Failure: return integer greater than 0
2396 struct ramdisk_t * create_ramdisk()
2398 struct ramdisk_t *ramdisk;
2399 ramdisk = (struct ramdisk_t *)V3_Malloc(sizeof(struct ramdisk_t));
2400 V3_ASSERT(ramdisk != NULL);
2402 ramdisk->cops.init = &rd_init_harddrive;
2403 ramdisk->cops.close = &rd_close_harddrive;
2404 ramdisk->cops.reset = &rd_reset_harddrive;
2406 ramdisk->eops.read_port = &ramdisk_read_port;
2407 ramdisk->eops.write_port = &ramdisk_write_port;
2408 ramdisk->eops.read_port_ignore = &ramdisk_read_port_ignore;
2409 ramdisk->eops.write_port_ignore = &ramdisk_write_port_ignore;
2417 struct vm_device *create_ramdisk()
2420 struct ramdisk_t *ramdisk;
2421 ramdisk = (struct ramdisk_t *)V3_Malloc(sizeof(struct ramdisk_t));
2422 V3_ASSERT(ramdisk != NULL);
2424 Ramdisk_Print("[create_ramdisk]\n");
2425 ramdisk->cops.init = &rd_init_harddrive;
2426 ramdisk->cops.close = &rd_close_harddrive;
2427 ramdisk->cops.reset = &rd_reset_harddrive;
2429 ramdisk->eops.read_port = &ramdisk_read_port;
2430 ramdisk->eops.write_port = &ramdisk_write_port;
2431 ramdisk->eops.read_port_ignore = &ramdisk_read_port_ignore;
2432 ramdisk->eops.write_port_ignore = &ramdisk_write_port_ignore;
2434 struct vm_device *device = create_device("RAMDISK", &dev_ops, ramdisk);