write to both IDE drives - return 0 for not present drives
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@672 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
		
							parent
							
								
									baca51faff
								
							
						
					
					
						commit
						c45c3d0059
					
				
							
								
								
									
										43
									
								
								hw/ide.c
									
									
									
									
									
								
							
							
						
						
									
										43
									
								
								hw/ide.c
									
									
									
									
									
								
							@ -1060,7 +1060,7 @@ static void cdrom_change_cb(void *opaque)
 | 
				
			|||||||
static void ide_ioport_write(void *opaque, uint32_t addr, uint32_t val)
 | 
					static void ide_ioport_write(void *opaque, uint32_t addr, uint32_t val)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    IDEState *ide_if = opaque;
 | 
					    IDEState *ide_if = opaque;
 | 
				
			||||||
    IDEState *s = ide_if->cur_drive;
 | 
					    IDEState *s;
 | 
				
			||||||
    int unit, n;
 | 
					    int unit, n;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef DEBUG_IDE
 | 
					#ifdef DEBUG_IDE
 | 
				
			||||||
@ -1071,28 +1071,35 @@ static void ide_ioport_write(void *opaque, uint32_t addr, uint32_t val)
 | 
				
			|||||||
    case 0:
 | 
					    case 0:
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
    case 1:
 | 
					    case 1:
 | 
				
			||||||
        s->feature = val;
 | 
					        /* NOTE: data is written to the two drives */
 | 
				
			||||||
 | 
					        ide_if[0].feature = val;
 | 
				
			||||||
 | 
					        ide_if[1].feature = val;
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
    case 2:
 | 
					    case 2:
 | 
				
			||||||
        if (val == 0)
 | 
					        if (val == 0)
 | 
				
			||||||
            val = 256;
 | 
					            val = 256;
 | 
				
			||||||
        s->nsector = val;
 | 
					        ide_if[0].nsector = val;
 | 
				
			||||||
 | 
					        ide_if[1].nsector = val;
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
    case 3:
 | 
					    case 3:
 | 
				
			||||||
        s->sector = val;
 | 
					        ide_if[0].sector = val;
 | 
				
			||||||
 | 
					        ide_if[1].sector = val;
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
    case 4:
 | 
					    case 4:
 | 
				
			||||||
        s->lcyl = val;
 | 
					        ide_if[0].lcyl = val;
 | 
				
			||||||
 | 
					        ide_if[1].lcyl = val;
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
    case 5:
 | 
					    case 5:
 | 
				
			||||||
        s->hcyl = val;
 | 
					        ide_if[0].hcyl = val;
 | 
				
			||||||
 | 
					        ide_if[1].hcyl = val;
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
    case 6:
 | 
					    case 6:
 | 
				
			||||||
 | 
					        ide_if[0].select = val & 0x4f;
 | 
				
			||||||
 | 
					        ide_if[1].select = val & 0x4f;
 | 
				
			||||||
        /* select drive */
 | 
					        /* select drive */
 | 
				
			||||||
        unit = (val >> 4) & 1;
 | 
					        unit = (val >> 4) & 1;
 | 
				
			||||||
        s = ide_if + unit;
 | 
					        s = ide_if + unit;
 | 
				
			||||||
        ide_if->cur_drive = s;
 | 
					        ide_if->cur_drive = s;
 | 
				
			||||||
        s->select = val;
 | 
					 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
    default:
 | 
					    default:
 | 
				
			||||||
    case 7:
 | 
					    case 7:
 | 
				
			||||||
@ -1100,6 +1107,7 @@ static void ide_ioport_write(void *opaque, uint32_t addr, uint32_t val)
 | 
				
			|||||||
#if defined(DEBUG_IDE)
 | 
					#if defined(DEBUG_IDE)
 | 
				
			||||||
        printf("ide: CMD=%02x\n", val);
 | 
					        printf("ide: CMD=%02x\n", val);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					        s = ide_if->cur_drive;
 | 
				
			||||||
        switch(val) {
 | 
					        switch(val) {
 | 
				
			||||||
        case WIN_IDENTIFY:
 | 
					        case WIN_IDENTIFY:
 | 
				
			||||||
            if (s->bs && !s->is_cdrom) {
 | 
					            if (s->bs && !s->is_cdrom) {
 | 
				
			||||||
@ -1228,25 +1236,46 @@ static uint32_t ide_ioport_read(void *opaque, uint32_t addr1)
 | 
				
			|||||||
        ret = 0xff;
 | 
					        ret = 0xff;
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
    case 1:
 | 
					    case 1:
 | 
				
			||||||
 | 
					        if (!s->bs)
 | 
				
			||||||
 | 
					            ret = 0;
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
            ret = s->error;
 | 
					            ret = s->error;
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
    case 2:
 | 
					    case 2:
 | 
				
			||||||
 | 
					        if (!s->bs)
 | 
				
			||||||
 | 
					            ret = 0;
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
            ret = s->nsector & 0xff;
 | 
					            ret = s->nsector & 0xff;
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
    case 3:
 | 
					    case 3:
 | 
				
			||||||
 | 
					        if (!s->bs)
 | 
				
			||||||
 | 
					            ret = 0;
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
            ret = s->sector;
 | 
					            ret = s->sector;
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
    case 4:
 | 
					    case 4:
 | 
				
			||||||
 | 
					        if (!s->bs)
 | 
				
			||||||
 | 
					            ret = 0;
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
            ret = s->lcyl;
 | 
					            ret = s->lcyl;
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
    case 5:
 | 
					    case 5:
 | 
				
			||||||
 | 
					        if (!s->bs)
 | 
				
			||||||
 | 
					            ret = 0;
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
            ret = s->hcyl;
 | 
					            ret = s->hcyl;
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
    case 6:
 | 
					    case 6:
 | 
				
			||||||
 | 
					        if (!s->bs)
 | 
				
			||||||
 | 
					            ret = 0;
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
            ret = s->select;
 | 
					            ret = s->select;
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
    default:
 | 
					    default:
 | 
				
			||||||
    case 7:
 | 
					    case 7:
 | 
				
			||||||
 | 
					        if (!s->bs)
 | 
				
			||||||
 | 
					            ret = 0;
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
            ret = s->status;
 | 
					            ret = s->status;
 | 
				
			||||||
        pic_set_irq(s->irq, 0);
 | 
					        pic_set_irq(s->irq, 0);
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user