From c12b1403de9ba20bfb08a6c34a2b4c51321e0c99 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:23:52 -0400 Subject: [PATCH 01/82] Delete Class1.cs --- EMU7800/Class1.cs | 11 ----------- 1 file changed, 11 deletions(-) delete mode 100644 EMU7800/Class1.cs diff --git a/EMU7800/Class1.cs b/EMU7800/Class1.cs deleted file mode 100644 index 1b18b6adf65..00000000000 --- a/EMU7800/Class1.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace EMU7800 -{ - public class Class1 - { - } -} From 568861ff17ebc66b8b3cddca2eb1cd287c1a5d81 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:24:00 -0400 Subject: [PATCH 02/82] Delete EMU7800.csproj --- EMU7800/EMU7800.csproj | 127 ----------------------------------------- 1 file changed, 127 deletions(-) delete mode 100644 EMU7800/EMU7800.csproj diff --git a/EMU7800/EMU7800.csproj b/EMU7800/EMU7800.csproj deleted file mode 100644 index 7c542a3a3c1..00000000000 --- a/EMU7800/EMU7800.csproj +++ /dev/null @@ -1,127 +0,0 @@ - - - - Debug - AnyCPU - 8.0.30703 - 2.0 - {E01193DF-F104-4B95-9D1B-FAD830F6F620} - Library - Properties - EMU7800 - EMU7800 - v4.0 - 512 - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - copy /y $(TargetDir)$(TargetFileName) $(ProjectDir)..\references\$(TargetFileName) - - - - \ No newline at end of file From 2dfe837c912e43a2a645805019b77c815ff1dd0c Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:24:10 -0400 Subject: [PATCH 03/82] Delete EMU7800.sln --- EMU7800/EMU7800.sln | 20 -------------------- 1 file changed, 20 deletions(-) delete mode 100644 EMU7800/EMU7800.sln diff --git a/EMU7800/EMU7800.sln b/EMU7800/EMU7800.sln deleted file mode 100644 index f9ab26fb2e7..00000000000 --- a/EMU7800/EMU7800.sln +++ /dev/null @@ -1,20 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual Studio 2010 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EMU7800", "EMU7800.csproj", "{E01193DF-F104-4B95-9D1B-FAD830F6F620}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {E01193DF-F104-4B95-9D1B-FAD830F6F620}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E01193DF-F104-4B95-9D1B-FAD830F6F620}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E01193DF-F104-4B95-9D1B-FAD830F6F620}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E01193DF-F104-4B95-9D1B-FAD830F6F620}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal From ceaeb49b1da6dee29e6378a33c6bc8a1acc26ad0 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:24:32 -0400 Subject: [PATCH 04/82] Delete GameProgram.cs --- EMU7800/Win/GameProgram.cs | 76 -------------------------------------- 1 file changed, 76 deletions(-) delete mode 100644 EMU7800/Win/GameProgram.cs diff --git a/EMU7800/Win/GameProgram.cs b/EMU7800/Win/GameProgram.cs deleted file mode 100644 index be65e225a0d..00000000000 --- a/EMU7800/Win/GameProgram.cs +++ /dev/null @@ -1,76 +0,0 @@ -/* - * GameProgram.cs - * - * Represents attribute data associated with ROMs - * - * Copyright 2003, 2004, 2010 © Mike Murphy - * - */ - -/* - * unlike EMU7800 Core stuff, this has been hacked around a bit - */ - -using System.Text; -using EMU7800.Core; - -namespace EMU7800.Win -{ - public class GameProgram - { - public string MD5 { get; set; } - public string Title { get; set; } - public string Manufacturer { get; set; } - public string Author { get; set; } - public string Year { get; set; } - public string ModelNo { get; set; } - public string Rarity { get; set; } - public CartType CartType { get; set; } - public MachineType MachineType { get; set; } - public Controller LController { get; set; } - public Controller RController { get; set; } - public string HelpUri { get; set; } - - public string DiscoveredRomFullName { get; set; } - - public override string ToString() - { - var s = new StringBuilder("GameSettings:\n"); - s.AppendFormat(" MD5: {0}\n", MD5); - s.AppendFormat(" Title: {0}\n", Title); - s.AppendFormat(" Manufacturer: {0}\n", Manufacturer); - s.AppendFormat(" Author: {0}\n", Author); - s.AppendFormat(" Year: {0}\n", Year); - s.AppendFormat(" ModelNo: {0}\n", ModelNo); - s.AppendFormat(" Rarity: {0}\n", Rarity); - s.AppendFormat(" CartType: {0}\n", CartType); - s.AppendFormat(" MachineType: {0}\n", MachineType); - s.AppendFormat(" LController: {0}\n", LController); - s.AppendFormat(" RController: {0}\n", RController); - s.AppendFormat(" HelpUri: {0}", HelpUri); - if (DiscoveredRomFullName != null) s.AppendFormat("\n Discovered Rom Filename: {0}", DiscoveredRomFullName); - return s.ToString(); - } - - public GameProgram(string md5) - { - MD5 = md5; - } - - /// - /// not in db, so guess - /// - /// - /// - public static GameProgram GetCompleteGuess(string md5) - { - GameProgram ret = new GameProgram(md5); - ret.Title = "UNKNOWN"; - //ret.CartType = CartType.A7848; // will be guessed for us - ret.MachineType = MachineType.A7800NTSC; - ret.LController = Controller.Joystick; - ret.RController = Controller.Joystick; - return ret; - } - } -} \ No newline at end of file From 7300c7b261b49c094153dd74feafad8399c33831 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:24:52 -0400 Subject: [PATCH 05/82] Delete GameProgramLibrary.cs --- EMU7800/Win/GameProgramLibrary.cs | 384 ------------------------------ 1 file changed, 384 deletions(-) delete mode 100644 EMU7800/Win/GameProgramLibrary.cs diff --git a/EMU7800/Win/GameProgramLibrary.cs b/EMU7800/Win/GameProgramLibrary.cs deleted file mode 100644 index b3b9ac0d1a0..00000000000 --- a/EMU7800/Win/GameProgramLibrary.cs +++ /dev/null @@ -1,384 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Security.Cryptography; -using System.Text; -using EMU7800.Core; - -/* - * unlike EMU7800 Core stuff, this has been hacked around significantly - */ - -namespace EMU7800.Win -{ - public class GameProgramLibrary : Dictionary - { - #region Fields - - const string - BIOS78_NTSC_MD5 = "0763f1ffb006ddbe32e52d497ee848ae", - BIOS78_NTSC_ALTERNATE_MD5 = "b32526ea179dc9ab9b2e5f8a2662b298", - BIOS78_PAL_MD5 = "397bb566584be7b9764e7a68974c4263", - HSC78_MD5 = "c8a73288ab97226c52602204ab894286"; - /* - readonly IDictionary _misc7800DiscoveredRoms = new Dictionary(); - */ - // these enums are used for matching column names in the .csv file - enum Column - { - None, - MD5, - Title, - Manufacturer, - Author, - Year, - ModelNo, - Rarity, - CartType, - MachineType, - LController, - RController, - HelpUri - }; - - //const string RomPropertiesFileName = "ROMProperties.csv"; - - static readonly Dictionary _columnPositions = new Dictionary - { - { Column.MD5, -1}, - { Column.Title, -1}, - { Column.Manufacturer, -1}, - { Column.Author, -1 }, - { Column.Year, - 1}, - { Column.ModelNo, -1}, - { Column.Rarity, -1}, - { Column.CartType, -1}, - { Column.MachineType, -1}, - { Column.LController, -1}, - { Column.RController, -1}, - { Column.HelpUri, -1}, - }; - - //readonly RomFileAccessor _romFileAccessor = new RomFileAccessor(); - readonly MD5CryptoServiceProvider _cryptoProvider = new MD5CryptoServiceProvider(); - readonly StringBuilder _sb = new StringBuilder(); - //readonly ILogger _logger; - - #endregion - - public static GameProgramLibrary EMU7800DB = null; - - #region Constructors - - private GameProgramLibrary() - { - } - - public GameProgramLibrary(TextReader r)//, ILogger logger) - { - //if (logger == null) - // throw new ArgumentNullException("logger"); - - //_logger = logger; - - //var settings = new GlobalSettings(logger); - //var fn = Path.Combine(settings.BaseDirectory, RomPropertiesFileName); - - Clear(); - //StreamReader r = null; - try - { - //r = new StreamReader(fn); - InitializeColumnPos(r.ReadLine()); - - while (true) - { - var line = r.ReadLine(); - if (line == null) - break; - var gp = CreateGameSettingsFromLine(line); - if (gp == null) - continue; - if (ContainsKey(gp.MD5)) - Console.WriteLine("7800DB: Duplicate MD5 key found: {0}", gp.MD5); else Add(gp.MD5, gp); - } - r.Close(); - } - catch (Exception ex) - { - //if (Util.IsCriticalException(ex)) - throw; - //_logger.WriteLine(ex); - } - finally - { - if (r != null) - r.Dispose(); - } - - Console.WriteLine("7800DB: {0} entries loaded.", Count); - } - - #endregion - - #region Game Program Accessors - - public GameProgram TryRecognizeRom(byte[] bytes) - { - //if (string.IsNullOrWhiteSpace(fullName)) - // throw new ArgumentException("fullName"); - - //var bytes = _romFileAccessor.GetRomBytes(fullName); - if (bytes == null) - return null; - - var md5 = ComputeMD5Digest(bytes); - if (string.IsNullOrWhiteSpace(md5)) - return null; - - var gp = GetGameProgramFromMd5(md5); - if (gp == null) - gp = GameProgram.GetCompleteGuess(md5); - //gp.DiscoveredRomFullName = fullName; - if (gp.CartType == CartType.None) - { - switch (gp.MachineType) - { - case MachineType.A2600NTSC: - case MachineType.A2600PAL: - switch (bytes.Length) - { - case 2048: gp.CartType = CartType.A2K; break; - case 4096: gp.CartType = CartType.A4K; break; - case 8192: gp.CartType = CartType.A8K; break; - case 16384: gp.CartType = CartType.A16K; break; - } - break; - case MachineType.A7800NTSC: - case MachineType.A7800PAL: - switch (bytes.Length) - { - case 8192: gp.CartType = CartType.A7808; break; - case 16384: gp.CartType = CartType.A7816; break; - case 32768: gp.CartType = CartType.A7832; break; - case 49152: gp.CartType = CartType.A7848; break; - } - break; - } - } - return gp; - /* - if (md5.Equals(HSC78_MD5, StringComparison.OrdinalIgnoreCase)) - { - if (!_misc7800DiscoveredRoms.ContainsKey(md5)) - _misc7800DiscoveredRoms.Add(md5, fullName); - _logger.WriteLine("Found 7800 Highscore Cart: {0}", fullName); - return null; - } - if (md5.Equals(BIOS78_NTSC_MD5, StringComparison.OrdinalIgnoreCase)) - { - if (!_misc7800DiscoveredRoms.ContainsKey(md5)) - _misc7800DiscoveredRoms.Add(md5, fullName); - _logger.WriteLine("Found 7800 NTSC BIOS: {0}", fullName); - return null; - } - if (md5.Equals(BIOS78_NTSC_ALTERNATE_MD5, StringComparison.OrdinalIgnoreCase)) - { - if (!_misc7800DiscoveredRoms.ContainsKey(md5)) - _misc7800DiscoveredRoms.Add(md5, fullName); - _logger.WriteLine("Found incorrect but widely used 7800 NTSC BIOS: {0}", fullName); - return null; - } - if (md5.Equals(BIOS78_PAL_MD5, StringComparison.OrdinalIgnoreCase)) - { - if (!_misc7800DiscoveredRoms.ContainsKey(md5)) - _misc7800DiscoveredRoms.Add(md5, fullName); - _logger.WriteLine("Found 7800 PAL BIOS: {0}", fullName); - return null; - } - */ - } - - /* - public GameProgram GetGameProgramFromFullName(string fullName) - { - var bytes = _romFileAccessor.GetRomBytes(fullName); - if (bytes == null) - throw new ArgumentException("File not readable: {0}", fullName); - var md5 = ComputeMD5Digest(bytes); - return !string.IsNullOrWhiteSpace(md5) ? GetGameProgramFromMd5(md5) : null; - } - */ - public GameProgram GetGameProgramFromMd5(string md5) - { - if (string.IsNullOrWhiteSpace(md5)) - throw new ArgumentNullException("md5"); - GameProgram gp; - return TryGetValue(md5, out gp) ? gp : null; - } - /* - public byte[] GetRomBytes(string fullName) - { - return _romFileAccessor.GetRomBytes(fullName); - } - - public byte[] Get78HighScoreCartBytes() - { - string fullName; - if (!_misc7800DiscoveredRoms.TryGetValue(HSC78_MD5, out fullName)) - return null; - return _romFileAccessor.GetRomBytes(fullName); - } - - public byte[] Get78BiosBytes(MachineType machineType) - { - string fullName = null; - switch (machineType) - { - case MachineType.A7800NTSC: - if (!_misc7800DiscoveredRoms.TryGetValue(BIOS78_NTSC_MD5, out fullName)) - _misc7800DiscoveredRoms.TryGetValue(BIOS78_NTSC_ALTERNATE_MD5, out fullName); - break; - case MachineType.A7800PAL: - _misc7800DiscoveredRoms.TryGetValue(BIOS78_PAL_MD5, out fullName); - break; - } - if (string.IsNullOrWhiteSpace(fullName)) - return null; - return _romFileAccessor.GetRomBytes(fullName); - }*/ - - #endregion - - #region Game Progam Related Utilities - /* - public string ComputeMD5Digest(string fullName) - { - var bytes = _romFileAccessor.GetRomBytes(fullName); - if (bytes == null) - throw new ArgumentException("File not readable: {0}", fullName); - return ComputeMD5Digest(bytes); - } - */ - #endregion - - #region Helpers - - static void InitializeColumnPos(string line) - { - var colno = 0; - var columnNames = line.Split(','); - - foreach (var columnName in columnNames) - { - var col = ToColumn(columnName); - if (col != Column.None) - _columnPositions[col] = colno; - colno++; - } - - if (_columnPositions[Column.MD5] < 0) - throw new ApplicationException("ROMProperties.csv: Required column missing: MD5"); - if (_columnPositions[Column.CartType] < 0) - throw new ApplicationException("ROMProperties.csv: Required column missing: CartType"); - if (_columnPositions[Column.MachineType] < 0) - throw new ApplicationException("ROMProperties.csv: Required column missing: MachineType"); - if (_columnPositions[Column.LController] < 0) - throw new ApplicationException("ROMProperties.csv: Required column missing: LController"); - if (_columnPositions[Column.RController] < 0) - throw new ApplicationException("ROMProperties.csv: Required column missing: RController"); - } - - static GameProgram CreateGameSettingsFromLine(string line) - { - var row = new string[13]; - var linesplit = line.Split(','); - for (var i = 0; i < row.Length && i < linesplit.Length; i++) - row[i] = linesplit[i]; - - var md5 = row[_columnPositions[Column.MD5]]; - var gp = new GameProgram(md5) - { - Title = _columnPositions[Column.Title] >= 0 ? row[_columnPositions[Column.Title]] : string.Empty, - Manufacturer = _columnPositions[Column.Manufacturer] >= 0 ? row[_columnPositions[Column.Manufacturer]] : string.Empty, - Author = _columnPositions[Column.Author] >= 0 ? row[_columnPositions[Column.Author]] : string.Empty, - Year = _columnPositions[Column.Year] >= 0 ? row[_columnPositions[Column.Year]] : string.Empty, - ModelNo = _columnPositions[Column.ModelNo] >= 0 ? row[_columnPositions[Column.ModelNo]] : string.Empty, - Rarity = _columnPositions[Column.Rarity] >= 0 ? row[_columnPositions[Column.Rarity]] : string.Empty, - CartType = ToCartType(row[_columnPositions[Column.CartType]]), - MachineType = ToMachineType(row[_columnPositions[Column.MachineType]]) - }; - - gp.LController = ToController(row[_columnPositions[Column.LController]]); - gp.RController = ToController(row[_columnPositions[Column.RController]]); - - if (gp.LController == Controller.None) - gp.LController = GetDefaultController(gp.MachineType); - if (gp.RController == Controller.None) - gp.RController = GetDefaultController(gp.MachineType); - - if (_columnPositions[Column.HelpUri] < row.Length) - { - string helpUri = row[_columnPositions[Column.HelpUri]]; - if (helpUri != null) helpUri = helpUri.Trim(); - if (helpUri != null && !helpUri.Length.Equals(0)) - gp.HelpUri = helpUri; - } - - return gp; - } - - static Controller GetDefaultController(MachineType machineType) - { - switch (machineType) - { - case MachineType.A7800NTSC: - case MachineType.A7800PAL: - return Controller.ProLineJoystick; - default: - return Controller.Joystick; - } - } - - static Column ToColumn(string columnName) - { - Column result; - return Enum.TryParse(columnName, true, out result) ? result : Column.None; - } - - static CartType ToCartType(string cartType) - { - CartType result; - return Enum.TryParse(cartType, true, out result) ? result : CartType.None; - } - - static MachineType ToMachineType(string machineType) - { - MachineType result; - return Enum.TryParse(machineType, true, out result) ? result : MachineType.None; - } - - static Controller ToController(string controller) - { - Controller result; - return Enum.TryParse(controller, true, out result) ? result : Controller.None; - } - - string ComputeMD5Digest(byte[] bytes) - { - return (bytes != null) ? StringifyMD5(_cryptoProvider.ComputeHash(bytes)) : null; - } - - string StringifyMD5(byte[] bytes) - { - if (bytes == null || bytes.Length < 16) - return string.Empty; - _sb.Length = 0; - for (var i = 0; i < 16; i++) - _sb.AppendFormat("{0:x2}", bytes[i]); - return _sb.ToString(); - } - - #endregion - } -} From 84ff8f59f61297ba338d2c4bb795ae1df87ac8c5 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:25:18 -0400 Subject: [PATCH 06/82] Delete AssemblyInfo.cs --- EMU7800/Properties/AssemblyInfo.cs | 36 ------------------------------ 1 file changed, 36 deletions(-) delete mode 100644 EMU7800/Properties/AssemblyInfo.cs diff --git a/EMU7800/Properties/AssemblyInfo.cs b/EMU7800/Properties/AssemblyInfo.cs deleted file mode 100644 index 9fc9e7c8749..00000000000 --- a/EMU7800/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("EMU7800")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("EMU7800")] -[assembly: AssemblyCopyright("")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("b1f45280-2ae9-468c-8db8-4663fe6f2300")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] From 45df42e329175a68e49403ecafe2ab0d233485a4 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:25:44 -0400 Subject: [PATCH 07/82] Delete AddressSpace.cs --- EMU7800/Core/AddressSpace.cs | 154 ----------------------------------- 1 file changed, 154 deletions(-) delete mode 100644 EMU7800/Core/AddressSpace.cs diff --git a/EMU7800/Core/AddressSpace.cs b/EMU7800/Core/AddressSpace.cs deleted file mode 100644 index 17b8b44f00d..00000000000 --- a/EMU7800/Core/AddressSpace.cs +++ /dev/null @@ -1,154 +0,0 @@ -/* - * AddressSpace.cs - * - * The class representing the memory map or address space of a machine. - * - * Copyright � 2003, 2011 Mike Murphy - * - */ -using System; - -namespace EMU7800.Core -{ - public sealed class AddressSpace - { - public MachineBase M { get; private set; } - - readonly int AddrSpaceShift; - readonly int AddrSpaceSize; - readonly int AddrSpaceMask; - - readonly int PageShift; - readonly int PageSize; - - readonly IDevice[] MemoryMap; - IDevice Snooper; - - public byte DataBusState { get; private set; } - - public override string ToString() - { - return "AddressSpace"; - } - - public byte this[ushort addr] - { - get - { - if (Snooper != null) - { - // here DataBusState is just facilitating a dummy read to the snooper device - // the read operation may have important side effects within the device - DataBusState = Snooper[addr]; - } - var pageno = (addr & AddrSpaceMask) >> PageShift; - var dev = MemoryMap[pageno]; - DataBusState = dev[addr]; - return DataBusState; - } - set - { - DataBusState = value; - if (Snooper != null) - { - Snooper[addr] = DataBusState; - } - var pageno = (addr & AddrSpaceMask) >> PageShift; - var dev = MemoryMap[pageno]; - dev[addr] = DataBusState; - } - } - - public void Map(ushort basea, ushort size, IDevice device) - { - if (device == null) - throw new ArgumentNullException("device"); - - for (int addr = basea; addr < basea + size; addr += PageSize) - { - var pageno = (addr & AddrSpaceMask) >> PageShift; - MemoryMap[pageno] = device; - } - - LogDebug("{0}: Mapped {1} to ${2:x4}:${3:x4}", this, device, basea, basea + size - 1); - } - - public void Map(ushort basea, ushort size, Cart cart) - { - if (cart == null) - throw new ArgumentNullException("cart"); - - cart.Attach(M); - var device = (IDevice)cart; - if (cart.RequestSnooping) - { - Snooper = device; - } - Map(basea, size, device); - } - - #region Constructors - - private AddressSpace() - { - } - - public AddressSpace(MachineBase m, int addrSpaceShift, int pageShift) - { - if (m == null) - throw new ArgumentNullException("m"); - - M = m; - - AddrSpaceShift = addrSpaceShift; - AddrSpaceSize = 1 << AddrSpaceShift; - AddrSpaceMask = AddrSpaceSize - 1; - - PageShift = pageShift; - PageSize = 1 << PageShift; - - MemoryMap = new IDevice[1 << addrSpaceShift >> PageShift]; - IDevice nullDev = new NullDevice(M); - for (var pageno=0; pageno < MemoryMap.Length; pageno++) - { - MemoryMap[pageno] = nullDev; - } - } - - #endregion - - #region Serialization Members - - public AddressSpace(DeserializationContext input, MachineBase m, int addrSpaceShift, int pageShift) : this(m, addrSpaceShift, pageShift) - { - if (input == null) - throw new ArgumentNullException("input"); - - input.CheckVersion(1); - DataBusState = input.ReadByte(); - } - - public void GetObjectData(SerializationContext output) - { - if (output == null) - throw new ArgumentNullException("output"); - - output.WriteVersion(1); - output.Write(DataBusState); - } - - #endregion - - #region Helpers - - [System.Diagnostics.Conditional("DEBUG")] - void LogDebug(string format, params object[] args) - { - if (M == null || M.Logger == null) - return; - M.Logger.WriteLine(format, args); - } - - #endregion - } -} \ No newline at end of file From a0995d338194e14c9f7a4f2a748abd3913d05f24 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:26:05 -0400 Subject: [PATCH 08/82] Delete Bios7800.cs --- EMU7800/Core/Bios7800.cs | 65 ---------------------------------------- 1 file changed, 65 deletions(-) delete mode 100644 EMU7800/Core/Bios7800.cs diff --git a/EMU7800/Core/Bios7800.cs b/EMU7800/Core/Bios7800.cs deleted file mode 100644 index c02b3a648ff..00000000000 --- a/EMU7800/Core/Bios7800.cs +++ /dev/null @@ -1,65 +0,0 @@ -/* - * BIOS7800.cs - * - * The BIOS of the Atari 7800. - * - * Copyright � 2004 Mike Murphy - * - */ -using System; - -namespace EMU7800.Core -{ - public sealed class Bios7800 : IDevice - { - readonly byte[] ROM; - readonly ushort Mask; - - public ushort Size { get { return (ushort)ROM.Length; } } - - public void Reset() { } - - public byte this[ushort addr] - { - get { return ROM[addr & Mask]; } - set { } - } - - public Bios7800(byte[] rom) - { - if (rom == null) - throw new ArgumentNullException("rom"); - if (rom.Length != 4096 && rom.Length != 16384) - throw new ArgumentException("ROM size not 4096 or 16384", "rom"); - - ROM = rom; - Mask = (ushort)ROM.Length; - Mask--; - } - - #region Serialization Members - - public Bios7800(DeserializationContext input) - { - if (input == null) - throw new ArgumentNullException("input"); - - input.CheckVersion(1); - ROM = input.ReadExpectedBytes(4096, 16384); - - Mask = (ushort)ROM.Length; - Mask--; - } - - public void GetObjectData(SerializationContext output) - { - if (output == null) - throw new ArgumentNullException("output"); - - output.WriteVersion(1); - output.Write(ROM); - } - - #endregion - } -} \ No newline at end of file From f6446228fbfc52c39fbb9da17dab19ee34b05c6c Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:26:29 -0400 Subject: [PATCH 09/82] Delete BufferElement.cs --- EMU7800/Core/BufferElement.cs | 71 ----------------------------------- 1 file changed, 71 deletions(-) delete mode 100644 EMU7800/Core/BufferElement.cs diff --git a/EMU7800/Core/BufferElement.cs b/EMU7800/Core/BufferElement.cs deleted file mode 100644 index c339eacc7a2..00000000000 --- a/EMU7800/Core/BufferElement.cs +++ /dev/null @@ -1,71 +0,0 @@ -namespace EMU7800.Core -{ - /* - * why this sucks: - * A read costs 3 shifts and an or. A write costs 2 shifts. Additional shifts are - * needed elsewhere to figure out which item in a BufferElement[] to access. Because - * the encapsulation is for a BufferElement and not a whole array of them, code elsewhere - * is gunked up with 'BufferElement.SIZE' shifts. If the 32 bit "alias" was actually used, - * there might be some purpose to this code: but it's only used for a ZeroMemory() - * replacement. Every use of BufferElement in the code is a BufferElement[] used as a gunked - * up replacement for a byte[]. - * - * A small speed increase was observed hacking this out; but my motivation was more about cleaness - * and stomping out bad ideas. - */ - - /* - /// - /// Frames are composed of s, - /// that group bytes into machine words for efficient array processing. - /// Bytes are packed in logical little endian order. - /// - public struct BufferElement - { - /// - /// The number of bytes contained within a . - /// - public const int SIZE = 4; // 2^SHIFT - - /// - /// The mask value applied against a byte array index to access the individual bytes within a . - /// - public const int MASK = 3; // SIZE - 1 - - /// - /// The left shift value to convert a byte array index to a array index. - /// - public const int SHIFT = 2; - - uint _data; - - /// - /// A convenience accessor for reading/writing individual bytes within this . - /// - /// - public byte this[int offset] - { - get - { - var i = (offset & MASK) << 3; - return (byte)(_data >> i); - } - set - { - var i = (offset & MASK) << 3; - var d = (uint)value << i; - var di = (uint)0xff << i; - _data = _data & ~di | d; - } - } - - /// - /// Zeros out all bytes of this . - /// - public void ClearAll() - { - _data = 0; - } - } - */ -} From 37b58ae4f8d79f8472ba81e90da881b096adaa62 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:27:47 -0400 Subject: [PATCH 10/82] Delete Cart.cs --- EMU7800/Core/Cart.cs | 170 ------------------------------------------- 1 file changed, 170 deletions(-) delete mode 100644 EMU7800/Core/Cart.cs diff --git a/EMU7800/Core/Cart.cs b/EMU7800/Core/Cart.cs deleted file mode 100644 index bd0e6a2aeab..00000000000 --- a/EMU7800/Core/Cart.cs +++ /dev/null @@ -1,170 +0,0 @@ -/* - * Cart.cs - * - * An abstraction of a game cart. Attributable to Kevin Horton's Bankswitching - * document, the Stella source code, and Eckhard Stolberg's 7800 Bankswitching Guide. - * - * Copyright � 2003, 2004, 2010, 2011 Mike Murphy - * - */ -using System; - -namespace EMU7800.Core -{ - public abstract class Cart : IDevice - { - static int _multicartBankSelector; - - protected MachineBase M { get; set; } - protected internal byte[] ROM { get; set; } - - #region IDevice Members - - public virtual void Reset() { } - - public abstract byte this[ushort addr] { get; set; } - - #endregion - - public virtual void Attach(MachineBase m) - { - if (m == null) - throw new ArgumentNullException("m"); - if (M != null && M != m) - throw new InvalidOperationException("Cart already attached to a different machine."); - M = m; - } - - public virtual void StartFrame() - { - } - - public virtual void EndFrame() - { - } - - protected internal virtual bool RequestSnooping - { - get { return false; } - } - - /// - /// Creates an instance of the specified cart. - /// - /// - /// - /// Specified CartType is unexpected. - public static Cart Create(byte[] romBytes, CartType cartType) - { - if (cartType == CartType.None) - { - switch (romBytes.Length) - { - case 2048: - cartType = CartType.A2K; - break; - case 4096: - cartType = CartType.A4K; - break; - case 8192: - cartType = CartType.A8K; - break; - case 16384: - cartType = CartType.A16K; - break; - case 32768: - cartType = CartType.A32K; - break; - } - } - - switch (cartType) - { - case CartType.A2K: return new CartA2K(romBytes); - case CartType.A4K: return new CartA4K(romBytes); - case CartType.A8K: return new CartA8K(romBytes); - case CartType.A8KR: return new CartA8KR(romBytes); - case CartType.A16K: return new CartA16K(romBytes); - case CartType.A16KR: return new CartA16KR(romBytes); - case CartType.DC8K: return new CartDC8K(romBytes); - case CartType.PB8K: return new CartPB8K(romBytes); - case CartType.TV8K: return new CartTV8K(romBytes); - case CartType.CBS12K: return new CartCBS12K(romBytes); - case CartType.A32K: return new CartA32K(romBytes); - case CartType.A32KR: return new CartA32KR(romBytes); - case CartType.MN16K: return new CartMN16K(romBytes); - case CartType.DPC: return new CartDPC(romBytes); - case CartType.M32N12K: return new CartA2K(romBytes, _multicartBankSelector++); - case CartType.A7808: return new Cart7808(romBytes); - case CartType.A7816: return new Cart7816(romBytes); - case CartType.A7832P: return new Cart7832P(romBytes); - case CartType.A7832: return new Cart7832(romBytes); - case CartType.A7848: return new Cart7848(romBytes); - case CartType.A78SGP: return new Cart78SGP(romBytes); - case CartType.A78SG: return new Cart78SG(romBytes, false); - case CartType.A78SGR: return new Cart78SG(romBytes, true); - case CartType.A78S9: return new Cart78S9(romBytes); - case CartType.A78S4: return new Cart78S4(romBytes, false); - case CartType.A78S4R: return new Cart78S4(romBytes, true); - case CartType.A78AB: return new Cart78AB(romBytes); - case CartType.A78AC: return new Cart78AC(romBytes); - default: - throw new Emu7800Exception("Unexpected CartType: " + cartType); - } - } - - protected void LoadRom(byte[] romBytes, int multicartBankSize, int multicartBankNo) - { - if (romBytes == null) - throw new ArgumentNullException("romBytes"); - - ROM = new byte[multicartBankSize]; - Buffer.BlockCopy(romBytes, multicartBankSize*multicartBankNo, ROM, 0, multicartBankSize); - } - - protected void LoadRom(byte[] romBytes, int minSize) - { - if (romBytes == null) - throw new ArgumentNullException("romBytes"); - - if (romBytes.Length >= minSize) - { - ROM = romBytes; - } - else - { - ROM = new byte[minSize]; - Buffer.BlockCopy(romBytes, 0, ROM, 0, romBytes.Length); - } - } - - protected void LoadRom(byte[] romBytes) - { - LoadRom(romBytes, romBytes.Length); - } - - protected Cart() - { - } - - #region Serialization Members - - protected Cart(DeserializationContext input) - { - if (input == null) - throw new ArgumentNullException("input"); - - input.CheckVersion(1); - } - - public virtual void GetObjectData(SerializationContext output) - { - if (output == null) - throw new ArgumentNullException("output"); - - output.WriteVersion(1); - } - - #endregion - } -} \ No newline at end of file From ddbb9f753d2a99e82e19f496a9c3fa77ec451b3f Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:28:37 -0400 Subject: [PATCH 11/82] Delete Cart7808.cs --- EMU7800/Core/Cart7808.cs | 50 ---------------------------------------- 1 file changed, 50 deletions(-) delete mode 100644 EMU7800/Core/Cart7808.cs diff --git a/EMU7800/Core/Cart7808.cs b/EMU7800/Core/Cart7808.cs deleted file mode 100644 index 7fa1c277bc5..00000000000 --- a/EMU7800/Core/Cart7808.cs +++ /dev/null @@ -1,50 +0,0 @@ -namespace EMU7800.Core -{ - /// - /// Atari 7800 non-bankswitched 8KB cartridge - /// - public sealed class Cart7808 : Cart - { - // - // Cart Format Mapping to ROM Address Space - // 0x0000:0x2000 0xE000:0x2000 (repeated downward to 0x4000) - // - - #region IDevice Members - - public override byte this[ushort addr] - { - get { return ROM[addr & 0x1fff]; } - set { } - } - - #endregion - - private Cart7808() - { - } - - public Cart7808(byte[] romBytes) - { - LoadRom(romBytes, 0x2000); - } - - #region Serialization Members - - public Cart7808(DeserializationContext input, MachineBase m) : base(input) - { - input.CheckVersion(1); - LoadRom(input.ReadExpectedBytes(0x2000), 0x2000); - } - - public override void GetObjectData(SerializationContext output) - { - base.GetObjectData(output); - - output.WriteVersion(1); - output.Write(ROM); - } - - #endregion - } -} \ No newline at end of file From c952668bd1c63c787d62ee9960f9cef9015708d8 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:28:49 -0400 Subject: [PATCH 12/82] Delete Cart7816.cs --- EMU7800/Core/Cart7816.cs | 50 ---------------------------------------- 1 file changed, 50 deletions(-) delete mode 100644 EMU7800/Core/Cart7816.cs diff --git a/EMU7800/Core/Cart7816.cs b/EMU7800/Core/Cart7816.cs deleted file mode 100644 index fe93e395858..00000000000 --- a/EMU7800/Core/Cart7816.cs +++ /dev/null @@ -1,50 +0,0 @@ -namespace EMU7800.Core -{ - /// - /// Atari 7800 non-bankswitched 16KB cartridge - /// - public sealed class Cart7816 : Cart - { - // - // Cart Format Mapping to ROM Address Space - // 0x0000:0x4000 0xC000:0x4000 (repeated downward to 0x4000) - // - - #region IDevice Members - - public override byte this[ushort addr] - { - get { return ROM[addr & 0x3fff]; } - set { } - } - - #endregion - - private Cart7816() - { - } - - public Cart7816(byte[] romBytes) - { - LoadRom(romBytes, 0x4000); - } - - #region Serialization Members - - public Cart7816(DeserializationContext input, MachineBase m) : base(input) - { - input.CheckVersion(1); - LoadRom(input.ReadExpectedBytes(0x4000), 0x4000); - } - - public override void GetObjectData(SerializationContext output) - { - base.GetObjectData(output); - - output.WriteVersion(1); - output.Write(ROM); - } - - #endregion - } -} \ No newline at end of file From 1368935f371c137b4cbeb247ed9f792dd0e13861 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:28:58 -0400 Subject: [PATCH 13/82] Delete Cart7832.cs --- EMU7800/Core/Cart7832.cs | 50 ---------------------------------------- 1 file changed, 50 deletions(-) delete mode 100644 EMU7800/Core/Cart7832.cs diff --git a/EMU7800/Core/Cart7832.cs b/EMU7800/Core/Cart7832.cs deleted file mode 100644 index 601e2f83f86..00000000000 --- a/EMU7800/Core/Cart7832.cs +++ /dev/null @@ -1,50 +0,0 @@ -namespace EMU7800.Core -{ - /// - /// Atari 7800 non-bankswitched 32KB cartridge - /// - public sealed class Cart7832 : Cart - { - // - // Cart Format Mapping to ROM Address Space - // 0x0000:0x8000 0x8000:0x8000 (repeated downward until 0x4000) - // - - #region IDevice Members - - public override byte this[ushort addr] - { - get { return ROM[addr & 0x7fff]; } - set { } - } - - #endregion - - private Cart7832() - { - } - - public Cart7832(byte[] romBytes) - { - LoadRom(romBytes, 0x8000); - } - - #region Serialization Members - - public Cart7832(DeserializationContext input, MachineBase m) : base(input) - { - input.CheckVersion(1); - LoadRom(input.ReadExpectedBytes(0x8000), 0x8000); - } - - public override void GetObjectData(SerializationContext output) - { - base.GetObjectData(output); - - output.WriteVersion(1); - output.Write(ROM); - } - - #endregion - } -} \ No newline at end of file From 6077453a17416cd2d4d548c2ba1fbed9e592b957 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:29:07 -0400 Subject: [PATCH 14/82] Delete Cart7832P.cs --- EMU7800/Core/Cart7832P.cs | 90 --------------------------------------- 1 file changed, 90 deletions(-) delete mode 100644 EMU7800/Core/Cart7832P.cs diff --git a/EMU7800/Core/Cart7832P.cs b/EMU7800/Core/Cart7832P.cs deleted file mode 100644 index c3a24be76ea..00000000000 --- a/EMU7800/Core/Cart7832P.cs +++ /dev/null @@ -1,90 +0,0 @@ -namespace EMU7800.Core -{ - /// - /// Atari 7800 non-bankswitched 32KB cartridge w/Pokey - /// - public sealed class Cart7832P : Cart - { - // - // Cart Format Mapping to ROM Address Space - // 0x4000:0x4000 Pokey - // 0x0000:0x8000 0x8000:0x8000 - // - PokeySound _pokeySound; - - #region IDevice Members - - public override void Reset() - { - base.Reset(); - if (_pokeySound != null) - _pokeySound.Reset(); - } - - public override byte this[ushort addr] - { - get - { - return ((addr & 0xF000) == 0x4000 && _pokeySound != null) ? _pokeySound.Read(addr) : ROM[addr & 0x7fff]; - } - set - { - if ((addr & 0xF000) == 0x4000 && _pokeySound != null) - _pokeySound.Update(addr, value); - } - } - - #endregion - - public override void Attach(MachineBase m) - { - base.Attach(m); - if (_pokeySound == null) - _pokeySound = new PokeySound(M); - } - - public override void StartFrame() - { - if (_pokeySound != null) - _pokeySound.StartFrame(); - } - - public override void EndFrame() - { - if (_pokeySound != null) - _pokeySound.EndFrame(); - } - - private Cart7832P() - { - } - - public Cart7832P(byte[] romBytes) - { - LoadRom(romBytes, 0x8000); - } - - #region Serialization Members - - public Cart7832P(DeserializationContext input, MachineBase m) : base(input) - { - input.CheckVersion(1); - LoadRom(input.ReadExpectedBytes(0x8000), 0x8000); - _pokeySound = input.ReadOptionalPokeySound(m); - } - - public override void GetObjectData(SerializationContext output) - { - if (_pokeySound == null) - throw new Emu7800SerializationException("Cart7832P must be attached before serialization."); - - base.GetObjectData(output); - - output.WriteVersion(1); - output.Write(ROM); - output.WriteOptional(_pokeySound); - } - - #endregion - } -} \ No newline at end of file From 33fc036bd6835332e94e88dd7fd8b3c94bb0d0a8 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:29:18 -0400 Subject: [PATCH 15/82] Delete Cart7848.cs --- EMU7800/Core/Cart7848.cs | 50 ---------------------------------------- 1 file changed, 50 deletions(-) delete mode 100644 EMU7800/Core/Cart7848.cs diff --git a/EMU7800/Core/Cart7848.cs b/EMU7800/Core/Cart7848.cs deleted file mode 100644 index b9536da7eba..00000000000 --- a/EMU7800/Core/Cart7848.cs +++ /dev/null @@ -1,50 +0,0 @@ -namespace EMU7800.Core -{ - /// - /// Atari 7800 non-bankswitched 48KB cartridge - /// - public sealed class Cart7848 : Cart - { - // - // Cart Format Mapping to ROM Address Space - // 0x0000:0xc000 0x4000:0xc000 - // - - #region IDevice Members - - public override byte this[ushort addr] - { - get { return ROM[addr - 0x4000]; } - set { } - } - - #endregion - - private Cart7848() - { - } - - public Cart7848(byte[] romBytes) - { - LoadRom(romBytes, 0xc000); - } - - #region Serialization Members - - public Cart7848(DeserializationContext input, MachineBase m) : base(input) - { - input.CheckVersion(1); - LoadRom(input.ReadExpectedBytes(0xc000), 0xc000); - } - - public override void GetObjectData(SerializationContext output) - { - base.GetObjectData(output); - - output.WriteVersion(1); - output.Write(ROM); - } - - #endregion - } -} \ No newline at end of file From ffd3fe3f9014f8d1b275862e76a4cc3b85827447 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:29:26 -0400 Subject: [PATCH 16/82] Delete Cart78AB.cs --- EMU7800/Core/Cart78AB.cs | 67 ---------------------------------------- 1 file changed, 67 deletions(-) delete mode 100644 EMU7800/Core/Cart78AB.cs diff --git a/EMU7800/Core/Cart78AB.cs b/EMU7800/Core/Cart78AB.cs deleted file mode 100644 index 6b4b6b53a7d..00000000000 --- a/EMU7800/Core/Cart78AB.cs +++ /dev/null @@ -1,67 +0,0 @@ -namespace EMU7800.Core -{ - /// - /// Atari 7800 Absolute bankswitched cartridge - /// - public sealed class Cart78AB : Cart - { - // - // Cart Format Mapping to ROM Address Space - // Bank0: 0x00000:0x4000 - // Bank1: 0x04000:0x4000 0x4000:0x4000 Bank0-1 (0 on startup) - // Bank2: 0x08000:0x4000 0x8000:0x4000 Bank2 - // Bank3: 0x0c000:0x4000 0xc000:0x4000 Bank3 - // - readonly int[] Bank = new int[4]; - - #region IDevice Members - - public override byte this[ushort addr] - { - get { return ROM[ (Bank[addr >> 14] << 14) | (addr & 0x3fff) ]; } - set - { - if ((addr >> 14) == 2) - { - Bank[1] = (value - 1) & 1; - } - } - } - - #endregion - - private Cart78AB() - { - } - - public Cart78AB(byte[] romBytes) - { - Bank[1] = 0; - Bank[2] = 2; - Bank[3] = 3; - LoadRom(romBytes, 0x10000); - } - - #region Serialization Members - - public Cart78AB(DeserializationContext input, MachineBase m) : base(input) - { - var version = input.CheckVersion(1, 2); - LoadRom(input.ReadBytes()); - Bank = input.ReadIntegers(4); - if (version == 1) - input.ReadInt32(); - } - - public override void GetObjectData(SerializationContext output) - { - base.GetObjectData(output); - - output.WriteVersion(2); - output.Write(ROM); - output.Write(Bank); - } - - #endregion - } -} \ No newline at end of file From c7a0edf744385c60d54248f4e994c09ff491274f Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:29:35 -0400 Subject: [PATCH 17/82] Delete Cart78AC.cs --- EMU7800/Core/Cart78AC.cs | 86 ---------------------------------------- 1 file changed, 86 deletions(-) delete mode 100644 EMU7800/Core/Cart78AC.cs diff --git a/EMU7800/Core/Cart78AC.cs b/EMU7800/Core/Cart78AC.cs deleted file mode 100644 index fcf854c8b57..00000000000 --- a/EMU7800/Core/Cart78AC.cs +++ /dev/null @@ -1,86 +0,0 @@ -namespace EMU7800.Core -{ - /// - /// Atari 7800 Activision bankswitched cartridge - /// - public sealed class Cart78AC : Cart - { - // - // Cart Format Mapping to ROM Address Space - // Bank0 : 0x00000:0x2000 - // Bank1 : 0x02000:0x2000 - // Bank2 : 0x04000:0x2000 0x4000:0x2000 Bank13 - // Bank3 : 0x06000:0x2000 0x6000:0x2000 Bank12 - // Bank4 : 0x08000:0x2000 0x8000:0x2000 Bank15 - // Bank5 : 0x0a000:0x2000 0xa000:0x2000 Bank(2*n) n in [0-7], n=0 on startup - // Bank6 : 0x0c000:0x2000 0xc000:0x2000 Bank(2*n+1) - // Bank7 : 0x0e000:0x2000 0xe000:0x2000 Bank14 - // Bank8 : 0x10000:0x2000 - // Bank9 : 0x12000:0x2000 - // Bank10: 0x14000:0x2000 - // Bank11: 0x16000:0x2000 - // Bank12: 0x18000:0x2000 - // Bank13: 0x1a000:0x2000 - // Bank14: 0x1c000:0x2000 - // Bank15: 0x1e000:0x2000 - // - // Banks are actually 16KB, but handled as 8KB for implementation ease. - // - readonly int[] Bank = new int[8]; - - #region IDevice Members - - public override byte this[ushort addr] - { - get - { - return ROM[ (Bank[addr >> 13] << 13) | (addr & 0x1fff) ]; - } - set - { - if ((addr & 0xfff0) == 0xff80) - { - Bank[5] = (addr & 7) << 1; - Bank[6] = Bank[5] + 1; - } - } - } - - #endregion - - private Cart78AC() - { - } - - public Cart78AC(byte[] romBytes) - { - Bank[2] = 13; - Bank[3] = 12; - Bank[4] = 15; - Bank[5] = 0; - Bank[6] = 1; - Bank[7] = 14; - LoadRom(romBytes, 0x20000); - } - - #region Serialization Members - - public Cart78AC(DeserializationContext input, MachineBase m) : base(input) - { - input.CheckVersion(1); - LoadRom(input.ReadBytes()); - Bank = input.ReadIntegers(8); - } - - public override void GetObjectData(SerializationContext output) - { - base.GetObjectData(output); - - output.WriteVersion(1); - output.Write(ROM); - output.Write(Bank); - } - - #endregion - } -} \ No newline at end of file From 7d42d3e1ef26cdf081ab0fe8a97375f645733c83 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:29:43 -0400 Subject: [PATCH 18/82] Delete Cart78S4.cs --- EMU7800/Core/Cart78S4.cs | 89 ---------------------------------------- 1 file changed, 89 deletions(-) delete mode 100644 EMU7800/Core/Cart78S4.cs diff --git a/EMU7800/Core/Cart78S4.cs b/EMU7800/Core/Cart78S4.cs deleted file mode 100644 index 7920f19713d..00000000000 --- a/EMU7800/Core/Cart78S4.cs +++ /dev/null @@ -1,89 +0,0 @@ -namespace EMU7800.Core -{ - /// - /// Atari 7800 SuperGame S4 bankswitched cartridge - /// - public sealed class Cart78S4 : Cart - { - // - // Cart Format Mapping to ROM Address Space - // Bank0: 0x00000:0x4000 - // Bank1: 0x04000:0x4000 0x4000:0x4000 Bank2 - // Bank2: 0x08000:0x4000 0x8000:0x4000 Bank0 (0 on startup) - // Bank3: 0x0c000:0x4000 0xc000:0x4000 Bank3 - // - // Banks 0-3 are the same as banks 4-7 - // - readonly byte[] RAM; - readonly int[] Bank = new int[4]; - - #region IDevice Members - - public override byte this[ushort addr] - { - get - { - if (RAM != null && addr >= 0x6000 && addr <= 0x7fff) - { - return RAM[addr & 0x1fff]; - } - return ROM[(Bank[addr >> 14] << 14) | (addr & 0x3fff)]; - } - set - { - if (RAM != null && addr >= 0x6000 && addr <= 0x7fff) - { - RAM[addr & 0x1fff] = value; - } - else if ((addr >> 14) == 2) - { - Bank[2] = value & 3; - } - } - } - - #endregion - - private Cart78S4() - { - } - - public Cart78S4(byte[] romBytes, bool needRAM) - { - if (needRAM) - { - RAM = new byte[0x2000]; - } - - LoadRom(romBytes, 0xffff); - - Bank[1] = 2; - Bank[2] = 0; - Bank[3] = 3; - } - - #region Serialization Members - - public Cart78S4(DeserializationContext input, MachineBase m) : base(input) - { - var version = input.CheckVersion(1, 2); - LoadRom(input.ReadBytes()); - Bank = input.ReadIntegers(4); - if (version == 1) - input.ReadInt32(); - RAM = input.ReadOptionalBytes(); - } - - public override void GetObjectData(SerializationContext output) - { - base.GetObjectData(output); - - output.WriteVersion(2); - output.Write(ROM); - output.Write(Bank); - output.WriteOptional(RAM); - } - - #endregion - } -} \ No newline at end of file From c2240dfe23236b9458c615ee9a27a168bc0d20a4 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:29:52 -0400 Subject: [PATCH 19/82] Delete Cart78S9.cs --- EMU7800/Core/Cart78S9.cs | 70 ---------------------------------------- 1 file changed, 70 deletions(-) delete mode 100644 EMU7800/Core/Cart78S9.cs diff --git a/EMU7800/Core/Cart78S9.cs b/EMU7800/Core/Cart78S9.cs deleted file mode 100644 index 63b7ff0394a..00000000000 --- a/EMU7800/Core/Cart78S9.cs +++ /dev/null @@ -1,70 +0,0 @@ -namespace EMU7800.Core -{ - /// - /// Atari 7800 SuperGame S9 bankswitched cartridge - /// - public sealed class Cart78S9 : Cart - { - // - // Cart Format Mapping to ROM Address Space - // Bank0: 0x00000:0x4000 - // Bank1: 0x04000:0x4000 0x4000:0x4000 Bank0 - // Bank2: 0x08000:0x4000 0x8000:0x4000 Bank0-8 (1 on startup) - // Bank3: 0x0c000:0x4000 0xc000:0x4000 Bank8 - // Bank4: 0x10000:0x4000 - // Bank5: 0x14000:0x4000 - // Bank6: 0x18000:0x4000 - // Bank7: 0x1c000:0x4000 - // Bank8: 0x20000:0x4000 - // - readonly int[] Bank = new int[4]; - - #region IDevice Members - - public override byte this[ushort addr] - { - get { return ROM[ (Bank[addr >> 14] << 14) | (addr & 0x3fff) ]; } - set - { - if ((addr >> 14) == 2 && value < 8) - { - Bank[2] = (value + 1); - } - } - } - - #endregion - - private Cart78S9() - { - } - - public Cart78S9(byte[] romBytes) - { - Bank[1] = 0; - Bank[2] = 1; - Bank[3] = 8; - LoadRom(romBytes, 0x24000); - } - - #region Serialization Members - - public Cart78S9(DeserializationContext input, MachineBase m) : base(input) - { - input.CheckVersion(1); - LoadRom(input.ReadBytes()); - Bank = input.ReadIntegers(4); - } - - public override void GetObjectData(SerializationContext output) - { - base.GetObjectData(output); - - output.WriteVersion(1); - output.Write(ROM); - output.Write(Bank); - } - - #endregion - } -} \ No newline at end of file From eb622c5bbdf3d0d05314b5b84a78d1756240d58a Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:30:01 -0400 Subject: [PATCH 20/82] Delete Cart78SG.cs --- EMU7800/Core/Cart78SG.cs | 94 ---------------------------------------- 1 file changed, 94 deletions(-) delete mode 100644 EMU7800/Core/Cart78SG.cs diff --git a/EMU7800/Core/Cart78SG.cs b/EMU7800/Core/Cart78SG.cs deleted file mode 100644 index 71dcdcfb64f..00000000000 --- a/EMU7800/Core/Cart78SG.cs +++ /dev/null @@ -1,94 +0,0 @@ -namespace EMU7800.Core -{ - /// - /// Atari 7800 SuperGame bankswitched cartridge - /// - public sealed class Cart78SG : Cart - { - // - // Cart Format Mapping to ROM Address Space - // Bank0: 0x00000:0x4000 - // Bank1: 0x04000:0x4000 0x4000:0x4000 Bank6 - // Bank2: 0x08000:0x4000 0x8000:0x4000 Bank0-7 (0 on startup) - // Bank3: 0x0c000:0x4000 0xc000:0x4000 Bank7 - // Bank4: 0x10000:0x4000 - // Bank5: 0x14000:0x4000 - // Bank6: 0x18000:0x4000 - // Bank7: 0x1c000:0x4000 - // - readonly int[] Bank = new int[4]; - readonly byte[] RAM; - - #region IDevice Members - - public override byte this[ushort addr] - { - get - { - var bankNo = addr >> 14; - if (RAM != null && bankNo == 1) - { - return RAM[addr & 0x3fff]; - } - return ROM[ (Bank[bankNo] << 14) | (addr & 0x3fff) ]; - } - set - { - var bankNo = addr >> 14; - if (bankNo == 2) - { - Bank[2] = value & 7; - } - else if (RAM != null && bankNo == 1) - { - RAM[addr & 0x3fff] = value; - } - } - } - - #endregion - - private Cart78SG() - { - } - - public Cart78SG(byte[] romBytes, bool needRAM) - { - if (needRAM) - { - // This works for titles that use 8KB instead of 16KB - RAM = new byte[0x4000]; - } - - Bank[1] = 6; - Bank[2] = 0; - Bank[3] = 7; - - LoadRom(romBytes, 0x20000); - } - - #region Serialization Members - - public Cart78SG(DeserializationContext input, MachineBase m) : base(input) - { - var version = input.CheckVersion(1, 2); - LoadRom(input.ReadBytes()); - Bank = input.ReadIntegers(4); - if (version == 1) - input.ReadInt32(); - RAM = input.ReadOptionalBytes(0x4000); - } - - public override void GetObjectData(SerializationContext output) - { - base.GetObjectData(output); - - output.WriteVersion(2); - output.Write(ROM); - output.Write(Bank); - output.WriteOptional(RAM); - } - - #endregion - } -} \ No newline at end of file From 99895dd45ae47f1867c5222a93e7e65a3d6cb967 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:30:10 -0400 Subject: [PATCH 21/82] Delete Cart78SGP.cs --- EMU7800/Core/Cart78SGP.cs | 118 -------------------------------------- 1 file changed, 118 deletions(-) delete mode 100644 EMU7800/Core/Cart78SGP.cs diff --git a/EMU7800/Core/Cart78SGP.cs b/EMU7800/Core/Cart78SGP.cs deleted file mode 100644 index 65feda2f849..00000000000 --- a/EMU7800/Core/Cart78SGP.cs +++ /dev/null @@ -1,118 +0,0 @@ -namespace EMU7800.Core -{ - /// - /// Atari 7800 SuperGame bankswitched cartridge w/Pokey - /// - public sealed class Cart78SGP : Cart - { - // - // Cart Format Mapping to ROM Address Space - // Bank0: 0x00000:0x4000 - // Bank1: 0x04000:0x4000 0x4000:0x4000 Pokey - // Bank2: 0x08000:0x4000 0x8000:0x4000 Bank0-7 (0 on startup) - // Bank3: 0x0c000:0x4000 0xc000:0x4000 Bank7 - // Bank4: 0x10000:0x4000 - // Bank5: 0x14000:0x4000 - // Bank6: 0x18000:0x4000 - // Bank7: 0x1c000:0x4000 - // - readonly int[] _bank = new int[4]; - PokeySound _pokeySound; - - #region IDevice Members - - public override void Reset() - { - base.Reset(); - if (_pokeySound != null) - _pokeySound.Reset(); - } - - public override byte this[ushort addr] - { - get - { - var bankNo = addr >> 14; - switch (bankNo) - { - case 1: - return (_pokeySound != null) ? _pokeySound.Read(addr) : (byte)0; - default: - return ROM[(_bank[bankNo] << 14) | (addr & 0x3fff)]; - } - } - set - { - var bankNo = addr >> 14; - switch (bankNo) - { - case 1: - if (_pokeySound != null) - _pokeySound.Update(addr, value); - break; - case 2: - _bank[2] = value & 7; - break; - } - } - } - - #endregion - - public override void Attach(MachineBase m) - { - base.Attach(m); - if (_pokeySound == null) - _pokeySound = new PokeySound(M); - } - - public override void StartFrame() - { - if (_pokeySound != null) - _pokeySound.StartFrame(); - } - - public override void EndFrame() - { - if (_pokeySound != null) - _pokeySound.EndFrame(); - } - - private Cart78SGP() - { - } - - public Cart78SGP(byte[] romBytes) - { - _bank[2] = 0; - _bank[3] = 7; - - LoadRom(romBytes, 0x20000); - } - - #region Serialization Members - - public Cart78SGP(DeserializationContext input, MachineBase m) : base(input) - { - input.CheckVersion(1); - LoadRom(input.ReadBytes()); - _bank = input.ReadIntegers(4); - _pokeySound = input.ReadOptionalPokeySound(m); - } - - public override void GetObjectData(SerializationContext output) - { - if (_pokeySound == null) - throw new Emu7800SerializationException("Cart78SGP must be attached before serialization."); - - base.GetObjectData(output); - - output.WriteVersion(1); - output.Write(ROM); - output.Write(_bank); - output.WriteOptional(_pokeySound); - } - - #endregion - } -} \ No newline at end of file From 2efe19e4a9e8c4bc75b02c214d2aab47c6eb82f8 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:30:23 -0400 Subject: [PATCH 22/82] Delete CartA16K.cs --- EMU7800/Core/CartA16K.cs | 86 ---------------------------------------- 1 file changed, 86 deletions(-) delete mode 100644 EMU7800/Core/CartA16K.cs diff --git a/EMU7800/Core/CartA16K.cs b/EMU7800/Core/CartA16K.cs deleted file mode 100644 index 69bcc687004..00000000000 --- a/EMU7800/Core/CartA16K.cs +++ /dev/null @@ -1,86 +0,0 @@ -namespace EMU7800.Core -{ - /// - /// Atari standard 16KB bankswitched carts - /// - public sealed class CartA16K : Cart - { - // - // Cart Format Mapping to ROM Address Space - // Bank1: 0x0000:0x1000 0x1000:0x1000 Bank selected by accessing 0x1ff9-0x1ff9 - // Bank2: 0x1000:0x1000 - // Bank3: 0x2000:0x1000 - // Bank4: 0x3000:0x1000 - // - ushort BankBaseAddr; - - int Bank - { - set { BankBaseAddr = (ushort)(value * 0x1000); } - } - - #region IDevice Members - - public override void Reset() - { - Bank = 0; - } - - public override byte this[ushort addr] - { - get - { - addr &= 0x0fff; - UpdateBank(addr); - return ROM[BankBaseAddr + addr]; - } - set - { - addr &= 0x0fff; - UpdateBank(addr); - } - } - - #endregion - - private CartA16K() - { - } - - public CartA16K(byte[] romBytes) - { - LoadRom(romBytes, 0x4000); - Bank = 0; - } - - void UpdateBank(ushort addr) - { - if (addr < 0x0ff6 || addr > 0x0ff9) - {} - else - { - Bank = addr - 0x0ff6; - } - } - - #region Serialization Members - - public CartA16K(DeserializationContext input, MachineBase m) : base(input) - { - input.CheckVersion(1); - LoadRom(input.ReadExpectedBytes(0x4000), 0x4000); - BankBaseAddr = input.ReadUInt16(); - } - - public override void GetObjectData(SerializationContext output) - { - base.GetObjectData(output); - - output.WriteVersion(1); - output.Write(ROM); - output.Write(BankBaseAddr); - } - - #endregion - } -} \ No newline at end of file From 7a3d21a92c9c3038d84005592eaf704f6dfc42c7 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:30:33 -0400 Subject: [PATCH 23/82] Delete CartA16KR.cs --- EMU7800/Core/CartA16KR.cs | 100 -------------------------------------- 1 file changed, 100 deletions(-) delete mode 100644 EMU7800/Core/CartA16KR.cs diff --git a/EMU7800/Core/CartA16KR.cs b/EMU7800/Core/CartA16KR.cs deleted file mode 100644 index cd5f307bce9..00000000000 --- a/EMU7800/Core/CartA16KR.cs +++ /dev/null @@ -1,100 +0,0 @@ -namespace EMU7800.Core -{ - /// - /// Atari standard 16KB bankswitched carts with 128 bytes of RAM - /// - public sealed class CartA16KR : Cart - { - // - // Cart Format Mapping to ROM Address Space - // Bank1: 0x0000:0x1000 0x1000:0x1000 Bank selected by accessing 0x1ff9-0x1ff9 - // Bank2: 0x1000:0x1000 - // Bank3: 0x2000:0x1000 - // Bank4: 0x3000:0x1000 - // Shadows ROM - // 0x1000:0x0080 RAM write port - // 0x1080:0x0080 RAM read port - // - ushort BankBaseAddr; - readonly byte[] RAM; - - int Bank - { - set { BankBaseAddr = (ushort)(value * 0x1000); } - } - - #region IDevice Members - - public override void Reset() - { - Bank = 0; - } - - public override byte this[ushort addr] - { - get - { - addr &= 0x0fff; - if (addr < 0x0100 && addr >= 0x0080) - { - return RAM[addr & 0x7f]; - } - UpdateBank(addr); - return ROM[BankBaseAddr + addr]; - } - set - { - addr &= 0x0fff; - if (addr < 0x0080) - { - RAM[addr & 0x7f] = value; - return; - } - UpdateBank(addr); - } - } - - #endregion - - private CartA16KR() - { - } - - public CartA16KR(byte[] romBytes) - { - LoadRom(romBytes, 0x4000); - Bank = 0; - RAM = new byte[0x80]; - } - - void UpdateBank(ushort addr) - { - if (addr < 0x0ff6 || addr > 0x0ff9) - {} - else - { - Bank = addr - 0x0ff6; - } - } - - #region Serialization Members - - public CartA16KR(DeserializationContext input, MachineBase m) : base(input) - { - input.CheckVersion(1); - LoadRom(input.ReadExpectedBytes(0x4000), 0x4000); - BankBaseAddr = input.ReadUInt16(); - } - - public override void GetObjectData(SerializationContext output) - { - base.GetObjectData(output); - - output.WriteVersion(1); - output.Write(ROM); - output.Write(BankBaseAddr); - } - - #endregion - } -} \ No newline at end of file From ee67746a7522e4b15ff4ae0613da03264fbb9436 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:30:45 -0400 Subject: [PATCH 24/82] Delete CartA2K.cs --- EMU7800/Core/CartA2K.cs | 56 ----------------------------------------- 1 file changed, 56 deletions(-) delete mode 100644 EMU7800/Core/CartA2K.cs diff --git a/EMU7800/Core/CartA2K.cs b/EMU7800/Core/CartA2K.cs deleted file mode 100644 index 14674c41385..00000000000 --- a/EMU7800/Core/CartA2K.cs +++ /dev/null @@ -1,56 +0,0 @@ -namespace EMU7800.Core -{ - /// - /// Atari standard 2KB carts (no bankswitching) - /// - public sealed class CartA2K : Cart - { - // - // Cart Format Mapping to ROM Address Space - // 0x0000:0x0800 0x1000:0x0800 - // 0x1800:0x0800 (1st 2k bank repeated) - // - - #region IDevice Members - - public override byte this[ushort addr] - { - get { return ROM[addr & 0x07ff]; } - set { } - } - - #endregion - - private CartA2K() - { - } - - public CartA2K(byte[] romBytes) - { - LoadRom(romBytes, 0x0800); - } - - public CartA2K(byte[] romBytes, int multicartBankSelector) - { - LoadRom(romBytes, 0x800, multicartBankSelector & 0x1f); - } - - #region Serialization Members - - public CartA2K(DeserializationContext input, MachineBase m) : base(input) - { - input.CheckVersion(1); - LoadRom(input.ReadExpectedBytes(0x0800), 0x0800); - } - - public override void GetObjectData(SerializationContext output) - { - base.GetObjectData(output); - - output.WriteVersion(1); - output.Write(ROM); - } - - #endregion - } -} \ No newline at end of file From d64f7e7a0d95fef9af60c098f1c299911dc22f47 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:30:54 -0400 Subject: [PATCH 25/82] Delete CartA32K.cs --- EMU7800/Core/CartA32K.cs | 88 ---------------------------------------- 1 file changed, 88 deletions(-) delete mode 100644 EMU7800/Core/CartA32K.cs diff --git a/EMU7800/Core/CartA32K.cs b/EMU7800/Core/CartA32K.cs deleted file mode 100644 index d3140ac9156..00000000000 --- a/EMU7800/Core/CartA32K.cs +++ /dev/null @@ -1,88 +0,0 @@ -namespace EMU7800.Core -{ - /// - /// Atari standard 32KB bankswitched carts - /// - public sealed class CartA32K : Cart - { - // - // Cart Format Mapping to ROM Address Space - // Bank1: 0x0000:0x1000 0x1000:0x1000 Bank selected by accessing 0x0ff4-0x0ffc - // Bank2: 0x1000:0x1000 - // Bank3: 0x2000:0x1000 - // Bank4: 0x3000:0x1000 - // Bank5: 0x4000:0x1000 - // Bank6: 0x5000:0x1000 - // Bank7: 0x6000:0x1000 - // Bank8: 0x7000:0x1000 - // - ushort BankBaseAddr; - - int Bank - { - set { BankBaseAddr = (ushort)(value * 0x1000); } - } - - #region IDevice Members - - public override void Reset() - { - Bank = 7; - } - - public override byte this[ushort addr] - { - get - { - addr &= 0x0fff; - UpdateBank(addr); - return ROM[BankBaseAddr + addr]; - } - set - { - addr &= 0x0fff; - UpdateBank(addr); - } - } - - #endregion - - private CartA32K() - { - } - - public CartA32K(byte[] romBytes) - { - LoadRom(romBytes, 0x8000); - Bank = 7; - } - - void UpdateBank(ushort addr) - { - if (addr < 0x0ffc && addr >= 0x0ff4) - { - Bank = addr - 0x0ff4; - } - } - - #region Serialization Members - - public CartA32K(DeserializationContext input, MachineBase m) : base(input) - { - input.CheckVersion(1); - LoadRom(input.ReadExpectedBytes(0x8000), 0x8000); - BankBaseAddr = input.ReadUInt16(); - } - - public override void GetObjectData(SerializationContext output) - { - base.GetObjectData(output); - - output.WriteVersion(1); - output.Write(ROM); - output.Write(BankBaseAddr); - } - - #endregion - } -} \ No newline at end of file From 381b08889baf2fc85a9e19094f5066c84d2beaf0 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:31:08 -0400 Subject: [PATCH 26/82] Delete CartA32KR.cs --- EMU7800/Core/CartA32KR.cs | 104 -------------------------------------- 1 file changed, 104 deletions(-) delete mode 100644 EMU7800/Core/CartA32KR.cs diff --git a/EMU7800/Core/CartA32KR.cs b/EMU7800/Core/CartA32KR.cs deleted file mode 100644 index 74e43461cb7..00000000000 --- a/EMU7800/Core/CartA32KR.cs +++ /dev/null @@ -1,104 +0,0 @@ -namespace EMU7800.Core -{ - /// - /// Atari standard 32KB bankswitched carts with 128 bytes of RAM - /// - public sealed class CartA32KR : Cart - { - // - // Cart Format Mapping to ROM Address Space - // Bank1: 0x0000:0x1000 0x1000:0x1000 Bank selected by accessing 0x0ff4-0x0ffc - // Bank2: 0x1000:0x1000 - // Bank3: 0x2000:0x1000 - // Bank4: 0x3000:0x1000 - // Bank5: 0x4000:0x1000 - // Bank6: 0x5000:0x1000 - // Bank7: 0x6000:0x1000 - // Bank8: 0x7000:0x1000 - // Shadows ROM - // 0x1000:0x80 RAM write port - // 0x1080:0x80 RAM read port - // - ushort BankBaseAddr; - readonly byte[] RAM; - - int Bank - { - set { BankBaseAddr = (ushort)(value * 0x1000); } - } - - #region IDevice Members - - public override void Reset() - { - Bank = 7; - } - - public override byte this[ushort addr] - { - get - { - addr &= 0x0fff; - if (addr >= 0x0080 && addr < 0x0100) - { - return RAM[addr & 0x007f]; - } - UpdateBank(addr); - return ROM[BankBaseAddr + addr]; - } - set - { - addr &= 0x0fff; - if (addr < 0x0080) - { - RAM[addr & 0x007f] = value; - return; - } - UpdateBank(addr); - } - } - - #endregion - - private CartA32KR() - { - } - - public CartA32KR(byte[] romBytes) - { - LoadRom(romBytes, 0x8000); - RAM = new byte[0x80]; - Bank = 7; - } - - void UpdateBank(ushort addr) - { - if (addr < 0x0ffc && addr >= 0x0ff4 ) - { - Bank = addr - 0x0ff4; - } - } - - #region Serialization Members - - public CartA32KR(DeserializationContext input, MachineBase m) : base(input) - { - input.CheckVersion(1); - LoadRom(input.ReadExpectedBytes(0x8000), 0x8000); - RAM = input.ReadExpectedBytes(0x80); - BankBaseAddr = input.ReadUInt16(); - } - - public override void GetObjectData(SerializationContext output) - { - base.GetObjectData(output); - - output.WriteVersion(1); - output.Write(ROM); - output.Write(RAM); - output.Write(BankBaseAddr); - } - - #endregion - } -} \ No newline at end of file From 8443c527b47b87e10156aa633c8b2f2e815ccefe Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:31:24 -0400 Subject: [PATCH 27/82] Delete CartA4K.cs --- EMU7800/Core/CartA4K.cs | 47 ----------------------------------------- 1 file changed, 47 deletions(-) delete mode 100644 EMU7800/Core/CartA4K.cs diff --git a/EMU7800/Core/CartA4K.cs b/EMU7800/Core/CartA4K.cs deleted file mode 100644 index 17726a3c2b1..00000000000 --- a/EMU7800/Core/CartA4K.cs +++ /dev/null @@ -1,47 +0,0 @@ -namespace EMU7800.Core -{ - /// - /// Atari standard 4KB carts (no bankswitching) - /// - public sealed class CartA4K : Cart - { - #region IDevice Members - - public override void Reset() { } - - public override byte this[ushort addr] - { - get { return ROM[addr & 0x0fff]; } - set { } - } - - #endregion - - private CartA4K() - { - } - - public CartA4K(byte[] romBytes) - { - LoadRom(romBytes, 0x1000); - } - - #region Serialization Members - - public CartA4K(DeserializationContext input, MachineBase m) : base(input) - { - input.CheckVersion(1); - LoadRom(input.ReadExpectedBytes(0x1000), 0x1000); - } - - public override void GetObjectData(SerializationContext output) - { - base.GetObjectData(output); - - output.WriteVersion(1); - output.Write(ROM); - } - - #endregion - } -} \ No newline at end of file From 27600934e3ccfabca27bc9e3ebd5fc9eea16a734 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:31:37 -0400 Subject: [PATCH 28/82] Delete CartA8K.cs --- EMU7800/Core/CartA8K.cs | 87 ----------------------------------------- 1 file changed, 87 deletions(-) delete mode 100644 EMU7800/Core/CartA8K.cs diff --git a/EMU7800/Core/CartA8K.cs b/EMU7800/Core/CartA8K.cs deleted file mode 100644 index c8f531e5cb5..00000000000 --- a/EMU7800/Core/CartA8K.cs +++ /dev/null @@ -1,87 +0,0 @@ -namespace EMU7800.Core -{ - /// - /// Atari standard 8KB bankswitched carts - /// - public sealed class CartA8K : Cart - { - // - // Cart Format Mapping to ROM Address Space - // Bank1: 0x0000:0x1000 0x1000:0x1000 Bank selected by accessing 0x1ff8,0x1ff9 - // Bank2: 0x1000:0x1000 - // - ushort BankBaseAddr; - - int Bank - { - set { BankBaseAddr = (ushort)(value * 0x1000); } - } - - #region IDevice Members - - public override void Reset() - { - Bank = 1; - } - - public override byte this[ushort addr] - { - get - { - addr &= 0x0fff; - UpdateBank(addr); - return ROM[BankBaseAddr + addr]; - } - set - { - addr &= 0x0fff; - UpdateBank(addr); - } - } - - #endregion - - private CartA8K() - { - } - - public CartA8K(byte[] romBytes) - { - LoadRom(romBytes, 0x2000); - Bank = 1; - } - - void UpdateBank(ushort addr) - { - switch(addr) - { - case 0x0ff8: - Bank = 0; - break; - case 0x0ff9: - Bank = 1; - break; - } - } - - #region Serialization Members - - public CartA8K(DeserializationContext input, MachineBase m) : base(input) - { - input.CheckVersion(1); - LoadRom(input.ReadExpectedBytes(0x2000), 0x2000); - BankBaseAddr = input.ReadUInt16(); - } - - public override void GetObjectData(SerializationContext output) - { - base.GetObjectData(output); - - output.WriteVersion(1); - output.Write(ROM); - output.Write(BankBaseAddr); - } - - #endregion - } -} \ No newline at end of file From 5a04d633bef0046d8262770ce8dff8e3c7244874 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:31:48 -0400 Subject: [PATCH 29/82] Delete CartA8KR.cs --- EMU7800/Core/CartA8KR.cs | 103 --------------------------------------- 1 file changed, 103 deletions(-) delete mode 100644 EMU7800/Core/CartA8KR.cs diff --git a/EMU7800/Core/CartA8KR.cs b/EMU7800/Core/CartA8KR.cs deleted file mode 100644 index a0fd89e034b..00000000000 --- a/EMU7800/Core/CartA8KR.cs +++ /dev/null @@ -1,103 +0,0 @@ -namespace EMU7800.Core -{ - /// - /// Atari standard 8KB bankswitched carts with 128 bytes of RAM - /// - public sealed class CartA8KR : Cart - { - // - // Cart Format Mapping to ROM Address Space - // Bank1: 0x0000:0x1000 0x1000:0x1000 Bank selected by accessing 0x1ff8,0x1ff9 - // Bank2: 0x1000:0x1000 - // Shadows ROM - // 0x1000:0x0080 RAM write port - // 0x1080:0x0080 RAM read port - // - ushort BankBaseAddr; - readonly byte[] RAM; - - int Bank - { - set { BankBaseAddr = (ushort)(value * 0x1000); } - } - - #region IDevice Members - - public override void Reset() - { - Bank = 1; - } - - public override byte this[ushort addr] - { - get - { - addr &= 0x0fff; - if (addr < 0x0100 && addr >= 0x0080) - { - return RAM[addr & 0x7f]; - } - UpdateBank(addr); - return ROM[BankBaseAddr + addr]; - } - set - { - addr &= 0x0fff; - if (addr < 0x0080) - { - RAM[addr & 0x7f] = value; - return; - } - UpdateBank(addr); - } - } - - #endregion - - private CartA8KR() - { - } - - public CartA8KR(byte[] romBytes) - { - LoadRom(romBytes, 0x2000); - Bank = 1; - RAM = new byte[0x80]; - } - - void UpdateBank(ushort addr) - { - switch(addr) - { - case 0x0ff8: - Bank = 0; - break; - case 0x0ff9: - Bank = 1; - break; - } - } - - #region Serialization Members - - public CartA8KR(DeserializationContext input, MachineBase m) : base(input) - { - input.CheckVersion(1); - LoadRom(input.ReadExpectedBytes(0x2000), 0x2000); - RAM = input.ReadExpectedBytes(0x80); - BankBaseAddr = input.ReadUInt16(); - } - - public override void GetObjectData(SerializationContext output) - { - base.GetObjectData(output); - - output.WriteVersion(1); - output.Write(ROM); - output.Write(RAM); - output.Write(BankBaseAddr); - } - - #endregion - } -} \ No newline at end of file From 6914f8b7c4e76ee965b97ffd0436000764affd46 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:31:57 -0400 Subject: [PATCH 30/82] Delete CartCBS12K.cs --- EMU7800/Core/CartCBS12K.cs | 100 ------------------------------------- 1 file changed, 100 deletions(-) delete mode 100644 EMU7800/Core/CartCBS12K.cs diff --git a/EMU7800/Core/CartCBS12K.cs b/EMU7800/Core/CartCBS12K.cs deleted file mode 100644 index 9b0d7bbece6..00000000000 --- a/EMU7800/Core/CartCBS12K.cs +++ /dev/null @@ -1,100 +0,0 @@ -namespace EMU7800.Core -{ - /// - /// CBS RAM Plus 12KB bankswitched carts with 128 bytes of RAM. - /// - public sealed class CartCBS12K : Cart - { - // - // Cart Format Mapping to ROM Address Space - // Bank1: 0x0000:0x1000 Bank1:0x1000:0x1000 Select Segment: 0ff8-0ffa - // Bank2: 0x1000:0x1000 - // Bank3: 0x2000:0x1000 - // Shadows ROM - // 0x1000:0x80 RAM write port - // 0x1080:0x80 RAM read port - // - ushort BankBaseAddr; - readonly byte[] RAM; - - int Bank - { - set { BankBaseAddr = (ushort)(value * 0x1000); } - } - - #region IDevice Members - - public override void Reset() - { - Bank = 2; - } - - public override byte this[ushort addr] - { - get - { - addr &= 0x0fff; - if (addr < 0x0200 && addr >= 0x0100) - { - return RAM[addr & 0xff]; - } - UpdateBank(addr); - return ROM[BankBaseAddr + addr]; - } - set - { - addr &= 0x0fff; - if (addr < 0x0100) - { - RAM[addr & 0xff] = value; - return; - } - UpdateBank(addr); - } - } - - #endregion - - private CartCBS12K() - { - } - - public CartCBS12K(byte[] romBytes) - { - LoadRom(romBytes, 0x3000); - Bank = 2; - RAM = new byte[0x100]; - } - - void UpdateBank(ushort addr) - { - if (addr < 0x0ff8 || addr > 0x0ffa) { } - else - { - Bank = addr - 0x0ff8; - } - } - - #region Serialization Members - - public CartCBS12K(DeserializationContext input, MachineBase m) : base(input) - { - input.CheckVersion(1); - LoadRom(input.ReadExpectedBytes(0x3000), 0x3000); - RAM = input.ReadExpectedBytes(0x100); - BankBaseAddr = input.ReadUInt16(); - } - - public override void GetObjectData(SerializationContext output) - { - base.GetObjectData(output); - - output.WriteVersion(1); - output.Write(ROM); - output.Write(RAM); - output.Write(BankBaseAddr); - } - - #endregion - } -} \ No newline at end of file From 17cef7393a80e6c8a5d673d92c0f30d864f6dfaa Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:32:06 -0400 Subject: [PATCH 31/82] Delete CartDC8K.cs --- EMU7800/Core/CartDC8K.cs | 55 ---------------------------------------- 1 file changed, 55 deletions(-) delete mode 100644 EMU7800/Core/CartDC8K.cs diff --git a/EMU7800/Core/CartDC8K.cs b/EMU7800/Core/CartDC8K.cs deleted file mode 100644 index 0b3808e24c4..00000000000 --- a/EMU7800/Core/CartDC8K.cs +++ /dev/null @@ -1,55 +0,0 @@ -namespace EMU7800.Core -{ - /// - /// Activison's Robot Tank and Decathlon 8KB bankswitching cart. - /// - public sealed class CartDC8K : Cart - { - // - // Cart Format Mapping to ROM Address Space - // Bank1: 0x0000:0x1000 0x1000:0x1000 Bank selected by A13=0/1? - // Bank2: 0x1000:0x1000 - // - // This does what the Stella code does, which is to follow A13 to determine - // the bank. Since A0-A12 are the only significant bits on the program - // counter, I am unsure how the cart/hardware could utilize this. - // - - #region IDevice Members - - public override byte this[ushort addr] - { - get { return (addr & 0x2000) == 0 ? ROM[addr & 0x0fff + 0x1000] : ROM[addr & 0x0fff]; } - set { } - } - - #endregion - - private CartDC8K() - { - } - - public CartDC8K(byte[] romBytes) - { - LoadRom(romBytes, 0x2000); - } - - #region Serialization Members - - public CartDC8K(DeserializationContext input, MachineBase m) : base(input) - { - input.CheckVersion(1); - LoadRom(input.ReadExpectedBytes(0x2000), 0x2000); - } - - public override void GetObjectData(SerializationContext output) - { - base.GetObjectData(output); - - output.WriteVersion(1); - output.Write(ROM); - } - - #endregion - } -} \ No newline at end of file From 0def568ff7fb4e5b223f304abfc43c69d16137e4 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:32:14 -0400 Subject: [PATCH 32/82] Delete CartDPC.cs --- EMU7800/Core/CartDPC.cs | 341 ---------------------------------------- 1 file changed, 341 deletions(-) delete mode 100644 EMU7800/Core/CartDPC.cs diff --git a/EMU7800/Core/CartDPC.cs b/EMU7800/Core/CartDPC.cs deleted file mode 100644 index 4695f64df77..00000000000 --- a/EMU7800/Core/CartDPC.cs +++ /dev/null @@ -1,341 +0,0 @@ -namespace EMU7800.Core -{ - /// - /// Pitfall II cartridge. - /// There are two 4k banks, 2k display bank, and the DPC chip. - /// For complete details on the DPC chip see David P. Crane's United States Patent Number 4,644,495. - /// - public sealed class CartDPC : Cart - { - // - // Cart Format Mapping to ROM Address Space - // Bank1: 0x0000:0x1000 0x1000:0x1000 Bank selected by accessing 0x1ff8,0x1ff9 - // Bank2: 0x1000:0x1000 - // - const ushort DisplayBaseAddr = 0x2000; - ushort BankBaseAddr; - - readonly byte[] MusicAmplitudes = new byte[] { 0x00, 0x04, 0x05, 0x09, 0x06, 0x0a, 0x0b, 0x0f }; - - readonly byte[] Tops = new byte[8]; - readonly byte[] Bots = new byte[8]; - readonly ushort[] Counters = new ushort[8]; - readonly byte[] Flags = new byte[8]; - readonly bool[] MusicMode = new bool[3]; - - ulong LastSystemClock; - double FractionalClocks; - - byte _ShiftRegister; - - int Bank - { - set { BankBaseAddr = (ushort)(value * 0x1000); } - } - - // - // Generate a sequence of pseudo-random numbers 255 numbers long - // by emulating an 8-bit shift register with feedback taps at - // bits 4, 3, 2, and 0. - byte ShiftRegister - { - get - { - var a = _ShiftRegister; - a &= (1 << 0); - - var x = _ShiftRegister; - x &= (1 << 2); - x >>= 2; - a ^= x; - - x = _ShiftRegister; - x &= (1 << 3); - x >>= 3; - a ^= x; - - x = _ShiftRegister; - x &= (1 << 4); - x >>= 4; - a ^= x; - - a <<= 7; - _ShiftRegister >>= 1; - _ShiftRegister |= a; - - return _ShiftRegister; - } - set { _ShiftRegister = value; } - } - - #region IDevice Members - - public override void Reset() - { - Bank = 1; - LastSystemClock = 3*M.CPU.Clock; - FractionalClocks = 0.0; - ShiftRegister = 1; - } - - public override byte this[ushort addr] - { - get - { - addr &= 0x0fff; - if (addr < 0x0040) - { - return ReadPitfall2Reg(addr); - } - UpdateBank(addr); - return ROM[BankBaseAddr + addr]; - } - set - { - addr &= 0x0fff; - if (addr >= 0x0040 && addr < 0x0080) - { - WritePitfall2Reg(addr, value); - } - else - { - UpdateBank(addr); - } - } - } - - #endregion - - private CartDPC() - { - } - - public CartDPC(byte[] romBytes) - { - LoadRom(romBytes, 0x2800); - Bank = 1; - } - - void UpdateBank(ushort addr) - { - switch(addr) - { - case 0x0ff8: - Bank = 0; - break; - case 0x0ff9: - Bank = 1; - break; - } - } - - byte ReadPitfall2Reg(ushort addr) - { - byte result; - - var i = addr & 0x07; - var fn = (addr >> 3) & 0x07; - - // Update flag register for selected data fetcher - if ((Counters[i] & 0x00ff) == Tops[i]) - { - Flags[i] = 0xff; - } - else if ((Counters[i] & 0x00ff) == Bots[i]) - { - Flags[i] = 0x00; - } - - switch (fn) - { - case 0x00: - if (i < 4) - { - // This is a random number read - result = ShiftRegister; - break; - } - // Its a music read - UpdateMusicModeDataFetchers(); - - byte j = 0; - if (MusicMode[0] && Flags[5] != 0) - { - j |= 0x01; - } - if (MusicMode[1] && Flags[6] != 0) - { - j |= 0x02; - } - if (MusicMode[2] && Flags[7] != 0) - { - j |= 0x04; - } - result = MusicAmplitudes[j]; - break; - // DFx display data read - case 0x01: - result = ROM[DisplayBaseAddr + 0x7ff - Counters[i]]; - break; - // DFx display data read AND'd w/flag - case 0x02: - result = ROM[DisplayBaseAddr + 0x7ff - Counters[i]]; - result &= Flags[i]; - break; - // DFx flag - case 0x07: - result = Flags[i]; - break; - default: - result = 0; - break; - } - - // Clock the selected data fetcher's counter if needed - if (i < 5 || i >= 5 && MusicMode[i - 5] == false) - { - Counters[i]--; - Counters[i] &= 0x07ff; - } - - return result; - } - - void UpdateMusicModeDataFetchers() - { - var sysClockDelta = 3*M.CPU.Clock - LastSystemClock; - LastSystemClock = 3*M.CPU.Clock; - - var OSCclocks = ((15750.0 * sysClockDelta) / 1193191.66666667) + FractionalClocks; - - var wholeClocks = (int)OSCclocks; - FractionalClocks = OSCclocks - wholeClocks; - if (wholeClocks <= 0) - { - return; - } - - for (var i=0; i < 3; i++) - { - var r = i + 5; - if (!MusicMode[i]) continue; - - var top = Tops[r] + 1; - var newLow = Counters[r] & 0x00ff; - - if (Tops[r] != 0) - { - newLow -= (wholeClocks % top); - if (newLow < 0) - { - newLow += top; - } - } - else - { - newLow = 0; - } - - if (newLow <= Bots[r]) - { - Flags[r] = 0x00; - } - else if (newLow <= Tops[r]) - { - Flags[r] = 0xff; - } - - Counters[r] = (ushort)((Counters[r] & 0x0700) | (ushort)newLow); - } - } - - void WritePitfall2Reg(ushort addr, byte val) - { - var i = addr & 0x07; - var fn = (addr >> 3) & 0x07; - - switch (fn) - { - // DFx top count - case 0x00: - Tops[i] = val; - Flags[i] = 0x00; - break; - // DFx bottom count - case 0x01: - Bots[i] = val; - break; - // DFx counter low - case 0x02: - Counters[i] &= 0x0700; - if (i >= 5 && MusicMode[i - 5]) - { - // Data fetcher is in music mode so its low counter value - // should be loaded from the top register not the poked value - Counters[i] |= Tops[i]; - } - else - { - // Data fetcher is either not a music mode data fetcher or it - // isn't in music mode so it's low counter value should be loaded - // with the poked value - Counters[i] |= val; - } - break; - // DFx counter high - case 0x03: - Counters[i] &= 0x00ff; - Counters[i] |= (ushort)((val & 0x07) << 8); - // Execute special code for music mode data fetchers - if (i >= 5) - { - MusicMode[i - 5] = (val & 0x10) != 0; - // NOTE: We are not handling the clock source input for - // the music mode data fetchers. We're going to assume - // they always use the OSC input. - } - break; - // Random Number Generator Reset - case 0x06: - ShiftRegister = 1; - break; - } - } - - #region Serialization Members - - public CartDPC(DeserializationContext input, MachineBase m) : base(input) - { - input.CheckVersion(1); - LoadRom(input.ReadExpectedBytes(0x2800), 0x2800); - BankBaseAddr = input.ReadUInt16(); - Tops = input.ReadExpectedBytes(8); - Bots = input.ReadExpectedBytes(8); - Counters = input.ReadUnsignedShorts(8); - Flags = input.ReadExpectedBytes(8); - MusicMode = input.ReadBooleans(3); - LastSystemClock = input.ReadUInt64(); - FractionalClocks = input.ReadDouble(); - _ShiftRegister = input.ReadByte(); - } - - public override void GetObjectData(SerializationContext output) - { - base.GetObjectData(output); - - output.WriteVersion(1); - output.Write(ROM); - output.Write(BankBaseAddr); - output.Write(Tops); - output.Write(Bots); - output.Write(Counters); - output.Write(Flags); - output.Write(MusicMode); - output.Write(LastSystemClock); - output.Write(FractionalClocks); - output.Write(_ShiftRegister); - } - - #endregion - } -} \ No newline at end of file From c49dbfcd3277d2cbdd9e02068093354e1916ebe9 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:32:25 -0400 Subject: [PATCH 33/82] Delete CartMN16K.cs --- EMU7800/Core/CartMN16K.cs | 136 -------------------------------------- 1 file changed, 136 deletions(-) delete mode 100644 EMU7800/Core/CartMN16K.cs diff --git a/EMU7800/Core/CartMN16K.cs b/EMU7800/Core/CartMN16K.cs deleted file mode 100644 index fbcaf99bca3..00000000000 --- a/EMU7800/Core/CartMN16K.cs +++ /dev/null @@ -1,136 +0,0 @@ -namespace EMU7800.Core -{ - /// - /// M-Network 16KB bankswitched carts with 2KB RAM. - /// - public sealed class CartMN16K : Cart - { - // - // Cart Format Mapping to ROM Address Space - // Segment1: 0x0000:0x0800 Bank1:0x1000:0x0800 Select Seg: 1fe0-1fe6, 1fe7=RAM Seg1 - // Segment2: 0x0800:0x0800 Bank2:0x1800:0x0800 Always Seg8 - // Segment3: 0x1000:0x0800 - // Segment4: 0x1800:0x0800 - // Segment5: 0x2000:0x0800 - // Segment6: 0x2800:0x0800 - // Segment7: 0x3000:0x0800 - // Segment8: 0x3800:0x0800 - // - // RAM RAM Segment1 when 1fe7 select is accessed - // Segment1: 0x0000:0x0400 0x1000-0x13FF write port - // Segment2: 0x0400:0x0400 0x1400-0x17FF read port - // - // RAM Segment2: 1ff8-1ffb selects 256-byte block - // 0x1800-0x18ff write port - // 0x1900-0x19ff read port - // - ushort BankBaseAddr, BankBaseRAMAddr; - bool RAMBankOn; - readonly byte[] RAM; - - int Bank - { - set - { - BankBaseAddr = (ushort)(value << 11); // multiply by 2048 - RAMBankOn = (value == 0x07); - } - } - - int BankRAM - { - set { BankBaseRAMAddr = (ushort) (value << 8); } // multiply by 256 - } - - #region IDevice Members - - public override void Reset() - { - Bank = 0; - BankRAM = 0; - } - - public override byte this[ushort addr] - { - get - { - addr &= 0x0fff; - UpdateBanks(addr); - if (RAMBankOn && addr >= 0x0400 && addr < 0x0800) - { - return RAM[addr & 0x03ff]; - } - if (addr >= 0x0900 && addr < 0x0a00) - { - return RAM[0x400 + BankBaseRAMAddr + (addr & 0xff)]; - } - return addr < 0x0800 ? ROM[BankBaseAddr + (addr & 0x07ff)] : ROM[0x3800 + (addr & 0x07ff)]; - } - set - { - addr &= 0x0fff; - UpdateBanks(addr); - if (RAMBankOn && addr < 0x0400) - { - RAM[addr & 0x03ff] = value; - } - else if (addr >= 0x0800 && addr < 0x0900) - { - RAM[0x400 + BankBaseRAMAddr + (addr & 0xff)] = value; - } - } - } - - #endregion - - private CartMN16K() - { - } - - public CartMN16K(byte[] romBytes) - { - LoadRom(romBytes, 0x4000); - RAM = new byte[0x800]; - Bank = 0; - BankRAM = 0; - } - - void UpdateBanks(ushort addr) - { - if (addr >= 0x0fe0 && addr < 0x0fe8) - { - Bank = addr & 0x07; - } - else if (addr >= 0x0fe8 && addr < 0x0fec) - { - BankRAM = addr & 0x03; - } - } - - #region Serialization Members - - public CartMN16K(DeserializationContext input, MachineBase m) : base(input) - { - input.CheckVersion(1); - LoadRom(input.ReadExpectedBytes(0x4000), 0x4000); - RAM = input.ReadExpectedBytes(0x800); - BankBaseAddr = input.ReadUInt16(); - BankBaseRAMAddr = input.ReadUInt16(); - RAMBankOn = input.ReadBoolean(); - } - - public override void GetObjectData(SerializationContext output) - { - base.GetObjectData(output); - - output.WriteVersion(1); - output.Write(ROM); - output.Write(RAM); - output.Write(BankBaseAddr); - output.Write(BankBaseRAMAddr); - output.Write(RAMBankOn); - } - - #endregion - } -} \ No newline at end of file From 2706d2ab39027d6fd526b03be65fa144032f0099 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:32:35 -0400 Subject: [PATCH 34/82] Delete CartPB8K.cs --- EMU7800/Core/CartPB8K.cs | 103 --------------------------------------- 1 file changed, 103 deletions(-) delete mode 100644 EMU7800/Core/CartPB8K.cs diff --git a/EMU7800/Core/CartPB8K.cs b/EMU7800/Core/CartPB8K.cs deleted file mode 100644 index 150bca09328..00000000000 --- a/EMU7800/Core/CartPB8K.cs +++ /dev/null @@ -1,103 +0,0 @@ -namespace EMU7800.Core -{ - /// - /// Parker Brothers 8KB bankswitched carts. - /// - public sealed class CartPB8K : Cart - { - // - // Cart Format Mapping to ROM Address Space - // Segment1: 0x0000:0x0400 Bank1:0x1000:0x0400 Select Segment: 1fe0-1fe7 - // Segment2: 0x0400:0x0400 Bank2:0x1400:0x0400 Select Segment: 1fe8-1ff0 - // Segment3: 0x0800:0x0400 Bank3:0x1800:0x0400 Select Segment: 1ff0-1ff8 - // Segment4: 0x0c00:0x0400 Bank4:0x1c00:0x0400 Always Segment8 - // Segment5: 0x1000:0x0400 - // Segment6: 0x1400:0x0400 - // Segment7: 0x1800:0x0400 - // Segment8: 0x1c00:0x0400 - // - readonly ushort[] SegmentBase; - - #region IDevice Members - - public override void Reset() - { - SegmentBase[0] = ComputeSegmentBase(4); - SegmentBase[1] = ComputeSegmentBase(5); - SegmentBase[2] = ComputeSegmentBase(6); - } - - public override byte this[ushort addr] - { - get - { - addr &= 0x0fff; - UpdateSegmentBases(addr); - return ROM[SegmentBase[addr >> 10] + (addr & 0x03ff)]; - } - set - { - addr &= 0x0fff; - UpdateSegmentBases(addr); - } - } - - #endregion - - private CartPB8K() - { - } - - public CartPB8K(byte[] romBytes) - { - LoadRom(romBytes, 0x2000); - SegmentBase = new ushort[4]; - SegmentBase[0] = ComputeSegmentBase(4); - SegmentBase[1] = ComputeSegmentBase(5); - SegmentBase[2] = ComputeSegmentBase(6); - SegmentBase[3] = ComputeSegmentBase(7); - } - - static ushort ComputeSegmentBase(int slice) - { - return (ushort)(slice << 10); // multiply by 1024 - } - - void UpdateSegmentBases(ushort addr) - { - if (addr < 0xfe0 || addr >= 0x0ff8) { } - else if (addr >= 0x0fe0 && addr < 0x0fe8) - { - SegmentBase[0] = ComputeSegmentBase(addr & 0x07); - } - else if (addr >= 0x0fe8 && addr < 0x0ff0) - { - SegmentBase[1] = ComputeSegmentBase(addr & 0x07); - } - else if (addr >= 0x0ff0 && addr < 0x0ff8) - { - SegmentBase[2] = ComputeSegmentBase(addr & 0x07); - } - } - - #region Serialization Members - - public CartPB8K(DeserializationContext input, MachineBase m) : base(input) - { - input.CheckVersion(1); - LoadRom(input.ReadExpectedBytes(0x2000), 0x2000); - SegmentBase = input.ReadUnsignedShorts(); - } - - public override void GetObjectData(SerializationContext output) - { - base.GetObjectData(output); - - output.WriteVersion(1); - output.Write(ROM); - output.Write(SegmentBase); - } - - #endregion - } -} \ No newline at end of file From bcf24cf3b124f4da23dc86579a755cacd702aa8e Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:32:43 -0400 Subject: [PATCH 35/82] Delete CartTV8K.cs --- EMU7800/Core/CartTV8K.cs | 90 ---------------------------------------- 1 file changed, 90 deletions(-) delete mode 100644 EMU7800/Core/CartTV8K.cs diff --git a/EMU7800/Core/CartTV8K.cs b/EMU7800/Core/CartTV8K.cs deleted file mode 100644 index cfeaa9d0388..00000000000 --- a/EMU7800/Core/CartTV8K.cs +++ /dev/null @@ -1,90 +0,0 @@ -namespace EMU7800.Core -{ - /// - /// Tigervision 8KB bankswitched carts - /// - public sealed class CartTV8K : Cart - { - // - // Cart Format Mapping to ROM Address Space - // Segment1: 0x0000:0x0800 0x1000:0x0800 Selected segment via $003F - // Segment2: 0x0800:0x0800 0x1800:0x0800 Always last segment - // Segment3: 0x1000:0x0800 - // Segment4: 0x1800:0x0800 - // - ushort BankBaseAddr; - readonly ushort LastBankBaseAddr; - - byte Bank - { - set - { - BankBaseAddr = (ushort)(0x0800 * value); - BankBaseAddr %= (ushort)ROM.Length; - } - } - - protected internal override bool RequestSnooping - { - get { return true; } - } - - #region IDevice Members - - public override void Reset() - { - Bank = 0; - } - - public override byte this[ushort addr] - { - get - { - addr &= 0x0fff; - return addr < 0x0800 ? ROM[BankBaseAddr + (addr & 0x07ff)] : ROM[LastBankBaseAddr + (addr & 0x07ff)]; - } - set - { - if (addr <= 0x003f) - { - Bank = value; - } - } - } - - #endregion - - private CartTV8K() - { - } - - public CartTV8K(byte[] romBytes) - { - LoadRom(romBytes, 0x1000); - Bank = 0; - LastBankBaseAddr = (ushort)(ROM.Length - 0x0800); - } - - #region Serialization Members - - public CartTV8K(DeserializationContext input, MachineBase m) : base(input) - { - input.CheckVersion(1); - LoadRom(input.ReadExpectedBytes(0x1000), 0x1000); - BankBaseAddr = input.ReadUInt16(); - LastBankBaseAddr = input.ReadUInt16(); - } - - public override void GetObjectData(SerializationContext output) - { - base.GetObjectData(output); - - output.WriteVersion(1); - output.Write(ROM); - output.Write(BankBaseAddr); - output.Write(LastBankBaseAddr); - } - - #endregion - } -} \ No newline at end of file From 6d5a7b29741647738fa64180de78d3f6b5b03e7a Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:32:52 -0400 Subject: [PATCH 36/82] Delete CartType.cs --- EMU7800/Core/CartType.cs | 43 ---------------------------------------- 1 file changed, 43 deletions(-) delete mode 100644 EMU7800/Core/CartType.cs diff --git a/EMU7800/Core/CartType.cs b/EMU7800/Core/CartType.cs deleted file mode 100644 index a334cb5034e..00000000000 --- a/EMU7800/Core/CartType.cs +++ /dev/null @@ -1,43 +0,0 @@ -/* - * CartType.cs - * - * Defines the set of all known Game Cartridges. - * - * 2010 Mike Murphy - * - */ -namespace EMU7800.Core -{ - public enum CartType - { - None, - A2K, // Atari 2kb cart - TV8K, // Tigervision 8kb bankswitched cart - A4K, // Atari 4kb cart - PB8K, // Parker Brothers 8kb bankswitched cart - MN16K, // M-Network 16kb bankswitched cart - A16K, // Atari 16kb bankswitched cart - A16KR, // Atari 16kb bankswitched cart w/128 bytes RAM - A8K, // Atari 8KB bankswitched cart - A8KR, // Atari 8KB bankswitched cart w/128 bytes RAM - A32K, // Atari 32KB bankswitched cart - A32KR, // Atari 32KB bankswitched cart w/128 bytes RAM - CBS12K, // CBS' RAM Plus bankswitched cart w/256 bytes RAM - DC8K, // Special Activision cart (Robot Tank and Decathlon) - DPC, // Pitfall II DPC cart - M32N12K, // 32N1 Multicart: 32x2KB - A7808, // Atari7800 non-bankswitched 8KB cart - A7816, // Atari7800 non-bankswitched 16KB cart - A7832, // Atari7800 non-bankswitched 32KB cart - A7832P, // Atari7800 non-bankswitched 32KB cart w/Pokey - A7848, // Atari7800 non-bankswitched 48KB cart - A78SG, // Atari7800 SuperGame cart - A78SGP, // Atari7800 SuperGame cart w/Pokey - A78SGR, // Atari7800 SuperGame cart w/RAM - A78S9, // Atari7800 SuperGame cart, nine banks - A78S4, // Atari7800 SuperGame cart, four banks - A78S4R, // Atari7800 SuperGame cart, four banks, w/RAM - A78AB, // F18 Hornet cart (Absolute) - A78AC, // Double dragon cart (Activision) - }; -} From 4744077036186ae49a77cd5cdbce055b862efe2a Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:33:04 -0400 Subject: [PATCH 37/82] Delete ConsoleSwitch.cs --- EMU7800/Core/ConsoleSwitch.cs | 11 ----------- 1 file changed, 11 deletions(-) delete mode 100644 EMU7800/Core/ConsoleSwitch.cs diff --git a/EMU7800/Core/ConsoleSwitch.cs b/EMU7800/Core/ConsoleSwitch.cs deleted file mode 100644 index 7a07ba7eb52..00000000000 --- a/EMU7800/Core/ConsoleSwitch.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace EMU7800.Core -{ - internal enum ConsoleSwitch - { - GameReset, - GameSelect, - GameBW, - LeftDifficultyA, - RightDifficultyA, - } -} \ No newline at end of file From f6bcd2454289d2b1f90ed8e77a9d2adfdd1652f2 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:33:13 -0400 Subject: [PATCH 38/82] Delete Controller.cs --- EMU7800/Core/Controller.cs | 14 -------------- 1 file changed, 14 deletions(-) delete mode 100644 EMU7800/Core/Controller.cs diff --git a/EMU7800/Core/Controller.cs b/EMU7800/Core/Controller.cs deleted file mode 100644 index bc21cbcbd61..00000000000 --- a/EMU7800/Core/Controller.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace EMU7800.Core -{ - public enum Controller - { - None, - Joystick, - Paddles, - Keypad, - Driving, - BoosterGrip, - ProLineJoystick, - Lightgun, - } -} \ No newline at end of file From 0147849535acfcdad71e8dafa9d3b7bca290e5a1 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:33:21 -0400 Subject: [PATCH 39/82] Delete ControllerAction.cs --- EMU7800/Core/ControllerAction.cs | 17 ----------------- 1 file changed, 17 deletions(-) delete mode 100644 EMU7800/Core/ControllerAction.cs diff --git a/EMU7800/Core/ControllerAction.cs b/EMU7800/Core/ControllerAction.cs deleted file mode 100644 index bad0cc82eea..00000000000 --- a/EMU7800/Core/ControllerAction.cs +++ /dev/null @@ -1,17 +0,0 @@ -namespace EMU7800.Core -{ - public enum ControllerAction - { - Up, - Down, - Left, - Right, - Trigger, // Interpretation: 7800 RFire; 2600 Fire, BoosterGrip top - Trigger2, // Interpretation: 7800 LFire, BoosterGrip trigger - Keypad1, Keypad2, Keypad3, - Keypad4, Keypad5, Keypad6, - Keypad7, Keypad8, Keypad9, - KeypadA, Keypad0, KeypadP, - Driving0, Driving1, Driving2, Driving3, - } -} \ No newline at end of file From ae44c8f30ee35e90d285f4c935068e096411f7fa Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:33:34 -0400 Subject: [PATCH 40/82] Delete DeserializationContext.cs --- EMU7800/Core/DeserializationContext.cs | 247 ------------------------- 1 file changed, 247 deletions(-) delete mode 100644 EMU7800/Core/DeserializationContext.cs diff --git a/EMU7800/Core/DeserializationContext.cs b/EMU7800/Core/DeserializationContext.cs deleted file mode 100644 index 9a6fe644134..00000000000 --- a/EMU7800/Core/DeserializationContext.cs +++ /dev/null @@ -1,247 +0,0 @@ -using System; -using System.IO; -using System.Linq; - -namespace EMU7800.Core -{ - /// - /// A context for deserializing objects. - /// - public class DeserializationContext - { - #region Fields - - readonly BinaryReader _binaryReader; - - #endregion - - public bool ReadBoolean() - { - return _binaryReader.ReadBoolean(); - } - - public byte ReadByte() - { - return _binaryReader.ReadByte(); - } - - public ushort ReadUInt16() - { - return _binaryReader.ReadUInt16(); - } - - public int ReadInt32() - { - return _binaryReader.ReadInt32(); - } - - public uint ReadUInt32() - { - return _binaryReader.ReadUInt32(); - } - - public long ReadInt64() - { - return _binaryReader.ReadInt64(); - } - - public ulong ReadUInt64() - { - return _binaryReader.ReadUInt64(); - } - - public double ReadDouble() - { - return _binaryReader.ReadDouble(); - } - - /* - public BufferElement ReadBufferElement() - { - var be = new BufferElement(); - for (var i = 0; i < BufferElement.SIZE; i++) - be[i] = ReadByte(); - return be; - } - */ - - public byte[] ReadBytes() - { - var count = _binaryReader.ReadInt32(); - if (count <= 0) - return new byte[0]; - if (count > 0x40000) - throw new Emu7800SerializationException("Byte array length too large."); - return _binaryReader.ReadBytes(count); - } - - public byte[] ReadExpectedBytes(params int[] expectedSizes) - { - var count = _binaryReader.ReadInt32(); - if (!expectedSizes.Any(t => t == count)) - throw new Emu7800SerializationException("Byte array length incorrect."); - return _binaryReader.ReadBytes(count); - } - - public byte[] ReadOptionalBytes(params int[] expectedSizes) - { - var hasBytes = _binaryReader.ReadBoolean(); - return (hasBytes) ? ReadExpectedBytes(expectedSizes) : null; - } - - public ushort[] ReadUnsignedShorts(params int[] expectedSizes) - { - var bytes = ReadExpectedBytes(expectedSizes.Select(t => t << 1).ToArray()); - var ushorts = new ushort[bytes.Length >> 1]; - Buffer.BlockCopy(bytes, 0, ushorts, 0, bytes.Length); - return ushorts; - } - - public int[] ReadIntegers(params int[] expectedSizes) - { - var bytes = ReadExpectedBytes(expectedSizes.Select(t => t << 2).ToArray()); - var integers = new int[bytes.Length >> 2]; - Buffer.BlockCopy(bytes, 0, integers, 0, bytes.Length); - return integers; - } - - public uint[] ReadUnsignedIntegers(params int[] expectedSizes) - { - var bytes = ReadExpectedBytes(expectedSizes.Select(t => t << 2).ToArray()); - var uints = new uint[bytes.Length >> 2]; - Buffer.BlockCopy(bytes, 0, uints, 0, bytes.Length); - return uints; - } - - public bool[] ReadBooleans(params int[] expectedSizes) - { - var bytes = ReadExpectedBytes(expectedSizes); - var booleans = new bool[bytes.Length]; - for (var i = 0; i < bytes.Length; i++) - booleans[i] = (bytes[i] != 0); - return booleans; - } - - public int CheckVersion(params int[] validVersions) - { - var magicNumber = _binaryReader.ReadInt32(); - if (magicNumber != 0x78000087) - throw new Emu7800SerializationException("Magic number not found."); - var version = _binaryReader.ReadInt32(); - if (!validVersions.Any(t => t == version)) - throw new Emu7800SerializationException("Invalid version number found."); - return version; - } - - public MachineBase ReadMachine() - { - var typeName = _binaryReader.ReadString(); - if (string.IsNullOrWhiteSpace(typeName)) - throw new Emu7800SerializationException("Invalid type name."); - - var type = Type.GetType(typeName); - if (type == null) - throw new Emu7800SerializationException("Unable to resolve type name: " + typeName); - - return (MachineBase)Activator.CreateInstance(type, new object[] { this }); - } - - public AddressSpace ReadAddressSpace(MachineBase m, int addrSpaceShift, int pageShift) - { - var addressSpace = new AddressSpace(this, m, addrSpaceShift, pageShift); - return addressSpace; - } - - public M6502 ReadM6502(MachineBase m, int runClocksMultiple) - { - var cpu = new M6502(this, m, runClocksMultiple); - return cpu; - } - - public Maria ReadMaria(Machine7800 m, int scanlines) - { - var maria = new Maria(this, m, scanlines); - return maria; - } - - public PIA ReadPIA(MachineBase m) - { - var pia = new PIA(this, m); - return pia; - } - - public TIA ReadTIA(MachineBase m) - { - var tia = new TIA(this, m); - return tia; - } - - public TIASound ReadTIASound(MachineBase m, int cpuClocksPerSample) - { - var tiaSound = new TIASound(this, m, cpuClocksPerSample); - return tiaSound; - } - - public RAM6116 ReadRAM6116() - { - var ram6116 = new RAM6116(this); - return ram6116; - } - - public InputState ReadInputState() - { - var inputState = new InputState(this); - return inputState; - } - - public HSC7800 ReadOptionalHSC7800() - { - var exist = ReadBoolean(); - return exist ? new HSC7800(this) : null; - } - - public Bios7800 ReadOptionalBios7800() - { - var exist = ReadBoolean(); - return exist ? new Bios7800(this) : null; - } - - public PokeySound ReadOptionalPokeySound(MachineBase m) - { - var exist = ReadBoolean(); - return exist ? new PokeySound(this, m) : null; - } - - public Cart ReadCart(MachineBase m) - { - var typeName = _binaryReader.ReadString(); - if (string.IsNullOrWhiteSpace(typeName)) - throw new Emu7800SerializationException("Invalid type name."); - - var type = Type.GetType(typeName); - if (type == null) - throw new Emu7800SerializationException("Unable to resolve type name: " + typeName); - - return (Cart)Activator.CreateInstance(type, new object[] { this, m }); - } - - #region Constructors - - private DeserializationContext() - { - } - - /// - /// Instantiates a new instance of . - /// - /// - internal DeserializationContext(BinaryReader binaryReader) - { - if (binaryReader == null) - throw new ArgumentNullException("binaryReader"); - _binaryReader = binaryReader; - } - - #endregion - } -} From f50945e16e73db30569a35c429db48e64feeb69d Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:33:45 -0400 Subject: [PATCH 41/82] Delete Emu7800Exception.cs --- EMU7800/Core/Emu7800Exception.cs | 19 ------------------- 1 file changed, 19 deletions(-) delete mode 100644 EMU7800/Core/Emu7800Exception.cs diff --git a/EMU7800/Core/Emu7800Exception.cs b/EMU7800/Core/Emu7800Exception.cs deleted file mode 100644 index 18de9a42a49..00000000000 --- a/EMU7800/Core/Emu7800Exception.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System; - -namespace EMU7800.Core -{ - public class Emu7800Exception : Exception - { - internal Emu7800Exception() - { - } - - internal Emu7800Exception(string message) : base(message) - { - } - - internal Emu7800Exception(string message, Exception ex) : base(message, ex) - { - } - } -} From 78a924594d6dc64766bee11e0de3a8ca34ed912f Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:33:53 -0400 Subject: [PATCH 42/82] Delete Emu7800SerializationException.cs --- EMU7800/Core/Emu7800SerializationException.cs | 19 ------------------- 1 file changed, 19 deletions(-) delete mode 100644 EMU7800/Core/Emu7800SerializationException.cs diff --git a/EMU7800/Core/Emu7800SerializationException.cs b/EMU7800/Core/Emu7800SerializationException.cs deleted file mode 100644 index 4f0827d13c2..00000000000 --- a/EMU7800/Core/Emu7800SerializationException.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System; - -namespace EMU7800.Core -{ - public class Emu7800SerializationException : Emu7800Exception - { - private Emu7800SerializationException() - { - } - - internal Emu7800SerializationException(string message) : base(message) - { - } - - internal Emu7800SerializationException(string message, Exception ex) : base(message, ex) - { - } - } -} From 4c730be1d3b5a7a2691d470e29e15e7dae7aa296 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:34:06 -0400 Subject: [PATCH 43/82] Delete FontRenderer.cs --- EMU7800/Core/FontRenderer.cs | 170 ----------------------------------- 1 file changed, 170 deletions(-) delete mode 100644 EMU7800/Core/FontRenderer.cs diff --git a/EMU7800/Core/FontRenderer.cs b/EMU7800/Core/FontRenderer.cs deleted file mode 100644 index 763bc95d69d..00000000000 --- a/EMU7800/Core/FontRenderer.cs +++ /dev/null @@ -1,170 +0,0 @@ -/* - * FontRenderer - * - * A simple font renderer for displaying text during emulation. Font data and - * rendering algorithm courtesy of Bradford W. Mott's Stella source. - * - * Copyright � 2004 Mike Murphy - * - */ - -using System; - -namespace EMU7800.Core -{ - /// - /// A simple font renderer for displaying text during emulation. - /// - public class FontRenderer - { - static readonly uint[] AlphaFontData = - { - 0x699f999, // A - 0xe99e99e, // B - 0x6988896, // C - 0xe99999e, // D - 0xf88e88f, // E - 0xf88e888, // F - 0x698b996, // G - 0x999f999, // H - 0x7222227, // I - 0x72222a4, // J - 0x9accaa9, // K - 0x888888f, // L - 0x9ff9999, // M - 0x9ddbb99, // N - 0x6999996, // O - 0xe99e888, // P - 0x69999b7, // Q - 0xe99ea99, // R - 0x6986196, // S - 0x7222222, // T - 0x9999996, // U - 0x9999966, // V - 0x9999ff9, // W - 0x99fff99, // X - 0x9996244, // Y - 0xf12488f // Z - }; - - static readonly uint[] DigitFontData = - { - 0x69bd996, // 0 - 0x2622227, // 1 - 0x691248f, // 2 - 0x6916196, // 3 - 0xaaaf222, // 4 - 0xf88e11e, // 5 - 0x698e996, // 6 - 0xf112244, // 7 - 0x6996996, // 8 - 0x6997196 // 9 - }; - - /// - /// Draw specified text at specified position using the specified foreground and background colors. - /// - /// - /// - /// - /// - /// - /// - /// text must be non-null. - public void DrawText(FrameBuffer frameBuffer, string text, int xoffset, int yoffset, byte fore, byte back) - { - if (text == null) - throw new ArgumentNullException("text"); - - var textchars = text.ToUpper().ToCharArray(); - - for (var i = 0; i < text.Length + 1; i++) - { - for (var j = 0; j < 9; j++) - { - var pos = (j + yoffset) * frameBuffer.VisiblePitch + i * 5; - for (var k = 0; k < 5; k++) - { - while (pos >= frameBuffer.VideoBufferByteLength) - { - pos -= frameBuffer.VideoBufferByteLength; - } - while (pos < 0) - { - pos += frameBuffer.VideoBufferByteLength; - } - frameBuffer.VideoBuffer[pos++] = back; - } - } - } - - for (var i = 0; i < text.Length; i++) - { - var c = textchars[i]; - uint fdata; - - switch (c) - { - case '/': - case '\\': - fdata = 0x0122448; - break; - case '(': - fdata = 0x2488842; - break; - case ')': - fdata = 0x4211124; - break; - case '.': - fdata = 0x0000066; - break; - case ':': - fdata = 0x0660660; - break; - case '-': - fdata = 0x0007000; - break; - default: - if (c >= 'A' && c <= 'Z') - { - fdata = AlphaFontData[c - 'A']; - } - else if (c >= '0' && c <= '9') - { - fdata = DigitFontData[c - '0']; - } - else - { - fdata = 0; - } - break; - } - - var ypos = 8; - for (var j = 0; j < 32; j++) - { - var xpos = j & 3; - if (xpos == 0) - { - ypos--; - } - - var pos = (ypos + yoffset) * frameBuffer.VisiblePitch + (4 - xpos) + xoffset; - while (pos >= frameBuffer.VideoBufferByteLength) - { - pos -= frameBuffer.VideoBufferByteLength; - } - while (pos < 0) - { - pos += frameBuffer.VideoBufferByteLength; - } - if (((fdata >> j) & 1) != 0) - { - frameBuffer.VideoBuffer[pos] = fore; - } - } - xoffset += 5; - } - } - } -} From 688018d0ed454b45f714c3e5815d4314e485a823 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:34:15 -0400 Subject: [PATCH 44/82] Delete FrameBuffer.cs --- EMU7800/Core/FrameBuffer.cs | 79 ------------------------------------- 1 file changed, 79 deletions(-) delete mode 100644 EMU7800/Core/FrameBuffer.cs diff --git a/EMU7800/Core/FrameBuffer.cs b/EMU7800/Core/FrameBuffer.cs deleted file mode 100644 index 073b2e9d823..00000000000 --- a/EMU7800/Core/FrameBuffer.cs +++ /dev/null @@ -1,79 +0,0 @@ -using System; - -namespace EMU7800.Core -{ - public class FrameBuffer - { - /// - /// Number of visible pixels on a single horizontal line. - /// - public int VisiblePitch { get; private set; } - - /// - /// Number of s that represent VisiblePitch. - /// - //public int VideoBufferElementVisiblePitch { get; private set; } - - /// - /// Number of visible scan lines. - /// - public int Scanlines { get; private set; } - - /// - /// The number of bytes contained by VideoBuffer. - /// - public int VideoBufferByteLength { get; private set; } - - /// - /// The number of s contained by VideoBuffer - /// - //public int VideoBufferElementLength { get; private set; } - - /// - /// The number of bytes contained by SoundBuffer. - /// - public int SoundBufferByteLength { get; private set; } - - /// - /// The number of s contained by SoundBuffer - /// - //public int SoundBufferElementLength { get; private set; } - - /// - /// The buffer containing computed pixel data. - /// - public byte[] VideoBuffer { get; private set; } - - /// - /// The buffer containing computed PCM audio data. - /// - public byte[] SoundBuffer { get; private set; } - - #region Constructors - - private FrameBuffer() - { - } - - internal FrameBuffer(int visiblePitch, int scanLines) - { - if (visiblePitch < 0) - throw new ArgumentException("visiblePitch must be non-negative."); - if (scanLines < 0) - throw new ArgumentException("scanLines must be non-negative."); - - VisiblePitch = visiblePitch; - //VideoBufferElementVisiblePitch = VisiblePitch >> BufferElement.SHIFT; - Scanlines = scanLines; - VideoBufferByteLength = VisiblePitch * Scanlines; - //VideoBufferElementLength = VideoBufferElementVisiblePitch * Scanlines; - SoundBufferByteLength = Scanlines << 1; - //SoundBufferElementLength = SoundBufferByteLength >> BufferElement.SHIFT; - - VideoBuffer = new byte[VideoBufferByteLength + 64]; - SoundBuffer = new byte[SoundBufferByteLength + 64]; - } - - #endregion - } -} From 8e4bf6a2be92666fc6e00eb680268cf3771b31c2 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:34:23 -0400 Subject: [PATCH 45/82] Delete HSC7800.cs --- EMU7800/Core/HSC7800.cs | 85 ----------------------------------------- 1 file changed, 85 deletions(-) delete mode 100644 EMU7800/Core/HSC7800.cs diff --git a/EMU7800/Core/HSC7800.cs b/EMU7800/Core/HSC7800.cs deleted file mode 100644 index 4186e660972..00000000000 --- a/EMU7800/Core/HSC7800.cs +++ /dev/null @@ -1,85 +0,0 @@ -/* - * HSC7800.cs - * - * The 7800 High Score cartridge--courtesy of Matthias . - * - */ -using System; - -namespace EMU7800.Core -{ - public sealed class HSC7800 : IDevice - { - readonly byte[] ROM; - readonly ushort Mask; - - public static ushort Size { get; private set; } - - #region IDevice Members - - public void Reset() - { - } - - public byte this[ushort addr] - { - get { return ROM[addr & Mask]; } - set { } - } - - #endregion - - public RAM6116 SRAM { get; private set; } - - #region Constructors - - private HSC7800() - { - } - - public HSC7800(byte[] hscRom, byte[] ram) - { - if (hscRom == null) - throw new ArgumentNullException("hscRom"); - if (ram == null) - throw new ArgumentNullException("ram"); - if (hscRom.Length != 4096) - throw new ArgumentException("ROM size not 4096", "hscRom"); - - ROM = hscRom; - SRAM = new RAM6116(ram); - - Size = Mask = (ushort)ROM.Length; - Mask--; - } - - #endregion - - #region Serialization Members - - public HSC7800(DeserializationContext input) - { - if (input == null) - throw new ArgumentNullException("input"); - - input.CheckVersion(1); - ROM = input.ReadExpectedBytes(4096); - SRAM = input.ReadRAM6116(); - - Size = Mask = (ushort)ROM.Length; - Mask--; - } - - public void GetObjectData(SerializationContext output) - { - if (output == null) - throw new ArgumentNullException("output"); - - output.WriteVersion(1); - output.Write(ROM); - output.Write(SRAM); - } - - #endregion - } -} \ No newline at end of file From 431f8cece8fb99d054b129124291945a964d3ed2 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:34:32 -0400 Subject: [PATCH 46/82] Delete IDevice.cs --- EMU7800/Core/IDevice.cs | 16 ---------------- 1 file changed, 16 deletions(-) delete mode 100644 EMU7800/Core/IDevice.cs diff --git a/EMU7800/Core/IDevice.cs b/EMU7800/Core/IDevice.cs deleted file mode 100644 index 38a8b839807..00000000000 --- a/EMU7800/Core/IDevice.cs +++ /dev/null @@ -1,16 +0,0 @@ -/* - * IDevice.cs - * - * Defines interface for devices accessable via the AddressSpace class. - * - * Copyright � 2003, 2011 Mike Murphy - * - */ -namespace EMU7800.Core -{ - public interface IDevice - { - void Reset(); - byte this[ushort addr] { get; set; } - } -} From 17a94fc7364c72fe62a2a8cf8b1c9dd1fce75101 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:34:40 -0400 Subject: [PATCH 47/82] Delete ILogger.cs --- EMU7800/Core/ILogger.cs | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 EMU7800/Core/ILogger.cs diff --git a/EMU7800/Core/ILogger.cs b/EMU7800/Core/ILogger.cs deleted file mode 100644 index 919c3b0b255..00000000000 --- a/EMU7800/Core/ILogger.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace EMU7800.Core -{ - public interface ILogger - { - void WriteLine(string format, params object[] args); - void WriteLine(object value); - void Write(string format, params object[] args); - void Write(object value); - } -} From fb665254b23a50937f5066464198a4a5d4631909 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:34:52 -0400 Subject: [PATCH 48/82] Delete InputState.cs --- EMU7800/Core/InputState.cs | 398 ------------------------------------- 1 file changed, 398 deletions(-) delete mode 100644 EMU7800/Core/InputState.cs diff --git a/EMU7800/Core/InputState.cs b/EMU7800/Core/InputState.cs deleted file mode 100644 index 95950a9eb9a..00000000000 --- a/EMU7800/Core/InputState.cs +++ /dev/null @@ -1,398 +0,0 @@ -/* - * InputState.cs - * - * Class containing the input state of the console and its controllers, - * mapping emulator input devices to external input. - * - * Copyright � 2003-2010 Mike Murphy - * - */ -using System; - -namespace EMU7800.Core -{ - public class InputState - { - #region Fields - - const int - PaddleOhmMin = 100000, - PaddleOhmMax = 800000; - - const int - LeftControllerJackIndex = 0, - RightControllerJackIndex = 1, - ConsoleSwitchIndex = 2, - ControllerActionStateIndex = 3, - OhmsIndex = ControllerActionStateIndex + 4, - LightgunPositionIndex = ControllerActionStateIndex + 4, - InputStateSize = ControllerActionStateIndex + 8 + 1; - - // For driving controllers - readonly byte[] _rotGrayCodes = new byte[] { 0x0f, 0x0d, 0x0c, 0x0e }; - readonly int[] _rotState = new int[2]; - - readonly int[] _nextInputState = new int[InputStateSize]; - readonly int[] _inputState = new int[InputStateSize]; - - bool _lagged = true; - - #endregion - - #region Public Members - - /// - /// Enables the incoming input state buffer to be populated prior to the start of the frame. - /// Useful for input playback senarios. - /// - /// Return value is ignored. - public Func InputAdvancing { get; set; } - - /// - /// Enables access to the input state buffer. - /// Useful for input recording senarios. - /// - /// Return value is ignored. - public Func InputAdvanced { get; set; } - - public void CaptureInputState() - { - if (InputAdvancing != null) - InputAdvancing(_nextInputState); - Buffer.BlockCopy(_nextInputState, 0, _inputState, 0, InputStateSize * sizeof(int)); - if (InputAdvanced != null) - InputAdvanced(_inputState); - _lagged = true; - } - - public Controller LeftControllerJack - { - get { return (Controller)_nextInputState[LeftControllerJackIndex]; } - set { _nextInputState[LeftControllerJackIndex] = (int)value; } - } - - public Controller RightControllerJack - { - get { return (Controller)_nextInputState[RightControllerJackIndex]; } - set { _nextInputState[RightControllerJackIndex] = (int)value; } - } - - public bool IsGameBWConsoleSwitchSet - { - get { return (_nextInputState[ConsoleSwitchIndex] & (1 << (int) ConsoleSwitch.GameBW)) != 0; } - } - - public bool IsLeftDifficultyAConsoleSwitchSet - { - get { return (_nextInputState[ConsoleSwitchIndex] & (1 << (int)ConsoleSwitch.LeftDifficultyA)) != 0; } - } - - public bool IsRightDifficultyAConsoleSwitchSet - { - get { return (_nextInputState[ConsoleSwitchIndex] & (1 << (int)ConsoleSwitch.RightDifficultyA)) != 0; } - } - - public bool Lagged - { - get { return _lagged; } - } - - public Action InputPollCallback { get; set; } - - public void RaiseInput(int playerNo, MachineInput input, bool down) - { - if (InputPollCallback != null) - { - InputPollCallback(); - } - switch (input) - { - case MachineInput.Fire: - SetControllerActionState(playerNo, ControllerAction.Trigger, down); - break; - case MachineInput.Fire2: - SetControllerActionState(playerNo, ControllerAction.Trigger2, down); - break; - case MachineInput.Left: - SetControllerActionState(playerNo, ControllerAction.Left, down); - if (down) SetControllerActionState(playerNo, ControllerAction.Right, false); - break; - case MachineInput.Up: - SetControllerActionState(playerNo, ControllerAction.Up, down); - if (down) SetControllerActionState(playerNo, ControllerAction.Down, false); - break; - case MachineInput.Right: - SetControllerActionState(playerNo, ControllerAction.Right, down); - if (down) SetControllerActionState(playerNo, ControllerAction.Left, false); - break; - case MachineInput.Down: - SetControllerActionState(playerNo, ControllerAction.Down, down); - if (down) SetControllerActionState(playerNo, ControllerAction.Up, false); - break; - case MachineInput.NumPad7: - SetControllerActionState(playerNo, ControllerAction.Keypad7, down); - break; - case MachineInput.NumPad8: - SetControllerActionState(playerNo, ControllerAction.Keypad8, down); - break; - case MachineInput.NumPad9: - SetControllerActionState(playerNo, ControllerAction.Keypad9, down); - break; - case MachineInput.NumPad4: - SetControllerActionState(playerNo, ControllerAction.Keypad4, down); - break; - case MachineInput.NumPad5: - SetControllerActionState(playerNo, ControllerAction.Keypad5, down); - break; - case MachineInput.NumPad6: - SetControllerActionState(playerNo, ControllerAction.Keypad6, down); - break; - case MachineInput.NumPad1: - SetControllerActionState(playerNo, ControllerAction.Keypad1, down); - break; - case MachineInput.NumPad2: - SetControllerActionState(playerNo, ControllerAction.Keypad2, down); - break; - case MachineInput.NumPad3: - SetControllerActionState(playerNo, ControllerAction.Keypad3, down); - break; - case MachineInput.NumPadMult: - SetControllerActionState(playerNo, ControllerAction.KeypadA, down); - break; - case MachineInput.NumPad0: - SetControllerActionState(playerNo, ControllerAction.Keypad0, down); - break; - case MachineInput.NumPadHash: - SetControllerActionState(playerNo, ControllerAction.KeypadP, down); - break; - case MachineInput.Driving0: - SetControllerActionState(playerNo, ControllerAction.Driving0, true); - SetControllerActionState(playerNo, ControllerAction.Driving1, false); - SetControllerActionState(playerNo, ControllerAction.Driving2, false); - SetControllerActionState(playerNo, ControllerAction.Driving3, false); - break; - case MachineInput.Driving1: - SetControllerActionState(playerNo, ControllerAction.Driving0, false); - SetControllerActionState(playerNo, ControllerAction.Driving1, true); - SetControllerActionState(playerNo, ControllerAction.Driving2, false); - SetControllerActionState(playerNo, ControllerAction.Driving3, false); - break; - case MachineInput.Driving2: - SetControllerActionState(playerNo, ControllerAction.Driving0, false); - SetControllerActionState(playerNo, ControllerAction.Driving1, false); - SetControllerActionState(playerNo, ControllerAction.Driving2, true); - SetControllerActionState(playerNo, ControllerAction.Driving3, false); - break; - case MachineInput.Driving3: - SetControllerActionState(playerNo, ControllerAction.Driving0, false); - SetControllerActionState(playerNo, ControllerAction.Driving1, false); - SetControllerActionState(playerNo, ControllerAction.Driving2, false); - SetControllerActionState(playerNo, ControllerAction.Driving3, true); - break; - case MachineInput.Reset: - SetConsoleSwitchState(ConsoleSwitch.GameReset, down); - break; - case MachineInput.Select: - SetConsoleSwitchState(ConsoleSwitch.GameSelect, down); - break; - case MachineInput.Color: - if (down) ToggleConsoleSwitchState(ConsoleSwitch.GameBW); - break; - case MachineInput.LeftDifficulty: - if (down) ToggleConsoleSwitchState(ConsoleSwitch.LeftDifficultyA); - break; - case MachineInput.RightDifficulty: - if (down) ToggleConsoleSwitchState(ConsoleSwitch.RightDifficultyA); - break; - } - } - - public void RaisePaddleInput(int playerNo, int valMax, int val) - { - var ohms = PaddleOhmMax - (PaddleOhmMax - PaddleOhmMin) / valMax * val; - _nextInputState[OhmsIndex + (playerNo & 3)] = ohms; - } - - public void RaiseLightgunPos(int playerNo, int scanline, int hpos) - { - var i = LightgunPositionIndex + ((playerNo & 1) << 1); - _nextInputState[i++] = scanline; - _nextInputState[i] = hpos; - } - - public void ClearAllInput() - { - _nextInputState[ConsoleSwitchIndex] = 0; - ClearLeftJackInput(); - ClearRightJackInput(); - } - - // For Bizhawk - // Emu7800's client does not call Clear input every frame so console switches behave like switches - // Bizhawk needs to call a clear input function every frame, if we put switches in there, they would behave like buttons - public void ClearControllerInput() - { - ClearLeftJackInput(); - ClearRightJackInput(); - } - - public void ClearInputByPlayer(int playerNo) - { - _nextInputState[OhmsIndex + (playerNo & 3)] = 0; - _nextInputState[ControllerActionStateIndex + (playerNo & 3)] = 0; - _nextInputState[LightgunPositionIndex + ((playerNo & 1) << 1)] = _nextInputState[LightgunPositionIndex + ((playerNo & 1) << 1) + 1] = 0; - } - - public void ClearLeftJackInput() - { - _nextInputState[OhmsIndex] = _nextInputState[OhmsIndex + 1] = 0; - _nextInputState[ControllerActionStateIndex] = 0; - switch (LeftControllerJack) - { - case Controller.Paddles: - _nextInputState[ControllerActionStateIndex] = _nextInputState[ControllerActionStateIndex + 1] = 0; - break; - default: - _nextInputState[ControllerActionStateIndex] = 0; - break; - } - _nextInputState[LightgunPositionIndex] = _nextInputState[LightgunPositionIndex + 1] = 0; - } - - public void ClearRightJackInput() - { - _nextInputState[OhmsIndex + 2] = _nextInputState[OhmsIndex + 3] = 0; - switch (RightControllerJack) - { - case Controller.Paddles: - _nextInputState[ControllerActionStateIndex + 2] = _nextInputState[ControllerActionStateIndex + 3] = 0; - break; - default: - _nextInputState[ControllerActionStateIndex + 1] = 0; - break; - } - _nextInputState[LightgunPositionIndex + 2] = _nextInputState[LightgunPositionIndex + 3] = 0; - } - - #endregion - - #region Serialization Members - - public InputState() - { - } - - public InputState(DeserializationContext input) - { - if (input == null) - throw new ArgumentNullException("input"); - - input.CheckVersion(2); - _rotState = input.ReadIntegers(2); - _nextInputState = input.ReadIntegers(InputStateSize); - _inputState = input.ReadIntegers(InputStateSize); - _lagged = input.ReadBoolean(); - } - - public void GetObjectData(SerializationContext output) - { - if (output == null) - throw new ArgumentNullException("output"); - - output.WriteVersion(2); - output.Write(_rotState); - output.Write(_nextInputState); - output.Write(_inputState); - output.Write(_lagged); - } - - #endregion - - #region Internal Members - - internal bool SampleCapturedConsoleSwitchState(ConsoleSwitch consoleSwitch) - { - _lagged = false; - return (_inputState[ConsoleSwitchIndex] & (1 << (int)consoleSwitch)) != 0; - } - - internal bool SampleCapturedControllerActionState(int playerno, ControllerAction action) - { - _lagged = false; - return (_inputState[ControllerActionStateIndex + (playerno & 3)] & (1 << (int)action)) != 0; - } - - internal int SampleCapturedOhmState(int playerNo) - { - _lagged = false; - return _inputState[OhmsIndex + (playerNo & 3)]; - } - - internal void SampleCapturedLightGunPosition(int playerNo, out int scanline, out int hpos) - { - _lagged = false; - var i = LightgunPositionIndex + ((playerNo & 1) << 1); - scanline = _inputState[i++]; - hpos = _inputState[i]; - } - - internal byte SampleCapturedDrivingState(int playerNo) - { - _lagged = false; - if (SampleCapturedControllerActionState(playerNo, ControllerAction.Driving0)) - _rotState[playerNo] = 0; - else if (SampleCapturedControllerActionState(playerNo, ControllerAction.Driving1)) - _rotState[playerNo] = 1; - else if (SampleCapturedControllerActionState(playerNo, ControllerAction.Driving2)) - _rotState[playerNo] = 2; - else if (SampleCapturedControllerActionState(playerNo, ControllerAction.Driving3)) - _rotState[playerNo] = 3; - return _rotGrayCodes[_rotState[playerNo]]; - } - - #endregion - - #region Object Overrides - - public override string ToString() - { - return GetType().Name; - } - - #endregion - - #region Helpers - - void SetControllerActionState(int playerNo, ControllerAction action, bool value) - { - if (value) - { - _nextInputState[ControllerActionStateIndex + (playerNo & 3)] |= (1 << (int)action); - } - else - { - _nextInputState[ControllerActionStateIndex + (playerNo & 3)] &= ~(1 << (int)action); - } - } - - void SetConsoleSwitchState(ConsoleSwitch consoleSwitch, bool value) - { - if (value) - { - _nextInputState[ConsoleSwitchIndex] |= (byte)(1 << (byte)consoleSwitch); - } - else - { - _nextInputState[ConsoleSwitchIndex] &= (byte)~(1 << (byte)consoleSwitch); - } - } - - void ToggleConsoleSwitchState(ConsoleSwitch consoleSwitch) - { - var consoleSwitchState = (_nextInputState[ConsoleSwitchIndex] & (1 << (int) consoleSwitch)) != 0; - SetConsoleSwitchState(consoleSwitch, !consoleSwitchState); - } - - #endregion - } -} \ No newline at end of file From 40f4e4696c9a52f7acdf6dbb1508b861bde4529b Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:35:06 -0400 Subject: [PATCH 49/82] Delete LICENSE.TXT --- EMU7800/Core/LICENSE.TXT | 339 --------------------------------------- 1 file changed, 339 deletions(-) delete mode 100644 EMU7800/Core/LICENSE.TXT diff --git a/EMU7800/Core/LICENSE.TXT b/EMU7800/Core/LICENSE.TXT deleted file mode 100644 index d5354cb7346..00000000000 --- a/EMU7800/Core/LICENSE.TXT +++ /dev/null @@ -1,339 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - Appendix: How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) 19yy - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program 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 General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) 19yy name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. From c7bb53978c1760d0bce5045e73615bba84a14683 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:35:16 -0400 Subject: [PATCH 50/82] Delete M6502.cs --- EMU7800/Core/M6502.cs | 1099 ----------------------------------------- 1 file changed, 1099 deletions(-) delete mode 100644 EMU7800/Core/M6502.cs diff --git a/EMU7800/Core/M6502.cs b/EMU7800/Core/M6502.cs deleted file mode 100644 index a8fb28db38a..00000000000 --- a/EMU7800/Core/M6502.cs +++ /dev/null @@ -1,1099 +0,0 @@ -/* - * M6502.cs - * - * CPU emulator for the MOS Technology 6502 microprocessor. - * - * Copyright � 2003-2005 Mike Murphy - * - */ -using System; - -namespace EMU7800.Core -{ - public sealed class M6502 - { - delegate void OpcodeHandler(); - - OpcodeHandler[] Opcodes; - - const ushort - // non-maskable interrupt vector - NMI_VEC = 0xfffa, - // reset vector - RST_VEC = 0xfffc, - // interrupt request vector - IRQ_VEC = 0xfffe; - - readonly MachineBase M; - AddressSpace Mem { get { return M.Mem; } } - - public ulong Clock { get; set; } - public int RunClocks { get; set; } - public int RunClocksMultiple { get; private set; } - - public bool EmulatorPreemptRequest { get; set; } - public bool Jammed { get; set; } - public bool IRQInterruptRequest { get; set; } - public bool NMIInterruptRequest { get; set; } - - // 16-bit register - // program counter - public ushort PC { get; set; } - - // 8-bit registers - // accumulator - public byte A { get; set; } - // x index register - public byte X { get; set; } - // y index register - public byte Y { get; set; } - // stack pointer - public byte S { get; set; } - // processor status - public byte P { get; set; } - - public void Reset() - { - Jammed = false; - - // clear the stack - S = 0xff; - - fI = fZ = true; - - // reset the program counter - PC = WORD(Mem[RST_VEC], Mem[RST_VEC + 1]); - - clk(6); - - Log("{0} (PC:${1:x4}) reset", this, PC); - } - - public override String ToString() - { - return "M6502 CPU"; - } - - public void Execute() - { - EmulatorPreemptRequest = false; - - while (RunClocks > 0 && !EmulatorPreemptRequest && !Jammed) - { - if (NMIInterruptRequest) - { - InterruptNMI(); - NMIInterruptRequest = false; - } - else if (IRQInterruptRequest) - { - InterruptIRQ(); - IRQInterruptRequest = false; - } - else - { - Opcodes[Mem[PC++]](); - } - } - } - - private M6502() - { - InstallOpcodes(); - - Clock = 0; - RunClocks = 0; - RunClocksMultiple = 1; - - // initialize processor status, bit 5 is always set - P = 1 << 5; - } - - public M6502(MachineBase m, int runClocksMultiple) : this() - { - if (m == null) - throw new ArgumentNullException("m"); - if (runClocksMultiple <= 0) - throw new ArgumentException("runClocksMultiple must be greater than zero."); - - M = m; - RunClocksMultiple = runClocksMultiple; - } - - static byte MSB(ushort u16) - { - return (byte)(u16 >> 8); - } - - static byte LSB(ushort u16) - { - return (byte)u16; - } - - static ushort WORD(byte lsb, byte msb) - { - return (ushort)(lsb | msb << 8); - } - - // Processor Status Flag Bits - // - - // Flag bit setters and getters - void fset(byte flag, bool value) - { - P = (byte)(value ? P | flag : P & ~flag); - } - - bool fget(byte flag) - { - return (P & flag) != 0; - } - - // Carry: set if the add produced a carry, if the subtraction - // produced a borrow. Also used in shift instructions. - public bool fC - { - get { return fget(1 << 0); } - private set { fset(1 << 0, value); } - } - - // Zero: set if the result of the last operation was zero - public bool fZ - { - get { return fget(1 << 1); } - private set { fset(1 << 1, value); } - } - - // Irq Disable: set if maskable interrupts are disabled - public bool fI - { - get { return fget(1 << 2); } - private set { fset(1 << 2, value); } - } - - // Decimal Mode: set if decimal mode active - public bool fD - { - get { return fget(1 << 3); } - private set { fset(1 << 3, value); } - } - - // Brk: set if an interrupt caused by a BRK instruction, - // reset if caused by an internal interrupt - public bool fB - { - get { return fget(1 << 4); } - private set { fset(1 << 4, value); } - } - - // Overflow: set if the addition of two-like-signed numbers - // or the subtraction of two unlike-signed numbers - // produces a result greater than +127 or less than -128. - public bool fV - { - get { return fget(1 << 6); } - private set { fset(1 << 6, value); } - } - - // Negative: set if bit 7 of the accumulator is set - public bool fN - { - get { return fget(1 << 7); } - private set { fset(1 << 7, value); } - } - - void set_fNZ(byte u8) - { - fN = (u8 & 0x80) != 0; - fZ = (u8 & 0xff) == 0; - } - - byte pull() - { - S++; - return Mem[(ushort)(0x0100 + S)]; - } - - void push(byte data) - { - Mem[(ushort)(0x0100 + S)] = data; - S--; - } - - void clk(int ticks) - { - Clock += (ulong)ticks; - RunClocks -= (ticks*RunClocksMultiple); - } - - void InterruptNMI() - { - push(MSB(PC)); - push(LSB(PC)); - fB = false; - push(P); - fI = true; - PC = WORD(Mem[NMI_VEC], Mem[NMI_VEC + 1]); - clk(7); - } - - void InterruptIRQ() - { - if (IRQInterruptRequest && !fI) - { - push(MSB(PC)); - push(LSB(PC)); - fB = false; - push(P); - fI = true; - PC = WORD(Mem[IRQ_VEC], Mem[IRQ_VEC + 1]); - } - clk(7); - } - - void br(bool cond, ushort ea) - { - if (cond) - { - clk( (MSB(PC) == MSB(ea)) ? 1 : 2 ); - PC = ea; - } - } - - - // Relative: Bxx $aa (branch instructions only) - ushort aREL() - { - var bo = (sbyte)Mem[PC]; - PC++; - return (ushort)(PC + bo); - } - - // Zero Page: $aa - ushort aZPG() - { - return WORD(Mem[PC++], 0x00); - } - - // Zero Page Indexed,X: $aa,X - ushort aZPX() - { - return WORD((byte)(Mem[PC++] + X), 0x00); - } - - // Zero Page Indexed,Y: $aa,Y - ushort aZPY() - { - return WORD((byte)(Mem[PC++] + Y), 0x00); - } - - // Absolute: $aaaa - ushort aABS() - { - var lsb = Mem[PC++]; - var msb = Mem[PC++]; - return WORD(lsb, msb); - } - - // Absolute Indexed,X: $aaaa,X - ushort aABX(int eclk) - { - var ea = aABS(); - if (LSB(ea) + X > 0xff) - { - clk(eclk); - } - return (ushort)(ea + X); - } - - // Absolute Indexed,Y: $aaaa,Y - ushort aABY(int eclk) - { - var ea = aABS(); - if (LSB(ea) + Y > 0xff) - { - clk(eclk); - } - return (ushort)(ea + Y); - } - - // Indexed Indirect: ($aa,X) - ushort aIDX() - { - var zpa = (byte)(Mem[PC++] + X); - var lsb = Mem[zpa++]; - var msb = Mem[zpa]; - return WORD(lsb, msb); - } - - // Indirect Indexed: ($aa),Y - ushort aIDY(int eclk) - { - var zpa = Mem[PC++]; - var lsb = Mem[zpa++]; - var msb = Mem[zpa]; - if (lsb + Y > 0xff) - { - clk(eclk); - } - return (ushort)(WORD(lsb, msb) + Y); - } - - // Indirect Absolute: ($aaaa) (only used by JMP) - ushort aIND() - { - var ea = aABS(); - var lsb = Mem[ea]; - ea = WORD((byte)(LSB(ea) + 1), MSB(ea)); // NMOS 6502/7 quirk: does not fetch across page boundaries - var msb = Mem[ea]; - return WORD(lsb, msb); - } - - // aACC = Accumulator - // aIMM = Immediate - // aIMP = Implied - - // ADC: Add with carry - void iADC(byte mem) - { - var c = fC ? 1 : 0; - var sum = A + mem + c; - fV = (~(A ^ mem) & (A ^ (sum & 0xff)) & 0x80) != 0; - if (fD) - { - // NMOS 6502/7 quirk: The N, V, and Z flags reflect the binary result, not the BCD result - var lo = (A & 0xf) + (mem & 0xf) + c; - var hi = (A >> 4) + (mem >> 4); - if (lo > 9) - { - lo += 6; - hi++; - } - if (hi > 9) - { - hi += 6; - } - A = (byte)((lo & 0xf) | (hi << 4)); - fC = (hi & 0x10) != 0; - } - else - { - A = (byte)sum; - fC = (sum & 0x100) != 0; - } - set_fNZ((byte)sum); - } - - // AND: Logical and - void iAND(byte mem) - { - A &= mem; - set_fNZ(A); - } - - // ASL: Arithmetic shift left: C <- [7][6][5][4][3][2][1][0] <- 0 - byte iASL(byte mem) - { - fC = (mem & 0x80) != 0; - mem <<= 1; - set_fNZ(mem); - return mem; - } - - // BIT: Bit test - void iBIT(byte mem) - { - fN = (mem & 0x80) != 0; - fV = (mem & 0x40) != 0; - fZ = (mem & A) == 0; - } - - // BRK Force Break (cause software interrupt) - void iBRK() - { - PC++; - fB = true; - push(MSB(PC)); - push(LSB(PC)); - push(P); - fI = true; - var lsb = Mem[IRQ_VEC]; - var msb = Mem[IRQ_VEC+1]; - PC = WORD(lsb, msb); - } - - // CLC: Clear carry flag - void iCLC() - { - fC = false; - } - - // CLD: Clear decimal mode - void iCLD() - { - fD = false; - } - - // CLI: Clear interrupt disable */ - void iCLI() - { - fI = false; - } - - // CLV: Clear overflow flag - void iCLV() - { - fV = false; - } - - // CMP: Compare accumulator - void iCMP(byte mem) - { - fC = A >= mem; - set_fNZ((byte)(A - mem)); - } - - // CPX: Compare index X - void iCPX(byte mem) - { - fC = X >= mem; - set_fNZ((byte)(X - mem)); - } - - // CPY: Compare index Y - void iCPY(byte mem) - { - fC = Y >= mem; - set_fNZ((byte)(Y - mem)); - } - - // DEC: Decrement memory - byte iDEC(byte mem) - { - mem--; - set_fNZ(mem); - return mem; - } - - // DEX: Decrement index x - void iDEX() - { - X--; - set_fNZ(X); - } - - // DEY: Decrement index y - void iDEY() - { - Y--; - set_fNZ(Y); - } - - // EOR: Logical exclusive or - void iEOR(byte mem) - { - A ^= mem; - set_fNZ(A); - } - - // INC: Increment memory - byte iINC(byte mem) - { - mem++; - set_fNZ(mem); - return mem; - } - - // INX: Increment index x - void iINX() - { - X++; - set_fNZ(X); - } - - // INY: Increment index y - void iINY() - { - Y++; - set_fNZ(Y); - } - - // JMP Jump to address - void iJMP(ushort ea) - { - PC = ea; - } - - // JSR Jump to subroutine - void iJSR(ushort ea) - { - PC--; // NMOS 6502/7 quirk: iRTS compensates - push(MSB(PC)); - push(LSB(PC)); - PC = ea; - } - - // LDA: Load accumulator - void iLDA(byte mem) - { - A = mem; - set_fNZ(A); - } - - // LDX: Load index X - void iLDX(byte mem) - { - X = mem; - set_fNZ(X); - } - - // LDY: Load index Y - void iLDY(byte mem) - { - Y = mem; - set_fNZ(Y); - } - - // LSR: Logic shift right: 0 -> [7][6][5][4][3][2][1][0] -> C - byte iLSR(byte mem) - { - fC = (mem & 0x01) != 0; - mem >>= 1; - set_fNZ(mem); - return mem; - } - - // NOP: No operation - void iNOP() - { - if (M.NOPRegisterDumping) - { - Log("NOP: {0}", M6502DASM.GetRegisters(this)); - } - } - - // ORA: Logical inclusive or - void iORA(byte mem) - { - A |= mem; - set_fNZ(A); - } - - // PHA: Push accumulator - void iPHA() - { - push(A); - } - - // PHP: Push processor status (flags) - void iPHP() - { - push(P); - } - - // PLA: Pull accumuator - void iPLA() - { - A = pull(); - set_fNZ(A); - } - - // PLP: Pull processor status (flags) - void iPLP() - { - P = pull(); - fB = true; - } - - // ROL: Rotate left: new C <- [7][6][5][4][3][2][1][0] <- C - byte iROL(byte mem) - { - var d0 = (byte)(fC ? 0x01 : 0x00); - - fC = (mem & 0x80) != 0; - mem <<= 1; - mem |= d0; - set_fNZ(mem); - return mem; - } - - // ROR: Rotate right: C -> [7][6][5][4][3][2][1][0] -> new C - byte iROR(byte mem) - { - var d7 = (byte)(fC ? 0x80 : 0x00); - - fC = (mem & 0x01) != 0; - mem >>= 1; - mem |= d7; - set_fNZ(mem); - return mem; - } - - // RTI: Return from interrupt - void iRTI() - { - P = pull(); - var lsb = pull(); - var msb = pull(); - PC = WORD(lsb, msb); - fB = true; - } - - // RTS: Return from subroutine - void iRTS() - { - var lsb = pull(); - var msb = pull(); - PC = WORD(lsb, msb); - PC++; // NMOS 6502/7 quirk: iJSR compensates - } - - // SBC: Subtract with carry (borrow) - void iSBC(byte mem) - { - var c = fC ? 0 : 1; - var sum = A - mem - c; - fV = ((A ^ mem) & (A ^ (sum & 0xff)) & 0x80) != 0; - if (fD) - { - // NMOS 6502/7 quirk: The N, V, and Z flags reflect the binary result, not the BCD result - var lo = (A & 0xf) - (mem & 0xf) - c; - var hi = (A >> 4) - (mem >> 4); - if ((lo & 0x10) != 0) - { - lo -= 6; - hi--; - } - if ((hi & 0x10) != 0) - { - hi -= 6; - } - A = (byte)((lo & 0xf) | (hi << 4)); - } - else - { - A = (byte)sum; - } - fC = (sum & 0x100) == 0; - set_fNZ((byte)sum); - } - - // SEC: Set carry flag - void iSEC() - { - fC = true; - } - - // SED: Set decimal mode - void iSED() - { - fD = true; - } - - // SEI: Set interrupt disable - void iSEI() - { - fI = true; - } - - // STA: Store accumulator - byte iSTA() - { - return A; - } - - // STX: Store index X - byte iSTX() - { - return X; - } - - // STY: Store index Y - byte iSTY() - { - return Y; - } - - // TAX: Transfer accumlator to index X - void iTAX() - { - X = A; - set_fNZ(X); - } - - // TAY: Transfer accumlator to index Y - void iTAY() - { - Y = A; - set_fNZ(Y); - } - - // TSX: Transfer stack to index X - void iTSX() - { - X = S; - set_fNZ(X); - } - - // TXA: Transfer index X to accumlator - void iTXA() - { - A = X; - set_fNZ(A); - } - - // TXS: Transfer index X to stack - void iTXS() - { - S = X; - // No flags set..! Weird, huh? - } - - // TYA: Transfer index Y to accumulator - void iTYA() - { - A = Y; - set_fNZ(A); - } - - // Illegal opcodes - - // KIL: Jam the processor - void iKIL() - { - Jammed = true; - Log("{0}: Processor jammed!", this); - } - - // LAX: Load accumulator and index x - void iLAX(byte mem) - { - A = X = mem; - set_fNZ(A); - } - - // ISB: Increment and subtract with carry - void iISB(byte mem) - { - mem++; - iSBC(mem); - } - - // RLA: Rotate left and logical and accumulator - // new C <- [7][6][5][4][3][2][1][0] <- C - void iRLA(byte mem) - { - var d0 = (byte)(fC ? 0x01 : 0x00); - - fC = (mem & 0x80) != 0; - mem <<= 1; - mem |= d0; - - A &= mem; - set_fNZ(A); - } - - // SAX: logical and accumulator with index X and store - byte iSAX() - { - return (byte)(A & X); - } - - void InstallOpcodes() - { - Opcodes = new OpcodeHandler[0x100]; - ushort EA; - - Opcodes[0x65] = delegate { EA = aZPG(); clk(3); iADC(Mem[EA]); }; - Opcodes[0x75] = delegate { EA = aZPX(); clk(4); iADC(Mem[EA]); }; - Opcodes[0x61] = delegate { EA = aIDX(); clk(6); iADC(Mem[EA]); }; - Opcodes[0x71] = delegate { EA = aIDY(1); clk(5); iADC(Mem[EA]); }; - Opcodes[0x79] = delegate { EA = aABY(1); clk(4); iADC(Mem[EA]); }; - Opcodes[0x6d] = delegate { EA = aABS(); clk(4); iADC(Mem[EA]); }; - Opcodes[0x7d] = delegate { EA = aABX(1); clk(4); iADC(Mem[EA]); }; - Opcodes[0x69] = delegate { /*aIMM*/ clk(2); iADC(Mem[PC++]); }; - - Opcodes[0x25] = delegate { EA = aZPG(); clk(3); iAND(Mem[EA]); }; // may be 2 clk - Opcodes[0x35] = delegate { EA = aZPX(); clk(4); iAND(Mem[EA]); }; // may be 3 clk - Opcodes[0x21] = delegate { EA = aIDX(); clk(6); iAND(Mem[EA]); }; - Opcodes[0x31] = delegate { EA = aIDY(1); clk(5); iAND(Mem[EA]); }; - Opcodes[0x2d] = delegate { EA = aABS(); clk(4); iAND(Mem[EA]); }; - Opcodes[0x39] = delegate { EA = aABY(1); clk(4); iAND(Mem[EA]); }; - Opcodes[0x3d] = delegate { EA = aABX(1); clk(4); iAND(Mem[EA]); }; - Opcodes[0x29] = delegate { /*aIMM*/ clk(2); iAND(Mem[PC++]); }; - - Opcodes[0x06] = delegate { EA = aZPG(); clk(5); Mem[EA] = iASL(Mem[EA]); }; - Opcodes[0x16] = delegate { EA = aZPX(); clk(6); Mem[EA] = iASL(Mem[EA]); }; - Opcodes[0x0e] = delegate { EA = aABS(); clk(6); Mem[EA] = iASL(Mem[EA]); }; - Opcodes[0x1e] = delegate { EA = aABX(0); clk(7); Mem[EA] = iASL(Mem[EA]); }; - Opcodes[0x0a] = delegate { /*aACC*/ clk(2); A = iASL(A); }; - - Opcodes[0x24] = delegate { EA = aZPG(); clk(3); iBIT(Mem[EA]); }; - Opcodes[0x2c] = delegate { EA = aABS(); clk(4); iBIT(Mem[EA]); }; - - Opcodes[0x10] = delegate { EA = aREL(); clk(2); br(!fN, EA); /* BPL */ }; - Opcodes[0x30] = delegate { EA = aREL(); clk(2); br( fN, EA); /* BMI */ }; - Opcodes[0x50] = delegate { EA = aREL(); clk(2); br(!fV, EA); /* BVC */ }; - Opcodes[0x70] = delegate { EA = aREL(); clk(2); br( fV, EA); /* BVS */ }; - Opcodes[0x90] = delegate { EA = aREL(); clk(2); br(!fC, EA); /* BCC */ }; - Opcodes[0xb0] = delegate { EA = aREL(); clk(2); br( fC, EA); /* BCS */ }; - Opcodes[0xd0] = delegate { EA = aREL(); clk(2); br(!fZ, EA); /* BNE */ }; - Opcodes[0xf0] = delegate { EA = aREL(); clk(2); br( fZ, EA); /* BEQ */ }; - - Opcodes[0x00] = delegate { /*aIMP*/ clk(7); iBRK(); }; - - Opcodes[0x18] = delegate { /*aIMP*/ clk(2); iCLC(); }; - - Opcodes[0xd8] = delegate { /*aIMP*/ clk(2); iCLD(); }; - - Opcodes[0x58] = delegate { /*aIMP*/ clk(2); iCLI(); }; - - Opcodes[0xb8] = delegate { /*aIMP*/ clk(2); iCLV(); }; - - Opcodes[0xc5] = delegate { EA = aZPG(); clk(3); iCMP(Mem[EA]); }; - Opcodes[0xd5] = delegate { EA = aZPX(); clk(4); iCMP(Mem[EA]); }; - Opcodes[0xc1] = delegate { EA = aIDX(); clk(6); iCMP(Mem[EA]); }; - Opcodes[0xd1] = delegate { EA = aIDY(1); clk(5); iCMP(Mem[EA]); }; - Opcodes[0xcd] = delegate { EA = aABS(); clk(4); iCMP(Mem[EA]); }; - Opcodes[0xdd] = delegate { EA = aABX(1); clk(4); iCMP(Mem[EA]); }; - Opcodes[0xd9] = delegate { EA = aABY(1); clk(4); iCMP(Mem[EA]); }; - Opcodes[0xc9] = delegate { /*aIMM*/ clk(2); iCMP(Mem[PC++]); }; - - Opcodes[0xe4] = delegate { EA = aZPG(); clk(3); iCPX(Mem[EA]); }; - Opcodes[0xec] = delegate { EA = aABS(); clk(4); iCPX(Mem[EA]); }; - Opcodes[0xe0] = delegate { /*aIMM*/ clk(2); iCPX(Mem[PC++]); }; - - Opcodes[0xc4] = delegate { EA = aZPG(); clk(3); iCPY(Mem[EA]); }; - Opcodes[0xcc] = delegate { EA = aABS(); clk(4); iCPY(Mem[EA]); }; - Opcodes[0xc0] = delegate { /*aIMM*/ clk(2); iCPY(Mem[PC++]); }; - - Opcodes[0xc6] = delegate { EA = aZPG(); clk(5); Mem[EA] = iDEC(Mem[EA]); }; - Opcodes[0xd6] = delegate { EA = aZPX(); clk(6); Mem[EA] = iDEC(Mem[EA]); }; - Opcodes[0xce] = delegate { EA = aABS(); clk(6); Mem[EA] = iDEC(Mem[EA]); }; - Opcodes[0xde] = delegate { EA = aABX(0); clk(7); Mem[EA] = iDEC(Mem[EA]); }; - - Opcodes[0xca] = delegate { /*aIMP*/ clk(2); iDEX(); }; - - Opcodes[0x88] = delegate { /*aIMP*/ clk(2); iDEY(); }; - - Opcodes[0x45] = delegate { EA = aZPG(); clk(3); iEOR(Mem[EA]); }; - Opcodes[0x55] = delegate { EA = aZPX(); clk(4); iEOR(Mem[EA]); }; - Opcodes[0x41] = delegate { EA = aIDX(); clk(6); iEOR(Mem[EA]); }; - Opcodes[0x51] = delegate { EA = aIDY(1); clk(5); iEOR(Mem[EA]); }; - Opcodes[0x4d] = delegate { EA = aABS(); clk(4); iEOR(Mem[EA]); }; - Opcodes[0x5d] = delegate { EA = aABX(1); clk(4); iEOR(Mem[EA]); }; - Opcodes[0x59] = delegate { EA = aABY(1); clk(4); iEOR(Mem[EA]); }; - Opcodes[0x49] = delegate { /*aIMM*/ clk(2); iEOR(Mem[PC++]); }; - - Opcodes[0xe6] = delegate { EA = aZPG(); clk(5); Mem[EA] = iINC(Mem[EA]); }; - Opcodes[0xf6] = delegate { EA = aZPX(); clk(6); Mem[EA] = iINC(Mem[EA]); }; - Opcodes[0xee] = delegate { EA = aABS(); clk(6); Mem[EA] = iINC(Mem[EA]); }; - Opcodes[0xfe] = delegate { EA = aABX(0); clk(7); Mem[EA] = iINC(Mem[EA]); }; - - Opcodes[0xe8] = delegate { /*aIMP*/ clk(2); iINX(); }; - - Opcodes[0xc8] = delegate { /*aIMP*/ clk(2); iINY(); }; - - Opcodes[0xa5] = delegate { EA = aZPG(); clk(3); iLDA(Mem[EA]); }; - Opcodes[0xb5] = delegate { EA = aZPX(); clk(4); iLDA(Mem[EA]); }; - Opcodes[0xa1] = delegate { EA = aIDX(); clk(6); iLDA(Mem[EA]); }; - Opcodes[0xb1] = delegate { EA = aIDY(1); clk(5); iLDA(Mem[EA]); }; - Opcodes[0xad] = delegate { EA = aABS(); clk(4); iLDA(Mem[EA]); }; - Opcodes[0xbd] = delegate { EA = aABX(1); clk(4); iLDA(Mem[EA]); }; - Opcodes[0xb9] = delegate { EA = aABY(1); clk(4); iLDA(Mem[EA]); }; - Opcodes[0xa9] = delegate { /*aIMM*/ clk(2); iLDA(Mem[PC++]); }; - - Opcodes[0xa6] = delegate { EA = aZPG(); clk(3); iLDX(Mem[EA]); }; - Opcodes[0xb6] = delegate { EA = aZPY(); clk(4); iLDX(Mem[EA]); }; - Opcodes[0xae] = delegate { EA = aABS(); clk(4); iLDX(Mem[EA]); }; - Opcodes[0xbe] = delegate { EA = aABY(1); clk(4); iLDX(Mem[EA]); }; - Opcodes[0xa2] = delegate { /*aIMM*/ clk(2); iLDX(Mem[PC++]); }; - - Opcodes[0xa4] = delegate { EA = aZPG(); clk(3); iLDY(Mem[EA]); }; - Opcodes[0xb4] = delegate { EA = aZPX(); clk(4); iLDY(Mem[EA]); }; - Opcodes[0xac] = delegate { EA = aABS(); clk(4); iLDY(Mem[EA]); }; - Opcodes[0xbc] = delegate { EA = aABX(1); clk(4); iLDY(Mem[EA]); }; - Opcodes[0xa0] = delegate { /*aIMM*/ clk(2); iLDY(Mem[PC++]); }; - - Opcodes[0x46] = delegate { EA = aZPG(); clk(5); Mem[EA] = iLSR(Mem[EA]); }; - Opcodes[0x56] = delegate { EA = aZPX(); clk(6); Mem[EA] = iLSR(Mem[EA]); }; - Opcodes[0x4e] = delegate { EA = aABS(); clk(6); Mem[EA] = iLSR(Mem[EA]); }; - Opcodes[0x5e] = delegate { EA = aABX(0); clk(7); Mem[EA] = iLSR(Mem[EA]); }; - Opcodes[0x4a] = delegate { /*aACC*/ clk(2); A = iLSR(A); }; - - Opcodes[0x4c] = delegate { EA = aABS(); clk(3); iJMP(EA); }; - Opcodes[0x6c] = delegate { EA = aIND(); clk(5); iJMP(EA); }; - - Opcodes[0x20] = delegate { EA = aABS(); clk(6); iJSR(EA); }; - - Opcodes[0xea] = delegate { /*aIMP*/ clk(2); iNOP(); }; - - Opcodes[0x05] = delegate { EA = aZPG(); clk(3); iORA(Mem[EA]); }; // may be 2 clk - Opcodes[0x15] = delegate { EA = aZPX(); clk(4); iORA(Mem[EA]); }; // may be 3 clk - Opcodes[0x01] = delegate { EA = aIDX(); clk(6); iORA(Mem[EA]); }; - Opcodes[0x11] = delegate { EA = aIDY(1); clk(5); iORA(Mem[EA]); }; - Opcodes[0x0d] = delegate { EA = aABS(); clk(4); iORA(Mem[EA]); }; - Opcodes[0x1d] = delegate { EA = aABX(1); clk(4); iORA(Mem[EA]); }; - Opcodes[0x19] = delegate { EA = aABY(1); clk(4); iORA(Mem[EA]); }; - Opcodes[0x09] = delegate { /*aIMM*/ clk(2); iORA(Mem[PC++]); }; - - Opcodes[0x48] = delegate { /*aIMP*/ clk(3); iPHA(); }; - - Opcodes[0x68] = delegate { /*aIMP*/ clk(4); iPLA(); }; - - Opcodes[0x08] = delegate { /*aIMP*/ clk(3); iPHP(); }; - - Opcodes[0x28] = delegate { /*aIMP*/ clk(4); iPLP(); }; - - Opcodes[0x26] = delegate { EA = aZPG(); clk(5); Mem[EA] = iROL(Mem[EA]); }; - Opcodes[0x36] = delegate { EA = aZPX(); clk(6); Mem[EA] = iROL(Mem[EA]); }; - Opcodes[0x2e] = delegate { EA = aABS(); clk(6); Mem[EA] = iROL(Mem[EA]); }; - Opcodes[0x3e] = delegate { EA = aABX(0); clk(7); Mem[EA] = iROL(Mem[EA]); }; - Opcodes[0x2a] = delegate { /*aACC*/ clk(2); A = iROL(A); }; - - Opcodes[0x66] = delegate { EA = aZPG(); clk(5); Mem[EA] = iROR(Mem[EA]); }; - Opcodes[0x76] = delegate { EA = aZPX(); clk(6); Mem[EA] = iROR(Mem[EA]); }; - Opcodes[0x6e] = delegate { EA = aABS(); clk(6); Mem[EA] = iROR(Mem[EA]); }; - Opcodes[0x7e] = delegate { EA = aABX(0); clk(7); Mem[EA] = iROR(Mem[EA]); }; - Opcodes[0x6a] = delegate { /*aACC*/ clk(2); A = iROR(A); }; - - Opcodes[0x40] = delegate { /*aIMP*/ clk(6); iRTI(); }; - - Opcodes[0x60] = delegate { /*aIMP*/ clk(6); iRTS(); }; - - Opcodes[0xe5] = delegate { EA = aZPG(); clk(3); iSBC(Mem[EA]); }; - Opcodes[0xf5] = delegate { EA = aZPX(); clk(4); iSBC(Mem[EA]); }; - Opcodes[0xe1] = delegate { EA = aIDX(); clk(6); iSBC(Mem[EA]); }; - Opcodes[0xf1] = delegate { EA = aIDY(1); clk(5); iSBC(Mem[EA]); }; - Opcodes[0xed] = delegate { EA = aABS(); clk(4); iSBC(Mem[EA]); }; - Opcodes[0xfd] = delegate { EA = aABX(1); clk(4); iSBC(Mem[EA]); }; - Opcodes[0xf9] = delegate { EA = aABY(1); clk(4); iSBC(Mem[EA]); }; - Opcodes[0xe9] = delegate { /*aIMM*/ clk(2); iSBC(Mem[PC++]); }; - - Opcodes[0x38] = delegate { /*aIMP*/ clk(2); iSEC(); }; - - Opcodes[0xf8] = delegate { /*aIMP*/ clk(2); iSED(); }; - - Opcodes[0x78] = delegate { /*aIMP*/ clk(2); iSEI(); }; - - Opcodes[0x85] = delegate { EA = aZPG(); clk(3); Mem[EA] = iSTA(); }; - Opcodes[0x95] = delegate { EA = aZPX(); clk(4); Mem[EA] = iSTA(); }; - Opcodes[0x81] = delegate { EA = aIDX(); clk(6); Mem[EA] = iSTA(); }; - Opcodes[0x91] = delegate { EA = aIDY(0); clk(6); Mem[EA] = iSTA(); }; - Opcodes[0x8d] = delegate { EA = aABS(); clk(4); Mem[EA] = iSTA(); }; - Opcodes[0x99] = delegate { EA = aABY(0); clk(5); Mem[EA] = iSTA(); }; - Opcodes[0x9d] = delegate { EA = aABX(0); clk(5); Mem[EA] = iSTA(); }; - - Opcodes[0x86] = delegate { EA = aZPG(); clk(3); Mem[EA] = iSTX(); }; - Opcodes[0x96] = delegate { EA = aZPY(); clk(4); Mem[EA] = iSTX(); }; - Opcodes[0x8e] = delegate { EA = aABS(); clk(4); Mem[EA] = iSTX(); }; - - Opcodes[0x84] = delegate { EA = aZPG(); clk(3); Mem[EA] = iSTY(); }; - Opcodes[0x94] = delegate { EA = aZPX(); clk(4); Mem[EA] = iSTY(); }; - Opcodes[0x8c] = delegate { EA = aABS(); clk(4); Mem[EA] = iSTY(); }; - - Opcodes[0xaa] = delegate { /*aIMP*/ clk(2); iTAX(); }; - - Opcodes[0xa8] = delegate { /*aIMP*/ clk(2); iTAY(); }; - - Opcodes[0xba] = delegate { /*aIMP*/ clk(2); iTSX(); }; - - Opcodes[0x8a] = delegate { /*aIMP*/ clk(2); iTXA(); }; - - Opcodes[0x9a] = delegate { /*aIMP*/ clk(2); iTXS(); }; - - Opcodes[0x98] = delegate { /*aIMP*/ clk(2); iTYA(); }; - - // Illegal opcodes - foreach (int opCode in new ushort[] { 0x02, 0x12, 0x22, 0x32, 0x42, 0x52, 0x62, 0x72, 0x92, 0xb2, 0xd2, 0xf2 }) - { - Opcodes[opCode] = delegate { clk(2); iKIL(); }; - } - Opcodes[0x3f] = delegate { EA = aABX(0); clk(4); iRLA(Mem[EA]); }; - Opcodes[0xa7] = delegate { EA = aZPX(); clk(3); iLAX(Mem[EA]); }; - Opcodes[0xb3] = delegate { EA = aIDY(0); clk(6); iLAX(Mem[EA]); }; - Opcodes[0xef] = delegate { EA = aABS(); clk(6); iISB(Mem[EA]); }; - Opcodes[0x0c] = delegate { EA = aABS(); clk(2); iNOP(); }; - foreach (int opCode in new ushort[] { 0x1c, 0x3c, 0x5c, 0x7c, 0x9c, 0xdc, 0xfc }) - { - Opcodes[opCode] = delegate { EA = aABX(0); clk(2); iNOP(); }; - } - Opcodes[0x83] = delegate { EA = aIDX(); clk(6); Mem[EA] = iSAX(); }; - Opcodes[0x87] = delegate { EA = aZPG(); clk(3); Mem[EA] = iSAX(); }; - Opcodes[0x8f] = delegate { EA = aABS(); clk(4); Mem[EA] = iSAX(); }; - Opcodes[0x97] = delegate { EA = aZPY(); clk(4); Mem[EA] = iSAX(); }; - Opcodes[0xa3] = delegate { EA = aIDX(); clk(6); iLAX(Mem[EA]); }; - Opcodes[0xb7] = delegate { EA = aZPY(); clk(4); iLAX(Mem[EA]); }; - Opcodes[0xaf] = delegate { EA = aABS(); clk(5); iLAX(Mem[EA]); }; - Opcodes[0xbf] = delegate { EA = aABY(0); clk(6); iLAX(Mem[EA]); }; - Opcodes[0xff] = delegate { EA = aABX(0); clk(7); iISB(Mem[EA]); }; - - OpcodeHandler opNULL = () => Log("{0}:**UNKNOWN OPCODE: ${1:x2} at ${2:x4}\n", this, Mem[(ushort)(PC - 1)], PC - 1); - - for (var i=0; i < Opcodes.Length; i++) - { - if (Opcodes[i] == null) - { - Opcodes[i] = opNULL; - } - } - } - - #region Serialization Members - - public M6502(DeserializationContext input, MachineBase m, int runClocksMultiple) : this(m, runClocksMultiple) - { - if (input == null) - throw new ArgumentNullException("input"); - - input.CheckVersion(1); - Clock = input.ReadUInt64(); - RunClocks = input.ReadInt32(); - RunClocksMultiple = input.ReadInt32(); - EmulatorPreemptRequest = input.ReadBoolean(); - Jammed = input.ReadBoolean(); - IRQInterruptRequest = input.ReadBoolean(); - NMIInterruptRequest = input.ReadBoolean(); - PC = input.ReadUInt16(); - A = input.ReadByte(); - X = input.ReadByte(); - Y = input.ReadByte(); - S = input.ReadByte(); - P = input.ReadByte(); - } - - public void GetObjectData(SerializationContext output) - { - if (output == null) - throw new ArgumentNullException("output"); - - output.WriteVersion(1); - output.Write(Clock); - output.Write(RunClocks); - output.Write(RunClocksMultiple); - output.Write(EmulatorPreemptRequest); - output.Write(Jammed); - output.Write(IRQInterruptRequest); - output.Write(NMIInterruptRequest); - output.Write(PC); - output.Write(A); - output.Write(X); - output.Write(Y); - output.Write(S); - output.Write(P); - } - - #endregion - - #region Helpers - - void Log(string format, params object[] args) - { - if (M == null || M.Logger == null) - return; - M.Logger.WriteLine(format, args); - } - - #endregion - } -} \ No newline at end of file From c020855830f93fada71e6e54d030fad004329398 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:35:26 -0400 Subject: [PATCH 51/82] Delete M6502DASM.cs --- EMU7800/Core/M6502DASM.cs | 242 -------------------------------------- 1 file changed, 242 deletions(-) delete mode 100644 EMU7800/Core/M6502DASM.cs diff --git a/EMU7800/Core/M6502DASM.cs b/EMU7800/Core/M6502DASM.cs deleted file mode 100644 index 4f36060edc9..00000000000 --- a/EMU7800/Core/M6502DASM.cs +++ /dev/null @@ -1,242 +0,0 @@ -/* - * M6502DASM.cs - * - * Provides disassembly services. - * - * Copyright � 2003, 2004 Mike Murphy - * - */ -using System; -using System.Text; - -namespace EMU7800.Core -{ - public static class M6502DASM - { - // Instruction Mnemonics - enum m : uint - { - ADC = 1, AND, ASL, - BIT, BCC, BCS, BEQ, BMI, BNE, BPL, BRK, BVC, BVS, - CLC, CLD, CLI, CLV, CMP, CPX, CPY, - DEC, DEX, DEY, - EOR, - INC, INX, INY, - JMP, JSR, - LDA, LDX, LDY, LSR, - NOP, - ORA, - PLA, PLP, PHA, PHP, - ROL, ROR, RTI, RTS, - SEC, SEI, STA, SBC, SED, STX, STY, - TAX, TAY, TSX, TXA, TXS, TYA, - - // Illegal/undefined opcodes - isb, - kil, - lax, - rla, - sax, - top - } - - // Addressing Modes - enum a : uint - { - REL, // Relative: $aa (branch instructions only) - ZPG, // Zero Page: $aa - ZPX, // Zero Page Indexed X: $aa,X - ZPY, // Zero Page Indexed Y: $aa,Y - ABS, // Absolute: $aaaa - ABX, // Absolute Indexed X: $aaaa,X - ABY, // Absolute Indexed Y: $aaaa,Y - IDX, // Indexed Indirect: ($aa,X) - IDY, // Indirect Indexed: ($aa),Y - IND, // Indirect Absolute: ($aaaa) (JMP only) - IMM, // Immediate: #aa - IMP, // Implied - ACC // Accumulator - } - - static readonly m[] MnemonicMatrix = { -// 0 1 2 3 4 5 6 7 8 9 A B C D E F -/*0*/ m.BRK, m.ORA, m.kil, 0, 0, m.ORA, m.ASL, 0, m.PHP, m.ORA, m.ASL, 0, m.top, m.ORA, m.ASL, 0,/*0*/ -/*1*/ m.BPL, m.ORA, m.kil, 0, 0, m.ORA, m.ASL, 0, m.CLC, m.ORA, 0, 0, m.top, m.ORA, m.ASL, 0,/*1*/ -/*2*/ m.JSR, m.AND, m.kil, 0, m.BIT, m.AND, m.ROL, 0, m.PLP, m.AND, m.ROL, 0, m.BIT, m.AND, m.ROL, 0,/*2*/ -/*3*/ m.BMI, m.AND, m.kil, 0, 0, m.AND, m.ROL, 0, m.SEC, m.AND, 0, 0, m.top, m.AND, m.ROL, m.rla,/*3*/ -/*4*/ m.RTI, m.EOR, m.kil, 0, 0, m.EOR, m.LSR, 0, m.PHA, m.EOR, m.LSR, 0, m.JMP, m.EOR, m.LSR, 0,/*4*/ -/*5*/ m.BVC, m.EOR, m.kil, 0, 0, m.EOR, m.LSR, 0, m.CLI, m.EOR, 0, 0, m.top, m.EOR, m.LSR, 0,/*5*/ -/*6*/ m.RTS, m.ADC, m.kil, 0, 0, m.ADC, m.ROR, 0, m.PLA, m.ADC, m.ROR, 0, m.JMP, m.ADC, m.ROR, 0,/*6*/ -/*7*/ m.BVS, m.ADC, m.kil, 0, 0, m.ADC, m.ROR, 0, m.SEI, m.ADC, 0, 0, m.top, m.ADC, m.ROR, 0,/*7*/ -/*8*/ 0, m.STA, 0, m.sax, m.STY, m.STA, m.STX, m.sax, m.DEY, 0, m.TXA, 0, m.STY, m.STA, m.STX, m.sax,/*8*/ -/*9*/ m.BCC, m.STA, m.kil, 0, m.STY, m.STA, m.STX, m.sax, m.TYA, m.STA, m.TXS, 0, m.top, m.STA, 0, 0,/*9*/ -/*A*/ m.LDY, m.LDA, m.LDX, m.lax, m.LDY, m.LDA, m.LDX, m.lax, m.TAY, m.LDA, m.TAX, 0, m.LDY, m.LDA, m.LDX, m.lax,/*A*/ -/*B*/ m.BCS, m.LDA, m.kil, m.lax, m.LDY, m.LDA, m.LDX, m.lax, m.CLV, m.LDA, m.TSX, 0, m.LDY, m.LDA, m.LDX, m.lax,/*B*/ -/*C*/ m.CPY, m.CMP, 0, 0, m.CPY, m.CMP, m.DEC, 0, m.INY, m.CMP, m.DEX, 0, m.CPY, m.CMP, m.DEC, 0,/*C*/ -/*D*/ m.BNE, m.CMP, m.kil, 0, 0, m.CMP, m.DEC, 0, m.CLD, m.CMP, 0, 0, m.top, m.CMP, m.DEC, 0,/*D*/ -/*E*/ m.CPX, m.SBC, 0, 0, m.CPX, m.SBC, m.INC, 0, m.INX, m.SBC, m.NOP, 0, m.CPX, m.SBC, m.INC, m.isb,/*E*/ -/*F*/ m.BEQ, m.SBC, m.kil, 0, 0, m.SBC, m.INC, 0, m.SED, m.SBC, 0, 0, m.top, m.SBC, m.INC, m.isb /*F*/ -}; - - static readonly a[] AddressingModeMatrix = { -// 0 1 2 3 4 5 6 7 8 9 A B C D E F -/*0*/ a.IMP, a.IDX, a.IMP, 0, 0, a.ZPG, a.ZPG, 0, a.IMP, a.IMM, a.ACC, 0, a.ABS, a.ABS, a.ABS, 0,/*0*/ -/*1*/ a.REL, a.IDY, a.IMP, 0, 0, a.ZPG, a.ZPG, 0, a.IMP, a.ABY, 0, 0, a.ABS, a.ABX, a.ABX, 0,/*1*/ -/*2*/ a.ABS, a.IDX, a.IMP, 0, a.ZPG, a.ZPG, a.ZPG, 0, a.IMP, a.IMM, a.ACC, 0, a.ABS, a.ABS, a.ABS, 0,/*2*/ -/*3*/ a.REL, a.IDY, a.IMP, 0, 0, a.ZPG, a.ZPG, 0, a.IMP, a.ABY, 0, 0, a.ABS, a.ABX, a.ABX, a.ABX,/*3*/ -/*4*/ a.IMP, a.IDY, a.IMP, 0, 0, a.ZPG, a.ZPG, 0, a.IMP, a.IMM, a.ACC, 0, a.ABS, a.ABS, a.ABS, 0,/*4*/ -/*5*/ a.REL, a.IDY, a.IMP, 0, 0, a.ZPG, a.ZPG, 0, a.IMP, a.ABY, 0, 0, a.ABS, a.ABX, a.ABX, 0,/*5*/ -/*6*/ a.IMP, a.IDX, a.IMP, 0, 0, a.ZPG, a.ZPG, 0, a.IMP, a.IMM, a.ACC, 0, a.IND, a.ABS, a.ABS, 0,/*6*/ -/*7*/ a.REL, a.IDY, a.IMP, 0, 0, a.ZPX, a.ZPX, 0, a.IMP, a.ABY, 0, 0, a.ABS, a.ABX, a.ABX, 0,/*7*/ -/*8*/ 0, a.IDY, 0, a.IDX, a.ZPG, a.ZPG, a.ZPG, a.ZPG, a.IMP, 0, a.IMP, 0, a.ABS, a.ABS, a.ABS, a.ABS,/*8*/ -/*9*/ a.REL, a.IDY, a.IMP, 0, a.ZPX, a.ZPX, a.ZPY, a.ZPY, a.IMP, a.ABY, a.IMP, 0, a.ABS, a.ABX, 0, 0,/*9*/ -/*A*/ a.IMM, a.IND, a.IMM, a.IDX, a.ZPG, a.ZPG, a.ZPG, a.ZPX, a.IMP, a.IMM, a.IMP, 0, a.ABS, a.ABS, a.ABS, a.ABS,/*A*/ -/*B*/ a.REL, a.IDY, a.IMP, a.IDY, a.ZPX, a.ZPX, a.ZPY, a.ZPY, a.IMP, a.ABY, a.IMP, 0, a.ABX, a.ABX, a.ABY, a.ABY,/*B*/ -/*C*/ a.IMM, a.IDX, 0, 0, a.ZPG, a.ZPG, a.ZPG, 0, a.IMP, a.IMM, a.IMP, 0, a.ABS, a.ABS, a.ABS, 0,/*C*/ -/*D*/ a.REL, a.IDY, a.IMP, 0, 0, a.ZPX, a.ZPX, 0, a.IMP, a.ABY, 0, 0, a.ABS, a.ABX, a.ABX, 0,/*D*/ -/*E*/ a.IMM, a.IDX, 0, 0, a.ZPG, a.ZPG, a.ZPG, 0, a.IMP, a.IMM, a.IMP, 0, a.ABS, a.ABS, a.ABS, a.ABS,/*E*/ -/*F*/ a.REL, a.IDY, a.IMP, 0, 0, a.ZPX, a.ZPX, 0, a.IMP, a.ABY, 0, 0, a.ABS, a.ABX, a.ABX, a.ABX /*F*/ -}; - - public static string GetRegisters(M6502 cpu) - { - var dSB = new StringBuilder(); - dSB.Append(String.Format( - "PC:{0:x4} A:{1:x2} X:{2:x2} Y:{3:x2} S:{4:x2} P:", - cpu.PC, cpu.A, cpu.X, cpu.Y, cpu.S)); - - const string flags = "nv0bdizcNV1BDIZC"; - - for (var i = 0; i < 8; i++) - { - dSB.Append(((cpu.P & (1 << (7 - i))) == 0) ? flags[i] : flags[i + 8]); - } - return dSB.ToString(); - } - - public static string Disassemble(AddressSpace addrSpace, ushort atAddr, ushort untilAddr) - { - var dSB = new StringBuilder(); - var dPC = atAddr; - while (atAddr < untilAddr) - { - dSB.AppendFormat("{0:x4}: ", dPC); - var len = GetInstructionLength(addrSpace, dPC); - for (var i = 0; i < 3; i++) - { - if (i < len) - { - dSB.AppendFormat("{0:x2} ", addrSpace[atAddr++]); - } - else - { - dSB.Append(" "); - } - } - dSB.AppendFormat("{0,-15}{1}", RenderOpCode(addrSpace, dPC), Environment.NewLine); - dPC += (ushort)len; - } - if (dSB.Length > 0) - { - dSB.Length--; // Trim trailing newline - } - return dSB.ToString(); - } - - public static string MemDump(AddressSpace addrSpace, ushort atAddr, ushort untilAddr) - { - var dSB = new StringBuilder(); - var len = untilAddr - atAddr; - while (len-- >= 0) - { - dSB.AppendFormat("{0:x4}: ", atAddr); - for (var i = 0; i < 8; i++) - { - dSB.AppendFormat("{0:x2} ", addrSpace[atAddr++]); - if (i == 3) - { - dSB.Append(" "); - } - } - dSB.Append("\n"); - } - if (dSB.Length > 0) - { - dSB.Length--; // Trim trailing newline - } - return dSB.ToString(); - } - - public static string RenderOpCode(AddressSpace addrSpace, ushort PC) - { - var num_operands = GetInstructionLength(addrSpace, PC) - 1; - var PC1 = (ushort)(PC + 1); - string addrmodeStr; - - switch (AddressingModeMatrix[addrSpace[PC]]) - { - case a.REL: - addrmodeStr = String.Format("${0:x4}", (ushort)(PC + (sbyte)(addrSpace[PC1]) + 2)); - break; - case a.ZPG: - case a.ABS: - addrmodeStr = RenderEA(addrSpace, PC1, num_operands); - break; - case a.ZPX: - case a.ABX: - addrmodeStr = RenderEA(addrSpace, PC1, num_operands) + ",X"; - break; - case a.ZPY: - case a.ABY: - addrmodeStr = RenderEA(addrSpace, PC1, num_operands) + ",Y"; - break; - case a.IDX: - addrmodeStr = "(" + RenderEA(addrSpace, PC1, num_operands) + ",X)"; - break; - case a.IDY: - addrmodeStr = "(" + RenderEA(addrSpace, PC1, num_operands) + "),Y"; - break; - case a.IND: - addrmodeStr = "(" + RenderEA(addrSpace, PC1, num_operands) + ")"; - break; - case a.IMM: - addrmodeStr = "#" + RenderEA(addrSpace, PC1, num_operands); - break; - default: - // a.IMP, a.ACC - addrmodeStr = string.Empty; - break; - } - - return string.Format("{0} {1}", MnemonicMatrix[addrSpace[PC]], addrmodeStr); - } - - static int GetInstructionLength(AddressSpace addrSpace, ushort PC) - { - switch (AddressingModeMatrix[addrSpace[PC]]) - { - case a.ACC: - case a.IMP: - return 1; - case a.REL: - case a.ZPG: - case a.ZPX: - case a.ZPY: - case a.IDX: - case a.IDY: - case a.IMM: - return 2; - default: - return 3; - } - } - - static string RenderEA(AddressSpace addrSpace, ushort PC, int bytes) - { - var lsb = addrSpace[PC]; - var msb = (bytes == 2) ? addrSpace[(ushort)(PC + 1)] : (byte)0; - var ea = (ushort)(lsb | (msb << 8)); - return string.Format((bytes == 1) ? "${0:x2}" : "${0:x4}", ea); - } - } -} \ No newline at end of file From cb275f8f8d4d9179bbed4462021ca2e775b7e9df Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:35:37 -0400 Subject: [PATCH 52/82] Delete Machine2600.cs --- EMU7800/Core/Machine2600.cs | 112 ------------------------------------ 1 file changed, 112 deletions(-) delete mode 100644 EMU7800/Core/Machine2600.cs diff --git a/EMU7800/Core/Machine2600.cs b/EMU7800/Core/Machine2600.cs deleted file mode 100644 index bb62a026922..00000000000 --- a/EMU7800/Core/Machine2600.cs +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Machine2600.cs - * - * The realization of a 2600 machine. - * - * Copyright � 2003, 2004 Mike Murphy - * - */ -namespace EMU7800.Core -{ - public class Machine2600 : MachineBase - { - #region Fields - - protected TIA TIA { get; set; } - - #endregion - - public override void Reset() - { - base.Reset(); - TIA.Reset(); - PIA.Reset(); - CPU.Reset(); - } - - public override void ComputeNextFrame(FrameBuffer frameBuffer) - { - base.ComputeNextFrame(frameBuffer); - TIA.StartFrame(); - CPU.RunClocks = (FrameBuffer.Scanlines + 3) * 76; - while (CPU.RunClocks > 0 && !CPU.Jammed) - { - if (TIA.WSYNCDelayClocks > 0) - { - CPU.Clock += (ulong)TIA.WSYNCDelayClocks / 3; - CPU.RunClocks -= TIA.WSYNCDelayClocks / 3; - TIA.WSYNCDelayClocks = 0; - } - if (TIA.EndOfFrame) - { - break; - } - CPU.Execute(); - } - TIA.EndFrame(); - } - - public Machine2600(Cart cart, ILogger logger, int slines, int startl, int fHZ, int sRate, int[] p) - : base(logger, slines, startl, fHZ, sRate, p, 160) - { - Mem = new AddressSpace(this, 13, 6); // 2600: 13bit, 64byte pages - - CPU = new M6502(this, 1); - - TIA = new TIA(this); - for (ushort i = 0; i < 0x1000; i += 0x100) - { - Mem.Map(i, 0x0080, TIA); - } - - PIA = new PIA(this); - for (ushort i = 0x0080; i < 0x1000; i += 0x100) - { - Mem.Map(i, 0x0080, PIA); - } - - Cart = cart; - Mem.Map(0x1000, 0x1000, Cart); - } - - #region Serialization Members - - public Machine2600(DeserializationContext input, int[] palette) : base(input, palette) - { - input.CheckVersion(1); - - Mem = input.ReadAddressSpace(this, 13, 6); // 2600: 13bit, 64byte pages - - CPU = input.ReadM6502(this, 1); - - TIA = input.ReadTIA(this); - for (ushort i = 0; i < 0x1000; i += 0x100) - { - Mem.Map(i, 0x0080, TIA); - } - - PIA = input.ReadPIA(this); - for (ushort i = 0x0080; i < 0x1000; i += 0x100) - { - Mem.Map(i, 0x0080, PIA); - } - - Cart = input.ReadCart(this); - Mem.Map(0x1000, 0x1000, Cart); - } - - public override void GetObjectData(SerializationContext output) - { - base.GetObjectData(output); - - output.WriteVersion(1); - output.Write(Mem); - output.Write(CPU); - output.Write(TIA); - output.Write(PIA); - output.Write(Cart); - } - - #endregion - } -} From 30798200430914f8cf87ee4c732487d309260f05 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:35:45 -0400 Subject: [PATCH 53/82] Delete Machine2600NTSC.cs --- EMU7800/Core/Machine2600NTSC.cs | 30 ------------------------------ 1 file changed, 30 deletions(-) delete mode 100644 EMU7800/Core/Machine2600NTSC.cs diff --git a/EMU7800/Core/Machine2600NTSC.cs b/EMU7800/Core/Machine2600NTSC.cs deleted file mode 100644 index 52c5a5b3958..00000000000 --- a/EMU7800/Core/Machine2600NTSC.cs +++ /dev/null @@ -1,30 +0,0 @@ -namespace EMU7800.Core -{ - public sealed class Machine2600NTSC : Machine2600 - { - public override string ToString() - { - return GetType().Name; - } - - public Machine2600NTSC(Cart cart, ILogger logger) - : base(cart, logger, 262, 16, 60, 31440 /* NTSC_SAMPLES_PER_SEC */, TIATables.NTSCPalette) - { - } - - #region Serialization Members - - public Machine2600NTSC(DeserializationContext input) : base(input, TIATables.NTSCPalette) - { - input.CheckVersion(1); - } - - public override void GetObjectData(SerializationContext output) - { - base.GetObjectData(output); - output.WriteVersion(1); - } - - #endregion - } -} From c60658a4dc200d781bd451251977988f0c1f8de7 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:35:52 -0400 Subject: [PATCH 54/82] Delete Machine2600PAL.cs --- EMU7800/Core/Machine2600PAL.cs | 30 ------------------------------ 1 file changed, 30 deletions(-) delete mode 100644 EMU7800/Core/Machine2600PAL.cs diff --git a/EMU7800/Core/Machine2600PAL.cs b/EMU7800/Core/Machine2600PAL.cs deleted file mode 100644 index ab32b28ba51..00000000000 --- a/EMU7800/Core/Machine2600PAL.cs +++ /dev/null @@ -1,30 +0,0 @@ -namespace EMU7800.Core -{ - public sealed class Machine2600PAL : Machine2600 - { - public override string ToString() - { - return GetType().Name; - } - - public Machine2600PAL(Cart cart, ILogger logger) - : base(cart, logger, 312, 32, 50, 31200 /* PAL_SAMPLES_PER_SEC */, TIATables.PALPalette) - { - } - - #region Serialization Members - - public Machine2600PAL(DeserializationContext input) : base(input, TIATables.PALPalette) - { - input.CheckVersion(1); - } - - public override void GetObjectData(SerializationContext output) - { - base.GetObjectData(output); - output.WriteVersion(1); - } - - #endregion - } -} From b0bdd05426d158a26c4097c75ca028f64f19d2ef Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:36:02 -0400 Subject: [PATCH 55/82] Delete Machine7800.cs --- EMU7800/Core/Machine7800.cs | 255 ------------------------------------ 1 file changed, 255 deletions(-) delete mode 100644 EMU7800/Core/Machine7800.cs diff --git a/EMU7800/Core/Machine7800.cs b/EMU7800/Core/Machine7800.cs deleted file mode 100644 index 7da3da1fbdd..00000000000 --- a/EMU7800/Core/Machine7800.cs +++ /dev/null @@ -1,255 +0,0 @@ -/* - * Machine7800.cs - * - * The realization of a 7800 machine. - * - * Copyright � 2003-2005 Mike Murphy - * - */ -namespace EMU7800.Core -{ - public class Machine7800 : MachineBase - { - #region Fields - - protected Maria Maria { get; set; } - public RAM6116 RAM1 { get; protected set; } - public RAM6116 RAM2 { get; protected set; } - public Bios7800 BIOS { get; private set; } - public HSC7800 HSC { get; private set; } - public bool using_bios=true; - - #endregion - - public void SwapInBIOS() - { - if (BIOS == null) - return; - Mem.Map((ushort)(0x10000 - BIOS.Size), BIOS.Size, BIOS); - using_bios = true; - } - - public void SwapOutBIOS() - { - if (BIOS == null) - return; - Mem.Map((ushort)(0x10000 - BIOS.Size), BIOS.Size, Cart); - using_bios = false; - } - - public override void Reset() - { - base.Reset(); - SwapInBIOS(); - if (HSC != null) - HSC.Reset(); - Cart.Reset(); - Maria.Reset(); - PIA.Reset(); - CPU.Reset(); - } - - public override void ComputeNextFrame(FrameBuffer frameBuffer) - { - base.ComputeNextFrame(frameBuffer); - - AssertDebug(CPU.Jammed || CPU.RunClocks <= 0 && (CPU.RunClocks % CPU.RunClocksMultiple) == 0); - AssertDebug(CPU.Jammed || ((CPU.Clock + (ulong)(CPU.RunClocks / CPU.RunClocksMultiple)) % (114 * (ulong)FrameBuffer.Scanlines)) == 0); - - ulong startOfScanlineCpuClock = 0; - - Maria.StartFrame(); - Cart.StartFrame(); - for (var i = 0; i < FrameBuffer.Scanlines && !CPU.Jammed; i++) - { - AssertDebug(CPU.RunClocks <= 0 && (CPU.RunClocks % CPU.RunClocksMultiple) == 0); - var newStartOfScanlineCpuClock = CPU.Clock + (ulong)(CPU.RunClocks / CPU.RunClocksMultiple); - - AssertDebug(startOfScanlineCpuClock == 0 || newStartOfScanlineCpuClock == startOfScanlineCpuClock + 114); - startOfScanlineCpuClock = newStartOfScanlineCpuClock; - - CPU.RunClocks += (7 * CPU.RunClocksMultiple); - var remainingRunClocks = (114 - 7) * CPU.RunClocksMultiple; - - CPU.Execute(); - if (CPU.Jammed) - break; - if (CPU.EmulatorPreemptRequest) - { - Maria.DoDMAProcessing(); - var remainingCpuClocks = 114 - (CPU.Clock - startOfScanlineCpuClock); - CPU.Clock += remainingCpuClocks; - CPU.RunClocks = 0; - continue; - } - - var dmaClocks = Maria.DoDMAProcessing(); - - // CHEAT: Ace of Aces: Title screen has a single scanline flicker without this. Maria DMA clock counting probably not 100% accurate. - if (i == 203 && FrameBuffer.Scanlines == 262 /*NTSC*/ || i == 228 && FrameBuffer.Scanlines == 312 /*PAL*/) - if (dmaClocks == 152 && remainingRunClocks == 428 && (CPU.RunClocks == -4 || CPU.RunClocks == -8)) - dmaClocks -= 4; - - // Unsure exactly what to do if Maria DMA processing extends past the current scanline. - // For now, throw away half remaining until we are within the current scanline. - // KLAX initialization starts DMA without initializing the DLL data structure. - // Maria processing then runs away causing an invalid CPU opcode to be executed that jams the machine. - // So Maria must give up at some point, but not clear exactly how. - // Anyway, this makes KLAX work without causing breakage elsewhere. - while ((CPU.RunClocks + remainingRunClocks) < dmaClocks) - { - dmaClocks >>= 1; - } - - // Assume the CPU waits until the next div4 boundary to proceed after DMA processing. - if ((dmaClocks & 3) != 0) - { - dmaClocks += 4; - dmaClocks -= (dmaClocks & 3); - } - - CPU.Clock += (ulong)(dmaClocks / CPU.RunClocksMultiple); - CPU.RunClocks -= dmaClocks; - - CPU.RunClocks += remainingRunClocks; - - CPU.Execute(); - if (CPU.Jammed) - break; - if (CPU.EmulatorPreemptRequest) - { - var remainingCpuClocks = 114 - (CPU.Clock - startOfScanlineCpuClock); - CPU.Clock += remainingCpuClocks; - CPU.RunClocks = 0; - } - } - Cart.EndFrame(); - Maria.EndFrame(); - } - - public Machine7800(Cart cart, Bios7800 bios, HSC7800 hsc, ILogger logger, int scanlines, int startl, int fHZ, int sRate, int[] p) - : base(logger, scanlines, startl, fHZ, sRate, p, 320) - { - Mem = new AddressSpace(this, 16, 6); // 7800: 16bit, 64byte pages - - CPU = new M6502(this, 4); - - Maria = new Maria(this, scanlines); - Mem.Map(0x0000, 0x0040, Maria); - Mem.Map(0x0100, 0x0040, Maria); - Mem.Map(0x0200, 0x0040, Maria); - Mem.Map(0x0300, 0x0040, Maria); - - PIA = new PIA(this); - Mem.Map(0x0280, 0x0080, PIA); - Mem.Map(0x0480, 0x0080, PIA); - Mem.Map(0x0580, 0x0080, PIA); - - RAM1 = new RAM6116(); - RAM2 = new RAM6116(); - Mem.Map(0x1800, 0x0800, RAM1); - Mem.Map(0x2000, 0x0800, RAM2); - - Mem.Map(0x0040, 0x00c0, RAM2); // page 0 shadow - Mem.Map(0x0140, 0x00c0, RAM2); // page 1 shadow - Mem.Map(0x2800, 0x0800, RAM2); // shadow1 - Mem.Map(0x3000, 0x0800, RAM2); // shadow2 - Mem.Map(0x3800, 0x0800, RAM2); // shadow3 - - BIOS = bios; - HSC = hsc; - - if (HSC != null) - { - Mem.Map(0x1000, 0x800, HSC.SRAM); - Mem.Map(0x3000, 0x1000, HSC); - Logger.WriteLine("7800 Highscore Cartridge Installed"); - } - - Cart = cart; - Mem.Map(0x4000, 0xc000, Cart); - } - - #region Serialization Members - - public Machine7800(DeserializationContext input, int[] palette, int scanlines) : base(input, palette) - { - input.CheckVersion(1); - - Mem = input.ReadAddressSpace(this, 16, 6); // 7800: 16bit, 64byte pages - - CPU = input.ReadM6502(this, 4); - - Maria = input.ReadMaria(this, scanlines); - Mem.Map(0x0000, 0x0040, Maria); - Mem.Map(0x0100, 0x0040, Maria); - Mem.Map(0x0200, 0x0040, Maria); - Mem.Map(0x0300, 0x0040, Maria); - - PIA = input.ReadPIA(this); - Mem.Map(0x0280, 0x0080, PIA); - Mem.Map(0x0480, 0x0080, PIA); - Mem.Map(0x0580, 0x0080, PIA); - - RAM1 = input.ReadRAM6116(); - RAM2 = input.ReadRAM6116(); - Mem.Map(0x1800, 0x0800, RAM1); - Mem.Map(0x2000, 0x0800, RAM2); - - Mem.Map(0x0040, 0x00c0, RAM2); // page 0 shadow - Mem.Map(0x0140, 0x00c0, RAM2); // page 1 shadow - Mem.Map(0x2800, 0x0800, RAM2); // shadow1 - Mem.Map(0x3000, 0x0800, RAM2); // shadow2 - Mem.Map(0x3800, 0x0800, RAM2); // shadow3 - - BIOS = input.ReadOptionalBios7800(); - HSC = input.ReadOptionalHSC7800(); - - if (HSC != null) - { - Mem.Map(0x1000, 0x800, HSC.SRAM); - Mem.Map(0x3000, 0x1000, HSC); - } - - Cart = input.ReadCart(this); - Mem.Map(0x4000, 0xc000, Cart); - - using_bios = input.ReadBoolean(); - - if (using_bios && BIOS != null) - { - Mem.Map((ushort)(0x10000 - BIOS.Size), BIOS.Size, BIOS); - } - } - - public override void GetObjectData(SerializationContext output) - { - base.GetObjectData(output); - - output.WriteVersion(1); - output.Write(Mem); - output.Write(CPU); - output.Write(Maria); - output.Write(PIA); - output.Write(RAM1); - output.Write(RAM2); - output.WriteOptional(BIOS); - output.WriteOptional(HSC); - output.Write(Cart); - output.Write(using_bios); - } - - #endregion - - #region Helpers - - [System.Diagnostics.Conditional("DEBUG")] - void AssertDebug(bool cond) - { - if (!cond) - System.Diagnostics.Debugger.Break(); - } - - #endregion - } -} From ca6765d0cd544671bc00cd90525953dd8c3f8921 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:36:12 -0400 Subject: [PATCH 56/82] Delete Machine7800NTSC.cs --- EMU7800/Core/Machine7800NTSC.cs | 30 ------------------------------ 1 file changed, 30 deletions(-) delete mode 100644 EMU7800/Core/Machine7800NTSC.cs diff --git a/EMU7800/Core/Machine7800NTSC.cs b/EMU7800/Core/Machine7800NTSC.cs deleted file mode 100644 index 933336740fd..00000000000 --- a/EMU7800/Core/Machine7800NTSC.cs +++ /dev/null @@ -1,30 +0,0 @@ -namespace EMU7800.Core -{ - public sealed class Machine7800NTSC : Machine7800 - { - public override string ToString() - { - return GetType().Name; - } - - public Machine7800NTSC(Cart cart, Bios7800 bios, HSC7800 hsc, ILogger logger) - : base(cart, bios, hsc, logger, 262, 16, 60, 31440 /* NTSC_SAMPLES_PER_SEC */, MariaTables.NTSCPalette) - { - } - - #region Serialization Members - - public Machine7800NTSC(DeserializationContext input) : base(input, MariaTables.NTSCPalette, 262) - { - input.CheckVersion(1); - } - - public override void GetObjectData(SerializationContext output) - { - base.GetObjectData(output); - output.WriteVersion(1); - } - - #endregion - } -} From a9d1f58761112eb282059bd1881a75a502c9ffff Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:36:21 -0400 Subject: [PATCH 57/82] Delete Machine7800PAL.cs --- EMU7800/Core/Machine7800PAL.cs | 30 ------------------------------ 1 file changed, 30 deletions(-) delete mode 100644 EMU7800/Core/Machine7800PAL.cs diff --git a/EMU7800/Core/Machine7800PAL.cs b/EMU7800/Core/Machine7800PAL.cs deleted file mode 100644 index 4de452f8921..00000000000 --- a/EMU7800/Core/Machine7800PAL.cs +++ /dev/null @@ -1,30 +0,0 @@ -namespace EMU7800.Core -{ - public sealed class Machine7800PAL : Machine7800 - { - public override string ToString() - { - return GetType().Name; - } - - public Machine7800PAL(Cart cart, Bios7800 bios, HSC7800 hsc, ILogger logger) - : base(cart, bios, hsc, logger, 312, 34, 50, 31200 /* PAL_SAMPLES_PER_SEC */, MariaTables.PALPalette) - { - } - - #region Serialization Members - - public Machine7800PAL(DeserializationContext input) : base(input, MariaTables.PALPalette, 312) - { - input.CheckVersion(1); - } - - public override void GetObjectData(SerializationContext output) - { - base.GetObjectData(output); - output.WriteVersion(1); - } - - #endregion - } -} From 61163aa4d4544ac3545c01063beb1ce8025b3b78 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:36:29 -0400 Subject: [PATCH 58/82] Delete MachineBase.cs --- EMU7800/Core/MachineBase.cs | 331 ------------------------------------ 1 file changed, 331 deletions(-) delete mode 100644 EMU7800/Core/MachineBase.cs diff --git a/EMU7800/Core/MachineBase.cs b/EMU7800/Core/MachineBase.cs deleted file mode 100644 index 832258d11cb..00000000000 --- a/EMU7800/Core/MachineBase.cs +++ /dev/null @@ -1,331 +0,0 @@ -/* -/* - * MachineBase.cs - * - * Abstraction of an emulated machine. - * - * Copyright � 2003, 2004 Mike Murphy - * - */ -using System; -using System.IO; -using System.Reflection; - -namespace EMU7800.Core -{ - public abstract class MachineBase - { - #region Fields - - ILogger _Logger; - FrameBuffer _FrameBuffer; - - bool _MachineHalt; - int _FrameHZ; - readonly int _VisiblePitch, _Scanlines; - - protected Cart Cart { get; set; } - - #endregion - - #region Internal Properties - - internal FrameBuffer FrameBuffer - { - get - { - AssertDebug(_FrameBuffer != null); - return _FrameBuffer; - } - } - - #endregion - - #region Public Properties - - /// - /// The machine's Central Processing Unit. - /// - public M6502 CPU { get; protected set; } - - /// - /// The machine's Address Space. - /// - public AddressSpace Mem { get; protected set; } - - /// - /// The machine's Peripheral Interface Adaptor device. - /// - public PIA PIA { get; protected set; } - - /// - /// Reports whether the machine has been halted due to an internal condition or error. - /// - public bool MachineHalt - { - get { return _MachineHalt; } - internal set { if (value) _MachineHalt = true; } - } - - /// - /// The machine input state. - /// - public InputState InputState { get; private set; } - - /// - /// The current frame number. - /// - public long FrameNumber { get; private set; } - - /// - /// The first scanline that is visible. - /// - public int FirstScanline { get; private set; } - - /// - /// Frame rate. - /// - public int FrameHZ - { - get { return _FrameHZ < 1 ? 1 : _FrameHZ; } - set { _FrameHZ = value < 1 ? 1 : value; } - } - - /// - /// Number of sound samples per second. - /// - public int SoundSampleFrequency { get; private set; } - - /// - /// The color palette for the configured machine. - /// - public int[] Palette { get; internal set; } - - /// - /// Dumps CPU registers to the log when NOP instructions are encountered. - /// - public bool NOPRegisterDumping { get; set; } - - /// - /// The configured logger sink. - /// - public ILogger Logger - { - get { return _Logger ?? (_Logger = new NullLogger()); } - set { _Logger = value; } - } - - #endregion - - #region Public Methods - - /// - /// Creates an instance of the specified machine. - /// - /// - /// - /// 7800 BIOS, optional. - /// 7800 High Score cart, optional. - /// Left controller, optional. - /// Right controller, optional. - /// - /// Cart must not be null. - /// Specified MachineType is unexpected. - public static MachineBase Create(MachineType machineType, Cart cart, Bios7800 bios, HSC7800 hsc, Controller p1, Controller p2, ILogger logger) - { - if (cart == null) - throw new ArgumentNullException("cart"); - - MachineBase m; - switch (machineType) - { - case MachineType.A2600NTSC: - m = new Machine2600NTSC(cart, logger); - break; - case MachineType.A2600PAL: - m = new Machine2600PAL(cart, logger); - break; - case MachineType.A7800NTSC: - m = new Machine7800NTSC(cart, bios, hsc, logger); - break; - case MachineType.A7800PAL: - m = new Machine7800PAL(cart, bios, hsc, logger); - break; - default: - throw new Emu7800Exception("Unexpected MachineType: " + machineType); - } - - m.InputState.LeftControllerJack = p1; - m.InputState.RightControllerJack = p2; - - m.Reset(); - - return m; - } - - /// - /// Deserialize a from the specified stream. - /// - /// - /// - /// - public static MachineBase Deserialize(BinaryReader binaryReader) - { - var context = new DeserializationContext(binaryReader); - MachineBase m; - try - { - m = context.ReadMachine(); - } - catch (Emu7800SerializationException) - { - throw; - } - catch (TargetInvocationException ex) - { - // TargetInvocationException wraps exceptions that unwind an Activator.CreateInstance() frame. - throw new Emu7800SerializationException("Serialization stream does not describe a valid machine.", ex.InnerException); - } - catch (Exception ex) - { - throw new Emu7800SerializationException("Serialization stream does not describe a valid machine.", ex); - } - return m; - } - - /// - /// Resets the state of the machine. - /// - public virtual void Reset() - { - Logger.WriteLine("Machine {0} reset ({1} HZ {2} scanlines)", this, FrameHZ, _Scanlines); - FrameNumber = 0; - _MachineHalt = false; - InputState.ClearAllInput(); - } - - /// - /// Computes the next machine frame, updating contents of the provided . - /// - /// The framebuffer to contain the computed output. - /// - /// frameBuffer is incompatible with machine. - public virtual void ComputeNextFrame(FrameBuffer frameBuffer) - { - if (MachineHalt) - return; - - InputState.CaptureInputState(); - - _FrameBuffer = frameBuffer; - FrameNumber++; - - for (var i = 0; i < _FrameBuffer.SoundBufferByteLength; i++) - _FrameBuffer.SoundBuffer[i] = 0; - } - - /// - /// Create a with compatible dimensions for this machine. - /// - public FrameBuffer CreateFrameBuffer() - { - var fb = new FrameBuffer(_VisiblePitch, _Scanlines); - return fb; - } - - /// - /// Serialize the state of the machine to the specified stream. - /// - /// - /// - /// - public void Serialize(BinaryWriter binaryWriter) - { - var context = new SerializationContext(binaryWriter); - try - { - context.Write(this); - } - catch (Emu7800SerializationException) - { - throw; - } - catch (Exception ex) - { - throw new Emu7800SerializationException("Problem serializing specified machine.", ex); - } - } - - #endregion - - #region Constructors - - private MachineBase() - { - } - - protected MachineBase(ILogger logger, int scanLines, int firstScanline, int fHZ, int soundSampleFreq, int[] palette, int vPitch) : this() - { - InputState = new InputState(); - Logger = logger; - _Scanlines = scanLines; - FirstScanline = firstScanline; - FrameHZ = fHZ; - SoundSampleFrequency = soundSampleFreq; - Palette = palette; - _VisiblePitch = vPitch; - } - - #endregion - - #region Serialization Members - - protected MachineBase(DeserializationContext input, int[] palette) - { - if (input == null) - throw new ArgumentNullException("input"); - if (palette == null) - throw new ArgumentNullException("palette"); - if (palette.Length != 0x100) - throw new ArgumentException("palette incorrect size, must be 256."); - - input.CheckVersion(1); - _MachineHalt = input.ReadBoolean(); - _FrameHZ = input.ReadInt32(); - _VisiblePitch = input.ReadInt32(); - _Scanlines = input.ReadInt32(); - FirstScanline = input.ReadInt32(); - SoundSampleFrequency = input.ReadInt32(); - NOPRegisterDumping = input.ReadBoolean(); - InputState = input.ReadInputState(); - - Palette = palette; - Logger = null; - } - - public virtual void GetObjectData(SerializationContext output) - { - if (output == null) - throw new ArgumentNullException("output"); - - output.WriteVersion(1); - output.Write(_MachineHalt); - output.Write(_FrameHZ); - output.Write(_VisiblePitch); - output.Write(_Scanlines); - output.Write(FirstScanline); - output.Write(SoundSampleFrequency); - output.Write(NOPRegisterDumping); - output.Write(InputState); - } - - #endregion - - [System.Diagnostics.Conditional("DEBUG")] - void AssertDebug(bool cond) - { - if (!cond) - System.Diagnostics.Debugger.Break(); - } - } -} From 6962b6e4e1964520f3517b36a6c15135bf7c0937 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:36:38 -0400 Subject: [PATCH 59/82] Delete MachineInput.cs --- EMU7800/Core/MachineInput.cs | 42 ------------------------------------ 1 file changed, 42 deletions(-) delete mode 100644 EMU7800/Core/MachineInput.cs diff --git a/EMU7800/Core/MachineInput.cs b/EMU7800/Core/MachineInput.cs deleted file mode 100644 index 05fe19c556f..00000000000 --- a/EMU7800/Core/MachineInput.cs +++ /dev/null @@ -1,42 +0,0 @@ -/* - * HostInput.cs - * - * Copyright © 2009 Mike Murphy - * - */ -namespace EMU7800.Core -{ - public enum MachineInput - { - End, - Pause, - Mute, - Fire, - Fire2, - Left, - Right, - Up, - Down, - NumPad1, NumPad2, NumPad3, - NumPad4, NumPad5, NumPad6, - NumPad7, NumPad8, NumPad9, - NumPadMult, NumPad0, NumPadHash, - Driving0, Driving1, Driving2, Driving3, - Reset, - Select, - Color, - LeftDifficulty, - RightDifficulty, - SetKeyboardToPlayer1, - SetKeyboardToPlayer2, - SetKeyboardToPlayer3, - SetKeyboardToPlayer4, - PanLeft, PanRight, PanUp, PanDown, - SaveMachine, - TakeScreenshot, - LeftPaddleSwap, - GameControllerSwap, - RightPaddleSwap, - ShowFrameStats, - } -} From 1e33c5fbc6142334fa4ff56a7ae9366603b5e698 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:36:46 -0400 Subject: [PATCH 60/82] Delete MachineType.cs --- EMU7800/Core/MachineType.cs | 19 ------------------- 1 file changed, 19 deletions(-) delete mode 100644 EMU7800/Core/MachineType.cs diff --git a/EMU7800/Core/MachineType.cs b/EMU7800/Core/MachineType.cs deleted file mode 100644 index 0fcfdd2d52e..00000000000 --- a/EMU7800/Core/MachineType.cs +++ /dev/null @@ -1,19 +0,0 @@ -/* - * MachineType.cs - * - * The set of known machines. - * - * Copyright © 2010 Mike Murphy - * - */ -namespace EMU7800.Core -{ - public enum MachineType - { - None, - A2600NTSC, - A2600PAL, - A7800NTSC, - A7800PAL - }; -} From 6f87bcdea4a9e6dffa1be21c1db188dcc8d0f491 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:36:59 -0400 Subject: [PATCH 61/82] Delete Maria.cs --- EMU7800/Core/Maria.cs | 1151 ----------------------------------------- 1 file changed, 1151 deletions(-) delete mode 100644 EMU7800/Core/Maria.cs diff --git a/EMU7800/Core/Maria.cs b/EMU7800/Core/Maria.cs deleted file mode 100644 index 682e3a0bc92..00000000000 --- a/EMU7800/Core/Maria.cs +++ /dev/null @@ -1,1151 +0,0 @@ -/* - * Maria.cs - * - * The Maria display device. - * - * Derived from much of Dan Boris' work with 7800 emulation - * within the MESS emulator. - * - * Thanks to Matthias Luedtke for correcting - * the BuildLineRAM320B() method to correspond closer to real hardware. - * (Matthias credited an insightful response by Eckhard Stolberg on a forum on - * Atari Age circa June 2005.) - * - * Copyright � 2004-2012 Mike Murphy - * - */ -using System; - -namespace EMU7800.Core -{ - public sealed class Maria : IDevice - { - #region Constants - - const int - INPTCTRL= 0x01, // Write: input port control (VBLANK in TIA) - INPT0 = 0x08, // Read pot port: D7 - INPT1 = 0x09, // Read pot port: D7 - INPT2 = 0x0a, // Read pot port: D7 - INPT3 = 0x0b, // Read pot port: D7 - INPT4 = 0x0c, // Read P1 joystick trigger: D7 - INPT5 = 0x0d, // Read P2 joystick trigger: D7 - AUDC0 = 0x15, // Write: audio control 0 (D3-0) - AUDC1 = 0x16, // Write: audio control 1 (D4-0) - AUDF0 = 0x17, // Write: audio frequency 0 (D4-0) - AUDF1 = 0x18, // Write: audio frequency 1 (D3-0) - AUDV0 = 0x19, // Write: audio volume 0 (D3-0) - AUDV1 = 0x1a, // Write: audio volume 1 (D3-0) - - BACKGRND= 0x20, // Background color - P0C1 = 0x21, // Palette 0 - color 1 - P0C2 = 0x22, // Palette 0 - color 2 - P0C3 = 0x23, // Palette 0 - color 3 - WSYNC = 0x24, // Wait for sync - P1C1 = 0x25, // Palette 1 - color 1 - P1C2 = 0x26, // Palette 1 - color 2 - P1C3 = 0x27, // Palette 1 - color 3 - MSTAT = 0x28, // Maria status - P2C1 = 0x29, // Palette 2 - color 1 - P2C2 = 0x2a, // Palette 2 - color 2 - P2C3 = 0x2b, // Palette 2 - color 3 - DPPH = 0x2c, // Display list list point high - P3C1 = 0x2d, // Palette 3 - color 1 - P3C2 = 0x2e, // Palette 3 - color 2 - P3C3 = 0x2f, // Palette 3 - color 3 - DPPL = 0x30, // Display list list point low - P4C1 = 0x31, // Palette 4 - color 1 - P4C2 = 0x32, // Palette 4 - color 2 - P4C3 = 0x33, // Palette 4 - color 3 - CHARBASE= 0x34, // Character base address - P5C1 = 0x35, // Palette 5 - color 1 - P5C2 = 0x36, // Palette 5 - color 2 - P5C3 = 0x37, // Palette 5 - color 3 - OFFSET = 0x38, // Future expansion (store zero here) - P6C1 = 0x39, // Palette 6 - color 1 - P6C2 = 0x3a, // Palette 6 - color 2 - P6C3 = 0x3b, // Palette 6 - color 3 - CTRL = 0x3c, // Maria control register - P7C1 = 0x3d, // Palette 7 - color 1 - P7C2 = 0x3e, // Palette 7 - color 2 - P7C3 = 0x3f; // Palette 7 - color 3 - - const int CPU_TICKS_PER_AUDIO_SAMPLE = 57; - - #endregion - - #region Fields - - readonly byte[] LineRAM = new byte[0x200]; - readonly byte[] Registers = new byte[0x40]; - - readonly Machine7800 M; - readonly TIASound TIASound; - - ulong _startOfFrameCpuClock; - int Scanline { get { return (int)(M.CPU.Clock - _startOfFrameCpuClock) / 114; } } - int HPos { get { return (int)(M.CPU.Clock - _startOfFrameCpuClock) % 114; } } - - int FirstVisibleScanline, LastVisibleScanline; - int _dmaClocks; - bool _isPal; - - // For lightgun emulation. - // Transient state, serialization unnecessary. - ulong _lightgunFirstSampleCpuClock; - int _lightgunFrameSamples, _lightgunSampledScanline, _lightgunSampledVisibleHpos; - - bool WM; - ushort DLL; - ushort DL; - int Offset; - int Holey; - int Width; - byte HPOS; - int PaletteNo; - bool INDMode; - - bool CtrlLock; - - // MARIA CNTL - bool DMAEnabled; - bool ColorKill; - bool CWidth; - bool BCntl; - bool Kangaroo; - byte RM; - - #endregion - - #region Public Members - - public void Reset() - { - CtrlLock = false; - - DMAEnabled = false; - ColorKill = false; - CWidth = false; - BCntl = false; - Kangaroo = false; - RM = 0; - - TIASound.Reset(); - - Log("{0} reset", this); - } - - public byte this[ushort addr] - { - get { return peek(addr); } - set { poke(addr, value); } - } - - public override string ToString() - { - return GetType().Name; - } - - public void StartFrame() - { - _startOfFrameCpuClock = M.CPU.Clock + (ulong)(M.CPU.RunClocks / M.CPU.RunClocksMultiple); - _lightgunFirstSampleCpuClock = 0; - - AssertDebug(M.CPU.RunClocks <= 0 && (M.CPU.RunClocks % M.CPU.RunClocksMultiple) == 0); - AssertDebug((_startOfFrameCpuClock % (114 * (ulong)M.FrameBuffer.Scanlines)) == 0); - - TIASound.StartFrame(); - } - - public int DoDMAProcessing() - { - OutputLineRAM(); - - var sl = Scanline; - - if (!DMAEnabled || sl < FirstVisibleScanline || sl >= LastVisibleScanline) - return 0; - - _dmaClocks = 0; - - if (DMAEnabled && sl == FirstVisibleScanline) - { - // DMA TIMING: End of VBLANK: DMA Startup + long shutdown - _dmaClocks += 15; - - DLL = WORD(Registers[DPPL], Registers[DPPH]); - - ConsumeNextDLLEntry(); - } - - // DMA TIMING: DMA Startup, 5-9 cycles - _dmaClocks += 5; - - BuildLineRAM(); - - if (--Offset < 0) - { - ConsumeNextDLLEntry(); - - // DMA TIMING: DMA Shutdown: Last line of zone, 10-13 cycles - _dmaClocks += 10; - } - else - { - // DMA TIMING: DMA Shutdown: Other line of zone, 4-7 cycles - _dmaClocks += 4; - } - - return _dmaClocks; - } - - public void EndFrame() - { - TIASound.EndFrame(); - } - - #endregion - - #region Constructors - - private Maria() - { - } - - public Maria(Machine7800 m, int scanlines) - { - if (m == null) - throw new ArgumentNullException("m"); - - M = m; - InitializeVisibleScanlineValues(scanlines); - TIASound = new TIASound(M, CPU_TICKS_PER_AUDIO_SAMPLE); - } - - #endregion - - #region Scanline Builders - - void BuildLineRAM() - { - var dl = DL; - - // Iterate through Display List (DL) - while (true) - { - var modeByte = DmaRead(dl + 1); - if ((modeByte & 0x5f) == 0) - break; - - INDMode = false; - ushort graphaddr; - - if ((modeByte & 0x1f) == 0) - { - // Extended DL header - var dl0 = DmaRead(dl++); // low address - var dl1 = DmaRead(dl++); // mode - var dl2 = DmaRead(dl++); // high address - var dl3 = DmaRead(dl++); // palette(7-5)/width(4-0) - var dl4 = DmaRead(dl++); // horizontal position - - graphaddr = WORD(dl0, dl2); - WM = (dl1 & 0x80) != 0; - INDMode = (dl1 & 0x20) != 0; - PaletteNo = (dl3 & 0xe0) >> 3; - Width = (~dl3 & 0x1f) + 1; - HPOS = dl4; - - // DMA TIMING: DL 5 byte header - _dmaClocks += 10; - } - else - { - // Normal DL header - var dl0 = DmaRead(dl++); // low address - var dl1 = DmaRead(dl++); // palette(7-5)/width(4-0) - var dl2 = DmaRead(dl++); // high address - var dl3 = DmaRead(dl++); // horizontal position - - graphaddr = WORD(dl0, dl2); - PaletteNo = (dl1 & 0xe0) >> 3; - Width = (~dl1 & 0x1f) + 1; - HPOS = dl3; - - // DMA TIMING: DL 4 byte header - _dmaClocks += 8; - } - - // DMA TIMING: Graphic reads - if (RM != 1) - _dmaClocks += (Width * (INDMode ? (CWidth ? 9 : 6) : 3)); - - switch (RM) - { - case 0: - if (WM) BuildLineRAM160B(graphaddr); else BuildLineRAM160A(graphaddr); - break; - case 1: - continue; - case 2: - if (WM) BuildLineRAM320B(graphaddr); else BuildLineRAM320D(graphaddr); - break; - case 3: - if (WM) BuildLineRAM320C(graphaddr); else BuildLineRAM320A(graphaddr); - break; - } - } - } - - void BuildLineRAM160A(ushort graphaddr) - { - var indbytes = (INDMode && CWidth) ? 2 : 1; - var hpos = HPOS << 1; - var dataaddr = (ushort)(graphaddr + (Offset << 8)); - - for (var i=0; i < Width; i++) - { - if (INDMode) - { - dataaddr = WORD(DmaRead(graphaddr + i), Registers[CHARBASE] + Offset); - } - - for (var j=0; j < indbytes; j++) - { - if (Holey == 0x02 && ((dataaddr & 0x9000) == 0x9000) || Holey == 0x01 && ((dataaddr & 0x8800) == 0x8800)) - { - hpos += 8; - dataaddr++; - AssertDebug(!Kangaroo); - continue; - } - - int d = DmaRead(dataaddr++); - - var c = (d & 0xc0) >> 6; - if (c != 0) - { - var val = (byte)(PaletteNo | c); - LineRAM[hpos & 0x1ff] = LineRAM[(hpos+1) & 0x1ff] = val; - } - AssertDebug(c != 0 || c == 0 && !Kangaroo); - - hpos += 2; - - c = (d & 0x30) >> 4; - if (c != 0) - { - var val = (byte)(PaletteNo | c); - LineRAM[hpos & 0x1ff] = LineRAM[(hpos+1) & 0x1ff] = val; - } - AssertDebug(c != 0 || c == 0 && !Kangaroo); - - hpos += 2; - - c = (d & 0x0c) >> 2; - if (c != 0) - { - var val = (byte)(PaletteNo | c); - LineRAM[hpos & 0x1ff] = LineRAM[(hpos+1) & 0x1ff] = val; - } - AssertDebug(c != 0 || c == 0 && !Kangaroo); - - hpos += 2; - - c = d & 0x03; - if (c != 0) - { - var val = (byte)(PaletteNo | c); - LineRAM[hpos & 0x1ff] = LineRAM[(hpos+1) & 0x1ff] = val; - } - AssertDebug(c != 0 || c == 0 && !Kangaroo); - - hpos += 2; - } - } - } - - void BuildLineRAM160B(ushort graphaddr) - { - var indbytes = (INDMode && CWidth) ? 2 : 1; - var hpos = HPOS << 1; - var dataaddr = (ushort)(graphaddr + (Offset << 8)); - - for (var i = 0; i < Width; i++) - { - if (INDMode) - { - dataaddr = WORD(DmaRead(graphaddr + i), Registers[CHARBASE] + Offset); - } - - for (var j=0; j < indbytes; j++) - { - if (Holey == 0x02 && ((dataaddr & 0x9000) == 0x9000) || Holey == 0x01 && ((dataaddr & 0x8800) == 0x8800)) - { - hpos += 4; - dataaddr++; - continue; - } - - int d = DmaRead(dataaddr++); - - var c = (d & 0xc0) >> 6; - if (c != 0) - { - var p = ((PaletteNo >> 2) & 0x04) | ((d & 0x0c) >> 2); - var val = (byte)((p << 2) | c); - LineRAM[hpos & 0x1ff] = LineRAM[(hpos+1) & 0x1ff] = val; - } - else if (Kangaroo) - { - LineRAM[hpos & 0x1ff] = LineRAM[(hpos+1) & 0x1ff] = 0; - } - - hpos += 2; - - c = (d & 0x30) >> 4; - if (c != 0) - { - var p = ((PaletteNo >> 2) & 0x04) | (d & 0x03); - var val = (byte)((p << 2) | c); - LineRAM[hpos & 0x1ff] = LineRAM[(hpos+1) & 0x1ff] = val; - } - else if (Kangaroo) - { - LineRAM[hpos & 0x1ff] = LineRAM[(hpos+1) & 0x1ff] = 0; - } - - hpos += 2; - } - } - } - - void BuildLineRAM320A(ushort graphaddr) - { - var color = (byte)(PaletteNo | 2); - var hpos = HPOS << 1; - var dataaddr = (ushort)(graphaddr + (Offset << 8)); - - AssertDebug(!CWidth); - - for (var i = 0; i < Width; i++) - { - if (INDMode) - { - dataaddr = WORD(DmaRead(graphaddr + i), Registers[CHARBASE] + Offset); - } - - if (Holey == 0x02 && ((dataaddr & 0x9000) == 0x9000) || Holey == 0x01 && ((dataaddr & 0x8800) == 0x8800)) - { - hpos += 8; - dataaddr++; - continue; - } - - int d = DmaRead(dataaddr++); - - if ((d & 0x80) != 0) - LineRAM[hpos & 0x1ff] = color; - else if (Kangaroo) - LineRAM[hpos & 0x1ff] = 0; - - hpos++; - - if ((d & 0x40) != 0) - LineRAM[hpos & 0x1ff] = color; - else if (Kangaroo) - LineRAM[hpos & 0x1ff] = 0; - - hpos++; - - if ((d & 0x20) != 0) - LineRAM[hpos & 0x1ff] = color; - else if (Kangaroo) - LineRAM[hpos & 0x1ff] = 0; - - hpos++; - - if ((d & 0x10) != 0) - LineRAM[hpos & 0x1ff] = color; - else if (Kangaroo) - LineRAM[hpos & 0x1ff] = 0; - - hpos++; - - if ((d & 0x08) != 0) - LineRAM[hpos & 0x1ff] = color; - else if (Kangaroo) - LineRAM[hpos & 0x1ff] = 0; - - hpos++; - - if ((d & 0x04) != 0) - LineRAM[hpos & 0x1ff] = color; - else if (Kangaroo) - LineRAM[hpos & 0x1ff] = 0; - - hpos++; - - if ((d & 0x02) != 0) - LineRAM[hpos & 0x1ff] = color; - else if (Kangaroo) - LineRAM[hpos & 0x1ff] = 0; - - hpos++; - - if ((d & 0x01) != 0) - LineRAM[hpos & 0x1ff] = color; - else if (Kangaroo) - LineRAM[hpos & 0x1ff] = 0; - - hpos++; - } - } - - void BuildLineRAM320B(ushort graphaddr) - { - var indbytes = (INDMode && CWidth) ? 2 : 1; - var hpos = HPOS << 1; - var dataaddr = (ushort)(graphaddr + (Offset << 8)); - - for (var i = 0; i < Width; i++) - { - if (INDMode) - { - dataaddr = WORD(DmaRead(graphaddr + i), Registers[CHARBASE] + Offset); - } - - for (var j=0; j < indbytes; j++) - { - if (Holey == 0x02 && ((dataaddr & 0x9000) == 0x9000) || Holey == 0x01 && ((dataaddr & 0x8800) == 0x8800)) - { - hpos += 4; - dataaddr++; - continue; - } - - int d = DmaRead(dataaddr++); - - var c = ((d & 0x80) >> 6) | ((d & 0x08) >> 3); - if (c != 0) - { - if ((d & 0xc0) != 0 || Kangaroo) - LineRAM[hpos & 0x1ff] = (byte)(PaletteNo | c); - } - else if (Kangaroo) - LineRAM[hpos & 0x1ff] = 0; - else if ((d & 0xcc) != 0) - LineRAM[hpos & 0x1ff] = 0; - - hpos++; - - c = ((d & 0x40) >> 5) | ((d & 0x04) >> 2); - if (c != 0) - { - if ((d & 0xc0) != 0 || Kangaroo) - LineRAM[hpos & 0x1ff] = (byte)(PaletteNo | c); - } - else if (Kangaroo) - LineRAM[hpos & 0x1ff] = 0; - else if ((d & 0xcc) != 0) - LineRAM[hpos & 0x1ff] = 0; - - hpos++; - - c = ((d & 0x20) >> 4) | ((d & 0x02) >> 1); - if (c != 0) - { - if ((d & 0x30) != 0 || Kangaroo) - LineRAM[hpos & 0x1ff] = (byte)(PaletteNo | c); - } - else if (Kangaroo) - LineRAM[hpos & 0x1ff] = 0; - else if ((d & 0x33) != 0) - LineRAM[hpos & 0x1ff] = 0; - - hpos++; - - c = ((d & 0x10) >> 3) | (d & 0x01); - if (c != 0) - { - if ((d & 0x30) != 0 || Kangaroo) - LineRAM[hpos & 0x1ff] = (byte)(PaletteNo | c); - } - else if (Kangaroo) - LineRAM[hpos & 0x1ff] = 0; - else if ((d & 0x33) != 0) - LineRAM[hpos & 0x1ff] = 0; - - hpos++; - } - } - } - - void BuildLineRAM320C(ushort graphaddr) - { - var hpos = HPOS << 1; - var dataaddr = (ushort)(graphaddr + (Offset << 8)); - - AssertDebug(!CWidth); - - for (var i = 0; i < Width; i++) - { - if (INDMode) - { - dataaddr = WORD(DmaRead(graphaddr + i), Registers[CHARBASE] + Offset); - } - - if (Holey == 0x02 && ((dataaddr & 0x9000) == 0x9000) || Holey == 0x01 && ((dataaddr & 0x8800) == 0x8800)) - { - hpos += 4; - dataaddr++; - continue; - } - - int d = DmaRead(dataaddr++); - - var color = (byte)(((((d & 0x0c) >> 2) | ((PaletteNo >> 2) & 0x04)) << 2) | 2); - - if ((d & 0x80) != 0) - LineRAM[hpos & 0x1ff] = color; - else if (Kangaroo) - LineRAM[hpos & 0x1ff] = 0; - - hpos++; - - if ((d & 0x40) != 0) - LineRAM[hpos & 0x1ff] = color; - else if (Kangaroo) - LineRAM[hpos & 0x1ff] = 0; - - hpos++; - - color = (byte)((((d & 0x03) | ((PaletteNo >> 2) & 0x04)) << 2) | 2); - - if ((d & 0x20) != 0) - LineRAM[hpos & 0x1ff] = color; - else if (Kangaroo) - LineRAM[hpos & 0x1ff] = 0; - - hpos++; - - if ((d & 0x10) != 0) - LineRAM[hpos & 0x1ff] = color; - else if (Kangaroo) - LineRAM[hpos & 0x1ff] = 0; - - hpos++; - } - } - - void BuildLineRAM320D(ushort graphaddr) - { - var indbytes = (INDMode && CWidth) ? 2 : 1; - var hpos = HPOS << 1; - var dataaddr = (ushort)(graphaddr + (Offset << 8)); - - for (var i = 0; i < Width; i++) - { - if (INDMode) - { - dataaddr = WORD(DmaRead(graphaddr + i), Registers[CHARBASE] + Offset); - } - - for (var j=0; j < indbytes; j++) - { - if (Holey == 0x02 && ((dataaddr & 0x9000) == 0x9000) || Holey == 0x01 && ((dataaddr & 0x8800) == 0x8800)) - { - hpos += 8; - dataaddr++; - continue; - } - - int d = DmaRead(dataaddr++); - - var c = ((d & 0x80) >> 6) | (((PaletteNo >> 2) & 2) >> 1); - if (c != 0) - LineRAM[hpos & 0x1ff] = (byte)((PaletteNo & 0x10) | c); - else if (Kangaroo) - LineRAM[hpos & 0x1ff] = 0; - - hpos++; - - c = ((d & 0x40) >> 5) | ((PaletteNo >> 2) & 1); - if (c != 0) - LineRAM[hpos & 0x1ff] = (byte)((PaletteNo & 0x10) | c); - else if (Kangaroo) - LineRAM[hpos & 0x1ff] = 0; - - hpos++; - - c = ((d & 0x20) >> 4) | (((PaletteNo >> 2) & 2) >> 1); - if (c != 0) - LineRAM[hpos & 0x1ff] = (byte)((PaletteNo & 0x10) | c); - else if (Kangaroo) - LineRAM[hpos & 0x1ff] = 0; - - hpos++; - - c = ((d & 0x10) >> 3) | ((PaletteNo >> 2) & 1); - if (c != 0) - LineRAM[hpos & 0x1ff] = (byte)((PaletteNo & 0x10) | c); - else if (Kangaroo) - LineRAM[hpos & 0x1ff] = 0; - - hpos++; - - c = ((d & 0x08) >> 2) | (((PaletteNo >> 2) & 2) >> 1); - if (c != 0) - LineRAM[hpos & 0x1ff] = (byte)((PaletteNo & 0x10) | c); - else if (Kangaroo) - LineRAM[hpos & 0x1ff] = 0; - - hpos++; - - c = ((d & 0x04) >> 1) | ((PaletteNo >> 2) & 1); - if (c != 0) - LineRAM[hpos & 0x1ff] = (byte)((PaletteNo & 0x10) | c); - else if (Kangaroo) - LineRAM[hpos & 0x1ff] = 0; - - hpos++; - - c = (d & 0x02) | (((PaletteNo >> 2) & 2) >> 1); - if (c != 0) - LineRAM[hpos & 0x1ff] = (byte)((PaletteNo & 0x10) | c); - else if (Kangaroo) - LineRAM[hpos & 0x1ff] = 0; - - hpos++; - - c = ((d & 0x01) << 1) | ((PaletteNo >> 2) & 1); - if (c != 0) - LineRAM[hpos & 0x1ff] = (byte)((PaletteNo & 0x10) | c); - else if (Kangaroo) - LineRAM[hpos & 0x1ff] = 0; - - hpos++; - } - } - } - - void OutputLineRAM() - { - var fbi = ((Scanline + 1) * M.FrameBuffer.VisiblePitch) % M.FrameBuffer.VideoBufferByteLength; - - for (int i = 0; i < M.FrameBuffer.VisiblePitch; i++) - { - var colorIndex = LineRAM[i]; - M.FrameBuffer.VideoBuffer[fbi++] = Registers[BACKGRND + ((colorIndex & 3) == 0 ? 0 : colorIndex)]; - if (fbi == M.FrameBuffer.VideoBufferByteLength) - fbi = 0; - } - - for (var i = 0; i < LineRAM.Length; i++) - { - LineRAM[i] = 0; - } - } - - #endregion - - #region Maria Peek - - byte peek(ushort addr) - { - addr &= 0x3f; - var mi = M.InputState; - - switch(addr) - { - case MSTAT: - var sl = Scanline; - return (sl < FirstVisibleScanline || sl >= LastVisibleScanline) - ? (byte)0x80 // VBLANK ON - : (byte)0; // VBLANK OFF - case INPT0: return mi.SampleCapturedControllerActionState(0, ControllerAction.Trigger) ? (byte)0x80 : (byte)0; // player1,button R - case INPT1: return mi.SampleCapturedControllerActionState(0, ControllerAction.Trigger2) ? (byte)0x80 : (byte)0; // player1,button L - case INPT2: return mi.SampleCapturedControllerActionState(1, ControllerAction.Trigger) ? (byte)0x80 : (byte)0; // player2,button R - case INPT3: return mi.SampleCapturedControllerActionState(1, ControllerAction.Trigger2) ? (byte)0x80 : (byte)0; // player2,button L - case INPT4: return SampleINPTLatched(4) ? (byte)0 : (byte)0x80; // player1,button L/R - case INPT5: return SampleINPTLatched(5) ? (byte)0 : (byte)0x80; // player2,button L/R - default: - LogDebug("Maria: Unhandled peek at ${0:x4}, PC=${1:x4}", addr, M.CPU.PC); - var retval = Registers[addr]; - return retval; - } - } - - #endregion - - #region Maria Poke - - void poke(ushort addr, byte data) - { - addr &= 0x3f; - - switch (addr) - { - // INPUT PORT CONTROL - // Only the first four bits of INPTCTRL are used: - // D0: lock mode (after this bit has been set high, no more mode changes can be done until the console is turned off) - // D1: 0=disable MARIA (only RIOT RAM is available); 1=enable MARIA (also enables system RAM) - // D2: 0=enable BIOS at $8000-$FFFF (actually NTSC only uses 4KB and PAL uses 16KB); 1=disable BIOS and enable cartridge - // D3: 0=disable TIA video pull-ups (video output is MARIA instead of TIA); 1=enable TIA video pull-ups (video output is TIA instead of MARIA) - // - case INPTCTRL: - if (CtrlLock) - { - Log("Maria: INPTCTRL: LOCKED: Ignoring: ${0:x2}, PC=${1:x4}", data, M.CPU.PC); - break; - } - - CtrlLock = (data & (1 << 0)) != 0; - var mariaEnable = (data & (1 << 1)) != 0; - var biosDisable = (data & (1 << 2)) != 0; - var tiaopEnable = (data & (1 << 3)) != 0; - - Log("Maria: INPTCTRL: ${0:x2}, PC=${1:x4}, lockMode={2}, mariaEnable={3} biosDisable={4} tiaOutput={5}", - data, M.CPU.PC, CtrlLock, mariaEnable, biosDisable, tiaopEnable); - - if (biosDisable) - { - M.SwapOutBIOS(); - } - else - { - M.SwapInBIOS(); - } - break; - case WSYNC: - // Request a CPU preemption to service the delay request - M.CPU.EmulatorPreemptRequest = true; - break; - case CTRL: - ColorKill = (data & 0x80) != 0; - DMAEnabled = (data & 0x60) == 0x40; - CWidth = (data & 0x10) != 0; - BCntl = (data & 0x08) != 0; - Kangaroo = (data & 0x04) != 0; - RM = (byte)(data & 0x03); - break; - case MSTAT: - break; - case CHARBASE: - case DPPH: - case DPPL: - Registers[addr] = data; - break; - case BACKGRND: - case P0C1: - case P0C2: - case P0C3: - case P1C1: - case P1C2: - case P1C3: - case P2C1: - case P2C2: - case P2C3: - case P3C1: - case P3C2: - case P3C3: - case P4C1: - case P4C2: - case P4C3: - case P5C1: - case P5C2: - case P5C3: - case P6C1: - case P6C2: - case P6C3: - case P7C1: - case P7C2: - case P7C3: - Registers[addr] = data; - break; - case AUDC0: - case AUDC1: - case AUDF0: - case AUDF1: - case AUDV0: - case AUDV1: - TIASound.Update(addr, data); - break; - case OFFSET: - Log("Maria: OFFSET: ROM wrote ${0:x2}, PC=${1:x4} (reserved for future expansion)", data, M.CPU.PC); - break; - default: - Registers[addr] = data; - LogDebug("Maria: Unhandled poke:${0:x4} w/${1:x2}, PC=${2:x4}", addr, data, M.CPU.PC); - break; - } - } - - #endregion - - #region Input Helpers - - bool SampleINPTLatched(int inpt) - { - var mi = M.InputState; - var playerNo = inpt - 4; - - switch (playerNo == 0 ? mi.LeftControllerJack : mi.RightControllerJack) - { - case Controller.Joystick: - return mi.SampleCapturedControllerActionState(playerNo, ControllerAction.Trigger); - case Controller.ProLineJoystick: - var portbline = 4 << (playerNo << 1); - if ((M.PIA.DDRB & portbline) != 0 && (M.PIA.WrittenPortB & portbline) == 0) - return false; - return mi.SampleCapturedControllerActionState(playerNo, ControllerAction.Trigger) - || mi.SampleCapturedControllerActionState(playerNo, ControllerAction.Trigger2); - case Controller.Lightgun: - - // This is one area where always running fixed at the faster CPU frequency creates emulation challenges. - // Fortunately since lightgun sampling is a dedicated activity on a frame, the job of compensating is tractable. - - // Track the number of samples this frame, the time of the first sample, and capture the lightgun location. - if (_lightgunFirstSampleCpuClock == 0) - { - _lightgunFirstSampleCpuClock = M.CPU.Clock; - _lightgunFrameSamples = 0; - mi.SampleCapturedLightGunPosition(playerNo, out _lightgunSampledScanline, out _lightgunSampledVisibleHpos); - } - _lightgunFrameSamples++; - - // Magic Adjustment Factor - // Seems sufficient to account for the timing impact of successive lightrun reads (i.e., 'slow' memory accesses.) - // Obtained through through trial-and-error. - const float magicAdjustmentFactor = 2.135f; - - var firstLightgunSampleMariaFrameClock = (int)((_lightgunFirstSampleCpuClock - _startOfFrameCpuClock) << 2); - var mariaClocksSinceFirstLightgunSample = (int)((M.CPU.Clock - _lightgunFirstSampleCpuClock) << 2); - var adjustmentMariaClocks = (int)Math.Round(_lightgunFrameSamples * magicAdjustmentFactor); - var actualMariaFrameClock = firstLightgunSampleMariaFrameClock + mariaClocksSinceFirstLightgunSample + adjustmentMariaClocks; - var actualScanline = actualMariaFrameClock / 456; - var actualHpos = actualMariaFrameClock % 456; - - // Lightgun sampling looks intended to begin at the start of the scanline. - // Compensate with another magic constant since we're always off by a fixed amount. - actualHpos -= 62; - if (actualHpos < 0) - { - actualHpos += 456; - actualScanline--; - } - - var sampledScanline = _lightgunSampledScanline; - var sampledVisibleHpos = _lightgunSampledVisibleHpos; - - // Seems reasonable the gun sees more than a single pixel (more like a circle or oval) and triggers sooner accordingly. - // These adjustments were obtained through trial-and-error. - if (_isPal) - { - sampledScanline -= 19; - } - else - { - sampledScanline -= 16; - sampledVisibleHpos += 4; - } - return (actualScanline >= sampledScanline) && (actualHpos >= (sampledVisibleHpos + 136 /* HBLANK clocks */)); - } - return false; - } - - #endregion - - #region Serialization Members - - public Maria(DeserializationContext input, Machine7800 m, int scanlines) - { - if (input == null) - throw new ArgumentNullException("input"); - if (m == null) - throw new ArgumentNullException("m"); - - M = m; - InitializeVisibleScanlineValues(scanlines); - TIASound = new TIASound(input, M, CPU_TICKS_PER_AUDIO_SAMPLE); - - var version = input.CheckVersion(1, 2); - LineRAM = input.ReadExpectedBytes(512); - if (version == 1) - { - // formerly persisted values, MariaPalette[8,4] - for (var i = 0; i < 32; i++) - input.ReadByte(); - } - Registers = input.ReadExpectedBytes(0x40); - if (version == 1) - { - // formerly persisted value, Scanline - input.ReadInt32(); - } - switch (version) - { - case 1: - WM = (input.ReadByte() != 0); - break; - case 2: - WM = input.ReadBoolean(); - break; - } - DLL = input.ReadUInt16(); - DL = input.ReadUInt16(); - Offset = input.ReadInt32(); - Holey = input.ReadInt32(); - Width = input.ReadInt32(); - HPOS = input.ReadByte(); - PaletteNo = input.ReadByte(); - INDMode = input.ReadBoolean(); - if (version == 1) - { - // formerly persisted value (DLI) - input.ReadBoolean(); - } - CtrlLock = input.ReadBoolean(); - if (version == 1) - { - // formerly persisted value (VBLANK) - input.ReadByte(); - } - DMAEnabled = input.ReadBoolean(); - if (version == 1) - { - // formerly persisted value (DMAOn) - input.ReadBoolean(); - } - ColorKill = input.ReadBoolean(); - CWidth = input.ReadBoolean(); - BCntl = input.ReadBoolean(); - Kangaroo = input.ReadBoolean(); - RM = input.ReadByte(); - } - - public void GetObjectData(SerializationContext output) - { - if (output == null) - throw new ArgumentNullException("output"); - - output.Write(TIASound); - - output.WriteVersion(2); - output.Write(LineRAM); - output.Write(Registers); - output.Write(WM); - output.Write(DLL); - output.Write(DL); - output.Write(Offset); - output.Write(Holey); - output.Write(Width); - output.Write(HPOS); - output.Write((byte)PaletteNo); - output.Write(INDMode); - output.Write(CtrlLock); - output.Write(DMAEnabled); - output.Write(ColorKill); - output.Write(CWidth); - output.Write(BCntl); - output.Write(Kangaroo); - output.Write(RM); - } - - #endregion - - #region Helpers - - void ConsumeNextDLLEntry() - { - // Display List List (DLL) entry - var dll0 = DmaRead(DLL++); // DLI, Holey, Offset - var dll1 = DmaRead(DLL++); // High DL address - var dll2 = DmaRead(DLL++); // Low DL address - - var dli = (dll0 & 0x80) != 0; - Holey = (dll0 & 0x60) >> 5; - Offset = dll0 & 0x0f; - - // Update current Display List (DL) - DL = WORD(dll2, dll1); - - if (dli) - { - M.CPU.NMIInterruptRequest = true; - - // DMA TIMING: One tick between DMA Shutdown and DLI - _dmaClocks += 1; - } - } - - void InitializeVisibleScanlineValues(int scanlines) - { - switch (scanlines) - { - case 262: // NTSC - FirstVisibleScanline = 11; - LastVisibleScanline = FirstVisibleScanline + 242; - _isPal = false; - break; - case 312: // PAL - FirstVisibleScanline = 11; - LastVisibleScanline = FirstVisibleScanline + 292; - _isPal = true; - break; - default: - throw new ArgumentException("scanlines must be 262 or 312."); - } - } - - void Log(string format, params object[] args) - { - if (M == null || M.Logger == null) - return; - M.Logger.WriteLine(format, args); - } - - // convenience overload - static ushort WORD(int lsb, int msb) - { - return WORD((byte)lsb, (byte)msb); - } - - static ushort WORD(byte lsb, byte msb) - { - return (ushort)(lsb | msb << 8); - } - - // convenience overload - byte DmaRead(int addr) - { - return DmaRead((ushort)addr); - } - - byte DmaRead(ushort addr) - { -#if DEBUG - if (addr < 0x1800) - LogDebug("Maria: Questionable DMA read at ${0:x4} by PC=${1:x4}", addr, M.CPU.PC); -#endif - return M.Mem[addr]; - } - - [System.Diagnostics.Conditional("DEBUG")] - void LogDebug(string format, params object[] args) - { - if (M == null || M.Logger == null) - return; - M.Logger.WriteLine(format, args); - } - - [System.Diagnostics.Conditional("DEBUG")] - void AssertDebug(bool cond) - { - if (!cond) - System.Diagnostics.Debugger.Break(); - } - - #endregion - } -} From 85c923e883c3c73a6af0cdc15156301c9e65defb Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:37:07 -0400 Subject: [PATCH 62/82] Delete MariaTables.cs --- EMU7800/Core/MariaTables.cs | 180 ------------------------------------ 1 file changed, 180 deletions(-) delete mode 100644 EMU7800/Core/MariaTables.cs diff --git a/EMU7800/Core/MariaTables.cs b/EMU7800/Core/MariaTables.cs deleted file mode 100644 index aa8745ee641..00000000000 --- a/EMU7800/Core/MariaTables.cs +++ /dev/null @@ -1,180 +0,0 @@ -/* - * MariaTables.cs - * - * Palette tables for the Maria class. - * All derived from Dan Boris' 7800/MAME code. - * - * Copyright � 2004 Mike Murphy - * - */ -namespace EMU7800.Core -{ - public static class MariaTables - { - public static readonly int[] NTSCPalette = - { - 0x000000, 0x1c1c1c, 0x393939, 0x595959, // Grey - 0x797979, 0x929292, 0xababab, 0xbcbcbc, - 0xcdcdcd, 0xd9d9d9, 0xe6e6e6, 0xececec, - 0xf2f2f2, 0xf8f8f8, 0xffffff, 0xffffff, - - 0x391701, 0x5e2304, 0x833008, 0xa54716, // Gold - 0xc85f24, 0xe37820, 0xff911d, 0xffab1d, - 0xffc51d, 0xffce34, 0xffd84c, 0xffe651, - 0xfff456, 0xfff977, 0xffff98, 0xffff98, - - 0x451904, 0x721e11, 0x9f241e, 0xb33a20, // Orange - 0xc85122, 0xe36920, 0xff811e, 0xff8c25, - 0xff982c, 0xffae38, 0xffc545, 0xffc559, - 0xffc66d, 0xffd587, 0xffe4a1, 0xffe4a1, - - 0x4a1704, 0x7e1a0d, 0xb21d17, 0xc82119, // Red Orange - 0xdf251c, 0xec3b38, 0xfa5255, 0xfc6161, - 0xff706e, 0xff7f7e, 0xff8f8f, 0xff9d9e, - 0xffabad, 0xffb9bd, 0xffc7ce, 0xffc7ce, - - 0x050568, 0x3b136d, 0x712272, 0x8b2a8c, // Pink - 0xa532a6, 0xb938ba, 0xcd3ecf, 0xdb47dd, - 0xea51eb, 0xf45ff5, 0xfe6dff, 0xfe7afd, - 0xff87fb, 0xff95fd, 0xffa4ff, 0xffa4ff, - - 0x280479, 0x400984, 0x590f90, 0x70249d, // Purple - 0x8839aa, 0xa441c3, 0xc04adc, 0xd054ed, - 0xe05eff, 0xe96dff, 0xf27cff, 0xf88aff, - 0xff98ff, 0xfea1ff, 0xfeabff, 0xfeabff, - - 0x35088a, 0x420aad, 0x500cd0, 0x6428d0, // Purple Blue - 0x7945d0, 0x8d4bd4, 0xa251d9, 0xb058ec, - 0xbe60ff, 0xc56bff, 0xcc77ff, 0xd183ff, - 0xd790ff, 0xdb9dff, 0xdfaaff, 0xdfaaff, - - 0x051e81, 0x0626a5, 0x082fca, 0x263dd4, // Blue1 - 0x444cde, 0x4f5aee, 0x5a68ff, 0x6575ff, - 0x7183ff, 0x8091ff, 0x90a0ff, 0x97a9ff, - 0x9fb2ff, 0xafbeff, 0xc0cbff, 0xc0cbff, - - 0x0c048b, 0x2218a0, 0x382db5, 0x483ec7, // Blue2 - 0x584fda, 0x6159ec, 0x6b64ff, 0x7a74ff, - 0x8a84ff, 0x918eff, 0x9998ff, 0xa5a3ff, - 0xb1aeff, 0xb8b8ff, 0xc0c2ff, 0xc0c2ff, - - 0x1d295a, 0x1d3876, 0x1d4892, 0x1c5cac, // Light Blue - 0x1c71c6, 0x3286cf, 0x489bd9, 0x4ea8ec, - 0x55b6ff, 0x70c7ff, 0x8cd8ff, 0x93dbff, - 0x9bdfff, 0xafe4ff, 0xc3e9ff, 0xc3e9ff, - - 0x2f4302, 0x395202, 0x446103, 0x417a12, // Turquoise - 0x3e9421, 0x4a9f2e, 0x57ab3b, 0x5cbd55, - 0x61d070, 0x69e27a, 0x72f584, 0x7cfa8d, - 0x87ff97, 0x9affa6, 0xadffb6, 0xadffb6, - - 0x0a4108, 0x0d540a, 0x10680d, 0x137d0f, // Green Blue - 0x169212, 0x19a514, 0x1cb917, 0x1ec919, - 0x21d91b, 0x47e42d, 0x6ef040, 0x78f74d, - 0x83ff5b, 0x9aff7a, 0xb2ff9a, 0xb2ff9a, - - 0x04410b, 0x05530e, 0x066611, 0x077714, // Green - 0x088817, 0x099b1a, 0x0baf1d, 0x48c41f, - 0x86d922, 0x8fe924, 0x99f927, 0xa8fc41, - 0xb7ff5b, 0xc9ff6e, 0xdcff81, 0xdcff81, - - 0x02350f, 0x073f15, 0x0c4a1c, 0x2d5f1e, // Yellow Green - 0x4f7420, 0x598324, 0x649228, 0x82a12e, - 0xa1b034, 0xa9c13a, 0xb2d241, 0xc4d945, - 0xd6e149, 0xe4f04e, 0xf2ff53, 0xf2ff53, - - 0x263001, 0x243803, 0x234005, 0x51541b, // Orange Green - 0x806931, 0x978135, 0xaf993a, 0xc2a73e, - 0xd5b543, 0xdbc03d, 0xe1cb38, 0xe2d836, - 0xe3e534, 0xeff258, 0xfbff7d, 0xfbff7d, - - 0x401a02, 0x581f05, 0x702408, 0x8d3a13, // Light Orange - 0xab511f, 0xb56427, 0xbf7730, 0xd0853a, - 0xe19344, 0xeda04e, 0xf9ad58, 0xfcb75c, - 0xffc160, 0xffc671, 0xffcb83, 0xffcb83 - }; - - public static readonly int[] PALPalette = - { - 0x000000, 0x1c1c1c, 0x393939, 0x595959, // Grey - 0x797979, 0x929292, 0xababab, 0xbcbcbc, - 0xcdcdcd, 0xd9d9d9, 0xe6e6e6, 0xececec, - 0xf2f2f2, 0xf8f8f8, 0xffffff, 0xffffff, - - 0x263001, 0x243803, 0x234005, 0x51541b, // Orange Green - 0x806931, 0x978135, 0xaf993a, 0xc2a73e, - 0xd5b543, 0xdbc03d, 0xe1cb38, 0xe2d836, - 0xe3e534, 0xeff258, 0xfbff7d, 0xfbff7d, - - 0x263001, 0x243803, 0x234005, 0x51541b, // Orange Green - 0x806931, 0x978135, 0xaf993a, 0xc2a73e, - 0xd5b543, 0xdbc03d, 0xe1cb38, 0xe2d836, - 0xe3e534, 0xeff258, 0xfbff7d, 0xfbff7d, - - 0x401a02, 0x581f05, 0x702408, 0x8d3a13, // Light Orange - 0xab511f, 0xb56427, 0xbf7730, 0xd0853a, - 0xe19344, 0xeda04e, 0xf9ad58, 0xfcb75c, - 0xffc160, 0xffc671, 0xffcb83, 0xffcb83, - - 0x391701, 0x5e2304, 0x833008, 0xa54716, // Gold - 0xc85f24, 0xe37820, 0xff911d, 0xffab1d, - 0xffc51d, 0xffce34, 0xffd84c, 0xffe651, - 0xfff456, 0xfff977, 0xffff98, 0xffff98, - - 0x451904, 0x721e11, 0x9f241e, 0xb33a20, // Orange - 0xc85122, 0xe36920, 0xff811e, 0xff8c25, - 0xff982c, 0xffae38, 0xffc545, 0xffc559, - 0xffc66d, 0xffd587, 0xffe4a1, 0xffe4a1, - - 0x4a1704, 0x7e1a0d, 0xb21d17, 0xc82119, // Red Orange - 0xdf251c, 0xec3b38, 0xfa5255, 0xfc6161, - 0xff706e, 0xff7f7e, 0xff8f8f, 0xff9d9e, - 0xffabad, 0xffb9bd, 0xffc7ce, 0xffc7ce, - - 0x050568, 0x3b136d, 0x712272, 0x8b2a8c, // Pink - 0xa532a6, 0xb938ba, 0xcd3ecf, 0xdb47dd, - 0xea51eb, 0xf45ff5, 0xfe6dff, 0xfe7afd, - 0xff87fb, 0xff95fd, 0xffa4ff, 0xffa4ff, - - 0x280479, 0x400984, 0x590f90, 0x70249d, // Purple - 0x8839aa, 0xa441c3, 0xc04adc, 0xd054ed, - 0xe05eff, 0xe96dff, 0xf27cff, 0xf88aff, - 0xff98ff, 0xfea1ff, 0xfeabff, 0xfeabff, - - 0x051e81, 0x0626a5, 0x082fca, 0x263dd4, // Blue1 - 0x444cde, 0x4f5aee, 0x5a68ff, 0x6575ff, - 0x7183ff, 0x8091ff, 0x90a0ff, 0x97a9ff, - 0x9fb2ff, 0xafbeff, 0xc0cbff, 0xc0cbff, - - 0x0c048b, 0x2218a0, 0x382db5, 0x483ec7, // Blue2 - 0x584fda, 0x6159ec, 0x6b64ff, 0x7a74ff, - 0x8a84ff, 0x918eff, 0x9998ff, 0xa5a3ff, - 0xb1aeff, 0xb8b8ff, 0xc0c2ff, 0xc0c2ff, - - 0x1d295a, 0x1d3876, 0x1d4892, 0x1c5cac, // Light Blue - 0x1c71c6, 0x3286cf, 0x489bd9, 0x4ea8ec, - 0x55b6ff, 0x70c7ff, 0x8cd8ff, 0x93dbff, - 0x9bdfff, 0xafe4ff, 0xc3e9ff, 0xc3e9ff, - - 0x2f4302, 0x395202, 0x446103, 0x417a12, // Turquoise - 0x3e9421, 0x4a9f2e, 0x57ab3b, 0x5cbd55, - 0x61d070, 0x69e27a, 0x72f584, 0x7cfa8d, - 0x87ff97, 0x9affa6, 0xadffb6, 0xadffb6, - - 0x0a4108, 0x0d540a, 0x10680d, 0x137d0f, // Green Blue - 0x169212, 0x19a514, 0x1cb917, 0x1ec919, - 0x21d91b, 0x47e42d, 0x6ef040, 0x78f74d, - 0x83ff5b, 0x9aff7a, 0xb2ff9a, 0xb2ff9a, - - 0x04410b, 0x05530e, 0x066611, 0x077714, // Green - 0x088817, 0x099b1a, 0x0baf1d, 0x48c41f, - 0x86d922, 0x8fe924, 0x99f927, 0xa8fc41, - 0xb7ff5b, 0xc9ff6e, 0xdcff81, 0xdcff81, - - 0x02350f, 0x073f15, 0x0c4a1c, 0x2d5f1e, // Yellow Green - 0x4f7420, 0x598324, 0x649228, 0x82a12e, - 0xa1b034, 0xa9c13a, 0xb2d241, 0xc4d945, - 0xd6e149, 0xe4f04e, 0xf2ff53, 0xf2ff53 - }; - } -} From d25b4e78b0208dfba2b7c280f9b1acdfe3cc12a3 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:37:13 -0400 Subject: [PATCH 63/82] Delete NullDevice.cs --- EMU7800/Core/NullDevice.cs | 78 -------------------------------------- 1 file changed, 78 deletions(-) delete mode 100644 EMU7800/Core/NullDevice.cs diff --git a/EMU7800/Core/NullDevice.cs b/EMU7800/Core/NullDevice.cs deleted file mode 100644 index d0c691543db..00000000000 --- a/EMU7800/Core/NullDevice.cs +++ /dev/null @@ -1,78 +0,0 @@ -/* - * NullDevice.cs - * - * Default memory mappable device. - * - * Copyright � 2003, 2004 Mike Murphy - * - */ -using System; - -namespace EMU7800.Core -{ - public sealed class NullDevice : IDevice - { - MachineBase M { get; set; } - - #region IDevice Members - - public void Reset() - { - Log("{0} reset", this); - } - - public byte this[ushort addr] - { - get - { - LogDebug("NullDevice: Peek at ${0:x4}, PC=${1:x4}", addr, M.CPU.PC); - return 0; - } - set - { - LogDebug("NullDevice: Poke at ${0:x4},${1:x2}, PC=${2:x4}", addr, value, M.CPU.PC); - } - } - - #endregion - - public override String ToString() - { - return "NullDevice"; - } - - #region Constructors - - private NullDevice() - { - } - - public NullDevice(MachineBase m) - { - if (m == null) - throw new ArgumentNullException("m"); - M = m; - } - - #endregion - - #region Helpers - - void Log(string format, params object[] args) - { - if (M == null || M.Logger == null) - return; - M.Logger.WriteLine(format, args); - } - - [System.Diagnostics.Conditional("DEBUG")] - void LogDebug(string format, params object[] args) - { - if (M == null || M.Logger == null) - return; - M.Logger.WriteLine(format, args); - } - - #endregion - } -} \ No newline at end of file From e7c45e191248e67430d7f18cdec8aa730bf9643e Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:37:20 -0400 Subject: [PATCH 64/82] Delete NullLogger.cs --- EMU7800/Core/NullLogger.cs | 21 --------------------- 1 file changed, 21 deletions(-) delete mode 100644 EMU7800/Core/NullLogger.cs diff --git a/EMU7800/Core/NullLogger.cs b/EMU7800/Core/NullLogger.cs deleted file mode 100644 index 1604d3b883f..00000000000 --- a/EMU7800/Core/NullLogger.cs +++ /dev/null @@ -1,21 +0,0 @@ -namespace EMU7800.Core -{ - public class NullLogger : ILogger - { - public void WriteLine(string format, params object[] args) - { - } - - public void WriteLine(object value) - { - } - - public void Write(string format, params object[] args) - { - } - - public void Write(object value) - { - } - } -} From 15e59a000d6c7c4a8a152fcf7eebb377076649c0 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:37:28 -0400 Subject: [PATCH 65/82] Delete PIA.cs --- EMU7800/Core/PIA.cs | 348 -------------------------------------------- 1 file changed, 348 deletions(-) delete mode 100644 EMU7800/Core/PIA.cs diff --git a/EMU7800/Core/PIA.cs b/EMU7800/Core/PIA.cs deleted file mode 100644 index 1da65519db3..00000000000 --- a/EMU7800/Core/PIA.cs +++ /dev/null @@ -1,348 +0,0 @@ -/* - * PIA.cs - * - * The Peripheral Interface Adapter (6532) device. - * a.k.a. RIOT (RAM I/O Timer?) - * - * Copyright � 2003, 2004, 2012 Mike Murphy - * - */ -using System; - -namespace EMU7800.Core -{ - public sealed class PIA : IDevice - { - readonly MachineBase M; - - readonly byte[] RAM = new byte[0x80]; - - ulong TimerTarget; - int TimerShift; - bool IRQEnabled, IRQTriggered; - - public byte DDRA { get; private set; } - public byte DDRB { get; private set; } - - public byte WrittenPortA { get; private set; } - public byte WrittenPortB { get; private set; } - - #region IDevice Members - - public void Reset() - { - // Some games will loop/hang on $0284 if these are initialized to zero - TimerShift = 10; - TimerTarget = M.CPU.Clock + (ulong)(0xff << TimerShift); - - IRQEnabled = false; - IRQTriggered = false; - - DDRA = 0; - - Log("{0} reset", this); - } - - public byte this[ushort addr] - { - get { return peek(addr); } - set { poke(addr, value); } - } - - #endregion - - public override string ToString() - { - return "PIA/RIOT M6532"; - } - - #region Constructors - - private PIA() - { - } - - public PIA(MachineBase m) - { - if (m == null) - throw new ArgumentNullException("m"); - M = m; - } - - #endregion - - byte peek(ushort addr) - { - if ((addr & 0x200) == 0) - { - return RAM[addr & 0x7f]; - } - - switch ((byte)(addr & 7)) - { - case 0: // SWCHA: Controllers - return ReadPortA(); - case 1: // SWCHA DDR: 0=input, 1=output - return DDRA; - case 2: // SWCHB: Console switches (on 7800, PB2 & PB4 are used) - return ReadPortB(); - case 3: // SWCHB DDR: 0=input, 1=output - return 0; - case 4: // INTIM - case 6: - return ReadTimerRegister(); - case 5: // INTFLG - case 7: - return ReadInterruptFlag(); - default: - LogDebug("PIA: Unhandled peek ${0:x4}, PC=${1:x4}", addr, M.CPU.PC); - return 0; - } - } - - void poke(ushort addr, byte data) - { - if ((addr & 0x200) == 0) - { - RAM[addr & 0x7f] = data; - return; - } - - // A2 Distinguishes I/O registers from the Timer - if ((addr & 0x04) != 0) - { - if ((addr & 0x10) != 0) - { - IRQEnabled = (addr & 0x08) != 0; - SetTimerRegister(data, addr & 3); - } - else - { - LogDebug("PIA: Timer: Unhandled poke ${0:x4} w/${1:x2}, PC=${2:x4}", addr, data, M.CPU.PC); - } - } - else - { - switch ((byte)(addr & 3)) - { - case 0: // SWCHA: Port A - WritePortA(data); - break; - case 1: // SWACNT: Port A DDR - DDRA = data; - break; - case 2: // SWCHB: Port B - WritePortB(data); - break; - case 3: // SWBCNT: Port B DDR - DDRB = data; - break; - } - } - } - - // 0: TIM1T: set 1 clock interval ( 838 nsec/interval) - // 1: TIM8T: set 8 clock interval ( 6.7 usec/interval) - // 2: TIM64T: set 64 clock interval ( 53.6 usec/interval) - // 3: T1024T: set 1024 clock interval (858.2 usec/interval) - void SetTimerRegister(byte data, int interval) - { - IRQTriggered = false; - TimerShift = new[] { 0, 3, 6, 10 }[interval]; - TimerTarget = M.CPU.Clock + (ulong)(data << TimerShift); - } - - byte ReadTimerRegister() - { - IRQTriggered = false; - var delta = (int)(TimerTarget - M.CPU.Clock); - if (delta >= 0) - { - return (byte)(delta >> TimerShift); - } - if (delta != -1) - { - IRQTriggered = true; - } - return (byte)(delta >= -256 ? delta : 0); - } - - byte ReadInterruptFlag() - { - var delta = (int)(TimerTarget - M.CPU.Clock); - return (byte)((delta >= 0 || IRQEnabled && IRQTriggered) ? 0x00 : 0x80); - } - - // PortA: Controller Jacks - // - // Left Jack Right Jack - // ------------- ------------- - // \ 1 2 3 4 5 / \ 1 2 3 4 5 / - // \ 6 7 8 9 / \ 6 7 8 9 / - // --------- --------- - // - // pin 1 D4 PIA SWCHA D0 PIA SWCHA - // pin 2 D5 PIA SWCHA D1 PIA SWCHA - // pin 3 D6 PIA SWCHA D2 PIA SWCHA - // pin 4 D7 PIA SWCHA D3 PIA SWCHA - // pin 5 D7 TIA INPT1 (Dumped) D7 TIA INPT3 (Dumped) 7800: Right Fire - // pin 6 D7 TIA INPT4 (Latched) D7 TIA INPT5 (Latched) 2600: Fire - // pin 7 +5 +5 - // pin 8 GND GND - // pin 9 D7 TIA INPT0 (Dumped) D7 TIA INPT2 (Dumped) 7800: Left Fire - // - byte ReadPortA() - { - var porta = 0; - var mi = M.InputState; - - switch (mi.LeftControllerJack) - { - case Controller.Joystick: - case Controller.ProLineJoystick: - case Controller.BoosterGrip: - porta |= mi.SampleCapturedControllerActionState(0, ControllerAction.Up) ? 0 : (1 << 4); - porta |= mi.SampleCapturedControllerActionState(0, ControllerAction.Down) ? 0 : (1 << 5); - porta |= mi.SampleCapturedControllerActionState(0, ControllerAction.Left) ? 0 : (1 << 6); - porta |= mi.SampleCapturedControllerActionState(0, ControllerAction.Right) ? 0 : (1 << 7); - break; - case Controller.Driving: - porta |= mi.SampleCapturedDrivingState(0) << 4; - break; - case Controller.Paddles: - porta |= mi.SampleCapturedControllerActionState(0, ControllerAction.Trigger) ? 0 : (1 << 7); - porta |= mi.SampleCapturedControllerActionState(1, ControllerAction.Trigger) ? 0 : (1 << 6); - break; - case Controller.Lightgun: - porta |= mi.SampleCapturedControllerActionState(0, ControllerAction.Trigger) ? (1 << 4) : 0; - break; - } - - switch (mi.RightControllerJack) - { - case Controller.Joystick: - case Controller.ProLineJoystick: - case Controller.BoosterGrip: - porta |= mi.SampleCapturedControllerActionState(1, ControllerAction.Up) ? 0 : (1 << 0); - porta |= mi.SampleCapturedControllerActionState(1, ControllerAction.Down) ? 0 : (1 << 1); - porta |= mi.SampleCapturedControllerActionState(1, ControllerAction.Left) ? 0 : (1 << 2); - porta |= mi.SampleCapturedControllerActionState(1, ControllerAction.Right) ? 0 : (1 << 3); - break; - case Controller.Driving: - porta |= mi.SampleCapturedDrivingState(1); - break; - case Controller.Paddles: - porta |= mi.SampleCapturedControllerActionState(2, ControllerAction.Trigger) ? 0 : (1 << 3); - porta |= mi.SampleCapturedControllerActionState(3, ControllerAction.Trigger) ? 0 : (1 << 2); - break; - case Controller.Lightgun: - porta |= mi.SampleCapturedControllerActionState(1, ControllerAction.Trigger) ? (1 << 0) : 0; - break; - } - - return (byte)porta; - } - - void WritePortA(byte porta) - { - WrittenPortA = (byte)((porta & DDRA) | (WrittenPortA & (~DDRA))); - } - - void WritePortB(byte portb) - { - WrittenPortB = (byte)((portb & DDRB) | (WrittenPortB & (~DDRB))); - } - - // PortB: Console Switches - // - // D0 Game Reset 0=on - // D1 Game Select 0=on - // D2 (used on 7800) - // D3 Console Color 1=Color, 0=B/W - // D4 (used on 7800) - // D5 (unused) - // D6 Left Difficulty A 1=A (pro), 0=B (novice) - // D7 Right Difficulty A 1=A (pro), 0=B (novice) - // - byte ReadPortB() - { - var portb = 0; - var mi = M.InputState; - - portb |= mi.SampleCapturedConsoleSwitchState(ConsoleSwitch.GameReset) ? 0 : (1 << 0); - portb |= mi.SampleCapturedConsoleSwitchState(ConsoleSwitch.GameSelect) ? 0 : (1 << 1); - portb |= mi.SampleCapturedConsoleSwitchState(ConsoleSwitch.GameBW) ? 0 : (1 << 3); - portb |= mi.SampleCapturedConsoleSwitchState(ConsoleSwitch.LeftDifficultyA) ? (1 << 6) : 0; - portb |= mi.SampleCapturedConsoleSwitchState(ConsoleSwitch.RightDifficultyA) ? (1 << 7) : 0; - - return (byte)portb; - } - - #region Serialization Members - - public PIA(DeserializationContext input, MachineBase m) : this(m) - { - if (input == null) - throw new ArgumentNullException("input"); - - var version = input.CheckVersion(1, 2); - RAM = input.ReadExpectedBytes(0x80); - TimerTarget = input.ReadUInt64(); - TimerShift = input.ReadInt32(); - IRQEnabled = input.ReadBoolean(); - IRQTriggered = input.ReadBoolean(); - DDRA = input.ReadByte(); - WrittenPortA = input.ReadByte(); - if (version > 1) - { - DDRB = input.ReadByte(); - WrittenPortB = input.ReadByte(); - } - } - - public void GetObjectData(SerializationContext output) - { - if (output == null) - throw new ArgumentNullException("output"); - - output.WriteVersion(2); - output.Write(RAM); - output.Write(TimerTarget); - output.Write(TimerShift); - output.Write(IRQEnabled); - output.Write(IRQTriggered); - output.Write(DDRA); - output.Write(WrittenPortA); - output.Write(DDRB); - output.Write(WrittenPortB); - } - - #endregion - - #region Helpers - - void Log(string format, params object[] args) - { - if (M == null || M.Logger == null) - return; - M.Logger.WriteLine(format, args); - } - - [System.Diagnostics.Conditional("DEBUG")] - void LogDebug(string format, params object[] args) - { - if (M == null || M.Logger == null) - return; - M.Logger.WriteLine(format, args); - } - - [System.Diagnostics.Conditional("DEBUG")] - void AssertDebug(bool cond) - { - if (!cond) - System.Diagnostics.Debugger.Break(); - } - - #endregion - } -} \ No newline at end of file From 21ee6f8ccf72ee00a8493b65f8f5b70e9c88fbd1 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:37:36 -0400 Subject: [PATCH 66/82] Delete PokeySound.cs --- EMU7800/Core/PokeySound.cs | 437 ------------------------------------- 1 file changed, 437 deletions(-) delete mode 100644 EMU7800/Core/PokeySound.cs diff --git a/EMU7800/Core/PokeySound.cs b/EMU7800/Core/PokeySound.cs deleted file mode 100644 index fe09ecfdd14..00000000000 --- a/EMU7800/Core/PokeySound.cs +++ /dev/null @@ -1,437 +0,0 @@ -/* - * PokeySound.cs - * - * Emulation of the audio features of the Atari Pot Keyboard Integrated Circuit (POKEY, C012294). - * - * Implementation inspired by prior works of Greg Stanton (ProSystem Emulator) and Ron Fries. - * - * Copyright © 2012 Mike Murphy - * - */ -using System; - -namespace EMU7800.Core -{ - public sealed class PokeySound - { - #region Constants and Tables - - const int - AUDF1 = 0x00, // write reg: channel 1 frequency - AUDC1 = 0x01, // write reg: channel 1 generator - AUDF2 = 0x02, // write reg: channel 2 frequency - AUDC2 = 0x03, // write reg: channel 2 generator - AUDF3 = 0x04, // write reg: channel 3 frequency - AUDC3 = 0x05, // write reg: channel 3 generator - AUDF4 = 0x06, // write reg: channel 4 frequency - AUDC4 = 0x07, // write reg: channel 4 generator - AUDCTL = 0x08, // write reg: control over audio channels - SKCTL = 0x0f, // write reg: control over serial port - RANDOM = 0x0a; // read reg: random number generator value - - const int - AUDCTL_POLY9 = 0x80, // make 17-bit poly counter into a 9-bit poly counter - AUDCTL_CH1_179 = 0x40, // clocks channel 1 with 1.79 MHz, instead of 64 kHz - AUDCTL_CH3_179 = 0x20, // clocks channel 3 with 1.79 MHz, instead of 64 kHz - AUDCTL_CH1_CH2 = 0x10, // clock channel 2 with channel 1, instead of 64 kHz (16-bit) - AUDCTL_CH3_CH4 = 0x08, // clock channel 4 with channel 3, instead of 64 kHz (16-bit) - AUDCTL_CH1_FILTER = 0x04, // inserts high-pass filter into channel 1, clocked by channel 3 - AUDCTL_CH2_FILTER = 0x02, // inserts high-pass filter into channel 2, clocked by channel 4 - AUDCTL_CLOCK_15 = 0x01; // change normal clock base from 64 kHz to 15 kHz - - const int - AUDC_NOTPOLY5 = 0x80, - AUDC_POLY4 = 0x40, - AUDC_PURE = 0x20, - AUDC_VOLUME_ONLY = 0x10, - AUDC_VOLUME_MASK = 0x0f; - - const int - DIV_64 = 28, - DIV_15 = 114, - POLY9_SIZE = 0x01ff, - POLY17_SIZE = 0x0001ffff, - POKEY_FREQ = 1787520, - SKCTL_RESET = 3; - - const int CPU_TICKS_PER_AUDIO_SAMPLE = 57; - - readonly byte[] _poly04 = { 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0 }; - readonly byte[] _poly05 = { 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1 }; - readonly byte[] _poly17 = new byte[POLY9_SIZE]; // should be POLY17_SIZE, but instead wrapping around to conserve storage - - readonly Random _random = new Random(); - - #endregion - - #region Object State - - readonly MachineBase M; - - readonly int _pokeyTicksPerSample; - int _pokeyTicks; - - ulong _lastUpdateCpuClock; - int _bufferIndex; - - readonly byte[] _audf = new byte[4]; - readonly byte[] _audc = new byte[4]; - byte _audctl, _skctl; - - int _baseMultiplier; - int _poly04Counter; - int _poly05Counter; - int _poly17Counter, _poly17Size; - - readonly int[] _divideMax = new int[4]; - readonly int[] _divideCount = new int[4]; - readonly byte[] _output = new byte[4]; - readonly byte[] _outvol = new byte[4]; - - #endregion - - #region Public Members - - public void Reset() - { - _poly04Counter = _poly05Counter = _poly17Counter = _audctl = _skctl = 0; - - _baseMultiplier = DIV_64; - _poly17Size = POLY17_SIZE; - - _pokeyTicks = 0; - - for (var ch = 0; ch < 4; ch++) - { - _outvol[ch] = _output[ch] = _audc[ch] = _audf[ch] = 0; - _divideCount[ch] = Int32.MaxValue; - _divideMax[ch] = Int32.MaxValue; - } - } - - public void StartFrame() - { - _lastUpdateCpuClock = M.CPU.Clock; - _bufferIndex = 0; - } - - public void EndFrame() - { - RenderSamples(M.FrameBuffer.SoundBufferByteLength - _bufferIndex); - } - - public byte Read(ushort addr) - { - addr &= 0xf; - - switch (addr) - { - // If the 2 least significant bits of SKCTL are 0, the random number generator is disabled (return all 1s.) - // Ballblazer music relies on this. - case RANDOM: - return (_skctl & SKCTL_RESET) == 0 ? (byte)0xff : (byte)_random.Next(0xff); - default: - return 0; - } - } - - public void Update(ushort addr, byte data) - { - if (M.CPU.Clock > _lastUpdateCpuClock) - { - var updCpuClocks = (int)(M.CPU.Clock - _lastUpdateCpuClock); - var samples = updCpuClocks / CPU_TICKS_PER_AUDIO_SAMPLE; - RenderSamples(samples); - _lastUpdateCpuClock += (ulong)(samples * CPU_TICKS_PER_AUDIO_SAMPLE); - } - - addr &= 0xf; - - switch (addr) - { - case AUDF1: - _audf[0] = data; - ResetChannel1(); - if ((_audctl & AUDCTL_CH1_CH2) != 0) - ResetChannel2(); - break; - case AUDC1: - _audc[0] = data; - ResetChannel1(); - break; - case AUDF2: - _audf[1] = data; - ResetChannel2(); - break; - case AUDC2: - _audc[1] = data; - ResetChannel2(); - break; - case AUDF3: - _audf[2] = data; - ResetChannel3(); - if ((_audctl & AUDCTL_CH3_CH4) != 0) - ResetChannel4(); - break; - case AUDC3: - _audc[2] = data; - ResetChannel3(); - break; - case AUDF4: - _audf[3] = data; - ResetChannel4(); - break; - case AUDC4: - _audc[3] = data; - ResetChannel4(); - break; - case AUDCTL: - _audctl = data; - _poly17Size = ((_audctl & AUDCTL_POLY9) != 0) ? POLY9_SIZE : POLY17_SIZE; - _baseMultiplier = ((_audctl & AUDCTL_CLOCK_15) != 0) ? DIV_15 : DIV_64; - ResetChannel1(); - ResetChannel2(); - ResetChannel3(); - ResetChannel4(); - break; - case SKCTL: - _skctl = data; - break; - } - } - - #endregion - - #region Constructors - - private PokeySound() - { - _random.NextBytes(_poly17); - for (var i = 0; i < _poly17.Length; i++) - _poly17[i] &= 0x01; - - Reset(); - } - - public PokeySound(MachineBase m) : this() - { - if (m == null) - throw new ArgumentNullException("m"); - - M = m; - - // Add 8-bits of fractional representation to reduce distortion on output - _pokeyTicksPerSample = (POKEY_FREQ << 8) / M.SoundSampleFrequency; - } - - #endregion - - #region Serialization Members - - public PokeySound(DeserializationContext input, MachineBase m) : this(m) - { - if (input == null) - throw new ArgumentNullException("input"); - - input.CheckVersion(1); - _lastUpdateCpuClock = input.ReadUInt64(); - _bufferIndex = input.ReadInt32(); - _audf = input.ReadBytes(); - _audc = input.ReadBytes(); - _audctl = input.ReadByte(); - _skctl = input.ReadByte(); - _output = input.ReadBytes(); - _outvol = input.ReadBytes(); - _divideMax = input.ReadIntegers(4); - _divideCount = input.ReadIntegers(4); - _pokeyTicks = input.ReadInt32(); - _pokeyTicksPerSample = input.ReadInt32(); - _baseMultiplier = input.ReadInt32(); - _poly04Counter = input.ReadInt32(); - _poly05Counter = input.ReadInt32(); - _poly17Counter = input.ReadInt32(); - _poly17Size = input.ReadInt32(); - } - - public void GetObjectData(SerializationContext output) - { - if (output == null) - throw new ArgumentNullException("output"); - - output.WriteVersion(1); - output.Write(_lastUpdateCpuClock); - output.Write(_bufferIndex); - output.Write(_audf); - output.Write(_audc); - output.Write(_audctl); - output.Write(_skctl); - output.Write(_output); - output.Write(_outvol); - output.Write(_divideMax); - output.Write(_divideCount); - output.Write(_pokeyTicks); - output.Write(_pokeyTicksPerSample); - output.Write(_baseMultiplier); - output.Write(_poly04Counter); - output.Write(_poly05Counter); - output.Write(_poly17Counter); - output.Write(_poly17Size); - } - - #endregion - - #region Helpers - - void RenderSamples(int count) - { - const int POKEY_SAMPLE = 4; - var poly17Length = (_poly17Size > _poly17.Length ? _poly17.Length : _poly17Size); - - while (count > 0 && _bufferIndex < M.FrameBuffer.SoundBufferByteLength) - { - var nextEvent = POKEY_SAMPLE; - var wholeTicksToConsume = (_pokeyTicks >> 8); - - for (var ch = 0; ch < 4; ch++) - { - if (_divideCount[ch] <= wholeTicksToConsume) - { - wholeTicksToConsume = _divideCount[ch]; - nextEvent = ch; - } - } - - for (var ch = 0; ch < 4; ch++) - _divideCount[ch] -= wholeTicksToConsume; - - _pokeyTicks -= (wholeTicksToConsume << 8); - - if (nextEvent == POKEY_SAMPLE) - { - _pokeyTicks += _pokeyTicksPerSample; - - byte sample = 0; - for (var ch = 0; ch < 4; ch++) - sample += _outvol[ch]; - - M.FrameBuffer.SoundBuffer[_bufferIndex++] += sample; - count--; - - continue; - } - - _divideCount[nextEvent] += _divideMax[nextEvent]; - - _poly04Counter += wholeTicksToConsume; - _poly04Counter %= _poly04.Length; - - _poly05Counter += wholeTicksToConsume; - _poly05Counter %= _poly05.Length; - - _poly17Counter += wholeTicksToConsume; - _poly17Counter %= poly17Length; - - if ((_audc[nextEvent] & AUDC_NOTPOLY5) != 0 || _poly05[_poly05Counter] != 0) - { - if ((_audc[nextEvent] & AUDC_PURE) != 0) - _output[nextEvent] ^= 1; - else if ((_audc[nextEvent] & AUDC_POLY4) != 0) - _output[nextEvent] = _poly04[_poly04Counter]; - else - _output[nextEvent] = _poly17[_poly17Counter]; - } - - _outvol[nextEvent] = (_output[nextEvent] != 0) ? (byte)(_audc[nextEvent] & AUDC_VOLUME_MASK) : (byte)0; - } - } - - // As defined in the manual, the exact divider values are different depending on the frequency and resolution: - // 64 kHz or 15 kHz AUDF + 1 - // 1 MHz, 8-bit AUDF + 4 - // 1 MHz, 16-bit AUDF[CHAN1] + 256 * AUDF[CHAN2] + 7 - - void ResetChannel1() - { - var val = ((_audctl & AUDCTL_CH1_179) != 0) ? (_audf[0] + 4) : ((_audf[0] + 1) * _baseMultiplier); - if (val != _divideMax[0]) - { - _divideMax[0] = val; - if (val < _divideCount[0]) - _divideCount[0] = val; - } - UpdateVolumeSettingsForChannel(0); - } - - void ResetChannel2() - { - int val; - if ((_audctl & AUDCTL_CH1_CH2) != 0) - { - val = ((_audctl & AUDCTL_CH1_179) != 0) ? (_audf[1] * 256 + _audf[0] + 7) : ((_audf[1] * 256 + _audf[0] + 1) * _baseMultiplier); - } - else - { - val = ((_audf[1] + 1) * _baseMultiplier); - } - if (val != _divideMax[1]) - { - _divideMax[1] = val; - if (val < _divideCount[1]) - _divideCount[1] = val; - } - UpdateVolumeSettingsForChannel(1); - } - - void ResetChannel3() - { - var val = ((_audctl & AUDCTL_CH3_179) != 0) ? (_audf[2] + 4) : ((_audf[2] + 1) * _baseMultiplier); - if (val != _divideMax[2]) - { - _divideMax[2] = val; - if (val < _divideCount[2]) - _divideCount[2] = val; - } - UpdateVolumeSettingsForChannel(2); - } - - void ResetChannel4() - { - int val; - if ((_audctl & AUDCTL_CH3_CH4) != 0) - { - val = ((_audctl & AUDCTL_CH3_179) != 0) ? (_audf[3] * 256 + _audf[2] + 7) : ((_audf[3] * 256 + _audf[2] + 1) * _baseMultiplier); - } - else - { - val = ((_audf[3] + 1) * _baseMultiplier); - } - if (val != _divideMax[3]) - { - _divideMax[3] = val; - if (val < _divideCount[3]) - _divideCount[3] = val; - } - UpdateVolumeSettingsForChannel(3); - } - - void UpdateVolumeSettingsForChannel(int ch) - { - if (((_audc[ch] & AUDC_VOLUME_ONLY) != 0) || ((_audc[ch] & AUDC_VOLUME_MASK) == 0) || (_divideMax[ch] < (_pokeyTicksPerSample >> 8))) - { - _outvol[ch] = (byte)(_audc[ch] & AUDC_VOLUME_MASK); - _divideCount[ch] = Int32.MaxValue; - _divideMax[ch] = Int32.MaxValue; - } - } - - [System.Diagnostics.Conditional("DEBUG")] - void LogDebug(string format, params object[] args) - { - if (M == null || M.Logger == null) - return; - M.Logger.WriteLine(format, args); - } - - #endregion - } -} From 1d3e7279d5ec44c237229b2a2f98d659724ab5b7 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:37:45 -0400 Subject: [PATCH 67/82] Delete RAM6116.cs --- EMU7800/Core/RAM6116.cs | 65 ----------------------------------------- 1 file changed, 65 deletions(-) delete mode 100644 EMU7800/Core/RAM6116.cs diff --git a/EMU7800/Core/RAM6116.cs b/EMU7800/Core/RAM6116.cs deleted file mode 100644 index 66d5296f99c..00000000000 --- a/EMU7800/Core/RAM6116.cs +++ /dev/null @@ -1,65 +0,0 @@ -/* - * RAM6116.cs - * - * Implements a 6116 RAM device found in the 7800. - * - * Copyright � 2004 Mike Murphy - * - */ -using System; - -namespace EMU7800.Core -{ - public sealed class RAM6116 : IDevice - { - readonly byte[] RAM; - - #region IDevice Members - - public void Reset() {} - - public byte this[ushort addr] - { - get { return RAM[addr & 0x07ff]; } - set { RAM[addr & 0x07ff] = value; } - } - - #endregion - - #region Constructors - - public RAM6116() - { - RAM = new byte[0x800]; - } - - public RAM6116(byte[] ram) - { - RAM = ram; - } - - #endregion - - #region Serialization Members - - public RAM6116(DeserializationContext input) - { - if (input == null) - throw new ArgumentNullException("input"); - - input.CheckVersion(1); - RAM = input.ReadExpectedBytes(0x800); - } - - public void GetObjectData(SerializationContext output) - { - if (output == null) - throw new ArgumentNullException("output"); - - output.WriteVersion(1); - output.Write(RAM); - } - - #endregion - } -} \ No newline at end of file From 87c4cd9ba2321874570c37718adefcfeb22ce4c3 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:37:53 -0400 Subject: [PATCH 68/82] Delete SerializationContext.cs --- EMU7800/Core/SerializationContext.cs | 232 --------------------------- 1 file changed, 232 deletions(-) delete mode 100644 EMU7800/Core/SerializationContext.cs diff --git a/EMU7800/Core/SerializationContext.cs b/EMU7800/Core/SerializationContext.cs deleted file mode 100644 index 2ff20a40d7d..00000000000 --- a/EMU7800/Core/SerializationContext.cs +++ /dev/null @@ -1,232 +0,0 @@ -using System; -using System.IO; - -namespace EMU7800.Core -{ - /// - /// A context for serializing objects. - /// - public class SerializationContext - { - #region Fields - - readonly BinaryWriter _binaryWriter; - - #endregion - - public void Write(byte value) - { - _binaryWriter.Write(value); - } - - public void Write(ushort value) - { - _binaryWriter.Write(value); - } - - public void Write(int value) - { - _binaryWriter.Write(value); - } - - public void Write(uint value) - { - _binaryWriter.Write(value); - } - - public void Write(long value) - { - _binaryWriter.Write(value); - } - - public void Write(ulong value) - { - _binaryWriter.Write(value); - } - - public void Write(bool value) - { - _binaryWriter.Write(value); - } - - public void Write(double value) - { - _binaryWriter.Write(value); - } - - /* - public void Write(BufferElement bufferElement) - { - for (var i = 0; i < BufferElement.SIZE; i++) - Write(bufferElement[i]); - } - */ - - public void Write(byte[] bytes) - { - _binaryWriter.Write(bytes.Length); - if (bytes.Length > 0) - _binaryWriter.Write(bytes); - } - - public void Write(ushort[] ushorts) - { - var bytes = new byte[ushorts.Length << 1]; - Buffer.BlockCopy(ushorts, 0, bytes, 0, bytes.Length); - Write(bytes); - } - - public void Write(int[] ints) - { - var bytes = new byte[ints.Length << 2]; - Buffer.BlockCopy(ints, 0, bytes, 0, bytes.Length); - Write(bytes); - } - - public void Write(uint[] uints) - { - var bytes = new byte[uints.Length << 2]; - Buffer.BlockCopy(uints, 0, bytes, 0, bytes.Length); - Write(bytes); - } - - public void Write(bool[] booleans) - { - var bytes = new byte[booleans.Length]; - for (var i = 0; i < bytes.Length; i++) - { - bytes[i] = (byte)(booleans[i] ? 0xff : 0x00); - } - Write(bytes); - } - - public void Write(MachineBase m) - { - WriteTypeName(m); - m.GetObjectData(this); - } - - public void Write(AddressSpace mem) - { - mem.GetObjectData(this); - } - - public void Write(M6502 cpu) - { - cpu.GetObjectData(this); - } - - public void Write(PIA pia) - { - pia.GetObjectData(this); - } - - public void Write(TIA tia) - { - tia.GetObjectData(this); - } - - public void Write(TIASound tiaSound) - { - tiaSound.GetObjectData(this); - } - - public void Write(Maria maria) - { - maria.GetObjectData(this); - } - - public void Write(Cart cart) - { - WriteTypeName(cart); - cart.GetObjectData(this); - } - - public void Write(RAM6116 ram6116) - { - ram6116.GetObjectData(this); - } - - public void Write(InputState inputState) - { - inputState.GetObjectData(this); - } - - public void WriteVersion(int version) - { - Write(0x78000087); - Write(version); - } - - public void WriteOptional(byte[] bytes) - { - var hasBytes = (bytes != null); - _binaryWriter.Write(hasBytes); - if (!hasBytes) - return; - _binaryWriter.Write(bytes.Length); - if (bytes.Length > 0) - _binaryWriter.Write(bytes); - } - - public void WriteOptional(HSC7800 hsc7800) - { - var exist = (hsc7800 != null); - Write(exist); - if (!exist) - return; - hsc7800.GetObjectData(this); - } - - public void WriteOptional(Bios7800 bios7800) - { - var exist = (bios7800 != null); - Write(exist); - if (!exist) - return; - bios7800.GetObjectData(this); - } - - public void WriteOptional(PokeySound pokeySound) - { - var exist = (pokeySound != null); - Write(exist); - if (!exist) - return; - pokeySound.GetObjectData(this); - } - - #region Constructors - - private SerializationContext() - { - } - - /// - /// Instantiates a new instance of . - /// - /// - internal SerializationContext(BinaryWriter binaryWriter) - { - if (binaryWriter == null) - throw new ArgumentNullException("binaryWriter"); - _binaryWriter = binaryWriter; - } - - #endregion - - #region Helpers - - void WriteTypeName(object o) - { - if (o == null) - throw new Emu7800SerializationException("Type unexpectedly null."); - var typeName = o.GetType().FullName; - if (string.IsNullOrWhiteSpace(typeName)) - throw new Emu7800SerializationException("Unable to discover type name."); - _binaryWriter.Write(typeName); - } - - #endregion - } -} From e98fb0c0588b7a8a6d45c045f4660f4befe3f82f Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:38:03 -0400 Subject: [PATCH 69/82] Delete TIA.cs --- EMU7800/Core/TIA.cs | 1350 ------------------------------------------- 1 file changed, 1350 deletions(-) delete mode 100644 EMU7800/Core/TIA.cs diff --git a/EMU7800/Core/TIA.cs b/EMU7800/Core/TIA.cs deleted file mode 100644 index 5612afe624a..00000000000 --- a/EMU7800/Core/TIA.cs +++ /dev/null @@ -1,1350 +0,0 @@ -/* - * TIA.cs - * - * The Television Interface Adaptor device. - * - * Copyright � 2003-2008 Mike Murphy - * - */ -using System; - -namespace EMU7800.Core -{ - #region Collision Flags - - [Flags] - public enum TIACxFlags - { - PF = 1 << 0, - BL = 1 << 1, - M0 = 1 << 2, - M1 = 1 << 3, - P0 = 1 << 4, - P1 = 1 << 5 - }; - - [Flags] - public enum TIACxPairFlags - { - M0P1 = 1 << 0, - M0P0 = 1 << 1, - M1P0 = 1 << 2, - M1P1 = 1 << 3, - P0PF = 1 << 4, - P0BL = 1 << 5, - P1PF = 1 << 6, - P1BL = 1 << 7, - M0PF = 1 << 8, - M0BL = 1 << 9, - M1PF = 1 << 10, - M1BL = 1 << 11, - BLPF = 1 << 12, - P0P1 = 1 << 13, - M0M1 = 1 << 14 - }; - - #endregion - - public sealed class TIA : IDevice - { - #region Constants - - const int - VSYNC = 0x00, // Write: vertical sync set-clear (D1) - VBLANK = 0x01, // Write: vertical blank set-clear (D7-6,D1) - WSYNC = 0x02, // Write: wait for leading edge of hrz. blank (strobe) - RSYNC = 0x03, // Write: reset hrz. sync counter (strobe) - NUSIZ0 = 0x04, // Write: number-size player-missle 0 (D5-0) - NUSIZ1 = 0x05, // Write: number-size player-missle 1 (D5-0) - COLUP0 = 0x06, // Write: color-lum player 0 (D7-1) - COLUP1 = 0x07, // Write: color-lum player 1 (D7-1) - COLUPF = 0x08, // Write: color-lum playfield (D7-1) - COLUBK = 0x09, // Write: color-lum background (D7-1) - CTRLPF = 0x0a, // Write: cntrl playfield ballsize & coll. (D5-4,D2-0) - REFP0 = 0x0b, // Write: reflect player 0 (D3) - REFP1 = 0x0c, // Write: reflect player 1 (D3) - PF0 = 0x0d, // Write: playfield register byte 0 (D7-4) - PF1 = 0x0e, // Write: playfield register byte 1 (D7-0) - PF2 = 0x0f, // Write: playfield register byte 2 (D7-0) - RESP0 = 0x10, // Write: reset player 0 (strobe) - RESP1 = 0x11, // Write: reset player 1 (strobe) - RESM0 = 0x12, // Write: reset missle 0 (strobe) - RESM1 = 0x13, // Write: reset missle 1 (strobe) - RESBL = 0x14, // Write: reset ball (strobe) - AUDC0 = 0x15, // Write: audio control 0 (D3-0) - AUDC1 = 0x16, // Write: audio control 1 (D4-0) - AUDF0 = 0x17, // Write: audio frequency 0 (D4-0) - AUDF1 = 0x18, // Write: audio frequency 1 (D3-0) - AUDV0 = 0x19, // Write: audio volume 0 (D3-0) - AUDV1 = 0x1a, // Write: audio volume 1 (D3-0) - GRP0 = 0x1b, // Write: graphics player 0 (D7-0) - GRP1 = 0x1c, // Write: graphics player 1 (D7-0) - ENAM0 = 0x1d, // Write: graphics (enable) missle 0 (D1) - ENAM1 = 0x1e, // Write: graphics (enable) missle 1 (D1) - ENABL = 0x1f, // Write: graphics (enable) ball (D1) - HMP0 = 0x20, // Write: horizontal motion player 0 (D7-4) - HMP1 = 0x21, // Write: horizontal motion player 1 (D7-4) - HMM0 = 0x22, // Write: horizontal motion missle 0 (D7-4) - HMM1 = 0x23, // Write: horizontal motion missle 1 (D7-4) - HMBL = 0x24, // Write: horizontal motion ball (D7-4) - VDELP0 = 0x25, // Write: vertical delay player 0 (D0) - VDELP1 = 0x26, // Write: vertical delay player 1 (D0) - VDELBL = 0x27, // Write: vertical delay ball (D0) - RESMP0 = 0x28, // Write: reset missle 0 to player 0 (D1) - RESMP1 = 0x29, // Write: reset missle 1 to player 1 (D1) - HMOVE = 0x2a, // Write: apply horizontal motion (strobe) - HMCLR = 0x2b, // Write: clear horizontal motion registers (strobe) - CXCLR = 0x2c, // Write: clear collision latches (strobe) - - CXM0P = 0x00, // Read collision: D7=(M0,P1); D6=(M0,P0) - CXM1P = 0x01, // Read collision: D7=(M1,P0); D6=(M1,P1) - CXP0FB = 0x02, // Read collision: D7=(P0,PF); D6=(P0,BL) - CXP1FB = 0x03, // Read collision: D7=(P1,PF); D6=(P1,BL) - CXM0FB = 0x04, // Read collision: D7=(M0,PF); D6=(M0,BL) - CXM1FB = 0x05, // Read collision: D7=(M1,PF); D6=(M1,BL) - CXBLPF = 0x06, // Read collision: D7=(BL,PF); D6=(unused) - CXPPMM = 0x07, // Read collision: D7=(P0,P1); D6=(M0,M1) - INPT0 = 0x08, // Read pot port: D7 - INPT1 = 0x09, // Read pot port: D7 - INPT2 = 0x0a, // Read pot port: D7 - INPT3 = 0x0b, // Read pot port: D7 - INPT4 = 0x0c, // Read P1 joystick trigger: D7 - INPT5 = 0x0d; // Read P2 joystick trigger: D7 - - const int CPU_TICKS_PER_AUDIO_SAMPLE = 38; - - #endregion - - #region Data Structures - - readonly byte[] RegW = new byte[0x40]; - readonly MachineBase M; - readonly TIASound TIASound; - - delegate void PokeOpTyp(ushort addr, byte data); - - PokeOpTyp[] PokeOp; - - #endregion - - #region Position Counters - - // backing fields for properties--dont reference directly - int _HSync, _P0, _P1, _M0, _M1, _BL, _HMoveCounter; - - // Horizontal Sync Counter - // this represents HSync of the last rendered CLK - // has period of 57 counts, 0-56, at 1/4 CLK (57*4=228 CLK) - // provide all horizontal timing for constructing a valid TV signal - // other movable object counters can be reset out-of-phase with HSync, hence %228 and not %57 - int HSync - { - get { return _HSync; } - set { _HSync = value % 228; } - } - - // determines the difference between HSync and PokeOpHSync - int PokeOpHSyncDelta - { - get { return (int)(Clock - LastEndClock); } - } - - // this represents the current HSync - int PokeOpHSync - { - get { return (HSync + PokeOpHSyncDelta) % 228; } - } - - // scanline last rendered to - int ScanLine; - - // current position in the frame buffer - int FrameBufferIndex; - - // bytes are batched here for writing to the FrameBuffer - //BufferElement FrameBufferElement; - - // signals when to start an HMOVE - ulong StartHMOVEClock; - - // indicates where in the HMOVE operation it is - int HMoveCounter - { - get { return _HMoveCounter; } - set { _HMoveCounter = value < 0 ? -1 : value & 0xf; } - } - - // true when there is an HMOVE executing on the current scanline - bool HMoveLatch; - - // represents the TIA color clock (CLK) - // computed off of the CPU clock, but in real life, the CPU is driven by the color CLK signal - ulong Clock - { - get { return 3 * M.CPU.Clock; } - } - - // represents the first CLK of the unrendered scanline segment - ulong StartClock; - - // represents the last CLK of the previously rendered scanline segment - ulong LastEndClock - { - get { return StartClock - 1; } - } - - #endregion - - #region Player 0 Object - - // Player 0 Horizontal Position Counter - // has period of 40 counts, 0-39, at 1/4 CLK (40*4=160 CLK=visible scanline length) - // player position counter controls the position of the respective player graphics object on each scanline - // can be reset out-of-phase with HSync, hence %160 and not %40 - int P0 - { - get { return _P0; } - set { _P0 = value % 160; } - } - - // HMOVE "more motion required" latch - bool P0mmr; - - // Player 0 graphics registers - byte EffGRP0, OldGRP0; - - // Player 0 stretch mode - int P0type; - - // 1=currently suppressing copy 1 on Player 0 - int P0suppress; - - #endregion - - #region Player 1 Object - - // Player 1 Horizontal Position Counter (identical to P0) - int P1 - { - get { return _P1; } - set { _P1 = value % 160; } - } - - // HMOVE "more motion required" latch - bool P1mmr; - - // Player 1 graphics registers - byte EffGRP1, OldGRP1; - - // Player 1 stretch mode - int P1type; - - // 1=currently suppressing copy 1 on Player 1 - int P1suppress; - - #endregion - - #region Missile 0 Object - - // Missile 0 Horizontal Position Counter - // similar to player position counters - int M0 - { - get { return _M0; } - set { _M0 = value % 160; } - } - - // HMOVE "more motion required" latch - bool M0mmr; - - int M0type, M0size; - - bool m0on; - - #endregion - - #region Missle 1 Object - - // Missile 1 Horizontal Position Counter (identical to M0) - int M1 - { - get { return _M1; } - set { _M1 = value % 160; } - } - - // HMOVE "more motion required" latch - bool M1mmr; - - int M1type, M1size; - - bool m1on; - - #endregion - - #region Ball Object - - // Ball Horizontal Position Counter - // similar to player position counters - int BL - { - get { return _BL; } - set { _BL = value % 160; } - } - - // HMOVE "more motion required" latch - bool BLmmr; - - bool OldENABL; - - int BLsize; - - bool blon; - - #endregion - - #region Misc - - uint PF210; - int PFReflectionState; - - // color-luminance for background, playfield, player 0, player 1 - byte colubk, colupf, colup0, colup1; - - bool vblankon, scoreon, pfpriority; - - bool DumpEnabled; - ulong DumpDisabledCycle; - - TIACxPairFlags Collisions; - - #endregion - - #region Public Members - - public int WSYNCDelayClocks { get; set; } - public bool EndOfFrame { get; private set; } - - public void Reset() - { - for (var i = 0; i < RegW.Length; i++) - { - RegW[i] = 0; - } - vblankon = scoreon = pfpriority = false; - m0on = m1on = blon = false; - colubk = colupf = colup0 = colup1 = 0; - PFReflectionState = 0; - - StartClock = Clock; - HSync = -1; - P0 = P1 = M0 = M1 = BL = -1; - P0mmr = P1mmr = M0mmr = M1mmr = BLmmr = false; - StartHMOVEClock = ulong.MaxValue; - HMoveCounter = -1; - - FrameBufferIndex = 0; - - TIASound.Reset(); - - Log("{0} reset", this); - } - - public override String ToString() - { - return "TIA 1A"; - } - - public void StartFrame() - { - WSYNCDelayClocks = 0; - EndOfFrame = false; - ScanLine = 0; - FrameBufferIndex %= 160; - RenderFromStartClockTo(Clock); - TIASound.StartFrame(); - } - - public byte this[ushort addr] - { - get { return peek(addr); } - set { poke(addr, value); } - } - - public void EndFrame() - { - TIASound.EndFrame(); - } - - #endregion - - #region Constructors - - private TIA() - { - BuildPokeOpTable(); - } - - public TIA(MachineBase m) : this() - { - if (m == null) - throw new ArgumentNullException("m"); - - M = m; - TIASound = new TIASound(M, CPU_TICKS_PER_AUDIO_SAMPLE); - } - - #endregion - - #region Scanline Segment Renderer - - void RenderFromStartClockTo(ulong endClock) - { - - RenderClock: - if (StartClock >= endClock) - return; - - ++HSync; - - if (StartClock == StartHMOVEClock) - { - // turn on HMOVE - HMoveLatch = true; - HMoveCounter = 0xf; - P0mmr = P1mmr = M0mmr = M1mmr = BLmmr = true; - } - else if (HSync == 0) - { - // just wrapped around, clear late HBLANK - HMoveLatch = false; - } - - // position counters are incremented during the visible portion of the scanline - if (HSync >= 68 + (HMoveLatch ? 8 : 0)) - { - ++P0; ++P1; ++M0; ++M1; ++BL; - } - - // HMOVE compare, once every 1/4 CLK when on - if (HMoveCounter >= 0 && (HSync & 3) == 0) - { - if (((HMoveCounter ^ RegW[HMP0]) & 0xf) == 0xf) P0mmr = false; - if (((HMoveCounter ^ RegW[HMP1]) & 0xf) == 0xf) P1mmr = false; - if (((HMoveCounter ^ RegW[HMM0]) & 0xf) == 0xf) M0mmr = false; - if (((HMoveCounter ^ RegW[HMM1]) & 0xf) == 0xf) M1mmr = false; - if (((HMoveCounter ^ RegW[HMBL]) & 0xf) == 0xf) BLmmr = false; - if (HMoveCounter >= 0) HMoveCounter--; - } - - // HMOVE increment, once every 1/4 CLK, 2 CLK after first compare when on - if (HMoveCounter < 0xf && (HSync & 3) == 2) - { - if (HSync < 68 + (HMoveLatch ? 8 : 0)) - { - if (P0mmr) ++P0; - if (P1mmr) ++P1; - if (M0mmr) ++M0; - if (M1mmr) ++M1; - if (BLmmr) ++BL; - } - } - - if (HSync == 68 + 76) PFReflectionState = RegW[CTRLPF] & 0x01; - - var fbyte = (byte)0; - var fbyte_colupf = colupf; - TIACxFlags cxflags = 0; - - if (vblankon || HSync < 68 + (HMoveLatch ? 8 : 0)) goto WritePixel; - - fbyte = colubk; - - var colupfon = false; - if ((PF210 & TIATables.PFMask[PFReflectionState][HSync - 68]) != 0) - { - if (scoreon) fbyte_colupf = (HSync - 68) < 80 ? colup0 : colup1; - colupfon = true; - cxflags |= TIACxFlags.PF; - } - if (blon && BL >= 0 && TIATables.BLMask[BLsize][BL]) - { - colupfon = true; - cxflags |= TIACxFlags.BL; - } - if (!pfpriority && colupfon) - { - fbyte = fbyte_colupf; - } - if (m1on && M1 >= 0 && TIATables.MxMask[M1size][M1type][M1]) - { - fbyte = colup1; - cxflags |= TIACxFlags.M1; - } - if (P1 >= 0 && (TIATables.PxMask[P1suppress][P1type][P1] & EffGRP1) != 0) - { - fbyte = colup1; - cxflags |= TIACxFlags.P1; - } - if (m0on && M0 >= 0 && TIATables.MxMask[M0size][M0type][M0]) - { - fbyte = colup0; - cxflags |= TIACxFlags.M0; - } - if (P0 >= 0 && (TIATables.PxMask[P0suppress][P0type][P0] & EffGRP0) != 0) - { - fbyte = colup0; - cxflags |= TIACxFlags.P0; - } - if (pfpriority && colupfon) - { - fbyte = fbyte_colupf; - } - - WritePixel: - Collisions |= TIATables.CollisionMask[(int)cxflags]; - - if (HSync >= 68) - { - M.FrameBuffer.VideoBuffer[FrameBufferIndex++] = fbyte; - if (FrameBufferIndex == M.FrameBuffer.VideoBufferByteLength) - FrameBufferIndex = 0; - if (HSync == 227) - ScanLine++; - } - - if (P0 >= 156) P0suppress = 0; - if (P1 >= 156) P1suppress = 0; - - // denote this CLK has been completed by incrementing to the next - StartClock++; - - goto RenderClock; - } - - #endregion - - #region TIA Peek - - byte peek(ushort addr) - { - var retval = 0; - addr &= 0xf; - - RenderFromStartClockTo(Clock); - - switch (addr) - { - case CXM0P: - retval |= ((Collisions & TIACxPairFlags.M0P1) != 0 ? 0x80 : 0); - retval |= ((Collisions & TIACxPairFlags.M0P0) != 0 ? 0x40 : 0); - break; - case CXM1P: - retval |= ((Collisions & TIACxPairFlags.M1P0) != 0 ? 0x80 : 0); - retval |= ((Collisions & TIACxPairFlags.M1P1) != 0 ? 0x40 : 0); - break; - case CXP0FB: - retval |= ((Collisions & TIACxPairFlags.P0PF) != 0 ? 0x80 : 0); - retval |= ((Collisions & TIACxPairFlags.P0BL) != 0 ? 0x40 : 0); - break; - case CXP1FB: - retval |= ((Collisions & TIACxPairFlags.P1PF) != 0 ? 0x80 : 0); - retval |= ((Collisions & TIACxPairFlags.P1BL) != 0 ? 0x40 : 0); - break; - case CXM0FB: - retval |= ((Collisions & TIACxPairFlags.M0PF) != 0 ? 0x80 : 0); - retval |= ((Collisions & TIACxPairFlags.M0BL) != 0 ? 0x40 : 0); - break; - case CXM1FB: - retval |= ((Collisions & TIACxPairFlags.M1PF) != 0 ? 0x80 : 0); - retval |= ((Collisions & TIACxPairFlags.M1BL) != 0 ? 0x40 : 0); - break; - case CXBLPF: - retval |= ((Collisions & TIACxPairFlags.BLPF) != 0 ? 0x80 : 0); - break; - case CXPPMM: - retval |= ((Collisions & TIACxPairFlags.P0P1) != 0 ? 0x80 : 0); - retval |= ((Collisions & TIACxPairFlags.M0M1) != 0 ? 0x40 : 0); - break; - case INPT0: - retval = DumpedInputPort(SampleINPT(0)); - break; - case INPT1: - retval = DumpedInputPort(SampleINPT(1)); - break; - case INPT2: - retval = DumpedInputPort(SampleINPT(2)); - break; - case INPT3: - retval = DumpedInputPort(SampleINPT(3)); - break; - case INPT4: - var scanline = ScanLine; - var hpos = PokeOpHSync - 68; - if (hpos < 0) - { - hpos += 228; - scanline--; - } - if (SampleINPTLatched(4, scanline, hpos)) - { - retval &= 0x7f; - } - else - { - retval |= 0x80; - } - break; - case INPT5: - scanline = ScanLine; - hpos = PokeOpHSync - 68; - if (hpos < 0) - { - hpos += 228; - scanline--; - } - if (SampleINPTLatched(5, scanline, hpos)) - { - retval &= 0x7f; - } - else - { - retval |= 0x80; - } - break; - } - return (byte)(retval | (M.Mem.DataBusState & 0x3f)); - } - - byte DumpedInputPort(int resistance) - { - byte retval = 0; - - if (resistance == 0) - { - retval = 0x80; - } - else if (DumpEnabled || resistance == Int32.MaxValue) - { - retval = 0x00; - } - else - { - var chargeTime = 1.6 * resistance * 0.01e-6; - var needed = (ulong)(chargeTime * M.FrameBuffer.Scanlines * 228 * M.FrameHZ / 3); - if (M.CPU.Clock > DumpDisabledCycle + needed) - { - retval = 0x80; - } - } - return retval; - } - - #endregion - - #region TIA Poke - - void poke(ushort addr, byte data) - { - addr &= 0x3f; - - var endClock = Clock; - - // writes to the TIA may take a few extra CLKs to actually affect TIA state - // such a delay would seem to be applicable across all possible TIA writes - // without hardware to confirm conclusively, this is updated only as seemingly required - switch (addr) - { - case GRP0: - case GRP1: - // stem in the T in activision logo on older titles - endClock += 1; - break; - case PF0: - case PF1: - case PF2: - // +2 prevents minor notching in berzerk walls - // +4 prevents shield fragments floating in fuzz field in yars revenge, - // but creates minor artifact in chopper command - switch (PokeOpHSync & 3) - { - case 0: endClock += 4; break; - case 1: endClock += 3; break; - case 2: endClock += 2; break; - case 3: endClock += 5; break; - } - break; - } - - RenderFromStartClockTo(endClock); - - PokeOp[addr](addr, data); - } - - static void opNULL(ushort addr, byte data) - { - } - - void opVSYNC(ushort addr, byte data) - { - // Many games don't appear to supply 3 scanlines of - // VSYNC in accordance with the Atari documentation. - // Enduro turns on VSYNC, then turns it off twice. - // Centipede turns off VSYNC several times, in addition to normal usage. - // One of the Atari Bowling ROMs turns it off, but never turns it on. - // So, we always end the frame if VSYNC is turned on and then off. - // We also end the frame if VSYNC is turned off after scanline 258 to accomodate Bowling. - if ((data & 0x02) == 0) - { - if ((RegW[VSYNC] & 0x02) != 0 || ScanLine > 258) - { - EndOfFrame = true; - M.CPU.EmulatorPreemptRequest = true; - } - } - - RegW[VSYNC] = data; - } - - void opVBLANK(ushort addr, byte data) - { - if ((RegW[VBLANK] & 0x80) == 0) - { - // dump to ground is clear and will be set - // thus discharging all INPTx capacitors - if ((data & 0x80) != 0) - { - DumpEnabled = true; - } - } - else - { - // dump to ground is set and will be cleared - // thus starting all INPTx capacitors charging - if ((data & 0x80) == 0) - { - DumpEnabled = false; - DumpDisabledCycle = M.CPU.Clock; - } - } - RegW[VBLANK] = data; - vblankon = (data & 0x02) != 0; - } - - void opWSYNC(ushort addr, byte data) - { - // on scanline=44, tetris seems to occasionally not get a WSYNC in until 3 clk in on scanline=45 causing jitter - if (PokeOpHSync > 0) - { - // report the number of remaining system clocks on the scanline to delay the CPU - WSYNCDelayClocks = 228 - PokeOpHSync; - // request a CPU preemption to service the delay request (only if there is a delay necessary) - M.CPU.EmulatorPreemptRequest = true; - } - } - - void opRSYNC(ushort addr, byte data) - { - LogDebug("TIA RSYNC: frame={0} scanline={0} hsync={0}", M.FrameNumber, ScanLine, PokeOpHSync); - } - - void opNUSIZ0(ushort addr, byte data) - { - RegW[NUSIZ0] = (byte)(data & 0x37); - - M0size = (RegW[NUSIZ0] & 0x30) >> 4; - M0type = RegW[NUSIZ0] & 0x07; - P0type = M0type; - - P0suppress = 0; - } - - void opNUSIZ1(ushort addr, byte data) - { - RegW[NUSIZ1] = (byte)(data & 0x37); - - M1size = (RegW[NUSIZ1] & 0x30) >> 4; - M1type = RegW[NUSIZ1] & 0x07; - P1type = M1type; - - P1suppress = 0; - } - - void opCOLUBK(ushort addr, byte data) - { - colubk = data; - } - - void opCOLUPF(ushort addr, byte data) - { - colupf = data; - } - - void opCOLUP0(ushort addr, byte data) - { - colup0 = data; - } - - void opCOLUP1(ushort addr, byte data) - { - colup1 = data; - } - - void opCTRLPF(ushort addr, byte data) - { - RegW[CTRLPF] = data; - - BLsize = (data & 0x30) >> 4; - scoreon = (data & 0x02) != 0; - pfpriority = (data & 0x04) != 0; - } - - void SetEffGRP0() - { - var grp0 = RegW[VDELP0] != 0 ? OldGRP0 : RegW[GRP0]; - EffGRP0 = RegW[REFP0] != 0 ? TIATables.GRPReflect[grp0] : grp0; - } - - void SetEffGRP1() - { - var grp1 = RegW[VDELP1] != 0 ? OldGRP1 : RegW[GRP1]; - EffGRP1 = RegW[REFP1] != 0 ? TIATables.GRPReflect[grp1] : grp1; - } - - void Setblon() - { - blon = RegW[VDELBL] != 0 ? OldENABL : RegW[ENABL] != 0; - } - - void opREFP0(ushort addr, byte data) - { - RegW[REFP0] = (byte)(data & 0x08); - SetEffGRP0(); - } - - void opREFP1(ushort addr, byte data) - { - RegW[REFP1] = (byte)(data & 0x08); - SetEffGRP1(); - } - - void opPF(ushort addr, byte data) - { - RegW[addr] = data; - PF210 = (uint)((RegW[PF2] << 12) | (RegW[PF1] << 4) |((RegW[PF0] >> 4) & 0x0f)); - } - - void opRESP0(ushort addr, byte data) - { - if (PokeOpHSync < 68) - { - P0 = 0; - } - else if (HMoveLatch && PokeOpHSync >= 68 && PokeOpHSync < 76) - { - // this is an attempt to model observed behavior--may not be completely correct - // only three hsync values are really possible: - // 69: parkerbros actionman - // 72: activision grandprix - // 75: barnstorming, riverraid - P0 = -((PokeOpHSync - 68) >> 1); - } - else - { - P0 = -4; - } - P0 -= PokeOpHSyncDelta; - P0suppress = 1; - } - - void opRESP1(ushort addr, byte data) - { - if (PokeOpHSync < 68) - { - P1 = 0; - } - else if (HMoveLatch && PokeOpHSync >= 68 && PokeOpHSync < 76) - { - // this is an attempt to model observed behavior--may not be completely correct - // only three hsync values are really possible: - // 69: parkerbros actionman - // 72: parkerbros actionman - // 75: parkerbros actionman - P1 = -((PokeOpHSync - 68) >> 1); - } - else - { - P1 = -4; - } - P1 -= PokeOpHSyncDelta; - P1suppress = 1; - } - - void opRESM0(ushort addr, byte data) - { - // -2 to mirror M1 - M0 = PokeOpHSync < 68 ? -2 : -4; - M0 -= PokeOpHSyncDelta; - } - - void opRESM1(ushort addr, byte data) - { - // -2 cleans up edges on activision pitfall ii - M1 = PokeOpHSync < 68 ? -2 : -4; - M1 -= PokeOpHSyncDelta; - } - - void opRESBL(ushort addr, byte data) - { - // -2 cleans up edges on activision boxing - // -4 confirmed via activision choppercommand; used to clean up edges - BL = PokeOpHSync < 68 ? -2 : -4; - BL -= PokeOpHSyncDelta; - } - - void opAUD(ushort addr, byte data) - { - RegW[addr] = data; - TIASound.Update(addr, data); - } - - void opGRP0(ushort addr, byte data) - { - RegW[GRP0] = data; - OldGRP1 = RegW[GRP1]; - - SetEffGRP0(); - SetEffGRP1(); - } - - void opGRP1(ushort addr, byte data) - { - RegW[GRP1] = data; - OldGRP0 = RegW[GRP0]; - - OldENABL = RegW[ENABL] != 0; - - SetEffGRP0(); - SetEffGRP1(); - Setblon(); - } - - void opENAM0(ushort addr, byte data) - { - RegW[ENAM0] = (byte)(data & 0x02); - m0on = RegW[ENAM0] != 0 && RegW[RESMP0] == 0; - } - - void opENAM1(ushort addr, byte data) - { - RegW[ENAM1] = (byte)(data & 0x02); - m1on = RegW[ENAM1] != 0 && RegW[RESMP1] == 0; - } - - void opENABL(ushort addr, byte data) - { - RegW[ENABL] = (byte)(data & 0x02); - Setblon(); - } - - void SetHmr(int hmr, byte data) - { - // marshal via >>4 for compare convenience - RegW[hmr] = (byte)((data ^ 0x80) >> 4); - } - - void opHM(ushort addr, byte data) - { - SetHmr(addr, data); - } - - void opVDELP0(ushort addr, byte data) - { - RegW[VDELP0] = (byte)(data & 0x01); - SetEffGRP0(); - } - - void opVDELP1(ushort addr, byte data) - { - RegW[VDELP1] = (byte)(data & 0x01); - SetEffGRP1(); - } - - void opVDELBL(ushort addr, byte data) - { - RegW[VDELBL] = (byte)(data & 0x01); - Setblon(); - } - - void opRESMP0(ushort addr, byte data) - { - if (RegW[RESMP0] != 0 && (data & 0x02) == 0) - { - var middle = 4; - switch (RegW[NUSIZ0] & 0x07) - { - case 0x05: middle <<= 1; break; // double size - case 0x07: middle <<= 2; break; // quad size - } - M0 = P0 - middle; - } - RegW[RESMP0] = (byte)(data & 0x02); - m0on = RegW[ENAM0] != 0 && RegW[RESMP0] == 0; - } - - void opRESMP1(ushort addr, byte data) - { - if (RegW[RESMP1] != 0 && (data & 0x02) == 0) - { - var middle = 4; - switch (RegW[NUSIZ1] & 0x07) - { - case 0x05: middle <<= 1; break; // double size - case 0x07: middle <<= 2; break; // quad size - } - M1 = P1 - middle; - } - RegW[RESMP1] = (byte)(data & 0x02); - m1on = RegW[ENAM1] != 0 && RegW[RESMP1] == 0; - } - - void opHMOVE(ushort addr, byte data) - { - P0suppress = 0; - P1suppress = 0; - StartHMOVEClock = Clock + 3; - - // Activision Spiderfighter Cheat (Score and Logo) - // Delaying the start of the HMOVE here results in it completing on the next scanline (to have visible effect.) - // HMOVEing during the visible scanline probably has extra consequences, - // however, it seems not many carts try to do this. - if (PokeOpHSync == 201) StartHMOVEClock++; // any increment >0 works - } - - void opHMCLR(ushort addr, byte data) - { - SetHmr(HMP0, 0); - SetHmr(HMP1, 0); - SetHmr(HMM0, 0); - SetHmr(HMM1, 0); - SetHmr(HMBL, 0); - } - - void opCXCLR(ushort addr, byte data) - { - Collisions = 0; - } - - void BuildPokeOpTable() - { - PokeOp = new PokeOpTyp[64]; - for (var i = 0; i < PokeOp.Length; i++) - { - PokeOp[i] = opNULL; - } - PokeOp[VSYNC] = opVSYNC; - PokeOp[VBLANK] = opVBLANK; - PokeOp[WSYNC] = opWSYNC; - PokeOp[RSYNC] = opRSYNC; - PokeOp[NUSIZ0] = opNUSIZ0; - PokeOp[NUSIZ1] = opNUSIZ1; - PokeOp[COLUP0] = opCOLUP0; - PokeOp[COLUP1] = opCOLUP1; - PokeOp[COLUPF] = opCOLUPF; - PokeOp[COLUBK] = opCOLUBK; - PokeOp[CTRLPF] = opCTRLPF; - PokeOp[REFP0] = opREFP0; - PokeOp[REFP1] = opREFP1; - PokeOp[PF0] = opPF; - PokeOp[PF1] = opPF; - PokeOp[PF2] = opPF; - PokeOp[RESP0] = opRESP0; - PokeOp[RESP1] = opRESP1; - PokeOp[RESM0] = opRESM0; - PokeOp[RESM1] = opRESM1; - PokeOp[RESBL] = opRESBL; - PokeOp[AUDC0] = opAUD; - PokeOp[AUDC1] = opAUD; - PokeOp[AUDF0] = opAUD; - PokeOp[AUDF1] = opAUD; - PokeOp[AUDV0] = opAUD; - PokeOp[AUDV1] = opAUD; - PokeOp[GRP0] = opGRP0; - PokeOp[GRP1] = opGRP1; - PokeOp[ENAM0] = opENAM0; - PokeOp[ENAM1] = opENAM1; - PokeOp[ENABL] = opENABL; - PokeOp[HMP0] = opHM; - PokeOp[HMP1] = opHM; - PokeOp[HMM0] = opHM; - PokeOp[HMM1] = opHM; - PokeOp[HMBL] = opHM; - PokeOp[VDELP0] = opVDELP0; - PokeOp[VDELP1] = opVDELP1; - PokeOp[VDELBL] = opVDELBL; - PokeOp[RESMP0] = opRESMP0; - PokeOp[RESMP1] = opRESMP1; - PokeOp[HMOVE] = opHMOVE; - PokeOp[HMCLR] = opHMCLR; - PokeOp[CXCLR] = opCXCLR; - } - - #endregion - - #region Input Helpers - - int SampleINPT(int inpt) - { - var mi = M.InputState; - - switch (inpt <= 1 ? mi.LeftControllerJack : mi.RightControllerJack) - { - case Controller.Paddles: - // playerno = inpt - return mi.SampleCapturedOhmState(inpt & 3); - case Controller.ProLineJoystick: - // playerno = inpt/2 - switch (inpt & 3) - { - case 0: return mi.SampleCapturedControllerActionState(0, ControllerAction.Trigger) ? 0 : Int32.MaxValue; - case 1: return mi.SampleCapturedControllerActionState(0, ControllerAction.Trigger2) ? 0 : Int32.MaxValue; - case 2: return mi.SampleCapturedControllerActionState(1, ControllerAction.Trigger) ? 0 : Int32.MaxValue; - case 3: return mi.SampleCapturedControllerActionState(1, ControllerAction.Trigger2) ? 0 : Int32.MaxValue; - } - break; - case Controller.BoosterGrip: - // playerno = inpt - return mi.SampleCapturedControllerActionState(inpt & 3, ControllerAction.Trigger2) ? 0 : Int32.MaxValue; - case Controller.Keypad: - return SampleKeypadStateDumped(inpt & 3); - } - return int.MaxValue; - } - - bool SampleINPTLatched(int inpt, int scanline, int hpos) - { - var mi = M.InputState; - var playerNo = inpt - 4; - - switch (playerNo == 0 ? mi.LeftControllerJack : mi.RightControllerJack) - { - case Controller.Joystick: - case Controller.ProLineJoystick: - case Controller.Driving: - case Controller.BoosterGrip: - return mi.SampleCapturedControllerActionState(playerNo, ControllerAction.Trigger); - case Controller.Keypad: - return SampleKeypadStateLatched(playerNo); - case Controller.Lightgun: - int sampledScanline, sampledHpos; - mi.SampleCapturedLightGunPosition(playerNo, out sampledScanline, out sampledHpos); - return ((scanline - 4) >= sampledScanline && (hpos - 23) >= sampledHpos); - } - return false; - } - - bool SampleKeypadStateLatched(int deviceno) - { - ControllerAction action; - - if ((M.PIA.WrittenPortA & 0x01) == 0) - { - action = ControllerAction.Keypad3; - } - else if ((M.PIA.WrittenPortA & 0x02) == 0) - { - action = ControllerAction.Keypad6; - } - else if ((M.PIA.WrittenPortA & 0x04) == 0) - { - action = ControllerAction.Keypad9; - } - else if ((M.PIA.WrittenPortA & 0x08) == 0) - { - action = ControllerAction.KeypadP; - } - else - { - return false; - } - - return M.InputState.SampleCapturedControllerActionState(deviceno, action); - } - - int SampleKeypadStateDumped(int inpt) - { - ControllerAction action; - - if ((M.PIA.WrittenPortA & 0x01) == 0) - { - action = (inpt & 1) == 0 ? ControllerAction.Keypad1 : ControllerAction.Keypad2; - } - else if ((M.PIA.WrittenPortA & 0x02) == 0) - { - action = (inpt & 1) == 0 ? ControllerAction.Keypad4 : ControllerAction.Keypad5; - } - else if ((M.PIA.WrittenPortA & 0x04) == 0) - { - action = (inpt & 1) == 0 ? ControllerAction.Keypad7 : ControllerAction.Keypad8; - } - else if ((M.PIA.WrittenPortA & 0x08) == 0) - { - action = (inpt & 1) == 0 ? ControllerAction.KeypadA : ControllerAction.Keypad0; - } - else - { - return Int32.MaxValue; - } - - // playerno = inpt/2 - return M.InputState.SampleCapturedControllerActionState(inpt >> 1, action) ? Int32.MaxValue : 0; - } - - #endregion - - #region Serialization Members - - public TIA(DeserializationContext input, MachineBase m) : this() - { - if (input == null) - throw new ArgumentNullException("input"); - if (m == null) - throw new ArgumentNullException("m"); - - M = m; - TIASound = input.ReadTIASound(M, CPU_TICKS_PER_AUDIO_SAMPLE); - - input.CheckVersion(2); - RegW = input.ReadExpectedBytes(0x40); - HSync = input.ReadInt32(); - HMoveCounter = input.ReadInt32(); - ScanLine = input.ReadInt32(); - FrameBufferIndex = input.ReadInt32(); - //FrameBufferElement = input.ReadBufferElement(); - StartHMOVEClock = input.ReadUInt64(); - HMoveLatch = input.ReadBoolean(); - StartClock = input.ReadUInt64(); - P0 = input.ReadInt32(); - P0mmr = input.ReadBoolean(); - EffGRP0 = input.ReadByte(); - OldGRP0 = input.ReadByte(); - P0type = input.ReadInt32(); - P0suppress = input.ReadInt32(); - P1 = input.ReadInt32(); - P1mmr = input.ReadBoolean(); - EffGRP1 = input.ReadByte(); - OldGRP1 = input.ReadByte(); - P1type = input.ReadInt32(); - P1suppress = input.ReadInt32(); - M0 = input.ReadInt32(); - M0mmr = input.ReadBoolean(); - M0type = input.ReadInt32(); - M0size = input.ReadInt32(); - m0on = input.ReadBoolean(); - M1 = input.ReadInt32(); - M1mmr = input.ReadBoolean(); - M1type = input.ReadInt32(); - M1size = input.ReadInt32(); - m1on = input.ReadBoolean(); - BL = input.ReadInt32(); - BLmmr = input.ReadBoolean(); - OldENABL = input.ReadBoolean(); - BLsize = input.ReadInt32(); - blon = input.ReadBoolean(); - PF210 = input.ReadUInt32(); - PFReflectionState = input.ReadInt32(); - colubk = input.ReadByte(); - colupf = input.ReadByte(); - colup0 = input.ReadByte(); - colup1 = input.ReadByte(); - vblankon = input.ReadBoolean(); - scoreon = input.ReadBoolean(); - pfpriority = input.ReadBoolean(); - DumpEnabled = input.ReadBoolean(); - DumpDisabledCycle = input.ReadUInt64(); - Collisions = (TIACxPairFlags)input.ReadInt32(); - WSYNCDelayClocks = input.ReadInt32(); - EndOfFrame = input.ReadBoolean(); - } - - public void GetObjectData(SerializationContext output) - { - if (output == null) - throw new ArgumentNullException("output"); - - output.Write(TIASound); - - output.WriteVersion(2); - output.Write(RegW); - output.Write(HSync); - output.Write(HMoveCounter); - output.Write(ScanLine); - output.Write(FrameBufferIndex); - //output.Write(FrameBufferElement); - output.Write(StartHMOVEClock); - output.Write(HMoveLatch); - output.Write(StartClock); - output.Write(P0); - output.Write(P0mmr); - output.Write(EffGRP0); - output.Write(OldGRP0); - output.Write(P0type); - output.Write(P0suppress); - output.Write(P1); - output.Write(P1mmr); - output.Write(EffGRP1); - output.Write(OldGRP1); - output.Write(P1type); - output.Write(P1suppress); - output.Write(M0); - output.Write(M0mmr); - output.Write(M0type); - output.Write(M0size); - output.Write(m0on); - output.Write(M1); - output.Write(M1mmr); - output.Write(M1type); - output.Write(M1size); - output.Write(m1on); - output.Write(BL); - output.Write(BLmmr); - output.Write(OldENABL); - output.Write(BLsize); - output.Write(blon); - output.Write(PF210); - output.Write(PFReflectionState); - output.Write(colubk); - output.Write(colupf); - output.Write(colup0); - output.Write(colup1); - output.Write(vblankon); - output.Write(scoreon); - output.Write(pfpriority); - output.Write(DumpEnabled); - output.Write(DumpDisabledCycle); - output.Write((int)Collisions); - output.Write(WSYNCDelayClocks); - output.Write(EndOfFrame); - } - - #endregion - - #region Helpers - - void Log(string format, params object[] args) - { - if (M == null || M.Logger == null) - return; - M.Logger.WriteLine(format, args); - } - - [System.Diagnostics.Conditional("DEBUG")] - void LogDebug(string format, params object[] args) - { - if (M == null || M.Logger == null) - return; - M.Logger.WriteLine(format, args); - } - - #endregion - } -} \ No newline at end of file From 444f90cde089379cc5d529e049e04d030c487571 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:38:13 -0400 Subject: [PATCH 70/82] Delete TIASound.cs --- EMU7800/Core/TIASound.cs | 361 --------------------------------------- 1 file changed, 361 deletions(-) delete mode 100644 EMU7800/Core/TIASound.cs diff --git a/EMU7800/Core/TIASound.cs b/EMU7800/Core/TIASound.cs deleted file mode 100644 index 1ee9b3ea4b6..00000000000 --- a/EMU7800/Core/TIASound.cs +++ /dev/null @@ -1,361 +0,0 @@ -/* - * TIASound.cs - * - * Sound emulation for the 2600. Based upon TIASound � 1997 by Ron Fries. - * - * Copyright � 2003, 2004 Mike Murphy - * - */ - -/*****************************************************************************/ -/* */ -/* License Information and Copyright Notice */ -/* ======================================== */ -/* */ -/* TiaSound is Copyright(c) 1997 by Ron Fries */ -/* */ -/* This library is free software; you can redistribute it and/or modify it */ -/* under the terms of version 2 of the GNU Library General Public License */ -/* as published by the Free Software Foundation. */ -/* */ -/* This library 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 Library */ -/* General Public License for more details. */ -/* To obtain a copy of the GNU Library General Public License, write to the */ -/* Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* */ -/* Any permitted reproduction of these routines, in whole or in part, must */ -/* bear this legend. */ -/* */ -/*****************************************************************************/ - -using System; - -namespace EMU7800.Core -{ - public sealed class TIASound - { - #region Constants and Tables - - // Clock Source Clock Modifier Source Pattern - const int - SET_TO_1 = 0x00, // 0 0 0 0 3.58 Mhz/114 none (pure) none - //POLY4 = 0x01, // 0 0 0 1 3.58 Mhz/114 none (pure) 4-bit poly - //DIV31_POLY4 = 0x02, // 0 0 1 0 3.58 Mhz/114 divide by 31 4-bit poly - //POLY5_POLY4 = 0x03, // 0 0 1 1 3.58 Mhz/114 5-bit poly 4-bit poly - //PURE = 0x04, // 0 1 0 0 3.58 Mhz/114 none (pure) pure (~Q) - //PURE2 = 0x05, // 0 1 0 1 3.58 Mhz/114 none (pure) pure (~Q) - //DIV31_PURE = 0x06, // 0 1 1 0 3.58 Mhz/114 divide by 31 pure (~Q) - //POLY5_2 = 0x07, // 0 1 1 1 3.58 Mhz/114 5-bit poly pure (~Q) - POLY9 = 0x08; // 1 0 0 0 3.58 Mhz/114 none (pure) 9-bit poly - //POLY5 = 0x09, // 1 0 0 1 3.58 Mhz/114 none (pure) 5-bit poly - //DIV31_POLY5 = 0x0a, // 1 0 1 0 3.58 Mhz/114 divide by 31 5-bit poly - //POLY5_POLY5 = 0x0b, // 1 0 1 1 3.58 Mhz/114 5-bit poly 5-bit poly - //DIV3_PURE = 0x0c, // 1 1 0 0 1.19 Mhz/114 none (pure) pure (~Q) - //DIV3_PURE2 = 0x0d, // 1 1 0 1 1.19 Mhz/114 none (pure) pure (~Q) - //DIV93_PURE = 0x0e, // 1 1 1 0 1.19 Mhz/114 divide by 31 pure (~Q) - //DIV3_POLY5 = 0x0f; // 1 1 1 1 1.19 Mhz/114 5-bit poly pure (~Q) - - const int - AUDC0 = 0x15, // audio control 0 (D3-0) - AUDC1 = 0x16, // audio control 1 (D4-0) - AUDF0 = 0x17, // audio frequency 0 (D4-0) - AUDF1 = 0x18, // audio frequency 1 (D3-0) - AUDV0 = 0x19, // audio volume 0 (D3-0) - AUDV1 = 0x1a; // audio volume 1 (D3-0) - - // The 4bit and 5bit patterns are the identical ones used in the tia chip. - readonly byte[] Bit4 = new byte[] { 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0 }; // 2^4 - 1 = 15 - readonly byte[] Bit5 = new byte[] { 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1 }; // 2^5 - 1 = 31 - - // [Ron] treated the 'Div by 31' counter as another polynomial because of - // the way it operates. It does not have a 50% duty cycle, but instead - // has a 13:18 ratio (of course, 13+18 = 31). This could also be - // implemented by using counters. - readonly byte[] Div31 = new byte[] { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; - - // Rather than have a table with 511 entries, I use a random number - readonly byte[] Bit9 = new byte[511]; // 2^9 - 1 = 511 - - readonly int[] P4 = new int[2]; // Position counter for the 4-bit POLY array - readonly int[] P5 = new int[2]; // Position counter for the 5-bit POLY array - readonly int[] P9 = new int[2]; // Position counter for the 9-bit POLY array - - readonly int[] DivByNCounter = new int[2]; // Divide by n counter, one for each channel - readonly int[] DivByNMaximum = new int[2]; // Divide by n maximum, one for each channel - - readonly int _cpuClocksPerSample; - - #endregion - - #region Object State - - readonly MachineBase M; - - // The TIA Sound registers - readonly byte[] AUDC = new byte[2]; - readonly byte[] AUDF = new byte[2]; - readonly byte[] AUDV = new byte[2]; - - // The last output volume for each channel - readonly byte[] OutputVol = new byte[2]; - - // Used to determine how much sound to render - ulong LastUpdateCPUClock; - - int BufferIndex; - - #endregion - - #region Public Members - - public void Reset() - { - for (var chan = 0; chan < 2; chan++) - { - OutputVol[chan] = 0; - DivByNCounter[chan] = 0; - DivByNMaximum[chan] = 0; - AUDC[chan] = 0; - AUDF[chan] = 0; - AUDV[chan] = 0; - P4[chan] = 0; - P5[chan] = 0; - P9[chan] = 0; - } - } - - public void StartFrame() - { - LastUpdateCPUClock = M.CPU.Clock; - BufferIndex = 0; - } - - public void EndFrame() - { - RenderSamples(M.FrameBuffer.SoundBufferByteLength - BufferIndex); - } - - public void Update(ushort addr, byte data) - { - if (M.CPU.Clock > LastUpdateCPUClock) - { - var updCPUClocks = (int)(M.CPU.Clock - LastUpdateCPUClock); - var samples = updCPUClocks / _cpuClocksPerSample; - RenderSamples(samples); - LastUpdateCPUClock += (ulong)(samples * _cpuClocksPerSample); - } - - byte chan; - - switch (addr) - { - case AUDC0: - AUDC[0] = (byte)(data & 0x0f); - chan = 0; - break; - case AUDC1: - AUDC[1] = (byte)(data & 0x0f); - chan = 1; - break; - case AUDF0: - AUDF[0] = (byte)(data & 0x1f); - chan = 0; - break; - case AUDF1: - AUDF[1] = (byte)(data & 0x1f); - chan = 1; - break; - case AUDV0: - AUDV[0] = (byte)(data & 0x0f); - chan = 0; - break; - case AUDV1: - AUDV[1] = (byte)(data & 0x0f); - chan = 1; - break; - default: - return; - } - - byte new_divn_max; - - if (AUDC[chan] == SET_TO_1) - { - // indicate the clock is zero so no process will occur - new_divn_max = 0; - // and set the output to the selected volume - OutputVol[chan] = AUDV[chan]; - } - else - { - // otherwise calculate the 'divide by N' value - new_divn_max = (byte)(AUDF[chan] + 1); - // if bits D2 & D3 are set, then multiply the 'div by n' count by 3 - if ((AUDC[chan] & 0x0c) == 0x0c) - { - new_divn_max *= 3; - } - } - - // only reset those channels that have changed - if (new_divn_max != DivByNMaximum[chan]) - { - DivByNMaximum[chan] = new_divn_max; - - // if the channel is now volume only or was volume only... - if (DivByNCounter[chan] == 0 || new_divn_max == 0) - { - // reset the counter (otherwise let it complete the previous) - DivByNCounter[chan] = new_divn_max; - } - } - } - - #endregion - - #region Constructors - - private TIASound() - { - var r = new Random(); - r.NextBytes(Bit9); - for (var i = 0; i < Bit9.Length; i++) - { - Bit9[i] &= 0x01; - } - } - - public TIASound(MachineBase m, int cpuClocksPerSample) : this() - { - if (m == null) - throw new ArgumentNullException("m"); - if (cpuClocksPerSample <= 0) - throw new ArgumentException("cpuClocksPerSample must be positive."); - - M = m; - _cpuClocksPerSample = cpuClocksPerSample; - } - - #endregion - - #region Serialization Members - - public TIASound(DeserializationContext input, MachineBase m, int cpuClocksPerSample) : this(m, cpuClocksPerSample) - { - if (input == null) - throw new ArgumentNullException("input"); - - input.CheckVersion(1); - Bit9 = input.ReadExpectedBytes(511); - P4 = input.ReadIntegers(2); - P5 = input.ReadIntegers(2); - P9 = input.ReadIntegers(2); - DivByNCounter = input.ReadIntegers(2); - DivByNMaximum = input.ReadIntegers(2); - AUDC = input.ReadExpectedBytes(2); - AUDF = input.ReadExpectedBytes(2); - AUDV = input.ReadExpectedBytes(2); - OutputVol = input.ReadExpectedBytes(2); - LastUpdateCPUClock = input.ReadUInt64(); - BufferIndex = input.ReadInt32(); - } - - public void GetObjectData(SerializationContext output) - { - if (output == null) - throw new ArgumentNullException("output"); - - output.WriteVersion(1); - output.Write(Bit9); - output.Write(P4); - output.Write(P5); - output.Write(P9); - output.Write(DivByNCounter); - output.Write(DivByNMaximum); - output.Write(AUDC); - output.Write(AUDF); - output.Write(AUDV); - output.Write(OutputVol); - output.Write(LastUpdateCPUClock); - output.Write(BufferIndex); - } - - #endregion - - #region Helpers - - void RenderSamples(int count) - { - for (; BufferIndex < M.FrameBuffer.SoundBufferByteLength && count-- > 0; BufferIndex++) - { - if (DivByNCounter[0] > 1) - { - DivByNCounter[0]--; - } - else if (DivByNCounter[0] == 1) - { - DivByNCounter[0] = DivByNMaximum[0]; - ProcessChannel(0); - } - if (DivByNCounter[1] > 1) - { - DivByNCounter[1]--; - } - else if (DivByNCounter[1] == 1) - { - DivByNCounter[1] = DivByNMaximum[1]; - ProcessChannel(1); - } - - M.FrameBuffer.SoundBuffer[BufferIndex] += (byte)(OutputVol[0] + OutputVol[1]); - } - } - - void ProcessChannel(int chan) - { - // the P5 counter has multiple uses, so we inc it here - if (++P5[chan] >= 31) - { // POLY5 size: 2^5 - 1 = 31 - P5[chan] = 0; - } - - // check clock modifier for clock tick - if ((AUDC[chan] & 0x02) == 0 || - ((AUDC[chan] & 0x01) == 0 && Div31[P5[chan]] == 1) || - ((AUDC[chan] & 0x01) == 1 && Bit5[P5[chan]] == 1)) - { - if ((AUDC[chan] & 0x04) != 0) - { // pure modified clock selected - OutputVol[chan] = (OutputVol[chan] != 0) ? (byte)0 : AUDV[chan]; - } - else if ((AUDC[chan] & 0x08) != 0) - { // check for poly5/poly9 - if (AUDC[chan] == POLY9) - { // check for poly9 - if (++P9[chan] >= 511) - { // poly9 size: 2^9 - 1 = 511 - P9[chan] = 0; - } - OutputVol[chan] = (Bit9[P9[chan]] == 1) ? AUDV[chan] : (byte)0; - } - else - { // must be poly5 - OutputVol[chan] = (Bit5[P5[chan]] == 1) ? AUDV[chan] : (byte)0; - } - } - else - { // poly4 is the only remaining possibility - if (++P4[chan] >= 15) - { // POLY4 size: 2^4 - 1 = 15 - P4[chan] = 0; - } - OutputVol[chan] = (Bit4[P4[chan]] == 1) ? AUDV[chan] : (byte)0; - } - } - } - - #endregion - } -} From 534bb63082c8779e685a59d9e9b86c5136330649 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:38:21 -0400 Subject: [PATCH 71/82] Delete TIATables.cs --- EMU7800/Core/TIATables.cs | 424 -------------------------------------- 1 file changed, 424 deletions(-) delete mode 100644 EMU7800/Core/TIATables.cs diff --git a/EMU7800/Core/TIATables.cs b/EMU7800/Core/TIATables.cs deleted file mode 100644 index 4a38a2b4821..00000000000 --- a/EMU7800/Core/TIATables.cs +++ /dev/null @@ -1,424 +0,0 @@ -/* - * TIATables.cs - * - * Mask tables for the Television Interface Adaptor class. All derived from - * Bradford Mott's Stella code. - * - * Copyright � 2003, 2004 Mike Murphy - * - */ -namespace EMU7800.Core -{ - public static class TIATables - { - public static readonly TIACxPairFlags[] CollisionMask = BuildCollisionMaskTable(); - public static readonly uint[][] PFMask = BuildPFMaskTable(); - public static readonly bool[][] BLMask = BuildBLMaskTable(); - public static readonly bool[][][] MxMask = BuildMxMaskTable(); - public static readonly byte[][][] PxMask = BuildPxMaskTable(); - public static readonly byte[] GRPReflect = BuildGRPReflectTable(); - - public static readonly int[] NTSCPalette = - { - 0x000000, 0x000000, 0x4a4a4a, 0x4a4a4a, - 0x6f6f6f, 0x6f6f6f, 0x8e8e8e, 0x8e8e8e, - 0xaaaaaa, 0xaaaaaa, 0xc0c0c0, 0xc0c0c0, - 0xd6d6d6, 0xd6d6d6, 0xececec, 0xececec, - - 0x484800, 0x484800, 0x69690f, 0x69690f, - 0x86861d, 0x86861d, 0xa2a22a, 0xa2a22a, - 0xbbbb35, 0xbbbb35, 0xd2d240, 0xd2d240, - 0xe8e84a, 0xe8e84a, 0xfcfc54, 0xfcfc54, - - 0x7c2c00, 0x7c2c00, 0x904811, 0x904811, - 0xa26221, 0xa26221, 0xb47a30, 0xb47a30, - 0xc3903d, 0xc3903d, 0xd2a44a, 0xd2a44a, - 0xdfb755, 0xdfb755, 0xecc860, 0xecc860, - - 0x901c00, 0x901c00, 0xa33915, 0xa33915, - 0xb55328, 0xb55328, 0xc66c3a, 0xc66c3a, - 0xd5824a, 0xd5824a, 0xe39759, 0xe39759, - 0xf0aa67, 0xf0aa67, 0xfcbc74, 0xfcbc74, - - 0x940000, 0x940000, 0xa71a1a, 0xa71a1a, - 0xb83232, 0xb83232, 0xc84848, 0xc84848, - 0xd65c5c, 0xd65c5c, 0xe46f6f, 0xe46f6f, - 0xf08080, 0xf08080, 0xfc9090, 0xfc9090, - - 0x840064, 0x840064, 0x97197a, 0x97197a, - 0xa8308f, 0xa8308f, 0xb846a2, 0xb846a2, - 0xc659b3, 0xc659b3, 0xd46cc3, 0xd46cc3, - 0xe07cd2, 0xe07cd2, 0xec8ce0, 0xec8ce0, - - 0x500084, 0x500084, 0x68199a, 0x68199a, - 0x7d30ad, 0x7d30ad, 0x9246c0, 0x9246c0, - 0xa459d0, 0xa459d0, 0xb56ce0, 0xb56ce0, - 0xc57cee, 0xc57cee, 0xd48cfc, 0xd48cfc, - - 0x140090, 0x140090, 0x331aa3, 0x331aa3, - 0x4e32b5, 0x4e32b5, 0x6848c6, 0x6848c6, - 0x7f5cd5, 0x7f5cd5, 0x956fe3, 0x956fe3, - 0xa980f0, 0xa980f0, 0xbc90fc, 0xbc90fc, - - 0x000094, 0x000094, 0x181aa7, 0x181aa7, - 0x2d32b8, 0x2d32b8, 0x4248c8, 0x4248c8, - 0x545cd6, 0x545cd6, 0x656fe4, 0x656fe4, - 0x7580f0, 0x7580f0, 0x8490fc, 0x8490fc, - - 0x001c88, 0x001c88, 0x183b9d, 0x183b9d, - 0x2d57b0, 0x2d57b0, 0x4272c2, 0x4272c2, - 0x548ad2, 0x548ad2, 0x65a0e1, 0x65a0e1, - 0x75b5ef, 0x75b5ef, 0x84c8fc, 0x84c8fc, - - 0x003064, 0x003064, 0x185080, 0x185080, - 0x2d6d98, 0x2d6d98, 0x4288b0, 0x4288b0, - 0x54a0c5, 0x54a0c5, 0x65b7d9, 0x65b7d9, - 0x75cceb, 0x75cceb, 0x84e0fc, 0x84e0fc, - - 0x004030, 0x004030, 0x18624e, 0x18624e, - 0x2d8169, 0x2d8169, 0x429e82, 0x429e82, - 0x54b899, 0x54b899, 0x65d1ae, 0x65d1ae, - 0x75e7c2, 0x75e7c2, 0x84fcd4, 0x84fcd4, - - 0x004400, 0x004400, 0x1a661a, 0x1a661a, - 0x328432, 0x328432, 0x48a048, 0x48a048, - 0x5cba5c, 0x5cba5c, 0x6fd26f, 0x6fd26f, - 0x80e880, 0x80e880, 0x90fc90, 0x90fc90, - - 0x143c00, 0x143c00, 0x355f18, 0x355f18, - 0x527e2d, 0x527e2d, 0x6e9c42, 0x6e9c42, - 0x87b754, 0x87b754, 0x9ed065, 0x9ed065, - 0xb4e775, 0xb4e775, 0xc8fc84, 0xc8fc84, - - 0x303800, 0x303800, 0x505916, 0x505916, - 0x6d762b, 0x6d762b, 0x88923e, 0x88923e, - 0xa0ab4f, 0xa0ab4f, 0xb7c25f, 0xb7c25f, - 0xccd86e, 0xccd86e, 0xe0ec7c, 0xe0ec7c, - - 0x482c00, 0x482c00, 0x694d14, 0x694d14, - 0x866a26, 0x866a26, 0xa28638, 0xa28638, - 0xbb9f47, 0xbb9f47, 0xd2b656, 0xd2b656, - 0xe8cc63, 0xe8cc63, 0xfce070, 0xfce070 - }; - - public static readonly int[] PALPalette = - { - 0x000000, 0x000000, 0x2b2b2b, 0x2b2b2b, - 0x525252, 0x525252, 0x767676, 0x767676, - 0x979797, 0x979797, 0xb6b6b6, 0xb6b6b6, - 0xd2d2d2, 0xd2d2d2, 0xececec, 0xececec, - - 0x000000, 0x000000, 0x2b2b2b, 0x2b2b2b, - 0x525252, 0x525252, 0x767676, 0x767676, - 0x979797, 0x979797, 0xb6b6b6, 0xb6b6b6, - 0xd2d2d2, 0xd2d2d2, 0xececec, 0xececec, - - 0x805800, 0x000000, 0x96711a, 0x2b2b2b, - 0xab8732, 0x525252, 0xbe9c48, 0x767676, - 0xcfaf5c, 0x979797, 0xdfc06f, 0xb6b6b6, - 0xeed180, 0xd2d2d2, 0xfce090, 0xececec, - - 0x445c00, 0x000000, 0x5e791a, 0x2b2b2b, - 0x769332, 0x525252, 0x8cac48, 0x767676, - 0xa0c25c, 0x979797, 0xb3d76f, 0xb6b6b6, - 0xc4ea80, 0xd2d2d2, 0xd4fc90, 0xececec, - - 0x703400, 0x000000, 0x89511a, 0x2b2b2b, - 0xa06b32, 0x525252, 0xb68448, 0x767676, - 0xc99a5c, 0x979797, 0xdcaf6f, 0xb6b6b6, - 0xecc280, 0xd2d2d2, 0xfcd490, 0xececec, - - 0x006414, 0x000000, 0x1a8035, 0x2b2b2b, - 0x329852, 0x525252, 0x48b06e, 0x767676, - 0x5cc587, 0x979797, 0x6fd99e, 0xb6b6b6, - 0x80ebb4, 0xd2d2d2, 0x90fcc8, 0xececec, - - 0x700014, 0x000000, 0x891a35, 0x2b2b2b, - 0xa03252, 0x525252, 0xb6486e, 0x767676, - 0xc95c87, 0x979797, 0xdc6f9e, 0xb6b6b6, - 0xec80b4, 0xd2d2d2, 0xfc90c8, 0xececec, - - 0x005c5c, 0x000000, 0x1a7676, 0x2b2b2b, - 0x328e8e, 0x525252, 0x48a4a4, 0x767676, - 0x5cb8b8, 0x979797, 0x6fcbcb, 0xb6b6b6, - 0x80dcdc, 0xd2d2d2, 0x90ecec, 0xececec, - - 0x70005c, 0x000000, 0x841a74, 0x2b2b2b, - 0x963289, 0x525252, 0xa8489e, 0x767676, - 0xb75cb0, 0x979797, 0xc66fc1, 0xb6b6b6, - 0xd380d1, 0xd2d2d2, 0xe090e0, 0xececec, - - 0x003c70, 0x000000, 0x195a89, 0x2b2b2b, - 0x2f75a0, 0x525252, 0x448eb6, 0x767676, - 0x57a5c9, 0x979797, 0x68badc, 0xb6b6b6, - 0x79ceec, 0xd2d2d2, 0x88e0fc, 0xececec, - - 0x580070, 0x000000, 0x6e1a89, 0x2b2b2b, - 0x8332a0, 0x525252, 0x9648b6, 0x767676, - 0xa75cc9, 0x979797, 0xb76fdc, 0xb6b6b6, - 0xc680ec, 0xd2d2d2, 0xd490fc, 0xececec, - - 0x002070, 0x000000, 0x193f89, 0x2b2b2b, - 0x2f5aa0, 0x525252, 0x4474b6, 0x767676, - 0x578bc9, 0x979797, 0x68a1dc, 0xb6b6b6, - 0x79b5ec, 0xd2d2d2, 0x88c8fc, 0xececec, - - 0x340080, 0x000000, 0x4a1a96, 0x2b2b2b, - 0x5f32ab, 0x525252, 0x7248be, 0x767676, - 0x835ccf, 0x979797, 0x936fdf, 0xb6b6b6, - 0xa280ee, 0xd2d2d2, 0xb090fc, 0xececec, - - 0x000088, 0x000000, 0x1a1a9d, 0x2b2b2b, - 0x3232b0, 0x525252, 0x4848c2, 0x767676, - 0x5c5cd2, 0x979797, 0x6f6fe1, 0xb6b6b6, - 0x8080ef, 0xd2d2d2, 0x9090fc, 0xececec, - - 0x000000, 0x000000, 0x2b2b2b, 0x2b2b2b, - 0x525252, 0x525252, 0x767676, 0x767676, - 0x979797, 0x979797, 0xb6b6b6, 0xb6b6b6, - 0xd2d2d2, 0xd2d2d2, 0xececec, 0xececec, - - 0x000000, 0x000000, 0x2b2b2b, 0x2b2b2b, - 0x525252, 0x525252, 0x767676, 0x767676, - 0x979797, 0x979797, 0xb6b6b6, 0xb6b6b6, - 0xd2d2d2, 0xd2d2d2, 0xececec, 0xececec - }; - - static uint[][] BuildPFMaskTable() - { - var tabl = new uint[2][]; - tabl[0] = new uint[160]; - tabl[1] = new uint[160]; - - for (var i = 0; i < 20; i++) - { - uint mask = 0; - if (i < 4) - { - mask = (uint)(1 << i); - } - else if (i < 12) - { - mask = (uint)(1 << (11 + 4 - i)); - } - else if (i < 20) - { - mask = (uint)(1 << i); - } - for (var j = 0; j < 4; j++) - { - // for non-reflected mode - tabl[0][4 * i + j] = mask; - tabl[0][80 + 4 * i + j] = mask; - - // for reflected mode - tabl[1][4 * i + j] = mask; - tabl[1][159 - 4 * i - j] = mask; - } - } - return tabl; - } - - static bool[][] BuildBLMaskTable() - { - var tabl = new bool[4][]; - for (var size = 0; size < 4; size++) - { - tabl[size] = new bool[160]; - for (var i = 0; i < 160; i++) - { - tabl[size][i] = false; - } - for (var i = 0; i < (1 << size); i++) - { - tabl[size][i] = true; - } - } - return tabl; - } - - static bool[][][] BuildMxMaskTable() - { - var tabl = new bool[4][][]; - for (var i = 0; i < 4; i++) - { - tabl[i] = new bool[8][]; - for (var j = 0; j < 8; j++) - { - tabl[i][j] = new bool[160]; - for (var k = 0; k < 160; k++) - { - tabl[i][j][k] = false; - } - } - } - - for (var size = 0; size < 4; size++) - { - for (var i = 0; i < (1 << size); i++) - { - tabl[size][0][i] = true; - - tabl[size][1][i] = true; - tabl[size][1][i + 16] = true; - - tabl[size][2][i] = true; - tabl[size][2][i + 32] = true; - - tabl[size][3][i] = true; - tabl[size][3][i + 16] = true; - tabl[size][3][i + 32] = true; - - tabl[size][4][i] = true; - tabl[size][4][i + 64] = true; - - tabl[size][5][i] = true; - - tabl[size][6][i] = true; - tabl[size][6][i + 32] = true; - tabl[size][6][i + 64] = true; - - tabl[size][7][i] = true; - } - } - return tabl; - } - - static byte[][][] BuildPxMaskTable() - { - // [suppress mode, nusiz, pixel] - // suppress=1: suppress on - // suppress=0: suppress off - var tabl = new byte[2][][]; //2 8 160 - tabl[0] = new byte[8][]; - tabl[1] = new byte[8][]; - for (var nusiz = 0; nusiz < 8; nusiz++) - { - tabl[0][nusiz] = new byte[160]; - tabl[1][nusiz] = new byte[160]; - for (var hpos = 0; hpos < 160; hpos++) - { - // nusiz: - // 0: one copy - // 1: two copies-close - // 2: two copies-med - // 3: three copies-close - // 4: two copies-wide - // 5: double size player - // 6: 3 copies medium - // 7: quad sized player - tabl[0][nusiz][hpos] = tabl[1][nusiz][hpos] = 0; - if (nusiz >= 0 && nusiz <= 4 || nusiz == 6) - { - if (hpos >= 0 && hpos < 8) - { - tabl[0][nusiz][hpos] = (byte)(1 << (7 - hpos)); - } - } - if (nusiz == 1 || nusiz == 3) - { - if (hpos >= 16 && hpos < 24) - { - tabl[0][nusiz][hpos] = (byte)(1 << (23 - hpos)); - tabl[1][nusiz][hpos] = (byte)(1 << (23 - hpos)); - } - } - if (nusiz == 2 || nusiz == 3 || nusiz == 6) - { - if (hpos >= 32 && hpos < 40) - { - tabl[0][nusiz][hpos] = (byte)(1 << (39 - hpos)); - tabl[1][nusiz][hpos] = (byte)(1 << (39 - hpos)); - } - } - if (nusiz == 4 || nusiz == 6) - { - if (hpos >= 64 && hpos < 72) - { - tabl[0][nusiz][hpos] = (byte)(1 << (71 - hpos)); - tabl[1][nusiz][hpos] = (byte)(1 << (71 - hpos)); - } - } - if (nusiz == 5) - { - if (hpos >= 0 && hpos < 16) - { - tabl[0][nusiz][hpos] = (byte)(1 << ((15 - hpos) >> 1)); - } - } - if (nusiz == 7) - { - if (hpos >= 0 && hpos < 32) - { - tabl[0][nusiz][hpos] = (byte)(1 << ((31 - hpos) >> 2)); - } - } - } - - var shift = nusiz == 5 || nusiz == 7 ? 2 : 1; - while (shift-- > 0) - { - for (var i = 159; i > 0; i--) - { - tabl[0][nusiz][i] = tabl[0][nusiz][i - 1]; - tabl[1][nusiz][i] = tabl[1][nusiz][i - 1]; - } - tabl[0][nusiz][0] = tabl[1][nusiz][0] = 0; - } - } - return tabl; - } - - static byte[] BuildGRPReflectTable() - { - var tabl = new byte[256]; - - for (var i = 0; i < 256; i++) - { - var s = (byte)i; - var r = (byte)0; - for (var j = 0; j < 8; j++) - { - r <<= 1; - r |= (byte)(s & 1); - s >>= 1; - } - tabl[i] = r; - } - return tabl; - } - - static bool tstCx(int i, TIACxFlags cxf1, TIACxFlags cxf2) - { - var f1 = (int)cxf1; - var f2 = (int)cxf2; - return ((i & f1) != 0) && ((i & f2) != 0); - } - - static TIACxPairFlags[] BuildCollisionMaskTable() - { - var tabl = new TIACxPairFlags[64]; - - for (var i = 0; i < 64; i++) - { - tabl[i] = 0; - if (tstCx(i, TIACxFlags.M0, TIACxFlags.P1)) { tabl[i] |= TIACxPairFlags.M0P1; } - if (tstCx(i, TIACxFlags.M0, TIACxFlags.P0)) { tabl[i] |= TIACxPairFlags.M0P0; } - if (tstCx(i, TIACxFlags.M1, TIACxFlags.P0)) { tabl[i] |= TIACxPairFlags.M1P0; } - if (tstCx(i, TIACxFlags.M1, TIACxFlags.P1)) { tabl[i] |= TIACxPairFlags.M1P1; } - if (tstCx(i, TIACxFlags.P0, TIACxFlags.PF)) { tabl[i] |= TIACxPairFlags.P0PF; } - if (tstCx(i, TIACxFlags.P0, TIACxFlags.BL)) { tabl[i] |= TIACxPairFlags.P0BL; } - if (tstCx(i, TIACxFlags.P1, TIACxFlags.PF)) { tabl[i] |= TIACxPairFlags.P1PF; } - if (tstCx(i, TIACxFlags.P1, TIACxFlags.BL)) { tabl[i] |= TIACxPairFlags.P1BL; } - if (tstCx(i, TIACxFlags.M0, TIACxFlags.PF)) { tabl[i] |= TIACxPairFlags.M0PF; } - if (tstCx(i, TIACxFlags.M0, TIACxFlags.BL)) { tabl[i] |= TIACxPairFlags.M0BL; } - if (tstCx(i, TIACxFlags.M1, TIACxFlags.PF)) { tabl[i] |= TIACxPairFlags.M1PF; } - if (tstCx(i, TIACxFlags.M1, TIACxFlags.BL)) { tabl[i] |= TIACxPairFlags.M1BL; } - if (tstCx(i, TIACxFlags.BL, TIACxFlags.PF)) { tabl[i] |= TIACxPairFlags.BLPF; } - if (tstCx(i, TIACxFlags.P0, TIACxFlags.P1)) { tabl[i] |= TIACxPairFlags.P0P1; } - if (tstCx(i, TIACxFlags.M0, TIACxFlags.M1)) { tabl[i] |= TIACxPairFlags.M0M1; } - } - return tabl; - } - } -} From 7717bd3181a47f5eb2b0b963bfba43a753311ef4 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:39:57 -0400 Subject: [PATCH 72/82] Delete Atari7800.IDebuggable.cs --- .../Atari/7800/Atari7800.IDebuggable.cs | 76 ------------------- 1 file changed, 76 deletions(-) delete mode 100644 BizHawk.Emulation.Cores/Consoles/Atari/7800/Atari7800.IDebuggable.cs diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/7800/Atari7800.IDebuggable.cs b/BizHawk.Emulation.Cores/Consoles/Atari/7800/Atari7800.IDebuggable.cs deleted file mode 100644 index f590372d212..00000000000 --- a/BizHawk.Emulation.Cores/Consoles/Atari/7800/Atari7800.IDebuggable.cs +++ /dev/null @@ -1,76 +0,0 @@ -using System; -using System.Collections.Generic; - -using BizHawk.Emulation.Common; - -namespace BizHawk.Emulation.Cores.Atari.Atari7800 -{ - public partial class Atari7800 : IDebuggable - { - public IDictionary GetCpuFlagsAndRegisters() - { - return new Dictionary - { - ["A"] = _theMachine.CPU.A, - ["P"] = _theMachine.CPU.P, - ["PC"] = _theMachine.CPU.PC, - ["S"] = _theMachine.CPU.S, - ["X"] = _theMachine.CPU.X, - ["Y"] = _theMachine.CPU.Y, - ["Flag B"] = _theMachine.CPU.fB, - ["Flag C"] = _theMachine.CPU.fC, - ["Flag D"] = _theMachine.CPU.fD, - ["Flag I"] = _theMachine.CPU.fI, - ["Flag N"] = _theMachine.CPU.fN, - ["Flag V"] = _theMachine.CPU.fV, - ["Flag Z"] = _theMachine.CPU.fZ - }; - } - - public void SetCpuRegister(string register, int value) - { - switch (register) - { - default: - throw new InvalidOperationException(); - case "A": - _theMachine.CPU.A = (byte)value; - break; - case "P": - _theMachine.CPU.P = (byte)value; - break; - case "PC": - _theMachine.CPU.PC = (ushort)value; - break; - case "S": - _theMachine.CPU.S = (byte)value; - break; - case "X": - _theMachine.CPU.X = (byte)value; - break; - case "Y": - _theMachine.CPU.Y = (byte)value; - break; - } - } - - public IMemoryCallbackSystem MemoryCallbacks - { - [FeatureNotImplemented] - get { throw new NotImplementedException(); } - } - - public bool CanStep(StepType type) - { - return false; - } - - [FeatureNotImplemented] - public void Step(StepType type) - { - throw new NotImplementedException(); - } - - public int TotalExecutedCycles => (int)_theMachine.CPU.Clock; - } -} From ede569dab39a18aec618184c320787e266b27bb4 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:40:04 -0400 Subject: [PATCH 73/82] Delete Atari7800.IEmulator.cs --- .../Atari/7800/Atari7800.IEmulator.cs | 59 ------------------- 1 file changed, 59 deletions(-) delete mode 100644 BizHawk.Emulation.Cores/Consoles/Atari/7800/Atari7800.IEmulator.cs diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/7800/Atari7800.IEmulator.cs b/BizHawk.Emulation.Cores/Consoles/Atari/7800/Atari7800.IEmulator.cs deleted file mode 100644 index dd2093830cf..00000000000 --- a/BizHawk.Emulation.Cores/Consoles/Atari/7800/Atari7800.IEmulator.cs +++ /dev/null @@ -1,59 +0,0 @@ -using BizHawk.Emulation.Common; - -namespace BizHawk.Emulation.Cores.Atari.Atari7800 -{ - public partial class Atari7800 : IEmulator - { - public IEmulatorServiceProvider ServiceProvider { get; } - - public ControllerDefinition ControllerDefinition { get; private set; } - - public void FrameAdvance(IController controller, bool render, bool rendersound) - { - _frame++; - - if (controller.IsPressed("Power")) - { - // it seems that theMachine.Reset() doesn't clear ram, etc - // this should leave hsram intact but clear most other things - HardReset(); - } - - ControlAdapter.Convert(controller, _theMachine.InputState); - _theMachine.ComputeNextFrame(_avProvider.Framebuffer); - - _islag = _theMachine.InputState.Lagged; - - if (_islag) - { - _lagcount++; - } - - _avProvider.FillFrameBuffer(); - } - - public int Frame => _frame; - - public string SystemId => "A78"; // TODO 2600? - - public bool DeterministicEmulation { get; set; } - - public void ResetCounters() - { - _frame = 0; - _lagcount = 0; - _islag = false; - } - - public CoreComm CoreComm { get; } - - public void Dispose() - { - if (_avProvider != null) - { - _avProvider.Dispose(); - _avProvider = null; - } - } - } -} From 79e9cfd69ac25f5829d4cf0a07e5147c11ab4e7f Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:40:13 -0400 Subject: [PATCH 74/82] Delete Atari7800.IInputPollable.cs --- .../Atari/7800/Atari7800.IInputPollable.cs | 24 ------------------- 1 file changed, 24 deletions(-) delete mode 100644 BizHawk.Emulation.Cores/Consoles/Atari/7800/Atari7800.IInputPollable.cs diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/7800/Atari7800.IInputPollable.cs b/BizHawk.Emulation.Cores/Consoles/Atari/7800/Atari7800.IInputPollable.cs deleted file mode 100644 index ddd18290a01..00000000000 --- a/BizHawk.Emulation.Cores/Consoles/Atari/7800/Atari7800.IInputPollable.cs +++ /dev/null @@ -1,24 +0,0 @@ -using BizHawk.Emulation.Common; - -namespace BizHawk.Emulation.Cores.Atari.Atari7800 -{ - public partial class Atari7800 : IInputPollable - { - public int LagCount - { - get { return _lagcount; } - set { _lagcount = value; } - } - - public bool IsLagFrame - { - get { return _islag; } - set { _islag = value; } - } - - public IInputCallbackSystem InputCallbacks { get; } = new InputCallbackSystem(); - - private bool _islag = true; - private int _lagcount; - } -} From 588d60343a68f119ca5e58f4ee7129ac6945ec66 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:40:21 -0400 Subject: [PATCH 75/82] Delete Atari7800.IMemoryDomains.cs --- .../Atari/7800/Atari7800.IMemoryDomains.cs | 93 ------------------- 1 file changed, 93 deletions(-) delete mode 100644 BizHawk.Emulation.Cores/Consoles/Atari/7800/Atari7800.IMemoryDomains.cs diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/7800/Atari7800.IMemoryDomains.cs b/BizHawk.Emulation.Cores/Consoles/Atari/7800/Atari7800.IMemoryDomains.cs deleted file mode 100644 index abc645e827a..00000000000 --- a/BizHawk.Emulation.Cores/Consoles/Atari/7800/Atari7800.IMemoryDomains.cs +++ /dev/null @@ -1,93 +0,0 @@ -using System; -using System.Collections.Generic; - -using BizHawk.Emulation.Common; -using EMU7800.Core; - -namespace BizHawk.Emulation.Cores.Atari.Atari7800 -{ - public partial class Atari7800 - { - private List _MemoryDomains; - - private IMemoryDomains MemoryDomains; - - public void SetupMemoryDomains(HSC7800 hsc7800) - { - // reset memory domains - if (_MemoryDomains == null) - { - _MemoryDomains = new List(); - if (_theMachine is Machine7800) - { - _MemoryDomains.Add(new MemoryDomainDelegate( - "RAM", 0x1000, MemoryDomain.Endian.Unknown, - delegate(long addr) - { - if (addr < 0 || addr >= 0x1000) - { - throw new ArgumentOutOfRangeException(); - } - - if (addr < 0x800) - { - return ((Machine7800)_theMachine).RAM1[(ushort)addr]; - } - - return ((Machine7800)_theMachine).RAM2[(ushort)addr]; - }, - - delegate(long addr, byte val) - { - if (addr < 0 || addr >= 0x1000) - { - throw new ArgumentOutOfRangeException(); - } - else if (addr < 0x800) - { - ((Machine7800)_theMachine).RAM1[(ushort)(addr & 0x800)] = val; - } - else - { - ((Machine7800)_theMachine).RAM2[(ushort)addr] = val; - } - }, 1)); - - _MemoryDomains.Add(new MemoryDomainByteArray( - "BIOS ROM", MemoryDomain.Endian.Unknown, - _bios, false, 1)); - - if (hsc7800 != null) - { - _MemoryDomains.Add(new MemoryDomainByteArray( - "HSC ROM", MemoryDomain.Endian.Unknown, _hsbios, false, 1)); - - _MemoryDomains.Add(new MemoryDomainByteArray( - "HSC RAM", MemoryDomain.Endian.Unknown, _hsram, true, 1)); - } - - _MemoryDomains.Add(new MemoryDomainDelegate( - "System Bus", 65536, MemoryDomain.Endian.Unknown, - delegate(long addr) - { - if (addr < 0 || addr >= 0x10000) - throw new ArgumentOutOfRangeException(); - return _theMachine.Mem[(ushort)addr]; - }, - delegate(long addr, byte val) - { - if (addr < 0 || addr >= 0x10000) - throw new ArgumentOutOfRangeException(); - _theMachine.Mem[(ushort)addr] = val; - }, 1)); - } - else // todo 2600? - { - } - - MemoryDomains = new MemoryDomainList(_MemoryDomains); - (ServiceProvider as BasicServiceProvider).Register(MemoryDomains); - } - } - } -} From 1c989d04325ecd1761ee7bb05650d606ab4cd969 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:40:28 -0400 Subject: [PATCH 76/82] Delete Atari7800.ISaveRam.cs --- .../Consoles/Atari/7800/Atari7800.ISaveRam.cs | 22 ------------------- 1 file changed, 22 deletions(-) delete mode 100644 BizHawk.Emulation.Cores/Consoles/Atari/7800/Atari7800.ISaveRam.cs diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/7800/Atari7800.ISaveRam.cs b/BizHawk.Emulation.Cores/Consoles/Atari/7800/Atari7800.ISaveRam.cs deleted file mode 100644 index 64c572c4ba0..00000000000 --- a/BizHawk.Emulation.Cores/Consoles/Atari/7800/Atari7800.ISaveRam.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; -using BizHawk.Emulation.Common; -using EMU7800.Core; - -namespace BizHawk.Emulation.Cores.Atari.Atari7800 -{ - public partial class Atari7800 : ISaveRam - { - public byte[] CloneSaveRam() - { - return (byte[])_hsram.Clone(); - } - - public void StoreSaveRam(byte[] data) - { - Buffer.BlockCopy(data, 0, _hsram, 0, data.Length); - } - - public bool SaveRamModified => _gameInfo.MachineType == MachineType.A7800PAL - || _gameInfo.MachineType == MachineType.A7800NTSC; - } -} From 17ee643a95edcbf758741a676f9d4e01029f17ac Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:40:35 -0400 Subject: [PATCH 77/82] Delete Atari7800.IStatable.cs --- .../Atari/7800/Atari7800.IStatable.cs | 66 ------------------- 1 file changed, 66 deletions(-) delete mode 100644 BizHawk.Emulation.Cores/Consoles/Atari/7800/Atari7800.IStatable.cs diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/7800/Atari7800.IStatable.cs b/BizHawk.Emulation.Cores/Consoles/Atari/7800/Atari7800.IStatable.cs deleted file mode 100644 index 428887c2507..00000000000 --- a/BizHawk.Emulation.Cores/Consoles/Atari/7800/Atari7800.IStatable.cs +++ /dev/null @@ -1,66 +0,0 @@ -using System.IO; - -using BizHawk.Common; -using BizHawk.Emulation.Common; -using EMU7800.Core; - -namespace BizHawk.Emulation.Cores.Atari.Atari7800 -{ - public partial class Atari7800 : IStatable - { - public bool BinarySaveStatesPreferred => true; - - public void SaveStateText(TextWriter writer) - { - SyncState(new Serializer(writer)); - } - - public void LoadStateText(TextReader reader) - { - SyncState(new Serializer(reader)); - } - - public void SaveStateBinary(BinaryWriter bw) - { - SyncState(new Serializer(bw)); - } - - public void LoadStateBinary(BinaryReader br) - { - SyncState(new Serializer(br)); - } - - public byte[] SaveStateBinary() - { - MemoryStream ms = new MemoryStream(); - BinaryWriter bw = new BinaryWriter(ms); - SaveStateBinary(bw); - bw.Flush(); - return ms.ToArray(); - } - - private void SyncState(Serializer ser) - { - byte[] core = null; - if (ser.IsWriter) - { - var ms = new MemoryStream(); - _theMachine.Serialize(new BinaryWriter(ms)); - ms.Close(); - core = ms.ToArray(); - } - - ser.BeginSection("Atari7800"); - ser.Sync("core", ref core, false); - ser.Sync("Lag", ref _lagcount); - ser.Sync("Frame", ref _frame); - ser.Sync("IsLag", ref _islag); - ser.EndSection(); - if (ser.IsReader) - { - _theMachine = MachineBase.Deserialize(new BinaryReader(new MemoryStream(core, false))); - _avProvider.ConnectToMachine(_theMachine, _gameInfo); - } - } - } -} From b6522a40cf808dcc7bc26de6fa81e527f8ab4ac9 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:40:43 -0400 Subject: [PATCH 78/82] Delete Atari7800.cs --- .../Consoles/Atari/7800/Atari7800.cs | 301 ------------------ 1 file changed, 301 deletions(-) delete mode 100644 BizHawk.Emulation.Cores/Consoles/Atari/7800/Atari7800.cs diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/7800/Atari7800.cs b/BizHawk.Emulation.Cores/Consoles/Atari/7800/Atari7800.cs deleted file mode 100644 index 9db05ae935a..00000000000 --- a/BizHawk.Emulation.Cores/Consoles/Atari/7800/Atari7800.cs +++ /dev/null @@ -1,301 +0,0 @@ -using System; -using System.IO; - -using BizHawk.Emulation.Common; -using EMU7800.Core; -using EMU7800.Win; - -namespace BizHawk.Emulation.Cores.Atari.Atari7800 -{ - [Core( - "EMU7800", - "", - isPorted: true, - isReleased: true, - portedVersion: "v1.5", - portedUrl: "http://emu7800.sourceforge.net/")] - [ServiceNotApplicable(typeof(ISettable<,>), typeof(IDriveLight))] - public partial class Atari7800 : IEmulator, ISaveRam, IDebuggable, IStatable, IInputPollable, IRegionable - { - // TODO: - // some things don't work when you try to plug in a 2600 game - static Atari7800() - { - // add alpha bits to palette tables - for (int i = 0; i < TIATables.NTSCPalette.Length; i++) - { - TIATables.NTSCPalette[i] |= unchecked((int)0xff000000); - } - - for (int i = 0; i < TIATables.PALPalette.Length; i++) - { - TIATables.PALPalette[i] |= unchecked((int)0xff000000); - } - - for (int i = 0; i < MariaTables.NTSCPalette.Length; i++) - { - MariaTables.NTSCPalette[i] |= unchecked((int)0xff000000); - } - - for (int i = 0; i < MariaTables.PALPalette.Length; i++) - { - MariaTables.PALPalette[i] |= unchecked((int)0xff000000); - } - } - - public Atari7800(CoreComm comm, GameInfo game, byte[] rom, string gameDbFn) - { - var ser = new BasicServiceProvider(this); - ser.Register(_avProvider); - ser.Register(_avProvider); - ServiceProvider = ser; - - CoreComm = comm; - byte[] highscoreBios = comm.CoreFileProvider.GetFirmware("A78", "Bios_HSC", false, "Some functions may not work without the high score BIOS."); - byte[] palBios = comm.CoreFileProvider.GetFirmware("A78", "Bios_PAL", false, "The game will not run if the correct region BIOS is not available."); - byte[] ntscBios = comm.CoreFileProvider.GetFirmware("A78", "Bios_NTSC", false, "The game will not run if the correct region BIOS is not available."); - - if (GameProgramLibrary.EMU7800DB == null) - { - GameProgramLibrary.EMU7800DB = new GameProgramLibrary(new StreamReader(gameDbFn)); - } - - if (rom.Length % 1024 == 128) - { - Console.WriteLine("Trimming 128 byte .a78 header..."); - byte[] newrom = new byte[rom.Length - 128]; - Buffer.BlockCopy(rom, 128, newrom, 0, newrom.Length); - rom = newrom; - } - - _gameInfo = GameProgramLibrary.EMU7800DB.TryRecognizeRom(rom); - CoreComm.RomStatusDetails = _gameInfo.ToString(); - Console.WriteLine("Rom Determiniation from 7800DB:"); - Console.WriteLine(_gameInfo.ToString()); - - _rom = rom; - _hsbios = highscoreBios; - _bios = _gameInfo.MachineType == MachineType.A7800PAL ? palBios : ntscBios; - _pal = _gameInfo.MachineType == MachineType.A7800PAL || _gameInfo.MachineType == MachineType.A2600PAL; - - if (_bios == null) - { - throw new MissingFirmwareException("The BIOS corresponding to the region of the game you loaded is required to run Atari 7800 games."); - } - - HardReset(); - } - - public DisplayType Region => _pal ? DisplayType.PAL : DisplayType.NTSC; - - public Atari7800Control ControlAdapter { get; private set; } - - private readonly byte[] _rom; - private readonly byte[] _hsbios; - private readonly byte[] _bios; - private readonly GameProgram _gameInfo; - private readonly byte[] _hsram = new byte[2048]; - private readonly bool _pal; - - private Cart _cart; - private MachineBase _theMachine; - private int _frame = 0; - - private class ConsoleLogger : ILogger - { - public void WriteLine(string format, params object[] args) - { - Console.WriteLine(format, args); - } - - public void WriteLine(object value) - { - Console.WriteLine(value); - } - - public void Write(string format, params object[] args) - { - Console.Write(format, args); - } - - public void Write(object value) - { - Console.Write(value); - } - } - - private void HardReset() - { - _cart = Cart.Create(_rom, _gameInfo.CartType); - ILogger logger = new ConsoleLogger(); - - HSC7800 hsc7800 = null; - if (_hsbios != null) - { - hsc7800 = new HSC7800(_hsbios, _hsram); - } - - Bios7800 bios7800 = new Bios7800(_bios); - _theMachine = MachineBase.Create( - _gameInfo.MachineType, - _cart, - bios7800, - hsc7800, - _gameInfo.LController, - _gameInfo.RController, - logger); - - _theMachine.Reset(); - _theMachine.InputState.InputPollCallback = InputCallbacks.Call; - - ControlAdapter = new Atari7800Control(_theMachine); - ControllerDefinition = ControlAdapter.ControlType; - - _avProvider.ConnectToMachine(_theMachine, _gameInfo); - - SetupMemoryDomains(hsc7800); - } - - #region audio\video - - private MyAVProvider _avProvider = new MyAVProvider(); - - private class MyAVProvider : IVideoProvider, ISoundProvider, IDisposable - { - // to sync exactly with audio as this emulator creates and times it, the frame rate should be exactly 60:1 or 50:1 - private int _frameHz; - - public FrameBuffer Framebuffer { get; private set; } - public void ConnectToMachine(MachineBase m, GameProgram g) - { - _frameHz = m.FrameHZ; - Framebuffer = m.CreateFrameBuffer(); - BufferWidth = Framebuffer.VisiblePitch; - BufferHeight = Framebuffer.Scanlines; - _vidbuffer = new int[BufferWidth * BufferHeight]; - - uint newsamplerate = (uint)m.SoundSampleFrequency; - if (newsamplerate != _samplerate) - { - // really shouldn't happen (after init), but if it does, we're ready - _resampler?.Dispose(); - _resampler = new SpeexResampler((SpeexResampler.Quality)3, newsamplerate, 44100, newsamplerate, 44100, null, null); - _samplerate = newsamplerate; - _dcfilter = new DCFilter(256); - } - - if (g.MachineType == MachineType.A2600PAL) - { - _palette = TIATables.PALPalette; - } - else if (g.MachineType == MachineType.A7800PAL) - { - _palette = MariaTables.PALPalette; - } - else if (g.MachineType == MachineType.A2600NTSC) - { - _palette = TIATables.NTSCPalette; - } - else - { - _palette = MariaTables.NTSCPalette; - } - } - - private uint _samplerate; - private int[] _vidbuffer; - private SpeexResampler _resampler; - private DCFilter _dcfilter; - private int[] _palette; - - public void FillFrameBuffer() - { - unsafe - { - fixed (byte* src_ = Framebuffer.VideoBuffer) - fixed (int* dst_ = _vidbuffer) - fixed (int* pal = _palette) - { - byte* src = src_; - int* dst = dst_; - for (int i = 0; i < _vidbuffer.Length; i++) - { - *dst++ = pal[*src++]; - } - } - } - } - - public int[] GetVideoBuffer() - { - return _vidbuffer; - } - - public int VirtualWidth => 275; - public int VirtualHeight => BufferHeight; - public int BufferWidth { get; private set; } - public int BufferHeight { get; private set; } - public int BackgroundColor => unchecked((int)0xff000000); - public int VsyncNumerator => _frameHz; - public int VsyncDenominator => 1; - - #region ISoundProvider - - public bool CanProvideAsync => false; - - public void GetSamplesSync(out short[] samples, out int nsamp) - { - int nsampin = Framebuffer.SoundBufferByteLength; - unsafe - { - fixed (byte* src = Framebuffer.SoundBuffer) - { - for (int i = 0; i < nsampin; i++) - { - // the buffer values don't really get very large at all, - // so this doesn't overflow - short s = (short)(src[i] * 200); - _resampler.EnqueueSample(s, s); - } - } - } - - _resampler.GetSamplesSync(out samples, out nsamp); - _dcfilter.PushThroughSamples(samples, nsamp * 2); - } - - public SyncSoundMode SyncMode => SyncSoundMode.Sync; - - public void SetSyncMode(SyncSoundMode mode) - { - if (mode == SyncSoundMode.Async) - { - throw new NotSupportedException("Async mode is not supported."); - } - } - - public void GetSamplesAsync(short[] samples) - { - throw new InvalidOperationException("Async mode is not supported."); - } - - public void DiscardSamples() - { - _resampler?.DiscardSamples(); - } - - #endregion - - public void Dispose() - { - if (_resampler != null) - { - _resampler.Dispose(); - _resampler = null; - } - } - } - - #endregion - } -} From 3a4164cb5d69e5b2b06f7bc3eba918dce9ef64df Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:41:48 -0400 Subject: [PATCH 79/82] Delete Atari7800Control.cs --- .../Consoles/Atari/7800/Atari7800Control.cs | 411 ------------------ 1 file changed, 411 deletions(-) delete mode 100644 BizHawk.Emulation.Cores/Consoles/Atari/7800/Atari7800Control.cs diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/7800/Atari7800Control.cs b/BizHawk.Emulation.Cores/Consoles/Atari/7800/Atari7800Control.cs deleted file mode 100644 index 28a86f83284..00000000000 --- a/BizHawk.Emulation.Cores/Consoles/Atari/7800/Atari7800Control.cs +++ /dev/null @@ -1,411 +0,0 @@ -using System; - -using EMU7800.Core; -using BizHawk.Emulation.Common; - -namespace BizHawk.Emulation.Cores.Atari.Atari7800 -{ - public class Atari7800Control - { - private static readonly ControllerDefinition Joystick = new ControllerDefinition - { - Name = "Atari 7800 Joystick Controller", - BoolButtons = - { - // hard reset, not passed to EMU7800 - "Power", - - // on the console - "Reset", - "Select", - "BW", // should be "Color"?? - "Left Difficulty", // better not put P# on these as they might not correspond to player numbers - "Right Difficulty", - "Pause", - - // ports - "P1 Up", "P1 Down", "P1 Left", "P1 Right", "P1 Trigger", - "P2 Up", "P2 Down", "P2 Left", "P2 Right", "P2 Trigger" - } - }; - - private static readonly ControllerDefinition Paddles = new ControllerDefinition - { - Name = "Atari 7800 Paddle Controller", - BoolButtons = - { - // hard reset, not passed to EMU7800 - "Power", - - // on the console - "Reset", - "Select", - "BW", // should be "Color"?? - "Left Difficulty", // better not put P# on these as they might not correspond to player numbers - "Right Difficulty", - - // ports - "P1 Trigger", - "P2 Trigger", - "P3 Trigger", - "P4 Trigger" - }, - FloatControls = // should be in [0..700000] - { - "P1 Paddle", - "P2 Paddle", - "P3 Paddle", - "P4 Paddle" - }, - FloatRanges = - { - // what is the center point supposed to be here? - new[] { 0.0f, 0.0f, 700000.0f }, - new[] { 0.0f, 0.0f, 700000.0f }, - new[] { 0.0f, 0.0f, 700000.0f }, - new[] { 0.0f, 0.0f, 700000.0f } - } - }; - - private static readonly ControllerDefinition Keypad = new ControllerDefinition - { - Name = "Atari 7800 Keypad Controller", - BoolButtons = - { - // hard reset, not passed to EMU7800 - "Power", - - // on the console - "Reset", - "Select", - "BW", // should be "Color"?? - "Toggle Left Difficulty", // better not put P# on these as they might not correspond to player numbers - "Toggle Right Difficulty", - - // ports - "P1 Keypad1", "P1 Keypad2", "P1 Keypad3", - "P1 Keypad4", "P1 Keypad5", "P1 Keypad6", - "P1 Keypad7", "P1 Keypad8", "P1 Keypad9", - "P1 KeypadA", "P1 Keypad0", "P1 KeypadP", - "P2 Keypad1", "P2 Keypad2", "P2 Keypad3", - "P2 Keypad4", "P2 Keypad5", "P2 Keypad6", - "P2 Keypad7", "P2 Keypad8", "P2 Keypad9", - "P2 KeypadA", "P2 Keypad0", "P2 KeypadP", - "P3 Keypad1", "P3 Keypad2", "P3 Keypad3", - "P3 Keypad4", "P3 Keypad5", "P3 Keypad6", - "P3 Keypad7", "P3 Keypad8", "P3 Keypad9", - "P3 KeypadA", "P3 Keypad0", "P3 KeypadP", - "P4 Keypad1", "P4 Keypad2", "P4 Keypad3", - "P4 Keypad4", "P4 Keypad5", "P4 Keypad6", - "P4 Keypad7", "P4 Keypad8", "P4 Keypad9", - "P4 KeypadA", "P4 Keypad0", "P4 KeypadP" - } - }; - - private static readonly ControllerDefinition Driving = new ControllerDefinition - { - Name = "Atari 7800 Driving Controller", - BoolButtons = - { - // hard reset, not passed to EMU7800 - "Power", - - // on the console - "Reset", - "Select", - "BW", // should be "Color"?? - "Toggle Left Difficulty", // better not put P# on these as they might not correspond to player numbers - "Toggle Right Difficulty", - - // ports - "P1 Trigger", - "P2 Trigger" - }, - FloatControls = // should be in [0..3] - { - "P1 Driving", - "P2 Driving" - }, - FloatRanges = - { - new[] { 0.0f, 0.0f, 3.0f }, - new[] { 0.0f, 0.0f, 3.0f }, - new[] { 0.0f, 0.0f, 3.0f } - } - }; - - private static readonly ControllerDefinition BoosterGrip = new ControllerDefinition - { - Name = "Atari 7800 Booster Grip Controller", - BoolButtons = - { - // hard reset, not passed to EMU7800 - "Power", - - // on the console - "Reset", - "Select", - "BW", // should be "Color"?? - "Toggle Left Difficulty", // better not put P# on these as they might not correspond to player numbers - "Toggle Right Difficulty", - - // ports - // NB: as referenced by the emu, p1t2 = p1t2, p1t3 = p2t2, p2t2 = p3t2, p2t3 = p4t2 - "P1 Up", "P1 Down", "P1 Left", "P1 Right", "P1 Trigger", "P1 Trigger 2", "P1 Trigger 3", - "P2 Up", "P2 Down", "P2 Left", "P2 Right", "P2 Trigger", "P2 Trigger 2", "P2 Trigger 3" - } - }; - - private static readonly ControllerDefinition ProLineJoystick = new ControllerDefinition - { - Name = "Atari 7800 ProLine Joystick Controller", - BoolButtons = - { - // hard reset, not passed to EMU7800 - "Power", - - // on the console - "Reset", - "Select", - "BW", // should be "Color"?? - "Toggle Left Difficulty", // better not put P# on these as they might not correspond to player numbers - "Toggle Right Difficulty", - "Pause", - - // ports - "P1 Up", "P1 Down", "P1 Left", "P1 Right", "P1 Trigger", "P1 Trigger 2", - "P2 Up", "P2 Down", "P2 Left", "P2 Right", "P2 Trigger", "P2 Trigger 2" - } - }; - - private static readonly ControllerDefinition Lightgun = new ControllerDefinition - { - Name = "Atari 7800 Light Gun Controller", - BoolButtons = - { - // hard reset, not passed to EMU7800 - "Power", - - // on the console - "Reset", - "Select", - "Pause", - "Left Difficulty", // better not put P# on these as they might not correspond to player numbers - "Right Difficulty", - - // ports - "P1 Trigger", - "P2 Trigger" - }, - FloatControls = // vpos should be actual scanline number. hpos should be in [0..319]?? - { - "P1 VPos", "P1 HPos", - "P2 VPos", "P2 HPos" - }, - FloatRanges = - { - // how many scanlines are there again?? - new[] { 0.0f, 0.0f, 240.0f }, - new[] { 0.0f, 0.0f, 319.0f }, - new[] { 0.0f, 0.0f, 240.0f }, - new[] { 0.0f, 0.0f, 319.0f } - } - }; - - private struct ControlAdapter - { - public readonly ControllerDefinition Type; - public readonly Controller Left; - public readonly Controller Right; - public readonly Action Convert; - - public ControlAdapter(ControllerDefinition type, Controller left, Controller right, Action convert) - { - Type = type; - Left = left; - Right = right; - Convert = convert; - } - } - - private static readonly ControlAdapter[] Adapters = - { - new ControlAdapter(Joystick, Controller.Joystick, Controller.Joystick, ConvertJoystick), - new ControlAdapter(Paddles, Controller.Paddles, Controller.Paddles, ConvertPaddles), - new ControlAdapter(Keypad, Controller.Keypad, Controller.Keypad, ConvertKeypad), - new ControlAdapter(Driving, Controller.Driving, Controller.Driving, ConvertDriving), - new ControlAdapter(BoosterGrip, Controller.BoosterGrip, Controller.BoosterGrip, ConvertBoosterGrip), - new ControlAdapter(ProLineJoystick, Controller.ProLineJoystick, Controller.ProLineJoystick, ConvertProLineJoystick), - new ControlAdapter(Lightgun, Controller.Lightgun, Controller.Lightgun, ConvertLightgun), - }; - - private static void ConvertConsoleButtons(IController c, InputState s) - { - s.RaiseInput(0, MachineInput.Reset, c.IsPressed("Reset")); - s.RaiseInput(0, MachineInput.Select, c.IsPressed("Select")); - s.RaiseInput(0, MachineInput.Color, c.IsPressed("BW")); - if (c.IsPressed("Toggle Left Difficulty")) - { - s.RaiseInput(0, MachineInput.LeftDifficulty, c.IsPressed("Toggle Left Difficulty")); - } - - if (c.IsPressed("Toggle Right Difficulty")) - { - s.RaiseInput(0, MachineInput.RightDifficulty, c.IsPressed("Toggle Right Difficulty")); - } - } - - private static void ConvertConsoleButtons7800(IController c, InputState s) - { - s.RaiseInput(0, MachineInput.Reset, c.IsPressed("Reset")); - s.RaiseInput(0, MachineInput.Select, c.IsPressed("Select")); - s.RaiseInput(0, MachineInput.Color, c.IsPressed("Pause")); - if (c.IsPressed("Toggle Left Difficulty")) - { - s.RaiseInput(0, MachineInput.LeftDifficulty, c.IsPressed("Toggle Left Difficulty")); - } - - if (c.IsPressed("Toggle Right Difficulty")) - { - s.RaiseInput(0, MachineInput.RightDifficulty, c.IsPressed("Toggle Right Difficulty")); - } - } - - private static void ConvertDirections(IController c, InputState s, int p) - { - string ps = $"P{p + 1} "; - s.RaiseInput(p, MachineInput.Up, c.IsPressed(ps + "Up")); - s.RaiseInput(p, MachineInput.Down, c.IsPressed(ps + "Down")); - s.RaiseInput(p, MachineInput.Left, c.IsPressed(ps + "Left")); - s.RaiseInput(p, MachineInput.Right, c.IsPressed(ps + "Right")); - } - - private static void ConvertTrigger(IController c, InputState s, int p) - { - string ps = $"P{p + 1} "; - s.RaiseInput(p, MachineInput.Fire, c.IsPressed(ps + "Trigger")); - } - - private static void ConvertJoystick(IController c, InputState s) - { - s.ClearControllerInput(); - ConvertConsoleButtons(c, s); - ConvertDirections(c, s, 0); - ConvertDirections(c, s, 1); - ConvertTrigger(c, s, 0); - ConvertTrigger(c, s, 1); - } - - private static void ConvertPaddles(IController c, InputState s) - { - s.ClearControllerInput(); - ConvertConsoleButtons(c, s); - for (int i = 0; i < 4; i++) - { - string ps = $"P{i + 1} "; - ConvertTrigger(c, s, i); - s.RaisePaddleInput(i, 700000, (int)c.GetFloat(ps + "Trigger")); - } - } - - private static void ConvertKeypad(IController c, InputState s) - { - s.ClearControllerInput(); - ConvertConsoleButtons(c, s); - for (int i = 0; i < 4; i++) - { - string ps = $"P{i + 1} "; - s.RaiseInput(i, MachineInput.NumPad1, c.IsPressed(ps + "Keypad1")); - s.RaiseInput(i, MachineInput.NumPad2, c.IsPressed(ps + "Keypad2")); - s.RaiseInput(i, MachineInput.NumPad3, c.IsPressed(ps + "Keypad3")); - s.RaiseInput(i, MachineInput.NumPad4, c.IsPressed(ps + "Keypad4")); - s.RaiseInput(i, MachineInput.NumPad5, c.IsPressed(ps + "Keypad5")); - s.RaiseInput(i, MachineInput.NumPad6, c.IsPressed(ps + "Keypad6")); - s.RaiseInput(i, MachineInput.NumPad7, c.IsPressed(ps + "Keypad7")); - s.RaiseInput(i, MachineInput.NumPad8, c.IsPressed(ps + "Keypad8")); - s.RaiseInput(i, MachineInput.NumPad9, c.IsPressed(ps + "Keypad9")); - s.RaiseInput(i, MachineInput.NumPadMult, c.IsPressed(ps + "KeypadA")); - s.RaiseInput(i, MachineInput.NumPad0, c.IsPressed(ps + "Keypad0")); - s.RaiseInput(i, MachineInput.NumPadHash, c.IsPressed(ps + "KeypadP")); - } - } - - private static readonly MachineInput[] Drvlut = - { - MachineInput.Driving0, - MachineInput.Driving1, - MachineInput.Driving2, - MachineInput.Driving3 - }; - - private static void ConvertDriving(IController c, InputState s) - { - s.ClearControllerInput(); - ConvertConsoleButtons(c, s); - ConvertTrigger(c, s, 0); - ConvertTrigger(c, s, 1); - s.RaiseInput(0, Drvlut[(int)c.GetFloat("P1 Driving")], true); - s.RaiseInput(1, Drvlut[(int)c.GetFloat("P2 Driving")], true); - } - - private static void ConvertBoosterGrip(IController c, InputState s) - { - s.ClearControllerInput(); - ConvertConsoleButtons(c, s); - ConvertDirections(c, s, 0); - ConvertDirections(c, s, 1); - - // weird mapping is intentional - s.RaiseInput(0, MachineInput.Fire, c.IsPressed("P1 Trigger")); - s.RaiseInput(0, MachineInput.Fire2, c.IsPressed("P1 Trigger 2")); - s.RaiseInput(1, MachineInput.Fire2, c.IsPressed("P1 Trigger 3")); - s.RaiseInput(1, MachineInput.Fire, c.IsPressed("P2 Trigger")); - s.RaiseInput(2, MachineInput.Fire2, c.IsPressed("P2 Trigger 2")); - s.RaiseInput(3, MachineInput.Fire2, c.IsPressed("P2 Trigger 3")); - } - - private static void ConvertProLineJoystick(IController c, InputState s) - { - s.ClearControllerInput(); - ConvertConsoleButtons7800(c, s); - ConvertDirections(c, s, 0); - ConvertDirections(c, s, 1); - s.RaiseInput(0, MachineInput.Fire, c.IsPressed("P1 Trigger")); - s.RaiseInput(0, MachineInput.Fire2, c.IsPressed("P1 Trigger 2")); - s.RaiseInput(1, MachineInput.Fire, c.IsPressed("P2 Trigger")); - s.RaiseInput(1, MachineInput.Fire2, c.IsPressed("P2 Trigger 2")); - } - - private static void ConvertLightgun(IController c, InputState s) - { - s.ClearControllerInput(); - ConvertConsoleButtons7800(c, s); - ConvertTrigger(c, s, 0); - ConvertTrigger(c, s, 1); - s.RaiseLightgunPos(0, (int)c.GetFloat("P1 VPos"), (int)c.GetFloat("P1 HPos")); - s.RaiseLightgunPos(1, (int)c.GetFloat("P2 VPos"), (int)c.GetFloat("P2 HPos")); - } - - public Action Convert { get; private set; } - - public ControllerDefinition ControlType { get; private set; } - - public Atari7800Control(MachineBase mac) - { - var l = mac.InputState.LeftControllerJack; - var r = mac.InputState.RightControllerJack; - - foreach (var a in Adapters) - { - if (a.Left == l && a.Right == r) - { - Convert = a.Convert; - ControlType = a.Type; - return; - } - } - - throw new Exception($"Couldn't connect Atari 7800 controls \"{l}\" and \"{r}\""); - } - } -} From 55580127dbbf2327817b06d21461de0f5c78306b Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:42:41 -0400 Subject: [PATCH 80/82] Update BizHawk.Emulation.Cores.csproj --- .../BizHawk.Emulation.Cores.csproj | 20 ------------------- 1 file changed, 20 deletions(-) diff --git a/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj b/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj index 6ad19b15b9a..d2bd71b1ee4 100644 --- a/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj +++ b/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj @@ -372,26 +372,6 @@ - - - Atari7800.cs - - - Atari7800.cs - - - Atari7800.cs - - - Atari7800.cs - - - Atari7800.cs - - - - Atari7800.cs - From 2a590cad30adeb82fa949cc3b7fe5d06c74297aa Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:45:26 -0400 Subject: [PATCH 81/82] Delete EMU7800.csv --- Assets/gamedb/EMU7800.csv | 2005 ------------------------------------- 1 file changed, 2005 deletions(-) delete mode 100644 Assets/gamedb/EMU7800.csv diff --git a/Assets/gamedb/EMU7800.csv b/Assets/gamedb/EMU7800.csv deleted file mode 100644 index 2bc1e694ec9..00000000000 --- a/Assets/gamedb/EMU7800.csv +++ /dev/null @@ -1,2005 +0,0 @@ -Title,Manufacturer,Author,Qualifier,Year,ModelNo,Rarity,CartType,MachineType,LController,RController,MD5,HelpUri -11 Sprite Demo (Piero Cavina),,Piero Cavina,Homebrew,,,,,A2600NTSC,,,0685bd0bcb975ceef7041749a5454a48, -128-in-1 Junior Console (Chip 1) (64K),,,,,,,,A2600PAL,,,1862fca4f98e66f363308b859b5863af, -128-in-1 Junior Console (Chip 2) (64K),,,,,,,,A2600PAL,,,715dd9e0240638d441a3add49316c018, -128-in-1 Junior Console (Chip 3) (64K),,,,,,,,A2600PAL,,,0d6b974fe58a1bdd453600401c407856, -128-in-1 Junior Console (Chip 4) (64K),,,,,,,,A2600PAL,,,7f525b07bc98080cc8950f7284e52ede, -2 Pak Special - Dolphin - Pigs 'N' Wolf,HES,,,1990,,,,A2600PAL,,,8c8a26ed57870daba8e13162d497bad1, -2 Pak Special Black - Challenge - Surfing,HES,,,,,,,A2600PAL,,,fd7464edaa8cc264b97ba0d13e7f0678, -2 Pak Special Dark Blue - Planet Patrol - Wall Defender,HES,,,1990,,,,A2600PAL,,,72fd08deed1d6195942e0c6f392e9848, -2 Pak Special Green - Hoppy - Alien Force,HES,,,,,,,A2600PAL,,,5b9c2e0012fbfd29efd3306359bbfc4a, -2 Pak Special Green - Hoppy - Alien Force,HES,,,,,,,A2600PAL,,,ab434f4c942d6472e75d5490cc4dd128, -2 Pak Special Magenta - CaveBlast -City War,HES,,,1992,,,,A2600PAL,,,7f430c33044e0354815392b53a9a772d, -2 Pak Special Yellow - Star Warrior - Frogger,HES,,,1990,,,,A2600PAL,,,02a5fc90a0d183f870e8eebac1f16591, -2 Pak Special Yellow - Star Warrior - Frogger,HES,,,1990,,,,A2600PAL,,,4d2cef8f19cafeec72d142e34a1bbc03, -2-in-1 - Freeway and Tennis,,,,,,,,A2600NTSC,,,94e3fbc19107a169909e274187247a9d, -2-in-1 - Frostbite and River Raid,,,,,,,,A2600NTSC,,,9c40bf810f761ffc9c1b69c4647a8b84, -20 Sprites at Once Demo 1,,,,,,,,A2600NTSC,,,fa529ec88eca679f6d5fd0ccb2120e46, -20 Sprites at Once Demo 2,,,,,,,,A2600NTSC,,,7a93d0c029eaa72236523eedc3f19645, -20 Sprites at Once Demo 3,,,,,,,,A2600NTSC,,,6c449db9bbbd90972ad1932d6af87330, -20 Sprites at Once Demo 4,,,,,,,,A2600NTSC,,,bfa58198c6b9cd8062ee76a2b38e9b33, -20 Sprites at Once Demo 5,,,,,,,,A2600NTSC,,,d2d8c4f1ea7f347c8bcc7d24f45aa338, -2600 Collison Demo 1,,,,,,,,A2600NTSC,,,ad2e6bfb3b9b9b36ba8bf493ce764c49, -2600 Collison Demo 2,,,,,,,,A2600NTSC,,,777aece98d7373998ffb8bc0b5eff1a2, -2600 Digital Clock (Demo 1),,,,,,,,A2600NTSC,,,eada0dd61ce13f8317de774dc1e68604, -2600 Digital Clock (Demo 2),,,,,,,,A2600NTSC,,,3e5ca1afaa27c5da3c54c9942fec528b, -2600 Digital Clock (Demo 3),,,,,,,,A2600NTSC,,,f6efa00ae99aaf33e427b674bcfd834d, -2600 Digital Clock (V b1),,,,,,,,A2600NTSC,,,75e8d8b9e9c5c67c2226dbfd77dcfa7d, -2600 Digital Clock (V b2),,,,,,,,A2600NTSC,,,5e99aa93d0acc741dcda8752c4e813ce, -2600 Digital Clock (V x.xx),,,,,,,,A2600NTSC,,,4faeb04b1b7fb0fa25db05753182a898, -2600 Digital Clock (V x.xx),,,,,,,,A2600NTSC,,,62ffd175cac3f781ef6e4870136a2520, -2Pak Black - Challenge - Surfing,HES,,,,,,,A2600PAL,,,7732e4e4cc2644f163d6650ddcc9d9df, -3-D Tic-Tac-Toe (32-in-1),Atari,Carol Shaw,,,,,,A2600PAL,,,7b5207e68ee85b16998bea861987c690,http://www.atariage.com/manual_thumbs.html?SoftwareID=798 -3-D Tic-Tac-Toe,Atari,Carol Shaw,,1978,,,,A2600PAL,,,402b1ca3c230a60fb279d4a2a10fa677,http://www.atariage.com/manual_thumbs.html?SoftwareID=798 -3-D Tic-Tac-Toe,Atari,Carol Shaw,,1978,CX2618,Uncommon,,A2600NTSC,,,0db4f4150fecf77e4ce72ca4d04c052f,http://www.atariage.com/manual_thumbs.html?SoftwareID=798 -3-D Tic-Tac-Toe,Atari,Carol Shaw,,1978,CX2618,Uncommon,,A2600NTSC,,,f3213a8a702b0646d2eaf9ee0722b51c,http://www.atariage.com/manual_thumbs.html?SoftwareID=798 -3-D Tic-Tac-Toe,Atari,Carol Shaw,,1978,CX2618,Uncommon,,A2600PAL,,,e3600be9eb98146adafdc12d91323d0f,http://www.atariage.com/manual_thumbs.html?SoftwareID=798 -32-in-1,Atari,,,,CX26163P,,M32N12K,A2600PAL,,,291bcdb05f2b37cdf9452d2bf08e0321,http://www.atariage.com/manual_html_page.html?SoftwareLabelID=899 -3D Asteroids,Atari,,Prototype,,,,,A7800NTSC,,,4332c24e4f3bc72e7fe1b77adf66c2b7, -4 Pak (Dark Green),,,,,,,,A2600PAL,,,703f0f7af350b0fa29dfe5fbf45d0d75, -4 Pak (Light Green),,,,,,,,A2600NTSC,,,31bb9b8ceed46cb3e506777a9e65f3ce, -A-Team,Atari,,Prototype,,CX26133,,,A2600NTSC,,,c00734a2233ef683d9b6e622ac97a5c8, -A-Team,Atari,Manuel Polik & Fabrizio Zavagli,Prototype,,,,,A2600NTSC,,,2cefa695df2ed020899a7df7bb1e3a95, -A-Team,Atari,Manuel Polik & Fabrizio Zavagli,Prototype,,,,,A2600PAL,,,c02e1afa0671e438fd526055c556d231, -A-Team,Atari,Manuel Polik & Fabrizio Zavagli,Prototype,,,,,A2600PAL,,,dafc3945677ccc322ce323d1e9930beb, -Ace of Aces,Atari,,,1988,CX7846,Common,A78SG,A7800NTSC,,,0be996d25144966d5541c9eb4919b289,http://www.atariage.com/manual_thumbs.html?SoftwareID=2116 -Ace of Aces,Atari,,,1988,CX7846,Common,A78SG,A7800PAL,,,aadde920b3aaba03bc10b40bd0619c94,http://www.atariage.com/manual_thumbs.html?SoftwareID=2116 -Acid Drop (non-working 8K single bank dump),Salu,,,,,Extremely Rare,A16K,A2600PAL,,,5f17fef8a64d64d119f8e76c50238762, -Acid Drop,,Thomas Jentzsch,Hack,,,,A16K,A2600NTSC,,,09274c3fc1c43bf1e362fda436651fd8, -Acid Drop,Salu,Dennis M. Kiss,,1992,,Extremely Rare,A16K,A2600PAL,,,17ee23e5da931be82f733917adcb6386, -Action Force - Action Man,Parker Bros,,,1983,,,,A2600PAL,Paddles,Paddles,b9f6fa399b8cd386c235983ec45e4355, -Action Force - Action Man,Parker Bros,,,1983,,,,A2600PAL,Paddles,Paddles,d573089534ca596e64efef474be7b6bc, -Adventure,Atari,Warren Robinett,,1978,CX2613,Common,,A2600NTSC,,,157bddb7192754a45372be196797f284,http://www.atariage.com/manual_thumbs.html?SystemID=2600&SoftwareID=802&ItemTypeID=MANUAL -Adventure,Atari,Warren Robinett,,1978,CX2613,Common,,A2600PAL,,,4b27f5397c442d25f0c418ccdacf1926,http://www.atariage.com/manual_thumbs.html?SystemID=2600&SoftwareID=802&ItemTypeID=MANUAL -Adventure34,Atari,Kurt Howe,Hack,,,,,A2600NTSC,,,171cd6b55267573e6a9c2921fb720794,http://www.atariage.com/manual_thumbs.html?SystemID=2600&SoftwareID=802&ItemTypeID=MANUAL -Adventures of Tron,Mattel,,,1983,MT4317,Uncommon,,A2600NTSC,,,ca4f8c5b4d6fb9d608bb96bc7ebd26c7, -Adventures on GX-12,Telegames,,,,,,,A2600PAL,,,06cfd57f0559f38b9293adae9128ff88, -Air Raid,MenAvision,,,,C-817,Extremely Rare,,A2600NTSC,,,35be55426c1fec32dfb503b4f0651572, -Air Raiders,Mattel,,,,MT5861,,,A2600PAL,,,cf3a9ada2692bb42f81192897752b912, -Air Raiders,Mattel,,,1982,MT5861,,,A2600NTSC,,,a9cb638cd2cb2e8e0643d7a67db4281c, -Air-Sea Battle (32-in-1),Atari,Larry Kaplan,,,,,,A2600PAL,,,8aad33da907bed78b76b87fceaa838c1,http://www.atariage.com/manual_thumbs.html?SoftwareID=808 -Air-Sea Battle,Atari,Larry Kaplan,,1977,,,,A2600NTSC,,,98e5e4d5c4dd9a986d30fd62bd2f75ae,http://www.atariage.com/manual_thumbs.html?SoftwareID=808 -Air-Sea Battle,Atari,Larry Kaplan,,1977,,,,A2600PAL,,,e5fcc62e1d73706be7b895e887e90f84,http://www.atariage.com/manual_thumbs.html?SoftwareID=808 -Air-Sea Battle,Atari,Larry Kaplan,,1977,CX2602,Uncommon,,A2600NTSC,,,16cb43492987d2f32b423817cdaaf7c4,http://www.atariage.com/manual_thumbs.html?SoftwareID=808 -Air-Sea Battle,Atari,Larry Kaplan,,1977,CX2602,Uncommon,,A2600NTSC,,,1d1d2603ec139867c1d1f5ddf83093f1,http://www.atariage.com/manual_thumbs.html?SoftwareID=808 -Air-Sea Battle,Atari,Larry Kaplan,,1977,CX2602,Uncommon,,A2600PAL,,,0c7926d660f903a2d6910c254660c32c,http://www.atariage.com/manual_thumbs.html?SoftwareID=808 -Airlock,Data Age,,,1982,DA 1004,Common,,A2600NTSC,,,4d77f291dca1518d7d8e47838695f54b, -Alice's Abenteuer,Starsoft,,,,,,,A2600PAL,,,d0cdafcb000b9ae04ac465f17788ad11, -Alien Brigade,Atari,Ken Grant,,1989,CX7855,Rare,A78S9,A7800NTSC,,,877dcc97a775ed55081864b2dbf5f1e2,http://www.atariage.com/manual_thumbs.html?SoftwareID=2164 -Alien Brigade,Atari,Ken Grant,,1989,CX7855,Rare,A78S9,A7800PAL,,,de3e9496cb7341f865f27e5a72c7f2f5,http://www.atariage.com/manual_thumbs.html?SoftwareID=2164 -Alien Invaders Plus,,,Hack,,,,,A2600NTSC,,,4d6cfb7da66c8d9327b3ccdce9852509, -Alien's Return,ITT Family Games,,,,554-33391,Extremely Rare,,A2600PAL,,,103f1756d9dc0dd2b16b53ad0f0f1859, -Alien,20th Century Fox,,,1982,11006,Rare,,A2600NTSC,,,f1a0a23e6464d954e3a9579c4ccd01c8, -Alien,CCE,,,,,,,A2600NTSC,,,956496f81775de0b69a116a0d1ad41cc, -Alpha Beam with Ernie,Atari,,,1983,CX26103,Rare,,A2600NTSC,Keypad,Keypad,9e01f7f95cb8596765e03b9a36e8e33c, -Alpha Beam with Ernie,Atari,,,1983,CX26103,Rare,,A2600PAL,Keypad,Keypad,f2d40c70cf3e1d03bc112796315888d9, -Amanda Invaders,,,,,,,,A2600NTSC,,,26bc2bdf447a17376aea7ef187ff6e44, -Amanda Invaders,,,,,,,,A2600NTSC,,,51f15b39d9f502c2361b6ba6a73464d4, -Amidar,Parker Bros,,,1983,PB5310,Uncommon,,A2600NTSC,,,acb7750b4d0c4bd34969802a7deb2990, -Amidar,Parker Bros,,,1983,PB5310,Uncommon,,A2600PAL,,,056f5d886a4e7e6fdd83650554997d0d, -Angling,Ariola,,,,,,,A2600PAL,,,6672de8f82c4f7b8f7f1ef8b6b4f614d, -Angriff der Luftflotten (a.k.a. Paris Attack),Starsoft,,,,,,,A2600PAL,,,adf1afac3bdd7b36d2eda5949f1a0fa3, -Apples and Dolls,CCE,,,,,,,A2600NTSC,,,e73838c43040bcbc83e4204a3e72eef4, -Aquaventure,Atari,,,,,Unbelievably Rare,A8K,A2600NTSC,,,038e1e79c3d4410defde4bfe0b99cc32, -Aquaventure,CCE,,,,,,A8K,A2600NTSC,,,f69d4fcf76942fcd9bdf3fd8fde790fb, -Arkanoid (0911),,,Homebrew,2011,,,A7832P,A7800NTSC,,,0a9e58ef5eb9ff93246e0fff684dc7f1, -Armor Ambush,Mattel,,,1982,MT5661,Common,,A2600NTSC,,,a7b584937911d60c120677fe0d47f36f, -Armor Ambush,Telegames,,,1982,,,,A2600PAL,,,d0af33865512e9b6900714c26db5fa23, -Artillery Duel,Xonox,,,1983,,,,A2600PAL,,,589c73bbcd77db798cb92a992b4c06c3, -Artillery Duel,Xonox,,,1983,99004,Extremely Rare,,A2600NTSC,,,3f039981255691d3859d04ef813a1264, -Artillery Duel,Xonox,,,1983,99004,Extremely Rare,,A2600NTSC,,,c77c35a6fc3c0f12bf9e8bae48cba54b, -Assault,Bomb,,,,CA281,Extremely Rare,,A2600NTSC,,,de78b3a064d374390ac0710f95edde92, -Aster Hawk,,Charles Morgan,Hack,,,,A8K,A2600NTSC,,,327468d6c19697e65ab702f06502c7ed, -Asterix,Atari,,,1988,CX2696,Extremely Rare,,A2600PAL,,,c5c7cc66febf2d4e743b4459de7ed868, -Asterix,Atari,,,1988,CX2696,Extremely Rare,,A2600PAL,,,faebcb2ef1f3831b2fc1dbd39d36517c, -Asterix,Atari,,Prototype,,CX2696,Extremely Rare,,A2600NTSC,,,89a68746eff7f266bbf08de2483abe55, -Asteroids (Vector),,Franklin Cruz,,,,,A8K,A2600NTSC,,,df40af244a8d68b492bfba9e97dea4d6, -Asteroids DC+,,Thomas Jentzsch,Hack,,,,A8K,A2600NTSC,Driving,Driving,2dbdca3058035d2b40c734dcf06a86d9,http://www.atariage.com/manual_html_page.html?SoftwareID=828 -Asteroids Deluxe,,Bob DeCrescenzo,Hack,2007,,,,A7800NTSC,,,f9fb84658c5586df159a0c75cc46b54c,http://www.atariage.com/software_page.html?SoftwareLabelID=2771 -Asteroids Deluxe,,Bob DeCrescenzo,Homebrew,2007,,,A7832,A7800NTSC,,,a65f79ad4a0bbdecd59d5f7eb3623fd7,http://www.atariage.com/software_page.html?SoftwareLabelID=2771 -Asteroids Deluxe,,Bob DeCrescenzo,Homebrew,2007,,,A7832,A7800PAL,,,1baf41de200f26ec643625021290bec2,http://www.atariage.com/software_page.html?SoftwareLabelID=2771 -Asteroids,,Scott Stilphen,Hack,,,,A8K,A2600NTSC,,,8df4be9ddc54ac363b13dc57ceaf161a,http://www.atariage.com/manual_html_page.html?SoftwareID=828 -Asteroids,Atari,,,1984,CX7802,Common,,A7800NTSC,,,07342c78619ba6ffcc61c10e907e3b50,http://www.atariage.com/manual_thumbs.html?SoftwareID=2117 -Asteroids,Atari,Brad Stewart,,1981,CX2649,Common,A8K,A2600NTSC,,,b227175699e372b8fe10ce243ad6dda5,http://www.atariage.com/manual_html_page.html?SoftwareID=828 -Asteroids,Atari,Brad Stewart,,1981,CX2649,Common,A8K,A2600NTSC,,,ccbd36746ed4525821a8083b0d6d2c2c,http://www.atariage.com/manual_html_page.html?SoftwareID=828 -Asteroids,Atari,Brad Stewart,,1981,CX2649,Common,A8K,A2600PAL,,,8cf0d333bbe85b9549b1e6b1e2390b8d,http://www.atariage.com/manual_html_page.html?SoftwareID=828 -Astroblast,Mattel,,,1982,MT5666,Uncommon,,A2600NTSC,,,170e7589a48739cfb9cc782cbb0fe25a, -Astroblast,Mattel,,,1982,MT5666,Uncommon,,A2600NTSC,,,75169c08b56e4e6c36681e599c4d8cc5, -Astrowar,Starsoft,,,,SM8002,Unbelievably Rare,,A2600NTSC,,,8f53a3b925f0fd961d9b8c4d46ee6755, -Atari 2600 Invaders,,,Hack,,,,,A2600NTSC,,,a4aa7630e4c0ad7ebb9837d2d81de801, -Atari Invaders,,,Hack,,,,,A2600NTSC,,,d0a379946ed77b1b126230ca68461333, -Atari Logo Demo 1,,,,,,,,A2600NTSC,,,e932f44fad2a66b6d5faec9addec208e, -Atari Logo Demo 2,,,,,,,,A2600NTSC,,,13d8326bf5648db4dafce45d25e62ddd, -Atari Logo Demo 3,,,,,,,,A2600NTSC,,,3e49da621193d2611a4ea152d5d5ca3a, -Atari Logo Demo 5,,,,,,,,A2600NTSC,,,42e0ec5ab8f5deba53e4169ff2a5efbe, -Atari Logo Demo 6,,,,,,,,A2600NTSC,,,9526e3db3bdfbc27989a9cbfd0ee34bf, -Atari Logo Demo,,,,,,,,A2600PAL,,,d61629bbbe035f45552e31cef7d591b2, -Atari Video Cube,Atari,,,1982,CX2670,Rare,,A2600NTSC,,,3f540a30fdee0b20aed7288e4a5ea528, -Atlantis II,Imagic,,,1982,,,,A2600NTSC,,,826481f6fc53ea47c9f272f7050eedf7, -Atlantis,CCE,,,,,,,A2600NTSC,,,0b33252b680b65001e91a411e56e72e9,http://www.atariage.com/manual_html_page.html?SoftwareID=2457 -Atlantis,Imagic,Dennis Koble,,,,,,A2600NTSC,,,60345ae60f7c7010346de7aff9bfe6ea,http://www.atariage.com/manual_html_page.html?SoftwareID=2457 -Atlantis,Imagic,Dennis Koble,,,,,,A2600NTSC,,,cb8afcbc4a779b588b0428ea7af211d5,http://www.atariage.com/manual_html_page.html?SoftwareID=2457 -Atlantis,Imagic,Dennis Koble,,1982,,,,A2600PAL,,,c4bbbb0c8fe203cbd3be2e318e55bcc0,http://www.atariage.com/manual_html_page.html?SoftwareID=2457 -Atlantis,Imagic,Dennis Koble,,1982,IA3203,Uncommon,,A2600NTSC,,,9ad36e699ef6f45d9eb6c4cf90475c9f,http://www.atariage.com/manual_html_page.html?SoftwareID=2457 -Atlantis,Imagic,Dennis Koble,,1982,IA3203,Uncommon,,A2600NTSC,,,acb962473185d7a652f90ed6591ae13b,http://www.atariage.com/manual_html_page.html?SoftwareID=2457 -Atlantis,Imagic,Dennis Koble,,1982,IA3203,Uncommon,,A2600PAL,,,3d2367b2b09c28f1659c082bb46a7334,http://www.atariage.com/manual_html_page.html?SoftwareID=2457 -Attack Of The Mutant Space Urchins,,Barry Laws Jr.,Hack,,,,,A2600NTSC,,,a7cf2b9afdbb3a161bf418dbcf0321dc, -Aufruhr im Zoo,Starsoft,,,,,,,A2600PAL,,,0fcff6fe3b0769ad5d0cf82814d2a6d9, -Autorennen (a.k.a. Grand Prix),Ariola,,,,,,,A2600PAL,,,b4f87ce75f7329c18301a2505fe59cd3, -BMX Air Master,TNT Games,,,1989,CX26190,Extremely Rare,,A2600NTSC,,,968efc79d500dce52a906870a97358ab, -BMX Air Master,TNT Games,,,1989,CX26190,Extremely Rare,,A2600PAL,,,7c757bb151269b2a626c907a22f5dae7, -Bachelor Party,Mystique,,,,1002,Extremely Rare,,A2600NTSC,Paddles,Paddles,5b124850de9eea66781a50b2e9837000, -Bachelorette Party,Playaround,,,,1004,Extremely Rare,,A2600NTSC,Paddles,Paddles,274d17ccd825ef9c728d68394b4569d2, -Backgammon,Atari,Craig Nelson,,1978,CX2617,Extremely Rare,,A2600NTSC,Paddles,Paddles,8556b42aa05f94bc29ff39c39b11bff4,http://www.atariage.com/manual_thumbs.html?SoftwareID=842 -Backgammon,Atari,Craig Nelson,,1978,CX2617,Extremely Rare,,A2600PAL,Paddles,Paddles,85b1bca93e69f13905107cc802a02470,http://www.atariage.com/manual_thumbs.html?SoftwareID=842 -Ballblazer,Atari,,,1987,CX7815,Common,A7832P,A7800NTSC,,,8fc3a695eaea3984912d98ed4a543376,http://www.atariage.com/manual_thumbs.html?SoftwareID=2118 -Ballblazer,Atari,,,1987,CX7815,Common,A7832P,A7800PAL,,,b558814d54904ce0582e2f6a801d03af,http://www.atariage.com/manual_thumbs.html?SoftwareID=2118 -Bank Heist (w Skull Island Label),20th Century Fox,,,,11012,Rare,,A2600PAL,,,e9c71f8cdba6037521c9a3c70819d171, -Bank Heist,20th Century Fox,,,1983,11012,Rare,,A2600NTSC,,,00ce0bdd43aed84a983bef38fe7f5ee3, -Barber Pole Demo,,,,,,,,A2600NTSC,,,73a710e621d44e97039d640071908aef, -Barnstorming,Activision,Steve Cartwright,,1982,AX-013,Uncommon,,A2600NTSC,,,a29fc854838e08c247553a7d883dd65b,http://www.atariage.com/manual_thumbs.html?SoftwareID=846 -Barnstorming,Activision,Steve Cartwright,,1982,AX-013,Uncommon,,A2600NTSC,,,f8240e62d8c0a64a61e19388414e3104,http://www.atariage.com/manual_thumbs.html?SoftwareID=846 -Barnstorming,Activision,Steve Cartwright,,1982,AX-013,Uncommon,,A2600PAL,,,9ad362179c2eea4ea115c7640b4b003e,http://www.atariage.com/manual_thumbs.html?SoftwareID=846 -Barnstorming,CCE,Steve Cartwright,,,,,,A2600NTSC,,,5ae73916fa1da8d38ceff674fa25a78a,http://www.atariage.com/manual_thumbs.html?SoftwareID=846 -Barnyard Blaster,Atari,,,1988,,Common,A78SG,A7800NTSC,Lightgun,Lightgun,42682415906c21c6af80e4198403ffda,http://www.atariage.com/manual_thumbs.html?SoftwareID=2119 -Barnyard Blaster,Atari,,,1988,,Common,A78SG,A7800PAL,Lightgun,Lightgun,babe2bc2976688bafb8b23c192658126, -Bars and Text Demo 2,,,,,,,,A2600NTSC,,,d7891b0faa4c7f764482762d0ed427a5, -Bars and Text Demo 3,,,,,,,,A2600NTSC,,,600d48eef5c0ec27db554b7328b3251c, -Bars and Text Demo,,,,,,,,A2600NTSC,,,dcec46a98f45b193f07239611eb878c2, -Base Attack (a.k.a. Z-Tack -Laser-Loop -Sky Scrapper),HomeVision,,,,,,,A2600PAL,,,d6dc9b4508da407e2437bfa4de53d1b2, -Basic Programming,Atari,Warren Robinett,,1978,CX262,Rare,,A2600NTSC,Keypad,Keypad,9f48eeb47836cf145a15771775f0767a,http://www.atariage.com/manual_html_page.html?SoftwareID=852 -Basic Programming,Atari,Warren Robinett,,1978,CX2624,Common,,A2600PAL,Keypad,Keypad,b061e98a4c854a672aadefa233236e51,http://www.atariage.com/manual_html_page.html?SoftwareID=852 -Basketball (32-in-1),Atari,,,,,,,A2600PAL,,,1228c01cd3c4b9c477540c5adb306d2a,http://www.atariage.com/manual_thumbs.html?SoftwareID=854 -Basketball,Atari,Alan Miller,,1978,CX2624,Common,,A2600NTSC,,,ab4ac994865fb16ebb85738316309457,http://www.atariage.com/manual_thumbs.html?SoftwareID=854 -Basketball,Atari,Alan Miller,,1978,CX2624,Common,,A2600NTSC,,,e13c7627b2e136b9c449d9e8925b4547,http://www.atariage.com/manual_thumbs.html?SoftwareID=854 -Basketball,Atari,Alan Miller,,1978,CX2624,Common,,A2600PAL,,,218c0fe53dfaaa37f3c823f66eafd3fc,http://www.atariage.com/manual_thumbs.html?SoftwareID=854 -Basketbrawl,Atari,,,1990,CX7880,Rare,A78SG,A7800NTSC,,,f5f6b69c5eb4b55fc163158d1a6b423e,http://www.atariage.com/manual_thumbs.html?SoftwareID=2165 -Basketbrawl,Atari,,,1990,CX7880,Rare,A78SG,A7800PAL,,,fba002089fcfa176454ab507e0eb76cb,http://www.atariage.com/manual_thumbs.html?SoftwareID=2165 -Battle For Naboo,Imagic,Josh,Hack,,,,,A2600NTSC,,,5c0227ad63300670a647fcebf595ea37, -Battlezone TC,,Thomas Jentzsch,Hack,,,,A16K,A2600NTSC,,,6015a9cef783e97e98a2aa2cf070ae06, -Battlezone,Atari,,,1983,CX2681,Uncommon,A8K,A2600NTSC,,,41f252a66c6301f1e8ab3612c19bc5d4, -Battlezone,Atari,,,1983,CX2681,Uncommon,A8K,A2600PAL,,,fbe554aa8f759226d251ba6b64a9cce4, -Beamrider,Activision,Dave Rolfe,,1983,AZ-037-04,Rare,,A2600NTSC,,,3604e725e81dd0abede07fd1c82eb058, -Beamrider,Activision,Dave Rolfe,,1983,AZ-037-04,Rare,,A2600NTSC,,,79ab4123a83dc11d468fb2108ea09e2e, -Beamrider,Activision,Dave Rolfe,,1983,AZ-037-04,Rare,,A2600PAL,,,fec0c2e2ab0588ed20c750b58cf3baa3, -Beanie Baby Bash,Inky,,Hack,,,,,A2600NTSC,,,f4204fc92d17ed4cb567c40361ad58f1, -Beany Bopper,20th Century Fox,,,1982,11002,Rare,,A2600NTSC,,,d0b9df57bfea66378c0418ec68cfe37f, -Beany Bopper,CCE,,,,,,,A2600NTSC,,,6a9e0c72fab92df70084eccd9061fdbd, -Beast Invaders,,Jeff 'Yak' Minter,Hack,,,,,A2600NTSC,,,235436ab0832370e73677c9c6f0c8b06, -Beat 'Em and Eat 'Em,Mystique,,,,1003,Extremely Rare,,A2600NTSC,Paddles,Paddles,59e96de9628e8373d1c685f5e57dcf10, -Beef Drop,,Ken Siders,Homebrew,2006,,,,A7800NTSC,,,6010a398070dfacb4c0173d75d73c50a,http://www.atariage.com/software_page.html?SoftwareLabelID=2782 -Beef Drop,,Ken Siders,Homebrew,2006,,,,A7800NTSC,,,c534db0a062225b17cfb8ecce0fb9090,http://www.atariage.com/software_page.html?SoftwareLabelID=2782 -Bentley Bear - Crystal Quest,,Bob DeCrescenzo,Homebrew,2012,,,A78S9,A7800NTSC,,,6da5b1b9fa0001e3517f6084ff651b07, -Berenstain Bears,Coleco,,,1982,2658,Unbelievably Rare,A8K,A2600NTSC,,,ee6665683ebdb539e89ba620981cb0f6, -Bermuda Triangle,Data Age,,,1982,112-007,Rare,,A2600NTSC,,,b8ed78afdb1e6cfe44ef6e3428789d5f, -Bermuda,,,,,SS-009,Extremely Rare,,A2600PAL,,,073d7aff37b7601431e4f742c36c0dc1, -Bermuda,Rainbow Vision,,,,SS-009,Extremely Rare,,A2600PAL,,,cf3c2725f736d4bcb84ad6f42de62a41, -Bermuda,Starsoft,,,,SS-009,Extremely Rare,,A2600PAL,,,bcef7880828a391cf6b50d5a6dcef719, -Berzerk Voice Enhanced,,Dan Hitchens & Mike Mika,Hack,,,,,A2600NTSC,,,be41463cd918daef107d249f8cde3409,http://www.atariage.com/manual_html_page.html?SystemID=2600&SoftwareID=866&ItemTypeID=HTMLMANUAL -Berzerk,Atari,,,,,,,A2600PAL,,,490e3cc59d82f85fae817cdf767ea7a0,http://www.atariage.com/manual_html_page.html?SystemID=2600&SoftwareID=866&ItemTypeID=HTMLMANUAL -Berzerk,Atari,,,,,,,A2600PAL,,,4b205ef73a5779acc5759bde3f6d33ed,http://www.atariage.com/manual_html_page.html?SystemID=2600&SoftwareID=866&ItemTypeID=HTMLMANUAL -Berzerk,Atari,,,1982,CX2650,Common,,A2600NTSC,,,136f75c4dd02c29283752b7e5799f978,http://www.atariage.com/manual_html_page.html?SystemID=2600&SoftwareID=866&ItemTypeID=HTMLMANUAL -Berzerk,Atari,,,1982,CX2650,Common,,A2600PAL,,,0805366f1b165a64b6d4df20d2c39d25,http://www.atariage.com/manual_html_page.html?SystemID=2600&SoftwareID=866&ItemTypeID=HTMLMANUAL -Berzerk,CCE,,,,,,,A2600NTSC,,,fac28963307b6e85082ccd77c88325e7,http://www.atariage.com/manual_html_page.html?SystemID=2600&SoftwareID=866&ItemTypeID=HTMLMANUAL -Better Space Invaders,,Rob Kudla,Hack,1999,,,,A2600NTSC,,,63a7445b1d3046d3cdcdbd488dca38d9, -Betterblast,Mattel,Fabrizio Zavagli,Hack,,,,,A2600NTSC,,,4d5f6db55f7f44fd0253258e810bde21, -Bi! Bi! (a.k.a. Ungeheuer der Tiefe),Starsoft,,,,SS-013,,,A2600PAL,,,1278f74ca1dfaa9122df3eca3c5bcaad, -Big - Move This Demo 2,,,,,,,,A2600NTSC,,,16cc6d1b4ddce51c767a1ba8e5ff196c, -Big - Move This Demo,,,,,,,,A2600NTSC,,,f714a223954c28eccf459295517dcae6, -Big Bird's Egg Catch,Atari,,,1983,CX26104,Rare,,A2600NTSC,Keypad,Keypad,1802cc46b879b229272501998c5de04f, -Big Bird's Egg Catch,Atari,,,1983,CX26104,Rare,,A2600PAL,Keypad,Keypad,f283cc294ece520c2badf9da20cfc025, -Billard,Starsoft,,,,,,,A2600PAL,,,93c9f9239a4e5c956663dd7affa70da2, -Bionic Breakthrough,Atari,,Prototype,,,,,A2600NTSC,Mindlink,Mindlink,f0541d2f7cda5ec7bab6d62b6128b823, -Black Hole,Starsoft,,,,,,,A2600PAL,,,282a77841cb3d33af5b56151acba770e, -Black and White Fast Scolling Demo,,,,,,,,A2600NTSC,,,cbeafd37f15e0dddb0540dbe15c545a4, -Blackjack (32-in-1),Atari,Bob Whitehead,,,,,,A2600PAL,Paddles,Paddles,ff7627207e8aa03730c35c735a82c26c,http://www.atariage.com/manual_html_page.html?SoftwareID=869 -Blackjack,Atari,Bob Whitehead,,1977,,Rare,,A2600PAL,Paddles,Paddles,19a9d3f9fa1b1358fb53009444247aaf,http://www.atariage.com/manual_html_page.html?SoftwareID=869 -Blackjack,Atari,Bob Whitehead,,1977,,Rare,,A2600PAL,Paddles,Paddles,575c0fb61e66a31d982c95c9dea6865c,http://www.atariage.com/manual_html_page.html?SoftwareID=869 -Blackjack,Atari,Bob Whitehead,,1977,,Rare,,A2600PAL,Paddles,Paddles,ff3bd0c684f7144aeaa18758d8281a78,http://www.atariage.com/manual_html_page.html?SoftwareID=869 -Blackjack,Atari,Bob Whitehead,,1977,CX2651,Rare,,A2600NTSC,Paddles,Paddles,0a981c03204ac2b278ba392674682560,http://www.atariage.com/manual_html_page.html?SoftwareID=869 -Blackjack,Atari,Bob Whitehead,,1977,CX2651,Rare,,A2600NTSC,Paddles,Paddles,b2761efb8a11fc59b00a3b9d78022ad6,http://www.atariage.com/manual_html_page.html?SoftwareID=869 -Blair Witch Project,,Tim Snider,Hack,,,,,A2600NTSC,,,93420cc4cb1af1f2175c63e52ec18332, -Blue Dot Demo,,,,,,,,A2600NTSC,,,fcf8e306f6615f74feba5cb25550038c, -Blue and White Sprite Demo,,,,,,,,A2600NTSC,,,dad2ab5f66f98674f12c92abcfbf3a20, -Blueprint,CBS Electronics,,,,4L-2486,Uncommon,,A2600NTSC,,,33d68c3cd74e5bc4cf0df3716c5848bc, -Blueprint,CBS Electronics,,,,4L-2486,Uncommon,,A2600PAL,,,2432f33fd278dea5fe6ae94073627fcc, -Bobby geht nach Hause,Starsoft,,,,,,,A2600PAL,,,48e5c4ae4f2d3b62b35a87bca18dc9f5, -Bobby is Going Home (Brazil),Rentacom,,,,,,,A2600NTSC,,,2f2f9061398a74c80420b99ddecf6448, -Bobby is Going Home,Bitcorp,,,,PG206,Rare,,A2600PAL,,,2823364702595feea24a3fbee138a243, -Bobby is Going Home,CCE,,,,PG206,Rare,,A2600NTSC,,,3cbdf71bb9fd261fbc433717f547d738, -Bobby is Going Home,CCE,Thomas Jentzsch,Hack,,,,,A2600NTSC,,,afe776db50e3378cd6f29c7cdd79104a, -Bogey Blaster,Telegames,,,,5861 A030,Rare,,A2600PAL,,,b438a6aa9d4b9b8f0b2ddb51323b21e4, -Bogey Blaster,Telegames,,,,5861 A030,Rare,,A2600PAL,,,c59633dbebd926c150fb6d30b0576405, -Boing!,,,,,,Extremely Rare,,A2600NTSC,,,14c2548712099c220964d7f044c59fd9, -Boing!,,,,,,New Release,,A2600NTSC,,,0e08cd2c5bcf11c6a7e5a009a7715b6a, -Boing!,,,,,,New Release,,A2600NTSC,,,5d8fb14860c2f198472b233874f6b0c9, -Boing!,First Star Software,,,1983,,,,A2600PAL,,,c471b97446a85304bbac021c57c2cb49, -Boom Bang (a.k.a. Crackpots),Cooper Black,,,,,Extremely Rare,,A2600NTSC,,,a2aae759e4e76f85c8afec3b86529317, -Boom Bang (a.k.a. Kampf dem Steinfresser),Starsoft,,,,,,,A2600PAL,,,73aa02458b413091ac940c0489301710, -Booster by Junkosoft,Junkosoft,,,,,,,A2600NTSC,,,02e3f4ba156fb578bef7d7a0bf3400c1, -Bowling (32-in-1),Atari,,,,,,,A2600PAL,,,f69bb58b815a6bdca548fa4d5e0d5a75,http://www.atariage.com/manual_thumbs.html?SoftwareID=879 -Bowling,Atari,Larry Kaplan,,1978,CX2628,Common,,A2600NTSC,,,4a1a0509bfc1015273a542dfe2040958,http://www.atariage.com/manual_thumbs.html?SoftwareID=879 -Bowling,Atari,Larry Kaplan,,1978,CX2628,Common,,A2600NTSC,,,a28d872fc50fa6b64eb35981d0f4bb8d,http://www.atariage.com/manual_thumbs.html?SoftwareID=879 -Bowling,Atari,Larry Kaplan,,1978,CX2628,Common,,A2600NTSC,,,c9b7afad3bfd922e006a6bfc1d4f3fe7,http://www.atariage.com/manual_thumbs.html?SoftwareID=879 -Bowling,Atari,Larry Kaplan,,1978,CX2628,Common,,A2600NTSC,,,d4aa6d6095258ce46aaf6f144b09eea7,http://www.atariage.com/manual_thumbs.html?SoftwareID=879 -Bowling,Atari,Larry Kaplan,,1978,CX2628,Common,,A2600PAL,,,969b968383d9f0e9d8ffd1056bcaef49,http://www.atariage.com/manual_thumbs.html?SoftwareID=879 -Bowling,Dactar,,,,,,,A2600PAL,,,32ecb5a652eb73d287e883eea751d99c,http://www.atariage.com/manual_thumbs.html?SoftwareID=879 -Boxen,Ariola,,,,,,,A2600PAL,,,7f07cd2e89dda5a3a90d3ab064bfd1f6, -Boxing (32-in-1),Atari,Bob Whitehead,,,,,,A2600PAL,,,2c45c3eb819a797237820a1816c532eb,http://www.atariage.com/manual_thumbs.html?SoftwareID=882 -Boxing,Activision,Bob Whitehead,,,,,,A2600PAL,,,fd6e507b5df68beeeddeaf696b6828fa,http://www.atariage.com/manual_thumbs.html?SoftwareID=882 -Boxing,Activision,Bob Whitehead,,1981,AG-002,Uncommon,,A2600NTSC,,,277cca62014fceebb46c549bac25a2e3,http://www.atariage.com/manual_thumbs.html?SoftwareID=882 -Boxing,Activision,Bob Whitehead,,1981,AG-002,Uncommon,,A2600NTSC,,,88f74ec75ef696e7294b7b6ac5ca465f,http://www.atariage.com/manual_thumbs.html?SoftwareID=882 -Boxing,Activision,Bob Whitehead,,1981,AG-002,Uncommon,,A2600NTSC,,,c3ef5c4653212088eda54dc91d787870,http://www.atariage.com/manual_thumbs.html?SoftwareID=882 -Boxing,Activision,Bob Whitehead,,1981,AG-002,Uncommon,,A2600PAL,,,25f2e760cd7f56b88aac88d63757d41b,http://www.atariage.com/manual_thumbs.html?SoftwareID=882 -Boxing,Dactar,,,,,,,A2600PAL,,,cfb3260c603b0341d49ddfc94051ec10,http://www.atariage.com/manual_thumbs.html?SoftwareID=882 -Brain Games,Atari,Larry Kaplan,,1982,CX2664,Uncommon,,A2600NTSC,Keypad,Keypad,1cca2197d95c5a41f2add49a13738055, -Brain Games,Atari,Larry Kaplan,,1982,CX2664,Uncommon,,A2600NTSC,Keypad,Keypad,cb9626517b440f099c0b6b27ca65142c, -Brain Games,Atari,Larry Kaplan,,1982,CX2664,Uncommon,,A2600PAL,Keypad,Keypad,f280976d69d6e27a48506bd6bad11dcd, -Breakdown (a.k.a. Capture),Dynamics-Goliath,,,,,,,A2600PAL,,,372bddf113d088bc572f94e98d8249f5, -Breaking News,,Ric Pryor,Hack,,,,MN16K,A2600NTSC,,,4dbf47c7f5ac767a3b07843a530d29a5, -Breakout - Breakaway IV,Atari,Brad Stewart & Steve Jobs,,1978,CX2622,Common,,A2600NTSC,Paddles,Paddles,4df6124093ccb4f0b6c26a719f4b7706,http://www.atariage.com/manual_thumbs.html?SoftwareID=889 -Breakout - Breakaway IV,Atari,Brad Stewart & Steve Jobs,,1978,CX2622,Common,,A2600NTSC,Paddles,Paddles,9a25b3cfe2bbb847b66a97282200cca2,http://www.atariage.com/manual_thumbs.html?SoftwareID=889 -Breakout - Breakaway IV,Atari,Brad Stewart & Steve Jobs,,1978,CX2622,Common,,A2600NTSC,Paddles,Paddles,c738fc3f5aae1e8f86f7249f6c82ac81,http://www.atariage.com/manual_thumbs.html?SoftwareID=889 -Breakout - Breakaway IV,Atari,Brad Stewart & Steve Jobs,,1978,CX2622,Common,,A2600NTSC,Paddles,Paddles,f34f08e5eb96e500e851a80be3277a56,http://www.atariage.com/manual_thumbs.html?SoftwareID=889 -Breakout - Breakaway IV,Atari,Brad Stewart & Steve Jobs,,1978,CX2622,Common,,A2600PAL,Paddles,Paddles,6c76fe09aa8b39ee52035e0da6d0808b,http://www.atariage.com/manual_thumbs.html?SoftwareID=889 -Brick Kick,,,,,,,,A2600PAL,,,056ff67dd9715fafa91fb8b0ddcc4a46, -Brick Kick,R.J.P.G.,,,,,Extremely Rare,,A2600NTSC,,,e80a4026d29777c3c7993fbfaee8920f, -Bridge,Activision,Larry Kaplan,,1981,AX-006,Uncommon,,A2600NTSC,,,cfd6a8b23d12b0462baf6a05ef347cd8, -Buck Rogers - Planet of Zoom,Sega,,,1983,005-01,Uncommon,,A2600NTSC,,,1cf59fc7b11cdbcefe931e41641772f6, -Bugs Bunny,Atari,,,,,Prototype,,A2600NTSC,,,fa4404fabc094e3a31fcd7b559cdd029, -Bugs,Data Age,,,1982,DA 1005,Uncommon,,A2600NTSC,,,68597264c8e57ada93be3a5be4565096, -Bump 'N' Jump,Mattel,,,1983,MT7045,Rare,MN16K,A2600NTSC,,,205f4e080db97d3641a780c8c40261ef, -Bump 'N' Jump,Mattel,,,1983,MT7045,Rare,MN16K,A2600NTSC,,,76f53abbbf39a0063f24036d6ee0968a, -Bump 'N' Jump,Telegames,,,,,,MN16K,A2600PAL,,,9295570a141cdec18074c55dc7229d08, -Bumper Bash,Spectravideo,,,1983,,,,A2600NTSC,,,aa1c41f86ec44c0a44eb64c332ce08af, -Bumper Bash,Spectravideo,,,1983,,,,A2600PAL,,,1bf503c724001b09be79c515ecfcbd03, -Burgertime,Mattel,,,1982,MT4518,Rare,MN16K,A2600NTSC,,,0443cfa9872cdb49069186413275fa21, -Burning Desire,Mystique,,,,,Extremely Rare,,A2600NTSC,,,19d6956ff17a959c48fcd8f4706a848d, -Cakewalk,CommaVid,,,,CM-008,Extremely Rare,,A2600NTSC,,,7f6533386644c7d6358f871666c86e79, -Cakewalk,CommaVid,Fabrizio Zavagli,Hack,,,,,A2600PAL,,,0eebfb60d437796d536039701ec43845, -California Games,Epyx,,,1988,8056100286,Rare,A16K,A2600NTSC,,,9ab72d3fd2cc1a0c9adb504502579037, -California Games,Epyx,,,1988,8056100286,Rare,A16K,A2600PAL,,,8068e07b484dfd661158b3771d6621ca, -Candi,,,Hack,,,,,A2600NTSC,,,0e0808227ef41f6825c06f25082c2e56, -Candi,,,Hack,,,,,A2600NTSC,,,85478bb289dfa5c63726b9153992a920, -Canguru (Brazil),Zirok,,,,,,,A2600NTSC,,,6d8a04ee15951480cb7c466e5951eee0, -Canyon Bomber,Atari,David Crane,,1978,CX2607,Uncommon,,A2600NTSC,,,3051b6071cb26377cd428af155e1bfc4, -Canyon Bomber,Atari,David Crane,,1978,CX2607,Uncommon,,A2600NTSC,,,feedcc20bc3ca34851cd5d9e38aa2ca6, -Carnival,CBS Electronics,,,1983,,,,A2600PAL,,,de29e46dbea003c3c09c892d668b9413, -Carnival,CCE,,,,,,,A2600NTSC,,,3d6fc7a19be76d808aa233415cb583fc, -Carnival,Coleco,,,1982,2468,Uncommon,,A2600NTSC,,,028024fb8e5e5f18ea586652f9799c96, -Casino (a.k.a. Poker Plus),Sears,,,1978,CX2652,Uncommon,,A2600NTSC,Paddles,Paddles,b816296311019ab69a21cb9e9e235d12,http://www.atariage.com/manual_thumbs.html?SoftwareID=909 -Casino,Atari,Bob Whitehead,,1978,CX2652,Uncommon,,A2600PAL,Paddles,Paddles,2bc26619e31710a9884c110d8430c1da,http://www.atariage.com/manual_thumbs.html?SoftwareID=909 -Cat Trax,UA,,,,,,,A2600NTSC,,,76f66ce3b83d7a104a899b4b3354a2f2, -Cat Trax,UA,Thomas Jentzsch,Hack,,,,,A2600PAL,,,b7903268e235310dc346a164af4c7022, -Cat and Mouse,,George Veeder,Hack,,,,,A2600NTSC,,,a2de0fc85548871279ed2a3c1325c13e, -Cathouse Blues,Mystique,,,,,Extremely Rare,,A2600NTSC,,,9e192601829f5f5c2d3b51f8ae25dbe5, -Centipede 2k,Eduardo,,Hack,2000,,,A8K,A2600NTSC,,,10958cd0a1a81d599005f1797ab0e51d, -Centipede,Atari,,,1982,CX2676,Common,A8K,A2600NTSC,,,91c2098e88a6b13f977af8c003e0bca5,http://www.atariage.com/manual_thumbs.html?SoftwareID=911 -Centipede,Atari,,,1982,CX2676,Common,A8K,A2600PAL,,,17d000a2882f9fdaa8b4a391ad367f00,http://www.atariage.com/manual_thumbs.html?SoftwareID=911 -Centipede,Atari,,,1984,CX7801,Common,,A7800NTSC,,,5a09946e57dbe30408a8f253a28d07db,http://www.atariage.com/manual_thumbs.html?SoftwareID=2120 -Centipede,Atari,,,1984,CX7801,Common,,A7800PAL,,,38c056a48472d9a9e16ebda5ed91dae7,http://www.atariage.com/manual_thumbs.html?SoftwareID=2120 -Centipede,Atari,,Prototype,1982,,,,A2600PAL,,,2f11ba54609777e2c6a5da9b302c98e8,http://www.atariage.com/manual_thumbs.html?SoftwareID=911 -Challenge of...NEXAR,Spectravideo,,,,SA-206,Rare,,A2600PAL,,,1da2da7974d2ca73a823523f82f517b3, -Challenge of...NEXAR,Spectravideo,,,1982,SA-206,Rare,,A2600NTSC,,,5d799bfa9e1e7b6224877162accada0d, -Challenge of...NEXAR,Spectravideo,,,1982,SA-206,Rare,,A2600PAL,,,3d9c2fccf8b11630762ff00811c19277, -Challenge,Funvision,,,,,Extremely Rare,,A2600PAL,,,9905f9f4706223dadee84f6867ede8e3, -Challenge,Zellers,,,,,,,A2600NTSC,,,73158ea51d77bf521e1369311d26c27b, -Championship Soccer (a.k.a. International Soccer),,,,,MT5687,Uncommon,,A2600NTSC,,,3f6dbf448f25e2bd06dea44248eb122d, -Championship Soccer (a.k.a. Pele's Soccer),,,,,CX2616,Common,,A2600NTSC,,,ace319dc4f76548659876741a6690d57, -Championship Soccer (a.k.a. Pele's Soccer),Atari,,,,CX2616,Common,,A2600PAL,,,7a09299f473105ae1ef3ad6f9f2cd807, -Chase the Chuckwagon,Spectravideo,,,1983,,Unbelievably Rare,,A2600NTSC,,,3e33ac10dcf2dff014bc1decf8a9aea4, -Checkers (32-in-1),Atari,Alan Miller,,,,,,A2600PAL,,,bce93984b920e9b56cf24064f740fe78, -Checkers,Activision,Alan Miller,,1980,AG-003,Extremely Rare,,A2600NTSC,,,3f5a43602f960ede330cd2f43a25139e, -Checkers,Activision,Alan Miller,,1980,AG-003,Extremely Rare,,A2600NTSC,,,7edc8fcb319b3fb61cac87614afd4ffa, -China Syndrome,Spectravideo,,,1982,SA-205,Rare,,A2600NTSC,,,749fec9918160921576f850b2375b516, -Chinese Character Demo,,,,,,,,A2600NTSC,,,36f9a953ebdd9a8be97ccf27a2041903, -Choplifter!,Atari,Dan Gorlin,,1987,CX7821,Common,,A7800NTSC,,,93e4387864b014c155d7c17877990d1e,http://www.atariage.com/manual_thumbs.html?SoftwareID=2121 -Choplifter!,Atari,Dan Gorlin,,1987,CX7821,Common,,A7800PAL,,,59d4edb0230b5acc918b94f6bc94779f,http://www.atariage.com/manual_thumbs.html?SoftwareID=2121 -Chopper Command,Activision,Bob Whitehead,,1982,AX-015,Uncommon,,A2600NTSC,,,25d4be3309b89583c6b39d9f93bf654f,http://www.atariage.com/manual_thumbs.html?SoftwareID=921 -Chopper Command,Activision,Bob Whitehead,,1982,AX-015,Uncommon,,A2600NTSC,,,c1cb228470a87beb5f36e90ac745da26,http://www.atariage.com/manual_thumbs.html?SoftwareID=921 -Chopper Command,Activision,Bob Whitehead,,1982,AX-015,Uncommon,,A2600PAL,,,114c599454d32f74c728a6e1f71012ba,http://www.atariage.com/manual_thumbs.html?SoftwareID=921 -Chopper Command,CCE,Bob Whitehead,,,,,,A2600NTSC,,,85a4133f6dcf4180e36e70ad0fca0921,http://www.atariage.com/manual_thumbs.html?SoftwareID=921 -Chopper Command,Supervision,Bob Whitehead,,,,,,A2600PAL,,,b9f9c0fed0db08c34346317f3957a945,http://www.atariage.com/manual_thumbs.html?SoftwareID=921 -Chuck Norris Superkicks,Xonox,,,,99003,Extremely Rare,,A2600NTSC,,,3f58f972276d1e4e0e09582521ed7a5b, -Circus Atari,Atari,Mike Lorenzen,,1978,CX2630,Common,,A2600NTSC,,,a29df35557f31dfea2e2ae4609c6ebb7,http://www.atariage.com/manual_html_page.html?SoftwareID=927 -Circus Atari,Atari,Mike Lorenzen,,1978,CX2630,Common,,A2600NTSC,Paddles,Paddles,a7b96a8150600b3e800a4689c3ec60a2,http://www.atariage.com/manual_html_page.html?SoftwareID=927 -Circus Atari,Atari,Mike Lorenzen,,1978,CX2630,Common,,A2600PAL,,,30e0ab8be713208ae9a978b34e9e8e8c,http://www.atariage.com/manual_html_page.html?SoftwareID=927 -Climber 5,,Dennis Debro,Prototype,,,,,A2600NTSC,,,d82c8a58098a6b46c5b81c16180354d1, -Coco Nuts,Telesys,,,1982,1001,Rare,,A2600NTSC,,,1e587ca91518a47753a28217cd4fd586, -Codebreaker,Atari,,,1978,CX2643,Uncommon,,A2600NTSC,Keypad,Keypad,5846b1d34c296bf7afc2fa05bbc16e98,http://www.atariage.com/manual_thumbs.html?SoftwareID=931 -Codebreaker,Atari,,,1978,CX2643,Uncommon,,A2600NTSC,Keypad,Keypad,83f50fa0fbae545e4b88bb53b788c341,http://www.atariage.com/manual_thumbs.html?SoftwareID=931 -Codebreaker,Atari,,,1978,CX2643,Uncommon,,A2600PAL,Keypad,Keypad,a47e26096de6f6487bf5dd2d1cced294,http://www.atariage.com/manual_thumbs.html?SoftwareID=931 -Coffee Cup Soccer,,Matthias Jaap,Hack,,,,,A2600NTSC,,,551a64a945d7d6ece81e9c1047acedbc, -Col 'N,HomeVision,,,,554-33391,Extremely Rare,,A2600NTSC,,,4093382187f8387e6d011883e8ea519b, -Color Bar Generator,Videosoft,,Prototype,,VS1008,,,A2600NTSC,,,76a9bf05a6de8418a3ebc7fc254b71b4, -Color Table Display Helper,,,,,,,,A2600NTSC,,,e5a6e0bb7d56e2f08b237e15076e5699, -Color Test,Atari,,,1984,,,,A7800NTSC,,,441ac404cdc7bcbd4d787f911df7bf0d, -Colors Demo,,,,,,,,A2600NTSC,,,3f9431cc8c5e2f220b2ac14bbc8231f4, -Colours Selector,,,,,,,,A2600NTSC,,,9989f974c3cf9c641db6c8a70a2a2267, -Combat (32-in-1),Atari,Joe Decuir,,,,,,A2600PAL,,,0ef64cdbecccb7049752a3de0b7ade14, -Combat - Tank Plus,,,,,CX2601,Common,,A2600NTSC,,,ac05c0e53a5e7009ddd75ed4b99949fc, -Combat - Tank Plus,,,,,CX2601,Common,,A2600NTSC,,,be35d8b37bbc03848a5f020662a99909, -Combat II,Atari,,Prototype,1982,,,,A2600NTSC,,,b0c9cf89a6d4e612524f4fd48b5bb562, -Combat Rock,,,,,,,,A2600NTSC,,,5385cf2a04de1d36ab55c73174b84db0, -Combat Rock,,Paul Slocum,Hack,,,,,A2600NTSC,,,e63efdfda9a4003dcd77a854a781a06a, -Combat,Atari,Joe Decuir,,1977,CX2601,Common,,A2600NTSC,,,4c8832ed387bbafc055320c05205bc08,http://www.atariage.com/manual_thumbs.html?SoftwareID=935 -Combat,Atari,Joe Decuir,,1977,CX2601,Common,,A2600PAL,,,e8aa36e3d49e9bfa654c25dcc19c74e6,http://www.atariage.com/manual_thumbs.html?SoftwareID=935 -Commando Raid,US Games,,,,VC 1004,Rare,,A2600NTSC,,,f457674cef449cfd85f21db2b4f631a7, -Commando Raid,US Games,,,,VC 1004,Rare,,A2600PAL,,,5f316973ffd107f7ab9117e93f50e4bd, -Commando,Activision,Mike Reidel,,1988,,,,A2600PAL,,,de1e9fb700baf8d2e5ae242bffe2dbda, -Commando,Atari,,,1988,,,,A2600NTSC,,,5d2cc33ca798783dee435eb29debf6d6, -Commando,Atari,Dwain Skinner,,1989,CX7838,Scarce,A78SGP,A7800NTSC,,,2e8e28f6ad8b9b9267d518d880c73ebb,http://www.atariage.com/manual_thumbs.html?SoftwareID=2166 -Commando,Atari,Dwain Skinner,,1989,CX7838,Scarce,A78SGP,A7800PAL,,,55da6c6c3974d013f517e725aa60f48e,http://www.atariage.com/manual_thumbs.html?SoftwareID=2166 -CompuMate,Spectravideo & Universum,,,,,,,A2600PAL,,,e7f005ddb6902c648de098511f6ae2e5, -Computer Chess,Atari,,Prototype,,,,,A2600NTSC,,,6a2c68f7a77736ba02c0f21a6ba0985b, -Condor Attack,High-Score Games,,,,,,,A2600PAL,,,e505bd8e59e31aaed20718d47b15c61b, -Condor Attack/Condor Attack/Vulture Attack,CCE/Ultravision/K-Tel Vision,,,,C-851,Extremely Rare,,A2600NTSC,,,1f21666b8f78b65051b7a609f1d48608, -Confrontation,Answer,,,,,,,A2600NTSC,,,f965cc981cbb0822f955641f8d84e774, -Congo Bongo,Sega,,,1983,006-01,Rare,,A2600NTSC,,,00b7b4cbec81570642283e7fc1ef17af, -Console Wars,Greg Thompson,,Hack,,,,,A2600NTSC,,,a81b29177f258494b499fbac69789cef, -Cookie Monster Munch,,,Prototype,,CX26102,,,A2600NTSC,Keypad,Keypad,57c5b351d4de021785cf8ed8191a195c, -Cookie Monster Munch,Atari,,,,CX26102,Rare,,A2600PAL,Keypad,Keypad,a0297c4788f9e91d43e522f4c561b4ad, -Corrida da Matematica,CCE,,,,,,,A2600NTSC,,,01e5c81258860dd82f77339d58bc5f5c, -Cosmic Ark (Star Disable Option),,,,,,,,A2600NTSC,,,7d903411807704e725cf3fafbeb97255,http://www.atariage.com/manual_thumbs.html?SoftwareID=945 -Cosmic Ark,CCE,Rob Fulop,,,,,,A2600NTSC,,,98ef1593624b409b9fb83a1c272a0aa7,http://www.atariage.com/manual_thumbs.html?SoftwareID=945 -Cosmic Ark,Imagic,Rob Fulop,,1982,IA3204,Uncommon,,A2600NTSC,,,ab5bf1ef5e463ad1cbb11b6a33797228,http://www.atariage.com/manual_thumbs.html?SoftwareID=945 -Cosmic Ark,Imagic,Rob Fulop,,1982,IA3204,Uncommon,,A2600PAL,,,0fd72a13b3b6103fc825a692c71963b4,http://www.atariage.com/manual_thumbs.html?SoftwareID=945 -Cosmic Ark,Imagic,Rob Fulop,,1982,IA3204,Uncommon,,A2600PAL,,,72d0acb5de0db662de0360a6fc59334d,http://www.atariage.com/manual_thumbs.html?SoftwareID=945 -Cosmic Avenger,,,,,,,,A2600PAL,,,00ce76ad69cdc2fa36ada01ae092d5a6, -Cosmic Commuter,,Thomas Jentzsch,Hack,,,,,A2600PAL,,,8e879aa58db41edb67cbf318b77766c4, -Cosmic Commuter,Activision,John Van Ryzin,,1984,AG-038,Rare,,A2600NTSC,,,133b56de011d562cbab665968bde352b, -Cosmic Commuter,Activision,John Van Ryzin,,1984,AG-038,Rare,,A2600NTSC,,,ba657d940a11e807ff314bba2c8b389b, -Cosmic Commuter,CCE,John Van Ryzin,,,,,,A2600NTSC,,,5f1b7d5fa73aa071ba0a3c2819511505, -Cosmic Corridor,Zimag,,,,GN-040/708-111,Rare,,A2600NTSC,,,f367e58667a30e7482175809e3cec4d4, -Cosmic Creeps,Telesys,,,1982,1002,Rare,,A2600NTSC,,,3c853d864a1d5534ed0d4b325347f131, -Cosmic Creeps,Telesys,,,1982,1002,Rare,,A2600PAL,,,5835a78a88f97acea38c964980b7dbc6, -Cosmic Swarm (32-in-1),Atari,,,,,,,A2600PAL,,,afe4eefc7d885c277fc0649507fbcd84, -Cosmic Swarm,CommaVid,,,1982,,,,A2600PAL,,,2a2f46b3f4000495239cbdad70f17c59, -Cosmic Swarm,CommaVid,,,1982,,,,A2600PAL,,,36547bc6faa5132b87504e18d088e1d7, -Cosmic Swarm,CommaVid,,,1982,CM-003,Rare,,A2600NTSC,,,9dec0be14d899e1aac4337acef5ab94a, -Cosmic Swarm,CommaVid,,,1982,CM-003,Rare,,A2600NTSC,,,e5f17b3e62a21d0df1ca9aee1aa8c7c5, -Cosmic Town,ITT Family Games,,,,,,,A2600PAL,,,6c91ac51421cb9fc72c9833c4f440d65, -Counter Demo,,,,,,,,A2600NTSC,,,be561b286b6432cac71bccbae68002f7, -Crack'ed,Atari,Rovert Neve,,1988,CX7836,Common,A78SG,A7800NTSC,,,db691469128d9a4217ec7e315930b646,http://www.atariage.com/manual_thumbs.html?SoftwareID=2122 -Crack'ed,Atari,Rovert Neve,,1988,CX7836,Common,A78SG,A7800PAL,,,7cbe78fa06f47ba6516a67a4b003c9ee,http://www.atariage.com/manual_thumbs.html?SoftwareID=2122 -Crackpots,Activision,Dan Kitchen,,,AX-029,Rare,,A2600PAL,,,2825f4d068feba6973e61c84649489fe, -Crackpots,Activision,Dan Kitchen,,,AX-029,Rare,,A2600PAL,,,f3c431930e035a457fe370ed4d230659, -Crackpots,Activision,Dan Kitchen,,1983,AX-029,Rare,,A2600NTSC,,,88ed87c011f699dd27321dbe404db6c8, -Crackpots,Activision,Dan Kitchen,,1983,AX-029,Rare,,A2600NTSC,,,a184846d8904396830951217b47d13d9, -Crackpots,CCE,Dan Kitchen,,,,,,A2600NTSC,,,3f3ad2765c874ca13c015ca6a44a40a1, -Crash Dive,20th Century Fox,,,1983,11031,Extremely Rare,,A2600NTSC,,,fb88c400d602fe759ae74ef1716ee84e, -Crash Dive,20th Century Fox,Fabrizio Zavagli,Hack,,,,,A2600PAL,,,9072c142728a3a3d994956d03bfacba2, -Crazy Brix,,Bob DeCrescenzo,Homebrew,2011,,,A7816,A7800NTSC,,,0c9b124355d5328697a3b9e0011353f2, -Crazy Brix,,Bob DeCrescenzo,Homebrew,2011,,,A7816,A7800NTSC,,,45e1d527becc96d1715e810d1c07ac27, -Crazy Brix,,Bob DeCrescenzo,Homebrew,2011,,,A7816,A7800PAL,,,fc7db1a9243ce2140f716762b8352a5c, -Crazy Climber,,,,,CX2683,Extremely Rare,,A2600NTSC,,,55ef7b65066428367844342ed59f956c,http://www.atariage.com/manual_html_page.html?SoftwareID=954 -Crazy Valet,Hozer Video Games,,Homebrew,,,,,A2600NTSC,,,4a7eee19c2dfb6aeb4d9d0a01d37e127, -Criminal Pursuit,,,,,,Extremely Rare,,A2600NTSC,,,48f18d69799a5f5451a5f0d17876acef, -Cross Force,Spectravision,,,1982,SA-203,Rare,,A2600NTSC,,,c17bdc7d14a36e10837d039f43ee5fa3, -Cross Force,Spectravision,,,1982,SA-203,Rare,,A2600PAL,,,8372eec01a08c60dbed063c5524cdfb1, -Cross Force,Spectravision,,,1982,SA-203,Rare,,A2600PAL,,,8f88309afad108936ca70f8b2b084718, -Crossbow,Atari,,,1987,CX26139,Uncommon,,A2600NTSC,,,8cd26dcf249456fe4aeb8db42d49df74, -Crossbow,Atari,,,1987,CX26139,Uncommon,,A2600PAL,,,7e4783a59972ae2cd8384f231757ea0b, -Crossbow,Atari,,,1988,CX7844,Scarce,A78S9,A7800NTSC,Lightgun,Lightgun,a94e4560b6ad053a1c24e096f1262ebf,http://www.atariage.com/manual_thumbs.html?SoftwareID=2123 -Crossbow,Atari,,,1988,CX7844,Scarce,A78S9,A7800PAL,Lightgun,Lightgun,63db371d67a98daec547b2abd5e7aa95,http://www.atariage.com/manual_thumbs.html?SoftwareID=2123 -Cruise Missile/Radar,Froggo/Zellers,,,1982,FG 1007,Rare,,A2600NTSC,,,74f623833429d35341b7a84bc09793c0, -Crypts of Chaos,20th Century Fox,,,1982,11009,Rare,,A2600NTSC,,,384f5fbf57b5e92ed708935ebf8a8610, -Crystal Castles,Atari,,,1984,CX26110,Uncommon,A16KR,A2600NTSC,,,1c6eb740d3c485766cade566abab8208, -Crystal Castles,Atari,,,1984,CX26110,Uncommon,A16KR,A2600NTSC,,,a6127f470306eed359d85eb4a9cf3c96, -Crystal Castles,Atari,,,1984,CX26110,Uncommon,A16KR,A2600PAL,,,ca7abc774a2fa95014688bc0849eee47, -Crystal Castles,Atari,,Prototype,1984,,,A16KR,A2600NTSC,,,c68a6bafb667bad2f6d020f879be1d11, -Cubicolor,,Rob Fulop,Prototype,,,,,A2600NTSC,,,6fa0ac6943e33637d8e77df14962fbfc, -Cubis (6K),,Eckhard Stolberg,Homebrew,1997,,,,A2600NTSC,,,d2c957dd7746521b51bb09fde25c5774, -Cubis (EM),,Eckhard Stolberg,Homebrew,1997,,,,A2600NTSC,,,281ff9bd0470643853de5cbd6d9e17f5, -Cubis,,Eckhard Stolberg,Homebrew,1997,,,,A2600PAL,,,f74ad642552385c3daa203a2a6fc2291, -Cubo Magico,CCE,,,,,,,A2600NTSC,,,64ca518905311d2d9aeb56273f6caa04, -Custer's Revenge,Mystique,,,,1001,Extremely Rare,,A2600NTSC,,,58513bae774360b96866a07ca0e8fd8e, -Cute Dead Things House,,Christian Samuel,Hack,,,,,A2600NTSC,,,5355f80cacf0e63a49cbf4ade4e27034, -Cybergoth Galaxian,,Manuel Polik,Hack,,,,A8K,A2600NTSC,,,60358edf0c2cc76b1e549e031e50e130, -DUP Space Invaders,,Ron Corcoran,Hack,,,,,A2600NTSC,,,b719ada17771a8d206c7976553825139, -Dancing Baby Demo,,Andrew Davie,,,,,TV8K,A2600NTSC,,,95fd6097dc27c20666f039cfe34f7c69, -Dancing Plate,,,,,,,,A2600PAL,,,f48735115ec302ba8bb2d2f3a442e814, -Dancing Plates,,,,,PG205,Rare,,A2600PAL,,,929e8a84ed50601d9af8c49b0425c7ea, -Dare Diver,Sears,,,1977,99843/75118,Extremely Rare,,A2600NTSC,,,3d8a2d6493123a53ade45e3e2c5cafa0, -Dark Cavern,Mattel,,,1982,MT5667,Uncommon,,A2600NTSC,,,a422194290c64ef9d444da9d6a207807, -Dark Chambers,Atari,,,1988,CX26151,Uncommon,A16KR,A2600NTSC,,,106855474c69d08c8ffa308d47337269, -Dark Chambers,Atari,,,1988,CX26151,Uncommon,A16KR,A2600PAL,,,0d5af65ad3f19558e6f8e29bf2a9d0f8, -Dark Chambers,Atari,,,1988,CX7837,Common,A78SG,A7800NTSC,,,179b76ff729d4849b8f66a502398acae,http://www.atariage.com/manual_thumbs.html?SoftwareID=2124 -Dark Chambers,Atari,,,1988,CX7837,Common,A78SG,A7800PAL,,,a2b8e2f159642c4b91de82e9a2928494,http://www.atariage.com/manual_thumbs.html?SoftwareID=2124 -Dark Mage (4K),,,Homebrew,,,,,A2600NTSC,,,dba270850ae997969a18ee0001675821, -Dark Mage (8K),,,Homebrew,,,,,A2600NTSC,,,6333ef5b5cbb77acd47f558c8b7a95d3, -Dark Mage (SuperCharger),SuperCharger,,Homebrew,,,,,A2600NTSC,,,6cd506509e8fd5627f55603780e862a8, -Dark Mage (final beta),,,Homebrew,,,,,A2600NTSC,,,2b71a59a53be5883399917bf582b7772, -Dark Mage (rough beta),,,Homebrew,,,,,A2600NTSC,,,1345e972dbe08ea3e70850902e20e1a5, -Deadly Duck,20th Century Fox,,,1982,11004,Rare,,A2600NTSC,,,e4c00beb17fdc5881757855f2838c816, -Death Trap,,,,,50010,Unbelievably Rare,,A2600NTSC,,,4e15ddfd48bca4f0bf999240c47b49f5, -Decathlon,Activision,David Crane,,1983,AZ-030,Rare,DC8K,A2600NTSC,,,ac7c2260378975614192ca2bc3d20e0b,http://www.atariage.com/manual_thumbs.html?SoftwareID=967 -Decathlon,Activision,David Crane,,1983,AZ-030,Rare,DC8K,A2600PAL,,,883258dcd68cefc6cd4d40b1185116dc,http://www.atariage.com/manual_thumbs.html?SoftwareID=967 -Defender 2,Atari,,,1984,,,,A2600PAL,,,5f786b67e05fb9985b77d4beb35e06ee,http://www.atariage.com/manual_html_page.html?SoftwareID=971 -Defender 2,Atari,,,1984,CX26120,Rare,A8KR,A2600NTSC,,,3a771876e4b61d42e3a3892ad885d889,http://www.atariage.com/manual_html_page.html?SoftwareID=971 -Defender 2,Atari,,,1984,CX26120,Rare,A8KR,A2600NTSC,,,d1fc4cf675c9b49fb7deb792f2f3a7a5,http://www.atariage.com/manual_html_page.html?SoftwareID=971 -Defender,Atari,Bob Polaro,,1981,,,,A2600PAL,,,047ac3b9faea64522b7a23c4465a7aa8,http://www.atariage.com/manual_html_page.html?SoftwareID=969 -Defender,Atari,Bob Polaro,,1981,CX2609,Common,,A2600NTSC,,,0f643c34e40e3f1daafd9c524d3ffe64,http://www.atariage.com/manual_html_page.html?SoftwareID=969 -Defender,Atari,Bob Polaro,,1981,CX2609,Common,,A2600PAL,,,e4bff1d5df70163c0428a1ead309c22d,http://www.atariage.com/manual_html_page.html?SoftwareID=969 -Defender,CCE,Bob Polaro,,,,,,A2600NTSC,,,808c3b1e60ee0e7c65205fa4bd772221,http://www.atariage.com/manual_html_page.html?SoftwareID=969 -Demolition Herby,Telesys,,,1982,1006,Extremely Rare,,A2600NTSC,,,d09935802d6760ae58253685ff649268, -Demolition Herby,Telesys,,,1982,1006,Extremely Rare,,A2600PAL,,,4a6be79310f86f0bebc7dfcba4d74161, -Demon Attack,Image,Rob Fulop,,1982,,,,A2600NTSC,,,bcb2967b6a9254bcccaf906468a22241,http://www.atariage.com/manual_html_page.html?SoftwareID=974 -Demon Attack,Imagic,Rob Fulop,,1982,,,,A2600PAL,,,442602713cb45b9321ee93c6ea28a5d0,http://www.atariage.com/manual_html_page.html?SoftwareID=974 -Demon Attack,Imagic,Rob Fulop,,1982,IA3200,Common,,A2600NTSC,,,110ac8ecaf1b69f41bc94c59dfcb8b2d,http://www.atariage.com/manual_html_page.html?SoftwareID=974 -Demon Attack,Imagic,Rob Fulop,,1982,IA3200,Common,,A2600NTSC,,,f0e0addc07971561ab80d9abe1b8d333,http://www.atariage.com/manual_html_page.html?SoftwareID=974 -Demon Attack,Imagic,Rob Fulop,,1982,IA3200,Common,,A2600PAL,,,4901c05068512828367fde3fb22199fe,http://www.atariage.com/manual_html_page.html?SoftwareID=974 -Demons to Diamonds,,,,,CX2615,Uncommon,,A2600NTSC,Paddles,Paddles,f91fb8da3223b79f1c9a07b77ebfa0b2, -Demons to Diamonds,Atari,,,,CX2615,Uncommon,,A2600PAL,Paddles,Paddles,d62283aed0f4199adb2333de4c263e9c, -Demons to Diamonds,CCE,,,,,,,A2600NTSC,Paddles,Paddles,bf84f528de44225dd733c0e6a8e400a0, -Demons!,,,,,,,,A2600NTSC,,,698f569eab5a9906eec3bc7c6b3e0980, -Der Geheimkurier,Starsoft,,,,,,,A2600PAL,,,2d16a8b59a225ea551667be45f554652, -Der Vielfrass,Starsoft,,,,,,,A2600PAL,,,313243fc41e49ef6bd3aa9ebc0d372dd, -Der Vielfrass,Starsoft,,,,,,,A2600PAL,,,a1ca372388b6465a693e4626cc98b865, -Der hungrige Panda,Starsoft,,,,,,,A2600PAL,,,82bf0dff20cee6a1ed4bb834b00074e6, -Der kleine Baer,Starsoft,,,,,,,A2600PAL,,,25a21c47afe925a3ca0806876a2b4f3f, -Desert Falcon,Atari,,,1987,CX26140,Common,,A2600NTSC,,,fd4f5536fd80f35c64d365df85873418, -Desert Falcon,Atari,,,1987,CX26140,Common,,A2600PAL,,,d4806775693fcaaa24cf00fc00edcdf3, -Desert Falcon,Atari,,,1987,CX7811,Common,,A7800NTSC,,,95ac811c7d27af0032ba090f28c107bd,http://www.atariage.com/manual_thumbs.html?SoftwareID=2125 -Desert Falcon,Atari,,,1987,CX7811,Common,,A7800PAL,,,2d5d99b993a885b063f9f22ce5e6523d,http://www.atariage.com/manual_thumbs.html?SoftwareID=2125 -Diagnostic Cartridge,,,,,,,,A2600NTSC,,,02ab2c47bc21e7feafa015f90d7df776,http://www.atariage.com/manual_html_page.html?SoftwareID=2354 -Dice Puzzle,Panda,,,,,,,A2600PAL,,,e02156294393818ff872d4314fc2f38e, -Dice Puzzle,Panda,,,,106,Rare,,A2600NTSC,,,9222b25a0875022b412e8da37e7f6887, -Die Ente und der Wolf,Starsoft,,,,,,,A2600PAL,,,72876fd7c7435f41d571f1101fc456ea, -Die Ratte und die Karotten,Starsoft,,,,,,,A2600PAL,,,31df1c50c4351e144c9a378adb8c10ba, -Die Springteufel,Starsoft,,,,,,,A2600PAL,,,3b69f8929373598e1752f43f8da61aa4, -Die Unterwasser-Bestien,Starsoft,,,,,,,A2600PAL,,,6141c095d0aee4e734bebfaac939030a, -Die hungrigen Froesche,Starsoft,,,,,,,A2600PAL,,,834a2273e97aec3181ee127917b4b269, -Dig Dug (Version 1),Atari,,,1983,CX2677,Uncommon,A16KR,A2600PAL,,,977294ae6526c31c7f9a166ee00964ad,http://www.atariage.com/manual_thumbs.html?SoftwareID=982 -Dig Dug (Version 2),Atari,,,1983,CX2677,Uncommon,A16KR,A2600PAL,,,21d2c435bcccde7792d82844b3cf60f4,http://www.atariage.com/manual_thumbs.html?SoftwareID=982 -Dig Dug,Atari,,,1983,CX2677,Uncommon,A16KR,A2600NTSC,,,6dda84fb8e442ecf34241ac0d1d91d69,http://www.atariage.com/manual_thumbs.html?SoftwareID=982 -Dig Dug,Atari,,,1987,CX7803,Common,,A7800NTSC,,,731879ea82fc0ca245e39e036fe293e6,http://www.atariage.com/manual_thumbs.html?SoftwareID=2126 -Dig Dug,Atari,,,1987,CX7803,Common,,A7800PAL,,,408dca9fc40e2b5d805f403fa0509436,http://www.atariage.com/manual_thumbs.html?SoftwareID=2126 -Dishaster,Zimag,,,,,Extremely Rare,,A2600NTSC,,,939ce554f5c0e74cc6e4e62810ec2111, -Dodge 'em,Atari,Carla Meninsky,,,CX2637,Uncommon,,A2600PAL,,,a5e9ed3033fb2836e80aa7a420376788, -Dodge 'em,Atari,Carla Meninsky,,,CX2637,Uncommon,,A2600PAL,,,d28afe0517a046265c418181fa9dd9a1, -Dodge 'em,Atari,Carla Meninsky,,1978,CX2637,Uncommon,,A2600NTSC,,,83bdc819980db99bf89a7f2ed6a2de59, -Dodge 'em,Atari,Carla Meninsky,,1978,CX2637,Uncommon,,A2600NTSC,,,c3472fa98c3b452fa2fd37d1c219fb6f, -Dodge Demo 1,,,,,,,,A2600NTSC,,,bc526185ad324241782dc68ba5d0540b, -Dodge Demo 2,,,,,,,,A2600NTSC,,,5acf9865a72c0ce944979f76ff9610f0, -Dodge Demo 3,,,,,,,,A2600NTSC,,,0c0392db94a20e4d006d885abbe60d8e, -Dodge Demo 4,,,,,,,,A2600NTSC,,,e2b682f6e6d76b35c180c7d847e93b4f, -Dolphin,Activision,Matthew Hubbard,,1983,AX-024,Rare,,A2600NTSC,,,ca09fa7406b7d2aea10d969b6fc90195, -Dolphin,Activision,Matthew Hubbard,,1983,AX-024,Rare,,A2600NTSC,,,d09a7504ee8c8717ac3e24d263e7814d, -Dolphin,CCE,,,,,,,A2600NTSC,,,3889351c6c2100b9f3aef817a7e17a7a, -Domino,Ishido,,Homebrew,,,,,A2600NTSC,,,7ffc2d80fd49a124808315306d19868e, -Domino,Ishido,,Homebrew,,,,,A2600NTSC,,,84d1cf884f029e458db196548db9c2ad, -Donald Duck's Speedboat,Atari,,Prototype,,CX26108,,,A2600NTSC,,,937736d899337036de818391a87271e0, -Donkey Claus,,Philp R. Frey,Hack,,,,,A2600NTSC,,,f473f99e47d4026a7a571184922ebf04, -Donkey Kong Jr.,CCE,,,1983,2653,Rare,,A2600NTSC,,,5a6febb9554483d8c71c86a84a0aa74e, -Donkey Kong Jr.,Coleco,,,1983,,,,A2600PAL,,,2091af29b4e7b86914d79d9aaa4cbd20, -Donkey Kong Jr.,Coleco,,,1983,2653,Rare,,A2600NTSC,,,7fd52208fb6391bae0cd7e68c27bde6f, -Donkey Kong Jr.,Coleco,,,1983,2653,Rare,,A2600NTSC,,,c8fa5d69d9e555eb16068ef87b1c9c45, -Donkey Kong Junior,Atari,,,1988,CX7849,Common,,A7800NTSC,,,5e332fbfc1e0fc74223d2e73271ce650,http://www.atariage.com/manual_thumbs.html?SoftwareID=2128 -Donkey Kong Junior,Atari,,,1988,CX7849,Common,,A7800PAL,,,4dc5f88243250461bd61053b13777060,http://www.atariage.com/manual_thumbs.html?SoftwareID=2128 -Donkey Kong,,,,,2451,Common,,A2600PAL,,,0894aa7be77521f9df562be8d9555fe6,http://www.atariage.com/manual_thumbs.html?SoftwareID=989 -Donkey Kong,,,,,2451,Common,,A2600PAL,,,8b5b1e3a434ebbdc2c2a49dc68f46360,http://www.atariage.com/manual_thumbs.html?SoftwareID=989 -Donkey Kong,Atari,,,1987,CX7848,Common,,A7800NTSC,,,19f1ee292a23636bd57d408b62de79c7,http://www.atariage.com/manual_thumbs.html?SoftwareID=2127 -Donkey Kong,Atari,,,1987,CX7848,Common,,A7800PAL,,,8e96ef14ce9b5d84bcbc996b66d6d4c7,http://www.atariage.com/manual_thumbs.html?SoftwareID=2127 -Donkey Kong,CBS Electronics,,,,,Common,,A2600PAL,,,3a526e6a1f9fe918af0f2ce997dfea73,http://www.atariage.com/manual_thumbs.html?SoftwareID=989 -Donkey Kong,Coleco,,,,2451,Common,,A2600NTSC,,,36b20c427975760cb9cf4a47e41369e4,http://www.atariage.com/manual_thumbs.html?SoftwareID=989 -Doomzerk,Eduardo,,Hack,,,,,A2600NTSC,,,200a9d2a7cb4441ce4f002df6aa47e38, -Double Dragon,Activision,,,1989,AM-050,Rare,A78AC,A7800PAL,,,de2ebafcf0e37aaa9d0e9525a7f4dd62,http://www.atariage.com/manual_thumbs.html?SoftwareID=2167 -Double Dragon,Activision,Dan Kitchen,,1989,,,A16K,A2600PAL,,,3624e5568368929fabb55d7f9df1022e, -Double Dragon,Activision,Dan Kitchen,,1989,AK-050-04,Rare,A16K,A2600PAL,,,47464694e9cce07fdbfd096605bf39d4, -Double Dragon,Activision,Dan Kitchen,,1989,AM-050,Rare,A78AC,A7800NTSC,,,543484c00ba233736bcaba2da20eeea9,http://www.atariage.com/manual_thumbs.html?SoftwareID=2167 -Double Dragon,CCE,Dan Kitchen,,,,,A16K,A2600NTSC,,,4999b45be0ab5a85bac1b7c0e551542b, -Double Dunk,Atari,,,1989,CX26159,Rare,,A2600NTSC,,,368d88a6c071caba60b4f778615aae94, -Double Dunk,Atari,,,1989,CX26159,Rare,,A2600PAL,,,cfc226d04d7490b69e155abd7741e98c, -Dragon Defender,,,,,TP-605,Extremely Rare,,A2600NTSC,,,6a882fb1413912d2ce5cf5fa62cf3875, -Dragon Defender,,Thomas Jentzsch,Hack,,,,,A2600NTSC,,,24d9a55d8f0633e886a1b33ee1e0e797, -Dragonfire,Imagic,Bob Smith,,1982,IA3611,Common,,A2600NTSC,,,41810dd94bd0de1110bedc5092bef5b0,http://www.atariage.com/manual_html_page.html?SoftwareID=995 -Dragonfire,Imagic,Bob Smith,,1982,IA3611,Common,,A2600PAL,,,1267e3c6ca951ff1df6f222c8f813d97,http://www.atariage.com/manual_html_page.html?SoftwareID=995 -Dragonfire,Imagic,Bob Smith,,1982,IA3611,Common,,A2600PAL,,,6fc394dbf21cf541a60e3b3631b817f1,http://www.atariage.com/manual_html_page.html?SoftwareID=995 -Dragster,Activision,David Crane,,1980,AG-001,Uncommon,,A2600NTSC,,,63a6eda1da30446569ac76211d0f861c,http://www.atariage.com/manual_thumbs.html?SoftwareID=997 -Dragster,Activision,David Crane,,1980,AG-001,Uncommon,,A2600NTSC,,,77057d9d14b99e465ea9e29783af0ae3,http://www.atariage.com/manual_thumbs.html?SoftwareID=997 -Dragster,Activision,David Crane,,1980,AG-001,Uncommon,,A2600NTSC,,,d763e3a9cdcdd56c715ec826106fab6a,http://www.atariage.com/manual_thumbs.html?SoftwareID=997 -Dragster,Activision,David Crane,,1980,AG-001,Uncommon,,A2600PAL,,,0c54811cf3b1f1573c9164d5f19eca65,http://www.atariage.com/manual_thumbs.html?SoftwareID=997 -Droid Demo 2,,,,,,,,A2600NTSC,,,2bc6c53b19e0097a242f22375a6a60ff, -Droid Demo 2-M,,,,,,,,A2600NTSC,,,37f42ab50018497114f6b0f4f01aa9a1, -Droid Demo 22,,,,,,,,A2600NTSC,,,bff8f8f53a8aeb1ee804004ccbb08313, -Dschungle Boy (a.k.a. Tom Boy),Starsoft,,,,,Extremely Rare,,A2600PAL,,,de61a0b171e909a5a4cfcf81d146dbcb, -Duck Shoot (Kampf um die Schatzinsel),Starsoft,,,,,,,A2600PAL,,,1bb91bae919ddbd655fa25c54ea6f532, -Dukes of Hazzard V2,Atari,,Prototype,,,,,A2600NTSC,Paddles,Paddles,34ca2fcbc8ba4a0b544acd94991cfb50, -Dukes of Hazzard,Atari,,Prototype,,CX2678,,,A2600NTSC,,,51de328e79d919d7234cf19c1cd77fbc, -Dumbo's Flying Circus,Atari,,Prototype,,CX2678,,,A2600PAL,,,1f773a94d919b2a3c647172bbb97f6b4, -E.T. The Extra-Terrestrial (Pits Hack),,Scott Stilphen,Hack,,,,A8K,A2600NTSC,,,efa1098c7d091b940c2543abe372f036,http://www.atariage.com/manual_html_page.html?SoftwareID=998 -E.T. The Extra-Terrestrial Fixed,,David Richardson,Hack,2013,,,A8K,A2600NTSC,,,b50ae55aac93fbed258bc5a873edd2cb,http://www.atariage.com/manual_html_page.html?SoftwareID=998 -E.T. The Extra-Terrestrial,Atari,Howard Scott Warshaw,,1982,CX2674,Common,A8K,A2600NTSC,,,615a3bf251a38eb6638cdc7ffbde5480,http://www.atariage.com/manual_html_page.html?SoftwareID=998 -E.T. The Extra-Terrestrial,Atari,Howard Scott Warshaw,,1982,CX2674,Common,A8K,A2600PAL,,,8febdd9142960d084ab6eeb1d3e88969,http://www.atariage.com/manual_html_page.html?SoftwareID=998 -E.T. The Extra-Terrestrial,CCE, ,,,,,A8K,A2600NTSC,,,c82ec00335cbb4b74494aecf31608fa1,http://www.atariage.com/manual_html_page.html?SoftwareID=998 -E.T. The Extra-Testical,,Christian Samuel,Hack,,,,A8K,A2600NTSC,,,13abc32f803165c458bb086fa57195fb,http://www.atariage.com/manual_html_page.html?SoftwareID=998 -Earth Attack,Zellers,,,,,,,A2600NTSC,,,6982854657a2cc87d712f718e402bf85, -Earth Dies Screaming,20th Century Fox,,,1983,11020,Rare,,A2600NTSC,,,033e21521e0bf4e54e8816873943406d, -Earth Dies Screaming,20th Century Fox,,,1983,11020,Rare,,A2600PAL,,,2c0dc885d5ede94aa664bf3081add34e, -Eckhard Stolberg's Scrolling Text Demo 2,,Eckhard Stolberg,Homebrew,,,,,A2600NTSC,,,f8bfd99163d2c4ec688357786e6fba28, -Eckhard Stolberg's Scrolling Text Demo 3,,Eckhard Stolberg,Homebrew,,,,,A2600NTSC,,,32e65d1e4dfcbcd9b57fee72cafe074c, -Eckhard Stolberg's Scrolling Text Demo 4,,Eckhard Stolberg,Homebrew,,,,,A2600NTSC,,,3b5751a8d20f7de41eb069f76fecd5d7, -Eckhard Stolberg's Scrolling Text Demo,,Eckhard Stolberg,Homebrew,,,,,A2600NTSC,,,9cbb07f1993a027bc2f87d5205457ec9, -Ed Invaders,,,Hack,,,,,A2600NTSC,,,3e6dab92009d6034618cb6b7844c5216, -Eddy Langfinger - der Museumsdieb,Starsoft,,,,,,,A2600PAL,,,07973be3ecfd55235bf59aa56bdef28c, -Edtris,Ed Federmeyer,,,1994,,Extremely Rare,,A2600NTSC,,,c6d48c6ae6461e0e82753540a985ac9e, -Edtris,Ed Federmeyer,,,1995,,Extremely Rare,,A2600NTSC,,,683dc64ef7316c13ba04ee4398e2b93a, -Egghead,Barry Laws Jr.,,Hack,,,,,A2600NTSC,,,a00ee0aed5c8979add4c170f5322c706, -Eggomania,US Games,,,1982,VC 2003,Rare,,A2600NTSC,Paddles,Paddles,42b2c3b4545f1499a083cfbc4a3b7640, -Eishockey-Fieber,Starsoft,,,,,,,A2600PAL,,,a3f2a0fcf74bbc5fa763b0ee979b05b1, -Elevator Action,Atari,,Prototype,,,,A8KR,A2600NTSC,,,71f8bacfbdca019113f3f0801849057e, -Eli's Ladder,Simage,,,,,Unbelievably Rare,,A2600NTSC,,,b6812eaf87127f043e78f91f2028f9f4, -Elk Attack,,,Homebrew,,,,A8K,A2600NTSC,,,7eafc9827e8d5b1336905939e097aae7, -Encounter at L5,Data Age,,,1982,DA 1001,Uncommon,,A2600NTSC,Paddles,Paddles,dbc8829ef6f12db8f463e30f60af209f, -Enduro (Brazil),Digivision,Larry Miller,,,,,,A2600PAL,,,5df559a36347d8572f9a6e8075a31322,http://www.atariage.com/manual_thumbs.html?SoftwareID=1004 -Enduro,Activision,Larry Miller,,1983,AX-026,Uncommon,,A2600NTSC,,,4279485e922b34f127a88904b31ce9fa,http://www.atariage.com/manual_thumbs.html?SoftwareID=1004 -Enduro,Activision,Larry Miller,,1983,AX-026,Uncommon,,A2600NTSC,,,94b92a882f6dbaa6993a46e2dcc58402,http://www.atariage.com/manual_thumbs.html?SoftwareID=1004 -Enduro,Activision,Larry Miller,,1983,AX-026,Uncommon,,A2600NTSC,,,cfe62ed7125ff9fae99b4c8a367c0399,http://www.atariage.com/manual_thumbs.html?SoftwareID=1004 -Enduro,Activision,Larry Miller,,1983,AX-026,Uncommon,,A2600PAL,,,61719a8bdafbd8dab3ca9ce7b171b9e2,http://www.atariage.com/manual_thumbs.html?SoftwareID=1004 -Enduro,Activision,Larry Miller,,1983,AX-026,Uncommon,,A2600PAL,,,6a82b8ecc663f371b19076d99f46c598,http://www.atariage.com/manual_thumbs.html?SoftwareID=1004 -Enduro,CCE,Larry Miller,,,,,,A2600NTSC,,,de62f8a30298e2325249fe112ecb5c10,http://www.atariage.com/manual_thumbs.html?SoftwareID=1004 -Enduro,Digivision,Larry Miller,,,,,,A2600PAL,,,d2f713c78a9ebba9da6d10aeefc6f20f,http://www.atariage.com/manual_thumbs.html?SoftwareID=1004 -Entombed,US Games,,,1982,VC 2007/VC 1007,Rare,,A2600NTSC,,,6b683be69f92958abe0e2a9945157ad5, -Escape Demo,,,,,,,,A2600NTSC,,,8538c5e3ee83267774480649f83fa8d6, -Espial,,,,1983,,,,A2600NTSC,,,f344ac1279152157d63e64aa39479599, -Espial,Tigervision,,,1983,7-012,Extremely Rare,TV8K,A2600NTSC,,,7e0dc330a32398f980637f9ded8f3ac4, -Espial,Tigervision,,,1983,7-012,Extremely Rare,TV8K,A2600PAL,,,f7a138eed69665b5cd1bfa796a550b01, -Euchre (Aug 31 2002 alpha),,Erik Eid,Homebrew,,,,,A2600NTSC,,,29949f893ef6cb9e8ecb368b9e99eee4, -Euchre (Aug 31 2002 alpha),,Erik Eid,Homebrew,,,,,A2600PAL,,,407a0c6cc0ff777f67b669440d68a242, -Euchre (July 15 2002 pre-release),,Erik Eid,Homebrew,,,,,A2600NTSC,,,15bf2ef7583bfcbbba630847a1dc5539, -Euchre (Sep 28 2002 release candidate),,Erik Eid,Homebrew,,,,,A2600NTSC,,,4690fdb70c86604bb35da26696818667, -Euchre (Sep 28 2002 release candidate),,Erik Eid,Homebrew,,,,,A2600PAL,,,bffe34516aaa3cbf5d307eab382a7e95, -Euchre (Sep 8 2002 beta),,Erik Eid,Homebrew,,,,,A2600NTSC,,,ffb1cd548563158ce33f9d10268187e7, -Euchre (Sep 8 2002 beta),,Erik Eid,Homebrew,,,,,A2600PAL,,,877a5397f3f205bf6750398c98f33de1, -Euchre,,Erik Eid,Homebrew,,,,,A2600NTSC,,,6205855cc848d1f6c4551391b9bfa279, -Euchre,,Erik Eid,Homebrew,,,,,A2600PAL,,,199985cae1c0123ab1aef921daace8be, -Excalibur 39,,,,,,,,A2600NTSC,,,34303a7d4c9ad4500ca7f2ede9709595, -Excalibur Demo,,,,,,,,A2600NTSC,,,bfb7850e3ca39f417f8e4bd5ae39f24b, -Exocet (a.k.a. Space Eagle),Panda,,,,109,Rare,,A2600NTSC,,,6362396c8344eec3e86731a700b13abf, -Exocet (a.k.a. Space Eagle),Sancho-Goliath,,,,,,,A2600PAL,,,7ac4f4fb425db38288fa07fb8ff4b21d, -Exorcise,,,Hack,,,,,A2600NTSC,,,295f3679bdf91ca5e37da3f787b29997, -F-18 Hornet,Absolute,John Van Ryzin,,1988,AP-044,Scarce,A78AB,A7800NTSC,,,2251a6a0f3aec84cc0aff66fc9fa91e8,http://www.atariage.com/manual_thumbs.html?SoftwareID=2129 -F-18 Hornet,Absolute,John Van Ryzin,,1988,AP-044,Scarce,A78AB,A7800PAL,,,e7709da8e49d3767301947a0a0b9d2e6,http://www.atariage.com/manual_thumbs.html?SoftwareID=2129 -Face Invaders 2,,Barry Laws Jr.,Hack,,,,,A2600NTSC,,,7926083ad423ed685de3b3a04a914315, -Face Invaders Deluxe,,Barry Laws Jr.,Hack,,,,,A2600NTSC,,,0af51ceb4aecc7a8fc89781ac44a1973, -FailSafe,,Bob DeCrescenzo,Homebrew,2009,,,A7848,A7800NTSC,,,6287727ab36391a62f728bbdee88675c, -FailSafe,,Bob DeCrescenzo,Homebrew,2009,,,A7848,A7800NTSC,,,d2bb22f704f1610a4c396c51f5188e15, -Fantastic Voyage,20th Century Fox,,,1982,11008,Rare,,A2600NTSC,,,b80d50ecee73919a507498d0a4d922ae, -Farmyard Fun,,,,,TP-617,Extremely Rare,,A2600NTSC,,,f7e07080ed8396b68f2e5788a5c245e2, -Fast Eddie,,,,,,,,A2600PAL,,,67631ea5cfe44066a1e76ddcb6bcb512, -Fast Eddie,20th Century Fox,,,1982,11003,Uncommon,,A2600NTSC,,,9de0d45731f90a0a922ab09228510393, -Fast Eddie,20th Century Fox,,,1983,,,,A2600NTSC,,,cb8bf5a0df683cbf6ce50d614b12dd20, -Fast Eddie,CCE,,,,,,,A2600NTSC,,,a97733b0852ee3096300102cb0689175, -Fast Food (Brazil),Zirok,,,,,,,A2600NTSC,,,6b7e1c11448c4d3f28160d2de884ebc8, -Fast Food,Telesys,,,1982,1003,Rare,,A2600NTSC,,,665b8f8ead0eef220ed53886fbd61ec9, -Fat Albert,,David Marli,Hack,,,,,A2600NTSC,,,63e783994df824caf289b69a084cbf3e, -Fatal Run,Atari,,,1989,CX7854,Rare,A78SG,A7800NTSC,,,d25d5d19188e9f149977c49eb0367cd1,http://www.atariage.com/manual_thumbs.html?SoftwareID=2168 -Fatal Run,Atari,,,1989,CX7854,Rare,A78SG,A7800PAL,,,23505651ac2e47f3637152066c3aa62f,http://www.atariage.com/manual_thumbs.html?SoftwareID=2168 -Fatal Run,Atari,,,1990,CX26162,Unbelievably Rare,A32KR,A2600PAL,,,074ec425ec20579e64a7ded592155d48, -Fatal Run,Atari,Thomas Jentzsch,Hack,,,,A32KR,A2600NTSC,,,ef263d40a23483ab339cac44d9515a56, -Fathom,Imagic,Rob Fulop,,1983,O3205,Rare,,A2600NTSC,,,0b55399cf640a2a00ba72dd155a0c140, -Fathom,Imagic,Rob Fulop,,1983,O3205,Rare,,A2600NTSC,,,b442887aec0b4a725996d53f34787b14, -Fathom,Imagic,Rob Fulop,,1983,O3205,Rare,,A2600PAL,,,47cd61f83457a0890de381e478f5cf5f, -Felix Return,Goliath,,,,,,,A2600PAL,,,ce243747bf34a2de366f846b3f4ca772, -Festival,,,,,,,,A2600PAL,,,540075f657d4b244a1f74da1b9e4bf92, -Feuerwehr im Einsatz,Starsoft,,,,,,,A2600PAL,,,8e737a88a566cc94bd50174c2d019593, -Fight Night,Atari,,,1987,CX7851,Scarce,A78SG,A7800PAL,,,e80f24e953563e6b61556737d67d3836,http://www.atariage.com/manual_thumbs.html?SoftwareID=2130 -Fight Night,Atari,,,1988,CX7851,Scarce,A78SG,A7800NTSC,,,07dbbfe612a0a28e283c01545e59f25e,http://www.atariage.com/manual_thumbs.html?SoftwareID=2130 -Final Approach,Apollo,,,1982,AP 2009,Rare,,A2600NTSC,,,211fbbdbbca1102dc5b43dc8157c09b3, -Fire Bird,Video Game Program,,,,,,,A2600PAL,,,51e390424f20e468d2b480030ce95d7b, -Fire Birds (a.k.a. Scorpion),ITT Family Games,,,,554-33383,Extremely Rare,,A2600PAL,,,01e60a109a6a67c70d3c0528381d0187, -Fire Fighter,Imagic,Brad Stewart,,1982,IA3400,Rare,,A2600NTSC,,,d09f1830fb316515b90694c45728d702, -Fire Fighter,Imagic,Brad Stewart,,1982,IA3400,Rare,,A2600PAL,,,90d77e966793754ab4312c47b42900b1, -Fire Fly,Mythicon,,,1983,MA-1002,Uncommon,,A2600NTSC,,,20dca534b997bf607d658e77fbb3c0ee, -Fire Spinner,,,,,,,,A2600NTSC,,,d3171407c3a8bb401a3a62eb578f48fb, -Fire Spinner,,,,,,,,A2600PAL,,,98555b95cb38e0e0b22b482b2b60a5b6, -Fisher Price,CCE,,,,,,,A2600PAL,,,3fe43915e5655cf69485364e9f464097, -Fishing Derby (32-in-1),Atari,David Crane,,,,,,A2600PAL,,,7628d3cadeee0fd2e41e68b3b8fbe229,http://www.atariage.com/manual_thumbs.html?SoftwareID=1021 -Fishing Derby,Activision,David Crane,,1980,,,,A2600PAL,,,1d2a28eb8c95da0d6d6b18294211839f,http://www.atariage.com/manual_thumbs.html?SoftwareID=1021 -Fishing Derby,Activision,David Crane,,1980,,,,A2600PAL,,,458883f1d952cd772cf0057abca57497,http://www.atariage.com/manual_thumbs.html?SoftwareID=1021 -Fishing Derby,Activision,David Crane,,1980,AG-004,Uncommon,,A2600NTSC,,,3c82e808fe0e6a006dc0c4e714d36209,http://www.atariage.com/manual_thumbs.html?SoftwareID=1021 -Fishing Derby,Activision,David Crane,,1980,AG-004,Uncommon,,A2600NTSC,,,85227160f37aaa29f5e3a6c7a3219f54,http://www.atariage.com/manual_thumbs.html?SoftwareID=1021 -Fishing Derby,Activision,David Crane,,1980,AG-004,Uncommon,,A2600NTSC,,,b8865f05676e64f3bec72b9defdacfa7,http://www.atariage.com/manual_thumbs.html?SoftwareID=1021 -Fishing Derby,Activision,David Crane,,1980,AG-004,Uncommon,,A2600PAL,,,571c6d9bc71cb97617422851f787f8fe,http://www.atariage.com/manual_thumbs.html?SoftwareID=1021 -Fishing Derby,Activision,David Crane,Hack,1980,,,,A2600PAL,,,2517827950fee41a3b9de60275c8aa6a,http://www.atariage.com/manual_thumbs.html?SoftwareID=1021 -Fishing Derby,CCE,David Crane,,,,,,A2600NTSC,,,dea0ade296f7093e71185e802b500db8,http://www.atariage.com/manual_thumbs.html?SoftwareID=1021 -Flag Capture (32-in-1),Atari,Jim Huether,,,,,,A2600PAL,,,f5445b52999e229e3789c39e7ee99947,http://www.atariage.com/manual_thumbs.html?SoftwareID=1022 -Flag Capture,Atari,Jim Huether,,1978,CX2644,Uncommon,,A2600NTSC,,,30512e0e83903fc05541d2f6a6a62654,http://www.atariage.com/manual_thumbs.html?SoftwareID=1022 -Flag Capture,Atari,Jim Huether,,1978,CX2644,Uncommon,,A2600NTSC,,,4b143d7dcf6c96796c37090cba045f4f,http://www.atariage.com/manual_thumbs.html?SoftwareID=1022 -Flash Gordon,20th Century Fox,,,1983,11015,Rare,,A2600PAL,,,4ae8c76cd6f24a2e181ae874d4d2aa3d, -Flash Gordon/Space Adventure,20th Century Fox/Zellers,,,1983,11015,Rare,,A2600NTSC,,,8786c1e56ef221d946c64f6b65b697e9, -Flippern,Starsoft,,,,,,,A2600PAL,,,5a2f2dcd775207536d9299e768bcd2df, -Food Fight,Atari,,,1987,CX7804,Common,,A7800NTSC,,,cf76b00244105b8e03cdc37677ec1073,http://www.atariage.com/manual_thumbs.html?SoftwareID=2131 -Food Fight,Atari,,,1987,CX7804,Common,,A7800PAL,,,de0d4f5a9bf1c1bddee3ed2f7ec51209,http://www.atariage.com/manual_thumbs.html?SoftwareID=2131 -Football (32-in-1),Atari,Bob Whitehead,,,,,,A2600PAL,,,7608abdfd9b26f4a0ecec18b232bea54,http://www.atariage.com/manual_thumbs.html?SoftwareID=1024 -Football (a.k.a. Fussball),Ariola,,,,MT5687,Uncommon,,A2600PAL,,,cd568d6acb2f14477ebf7e59fb382292,http://www.atariage.com/manual_thumbs.html?SoftwareID=1024 -Football,Atari,Bob Whitehead,,1978,CX2625,Common,,A2600NTSC,,,d86deb100c6abed1588aa84b2f7b3a98,http://www.atariage.com/manual_thumbs.html?SoftwareID=1024 -Football,Atari,Bob Whitehead,,1978,CX2625,Common,,A2600NTSC,,,e549f1178e038fa88dc6d657dc441146,http://www.atariage.com/manual_thumbs.html?SoftwareID=1024 -Forest,Sancho,,,,,Extremely Rare,,A2600PAL,,,213e5e82ecb42af237cfed8612c128ac, -Fox & Goat,Starsoft,,,,,,,A2600PAL,,,76ee917d817ef9a654bc4783e0273ac4, -Fox & Goat,Starsoft,,,,,,,A2600PAL,,,9ed0f2aa226c34d4f55f661442e8f22a, -Frame Timed Sound Effects,,Eckhard Stolberg,,,,New Release,,A2600NTSC,,,8290daea8391f96d7c8e1482e184d19c, -Frame Timed Sound Effects-EM,,Eckhard Stolberg,,,,New Release,,A2600NTSC,,,442b7863683e5f084716fda050474feb, -Frankenstein's Monster,Data Age,,,1982,112-008,Rare,,A2600NTSC,,,15dd21c2608e0d7d9f54c0d3f08cca1f, -Freeway (32-in-1),Atari,David Crane,,,,,,A2600PAL,,,914a8feaf6d0a1bbed9eb61d33817679,http://www.atariage.com/manual_thumbs.html?SoftwareID=1031 -Freeway (a.k.a. Rabbits),,,,,,,,A2600PAL,,,481d20ec22e7a63e818d5ef9679d548b,http://www.atariage.com/manual_thumbs.html?SoftwareID=1031 -Freeway,Activision,David Crane,,1981,AG-009,Uncommon,,A2600NTSC,,,69974dd5d6420b90898cde50aec5ef39,http://www.atariage.com/manual_thumbs.html?SoftwareID=1031 -Freeway,Activision,David Crane,,1981,AG-009,Uncommon,,A2600NTSC,,,851cc1f3c64eaedd10361ea26345acea,http://www.atariage.com/manual_thumbs.html?SoftwareID=1031 -Freeway,Activision,David Crane,,1981,AG-009,Uncommon,,A2600NTSC,,,8e0ab801b1705a740b476b7f588c6d16,http://www.atariage.com/manual_thumbs.html?SoftwareID=1031 -Freeway,Activision,David Crane,,1981,AG-009,Uncommon,,A2600PAL,,,2ec6b045cfd7bc52d9cdfd1b1447d1e5,http://www.atariage.com/manual_thumbs.html?SoftwareID=1031 -Freeway,CCE,David Crane,,,AG-009,Uncommon,,A2600NTSC,,,eddef10fdc0029301064115ae0cd41d4,http://www.atariage.com/manual_thumbs.html?SoftwareID=1031 -Freeway,Dactar,David Crane,,,,,,A2600PAL,,,7d5c3b7b908752b98e30690e2a3322c2,http://www.atariage.com/manual_thumbs.html?SoftwareID=1031 -Frog Pond,Atari,,Prototype,,CX2665,,,A2600NTSC,,,5f73e7175474c1c22fb8030c3158e9b3, -Frogger Demo,,Matthias Luedtke & Manuel Polik,Homebrew Hack,2005,,,,A7800NTSC,,,45136d1d9eddf0bebad32995647b3298, -Frogger II - Threedeep!,Parker Bros,,,1983,PB5590,Extremely Rare,PB8K,A2600NTSC,,,27c6a2ca16ad7d814626ceea62fa8fb4, -Frogger,Parker Bros,,,1983,PB5300,Common,,A2600NTSC,,,081e2c114c9c20b61acf25fc95c71bf4,http://www.atariage.com/manual_html_page.html?SoftwareID=1033 -Frogger,Parker Bros,,,1983,PB5300,Common,,A2600PAL,,,02ced7ea2b7cb509748db6bfa227ebec,http://www.atariage.com/manual_html_page.html?SoftwareID=1033 -Frogs and Flies,Mattel,,,1982,MT5664,Uncommon,,A2600NTSC,,,dcc2956c7a39fdbf1e861fc5c595da0d, -Frogs and Flies,Mattel,,,1982,MT5664,Uncommon,,A2600PAL,,,1b8c3c0bfb815b2a1010bba95998b66e, -Frontline,Coleco,,,,2665,Rare,,A2600NTSC,,,e556e07cc06c803f2955986f53ef63ed, -Frostbite (Brazil),Digitel,,,,,,,A2600PAL,,,f4469178cd8998cb437fa110a228eaca, -Frostbite,,,,,AX-031,Rare,,A2600PAL,,,70ce036e59be92821c4c7fd735ec6f68, -Frostbite,Activision,Steve Miller,,,AX-031,Rare,,A2600PAL,,,6a9b30ca46b0dba9e719f4cbd340e01c, -Frostbite,Activision,Steve Miller,,,AX-031,Rare,,A2600PAL,,,6b71f20c857574b732e7a8e840bd3cb2, -Frostbite,Activision,Steve Miller,,1983,AX-031,Rare,,A2600NTSC,,,4ca73eb959299471788f0b685c3ba0b5, -Frostbite,Activision,Steve Miller,,1983,AX-031,Rare,,A2600PAL,,,5a93265095146458df2baf2162014889, -Frostbite,CCE,Steve Miller,,,,,,A2600NTSC,,,c6ae21caceaad734987cb24243793bd5, -Frostbite,Digivision,,,,,,,A2600PAL,,,adb79f9ac1a633cdd44954e2eac14774, -Fuchs & Schweinchen Schlau,Starsoft,,,,,,,A2600PAL,,,0de53160a8b54c3aa5aed8d68c970b62, -Fun With Numbers,Atari,,,,CX2661,Uncommon,,A2600NTSC,,,819aeeb9a2e11deb54e6de334f843894, -Fun with Numbers (32-in-1),Atari,,,,,,,A2600PAL,,,d816fea559b47f9a672604df06f9d2e3, -Fun with Numbers,Atari,,,,CX2661,Uncommon,,A2600PAL,,,5f46d1ff6d7cdeb4b09c39d04dfd50a1, -G.I. Joe - Cobra Strike,Parker Bros,,,1983,PB5920,Uncommon,,A2600NTSC,Paddles,Paddles,c1fdd44efda916414be3527a47752c75, -GREGXM Demo,,,,,,,,A2600NTSC,,,a3b9d2be822eab07e7f4b10593fb5eaa, -Galactic (G),Funvision,,,,,,,A2600PAL,,,13a991bc9c2ff03753aeb322d3e3e2e5, -Galactic (G),Funvision,,,,,,,A2600PAL,,,b49331b237c8f11d5f36fe2054a7b92b, -Galaga (River Raid clone),,,,,,,,A2600PAL,,,01b09872dcd9556427761f0ed64aa42a, -Galaga,Atari,,,1987,CX7805,Common,,A7800NTSC,,,fb8d803b328b2e442548f7799cfa9a4a,http://www.atariage.com/manual_thumbs.html?SoftwareID=2132 -Galaga,Atari,,,1987,CX7805,Common,,A7800PAL,,,f5dc7dc8e38072d3d65bd90a660148ce,http://www.atariage.com/manual_thumbs.html?SoftwareID=2132 -Galaxian (Enhanced Graphics),,Jess Ragan,Hack,,,,A8K,A2600NTSC,,,579baa6a4aa44f035d245908ea7a044d, -Galaxian,Atari,,,,CX2684,Uncommon,A8K,A2600NTSC,,,211774f4c5739042618be8ff67351177, -Galaxian,Atari,,,,CX2684,Uncommon,A8K,A2600PAL,,,13a37cf8170a3a34ce311b89bde82032, -Galaxian,CCE,,,,,,A8K,A2600NTSC,,,d65028524761ef52fbbdebab46f79d0f, -Game of Concentration,,,,,CX2642,Uncommon,,A2600NTSC,Keypad,Keypad,102672bbd7e25cd79f4384dd7214c32b, -Game of Concentration,,,,,CX2642,Uncommon,,A2600NTSC,Keypad,Keypad,31f4692ee2ca07a7ce1f7a6a1dab4ac9, -Gangster Alley,Spectravideo,,,1983,SA-201,Rare,,A2600PAL,,,47aad247cce2534fd70c412cb483c7e0, -Gangster Alley,Spectravideo,,,1983,SA-201,Rare,,A2600PAL,,,bae66907c3200bc63592efe5a9a69dbb, -Gangster Alley,Spectravision,,,1982,SA-201,Rare,,A2600NTSC,,,20edcc3aa6c189259fa7e2f044a99c49, -Gangster,Ariola,,,,,,,A2600PAL,,,a7523db9a33e9417637be0e71fa4377c, -Garfield,,,Prototype,,CX26132,,A16K,A2600NTSC,,,dc13df8420ec69841a7c51e41b9fbba5, -Gas Hog (a.k.a. Marspatrouille),Spectravideo,,,1983,SA-217,Extremely Rare,,A2600PAL,,,b1486e12de717013376447ac6f7f3a80, -Gas Hog,Spectravideo,,,1983,SA-217,Extremely Rare,,A2600NTSC,,,728152f5ae6fdd0d3a9b88709bee6c7a, -Gato,Atari,,Prototype,,,,,A7800NTSC,,,06204dadc975be5e5e37e7cc66f984cf, -Gauntlet,,,,,ASC1002,Unbelievably Rare,,A2600NTSC,,,e64a8008812327853877a37befeb6465, -Gefaehrliche Maeusejagt,Starsoft,,,,,,,A2600PAL,,,f802fa61011dd9eb6f80b271bac479d0, -Gefecht im All,Starsoft,,,,,,,A2600PAL,,,e784a9d26707cfcd170a4c1c60422a72, -General Retreat,Playaround,,,,,,,A2600PAL,,,7e464186ba384069582d9f0c141f7491, -Ghost Manor,Xonox,,,1983,99002,Extremely Rare,,A2600NTSC,,,0eecb5f58f55de9db4eedb3a0f6b74a8, -Ghost Manor,Xonox,,,1983,99002,Extremely Rare,,A2600NTSC,,,2bee7f226d506c217163bad4ab1768c0, -Ghost Manor,Xonox,,,1983,99002,Extremely Rare,,A2600PAL,,,40d8ed6a5106245aa79f05642a961485, -Ghostbusters II (Version 2),,,,,,,,A2600NTSC,,,643e6451eb6b8ab793eb60ba9c02e000, -Ghostbusters II,Salu,,,1992,,Extremely Rare,,A2600PAL,,,c2b5c50ccb59816867036d7cf730bf75, -Ghostbusters II,Salu,Thomas Jentzsch,Hack,,,,,A2600NTSC,,,718ee85ea7ec27d5bea60d11f6d40030, -Ghostbusters,Activision,David Crane & Dan Kitchen,,,AZ-108-04,Rare,,A2600NTSC,,,e314b42761cd13c03def744b4afc7b1b,http://www.atariage.com/manual_thumbs.html?SoftwareLabelID=209 -Ghostbusters,Activision,David Crane & Dan Kitchen,,,AZ-108-04,Rare,,A2600PAL,,,f7d6592dcb773c81c278140ed4d01669,http://www.atariage.com/manual_thumbs.html?SoftwareLabelID=209 -Gigolo,Mystique,,,,1009,Extremely Rare,,A2600NTSC,,,1c8c42d1aee5010b30e7f1992d69216e, -Glacier Patrol,,,,,5667 A106,Rare,,A2600NTSC,,,5e0c37f534ab5ccc4661768e2ddf0162, -Glib (Selchow Righter),Selchow,,,,87,Unbelievably Rare,,A2600NTSC,,,2d9e5d8d083b6367eda880e80dfdfaeb, -Glorb,,,Hack,,,,,A2600NTSC,,,72db1194b1cc7d45b242f25eb1c148d3, -Golf (32-in-1),Atari,,,,,,,A2600PAL,,,95351b46fa9c45471d852d28b9b4e00b, -Golf,Atari,,,1978,CX2634,Common,,A2600NTSC,,,2e663eaa0d6b723b645e643750b942fd, -Golf,Atari,,,1978,CX2634,Common,,A2600NTSC,,,f542b5d0193a3959b54f3c4c803ba242, -Golf,Atari,,,1978,CX2634,Common,,A2600PAL,,,9d522a3759aa855668e75962c84546f7, -Gopher,Carrere Video,,,1982,,,,A2600PAL,,,a56b642a3d3ab9bbeee63cd44eb73216, -Gopher,US Games,,,1982,,,,A2600PAL,,,06db908011065e5ebb37f4e253c2a0b0, -Gopher,US Games,,,1982,VC 2001,Rare,,A2600NTSC,,,c16c79aad6272baffb8aae9a7fff0864, -Gorf,CBS Electronics,,,,M8793,Uncommon,,A2600NTSC,,,81b3bf17cf01039d311b4cd738ae608e, -Gorf,CBS Electronics,,,,M8793,Uncommon,,A2600PAL,,,3e03086da53ecc29d855d8edf10962cb, -Gorilla Kong,,,Hack,,,,,A2600NTSC,,,98ba601a60172cb46c5bf9a962fd5b1f, -Grand Prix,Activision,David Crane,,1982,AX-014,Uncommon,,A2600NTSC,,,2903896d88a341511586d69fcfc20f7d,http://www.atariage.com/manual_thumbs.html?SoftwareID=1062 -Grand Prix,Activision,David Crane,,1982,AX-014,Uncommon,,A2600PAL,,,757f529026696e13838364dea382a4ed,http://www.atariage.com/manual_thumbs.html?SoftwareID=1062 -Grand Prix,Activision,David Crane,,1982,AX-014,Uncommon,A4K,A2600NTSC,,,de4436eaa41e5d7b7609512632b90078,http://www.atariage.com/manual_thumbs.html?SoftwareID=1062 -Grand Prix,CCE,David Crane,,,,,,A2600NTSC,,,41c4e3d45a06df9d21b7aae6ae7e9912,http://www.atariage.com/manual_thumbs.html?SoftwareID=1062 -Gravitar,,,,,CX2685,Uncommon,A8K,A2600NTSC,,,8ac18076d01a6b63acf6e2cab4968940, -Gravitar,Atari,,,,CX2685,Uncommon,A8K,A2600NTSC,,,7146dd477e019f81eac654a79be96cb5, -Gravitar,CCE,,,,,,A8K,A2600NTSC,,,a81697b0c8bbc338ae4d0046ede0646b, -Great Escape,Bomb,,,,CA282,Extremely Rare,,A2600NTSC,,,18f299edb5ba709a64c80c8c9cec24f2, -Green Bar Text Demo,,,,,,,,A2600NTSC,,,ed014beeeb77dbb2bbcf9b5f6850b2f4, -Green and Yellow Number 1 Demo 2,,,,,,,,A2600NTSC,,,b41fdd4a522e1d5a2721840028684ac2, -Green and Yellow Number 1 Demo,,,,,,,,A2600NTSC,,,abc64037ca5d5b04ae8a7eedbca3ed74, -Gremlins,Atari,,,1984,CX26127,Extremely Rare,,A2600NTSC,,,01cb3e8dfab7203a9c62ba3b94b4e59f, -Grid Demo,,,,,,,,A2600NTSC,,,9962034ea7b3d4a905d0991804670087, -Grid and Purple Dot Demo,,,,,,,,A2600NTSC,,,d65900fefa7dc18ac3ad99c213e2fa4e, -Ground Zero,Rainbow Vision,,,,,,,A2600PAL,,,eb46e99ec15858f8cd8c91cef384ce09, -Grover's Music Maker,Atari,,Prototype,,CX26106,,,A2600NTSC,Keypad,Keypad,4ac9f40ddfcf194bd8732a75b3f2f214, -Guardian,Apollo,,,1982,AP 2008,Rare,,A2600NTSC,Paddles,Paddles,7ab2f190d4e59e8742e76a6e870b567e, -Gunfight (0.01),Hozer Video Games,,Homebrew,,,,,A2600NTSC,,,14a56b493a8d9d10e94a3e100362e3a2, -Gunfight (0.02),Hozer Video Games,,Homebrew,,,,,A2600NTSC,,,111029770226b319524134193886a10e, -Gunfight (0.03),Hozer Video Games,,Homebrew,,,,,A2600NTSC,,,d17a671029b1532b197defca5f3649a7, -Gunfight (0.04),Hozer Video Games,,Homebrew,,,,,A2600NTSC,,,801ba40f3290fc413e8c816c467c765c, -Gunfight (0.05),Hozer Video Games,,Homebrew,,,,,A2600NTSC,,,c21450c21efb7715746e9fa87ad6f145, -Gunfight (0.06),Hozer Video Games,,Homebrew,,,,,A2600NTSC,,,24759be31e8fe55d2829fd86bdf3181f, -Gunfight (0.07),Hozer Video Games,,Homebrew,,,,,A2600NTSC,,,68c80e7e1d30df98a0cf67ecbf39cc67, -Gunfight (0.07a),Hozer Video Games,,Homebrew,,,,,A2600NTSC,,,a025a8f83a42a4d6d46c4887e799bfac, -Gunfight (0.08),Hozer Video Games,,Homebrew,,,,,A2600NTSC,,,a15b5831a1fab52e4c416068c85ec011, -Gunfight (0.09),Hozer Video Games,,Homebrew,,,,,A2600NTSC,,,9853089672116117258097dbbdb939b7, -Gunfight,,Manuel Polik,Homebrew,,,,,A2600NTSC,,,f750b5d613796963acecab1690f554ae, -Gunfight,,Manuel Polik,Homebrew,,,,,A2600PAL,,,18b28b386abdadb3a700ac8fb68e639a, -Gyruss,Parker Bros,,,1984,PB5080,Rare,PB8K,A2600NTSC,,,2f273c423471d125d32d1d54d58f063a, -Gyruss,Parker Bros,,,1984,PB5080,Rare,PB8K,A2600NTSC,,,b311ab95e85bc0162308390728a7361d, -H.E.R.O.,Activision,John Van Ryzin,,1984,AZ-036-04,Rare,A8K,A2600NTSC,,,c8df076c7e4349ca8dcbdb773bf3c985,http://www.atariage.com/manual_thumbs.html?SoftwareLabelID=228 -H.E.R.O.,Activision,John Van Ryzin,,1984,AZ-036-04,Rare,A8K,A2600NTSC,,,fca4a5be1251927027f2c24774a02160,http://www.atariage.com/manual_thumbs.html?SoftwareLabelID=228 -H.E.R.O.,Activision,John Van Ryzin,,1984,AZ-036-04,Rare,A8K,A2600PAL,,,48bcf2c5a8c80f18b24c55db96845472,http://www.atariage.com/manual_thumbs.html?SoftwareLabelID=228 -H.E.R.O.,Activision,John Van Ryzin,,1984,AZ-036-04,Rare,A8K,A2600PAL,,,66b92ede655b73b402ecd1f4d8cd9c50,http://www.atariage.com/manual_thumbs.html?SoftwareLabelID=228 -H.E.R.O.,Activision,John Van Ryzin,,1984,AZ-036-04,Rare,A8K,A2600PAL,,,d9b49f0678776e04916fa5478685a819,http://www.atariage.com/manual_thumbs.html?SoftwareLabelID=228 -H.E.R.O.,CCE,John Van Ryzin,,,,,A8K,A2600NTSC,,,1d284d6a3f850bafb25635a12b316f3d,http://www.atariage.com/manual_thumbs.html?SoftwareLabelID=228 -Halloween (a.k.a. Sexta Fiera 13),Wizard Video,,,,7,Extremely Rare,,A2600NTSC,,,30516cfbaa1bc3b5335ee53ad811f17a, -Halloween (a.k.a. Sexta Fiera 13),Wizard Video,,,,7,Extremely Rare,,A2600NTSC,,,c450a285daa7a3b65188c2c3cf04fb3e, -Hangman,Atari,Alan Miller,,1978,CX2662,Uncommon,,A2600NTSC,,,f16c709df0a6c52f47ff52b9d95b7d8d,http://www.atariage.com/manual_thumbs.html?SoftwareID=1073 -Harbor Escape,Panda,,,1983,110,Rare,,A2600NTSC,,,b9232c1de494875efe1858fc8390616d, -Hat Trick,Atari,,,1987,CX7829,Common,,A7800PAL,,,0baec96787ce17f390e204de1a136e59,http://www.atariage.com/manual_thumbs.html?SoftwareID=2133 -Hat Trick,Atari,,Prototype,1987,CX7829,,,A7800NTSC,,,fd9e78e201b6baafddfd3e1fbfe6ba31,http://www.atariage.com/manual_thumbs.html?SoftwareID=2133 -Haunted House,Atari,,,,CX2654,Common,,A2600NTSC,,,f0a6e99f5875891246c3dbecbf2d2cea,http://www.atariage.com/manual_html_page.html?SoftwareID=1076 -Haunted House,Atari,,,,CX2654,Common,,A2600PAL,,,09e1ecf9bd2a3030d5670dba7a65e78d,http://www.atariage.com/manual_html_page.html?SoftwareID=1076 -Hell Driver,ITT Family Games,,,,,,,A2600PAL,,,aab840db22075aa0f6a6b83a597f8890, -Hell Driver,ITT Family Games,Thomas Jentzsch,Hack,,,,,A2600NTSC,,,260c787e8925bf3649c8aeae5b97dcc0, -Hili Ball,Starsoft,,,,,,,A2600PAL,,,8fe00172e7fff4c1878dabcf11bb8dce, -Hili Ball,Starsoft,,,,,,,A2600PAL,,,97933c9f20873446e4c1f8a4da21575f, -Hole Hunter,,,,,TP-606,Extremely Rare,,A2600NTSC,,,3d48b8b586a09bdbf49f1a016bf4d29a, -Holey Moley,Atari,,Prototype,,,,,A2600NTSC,Keypad,Keypad,c52d9bbdc5530e1ef8e8ba7be692b01e, -Home Run Baseball (32-in-1),Atari,Bob Whitehead,,,,,,A2600PAL,,,ca7aaebd861a9ef47967d31c5a6c4555, -Home Run Baseball,Atari,Bob Whitehead,,1978,CX2623,Common,,A2600NTSC,,,0bfabf1e98bdb180643f35f2165995d0, -Home Run Baseball,Atari,Bob Whitehead,,1978,CX2623,Common,,A2600NTSC,,,9f901509f0474bf9760e6ebd80e629cd, -Home Run Baseball,Atari,Bob Whitehead,,1978,CX2623,Common,,A2600PAL,,,24b5f4bbdb853eca38ea0cae2dfe73a1, -Home Run Baseball,Atari,Bob Whitehead,,1978,CX2623,Common,,A2600PAL,,,328949872e454181223a80389d03c122, -Horizonal Color Bars Demo 2,,,,,,,,A2600NTSC,,,68449e4aaba677abcd7cde4264e02168, -Horizonal Color Bars Demo,,,,,,,,A2600NTSC,,,6b7a56b6ac2ca4bf9254474bf6ed7d80, -Horizontally Scrolling Playfield Thing,,Rob Kudla,,,,,,A2600NTSC,,,70a8480cfaf08776e5420365732159d2, -Hozer Video Demo,,,Homebrew,,,,,A2600NTSC,,,7dc03a1f56d0e6a8aae3e3e50d654a08, -Human Cannonball (a.k.a. Cannon Man) (32-in-1),Atari,,,,,,,A2600PAL,,,ad42e3ca3144e2159e26be123471bffc, -Human Cannonball (a.k.a. Cannon Man),128-in-1 Junior Console,,,,,,,A2600NTSC,,,c6c63da3bc2e47291f63280e057061d0, -Human Cannonball (a.k.a. Cannon Man),128-in-1 Junior Console,,,,,,,A2600PAL,,,11330eaa5dd2629052fac37cfe1a0b7d, -Human Cannonball (a.k.a. Cannon Man),Atari,,,1978,CX2627,Uncommon,,A2600NTSC,,,7972e5101fa548b952d852db24ad6060, -Human Cannonball (a.k.a. Cannon Man),Atari,,,1978,CX2627,Uncommon,,A2600NTSC,,,ffe51989ba6da2c6ae5a12d277862e16, -Human Cannonball (a.k.a. Cannon Man),Atari,,,1979,,,,A2600PAL,,,10a3cd14e5dcfdde6ff216a14ce7b7dd, -Hunt & Score,Atari,Alan Miller,,,,,,A2600PAL,,,5be03a1fe7b2c114725150be04b38704, -I Want My Mommy (a.k.a. Ursinho Esperto),Zimag,,,,GN-010/710-111,Extremely Rare,,A2600NTSC,,,f6a282374441012b01714e19699fc62a, -I.Q. 180,,,,,,Extremely Rare,,A2600NTSC,,,4b9581c3100a1ef05eac1535d25385aa, -Ice Hockey,,Alan Miller,,,AX-012,Uncommon,,A2600PAL,,,c7d5819b26b480a49eb26aeb63cc831e, -Ice Hockey,Activision,Alan Miller,,1981,AX-012,Uncommon,,A2600NTSC,,,5bcc83677d68f7ef74c1b4a0697ba2a8, -Ice Hockey,Activision,Alan Miller,,1981,AX-012,Uncommon,,A2600NTSC,,,a4c08c4994eb9d24fb78be1793e82e26, -Ice Hockey,Activision,Alan Miller,,1981,AX-012,Uncommon,,A2600PAL,,,ac9adbd6de786a242e19d4bec527982b, -Ice Hockey,CCE,Alan Miller,,,,Uncommon,,A2600NTSC,,,47711c44723da5d67047990157dcb5dd, -Ikari Warriors,Atari,,,1984,CX7862,Rare,A78SG,A7800NTSC,,,c3672482ca93f70eafd9134b936c3feb,http://www.atariage.com/manual_thumbs.html?SoftwareID=2169 -Ikari Warriors,Atari,,,1984,CX7862,Rare,A78SG,A7800PAL,,,8c2c2a1ea6e9a928a44c3151ba5c1ce3,http://www.atariage.com/manual_thumbs.html?SoftwareID=2169 -Ikari Warriors,Atari,,,1990,CX26177,Rare,,A2600PAL,,,9813b9e4b8a6fd919c86a40c6bda8c93, -Ikari Warriors,Atari,Thomas Jentzsch,Hack,,,,,A2600NTSC,,,3f251c50aa7237e61a38ab42315ebed4, -Im Reich der Spinne,Starsoft,,,,,,,A2600PAL,,,709910c2e83361bc4bf8cd0c20c34fbf, -Im Schutz der Drachen,Starsoft,,,,,,,A2600PAL,,,95e542a7467c94b1e4ab24a3ebe907f1, -Imagic Selector,,,,,,,,A2600NTSC,,,c4bc8c2e130d76346ebf8eb544991b46, -Immies & Aggies (Emag),Emag,,,,,,,A2600PAL,,,faffd84f3a8eceee2fa5ea5b0a3e6678, -Immies and Aggies,,,,,C-838,Extremely Rare,,A2600NTSC,,,9b21d8fc78cc4308990d99a4d906ec52, -Impossible Mission Fixed,Atari,,,1987,CX7832,Scarce,A78SGR,A7800NTSC,,,1745feadabb24e7cefc375904c73fa4c,http://www.atariage.com/manual_thumbs.html?SoftwareID=2170 -Impossible Mission,Atari,,,1987,CX7832,Scarce,A78SGR,A7800NTSC,,,baebc9246c087e893dfa489632157180,http://www.atariage.com/manual_thumbs.html?SoftwareID=2170 -Impossible Mission,Atari,,,1987,CX7832,Scarce,A78SGR,A7800PAL,,,80dead01ea2db5045f6f4443faa6fce8,http://www.atariage.com/manual_thumbs.html?SoftwareID=2170 -Incoming!,,Ben Larson,Homebrew,,,,,A2600NTSC,,,20bf2b233c227cbb9fdfebf81dcd5dc3, -Indy 500 (Hack),Atari,,,1978,,Uncommon,,A2600NTSC,Driving,Driving,dac762e4d01d445bdef20b7771f6570e,http://www.atariage.com/manual_thumbs.html?SoftwareID=1087 -Indy 500,Atari,Carla Meninsky,,1978,CX2611,Uncommon,,A2600NTSC,Driving,Driving,08188785e2b8300983529946dbeff4d2,http://www.atariage.com/manual_thumbs.html?SoftwareID=1087 -Indy 500,Atari,Carla Meninsky,,1978,CX2611,Uncommon,,A2600NTSC,Driving,Driving,c5301f549d0722049bb0add6b10d1e09,http://www.atariage.com/manual_thumbs.html?SoftwareID=1087 -Indy 500,Atari,Carla Meninsky,,1978,CX2611,Uncommon,,A2600PAL,Driving,Driving,4f781f0476493c50dc578336f1132a67,http://www.atariage.com/manual_thumbs.html?SoftwareID=1087 -Indy 500,Atari,Carla Meninsky,,1978,CX2611,Uncommon,,A2600PAL,Driving,Driving,81591a221419024060b890665beb0fb8,http://www.atariage.com/manual_thumbs.html?SoftwareID=1087 -Infiltrate,Apollo,,,1982,AP 2006,Uncommon,,A2600NTSC,,,afe88aae81d99e0947c0cfb687b16251, -International Soccer,Mattel,,,,MT5687,Uncommon,,A2600PAL,,,a0185c06297b2818f786d11a3f9e42c3, -International Soccer,Mattel,,,1982,MT5687,Uncommon,,A2600NTSC,,,29630a20d356fb58685b150bfa8f00c3, -International Soccer,Mattel,,,1982,MT5687,Uncommon,,A2600NTSC,,,b4030c38a720dd84b84178b6ce1fc749, -International Soccer,Telegames,,,,,,,A2600PAL,,,ce904c0ae58d36d085cd506989116b0b, -Inv (4-24-97),,,Homebrew,,,,,A2600NTSC,,,cd139ae6d09f3665ad09eb79da3f9e49, -Inv (Alpha 1),,,Homebrew,,,,,A2600NTSC,,,8874b68751fd2ba6d3306a263ae57a7d, -Inv (Alpha 2),,,Homebrew,,,,,A2600NTSC,,,6d475019ea30d0b29f695e9dcfd8f730, -Inv (Beta),,,Homebrew,,,,,A2600NTSC,,,62992392ea651a16aa724a92e4596ed6, -Inv (V2.1) (1-3-98),,,Homebrew,,,,,A2600NTSC,,,4868a81e1b6031ed66ecd60547e6ec85, -Inv 2,,Eric Mooney,Homebrew,,,,,A2600NTSC,,,2016726db38ad6a68b4c48ba6fe51557, -Invader Sprites in a Line Demo,,,,,,,,A2600NTSC,,,e0cf2dcc4c1348c468f5bb1e421c9164, -Invaders From Space,,David Marli,Hack,,,,,A2600NTSC,,,80cec82239913cb8c4016eb13749de44, -Invisible Pac-Man,,,Hack,,,,,A2600NTSC,,,9c729017dd2f9ccbadcb511187f80e6b, -JKH Text Scrolling Demo,,,,,,,,A2600NTSC,,,a5262fe6d01d6a1253692682a47f79dd, -Jam Demo 1,,,,,,,,A2600NTSC,,,98ea10c47c13f1b3306c7b13db304865, -Jam Demo 2,,,,,,,,A2600NTSC,,,60d304582d33e2957b73eb300a7495bb, -James Bond 007,Parker Bros,,,1983,PB5110,Rare,,A2600NTSC,,,b9c3bc1d77f8e9d814735188bf324e40, -James Bond 007,Parker Bros,,,1983,PB5110,Rare,PB8K,A2600NTSC,,,e51030251e440cffaab1ac63438b44ae, -Jammed (0.1),Hozer Video Games,,Homebrew,,,,,A2600NTSC,,,911d385ee0805ff5b8f96c5a63da7de5, -Jammed (0.2),Hozer Video Games,,Homebrew,,,,,A2600NTSC,,,15b498199ed0ed28057bf0dbdce9b8d8, -Jammed (1.0),,Thomas Jentzsch,Homebrew,,,,,A2600NTSC,,,04dfb4acac1d0909e4c360fd2ac04480, -Jammed (Demo Version),,Thomas Jentzsch,Homebrew,,,,,A2600NTSC,,,ef5c02c95a1e7ed24f24193935755cd3, -Jawbreaker,CCE,,,,7-002,Rare,,A2600NTSC,,,58a82e1da64a692fd727c25faef2ecc9, -Jawbreaker,Tigervision,,,,,,,A2600PAL,,,8f33bce5ba1053dcf4cea9c1c69981e4, -Jawbreaker,Tigervision,,,,,,,A2600PAL,,,97327d6962f8c64e6f926f79cd01c6b9, -Jawbreaker,Tigervision,,,,,,,A2600PAL,,,a406d2f6d84e61d842f4cb13b2b1cfa7, -Jinks,Atari,,,1989,CX7857,Common,A78SGR,A7800NTSC,,,045fd12050b7f2b842d5970f2414e912,http://www.atariage.com/manual_thumbs.html?SoftwareID=2134 -Jinks,Atari,,,1989,CX7857,Common,A78SGR,A7800PAL,,,dfb86f4d06f05ad00cf418f0a59a24f7,http://www.atariage.com/manual_thumbs.html?SoftwareID=2134 -John K Harvey's Equalizer,,,Homebrew,,,,,A2600NTSC,,,4fc1b85b8074b4b9436d097900e34f29, -John K Harvey's Equalizer,,,Homebrew,,,,,A2600NTSC,,,eb4252faff7a4f2ba5284a98b8f78d1a, -Journey Escape,,,,,112-006,Common,,A2600NTSC,,,718ae62c70af4e5fd8e932fee216948a, -Joust,Atari,,,1983,CX2691,Common,A8K,A2600NTSC,,,3276c777cbe97cdd2b4a63ffc16b7151, -Joust,Atari,,,1983,CX2691,Common,A8K,A2600PAL,,,640a08e9ca019172d612df22a9190afb, -Joust,Atari,,,1987,CX7806,Common,,A7800NTSC,,,f18b3b897a25ab3885b43b4bd141b396,http://www.atariage.com/manual_thumbs.html?SoftwareID=2135 -Joust,Atari,,,1987,CX7806,Common,,A7800PAL,,,f2dae0264a4b4a73762b9d7177e989f6,http://www.atariage.com/manual_thumbs.html?SoftwareID=2135 -Jr. Ms. Pac-Man,,Bob DeCrescenzo,Homebrew,2009,,,A7832P,A7800NTSC,,,548ba2e54e4fc45ab84ed634d702c136, -Jr. Pac-Man (Tunnels),,Bob DeCrescenzo,Homebrew,2009,,,A7832P,A7800NTSC,,,6bc2daeb48e28d103a4298a276e7e551, -Jr. Pac-Man,,Bob DeCrescenzo,Homebrew,2009,,,A78SGR,A7800NTSC,,,0b3baf47886915dd2eec5da7671bfa63, -Jr. Pac-Man,,Bob DeCrescenzo,Homebrew,2009,,,A78SGR,A7800NTSC,,,8281ab17fa3bfc0a6c497d6a4f350061, -Jr. Pac-Man,Atari,,,1984,CX26123,Uncommon,A16KR,A2600NTSC,,,36c29ceee2c151b23a1ad7aa04bd529d, -Jr. Pac-Man,Atari,,,1984,CX26123,Uncommon,A16KR,A2600PAL,,,297c405afd01f3ac48cdb67b00d273fe, -Jumping Jack,Dynamics,,,,,,,A2600PAL,,,80e1410ec98089e0733cc09e584dba4b, -Jungle Fever,Mystique,,,,1011,Extremely Rare,,A2600NTSC,,,2cccc079c15e9af94246f867ffc7e9bf, -Jungle Hunt,Atari,,,1983,CX2688,Uncommon,A8K,A2600NTSC,,,2bb9f4686f7e08c5fcc69ec1a1c66fe7, -Jungle Hunt,Atari,,,1983,CX2688,Uncommon,A8K,A2600PAL,,,9fc2d1627dcdd8925f4c042e38eb0bc9, -Jungle Hunt,CCE,,,1983,CX2688,Uncommon,A8K,A2600NTSC,,,88a6c9c88cb329ee5fa7d168bd6c7c63, -Jungle King,Atari,Jess Ragan,Hack,,,,A8K,A2600NTSC,,,e1d5c8213e82820128fa9c4775f1e166, -Junkosoft One Year Demo,Junkosoft,,,1999,,,,A2600NTSC,,,65917ae29a8c9785bb1f2acb0d6aafd0, -KC Pacman,,,Hack,,,,,A2600NTSC,,,66b54641b5786ea3ff0215aa39d61e01, -KLAX,Atari,,Prototype,1988,,,A78SG,A7800NTSC,,,17b3b764d33eae9b5260f01df7bb9d2f,http://www.atariage.com/manual_html_page.html?SoftwareID=2227 -Kabobber,Activision,Rex Bradford,Prototype,1983,,,,A2600NTSC,,,b9d1e3be30b131324482345959aed5e5, -Kaboom!,Activision,Larry Kaplan,,1981,AG-010,Uncommon,,A2600NTSC,Paddles,Paddles,5428cdfada281c569c74c7308c7f2c26,http://www.atariage.com/manual_thumbs.html?SoftwareID=1101 -Kaboom!,Activision,Larry Kaplan,,1981,AG-010,Uncommon,,A2600NTSC,Paddles,Paddles,af6ab88d3d7c7417db2b3b3c70b0da0a,http://www.atariage.com/manual_thumbs.html?SoftwareID=1101 -Kaboom!,Activision,Larry Kaplan,,1981,AG-010,Uncommon,,A2600NTSC,Paddles,Paddles,e14dc36b24fe22c04fa076e298f2e15f,http://www.atariage.com/manual_thumbs.html?SoftwareID=1101 -Kaboom!,Activision,Larry Kaplan,,1981,AG-010,Uncommon,,A2600PAL,Paddles,Paddles,f9e99596345a84358bc5d1fbe877134b,http://www.atariage.com/manual_thumbs.html?SoftwareID=1101 -Kaboom!,CCE,Larry Kaplan,,,,,,A2600NTSC,Paddles,Paddles,dbdaf82f4f0c415a94d1030271a9ef44, -Kabul!,,Jess Ragan,Hack,,,,,A2600NTSC,Paddles,Paddles,a93e8ea1f565c3c1e86b708cf0dc2fa9, -Kamikaze Saucers,,,Prototype,,,,,A2600NTSC,,,7b43c32e3d4ff5932f39afcb4c551627, -Kangaroo,Atari,,,,CX2689,Uncommon,,A2600NTSC,,,4326edb70ff20d0ee5ba58fa5cb09d60, -Kangaroo,Atari,,,,CX2689,Uncommon,,A2600PAL,,,6fe67f525c39200a798985e419431805, -Karate,,,,,,,,A2600PAL,,,dd17711a30ad60109c8beace0d4a76e8, -Karate,Froggo,,,1982,,Rare,,A2600NTSC,,,cedbd67d1ff321c996051eec843f8716, -Karateka,Atari,,,1987,CS7822,Common,A78S4,A7800PAL,,,5e0a1e832bbcea6facb832fde23a440a,http://www.atariage.com/manual_html_page.html?SoftwareID=2227 -Karateka,Atari,,,1987,CX7822,Common,,A7800NTSC,,,c3a5a8692a423d43d9d28dd5b7d109d9,http://www.atariage.com/manual_thumbs.html?SoftwareID=2136 -Keystone Kapers (Brazil),Digivision,Garry Kitchen,,,,,,A2600NTSC,,,1351c67b42770c1bd758c3e42f553fea, -Keystone Kapers,Activision,Garry Kitchen,,1983,AX-025,Uncommon,,A2600NTSC,,,be929419902e21bd7830a7a7d746195d, -Keystone Kapers,Activision,Garry Kitchen,,1983,AX-025,Uncommon,,A2600PAL,,,05aedf04803c43eb5e09dfd098d3fd01, -Keystone Kapers,Activision,Garry Kitchen,,1983,AX-025,Uncommon,,A2600PAL,,,6c1f3f2e359dbf55df462ccbcdd2f6bf, -Keystone Kapers,Activision,Garry Kitchen,,1983,AX-025,Uncommon,,A2600PAL,,,bedfbde71fb606601f936b5b057f26f7, -Keystone Kapers,CCE,Garry Kitchen,,,,,,A2600NTSC,,,e28113d10c0c14cc3b5f430b0d142fcb, -Keystone Kaypers (Brazil),Zirok,Garry Kitchen,,,,,,A2600NTSC,,,7187118674ff3c0bb932e049d9dbb379, -King Arthur,Starsoft,,,,,,,A2600PAL,,,05ccf96247af12eef59698f1a060a54f, -King Kong,Tigervision,,,1982,7-001,Rare,,A2600NTSC,,,0b1056f1091cfdc5eb0e2301f47ac6c3, -King Kong,Tigervision,,,1982,7-001,Rare,,A2600PAL,,,0dd4c69b5f9a7ae96a7a08329496779a, -Klax,Atari,David Dentt,,1990,CX26192,Extremely Rare,,A2600NTSC,,,2c29182edf0965a7f56fe0897d2f84ba, -Klax,Atari,David Dentt,,1990,CX26192,Extremely Rare,,A2600PAL,,,eed9eaf1a0b6a2b9bc4c8032cb43e3fb, -Knight on the Town,Playaround,,,,,Extremely Rare,,A2600NTSC,,,7fcd1766de75c614a3ccc31b25dd5b7a, -Kool Aid Man,,Fabrizio Zavagli,Hack,1982,,,,A2600NTSC,,,2c8c11295d8613f875b7bcf5253ab9bb, -Kool Aid Man,Mattel,,,1982,MT4648,Uncommon,,A2600NTSC,,,534e23210dd1993c828d944c6ac4d9fb, -Krieg Der Sterne,Atlantis-Ariola,,,,,,,A2600PAL,,,071f84d10b343c7c05ce3e32af631687, -Krull,Atari,,,1983,CX2682,Rare,,A2600NTSC,,,4baada22435320d185c95b7dd2bcdb24, -Krull,CCE,,,,,,,A2600NTSC,,,00dc28b881989c39a6cf87a892bd3c6b, -Kung Fu Master,Activision,Dan Kitchen,,1984,AX-039,Rare,A8K,A2600NTSC,,,5b92a93b23523ff16e2789b820e2a4c5, -Kung Fu Master,Activision,Dan Kitchen,,1984,AX-039,Rare,A8K,A2600PAL,,,4474b3ad3bf6aabe719a2d7f1d1fb4cc, -Kung Fu Master,CCE,Dan Kitchen,,,AX-039,Rare,A8K,A2600NTSC,,,0b4e793c9425175498f5a65a3e960086, -Kung Fu Sprite Demo 2,,,,,,,,A2600NTSC,,,ce89529d6e98a13ddf3d84827bbdfe68, -Kung Fu Sprite Demo,,,,,,,,A2600NTSC,,,a8101cb667e50a46165c6fb48c608b6b, -Kung Fu,,,,,99003,Extremely Rare,,A2600PAL,,,6805734a0b7bcc8925d9305b071bf147, -Kung-Fu Master,Absolute,,,1989,AM-039,Scarce,,A7800NTSC,,,f57d0af323d4e173fb49ed447f0563d7,http://www.atariage.com/manual_thumbs.html?SoftwareID=2137 -Kung-Fu Master,Absolute,,,1989,AM-039,Scarce,,A7800PAL,,,2931b75811ad03f3ac9330838f3d231b,http://www.atariage.com/manual_thumbs.html?SoftwareID=2137 -Labyrinth,Starsoft,,,,,,,A2600PAL,,,0fbf618be43d4396856d4244126fe7dc, -Lady in Wading,Playaround,,,,,Extremely Rare,,A2600NTSC,,,858abdc9deba2f248e073d01c356e1ab, -Lady in Wading,Playaround,,,,,Extremely Rare,,A2600NTSC,,,95a89d1bf767d7cc9d0d5093d579ba61, -Landung in der Normandie,Starsoft,,,,,,,A2600PAL,,,ec407a206b718a0a9f69b03e920a0185, -Landungskommando,Starsoft,,,,,,,A2600PAL,,,b7345220a0c587f3b0c47af33ebe533c, -Laser Base (a.k.a. World End),ITT Family Games,,,,,,,A2600PAL,,,130c5742cd6cbe4877704d733d5b08ca, -Laser Base (a.k.a. World End),ITT Family Games,Thomas Jentzsch,Hack,,,,,A2600NTSC,,,8c103a79b007a2fd5af602334937b4e1, -Laser Blast (32-in-1),Atari,David Crane,,,,,,A2600PAL,,,0d1b3abf681a2fc9a6aa31a9b0e8b445,http://www.atariage.com/manual_thumbs.html?SoftwareID=1115 -Laser Blast,Activision,David Crane,,1981,AG-008,Common,,A2600NTSC,,,931b91a8ea2d39fe4dca1a23832b591a,http://www.atariage.com/manual_thumbs.html?SoftwareID=1115 -Laser Blast,Activision,David Crane,,1981,AG-008,Common,,A2600NTSC,,,9ec1b259a1bcffa63042a3c2b3b90f0a,http://www.atariage.com/manual_thumbs.html?SoftwareID=1115 -Laser Blast,Activision,David Crane,,1981,AG-008,Common,,A2600NTSC,,,d5e27051512c1e7445a9bf91501bda09,http://www.atariage.com/manual_thumbs.html?SoftwareID=1115 -Laser Blast,Activision,David Crane,,1982,,,,A2600PAL,,,8a8e401369e2b63a13e18a4d685387c6,http://www.atariage.com/manual_thumbs.html?SoftwareID=1115 -Laser Blast,Activision,David Crane,,1982,,,,A2600PAL,,,d339b95f273f8c3550dc4daa67a4aa94,http://www.atariage.com/manual_thumbs.html?SoftwareID=1115 -Laser Blast,CCE,David Crane,,,,,,A2600NTSC,,,303242c239474f2d7763b843de58c1c3,http://www.atariage.com/manual_thumbs.html?SoftwareID=1115 -Laser Gates,CCE,,,,,Rare,,A2600NTSC,,,1fa58679d4a39052bd9db059e8cda4ad, -Laser Gates,Imagic,Dan Oliver,,1983,,Rare,,A2600PAL,,,8e4cd60d93fcde8065c1a2b972a26377, -Laser Volley,Zellers,,,,,Rare,,A2600NTSC,,,48287a9323a0ae6ab15e671ac2a87598, -Laseral 2600 (7 July 2002) (PAL-49),Andrew Wallace,,Homebrew,,,,,A2600NTSC,,,02dcba28c614fec7ca25955327128abb, -Laseral 2600 (7 July 2002),Andrew Wallace,,Homebrew,,,,,A2600NTSC,,,19098c46da0640f2b5763167dea6c716, -Laseral 2600 (7 July 2002),Andrew Wallace,,Homebrew,,,,,A2600NTSC,,,9c6fd6ed3599978ab7b6f900484b9be6, -Laseral 2600 (7 July 2002),Andrew Wallace,,Homebrew,,,,,A2600PAL,,,f9655ed51462ecfc690c7b97cec649f9, -Lightbulb Lightens - The (Non Functional),,,,,,,,A2600NTSC,,,bb579404924c40ca378b4aff6ccf302d, -Lilly Adventure,Starsoft,,,,,,,A2600PAL,,,ab10f2974dee73dab4579f0cab35fca6, -Lilly Adventure,Starsoft,Thomas Jentzsch,Hack,,,,,A2600NTSC,,,64d43859258dc8ca54949e9ff4174202, -Lines Demo,,,,,,,,A2600PAL,,,fe0b7f27e3ad50bbf9ff468ee56d553d, -Lochjaw,Apollo,,,,,,,A2600NTSC,,,86128001e69ab049937f265911ce7e8a, -Lock 'N' Chase,Mattel,,,1982,MT5663,Common,,A2600NTSC,,,71464c54da46adae9447926fdbfc1abe, -Lock 'N' Chase,Mattel,,,1982,MT5663,Common,,A2600PAL,,,e88340f5bd2f03e2e9ce5ecfa9c644f5, -Lock 'N' Chase,Telegames,,,,,,,A2600PAL,,,493e90602a4434b117c91c95e73828d1, -London Blitz,,,,,50010,Extremely Rare,,A2600NTSC,,,b4e2fd27d3180f0f4eb1065afc0d7fc9, -Lord of the Rings,Parker Bros,,Prototype,,PB5590,,PB8K,A2600NTSC,,,e24d7d879281ffec0641e9c3f52e505a, -Lord of the Rings-Fellowship of the Ring (Improved Engine),,Adam Thornton,Hack,,,,,A2600NTSC,,,e4b12deaafd1dbf5ac31afe4b8e9c233, -Lord of the Rings-Fellowship of the Ring,,Adam Thornton,Hack,,,,,A2600NTSC,,,daef7d8e5a09981c4aa81573d4dbb380, -Lost Luggage,,,,,AP 2004,Uncommon,,A2600NTSC,,,7c00e7a205d3fda98eb20da7c9c50a55, -Lost Luggage,Apollo,,,1981,,,,A2600NTSC,,,2d76c5d1aad506442b9e9fb67765e051, -Lumberman,Cracker Jack Productions,,Hack,,,,,A2600NTSC,,,df5cc5cccdc140eb7107f5b8adfacda1, -M.A.D.,Carrere Video,,,,VC 1012,Rare,,A2600PAL,,,090f0a7ef8a3f885048d213faa59b2f8, -M.A.D.,US Games,,,1982,VC 1012,Rare,,A2600NTSC,,,393e41ca8bdd35b52bf6256a968a9b89, -M.A.S.H. (no logo),CCE,,,,,,,A2600PAL,,,1423f560062c4f3c669d55891a2bcbe7, -M.A.S.H.,20th Century Fox,,,1982,11011,Uncommon,,A2600NTSC,,,835759ff95c2cdc2324d7c1e7c5fa237, -M.A.S.H.,CCE,,,,,,,A2600NTSC,,,cf63ffac9da89ef09c6c973083061a47, -Magicard,CommaVid,,,,,,,A2600NTSC,,,cddabfd68363a76cd30bee4e8094c646, -Malagai,,,,,ASC1001,Unbelievably Rare,,A2600NTSC,,,ccb5fa954fb76f09caae9a8c66462190, -Mangia',Spectravideo,,,1983,SA-212,Rare,,A2600NTSC,Paddles,Paddles,54a1c1255ed45eb8f71414dadb1cf669, -Mangia',Spectravideo,,,1983,SA-212,Rare,,A2600PAL,Paddles,Paddles,d8295eff5dcc43360afa87221ea6021f, -Many Blue Bars Demo,,,,,,,,A2600NTSC,,,e4c2077a18e3c27f4819aa7757903aa0, -Many Blue Bars and Text Demo 2,,,,,,,,A2600NTSC,,,163e7e757e2dc44469123ff0e5daec5e, -Many Blue Bars and Text Demo 3,,,,,,,,A2600NTSC,,,f032b2f2d8323404a6b4541f92dd1825, -Many Blue Bars and Text Demo 4,,,,,,,,A2600NTSC,,,ef60b06fddb675b0d783afbfa5fc5232, -Many Blue Bars and Text Demo,,,,,,,,A2600NTSC,,,cef01595000627ee50863d4290372c27, -Marauder,Tigervision,,,1982,7-005,Extremely Rare,,A2600NTSC,,,13895ef15610af0d0f89d588f376b3fe, -Marauder,Tigervision,,,1982,7-005,Extremely Rare,,A2600NTSC,,,2a156728c0123034bd73e25bf8c70a88, -Marauder,Tigervision,,,1982,7-005,Extremely Rare,,A2600PAL,,,512e874a240731d7378586a05f28aec6, -Marble Craze (Title Only),,Paul Slocum,Homebrew,,,,,A2600NTSC,,,cd9fea12051e414a6dfe17052067da8e, -Marine Wars,Konami,,,1983,11,Extremely Rare,,A2600NTSC,,,b00e8217633e870bf39d948662a52aac, -Marineflieger,Starsoft,,,,,,,A2600PAL,,,1b8d35d93697450ea26ebf7ff17bd4d1, -Mario Bros.,Atari,,,1983,CX2697,Uncommon,,A2600NTSC,,,e908611d99890733be31733a979c62d8, -Mario Bros.,Atari,,,1983,CX2697,Uncommon,,A2600PAL,,,c49fe437800ad7fd9302f3a90a38fb7d, -Mario Bros.,Atari,,,1988,CX7850,Scarce,,A7800NTSC,,,431ca060201ee1f9eb49d44962874049,http://www.atariage.com/manual_thumbs.html?SoftwareID=2138 -Mario Bros.,Atari,,,1988,CX7850,Scarce,,A7800PAL,,,d2e861306be78e44248bb71d7475d8a3,http://www.atariage.com/manual_thumbs.html?SoftwareID=2138 -Mario Bros.,CCE,,,1983,,,,A2600NTSC,,,b1d1e083dc9e7d9a5dc1627869d2ade7, -Mark's Sound Demo,,,,,,,,A2600NTSC,,,c446288fe62c0c2737639fd788ae4a21, -Master Builder,Spectravideo,,,,SA-210,Rare,,A2600NTSC,,,ae4be3a36b285c1a1dff202157e2155d, -Master Builder,Spectravideo,,,,SA-210,Rare,,A2600PAL,,,36e47ed74968c365121eab60f48c6517, -Masters of the Universe - The Power of He-Man,Mattel,,,1983,MT4318,Rare,MN16K,A2600NTSC,,,3b76242691730b2dd22ec0ceab351bc6, -Mat Mania Challenge,Atari,,,1989,CS7863,Scarce,A78SG,A7800NTSC,,,37b5692e33a98115e574185fa8398c22,http://www.atariage.com/manual_thumbs.html?SoftwareID=2139 -Mat Mania Challenge,Atari,,,1989,CX7863,Scarce,A78SG,A7800PAL,,,6819c37b96063b024898a19dbae2df54,http://www.atariage.com/manual_thumbs.html?SoftwareID=2139 -Math Gran Prix,Atari,,,,CX2658,Common,,A2600NTSC,,,470878b9917ea0348d64b5750af149aa, -Math Gran Prix,Atari,,,,CX2658,Common,,A2600PAL,,,45beef9da1a7e45f37f3f445f769a0b3, -Matt Demo,,,,,,,,A2600NTSC,,,244c6de27faff527886fc7699a41c3be, -Maze Craze,Atari,Rick Maurer,,,CX2635,Uncommon,,A2600PAL,,,ed2218b3075d15eaa34e3356025ccca3, -Maze Craze,Atari,Rick Maurer,,1978,CX2635,Uncommon,,A2600NTSC,,,f825c538481f9a7a46d1e9bc06200aaf, -Maze Demo 1,,,,,,,,A2600NTSC,,,69ebf910ab9b63e5b8345f016095003b, -Maze Demo 2,,,,,,,,A2600NTSC,,,f9de91d868d6ebfb0076af9063d7195e, -McDonald's,Parker Bros,,Prototype,,,,,A2600NTSC,,,35b43b54e83403bb3d71f519739a9549, -Mean 18 Ultimate Golf,Atari,,,1988,CX7847,Rare,A78SG,A7800NTSC,,,f2f5e5841e4dda89a2faf8933dc33ea6,http://www.atariage.com/manual_thumbs.html?SoftwareID=2178 -Mean 18 Ultimate Golf,Atari,,,1988,CX7847,Rare,A78SG,A7800PAL,,,2e9dbad6c0fa381a6cd1bb9abf98a104,http://www.atariage.com/manual_thumbs.html?SoftwareID=2178 -Mega Force,20th Century Fox,,,1982,11005,Rare,,A2600NTSC,,,daeb54957875c50198a7e616f9cc8144, -Mega Force,20th Century Fox,,,1982,11005,Rare,,A2600PAL,,,bdbaeff1f7132358ea64c7be9e46c1ac, -Mega Force,20th Century Fox,,,1982,11005,Rare,,A2600PAL,,,ecf51385384b468834611d44a8429c03, -Mega Funpak - Pac-Man - Planet Patrol - Skeet Shoot - Battles of Gorf,HES,,,,,,,A2600PAL,,,e37c8055d70979af354251ebe9f1b7dd, -Mega Mania Raid,Activision,Thiago Paiva,Hack,,,,,A2600NTSC,,,28a2bea8f84936cb2e063f857414cda0, -Megaboy (Brazil),,,,,,,,A2600PAL,,,b65d4a38d6047735824ee99684f3515e, -Megamania,Activision,Steve Cartwright,,,AX-017,Uncommon,,A2600PAL,,,049626cbfb1a5f7a5dc885a0c4bb758e, -Megamania,Activision,Steve Cartwright,,1982,AX-017,Uncommon,,A2600NTSC,,,318a9d6dda791268df92d72679914ac3, -Megamania,Activision,Steve Cartwright,,1982,AX-017,Uncommon,,A2600NTSC,,,a35d47898b2b16ec641d1dfa8a45c2b7, -Megamania,Activision,Steve Cartwright,,1982,AX-017,Uncommon,,A2600PAL,,,3d934bb980e2e63e1ead3e7756928ccd, -Megamania,CCE,Steve Cartwright,,,,,,A2600NTSC,,,d5618464dbdc2981f6aa8b955828eeb4, -Mein Weg,Starsoft,,,,,,,A2600PAL,,,1e0ef01e330e5b91387f75f700ccaf8f, -Meltdown,Atari,,,1990,,Common,A78SG,A7800NTSC,Lightgun,Lightgun,bedc30ec43587e0c98fc38c39c1ef9d0,http://www.atariage.com/manual_thumbs.html?SoftwareID=2140 -Meltdown,Atari,,,1990,,Common,A78SG,A7800PAL,Lightgun,Lightgun,c80155d7eec9e3dcb79aa6b83c9ccd1e,http://www.atariage.com/manual_thumbs.html?SoftwareID=2140 -Merlin's Walls (Standard Edition),Ebivision,,,1999,,,,A2600NTSC,,,50568c80ac61cab789d9923c9b05b68e, -Meteor Defense,ITT Family Games,,,,554-33391,Extremely Rare,,A2600PAL,,,6522717cfd75d1dba252cbde76992090, -Meteor Shower,,Bob DeCrescenzo,Homebrew,2011,,,A7816,A7800NTSC,,,b02f93661f4b7e712810d2bf8e02ad79, -Meteor Shower,,Bob DeCrescenzo,Homebrew,2011,,,A7816,A7800PAL,,,2f1f199ecc2b414d28e01f0de53ca8f7, -Midnight Magic,Atari,,,1984,CX26129,Rare,A16K,A2600NTSC,,,f1554569321dc933c87981cf5c239c43, -Midnight Magic,Atari,,,1984,CX26129,Rare,A16K,A2600PAL,,,da732c57697ad7d7af414998fa527e75, -Midnight Mutants,Atari,,,1990,CX7889,Scarce,A78SG,A7800NTSC,,,bc1e905db1008493a9632aa83ab4682b,http://www.atariage.com/manual_thumbs.html?SoftwareID=2141 -Midnight Mutants,Atari,,,1990,CX7889,Scarce,A78SG,A7800PAL,,,6794ea31570eba0b88a0bf1ead3f3f1b,http://www.atariage.com/manual_thumbs.html?SoftwareID=2141 -Millipede,Atari,,,1984,CX26118,Rare,A16KR,A2600NTSC,,,3c57748c8286cf9e821ecd064f21aaa9,http://www.atariage.com/manual_thumbs.html?SoftwareID=1149 -Millipede,Atari,,,1984,CX26118,Rare,A16KR,A2600PAL,,,a7673809068062106db8e9d10b56a5b3,http://www.atariage.com/manual_thumbs.html?SoftwareID=1149 -Millipede,Atari,,Prototype,,,,A16KR,A2600PAL,,,efd387430a35a659ff569a9a0ec22209,http://www.atariage.com/manual_thumbs.html?SoftwareID=1149 -Miner 2049er Vol. 2,Tigervision,,,,7-011,Extremely Rare,TV8K,A2600NTSC,,,2723e442d55d741a8e2d9293108cd5ed, -Miner 2049er Vol. 2,Tigervision,,,,7-011,Extremely Rare,TV8K,A2600NTSC,,,e2cff4a96b91fcf5de694b7480a612ae, -Miner 2049er Vol. 2,Tigervision,,,,7-011,Extremely Rare,TV8K,A2600PAL,,,468f2dec984f3d4114ea84f05edf82b6, -Miner 2049er,Tigervision,,,,7-008,Extremely Rare,TV8K,A2600NTSC,,,005ea4b9f089336ab7ae46440513a9d3, -Miner 2049er,Tigervision,,,,7-008,Extremely Rare,TV8K,A2600NTSC,,,b21ee4639476eaec8204f00c712b7497, -Miner 2049er,Tigervision,,,,7-008,Extremely Rare,TV8K,A2600NTSC,,,fa0570561aa80896f0ead05c46351389, -Mines of Minos,CommaVid,,,,CM-005,Extremely Rare,,A2600NTSC,,,4543b7691914dfd69c3755a5287a95e1, -Mines of Minos,CommaVid,,,,CM-005,Extremely Rare,,A2600PAL,,,73cb1f1666f3fd30b52b4f3d760c928f, -Mines of Minos,CommaVid,,,,CM-005,Extremely Rare,,A2600PAL,,,b5cb9cf6e668ea3f4cc2be00ea70ec3c, -Minesweeper (V.09),,,,,,,,A2600NTSC,,,635cc7a0db33773959d739d04eff96c2, -Minesweeper (V.099),,,,,,,,A2600NTSC,,,ac5f78bae0638cf3f2a0c8d07eb4df69, -Miniature Golf (32-in-1),Atari,,,,,,,A2600PAL,,,73521c6b9fed6a243d9b7b161a0fb793, -Miniature Golf - Arcade Golf,,,,1979,CX2626,Uncommon,,A2600NTSC,,,384db97670817103dd8c0bbdef132445, -Miniature Golf - Arcade Golf,,,,1979,CX2626,Uncommon,,A2600NTSC,,,df62a658496ac98a3aa4a6ee5719c251, -Miniature Golf,Atari,,,,,,,A2600PAL,,,4f82d8d78099dd71e8e169646e799d05, -Miniature Golf,Atari,,,,CX2626,Uncommon,,A2600PAL,,,ed5ccfc93ad4561075436ee42a15438a, -Miss Pack Man,,,,,,,,A2600PAL,,,391764720140c432aec454a468f77a40, -Miss Piggy's Wedding,,,Prototype,,,,,A2600NTSC,,,25e73efb9a6edf119114718bd2f646ba, -Miss Piggy's Wedding,,,Prototype,,,,,A2600NTSC,,,4181087389a79c7f59611fb51c263137, -Miss Piggy's Wedding,,,Prototype,,,,,A2600NTSC,,,855a42078b14714bcfd490d2cf57e68d, -Missile Command (Different Graphics),,,Hack,,,,,A2600PAL,,,c4d888bcf532e7c9c5fdeafbb145266a,http://www.atariage.com/manual_html_page.html?SoftwareID=1154 -Missile Command,Atari,Rob Fulop,,1980,CX2638,,,A2600PAL,,,f6a9ea814d15b85bffe980c927df606b,http://www.atariage.com/manual_html_page.html?SoftwareID=1154 -Missile Command,Atari,Rob Fulop,,1980,CX2638,Common,,A2600NTSC,,,3a2e2d0c6892aa14544083dfb7762782,http://www.atariage.com/manual_html_page.html?SoftwareID=1154 -Missile Command,Atari,Rob Fulop,,1980,CX2638,Common,,A2600PAL,,,9364ad51c321e0f15c96a8c0aff47ceb,http://www.atariage.com/manual_html_page.html?SoftwareID=1154 -Missile Control (a.k.a. Raketen-Angriff),Ariola,,,,,,,A2600PAL,,,0b577e63b0c64f9779f315dca8967587, -Missile Control (a.k.a. Raketen-Angriff),Ariola,,,,VG-01,Extremely Rare,,A2600PAL,,,cb24210dc86d92df97b38cf2a51782da, -Missile Control (a.k.a. Raketen-Angriff),Ariola,Thomas Jentzsch,Hack,,,,,A2600NTSC,,,e6e5bb0e4f4350da573023256268313d, -Missile War,Goliath,,,,,,,A2600PAL,,,317a4cdbab090dcc996833d07cb40165, -Missing in Action,TNT Games,Chuck Peavey,Prototype,1989,CX7890,,A78S9,A7800NTSC,,,017066f522908081ec3ee624f5e4a8aa,http://www.atariage.com/software_page.html?SoftwareLabelID=2760 -Missing in Action,TNT Games,Chuck Peavey,Prototype,1989,CX7890,,A78S9,A7800NTSC,,,d0f46bf92ed6e7b1cce63278420cae8a,http://www.atariage.com/software_page.html?SoftwareLabelID=2760 -Mission 3000 A.D.,Bitcorp,,,,PG207,Rare,,A2600PAL,,,6efe876168e2d45d4719b6a61355e5fe, -Mission Survive,,Thomas Jentzsch,Hack,,,,,A2600NTSC,,,b676a9b7094e0345a76ef027091d916b, -Mission Survive,Video Gems,,,,,,,A2600PAL,,,cf9069f92a43f719974ee712c50cd932, -Misterious Thief - A,CCE,,,,C-839,Extremely Rare,,A2600NTSC,,,e13818a5c0cb2f84dd84368070e9f099, -Moby Blues,Ataritalia,,Hack,,,,,A2600NTSC,,,63e9e612bbee31045f8d184a4e53f8ec, -Mogul Maniac,Amiga,,,,3120,Extremely Rare,,A2600NTSC,,,7af40c1485ce9f29b1a7b069a2eb04a7, -Mondo Pong V1,,Piero Cavina,Homebrew,,,,,A2600NTSC,Paddles,Paddles,6bde3f6ac31aceef447ce57d4d2c2ec0, -Mondo Pong,,,Homebrew,,,,,A2600NTSC,Paddles,Paddles,1f60e48ad98b659a05ce0c1a8e999ad9, -Monster aus dem All,Rainbow Vision,,,1983,,,,A2600PAL,,,c31a17942d162b80962cb1f7571cd1d5, -Monstercise,,,Prototype,,CX26131,,,A2600NTSC,Keypad,Keypad,6913c90002636c1487538d4004f7cac2, -Montezuma's Revenge - Starring Panama Joe,Parker Bros,,,1983,PB5760,Extremely Rare,PB8K,A2600NTSC,,,3347a6dd59049b15a38394aa2dafa585, -Montezuma's Revenge - Starring Panama Joe,Parker Bros,Thomas Jentzsch,Hack,1983,,,PB8K,A2600PAL,,,9f59eddf9ba91a7d93bce7ee4b7693bc, -Moon Cresta,,Bob DeCrescenzo,Homebrew,2011,,,A7832,A7800NTSC,,,9ff38ea62004201d870caa8bd9463525, -Moon Patrol,Atari,,,1983,CX2692,Uncommon,A8K,A2600NTSC,,,515046e3061b7b18aa3a551c3ae12673, -Moon Patrol,Atari,,,1983,CX2692,Uncommon,A8K,A2600PAL,,,65490d61922f3e3883ee1d583ce10855, -Moon Patrol,CCE,,,,,,,A2600NTSC,,,6de924c2297c8733524952448d54a33c, -Moonsweeper,Imagic,Bob Smith,,1983,O3207,Uncommon,,A2600NTSC,,,203abb713c00b0884206dcc656caa48f, -Moonsweeper,Imagic,Bob Smith,,1983,O3207,Uncommon,,A2600NTSC,,,7db7c5fd8d3f53127a4bb0092c91d983, -Moonsweeper,Imagic,Bob Smith,,1983,O3207,Uncommon,,A2600PAL,,,4af4103759d603c82b1c9c5acd2d8faf, -Moto Laser,CCE,,,,,,,A2600NTSC,,,eb503cc64c3560cd78b7051188b7ba56, -Motocross Racer - Joystick,Xonox,,,,,Rare,,A2600NTSC,,,5641c0ff707630d2dd829b26a9f2e98f, -Motocross Racer,Xonox,,,,,Rare,,A2600NTSC,,,de0173ed6be9de6fd049803811e5f1a8, -Motocross,Starsoft,,,,,Rare,,A2600PAL,,,5635cd67fb680424254ec156c42deee0, -Motocross,Starsoft,,,,,Rare,,A2600PAL,,,a20b7abbcdf90fbc29ac0fafa195bd12, -Motocross,Starsoft,,,,,Rare,,A2600PAL,,,f5a2f6efa33a3e5541bc680e9dc31d5b, -Motor Psycho,Atari,,,1990,CX7852,Rare,A78SG,A7800NTSC,,,3bc8f554cf86f8132a623cc2201a564b,http://www.atariage.com/manual_thumbs.html?SoftwareID=2171 -Motor Psycho,Atari,,,1990,CX7852,Rare,A78SG,A7800PAL,,,5330bfe428a6b601b7e76c2cfc4cd049,http://www.atariage.com/manual_thumbs.html?SoftwareID=2171 -Motorodeo,Atari,,,1990,CX26171,Unbelievably Rare,,A2600PAL,,,b1e2d5dc1353af6d56cd2fe7cfe75254, -Mountain King,CBS Electronics,,,,4L-2738,Rare,CBS12K,A2600NTSC,,,7e51a58de2c0db7d33715f518893b0db, -Mountain Man (a.k.a. Winterjagt),ITT Family Games,,,,,,,A2600PAL,,,6c1553ca90b413bf762dfc65f2b881c7, -Mouse Trap,CBS Electronics,,,,2459,Uncommon,,A2600PAL,,,23d445ea19a18fb78d5035878d9fb649, -Mouse Trap,Coleco,,,,2459,Uncommon,,A2600NTSC,,,5678ebaa09ca3b699516dba4671643ed, -Movable Grid Demo,,,,,,,,A2600NTSC,,,24fbf8250a71611e40ef18552e61b009, -Move a Blue Blob Demo 2,,,,,,,,A2600NTSC,,,f69a39b215852a0c2764d2a923c1e463, -Move a Blue Blob Demo,,,,,,,,A2600NTSC,,,6342afe9c9ad1b6120b8f6fb040d0926, -Moving Blue Ladder Demo,,,,,,,,A2600NTSC,,,140909d204abd6841c64cdad4d7765b4, -Moving Maze Demo,,,,,,,,A2600NTSC,,,703d32062436e4c20c48313dff30e257, -Mr. Do!'s Castle,Parker Bros,,,1983,2695/PB5820,Extremely Rare,PB8K,A2600NTSC,,,b7a7e34e304e4b7bc565ec01ba33ea27, -Mr. Do!,CBS Electronics,,,1983,2656,Rare,,A2600NTSC,,,0164f26f6b38a34208cd4a2d0212afc3, -Mr. Do!,CBS Electronics,,,1983,2656,Rare,,A2600PAL,,,aa7bb54d2c189a31bb1fa20099e42859, -Mr. Postman,,,,,PG209,Rare,,A2600NTSC,,,f0daaa966199ef2b49403e9a29d12c50, -Mr. Postman,Bitcorp,,,1983,,,,A2600PAL,,,603c7a0d12c935df5810f400f3971b67, -Mr. Postman,CCE,,,,C-801,Extremely Rare,,A2600NTSC,,,9a4274409216ff09ecde799f2a56ac73, -Mr. Roboto,Paul Slocum,,Homebrew,,,,,A2600NTSC,,,cff9950d4e650094f65f40d179a9882d, -Mr. T (a.k.a. Fast Eddie),Starsoft,,,,11003,Uncommon,,A2600PAL,,,a1f9159121142d42e63e6fb807d337aa, -Ms. Pac-Man,Atari,,,1982,CX2675,Common,A8K,A2600NTSC,,,87e79cd41ce136fd4f72cc6e2c161bee, -Ms. Pac-Man,Atari,,,1982,CX2675,Common,A8K,A2600PAL,,,1ee9c1ba95cef2cf987d63f176c54ac3, -Ms. Pac-Man,Atari,,,1987,CX7807,Common,,A7800NTSC,,,fc0ea52a9fac557251b65ee680d951e5,http://www.atariage.com/manual_thumbs.html?SoftwareID=2142 -Ms. Pac-Man,Atari,,,1987,CX7807,Common,,A7800PAL,,,56469e8c5ff8983c6cb8dadc64eb0363,http://www.atariage.com/manual_thumbs.html?SoftwareID=2142 -Ms. Pac-Man,CCE,,,1982,,,A8K,A2600NTSC,,,9469d18238345d87768e8965f9f4a6b2, -Multi Sprite Demo 1,,,,,,,,A2600NTSC,,,25f9cf703575c5d63048c222f5463758, -Multi-Color Demo 0,,,,,,,,A2600NTSC,,,079fe9103515d15bc108577e234a484d, -Multi-Color Demo 1,,,,,,,,A2600PAL,,,4afe528a082f0d008e7319ebd481248d, -Multi-Color Demo 2,,,,,,,,A2600NTSC,,,191449e40b0c56411c70772706f79224, -Multi-Color Demo 3,,,,,,,,A2600NTSC,,,ae18c11e4d7ed2437f0bf5d167c0e96c, -Multi-Color Demo 4,,,,,,,,A2600NTSC,,,c28b29764c2338b0cf95537cc9aad8c9, -Multi-Color Demo 5,,,,,,,,A2600NTSC,,,d34b933660e29c0a0a04004f15d7e160, -Multi-Color Demo 6,,,,,,,,A2600NTSC,,,14163eb2a3ddd35576bd8527eae3b45e, -Multi-Color Demo 7,,,,,,,,A2600NTSC,,,b1fd0b71de9f6eeb5143a97963674cb6, -Multi-Sprite Demo V1.1,,Piero Cavina,Homebrew,,,,,A2600NTSC,,,17515a4d0b7ea5029ffff7dfa8456671, -Multi-Sprite Demo V2.0,,Piero Cavina,Homebrew,,,,,A2600NTSC,,,ef71e9fb0d8d477226d8d42261fbf0a7, -Multi-Sprite Demo,,,,,,,,A2600NTSC,,,42ae81ae8ac51e5c238639f9f77d91ae, -Multi-Sprite Game V1.0,,Piero Cavina,Homebrew,,,,,A2600NTSC,,,b958d5fd9574c5cf9ece4b9421c28ecd, -Multi-Sprite Game V2.1,,Piero Cavina,Homebrew,,,,,A2600NTSC,,,7197b6cbde6ecd10376155e6b848e80d, -Muncher,,David Marli,Hack,,,,,A2600NTSC,,,a100eff2d7ae61ca2b8e65baf7e2aae8, -Music Machine,Sparrow,,,1983,GCG 1001T,Unbelievably Rare,,A2600NTSC,Paddles,Paddles,65b106eba3e45f3dab72ea907f39f8b4, -My Golf,,,,,,,,A2600PAL,,,dfad86dd85a11c80259f3ddb6151f48f, -My Golf,CCE,,,,,,,A2600NTSC,,,ee6cbedf6c0aac90faa0a8dbc093ffbe, -My Golf,HES,,,1990,,,,A2600PAL,,,04fccc7735155a6c1373d453b110c640, -My Golf,HES,Thomas Jentzsch,Hack,,,,,A2600NTSC,,,0546f4e6b946f38956799dd00caab3b1, -Mystery Science Theater 2600,,Tim Snider,Hack,,,,,A2600NTSC,,,fa7e11a3dbea4365975cd2f094e61d25, -NOIZ Invaders (SPIKE the Percussionist),SPIKE the Percussionist,,Homebrew,,,,,A2600NTSC,,,c58708c09ccb61625cda9d15ddcd8be6, -Name That Game (a.k.a. Octopus),US Games,,,,,,,A2600PAL,,,b392964e8b1c9c2bed12246f228011b2, -Name This Game (a.k.a. Octopus),US Games,,,1982,VC 1007,Extremely Rare,,A2600PAL,,,45cb0f41774b78def53331e4c3bf3362, -Night Driver,Atari,Rob Fulop,,1978,CX2633,Common,,A2600NTSC,Paddles,Paddles,392f00fd1a074a3c15bc96b0a57d52a1, -Night Driver,Atari,Rob Fulop,,1978,CX2633,Common,,A2600NTSC,Paddles,Paddles,f48022230bb774a7f22184b48a3385af, -Night Driver,Atari,Rob Fulop,,1978,CX2633,Common,,A2600PAL,Paddles,Paddles,feec54aac911887940b47fe8c9f80b11, -Night Stalker,Telegames,,,,,Rare,,A2600PAL,,,2783006ee6519f15cbc96adae031c9a9, -Night Stalker,Telegames,,,,,Rare,,A2600PAL,,,bd39598f067a1193ae81bd6182e756d1, -Nightmare,,,,,TEC004/105,Rare,,A2600NTSC,,,ed0ab909cf7b30aff6fc28c3a4660b8e, -Nightmare,CCE,,,,,,,A2600NTSC,,,27f9e2e1b92af9dc17c6155605c38e49, -Nightmare,Sancho,,,,TEC004,Extremely Rare,,A2600PAL,,,ead60451c28635b55ca8fea198444e16, -Ninja Golf,Atari,David Dentt & David Sullivan,,1990,CX7870,Scarce,A78SG,A7800NTSC,,,220121f771fc4b98cef97dc040e8d378,http://www.atariage.com/manual_thumbs.html?SoftwareID=2143 -Ninja Golf,Atari,David Dentt,,1990,CX7870,Scarce,A78SG,A7800PAL,,,ea0c859aa54fe5eaf4c1f327fab06221,http://www.atariage.com/manual_thumbs.html?SoftwareID=2143 -No Escape!,Imagic,Michael Greene,,1983,IA3312,Rare,,A2600NTSC,,,9912d06eea42200a198dd3e2be18c601, -No Escape!,Imagic,Michael Greene,,1983,IA3312,Rare,,A2600NTSC,,,b6d52a0cf53ad4216feb04147301f87d, -No Escape!,Imagic,Michael Greene,,1983,IA3312,Rare,,A2600PAL,,,d8df256c0d89e494a9fb3e9abb8e44ac, -Noize Maker Demo,,,,,,,,A2600NTSC,,,637efac676ff063f2fbb0abff77c4fa5, -Nuts,Technovision,,,,,Extremely Rare,,A2600NTSC,,,de7a64108074098ba333cc0c70eef18a, -Obelix,Atari,,,,CX26117,Extremely Rare,,A2600PAL,,,19e739c2764a5ab9ed08f9095aa2af0b, -Obelix,Atari,,,,CX26117,Extremely Rare,,A2600PAL,,,669840b0411bfbab5c05b786947d55d4, -Obelix,Atari,Thomas Jentzsch,Hack,,,,,A2600NTSC,,,a189f280521f4e5224d345efb4e75506, -Ocean City Defender,Zellers,,,,,Extremely Rare,,A2600NTSC,,,4cabc895ea546022c2ecaa5129036634, -Octopus (a.k.a. Name That Game),Carrere Video,,,,VC 1007,Extremely Rare,,A2600PAL,,,36306070f0c90a72461551a7a4f3a209, -Off Your Rocker,Amiga,,,,3130,Extremely Rare,,A2600NTSC,,,b6166f15720fdf192932f1f76df5b65d, -Off the Wall,Atari,,,1989,,,,A2600PAL,,,36edef446ab4c2395666efc672b92ed0, -Off the Wall,Atari,,,1989,CX26168,Extremely Rare,,A2600PAL,,,131864e1d18d3406048700d3c0760417, -Off the Wall,Atari,,,1989,CX26168,Extremely Rare,,A2600PAL,,,98f63949e656ff309cefa672146dc1b8, -Oink!,Activision,Mike Lorenzen,,1983,,,,A2600PAL,,,853c11c4d07050c22ef3e0721533e0c5, -Oink!,Activision,Mike Lorenzen,,1983,AX-023,Rare,,A2600NTSC,,,3da7cc7049d73d34920bb73817bd05a9, -Oink!,Activision,Mike Lorenzen,,1983,AX-023,Rare,,A2600NTSC,,,c9c25fc536de9a7cdc5b9a916c459110, -Oink!,Activision,Mike Lorenzen,,1983,AX-023,Rare,,A2600PAL,,,06b6c5031b8353f3a424a5b86b8fe409, -Oink!,CCE,Mike Lorenzen,,,,,,A2600NTSC,,,f8648d0c6ad1266434f6c485ff69ec40, -Okie Dokie (4K),,,Homebrew,,,,,A2600PAL,,,8101efafcf0af32fedda4579c941e6f4, -Okie Dokie (Older),,,Homebrew,,,,,A2600NTSC,,,ce4bbe11d682c15a490ae15a4a8716cf, -Okie Dokie,,,Homebrew,,,,,A2600NTSC,,,cca33ae30a58f39e3fc5d80f94dc0362, -Omega Race JS,CBS Electronics, Thomas Jentzsch ,Hack,,,,CBS12K,A2600NTSC,,,3b6dba1a24bb2893bd3bd0593f92016b, -Omega Race,CBS Electronics,,,,4L-2737,Uncommon,CBS12K,A2600NTSC,BoosterGrip,BoosterGrip,885b2002fa9d27502d84968d4656c4ca, -Omega Race,CBS Electronics,,,,4L-2737,Uncommon,CBS12K,A2600NTSC,BoosterGrip,BoosterGrip,9947f1ebabb56fd075a96c6d37351efa, -One Blue Bar Demo,,,,,,,,A2600NTSC,,,61426cee013306e7f7367534ab124747, -One on One Basketball,Atari,,,1987,CX7824,Common,,A7800NTSC,,,74569571a208f8b0b1ccfb22d7c914e1,http://www.atariage.com/manual_thumbs.html?SoftwareID=2144 -One on One Basketball,Atari,,,1987,CX7824,Common,,A7800PAL,,,8dba0425f0262e5704581d8757a1a6e3,http://www.atariage.com/manual_thumbs.html?SoftwareID=2144 -One on One,,Angelino,Hack,,,,,A2600NTSC,,,b83df1f32b4539c324bdf94851b4db55, -Oscar's Trash Race,,,Prototype,,CX26101,,,A2600NTSC,Keypad,Keypad,fa1b060fd8e0bca0c2a097dcffce93d3, -Oscar's Trash Race,Atari,,,,CX26101,Rare,,A2600PAL,Keypad,Keypad,47911752bf113a2496dbb66c70c9e70c, -Othello (32-in-1),Atari,Ed Logg,,1978,,,,A2600PAL,,,6468d744be9984f2a39ca9285443a2b2, -Othello,Atari,Ed Logg,,1978,,,,A2600PAL,,,7d9c96b215d1941e87b6fb412eb9204f, -Othello,Atari,Ed Logg,,1978,CX2639,Rare,,A2600NTSC,,,113cd09c9771ac278544b7e90efe7df2, -Othello,Atari,Ed Logg,,1978,CX2639,Rare,,A2600NTSC,,,2c3b9c171e214e9e46bbaa12bdf8977e, -Othello,Atari,Ed Logg,,1978,CX2639,Rare,,A2600NTSC,,,55949cb7884f9db0f8dfcf8707c7e5cb, -Othello,Atari,Ed Logg,,1978,CX2639,Rare,,A2600PAL,,,00e19ebf9d0817ccfb057e262be1e5af, -Out of Control,Avalon Hill,,,,,Rare,,A2600NTSC,,,f97dee1aa2629911f30f225ca31789d4, -Outlaw (32-in-1),Atari,David Crane,,,,,,A2600PAL,,,2e3728f3086dc3e71047ffd6b2d9f015, -Outlaw - GunSlinger,Atari,David Crane,,1978,CX2605,Uncommon,,A2600NTSC,,,890c13590e0d8d5d6149737d930e4d95, -Outlaw - GunSlinger,Atari,David Crane,,1978,CX2605,Uncommon,,A2600NTSC,,,f060826626aac9e0d8cda0282f4b7fc3, -Outlaw - GunSlinger,Atari,David Crane,,1978,CX2605,Uncommon,,A2600PAL,,,22675cacd9b71dea21800cbf8597f000, -Overhead Adventure Demo 1,,,,,,,,A2600NTSC,,,1ec5bef77b91e59313cba205f15b06d7, -Overhead Adventure Demo 2,,,,,,,,A2600NTSC,,,4066d7d88ec4a2c656127a67fa52dcf1, -Overhead Adventure Demo 3,,,,,,,,A2600NTSC,,,3c7a96978f52b2b15426cdd50f2c4048, -Overhead Adventure Demo 4,,,,,,,,A2600NTSC,,,0cfdd2f3b243cac21f38a0f09f54bead, -Overhead Adventure Demo 5,,,,,,,,A2600NTSC,,,d5aa7472e7f2cc17e893a1a36f8dadf0, -Overhead Adventure Demo 6,,,,,,,,A2600NTSC,,,f45644ff82b533a781a1ee50f2e95f3c, -Oystron (V2.7),,,Homebrew,,,,,A2600NTSC,,,26f4f8b098609164effef7809e0121e1,http://www.io.com/~nickb/atari/oystron.html -Oystron (V2.8),,,Homebrew,,,,,A2600NTSC,,,e6508b878145187b87b9cded097293e7,http://www.io.com/~nickb/atari/oystron.html -Oystron (V2.82),,,Homebrew,,,,,A2600NTSC,,,70d14c66c319683b4c19abbe0e3db57c,http://www.io.com/~nickb/atari/oystron.html -Oystron (V2.85),,,Homebrew,,,,,A2600NTSC,,,5360693f1eb90856176bd1c0a7b17432,http://www.io.com/~nickb/atari/oystron.html -Oystron (V2.9),,,Homebrew,1997,,,,A2600NTSC,,,91f0a708eeb93c133e9672ad2c8e0429,http://www.io.com/~nickb/atari/oystron.html -Oystron X,,,Homebrew,,,,,A2600NTSC,,,aa2c4b32656bde9a75042a4d158583e1,http://www.io.com/~nickb/atari/oystron.html -PC Invaders,,Matthias Jaap,Hack,,,,,A2600NTSC,,,6ac3fd31a51730358708c7fdc62487f8, -PCMSG 2.0,,,,,,,,A2600NTSC,,,59135f13985b84c4f13cc9e55eec869a,http://www.io.com/~nickb/atari/oystron.html -PCMSG 2.2,,,,,,,,A2600NTSC,,,585600522b1f22f617652c962e358a5d,http://www.io.com/~nickb/atari/oystron.html -PCMSG 2.3,,,,,,,,A2600NTSC,,,e609e8a007127b8fcff79ffc380da6b1,http://www.io.com/~nickb/atari/oystron.html -PCMSG 2.4,,,,,,,,A2600NTSC,,,50ef88f9a5e0e1e6b86e175362a27fdb,http://www.io.com/~nickb/atari/oystron.html -PCMSG 2.5,,,,,,,,A2600NTSC,,,157356f80c709ab675961d8b8b207e20,http://www.io.com/~nickb/atari/oystron.html -PCMSG 2.6 (Oystron Pre-release demo),,,Homebrew,,,,,A2600NTSC,,,4689081b7363721858756fe781cc7713,http://www.io.com/~nickb/atari/oystron.html -PIEROXM Demo,,,,,,,,A2600NTSC,,,9c7fa3cfcaaafb4e6daf1e2517d43d88, -Pac Ghost Sprite Demo 2,,,,,,,,A2600NTSC,,,bd430c2193045c68d1a20a018a976248, -Pac Ghost Sprite Demo,,,,,,,,A2600NTSC,,,d0498baca989e792db4b8270a02b9624, -Pac Invaders,ZUT,,,,,,,A2600NTSC,,,f9da42f91a1c5cfa344d2ff440c6f8d4, -Pac Kong,,,,,,Extremely Rare,,A2600PAL,,,936ef1d6f8a57b9ff575dc195ee36b80, -Pac Kong,Funvision,,,,,Extremely Rare,,A2600PAL,,,88d300a38bdd7cab9edad271c18cd02b, -Pac Kong,Goliath,,,,,,,A2600PAL,,,f14d5e96ec3380aef57a4b70132c6677, -Pac Kong,Starsoft,,,,,,,A2600PAL,,,d223bc6f13358642f02ddacfaf4a90c9, -Pac-2600,,,Hack,,,,,A2600NTSC,,,ebf9038e927e6a0db3e0d170c59911e6, -Pac-Law,,Jim Goebel,Hack,,,,,A2600NTSC,,,a4b99aa5ed85cfdb7d101923147de035, -Pac-Man Collection,,Bob DeCrescenzo,Homebrew,2006,,,,A7800NTSC,,,5d7bc7092de69095137456733e7b685d,http://www.atariage.com/software_page.html?SoftwareID=4086 -Pac-Man,,Rob Kudla,Hack,,,,,A2600NTSC,,,aeb104f1e7b166bc0cbaca0a968fde51,http://www.atariage.com/manual_thumbs.html?SoftwareID=1193 -Pac-Man,Atari,Tod Frye,,,CX2646,Common,,A2600PAL,,,c2410d03820e0ff0a449fa6170f51211,http://www.atariage.com/manual_thumbs.html?SoftwareID=1193 -Pac-Man,Atari,Tod Frye,,,CX2646,Common,,A2600PAL,,,fc2233fc116faef0d3c31541717ca2db,http://www.atariage.com/manual_thumbs.html?SoftwareID=1193 -Pac-Man,Atari,Tod Frye,,1981,CX2646,Common,,A2600NTSC,,,6e372f076fb9586aff416144f5cfe1cb,http://www.atariage.com/manual_thumbs.html?SoftwareID=1193 -Pac-Man,CCE,Tod Frye,,,,,,A2600NTSC,,,ca53fc8fd8b3c4a7df89ac86b222eba0,http://www.atariage.com/manual_thumbs.html?SoftwareID=1193 -Pac-Man,CCE,Tod Frye,,,,,,A2600PAL,,,651d2b6743a3a18b426bce2c881af212,http://www.atariage.com/manual_thumbs.html?SoftwareID=1193 -Pac-Space,,,,,,,,A2600NTSC,,,c569e57dca93d3bee115a49923057fd7, -PacArcade,,,Homebrew,2011,,,A7816,A7800NTSC,,,90223a8a363bdf643a19d0f97e63b1b2, -Panda Chase,HomeVision,,,,,Extremely Rare,,A2600NTSC,,,f8582bc6ca7046adb8e18164e8cecdbc, -Parachute,HomeVision,,,,,Extremely Rare,,A2600PAL,,,714e13c08508ee9a7785ceac908ae831, -Parachute,HomeVision,Thomas Jentzsch,Hack,,,,,A2600NTSC,,,245f07c8603077a0caf5f83ee6cf8b43, -Peek-A-Boo,,,Prototype,,CX26137,,,A2600NTSC,,,e40a818dac4dd851f3b4aafbe2f1e0c1, -Pengo (1 player only),,,,,CX2690,Extremely Rare,A8K,A2600NTSC,,,04014d563b094e79ac8974366f616308, -Pengo,,,,,CX2690,Extremely Rare,A8K,A2600NTSC,,,4bcc7f6ba501a26ee785b7efbfb0fdc8, -Pepsi Invaders,Coca Cola,,Prototype,,,,,A2600NTSC,,,212d0b200ed8b45d8795ad899734d7d7, -Pete Rose Baseball,Absolute,,,1989,AV-045,Scarce,,A7800PAL,,,386bded4a944bae455fedf56206dd1dd,http://www.atariage.com/manual_thumbs.html?SoftwareID=2172 -Pete Rose Baseball,Absolute,Alex DeMeo,,,AK-045,Rare,A16K,A2600NTSC,,,09388bf390cd9a86dc0849697b96c7dc, -Pete Rose Baseball,Absolute,Alex DeMeo,,1989,AV-045,Scarce,,A7800NTSC,,,1a5207870dec6fae9111cb747e20d8e3,http://www.atariage.com/manual_thumbs.html?SoftwareID=2172 -Peter Penguin,ITT,Jagt auf Diamanten-Frisco,,,,,,A2600PAL,,,cb4a7b507372c24f8b9390d22d54a918, -Phantom Panzer II,Starsoft,,,,,,,A2600PAL,,,08bd4c1dcc843f6a0b563d9fd80b3b11, -Phantom Tank,Bitcorp,,,,PG203,Rare,,A2600PAL,,,6b1fc959e28bd71aed7b89014574bdc2, -Phantom Tank,Bitcorp,,,,PG203,Rare,,A2600PAL,,,7454786af7126ccc7a0c31fcf5af40f1, -Phantom Tank,CCE,,,,,,,A2600PAL,,,5a9d188245aff829efde816fcade0b16, -Phantom UFO,,,,,,,,A2600PAL,,,4d38e1105c3a5f0b3119a805f261fcb5, -Pharaoh's Curse,TechnoVision,,,,,,,A2600PAL,,,a69f5b1761a8a11c98e706ec7204937f, -Pharaoh's Curse,TechnoVision,,,,,Extremely Rare,,A2600PAL,,,3577e19714921912685bb0e32ddf943c, -Pharaoh's Curse,TechnoVision,Thomas Jentzsch,Hack,,,,,A2600NTSC,,,2ae700c9dba843a68dfdca40d7d86bd6, -Pharoah's Curse,TechnoVision,,Hack,,,Extremely Rare,,A2600PAL,,,62f74a2736841191135514422b20382d, -Philly Flasher,Playaround,,,,,Extremely Rare,,A2600NTSC,,,ca54de69f7cdf4d7996e86f347129892, -Phoenix,Atari,,,,CX2673,Common,A8K,A2600PAL,,,79fcdee6d71f23f6cf3d01258236c3b9, -Phoenix,Atari,,,1982,CX2673,Common,A8K,A2600NTSC,,,7e52a95074a66640fcfde124fffd491a, -Phoenix,CCE,,,,,,A8K,A2600NTSC,,,a00ec89d22fcc0c1a85bb542ddcb1178, -Pick 'n Pile,Salu,,,1990,,Extremely Rare,,A2600PAL,,,da79aad11572c80a96e261e4ac6392d0, -Picnic,US Games,,,1982,VC 2004,Extremely Rare,,A2600NTSC,,,17c0a63f9a680e7a61beba81692d9297, -Piece o' Cake,US Games,,,1982,VC 2005,Extremely Rare,,A2600NTSC,Paddles,Paddles,d3423d7600879174c038f53e5ebbf9d3, -Pigs in Space starring Miss Piggy,Atari,,,,CX26114,Extremely Rare,,A2600NTSC,,,8e4fa8c6ad8d8dce0db8c991c166cdaa, -Pigs in Space starring Miss Piggy,Atari,,,,CX26114,Extremely Rare,,A2600PAL,,,95e1d834c57cdd525dd0bd6048a57f7b, -Pink Floyd,,Kyle Pittman,Hack,,,,,A2600NTSC,,,dbc7485ad5814d466de780a3e7ed3b46, -Pitfall 2 Plus,,,Hack,,,,DPC,A2600NTSC,,,39a6a5a2e1f6297cceaa48bb03af02e9,http://www.atariage.com/manual_thumbs.html?SoftwareID=1206 -Pitfall 2,Activision,David Crane,,1984,AB-035-04,Rare,DPC,A2600PAL,,,e34c236630c945089fcdef088c4b6e06,http://www.atariage.com/manual_thumbs.html?SoftwareID=1206 -Pitfall II - Lost Caverns,Activision,David Crane,,1984,AB-035-04,Rare,DPC,A2600NTSC,,,48eb1fcde4caf6a2dce059c98bd2e375,http://www.atariage.com/manual_thumbs.html?SoftwareID=1206 -Pitfall II - Lost Caverns,Activision,David Crane,,1984,AB-035-04,Rare,DPC,A2600NTSC,,,6d842c96d5a01967be9680080dd5be54,http://www.atariage.com/manual_thumbs.html?SoftwareID=1206 -Pitfall II - Lost Caverns,Activision,David Crane,,1984,AB-035-04,Rare,DPC,A2600NTSC,,,f939780714db69dc69a80fbefe350e0d,http://www.atariage.com/manual_thumbs.html?SoftwareID=1206 -Pitfall! (Beta),Activision,David Crane,Prototype,1982,AX-018,,,A2600NTSC,,,aad91be0bf78d33d29758876d999848a,http://www.atariage.com/manual_thumbs.html?SoftwareID=1206 -Pitfall! (No Walls),,,Hack,,,,,A2600NTSC,,,e42b937c30c617241ca9e01e4510c3f6,http://www.atariage.com/manual_thumbs.html?SoftwareID=1207 -Pitfall!,,,Hack,1985,,,,A2600NTSC,,,5bbab3f3e4b47e3e23f9820765dbb45c,http://www.atariage.com/manual_thumbs.html?SoftwareID=1207 -Pitfall!,Activision,David Crane,,1982,AB-035-04,Rare,,A2600PAL,,,791bc8aceb6b0f4d9990d6062b30adfa,http://www.atariage.com/manual_thumbs.html?SoftwareID=1207 -Pitfall!,Activision,David Crane,,1982,AX-018,Common,,A2600NTSC,,,3e90cf23106f2e08b2781e41299de556,http://www.atariage.com/manual_thumbs.html?SoftwareID=1207 -Pitfall!,Activision,David Crane,,1982,AX-018,Common,,A2600NTSC,,,6fd7c7057eeab273b29c7aafc7429a96,http://www.atariage.com/manual_thumbs.html?SoftwareID=1207 -Pitfall!,CCE,David Crane,,,AX-018,Common,,A2600NTSC,,,f73d2d0eff548e8fc66996f27acf2b4b,http://www.atariage.com/manual_thumbs.html?SoftwareID=1207 -Pitfighter,Atari,,Prototype,1984,,,A78S4,A7800NTSC,,,05f43244465943ce819780a71a5b572a, -Pizza Chef,CCE,,,,,,,A2600NTSC,,,82efe7984783e23a7c55266a5125c68e, -Planet Invaders,Atari,Charles Morgan,Hack,,,,,A2600NTSC,,,ae10527840a1ac24de43730645ed508d, -Planet Patrol,,,,1982,,,,A2600PAL,,,aafc79ffc32c4c9b2d73c8ada7602cfe, -Planet Patrol,CCE,,,,,,,A2600NTSC,,,79004f84bdeee78d142e445057883169, -Planet Patrol,Play Video,,,1982,,,,A2600PAL,,,bb745c893999b0efc96ea9029e3c62ca, -Planet Patrol,Spectravideo,,,,SA-202,Rare,,A2600PAL,,,d6acff6aed0f04690fe4024d58ff4ce3, -Planet Patrol,Spectravision,,,1982,SA-202,Rare,,A2600NTSC,,,043f165f384fbea3ea89393597951512, -Planet Patrol,Spectravision,,,1982,SA-202,Rare,,A2600PAL,,,69fac82cd2312dd9ce5d90e22e2f070a, -Planet Smashers,Atari,James V. Zalewski,,1990,CX7868,Rare,A78SG,A7800NTSC,,,33aea1e2b6634a1dec8c7006d9afda22,http://www.atariage.com/manual_thumbs.html?SoftwareID=2173 -Planet Smashers,Atari,James V. Zalewski,,1990,CX7868,Rare,A78SG,A7800PAL,,,2837a8fd49b7fc7ccd70fd45b69c5099,http://www.atariage.com/manual_thumbs.html?SoftwareID=2173 -Planet of the Apes,20th Century Fox,,Prototype,,,,,A2600NTSC,,,9efb4e1a15a6cdd286e4bcd7cd94b7b8, -Plaque Attack,Activision,Steve Cartwright,,,AX-027,Rare,,A2600PAL,,,3eccf9f363f5c5de0c8b174a535dc83b, -Plaque Attack,Activision,Steve Cartwright,,1983,AX-027,Rare,,A2600NTSC,,,32244e55ce6ec6bfbd763f33384bdc2e, -Plaque Attack,Activision,Steve Cartwright,,1983,AX-027,Rare,,A2600NTSC,,,da4e3396aa2db3bd667f83a1cb9e4a36, -Plaque Attack,Activision,Steve Cartwright,,1983,AX-027,Rare,,A2600PAL,,,7ced6709f091e79a2ab9575d3516a4ac, -Plaque Attack,CCE,Steve Cartwright,,,,,,A2600NTSC,,,de24f700fd28d5b8381de13abd091db9, -Plutos,Tynesoft,David Peacock & Kevin Franklin & Michael Owens,Prototype Hack,,,,A78SGR,A7800NTSC,,,86546808dc60961cdb1b20e761c50ab1,http://www.atariage.com/software_page.html?SoftwareLabelID=2764 -Polaris,Tigervision,,,,7-007,Extremely Rare,TV8K,A2600NTSC,,,ee8e2aa00e3a9cf1238157cbcff7de74, -Polaris,Tigervision,,,,7-007,Extremely Rare,TV8K,A2600PAL,,,203049f4d8290bb4521cc4402415e737, -Polaris,Tigervision,,Prototype,,,,TV8K,A2600NTSC,,,44f71e70b89dcc7cf39dfd622cfb9a27, -Polaris,Tigervision,Thomaz Jentzsch,Hack,,,,TV8K,A2600NTSC,,,87bea777a34278d29b3b6029833c5422, -Pole Position II,Atari,,,1987,CX7808,Common,,A7800NTSC,,,584582bb09ee8122e7fc09dc7d1ed813,http://www.atariage.com/manual_thumbs.html?SoftwareID=2145 -Pole Position II,Atari,,,1987,CX7808,Common,,A7800PAL,,,865457e0e0f48253b08f77b9e18f93b2,http://www.atariage.com/manual_thumbs.html?SoftwareID=2145 -Pole Position,Atari,,,,CX2694,Common,,A2600NTSC,,,56606b4d9109e2db36dea47cf7c8cca6, -Pole Position,Atari,,,,CX2694,Common,,A2600NTSC,,,5f39353f7c6925779b0169a87ff86f1e, -Pole Position,Atari,,,,CX2694,Common,,A2600PAL,,,b56264f738b2eb2c8f7cf5a2a75e5fdc, -Pole Position,CCE,,,,,,,A2600NTSC,,,3225676f5c0c577aeccfaa7e6bedd765, -Polo,Atari,,Prototype,,,,,A2600NTSC,,,14b1e30982962c72f426e2e763eb4274, -Polo,Atari,,Prototype,,,,,A2600NTSC,,,ee28424af389a7f3672182009472500c, -Pompeii,Apollo,,Prototype,,,,,A2600NTSC,,,a83b070b485cf1fb4d5a48da153fdf1a, -Pooyan,Konami-Gakken,,,1982,,,,A2600PAL,,,668dc528b7ea9345140f4fcfbecf7066, -Pooyan,Konami-Gakken,,,1982,,,,A2600PAL,,,89afff4a10807093c105740c73e9b544, -Pooyan,Konami-Gakken,,,1982,,Extremely Rare,,A2600NTSC,,,4799a40b6e889370b7ee55c17ba65141, -Popeye,Parker Bros,,,1983,PB5370,Common,PB8K,A2600NTSC,,,c7f13ef38f61ee2367ada94fdcc6d206, -Popeye,Parker Bros,,,1983,PB5370,Common,PB8K,A2600PAL,,,e9cb18770a41a16de63b124c1e8bd493, -Porky's,20th Century Fox,,,1983,11013,Rare,,A2600NTSC,,,f93d7fee92717e161e6763a88a293ffa, -Pressure Cooker,Activision,Garry Kitchen,,1983,AZ-032,Rare,,A2600NTSC,,,97d079315c09796ff6d95a06e4b70171, -Pressure Cooker,Activision,Garry Kitchen,,1983,AZ-032,Rare,,A2600PAL,,,525ea747d746f3e80e3027720e1fa7ac, -Pressure Cooker,CCE,Garry Kitchen,,,,,,A2600NTSC,,,027a59a575b78860aed780b2ae7d001d, -Pressure Gauge 2 Beta,,,Homebrew,,,,,A2600NTSC,,,6a03c28d505bab710bf20b954e14d521, -Pressure Gauge,,,Homebrew,,,,,A2600NTSC,,,30997031b668e37168d4d0e299ccc46f, -Pressure Gauge,,,Homebrew,,,,,A2600NTSC,,,de1a636d098349be11bbc2d090f4e9cf, -Private Eye,Activision,Bob Whitehead,,1983,AG-034-04,Rare,,A2600NTSC,,,bc24440b59092559a1ec26055fd1270e, -Private Eye,Activision,Bob Whitehead,,1983,AG-034-04,Rare,,A2600NTSC,,,ef3a4f64b6494ba770862768caf04b86, -Private Eye,Activision,Bob Whitehead,,1983,AG-034-04,Rare,,A2600PAL,,,1266b3fd632c981f3ef9bdbf9f86ce9a, -Private Eye,CCE,Bob Whitehead,,,,,,A2600NTSC,,,f9cef637ea8e905a10e324e582dd39c2, -Pro Wrestling,Absolute-Activision,,,,,,,A2600PAL,,,ec5d04b7e6cc6641d74d3ba7bb41ebc9, -Purple Bar Demo 2,,,Homebrew,,,,,A2600NTSC,,,9ca2deb61318eba4fb784d4bf7441d8b, -Purple Bar Demo,,,Homebrew,,,,,A2600NTSC,,,22f6b40fc82110d68e50a1208ae0bb97, -Purple Cross Demo,,,Homebrew,,,,,A2600NTSC,,,6e19428387686a77d8c8d2f731cb09e0, -Puzzle,,Colin Hughes,Homebrew,,,,,A2600NTSC,,,679d30c7886b283cbe1db4e7dbe5f2a6, -Puzzled World,,Cooper Black,,,,,,A2600PAL,,,8108ad2679bd055afec0a35a1dca46a4, -Pygmy,Starsoft,,,,,,,A2600PAL,,,3ff5165378213dab531ffa4f1a41ae45, -Pyramid War (a.k.a. Wuestenschlacht),Rainbow Vision,,,,,,,A2600PAL,,,5c0520c00163915a4336e481ca4e7ef4, -Pyramid War,Suntek,,,,4,Extremely Rare,,A2600PAL,,,37fd7fa52d358f66984948999f1213c5, -Q-bert's Qubes,Parker Bros,,,1983,PB5550,Extremely Rare,PB8K,A2600NTSC,,,517592e6e0c71731019c0cebc2ce044f, -Q-bert's Qubes,Parker Bros,,,1983,PB5550,Extremely Rare,PB8K,A2600NTSC,,,72b8dc752befbfb3ffda120eb98b2dd0, -Q-bert,,,Homebrew,2005,,,A7832,A7800NTSC,,,66e7230f7ef9d14db82d76b06b241bc0, -Q-bert,Atari,,,,CX26150,Rare,,A2600NTSC,,,484b0076816a104875e00467d431c2d2, -Q-bert,Atari,,,,CX26150,Rare,,A2600PAL,,,eb6d6e22a16f30687ade526d7a6f05c5, -Q-bert,Parker Bros,,,1983,PB5360,Common,,A2600PAL,,,1ede4f365ce1386d58f121b15a775e24, -Q-bert,Parker Bros,,,1983,PB5360,Common,,A2600PAL,,,8b40a9ca1cfcd14822e2547eaa9df5c1, -Qb (0.01),Retroactive,,,,,,,A2600NTSC,,,cff1e9170bdbc29859b815203edf18fa, -Qb (0.03),Retroactive,,,,,,,A2600NTSC,,,c482f8eebd45e0b8d479d9b71dd72bb8, -Qb (0.04),Retroactive,,,,,,,A2600NTSC,,,d787ec6785b0ccfbd844c7866db9667d, -Qb (0.05) (Mac),Retroactive,,,,,,,A2600NTSC,,,35fa32256982774a4f134c3347882dff, -Qb (0.05),Retroactive,,,,,,,A2600NTSC,,,cf0c593c563c84fdaf0f741adb367445, -Qb (0.06),Retroactive,,,,,,,A2600NTSC,,,b15026b43c6758609667468434766dd8, -Qb (0.10) (Stella-compatable),Retroactive,,,,,,,A2600NTSC,,,d010e3dfe7366e47561c088079a59439, -Qb (0.10),Retroactive,,,,,,,A2600NTSC,,,8712cceec5644aacc2c21203d9ebe2ec, -Qb (0.10),Retroactive,,,,,,,A2600PAL,,,4233eb824c2b4811abef9b6d00355ae9, -Qb (0.11) (Stella-compatable),Retroactive,,,,,,,A2600NTSC,,,376944889dcfa96c73d3079f308e3d32, -Qb (0.11),Retroactive,,,,,,,A2600NTSC,,,6803fa7c2c094b428b859a58dc1dd06a, -Qb (0.11),Retroactive,,,,,,,A2600PAL,,,5a5390f91437af9951a5f8455b61cd43, -Qb (0.12) (Stella-compatable),Retroactive,,,,,,,A2600NTSC,,,cdc1a5c61d7488eadc9aba36166b253d, -Qb (0.12),Retroactive,,,,,,,A2600NTSC,,,0906c6e0e4bda9c10cfa4c5fc64d2f4b, -Qb (0.12),Retroactive,,,,,,,A2600PAL,,,ae682886058cd6981c4b8e93e7b019cf, -Qb (1.00) (Stella-compatable),Retroactive,,,,,,,A2600NTSC,,,7bc4fd254ec8c0a25a13f02fd3f762ff, -Qb (1.00),Retroactive,,,,,,,A2600NTSC,,,8b504b417c8626167a7e02f44229f0e7, -Qb (1.00),Retroactive,,,,,,,A2600PAL,,,8fffc8f15bb2e6d24e211884a5479aa5, -Qb (1.01),Retroactive,,,,,,,A2600NTSC,,,8ccaa442d26b09139685f5b22bf189c4, -Qb (2.00) (Stella-compatable),Retroactive,,,,,,,A2600NTSC,,,f33f1d0f7819c74148dacb48cbf1c597, -Qb (2.00),Retroactive,,,,,,,A2600NTSC,,,d0e9beb2347595c6c7d158e9d83d2da8, -Qb (2.00),Retroactive,,,,,,,A2600PAL,,,c866c995c0d2ca7d017fef0fc0c2e268, -Qb (2.03),Retroactive,,,,,,,A2600NTSC,,,98ccd15345b1aee6caf51e05955f0261, -Qb (2.03),Retroactive,,,,,,,A2600PAL,,,4c030667d07d1438f0e5c458a90978d8, -Qb (2.04) (Stella-compatable),Retroactive,,,,,,,A2600NTSC,,,4dd6c7ab9ef77f2b4950d8fc7cd42ee1, -Qb (2.04),Retroactive,,,,,,,A2600NTSC,,,ce64812eb83c95723b04fb56d816910b, -Qb (2.04),Retroactive,,,,,,,A2600PAL,,,eb9712e423b57f0b07ccd315bb9abf61, -Qb (2.05),Retroactive,,,,,,,A2600NTSC,,,659a20019de4a23c748ec2292ea5f221, -Qb (2.05),Retroactive,,,,,,,A2600PAL,,,c92cfa54b5d022637fdcbdc1ef640d82, -Qb (2.06) (Stella),Retroactive,,,,,,,A2600NTSC,,,e800e4aec7c6c54c9cf3db0d1d030058, -Qb (2.06),Retroactive,,,,,,,A2600NTSC,,,2e0aed5bb619edcefa3fafb4fbe7c551, -Qb (2.06),Retroactive,,,,,,,A2600PAL,,,05eb4347f0ec8f4783983ca35ffd8d1b, -Qb (2.07) (Stella-compatable),Retroactive,,,,,,,A2600NTSC,,,cea9f72036dc6f7af5eff52459066290, -Qb (2.07),Retroactive,,,,,,,A2600NTSC,,,3a51a6860848e36e6d06ffe01b71fb13, -Qb (2.07),Retroactive,,,,,,,A2600PAL,,,fae0b86934a7c5a362281dffebdb43a0, -Qb (2.08) (Stella-compatable),Retroactive,,,,,,,A2600NTSC,,,318046ae3711c05fd16e479b298e5fcc, -Qb (2.08) (Test Jump),Retroactive,,,,,,,A2600NTSC,,,dcba0e33aa4aed67630a4b292386f405, -Qb (2.08),Retroactive,,,,,,,A2600NTSC,,,57a66b6db7efc5df17b0b0f2f2c2f078, -Qb (2.08),Retroactive,,,,,,,A2600PAL,,,876a953daae0e946620cf05ed41989f4, -Qb (2.09) (Stella-compatable),Retroactive,,,,,,,A2600NTSC,,,67ce6cdf788d324935fd317d064ed842, -Qb (2.09),Retroactive,,,,,,,A2600NTSC,,,e2389c0be5b5b84e0d3ca36ec7e67514, -Qb (2.09),Retroactive,,,,,,,A2600PAL,,,008543ae43497af015e9428a5e3e874e, -Qb (2.11) (Stella-compatable),Retroactive,,,,,,,A2600NTSC,,,2808dc745ff4321dc5c8122abef6711f, -Qb (2.11),Retroactive,,,,,,,A2600NTSC,,,67bd3d4dc5ac6a42a99950b4245bdc81, -Qb (2.11),Retroactive,,,,,,,A2600PAL,,,283dee88f295834c4c077d788f151125, -Qb (2.12) (Stella-compatable),Retroactive,,,,,,,A2600NTSC,,,94e4c9b924286038527f49cdc20fda69, -Qb (2.12),Retroactive,,,,,,,A2600NTSC,,,35163b56f4a692a232ae96ad3e23310f, -Qb (2.12),Retroactive,,,,,,,A2600PAL,,,b3017e397f74efd53caf8fae0a38e3fe, -Qb (2.14) (Stella-compatable),Retroactive,,,,,,,A2600NTSC,,,52e1954dc01454c03a336b30c390fb8d, -Qb (2.14),Retroactive,,,,,,,A2600NTSC,,,6e5d5ba193d2540aec2e847aafb2a5fb, -Qb (2.14),Retroactive,,,,,,,A2600PAL,,,4f634893d54e9cabe106e0ec0b7bdcdf, -Qb (2.15) (Stella-compatable),Retroactive,,,,,,,A2600NTSC,,,34e37eaffc0d34e05e40ed883f848b40, -Qb (2.15),Retroactive,,,,,,,A2600NTSC,,,ac53b83e1b57a601eeae9d3ce1b4a458, -Qb (2.15),Retroactive,,,,,,,A2600PAL,,,9281eccd7f6ef4b3ebdcfd2204c9763a, -Qb (Early Development 1),Retroactive,,,,,,,A2600NTSC,,,78963290052fd17c6c7998305ab3a6a0, -Qb (Early Development 2),Retroactive,,,,,,,A2600NTSC,,,9d2f05d0fe8b2dfcf770b02eda066fc1, -Qb (Early Development 3),Retroactive,,,,,,,A2600NTSC,,,96f806fc62005205d851e758d050dfca, -Qb (Release Candidate #1) (Stella-Compatable),Retroactive,,,,,,,A2600NTSC,,,c504a71c411a601d1fc3173369cfdca4, -Qb (Release Candidate #1),Retroactive,,,,,,,A2600NTSC,,,17512d0c38f448712f49f36f9d185c4e, -Qb (Release Candidate #1),Retroactive,,,,,,,A2600PAL,,,ae0d4f3396cb49de0fabdff03cb2756f, -Quadrun,Atari,,,,CX2686,Extremely Rare,,A2600NTSC,,,392d34c0498075dd58df0ce7cd491ea2, -Quest (Early Version),,Chris Larkin,Homebrew,,,,,A2600NTSC,,,152c253478b009c275e18cd731b48561, -Quest for Quintana Roo,Sunrise,,,,6057 A227,Extremely Rare,,A2600NTSC,,,a0675883f9b09a3595ddd66a6f5d3498, -Quest for Quintana Roo,Telegames,,,,,,,A2600PAL,,,f736864442164b29235e8872013180cd, -Quick Step!,Imagic,Dave Johnson,,1983,O3211,Rare,,A2600NTSC,,,7eba20c2291a982214cc7cbe8d0b47cd, -Quick Step!,Imagic,Dave Johnson,,1983,O3211,Rare,,A2600PAL,,,84290e333ff7567c2380f179430083b8, -Quick Step!,Imagic,Dave Johnson,,1983,O3211,Rare,,A2600PAL,,,e72ee2d6e501f07ec5e8a0efbe520bee, -RUN Platform Demo,,,,,,,,A2600NTSC,,,0f341d1f4e144e3163d9a5fc5a662b79, -Race Demo,,,,,,,,A2600NTSC,,,1a23540d91f87584a04f184304a00648, -Racquetball,Apollo,,,1981,AP 2003,Uncommon,,A2600NTSC,,,a20d931a8fddcd6f6116ed21ff5c4832, -Racquetball,Apollo,,,1981,AP 2003,Uncommon,,A2600NTSC,,,cbced209dd0575a27212d3eee6aee3bc, -Rad Action Pak - Kung-Fu -Frostb -Freeway,HES,,,1990,,,,A2600PAL,,,56300ed31fef018bd96768ccc982f7b4, -Radar Lock,Atari,,,1989,CX26176,Rare,A16KR,A2600NTSC,,,baf4ce885aa281fd31711da9b9795485, -Radar Lock,Atari,,,1989,CX26176,Rare,A16KR,A2600PAL,,,04856e3006a4f5f7b4638da71dad3d88, -Radar,CCE,,,,,,,A2600PAL,,,247fa1a29ad90e64069ee13d96fea6d6, -Radial Pong (Version 10),,Jeffry Johnston,Homebrew,,,,,A2600NTSC,,,0f14c03050b35d6b1d8850b07578722d, -Radial Pong (Version 11),,Jeffry Johnston,Homebrew,,,,,A2600NTSC,,,43f33c6dfdeaf5138ce6e6968ad7c5ce, -Radial Pong (Version 2),,Jeffry Johnston,Homebrew,,,,,A2600NTSC,,,6337927ad909aa739d6d0044699a916d, -Radial Pong (Version 3),,Jeffry Johnston,Homebrew,,,,,A2600NTSC,,,f1e375d921858467166e53bcec05803f, -Radial Pong (Version 4),,Jeffry Johnston,Homebrew,,,,,A2600NTSC,,,481f9a742052801cc5f3defb41cb638e, -Radial Pong (Version 5),,Jeffry Johnston,Homebrew,,,,,A2600NTSC,,,fd9b321cee5fbb32c39ba3ca5d9ec7cf, -Radial Pong (Version 6),,Jeffry Johnston,Homebrew,,,,,A2600NTSC,,,64b8e19c767191ccdc97acc6904c397b, -Radial Pong (Version 7),,Jeffry Johnston,Homebrew,,,,,A2600NTSC,,,2450dfa1df70d12b60683185775efed8, -Radial Pong (Version 8),,Jeffry Johnston,Homebrew,,,,,A2600NTSC,,,9f9ee0f60c119c831e80694b6678ca1a, -Radial Pong (Version 9),,Jeffry Johnston,Homebrew,,,,,A2600NTSC,,,05824fcbe615dbca836d061a140a50e0, -Radial Pong (initial version),,Jeffry Johnston,Homebrew,,,,,A2600NTSC,,,200309c8fba0f248c13751ed4fc69bab, -Raft Rider,US Games,,,1982,VC 2006,Extremely Rare,,A2600NTSC,,,92a1a605b7ad56d863a56373a866761b, -Raiders of the Lost Ark,Atari,Howard Scott Warshaw,,1982,CX2659,Common,A8K,A2600NTSC,,,f724d3dd2471ed4cf5f191dbb724b69f,http://www.atariage.com/manual_html_page.html?SoftwareID=1240 -Raiders of the Lost Ark,Atari,Howard Scott Warshaw,,1982,CX2659,Common,A8K,A2600PAL,,,1cafa9f3f9a2fce4af6e4b85a2bbd254,http://www.atariage.com/manual_html_page.html?SoftwareID=1240 -Rainbow Invaders (half complete),,Silvio Mogno,Homebrew,,,,,A2600NTSC,,,8f98519a91dbbf4864f135a10050d9ed, -Ram It,Telegames,,,1982,,,,A2600PAL,,,f2f2cb35fdef063c966c1f5481050ea2, -Ram It,Telegames,,,1982,1004,Extremely Rare,,A2600PAL,,,7096a198531d3f16a99d518ac0d7519a, -Rambo in Afghanistan,,Kyle Pittman,Hack,,,,,A2600NTSC,,,2eda6a49a49fcb2b674ea9e160b6a617, -Rampage!,Activision,Bob Polaro,,1989,AK-049,Rare,A16K,A2600NTSC,,,0cb3211ec39a66e225e8faa9fbdb0757,http://www.atariage.com/manual_thumbs.html?SoftwareLabelID=397 -Rampage!,Activision,Bob Polaro,,1989,AK-049,Rare,A16K,A2600NTSC,,,5e1b4629426f4992cf3b2905a696e1a7,http://www.atariage.com/manual_thumbs.html?SoftwareLabelID=397 -Rampage!,Activision,Bob Polaro,,1989,AK-049,Rare,A16K,A2600PAL,,,a11099b6ec24e4b00b8795744fb12005,http://www.atariage.com/manual_thumbs.html?SoftwareLabelID=397 -Rampage,Activision,,,1989,AM-049,Rare,A78AC,A7800NTSC,,,ac03806cef2558fc795a7d5d8dba7bc0,http://www.atariage.com/manual_thumbs.html?SoftwareID=2174 -Raumpatrouille,Starsoft,,,,,,,A2600PAL,,,ca50cc4b21b0155255e066fcd6396331, -Reactor,Parker Bros,,,1982,PB5330,Uncommon,,A2600NTSC,,,9f8fad4badcd7be61bbd2bcaeef3c58f, -Reactor,Parker Bros,,,1982,PB5330,Uncommon,,A2600PAL,,,4904a2550759b9b4570e886374f9d092, -RealSports Baseball,Atari,,,1982,CX2640,Uncommon,,A2600NTSC,,,eb634650c3912132092b7aee540bbce3, -RealSports Basketball,Atari,,Prototype,,,,,A2600PAL,,,8a183b6357987db5170c5cf9f4a113e5, -RealSports Basketball,Atari,Thomas Jentzsch,Prototype Hack,,,,,A2600NTSC,,,5524718a19107a04ec3265c93136a7b5, -RealSports Boxing,Atari,,,1987,CX26135,Uncommon,A16K,A2600NTSC,,,3177cc5c04c1a4080a927dfa4099482b, -RealSports Boxing,Atari,,,1987,CX26135,Uncommon,A16K,A2600PAL,,,4abb4c87a4c5f5d0c14ead2bb36251be, -RealSports Football,Atari,,,1982,CX2668,Common,,A2600NTSC,,,7ad257833190bc60277c1ca475057051, -RealSports Soccer,Atari,,,1983,CX2667,Uncommon,,A2600NTSC,,,08f853e8e01e711919e734d85349220d, -RealSports Soccer,Atari,,,1983,CX2667,Uncommon,,A2600PAL,,,b9336ed6d94a5cc81a16483b0a946a73, -RealSports Tennis,Atari,,,1983,CX2680,Uncommon,,A2600NTSC,,,dac5c0fe74531f077c105b396874a9f1, -RealSports Tennis,Atari,,,1983,CX2680,Uncommon,,A2600PAL,,,4e66c8e7c670532569c70d205f615dad, -RealSports Tennis,Atari,,,1983,CX2680,Uncommon,,A2600PAL,,,c7eab66576696e11e3c11ffff92e13cc, -RealSports Tennis,CCE,,,,,,,A2600NTSC,,,53b66f11f67c3b53b2995e0e02017bd7, -RealSports Volleyball,Atari,,,1982,CX2666,Uncommon,,A2600NTSC,,,aed0b7bd64cc384f85fdea33e28daf3b, -RealSports Volleyball,Atari,,,1982,CX2666,Uncommon,,A2600PAL,,,4ca0959f846d2beada18ecf29efe137e, -Realsports Baseball,Atari,,,1988,CX7834,Common,A78S4,A7800NTSC,,,383ed9bd1efb9b6cb3388a777678c928,http://www.atariage.com/manual_thumbs.html?SoftwareID=2146 -Red And White Checkerboard Demo,,,,,,,,A2600NTSC,,,a8d4a9500b18b0a067a1f272f869e094, -Red Pong Number 2 Demo 2,,,,,,,,A2600NTSC,,,79b649fb812c50b4347d12e7ddbb8400, -Red Pong Number 2 Demo,,,,,,,,A2600NTSC,,,874c76726f68c166fcfac48ce78eef95, -Register Twiddler Demo 2,,,,,,,,A2600NTSC,,,7450ae4e10ba8380c55b259d7c2b13e8, -Register Twiddler Demo,,,,,,,,A2600NTSC,,,eb9f8b84c193d9d93a58fca112aa39ed, -Rescue 1 Demo (This Planet Sucks proto),,,Homebrew,,,,,A2600NTSC,,,225522777dc7155627808bde0c1d0ef0, -Rescue 2 Demo (This Planet Sucks proto),,,Homebrew,,,,,A2600NTSC,,,8530caaaf40acbdcd118c282b5f8a37a, -Rescue 3 Demo (This Planet Sucks proto),,,Homebrew,,,,,A2600NTSC,,,7f790939f7eaa8c47a246c4283981f84, -Rescue 4 Demo (This Planet Sucks proto),,,Homebrew,,,,,A2600NTSC,,,e56da674188ba2f02c7a0a343a01236f, -Rescue Bira Bira,,Chris Cracknell,Hack,,,,,A2600NTSC,,,8a9d874a38608964f33ec0c35cab618d, -Rescue Terra I,Venture Vision,,,1982,VV2001,Extremely Rare,,A2600NTSC,,,60a61da9b2f43dd7e13a5093ec41a53d, -Rescue on Fractalus,Atari,,Prototype,,CX7816,,A7832,A7800NTSC,,,8f7eb10ad0bd75474abf0c6c36c08486,http://www.atariage.com/software_page.html?SoftwareLabelID=2693 -Resgate Espacial,CCE,,,,,,,A2600NTSC,,,42249ec8043a9a0203dde0b5bb46d8c4, -Return of Mario Bros.,,Philip R. Frey,Hack,,,,,A2600NTSC,,,5e1cd11a6d41fc15cf4792257400a31e, -Revenge of the Beefsteak Tomatoes,20th Century Fox,,,1983,11016,Rare,,A2600NTSC,,,4f64d6d0694d9b7a1ed7b0cb0b83e759, -Riddle of the Sphinx,Imagic,Bob Smith,,1982,IA3600,Uncommon,,A2600NTSC,,,a995b6cbdb1f0433abc74050808590e6, -Riddle of the Sphinx,Imagic,Bob Smith,,1982,IA3600,Uncommon,,A2600PAL,,,083e7cae41a874b2f9b61736c37d2ffe, -Rip Off,,Bob DeCrescenzo,Homebrew,2012,,,A7816,A7800NTSC,,,43525a0405184875c2ecfd0196886a34, -Rip Off,,Bob DeCrescenzo,Homebrew,2012,,,A7816,A7800PAL,,,106b409c6f4c219b1a3b3d099ead3b2b, -River Patrol,Tigervision,,,,7-004,Extremely Rare,TV8K,A2600NTSC,,,31512cdfadfd82bfb6f196e3b0fd83cd, -River Raid (Brazil),,Carol Shaw,,,,,,A2600NTSC,,,a94528ae05dd051894e945d4d2349b3b,http://www.atariage.com/manual_thumbs.html?SoftwareID=1255 -River Raid (Tanks),Activision,Thomas Jentzsch,Hack,,,,,A2600NTSC,,,c74bfd02c7f1877bbe712c1da5c4c194,http://www.atariage.com/manual_thumbs.html?SoftwareID=1255 -River Raid II (a.k.a. Katastrophen-Einsatz),Starsoft,,,,,,,A2600PAL,,,65ba1a4c643d1ab44481bdddeb403827, -River Raid II,Activision,David Lubar,,1988,AK-048-04,Extremely Rare,,A2600NTSC,,,ab56f1b2542a05bebc4fbccfc4803a38, -River Raid II,Activision,David Lubar,,1988,AK-048-04,Extremely Rare,,A2600NTSC,,,deb39482e77f984d4ce73be9fd8adabd, -River Raid II,Activision,David Lubar,,1988,AK-048-04,Extremely Rare,,A2600PAL,,,b049fc8ac50be7c2f28418817979c637, -River Raid Plus,Activision,Thomas Jentzsch,Hack,,,,,A2600NTSC,,,304512528a5530a9361e8a231ed9a6de,http://www.atariage.com/manual_thumbs.html?SoftwareID=1255 -River Raid,Activision,Carol Shaw,,1982,,,,A2600NTSC,,,33ed6dfac4b9ea2f81f778ceddbb4a75,http://www.atariage.com/manual_thumbs.html?SoftwareID=1255 -River Raid,Activision,Carol Shaw,,1982,,,,A2600PAL,,,1e89f722494608d6ea15a00d99f81337,http://www.atariage.com/manual_thumbs.html?SoftwareID=1255 -River Raid,Activision,Carol Shaw,,1982,AX-020,Uncommon,,A2600NTSC,,,291cc37604bc899e8e065c30153fc4b9,http://www.atariage.com/manual_thumbs.html?SoftwareID=1255 -River Raid,Activision,Carol Shaw,,1982,AX-020,Uncommon,,A2600NTSC,,,393948436d1f4cc3192410bb918f9724,http://www.atariage.com/manual_thumbs.html?SoftwareID=1255 -River Raid,Activision,Carol Shaw,,1982,AX-020,Uncommon,,A2600NTSC,,,95c4576d6a14e2debfa0fd6f6ec254ab,http://www.atariage.com/manual_thumbs.html?SoftwareID=1255 -River Raid,Activision,Carol Shaw,,1982,AX-020,Uncommon,,A2600PAL,,,927d422d6335018da469a9a07cd80390,http://www.atariage.com/manual_thumbs.html?SoftwareID=1255 -River Raid,CCE,Carol Shaw,,,,,,A2600NTSC,,,59f596285d174233c84597dee6f34f1f,http://www.atariage.com/manual_thumbs.html?SoftwareID=1255 -River Raid,Polyvox,,,,,,,A2600NTSC,,,6ce2110ac5dd89ab398d9452891752ab,http://www.atariage.com/manual_thumbs.html?SoftwareID=1255 -River Raid,SpkSoft 98,,Hack,,,,,A2600NTSC,,,edf69b123e06eaf8663cc78d8aeba06e,http://www.atariage.com/manual_thumbs.html?SoftwareID=1255 -River Raid,SpkSoft,,Hack,,,,,A2600NTSC,,,dd92d6ad50976f881d86b52d38616118,http://www.atariage.com/manual_thumbs.html?SoftwareID=1255 -Road Runner,Atari,,,1989,CX2663,Extremely Rare,,A2600PAL,,,2bd00beefdb424fa39931a75e890695d, -Road Runner,Atari,,,1989,CX2663,Extremely Rare,,A2600PAL,,,c3a9550f6345f4c25b372c42dc865703, -Road Runner,CCE,,,,,,,A2600NTSC,,,7d3cdde63b16fa637c4484e716839c94, -Robin Hood,Xonox,,,,99005,Extremely Rare,,A2600NTSC,,,72a46e0c21f825518b7261c267ab886e, -Robin Hood,Xonox,,,1983,99005,Extremely Rare,,A2600PAL,,,db76f7a0819659d9e585f2cdde9175c7, -Robin Hood,Xonox,,,1983,99005,Extremely Rare,,A2600PAL,,,dd7598b8bcb81590428900f71b720efb, -Robot City (Version 0.12),,Thomas Jentzsch,Homebrew,,,,,A2600NTSC,,,3e1682ddaec486d8b6b90b527aaa0fc4, -Robot City (Version 0.18),,Thomas Jentzsch,Homebrew,,,,,A2600NTSC,,,f954381f9e0f2009d1ac40dedd777b1a, -Robot City (Version 0.21),,Thomas Jentzsch,Homebrew,,,,,A2600NTSC,,,97cd63c483fe3c68b7ce939ab8f7a318, -Robot Fight (a.k.a. Space Robot),HomeVision,,,,1,Extremely Rare,,A2600PAL,,,1bef389e3dd2d4ca4f2f60d42c932509, -Robot Finds Kitten,,Thomas Mathys,Homebrew,2004,,,A7832,A7800NTSC,,,505f05e7f161f62ccd749dab3c4a204b, -Robot Tank TC,Activision,Thomas Jentzsch,Hack,,,,DC8K,A2600NTSC,,,fbb0151ea2108e33b2dbaae14a1831dd, -Robot Tank,Activision,Alan Miller,,1983,AZ-028,Rare,DC8K,A2600NTSC,,,4f618c2429138e0280969193ed6c107e, -Robot Tank,Activision,Alan Miller,,1983,AZ-028,Rare,DC8K,A2600PAL,,,f687ec4b69611a7f78bd69b8a567937a, -Robotron 2084,Atari,David Brown,,1987,CX7809,Common,,A7800NTSC,,,66ecaafe1b82ae68ffc96267aaf7a4d7,http://www.atariage.com/manual_thumbs.html?SoftwareID=2147 -Roc n' Rope,CBS Electronics,,,,2667,Rare,,A2600PAL,,,0173675d40a8d975763ee493377ca87d, -Roc n' Rope,Coleco,,,1984,2667,Rare,,A2600NTSC,,,65bd29e8ab1b847309775b0de6b2e4fe, -Rodeo Champ,,,,,,,,A2600PAL,,,3f96eb711928a6fac667c04ecd41f59f, -Room of Doom,CommaVid,,,,CM-004,Extremely Rare,,A2600NTSC,,,67931b0d37dc99af250dd06f1c095e8d, -Room of Doom,CommaVid,,,,CM-004,Extremely Rare,,A2600PAL,,,685e9668dc270b6deeb9cfbfd4d633c3, -Rotating Colors Demo 1 by Junkosoft,Junkosoft,,,,,,,A2600NTSC,,,cbb0ee17c1308148823cc6da85bff25c, -Rotating Colors Demo 2 by Junkosoft,Junkosoft,,,,,,,A2600NTSC,,,c1b038ce5cb6d85e956c5509b0e0d0d8, -SALT Diagnostics,,,,,,,,A2600NTSC,,,a8916734ff8c64ec3342f4c73fd5b57d, -SCSIcide (1.00 First Playable Version),,Joe Grand,Homebrew,,,,,A2600NTSC,Paddles,Paddles,eae0c06ee61c63b81cd016096fc901b0, -SCSIcide (1.10),,Joe Grand,Homebrew,,,,,A2600NTSC,Paddles,Paddles,7991e1797e5e9f311fd957e62d889dff, -SCSIcide (1.20),,Joe Grand,Homebrew,,,,,A2600NTSC,Paddles,Paddles,6538e454b0498ad2befe1ef0f87815c0, -SCSIcide (1.30) (CGE 2001 Release),,Joe Grand,Homebrew,,,,,A2600NTSC,Paddles,Paddles,523f5cbb992f121e2d100f0f9965e33f, -SCSIcide (1.31),,Joe Grand,Homebrew,,,,,A2600NTSC,Paddles,Paddles,843435eb360ed72085f7ab9374f9749a, -SCSIcide (1.32),Hozer Video Games,Joe Grand,Homebrew,,,,,A2600NTSC,Paddles,Paddles,9efa877a98dd5a075e058214da428abb, -SCSIcide (pre-release 1),,Joe Grand,Homebrew,,,,,A2600NTSC,Paddles,Paddles,b1a6c96e9093352106bc335e96caa154, -SCSIcide (pre-release 2),,Joe Grand,Homebrew,,,,,A2600NTSC,Paddles,Paddles,07a3af1e18b63765b6807876366f5e8a, -SCSIcide (pre-release 3),,Joe Grand,Homebrew,,,,,A2600NTSC,Paddles,Paddles,d483f65468d9a265661917bae1a54f3e, -SCSIcide (pre-release 4),,Joe Grand,Homebrew,,,,,A2600NTSC,Paddles,Paddles,34340c8eecd1e557314789cc6477e650, -SCSIcide (pre-release 5),,Joe Grand,Homebrew,,,,,A2600NTSC,Paddles,Paddles,f34dd3b8156aaf113cb621b2e51d90b8, -SCSIcide (pre-release 6),,Joe Grand,Homebrew,,,,,A2600NTSC,Paddles,Paddles,a0028f057d496f22b549fd8deecc6f78, -Sabotage,Ultravision,,,,,,,A2600NTSC,,,88d8a1accab58cf1abb043613cf185e9, -Saboteur,,,Prototype,,CX26119,,,A2600NTSC,,,1ec57bbd27bdbd08b60c391c4895c1cf, -Santa Simon,,,Homebrew,,,,A7848,A7800NTSC,,,ae85689b21bdf85cb9dc57c3b1fec9db, -Save Mary,,Tod Frye,,,,,,A2600NTSC,,,4d502d6fb5b992ee0591569144128f99, -Save Our Ship (unknown variation),,,,,,,,A2600PAL,,,0f8043715d66a4bbed394ef801d99862, -Save Our Ship,,,,,,,,A2600PAL,,,49571b26f46620a85f93448359324c28, -Save Our Ship,,,,,,Extremely Rare,,A2600NTSC,,,ed1a784875538c7871d035b7a98c2433, -Save Our Ship,TechnoVision,,,,,Extremely Rare,,A2600PAL,,,01297d9b450455dd716db9658efb2fae, -Schiessbude,Starsoft,,,,,,,A2600PAL,,,2516f4f4b811ede4ecf6fbeb5d54a299, -Schnapp die Apfeldiebe (a.k.a. Catch Time),Starsoft,,,,,,,A2600PAL,,,f6f1b27efc247a0e8d473ddb4269ff9e, -Schnecke und Eichhoernchen,Bitcorp,,,1983,PG208,Rare,,A2600PAL,,,898b5467551d32af48a604802407b6e8, -Schussel - der Polizistenschreck,Starsoft,,,,,Extremely Rare,,A2600PAL,,,7ff53f6922708119e7bf478d7d618c86, -Scramble,,Bob DeCrescenzo,Hack,2012,,,,A7800NTSC,,,57651b6c8e62811fab0361cea537b79c, -Scramble,,Bob DeCrescenzo,Hack,2012,,,,A7800NTSC,,,c265cfd65534a4514f226cb4c7f7d6bf, -Scramble,,Bob DeCrescenzo,Hack,2012,,,,A7800PAL,,,1ee26fc6b06b4c9ba74931914b7e719d, -Scramble,,Bob DeCrescenzo,Hack,2012,,,,A7800PAL,,,65fe82f419f6583a0f9a736242cb303d, -Scrapyard Dog,Atari,,,1990,CX7879,Scarce,A78SG,A7800NTSC,,,980c35ae9625773a450aa7ef51751c04,http://www.atariage.com/manual_thumbs.html?SoftwareID=2148 -Scrapyard Dog,Atari,,,1990,CX7879,Scarce,A78SG,A7800PAL,,,53db322c201323fe2ca8f074c0a2bf86,http://www.atariage.com/manual_thumbs.html?SoftwareID=2148 -Scroller Demo,,Bob Colbert,,,,,,A2600NTSC,,,0f2e09c71cc216f79d22a804152ba24b, -Scrolling Playfield 1 by Junkosoft,Junkosoft,,,,,,,A2600NTSC,,,0d07d2c1be1a5eaaea235a533bcda781, -Scrolling Playfield 2 by Junkosoft,Junkosoft,,,,,,,A2600NTSC,,,f6c13e816e58c8c62f82b2c8b91a2d67, -Scrolling Playfield 3 by Junkosoft,Junkosoft,,,,,,,A2600NTSC,,,a6737c81542a99ee71cb5f5ff14703d9, -Scuba Diver,Panda,,,,104,Rare,,A2600NTSC,,,19e761e53e5ec8e9f2fceea62715ca06, -Sea Hawk (a.k.a. Overkill-RVision),Sancho,,,1982,,,,A2600PAL,,,74d072e8a34560c36cacbc57b2462360, -Sea Hawk,CCE,,,,,,,A2600NTSC,,,3fd53bfeee39064c945a769f17815a7f, -Sea Hawk,Froggo,,,1987,FG 1008,Rare,,A2600NTSC,,,07f42847a79e4f5ae55cc03304b18c25, -Sea Hawk,Panda,,,,108,Rare,,A2600NTSC,,,624e0a77f9ec67d628211aaf24d8aea6, -Sea Hunt,CCE,,,,,,,A2600NTSC,,,d8acaa980cda94b65066568dd04d9eb0, -Sea Hunt,Froggo,,,1987,FG 1009,Rare,,A2600NTSC,,,5dccf215fdb9bbf5d4a6d0139e5e8bcb, -Sea Monster,Bitcorp,,,,,,,A2600PAL,,,2124cf92978c46684b6c39ccc2e33713, -Sea Monster,Bitcorp,,,,PG201,Rare,,A2600PAL,,,68489e60268a5e6e052bad9c62681635, -Sea Monster,Bitcorp,,,,PG201,Rare,,A2600PAL,,,b79087a8f2f54337d6a8fa56616dee1c, -Seaquest,Activision,Steve Cartwright,,1983,AX-022,Rare,,A2600NTSC,,,240bfbac5163af4df5ae713985386f92, -Seaquest,Activision,Steve Cartwright,,1983,AX-022,Rare,,A2600NTSC,,,ebcbc8a181a738e13df6216e5c329230, -Seaquest,Activision,Steve Cartwright,,1983,AX-022,Rare,,A2600PAL,,,5b6f5bcbbde42fc77d0bdb3146693565, -Seaquest,Activision,Steve Cartwright,,1983,AX-022,Rare,,A2600PAL,,,fd0e5148162e8ec6719445d559f018a9, -Seaquest,CCE,Steve Cartwright,,,AX-022,Rare,,A2600NTSC,,,79c27f90591e3fdc7d2ed020ecbedeb3, -Secret Agent,Data Age,,Prototype,,,,,A2600NTSC,,,605fd59bfef88901c8c4794193a4cbad, -Secret Quest,Atari,,,1989,CX26170,Rare,A16KR,A2600NTSC,,,fc24a94d4371c69bc58f5245ada43c44, -Secret Quest,Atari,,,1989,CX26170,Rare,A16KR,A2600PAL,,,2d2c5f0761e609e3c5228766f446f7f8, -See Saw,Starsoft,,,,,,,A2600PAL,,,f3dfae774f3bd005a026e29894db40d3, -See Saw,Starsoft,Cooper Black,,,,,,A2600PAL,,,efffafc17b7cb01b9ca35324aa767364, -Sentinel,Atari,,,1990,CX26183,Rare,A16K,A2600NTSC,Lightgun,Lightgun,8da51e0c4b6b46f7619425119c7d018e, -Sentinel,Atari,,Prototype,1988,,,A78SG,A7800NTSC,Lightgun,Lightgun,b697d9c2d1b9f6cb21041286d1bbfa7f,http://www.atariage.com/manual_thumbs.html?SoftwareID=2228 -Sentinel,Atari,,Prototype,1988,,,A78SG,A7800PAL,Lightgun,Lightgun,5469b4de0608f23a5c4f98f331c9e75f,http://www.atariage.com/manual_thumbs.html?SoftwareID=2228 -Sesam - Oeffne Dich (a.k.a. Open Sesame),Bitcorp,,,,,,,A2600PAL,,,90578a63441de4520be5324e8f015352, -Sesam - Oeffne Dich (a.k.a. Open Sesame),Bitcorp,,,,PG204,Rare,,A2600PAL,,,28d5df3ed036ed63d33a31d0d8b85c47, -Sesam - Oeffne Dich (a.k.a. Open Sesame),Bitcorp,Thomas Jentzsch,Hack,,,,,A2600NTSC,,,c880c659cdc0f84c4a66bc818f89618e, -Shark Attack,Apollo,,,1982,AP 2005,Uncommon,,A2600NTSC,,,54f7efa6428f14b9f610ad0ca757e26c, -Ship Demo (V 10),,,,,,,,A2600NTSC,,,1db3bc4601f22cf43be7ce015d74f59a, -Ship Demo (V 15),,,,,,,,A2600NTSC,,,85e48d68c8d802e3ba9d494a47d6e016, -Ship Demo (V 1501),,,,,,,,A2600NTSC,,,a0563dd6d8215c38c488fbbd61435626, -Ship Demo (V 1502),,,,,,,,A2600NTSC,,,1b1daaa9aa5cded3d633bfcbeb06479c, -Ship Demo,,,,,,,,A2600NTSC,,,90b1799dddb8bf748ee286d22e609480, -Shootin' Gallery,Imagic,Dennis Koble,,1982,IA3410,Extremely Rare,,A2600NTSC,,,b5a1a189601a785bdb2f02a424080412, -Shooting Arcade,Atari,Tod Frye,,,CX26169,,,A2600NTSC,,,15c11ab6e4502b2010b18366133fc322, -Shuttle Orbiter,Avalon Hill,,,,50040,Unbelievably Rare,,A2600NTSC,,,25b6dc012cdba63704ea9535c6987beb, -Sinistar,Atari,,Prototype,,,,,A2600NTSC,,,1e85f8bccb4b866d4daa9fcf89306474, -Sinistar,Atari,,Prototype,,CX26122,,,A2600NTSC,,,ea38fcfc06ad87a0aed1a3d1588744e4, -Sir Lancelot,Xonox,,,1983,99006,Extremely Rare,,A2600NTSC,,,4c8970f6c294a0a54c9c45e5e8445f93, -Sir Lancelot,Xonox,,,1983,99006,Extremely Rare,,A2600NTSC,,,7ead257e8b5a44cac538f5f54c7a0023, -Sir Lancelot,Xonox,,,1983,99006,Extremely Rare,,A2600PAL,,,dd0cbe5351551a538414fb9e37fc56e8, -Sirius,Tynesoft,Kevin Franklin,Prototype Hack,,,,A78SGR,A7800NTSC,,,2d643ac548c40e58c99d0fe433ba4ba0,http://www.atariage.com/software_page.html?SoftwareLabelID=2765 -Skate Boardin',Absolute,David Crane,,1987,AZ-042/AG-042,Rare,,A2600NTSC,,,f847fb8dba6c6d66d13724dbe5d95c4d, -Skate Boardin',Activision,David Crane,,1987,AZ-042,Extremely Rare,,A2600PAL,,,abe40542e4ff2d1c51aa2bb033f09984, -Skeet Shoot,Apollo,,,1981,AP 1001,Rare,,A2600NTSC,,,39c78d682516d79130b379fa9deb8d1c, -Skeet Shoot,Apollo,,,1981,AP 1001,Rare,,A2600NTSC,,,5f2b4c155949f01c06507fb32369d42a, -Skeleton (older version 2),,Eric Ball,,,,New Release,,A2600NTSC,,,4189adfc1b30c121248876e3a1a3ac7e, -Skeleton (older version),,Eric Ball,,,ELB002,New Release,,A2600NTSC,,,40e12c008037a323a1290c8fa4d2fe7f, -Skeleton (older version),,Eric Ball,,,ELB002,New Release,,A2600PAL,,,8e42674972d6805068fc653e014370fd, -Skeleton,,Eric Ball,,,ELB002,New Release,,A2600NTSC,,,28a4cd87fb9de4ee91693a38611cb53c, -Skeleton,,Eric Ball,,,ELB002,New Release,,A2600PAL,,,8e887d1ba5f3a71ae8a0ea16a4af9fc9, -Ski Hunt,,,,,,Extremely Rare,,A2600NTSC,,,8654d7f0fb351960016e06646f639b02, -Ski Run,,,,,TP-607,Extremely Rare,,A2600PAL,,,f10e3f45fb01416c87e5835ab270b53a, -Skiing (32-in-1),Atari,Bob Whitehead,,,,,,A2600PAL,,,367411b78119299234772c08df10e134,http://www.atariage.com/manual_thumbs.html?SoftwareID=1280 -Skiing,Activision,Bob Whitehead,,1980,AG-005,Uncommon,,A2600NTSC,,,0d90a0ee73d55539b7def24c88caa651,http://www.atariage.com/manual_thumbs.html?SoftwareID=1280 -Skiing,Activision,Bob Whitehead,,1980,AG-005,Uncommon,,A2600NTSC,,,60bbd425cb7214ddb9f9a31948e91ecb,http://www.atariage.com/manual_thumbs.html?SoftwareID=1280 -Skiing,Activision,Bob Whitehead,,1980,AG-005,Uncommon,,A2600NTSC,,,b76fbadc8ffb1f83e2ca08b6fb4d6c9f,http://www.atariage.com/manual_thumbs.html?SoftwareID=1280 -Skiing,Activision,Bob Whitehead,,1980,AG-005,Uncommon,,A2600PAL,,,eec61cc4250df70939d48fe02d7122ac,http://www.atariage.com/manual_thumbs.html?SoftwareID=1280 -Skiing,Dactar,Bob Whitehead,,,,,,A2600PAL,,,40d9f5709877ecf3dd1184f9791dd35e,http://www.atariage.com/manual_thumbs.html?SoftwareID=1280 -Skindiver (a.k.a. Aquatak),Sancho,,,,,,,A2600PAL,,,340f546d59e72fb358c49ac2ca8482bb, -Sky Demo,,,,,,,,A2600NTSC,,,bc97d544f1d4834cc72bcc92a37b8c1b, -Sky Diver (32-in-1),Atari,Jim Huether,,,,,,A2600PAL,,,3f75a5da3e40d486b21dfc1c8517adc0,http://www.atariage.com/manual_thumbs.html?SoftwareID=1281 -Sky Diver (Vom Himmel durch die Hoelle),Rainbow Vision,,,,,,,A2600PAL,,,8108162bc88b5a14adc3e031cf4175ad,http://www.atariage.com/manual_thumbs.html?SoftwareID=1281 -Sky Diver,Atari,Jim Huether,,1978,CX2629,Uncommon,,A2600NTSC,,,46c021a3e9e2fd00919ca3dd1a6b76d8,http://www.atariage.com/manual_thumbs.html?SoftwareID=1281 -Sky Diver,Atari,Jim Huether,,1978,CX2629,Uncommon,,A2600PAL,,,756ca07a65a4fbbedeb5f0ddfc04d0be,http://www.atariage.com/manual_thumbs.html?SoftwareID=1281 -Sky Diver,Atari,Jim Huether,,1978,CX2629,Uncommon,,A2600PAL,,,8190b403d67bf9792fe22fa5d22f3556,http://www.atariage.com/manual_thumbs.html?SoftwareID=1281 -Sky Jinks,Activision,Bob Whitehead,,1982,AG-019,Rare,,A2600NTSC,,,05aff8f626ef870432ae3b3d9d5aa301, -Sky Jinks,Activision,Bob Whitehead,,1982,AG-019,Rare,,A2600NTSC,,,2a0ba55e56e7a596146fa729acf0e109, -Sky Jinks,Activision,Bob Whitehead,,1982,AG-019,Rare,,A2600NTSC,,,8bd8f65377023bdb7c5fcf46ddda5d31, -Sky Jinks,Activision,Bob Whitehead,,1982,AG-019,Rare,,A2600NTSC,,,fa447e4e2f0d5e67cbf0b060fac5944c, -Sky Jinks,Activision,Bob Whitehead,,1982,AG-019,Rare,,A2600PAL,,,50a410a5ded0fc9aa6576be45a04f215, -Sky Jinks,Activision,Bob Whitehead,,1982,AG-019,Rare,,A2600PAL,,,f992a39b46aa48188fab12ad3809ae4a, -Sky Jinks,CCE,Bob Whitehead,,,,,,A2600NTSC,,,93dc15d15e77a7b23162467f95a5f22d, -Sky Patrol,Imagic,Brad Steward,Prototype,,IA3409,,,A2600NTSC,,,4c9307de724c36fd487af6c99ca078f2, -Sky Skipper,Parker Bros,,,1983,PB5350,Rare,,A2600NTSC,,,3b91c347d8e6427edbe942a7a405290d, -Sky Skipper,Parker Bros,,,1983,PB5350,Rare,,A2600PAL,,,514f911ecff2be5eeff2f39c49a9725c, -Slot Invaders,,David Marli,Hack,,,,,A2600NTSC,,,1aa7344b563c597eecfbfcf8e7093c27, -Slot Machine (32-in-1),Atari,David Crane,,,,,,A2600PAL,,,75ea128ba96ac6db8edf54b071027c4e,http://www.atariage.com/manual_thumbs.html?SoftwareID=1285 -Slot Machine,Atari,,Hack,1979,CX2653,Rare,,A2600NTSC,,,705fe719179e65b0af328644f3a04900,http://www.atariage.com/manual_thumbs.html?SoftwareID=1285 -Slot Machine,Atari,David Crane,,1979,,,,A2600PAL,,,dbdd21e1ee3d72119e8cd14d943c585b,http://www.atariage.com/manual_thumbs.html?SoftwareID=1285 -Slot Machine,Atari,David Crane,,1979,,,,A2600PAL,,,fc6052438f339aea373bbc999433388a,http://www.atariage.com/manual_thumbs.html?SoftwareID=1285 -Slot Machine,Atari,David Crane,,1979,CX2653,Rare,,A2600NTSC,,,f90b5da189f24d7e1a2117d8c8abc952,http://www.atariage.com/manual_thumbs.html?SoftwareID=1285 -Slot Racers (32-in-1),Atari,Warren Robinett,,,,,,A2600PAL,,,d1d704a7146e95709b57b6d4cac3f788,http://www.atariage.com/manual_thumbs.html?SoftwareID=1287 -Slot Racers - Maze,Atari,,,1978,CX2606,Common,,A2600NTSC,,,5f708ca39627697e859d1c53f8d8d7d2,http://www.atariage.com/manual_thumbs.html?SoftwareID=1287 -Slot Racers - Maze,Atari,,,1978,CX2606,Common,,A2600NTSC,,,aed82052f7589df05a3f417bb4e45f0c,http://www.atariage.com/manual_thumbs.html?SoftwareID=1287 -Slot Racers,Atari,Warren Robinett,,1978,,,,A2600PAL,,,f6d512bef1bf253dc935d0e13c3d1462,http://www.atariage.com/manual_thumbs.html?SoftwareID=1287 -Slot Racers,Atari,Warren Robinett,,1978,CX2606,Uncommon,,A2600PAL,,,a7ed7dc5cbc901388afa59030fb11d26,http://www.atariage.com/manual_thumbs.html?SoftwareID=1287 -Smash Hit Pak - Frogr -Stampede -Seaqst -Boxng -Ski,HES,,,,,,,A2600PAL,,,92d1f6ac179ebe5963868d6bc1bdda8d, -Smurfs - Rescue in Gargamel's Castle,CBS Electronics,,,,,,,A2600PAL,,,73c545db2afd5783d37c46004e4024c2, -Smurfs - Rescue in Gargamel's Castle,Coleco,,,1982,2465,Uncommon,,A2600NTSC,,,3d1e83afdb4265fa2fb84819c9cfd39c, -Smurfs - Rescue in Gargamel's Castle,Coleco,,,1982,2465,Uncommon,,A2600PAL,,,24aff972d58990f9b88a6d787c796f1e, -Smurfs Save the Day,Coleco,,,1983,2511,Unbelievably Rare,,A2600NTSC,,,a204cd4fb1944c86e800120706512a64, -Snail Against Squirrel,,,,,,,,A2600PAL,,,ac26d7d37248d1d8eac5eccacdbef8db, -Snail Against Squirrel,CCE,,,1983,,,,A2600NTSC,,,68878250e106eb6c7754bc2519d780a0, -Sneek 'n Peek,,,,,,,,A2600PAL,,,f21813aa050437f0dbc8479864acec6d, -Sneek 'n Peek,CCE,,,,VC 1002,Rare,,A2600NTSC,,,9c6faa4ff7f2ae549bbcb14f582b70e4, -Sniper (02-30-01),,Billy Eno,Prototype,,,,,A2600NTSC,,,c54b4207ce1d4bf72fadbb1a805d4a39, -Snoopy and the Red Baron,Atari,,,1983,CX26111,Rare,,A2600NTSC,,,57939b326df86b74ca6404f64f89fce9, -Snoopy and the Red Baron,Atari,,,1983,CX26111,Rare,,A2600PAL,,,f844f4c6f3baaaf5322657442d6f29eb, -Snoopy and the Red Baron,CCE,,,,CX26111,,,A2600NTSC,,,c5d2834bf98e90245e545573eb7e6bbc, -Snow White,Atari,,Prototype,,CX26107,,,A2600NTSC,,,75ee371ccfc4f43e7d9b8f24e1266b55, -Solar Fox,CBS Electronics,,,1983,4L-2487,Uncommon,,A2600NTSC,,,947317a89af38a49c4864d6bdd6a91fb, -Solar Fox,CBS Electronics,,,1983,4L-2487,Uncommon,,A2600PAL,,,e03b0b091bea5bc9d3f14ee0221e714d, -Solar Storm,Imagic,Dennis Koble,,1983,O3206,Rare,,A2600NTSC,Paddles,Paddles,97842fe847e8eb71263d6f92f7e122bd, -Solar Storm,Imagic,Dennis Koble,,1983,O3206,Rare,,A2600PAL,Paddles,Paddles,e6de4ef9ab62e2196962aa6b0dedac59, -Solaris Trainer,,Chris Larkin,Hack,,,,A16K,A2600NTSC,,,f19aba18f86e415812480ad2be221425,http://www.atariage.com/manual_thumbs.html?SoftwareID=1296 -Solaris,Atari,,,1986,CX26136,Uncommon,A16K,A2600NTSC,,,e72eb8d4410152bdcb69e7fba327b420,http://www.atariage.com/manual_thumbs.html?SoftwareID=1296 -Solaris,Atari,,,1986,CX26136,Uncommon,A16K,A2600PAL,,,bc4cf38a4bee45752dc466c98ed7ad09,http://www.atariage.com/manual_thumbs.html?SoftwareID=1296 -Sorcerer's Apprentice,Atari,,,1983,CX26109,Rare,,A2600NTSC,,,5f7ae9a7f8d79a3b37e8fc841f65643a, -Sorcerer's Apprentice,Atari,,,1983,CX26109,Rare,,A2600PAL,,,2e82a1628ef6c735c0ab8fa92927e9b0, -Sorcerer,Mythicon,,,1983,MA-1001,Uncommon,,A2600NTSC,,,d2c4f8a4a98a905a9deef3ba7380ed64, -Sound Paddle (V1),,,,,,,,A2600NTSC,Paddles,Paddles,f78c125b5da483c41e51522947d6c4ce, -Sound Paddle (V2),,,,,,,,A2600NTSC,Paddles,Paddles,eee7695ae3eea7818321df0b790b31f3, -Sound X,,Ed Federmeyer,,1994,,Extremely Rare,,A2600NTSC,,,32f4e47a71601ab06cfb59e1c6a0b846, -Sound X,,Ed Federmeyer,,1996,,Extremely Rare,,A2600NTSC,,,7dbc8fa2e488e3f6b87fbe0f76c5b89f, -Sound X6,,Ed Federmeyer,,1994,,Extremely Rare,,A2600NTSC,,,310ba30e25ea8957e58180b663503c0c, -Space 2002,Angelino,,Hack,,,,,A2600NTSC,,,24b9adac1b4f85b0bac9bf9b9e180906, -Space Attack,Mattel,,,1982,MT5659,Common,,A2600NTSC,,,17badbb3f54d1fc01ee68726882f26a6, -Space Attack,Telegames,,,,,,,A2600PAL,,,abb741c83f665d73c86d90a7d9292a9b, -Space Canyon,Panda,,,,100,Rare,,A2600NTSC,,,559317712f989f097ea464517f1a8318, -Space Cavern,Apollo,,,1982,AP 2002,Uncommon,,A2600NTSC,,,df6a28a89600affe36d94394ef597214, -Space Cavern,Apollo,,,1982,AP 2002,Uncommon,,A2600PAL,,,d9548ad44e67edec202d1b8b325e5adf, -Space Duel,,Bob DeCrescenzo,Homebrew,2007,,,,A7800PAL,,,a84c1b2300fbfbf21b1c02387f613dad,http://www.atariage.com/software_page.html?SoftwareLabelID=2770 -Space Duel,,Bob DeCrescenzo,Homebrew,2007,,,A7832,A7800NTSC,,,771cb4609347657f63e6f0eb26036e35,http://www.atariage.com/software_page.html?SoftwareLabelID=2770 -Space Instigators,Xype,Christopher Tumber,Homebrew,,,,,A2600NTSC,,,84f4ce5ad5b469103978ec1cb85c9e5c, -Space Invaders (w/Explosions),,,Hack,,,,,A2600NTSC,,,2ef36341d1bf42e02c7ea2f71e024982,http://www.atariage.com/manual_thumbs.html?SoftwareID=1306 -Space Invaders 2,,,Hack,,,,,A2600NTSC,,,270229c6d5578446e6a588492e4e5910,http://www.atariage.com/manual_thumbs.html?SoftwareID=1306 -Space Invaders,,Bob DeCrescenzo,Homebrew Hack,2008,,,,A7800NTSC,,,6adf79558a3d7f5beca1bb8d34337417,http://www.atariage.com/cart_page.html?SoftwareLabelID=2785 -Space Invaders,,Franklin Cruz,Hack,,,,,A2600NTSC,,,0963aa9f7f6cf5a36ff700001583624e,http://www.atariage.com/manual_thumbs.html?SoftwareID=1306 -Space Invaders,,Rob Kudla,Hack,,,,,A2600NTSC,,,e10bf1af6bf3b4a253c5bef6577fe923,http://www.atariage.com/manual_thumbs.html?SoftwareID=1306 -Space Invaders,,Ron Corcoran,Hack,,,,,A2600NTSC,,,17f31884e6f7868032bb79e3575d6caf,http://www.atariage.com/manual_thumbs.html?SoftwareID=1306 -Space Invaders,,Ron Corcoran,Hack,2002,,,,A2600NTSC,,,c126656df6badfa519cc63e681fb3596,http://www.atariage.com/manual_thumbs.html?SoftwareID=1306 -Space Invaders,Atari,Rick Maurer,,1978,CX2632,Common,,A2600NTSC,,,012020625a3227815e47b37fd025e480,http://www.atariage.com/manual_thumbs.html?SoftwareID=1306 -Space Invaders,Atari,Rick Maurer,,1978,CX2632,Common,,A2600NTSC,,,07f91e33e76f53bb9d2731fd5d8a35a5,http://www.atariage.com/manual_thumbs.html?SoftwareID=1306 -Space Invaders,Atari,Rick Maurer,,1978,CX2632,Common,,A2600NTSC,,,72ffbef6504b75e69ee1045af9075f66,http://www.atariage.com/manual_thumbs.html?SoftwareID=1306 -Space Invaders,Atari,Rick Maurer,,1978,CX2632,Common,,A2600PAL,,,8747ba79cd39fa83a529bb26010db21b,http://www.atariage.com/manual_thumbs.html?SoftwareID=1306 -Space Invaders,Atari,Rick Maurer,,1978,CX2632,Common,,A2600PAL,,,f1b7edff81ceef5af7ae1fa76c8590fc,http://www.atariage.com/manual_thumbs.html?SoftwareID=1306 -Space Jockey (32-in-1),Atari,,,,,,,A2600PAL,,,6bb09bc915a7411fe160d0b2e4d66047, -Space Jockey,,,,,,,,A2600PAL,,,822a950f27ff0122870558a89a49cad3, -Space Jockey,Carrere Video,,,,,,,A2600PAL,,,457e7d4fcd56ebc47f5925dbea3ee427, -Space Jockey,US Games,,,1982,VC 1001,Common,,A2600NTSC,,,6f2aaffaaf53d23a28bf6677b86ac0e3, -Space Jockey,US Games,,,1982,VC 1001,Common,,A2600NTSC,,,d1a9478b99d6a55e13a9fd4262da7cd4, -Space Raid,,,,,,,,A2600NTSC,,,1a624e236526c4c8f31175e9c89b2a22, -Space Raid,,,,,,,,A2600PAL,,,345769d085113d57937198262af52298, -Space Robot (a.k.a. Robot Fight),Dimax,,,,SM8001,Unbelievably Rare,,A2600NTSC,,,3dfb7c1803f937fadc652a3e95ff7dc6, -Space Shuttle - Journey Into Space,Activision,Steve Kitchen,,1983,AZ-033,Rare,,A2600NTSC,,,5894c9c0c1e7e29f3ab86c6d3f673361,http://www.atariage.com/manual_thumbs.html?SoftwareID=1313 -Space Shuttle - Journey Into Space,Activision,Steve Kitchen,,1983,AZ-033,Rare,,A2600PAL,,,4f6702c3ba6e0ee2e2868d054b00c064,http://www.atariage.com/manual_thumbs.html?SoftwareID=1313 -Space Treat (2002-06-10),,Fabrizio Zavagli,Homebrew,,,,,A2600NTSC,,,d97e3d0b4575ce0b9a6132e19cfeac6e, -Space Treat,,Fabrizio Zavagli,Homebrew,,,,,A2600NTSC,,,6c9a32ad83bcfde3774536e52be1cce7, -Space Tunnel,,Cooper Black,,,,,,A2600PAL,,,df2745d585238780101df812d00b49f4, -Space Tunnel,Bitcorp,,,,PG202,Rare,,A2600PAL,,,8917f7c1ac5eb05b82331cf01c495af2, -Space War (32-in-1),Atari,,,,,,,A2600PAL,,,b702641d698c60bcdc922dbd8c9dd49c,http://www.atariage.com/manual_html_page.html?SoftwareID=1316 -Space War,Atari,,,1978,CX2604,Uncommon,,A2600NTSC,,,77887e4192a6b0a781530e6cf9be7199,http://www.atariage.com/manual_html_page.html?SoftwareID=1316 -Space War,Atari,,,1978,CX2604,Uncommon,,A2600NTSC,,,7e9da5cb84d5bc869854938fe3e85ffa,http://www.atariage.com/manual_html_page.html?SoftwareID=1316 -Space War,Atari,,,1978,CX2604,Uncommon,,A2600NTSC,,,a7ef44ccb5b9000caf02df3e6da71a92,http://www.atariage.com/manual_html_page.html?SoftwareID=1316 -Space War,Atari,,,1978,CX2604,Uncommon,,A2600PAL,,,8f60551db6d1535ef0030f155018c738,http://www.atariage.com/manual_html_page.html?SoftwareID=1316 -Space War,Atari,,,1978,CX2604,Uncommon,,A2600PAL,,,f9677b2ec8728a703eb710274474613d,http://www.atariage.com/manual_html_page.html?SoftwareID=1316 -SpaceMaster X-7,20th Century Fox,,,1983,11022,Extremely Rare,,A2600NTSC,,,45040679d72b101189c298a864a5b5ba, -Spacechase,Apollo,,,1981,AP 2001,Uncommon,,A2600NTSC,,,ec5c861b487a5075876ab01155e74c6c, -Spectrum Color Demo,,,,,,,,A2600NTSC,,,f3f92aad3a335f0a1ead24a0214ff446, -Spice Girls Rule Demo,,,,,,,,A2600NTSC,,,327fe8cf94f3a45c35a840a453df1235, -Spice Invaders,,Philip R. Frey,Hack,,,,,A2600NTSC,,,a8a703e073183a89c94d4d99b9661b7f, -Spider Fighter,Activision,Larry Miller,,1983,AX-021,Uncommon,,A2600NTSC,,,24d018c4a6de7e5bd19a36f2b879b335,http://www.atariage.com/manual_thumbs.html?SoftwareID=1325 -Spider Fighter,Activision,Larry Miller,,1983,AX-021,Uncommon,,A2600NTSC,,,ba3a17efd26db8b4f09c0cf7afdf84d1,http://www.atariage.com/manual_thumbs.html?SoftwareID=1325 -Spider Fighter,Activision,Larry Miller,,1983,AX-021,Uncommon,,A2600PAL,,,7778ac65d775a079f537e97cbdad541c,http://www.atariage.com/manual_thumbs.html?SoftwareID=1325 -Spider Kong (a.k.a. Karate),Goliath-Funvision,,,,,,,A2600PAL,,,ae465044dfba287d344ba468820995d7, -Spider Kong (a.k.a. Karate),Goliath-Funvision,,,,,,,A2600PAL,,,d39e29b03af3c28641084dd1528aae05, -Spider Maze,K-Tel Vision,,,,,Rare,,A2600NTSC,,,21299c8c3ac1d54f8289d88702a738fd, -Spider-Man,Parker Bros,,,1982,PB5900,Rare,,A2600NTSC,,,199eb0b8dce1408f3f7d46411b715ca9, -Spider-Man,Parker Bros,,,1982,PB5900,Rare,,A2600PAL,,,e77ec259e1387bc308b0534647a89198, -Spider-Man,Parker Bros,,,1982,PB5900,Rare,,A2600PAL,,,f7af41a87533524d9a478575b0d873d0, -Spiderdroid,Froggo,,,1987,,Rare,,A2600NTSC,,,8454ed9787c9d8211748ccddb673e920, -Spike's Peak,Xonox,,,1983,99001,Extremely Rare,,A2600NTSC,,,a4e885726af9d97b12bb5a36792eab63, -Spike's Peak,Xonox,,,1983,99001,Extremely Rare,,A2600PAL,,,b37f0fe822b92ca8f5e330bf62d56ea9, -Spitfire Attack,Milton Bradley,,,1983,4363,Uncommon,,A2600NTSC,,,cef2287d5fd80216b2200fb2ef1adfa8, -Split Screen (Ballblazer) Demo,,,,,,,,A2600NTSC,,,fb91da78455d9b1606913fbf8c859772, -Sports Action Pak - End -Hock -Fish -Drag,,,,1988,,,,A2600PAL,,,2c3b2843295c9d6b16996971180a3fe9, -Springer,Tigervision,,,1982,7-006,Extremely Rare,TV8K,A2600NTSC,,,4cd796b5911ed3f1062e805a3df33d98, -Sprintmaster DC,,Thomas Jentzsch,Hack,,,,A16KR,A2600NTSC,Driving,Driving,6b75f8fa4fd011a6698c58315f83d2ac, -Sprintmaster,Atari,,,1988,CX26155,Rare,A16KR,A2600NTSC,,,5a8afe5422abbfb0a342fb15afd7415f, -Sprintmaster,Atari,,,1988,CX26155,Rare,A16KR,A2600PAL,,,b2d5d200f0af8485413fad957828582a, -Sprite Color Demo,,,,,,,,A2600NTSC,,,d597d35c6022c590d6e75e865738558a, -Sprite Demo 0,,,,,,,,A2600NTSC,,,e15b5525cf8f77297b322838df8d999c, -Sprite Demo 1,,,,,,,,A2600NTSC,,,d5c6b81212ad86fd9542a1fedaf57cae, -Sprite Demo 2,,,,,,,,A2600NTSC,,,fe0bc4bb92c1c4de7d5706aaa8d8c10d, -Sprite Demo 3,,,,,,,,A2600NTSC,,,dbabb80e92ff18d8eecf615c0539151e, -Sprite Demo 4,,,,,,,,A2600NTSC,,,61728c6cfb052e62a9ed088c5bf407ba, -Sprite Demo 5,,,,,,,,A2600NTSC,,,ad7e97c19bd25d5aa3999430845c755b, -Sprite Demo 6,,,,,,,,A2600NTSC,,,acaa27d214039d89d7031609aafa55c3, -Sprite Demo 7,,,,,,,,A2600NTSC,,,2d6da0eb85eabc93270e5bb8a466ca51, -Spy Hunter,Sega,,,1983,011-02,Extremely Rare,A8K,A2600NTSC,,,3105967f7222cc36a5ac6e5f6e89a0b4, -Spy vs. Spy,,,,,,,,A2600PAL,,,2a360bc85bf22de438651cf92ffda1de, -Squeeze Box,US Games,,,1982,VC 2002,Extremely Rare,,A2600NTSC,,,ba257438f8a78862a9e014d831143690, -Squoosh,Apollo,,Prototype,,,,,A2600NTSC,,,22abbdcb094d014388d529352abe9b4b, -Sssnake,Data Age,,,1982,DA 1003,Common,,A2600NTSC,,,21a96301bb0df27fde2e7eefa49e0397, -Stampede (32-in-1),Atari,Bob Whitehead,,,,,,A2600PAL,,,c9196e28367e46f8a55e04c27743148f,http://www.atariage.com/manual_thumbs.html?SoftwareID=1336 -Stampede,Activision,Bob Whitehead,,1981,,,,A2600PAL,,,0945081a6bd00345ff3d58eb7a07330a,http://www.atariage.com/manual_thumbs.html?SoftwareID=1336 -Stampede,Activision,Bob Whitehead,,1981,,,,A2600PAL,,,75511bb694662301c9e71df645f4b5a7,http://www.atariage.com/manual_thumbs.html?SoftwareID=1336 -Stampede,Activision,Bob Whitehead,,1981,,,,A2600PAL,,,869abe0426e6e9fcb6d75a3c2d6e05d1,http://www.atariage.com/manual_thumbs.html?SoftwareID=1336 -Stampede,Activision,Bob Whitehead,,1981,AG-011,Uncommon,,A2600NTSC,,,21d7334e406c2407e69dbddd7cec3583,http://www.atariage.com/manual_thumbs.html?SoftwareID=1336 -Stampede,Activision,Bob Whitehead,,1981,AG-011,Uncommon,,A2600NTSC,,,9057694dce8449521e6164d263702185,http://www.atariage.com/manual_thumbs.html?SoftwareID=1336 -Stampede,Activision,Bob Whitehead,,1981,AG-011,Uncommon,,A2600NTSC,,,e66e5af5dea661d58420088368e4ef0d,http://www.atariage.com/manual_thumbs.html?SoftwareID=1336 -Star Fire (in development),,Manuel Polik,Homebrew,,,,,A2600NTSC,,,bc6432cbed32c695658514c4eb41d905, -Star Fire (tech demo),,Manuel Polik,Homebrew,,,,,A2600NTSC,,,ec26fdc87b1d35f1d60ea89cda4f4dd4, -Star Fox,Mythicon,,,1982,MA-1003,Uncommon,,A2600NTSC,,,f526d0c519f5001adb1fc7948bfbb3ce, -Star Gunner,Telesys,,,1982,1005,Extremely Rare,,A2600NTSC,,,a3c1c70024d7aabb41381adbfb6d3b25, -Star Raiders,Atari,Carla Meninsky & Doug Neubauer,,1982,CX2660,Uncommon,,A2600NTSC,Joystick,Keypad,cbd981a23c592fb9ab979223bb368cd5, -Star Raiders,Atari,Carla Meninsky & Doug Neubauer,,1982,CX2660,Uncommon,,A2600PAL,Joystick,Keypad,c1a83f44137ea914b495fc6ac036c493, -Star Ship,Atari,Bob Whitehead,,1977,CX2603,Rare,,A2600NTSC,,,7b938c7ddf18e8362949b62c7eaa660a, -Star Ship,Atari,Bob Whitehead,,1977,CX2603,Rare,,A2600NTSC,,,e363e467f605537f3777ad33e74e113a, -Star Strike,Mattel,,,1982,MT4313,Rare,,A2600NTSC,,,79e5338dbfa6b64008bb0d72a3179d3c, -Star Strike,Telegames,,,,,,,A2600PAL,,,405f8591b6941cff56c9b392c2d5e4e5, -Star Trek - Strategic Operations Simulator,Sega,,,1983,004-01,Rare,,A2600NTSC,,,03c3f7ba4585e349dd12bfa7b34b7729, -Star Voyager,CCE,,,,,,,A2600NTSC,,,d912312349d90e9d41a9db0d5cd3db70,http://www.atariage.com/manual_html_page.html?SoftwareLabelID=498 -Star Voyager,Imagic,Bob Smith,,1982,IA3201,Common,,A2600NTSC,,,813985a940aa739cc28df19e0edd4722,http://www.atariage.com/manual_html_page.html?SoftwareLabelID=498 -Star Voyager,Imagic,Bob Smith,,1982,IA3201,Common,,A2600PAL,,,0aceb7c3bd13fe048b77a1928ed4267d,http://www.atariage.com/manual_html_page.html?SoftwareLabelID=498 -Star Wars - Death Star Battle,Parker Bros,,,1983,PB5060,Rare,PB8K,A2600NTSC,,,5336f86f6b982cc925532f2e80aa1e17, -Star Wars - Death Star Battle,Parker Bros,,,1983,PB5060,Rare,PB8K,A2600PAL,,,cb9b2e9806a7fbab3d819cfe15f0f05a, -Star Wars - Ewok Adventure,Parker Bros,,Prototype,,,,PB8K,A2600PAL,,,6dfad2dd2c7c16ac0fa257b6ce0be2f0, -Star Wars - Ewok Adventure,Parker Bros,Thomas Jentzsch,Prototype Hack,,,,PB8K,A2600NTSC,,,c246e05b52f68ab2e9aee40f278cd158, -Star Wars - Jedi Arena,Parker Bros,Rex Bradford,,1983,PB5000,Rare,,A2600NTSC,Paddles,Paddles,c9f6e521a49a2d15dac56b6ddb3fb4c7, -Star Wars - Jedi Arena,Parker Bros,Rex Bradford,,1983,PB5000,Rare,,A2600PAL,Paddles,Paddles,05b45ba09c05befa75ac70476829eda0, -Star Wars - The Arcade Game,Parker Bros,,,1983,PB5540,Extremely Rare,PB8K,A2600NTSC,,,6339d28c9a7f92054e70029eb0375837, -Star Wars - The Arcade Game,Parker Bros,,,1983,PB5540,Extremely Rare,PB8K,A2600PAL,,,6cf054cd23a02e09298d2c6f787eb21d, -Star Wars - The Battle of Alderaan,,Barry Laws Jr.,Hack,,,,,A2600NTSC,,,ffc0ff4305dd46b4b459885bd1818e2e, -Star Wars - The Empire Strikes Back,Parker Bros,Rex Bradford,,1982,PB5050,Common,,A2600NTSC,,,3c8e57a246742fa5d59e517134c0b4e6, -Star Wars - The Empire Strikes Back,Parker Bros,Rex Bradford,,1982,PB5050,Common,,A2600PAL,,,be060a704803446c02e6f039ab12eb91, -Stargate,Atari,,,1984,CX26120,Rare,A8KR,A2600NTSC,,,0c48e820301251fbb6bcdc89bd3555d9, -Stargate,Atari,,,1984,CX26120,Rare,A8KR,A2600NTSC,,,57fa2d09c9e361de7bd2aa3a9575a760, -Stargate,Atari,,,1984,CX26120,Rare,A8KR,A2600PAL,,,493de059b32f84ab29cde6213964aeee, -Starmaster,Activision,Alan Miller,,1982,AX-016,Uncommon,,A2600NTSC,,,d69559f9c9dc6ef528d841bf9d91b275, -Starmaster,Activision,Alan Miller,,1982,AX-016,Uncommon,,A2600PAL,,,348615ffa30fab3cec1441b5a76e9460, -Starmaster,Activision,Alan Miller,,1982,AX-016,Uncommon,,A2600PAL,,,d62d7d1a974c31c5803f96a8c1552510, -Steeple Chase,Video Gems,,,,,,,A2600PAL,Paddles,Paddles,f1eeeccc4bba6999345a2575ae96508e, -Steeple Chase,Video Gems,Thomas Jentzsch,Hack,,,,,A2600NTSC,Paddles,Paddles,1619bc27632f9148d8480cd813aa74c3, -Steeplechase,Sears,,,1980,CX2614,Rare,,A2600NTSC,Paddles,Paddles,656dc247db2871766dffd978c71da80c, -Steeplechase,Sears,,,1980,CX2614,Rare,,A2600NTSC,Paddles,Paddles,a174cece06b3abc0aec3516913cdf9cc, -Stell-a-Sketch,,,Homebrew,,,,,A2600NTSC,,,18ed63e3ce5bc3dd2d8bd188b807f1a2, -Stell-a-Sketch,,,Homebrew,,,,,A2600NTSC,Driving,Driving,47aef18509051bab493589cb2619170b, -Stellar Track,Sears,,,1980,CX2614,Rare,,A2600NTSC,,,0b8d3002d8f744a753ba434a4d39249a, -Steroid Pitfall,HCC Software,,,,,,,A2600NTSC,,,177504abd4260c4265e1338955e9fa47, -Stopp die Gangster,Starsoft,,,,,,,A2600PAL,,,b17b9cc4103844dcda54f77f44acc93a, -Strahlen der Teufelsvoegel,,,,,,,,A2600PAL,,,f240ba9f8092d2e8a4c7d82c554bf509, -Strategy X,Gakken,,,1982,,,,A2600PAL,,,ef76ea05655a0b62cb1018c92b9b4b7d, -Strategy X,Gakken,,,1982,10,Extremely Rare,,A2600PAL,,,9333172e3c4992ecf548d3ac1f2553eb, -Strawberry Shortcake - Musical Match-Ups,Parker Bros,,,1983,PB5910,Uncommon,,A2600NTSC,,,e10d2c785aadb42c06390fae0d92f282, -Strawberry Shortcake Musical Match-Ups,Parker Bros,,,1983,,,,A2600PAL,,,516ffd008057a1d78d007c851e6eff37, -Street Racer - Speedway II (128-in-1 Junior Console) (4K),128-in-1 Junior Console,Larry Kaplan,,,,,,A2600PAL,Paddles,Paddles,8a6c84f481acf42abcb78ba5064ad755, -Street Racer - Speedway II,Atari,Larry Kaplan,,1978,CX2612,,,A2600PAL,Paddles,Paddles,e12e32dee68201b6765fcd0ed54d6646, -Street Racer - Speedway II,Atari,Larry Kaplan,,1978,CX2612,Uncommon,,A2600NTSC,Paddles,Paddles,396f7bc90ab4fa4975f8c74abe4e81f0, -Street Racer - Speedway II,Atari,Larry Kaplan,,1978,CX2612,Uncommon,,A2600NTSC,Paddles,Paddles,6ff4156d10b357f61f09820d03c0f852, -Stronghold,CommaVid,,,,CM-009,Extremely Rare,,A2600NTSC,,,7b3cf0256e1fa0fdc538caf3d5d86337, -Stunt Cycle,Atari,,Prototype,,,,,A2600NTSC,Paddles,Paddles,c3bbc673acf2701b5275e85d9372facf, -Sub Rescue (Real Title Unknown),,,,,,,,A2600PAL,,,9193b6fff6897d43274741d4f9855b6d, -Sub Scan,Sega,,,1982,002-01,Uncommon,,A2600PAL,,,b095009004df341386d22b2a3fae3c81, -Sub Scan,Sega,,,1983,002-01,Uncommon,,A2600NTSC,,,5af9cd346266a1f2515e1fbc86f5186a, -Submarine Commander,Sears,,,1982,CX2647,Extremely Rare,,A2600NTSC,,,f3f5f72bfdd67f3d0e45d097e11b8091, -Subterranea,Imagic,Mark Klein,,1983,O3213,Rare,,A2600NTSC,,,93c52141d3c4e1b5574d072f1afde6cd, -Subterranea,Imagic,Mark Klein,,1983,O3213,Rare,,A2600PAL,,,38de7b68379770b9bd3f7bf000136eb0, -Sucky Zepplin,,Nick Bensema,Homebrew,,,,,A2600NTSC,,,4ab4af3adcdae8cdacc3d06084fc8d6a, -Suicide Adventure,,George Veeder,Homebrew,,,,,A2600NTSC,,,cff578e5c60de8caecbee7f2c9bbb57b, -Summer Games,Atari,,,1987,CX7826,Scarce,A78SGR,A7800NTSC,,,cbb0746192540a13b4c7775c7ce2021f,http://www.atariage.com/manual_thumbs.html?SoftwareID=2175 -Summer Games,Epyx,,,1987,8056100250,Rare,A16K,A2600NTSC,,,45027dde2be5bdd0cab522b80632717d, -Summer Games,Epyx,,,1987,8056100250,Rare,A16K,A2600PAL,,,12bca8305d5ab8ea51fe1cfd95d7ab0e, -Super Action Pak - Pitf -GPrix -LaserB -Barn(1988),,,,,,,,A2600PAL,,,4f2d47792a06da224ba996c489a87939, -Super Baseball,Atari,,,1988,CX26152,Uncommon,,A2600NTSC,,,7adbcf78399b19596671edbffc3d34aa, -Super Baseball,CCE,,,,,,,A2600NTSC,,,faed2ef6b44894f8c83f2b50891c35c6, -Super Box,CCE,,,,,,A16K,A2600NTSC,,,1c85c0fc480bbd69dc301591b6ecb422, -Super Breakout,Atari,Nick Turner,,1978,CX2608,Common,,A2600NTSC,Paddles,Paddles,0ad9a358e361256b94f3fb4f2fa5a3b1,http://www.atariage.com/manual_html_page.html?SoftwareID=1372 -Super Breakout,Atari,Nick Turner,,1978,CX2608,Common,,A2600PAL,Paddles,Paddles,8885d0ce11c5b40c3a8a8d9ed28cefef,http://www.atariage.com/manual_html_page.html?SoftwareID=1372 -Super Breakout,Atari,Nick Turner,,1978,CX2608,Common,,A2600PAL,Paddles,Paddles,ee4c186123d31a279ed7a84d3578df23,http://www.atariage.com/manual_html_page.html?SoftwareID=1372 -Super Challenge Baseball,Mattel,,,1982,MT5658,Common,,A2600PAL,,,9d37a1be4a6e898026414b8fee2fc826, -Super Challenge Football,Mattel,,,1982,MT5658,Common,,A2600NTSC,,,e275cbe7d4e11e62c3bfcfb38fca3d49, -Super Circus,,,,,,,,A2600PAL,,,feba8686fd0376015258d1152923958a, -Super Cobra,Parker Bros,,,1982,PB5320,Uncommon,PB8K,A2600NTSC,,,c29f8db680990cb45ef7fef6ab57a2c2, -Super Cobra,Parker Bros,,,1982,PB5320,Uncommon,PB8K,A2600NTSC,,,cd6b3dff86a55a4a6d23007ee360ea0e, -Super Cobra,Parker Bros,,,1982,PB5320,Uncommon,PB8K,A2600PAL,,,d326db524d93fa2897ab69c42d6fb698, -Super Ferrari,Quelle,,,,,Extremely Rare,,A2600PAL,,,724613effaf7743cbcd695fab469c2a8, -Super Ferrari,Rainbow Vision,,,,SS-011,Extremely Rare,,A2600PAL,,,638cc82ea96f67674595ba9ae05da6c6, -Super Ferrari,Starsoft,,,,SS-011,Extremely Rare,,A2600PAL,,,2b27eb194e13f3b38d23c879cc1e3abf, -Super Football,Atari,,,1988,CX26154,Uncommon,A16KR,A2600NTSC,,,09abfe9a312ce7c9f661582fdf12eab6, -Super Football,Atari,,,1988,CX26154,Uncommon,A16KR,A2600PAL,,,262ccb882ff617d9b4b51f24aee02cbe, -Super Futebol,,,,,,,,A2600NTSC,,,2447e17a4e18e6b609de498fe4ab52ba, -Super Futebol,CCE,,,,CX2668,Common,,A2600NTSC,,,2f0a8bb4e18839f9b1dcaa2f5d02fd1d, -Super Hit Pak - RRaid -GPrix -Fishing -SkyJ -Chckrs,,,,,,,,A2600PAL,,,c08d0cee43077d3055febb00e5745c1d, -Super Huey UH-IX,Atari,,,1989,CX7828,Scarce,,A7800NTSC,,,cc18e3b37a507c4217eb6cb1de8c8538,http://www.atariage.com/manual_thumbs.html?SoftwareID=2149 -Super Huey UH-IX,Atari,,,1989,CX7828,Scarce,,A7800PAL,,,162f9c953f0657689cc74ab20b40280f,http://www.atariage.com/manual_thumbs.html?SoftwareID=2149 -Super Kung-Fu,Xonox,,,1983,,,,A2600PAL,,,645bf7f9146f0e4811ff9c7898f5cd93, -Super Skateboardin',Absolute,,,1988,AV-047,Scarce,,A7800NTSC,,,59b5793bece1c80f77b55d60fb39cb94,http://www.atariage.com/manual_thumbs.html?SoftwareID=2150 -Super Skateboardin',Absolute,,,1988,AV-047,Scarce,,A7800PAL,,,95d7c321dce8f57623a9c5b4947bb375,http://www.atariage.com/manual_thumbs.html?SoftwareID=2150 -Super VoleyBall,CCE,,,,,,,A2600NTSC,,,cbc373fbcb1653b4c56bfabba33ea50d, -Super-Cowboy beim Rodeo,Starsoft,,,,,,,A2600PAL,,,bdecc81f740200780db04a107c3a1eba, -SuperCharger - Escape from the Mindmaster (4 of 4),Starpath,,,1982,,,,A2600NTSC,,,639ded0c9e53bc3f91defb5dde930286, -SuperCharger Loader,Starpath,,,1982,,,,A2600NTSC,,,4565c1a7abce773e53c75b35414adefd, -Superman,Atari,John Dunn,,1978,,,,A2600PAL,,,169d4c7bd3a4d09e184a3b993823d048,http://www.atariage.com/manual_thumbs.html?SoftwareID=1380 -Superman,Atari,John Dunn,,1978,,,,A2600PAL,,,6fac680fc9a72e0e54255567c72afe34,http://www.atariage.com/manual_thumbs.html?SoftwareID=1380 -Superman,Atari,John Dunn,,1978,,,,A2600PAL,,,fd10915633aea4f9cd8b518a25d62b55,http://www.atariage.com/manual_thumbs.html?SoftwareID=1380 -Superman,Atari,John Dunn,,1978,CX2631,Common,,A2600NTSC,,,5de8803a59c36725888346fdc6e7429d,http://www.atariage.com/manual_thumbs.html?SoftwareID=1380 -Superman,Atari,John Dunn,,1978,CX2631,Common,,A2600NTSC,,,a9531c763077464307086ec9a1fd057d,http://www.atariage.com/manual_thumbs.html?SoftwareID=1380 -Superman,Atari,John Dunn,,1978,CX2631,Common,,A2600PAL,,,dbb10b904242fcfb8428f372e00c01af,http://www.atariage.com/manual_thumbs.html?SoftwareID=1380 -Superman,CCE,John Dunn,,,CX2631,Common,,A2600NTSC,,,149b543c917c180a1b02d33c12415206,http://www.atariage.com/manual_thumbs.html?SoftwareID=1380 -Surf's Up,Amiga,,,,3125,Extremely Rare,,A2600NTSC,,,aec9b885d0e8b24e871925630884095c, -Surfer's Paradise - But Danger Below!,Video Gems,,,,,Extremely Rare,,A2600PAL,,,c20f15282a1aa8724d70c117e5c9709e, -Surfer's Paradise - But Danger Below!,Video Gems,Thomas Jentzsch,Hack,,,,,A2600NTSC,,,59b70658f9dd0e2075770b07be1a35cf, -Surround (32-in-1),Atari,Alan Miller,,,,,,A2600PAL,,,a60598ad7ee9c5ccad42d5b0df1570a1, -Surround,Atari,Alan Miller,,1978,,,,A2600PAL,,,d89fedded0436fdeda7c3c37e2fb7cf1, -Surround,Atari,Alan Miller,,1978,CX2641,Common,,A2600NTSC,,,31d08cb465965f80d3541a57ec82c625, -Surround,Atari,Alan Miller,,1978,CX2641,Common,,A2600NTSC,,,4d7517ae69f95cfbc053be01312b7dba, -Surround,Atari,Alan Miller,,1978,CX2641,Common,,A2600NTSC,,,52a0003efb3b1c49fcde4dbc2c685d8f, -Surround,Atari,Alan Miller,,1978,CX2641,Common,,A2600PAL,,,c370c3268ad95b3266d6e36ff23d1f0c, -Survival Run,Milton Bradley,,,1983,4362,Rare,,A2600NTSC,,,85e564dae5687e431955056fbda10978, -SwordQuest - Earthworld,Atari,Tod Frye,,1982,,,,A2600PAL,,,a875f0a919129b4f1b5103ddd200d2fe, -SwordQuest - Earthworld,Atari,Tod Frye,,1982,CX2656,Common,,A2600NTSC,,,05ebd183ea854c0a1b56c218246fbbae, -SwordQuest - Earthworld,Atari,Tod Frye,,1982,CX2656,Common,,A2600NTSC,,,5aea9974b975a6a844e6df10d2b861c4, -SwordQuest - Fireworld,Atari,Tod Frye,,1982,CX2656,Common,,A2600NTSC,,,f9d51a4e5f8b48f68770c89ffd495ed1, -SwordQuest - Fireworld,Atari,Tod Frye,,1982,CX2656,Common,,A2600PAL,,,bf976cf80bcf52c5f164c1d45f2b316b, -SwordQuest - Waterworld,Atari,Tod Frye,,1983,CX2671,Unbelievably Rare,,A2600NTSC,,,bc5389839857612cfabeb810ba7effdc,http://www.atariage.com/manual_thumbs.html?SoftwareID=1391 -Swordfight,Intellivision Productions,,,,,New Release,,A2600NTSC,,,87662815bc4f3c3c86071dc994e3f30e, -Synthcart,,Paul Slocum,,,,,,A2600NTSC,,,2c2aea31b01c6126c1a43e10cacbfd58, -T.F. Space Invaders,,,,,,,,A2600NTSC,,,294762000e853b4319f9991c1ced5dfc, -THX-1138,Kyle Pittman,,Hack,,,,,A2600NTSC,,,becd908f9d7bb361982c3dc02d6475c6, -TP Bug,,Charles Morgan,Homebrew,,,,,A2600NTSC,,,6ffc95108e5add6f9b8abcaf330be835, -TRON - Deadly Discs,Mattel,,,,MT5662,Uncommon,,A2600NTSC,,,fb27afe896e7c928089307b32e5642ee, -TRON - Deadly Discs,Telegames,,,,MT5662,Uncommon,,A2600PAL,,,c1f209d80f0624dada5866ce05dd3399, -Tac-Scan,Sega,,,1982,,,,A2600PAL,,,06e5dc181a8eda1c31cc7c581c68b6ef, -Tac-Scan,Sega,,,1983,001-01,Uncommon,,A2600NTSC,Paddles,Paddles,d45ebf130ed9070ea8ebd56176e48a38, -Tac-Scan,Sega,Christopher Tumber,Hack,,,,,A2600NTSC,Paddles,Paddles,9e5007131695621d06902ab3c960622a, -Tank Brigade,Panda,,,,101,Rare,,A2600NTSC,,,c77d3b47f2293e69419b92522c6f6647, -Tank Command,Froggo,,,1988,FG2002,Rare,A78S4,A7800NTSC,,,5c4f752371a523f15e9980fea73b874d,http://www.atariage.com/manual_thumbs.html?SoftwareID=2180 -Tanks But No Tanks,Zimag,,,,707-111,Rare,,A2600NTSC,,,fa6fe97a10efb9e74c0b5a816e6e1958, -Tanks DX,,Charles Morgan,Hack,,,,,A2600NTSC,,,082fdc8bd47fef01482ce5883c4ffdb8, -Tape Worm,Spectravideo,,,,,,,A2600PAL,,,8ed73106e2f42f91447fb90b6f0ea4a4, -Tape Worm,Spectravideo,,,1982,SA-204,Rare,,A2600NTSC,,,de3d0e37729d85afcb25a8d052a6e236, -Tapper,Sega,,,1983,010-01,Extremely Rare,,A2600NTSC,,,c0d2434348de72fa6edcc6d8e40f28d7, -Task Force,Froggo,,,1987,FG 1003,Rare,,A2600NTSC,,,0c35806ff0019a270a7acae68de89d28, -Tax Avoiders,American Videogame,,,1982,,Rare,,A2600NTSC,,,a1ead9c181d67859aa93c44e40f1709c, -Taz,Atari,,,,CX2699,Rare,,A2600NTSC,,,4702d8d9b48a332724af198aeac9e469, -Taz,Atari,,,,CX2699,Rare,,A2600NTSC,,,7574480ae2ab0d282c887e9015fdb54c, -Tazer The Fish,,,Homebrew,,,,,A2600NTSC,,,ab60ea7b707c58d356cad858eb18db43, -Teddy Apple,HomeVision,,,,,,,A2600PAL,,,8c2fa33048f055f38358d51eefe417db, -Telepathy,Atari,,Prototype,,,,,A2600NTSC,,,3d7aad37c55692814211c8b590a0334c, -Teller-Jonglieren! (a.k.a. Tanzende Teller),Starsoft,,,,,,,A2600PAL,,,203b1efc6101d4b9d83bb6cc1c71f67f, -Tempest,Atari,Carla Meninsky,Prototype,1983,,,,A2600NTSC,,,c830f6ae7ee58bcc2a6712fb33e92d55, -Tennis (32-in-1),Atari,Alan Miller,,,,,,A2600PAL,,,16e04823887c547dc24bc70dff693df4, -Tennis,Activision,Alan Miller,,1981,,,,A2600PAL,,,e3ed4ba3361756970f076e46e9cad1d2, -Tennis,Activision,Alan Miller,,1981,AG-007,Common,,A2600NTSC,,,42cdd6a9e42a3639e190722b8ea3fc51, -Tennis,Activision,Alan Miller,,1981,AG-007,Common,,A2600NTSC,,,961112b74a920a5242e233480326c356, -Tennis,Activision,Alan Miller,,1981,AG-007,Common,,A2600NTSC,,,aca09ffea77174b148b96b205109db4d, -Tennis,Activision,Alan Miller,,1981,AG-007,Common,,A2600PAL,,,a5c96b046d5f8b7c96daaa12f925bef8, -Tennis,Dactar,Alan Miller,,,,,,A2600PAL,,,30685b9b6ebd9ba71536dd7632a1e3b6, -Tennis,Pet Boat,Alan Miller,,,,,,A2600PAL,,,1f5a2927a0b2faf87540b01d9d7d7fd1, -Tennis,Starsoft,Alan Miller,,,,,,A2600PAL,,,04b488d4eef622d022a0021375e7e339, -Test Cartridge,,,,,,,,A2600NTSC,,,5c73693a89b06e5a09f1721a13176f95, -Test Tape - Standalone,Atari,,,,MAO17600,,,A2600NTSC,,,38bd172da8b2a3a176e517c213fcd5a6, -Testcart,,Paul Slocum,,,,,,A2600NTSC,,,f0631c6675033428238408885d7e4fde, -Tetris 2600,,Colin Hughes,Homebrew,,,,,A2600NTSC,,,b0e1ee07fbc73493eac5651a52f90f00, -Tetris 2600,,Colin Hughes,Homebrew,,,,,A2600NTSC,,,cae8f83c06831ec7bb6a3c07e98e9342, -Texas Chainsaw Massacre,Wizard Video Games,,,,8,Extremely Rare,,A2600NTSC,,,5eeb81292992e057b290a5cd196f155d, -The Year 1999,Rainbow Vision,,,,,,,A2600PAL,,,522c9cf684ecd72db2f85053e6f6f720, -This Planet Sucks (16K),,,Homebrew,,,,,A2600NTSC,,,3b64a00ce147c3c29f7f8f8e531d08d8, -This Planet Sucks,,,Homebrew,,,,,A2600NTSC,,,0acaf71e60b89f6b6eab63db6ab84510, -This Planet Sucks,,,Homebrew,,,,,A2600NTSC,,,a98b649912b6ca19eaf5c2d2faf38562, -This Planet Sucks,,,Homebrew,,,,,A2600NTSC,,,dfe6aa7443bb813cefa35a4cf4887422, -Threshold,Tigervision,,,,7-003,Rare,,A2600NTSC,,,e63a87c231ee9a506f9599aa4ef7dfb9, -Threshold,Tigervision,,,,7-003,Rare,,A2600PAL,,,67684a1d18c85ffa5d82dab48fd1cb51, -Thrust (V1.2),,Thomas Jentzsch,Homebrew,,,,,A2600NTSC,,,4776046cec4b6a71f838e55656d5db94, -Thrust (V1.21),,Thomas Jentzsch,Homebrew,,,,,A2600NTSC,,,e1e09e2f280e8e142121a377d0dc1b46, -Thrust (V1.22) (Booster Grip),,Thomas Jentzsch,Homebrew,,,,,A2600NTSC,BoosterGrip,BoosterGrip,de7bca4e569ad9d3fd08ff1395e53d2d, -Thrust Demo (V0.1),,,Homebrew,,,,,A2600NTSC,,,346555779a2d51b48833463b5433472f, -Thrust Demo (V0.2),,,Homebrew,,,,,A2600NTSC,,,1442d1b35a6478fba22ae7dd1fcb5634, -Thrust Demo (V0.9),,,Homebrew,,,,,A2600NTSC,,,ba3b0eebccc7b791107de5b4abb671b4, -Thrust Demo (V1.0),,,Homebrew,,,,,A2600NTSC,,,041b5e56bbc650db574bd8db3fae2696, -Thunderground,Sega,,,1983,,,,A2600PAL,,,1428029e762797069ad795ce7c6a1a93, -Thunderground,Sega,,,1983,003-01,Rare,,A2600NTSC,,,cf507910d6e74568a68ac949537bccf9, -Thwocker,Activision,Charlie Heath,Prototype,1984,,,DC8K,A2600NTSC,,,c032c2bd7017fdfbba9a105ec50f800e, -Time Machine (a.k.a. Great Escape -Asteroid Belt),,,,,,,,A2600PAL,,,7576dd46c2f8d8ab159d97e3a3f2052f, -Time Pilot,Coleco,,,,2663,Rare,,A2600NTSC,,,4e99ebd65a967cabf350db54405d577c, -Time Pilot,Coleco,,,,2663,Rare,,A2600NTSC,,,fc2104dd2dadf9a6176c1c1c8f87ced9, -Time Race 2,Funvision,,,,,,,A2600PAL,,,6d9afd70e9369c2a6bff96c4964413b7, -Time Race,Goliath,,,,,,,A2600PAL,,,5db9e5bf663cad6bf159bc395f6ead53, -Time Test Demo,,,,,,,,A2600PAL,,,efb47d70b2965ce689e2c5757616b286, -Time Warp,CCE,,,,,,,A2600PAL,,,bc3057a35319aae3a5cd87a203736abe, -Time Warp/Time Warp,Zellers/CCE,,,,C-845,Extremely Rare,,A2600NTSC,,,332f01fd18e99c6584f61aa45ee7791e, -Title Match Pro Wrestling,Absolute,Alex DeMeo,,1987,AG-041,Rare,,A2600NTSC,,,12123b534bdee79ed7563b9ad74f1cbd, -Title Match Pro Wrestling,Absolute,Alex DeMeo,,1987,AG-041,Rare,,A2600NTSC,,,da6465a34d2e44d26aa9a2a0cd1bce4d, -Title Match Pro Wrestling,Activision,Alex DeMeo,,1989,AG-041,Rare,,A2600NTSC,,,784176346e9422733d55c427230e5bad, -Titlematch Pro Wrestling,Absolute,,,1989,AV-041,Rare,,A7800PAL,,,3bb9c8d9adc912dd7f8471c97445cd8d,http://www.atariage.com/manual_thumbs.html?SoftwareID=2177 -Titlematch Pro Wrestling,Absolute,,,1989,AV-041,Scarce,,A7800NTSC,,,1af475ff6429a160752b592f0f92b287,http://www.atariage.com/manual_thumbs.html?SoftwareID=2177 -Tom Boy,Suntek,,,,,Extremely Rare,,A2600NTSC,,,ece908d77ab944f7bac84322b9973549, -Tom's Eierjagd,Starsoft,,,,,,,A2600PAL,,,d85f1e35c5445ac898746719a3d93f09, -Tomarc the Barbarian,Xonox,,,,,Rare,DC8K,A2600NTSC,,,8bc0d2052b4f259e7a50a7c771b45241, -Tomcat - The F-14 Flight Simulator,Absolute,Dan Kitchen,,1988,AK-046,Extremely Rare,A16K,A2600PAL,,,2ac3a08cfbf1942ba169c3e9e6c47e09, -Tomcat F14,Absolute,Dan Kitchen,,1989,AV-046,Scarce,,A7800NTSC,,,c3903ab01a51222a52197dbfe6538ecf,http://www.atariage.com/manual_thumbs.html?SoftwareID=2176 -Tomcat F14,Absolute,Dan Kitchen,,1989,AV-046,Scarce,,A7800PAL,,,682338364243b023ecc9d24f0abfc9a7,http://www.atariage.com/manual_thumbs.html?SoftwareID=2176 -Tooth Protectors,DSD-Camelot,,,,,Unbelievably Rare,PB8K,A2600NTSC,,,fa2be8125c3c60ab83e1c0fe56922fcb, -Top Gun (a.k.a. Air Patrol),Starsoft,,,,,,,A2600PAL,,,e0b24c3f40a46cda52e29835ab7ad660, -Touchdown Football,Atari,,,1988,CX7823,Common,A78SG,A7800NTSC,,,208ef955fa90a29815eb097bce89bace,http://www.atariage.com/manual_thumbs.html?SoftwareID=2151 -Tower Toppler,Atari,,,1988,CX7856,Common,A78S4R,A7800NTSC,,,8d64763db3100aadc552db5e6868506a,http://www.atariage.com/manual_thumbs.html?SoftwareID=2152 -Tower Toppler,Atari,,,1988,CX7856,Common,A78S4R,A7800PAL,,,32a37244a9c6cc928dcdf02b45365aa8,http://www.atariage.com/manual_thumbs.html?SoftwareID=2152 -Towering Inferno,US Games,,,1982,VC 1009,Uncommon,,A2600NTSC,,,0aa208060d7c140f20571e3341f5a3f8, -Track and Field,Atari,,,,CX26125/7,Rare,,A2600NTSC,,,6ae4dc6d7351dacd1012749ca82f9a56, -Traffic,,,,,,,,A2600NTSC,,,4df9d7352a56a458abb7961bf10aba4e, -Treasure Below,Video Gems,,,,,,,A2600PAL,,,66706459e62514d0c39c3797cbf73ff1, -Treasure Below,Video Gems,Thomas Jentzsch,Hack,,,,,A2600NTSC,,,81414174f1816d5c1e583af427ac89fc, -Tree Hugger (12-20-2002 Pave Demo),Billy Eno,,Homebrew,,,,,A2600NTSC,,,65c6406f5af934590097c8c032ebb482, -Trick Shot,Imagic,Dennis Koble,,1982,IA3000,Rare,,A2600NTSC,,,24df052902aa9de21c2b2525eb84a255, -Trick Shot,Imagic,Dennis Koble,,1982,IA3000,Rare,,A2600PAL,,,dca90ea1084a2fdbe300d7178ca1a138, -Tuby Bird (a.k.a. Vogel Flieh),Starsoft,,,,SS-020,,,A2600PAL,,,e17699a54c90f3a56ae4820f779f72c4, -Tunnel Runner,CBS Electronics,,,,4L-2520,Rare,CBS12K,A2600NTSC,,,b2737034f974535f5c0c6431ab8caf73, -Tunnel Runner,CBS Electronics,,,,4L-2520,Rare,CBS12K,A2600NTSC,,,efefc02bbc5258815457f7a5b8d8750a, -Turmoil,20th Century Fox,,,,,,,A2600NTSC,,,152e55f88af3ff647e75a3070b7b6842, -Turmoil,20th Century Fox,,,,11007,Uncommon,,A2600NTSC,,,7a5463545dfb2dcfdafa6074b2f2c15e, -Tutankham,Parker Bros,,,1983,,,PB8K,A2600PAL,,,66c2380c71709efa7b166621e5bb4558, -Tutankham,Parker Bros,,,1983,PB5340,Uncommon,PB8K,A2600NTSC,,,085322bae40d904f53bdcc56df0593fc, -UFO #6,,,Hack,,,,,A2600NTSC,,,6fc27a9233fc69d28d3f190b4ff80f03, -UFO Patrol,,,,,,Extremely Rare,,A2600NTSC,,,619de46281eb2e0adbb98255732483b4, -Universal Chaos,Telegames,,,,7062 A305,Rare,,A2600NTSC,,,81a010abdba1a640f7adf7f84e13d307, -Up 'n Down,Sega,,,1983,009-01,Extremely Rare,,A2600NTSC,,,a499d720e7ee35c62424de882a3351b6, -Vanguard,Atari,,,,CX2669,Common,A8K,A2600NTSC,,,c6556e082aac04260596b4045bc122de, -Vanguard,Atari,,,,CX2669,Common,A8K,A2600PAL,,,3caa902ac0ce4509308990645876426a, -Vanguard,CCE,,,,,,A8K,A2600NTSC,,,7ef74879d7cb9fa0ef161b91ad55b3bb, -Vault Assault,Prescott,,,,,,,A2600NTSC,,,787ebc2609a31eb5c57c4a18837d1aee, -Ventrra Invaders 2002,,Charles Morgan,Hack,,,,,A2600NTSC,,,39da69ff9833f8c143f03b6e0e7a996b, -Venture 2,Tim Snider,,Hack,,,,,A2600NTSC,,,7ca7a471d70305c673fedd08174a81e8, -Venture,Atari,,,,CX26145,Rare,,A2600PAL,,,c63a98ca404aa5ee9fcff1de488c3f43, -Venture,CBS Electronics,,,,,,,A2600PAL,,,345758747b893e4c9bdde8877de47788, -Venture,Coleco,,,,2457,Common,,A2600NTSC,,,3e899eba0ca8cd2972da1ae5479b4f0d, -Vertical Playfield Demo 1,,,,,,,,A2600NTSC,,,6cd1dc960e3e8d5c5e0fbe67ab49087a, -Vertical Playfield Demo 2,,,,,,,,A2600NTSC,,,ea6d40db5498d6386571a76df448aa4c, -Vertical Rainbow Demo,,,,,,,,A2600NTSC,,,ce6c4270f605ad3ce5e82678b0fc71f8, -Vertical Ship Demo 1,,,,,,,,A2600NTSC,,,bdc381baf7c252c63739c5e9ed087a5c, -Video Checkers,Atari,Carol Shaw,,1978,CX2636,Rare,,A2600NTSC,,,539d26b6e9df0da8e7465f0f5ad863b7,http://www.atariage.com/manual_thumbs.html?SoftwareID=1427 -Video Checkers,Atari,Carol Shaw,,1978,CX2636,Rare,,A2600PAL,,,193f060553ba0a2a2676f91d9ec0c555,http://www.atariage.com/manual_thumbs.html?SoftwareID=1427 -Video Chess,Atari,Bob Whitehead,,1978,CX2645,Uncommon,,A2600NTSC,,,f0b7db930ca0e548c41a97160b9f6275,http://www.atariage.com/manual_html_page.html?SoftwareID=1429 -Video Chess,Atari,Bob Whitehead,,1978,CX2645,Uncommon,,A2600PAL,,,3ef9573536730dcd6d9c20b6822dbdc4,http://www.atariage.com/manual_html_page.html?SoftwareID=1429 -Video Cube,CCE,,,,,,,A2600NTSC,,,ed1492d4cafd7ebf064f0c933249f5b0, -Video Jogger,Exus,,,,,Extremely Rare,,A2600NTSC,,,4191b671bcd8237fc8e297b4947f2990, -Video Life,CommaVid,,,,,Extremely Rare,,A2600NTSC,,,497f3d2970c43e5224be99f75e97cbbb, -Video Olympics - Pong Sports,Atari,Joe Decuir,,1977,CX2621,Common,,A2600NTSC,Paddles,Paddles,60e0ea3cbe0913d39803477945e9e5ec, -Video Olympics - Pong Sports,Atari,Joe Decuir,,1977,CX2621,Common,,A2600NTSC,Paddles,Paddles,c00b65d1bae0aef6a1b5652c9c2156a1, -Video Olympics - Pong Sports,Atari,Joe Decuir,,1977,CX2621,Common,,A2600PAL,Paddles,Paddles,77d0a577636e1c9212aeccde9d0baa4b, -Video Pinball,Atari,Bob Smith,,1980,,,,A2600PAL,,,a2424c1a0c783d7585d701b1c71b5fdc,http://www.atariage.com/manual_html_page.html?SoftwareID=1437 -Video Pinball,Atari,Bob Smith,,1980,CX2648,Uncommon,,A2600NTSC,,,107cc025334211e6d29da0b6be46aec7,http://www.atariage.com/manual_html_page.html?SoftwareID=1437 -Video Pinball,Atari,Bob Smith,,1980,CX2648,Uncommon,,A2600PAL,,,6e59dd52f88c00d5060eac56c1a0b0d3,http://www.atariage.com/manual_html_page.html?SoftwareID=1437 -Video Reflex,Exus,,,,,Extremely Rare,,A2600NTSC,,,ee659ae50e9df886ac4f8d7ad10d046a, -Video Simon,,Mark De Smet,Homebrew,,,,,A2600NTSC,,,16f494f20af5dc803bc35939ef924020, -Video Time Machine,,Chris Cracknell,Homebrew,,,,,A2600NTSC,,,93acd5020ae8eb5673601e2edecbc158, -Virtual Pet (Demo 1),,,,,,,,A2600NTSC,,,4f0071946e80ca68edfdccbac86dcce0, -Virtual Pet (Demo 2 update),,,,,,,,A2600NTSC,,,1f349dd41c3f93c4214e5e308dccb056, -Virtual Pet (V007) (after Demo 2 update),V007,,,,,,,A2600NTSC,,,3b80b8f52a0939e16b5059f93a3fc19a, -Volleyball,Dactar,,,,,,,A2600PAL,,,5faffe1c4c57430978dec5ced32b9f4a, -Volleyball,Starsoft,,,,,,,A2600PAL,,,4d8396deeabb40b5e8578276eb5a8b6d, -Wabbit,Apollo,,,,AP 2010,Rare,,A2600NTSC,,,6041f400b45511aa3a69fab4b8fc8f41, -Wachroboter Jagt Jupy (a.k.a. Hey! Stop!),Starsoft,,,,,,,A2600PAL,,,1c5796d277d9e4df3f6648f7012884c4, -Walker,,,,,,,,A2600PAL,,,d175258b2973b917a05b46df4e1cf15d, -Wall Ball,Avalon Hill,,,,50030,Extremely Rare,,A2600NTSC,,,d3456b4cf1bd1a7b8fb907af1a80ee15, -Wall Defender,Bomb,,,,CA285,Extremely Rare,,A2600NTSC,,,c16fbfdbfdf5590cc8179e4b0f5f5aeb, -War Of The Worlds,,Kyle Pittman,Homebrew,,,,,A2600NTSC,,,9436b7ad131b5a1f7753ce4309ba3dee, -Warlords,Atari,Carla Meninsky,,1981,CX2610,Uncommon,,A2600NTSC,Paddles,Paddles,cbe5a166550a8129a5e6d374901dffad,http://www.atariage.com/manual_html_page.html?SoftwareID=1442 -Warlords,Atari,Carla Meninsky,,1981,CX2610,Uncommon,,A2600PAL,Paddles,Paddles,0c80751f6f7a3b370cc9e9f39ad533a7,http://www.atariage.com/manual_html_page.html?SoftwareID=1442 -Warplock,Data Age,,,1982,DA 1002,Common,,A2600NTSC,,,679e910b27406c6a2072f9569ae35fc8, -Warring Worms (Beta 1),Baroque Gaming,Brian Eno,Homebrew,,,,,A2600NTSC,,,7a64b5a6e90619c6aacf244cdd7502f8, -Warring Worms (Beta 2),Baroque Gaming,Brian Eno,Homebrew,,,,,A2600NTSC,,,2f66ebf037321ed0442ac4b89ce22633, -Warring Worms,Baroque Gaming,Brian Eno,Homebrew,,,,,A2600NTSC,,,7e7c4c59d55494e66eef5e04ec1c6157, -Wasp (Standard Edition),,Mark Ball,Homebrew,2009,,,A7832,A7800NTSC,,,412cc5bfa08bd03244b9c4e8d46cd0a0, -Water Ski,Froggo,,,1988,FG2002,Scarce,A78S4,A7800NTSC,,,427cb05d0a1abb068998e2760d77f4fb,http://www.atariage.com/manual_thumbs.html?SoftwareID=2157 -Wavy Line Test,,,,,,,,A2600NTSC,,,0d7e630a14856f4d52c9666040961d4d, -Weltraum Tunnel,Bitcorp,,,,,,,A2600PAL,,,c5387fc1aa71f11d2fa82459e189a5f0, -Weltraum Tunnel,Starsoft,,,,,,,A2600PAL,,,bce4c291d0007f16997faa5c4db0a6b8, -Westward Ho,Playaround,,,,,,,A2600PAL,,,d47387658ed450db77c3f189b969cc00, -Wing War,,Thomas Jentzsch,Hack,,,,,A2600NTSC,,,0cdd9cc692e8b04ba8eb31fc31d72e5e, -Wing War,Imagic,Michael Greene,,,EIZ-002-04,Extremely Rare,,A2600PAL,,,4e02880beeb8dbd4da724a3f33f0971f, -Wing War,Imagic,Michael Greene,,,EIZ-002-04,Extremely Rare,,A2600PAL,,,9d2938eb2b17bb73e9a79bbc06053506, -Winter Games,Atari,,,1987,CX7831,Scarce,A78SGR,A7800NTSC,,,3799d72f78dda2ee87b0ef8bf7b91186,http://www.atariage.com/manual_thumbs.html?SoftwareID=2153 -Winter Games,Epyx,,,1987,,,,A2600PAL,,,8c36ed2352801031516695d1eeefe617, -Winter Games,Epyx,,,1987,8056100251,Rare,,A2600NTSC,,,83fafd7bd12e3335166c6314b3bde528, -Wizard of Wor,CBS Electronics,,,,M8774,Rare,,A2600NTSC,,,7e8aa18bc9502eb57daaf5e7c1e94da7, -Wizard of Wor,CBS Electronics,,,,M8774,Rare,,A2600PAL,,,663ef22eb399504d5204c543b8a86bcd, -Wizard,,,Prototype,,,,,A2600NTSC,,,3b86a27132fb74d9b35d4783605a1bcb, -Wizard,,,Prototype,,,,,A2600NTSC,,,7b24bfe1b61864e758ada1fe9adaa098, -Wizard,,,Prototype,,,,,A2600NTSC,,,c43bd363e1f128e73ba5f0380b6fd7e3, -Word Zapper,US Games,,,,,,,A2600PAL,,,37527966823ee9243d34c7da8302774f, -Word Zapper,US Games,,,,VC 1003,Uncommon,,A2600NTSC,,,ec3beb6d8b5689e867bafb5d5f507491, -Worm (0703),,Mark Ball,Homebrew,2010,,,A7816,A7800NTSC,,,6813ffff510f930c867b3f0aba78ac85, -Worm War I,20th Century Fox,,,1982,,,,A2600PAL,,,52b448757081fd9fabf859f4e2f91f6b, -Worm War I,20th Century Fox,,,1982,11001,Uncommon,,A2600NTSC,,,87f020daa98d0132e98e43db7d8fea7e, -Worm War I,CCE,,,,,,,A2600NTSC,,,007d18dedc1f0565f09c42aa61a6f585, -X-Doom V.26,,,,,,,,A2600NTSC,,,0d35618b6d76ddd46d2626e9e3e40db5, -X-Doom V.27,,,,,,,,A2600NTSC,,,f613aad84d2163d6b197b220bfec1b7e, -X-Man,CosmoVision-Universal Gamex,,,,GX-001,Unbelievably Rare,,A2600NTSC,,,5961d259115e99c30b64fe7058256bcf, -X-Man,CosmoVision-Universal Gamex,,,,GX-001,Unbelievably Rare,,A2600NTSC,,,f38358cd8f5ecfedffd5aca1aa939f18, -Xaxyrax Road,,Charles Morgan,Hack,,,,,A2600NTSC,,,9e2c7299c69b602443d327c7dad51cbf, -Xenophobe,Atari,,,1989,CX7858,Scarce,A78SG,A7800NTSC,,,05fb699db9eef564e2fe45c568746dbc,http://www.atariage.com/manual_thumbs.html?SoftwareID=2154 -Xenophobe,Atari,,,1989,CX7858,Scarce,A78SG,A7800PAL,,,70937c3184f0be33d06f7f4382ca54de,http://www.atariage.com/manual_thumbs.html?SoftwareID=2154 -Xenophobe,Atari,,,1990,,,,A2600PAL,,,f02ba8b5292bf3017d10553c9b7b2861, -Xenophobe,Atari,,,1990,CX26172,Extremely Rare,,A2600PAL,,,eaf744185d5e8def899950ba7c6e7bb5, -Xevious,Atari,,,1989,CX7810,Common,,A7800NTSC,,,d7dc17379aa25e5ae3c14b9e780c6f6d,http://www.atariage.com/manual_thumbs.html?SoftwareID=2155 -Xevious,Atari,,,1989,CX7810,Common,,A7800PAL,,,b1a9f196ce5f47ca8caf8fa7bc4ca46c,http://www.atariage.com/manual_thumbs.html?SoftwareID=2155 -Xevious,Atari,Tod Frye,Prototype,,CX2695,,,A2600NTSC,,,c6688781f4ab844852f4e3352772289b, -Xevious,CCE,,,,,,,A2600NTSC,,,24385ba7f5109fbe76aadc0a375de573, -Yahtzee,Hozer Video Games,,Homebrew,,,,,A2600NTSC,,,d090836f0a4ea8db9ac7abb7d6adf61e, -Yar vs. Yar,,Justin J. Scott,Hack,,,,,A2600NTSC,,,096649575e451508006b17e0353259a5, -Yars' Defeat,,Justin J. Scott,Hack,,,,,A2600NTSC,,,159e5cd6ccb968015f49aed5adbc91eb, -Yars' Revenge,Atari,Howard Scott Warshaw,,,CX2655,Common,,A2600NTSC,,,5f681403b1051a0822344f467b05a94d,http://www.atariage.com/manual_thumbs.html?SoftwareID=1452 -Yars' Revenge,Atari,Howard Scott Warshaw,,,CX2655,Common,,A2600NTSC,,,c5930d0e8cdae3e037349bfa08e871be,http://www.atariage.com/manual_thumbs.html?SoftwareID=1452 -Yars' Revenge,Atari,Howard Scott Warshaw,,,CX2655,Common,,A2600PAL,,,e91d2ecf8803ae52b55bbf105af04d4b,http://www.atariage.com/manual_thumbs.html?SoftwareID=1452 -Yellow Submarine,,Kyle Pittman,Hack,,,,,A2600NTSC,,,3856b9425cc0185ed770376a62af0282, -Z-Tack 2,,Steve Engelhardt,Hack,,13,,,A2600NTSC,,,97d0151beb84acbe82aa6db18cd91b98, -Z-Tack,Bomb,,,,13,Extremely Rare,,A2600NTSC,,,c469151655e333793472777052013f4f, -Zaxxon,CBS Electronics,,,,,,,A2600PAL,,,25bb080457351be724aac8a02021aa92, -Zaxxon,CBS Electronics,,,,4L-2277,Extremely Rare,,A2600NTSC,,,eea0da9b987d661264cce69a7c13c3bd, -Zero Patrol,,Charles Morgan,Hack,,,,,A2600NTSC,,,c5a76bafc4676edb76e0126fb9f0fb2d, -Zoo Fun,HomeVision,,,,,Extremely Rare,,A2600PAL,,,fb833ed50c865a9a505a125fc9d79a7e, -b*nQ,,Ken Siders,Homebrew,2007,,,,A7800NTSC,,,ce6fbdc7b037a4efdaf87267f5f292cc,http://www.atariage.com/software_page.html?SoftwareID=4105 \ No newline at end of file From 8c0c115e69bf8cb2707ce33ad316c8e762bde370 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:47:34 -0400 Subject: [PATCH 82/82] Delete EMU7800.dll --- References/EMU7800.dll | Bin 134656 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 References/EMU7800.dll diff --git a/References/EMU7800.dll b/References/EMU7800.dll deleted file mode 100644 index c920cdeb79e44b3e5cebe78d187cf1e93114c5b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 134656 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�lQC39s>!L?wK;E`xVAw zl}MNqBBkmBnU;MZb7e8SQ;A4y@llxi?^x?y z81tWRQdH7er>Ft$n;B;8Cg~p(b$;se$T4@Y``kqvE^K3{xk8oKSg$WjL9<7 zi0-N*A5NlU<{mg*Q`wHVEMh+0=a*ZFWv>Y1jXG~L|ounvm4F4%sf)@5igY5Zf6 ztTocLrFRlNJ_{DVT{T#{!s5qgIN4?)mw+48?GC1y%krY z_xOLpZS<4)iRYKM+1~#^p42GDqu49^3*Zb!y<=dMnSsSie%&(zv1E4Btd7X~5j~8^ z`4KrkqL&eQiC`@zXHuopl%W)!J`x$};!Oa*vN;~B)Kb(Lv={Dtsz9n_XHxO*;SO9! zD>38U6ElOJ=6D;8qW?7P1)g7zQN!H5=X3j7bdEJoYXNlLq%qhPwuXt+ejAEvC;$G< zG3UCgHZJ+h-FM&pi=&56yvVMw*^d-Q%5Df1q-c zGplw2qiQxCoym@O#+1bAsIK)+sDSm3*nw=?Nu*;JPjotIC$qdQ?WAMlolYr|A;PY( z-a)nkc0)a-qnX{MZbsXYZ!H@0OE1U2D&N`st^28->T0 zJ$cw?O6;>Wz8>`S^VULKeYjqV>vQ`01nyW4VCGJAx60bdU;-tA0tJZn?da-KxubHr zhnFe!IH=Ttd_9$BIJ0T*`JwdDMwDte#tKYESY+zkj50DOtW%6phVF?dd~0T31X5{_ z$FaasEFAux3%_&-Q)PG()5ZBtMGqqAXltwaSbdgFYAU-CE3VS-8bP~^lWlRDL9B3~ z<0eob8diMRB@_^UKyyT*)_nppVhe!zaTFJj4b4wyNZ}ylfrJC`1GQCvG1I?EnbjDN zoI@I%jT9b(K*I|ngoKKt6V=S_WxT!6-gMwxT^VrZp ztmXtSG-dFY_X?)+@@nWrW`{17qU`F`GUjbJwRx}ZAEtF)y4ts?0sr#NI^3nr0Apa$ z0gXYlV5|WIPtqDRK{iOhh+!BqXACrCa>&&P#AY^_vL1qCg%*s>_zE#QMdBQp!9li0 zNFuHY$0x+hB3O$(jq0>3a+B)9NvMkzx|qsh7@qMKpel=hu2qV+Zce)OZkCS!2mjoS`0>$wE((~S^#}VEr8CW7C`Tj z!kJLp!kkX+H>xbjE9GQX#53Z_iVh4SYOQRYx~aB2FO*Jsj4WVl5qU196XV9|Z8&+5 zLT@0_lU4N+%v>VQKIclrOrvW`c`=?bR^6O*w?2RFBOwMj%e3iB% z+c8y(_77&4ZJz|N&$)(KpqESa?_dlc-6(mmkdnv5DO7uQi?s4qClk*gC?|h#q#b2Y zd>1Lcm)7$w*Z4A~3E$inamf4Sn^Al>*Ymx$#+Nb8`N9NRn(&QU5ZlTMU%z-V%j1Fi z_IScc%y9T7r{_`B;oqooMr3Z8L%QjgBKuUJstT{Stm|>0?)QGh)Kw&o_)A4jQR-kt zE{U6c8>d1dtSb68vT>{uXTPSQ8mG7n;IzfwM4)#P!t8z;4*@9P0?4c4E+N!sPydWj zxZ~L;r+6}+KfztBY#Hw0)R)BnZf%4Wu&oigV9GWKU9x}30EyEs)lh;|<} zwiFuRfloFso-0G2oMLIcGYC)t-kF3DwVFj?6i?Bqs1pdm)}z+fTI672I*NAqJ)d#3 zjE#&``E2~~WbGyx()o#b7?YKskCYqZ-5bZ-Go8`WG08~z6ksOWHL(1NQc{C>-XSym z`$+k8#3ylluzjAhJB`hMo|^9-{tq!nH#z(da#&ZLq0f#F-;wEzjSfI4OyO?l?9KHi z)+eA`G)S39!CP78f(2Md;^G7zl&go1#P5qnMhd4cU0`*_OIr%--f*f7U}Irv`iLli zbKT4FdwOA$b2$mt6|8GffAP{PBs_6=5q>wWn7{okP%04q~c*v(Skq+o9pH5ATV@BFqYE8Fljdl9q^8c=(L6dIH z3_qEUr<2%EdU1Ag012qVbnCp>?ldN!ok>I$hHr~?k9S1UG0u$BF{Qt?U*3mF={;`# z7W#_*hfbm|fmcuMV2Rw6MnB(2votV~%3FEoN|*pZ+-?v80I|~`1OVa=gAf3Sw;6;0 zK)l@`1V9zBe|QD%{L|*lr+0ovvpWY;-WX-DlrTY<>`5p&I`flxvppK0?XAb}M(XI}3qge)}$p)@SdK`#QVw4umm}dM9p}n?Uw=8QBGZ zyp;Vq+`H+={N>gO}xxo*~8SM^iOLR=V5=cci!XiS)%*>8X{}j%{d!fiE z`C~lPpQ=&>$2(7<8Q{5X-o?*2)>MNG2Ryf3n+!l2J=&N2BjsV_F_-*5+w_bpv_^h< zr0-n_rscmXuUfgAV$-SwfL1?b5CTYFdoIeuKik`aq9?snyaWQxcXRy+u2?8-mz z=B|*g+V-$0DCE4WI8C0d{v)$7>2~tuy>N)^G03cs%mTSu#pibBxy(@u_DOJ!iB+p0 zG!Eg9`-hni%O?PBBx;S@raaeDz*gJiy^Oh9D%v%%9_Ay=zw~!d8Q14h9qMm@Q5fPvVKIDiMUZBa(+bCL|iHn89%~pQ!&Wc zZLfjzYGASkrfOiT5BB&_uMhS4kUPHycGSRh4P20wVj=%dB^98BKD4MN=>i|w=_ffD zp`T=-pQJg*8lev@Qc18?8S`EvbptI55F6;l*41l?i=i=e88B|=6-XQFL&d{@(go|7 zHmk7dqbVzTQEVd?WW~;Vv1Bmr@DL$sT}|5?$>N0RxTe9gyW^?o9+kj}?I~{5R*r)} z-u1}c_HLjI$JT|o{(xzOo+GeLNnSiW#6TA_HUXWV5lJ%7j%WH)dqgzI=E#GuJu)s7 zUW&F)(P);G=L$%IeV`Gz0Lez(@`|p6#eBi~8LO~ngL#5uy$~|j@^N(vH>Gp(w$*3Q ztvK}5XOK4;gwv~W)al5Be>fvGD1Gm#rjxC{AG)#C`Qz#b2)k|SNH68~1N3gT@?ENb zAz#P(tYZ5t@}(PZ(r4&H(HJ?JJ_DE|p&2E!kHu+Xg%;@>(NYe*W+aZ1c33;(73xIH zS?UTEW6pAsvw_LZz+|VEi?-Pr@$$;?=XPcze5y?R^^J8=Vv{@7BV-bNUR|`NNwLt3lwn|c-x^h9?@f&BAGpc-j7RiiX>Gj)gum)0g#L4VyQT`0e z7awD-VOA@TczqlJ=`saCANnr_Apj7cFbDyF_@qGy0K~r46p-Vgi{^Otb+{G&`m|;730e4D3IEN6y?;Qo_coIDc%SEO>irl@2B(O&cL(q{ zAB`%%%d@HD{M5HVL*EgTJxvTaV9(yIAS=Dl_Ry_6+^GKo*=4+)M333tj7Hz1&~GLB zD7*3zlu${fGD_Ka41cePnWVePW|^Ihc>hR< z=SDOt=cDolmG@D72Gyrg%WStp;fjE2$T1%|rjf(y@QuPBs{%Ueb+$STKLyIVmQ*LM`XPRV*t!U-VGwDlv!nB%7Qq;RB_{brJ8iQ5_qX}VrW6KNEx#eRHR`z zp%@n51}l9%GKp*(S9PcA8qdJK8Q6^zQj^MmMy)dV^ABlgmfi>WgOMmrT@VU<+APl6F3jP#AN+UWZ7r(*0S&! z4$*6)EO$i)mIkwoiV}t*xl&73wc)5VAL%eI!nb;z#}DqEm9aVclew=_gziI5JE zN2$Jqd%s8P(Gp6tSQ*Cxf%ruw_TDh52o)w3x6@m3hNz?WXG0Cmo0@=`p@hLqy9{uQ*g z_c8nqoTrG~`I8Y`NRP8LOrGBo$!{5NPq@jIiA2wMo1CXWAe!tMZ?_YmP3AYlVZVc{ zl4{oNVV>%ga&}y!;{`e|$&oR{e+GA~l4=nrHK7Ws$n8P*%4Cu3=2>|bfN3MedxG)G z{kmhdQo-j@{D3p2?yD%dvLSl7fc2nr(Jt;_zEJf^bxu(Eao_Lg8k2{|q*_~TN11|h zCfqz@fzW?typJ1zgABp2Qi^Xfs@WH1cOq)j%7U{O?UCf2ppDd#2qs8EyR0V>j3HTr z=i!5DRW^!#NB2GCM^6R%T>y2SN`f#g8Ee|zik6sAU0>Ryt|7#Doe-?6Mj6KEAOmO{ zWZNWT%8Mi`XkSZzjPu2>%k7;o`%gg(pqX;K0m zb0=$2wG5>*3_G-4)O-$3ZUzQIwU!#e(ak`CMCXm^W8#g-Bdm&M>6asaERFJ6D-m4; z6cCM$nEIwxCp#wky6uy&IlWYTz%3}B9kV`)v_W5+Ew$j4SjxXnI1@Ert8fQ)wWlZ| z?P`%c=xQh6YC9$e;Ai0ic!#SHd-*vMPeGvm@yoQHcvzLjV4A@lo-ynBv)}24W@V04SCY^W4wyZP|Y1Un>QE{qNle030k6G8v$2%xt zuhV~ri5K?QtCwM&$(HW$7K~@?s?6DB=H_08&Gzd-Ha(3WG=E09F9-65F!E9$Zww<} z3M5|nSfBg`AYTziUJYb5jI08=J&fFH@56z$5YK*4-V~-h2FM*@+#HDToQfP8Hjc@*S~hUDx4;p@VL86aODM$QBB4Pj&-kZ%klQ^+S4%Ew&_ z$~T262Y`HY7}){j&0*vUAa4mH&jIq*F!EX;Zwny{Z-Es9|CTWRpA~*4jDJYs-x|h0 zsqnXl@EMfY370qrWITi{dq82=50e@7Vq1BHKQ7|#tH$g?Yq|0?j1zcnoXPZj;U!t}pZ_}yXrV~P*n zBwN>R3tv+7?+(*{UE%kH@%Jh|?O{F-DEjw=>A$V;cZTubRQUIX@sBF}U19u#z(Wu7 z!uh^I;pd0&?s_Qm??X)77XbObF!Dqo@ovXDwYcX3`GGLlMG zc^c&J2+3Laxhn77A>zUx75+nE{1XcQ;V^!m!ha-;|0VFqHyzIRD+<3LjK_j9?eL>v zK3HTW{-475_bU89hw)gBBmKw1c=R>Ie>{x;g2Mkx7>|Wn(tje1$C^LO)ftxm1B(8W zVS20ylh40~@f>df|EVzk9)$sqnhh}gXl$a})bvw-}!F!B;0?+qh2Afrq;qccExUzqYLAio$! z7J&Ts5VG*Nl0O?_+YQ<;g=pPHK;9ohW`TPkgmcqCemRV62l6XnWG|3k4I{gNd@zhm zqVTzpl5w0GSUV`+&piU+bNT2V_qexeS?qEu8tWKz==p90KwiVdNShzZpgr zkx_3rqsu}0A7RStfP5&7yavd1#)o+S@@G8 zUJ}B)*MoRz2w8Zo%JIA59Pd#0?}hQNRQT_Q@iPklgE0OUg?}`Rf2YF#FpPhUFG3FBX*@IMXXcPjkP!uXpN{^w!*-M~Yi{b7A#>y`LrVLX>E zfj=^gf0M#{Vf-$IKPrrWhr$ zoSC?F>+tvWgljDt)-S^4!=5YM|1ZOM?1B>it1zDDeSm*Fgm>G3{BIxGt7SbUDC-Di z#jdr;8gnX_BeH)mx6DD(Uz?=;olcbzX-B=Ong#f>N>g~X%KJBlR?j4PNSHD`5ys!9 z@V^b?aSV|3PloY-ukgPMz|4HG0AIATi!vAj=kKG#b`9lrA&lxcF)rupW zCG4MzcH+ARaX?0a@w?L4eCdp*@giAbppZw3>YM<_()`0)Wxe-f^1q)G6}3llteSZrTFw#Z49;0rwD=r49{q(Zb+mc}3%8 zBU-~;>cYB(ZDB87{z7Ln{72Kc0jM7%lbzo3ub@4>1!!Py{L0x3;JNv0VD82ln48ZA z=6a}p+Cdh9d423J8Ela6 zSHLRy8loQeqgI=PE8c%Ap86b%_iF|Z!**qX2me?f z{J;9(pX!58)d&B~ptQw=#eHx7*;B8?@^V+;agLz3!J%&1$CLNz-_@T}`$O3Y`5K8? ziiUn1ivym1uJ?A~{0lx;^Dww}8?I$~QFZ#KKWmq{nC^2d)065@mtCeW)uFsyrZ-g~ z?*%+ab|HS2;X#jM9lK2Ln(d8G$cegv`BTTG@P(DWaqoqoDYdGg1j^$~C690P4L{(h zF91+x&XI8nP0Jinq{QCwy{(bx@Ee@+ML=X$E^zt<;z>m3)F&C3*>FoNLuhwFYsgK!Pi|L+vIKWNkt3FlH zHuVUiwqw-iE92%fA!x$81lg(f7?Ec=0jKMfmU7m&qfF7z6UQ)NTVJJUwwNn+ z$@vlP_ZFmnM2pef5ROc6-%%gCN;!Qvlhzu|4#h>?rP$Q3AhK!(qG|fTs5O)VBmAjd z9F_qe#c9Qhirpo9`g88;J^kH;db;-X_qj*z>35S1x+#R+Hg^qv+XXR?hz>V}-?ShW zFs-{t;0z;kc*}3U+a-t|N!crKA0rEHFMf~6;b*ZVT$%^i&+szW!>{M|v* z!63s!5?;{g4rOLGu$3v&J@g9f;k6gll$Fs1#_Noc!9tdO6<7Xf!GPbyhud2Sl~+} zc9UB|?4@`;w7Xf7UPkb8_bB{c;V#ARRwA|u;ws7dY9g)?#I<lprK;B>)2{aB?oGxhf%1oc2p<&ejL0p&pjT%`wY$d4b2A(4JXG! z!_Ln=8pK=$7Cv_q7y*Xss*=S=OcYmmB@50EB{_GjU?T;tQA=u0bfm z8_WX)79r{@1XxR7HBk=|$N=+o0_5`z6ZK63OvNoYHwj>`iJB$Ax_#JSzD0eU1W3#U z0OYWPU4`bNO-GcwN0|Ribm>QO%B)a=cUYR zO2}SLw|^afu9xr)%i*qAKac-1SoEtH8Zsbkh#`_cc zPS3_L9U7$-f5rs#XOxoejCb*7jG#B8v~*@nNnb`O>B@MgC+ps`<6by29I&cDv+AK0 z0q(NB8!=wDy`%A4?!j`W?Y)@b=LL%wVL0XYVsa;A*RO#S|1h_}cV11RK1oDM+ryhQ zobr0mca6JeY%ISCP-#jt&w(zp@(kM}X}`Q9F%Yw@Yuk&)%krp)CgAfS0fMfJCWN0t zWy)QWt%#imICzv|T>g7WCW8A4ZgN!g?LPyM`}*&5O-* z=EbGyc{j08w%gt_eH=#l9$rs@V0QZb;N;<59tcb?0T=HW!1(Z8!S*%-atb@BB&E`$ zkC?9V+fo7PM;N-{l zE=IU~43eO(Vit{B%7m9X>_CkF&|PhXnFT8kuq;xrh@CAD`X!6lv&11IWIKSFPerb01*Ff5CQ=4C4&$E2zW`=wgmv<0fP`=pY5Fn`Q%%3%6hC8*eP*k z%uAh#y@7xRX@hvg^vh&4$Mn8I;@L<^-wBI4gB6B9<9E(P=6Dkce)-%x@8$Dh0ot5T zX71keiG8gQ?$G|Bz4!#~QfN@Q8^OLA z*o(H|x#xf<>eXb7+c++s$h|U%!|_>39PmH%IIHpWgvpKj9Rnw6x!wf1mbp{gbTUff zOiW;dP-jX+IvR9|8Oe2&D?9-n?ePNr^2maK_Z15s%EzT+8rcwxp*@b^1HK%DjI2l$ zKFqMEg`f`HzYgJ9KPid?|1^?H<|o=q(PVZDzF6o-B*v4&zsCDZ1`v(cwgAH6;DGE& zO{ z{BP_T#7<7HS>2l<9Q7TF+C$kI+#8d0K zI0Y+*1blZR-nas6IasQKABC;vV3a#nxR;vsLU>W@exkVcsxu0wvR3RrYP3mI)Z4%U z#Jn@49O8=3t?OQ;JmQ)zgq7A6O7cR#tX-EXFLxBDp2DhKMi$-WTb`kAdyImh)WL2W zeOk==K*-Jx)O~l|L5iwDZ_y~%H|^F zqX`EL@Azk8c&Lho(Nhyc!!|%SvXwsBuCQkwz&krQ3K$qN*;|J+Fes{V*z3`H`FF_U zFzJ~8j0`b83y#CYXYfrxz)Q2%u#8YzFwzEI+M%Uj@zxx-;f+Epha40rE{hDtyh(pO zKPB%oQSxzs9~$1FNk_eN!J~L9hIb4Jfp;F+HXY-gFEMJ2hc?^5Uxs{(&5-Yfb^IAB zkYGRjF=oSjRSn_<00L87nYsOki4Xu04;h32Kwyfik_rF>CdGI$FTU4}ZcAX`F#lCV z0s!$XgAf3S|1<~zHrN#mFrwLE9BLtekCJ1gn;nis@Tg~1Fi3;RwBjlN5SV}{gaAPN zmq7@?XJ5KdDT5rdRWJj?`J(yD@MT&k7q7G;f)64_1QI)o%7<=;K+iKLwQo<`_>?ZX zFpG|}9T&PF?tWUO6_I()^a9SeVFx}T z>y)oR^t@6qo3^J{AtvRNOSrW@x_H^XeB0DZ!8cLf z1e2Uz3-pccf=Q}Cyx4-yj9++9c36=kr67Pitp!I|Xokf1TkRRZ+$TMkr1-Nv>1BQd z&h;C{*FYq-C5$cN3Kl`4Dx`WLyiVat5MV@3bHICY5GcPKGC{?#<%sY{r-t_g;AodK zz|T?(%}YRo+Mq4k-Zn(>@CzRBCpT;YFHmM$J`-f|%x*Q*63Z>02GsClcnf0X>r5;n zO`pRosW+6-TFE+{j-pND;iU5ag5#qd&>QxR+pzPcv_$z@dhpYzC#@S>UW`Qw+uIHv z_VkU&#M??R;{6?O(JJ+UuKsF<@OAI9++*HLg-Of`t z%o&NiK;2%zTjd1&md9aL_S6qiA^vl#cX{uoT=E<)fn|L0<=Y7%Bkrx9$qeylH%eYB z2`4PUcs-_*{$Sf$XzvkF(jx`7S(S5fR;E+KUO&vI60~3-H8OP zad&cZ)prpK#h!(zIL@rBeh+J#uW8tu^4?3f0k}OF!2CQAg(I@T5a#Qm^ENvvbFE3d zlcjnx^1v$z3KC$3b~;vg4EarVZK=XtGJH8?$c|S}mylCEgLhrMM*UO4oPuy?ye^ce z3nkMDEm1li$~0b=X)>5;pQ&QDqwLUtmc_1!fE5;EFw(^@h_LkyMtVxNo7@;o#Fv^% zr;G`tbv<4%$_{xwuF+`(@VbAb8^9CJ-dmvT(MjSG-fe`>uaAE#acfolPQoMg@wXG_ zs`wegoq$zai(5F2X^n^tP~-u8^;^k{=caRLb5wJ7b1TM#Y4CDpC$@DYIL9g{oNg3HL(@7;m9%&!JwiDm0gRg>lTaUh}42Q%oDESL#F7F<7;D zJ@LSas%mpv@{{S9OMP$3ZBFA&1!&9%(p0>^GqF3J*j*a1E9~m<-k<}JXEZg<0@;XN zF!wdV+`A@C)(5TO!_8X1zu8&);ZT)c?YGsabu>B-Y+j&FY4rI1(S93f3n&k$*j)xDDg^uK~LLnL6`5Zpc!x&;a3Ekma+p{#mmkoRT-b#+MW zLU+?bIp&R8c&>%t%RqIhp+_n(^uTu)Mz5fa_(PAx0fruUQK&YO4$n~ojbwwv(-E27c*kQZ=Lw0QR&#HWE)rR3S zm#+^#&~SS;)R%{MGyI;pbUD9$JPWe%ecI2OXtja*P{`r^_OEn!9H-xnE@&0oldN)N z$MtfF91?mymQU~kaam6h1lB2>i}~S@)3xc&;LD4(XiPojJ&G6>$~s3Ofvx9A0&lOS>4>~ce>LRBXQAW+ zaEdusv{I42iS-VObrdch<>yinwi@J9jjzHz;(B9m#$6Se`OAV10WRn)$AXTGC5uib zU)~OZ1_PMxFeckTlMU109q;deV1w!$Q4#A!-C=|%EHb0&1gjeq+>{OP-CMsF@^YTe zneVf8p}MSQS2O-6f;M@0v!Rx|`nwzr z9m5A4WldFov$HBos!H^#tgEWhsKwQ2*W_%K>q5wj4KX5L9<4!Kfy48&7jZq%o?13< zuDbM@qLMgfV%?k|eX>-5YJ_<#R}Lhc@-~#J#620@+Y;HK_C(Lnf<*7og`+3~HX>B> zDdywZ&3rNq?OvG3mgB!dFUiRPd?28P`>f#DBu(1Eq!U+74%=S%7%fUSxB}~8HEV!? z_;M%kSWkq9iQ=79uQ-XpSKu6Ew7dh+pl1wL_;^!X^dfj}^VTpk6+eL(zAb<$u3Y?I zf1eoJc$If4wiLFaLynH)TeUd&k3wG5>B#+JK6UP{ncyw6yaUU9jODZFcm|B?N0g}( za|%k;iMc*nTyy~IgKj52JXC52(7`Vd;V=(A7KHB+4TDEIDd(Zb<=vj}Eg9uQz6{Ro ztdqh)mwUN(TfbovSjmm5mE4$G$&DyQU@7+!vy>ZAUqI;RarvzN*Z`lE(%-L??DYp~ z=)#@s$U<}=`1nx|w62~q#8;1=tfg?rG&v0x?1tj;p`ScM4Ji-%I?d3YN_qt_=b&FvsTxh9@LU#%i5a!?OIV`E$srBw}{hlTg{x z6)3cn$)MR_n@~%u)+wbKYgn4GhGmaL3m^>{?aa3Rg7(J0&>oRq-hT=WBjSH|fx0%I z>7*hJOcj}ZB&x`KnUE?nFjZvsl&B&DQ$+^m>_|ViFSCPL6QGVv22_lJsSN{D1qP-H z3``Xmm?|(ZRiIuBApT|-bg+iDjYi8d;2F#Dy|RgtlnE0)5Z^qab$=0Us%vJyU^{TQ z-CL?+8xCH*DSIw!it503bFQgaANXY7hbdvDqL5kg@PaU0?XdYxPBlM(to+64(`$bNY6LaqO$MjaM%s zS*Ciix?LhS?~{~0C zL1A_%N5tBSdmqP-;(R9uG5jFMh}t^(Vflf z72R5>PQfoC-yv3^xZZ{9 zJX{R(dLypUx8VopJ~C7iv?gbQ+SDUkTrr-;B`l z2vUYE6cxauug4F#>QY4b zdSwLWsw)?BiGsD zb{oei*fu6@@6))cz~z&8!}e!rl@iZUEaEwEwLJzT{&S31?UjCKjCC8RS{PNi3gr%} zB4T==LQ*~_r$bT}r%Q*Z&aq8S-VerPF0o0yW7x6&5&4KcN4@)yd;PfYVB@$QNUR5D z;+`V%@+0K{^>9jjrXInFN7S%1Mm3sIzEQ(ek&|7S)59*04cWk2J@6~G^(th|ztFhH zAL~#aGrnOH)$cTt25H7Cl*bGwD36Av^7PO}YS6%}Cj+zQ)bIlxEgda8TIm@~r&J4> zPKjp@+2T&5|KK0KI#xv^#^Ra$@yFJz0c*i#ZTCD2r z1T)n);D*;!oQiL60)mHlo4R49&d{5A1OMINt*+hpjwg}e^7Ku6@RiS6Ko(Z>!=J#D zGIr&4z}F7_RNsgovU?M5wP;!S!H^Ihju8{yBTz^2i~RTl-spkPvX3mbD=ZlndvL_; zwSc6bEN{k4XtpRYXC62)dT}%>)4}_y)N6-f4 zQ>zB(HE1`bm}~|p^HK5H$-$`0Lm*SizEsgfSS^yyB`Q`bea^QboYa*&Uw`}#XS~&T zulg$FX}hk*T zW*bnWBV}!Ng_)FJj6CpwADk$I&TWI>*MCZOa`rrKe4rYM#tPyOZSNuK`BV3yRtEUAH6QUkN324+bG78{6K1GZ(Yqi?T>kJiSu0^XQm zd~!i!QlmeIwdAoGNJ;v(@Wn`Z<(-o|6DxqHw8@=q$yQnD&JX{XAK=CUBk}2|{(fI# z;sUdppCA4S+B~@>`ZiBU-w@A_lr_$-u$1Gf%jk?{I-Sy@G~N?D4NW`q{irgyn93;_5Djy_bZTOHiLe9l1B(66;qdgw>mBr@> zmze?VSI~^&Gu)zFsCr6MgzTlW=ap9Z1Y?r}7(D zG|P>6*O2OhX0Rs=$3@%D>>R>=p+L?a;AkD0oy)OED3G%UUkG}XZVmi7cj4G0kPl{E z*t$1aE>`@rGX?gRP#IfcW@fx50X`o|Tmwb#c#7x9Rh&<5gv|OvW_=;EzL3D-8y#9m z${5l`!PiBuQ5U&@E^>Z0IX|16pAB$$^qjU&bz9M&R($zM70t>mta=KV?vn8H_guvCKs4LSViOtyue!ovMZRZCO5~ z3=)%9pK4YQ{P2Cj+Q3f-_)<;wXB@mrzvd5K{g4^FuEEE@nOEWIIJVAaitFman9EkkP+aRS4Mv!oZ<~|dn?e%+zjI+` z(h=apMU{6V5Gh}V(LgP9d0prwb)hTjLRdQqq}x^(y0R{G6+_!~ez$HdlWXKw?)4}M zu4X*SACqUBPC{RSug7OMi?&jcjFWM0-KxHM?s&hImK&nYJ$tlKK5)s=FlA5@U=e_68OGWo6d#z!@d-RGP<|zaTnqsF#R|YNKLvc<059O45@{w4 zu!~UvE;v-KD1L6zyaF9h@hqFKce&pC6|l&XH;h5mGdsPMdm*;$lxm$aD?%-BimLag ze5TK#T($I$$44KS6e41(sPZ@f&54xuAbh?x$%pu5?o_@ZP2&v zwc~eUYw~P9dYFShj)OlUo?8*~}tjz^C7BK<&D^S^O z6HNL)Cfhqvh>NQd1p4>&XbA%Szx8Md0{w@2v;=|vV?A1eK)aY!$WpQZKokr@0Q#1= z)r$`7WatzlfB3cEfRm$6I-!qbh(`uw_T5_TMsm)!^SoEP@T(*65e8f2}S$c zy)=NNHy^)}AOpeXgCPZM)%Uo*+q_r*CRuE&{#j+!%9NSvQw&vpi{Ivt(Od{JtTBIz zYs~vFMvzysWV~*b`cF)4SIDHGDpvTZLU~I`qiH1zqu-2MPev_1FNQHT)f+jE54zE=F?_`n z8BwKeiL)!z%E(Drbo~ne+nw);eyG|kDnL}r3W$kv6-4zahzd@}M8hS#Sb=#A#-Uu{ zB|-NjyTXusJhN|nc%$vj3rHf>=ye1ztX|t&5WukJp_2fHR$+UY0EQN0dnx>8*4~4L zrex`wT>UW#FhZHNTbQ{NE!dquLOI1WB$KBpR`6t{RC`xW@w;u{=^@LY3roz%-C8<%t6_$iC4T`R?6pU$5 zc!eckOoQSpl%6q-6+i=!?`4f(?M~c?o0`c^N{i52-KXYCD) zsnA`dGVo5F0Ja~GAG<=|u}jsid(y-mlLPR!^h*OhKGHpB7_&%vpb{#b9;h|jp2%)O zwscr{u0SNu40mtG1GM0o#xHoXI5PtdXmg~c*TaWFag4%_Lv;GMffY&}nc*Y1KTndj zOVUc4+(cC~{Lno!PbK=mMpT{|UcP;e&^wAgrs!E6Gj=6{&?Lt{Dw$hg_VlLAj}=qP zFR9WeRC>lqek^1vk!OBvUA6o$&_K~DILg2hG7kCegPllzDj9YXba8cA?Mff$x39)e zV&|qR14g;Sn{S!rFz+M=|e_4{_^zG+)H~e))!8deoZfK>YhfN za%BBH@QvZZW4YGFxZaHG^SGYGwG>vj4%cJ z=B-WBz(lM-Ca5kWQi1RLZJs7km!>nArX!SQ^bgRmE@Z(fgkt@Ou{w_TAq{o_ymMf< z-ZK28Mn5X3Y!Jm=I~!Bi0M#1=)fGUMu2*J;7cnKl2+pG|ky+lBkU`#fTO3b`+WC0G zI~S1yaR*zzsnU9Nx`DfN2T$A`N}Mo>Q8pPOZpLu8jK}C5oV=8+CG^!1>sCm5nzGly zgw$NBbdz1_fjJE()C_baib2|yOLo1Je^0HAT(xn@>YG>m_|_ZNufY<8@RlaF9!(5! zU}#x8t{O9O*C1bmwi06(T>}Rti8fInta?E}JpB=kj~}ZM-at5W^+Z{?x9%3?HO6eC+Dd!QFGU1Yh3oFVO@1w=B2!oCtau0#ao+`<1OZN z>H>3PIRl}S_RkE$Oj#{%_YC`S?9SjxXN_vbMPRC^ zq~keQRE~EvP1GRUH1ZfCA61k%OlmmKpK;qZ>-6(x@|)4AN=e&i@>?)C-Bjg(N83AA zVC2uZEv#H-WcE`URU_*Gyx>fEwBbGtow0l&dOhvtvRf`w^aTX}w;i&spbaMM-vIi{3HzoyV0mUYyG8a(8 zGDAvKGg6r(sBxYlB?^mjqJCD8Ov>PJDF{`WEx4(sqIgZSPnn|Ex~l3!mY)a<_M8z!;wg<7>g$3z=a1W1cdMx>+q@&{45{1hGR}A6!P2y4r*9F`_2$u(LFof#{ZYYH70d8do z*9+Wm2-gQ3I%{17C7;W$RW1)B`SIwHFtQcMr|?Y(TOi8<4EY1|+L;ESx** z^29KbmANjAWNqSE#QNHFfjlXUEC6|O7w#_#w7&dSik zBCYY<#Cpzgd0}tBn!z=VYd)?~9u9PHV6=P_2L3!b+LrJK=nE0Ij6}Ffm-|m~;lWdE zis2}dlhIFT)iCCmVgS=XgG|CW8#wQL6cERp$XoRpHzMCN!sXk~^DyejBc~O36AnEf zC$Rq23AnVvJm^xyCy~x$W=?!TWPy5aC7Pc|4!6bJ>_j>mcmzb|7}q29nKe0H%z4tM z@x!w~eW}u!TK_&C{aVazO_h!gM_}e3bLXY_Jw>T8KLuw0F*ltm@f}FD%8WR2T2#iv zckf?@wg}!T5a}(o^rT8xg*ii(d5n*`;O-_F+Ww( zwHp*QyG02r&-nRu=+xfv>91SYj`;AMV)xfxb`-5rDL4r#8gQ4DSHdK#T*mg#;OOUK zux@TPH~ptvIEc{4Y1D$YI&z~HQ1$T}Sy0ljtUKu=MY0v34_V4uwZ?Nr$?%k=X-y;R z#QJy6mC2TdWuZ&+k7vzRND2JCvfD0^ajUtE%$12=v(X!rn8k#tsHb=ySw+Y2k zYfV^xJ4^b`dOmiAjE;StU1^4&*lJg>x*olV?@c2wOp!>BjU1wRUYWs&yGT8vj!dit zxVYGPG_LiyF2sf2l;zLh)q$A1LRaT2L{=fPsnR;TLdAf>RTNl6BmxvffTCbmsIeLk zoRlNN=b>0SGlO^_Q&)weaBu_;sYUTP*))q-sSPamOuB6&v3S?USw1ZbmCZop8j#Z$k;E&&? zzF4!UjY#}qMUzuh@UrH?4N;X(i$Tee?A=6Z4OmfM16CB-fEATCU`4q>EH4NCES`Z`CBYH;cRbVgj`|?5aupeDz_M&v z94W@ZVE8$f2%De0sepEozK>nrhOfZl{BY)ZJs4=~a$f=K6u(fR_9I44oO`{%aou5f z5y5BRTd3{`_DBYvZ(vMh7T6VW2#RdyOm?Wh7MmSw1ADt7j>M-J`#({!Vuyzk`&3EL z$+AF^8Gb9CRT!DUYUOV2iX$^PH(D{Q`|!bz3QeS5VDUCP8|%vFwPa;*!&gV zV@|wJG9up+`3AFU$KD=LyUYt|RA#@HjQfW7YVM!sE9kxfu``{q(U0MdvtGM0yYPau z-Gs7rklQh?&^aGX$Sr7emyagoQ%k_mwpv@6Lt=oTmBcBiAe}G}l%- zLt0R0tc0~Js3jfKx9kL7v_w?`qi)2YPA6EinH775E+cUnqiwvcY@#i*;=^LYeQQrf zZX5$gc>ct~+0=A_PYL*^hL^`@@eqqVq>{{To^4Miu)l)$(Iv85X4{Ox^bP;Si6_;0 zVo5&yRdtS*quqA!#QS$zZD$f+J&5zI3-W*<^Lz)gx&ZOm23QBzjYdCu6Rjkk*%QyZ z1@9&3-UiSVZ)0r#hU}&bfbIyRb3pesqVs}oVA2P)+mTgF+I`+QP(*yL0bd}#&`3Wf zcun8o^O4;tMCEmgKnxYjn8q|*0z^z-lQdBk(< z?8A`cGJxKF9Cc#F5~C7^yS&fKh=#DH!1E6nGLb~S_w7B1Fb>P=*e}+n&(Agem+RB_ z9AbLtm+fJUipHOoChL8ro?Z7LvTMrgfqGtZF4~t4FMU&4?ms+Uel^X#n!kn|pGh^> zr=NQ@OZuj|n0p=9%QE+R*}p7vw~_txntL5$17b^N8 zcppjsM`Hr_)_aUxpj5iXKLrXLI#Ise`#0wP_}o$llg=UIPd=lJnffp@{?IeZn5hpl zq4({?iV zet!SF=HBM&%N1&9htSVIR#(gaj!v%QAOe{HRVBbMIy9 z)6ZQOlD?@f=5Aw}*K^{Fe+)f6*W;gq<`Giw;rQZ)Je~_*T+8GhGcyi}Uf)W&O6vW9 zmgv)ewZ2sbhpc)|S5F_}A5@K|f3(ih@2lruFOMwoz77;BsanAOX)I-3Qi}>i|7ngTwIf<|pmqd@DIXPj^V^4^YboO5a4Uneaa40i9p7 zvK*j}=PXO8UVu64OjMr?1>-Ye3pvJN^Nk1pOHc3Ax`G4Oi|D0^J zN%}d-UrXQAMniRZ2z~^QGVI^09>T~Jk4vbtHDj_v7ucfq*!3u6{EKSnS zsj)Rle}M8IQl%as|3gY2Du2*f9Vk6)vuS$?`O!nLvHjb7sO<&!r1vA5*z3CUH>_*1 zaBK>HZMd#GdT7Pa$cmAbd|?J26~$XQtqXSGiHhx(buaE$;01C^&VSj|)@xqEXGbmX zEBM|CPD3qu!THwccht8}mYni}(@sL%sR;iShtrmticFw8pW9hxvQ=iW}CnideCk_d=cT2`25R#s}B zva%wx(sQh|thB6yWo9SySf|p;PS){sxBES--+QgS86n0#=ks}eUf<6@KYj6j)_bkB z*S@X2pJ$$DE*~>~#6C~ER-){B#$?vp+_O?5#mMZV>5*cIiy}WTav**tG1pPnCsHgM z`D|{aIDcer??|!1OFknq2(RO^J>84oACXL&D)t%UAo&UQc`b?LOZS2$(}ohko;m4;lUI_C)fD#2$B<6{ve&&GlOfqjWrV)`-~!=MY)7``KTB7 zakM8oktQE?IYs@Dy(1#U#z^W{GuPtdddH6@pZ+7LZ8vah%SKVZR(Ou$y=Ovni6x}m zlK4fOpCU7aFT@^9pOryOvF)?mS%`5OzSmXC7%^+`tRx@OVi>bhL991^zi|noyz3{H zD6-ksz3Z%`c+n3zLFF##q}jR5ZjI8clv#Oi&1N$DiOcmDb<7^`LAL(lB4%ZA#Lg0n znN2>8*Z^@Qvsb$l8-!mzp!z&Li4Dd#H4$sz8itCs%+|9lN!-aSDuFzQi~E_aWSd)T zWwz9?$C>@YQIbV7v$bsVh!>bWWY|Gwoj7Kyc!SwOwxx^rm^Cx=icgq5$360jFPYuT zwt)DJ+2hQ{35TRUyud6^bOyucr;=tRorlkr$I%3e0uQk&FtWWfidd~-TQi6)B!)RE z%%M5D(Xbz3nd1%NM=?q&Bn0jIQD!-_}O-P{H&z?VxO4IEDoN;rYXwEt1wDFu=8NU?iHYsI4qVj z`)nAo2uUnPyqQRz(O}fFPGg8oksH}|CFlH9c`w&K5&iRtY4Rbq9g5X#JF|i8SuPJU z%SX=p@E+fzTrQJG{#N+`Z1@GLEUNuB8EFx-GrOBvjQE^mZZpiuF%#8Pi&_@NEgPZm z7F3k$iB;?q+3G^e0$YI3G@K_2n8k>F*l>N~d}4_);+#IjN>nvGV+7u|3RbS>ak)$I zbC!!lg__T{e{#7BbursAIp!?&9kVnF zB>T?l5+y~yvtof44D1EGg0X>poQDpA}qav0Fp#~sy8 zH1|kFgsb{_p|SkitVFRonedY|!bH~G#hR%jM#J;lQ32rev-05Iy>}28lU@+jNn9{` z8>WonNbz95ATVWc5v;GIO%36fy~w|{M$1}%2%fqWt|UhmKqgESWc|-I+J92x8Lc9G zKbq<-^bv||!Uugbfbm%*KRdV-@y|)C08Yr71w59S7pn2A5!8|~85hD+w{u<63}a0c z3bjN=ZcW@~O=*07SeK|NjjMVRzQnkW@kz$bj7^Nu3FPw#%UxN%nq|rIVwU$Xz7R*A zbu4%8N^(Od!keN9XY?lghV@D8GnX~rF&^kn)`_PPzQ~$wJxHF8m@RF7GkY#Hd5lLB zNUrHYcsa1e=lNm1p!p`1u;&=UEqw?-NFiK1g77$7pYrw!m6|-F9{Lx&guiAJ`u&81 zMiH)X5Izw}IGyFa(Il@tjj(4Y!VzZ>e%^(!)0u=(v4q2W5bm}J@9$0c0?W^Hv>J|f z0MQb~MI$eca*Gp*mja!AF2$_b2T+#2GLSHz<+B)b22zd<1h&oU2hXC}U)S%7s7a0I zW^A)2HC~lNxR3EDyIpN;#Kn^=iZycX%+N!5vBm8c)!nuz&&Rz15WBs zc>RFufuE0Fjk>OjD*)ckcoQ&Dr1hqiwRHex>2YrVivHA#tU(l~u0P@REYD_~(T`gG zcwfroF8v7yFuvZ8#iC>|8?<#Gqfzh)Eq{e+W85We6gd^nP@ zh<%=pCVAOugk3ukCZ9q0K^H>DnS{S}C#>Z-J1vr{J%lf?{5(gi;b;dq+CRD8e8!y7 z{e-_tL$gSPWt#uEhvX8U=0@g2KoX7Zy@6FI?JU=WJ zo}a`K{?wB&BA&2wuUO>Ct-UDg9#MqzA_@CB2=9p|JpVMp*JB8Ku}^aZ$^BT~%koZ^ zFXpmW#FKR$>tD2!oXc_k8b|UStUt*5@vOfwf%F?#{~GHHSfAOG^!Ky=P1a9l{aSAA z7S_MR`g2+TH?DUZ>yNR%g!OlG{Kr`T5$h{he+S2TlJ%dlzDoNePNI01&oxi*o}bqH z9jqYd;A6UQN)tKQ6Vk*a-Wl|{ znAUsCx$i(Wt@>1)i*erPXjP2g@ai7OE85988aSy@ i}A9-ZHX1s&Pr-m_|v%<}I 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

D_IXULm@3ZGK_1@fanywgzq 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 bejlFG$3M&KR5wOO