#undef PrintDebug
#define PrintDebug(fmt, args...)
#endif
-
+
+
+
+
/*
* Data type definitions
#define SEC_ADDR_REG_PORT 0x377
-
-
-
#define PACKET_SIZE 12
-/*
- * Debug facilities
- */
-
-#define ATA_DETECT 0xf0 //0X3E8
-#define ATA_RESET 0xf1 //0X3E9
-#define ATA_CMD_DATA_IN 0xf2 //0X3EA
-#define ATA_CMD_DATA_OUT 0xf3 //0X3EB
-#define ATA_CMD_PACKET 0xf4 //0X3EC
-#define ATAPI_GET_SENSE 0xf5 //0X3ED
-#define ATAPI_IS_READY 0xf6 //0X3EE
-#define ATAPI_IS_CDROM 0xf7 //0X3EF
-
-#define CDEMU_INIT 0xf8 //0X2E8
-#define CDEMU_ISACTIVE 0xf9 //0X2E9
-#define CDEMU_EMULATED_DRIVE 0xfa //0X2EA
-#define CDROM_BOOT 0xfb //0X2EB
-
-
-#define HARD_DRIVE_POST 0xfc //0X2EC
-
-
-#define ATA_DEVICE_NO 0xfd //0X2ED
-#define ATA_DEVICE_TYPE 0xfe //0X2ED
-
-#define INT13_HARDDISK 0xff //0x2ef
-#define INT13_CDROM 0xe0 //0x2f8
-#define INT13_CDEMU 0xe1 //0x2f9
-#define INT13_ELTORITO 0xe2 //0x2fa
-#define INT13_DISKETTE_FUNCTION 0xe3 //0x2fb
-
-
-
static const char cdrom_str[] = "CD-ROM";
static const char harddisk_str[] = "HARDDISK";
controller = &(drive->controller);
- PrintTrace("[read_data_handler] IO Read at 0x%x, on drive %d/%d (current_cmd = 0x%02x)\n",
+ PrintTrace("[read_data_handler] IO Read at 0x%x, on drive %d/%d current cmd=0x%x\n",
port,
get_channel_no(ramdisk, channel),
- get_drive_no(channel, drive),
+ get_drive_no(channel, drive),
controller->current_command);
switch (controller->current_command) {
drive = get_selected_drive(channel);
controller = &(drive->controller);
+
PrintDebug("[write_data_handler] IO write at 0x%x, current_cmd = 0x%02x\n",
- port, controller->current_command);
-
+ port, controller->current_command);
+
+
+
+ //PrintDebug("[write_data_handler]\n");
switch (controller->current_command) {
case 0x30: // WRITE SECTORS
PrintError("\t\tneed to implement 0x30(write sector) to port 0x%x\n", port);
return -1;
}
+
+
+ return -1;
}
struct controller_t * controller = NULL;
- if (length != 1) {
- PrintError("Invalid Status port read length: %d (port=%d)\n", length, port);
- return -1;
- }
+
if (is_primary_port(ramdisk, port)) {
channel = &(ramdisk->channels[0]);
drive = get_selected_drive(channel);
controller = &(drive->controller);
+
PrintDebug("[read_status_handler] IO read at 0x%x, on drive %d/%d\n",
port, get_channel_no(ramdisk, channel),
channel->drive_select);
(controller->status.corrected_data << 2) |
(controller->status.index_pulse << 1) |
(controller->status.err) );
-
+
+
memcpy(dst, &val, length);
controller->status.index_pulse_count++;
rd_lower_irq(dev, channel);
}
+ PrintDebug("\t\tRead STATUS = 0x%x\n", *(uchar_t *)dst);
+
return length;
}
prev_control_reset = controller->control.reset;
+
+ if (value & 0x04) {
+ PrintDebug("RESET Signaled\n");
+ }
+
master_drive->controller.control.reset = value & 0x04;
slave_drive->controller.control.reset = value & 0x04;
controller->status.err = 0;
+ PrintDebug("\t\tRead FEATURES = 0x%x\n", val);
+
*(uchar_t *)dst = val;
return length;
case SEC_SECT_CNT_PORT: // hard disk sector count / interrupt reason 0x1f2
{
uchar_t val = (drive->device_type == IDE_NONE) ? 0 : controller->sector_count;
-
+ PrintDebug("\t\tRead SECTOR COUNT = 0x%x\n", val);
*(uchar_t *)dst = val;
return length;
}
case PRI_SECT_ADDR1_PORT:
case SEC_SECT_ADDR1_PORT: // sector number 0x1f3
- {
+ {
uchar_t val = (drive->device_type == IDE_NONE) ? 0 : controller->sector_no;
+ PrintDebug("\t\tRead SECTOR ADDR1 = 0x%x\n", val);
+
*(uchar_t *)dst = val;
return length;
// to detect the disks.... minix2 for example
uchar_t val = (num_drives_on_channel(channel) == 0) ? 0 : (controller->cylinder_no & 0x00ff);
+ PrintDebug("\t\tRead SECTOR ADDR2 = 0x%x\n", val);
+
*(uchar_t *)dst = val;
return length;
// to detect the disks.... minix2 for example
uchar_t val = (num_drives_on_channel(channel) == 0) ? 0 : (controller->cylinder_no >> 8);
+ PrintDebug("\t\tRead SECTOR ADDR3 = 0x%x\n", val);
+
*(uchar_t *)dst = val;
return length;
(channel->drive_select << 4) |
(controller->head_no << 0));
+ PrintDebug("\t\tRead DRIVE SELECT = 0x%x\n", val);
*(uchar_t *)dst = val;
return length;
PrintDebug("[write_general_handler] IO write to port %x (val=0x%02x), channel = %d\n",
- port, value, get_channel_no(ramdisk, channel));
+ port, value, get_channel_no(ramdisk, channel));
switch (port) {
case 0x43: // read toc
{
if (drive->cdrom.ready) {
- int toc_length;
+ int toc_length = 0;
bool msf = (controller->buffer[1] >> 1) & 1;
uint8_t starting_track = controller->buffer[6];
uint8_t format = (controller->buffer[9] >> 6);
int i;
+
+ PrintDebug("Reading CDROM TOC: Format=%d (byte count=%d) (toc length:%d)\n",
+ format, controller->byte_count, toc_length);
+
switch (format) {
case 0:
{
rd_raise_interrupt(dev, channel);
break;
}
+
if (rd_init_send_atapi_command(dev, channel, atapi_command, toc_length, alloc_length, false) == -1) {
PrintError("Failed to init send atapi command in read toc (fmt=%d)\n", format);
return -1;
}
-
- rd_ready_to_send_atapi(dev, channel);
-
+
+ rd_ready_to_send_atapi(dev, channel);
+
break;
- }
+ }
case 1:
// multi session stuff. we ignore this and emulate a single session only
+
if (rd_init_send_atapi_command(dev, channel, atapi_command, 12, alloc_length, false) == -1) {
PrintError("Failed to init send atapi command in read toc (fmt=%d)\n", format);
return -1;
rd_raise_interrupt(dev, channel);
}
break;
- }
+ }
case 0x28: // read (10)
case 0xa8: // read (12)
{
break;
}
}
+
+
return 0;
}
!(alloc_length <= controller->byte_count)) {
PrintDebug("\t\tOdd byte count (0x%04x) to ATAPI command 0x%02x, using 0x%x\n",
- controller->byte_count,
- command,
- controller->byte_count - 1);
+ controller->byte_count,
+ command,
+ controller->byte_count - 1);
controller->byte_count -= 1;
}
- void rd_ready_to_send_atapi(struct vm_device * dev, struct channel_t * channel) {
+void rd_ready_to_send_atapi(struct vm_device * dev, struct channel_t * channel) {
PrintDebug("[rd_ready_to_send_atapi]\n");
-
+
rd_raise_interrupt(dev, channel);
}
return;
}
-#if 0
-static void trace_info(ushort_t port, void *src, uint_t length) {
-
- switch(port){
-
- case 0x3e8:
- if (length == 1 && *((uchar_t*) src) == ATA_DETECT)
- PrintDebug("ata_detect()\n");
- break;
-
- case 0x3e9:
- if (length == 1 && *((uchar_t*) src) == ATA_RESET)
- PrintDebug("ata_reset()\n");
- break;
-
- case 0x3ea:
- if (length == 1 && *((uchar_t*) src) == ATA_CMD_DATA_IN)
- PrintDebug("ata_cmd_data_in()\n");
- break;
-
- case 0x3eb:
- if (length == 1 && *((uchar_t*) src) == ATA_CMD_DATA_OUT)
- PrintDebug("ata_cmd_data_out()\n");
- break;
-
- case 0x3ec:
- if (length == 1 && *((uchar_t*) src) == ATA_CMD_PACKET)
- PrintDebug("ata_cmd_packet()\n");
- break;
-
- case 0x3ed:
- if (length == 1 && *((uchar_t*) src) == ATAPI_GET_SENSE)
- PrintDebug("atapi_get_sense()\n");
- break;
-
- case 0x3ee:
- if (length == 1 && *((uchar_t*) src) == ATAPI_IS_READY)
- PrintDebug("atapi_is_ready()\n");
- break;
-
- case 0x3ef:
- if (length == 1 && *((uchar_t*) src) == ATAPI_IS_CDROM)
- PrintDebug("atapi_is_cdrom()\n");
- break;
-
-
- case 0x2e8:
- if (length == 1 && *((uchar_t*) src) == CDEMU_INIT)
- PrintDebug("cdemu_init()\n");
- break;
-
- case 0x2e9:
- if (length == 1 && *((uchar_t*) src) == CDEMU_ISACTIVE)
- PrintDebug("cdemu_isactive()\n");
- break;
-
- case 0x2ea:
- if (length == 1 && *((uchar_t*) src) == CDEMU_EMULATED_DRIVE)
- PrintDebug("cdemu_emulated_drive()\n");
- break;
-
- case 0x2eb:
- if (length == 1 && *((uchar_t*) src) == CDROM_BOOT)
- PrintDebug("cdrom_boot()\n");
- break;
-
- case 0x2ec:
- if (length == 1 && *((uchar_t*) src) == HARD_DRIVE_POST)
- PrintDebug("ata_hard_drive_post()\n");
- break;
-
- case 0x2ed:
- if (length == 1)
- PrintDebug("ata_device_no(%d)\n", *((uchar_t*) src));
- break;
-
- case 0x2ee:
- if (length == 1)
- PrintDebug("ata_device_type(%d)\n", *((uchar_t*) src));
- break;
-
- case 0x2ef:
- if (length == 1 && *((uchar_t*) src) == INT13_HARDDISK)
- PrintDebug("int13_harddrive()\n");
- break;
-
- case 0x2f8:
- if (length == 1 && *((uchar_t*) src) == INT13_CDROM)
- PrintDebug("int13_cdrom()\n");
- break;
- case 0x2f9:
- if (length == 1 && *((uchar_t*) src) == INT13_CDEMU)
- PrintDebug("int13_cdemu()\n");
- break;
-
- case 0x2fa:
- if (length == 1 && *((uchar_t*) src) == INT13_ELTORITO)
- PrintDebug("int13_eltorito()\n");
- break;
-
- case 0x2fb:
- if (length == 1 && *((uchar_t*) src) == INT13_DISKETTE_FUNCTION)
- PrintDebug("int13_diskette_function()\n");
- break;
-
-
- default:
- break;
- }
-}
-
-#endif
static int check_bit_fields(struct controller_t * controller) {