1
0
Fork 0

Add Unit Number and Bytes Per Sector fields for DPB entries. Fixes Air Power installer and Windows 3 Virtual Memory dialog.

Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@4168
This commit is contained in:
ripsaw8080 2018-10-11 15:05:28 +00:00
parent c3aca8dc44
commit 07c2d06ae5
5 changed files with 12 additions and 10 deletions

View file

@ -497,7 +497,7 @@ static Bitu DOS_21Handler(void) {
if (drive < DOS_DRIVES && Drives[drive] && !Drives[drive]->isRemovable()) {
reg_al = 0x00;
SegSet16(ds,dos.tables.dpb);
reg_bx = drive*5;//Faking the first entry (drive number) and media id
reg_bx = drive*9;
LOG(LOG_DOSMISC,LOG_ERROR)("Get drive parameter block.");
} else {
reg_al=0xff;

View file

@ -1288,7 +1288,7 @@ bool DOS_GetAllocationInfo(Bit8u drive,Bit16u * _bytes_sector,Bit8u * _sectors_c
Bit16u _free_clusters;
Drives[drive]->AllocationInfo(_bytes_sector,_sectors_cluster,_total_clusters,&_free_clusters);
SegSet16(ds,RealSeg(dos.tables.mediaid));
reg_bx=RealOff(dos.tables.mediaid+drive*5);
reg_bx=RealOff(dos.tables.mediaid+drive*9);
return true;
}

View file

@ -90,7 +90,7 @@ static bool DOS_MultiplexFunctions(void) {
mem_writew(sftptr+sftofs+0x02,(Bit16u)(Files[reg_bx]->flags&3)); // file open mode
mem_writeb(sftptr+sftofs+0x04,(Bit8u)(Files[reg_bx]->attr)); // file attribute
mem_writew(sftptr+sftofs+0x05,0x40|drive); // device info word
mem_writed(sftptr+sftofs+0x07,RealMake(dos.tables.dpb,drive*5)); // dpb of the drive
mem_writed(sftptr+sftofs+0x07,RealMake(dos.tables.dpb,drive*9)); // dpb of the drive
mem_writew(sftptr+sftofs+0x0d,Files[reg_bx]->time); // packed file time
mem_writew(sftptr+sftofs+0x0f,Files[reg_bx]->date); // packed file date
Bit32u curpos=0;

View file

@ -126,7 +126,7 @@ public:
switch (DriveManager::UnmountDrive(i_drive)) {
case 0:
Drives[i_drive] = 0;
mem_writeb(Real2Phys(dos.tables.mediaid)+i_drive*5,0);
mem_writeb(Real2Phys(dos.tables.mediaid)+i_drive*9,0);
if(i_drive == DOS_GetDefaultDrive())
DOS_SetDrive(ZDRIVE_NUM);
WriteOut(MSG_Get("PROGRAM_MOUNT_UMOUNT_SUCCESS"),umount[0]);
@ -395,7 +395,7 @@ public:
if (!newdrive) E_Exit("DOS:Can't create drive");
Drives[drive-'A']=newdrive;
/* Set the correct media byte in the table */
mem_writeb(Real2Phys(dos.tables.mediaid)+(drive-'A')*5,newdrive->GetMediaByte());
mem_writeb(Real2Phys(dos.tables.mediaid)+(drive-'A')*9,newdrive->GetMediaByte());
WriteOut(MSG_Get("PROGRAM_MOUNT_STATUS_2"),drive,newdrive->GetInfo());
/* check if volume label is given and don't allow it to updated in the future */
if (cmd->FindString("-label",label,true)) newdrive->dirCache.SetLabel(label.c_str(),iscdrom,false);
@ -1313,7 +1313,7 @@ public:
DriveManager::InitializeDrive(drive - 'A');
// Set the correct media byte in the table
mem_writeb(Real2Phys(dos.tables.mediaid) + (drive - 'A') * 5, mediaid);
mem_writeb(Real2Phys(dos.tables.mediaid) + (drive - 'A') * 9, mediaid);
/* Command uses dta so set it to our internal dta */
RealPt save_dta = dos.dta();
@ -1393,7 +1393,7 @@ public:
DriveManager::InitializeDrive(drive - 'A');
// Set the correct media byte in the table
mem_writeb(Real2Phys(dos.tables.mediaid) + (drive - 'A') * 5, mediaid);
mem_writeb(Real2Phys(dos.tables.mediaid) + (drive - 'A') * 9, mediaid);
// Print status message (success)
WriteOut(MSG_Get("MSCDEX_SUCCESS"));

View file

@ -148,11 +148,13 @@ void DOS_SetupTables(void) {
dos_infoblock.SetFCBTable(RealMake(seg,0));
/* Create a fake DPB */
dos.tables.dpb=DOS_GetMemory(10);
dos.tables.dpb=DOS_GetMemory(16);
dos.tables.mediaid=RealMake(dos.tables.dpb,0x17); //Media ID offset in DPB
for (i=0;i<DOS_DRIVES;i++) {
real_writeb(dos.tables.dpb,i*5,i);
mem_writew(Real2Phys(dos.tables.mediaid)+i*5,0);
real_writeb(dos.tables.dpb,i*9,i); // drive number
real_writeb(dos.tables.dpb,i*9+1,i); // unit number
real_writew(dos.tables.dpb,i*9+2,0x0200); // bytes per sector
mem_writew(Real2Phys(dos.tables.mediaid)+i*9,0);
}
/* Create a fake disk buffer head */