pce-cd: fix Snatcher, Madou Monogatari, Tangai Makyo, ValisIII playable now

This commit is contained in:
beirich 2011-09-25 23:34:53 +00:00
parent 4f072f8623
commit e5f1c142f8
5 changed files with 30 additions and 25 deletions

View File

@ -49,6 +49,7 @@ namespace BizHawk.Emulation.Consoles.TurboGrafx
void WriteArcadeCard(int addr, byte value)
{
if (ArcadeCard == false) return;
var page = ArcadePage[(addr >> 4) & 3];
switch (addr & 0x0F)
{
@ -110,6 +111,7 @@ namespace BizHawk.Emulation.Consoles.TurboGrafx
byte ReadArcadeCard(int addr)
{
if (ArcadeCard == false) return 0xFF;
var page = ArcadePage[(addr >> 4) & 3];
switch (addr & 0x0F)
{

View File

@ -21,18 +21,11 @@ Still some lesser issues with cancelling a fadeout. Otherwise CDDA is working no
Arcade Card games:
- JANSHIN DENSETSU sets the T flag prior to an LDA instruction; MANY TIMES (ie it doesnt seem to be an accident).
Unclear if T flag actually affects LDA instruction.
- Madou Monogatari - Dies requesting more tracks than exist
- Ryuuko no Ken is all messed up, and I don't super care :|
- Tengai Makyo eventually died requesting 0 sectors read
- Rayxanber 2 weird issues at the end of first level with cd audio player
- Record of Lodoss War wont start game from title screen
- Snatcher dies at startup while polling subcode, demonstrating the incorrectness of subcode polling code.. yeah that hangs together
- Valis: Screen is black during entire intro section
- Valis III: Dies with 'request more tracks than exist'
card angels does poll subcode...
- Valis III: playable,gfx issue on title screen... possible due to not updating VDC regs on LSB? really should just fix that once at for all...
======= TurboGrafx compatibility issues =======
@ -42,6 +35,11 @@ General:
Most emulators simply crop the screen at a certain vertical range. For now, I have chosen not to do this.
Right now the emulator is simply displaying a framebuffer. Eventually, we will do an update that emulates NTSC.
But for now we're letting this be. There's no intermediate step between emulating a framebuffer and emulating a TV.
+ Adding to this, there are only a handful of Hucards that do crazy thing with screen resolution, and our framebuffer
approach mostly seems reasonable. On TurboCD the situation changes somewhat, while the normal "gameplay" screens
are pretty standard, the various intro screens tend to do much more crazy stuff with the 'active display region'
much more frequently than was done on Hucards, and our framebuffer/active display strategy starts to look more silly.
Oh well, though. Changing this is a Native Version Core feature, not a C# Core feature.
Eagan's Rendered Sprite Demo - demonstrates sprites that shouldnt be displayed (so does Turbo Engine!)

View File

@ -385,14 +385,14 @@ namespace BizHawk.Emulation.Consoles.TurboGrafx
sector |= CommandBuffer[2] << 8;
sector |= CommandBuffer[3];
if (CommandBuffer[4] == 0)
throw new Exception("requesting 0 sectors read.............................");
DataReadInProgress = true;
DataTransferInProgress = true;
CurrentReadingSector = sector;
SectorsLeftToRead = CommandBuffer[4];
if (CommandBuffer[4] == 0)
SectorsLeftToRead = 256;
Console.WriteLine("STARTED READ: {0} SECTORS FROM {1}",SectorsLeftToRead, CurrentReadingSector);
DataReadWaitTimer = pce.Cpu.TotalExecutedCycles + 5000; // figure out proper read delay later
pce.CDAudio.Stop();
@ -421,6 +421,7 @@ throw new Exception("requesting 0 sectors read.............................");
if (CommandBuffer[1] == 0)
{
pce.CDAudio.PlayStartingAtLba(audioStartLBA);
pce.CDAudio.Pause();
} else {
pce.CDAudio.PlayStartingAtLba(audioStartLBA);
@ -464,8 +465,7 @@ throw new Exception("requesting 0 sectors read.............................");
pce.CDAudio.EndLBA = audioEndLBA;
pce.CDAudio.PlayMode = CDAudio.PlaybackMode.LoopOnCompletion;
break;
case 2: // Play audio, fire IRQ2 when end position reached
Console.WriteLine("***********STOP MODE 2 ENGAGED. IT IS CONCEIVABLE THAT IRQ WILL FIRE.");
case 2: // Play audio, fire IRQ2 when end position reached, maybe
pce.CDAudio.PlayStartingAtLba(audioStartLBA);
pce.CDAudio.EndLBA = audioEndLBA;
pce.CDAudio.PlayMode = CDAudio.PlaybackMode.CallbackOnCompletion;
@ -487,11 +487,8 @@ throw new Exception("requesting 0 sectors read.............................");
void CommandReadSubcodeQ()
{
Console.WriteLine("poll subcode");
// TODO we are lacking some various things here. But we know when it gets used and it doesnt
// seem to be used that often.
var sectorEntry = disc.ReadLBA_SectorEntry(pce.CDAudio.CurrentSector);
bool playing = pce.CDAudio.Mode != CDAudio.CDAudioMode.Stopped;
var sectorEntry = disc.ReadLBA_SectorEntry(playing ? pce.CDAudio.CurrentSector : CurrentReadingSector);
DataIn.Clear();
@ -511,6 +508,7 @@ throw new Exception("requesting 0 sectors read.............................");
DataIn.Enqueue(sectorEntry.q_amin.BCDValue); // M(abs)
DataIn.Enqueue(sectorEntry.q_asec.BCDValue); // S(abs)
DataIn.Enqueue(sectorEntry.q_aframe.BCDValue); // F(abs)
SetPhase(BusPhase.DataIn);
}
@ -543,14 +541,20 @@ throw new Exception("requesting 0 sectors read.............................");
case 2: // Return starting position of specified track in MSF format
{
int track = CommandBuffer[2].BCDtoBin();
var tracks = disc.TOC.Sessions[0].Tracks;
if (CommandBuffer[2] > 0x99)
throw new Exception("invalid track number BCD request... is something I need to handle?");
if (track == 0) track = 1;
track--;
if (track > disc.TOC.Sessions[0].Tracks.Count)
throw new Exception("Request more tracks than exist.... need to do error handling");
int lbaPos = disc.TOC.Sessions[0].Tracks[track].Indexes[1].aba - 150;
int lbaPos;
if (track > tracks.Count)
lbaPos = disc.TOC.Sessions[0].length_aba - 150;
else
lbaPos = tracks[track].Indexes[1].aba - 150;
byte m, s, f;
Disc.ConvertLBAtoMSF(lbaPos, out m, out s, out f);
@ -558,7 +562,8 @@ throw new Exception("requesting 0 sectors read.............................");
DataIn.Enqueue(m.BinToBCD());
DataIn.Enqueue(s.BinToBCD());
DataIn.Enqueue(f.BinToBCD());
if (disc.TOC.Sessions[0].Tracks[track].TrackType == ETrackType.Audio)
if (track > tracks.Count || disc.TOC.Sessions[0].Tracks[track].TrackType == ETrackType.Audio)
DataIn.Enqueue(0);
else
DataIn.Enqueue(4);
@ -831,6 +836,5 @@ throw new Exception("requesting 0 sectors read.............................");
Console.WriteLine("Skipping unrecognized identifier " + args[0]);
}
}
}
}

View File

@ -70,7 +70,7 @@ namespace BizHawk.Emulation.Sound
public void PlayStartingAtLba(int lba)
{
var point = Disc.TOC.SeekPoint(lba);
if (point == null) return;
if (point == null || point.Track == null) return;
PlayingTrack = point.TrackNum;
StartLBA = lba;

View File

@ -86,7 +86,8 @@ A52AB896E603673E6EA30C1769449DF4 Mystic Formula PCE NeedSuperSysCard
C80A4ACE402AB5D7D72D2CA643A108A6 Prince of Persia (U) PCE NeedSuperSysCard;HBlankPeriod=89
F338D84D2B3E77DD81D611964C0D460F Psychic Storm PCE NeedSuperSysCard;EqualizeVolumes
B16C8BC632CBDEC676B9874E39975DDD Puyo Puyo CD PCE NeedSuperSysCard
9398887DB9C2771F1FBB3D4FEF561A14 Rayxanber II PCE
1CB8337E94FFECDCD580A5610E1D5C8F Rayxanber II PCE
9398887DB9C2771F1FBB3D4FEF561A14 V Rayxanber II (bad dump) PCE
7FEC58BDB95CBF1F3AE553933DB5F60B Rayxanber III PCE NeedSuperSysCard
8EE01CE7C09A7F222180E9A550621EC5 Ryuuko no Ken PCE NeedSuperSysCard;ArcadeCard
CBA55D463FECF2955736AA2EA5D6BD74 Lodoss Tousenki - Record of Lodoss War PCE