mirror of
https://github.com/livingcomputermuseum/ContrAlto.git
synced 2026-01-30 21:32:11 +00:00
- Orbit controller: implemented and passes ROS-less diagnostics - ROS: In progress, not functional - DAC: For Ted Kaehler's Smalltalk Music system (FM and Sampling). Works, generates audio and can capture to WAV file. - Organ keybard: Stub, enough implemented to make the music system happy (so it will play back music and not crash.) Some minor cleanup. New dependency on NAudio package for DAC playback. Installer updated to include NAudio lib.
266 lines
8.8 KiB
C#
266 lines
8.8 KiB
C#
/*
|
|
This file is part of ContrAlto.
|
|
|
|
ContrAlto is free software: you can redistribute it and/or modify
|
|
it under the terms of the GNU Affero General Public License as published by
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
ContrAlto is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU Affero General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Affero General Public License
|
|
along with ContrAlto. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
using Contralto.Logging;
|
|
using System;
|
|
using System.IO;
|
|
|
|
namespace Contralto
|
|
{
|
|
/// <summary>
|
|
/// The configuration of the Alto to emulate
|
|
/// </summary>
|
|
public enum SystemType
|
|
{
|
|
/// <summary>
|
|
/// Alto I System with 1K ROM, 1K RAM
|
|
/// </summary>
|
|
AltoI,
|
|
|
|
/// <summary>
|
|
/// Alto II XM System with the standard 1K ROM, 1K RAM
|
|
/// </summary>
|
|
OneKRom,
|
|
|
|
/// <summary>
|
|
/// Alto II XM System with 2K ROM, 1K RAM
|
|
/// </summary>
|
|
TwoKRom,
|
|
|
|
/// <summary>
|
|
/// Alto II XM System with 3K RAM
|
|
/// </summary>
|
|
ThreeKRam,
|
|
}
|
|
|
|
public enum PacketInterfaceType
|
|
{
|
|
/// <summary>
|
|
/// Encapsulate frames inside raw ethernet frames on the host interface.
|
|
/// Requires PCAP.
|
|
/// </summary>
|
|
EthernetEncapsulation,
|
|
|
|
/// <summary>
|
|
/// Encapsulate frames inside UDP datagrams on the host interface.
|
|
/// </summary>
|
|
UDPEncapsulation,
|
|
|
|
/// <summary>
|
|
/// No encapsulation; sent packets are dropped on the floor and no packets are received.
|
|
/// </summary>
|
|
None,
|
|
}
|
|
|
|
public enum AlternateBootType
|
|
{
|
|
None,
|
|
Disk,
|
|
Ethernet,
|
|
}
|
|
|
|
public enum PlatformType
|
|
{
|
|
Windows,
|
|
Unix
|
|
}
|
|
|
|
/// <summary>
|
|
/// Encapsulates user-configurable settings. To be enhanced.
|
|
/// </summary>
|
|
public class Configuration
|
|
{
|
|
static Configuration()
|
|
{
|
|
// Initialize things to defaults.
|
|
HostAddress = 0x22;
|
|
|
|
BootAddress = 0;
|
|
BootFile = 0;
|
|
|
|
SystemType = SystemType.TwoKRom;
|
|
|
|
InterlaceDisplay = false;
|
|
|
|
ThrottleSpeed = true;
|
|
|
|
switch(Environment.OSVersion.Platform)
|
|
{
|
|
case PlatformID.MacOSX:
|
|
case PlatformID.Unix:
|
|
Platform = PlatformType.Unix;
|
|
break;
|
|
|
|
default:
|
|
Platform = PlatformType.Windows;
|
|
break;
|
|
}
|
|
|
|
ReadConfiguration();
|
|
|
|
// Special case: On first startup, AlternateBoot will come back as "None" which
|
|
// is an invalid UI setting; default to Ethernet in this case.
|
|
if (AlternateBootType == AlternateBootType.None)
|
|
{
|
|
AlternateBootType = AlternateBootType.Ethernet;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// What kind of system we're running on. (Not technically configurable.)
|
|
/// </summary>
|
|
public static PlatformType Platform;
|
|
|
|
/// <summary>
|
|
/// The type of Alto II to emulate
|
|
/// </summary>
|
|
public static SystemType SystemType;
|
|
|
|
/// <summary>
|
|
/// The currently loaded image for Drive 0
|
|
/// </summary>
|
|
public static string Drive0Image;
|
|
|
|
/// <summary>
|
|
/// The currently loaded image for Drive 1
|
|
/// </summary>
|
|
public static string Drive1Image;
|
|
|
|
/// <summary>
|
|
/// The Ethernet host address for this Alto
|
|
/// </summary>
|
|
public static byte HostAddress;
|
|
|
|
/// <summary>
|
|
/// The name of the Ethernet adaptor on the emulator host to use for Ethernet emulation
|
|
/// </summary>
|
|
public static string HostPacketInterfaceName;
|
|
|
|
/// <summary>
|
|
/// Whether any packet interfaces are available on the host
|
|
/// </summary>
|
|
public static bool HostRawEthernetInterfacesAvailable;
|
|
|
|
/// <summary>
|
|
/// The type of interface to use to host networking.
|
|
/// </summary>
|
|
public static PacketInterfaceType HostPacketInterfaceType;
|
|
|
|
/// <summary>
|
|
/// The type of Alternate Boot to apply
|
|
/// </summary>
|
|
public static AlternateBootType AlternateBootType;
|
|
|
|
/// <summary>
|
|
/// The address to boot at reset for a disk alternate boot
|
|
/// </summary>
|
|
public static ushort BootAddress;
|
|
|
|
/// <summary>
|
|
/// The file to boot at reset for an ethernet alternate boot
|
|
/// </summary>
|
|
public static ushort BootFile;
|
|
|
|
/// <summary>
|
|
/// Whether to render the display "interlaced" or not.
|
|
/// </summary>
|
|
public static bool InterlaceDisplay;
|
|
|
|
/// <summary>
|
|
/// Whether to cap execution speed at native execution speed or not.
|
|
/// </summary>
|
|
public static bool ThrottleSpeed;
|
|
|
|
/// <summary>
|
|
/// Whether to enable the DAC used for the Smalltalk music system.
|
|
/// </summary>
|
|
public static bool EnableAudioDAC;
|
|
|
|
/// <summary>
|
|
/// Whether to enable capture of the DAC output to file.
|
|
/// </summary>
|
|
public static bool EnableAudioDACCapture;
|
|
|
|
/// <summary>
|
|
/// The path to store DAC capture (if enabled).
|
|
/// </summary>
|
|
public static string AudioDACCapturePath;
|
|
|
|
public static string GetAltoIRomPath(string romFileName)
|
|
{
|
|
return Path.Combine("ROM", "AltoI", romFileName);
|
|
}
|
|
|
|
public static string GetAltoIIRomPath(string romFileName)
|
|
{
|
|
return Path.Combine("ROM", "AltoII", romFileName);
|
|
}
|
|
|
|
public static string GetRomPath(string romFileName)
|
|
{
|
|
return Path.Combine("ROM", romFileName);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Reads the current configuration file from the app's configuration.
|
|
///
|
|
/// TODO: use reflection to do this.
|
|
/// </summary>
|
|
public static void ReadConfiguration()
|
|
{
|
|
Drive0Image = (string)Properties.Settings.Default["Drive0Image"];
|
|
Drive1Image = (string)Properties.Settings.Default["Drive1Image"];
|
|
SystemType = (SystemType)Properties.Settings.Default["SystemType"];
|
|
HostAddress = (byte)Properties.Settings.Default["HostAddress"];
|
|
HostPacketInterfaceName = (string)Properties.Settings.Default["HostPacketInterfaceName"];
|
|
HostPacketInterfaceType = (PacketInterfaceType)Properties.Settings.Default["HostPacketInterfaceType"];
|
|
AlternateBootType = (AlternateBootType)Properties.Settings.Default["AlternateBootType"];
|
|
BootAddress = (ushort)Properties.Settings.Default["BootAddress"];
|
|
BootFile = (ushort)Properties.Settings.Default["BootFile"];
|
|
InterlaceDisplay = (bool)Properties.Settings.Default["InterlaceDisplay"];
|
|
ThrottleSpeed = (bool)Properties.Settings.Default["ThrottleSpeed"];
|
|
EnableAudioDAC = (bool)Properties.Settings.Default["EnableAudioDAC"];
|
|
EnableAudioDACCapture = (bool)Properties.Settings.Default["EnableAudioDACCapture"];
|
|
AudioDACCapturePath = (string)Properties.Settings.Default["AudioDACCapturePath"];
|
|
}
|
|
|
|
/// <summary>
|
|
/// Commits the current configuration to the app's settings.
|
|
/// </summary>
|
|
public static void WriteConfiguration()
|
|
{
|
|
Properties.Settings.Default["Drive0Image"] = Drive0Image;
|
|
Properties.Settings.Default["Drive1Image"] = Drive1Image;
|
|
Properties.Settings.Default["SystemType"] = (int)SystemType;
|
|
Properties.Settings.Default["HostAddress"] = HostAddress;
|
|
Properties.Settings.Default["HostPacketInterfaceName"] = HostPacketInterfaceName;
|
|
Properties.Settings.Default["HostPacketInterfaceType"] = (int)HostPacketInterfaceType;
|
|
Properties.Settings.Default["AlternateBootType"] = (int)AlternateBootType;
|
|
Properties.Settings.Default["BootAddress"] = BootAddress;
|
|
Properties.Settings.Default["BootFile"] = BootFile;
|
|
Properties.Settings.Default["InterlaceDisplay"] = InterlaceDisplay;
|
|
Properties.Settings.Default["ThrottleSpeed"] = ThrottleSpeed;
|
|
Properties.Settings.Default["EnableAudioDAC"] = EnableAudioDAC;
|
|
Properties.Settings.Default["EnableAudioDACCapture"] = EnableAudioDACCapture;
|
|
Properties.Settings.Default["AudioDACCapturePath"] = AudioDACCapturePath;
|
|
|
|
Properties.Settings.Default.Save();
|
|
}
|
|
}
|
|
|
|
}
|