1
0
Fork 0

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:
ripsaw8080 2018-06-12 20:18:42 +00:00
parent 31d7e74eac
commit ff8d4f287f
2 changed files with 8 additions and 15 deletions

View file

@ -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;
}

View file

@ -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 */