diff --git a/src/dos/dos.cpp b/src/dos/dos.cpp index e4826165..b7735526 100644 --- a/src/dos/dos.cpp +++ b/src/dos/dos.cpp @@ -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 */ diff --git a/src/dos/dos_ioctl.cpp b/src/dos/dos_ioctl.cpp index 52e5d37d..992e6b2b 100644 --- a/src/dos/dos_ioctl.cpp +++ b/src/dos/dos_ioctl.cpp @@ -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 :