More improvements for IOCTL generic block device request
Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@4115
This commit is contained in:
parent
31d7e74eac
commit
ff8d4f287f
2 changed files with 8 additions and 15 deletions
|
@ -1118,13 +1118,7 @@ static Bitu DOS_21Handler(void) {
|
|||
}
|
||||
reg_ch=0x08; // IOCTL category: disk drive
|
||||
reg_ax=0x440d; // Generic block device request
|
||||
if (DOS_IOCTL()) {
|
||||
reg_ax=0; // AX destroyed
|
||||
CALLBACK_SCF(false);
|
||||
} else {
|
||||
reg_ax=dos.errorcode;
|
||||
CALLBACK_SCF(true);
|
||||
}
|
||||
DOS_21Handler();
|
||||
reg_cx=old_cx;
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -156,22 +156,20 @@ bool DOS_IOCTL(void) {
|
|||
DOS_SetError(DOSERR_ACCESS_DENIED);
|
||||
return false;
|
||||
}
|
||||
if (Drives[drive]->isRemovable()) {
|
||||
if (reg_ch != 0x08 || Drives[drive]->isRemovable()) {
|
||||
DOS_SetError(DOSERR_FUNCTION_NUMBER_INVALID);
|
||||
return false;
|
||||
}
|
||||
PhysPt ptr = SegPhys(ds)+reg_dx;
|
||||
switch (reg_cl) {
|
||||
case 0x60: /* Get Device parameters */
|
||||
mem_writeb(ptr ,0x03); // special function
|
||||
mem_writeb(ptr+1,(drive>=2)?0x05:0x14); // fixed disc(5), 1.44 floppy(14)
|
||||
mem_writew(ptr+2,drive>=2); // nonremovable ?
|
||||
//mem_writeb(ptr+0,0); // special functions (call value)
|
||||
mem_writeb(ptr+1,(drive>=2)?0x05:0x07); // type: hard disk(5), 1.44 floppy(7)
|
||||
mem_writew(ptr+2,(drive>=2)?0x01:0x00); // attributes: bit 0 set for nonremovable
|
||||
mem_writew(ptr+4,0x0000); // num of cylinders
|
||||
mem_writeb(ptr+6,0x00); // media type (00=other type)
|
||||
// drive parameter block following
|
||||
mem_writeb(ptr+7,drive); // drive
|
||||
mem_writeb(ptr+8,0x00); // unit number
|
||||
mem_writed(ptr+0x1f,0xffffffff); // next parameter block
|
||||
// bios parameter block following
|
||||
mem_writew(ptr+7,0x0200); // bytes per sector (Win3 File Mgr. uses it)
|
||||
break;
|
||||
case 0x46: /* Set volume serial number */
|
||||
break;
|
||||
|
@ -205,6 +203,7 @@ bool DOS_IOCTL(void) {
|
|||
DOS_SetError(DOSERR_FUNCTION_NUMBER_INVALID);
|
||||
return false;
|
||||
}
|
||||
reg_ax=0;
|
||||
return true;
|
||||
}
|
||||
case 0x0E: /* Get Logical Drive Map */
|
||||
|
|
Loading…
Add table
Reference in a new issue