1
0
Fork 0

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:
ripsaw8080 2018-05-22 15:07:38 +00:00
parent a8633eff6a
commit cd9e7b3c07
2 changed files with 25 additions and 11 deletions

View file

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

View file

@ -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 :