mirror of
https://github.com/ApfelTeeSaft/Yaroze.NET.git
synced 2026-08-26 19:43:27 +00:00
167 lines
4.4 KiB
C#
167 lines
4.4 KiB
C#
using System.IO;
|
|
using Xunit;
|
|
using Yaroze.Core.CDROM;
|
|
using Yaroze.Core.Interrupts;
|
|
|
|
namespace Yaroze.Tests.CDROM;
|
|
|
|
public class CdRomDeviceTests
|
|
{
|
|
[Fact]
|
|
public void CdRomDevice_ContainsCorrectAddressRange()
|
|
{
|
|
// Arrange
|
|
var interrupts = new InterruptController();
|
|
var cdrom = new CdRomDevice(interrupts);
|
|
|
|
// Act & Assert
|
|
Assert.True(cdrom.Contains(0x1F801800));
|
|
Assert.True(cdrom.Contains(0x1F801801));
|
|
Assert.True(cdrom.Contains(0x1F801802));
|
|
Assert.True(cdrom.Contains(0x1F801803));
|
|
Assert.False(cdrom.Contains(0x1F801804));
|
|
Assert.False(cdrom.Contains(0x1F8017FF));
|
|
}
|
|
|
|
[Fact]
|
|
public void CdRomDevice_ReadsStatus()
|
|
{
|
|
// Arrange
|
|
var interrupts = new InterruptController();
|
|
var cdrom = new CdRomDevice(interrupts);
|
|
|
|
// Act
|
|
byte status = cdrom.Read8(0x1F801800);
|
|
|
|
// Assert
|
|
// Initial status should have index 0, empty FIFOs
|
|
Assert.Equal(0, status & 0x03); // Index = 0
|
|
Assert.Equal(0, status & 0x20); // Response FIFO empty
|
|
}
|
|
|
|
[Fact]
|
|
public void CdRomDevice_WritesIndexRegister()
|
|
{
|
|
// Arrange
|
|
var interrupts = new InterruptController();
|
|
var cdrom = new CdRomDevice(interrupts);
|
|
|
|
// Act
|
|
cdrom.Write8(0x1F801800, 0x01); // Set index to 1
|
|
byte status = cdrom.Read8(0x1F801800);
|
|
|
|
// Assert
|
|
Assert.Equal(0x01, status & 0x03); // Index should be 1
|
|
}
|
|
|
|
[Fact]
|
|
public void CdRomDevice_ExecutesGetStatCommand()
|
|
{
|
|
// Arrange
|
|
var interrupts = new InterruptController();
|
|
var cdrom = new CdRomDevice(interrupts);
|
|
|
|
// Act
|
|
cdrom.Write8(0x1F801800, 0x00); // Set index to 0
|
|
cdrom.Write8(0x1F801801, 0x01); // Execute GetStat command
|
|
|
|
// Read response
|
|
byte response = cdrom.Read8(0x1F801801);
|
|
|
|
// Assert
|
|
Assert.Equal(0x02, response); // Motor on status
|
|
}
|
|
|
|
[Fact]
|
|
public void CdRomDevice_HandlesSetLocCommand()
|
|
{
|
|
// Arrange
|
|
var interrupts = new InterruptController();
|
|
var cdrom = new CdRomDevice(interrupts);
|
|
|
|
// Act
|
|
cdrom.Write8(0x1F801800, 0x00); // Set index to 0
|
|
|
|
// Send SetLoc parameters (MM, SS, FF in BCD)
|
|
cdrom.Write8(0x1F801802, 0x00); // 00 minutes
|
|
cdrom.Write8(0x1F801802, 0x02); // 02 seconds
|
|
cdrom.Write8(0x1F801802, 0x00); // 00 frames
|
|
|
|
// Execute SetLoc command
|
|
cdrom.Write8(0x1F801801, 0x02);
|
|
|
|
// Read response
|
|
byte response = cdrom.Read8(0x1F801801);
|
|
|
|
// Assert
|
|
Assert.Equal(0x02, response); // Motor on status
|
|
}
|
|
|
|
[Fact]
|
|
public void CdRomDevice_LoadsDisc()
|
|
{
|
|
// Arrange
|
|
var interrupts = new InterruptController();
|
|
var cdrom = new CdRomDevice(interrupts);
|
|
|
|
var binPath = CreateTempBinFile(2352 * 100);
|
|
|
|
try
|
|
{
|
|
// Act
|
|
cdrom.LoadDisc(binPath);
|
|
|
|
// Assert - no exception should be thrown
|
|
// Device should be ready to read sectors
|
|
Assert.True(true);
|
|
}
|
|
finally
|
|
{
|
|
File.Delete(binPath);
|
|
}
|
|
}
|
|
|
|
[Fact]
|
|
public void CdRomDevice_ResetClearsState()
|
|
{
|
|
// Arrange
|
|
var interrupts = new InterruptController();
|
|
var cdrom = new CdRomDevice(interrupts);
|
|
|
|
// Set some state
|
|
cdrom.Write8(0x1F801800, 0x02); // Set index to 2
|
|
cdrom.Write8(0x1F801802, 0xFF); // Write parameter
|
|
|
|
// Act
|
|
cdrom.Reset();
|
|
|
|
// Assert
|
|
byte status = cdrom.Read8(0x1F801800);
|
|
Assert.Equal(0, status & 0x03); // Index should be 0
|
|
Assert.Equal(0, status & 0x08); // Parameter FIFO should be empty
|
|
}
|
|
|
|
[Fact]
|
|
public void CdRomDevice_ReadsDmaWord()
|
|
{
|
|
// Arrange
|
|
var interrupts = new InterruptController();
|
|
var cdrom = new CdRomDevice(interrupts);
|
|
|
|
// Act
|
|
uint word = cdrom.ReadDmaWord();
|
|
|
|
// Assert - Should return 0 when no data is loaded
|
|
// (actual behavior depends on implementation)
|
|
Assert.True(true); // Just verify no exception
|
|
}
|
|
|
|
private string CreateTempBinFile(int size)
|
|
{
|
|
var tempPath = Path.Combine(Path.GetTempPath(), $"test_{System.Guid.NewGuid()}.bin");
|
|
var data = new byte[size];
|
|
File.WriteAllBytes(tempPath, data);
|
|
return tempPath;
|
|
}
|
|
}
|