Skip to content

Commit

Permalink
Change track and data registers for all drives together. When I imple…
Browse files Browse the repository at this point in the history
…mented FDC, I did not know FDC was not aware of multiple drives and asumed one FDC could handle four drives, but one FDC can handle one drive at a time, and drive-selection is done outside of the FDC. This difference was not causing any known problem until now. But, you can break it in Dragon Slayer Legend of Heroes 1 Chapter 1 by saving data in the castle before the boss-battle, close Tsugaru, open again, and continue from the saved data.
  • Loading branch information
captainys committed Jan 6, 2025
1 parent 81eef7b commit cfc80b8
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 7 deletions.
14 changes: 14 additions & 0 deletions src/diskdrive/diskdrive.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1831,3 +1831,17 @@ void DiskDrive::SetSectorReg(int num)
state.drive[2]._sectorReg=num;
state.drive[3]._sectorReg=num;
}
void DiskDrive::SetTrackReg(int num)
{
state.drive[0].trackReg=num;
state.drive[1].trackReg=num;
state.drive[2].trackReg=num;
state.drive[3].trackReg=num;
}
void DiskDrive::SetDataReg(int num)
{
state.drive[0].dataReg=num;
state.drive[1].dataReg=num;
state.drive[2].dataReg=num;
state.drive[3].dataReg=num;
}
2 changes: 2 additions & 0 deletions src/diskdrive/diskdrive.h
Original file line number Diff line number Diff line change
Expand Up @@ -364,6 +364,8 @@ class DiskDrive : public Device
int GetTrackReg(void) const;
int GetSectorReg(void) const;
int GetSectorReg(unsigned int drvSel) const;
void SetTrackReg(int num);
void SetDataReg(int num);
void SetSectorReg(int num);


Expand Down
14 changes: 7 additions & 7 deletions src/towns/fdc/fdc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ void TownsFDC::MakeReady(void)
townsPtr->UnscheduleDeviceCallBack(*this);
MakeReady();
drv.trackPos=0;
drv.trackReg=0;
SetTrackReg(0);
break;
case 0x10: // Seek
townsPtr->UnscheduleDeviceCallBack(*this);
Expand All @@ -85,7 +85,7 @@ void TownsFDC::MakeReady(void)
drv.trackPos=drv.dataReg;
if(state.lastCmd&0x10)
{
drv.trackReg=drv.trackPos;
SetTrackReg(drv.trackPos);
}
break;
case 0x20: // Step?
Expand All @@ -103,7 +103,7 @@ void TownsFDC::MakeReady(void)
}
if(state.lastCmd&0x10)
{
drv.trackReg=drv.trackPos;
SetTrackReg(drv.trackPos);
}
break;
case 0x40: // Step In
Expand All @@ -117,7 +117,7 @@ void TownsFDC::MakeReady(void)
}
if(state.lastCmd&0x10)
{
drv.trackReg=drv.trackPos;
SetTrackReg(drv.trackPos);
}
break;
case 0x60: // Step Out
Expand All @@ -130,7 +130,7 @@ void TownsFDC::MakeReady(void)
}
if(state.lastCmd&0x10)
{
drv.trackReg=drv.trackPos;
SetTrackReg(drv.trackPos);
}
break;

Expand Down Expand Up @@ -573,13 +573,13 @@ void TownsFDC::MakeReady(void)
}
break;
case TOWNSIO_FDC_TRACK:// 0x202, // [2] pp.253
state.drive[DriveSelect()].trackReg=data;
SetTrackReg(data);
break;
case TOWNSIO_FDC_SECTOR:// 0x204, // [2] pp.253
SetSectorReg(data);
break;
case TOWNSIO_FDC_DATA:// 0x205, // [2] pp.253
state.drive[DriveSelect()].dataReg=data;
SetDataReg(data);
break;
case TOWNSIO_FDC_DRIVE_STATUS_CONTROL:// 0x208, // [2] pp.253
state.IRQMSK=(0!=(data&1));
Expand Down

0 comments on commit cfc80b8

Please sign in to comment.