Improve disk serial number DOS functions.
Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@4102
This commit is contained in:
parent
a8633eff6a
commit
cd9e7b3c07
2 changed files with 25 additions and 11 deletions
|
@ -1103,16 +1103,29 @@ static Bitu DOS_21Handler(void) {
|
|||
break;
|
||||
case 0x69: /* Get/Set disk serial number */
|
||||
{
|
||||
Bit16u old_cx=reg_cx;
|
||||
switch(reg_al) {
|
||||
case 0x00: /* Get */
|
||||
LOG(LOG_DOSMISC,LOG_ERROR)("DOS:Get Disk serial number");
|
||||
CALLBACK_SCF(true);
|
||||
LOG(LOG_DOSMISC,LOG_WARN)("DOS:Get Disk serial number");
|
||||
reg_cl=0x66;// IOCTL function
|
||||
break;
|
||||
case 0x01: /* Set */
|
||||
LOG(LOG_DOSMISC,LOG_WARN)("DOS:Set Disk serial number");
|
||||
reg_cl=0x46;// IOCTL function
|
||||
break;
|
||||
case 0x01:
|
||||
LOG(LOG_DOSMISC,LOG_ERROR)("DOS:Set Disk serial number");
|
||||
default:
|
||||
E_Exit("DOS:Illegal Get Serial Number call %2X",reg_al);
|
||||
}
|
||||
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);
|
||||
}
|
||||
reg_cx=old_cx;
|
||||
break;
|
||||
}
|
||||
case 0x6c: /* Extended Open/Create */
|
||||
|
|
|
@ -152,7 +152,7 @@ bool DOS_IOCTL(void) {
|
|||
return true;
|
||||
case 0x0D: /* Generic block device request */
|
||||
{
|
||||
if ((drive < 2) || Drives[drive]->isRemovable()) {
|
||||
if (Drives[drive]->isRemovable()) {
|
||||
DOS_SetError(DOSERR_FUNCTION_NUMBER_INVALID);
|
||||
return false;
|
||||
}
|
||||
|
@ -169,11 +169,12 @@ bool DOS_IOCTL(void) {
|
|||
mem_writeb(ptr+8,0x00); // unit number
|
||||
mem_writed(ptr+0x1f,0xffffffff); // next parameter block
|
||||
break;
|
||||
case 0x46:
|
||||
case 0x66: /* Volume label */
|
||||
case 0x46: /* Set volume serial number */
|
||||
break;
|
||||
case 0x66: /* Get volume serial number */
|
||||
{
|
||||
char const* bufin=Drives[drive]->GetLabel();
|
||||
char buffer[11] ={' '};
|
||||
char buffer[11];memset(buffer,' ',11);
|
||||
|
||||
char const* find_ext=strchr(bufin,'.');
|
||||
if (find_ext) {
|
||||
|
@ -181,7 +182,7 @@ bool DOS_IOCTL(void) {
|
|||
if (size>8) size=8;
|
||||
memcpy(buffer,bufin,size);
|
||||
find_ext++;
|
||||
memcpy(buffer+size,find_ext,(strlen(find_ext)>3) ? 3 : strlen(find_ext));
|
||||
memcpy(buffer+8,find_ext,(strlen(find_ext)>3) ? 3 : strlen(find_ext));
|
||||
} else {
|
||||
memcpy(buffer,bufin,(strlen(bufin) > 8) ? 8 : strlen(bufin));
|
||||
}
|
||||
|
@ -189,10 +190,10 @@ bool DOS_IOCTL(void) {
|
|||
char buf2[8]={ 'F','A','T','1','6',' ',' ',' '};
|
||||
if(drive<2) buf2[4] = '2'; //FAT12 for floppies
|
||||
|
||||
mem_writew(ptr+0,0); // 0
|
||||
//mem_writew(ptr+0,0); //Info level (call value)
|
||||
mem_writed(ptr+2,0x1234); //Serial number
|
||||
MEM_BlockWrite(ptr+6,buffer,11);//volumename
|
||||
if(reg_cl == 0x66) MEM_BlockWrite(ptr+0x11, buf2,8);//filesystem
|
||||
MEM_BlockWrite(ptr+0x11,buf2,8);//filesystem
|
||||
}
|
||||
break;
|
||||
default :
|
||||
|
|
Loading…
Add table
Reference in a new issue