4 * Copyright (C) 2002 MandrakeSoft S.A.
9 * http://www.linux-mandrake.com/
10 * http://www.mandrakesoft.com/
12 * This library is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU Lesser General Public
14 * License as published by the Free Software Foundation; either
15 * version 2 of the License, or (at your option) any later version.
17 * This library is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20 * Lesser General Public License for more details.
22 * You should have received a copy of the GNU Lesser General Public
23 * License along with this library; if not, write to the Free Software
24 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
26 * Major modifications made for the V3VEE project
28 * The V3VEE Project is a joint project between Northwestern University
29 * and the University of New Mexico. You can find out more at
30 * http://www.v3vee.org
32 * Copyright (c) 2008, Zheng Cui <cuizheng@cs.unm.edu>
33 * Copyright (c) 2008, Jack Lange <jarusl@cs.northwestern.edu>
34 * Copyright (c) 2008, The V3VEE Project <http://www.v3vee.org>
35 * All rights reserved for original changes
40 #include <devices/ramdisk.h>
41 #include <palacios/vmm.h>
45 #define Ramdisk_Print(_f, _a...) PrintTrace("\nramdisk.c(%d) " _f, __LINE__, ## _a)
47 #define Ramdisk_Print(_f, _a...)
50 #define RD_PANIC(_f, _a...) \
52 PrintDebug("ramdisk.c(%d) " _f, __LINE__, ## _a); \
57 #define RD_ERROR(_f, _a...) PrintTrace("\nramdisk.c(%d) " _f, __LINE__, ## _a)
63 #define ATA_DETECT 0xf0 //0X3E8
64 #define ATA_RESET 0xf1 //0X3E9
65 #define ATA_CMD_DATA_IN 0xf2 //0X3EA
66 #define ATA_CMD_DATA_OUT 0xf3 //0X3EB
67 #define ATA_CMD_PACKET 0xf4 //0X3EC
68 #define ATAPI_GET_SENSE 0xf5 //0X3ED
69 #define ATAPI_IS_READY 0xf6 //0X3EE
70 #define ATAPI_IS_CDROM 0xf7 //0X3EF
72 #define CDEMU_INIT 0xf8 //0X2E8
73 #define CDEMU_ISACTIVE 0xf9 //0X2E9
74 #define CDEMU_EMULATED_DRIVE 0xfa //0X2EA
75 #define CDROM_BOOT 0xfb //0X2EB
78 #define HARD_DRIVE_POST 0xfc //0X2EC
81 #define ATA_DEVICE_NO 0xfd //0X2ED
82 #define ATA_DEVICE_TYPE 0xfe //0X2ED
84 #define INT13_HARDDISK 0xff //0x2ef
85 #define INT13_CDROM 0xe0 //0x2f8
86 #define INT13_CDEMU 0xe1 //0x2f9
87 #define INT13_ELTORITO 0xe2 //0x2fa
88 #define INT13_DISKETTE_FUNCTION 0xe3 //0x2fb
90 // some packet handling macros
91 #define EXTRACT_FIELD(arr,byte,start,num_bits) (((arr)[(byte)] >> (start)) & ((1 << (num_bits)) - 1))
92 #define get_packet_field(c,b,s,n) (EXTRACT_FIELD((SELECTED_CONTROLLER((c)).buffer),(b),(s),(n)))
93 #define get_packet_byte(c,b) (SELECTED_CONTROLLER((c)).buffer[(b)])
94 #define get_packet_word(c,b) (((uint16)SELECTED_CONTROLLER((c)).buffer[(b)] << 8) | SELECTED_CONTROLLER((c)).buffer[(b)+1])
97 #define CONTROLLER(c,a) (channels[(c)].drives[(a)]).controller
98 #define DRIVE(c,a) (channels[(c)].drives[(a)])
99 #define SELECTED_CONTROLLER(c) (CONTROLLER((c), channels[(c)].drive_select))
100 #define SELECTED_DRIVE(c) (DRIVE((c), channels[(c)].drive_select))
103 #define DRIVE_IS_PRESENT(c,a) (channels[(c)].drives[(a)].device_type != IDE_NONE)
104 #define DRIVE_IS_HD(c,a) (channels[(c)].drives[(a)].device_type == IDE_DISK)
105 #define DRIVE_IS_CD(c,a) (channels[(c)].drives[(a)].device_type == IDE_CDROM)
106 #define SELECTED_MODEL(c) (channels[(c)].drives[channels[(c)].drive_select].model_no)
108 #define MASTER_SELECTED(c) (!channels[(c)].drive_select)
109 #define SLAVE_SELECTED(c) (channels[(c)].drive_select)
111 #define SELECTED_IS_PRESENT(c) (DRIVE_IS_PRESENT((c),SLAVE_SELECTED((c))))
112 #define SELECTED_IS_HD(c) (DRIVE_IS_HD((c),SLAVE_SELECTED((c))))
113 #define SELECTED_IS_CD(c) (DRIVE_IS_CD((c),SLAVE_SELECTED((c))))
115 #define ANY_IS_PRESENT(c) (DRIVE_IS_PRESENT((c),0) || DRIVE_IS_PRESENT((c),1))
116 #define SELECTED_TYPE_STRING(channel) ((SELECTED_IS_CD(channel)) ? "CD-ROM" : "NONE")
118 #define WRITE_FEATURES(c,a) do { uint8 _a = a; CONTROLLER((c),0).features = _a; CONTROLLER((c),1).features = _a; } while(0)
119 #define WRITE_SECTOR_COUNT(c,a) do { uint8 _a = a; CONTROLLER((c),0).sector_count = _a; CONTROLLER((c),1).sector_count = _a; } while(0)
120 #define WRITE_SECTOR_NUMBER(c,a) do { uint8 _a = a; CONTROLLER((c),0).sector_no = _a; CONTROLLER((c),1).sector_no = _a; } while(0)
121 #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)
122 #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)
123 #define WRITE_HEAD_NO(c,a) do { uint8 _a = a; CONTROLLER((c),0).head_no = _a; CONTROLLER((c),1).head_no = _a; } while(0)
124 #define WRITE_LBA_MODE(c,a) do { uint8 _a = a; CONTROLLER((c),0).lba_mode = _a; CONTROLLER((c),1).lba_mode = _a; } while(0)
128 #define GOTO_RETURN_VALUE if(io_len==4){\
129 goto return_value32;\
132 value16=(Bit16u)value32;\
133 goto return_value16;\
136 value8=(Bit8u)value32;\
140 #define UNUSED(x) ((void)x)
142 #define PACKET_SIZE 12
144 static struct ramdisk_t *ramdisk_state;
151 ////////////////////////////////////////////////////////////////////////////
158 uint_t ramdisk_read_port(ushort_t port,
161 struct vm_device *dev);
164 uint_t ramdisk_write_port(ushort_t port,
167 struct vm_device *dev);
170 uint_t ramdisk_read_port_ignore(ushort_t port,
173 struct vm_device *dev);
176 uint_t ramdisk_write_port_ignore(ushort_t port,
179 struct vm_device *dev);
183 Bit32u rd_read_handler(struct channel_t *channels, Bit32u address, unsigned io_len);
186 void rd_write_handler(struct channel_t *channels, Bit32u address,
187 Bit32u value, unsigned io_len);
196 void rd_identify_ATAPI_drive(struct channel_t *channels, Bit8u channel);
200 void rd_init_send_atapi_command(struct channel_t *channels, Bit8u channel, Bit8u command, int req_length, int alloc_length, bool lazy /*= false*/);
203 void rd_ready_to_send_atapi(struct channel_t *channels, Bit8u channel);
207 void rd_atapi_cmd_error(struct channel_t *channels, Bit8u channel, sense_t sense_key, asc_t asc);
210 void rd_init_mode_sense_single(struct channel_t *channels, Bit8u channel, const void* src, int size);
213 void rd_atapi_cmd_nop(struct channel_t *channels, Bit8u channel);
216 void rd_command_aborted(struct channel_t *channels, Bit8u channel, unsigned value);
224 void rd_raise_interrupt(struct channel_t *channels, Bit8u channel);
227 void rd_lower_irq(struct vm_device *dev, Bit32u irq);
235 uint16 rd_read_16bit(const uint8* buf)
237 return (buf[0] << 8) | buf[1];
242 uint32 rd_read_32bit(const uint8* buf)
244 return (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
247 ////////////////////////////////////////////////////////////////////
250 void rd_print_state(struct ramdisk_t *ramdisk,
251 struct vm_device *dev)
252 //Bit32u rd_init_harddrive(struct channel_t *channels)
257 struct channel_t *channels = (struct channel_t *)(&(ramdisk->channels));
259 for (channel = 0; channel < MAX_ATA_CHANNEL; channel++)
260 memset((char *)(channels + channel), 0, sizeof(struct channel_t));
262 Ramdisk_Print("sizeof(*channels) = %d\n", sizeof((*channels)));
263 Ramdisk_Print("sizeof(channles->drives[0].controller) = %d\n", sizeof((channels->drives[0].controller)));
264 Ramdisk_Print("sizeof(channles->drives[0].cdrom) = %d\n", sizeof((channels->drives[0].cdrom)));
265 Ramdisk_Print("sizeof(channles->drives[0].sense) = %d\n", sizeof((channels->drives[0].sense)));
266 Ramdisk_Print("sizeof(channles->drives[0].atapi) = %d\n", sizeof((channels->drives[0].atapi)));
269 Ramdisk_Print("sizeof(channles->drives[0].controller.status) = %d\n", sizeof((channels->drives[0].controller.status)));
270 Ramdisk_Print("sizeof(channles->drives[0].controller.sector_count) = %d\n", sizeof((channels->drives[0].controller.sector_count)));
271 Ramdisk_Print("sizeof(channles->drives[0].controller.interrupt_reason) = %d\n", sizeof((channels->drives[0].controller.interrupt_reason)));
273 Ramdisk_Print("sizeof(channles->drives[0].controller.cylinder_no) = %d\n", sizeof((channels->drives[0].controller.cylinder_no)));
274 Ramdisk_Print("sizeof(channles->drives[0].controller.byte_count) = %d\n", sizeof((channels->drives[0].controller.byte_count)));
277 Ramdisk_Print("sizeof(channles->drives[0].controller.control) = %d\n", sizeof((channels->drives[0].controller.control)));
280 for (channel = 0; channel < MAX_ATA_CHANNEL; channel++){
282 for (device = 0; device < 2; device++){
284 // Initialize controller state, even if device is not present
285 Ramdisk_Print("channels[%d].drives[%d].controller.status.busy = %d\n",channel, device, channels[channel].drives[device].controller.status.busy);
286 Ramdisk_Print("channels[%d].drives[%d].controller.status.drive_ready = %d\n", channel, device, channels[channel].drives[device].controller.status.drive_ready);
287 Ramdisk_Print("channels[%d].drives[%d].controller.status.write_fault = %d\n", channel, device, channels[channel].drives[device].controller.status.write_fault);
288 Ramdisk_Print("channels[%d].drives[%d].controller.status.seek_complete = %d\n", channel, device, channels[channel].drives[device].controller.status.seek_complete);
289 Ramdisk_Print("channels[%d].drives[%d].controller.status.drq = %d\n", channel, device, channels[channel].drives[device].controller.status.drq);
290 Ramdisk_Print("channels[%d].drives[%d].controller.status.corrected_data = %d\n", channel, device, channels[channel].drives[device].controller.status.corrected_data);
291 Ramdisk_Print("channels[%d].drives[%d].controller.status.index_pulse = %d\n", channel, device, channels[channel].drives[device].controller.status.index_pulse);
292 Ramdisk_Print("channels[%d].drives[%d].controller.status.index_pulse_count = %d\n", channel, device, channels[channel].drives[device].controller.status.index_pulse_count);
293 Ramdisk_Print("channels[%d].drives[%d].controller.status.err = %d\n", channel, device, channels[channel].drives[device].controller.status.err);
296 Ramdisk_Print("channels[%d].drives[%d].controller.error_register = %d\n", channel, device, channels[channel].drives[device].controller.error_register);
297 Ramdisk_Print("channels[%d].drives[%d].controller.head_no = %d\n", channel, device, channels[channel].drives[device].controller.head_no);
298 Ramdisk_Print("channels[%d].drives[%d].controller.sector_count = %d\n", channel, device, channels[channel].drives[device].controller.sector_count);
299 Ramdisk_Print("channels[%d].drives[%d].controller.sector_no = %d\n", channel, device, channels[channel].drives[device].controller.sector_no);
300 Ramdisk_Print("channels[%d].drives[%d].controller.cylinder_no = %d\n", channel, device, channels[channel].drives[device].controller.cylinder_no);
301 Ramdisk_Print("channels[%d].drives[%d].controller.current_command = %02x\n", channel, device, channels[channel].drives[device].controller.current_command);
302 Ramdisk_Print("channels[%d].drives[%d].controller.buffer_index = %d\n", channel, device, channels[channel].drives[device].controller.buffer_index);
305 Ramdisk_Print("channels[%d].drives[%d].controller.control.reset = %d\n", channel, device, channels[channel].drives[device].controller.control.reset);
306 Ramdisk_Print("channels[%d].drives[%d].controller.control.disable_irq = %d\n", channel, device, channels[channel].drives[device].controller.control.disable_irq);
309 Ramdisk_Print("channels[%d].drives[%d].controller.reset_in_progress = %d\n", channel, device, channels[channel].drives[device].controller.reset_in_progress);
310 Ramdisk_Print("channels[%d].drives[%d].controller.sectors_per_block = %02x\n", channel, device, channels[channel].drives[device].controller.sectors_per_block);
311 Ramdisk_Print("channels[%d].drives[%d].controller.lba_mode = %d\n", channel, device, channels[channel].drives[device].controller.lba_mode);
312 Ramdisk_Print("channels[%d].drives[%d].controller.features = %d\n", channel, device, channels[channel].drives[device].controller.features);
315 Ramdisk_Print("channels[%d].drives[%d].model_no = %s\n", channel, device, channels[channel].drives[device].model_no);
316 Ramdisk_Print("channels[%d].drives[%d].device_type = %d\n", channel, device, channels[channel].drives[device].device_type);
317 Ramdisk_Print("channels[%d].drives[%d].cdrom.locked = %d\n", channel, device, channels[channel].drives[device].cdrom.locked);
318 Ramdisk_Print("channels[%d].drives[%d].sense.sense_key = %d\n", channel, device, channels[channel].drives[device].sense.sense_key);
319 Ramdisk_Print("channels[%d].drives[%d].sense.asc = %d\n", channel, device, channels[channel].drives[device].sense.asc);
320 Ramdisk_Print("channels[%d].drives[%d].sense.ascq = %d\n", channel, device, channels[channel].drives[device].sense.ascq);
324 Ramdisk_Print("channels[%d].drives[%d].controller.interrupt_reason.c_d = %02x\n", channel, device, channels[channel].drives[device].controller.interrupt_reason.c_d);
326 Ramdisk_Print("channels[%d].drives[%d].controller.interrupt_reason.i_o = %02x\n", channel, device, channels[channel].drives[device].controller.interrupt_reason.i_o);
328 Ramdisk_Print("channels[%d].drives[%d].controller.interrupt_reason.rel = %02x\n", channel, device, channels[channel].drives[device].controller.interrupt_reason.rel);
330 Ramdisk_Print("channels[%d].drives[%d].controller.interrupt_reason.tag = %02x\n", channel, device, channels[channel].drives[device].controller.interrupt_reason.tag);
332 Ramdisk_Print("channels[%d].drives[%d].cdrom.ready = %d\n", channel, device, channels[channel].drives[device].cdrom.ready);
341 Bit32u rd_init_harddrive(struct ramdisk_t *ramdisk,
342 struct vm_device *dev)
348 struct channel_t *channels = (struct channel_t *)(&(ramdisk->channels));
350 Ramdisk_Print("[rd_init_harddrive]\n");
351 for (channel = 0; channel < MAX_ATA_CHANNEL; channel++)
352 memset((char *)(channels + channel), 0, sizeof(struct channel_t));
355 for (channel = 0; channel < MAX_ATA_CHANNEL; channel++){
357 channels[channel].ioaddr1 = 0x0;
358 channels[channel].ioaddr2 = 0x0;
359 channels[channel].irq = 0;
361 for (device = 0; device < 2; device++){
364 CONTROLLER(channel,device).status.busy = 0;
365 CONTROLLER(channel,device).status.drive_ready = 1;
366 CONTROLLER(channel,device).status.write_fault = 0;
367 CONTROLLER(channel,device).status.seek_complete = 1;
368 CONTROLLER(channel,device).status.drq = 0;
369 CONTROLLER(channel,device).status.corrected_data = 0;
370 CONTROLLER(channel,device).status.index_pulse = 0;
371 CONTROLLER(channel,device).status.index_pulse_count = 0;
372 CONTROLLER(channel,device).status.err = 0;
374 CONTROLLER(channel,device).error_register = 0x01; // diagnostic code: no error
375 CONTROLLER(channel,device).head_no = 0;
376 CONTROLLER(channel,device).sector_count = 1;
377 CONTROLLER(channel,device).sector_no = 1;
378 CONTROLLER(channel,device).cylinder_no = 0;
379 CONTROLLER(channel,device).current_command = 0x00;
380 CONTROLLER(channel,device).buffer_index = 0;
382 CONTROLLER(channel,device).control.reset = 0;
383 CONTROLLER(channel,device).control.disable_irq = 0;
384 CONTROLLER(channel,device).reset_in_progress = 0;
386 CONTROLLER(channel,device).sectors_per_block = 0x80;
387 CONTROLLER(channel,device).lba_mode = 0;
389 CONTROLLER(channel,device).features = 0;
392 channels[channel].drives[device].device_type = IDE_NONE;
395 strncpy((char*)channels[channel].drives[device].model_no,
397 while(strlen((char *)channels[channel].drives[device].model_no) < 40) {
398 strcat ((char*)channels[channel].drives[device].model_no, " ");
401 // Ramdisk_Print("channels[%d].drives[%d].controller.current_command = %02x\n", channel, device, channels[channel].drives[device].controller.current_command);
402 // Ramdisk_Print("channels[%d].drives[%d].controller.interrupt_reason.c_d = %02x\n", channel, device, channels[channel].drives[device].controller.interrupt_reason.c_d);
404 // Ramdisk_Print("channels[%d].drives[%d].controller.interrupt_reason.i_o = %02x\n", channel, device, channels[channel].drives[device].controller.interrupt_reason.i_o);
406 // Ramdisk_Print("channels[%d].drives[%d].controller.interrupt_reason.rel = %02x\n", channel, device, channels[channel].drives[device].controller.interrupt_reason.rel);
408 // Ramdisk_Print("channels[%d].drives[%d].controller.interrupt_reason.tag = %02x\n", channel, device, channels[channel].drives[device].controller.interrupt_reason.tag);
410 // Ramdisk_Print("channels[%d].drives[%d].controller.control.disable_irq = %d\n", channel, device, channels[channel].drives[device].controller.control.disable_irq);
416 channels[channel].ioaddr1 = 0x170;
417 channels[channel].ioaddr2 = 0x370;
418 channels[channel].irq = 15;
419 channels[channel].drive_select = 0;
423 strncpy((char*)channels[channel].drives[device].model_no,
424 "Zheng's Ramdisk", 40);
425 while (strlen((char *)channels[channel].drives[device].model_no) < 40) {
426 strcat ((char*)channels[channel].drives[device].model_no, " ");
429 Ramdisk_Print("CDROM on target %d/%d\n", channel, device);
431 channels[channel].drives[device].device_type = IDE_CDROM;
432 channels[channel].drives[device].cdrom.locked = 0;
433 channels[channel].drives[device].sense.sense_key = SENSE_NONE;
434 channels[channel].drives[device].sense.asc = 0;
435 channels[channel].drives[device].sense.ascq = 0;
439 channels[channel].drives[device].controller.sector_count = 0;
440 channels[channel].drives[device].controller.interrupt_reason.c_d = 1;
441 if (channels[channel].drives[device].controller.sector_count != 0x01) {
442 Ramdisk_Print("interrupt reason bit field error\n");
443 return INTR_REASON_BIT_ERR;
446 channels[channel].drives[device].controller.sector_count = 0;
447 channels[channel].drives[device].controller.interrupt_reason.i_o = 1;
448 if (channels[channel].drives[device].controller.sector_count != 0x02) {
449 Ramdisk_Print("interrupt reason bit field error\n");
450 return INTR_REASON_BIT_ERR;
453 channels[channel].drives[device].controller.sector_count = 0;
454 channels[channel].drives[device].controller.interrupt_reason.rel = 1;
455 if (channels[channel].drives[device].controller.sector_count != 0x04) {
456 Ramdisk_Print("interrupt reason bit field error\n");
457 return INTR_REASON_BIT_ERR;
460 channels[channel].drives[device].controller.sector_count = 0;
461 channels[channel].drives[device].controller.interrupt_reason.tag = 3;
462 if (channels[channel].drives[device].controller.sector_count != 0x18) {
463 Ramdisk_Print("interrupt reason bit field error\n");
464 return INTR_REASON_BIT_ERR;
468 channels[channel].drives[device].controller.sector_count = 0;
470 // allocate low level driver
471 channels[channel].drives[device].cdrom.cd = (struct cdrom_interface*)V3_Malloc(sizeof(struct cdrom_interface));
472 Ramdisk_Print("cd = %x\n", channels[channel].drives[device].cdrom.cd);
473 V3_ASSERT(channels[channel].drives[device].cdrom.cd != NULL);
475 struct cdrom_interface *cdif = channels[channel].drives[device].cdrom.cd;
476 memset(cdif, 0, sizeof(struct cdrom_interface));
478 cdif->ops.init(cdif);
480 Ramdisk_Print("\t\tCD on ata%d-%d: '%s'\n",channel, device, "");
482 if((channels[channel].drives[device].cdrom.cd->ops).insert_cdrom(cdif, NULL)) {
483 Ramdisk_Print("\t\tMedia present in CD-ROM drive\n");
484 channels[channel].drives[device].cdrom.ready = 1;
485 channels[channel].drives[device].cdrom.capacity = channels[channel].drives[device].cdrom.cd->ops.capacity(cdif);
487 Ramdisk_Print("\t\tCould not locate CD-ROM, continuing with media not present\n");
488 channels[channel].drives[device].cdrom.ready = 0;
496 ramdisk->private_data = dev;
497 ramdisk_state = ramdisk;
498 Ramdisk_Print("ramdisk_state = %x\n", ramdisk_state);
499 Ramdisk_Print("ramdisk = %x\n", ramdisk);
500 // rd_print_state(ramdisk, dev);
505 void rd_reset_harddrive(struct ramdisk_t *ramdisk, unsigned type)
511 void rd_close_harddrive(struct ramdisk_t *ramdisk)
517 ////////////////////////////////////////////////////////////////////
521 Bit32u rd_read_handler(struct channel_t *channels, Bit32u address, unsigned io_len)
527 unsigned drive_select;
529 unsigned increment = 0;
531 Bit8u channel = MAX_ATA_CHANNEL;
532 Bit32u port = 0xff; // undefined
534 Ramdisk_Print("[rd_read_handler]\n");
536 for (channel=0; channel<MAX_ATA_CHANNEL; channel++) {
537 if ((address & 0xfff8) == channels[channel].ioaddr1) {
538 port = address - channels[channel].ioaddr1;
541 else if ((address & 0xfff8) == channels[channel].ioaddr2) {
542 port = address - channels[channel].ioaddr2 + 0x10;
547 if (channel == MAX_ATA_CHANNEL) {
548 if ((address < 0x03f6) || (address > 0x03f7)) {
549 RD_PANIC("Error: read: unable to find ATA channel, ioport=0x%04x\n", address);
553 port = address - 0x03e0;
557 drive_select = channels[channel].drive_select;
559 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);
565 struct cdrom_interface *cdif = channels[channel].drives[drive_select].cdrom.cd;
568 case 0x00: // hard disk data (16bit) 0x1f0
570 switch (SELECTED_CONTROLLER(channel).current_command) {
571 case 0xec: // IDENTIFY DEVICE
575 SELECTED_CONTROLLER(channel).status.busy = 0;
576 SELECTED_CONTROLLER(channel).status.drive_ready = 1;
577 SELECTED_CONTROLLER(channel).status.write_fault = 0;
578 SELECTED_CONTROLLER(channel).status.seek_complete = 1;
579 SELECTED_CONTROLLER(channel).status.corrected_data = 0;
580 SELECTED_CONTROLLER(channel).status.err = 0;
582 index = SELECTED_CONTROLLER(channel).buffer_index;
583 value32 = SELECTED_CONTROLLER(channel).buffer[index];
587 value32 |= (SELECTED_CONTROLLER(channel).buffer[index] << 8);
591 value32 |= (SELECTED_CONTROLLER(channel).buffer[index] << 16);
592 value32 |= (SELECTED_CONTROLLER(channel).buffer[index+1] << 24);
595 SELECTED_CONTROLLER(channel).buffer_index = index;
597 if (SELECTED_CONTROLLER(channel).buffer_index >= 512) {
599 SELECTED_CONTROLLER(channel).status.drq = 0;
603 case 0xa0: //send packet cmd
605 index = SELECTED_CONTROLLER(channel).buffer_index;
607 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);
608 // Load block if necessary
611 RD_PANIC("\t\tindex > 2048 : 0x%x\n",index);
612 switch (SELECTED_DRIVE(channel).atapi.command) {
613 case 0x28: // read (10)
614 case 0xa8: // read (12)
616 if (!SELECTED_DRIVE(channel).cdrom.ready) {
617 RD_PANIC("\t\tRead with CDROM not ready\n");
619 SELECTED_DRIVE(channel).cdrom.cd->ops.read_block(cdif, SELECTED_CONTROLLER(channel).buffer,
620 SELECTED_DRIVE(channel).cdrom.next_lba);
621 SELECTED_DRIVE(channel).cdrom.next_lba++;
622 SELECTED_DRIVE(channel).cdrom.remaining_blocks--;
625 if (!SELECTED_DRIVE(channel).cdrom.remaining_blocks)
626 Ramdisk_Print("\t\tLast READ block loaded {CDROM}\n");
628 Ramdisk_Print("\t\tREAD block loaded (%d remaining) {CDROM}\n",
629 SELECTED_DRIVE(channel).cdrom.remaining_blocks);
631 // one block transfered, start at beginning
635 default: // no need to load a new block
640 value32 = SELECTED_CONTROLLER(channel).buffer[index+increment];
643 value32 |= (SELECTED_CONTROLLER(channel).buffer[index+increment] << 8);
647 value32 |= (SELECTED_CONTROLLER(channel).buffer[index+increment] << 16);
648 value32 |= (SELECTED_CONTROLLER(channel).buffer[index+increment+1] << 24);
651 SELECTED_CONTROLLER(channel).buffer_index = index + increment;
652 SELECTED_CONTROLLER(channel).drq_index += increment;
654 if (SELECTED_CONTROLLER(channel).drq_index >= (unsigned)SELECTED_DRIVE(channel).atapi.drq_bytes) {
655 SELECTED_CONTROLLER(channel).status.drq = 0;
656 SELECTED_CONTROLLER(channel).drq_index = 0;
658 SELECTED_DRIVE(channel).atapi.total_bytes_remaining -= SELECTED_DRIVE(channel).atapi.drq_bytes;
660 if (SELECTED_DRIVE(channel).atapi.total_bytes_remaining > 0) {
661 // one or more blocks remaining (works only for single block commands)
663 Ramdisk_Print("\t\tPACKET drq bytes read\n");
664 SELECTED_CONTROLLER(channel).interrupt_reason.i_o = 1;
665 SELECTED_CONTROLLER(channel).status.busy = 0;
666 SELECTED_CONTROLLER(channel).status.drq = 1;
667 SELECTED_CONTROLLER(channel).interrupt_reason.c_d = 0;
669 // set new byte count if last block
670 if (SELECTED_DRIVE(channel).atapi.total_bytes_remaining < SELECTED_CONTROLLER(channel).byte_count) {
671 SELECTED_CONTROLLER(channel).byte_count = SELECTED_DRIVE(channel).atapi.total_bytes_remaining;
673 SELECTED_DRIVE(channel).atapi.drq_bytes = SELECTED_CONTROLLER(channel).byte_count;
675 rd_raise_interrupt(channels, channel);
678 Ramdisk_Print("\t\tPACKET all bytes read\n");
679 SELECTED_CONTROLLER(channel).interrupt_reason.i_o = 1;
680 SELECTED_CONTROLLER(channel).interrupt_reason.c_d = 1;
681 SELECTED_CONTROLLER(channel).status.drive_ready = 1;
682 SELECTED_CONTROLLER(channel).interrupt_reason.rel = 0;
683 SELECTED_CONTROLLER(channel).status.busy = 0;
684 SELECTED_CONTROLLER(channel).status.drq = 0;
685 SELECTED_CONTROLLER(channel).status.err = 0;
687 rd_raise_interrupt(channels, channel);
694 Ramdisk_Print("\t\tread need support more command: %02x\n", SELECTED_CONTROLLER(channel).current_command);
697 ///////////////////////////////////////////
699 case 0x01: // hard disk error register 0x1f1
701 SELECTED_CONTROLLER(channel).status.err = 0;
702 value8 = (!SELECTED_IS_PRESENT(channel)) ? 0 : SELECTED_CONTROLLER(channel).error_register;
705 case 0x02: // hard disk sector count / interrupt reason 0x1f2
706 value8 = (!SELECTED_IS_PRESENT(channel)) ? 0 : SELECTED_CONTROLLER(channel).sector_count;
709 case 0x03: // sector number 0x1f3
710 value8 = (!SELECTED_IS_PRESENT(channel)) ? 0 : SELECTED_CONTROLLER(channel).sector_no;
712 case 0x04: // cylinder low 0x1f4
713 // -- WARNING : On real hardware the controller registers are shared between drives.
714 // So we must respond even if the select device is not present. Some OS uses this fact
715 // to detect the disks.... minix2 for example
716 value8 = (!ANY_IS_PRESENT(channel)) ? 0 : (SELECTED_CONTROLLER(channel).cylinder_no & 0x00ff);
718 case 0x05: // cylinder high 0x1f5
719 // -- WARNING : On real hardware the controller registers are shared between drives.
720 // So we must respond even if the select device is not present. Some OS uses this fact
721 // to detect the disks.... minix2 for example
722 value8 = (!ANY_IS_PRESENT(channel)) ? 0 : SELECTED_CONTROLLER(channel).cylinder_no >> 8;
725 case 0x06: // hard disk drive and head register 0x1f6
726 // b7 Extended data field for ECC
727 // b6/b5: Used to be sector size. 00=256,01=512,10=1024,11=128
728 // Since 512 was always used, bit 6 was taken to mean LBA mode:
729 // b6 1=LBA mode, 0=CHS mode
734 ((SELECTED_CONTROLLER(channel).lba_mode>0) << 6) |
735 (1 << 5) | // 01b = 512 sector size
736 (channels[channel].drive_select << 4) |
737 (SELECTED_CONTROLLER(channel).head_no << 0);
740 //CONTROLLER(channel,0).lba_mode
742 case 0x07: // Hard Disk Status 0x1f7
743 case 0x16: // Hard Disk Alternate Status 0x3f6
744 if (!ANY_IS_PRESENT(channel)) {
745 // (mch) Just return zero for these registers
749 (SELECTED_CONTROLLER(channel).status.busy << 7) |
750 (SELECTED_CONTROLLER(channel).status.drive_ready << 6) |
751 (SELECTED_CONTROLLER(channel).status.write_fault << 5) |
752 (SELECTED_CONTROLLER(channel).status.seek_complete << 4) |
753 (SELECTED_CONTROLLER(channel).status.drq << 3) |
754 (SELECTED_CONTROLLER(channel).status.corrected_data << 2) |
755 (SELECTED_CONTROLLER(channel).status.index_pulse << 1) |
756 (SELECTED_CONTROLLER(channel).status.err) );
757 SELECTED_CONTROLLER(channel).status.index_pulse_count++;
758 SELECTED_CONTROLLER(channel).status.index_pulse = 0;
759 if (SELECTED_CONTROLLER(channel).status.index_pulse_count >= INDEX_PULSE_CYCLE) {
760 SELECTED_CONTROLLER(channel).status.index_pulse = 1;
761 SELECTED_CONTROLLER(channel).status.index_pulse_count = 0;
765 rd_lower_irq((struct vm_device *)(ramdisk_state->private_data), channels[channel].irq);
770 case 0x17: // Hard Disk Address Register 0x3f7
771 // Obsolete and unsupported register. Not driven by hard
772 // disk controller. Report all 1's. If floppy controller
773 // is handling this address, it will call this function
774 // set/clear D7 (the only bit it handles), then return
775 // the combined value
781 RD_PANIC("hard drive: io read to address %x unsupported\n",
785 ////////////////////////////////////////////
788 Ramdisk_Print("\t\tError: hard drive: shouldnt get here!\n");
792 Ramdisk_Print("\t\t32-bit read from %04x = %08x {%s}\n",
793 (unsigned) address, value32, SELECTED_TYPE_STRING(channel));
797 Ramdisk_Print("\t\t16-bit read from %04x = %04x {%s}\n",
798 (unsigned) address, value16, SELECTED_TYPE_STRING(channel));
802 Ramdisk_Print("\t\t8-bit read from %x = %02x {%s}\n",
803 (unsigned) address, value8, SELECTED_TYPE_STRING(channel));
809 void rd_write_handler(struct channel_t *channels, Bit32u address,
810 Bit32u value, unsigned io_len)
813 // off_t logical_sector;
815 rd_bool prev_control_reset;
820 Bit8u channel = MAX_ATA_CHANNEL;
821 Bit32u port = 0xff; // undefined
823 Ramdisk_Print("[rd_write_handler]\n");
824 // Bit8u atapi_command;
827 for (channel=0; channel<MAX_ATA_CHANNEL; channel++) {
828 if ((address & 0xfff8) == channels[channel].ioaddr1) {
829 port = address - channels[channel].ioaddr1;
832 else if ((address & 0xfff8) == channels[channel].ioaddr2) {
833 port = address - channels[channel].ioaddr2 + 0x10;
838 if (channel == MAX_ATA_CHANNEL) {
839 if (address != 0x03f6) {
840 RD_PANIC("Panic: write: unable to find ATA channel, ioport=0x%04x\n", address);
843 port = address - 0x03e0;
847 Ramdisk_Print("[W_handler] IO write to %x = %02x, channel = %d\n", (unsigned) address, (unsigned) value, channel);
849 struct cdrom_interface *cdif = SELECTED_DRIVE(channel).cdrom.cd;
854 Ramdisk_Print("\t\twrite port 170\n");
856 //////////////////////////////////////////////////////////
857 switch (SELECTED_CONTROLLER(channel).current_command) {
858 case 0x30: // WRITE SECTORS
859 RD_PANIC("\t\tneed to implement 0x30(write sector) to port 0x170\n");
863 if (SELECTED_CONTROLLER(channel).buffer_index >= PACKET_SIZE)
864 RD_PANIC("IO write(0x%04x): buffer_index >= PACKET_SIZE", address);
865 SELECTED_CONTROLLER(channel).buffer[SELECTED_CONTROLLER(channel).buffer_index] = value;
866 SELECTED_CONTROLLER(channel).buffer[SELECTED_CONTROLLER(channel).buffer_index+1] = (value >> 8);
867 SELECTED_CONTROLLER(channel).buffer_index += 2;
869 /* if packet completely writtten */
870 if (SELECTED_CONTROLLER(channel).buffer_index >= PACKET_SIZE) {
871 // complete command received
872 Bit8u atapi_command = SELECTED_CONTROLLER(channel).buffer[0];
874 Ramdisk_Print("\t\tcdrom: ATAPI command 0x%x started\n", atapi_command);
876 switch (atapi_command) {
877 case 0x00: // test unit ready
878 if (SELECTED_DRIVE(channel).cdrom.ready) {
879 rd_atapi_cmd_nop(channels, channel);
881 rd_atapi_cmd_error(channels, channel, SENSE_NOT_READY, ASC_MEDIUM_NOT_PRESENT);
883 rd_raise_interrupt(channels, channel);
886 case 0x03: { // request sense
887 int alloc_length = SELECTED_CONTROLLER(channel).buffer[4];
888 rd_init_send_atapi_command(channels, channel, atapi_command, 18, alloc_length, false);
891 SELECTED_CONTROLLER(channel).buffer[0] = 0x70 | (1 << 7);
892 SELECTED_CONTROLLER(channel).buffer[1] = 0;
893 SELECTED_CONTROLLER(channel).buffer[2] = SELECTED_DRIVE(channel).sense.sense_key;
894 SELECTED_CONTROLLER(channel).buffer[3] = SELECTED_DRIVE(channel).sense.information.arr[0];
895 SELECTED_CONTROLLER(channel).buffer[4] = SELECTED_DRIVE(channel).sense.information.arr[1];
896 SELECTED_CONTROLLER(channel).buffer[5] = SELECTED_DRIVE(channel).sense.information.arr[2];
897 SELECTED_CONTROLLER(channel).buffer[6] = SELECTED_DRIVE(channel).sense.information.arr[3];
898 SELECTED_CONTROLLER(channel).buffer[7] = 17-7;
899 SELECTED_CONTROLLER(channel).buffer[8] = SELECTED_DRIVE(channel).sense.specific_inf.arr[0];
900 SELECTED_CONTROLLER(channel).buffer[9] = SELECTED_DRIVE(channel).sense.specific_inf.arr[1];
901 SELECTED_CONTROLLER(channel).buffer[10] = SELECTED_DRIVE(channel).sense.specific_inf.arr[2];
902 SELECTED_CONTROLLER(channel).buffer[11] = SELECTED_DRIVE(channel).sense.specific_inf.arr[3];
903 SELECTED_CONTROLLER(channel).buffer[12] = SELECTED_DRIVE(channel).sense.asc;
904 SELECTED_CONTROLLER(channel).buffer[13] = SELECTED_DRIVE(channel).sense.ascq;
905 SELECTED_CONTROLLER(channel).buffer[14] = SELECTED_DRIVE(channel).sense.fruc;
906 SELECTED_CONTROLLER(channel).buffer[15] = SELECTED_DRIVE(channel).sense.key_spec.arr[0];
907 SELECTED_CONTROLLER(channel).buffer[16] = SELECTED_DRIVE(channel).sense.key_spec.arr[1];
908 SELECTED_CONTROLLER(channel).buffer[17] = SELECTED_DRIVE(channel).sense.key_spec.arr[2];
910 rd_ready_to_send_atapi(channels, channel);
914 case 0x1b: { // start stop unit
915 //bx_bool Immed = (SELECTED_CONTROLLER(channel).buffer[1] >> 0) & 1;
916 rd_bool LoEj = (SELECTED_CONTROLLER(channel).buffer[4] >> 1) & 1;
917 rd_bool Start = (SELECTED_CONTROLLER(channel).buffer[4] >> 0) & 1;
919 if (!LoEj && !Start) { // stop the disc
920 RD_ERROR("FIXME: Stop disc not implemented\n");
921 rd_atapi_cmd_nop(channels, channel);
922 rd_raise_interrupt(channels, channel);
923 } else if (!LoEj && Start) { // start (spin up) the disc
925 SELECTED_DRIVE(channel).cdrom.cd->ops.start_cdrom(cdif);
927 RD_ERROR("FIXME: ATAPI start disc not reading TOC\n");
928 rd_atapi_cmd_nop(channels, channel);
929 rd_raise_interrupt(channels, channel);
930 } else if (LoEj && !Start) { // Eject the disc
931 rd_atapi_cmd_nop(channels, channel);
933 if (SELECTED_DRIVE(channel).cdrom.ready) {
935 SELECTED_DRIVE(channel).cdrom.cd->ops.eject_cdrom(cdif);
937 SELECTED_DRIVE(channel).cdrom.ready = 0;
938 //bx_options.atadevice[channel][SLAVE_SELECTED(channel)].Ostatus->set(EJECTED);
939 //bx_gui->update_drive_status_buttons();
941 rd_raise_interrupt(channels, channel);
942 } else { // Load the disc
943 // My guess is that this command only closes the tray, that's a no-op for us
944 rd_atapi_cmd_nop(channels, channel);
945 rd_raise_interrupt(channels, channel);
950 case 0xbd: { // mechanism status
951 uint16 alloc_length = rd_read_16bit(SELECTED_CONTROLLER(channel).buffer + 8);
953 if (alloc_length == 0)
954 RD_PANIC("Zero allocation length to MECHANISM STATUS not impl.\n");
956 rd_init_send_atapi_command(channels, channel, atapi_command, 8, alloc_length, false);
958 SELECTED_CONTROLLER(channel).buffer[0] = 0; // reserved for non changers
959 SELECTED_CONTROLLER(channel).buffer[1] = 0; // reserved for non changers
961 SELECTED_CONTROLLER(channel).buffer[2] = 0; // Current LBA (TODO!)
962 SELECTED_CONTROLLER(channel).buffer[3] = 0; // Current LBA (TODO!)
963 SELECTED_CONTROLLER(channel).buffer[4] = 0; // Current LBA (TODO!)
965 SELECTED_CONTROLLER(channel).buffer[5] = 1; // one slot
967 SELECTED_CONTROLLER(channel).buffer[6] = 0; // slot table length
968 SELECTED_CONTROLLER(channel).buffer[7] = 0; // slot table length
970 rd_ready_to_send_atapi(channels, channel);
974 case 0x5a: { // mode sense
975 uint16 alloc_length = rd_read_16bit(SELECTED_CONTROLLER(channel).buffer + 7);
977 Bit8u PC = SELECTED_CONTROLLER(channel).buffer[2] >> 6;
978 Bit8u PageCode = SELECTED_CONTROLLER(channel).buffer[2] & 0x3f;
981 case 0x0: // current values
983 case 0x01: // error recovery
984 rd_init_send_atapi_command(channels, channel, atapi_command, sizeof(struct error_recovery_t) + 8, alloc_length, false);
986 rd_init_mode_sense_single(channels, channel, &SELECTED_DRIVE(channel).cdrom.current.error_recovery,
987 sizeof(struct error_recovery_t));
988 rd_ready_to_send_atapi(channels, channel);
991 case 0x2a: // CD-ROM capabilities & mech. status
992 rd_init_send_atapi_command(channels, channel, atapi_command, 28, alloc_length, false);
993 rd_init_mode_sense_single(channels, channel, &SELECTED_CONTROLLER(channel).buffer[8], 28);
994 SELECTED_CONTROLLER(channel).buffer[8] = 0x2a;
995 SELECTED_CONTROLLER(channel).buffer[9] = 0x12;
996 SELECTED_CONTROLLER(channel).buffer[10] = 0x00;
997 SELECTED_CONTROLLER(channel).buffer[11] = 0x00;
998 // Multisession, Mode 2 Form 2, Mode 2 Form 1
999 SELECTED_CONTROLLER(channel).buffer[12] = 0x70;
1000 SELECTED_CONTROLLER(channel).buffer[13] = (3 << 5);
1001 SELECTED_CONTROLLER(channel).buffer[14] = (unsigned char)
1003 (SELECTED_DRIVE(channel).cdrom.locked ? (1 << 1) : 0) |
1006 SELECTED_CONTROLLER(channel).buffer[15] = 0x00;
1007 SELECTED_CONTROLLER(channel).buffer[16] = (706 >> 8) & 0xff;
1008 SELECTED_CONTROLLER(channel).buffer[17] = 706 & 0xff;
1009 SELECTED_CONTROLLER(channel).buffer[18] = 0;
1010 SELECTED_CONTROLLER(channel).buffer[19] = 2;
1011 SELECTED_CONTROLLER(channel).buffer[20] = (512 >> 8) & 0xff;
1012 SELECTED_CONTROLLER(channel).buffer[21] = 512 & 0xff;
1013 SELECTED_CONTROLLER(channel).buffer[22] = (706 >> 8) & 0xff;
1014 SELECTED_CONTROLLER(channel).buffer[23] = 706 & 0xff;
1015 SELECTED_CONTROLLER(channel).buffer[24] = 0;
1016 SELECTED_CONTROLLER(channel).buffer[25] = 0;
1017 SELECTED_CONTROLLER(channel).buffer[26] = 0;
1018 SELECTED_CONTROLLER(channel).buffer[27] = 0;
1019 rd_ready_to_send_atapi(channels, channel);
1022 case 0x0d: // CD-ROM
1023 case 0x0e: // CD-ROM audio control
1025 RD_ERROR("cdrom: MODE SENSE (curr), code=%x not implemented yet\n",
1027 rd_atapi_cmd_error(channels, channel, SENSE_ILLEGAL_REQUEST,
1028 ASC_INV_FIELD_IN_CMD_PACKET);
1029 rd_raise_interrupt(channels, channel);
1033 // not implemeted by this device
1034 Ramdisk_Print("\t\tcdrom: MODE SENSE PC=%x, PageCode=%x, not implemented by device\n",
1036 rd_atapi_cmd_error(channels, channel, SENSE_ILLEGAL_REQUEST,
1037 ASC_INV_FIELD_IN_CMD_PACKET);
1038 rd_raise_interrupt(channels, channel);
1043 case 0x1: // changeable values
1045 case 0x01: // error recovery
1046 case 0x0d: // CD-ROM
1047 case 0x0e: // CD-ROM audio control
1048 case 0x2a: // CD-ROM capabilities & mech. status
1050 RD_ERROR("cdrom: MODE SENSE (chg), code=%x not implemented yet\n",
1052 rd_atapi_cmd_error(channels, channel, SENSE_ILLEGAL_REQUEST,
1053 ASC_INV_FIELD_IN_CMD_PACKET);
1054 rd_raise_interrupt(channels, channel);
1058 // not implemeted by this device
1059 Ramdisk_Print("\t\tcdrom: MODE SENSE PC=%x, PageCode=%x, not implemented by device\n",
1061 rd_atapi_cmd_error(channels, channel, SENSE_ILLEGAL_REQUEST,
1062 ASC_INV_FIELD_IN_CMD_PACKET);
1063 rd_raise_interrupt(channels, channel);
1068 case 0x2: // default values
1070 case 0x01: // error recovery
1071 case 0x0d: // CD-ROM
1072 case 0x0e: // CD-ROM audio control
1073 case 0x2a: // CD-ROM capabilities & mech. status
1075 RD_PANIC("cdrom: MODE SENSE (dflt), code=%x\n",
1080 // not implemeted by this device
1081 Ramdisk_Print("\t\tcdrom: MODE SENSE PC=%x, PageCode=%x, not implemented by device\n",
1083 rd_atapi_cmd_error(channels, channel, SENSE_ILLEGAL_REQUEST,
1084 ASC_INV_FIELD_IN_CMD_PACKET);
1085 rd_raise_interrupt(channels, channel);
1090 case 0x3: // saved values not implemented
1091 rd_atapi_cmd_error(channels, channel, SENSE_ILLEGAL_REQUEST, ASC_SAVING_PARAMETERS_NOT_SUPPORTED);
1092 rd_raise_interrupt(channels, channel);
1096 RD_PANIC("Should not get here!\n");
1102 case 0x12: { // inquiry
1103 uint8 alloc_length = SELECTED_CONTROLLER(channel).buffer[4];
1105 rd_init_send_atapi_command(channels, channel, atapi_command, 36, alloc_length, false);
1107 SELECTED_CONTROLLER(channel).buffer[0] = 0x05; // CD-ROM
1108 SELECTED_CONTROLLER(channel).buffer[1] = 0x80; // Removable
1109 SELECTED_CONTROLLER(channel).buffer[2] = 0x00; // ISO, ECMA, ANSI version
1110 SELECTED_CONTROLLER(channel).buffer[3] = 0x21; // ATAPI-2, as specified
1111 SELECTED_CONTROLLER(channel).buffer[4] = 31; // additional length (total 36)
1112 SELECTED_CONTROLLER(channel).buffer[5] = 0x00; // reserved
1113 SELECTED_CONTROLLER(channel).buffer[6] = 0x00; // reserved
1114 SELECTED_CONTROLLER(channel).buffer[7] = 0x00; // reserved
1117 const char* vendor_id = "VTAB ";
1119 for (i = 0; i < 8; i++)
1120 SELECTED_CONTROLLER(channel).buffer[8+i] = vendor_id[i];
1123 const char* product_id = "Turbo CD-ROM ";
1124 for (i = 0; i < 16; i++)
1125 SELECTED_CONTROLLER(channel).buffer[16+i] = product_id[i];
1127 // Product Revision level
1128 const char* rev_level = "1.0 ";
1129 for (i = 0; i < 4; i++)
1130 SELECTED_CONTROLLER(channel).buffer[32+i] = rev_level[i];
1132 rd_ready_to_send_atapi(channels, channel);
1136 case 0x25: { // read cd-rom capacity
1137 // no allocation length???
1138 rd_init_send_atapi_command(channels, channel, atapi_command, 8, 8, false);
1140 if (SELECTED_DRIVE(channel).cdrom.ready) {
1141 uint32 capacity = SELECTED_DRIVE(channel).cdrom.capacity;
1142 Ramdisk_Print("\t\tCapacity is %d sectors (%d bytes)\n", capacity, capacity * 2048);
1143 SELECTED_CONTROLLER(channel).buffer[0] = (capacity >> 24) & 0xff;
1144 SELECTED_CONTROLLER(channel).buffer[1] = (capacity >> 16) & 0xff;
1145 SELECTED_CONTROLLER(channel).buffer[2] = (capacity >> 8) & 0xff;
1146 SELECTED_CONTROLLER(channel).buffer[3] = (capacity >> 0) & 0xff;
1147 SELECTED_CONTROLLER(channel).buffer[4] = (2048 >> 24) & 0xff;
1148 SELECTED_CONTROLLER(channel).buffer[5] = (2048 >> 16) & 0xff;
1149 SELECTED_CONTROLLER(channel).buffer[6] = (2048 >> 8) & 0xff;
1150 SELECTED_CONTROLLER(channel).buffer[7] = (2048 >> 0) & 0xff;
1151 rd_ready_to_send_atapi(channels, channel);
1153 rd_atapi_cmd_error(channels, channel, SENSE_NOT_READY, ASC_MEDIUM_NOT_PRESENT);
1154 rd_raise_interrupt(channels, channel);
1159 case 0xbe: { // read cd
1160 if (SELECTED_DRIVE(channel).cdrom.ready) {
1161 RD_ERROR("Read CD with CD present not implemented\n");
1162 rd_atapi_cmd_error(channels, channel, SENSE_ILLEGAL_REQUEST, ASC_INV_FIELD_IN_CMD_PACKET);
1163 rd_raise_interrupt(channels, channel);
1165 rd_atapi_cmd_error(channels, channel, SENSE_NOT_READY, ASC_MEDIUM_NOT_PRESENT);
1166 rd_raise_interrupt(channels, channel);
1171 case 0x43: { // read toc
1172 if (SELECTED_DRIVE(channel).cdrom.ready) {
1174 bool msf = (SELECTED_CONTROLLER(channel).buffer[1] >> 1) & 1;
1175 uint8 starting_track = SELECTED_CONTROLLER(channel).buffer[6];
1177 uint16 alloc_length = rd_read_16bit(SELECTED_CONTROLLER(channel).buffer + 7);
1179 uint8 format = (SELECTED_CONTROLLER(channel).buffer[9] >> 6);
1184 if (!(SELECTED_DRIVE(channel).cdrom.cd->ops.read_toc(cdif, SELECTED_CONTROLLER(channel).buffer,
1185 &toc_length, msf, starting_track))) {
1186 rd_atapi_cmd_error(channels, channel, SENSE_ILLEGAL_REQUEST,
1187 ASC_INV_FIELD_IN_CMD_PACKET);
1188 rd_raise_interrupt(channels, channel);
1190 rd_init_send_atapi_command(channels, channel, atapi_command, toc_length, alloc_length, false);
1191 rd_ready_to_send_atapi(channels, channel);
1196 // multi session stuff. we ignore this and emulate a single session only
1197 rd_init_send_atapi_command(channels, channel, atapi_command, 12, alloc_length, false);
1199 SELECTED_CONTROLLER(channel).buffer[0] = 0;
1200 SELECTED_CONTROLLER(channel).buffer[1] = 0x0a;
1201 SELECTED_CONTROLLER(channel).buffer[2] = 1;
1202 SELECTED_CONTROLLER(channel).buffer[3] = 1;
1203 for (i = 0; i < 8; i++)
1204 SELECTED_CONTROLLER(channel).buffer[4+i] = 0;
1206 rd_ready_to_send_atapi(channels, channel);
1211 RD_PANIC("(READ TOC) Format %d not supported\n", format);
1215 rd_atapi_cmd_error(channels, channel, SENSE_NOT_READY, ASC_MEDIUM_NOT_PRESENT);
1216 rd_raise_interrupt(channels, channel);
1221 case 0x28: // read (10)
1222 case 0xa8: // read (12)
1225 uint32 transfer_length;
1226 if (atapi_command == 0x28)
1227 transfer_length = rd_read_16bit(SELECTED_CONTROLLER(channel).buffer + 7);
1229 transfer_length = rd_read_32bit(SELECTED_CONTROLLER(channel).buffer + 6);
1231 uint32 lba = rd_read_32bit(SELECTED_CONTROLLER(channel).buffer + 2);
1233 if (!SELECTED_DRIVE(channel).cdrom.ready) {
1234 rd_atapi_cmd_error(channels, channel, SENSE_NOT_READY, ASC_MEDIUM_NOT_PRESENT);
1235 rd_raise_interrupt(channels, channel);
1239 if (transfer_length == 0) {
1240 rd_atapi_cmd_nop(channels, channel);
1241 rd_raise_interrupt(channels, channel);
1242 Ramdisk_Print("\t\tREAD(%d) with transfer length 0, ok\n", atapi_command==0x28?10:12);
1246 if (lba + transfer_length > SELECTED_DRIVE(channel).cdrom.capacity) {
1247 rd_atapi_cmd_error(channels, channel, SENSE_ILLEGAL_REQUEST, ASC_LOGICAL_BLOCK_OOR);
1248 rd_raise_interrupt(channels, channel);
1252 Ramdisk_Print("\t\tcdrom: READ (%d) LBA=%d LEN=%d\n", atapi_command==0x28?10:12, lba, transfer_length);
1255 rd_init_send_atapi_command(channels, channel, atapi_command, transfer_length * 2048,
1256 transfer_length * 2048, true);
1257 SELECTED_DRIVE(channel).cdrom.remaining_blocks = transfer_length;
1258 SELECTED_DRIVE(channel).cdrom.next_lba = lba;
1259 rd_ready_to_send_atapi(channels, channel);
1263 case 0x2b: { // seek
1264 uint32 lba = rd_read_32bit(SELECTED_CONTROLLER(channel).buffer + 2);
1265 if (!SELECTED_DRIVE(channel).cdrom.ready) {
1266 rd_atapi_cmd_error(channels, channel, SENSE_NOT_READY, ASC_MEDIUM_NOT_PRESENT);
1267 rd_raise_interrupt(channels, channel);
1271 if (lba > SELECTED_DRIVE(channel).cdrom.capacity) {
1272 rd_atapi_cmd_error(channels, channel, SENSE_ILLEGAL_REQUEST, ASC_LOGICAL_BLOCK_OOR);
1273 rd_raise_interrupt(channels, channel);
1276 Ramdisk_Print("\t\tcdrom: SEEK (ignored)\n");
1277 rd_atapi_cmd_nop(channels, channel);
1278 rd_raise_interrupt(channels, channel);
1282 case 0x1e: { // prevent/allow medium removal
1283 if (SELECTED_DRIVE(channel).cdrom.ready) {
1284 SELECTED_DRIVE(channel).cdrom.locked = SELECTED_CONTROLLER(channel).buffer[4] & 1;
1285 rd_atapi_cmd_nop(channels, channel);
1287 rd_atapi_cmd_error(channels, channel, SENSE_NOT_READY, ASC_MEDIUM_NOT_PRESENT);
1289 rd_raise_interrupt(channels, channel);
1293 case 0x42: { // read sub-channel
1294 bool msf = get_packet_field(channel,1, 1, 1);
1295 bool sub_q = get_packet_field(channel,2, 6, 1);
1296 uint8 data_format = get_packet_byte(channel,3);
1297 uint8 track_number = get_packet_byte(channel,6);
1298 uint16 alloc_length = get_packet_word(channel,7);
1300 UNUSED(data_format);
1301 UNUSED(track_number);
1303 if (!SELECTED_DRIVE(channel).cdrom.ready) {
1304 rd_atapi_cmd_error(channels, channel, SENSE_NOT_READY, ASC_MEDIUM_NOT_PRESENT);
1305 rd_raise_interrupt(channels, channel);
1307 SELECTED_CONTROLLER(channel).buffer[0] = 0;
1308 SELECTED_CONTROLLER(channel).buffer[1] = 0; // audio not supported
1309 SELECTED_CONTROLLER(channel).buffer[2] = 0;
1310 SELECTED_CONTROLLER(channel).buffer[3] = 0;
1312 int ret_len = 4; // header size
1314 if (sub_q) { // !sub_q == header only
1315 RD_ERROR("Read sub-channel with SubQ not implemented\n");
1316 rd_atapi_cmd_error(channels, channel, SENSE_ILLEGAL_REQUEST,
1317 ASC_INV_FIELD_IN_CMD_PACKET);
1318 rd_raise_interrupt(channels, channel);
1321 rd_init_send_atapi_command(channels, channel, atapi_command, ret_len, alloc_length, false);
1322 rd_ready_to_send_atapi(channels, channel);
1327 case 0x51: { // read disc info
1328 // no-op to keep the Linux CD-ROM driver happy
1329 rd_atapi_cmd_error(channels, channel, SENSE_ILLEGAL_REQUEST, ASC_INV_FIELD_IN_CMD_PACKET);
1330 rd_raise_interrupt(channels, channel);
1334 case 0x55: // mode select
1335 case 0xa6: // load/unload cd
1336 case 0x4b: // pause/resume
1337 case 0x45: // play audio
1338 case 0x47: // play audio msf
1339 case 0xbc: // play cd
1340 case 0xb9: // read cd msf
1341 case 0x44: // read header
1343 case 0xbb: // set cd speed
1344 case 0x4e: // stop play/scan
1347 RD_ERROR("ATAPI command 0x%x not implemented yet\n",
1349 rd_atapi_cmd_error(channels, channel, SENSE_ILLEGAL_REQUEST, ASC_INV_FIELD_IN_CMD_PACKET);
1350 rd_raise_interrupt(channels, channel);
1353 RD_PANIC("Unknown ATAPI command 0x%x (%d)\n",
1354 atapi_command, atapi_command);
1355 // We'd better signal the error if the user chose to continue
1356 rd_atapi_cmd_error(channels, channel, SENSE_ILLEGAL_REQUEST, ASC_INV_FIELD_IN_CMD_PACKET);
1357 rd_raise_interrupt(channels, channel);
1366 RD_PANIC("\t\tIO write(0x%x): current command is %02xh\n", address,
1367 (unsigned) SELECTED_CONTROLLER(channel).current_command);
1370 /////////////////////////////////////////////////////////
1372 case 0x01: // hard disk write precompensation 0x1f1
1373 WRITE_FEATURES(channel,value);
1376 case 0x02: // hard disk sector count 0x1f2
1377 WRITE_SECTOR_COUNT(channel,value);
1380 case 0x03: // hard disk sector number 0x1f3
1381 WRITE_SECTOR_NUMBER(channel,value);
1384 case 0x04: // hard disk cylinder low 0x1f4
1385 WRITE_CYLINDER_LOW(channel,value);
1388 case 0x05: // hard disk cylinder high 0x1f5
1389 WRITE_CYLINDER_HIGH(channel,value);
1392 case 0x06: // hard disk drive and head register 0x1f6
1393 // b7 Extended data field for ECC
1394 // b6/b5: Used to be sector size. 00=256,01=512,10=1024,11=128
1395 // Since 512 was always used, bit 6 was taken to mean LBA mode:
1396 // b6 1=LBA mode, 0=CHS mode
1401 if ( (value & 0xa0) != 0xa0 ) // 1x1xxxxx
1402 Ramdisk_Print("\t\tIO write 0x%x (%02x): not 1x1xxxxxb\n", address, (unsigned) value);
1404 Bit32u drvsel = channels[channel].drive_select = (value >> 4) & 0x01;
1405 WRITE_HEAD_NO(channel,value & 0xf);
1406 if (SELECTED_CONTROLLER(channel).lba_mode == 0 && ((value >> 6) & 1) == 1){
1407 Ramdisk_Print("\t\tenabling LBA mode\n");
1409 WRITE_LBA_MODE(channel,(value >> 6) & 1);
1410 SELECTED_DRIVE(channel).cdrom.cd->lba = (value >> 6) & 1;
1413 if (!SELECTED_IS_PRESENT(channel)) {
1414 Ramdisk_Print ("\t\tError: device set to %d which does not exist! channel = %d\n",drvsel, channel);
1415 SELECTED_CONTROLLER(channel).error_register = 0x04; // aborted
1416 SELECTED_CONTROLLER(channel).status.err = 1;
1422 case 0x07: // hard disk command 0x1f7
1426 case 0xa1: // IDENTIFY PACKET DEVICE
1427 if (SELECTED_IS_CD(channel)) {
1428 SELECTED_CONTROLLER(channel).current_command = value;
1429 SELECTED_CONTROLLER(channel).error_register = 0;
1431 SELECTED_CONTROLLER(channel).status.busy = 0;
1432 SELECTED_CONTROLLER(channel).status.drive_ready = 1;
1433 SELECTED_CONTROLLER(channel).status.write_fault = 0;
1434 SELECTED_CONTROLLER(channel).status.drq = 1;
1435 SELECTED_CONTROLLER(channel).status.err = 0;
1437 SELECTED_CONTROLLER(channel).status.seek_complete = 1;
1438 SELECTED_CONTROLLER(channel).status.corrected_data = 0;
1440 SELECTED_CONTROLLER(channel).buffer_index = 0;
1441 rd_raise_interrupt(channels, channel);
1442 rd_identify_ATAPI_drive(channels, channel);
1444 rd_command_aborted(channels, channel, 0xa1);
1448 case 0xa0: // SEND PACKET (atapi)
1449 if (SELECTED_IS_CD(channel)) {
1451 if (SELECTED_CONTROLLER(channel).features & (1 << 0))
1452 RD_PANIC("\t\tPACKET-DMA not supported");
1453 if (SELECTED_CONTROLLER(channel).features & (1 << 1))
1454 RD_PANIC("\t\tPACKET-overlapped not supported");
1456 // We're already ready!
1457 SELECTED_CONTROLLER(channel).sector_count = 1;
1458 SELECTED_CONTROLLER(channel).status.busy = 0;
1459 SELECTED_CONTROLLER(channel).status.write_fault = 0;
1461 SELECTED_CONTROLLER(channel).status.drq = 1;
1462 SELECTED_CONTROLLER(channel).status.err = 0;
1464 // NOTE: no interrupt here
1465 SELECTED_CONTROLLER(channel).current_command = value;
1466 SELECTED_CONTROLLER(channel).buffer_index = 0;
1468 rd_command_aborted (channels, channel, 0xa0);
1473 Ramdisk_Print("\t\tneed translate command %2x\n", value);
1478 case 0x16: // hard disk adapter control 0x3f6
1479 // (mch) Even if device 1 was selected, a write to this register
1480 // goes to device 0 (if device 1 is absent)
1482 prev_control_reset = SELECTED_CONTROLLER(channel).control.reset;
1483 channels[channel].drives[0].controller.control.reset = value & 0x04;
1484 channels[channel].drives[1].controller.control.reset = value & 0x04;
1485 // CGS: was: SELECTED_CONTROLLER(channel).control.disable_irq = value & 0x02;
1486 channels[channel].drives[0].controller.control.disable_irq = value & 0x02;
1487 channels[channel].drives[1].controller.control.disable_irq = value & 0x02;
1489 Ramdisk_Print("\t\tadpater control reg: reset controller = %d\n",
1490 (unsigned) (SELECTED_CONTROLLER(channel).control.reset) ? 1 : 0);
1491 Ramdisk_Print("\t\tadpater control reg: disable_irq(X) = %d\n",
1492 (unsigned) (SELECTED_CONTROLLER(channel).control.disable_irq) ? 1 : 0);
1494 if (!prev_control_reset && SELECTED_CONTROLLER(channel).control.reset) {
1495 // transition from 0 to 1 causes all drives to reset
1496 Ramdisk_Print("\t\thard drive: RESET\n");
1498 // (mch) Set BSY, drive not ready
1499 for (id = 0; id < 2; id++) {
1500 CONTROLLER(channel,id).status.busy = 1;
1501 CONTROLLER(channel,id).status.drive_ready = 0;
1502 CONTROLLER(channel,id).reset_in_progress = 1;
1504 CONTROLLER(channel,id).status.write_fault = 0;
1505 CONTROLLER(channel,id).status.seek_complete = 1;
1506 CONTROLLER(channel,id).status.drq = 0;
1507 CONTROLLER(channel,id).status.corrected_data = 0;
1508 CONTROLLER(channel,id).status.err = 0;
1510 CONTROLLER(channel,id).error_register = 0x01; // diagnostic code: no error
1512 CONTROLLER(channel,id).current_command = 0x00;
1513 CONTROLLER(channel,id).buffer_index = 0;
1515 CONTROLLER(channel,id).sectors_per_block = 0x80;
1516 CONTROLLER(channel,id).lba_mode = 0;
1518 CONTROLLER(channel,id).control.disable_irq = 0;
1519 rd_lower_irq((struct vm_device *)(ramdisk_state->private_data), channels[channel].irq);
1521 } else if (SELECTED_CONTROLLER(channel).reset_in_progress &&
1522 !SELECTED_CONTROLLER(channel).control.reset) {
1523 // Clear BSY and DRDY
1524 Ramdisk_Print("\t\tReset complete {%s}\n", SELECTED_TYPE_STRING(channel));
1525 for (id = 0; id < 2; id++) {
1526 CONTROLLER(channel,id).status.busy = 0;
1527 CONTROLLER(channel,id).status.drive_ready = 1;
1528 CONTROLLER(channel,id).reset_in_progress = 0;
1531 if (DRIVE_IS_HD(channel,id)) {
1532 Ramdisk_Print("\t\tdrive %d/%d is harddrive\n", channel, id);
1533 CONTROLLER(channel,id).head_no = 0;
1534 CONTROLLER(channel,id).sector_count = 1;
1535 CONTROLLER(channel,id).sector_no = 1;
1536 CONTROLLER(channel,id).cylinder_no = 0;
1538 CONTROLLER(channel,id).head_no = 0;
1539 CONTROLLER(channel,id).sector_count = 1;
1540 CONTROLLER(channel,id).sector_no = 1;
1541 CONTROLLER(channel,id).cylinder_no = 0xeb14;
1545 Ramdisk_Print("\t\ts[0].controller.control.disable_irq = %02x\n", (channels[channel].drives[0]).controller.control.disable_irq);
1546 Ramdisk_Print("\t\ts[1].controller.control.disable_irq = %02x\n", (channels[channel].drives[1]).controller.control.disable_irq);
1550 RD_PANIC("\t\thard drive: io write to address %x = %02x\n",
1551 (unsigned) address, (unsigned) value);
1559 void rd_identify_ATAPI_drive(struct channel_t *channels, Bit8u channel)
1562 const char* serial_number = " VT00001\0\0\0\0\0\0\0\0\0\0\0\0";
1563 const char* firmware = "ALPHA1 ";
1565 SELECTED_DRIVE(channel).id_drive[0] = (2 << 14) | (5 << 8) | (1 << 7) | (2 << 5) | (0 << 0); // Removable CDROM, 50us response, 12 byte packets
1567 for (i = 1; i <= 9; i++)
1568 SELECTED_DRIVE(channel).id_drive[i] = 0;
1571 for (i = 0; i < 10; i++) {
1572 SELECTED_DRIVE(channel).id_drive[10+i] = (serial_number[i*2] << 8) |
1573 serial_number[i*2 + 1];
1576 for (i = 20; i <= 22; i++)
1577 SELECTED_DRIVE(channel).id_drive[i] = 0;
1580 for (i = 0; i < strlen(firmware)/2; i++) {
1581 SELECTED_DRIVE(channel).id_drive[23+i] = (firmware[i*2] << 8) |
1584 V3_ASSERT((23+i) == 27);
1586 for (i = 0; i < strlen((char *) SELECTED_MODEL(channel))/2; i++) {
1587 SELECTED_DRIVE(channel).id_drive[27+i] = (SELECTED_MODEL(channel)[i*2] << 8) |
1588 SELECTED_MODEL(channel)[i*2 + 1];
1590 V3_ASSERT((27+i) == 47);
1592 SELECTED_DRIVE(channel).id_drive[47] = 0;
1593 SELECTED_DRIVE(channel).id_drive[48] = 1; // 32 bits access
1595 SELECTED_DRIVE(channel).id_drive[49] = (1 << 9); // LBA supported
1597 SELECTED_DRIVE(channel).id_drive[50] = 0;
1598 SELECTED_DRIVE(channel).id_drive[51] = 0;
1599 SELECTED_DRIVE(channel).id_drive[52] = 0;
1601 SELECTED_DRIVE(channel).id_drive[53] = 3; // words 64-70, 54-58 valid
1603 for (i = 54; i <= 62; i++)
1604 SELECTED_DRIVE(channel).id_drive[i] = 0;
1606 // copied from CFA540A
1607 SELECTED_DRIVE(channel).id_drive[63] = 0x0103; // variable (DMA stuff)
1608 SELECTED_DRIVE(channel).id_drive[64] = 0x0001; // PIO
1609 SELECTED_DRIVE(channel).id_drive[65] = 0x00b4;
1610 SELECTED_DRIVE(channel).id_drive[66] = 0x00b4;
1611 SELECTED_DRIVE(channel).id_drive[67] = 0x012c;
1612 SELECTED_DRIVE(channel).id_drive[68] = 0x00b4;
1614 SELECTED_DRIVE(channel).id_drive[69] = 0;
1615 SELECTED_DRIVE(channel).id_drive[70] = 0;
1616 SELECTED_DRIVE(channel).id_drive[71] = 30; // faked
1617 SELECTED_DRIVE(channel).id_drive[72] = 30; // faked
1618 SELECTED_DRIVE(channel).id_drive[73] = 0;
1619 SELECTED_DRIVE(channel).id_drive[74] = 0;
1621 SELECTED_DRIVE(channel).id_drive[75] = 0;
1623 for (i = 76; i <= 79; i++)
1624 SELECTED_DRIVE(channel).id_drive[i] = 0;
1626 SELECTED_DRIVE(channel).id_drive[80] = 0x1e; // supports up to ATA/ATAPI-4
1627 SELECTED_DRIVE(channel).id_drive[81] = 0;
1628 SELECTED_DRIVE(channel).id_drive[82] = 0;
1629 SELECTED_DRIVE(channel).id_drive[83] = 0;
1630 SELECTED_DRIVE(channel).id_drive[84] = 0;
1631 SELECTED_DRIVE(channel).id_drive[85] = 0;
1632 SELECTED_DRIVE(channel).id_drive[86] = 0;
1633 SELECTED_DRIVE(channel).id_drive[87] = 0;
1634 SELECTED_DRIVE(channel).id_drive[88] = 0;
1636 for (i = 89; i <= 126; i++)
1637 SELECTED_DRIVE(channel).id_drive[i] = 0;
1639 SELECTED_DRIVE(channel).id_drive[127] = 0;
1640 SELECTED_DRIVE(channel).id_drive[128] = 0;
1642 for (i = 129; i <= 159; i++)
1643 SELECTED_DRIVE(channel).id_drive[i] = 0;
1645 for (i = 160; i <= 255; i++)
1646 SELECTED_DRIVE(channel).id_drive[i] = 0;
1648 // now convert the id_drive array (native 256 word format) to
1649 // the controller buffer (512 bytes)
1651 for (i = 0; i <= 255; i++) {
1652 temp16 = SELECTED_DRIVE(channel).id_drive[i];
1653 SELECTED_CONTROLLER(channel).buffer[i*2] = temp16 & 0x00ff;
1654 SELECTED_CONTROLLER(channel).buffer[i*2+1] = temp16 >> 8;
1663 void rd_raise_interrupt(struct channel_t *channels, Bit8u channel)
1666 struct vm_device *dev;
1668 Ramdisk_Print("[raise_interrupt] disable_irq = %02x\n", SELECTED_CONTROLLER(channel).control.disable_irq);
1670 if (!SELECTED_CONTROLLER(channel).control.disable_irq) {
1671 Ramdisk_Print("\t\traising interrupt\n");
1673 Ramdisk_Print("\t\tNot raising interrupt\n");
1675 if (!SELECTED_CONTROLLER(channel).control.disable_irq) {
1676 irq = channels[channel].irq;
1677 Ramdisk_Print("\t\tRaising interrupt %d {%s}\n\n", irq, SELECTED_TYPE_STRING(channel));
1678 // DEV_pic_raise_irq(irq);
1679 dev = (struct vm_device*) ramdisk_state->private_data;
1680 Ramdisk_Print("\t\tdev = %x\n", dev);
1681 dev->vm->vm_ops.raise_irq(dev->vm, irq);
1683 Ramdisk_Print("\t\tirq is disabled\n");
1690 void rd_lower_irq(struct vm_device *dev, Bit32u irq)// __attribute__(regparm(1))
1692 Ramdisk_Print("[lower_irq] irq = %d\n", irq);
1693 dev->vm->vm_ops.lower_irq(dev->vm, irq);
1701 uint_t ramdisk_read_port(ushort_t port,
1704 struct vm_device *dev)
1707 Ramdisk_Print("[ramdisk_read_port] port = %x, length = %d\n", port, length);
1710 ((uchar_t*)src)[0] = rd_read_handler(ramdisk_state->channels, port, length);
1713 ((ushort_t*)src)[0] = rd_read_handler(ramdisk_state->channels, port, length);
1716 ((uint_t*)src)[0] = rd_read_handler(ramdisk_state->channels, port, length);
1719 for (i = 0; i < length; i++) {
1720 ((uchar_t*)src)[i] = rd_read_handler(ramdisk_state->channels, port, 1);
1729 uint_t ramdisk_write_port(ushort_t port,
1732 struct vm_device *dev)
1734 Ramdisk_Print("[ramdisk_write_port] port = %x, length = %d\n", port, length);
1738 for (i = 0; i < length; i++)
1739 Ramdisk_Print("\t\tsrc[%d] = 0x%02x\n", i, ((uchar_t*)src)[i]);
1744 rd_write_handler(ramdisk_state->channels, port, *((uchar_t *)src), length);
1747 rd_write_handler(ramdisk_state->channels, port, *((ushort_t *)src), length);
1750 rd_write_handler(ramdisk_state->channels, port, *((uint_t *)src), length);
1753 rd_write_handler(ramdisk_state->channels, port, *((uchar_t *)src), length);
1761 static void trace_info(ushort_t port, void *src, uint_t length)
1766 if (length == 1 && *((uchar_t*) src) == ATA_DETECT)
1767 Ramdisk_Print("ata_dectect()\n");
1771 if (length == 1 && *((uchar_t*) src) == ATA_RESET)
1772 Ramdisk_Print("ata_reset()\n");
1776 if (length == 1 && *((uchar_t*) src) == ATA_CMD_DATA_IN)
1777 Ramdisk_Print("ata_cmd_data_in()\n");
1781 if (length == 1 && *((uchar_t*) src) == ATA_CMD_DATA_OUT)
1782 Ramdisk_Print("ata_cmd_data_out()\n");
1786 if (length == 1 && *((uchar_t*) src) == ATA_CMD_PACKET)
1787 Ramdisk_Print("ata_cmd_packet()\n");
1791 if (length == 1 && *((uchar_t*) src) == ATAPI_GET_SENSE)
1792 Ramdisk_Print("atapi_get_sense()\n");
1796 if (length == 1 && *((uchar_t*) src) == ATAPI_IS_READY)
1797 Ramdisk_Print("atapi_is_ready()\n");
1801 if (length == 1 && *((uchar_t*) src) == ATAPI_IS_CDROM)
1802 Ramdisk_Print("atapi_is_cdrom()\n");
1807 if (length == 1 && *((uchar_t*) src) == CDEMU_INIT)
1808 Ramdisk_Print("cdemu_init()\n");
1812 if (length == 1 && *((uchar_t*) src) == CDEMU_ISACTIVE)
1813 Ramdisk_Print("cdemu_isactive()\n");
1817 if (length == 1 && *((uchar_t*) src) == CDEMU_EMULATED_DRIVE)
1818 Ramdisk_Print("cdemu_emulated_drive()\n");
1822 if (length == 1 && *((uchar_t*) src) == CDROM_BOOT)
1823 Ramdisk_Print("cdrom_boot()\n");
1827 if (length == 1 && *((uchar_t*) src) == HARD_DRIVE_POST)
1828 Ramdisk_Print("ata_hard_drive_post()\n");
1833 Ramdisk_Print("ata_device_no(%d)\n", *((uchar_t*) src));
1838 Ramdisk_Print("ata_device_type(%d)\n", *((uchar_t*) src));
1842 if (length == 1 && *((uchar_t*) src) == INT13_HARDDISK)
1843 Ramdisk_Print("int13_harddrive()\n");
1847 if (length == 1 && *((uchar_t*) src) == INT13_CDROM)
1848 Ramdisk_Print("int13_cdrom()\n");
1852 if (length == 1 && *((uchar_t*) src) == INT13_CDEMU)
1853 Ramdisk_Print("int13_cdemu()\n");
1857 if (length == 1 && *((uchar_t*) src) == INT13_ELTORITO)
1858 Ramdisk_Print("int13_eltorito()\n");
1862 if (length == 1 && *((uchar_t*) src) == INT13_DISKETTE_FUNCTION)
1863 Ramdisk_Print("int13_diskette_function()\n");
1873 uint_t ramdisk_read_port_ignore(ushort_t port,
1876 struct vm_device *dev)
1878 // Ramdisk_Print("[ramdisk_read_port_ignore] port = %x, length = %d\n", port, length);
1882 uint_t ramdisk_write_port_ignore(ushort_t port,
1885 struct vm_device *dev)
1888 // Ramdisk_Print("[ramdisk_write_port_ignore] port = %x, length = %d\n", port, length);
1890 trace_info(port, src, length);
1894 //////////////////////////////////////////////////////////////////////////
1901 void rd_init_send_atapi_command(struct channel_t *channels, Bit8u channel, Bit8u command, int req_length, int alloc_length, bool lazy)
1903 // SELECTED_CONTROLLER(channel).byte_count is a union of SELECTED_CONTROLLER(channel).cylinder_no;
1904 // lazy is used to force a data read in the buffer at the next read.
1906 Ramdisk_Print("[rd_init_send_atapi_cmd]\n");
1907 if (SELECTED_CONTROLLER(channel).byte_count == 0xffff)
1908 SELECTED_CONTROLLER(channel).byte_count = 0xfffe;
1910 if ((SELECTED_CONTROLLER(channel).byte_count & 1)
1911 && !(alloc_length <= SELECTED_CONTROLLER(channel).byte_count)) {
1912 Ramdisk_Print("\t\tOdd byte count (0x%04x) to ATAPI command 0x%02x, using 0x%x\n",
1913 SELECTED_CONTROLLER(channel).byte_count, command, SELECTED_CONTROLLER(channel).byte_count - 1);
1914 SELECTED_CONTROLLER(channel).byte_count -= 1;
1917 if (SELECTED_CONTROLLER(channel).byte_count == 0)
1918 RD_PANIC("\t\tATAPI command with zero byte count\n");
1920 if (alloc_length < 0)
1921 RD_PANIC("\t\tAllocation length < 0\n");
1922 if (alloc_length == 0)
1923 alloc_length = SELECTED_CONTROLLER(channel).byte_count;
1925 SELECTED_CONTROLLER(channel).interrupt_reason.i_o = 1;
1926 SELECTED_CONTROLLER(channel).interrupt_reason.c_d = 0;
1927 SELECTED_CONTROLLER(channel).status.busy = 0;
1928 SELECTED_CONTROLLER(channel).status.drq = 1;
1929 SELECTED_CONTROLLER(channel).status.err = 0;
1931 // no bytes transfered yet
1933 SELECTED_CONTROLLER(channel).buffer_index = 2048;
1935 SELECTED_CONTROLLER(channel).buffer_index = 0;
1936 SELECTED_CONTROLLER(channel).drq_index = 0;
1938 if (SELECTED_CONTROLLER(channel).byte_count > req_length)
1939 SELECTED_CONTROLLER(channel).byte_count = req_length;
1941 if (SELECTED_CONTROLLER(channel).byte_count > alloc_length)
1942 SELECTED_CONTROLLER(channel).byte_count = alloc_length;
1944 SELECTED_DRIVE(channel).atapi.command = command;
1945 SELECTED_DRIVE(channel).atapi.drq_bytes = SELECTED_CONTROLLER(channel).byte_count;
1946 SELECTED_DRIVE(channel).atapi.total_bytes_remaining = (req_length < alloc_length) ? req_length : alloc_length;
1949 // // bias drq_bytes and total_bytes_remaining
1950 // SELECTED_DRIVE(channel).atapi.drq_bytes += 2048;
1951 // SELECTED_DRIVE(channel).atapi.total_bytes_remaining += 2048;
1957 void rd_atapi_cmd_error(struct channel_t *channels, Bit8u channel, sense_t sense_key, asc_t asc)
1959 Ramdisk_Print("[rd_atapi_cmd_error]\n");
1960 Ramdisk_Print("Error: atapi_cmd_error channel=%02x key=%02x asc=%02x\n", channel, sense_key, asc);
1962 SELECTED_CONTROLLER(channel).error_register = sense_key << 4;
1963 SELECTED_CONTROLLER(channel).interrupt_reason.i_o = 1;
1964 SELECTED_CONTROLLER(channel).interrupt_reason.c_d = 1;
1965 SELECTED_CONTROLLER(channel).interrupt_reason.rel = 0;
1966 SELECTED_CONTROLLER(channel).status.busy = 0;
1967 SELECTED_CONTROLLER(channel).status.drive_ready = 1;
1968 SELECTED_CONTROLLER(channel).status.write_fault = 0;
1969 SELECTED_CONTROLLER(channel).status.drq = 0;
1970 SELECTED_CONTROLLER(channel).status.err = 1;
1972 SELECTED_DRIVE(channel).sense.sense_key = sense_key;
1973 SELECTED_DRIVE(channel).sense.asc = asc;
1974 SELECTED_DRIVE(channel).sense.ascq = 0;
1979 void rd_atapi_cmd_nop(struct channel_t *channels, Bit8u channel)
1981 Ramdisk_Print("[rd_atapi_cmd_nop]\n");
1982 SELECTED_CONTROLLER(channel).interrupt_reason.i_o = 1;
1983 SELECTED_CONTROLLER(channel).interrupt_reason.c_d = 1;
1984 SELECTED_CONTROLLER(channel).interrupt_reason.rel = 0;
1985 SELECTED_CONTROLLER(channel).status.busy = 0;
1986 SELECTED_CONTROLLER(channel).status.drive_ready = 1;
1987 SELECTED_CONTROLLER(channel).status.drq = 0;
1988 SELECTED_CONTROLLER(channel).status.err = 0;
1993 void rd_init_mode_sense_single(struct channel_t *channels,
1994 Bit8u channel, const void* src, int size)
1996 Ramdisk_Print("[rd_init_mode_sense_single]\n");
1998 SELECTED_CONTROLLER(channel).buffer[0] = (size+6) >> 8;
1999 SELECTED_CONTROLLER(channel).buffer[1] = (size+6) & 0xff;
2000 SELECTED_CONTROLLER(channel).buffer[2] = 0x70; // no media present
2001 SELECTED_CONTROLLER(channel).buffer[3] = 0; // reserved
2002 SELECTED_CONTROLLER(channel).buffer[4] = 0; // reserved
2003 SELECTED_CONTROLLER(channel).buffer[5] = 0; // reserved
2004 SELECTED_CONTROLLER(channel).buffer[6] = 0; // reserved
2005 SELECTED_CONTROLLER(channel).buffer[7] = 0; // reserved
2008 memcpy(SELECTED_CONTROLLER(channel).buffer + 8, src, size);
2013 void rd_ready_to_send_atapi(struct channel_t *channels, Bit8u channel)
2015 Ramdisk_Print("[rd_ready_to_send_atapi]\n");
2016 rd_raise_interrupt(ramdisk_state->channels, channel);
2021 void rd_command_aborted(struct channel_t *channels,
2022 Bit8u channel, unsigned value)
2024 Ramdisk_Print("[rd_command_aborted]\n");
2025 Ramdisk_Print("\t\taborting on command 0x%02x {%s}\n", value, SELECTED_TYPE_STRING(channel));
2026 SELECTED_CONTROLLER(channel).current_command = 0;
2027 SELECTED_CONTROLLER(channel).status.busy = 0;
2028 SELECTED_CONTROLLER(channel).status.drive_ready = 1;
2029 SELECTED_CONTROLLER(channel).status.err = 1;
2030 SELECTED_CONTROLLER(channel).error_register = 0x04; // command ABORTED
2031 SELECTED_CONTROLLER(channel).status.drq = 0;
2032 SELECTED_CONTROLLER(channel).status.seek_complete = 0;
2033 SELECTED_CONTROLLER(channel).status.corrected_data = 0;
2034 SELECTED_CONTROLLER(channel).buffer_index = 0;
2035 rd_raise_interrupt(ramdisk_state->channels, channel);
2041 * Success: return 0;
2042 * Failure: return integer greater than 0
2045 struct ramdisk_t * create_ramdisk()
2047 struct ramdisk_t *ramdisk;
2048 ramdisk = (struct ramdisk_t *)V3_Malloc(sizeof(struct ramdisk_t));
2049 V3_ASSERT(ramdisk != NULL);
2051 ramdisk->cops.init = &rd_init_harddrive;
2052 ramdisk->cops.close = &rd_close_harddrive;
2053 ramdisk->cops.reset = &rd_reset_harddrive;
2055 ramdisk->eops.read_port = &ramdisk_read_port;
2056 ramdisk->eops.write_port = &ramdisk_write_port;
2057 ramdisk->eops.read_port_ignore = &ramdisk_read_port_ignore;
2058 ramdisk->eops.write_port_ignore = &ramdisk_write_port_ignore;