From c12b1403de9ba20bfb08a6c34a2b4c51321e0c99 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 09:23:52 -0400 Subject: [PATCH 01/95] 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 1b18b6adf6..0000000000 --- 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/95] 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 7c542a3a3c..0000000000 --- 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/95] 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 f9ab26fb2e..0000000000 --- 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/95] 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 be65e225a0..0000000000 --- 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/95] 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 b3b9ac0d1a..0000000000 --- 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/95] 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 9fc9e7c874..0000000000 --- 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/95] 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 17b8b44f00..0000000000 --- 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/95] 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 c02b3a648f..0000000000 --- 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/95] 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 c339eacc7a..0000000000 --- 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/95] 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 bd0e6a2aea..0000000000 --- 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/95] 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 7fa1c277bc..0000000000 --- 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/95] 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 fe93e39585..0000000000 --- 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/95] 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 601e2f83f8..0000000000 --- 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/95] 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 c3a24be76e..0000000000 --- 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/95] 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 b9536da7eb..0000000000 --- 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/95] 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 6b4b6b53a7..0000000000 --- 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/95] 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 fcf854c8b5..0000000000 --- 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/95] 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 7920f19713..0000000000 --- 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/95] 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 63b7ff0394..0000000000 --- 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/95] 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 71dcdcfb64..0000000000 --- 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/95] 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 65feda2f84..0000000000 --- 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/95] 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 69bcc68700..0000000000 --- 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/95] 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 cd5f307bce..0000000000 --- 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/95] 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 14674c4138..0000000000 --- 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/95] 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 d3140ac915..0000000000 --- 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/95] 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 74e43461cb..0000000000 --- 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/95] 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 17726a3c2b..0000000000 --- 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/95] 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 c8f531e5cb..0000000000 --- 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/95] 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 a0fd89e034..0000000000 --- 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/95] 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 9b0d7bbece..0000000000 --- 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/95] 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 0b3808e24c..0000000000 --- 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/95] 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 4695f64df7..0000000000 --- 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/95] 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 fbcaf99bca..0000000000 --- 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/95] 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 150bca0932..0000000000 --- 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/95] 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 cfeaa9d038..0000000000 --- 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/95] 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 a334cb5034..0000000000 --- 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/95] 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 7a07ba7eb5..0000000000 --- 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/95] 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 bc21cbcbd6..0000000000 --- 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/95] 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 bad0cc82ee..0000000000 --- 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/95] 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 9a6fe64413..0000000000 --- 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/95] 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 18de9a42a4..0000000000 --- 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/95] 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 4f0827d13c..0000000000 --- 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/95] 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 763bc95d69..0000000000 --- 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/95] 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 073b2e9d82..0000000000 --- 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/95] 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 4186e66097..0000000000 --- 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/95] 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 38a8b83980..0000000000 --- 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/95] 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 919c3b0b25..0000000000 --- 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/95] 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 95950a9eb9..0000000000 --- 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/95] 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 d5354cb734..0000000000 --- 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/95] 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 a8fb28db38..0000000000 --- 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/95] 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 4f36060edc..0000000000 --- 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/95] 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 bb62a02692..0000000000 --- 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/95] 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 52c5a5b395..0000000000 --- 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/95] 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 ab32b28ba5..0000000000 --- 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/95] 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 7da3da1fbd..0000000000 --- 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/95] 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 933336740f..0000000000 --- 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/95] 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 4de452f892..0000000000 --- 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/95] 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 832258d11c..0000000000 --- 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/95] 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 05fe19c556..0000000000 --- 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/95] 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 0fcfdd2d52..0000000000 --- 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/95] 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 682e3a0bc9..0000000000 --- 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/95] 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 aa8745ee64..0000000000 --- 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/95] 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 d0c691543d..0000000000 --- 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/95] 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 1604d3b883..0000000000 --- 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/95] 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 1da65519db..0000000000 --- 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/95] 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 fe09ecfdd1..0000000000 --- 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/95] 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 66d5296f99..0000000000 --- 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/95] 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 2ff20a40d7..0000000000 --- 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/95] 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 5612afe624..0000000000 --- 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/95] 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 1ee9b3ea4b..0000000000 --- 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/95] 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 4a38a2b482..0000000000 --- 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/95] 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 f590372d21..0000000000 --- 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/95] 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 dd2093830c..0000000000 --- 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/95] 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 ddd18290a0..0000000000 --- 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/95] 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 abc645e827..0000000000 --- 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/95] 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 64c572c4ba..0000000000 --- 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/95] 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 428887c250..0000000000 --- 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/95] 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 9db05ae935..0000000000 --- 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/95] 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 28a86f8328..0000000000 --- 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/95] 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 6ad19b15b9..d2bd71b1ee 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/95] 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 2bc1e694ec..0000000000 --- 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/95] 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 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 i}A9-ZHX1s&Pr-m_|v%<}I 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

D_IXULm@3ZGK_1@fanywgzq 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 bejlFG$3M&KR5wOO Date: Tue, 29 Aug 2017 10:43:03 -0400 Subject: [PATCH 83/95] Update Resources.resx remove emu7800 reference --- BizHawk.Client.EmuHawk/Properties/Resources.resx | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/BizHawk.Client.EmuHawk/Properties/Resources.resx b/BizHawk.Client.EmuHawk/Properties/Resources.resx index 086445bff7..8d9fb1b714 100644 --- a/BizHawk.Client.EmuHawk/Properties/Resources.resx +++ b/BizHawk.Client.EmuHawk/Properties/Resources.resx @@ -205,9 +205,6 @@ ..\images\calculator.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\images\emu7800.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - ..\images\tastudio\ts_v_piano_16_green_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a @@ -1560,4 +1557,4 @@ ..\images\ControllerImages\NGPController.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - \ No newline at end of file + From f94de09336ea838208da906119655a52a74fd0df Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 10:43:53 -0400 Subject: [PATCH 84/95] Delete emu7800.png --- BizHawk.Client.EmuHawk/images/emu7800.png | Bin 856 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 BizHawk.Client.EmuHawk/images/emu7800.png diff --git a/BizHawk.Client.EmuHawk/images/emu7800.png b/BizHawk.Client.EmuHawk/images/emu7800.png deleted file mode 100644 index ec37d9fa2675d8d85ff3eb0a40ce2d53bc9e6dfd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 856 zcmV-e1E>6nP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02*{fSaefwW^{L9 za%BKeVQFr3E>1;MAa*k@H7+qRNAp5A0008VNklh z;g;EL70msS8dt}TlT#$=1q?IN7!*Rgv^@hAzXm8iiSH796SauC`zgNnSNOy~2@2-Y zFoO;_Z?{op8jjZ##*1);H$>qHRWuAy)QK90i^AkELS~jQZbn9MDqhn8t)+!fz6jRN zhoV`qUTWz=*f3Z89N3X5eVWXsL9xuXT~nnfZE5qrFo65i9;B>W4~!9?B$D0MY#rbaWJpP& z1H04&x`>e~5afv1KmO;xEbwP11%IdflRiKr%Xq{b?lF#Pl5xvYt<*bGA7G=2(bNd| zAxYHB3q8!{8B29QNka;byB1u}trUIHD0myia=(V_T@?9}t^TC3#A{_ub2KZST3F;Z zv$=kv4k&y%nM|*ZoX_!Owa4Q45zhjjMsBxc0XrG~zgf0qjuwp^k4Dk+Njf0wx|6)e zi*Yo$NcUv1pedI$PbL|!oXmgiVxHG2K9BUqh2%ZUp`bPw=T-UfeE`$gRT!cRF_>3k z)Yf56D95CgGQwPp(NaugTp4ED4oud~7{XU$Fs@`|QjrcAp~|tS Date: Tue, 29 Aug 2017 10:49:25 -0400 Subject: [PATCH 85/95] Update RomLoader.cs --- BizHawk.Client.Common/RomLoader.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BizHawk.Client.Common/RomLoader.cs b/BizHawk.Client.Common/RomLoader.cs index 113a52a2db..6de9d9cdc3 100644 --- a/BizHawk.Client.Common/RomLoader.cs +++ b/BizHawk.Client.Common/RomLoader.cs @@ -937,7 +937,7 @@ namespace BizHawk.Client.Common } break; case "A78": - var gamedbpath = Path.Combine(PathManager.GetExeDirectoryAbsolute(), "gamedb", "EMU7800.csv"); + var gamedbpath = Path.Combine(PathManager.GetExeDirectoryAbsolute(), "gamedb", "gamedb_a7800.csv"); nextEmulator = new A7800Hawk(nextComm, game, rom.RomData, gamedbpath, GetCoreSettings(), GetCoreSyncSettings()); break; case "C64": From aacb400da2cd5426d5654caac4434a41e8d5cac3 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 10:51:47 -0400 Subject: [PATCH 86/95] Update BizHawk.Client.EmuHawk.csproj --- BizHawk.Client.EmuHawk/BizHawk.Client.EmuHawk.csproj | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/BizHawk.Client.EmuHawk/BizHawk.Client.EmuHawk.csproj b/BizHawk.Client.EmuHawk/BizHawk.Client.EmuHawk.csproj index cbf70d2917..5a27204f4a 100644 --- a/BizHawk.Client.EmuHawk/BizHawk.Client.EmuHawk.csproj +++ b/BizHawk.Client.EmuHawk/BizHawk.Client.EmuHawk.csproj @@ -2084,7 +2084,6 @@ - @@ -2165,4 +2164,4 @@ - \ No newline at end of file + From 749c2eb500aac60bde3de83e874e55be3392a1fa Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 10:52:32 -0400 Subject: [PATCH 87/95] Update BizHawk.Emulation.Cores.csproj --- BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj | 3 --- 1 file changed, 3 deletions(-) diff --git a/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj b/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj index d2bd71b1ee..774d7fe180 100644 --- a/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj +++ b/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj @@ -63,9 +63,6 @@ ..\References\ELFSharp.dll - - ..\References\EMU7800.dll - ..\References\Newtonsoft.Json.dll From 7d9431e1b3b2a46e5be83163edb99a241ccd824f Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 10:53:03 -0400 Subject: [PATCH 88/95] Update Building Other Solutions.txt --- Building Other Solutions.txt | 2 -- 1 file changed, 2 deletions(-) diff --git a/Building Other Solutions.txt b/Building Other Solutions.txt index 868aaf0d2a..fc6740b8a9 100644 --- a/Building Other Solutions.txt +++ b/Building Other Solutions.txt @@ -1,8 +1,6 @@ Besides the main Bizhawk.sln, there are a number of other projects, each with its own build method. To develop Bizhawk, you do not need to build these other projects, as they are included prebuild in SVN. You need only build them if you want to modify the cores themselves. -EMU7800: Load EMU7800/EMU7800.sln; builds as .NET 4.0. Does file automatically copy to appropriate folder?? - genplus-gx: Load genplus-gx/libretro/msvc/msvc-2010.sln; builds as VC++ (VC10). Output dll automatically copies to appropriate folder. waterbox: check the waterbox/ folder for instructions on the alpha waterbox builds. From a90b00cba923ad4c0a5d61a9dca818f14196239e Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 10:53:57 -0400 Subject: [PATCH 89/95] Update BizHawkFiles.wxs --- BizHawk.Installer/BizHawkFiles.wxs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/BizHawk.Installer/BizHawkFiles.wxs b/BizHawk.Installer/BizHawkFiles.wxs index aa1e5325e5..ccf9a59d35 100644 --- a/BizHawk.Installer/BizHawkFiles.wxs +++ b/BizHawk.Installer/BizHawkFiles.wxs @@ -66,9 +66,6 @@ - - - @@ -847,4 +844,4 @@ - \ No newline at end of file + From 9fbc21d34c26f017b429035b696e62337338da4b Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 10:55:16 -0400 Subject: [PATCH 90/95] Update BizHawkInstall.wxs Completes clean up of EMU7800 references --- BizHawk.Installer/BizHawkInstall.wxs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/BizHawk.Installer/BizHawkInstall.wxs b/BizHawk.Installer/BizHawkInstall.wxs index 54d42bfda9..5d6c3753f6 100644 --- a/BizHawk.Installer/BizHawkInstall.wxs +++ b/BizHawk.Installer/BizHawkInstall.wxs @@ -50,7 +50,6 @@ - @@ -79,7 +78,6 @@ - @@ -365,4 +363,4 @@ - \ No newline at end of file + From a8db3a696623f24664780473dee2756aaab9a994 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 29 Aug 2017 11:15:38 -0400 Subject: [PATCH 91/95] Update BizHawkFiles.wxs --- BizHawk.Installer/BizHawkFiles.wxs | 3 --- 1 file changed, 3 deletions(-) diff --git a/BizHawk.Installer/BizHawkFiles.wxs b/BizHawk.Installer/BizHawkFiles.wxs index ccf9a59d35..e3f3e641da 100644 --- a/BizHawk.Installer/BizHawkFiles.wxs +++ b/BizHawk.Installer/BizHawkFiles.wxs @@ -557,9 +557,6 @@ - - - From 0c3e18efb1ceb3e6f7be2177feb768699b32737b Mon Sep 17 00:00:00 2001 From: nattthebear Date: Sat, 26 Aug 2017 12:45:43 -0400 Subject: [PATCH 92/95] Could you use these things to print like, boobs? --- .../Consoles/Nintendo/Gameboy/LibSameboy.cs | 10 ++++++ output/dll/sameboy.wbx.gz | Bin 58989 -> 59146 bytes waterbox/sameboy/bizhawk.cpp | 34 ++++++++++++++++++ 3 files changed, 44 insertions(+) diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/LibSameboy.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/LibSameboy.cs index 405635404c..42aed349ae 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/LibSameboy.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/LibSameboy.cs @@ -31,6 +31,13 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.Gameboy public Buttons Keys; } + [UnmanagedFunctionPointer(CC)] + public delegate void PrinterCallback(IntPtr image, + byte height, + byte top_margin, + byte bottom_margin, + byte exposure); + [BizImport(CC)] public abstract bool Init(bool cgb, byte[] spc, int spclen); @@ -51,5 +58,8 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.Gameboy [BizImport(CC)] public abstract bool HasSaveRam(); + + [BizImport(CC)] + public abstract void SetPrinterCallback(PrinterCallback callback); } } diff --git a/output/dll/sameboy.wbx.gz b/output/dll/sameboy.wbx.gz index 10f48206a4cffba1fef9bea56731ac11982b4b3f..b3bb90a8012cbc21ee9b446fdb0799f5097e1783 100644 GIT binary patch literal 59146 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 literal 58989 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 diff --git a/waterbox/sameboy/bizhawk.cpp b/waterbox/sameboy/bizhawk.cpp index 28c6cda11e..94ba62a39f 100644 --- a/waterbox/sameboy/bizhawk.cpp +++ b/waterbox/sameboy/bizhawk.cpp @@ -64,6 +64,24 @@ static void InputCallback(GB_gameboy_t *gb) FrontendInputCallback(); } +typedef void (*FrontendPrinterCallback_t)(uint32_t *image, + uint8_t height, + uint8_t top_margin, + uint8_t bottom_margin, + uint8_t exposure); + +static FrontendPrinterCallback_t FrontendPrinterCallback; + +static void PrinterCallback(GB_gameboy_t *gb, + uint32_t *image, + uint8_t height, + uint8_t top_margin, + uint8_t bottom_margin, + uint8_t exposure) +{ + FrontendPrinterCallback(image, height, top_margin, bottom_margin, exposure); +} + static blip_t *leftblip; static blip_t *rightblip; const int SOUND_RATE_GB = 2097152; @@ -245,6 +263,22 @@ ECL_EXPORT bool HasSaveRam() return true; } +ECL_EXPORT void SetPrinterCallback(FrontendPrinterCallback_t callback) +{ + FrontendPrinterCallback = callback; + + if (callback) + { + GB_connect_printer(&GB, PrinterCallback); + } + else + { + GB_set_serial_transfer_start_callback(&GB, NULL); + GB_set_serial_transfer_end_callback(&GB, NULL); + GB.printer.callback = NULL; + } +} + int main() { return 0; From e780e74f455c84d6c89812313c7a55e61490522f Mon Sep 17 00:00:00 2001 From: Tastyfish Date: Sat, 26 Aug 2017 19:35:07 -0400 Subject: [PATCH 93/95] A frontend for the GB printer --- .../BizHawk.Client.EmuHawk.csproj | 9 + BizHawk.Client.EmuHawk/MainForm.Designer.cs | 22 +- BizHawk.Client.EmuHawk/MainForm.Events.cs | 5 + .../tools/GB/GBPrinterView.Designer.cs | 148 +++++++++ .../tools/GB/GBPrinterView.cs | 201 +++++++++++++ .../tools/GB/GBPrinterView.resx | 280 ++++++++++++++++++ .../Consoles/Nintendo/Gameboy/Gambatte.cs | 14 + .../Nintendo/Gameboy/IGameboyCommon.cs | 15 + .../Consoles/Nintendo/Gameboy/LibSameboy.cs | 9 +- .../Consoles/Nintendo/Gameboy/Sameboy.cs | 8 + 10 files changed, 697 insertions(+), 14 deletions(-) create mode 100644 BizHawk.Client.EmuHawk/tools/GB/GBPrinterView.Designer.cs create mode 100644 BizHawk.Client.EmuHawk/tools/GB/GBPrinterView.cs create mode 100644 BizHawk.Client.EmuHawk/tools/GB/GBPrinterView.resx diff --git a/BizHawk.Client.EmuHawk/BizHawk.Client.EmuHawk.csproj b/BizHawk.Client.EmuHawk/BizHawk.Client.EmuHawk.csproj index 5a27204f4a..2a860dd082 100644 --- a/BizHawk.Client.EmuHawk/BizHawk.Client.EmuHawk.csproj +++ b/BizHawk.Client.EmuHawk/BizHawk.Client.EmuHawk.csproj @@ -822,6 +822,12 @@ GBGPUView.cs + + Form + + + GBPrinterView.cs + Form @@ -1489,6 +1495,9 @@ GBGPUView.cs + + GBPrinterView.cs + GenDbgWind.cs diff --git a/BizHawk.Client.EmuHawk/MainForm.Designer.cs b/BizHawk.Client.EmuHawk/MainForm.Designer.cs index 1fd5d90ff8..aef505d11b 100644 --- a/BizHawk.Client.EmuHawk/MainForm.Designer.cs +++ b/BizHawk.Client.EmuHawk/MainForm.Designer.cs @@ -306,7 +306,8 @@ this.LoadGBInSGBMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator28 = new System.Windows.Forms.ToolStripSeparator(); this.GBGPUViewerMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.GBGameGenieMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.GBPrinterViewerMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.GBGameGenieMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.GBASubMenu = new System.Windows.Forms.ToolStripMenuItem(); this.GBACoreSelectionSubMenu = new System.Windows.Forms.ToolStripMenuItem(); this.GBAmGBAMenuItem = new System.Windows.Forms.ToolStripMenuItem(); @@ -2744,7 +2745,8 @@ this.LoadGBInSGBMenuItem, this.toolStripSeparator28, this.GBGPUViewerMenuItem, - this.GBGameGenieMenuItem}); + this.GBGameGenieMenuItem, + this.GBPrinterViewerMenuItem}); this.GBSubMenu.Name = "GBSubMenu"; this.GBSubMenu.Size = new System.Drawing.Size(34, 19); this.GBSubMenu.Text = "&GB"; @@ -2782,10 +2784,17 @@ this.GBGameGenieMenuItem.Size = new System.Drawing.Size(233, 22); this.GBGameGenieMenuItem.Text = "&Game Genie Encoder/Decoder"; this.GBGameGenieMenuItem.Click += new System.EventHandler(this.GBGameGenieMenuItem_Click); - // - // GBASubMenu - // - this.GBASubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + // + // GBPrinterViewerMenuItem + // + this.GBPrinterViewerMenuItem.Name = "GBPrinterViewerMenuItem"; + this.GBPrinterViewerMenuItem.Size = new System.Drawing.Size(233, 22); + this.GBPrinterViewerMenuItem.Text = "&Printer Viewer"; + this.GBPrinterViewerMenuItem.Click += new System.EventHandler(this.GBPrinterViewerMenuItem_Click); + // + // GBASubMenu + // + this.GBASubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.GBACoreSelectionSubMenu, this.GBAcoresettingsToolStripMenuItem1, this.toolStripSeparator33, @@ -4155,6 +4164,7 @@ private System.Windows.Forms.ToolStripMenuItem SaveMovieContextMenuItem; private System.Windows.Forms.ToolStripMenuItem VirtualPadMenuItem; private System.Windows.Forms.ToolStripMenuItem GBGPUViewerMenuItem; + private System.Windows.Forms.ToolStripMenuItem GBPrinterViewerMenuItem; private System.Windows.Forms.ToolStripMenuItem AudioThrottleMenuItem; private System.Windows.Forms.ToolStripSeparator toolStripSeparator27; private System.Windows.Forms.ToolStripMenuItem VsyncEnabledMenuItem; diff --git a/BizHawk.Client.EmuHawk/MainForm.Events.cs b/BizHawk.Client.EmuHawk/MainForm.Events.cs index 794326d63b..9cd33d7a3d 100644 --- a/BizHawk.Client.EmuHawk/MainForm.Events.cs +++ b/BizHawk.Client.EmuHawk/MainForm.Events.cs @@ -2018,6 +2018,11 @@ namespace BizHawk.Client.EmuHawk GlobalWin.Tools.LoadGameGenieEc(); } + private void GBPrinterViewerMenuItem_Click(object sender, EventArgs e) + { + GlobalWin.Tools.Load(); + } + #endregion #region GBA diff --git a/BizHawk.Client.EmuHawk/tools/GB/GBPrinterView.Designer.cs b/BizHawk.Client.EmuHawk/tools/GB/GBPrinterView.Designer.cs new file mode 100644 index 0000000000..f285047c54 --- /dev/null +++ b/BizHawk.Client.EmuHawk/tools/GB/GBPrinterView.Designer.cs @@ -0,0 +1,148 @@ +namespace BizHawk.Client.EmuHawk +{ + partial class GBPrinterView + { + ///

+ /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(GBPrinterView)); + this.paperView = new BmpView(); + this.label1 = new System.Windows.Forms.Label(); + this.paperScroll = new System.Windows.Forms.VScrollBar(); + this.menuStrip1 = new System.Windows.Forms.MenuStrip(); + this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.saveImageToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.editToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.copyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.menuStrip1.SuspendLayout(); + this.SuspendLayout(); + // + // menuStrip1 + // + this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.fileToolStripMenuItem, + this.editToolStripMenuItem}); + this.menuStrip1.Location = new System.Drawing.Point(0, 0); + this.menuStrip1.Name = "menuStrip1"; + this.menuStrip1.Size = new System.Drawing.Size(336, 24); + this.menuStrip1.TabIndex = 2; + this.menuStrip1.Text = "menuStrip1"; + // + // fileToolStripMenuItem + // + this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.saveImageToolStripMenuItem}); + this.fileToolStripMenuItem.Name = "fileToolStripMenuItem"; + this.fileToolStripMenuItem.Size = new System.Drawing.Size(37, 20); + this.fileToolStripMenuItem.Text = "&File"; + // + // saveImageToolStripMenuItem + // + this.saveImageToolStripMenuItem.Name = "saveImageToolStripMenuItem"; + this.saveImageToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.S))); + this.saveImageToolStripMenuItem.Size = new System.Drawing.Size(183, 22); + this.saveImageToolStripMenuItem.Text = "&Save Image..."; + this.saveImageToolStripMenuItem.Click += new System.EventHandler(this.saveImageToolStripMenuItem_Click); + // + // editToolStripMenuItem + // + this.editToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.copyToolStripMenuItem}); + this.editToolStripMenuItem.Name = "editToolStripMenuItem"; + this.editToolStripMenuItem.Size = new System.Drawing.Size(39, 20); + this.editToolStripMenuItem.Text = "&Edit"; + // + // copyToolStripMenuItem + // + this.copyToolStripMenuItem.Name = "copyToolStripMenuItem"; + this.copyToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.C))); + this.copyToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.copyToolStripMenuItem.Text = "&Copy"; + this.copyToolStripMenuItem.Click += new System.EventHandler(this.copyToolStripMenuItem_Click); + // + // paperView + // + this.paperView.Name = "paperView"; + this.paperView.Location = new System.Drawing.Point(0, 48); + this.paperView.Size = new System.Drawing.Size(320, 320); + this.paperView.BackColor = System.Drawing.Color.Black; + this.paperView.TabIndex = 0; + // + // label1 + // + this.label1.Name = "label1"; + this.label1.Location = new System.Drawing.Point(0, 24); + this.label1.Size = new System.Drawing.Size(336, 24); + this.label1.Text = "Note: the printer is only connected while this window is open."; + this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // paperScroll + // + this.paperScroll.Name = "paperScroll"; + this.paperScroll.Location = new System.Drawing.Point(320, 48); + this.paperScroll.Size = new System.Drawing.Size(16, 320); + this.paperScroll.Minimum = 0; + this.paperScroll.SmallChange = 8; + this.paperScroll.LargeChange = 160; + this.paperScroll.ValueChanged += PaperScroll_ValueChanged; + // + // GBPrinterView + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.AutoSize = true; + this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.ClientSize = new System.Drawing.Size(336, 358); + this.Controls.Add(this.menuStrip1); + this.Controls.Add(this.paperView); + this.Controls.Add(this.label1); + this.Controls.Add(this.paperScroll); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MainMenuStrip = this.menuStrip1; + this.MaximizeBox = false; + this.Name = "GBPrinterView"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Printer Viewer"; + this.menuStrip1.ResumeLayout(false); + this.menuStrip1.PerformLayout(); + this.FormClosed += GBPrinterView_FormClosed; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + private System.Windows.Forms.MenuStrip menuStrip1; + private System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem saveImageToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem editToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem copyToolStripMenuItem; + private BmpView paperView; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.VScrollBar paperScroll; + } +} \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/tools/GB/GBPrinterView.cs b/BizHawk.Client.EmuHawk/tools/GB/GBPrinterView.cs new file mode 100644 index 0000000000..f606bfe319 --- /dev/null +++ b/BizHawk.Client.EmuHawk/tools/GB/GBPrinterView.cs @@ -0,0 +1,201 @@ +using System; +using System.Drawing; +using System.Drawing.Imaging; +using System.Text; +using System.Windows.Forms; + +using BizHawk.Common.NumberExtensions; +using BizHawk.Client.Common; +using BizHawk.Emulation.Cores.Nintendo.Gameboy; +using BizHawk.Client.EmuHawk.WinFormExtensions; +using System.Collections.Generic; +using BizHawk.Emulation.Common; +using BizHawk.Emulation.Cores.Consoles.Nintendo.Gameboy; +using BizHawk.Common; + +namespace BizHawk.Client.EmuHawk +{ + public partial class GBPrinterView : Form, IToolFormAutoConfig + { + const int PaperWidth = 160; + + // the lightest color + private static readonly uint PaperColor = (uint)Color.AntiqueWhite.ToArgb(); + // the darkest color + private static readonly uint InkColor = (uint)Color.DarkSlateGray.ToArgb(); + + [RequiredService] + public IGameboyCommon Gb { get; private set; } + + // If we've connected the printer yet + bool connected = false; + + // the entire bitmap + Bitmap printerHistory; + + public GBPrinterView() + { + InitializeComponent(); + + paperView.ChangeBitmapSize(PaperWidth, PaperWidth); + + ClearPaper(); + } + + private void GBPrinterView_FormClosed(object sender, FormClosedEventArgs e) + { + if (Gb != null) + { + Gb.SetPrinterCallback(null); + } + } + + public bool UpdateBefore => false; + + public bool AskSaveChanges() => true; + + public void FastUpdate() + { + } + + public void NewUpdate(ToolFormUpdateType type) + { + } + + public void Restart() + { + // Really, there's not necessarilly a reason to clear it at all, + // since the paper would still be there, + // but it just seems right to get a blank slate on reset. + ClearPaper(); + + connected = false; + } + + public void UpdateValues() + { + // Automatically connect once the game is running + if (!connected) + { + Gb.SetPrinterCallback(OnPrint); + connected = true; + } + } + + /// + /// The printer callback that . See PrinterCallback for details. + /// + void OnPrint(IntPtr image, byte height, byte topMargin, byte bottomMargin, byte exposure) + { + return; + // In this implementation: + // the bottom margin and top margin are just white lines at the top and bottom + // exposure is ignored + + // The page received image + Bitmap page = new Bitmap(PaperWidth, height); + + var bmp = page.LockBits(new Rectangle(0, 0, PaperWidth, height), ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb); + + for (int y = 0; y < height; y++) + { + for (int x = 0; x < PaperWidth; x++) + { + uint pixel; + unsafe + { + // Pixel of the image; it's just sent from the core as a big bitmap that's 160xheight + pixel = *(uint*)(image + (x + y * PaperWidth) * sizeof(uint)); + } + + SetPixel(bmp, x, y, pixel); + } + } + + // add it to the bottom of the history + int oldHeight = printerHistory.Height; + ResizeHistory(printerHistory.Height + page.Height + topMargin + bottomMargin); + using (var g = Graphics.FromImage(printerHistory)) + { + g.DrawImage(page, new Point(0, oldHeight + topMargin)); + g.Flush(); + } + RefreshView(); + } + + /// + /// Set a 2x pixel + /// + /// The bitmap data to draw to + /// X position + /// Y position + /// The ARGB color to set that pixel to + unsafe void SetPixel(BitmapData bmp, int x, int y, uint c) + { + uint* pixel = (uint*)(bmp.Scan0 + x * 4 + y * bmp.Stride); + *pixel = c; + } + + void ClearPaper() + { + ResizeHistory(8); + RefreshView(); + } + + void ResizeHistory(int height) + { + // copy to a new image of height + var newHistory = new Bitmap(PaperWidth, height); + using (var g = Graphics.FromImage(newHistory)) + { + g.Clear(Color.FromArgb((int)PaperColor)); + if (printerHistory != null) + g.DrawImage(printerHistory, Point.Empty); + g.Flush(); + } + + if (printerHistory != null) + printerHistory.Dispose(); + printerHistory = newHistory; + + // Update scrollbar, viewport is a square + paperScroll.Maximum = Math.Max(0, PaperWidth - height); + } + + void RefreshView() + { + using (Graphics g = Graphics.FromImage(paperView.BMP)) + { + g.Clear(Color.FromArgb((int)PaperColor)); + g.DrawImage(printerHistory, new Point(0, paperScroll.Value)); + g.Flush(); + } + + paperView.Refresh(); + } + + private void saveImageToolStripMenuItem_Click(object sender, EventArgs e) + { + // slight hack to use the nice SaveFile() feature of a BmpView + + BmpView toSave = new BmpView(); + toSave.ChangeBitmapSize(printerHistory.Size); + using (var g = Graphics.FromImage(toSave.BMP)) + { + g.DrawImage(printerHistory, Point.Empty); + g.Flush(); + } + toSave.SaveFile(); + } + + private void copyToolStripMenuItem_Click(object sender, EventArgs e) + { + Clipboard.SetImage(printerHistory); + } + + private void PaperScroll_ValueChanged(object sender, System.EventArgs e) + { + RefreshView(); + } + } +} diff --git a/BizHawk.Client.EmuHawk/tools/GB/GBPrinterView.resx b/BizHawk.Client.EmuHawk/tools/GB/GBPrinterView.resx new file mode 100644 index 0000000000..5be3d7bf98 --- /dev/null +++ b/BizHawk.Client.EmuHawk/tools/GB/GBPrinterView.resx @@ -0,0 +1,280 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + + + AAABAAQAICAAAAEAIACoEAAARgAAACAgAAABAAgAqAgAAO4QAAAQEAAAAQAgAGgEAACWGQAAEBAAAAEA + CABoBQAA/h0AACgAAAAgAAAAQAAAAAEAIAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAB7e3tAfHx8v3d3d/9tbW3/aWlp/2lpaf9paWn/aWlp/2lpaf9paWn/aWlp/2lpaf9paWn/aWlp/2lp + af9paWn/aWlp/2lpaf9oaGj/ZmZm/3BwcP+EhIT/jo6Ov4+Pj0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAHt7e0B6enq/fX19/4GBgf+Dg4P/g4OD/4ODg/+Dg4P/g4OD/4KCgv+BgYH/fn5+/3x8 + fP98fHz/fn5+/4GBgf+CgoL/goKC/3x8fP9ycnL/dXV1/4WFhf+MjIzPiIiIcISEhDB/f38QAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAd3d3QHl5eb+JiYn/qKio/7i4uP+3t7f/t7e3/7e3t/+3t7f/tra2/7Gx + sf+oqKj/o6Oj/6SkpP+pqan/s7Oz/7a2tv+0tLT/paWl/4iIiP9+fn7/h4eH/4mJie+FhYXPgoKCj4SE + hDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB3d3dAeHh4v4+Pj/+7u7v/0dHR/8/Pz//Pz8//0NDQ/9HR + 0f/Q0ND/ycnJ/729vf+3t7f/uLi4/729vv/IyMr/zs7P/83Nzv+9vb3/np6e/46Ojv+NjY3/ioqK/4KC + gv9+fn6/f39/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHd3d0B4eHi/jo6O/7q6uv/Ozs7/ysrK/8rK + yv/Ozs7/0NDQ/9DQ0P/Kysr/vb29/7e3t/+3t7f/urq8/8LCx//IyM3/zMzO/8TExf+ysrL/o6Oj/5iY + mP+MjIz/fn5+/3Z2dr93d3dAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAd3d3QHZ2dr+JiYn/ra2t/7e3 + t/+lpaX/p6en/7y8vP/Jycn/zs7O/8zMzP/Dw8L/urq9/7Kyu/+oqLz/nZ3C/6Cgxf+xscf/ubnD/7i4 + vP+vr7D/oKCh/5OTlP+JiYr/hYWFz4aGhnCKioowj4+PEAAAAAAAAAAAAAAAAAAAAAB3d3dAdXV1v4CA + gP+VlZX/ioqK/2BgYP9mZmb/mpqa/7u7u//Jycn/z8/O/8zMzP/AwMj/qqrE/4iIv/9ZWbn/Vla3/39/ + uP+cnLn/rq66/7GxtP+kpKf/n5+i/6Skpf+hoaHvkpKSz4uLi4+KioowAAAAAAAAAAAAAAAAAAAAAHNz + c0B0dHS/dHR0/3R0dP9gYGD/NjY2/zs7O/9wcHD/m5ub/7y8vP/Ozs7/0NDQ/8PDzv+mpsn/eHjD/zg4 + u/8xMbf/ZGS1/4SEtf+Rkbf/lJS1/4yMrf+UlK7/ra22/62trv+Wlpb/ioqKv4uLi0AAAAAAAAAAAAAA + AAAAAAAAb29vQHBwcL9jY2P/S0tL/zY2Nv8mJib/KCgo/zw8PP9nZ2f/qKio/8rKyv/Pz87/wsLO/6am + yv94eMj/ODjJ/zAwxf9hYb7/cXG4/19fsv9YWLH/WVmz/3Jyt/+jo73/sLCy/5eXmP+Kioq/i4uLQAAA + AAAAAAAAAAAAAAAAAABvb29AcHBwv2VlZf9QUFD/PDw8/ygoKP8pKSn/Pz8//2pqav+pqan/ysrK/87O + zv/Gxs//sLDM/42NzP9cXND/VFTN/3d3w/90dLv/S0u0/zo6tf9AQL3/YWHC/5+fwv+xsbX/l5eZ/4qK + ir+Li4tAAAAAAAAAAAAAAAAAAAAAAHNzc0B1dXW/enp6/4WFhf9wcHD/PDw8/z8/P/94eHj/o6Oj/7+/ + v//Ozs7/0NDQ/83N0P/Gxs//uLjP/6Sk0f+ens3/paXD/42Nvv9VVb3/OzvB/0BAzP9hYc7/n5/H/7Gx + tf+Xl5n/ioqKv4uLi0AAAAAAAAAAAAAAAAAAAAAAd3d3QHh4eL+Hh4f/pqam/5ubm/9nZ2f/ampq/6Oj + o//ExMT/zMzM/9DQ0P/Q0ND/0dHR/9HR0f/OztH/ysrS/8bGzv/Cwsf/p6fE/3Z2xf9fX8r/YmLT/3t7 + 0/+oqMj/srK1/5iYmf+Kioq/i4uLQAAAAAAAAAAAAAAAAAAAAAB3d3dAeHh4v4yMjP+0tLT/vb29/6io + qP+pqan/v7+//8zMzP/Pz8//0NDQ/9DQ0P/R0dH/0dHR/9DQ0f/OztH/zc3Q/8zMzf/Bwcz/r6/N/6am + z/+oqNP/r6/Q/7u7x/+0tLX/mJiZ/4qKir+Li4tAAAAAAAAAAAAAAAAAAAAAAHd3d0B4eHi/jo6O/7q6 + uv/Nzc3/yMjI/8fHx//Ly8v/zc3N/87Ozv/Ozs7/zs7O/87Ozv/Ozs7/zs7O/87Ozv/Ozs7/zs7O/8zM + zv/Kys7/ycnP/8nJz//IyMz/xMTG/7W1tf+ZmZn/ioqKv4uLi0AAAAAAAAAAAAAAAAAAAAAAd3d3QHh4 + eL+Ojo7/uLi4/8zMzP/IyMj/xsbG/8fHx//IyMj/yMjI/8jIyP/IyMj/yMjI/8jIyP/IyMj/yMjI/8jI + yP/IyMj/yMjI/8fHyP/Hx8n/x8fJ/8bGyP/ExMT/tbW1/5mZmf+Kioq/i4uLQAAAAAAAAAAAAAAAAAAA + AAB3d3dAdnZ2v4aGhv+jo6P/r6+v/6qqqv+nqKj/pqio/6WpqP+lqaj/pamo/6WpqP+lqaj/pamo/6Wp + qP+lqaj/pamo/6WpqP+mqaj/pqio/6eoqP+oqKj/rKys/7Kysv+rq6v/lZWV/4qKir+Li4tAAAAAAAAA + AAAAAAAAAAAAAHNzc0B0dHS/dnZ2/3t7e/94eXn/b3Bw/2lsbP9nbm3/ZW9t/2Vvbf9lb23/ZW9t/2Vv + bf9lb23/ZW9t/2Vvbf9lb23/ZW9t/2Zvbf9obmz/am1s/2xtbP94eHj/j4+P/5eXl/+Pj4//ioqKv4uL + i0AAAAAAAAAAAAAAAAAAAAAAb29vQHFxcb9sbGz/Y2Nj/11eXv9bXV3/UWNf/0FtY/84c2b/NnNm/zZz + Zv82c2b/NnNm/zZzZv82c2b/NnNm/zZzZv82c2b/O3Bl/0RrYv9OZV//Vl5c/2VkZf95eHn/hYWF/4mJ + if+Kioq/i4uLQAAAAAAAAAAAAAAAAAAAAABra2tAbW1tv2dnZ/9bW1v/XV9e/2xzcf9eioD/NKWM/x2z + kv8atJP/GLWT/xi1k/8YtZP/GLWT/xi1k/8YtZP/GLWT/xi1k/8krZD/PZ6J/1OOgf9oe3f/cXBx/25u + bv90dHT/hISE/4qKir+Li4tAAAAAAAAAAAAAAAAAAAAAAGtra0BsbGy/ZWVl/1dXV/9cX1//dH17/2Se + kf8swaD/DdSp/wnWqv8H16r/B9eq/wfXqv8H16r/B9eq/wfXqv8H16r/B9eq/xfNpv83uZ3/VaOS/3GK + hf93d3f/aWlp/2xsbP+BgYH/jIyMv4uLi0AAAAAAAAAAAAAAAAAAAAAAa2trQGxsbL9lZWX/V1dX/1xf + Xv90fXv/Y5+R/yjDof8J1qr/BNir/wLZq/8C2av/Atmr/wLZq/8C2av/Atmr/wLZq/8C2av/E8+m/zS6 + nf9To5L/cIqE/3d3d/9paWn/bGxs/4GBgf+MjIy/i4uLQAAAAAAAAAAAAAAAAAAAAABra2tAbGxsv2Vl + Zf9XV1f/XF9e/3R9e/9in5L/JsOi/wbXqv8C2av/ANus/wDbrP8A26z/ANus/wDbrP8A26z/ANus/wDb + rP8R0Kf/M7ud/1Kkkv9wioT/d3d3/2lpaf9sbGz/gYGB/4yMjL+Li4tAAAAAAAAAAAAAAAAAAAAAAGtr + a0BsbGy/ZWVl/1dXV/9cX17/dH17/2Kfkv8mw6L/Bteq/wLZq/8A26z/ANus/wDbrP8A26z/ANus/wDb + rP8A26z/ANus/xHQp/8zu53/UqSS/3CKhP93d3f/aWlp/2xsbP+BgYH/jIyMv4uLi0AAAAAAAAAAAAAA + AAAAAAAAa2trQGxsbL9lZWX/V1dX/1xfXv90fXv/Yp+S/ybDov8G16r/Atmr/wDbrP8A26z/ANus/wDb + rP8A26z/ANus/wDbrP8A26z/EdCn/zO7nf9SpJL/cIqE/3d3d/9paWn/bGxs/4GBgf+MjIy/i4uLQAAA + AAAAAAAAAAAAAAAAAABra2tAbGxsv2VlZf9XV1f/XF9e/3R9e/9in5L/JsOi/wbXqv8C2av/ANus/wDb + rP8A26z/ANus/wDbrP8A26z/ANus/wDbrP8R0Kf/M7ud/1Kkkv9wioT/d3d3/2lpaf9sbGz/gYGB/4yM + jL+Li4tAAAAAAAAAAAAAAAAAAAAAAGtra0BsbGy/ZWVl/1dXV/9cX17/dH17/2Ofkf8ow6H/Cdaq/wTY + q/8C2qv/Atqr/wLaq/8C2qv/Atqr/wLaq/8C2qv/Atqr/xPPpv80up3/U6OS/3CKhP93d3f/aWlp/2xs + bP+BgYH/jIyMv4uLi0AAAAAAAAAAAAAAAAAAAAAAa2trQGxsbL9lZWX/V1dX/1xfX/90fXv/ZJ6R/yzB + oP8N1Kn/Cdaq/wfYqv8H2Kr/B9iq/wfYqv8H2Kr/B9iq/wfYqv8H2Kr/F82m/ze5nf9Vo5L/cYqE/3d3 + d/9paWn/bGxs/4GBgf+MjIy/i4uLQAAAAAAAAAAAAAAAAAAAAABra2tAbW1tv2dnZ/9bW1v/XWBf/210 + cv9fi4H/NaaN/x60k/8btpT/GbeU/xm3lP8Zt5T/GbeU/xm3lP8Zt5T/GbeU/xm3lP8lr5H/Pp+K/1SP + gv9pfHj/cnFx/25ubv90dHT/hISE/4qKir+Li4tAAAAAAAAAAAAAAAAAAAAAAG9vb0BxcXG/bGxs/2Rk + ZP9fYGD/XWBg/1RmYv9EcGb/O3Zp/zl2af85d2n/OXdp/zl3af85d2n/OXdp/zl3af85d2n/OXdp/z5z + aP9HbWX/UWdi/1lhX/9nZ2f/enp6/4WFhf+JiYn/ioqKv4uLi0AAAAAAAAAAAAAAAAAAAAAAc3NzQHV1 + db9xcXH/aGho/2BgYP9XWFj/UVRU/09WVf9NV1X/TVdV/01XVf9NV1X/TVdV/01XVf9NV1X/TVdV/01X + Vf9NV1X/TldV/1BWVP9SVVT/VFVU/2FhYf95eXn/hoaG74iIiM+Li4uPioqKMAAAAAAAAAAAAAAAAAAA + AAB3d3dAeXl5v3R0dP9oaGj/YGBg/1paWv9XWFj/VlhY/1VZWP9VWVj/VVlY/1VZWP9VWVj/VVlY/1VZ + WP9VWVj/VVlY/1VZWP9WWVj/VlhY/1dYWP9YWFj/X19f/2xsbP91dXXPfX19cIqKijCPj48QAAAAAAAA + AAAAAAAAAAAAAHt7e0B8fHy/dXV1/2hoaP9gYGD/XFxc/1paWv9aWlr/Wlpa/1paWv9aWlr/Wlpa/1pa + Wv9aWlr/Wlpa/1paWv9aWlr/Wlpa/1paWv9aWlr/Wlpa/1paWv9eXl7/ZmZm/2lpab9ra2tAAAAAAAAA + AAAAAAAA8AAAP/AAAD/wAAAP8AAAD/AAAA/wAAAP8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AA + AAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AA + AAPwAAAD8AAAD/AAAA8oAAAAIAAAAEAAAAABAAgAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAA/zMz + M/82Njb/ODg4/z57bv87fW//OH9v/zd/cP9DQ0P/SEhI/01NTf9MX1v/T15b/1FRUf9XV1f/VFlY/1dY + WP9TXFr/UF5b/1RcWv9YWln/Wlpa/1ldXP9aXFz/XFxc/11eXv9KYVz/TGBc/11lY/9UbWf/XWhm/1Jt + aP9HdWv/RnZs/1dzbf9Zcm3/THpw/0t8cf9gYGD/YGJi/2JiYv9hZGP/YWVk/2FmZP9kZGT/ZmZm/2Nq + af9ibmv/aGho/2pqav9pbGv/bGxs/25ubv9jcm//ZHNv/29xcf9tcnH/bnNy/2R6dv9ofHf/aHx4/2h/ + ev9sf3v/b357/3BwcP9ycnL/cXd2/3R0dP92dnb/cnl3/3N8ev90fHr/eHh4/3p6ev95fHv/en18/3x8 + fP9+fn7/NoBw/zuFdf88hHT/Q4Bz/0CCdP9Whnz/Uol9/2qAfP9sgHz/Skq5/0tLvP9PT77/UVG//1pa + uP9jY7T/Z2e1/2pqtv9mZrn/YWG+/2Rkv/9vb7n/bW28/3FxvP99fbj/SkrD/05Owv9RUcf/UlLI/25u + wf9pacr/dXXD/3l5xP9wcMr/cXHO/3p6yf87m4b/PpiE/zych/8crY7/HqyN/x2vj/8ero//K6SK/yym + i/8mqIv/IKuN/yepjP8hrY7/OLKX/zS2mf84spj/M7ud/zW6nf8wvp//Lr+g/1Sdjf9Ymov/WJqM/1if + kP9piIL/aoiB/2qMhf9To5H/V6CQ/1Kkkv8ewp//D8yj/wvOpP8OzaT/DM6k/w7OpP8Yx6H/EM2j/xbN + pv8Wzqb/Gcyl/wbXqv8P0qj/CNaq/wPZq/8E2Kv/Btiq/wDarP8R0aj/gICA/4KCgv+DhIT/hISE/4aG + hv+IiIj/ioqK/4yMjP+Ojo7/j4+Q/5CQkP+SkpL/lJSU/5aWl/+YmJj/mpqa/5ubnf+cnJ3/np6i/5yc + pP+Tk6//n5+p/4qKsf+Kirf/gYG5/5WVv/+amrr/nqKh/6Ghof+jpKT/pKSk/6ampv+lpan/pqau/6mp + qf+rq67/ra2t/6KisP+lpbL/qamz/66usv+mprn/pKS+/7CwsP+1tbX/srK4/7e3uv+xsb7/t7e+/7i4 + uP+9vb7/hobA/4ODxv+KisD/h4fP/5aWw/+amsH/nJzD/5iYxv+QkM3/mprM/6Kixf+oqMT/o6PJ/6Wl + y/+goM7/qqrN/7KywP+zs8X/u7vA/76+wf+6usX/vb3H/7e3yf+wsM3/u7vL/7+/yv++vs3/oKDQ/7Gx + 0P+/wMD/wMHB/8TExf/Bwcr/wMDN/8bGzf/Jycn/y8vN/83Nzf/BwdD/ycnQ/83N0P/Q0ND/AAAA/wBM + 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 + qv8K1qr/Ctaq/0mvmf9/fn//YmJi/4yMjP8AAAAAAAAAAAAAAABsbGz/UFBQ/4CNiv8J1qr/ANus/wDb + rP8A26z/ANus/wDbrP9EsZn/f35+/2JiYv+MjIz/AAAAAAAAAAAAAAAAbGxs/1BQUP+AjYr/Cdaq/wDb + rP8A26z/ANus/wDbrP8A26z/RLGZ/39+fv9iYmL/jIyM/wAAAAAAAAAAAAAAAGxsbP9QUFD/gI2K/wnW + qv8A26z/ANus/wDbrP8A26z/ANus/0Sxmf9/fn7/YmJi/4yMjP8AAAAAAAAAAAAAAABsbGz/UVFR/4GN + iv8S0qj/Cteq/wrXqv8K16r/Cteq/wrXqv9Jr5n/f35+/2JiYv+MjIz/AAAAAAAAAAAAAAAAc3Nz/2Vl + Zf9RUlL/SldU/0lXVP9JV1T/SVdU/0lXVP9JV1T/TlRT/1NTU/+Pj4//i4uL/wAAAAAAAAAAAAAAAHx8 + fP9iYmL/Wlpa/1paWv9aWlr/Wlpa/1paWv9aWlr/Wlpa/1paWv9bW1v/ampq/wAAAAAAAAAAwAcAAMAD + AADAAwAAwAEAAMABAADAAQAAwAEAAMABAADAAQAAwAEAAMABAADAAQAAwAEAAMABAADAAQAAwAMAACgA + AAAQAAAAIAAAAAEACAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAcHBz/IyMj/yQkJP8lJSX/TU5O/09P + T/9KUU//RVNQ/0ZTUP9OVFP/SVdU/0pXVP9QUFD/UVFR/1FSUv9TU1P/Wlpa/1tbW/9iYmL/Y2Nj/2Vl + Zf9mZmb/aWlp/2pqav9sbGz/bm5u/3Nzc/90dHT/dnZ2/3h4eP95eXn/fHx8/39+fv8YGK//Nzes/0ND + uv94eL7/GBjS/zo6wv9CQtr/Sa+Z/0Sxmf8J1qr/Ctaq/wDbrP8S0qj/gYGB/4ODg/+AjYr/gY2K/4uL + i/+MjIz/jo6O/4+Pj/+QkJD/lpaW/4CAsv+goKX/rKys/62trf+2trb/t7e3/7i4uP+5ubn/u7u7/7i4 + vf+6ur//mJjH/5iYyf++vsP/vr7E/8PDw//Gxsb/x8fH/8PDzP/Nzc3/zs7P/8/Pz//GxtP/ysrS/8vL + 0//Q0ND/0dHR/9LS0f/T09P//////wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/VVUfFhYWFhYWFxYVNVVVVVVV + HlRTU009P1NLLjIvVVVVVR1RSFFSPjxKTD03G1VVVVUcNgE6UVNDIThBOT4yVVVVGQIAA0hSRCUkIiNF + MlVVVR07A0BRUlJOQiYnRjJVVVUdUkhRUlJSUlJPUEcyVVVVHktISEhISEhISElHMlVVVRoTBAgHBwcH + BwYFNDJVVVUYDTEtKysrKysoIBIzVVVVGAwwKiwsLCwsKSASM1VVVRgMMCosLCwsLCkgEjNVVVUYDDAq + LCwsLCwpIBIzVVVVGA0xLSsrKysrKCASM1VVVRoUDgsKCgoKCgkPNTJVVVUfEhAQEBAQEBAQERdVVcAH + AADAAwAAwAMAAMABAADAAQAAwAEAAMABAADAAQAAwAEAAMABAADAAQAAwAEAAMABAADAAQAAwAEAAMAD + AAA= + + + \ No newline at end of file diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.cs index 3f67fa612e..2f9caaf605 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.cs @@ -497,6 +497,20 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy } } + /// + /// set up Printer callback + /// + public void SetPrinterCallback(PrinterCallback callback) + { + // Copying SetScanlineCallback for this check, I assume this is still a bug somewhere + if (GambatteState == IntPtr.Zero) + { + return; // not sure how this is being reached. tried the debugger... + } + + // TODO: this + } + LibGambatte.ScanlineCallback scanlinecb; ScanlineCallback endofframecallback; diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/IGameboyCommon.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/IGameboyCommon.cs index b874919ad7..bc7d54a30e 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/IGameboyCommon.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/IGameboyCommon.cs @@ -13,6 +13,15 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.Gameboy /// current value of register $ff40 (LCDC) public delegate void ScanlineCallback(byte lcdc); + /// + /// + /// The image data + /// How tall an image is, in pixels. Image is only valid up to that height and must be assumed to be garbage below that. + /// The top margin of blank pixels. Just form feeds the printer a certain amount at the top. + /// The bottom margin of blank pixels. Just form feeds the printer a certain amount at the bottom. + /// The darkness/intensity of the print job. What the exact values mean is somewhat subjective but 127 is the most exposed/darkest value. + public delegate void PrinterCallback(IntPtr image, byte height, byte top_margin, byte bottom_margin, byte exposure); + public interface IGameboyCommon : ISpecializedEmulatorService { bool IsCGBMode(); @@ -23,6 +32,12 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.Gameboy /// /// scanline. -1 = end of frame, -2 = RIGHT NOW void SetScanlineCallback(ScanlineCallback callback, int line); + + /// + /// Set up printer callback + /// + /// The callback to get the image. Setting this to non-null also "connects" the printer as the serial device. + void SetPrinterCallback(PrinterCallback callback); } public class GPUMemoryAreas : IMonitor diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/LibSameboy.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/LibSameboy.cs index 42aed349ae..0e33c042fe 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/LibSameboy.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/LibSameboy.cs @@ -30,14 +30,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.Gameboy public long Time; public Buttons Keys; } - - [UnmanagedFunctionPointer(CC)] - public delegate void PrinterCallback(IntPtr image, - byte height, - byte top_margin, - byte bottom_margin, - byte exposure); - + [BizImport(CC)] public abstract bool Init(bool cgb, byte[] spc, int spclen); diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Sameboy.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Sameboy.cs index 69695f892f..5ae284dce9 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Sameboy.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Sameboy.cs @@ -339,5 +339,13 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.Gameboy } } } + + private PrinterCallback _printerCallback; + + public void SetPrinterCallback(PrinterCallback callback) + { + _printerCallback = callback; + _core.SetPrinterCallback(callback); + } } } From 148e40b504dbfa899aa22cafbb68ab6dec28a0d0 Mon Sep 17 00:00:00 2001 From: nattthebear Date: Sun, 27 Aug 2017 12:58:19 -0400 Subject: [PATCH 94/95] Fix stack overflow in printer callback --- output/dll/sameboy.wbx.gz | Bin 59146 -> 59417 bytes waterbox/sameboy/printer.c | 6 +++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/output/dll/sameboy.wbx.gz b/output/dll/sameboy.wbx.gz index b3bb90a8012cbc21ee9b446fdb0799f5097e1783..451322c7590e9ffa836329b8b55f8d870b31bb74 100644 GIT binary patch literal 59417 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�#{H51H842E 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�-`pSBp$Nl%3%vtN1*+*&p@Ma-DY_w{dg&lR3 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 literal 59146 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 diff --git a/waterbox/sameboy/printer.c b/waterbox/sameboy/printer.c index bc1d45ab47..e27d7d544d 100644 --- a/waterbox/sameboy/printer.c +++ b/waterbox/sameboy/printer.c @@ -1,4 +1,5 @@ #include "gb.h" +#include "../emulibc/emulibc.h" /* TODO: Emulation is VERY basic and assumes the ROM correctly uses the printer's interface. Incorrect usage is not correctly emulated, as it's not well documented, nor do I @@ -9,6 +10,9 @@ Also, field mask values are assumed. */ +// hackadoodle! we must not overflow the stack +static ECL_INVISIBLE uint32_t tmp_image[160 * 200]; + static void handle_command(GB_gameboy_t *gb) { @@ -21,7 +25,7 @@ static void handle_command(GB_gameboy_t *gb) case GB_PRINTER_START_COMMAND: if (gb->printer.command_length == 4) { gb->printer.status = 6; /* Printing */ - uint32_t image[gb->printer.image_offset]; + uint32_t *const image = tmp_image; uint8_t palette = gb->printer.command_data[2]; uint32_t colors[4] = {gb->rgb_encode_callback(gb, 0xff, 0xff, 0xff), gb->rgb_encode_callback(gb, 0xaa, 0xaa, 0xaa), From 200ab8f8d8981a68bfc939b22152c4557f3c033f Mon Sep 17 00:00:00 2001 From: Tastyfish Date: Sun, 27 Aug 2017 20:55:55 -0400 Subject: [PATCH 95/95] GB Printer support for Gambatte, output color improvements --- .../tools/GB/GBPrinterView.cs | 28 +- .../BizHawk.Emulation.Cores.csproj | 1 + .../Consoles/Nintendo/Gameboy/Gambatte.cs | 12 +- .../Nintendo/Gameboy/GambattePrinter.cs | 314 ++++++++++++++++++ .../Consoles/Nintendo/Gameboy/LibGambatte.cs | 14 + libgambatte/include/gambatte.h | 1 + libgambatte/src/cinterface.cpp | 5 + libgambatte/src/cpu.h | 4 + libgambatte/src/gambatte.cpp | 4 + libgambatte/src/memory.cpp | 3 + libgambatte/src/memory.h | 5 + output/dll/libgambatte.dll | Bin 189952 -> 380942 bytes 12 files changed, 383 insertions(+), 8 deletions(-) create mode 100644 BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/GambattePrinter.cs diff --git a/BizHawk.Client.EmuHawk/tools/GB/GBPrinterView.cs b/BizHawk.Client.EmuHawk/tools/GB/GBPrinterView.cs index f606bfe319..549df688ea 100644 --- a/BizHawk.Client.EmuHawk/tools/GB/GBPrinterView.cs +++ b/BizHawk.Client.EmuHawk/tools/GB/GBPrinterView.cs @@ -19,10 +19,10 @@ namespace BizHawk.Client.EmuHawk { const int PaperWidth = 160; - // the lightest color + // the bg color private static readonly uint PaperColor = (uint)Color.AntiqueWhite.ToArgb(); - // the darkest color - private static readonly uint InkColor = (uint)Color.DarkSlateGray.ToArgb(); + + private ColorMatrix PaperAdjustment; [RequiredService] public IGameboyCommon Gb { get; private set; } @@ -37,6 +37,15 @@ namespace BizHawk.Client.EmuHawk { InitializeComponent(); + // adjust the color of the printed output to be more papery + PaperAdjustment = new ColorMatrix(); + PaperAdjustment.Matrix00 = (0xFA - 0x10) / 255F; + PaperAdjustment.Matrix40 = 0x10 / 255F; + PaperAdjustment.Matrix11 = (0xEB - 0x10) / 255F; + PaperAdjustment.Matrix41 = 0x10 / 255F; + PaperAdjustment.Matrix22 = (0xD7 - 0x18) / 255F; + PaperAdjustment.Matrix42 = 0x18 / 255F; + paperView.ChangeBitmapSize(PaperWidth, PaperWidth); ClearPaper(); @@ -87,7 +96,6 @@ namespace BizHawk.Client.EmuHawk /// void OnPrint(IntPtr image, byte height, byte topMargin, byte bottomMargin, byte exposure) { - return; // In this implementation: // the bottom margin and top margin are just white lines at the top and bottom // exposure is ignored @@ -112,12 +120,18 @@ namespace BizHawk.Client.EmuHawk } } + page.UnlockBits(bmp); + // add it to the bottom of the history int oldHeight = printerHistory.Height; ResizeHistory(printerHistory.Height + page.Height + topMargin + bottomMargin); using (var g = Graphics.FromImage(printerHistory)) { - g.DrawImage(page, new Point(0, oldHeight + topMargin)); + // Make it brown + ImageAttributes a = new ImageAttributes(); + a.SetColorMatrix(PaperAdjustment); + + g.DrawImage(page, new Rectangle(0, oldHeight + topMargin, page.Width, page.Height), 0F, 0F, page.Width, page.Height, GraphicsUnit.Pixel, a); g.Flush(); } RefreshView(); @@ -159,7 +173,7 @@ namespace BizHawk.Client.EmuHawk printerHistory = newHistory; // Update scrollbar, viewport is a square - paperScroll.Maximum = Math.Max(0, PaperWidth - height); + paperScroll.Maximum = Math.Max(0, height); } void RefreshView() @@ -167,7 +181,7 @@ namespace BizHawk.Client.EmuHawk using (Graphics g = Graphics.FromImage(paperView.BMP)) { g.Clear(Color.FromArgb((int)PaperColor)); - g.DrawImage(printerHistory, new Point(0, paperScroll.Value)); + g.DrawImage(printerHistory, new Point(0, -paperScroll.Value)); g.Flush(); } diff --git a/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj b/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj index 774d7fe180..2c4cc573ce 100644 --- a/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj +++ b/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj @@ -512,6 +512,7 @@ GambatteLink.cs + GambatteLink.cs diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.cs index 2f9caaf605..87a9c4272e 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.cs @@ -497,6 +497,8 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy } } + GambattePrinter printer; + /// /// set up Printer callback /// @@ -508,7 +510,15 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy return; // not sure how this is being reached. tried the debugger... } - // TODO: this + if (callback != null) + { + printer = new GambattePrinter(this, callback); + } + else + { + printer.Disconnect(); + printer = null; + } } LibGambatte.ScanlineCallback scanlinecb; diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/GambattePrinter.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/GambattePrinter.cs new file mode 100644 index 0000000000..2cc834e5ff --- /dev/null +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/GambattePrinter.cs @@ -0,0 +1,314 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using BizHawk.Emulation.Cores.Consoles.Nintendo.Gameboy; +using BizHawk.Emulation.Common; + +namespace BizHawk.Emulation.Cores.Nintendo.Gameboy +{ + /// + /// Emulate the gameboy printer in managed code + /// + public class GambattePrinter + { + // A loose c->c# port of SameBoy's printer code + + enum CommandState : byte + { + GB_PRINTER_COMMAND_MAGIC1, + GB_PRINTER_COMMAND_MAGIC2, + GB_PRINTER_COMMAND_ID, + GB_PRINTER_COMMAND_COMPRESSION, + GB_PRINTER_COMMAND_LENGTH_LOW, + GB_PRINTER_COMMAND_LENGTH_HIGH, + GB_PRINTER_COMMAND_DATA, + GB_PRINTER_COMMAND_CHECKSUM_LOW, + GB_PRINTER_COMMAND_CHECKSUM_HIGH, + GB_PRINTER_COMMAND_ACTIVE, + GB_PRINTER_COMMAND_STATUS, + } + enum CommandID : byte + { + GB_PRINTER_INIT_COMMAND = 1, + GB_PRINTER_START_COMMAND = 2, + GB_PRINTER_DATA_COMMAND = 4, + GB_PRINTER_NOP_COMMAND = 0xF, + } + + const int GB_PRINTER_MAX_COMMAND_LENGTH = 0x280; + const int GB_PRINTER_DATA_SIZE = 0x280; + + const ushort SerialIRQAddress = 0x58; + + Gameboy gb; + PrinterCallback callback; + LibGambatte.LinkCallback linkCallback; + + CommandState command_state; + CommandID command_id; + + bool compression; + ushort length_left; + byte[] command_data = new byte[GB_PRINTER_MAX_COMMAND_LENGTH]; + ushort command_length; + ushort checksum; + byte status; + + byte[] image = new byte[160 * 200]; + ushort image_offset; + + byte compression_run_lenth; + bool compression_run_is_compressed; + + public GambattePrinter(Gameboy gb, PrinterCallback callback) + { + this.gb = gb; + this.callback = callback; + + linkCallback = OnSerial; + LibGambatte.gambatte_setlinkcallback(gb.GambatteState, linkCallback); + + // connect the cable + LibGambatte.gambatte_linkstatus(gb.GambatteState, 259); + } + + public void Disconnect() + { + if (gb.GambatteState != IntPtr.Zero) + LibGambatte.gambatte_setlinkcallback(gb.GambatteState, null); + } + + void OnSerial() + { + if (LibGambatte.gambatte_linkstatus(gb.GambatteState, 256) != 0) // ClockTrigger + { + LibGambatte.gambatte_linkstatus(gb.GambatteState, 257); // ack + + byte output = HandleSerial((byte)LibGambatte.gambatte_linkstatus(gb.GambatteState, 258)); // GetOut + LibGambatte.gambatte_linkstatus(gb.GambatteState, output); // ShiftIn + } + } + + byte HandleSerial(byte byte_received) + { + byte byte_to_send = 0; + + switch (command_state) + { + case CommandState.GB_PRINTER_COMMAND_MAGIC1: + if (byte_received != 0x88) + { + return byte_to_send; + } + status &= 254; + command_length = 0; + checksum = 0; + break; + + case CommandState.GB_PRINTER_COMMAND_MAGIC2: + if (byte_received != 0x33) + { + if (byte_received != 0x88) + { + command_state = CommandState.GB_PRINTER_COMMAND_MAGIC1; + } + return byte_to_send; + } + break; + + case CommandState.GB_PRINTER_COMMAND_ID: + command_id = (CommandID)(byte_received & 0xF); + break; + + case CommandState.GB_PRINTER_COMMAND_COMPRESSION: + compression = (byte_received & 1) != 0; + break; + + case CommandState.GB_PRINTER_COMMAND_LENGTH_LOW: + length_left = byte_received; + break; + + case CommandState.GB_PRINTER_COMMAND_LENGTH_HIGH: + length_left |= (ushort)((byte_received & 3) << 8); + break; + + case CommandState.GB_PRINTER_COMMAND_DATA: + if (command_length != GB_PRINTER_MAX_COMMAND_LENGTH) + { + if (compression) + { + if (compression_run_lenth == 0) + { + compression_run_is_compressed = (byte_received & 0x80) != 0; + compression_run_lenth = (byte)((byte_received & 0x7F) + 1 + (compression_run_is_compressed ? 1 : 0)); + } + else if (compression_run_is_compressed) + { + while (compression_run_lenth > 0) + { + command_data[command_length++] = byte_received; + compression_run_lenth--; + if (command_length == GB_PRINTER_MAX_COMMAND_LENGTH) + { + compression_run_lenth = 0; + } + } + } + else + { + command_data[command_length++] = byte_received; + compression_run_lenth--; + } + } + else + { + command_data[command_length++] = byte_received; + } + } + length_left--; + break; + + case CommandState.GB_PRINTER_COMMAND_CHECKSUM_LOW: + checksum ^= byte_received; + break; + + case CommandState.GB_PRINTER_COMMAND_CHECKSUM_HIGH: + checksum ^= (ushort)(byte_received << 8); + if (checksum != 0) + { + status |= 1; /* Checksum error*/ + command_state = CommandState.GB_PRINTER_COMMAND_MAGIC1; + return byte_to_send; + } + break; + + case CommandState.GB_PRINTER_COMMAND_ACTIVE: + byte_to_send = 0x81; + break; + + case CommandState.GB_PRINTER_COMMAND_STATUS: + + if (((int)command_id & 0xF) == (byte)CommandID.GB_PRINTER_INIT_COMMAND) + { + /* Games expect INIT commands to return 0? */ + byte_to_send = 0; + } + else + { + byte_to_send = status; + } + + /* Printing is done instantly, but let the game recieve a 6 (Printing) status at least once, for compatibility */ + if (status == 6) + { + status = 4; /* Done */ + } + + command_state = CommandState.GB_PRINTER_COMMAND_MAGIC1; + HandleCommand(); + return byte_to_send; + } + + if (command_state >= CommandState.GB_PRINTER_COMMAND_ID && command_state < CommandState.GB_PRINTER_COMMAND_CHECKSUM_LOW) + { + checksum += byte_received; + } + + if (command_state != CommandState.GB_PRINTER_COMMAND_DATA) + { + command_state++; + } + + if (command_state == CommandState.GB_PRINTER_COMMAND_DATA) + { + if (length_left == 0) + { + command_state++; + } + } + + return byte_to_send; + } + + void HandleCommand() + { + switch (command_id) + { + case CommandID.GB_PRINTER_INIT_COMMAND: + status = 0; + image_offset = 0; + break; + + case CommandID.GB_PRINTER_START_COMMAND: + if (command_length == 4) + { + status = 6; /* Printing */ + uint[] outputImage = new uint[image_offset]; + + int palette = command_data[2]; + uint[] colors = new uint[] { + 0xFFFFFFFFU, + 0xFFAAAAAAU, + 0xFF555555U, + 0xFF000000U + }; + for (int i = 0; i < image_offset; i++) + { + outputImage[i] = colors[(palette >> (image[i] * 2)) & 3]; + } + + if (callback != null) + { + // The native-friendly callback almost seems silly now :P + unsafe + { + fixed (uint* imagePtr = outputImage) + { + callback((IntPtr)imagePtr, (byte)(image_offset / 160), + (byte)(command_data[1] >> 4), (byte)(command_data[1] & 7), + (byte)(command_data[3] & 0x7F)); + } + } + } + + image_offset = 0; + } + break; + + case CommandID.GB_PRINTER_DATA_COMMAND: + if (command_length == GB_PRINTER_DATA_SIZE) + { + image_offset %= (ushort)image.Length; + status = 8; /* Received 0x280 bytes */ + + int data_index = 0; + + for (int row = 2; row > 0; row--) + { + for (int tile_x = 0; tile_x < 160 / 8; tile_x++) + { + for (int y = 0; y < 8; y++, data_index += 2) + { + for (int x_pixel = 0; x_pixel < 8; x_pixel++) + { + image[image_offset + tile_x * 8 + x_pixel + y * 160] = + (byte)((command_data[data_index] >> 7) | ((command_data[data_index + 1] >> 7) << 1)); + command_data[data_index] <<= 1; + command_data[data_index + 1] <<= 1; + } + } + } + + image_offset += 8 * 160; + } + } + break; + + default: + break; + } + } + } +} diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/LibGambatte.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/LibGambatte.cs index 06aaa58fa6..88c68bd3ed 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/LibGambatte.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/LibGambatte.cs @@ -264,6 +264,20 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy /// the callback [DllImport("libgambatte.dll", CallingConvention = CallingConvention.Cdecl)] public static extern void gambatte_setrtccallback(IntPtr core, RTCCallback callback); + + /// + /// type of the link data sent callback + /// + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + public delegate void LinkCallback(); + + /// + /// sets the Link data sent callback. + /// + /// opaque state pointer + /// the callback + [DllImport("libgambatte.dll", CallingConvention = CallingConvention.Cdecl)] + public static extern void gambatte_setlinkcallback(IntPtr core, LinkCallback callback); /// /// Returns true if the currently loaded ROM image is treated as having CGB support. diff --git a/libgambatte/include/gambatte.h b/libgambatte/include/gambatte.h index 2265ffa6d9..08b3575a6a 100644 --- a/libgambatte/include/gambatte.h +++ b/libgambatte/include/gambatte.h @@ -110,6 +110,7 @@ public: void setTraceCallback(void (*callback)(void *)); void setScanlineCallback(void (*callback)(), int sl); void setRTCCallback(std::uint32_t (*callback)()); + void setLinkCallback(void (*callback)()); /** Returns true if the currently loaded ROM image is treated as having CGB support. */ bool isCgb() const; diff --git a/libgambatte/src/cinterface.cpp b/libgambatte/src/cinterface.cpp index 6549307c85..376b8c68f5 100644 --- a/libgambatte/src/cinterface.cpp +++ b/libgambatte/src/cinterface.cpp @@ -109,6 +109,11 @@ GBEXPORT void gambatte_setrtccallback(GB *g, unsigned int (*callback)()) g->setRTCCallback(callback); } +GBEXPORT void gambatte_setlinkcallback(GB *g, void (*callback)()) +{ + g->setLinkCallback(callback); +} + GBEXPORT int gambatte_iscgb(GB *g) { return g->isCgb(); diff --git a/libgambatte/src/cpu.h b/libgambatte/src/cpu.h index 1310257e86..2c9e4547a4 100644 --- a/libgambatte/src/cpu.h +++ b/libgambatte/src/cpu.h @@ -96,6 +96,10 @@ public: memory.setRTCCallback(callback); } + void setLinkCallback(void (*callback)()) { + memory.setLinkCallback(callback); + } + void reset_bios(int setting) { memory.bios_reset(setting); } diff --git a/libgambatte/src/gambatte.cpp b/libgambatte/src/gambatte.cpp index c3843a862c..ee064c0743 100644 --- a/libgambatte/src/gambatte.cpp +++ b/libgambatte/src/gambatte.cpp @@ -141,6 +141,10 @@ void GB::setRTCCallback(std::uint32_t (*callback)()) { p_->cpu.setRTCCallback(callback); } +void GB::setLinkCallback(void(*callback)()) { + p_->cpu.setLinkCallback(callback); +} + int GB::load(const char *romfiledata, unsigned romfilelength, const char *biosfiledata, unsigned biosfilelength, const std::uint32_t now, const unsigned flags) { //if (p_->cpu.loaded()) // p_->cpu.saveSavedata(); diff --git a/libgambatte/src/memory.cpp b/libgambatte/src/memory.cpp index 79d9820e16..548e6705d2 100644 --- a/libgambatte/src/memory.cpp +++ b/libgambatte/src/memory.cpp @@ -29,6 +29,7 @@ Memory::Memory(const Interrupter &interrupter_in) writeCallback(0), execCallback(0), cdCallback(0), + linkCallback(0), getInput(0), divLastUpdate(0), lastOamDmaUpdate(DISABLED_TIME), @@ -123,6 +124,8 @@ void Memory::updateSerial(const unsigned long cc) { if (intreq.eventTime(SERIAL) <= cc) { linkClockTrigger = true; intreq.setEventTime(DISABLED_TIME); + if (linkCallback) + linkCallback(); } } } diff --git a/libgambatte/src/memory.h b/libgambatte/src/memory.h index 78a89a0ee4..3bfe8675c0 100644 --- a/libgambatte/src/memory.h +++ b/libgambatte/src/memory.h @@ -39,6 +39,7 @@ class Memory { void (*writeCallback)(unsigned); void (*execCallback)(unsigned); CDCallback cdCallback; + void (*linkCallback)(); unsigned (*getInput)(); unsigned long divLastUpdate; @@ -275,6 +276,10 @@ public: cart.setRTCCallback(callback); } + void setLinkCallback(void (*callback)()) { + this->linkCallback = callback; + } + void setEndtime(unsigned long cc, unsigned long inc); void setSoundBuffer(uint_least32_t *const buf) { sound.setBuffer(buf); } diff --git a/output/dll/libgambatte.dll b/output/dll/libgambatte.dll index 358af1d5dc0d0469830560d8ecc605615613823e..4bf168c395486e0e31bf6585c3da0280e679f115 100644 GIT binary patch literal 380942 zcmeFaeS8$v^*=tFY%sy#1Odg05;e9-K_yBp(WsfQi4$CGP<*P0u~Ed<2ZW7atGJs< zbjNXRFlez_wOXyM{q%#?LI5kf2_^v)1Jnv?Ys6}2iB^0u$L6suM?z z8d+k9uCEbb;h+ zQaOjWo4)7K7y6r$CkP`1A^d|8OfNwwW?;@sMJB}hupnW-&_G6L^Ftki8h^!pA$pYg z1)p)hFrEyS<*#_9Unup!)!zf*MiV{I!ik})mV|)lp9kU8MA994IR6@i`i2v)ydrc3 zfN?^EK|?aHPj66_P#-^WAt$VA1-=dV+wr-;P1jI$;sQ>`bcC+L(V*MwrkhfA;u20* zd>HUmyibI&WH9@$N&wxD7A+!3KhZU$<4wx2&=5cIDlU(agh5BTPEMz1@~+`@tWVH4 z!bs4aoIw{qar$|)N&dz3-y^`2T`JvlRq+!;*RuA_Cpz>Mqaz=4{8dr=7G8Dj4UKR; zGDRGCBB^rIO{qRPxk|8o{NUsm2LUL(NU z^dqjw6=XFbt6lm{xhQJm#2mjMx4tf`IrwrYeNl5lVtHKdVF5x`HWXjl)j^)hi{eB< zxV)fbw6s^u;JfnR8ii+4{1wW9lE?WlWvexW?|JaMaeO+d@q z33HqM!oWdmbcj#ABCGrM$l}wd$gT0F_hjvi8^NF*r0mNPTiylJnu+*Nf3YD~Fk4W1 z>DKgPhbkmzx$(sN8DFC7F!&u$2wjdvsCL^fyaB*Uo=;exT zvE?8%%A*l)m+wV0c4MefGkjvpQJ~Wff?6$~g4F;X4q)qEv1J=c)AB9_xvasA@zAK5 zs=k)SYfybF)u-g$cCKIGt%LdO#+S#FC#6!UdE&$XNVVftNT|~aOY}Y;dZjfkt1pDk z4r(Vv7<{IncMx3dmX&|!%N3t49wTcbsJahQeFo^J_hmJyUvhb_P}fs~`UQOYOX#ya z-g6Lr%6H^uT2Y)>C9wWU=2`7Q=iiZ=EU~`BG3wBc9x@s995oqV^zWdi>FMLf;1Hl{e z<(H|{z~c`812(A7`znW8v6dMLtvc0Y7h7*a11#>Nd26{SpYzLaAUAmwr)54w%6%X* zty%Y&{;Rwv!|Pty57Sb|(f|mJgobkR*RXM0Pz{t!Q)ib`U_5g5Bsb0qitTZ6RXm`L zU8cnS!Ny)yl4~o*stfbfzB+Yluu+<-O4Dk!32JS{gh){BTsR`w7{{mFC{0mkO$K8G z^byc^)~WGo%^y)`m8w!nSKGWcyM9gbSNM2Us#HisQa&iG@!!=(UTl9CS4W;L$`RBY z6jo88+Apq(^s-VuN*h_J5T#A5RD{xIRvL@ai>x$Wi#&%yK#Od^$MKZ9NRfVup@D*U zLibB*TnhJw!)xL|3z8U!tJM?0{SxCYMrjKxm2}N(lVcGYcs`2%y^hB>#3XeTyXKi#d?95->_|fTs09PjejqmomVeRCiBv zJ^n8Opi9=Id~tP@*?1%h%*Hcd<0!N74A?lzY&-)tjxrn1fQ_Tf#xr2!D6{d5@miGI zI7~K@EzbeV8T^6h6mQi>v%Xm&@O!$mgl`g0T4eRJctLZn~Zd4-0~LdxQ+4 zMM@zU{7tARvIJ#umEf3WLHW=h*mm}ouT=+ zq7_A5m<;%QCMA-G%+OjklD8#)h==Wn42oVTa`BIOs7$ryh%j0ON!=B2Zzv)tN5r>285#pke z2h=po<_=Vt2{iQqzQLm~xHkI2n0A$f$mc zAk98TF0_Qkg{*WiuanhR#g@0BjI4!Oy|GY9y&Su?WQwc~$XeS}iJ>a#1ECsF#AZ3M zZ`x;l34Njx7v&Y*0sj;X;o2g?)oWv9rOO{{PVL{n|Fdn!^c^3@Unr?|CUzJ7E{w*D zflfJgeh!j5G4Ps@kd@bS<+1@;`9hS{IVGiwuR+l#w!)3!u7Q#%(LhN9mp-TDV$3wM z(p}W;ACCslK}*%w^mi`7G+yy>s6bYC>cU02LK~)xC6s@$Ubn|vHv*0mBgbZ!l-9s2 z)erUFPk_XnQ_7SeRU7Km9kRMxRuj5%AtefEoQ#>NKDm&&dKK5X^>wl33IGQB+IXfZ zYdNyIT~@cqv2ovRqHJhqsvfpM3h<$R2{JNS%LNSBLSR$%ZCZ#kuPQF@VB@MT?IN4~mOU4I|K%hX)Hn zlf#3#q3^IjRt5Z#p(Agq2oD||8XF!=HR&1gG)jY8*)7VGq7)RugFdx)aaT<8Gfxi> zjtRY99v}FV5x+a&mMKTPtn@9;*G8yH8(IsS z6=PJ|^GD^8p+DR-vhwKA6P2l^Z3B-~j%j*v;FtDzHOG_PTqJ9uYtt)1bFW5o$Dp|) zntL#sdzzVlYVFkCpt@1kp5g8No7}j!PTiwFeIBLa2}4w!??cSdq&#nOfyNq)D9ZcU zh~H`LeTB96WoLWS`v2ZIGS2k*iRB}!!aYc5_HA#rdR^b+uJ0YL@BQX?_)CzQ7^^O-i$#S|=)#J`B9y~LtlTL!FQtA( zo|4dWgBJ%evLLoahJr$HCax94Rr7Gc$IVKusu*TlvR4NxZ?Iqa=KiINFb{iWf;0 zn-?b~^+QQ{>q{x-KO#`}a-d>Ms1hl^lJeDRWA8j$UCvq+h{?WC$;`%$N<2qN1Q}HXk|(ZUvzMan*|bh3L7m z#MWeDSAL-2HRMuISJIZZF}Y|-14N0d+RmaL2K|}%bduIpBy8%jcQ!pl!)HASSqGB} z$t_qFIqabo!eHD=Xn|iogLdqil9mFkXCWR)@N`PO>tbzvP)kiHZ{=!*cf$VE7!~Pk zjs>B;K0x#l$Z;*;d;m3nGx+<#FR5Ydlw)DBDoiQ7LmZhYUEDvt#Oao}JzU&-hBzr* z+@1_^pLmJe$Hk#pU!uh9C6G(Kp8Pe|&FlA*?P&H)-h;2M_{!rArFVBc3=&D%mn+_J zFG>_K6T5Pxg1%byE``h%UdMbwj%j2yIra=`8(JESol_;NJB;{)o+W?463lRjHgX85 zY=^W}XWhJwdxW;UogAWC9UHNoq0Mpzg9^@I6W-qRs1ceR>r1$h!d6wWc50*k<-0y| zD}}ACV(rvjl!LrufXTpetewmbJ;=UXWO4%tSiX$GueSXL8?^{80YR|lj~fva9_mNf znb{aeNS+a^Y=xDOUw8K}$rY^eiJS+qSLz7E;QCoJF+D`OsEoi{=ldKfThrgoIf2PH z;(hBzS=}63C~K&ub#Le*S-YF&Dj5rf5whlENzvUbR|O= zEXSfW_y`4#<17v=GytO2PyMBoDKP(((ct!^+2Ac~1&*ea2GlOr4yHr^Eu7keCZhud zy#y@_V5KuvZVZwZ7v=}lcv)|2d?_|H?x9xEI;b={7ONBBh!PuhQ!o)TI&9`mIU{wo zPgr`K+_+KB#U7s2!P*_^q;~65>vFMSWpG6jgt8b>$>HLv!-&zS!=i-zip}Ek&hmJm zA|XB$KL%UM8{|vpLe&;(H~QqgY0&lpY}xaT26PdbnyCowXqQOPYq5JtqVsadl*)!_ z7QZo`)xV)bb@42pK$$D8%f!{S{&}iGt1uKtph%-oTveMNRcH*LR1j6j<53zJRmi_l zIykD3H=|S-RmgWy8ij>$zyCAD^e`Huw$sp4JC7GIbRxTGV@XwL#HsBxUO|6IR3Xns zNsKDw$0!v=73Q@Htw9|5eXKc*b8}_i(#7Lq&9tEth#DI@JYFSVALnz%GxKaj#qq`# zb$jCdLRFVzmB@b5}C4^O_GGDko|es~%@`F6@Q>HAHQFH&b=Bk5dx zVuHPizGDWxX)Zq3Bg46)nZzm2PoV%2f=AxRvhhjxQF`9G4f{X4eaCEHOL^cxp`HJi zZ{uMRi)E(j<(FZ>nsyoZKVY{QI<)4zcJT575AN8Vt zKUI1hw)V!uptM56xfRn#)(ZDy`+w3QzMTU-h$j+1$oSAEOWt4Rv*&xX?@ieE57;)8 zv0(`IzsZyCW?ijrQg=q)BAffRG9xD!p<7)0;if-gSBusp4r^sI)g`F%ESRPSpSR)j zI($BiPYIvv$yBP-RFg7Hb%euId2M7LVqU3w;;_f)rco7gx8lnAvhNc#w!vgp}4$<>D%hLL+6T z6w2`V00p;s;`MQWD1M^25mXd5QS292vzUwGPEDf-IZyo21}p%t??+)Xz^}~{uT9jb zdkD5gEDMxW0oVs&6rhPF@)oHLpspztTmgFpJe$Na%vZz(DL;CVouCx-;^ah4gg1u6 z>nK2D&oY6wP#^|>9RHHA49H)gN~yAXUBtA4lg)VwnLgGB-DKe0+n^}QYQ9W{_|9088hjx~@sh|^e!~cGPFlGxMSU0aNptAnO zaAdokblNPl@xi+fo6z-j5$ z!)8)~n6q?TWd`7~lQSVyWAki4Qz&&-`_!!oJzsfCRQi3s-o4%V%vYQ8)dcbrrC-EK z&et2z){*}~W2vkcHrm_mm&BSl>2Bo1%xY5PUu5ZmK5jVXSAl|k>`1Ps&~&VT7}#f+ zFx?Oh`%)>gRt+}S)Saf4xxLK%V|AZi0Ww3KrEoy*M?PB4Apl6~e*HUPS8;Ad#4J`EjG z6RV|OCbv_2Ozq-6N3#zF6sHR3{_zc4dc-4}o?KrJTHq zd8$S(pL`XnyPM5idCO<1)X87dm75_nv+w_aDZ$Y13Qq#fCaCfx__0ke(QY@o8l#YU z`&(!;^)~;?I-8V4X2HilebGOKAp!(z`5B5Bt61U- z9|n=yiLVre3Mi_OR6{S7#TFJMAl3?ZMS2*O9#FVLzmOZIhrBdLJD$}stZ)4BlLPmS zX3$C<#kO++}u;X48tp1-dJlP?rJ}!P7&|`yYELKvt(d0i-$Jw>5AlkHu(+$fwB95_2 z;)4{9=xFqVptPe78Ng6sIu}ZQWlb;ondl?45yoIQ4UWiyCKjrly84l2hy8YJ7%GI^ z0geL=A(w(yS~K41COnAT!|GygZ#9^VrmL`2Kx?N73KnIlkC8LfsC~FpkZ)WLp`(3C z-Kw_JyeAdJ17+I+YND(&{E}Z~+-fghn_@nUGC2XYQ`yBP#y*mfFYs*&OpcuawHK3P zSs$DC3VPE9j}Dt>cK)FW%R72Nuvd8j%|OiHOYGK%Pe%?L&mkM95BFbsO4|^(q}}Wx z?N60iqy<5o?n^&~`3zsmGIL!F3e$&p7L2=h%g|mUloj-FpPHwxBX>&b@FGJ!5-hfk z!`)j>QloY!H`-`Z`<8}m+CK?}F9REnNiHP8+psf5dClz6<3{ zi}MW?W7Ni&P*+&XOg|6%fa*T5IeYiNG2qtHf=LgdzXyM2U8EX( z*%d;Ug4WQa3&zMCB=7&lY)0}?5IDW4ybGEL>(nDaqv3@F25%UCrY z0WeBBx`zTXdN?!>c0R8$fXgW~27H?^1k9X&E01_!^lhR{e^=h#4V3BkVV@3@ubJ2z z4HDdX)6_xh-E;?0-}BO%67S3|xD2$0^hfttMu*MFNMh@EaogWBNH&4k2orXuwg4ui z{&Hn%tX4KjGND*eoDD+6GIty+_GrOJ*;?>18*z z*x(@uHJ9Ut4O$Y}T5uz80dprSTfG(rrAC<3IQHr48Uw9D(5I)c!C-n5EnV26IbT1G zx`54x=uXW!onoc9JD+bUQ1DbWnn(*00pBJ#7`6}coskyHNi*0Yr26{yzL3xM`0dG) zR+fEISs$$@UtsG=ubBG)8^ElcR?h}vKh4qa8Sw1g^gR4JMs#jbKpljNtdETWXpAj! z)qaRgci0_Cl6>x1Y-;v^%N*KD_xSXLa3$!Bj`|cm=3hw}UGH5%d zAy}uUOFv;XwNs{xj^zf;pO@&wt=Mh)-MdpMzVA zI2YG@=pzWEY0@olD@U=w=i*w$QEac!g?fNcs||fzWp!D6Mq7FGf8Vb z_e7+uB6c>oDfBHkn#D}98XG0bu8FOkV#{Pu7zg`e%W8xc5^or%I9t_h+tM)UQ}0?; z?}2qan@Tn`oBA`GKAw%9ZGal`&#~#-veA>ZP5DRK^bOhQsS8Z{fp@I-Psv74{bJIu zv*`t*=R07mugNTi>E1zTuuS3h!hCoxU$Pn0tBKlJ`@{Sg+v$scTC5wScR5JOQyg{P z$WfM8I#3sKl;xEU)ae{$d8GqY%u$wCI#78WMY97_-LbIT&Bkz+0XPbd%1`$UeV!v~ z#{hH)`ZX7nKA$}Z^HX$l&FSe;e=#SbT^9YKAKSx=rl4PUtFAyr5s`@`k zRR{GixFAba2kI7%vQ%}TuHYzY5VL{7L6*V}l*Un(!Vc5|jTuzeS3sZ7v3Q1TxE1h1F;=XK&;d8sFy-%@I5l8CrIKX%;XdUl$D;7$Lp8OhdbqeXc-U&^4 z6qjOW!x(Ws8Acx?9z*H5TnyhY!OV&-Bo{+w%jPF&i!C52u`j>8FUl}j;MAyFk0-MS zeA{rPR>W=yEpx~Se3LK{WxOyD>t0`9z(+@7UTc>(;Wh4kz9rwKRe_ImO;23^1Y#o> zN9|mJw60IKfg;@~^PC2G`c1ZM!Nnz7>jYv|KAwW3Dm+)kP66qfhW_~*$apk54kj|qbiN;Xcwk&in>%*{0=9l$`xA^&(GES3?A+4b%qnqsb zYXluu7n8 zlXEY{v5_*Id9KY?F-1i<)Hhb~$ISE|8q@6jO;-HVY!%bo|4mlx%T_UE7T;vWQG^Rm z=b}vJo2*zw#ocUZ+u_5prDTVS-5%_4F{nx}llp&r*(|=9;SsCJK z%>38H_wR7qo<_!hO?)InJo*2BP5iMC@0`+DC*vmU?tGRWVh6lN?KL*R0|mWw=%^;D zWBwVq_sPN_DES=8r%ZNWOxa>QOSbs*tJavIjSIdVZ_aFgeZ_1I%_7F^`v3lJ{3x_B z!zgGGOP+1x*p{J#f`Yyp-&V2@P72uI@|xRVt)Yyw{BKz*X5-E3mH&RlM`o*-jl^%T z;zz9>=aGeVI+>b{(QmNgvTPNz(fbWnyz;ME`k0ODZ?NL;qhe!1f~{kPhni_wqJIQG z?_g5^Um_P6M;&SB8=r2s#%^X-I)0lao}Lx_#?NKvQ)7ml^S|2+V1ayW198xMe+oXVT~lmp-<$MNR= z6t)_=!%k-VyWZTZ4}hCupf~r;E^fAO$oiS~ct4#dayeX|f4;>- zch}AVCEebwUv~i9+57y~1K`fy=Vu)NclJK_9RN241aG~&U}<~KLAd6VoN+sm-!9xl zNt1Ow5tq{VZVBHONxyR#V&d$G;c^1FLz)xR5P3Eyn7=vm0fXV3;FA|UoFFaOj2vR% zuQ~wk>`t)c0JyU|!D$D;o!tq(gsp}i_#=lH_|G$Lwh~6-0ViP7sc~xyyR)e=V_rz?JMoq}50TF!($#GBl$oM8L2n+Xjcw)tE3&!?}hnb z8Hx|Xc?Z!9;T?bQkd(zcOi9_j<8mg<;T=946S3R<)R%(OJEjt;=^Yv8R>obV^$9X5 zJ^z{Xb9y>wwU3ZeozC+qFRdMvoZrf2zsYk=r|^r?Q59vOC$~Oqj#TtT;k0Avm4vJ%k9$$+E?f#ecDk`W&ZE zk0YyLbo-K<@!J~N;>evKw&MsXV;J)ah<2qDEl=Xr3UCtg==9lQDuuTH{K4R~$AQ=2 zSeYM|6!h`bgl8h5k!$7wv$g^M?cI`0!o^j?gY_bu~j~dtnZYC^Q9Dr!3 z#_SGo7#Bt}zvY)%gb~fq!ZyPDF^(Gt$y%;~@OcEt>pG{}3(mC0hnk>Qe;YU{-SCV>kmKj-Q@~ki6sw!Db zKjSUrQuov7;?K7dEV-7srEz+92HK72qjZys9aw;&T{ zgfWfep3CT(4a|VU-0OarTlqhGnrGyy1M8Yyf3~{j zJKO_t3!l8^{(rznpJ$QAW&A;#218e^EpfiTUGw`Z3H~SMaK}PE`-Ao0c zhnxM#E%1s16*$dX;AjZsqkso5nj`f>&%P8@EHbF#VCIO>efVOFTxa@BHLn;U`AYH&kt;&`^AYPvd)z^U<Q z8lQbmL1*~%gkoa1AHP26TAJ1nJHK9@*2~xZi3Kk6$st}b20NQn~|fo89rr-*NVgF1KsQRL$=HeEYjpX&5otBkpmWRQ%ZXHzm!`KezUV*-353;81`J6=T z9$szcX&oSXV37Aq1YXsF`KcoUG6l` zFt@-n=Y!-i#Ny!%b$@htLm=j7J^%+GpD_I((vM%>67;*D%JhZgMnn&u}6R2{0A)L`ALbfOR9F#u*T1o^T`Ie6n^~&M{2nJyH&U6 z`<1`*=-mMt{_II1cU!4Hv$WOjYNM@>XO%)-oJES=`-YUuvr3^}&mzTk2t&#dS*4I8 zWRYU~h#_S=tn6(U@{KG~Y_~C_#Ii~ucgZ5f_9R2f*(8OH*R(#$dODWrQb|8KjqOeR z_Ytj!e-a4YpB`W#gknp!wvzLhgQoz; zJ(RGdJs5uRup-EFGDX<_lpHs#2y&ZD5w-aZgchgYPYWOY&}9|)(z8D8L=)VBx1 z>F@!Kb5fTc2&bd#XK_yI$phhZ^!VYNGb62pn>Y`@%%Mkge36sQ3J$lFDiOp)FdQ(c4)# z9liZ4&Y98MSvVcN-N-pJdOHiJqqobz8D>XQVfcyBkz+}mNAghl8^_Qs46`w-#`SxD zZFXAnHH_9UJBMTgk5zNhp4IZI4ht1ys^wK6TT^sg`xJaz^ z%O0}&=20e(v~kFbF(7H<04`xb(#8R7WI)o!0X&xhNgD^Sf&obz2e5&|mNtKd!aNE%!Q@fjIOKf@EAS}b0KUP1q>Tee z@q}yR0RD*qNgD_7R}4tnIDkKajKCI1^S#K+| z13)ij1gA1e|9VrKi+^c#&99g|(#9b#%7CPe1GtC*NgD@nE(4M_4qzPvk~R+DR0bq% z9KeYTNL}-$t<6XPy|g(Q!^7$trT+8fw0Ri{haV$t9P-vOAZgCeZLWkzIkfq})aJPrmNq^nkF;^fdk=k~Dv~d96WI)o!0o=rZq>TgkX9gr~zOc1< z1VArsdf`zHZN4zIDYmt_ipe8w9P;WJkhF0CPiH{V#sQ>w!nJV#M>8O4;{bjM%Z48# zZ5+UVF(7I4m95P-0KK#sghx5F`O4Jhy!))a`2~|l+BoDjGazZ>0A9y{q>Tee@q}yR z08VE>(#8QikpW2?2k;06ByINF+V}zV(q?kHHnY34WKG){|Dr5QQGtDs@wYE4EJ7jjY$BWI9K;-nr%&L9;y zsfUp>NMFHVhB-WpoI(0~PU>Og4AR>;DGg1R1&ZB9o=v2lM*ivYbR!q18F>P)!o$cJ zReXrvf{q?W&LHjPq#j1jAbo(7dKfu_bO9&zFmeWI4JY+5at7(QIH`w`i`+*30H*Xd z^0@YNBNwF^c{TC5ce7Zy$f)8jPU>Og4ALt&sfUp>NKfUY9!Aa}J(!bv7&(KqA4)?l z4gmZVm!%uo`1uio?>t_GhbL!L@f}X;VdMOg4AN^ksfUp>NF`3{VdM{h(!^m`FKh0Qi zBK0)#yLYD>IVX)T%B%43S5#z(l>t2%;90=4AQ4L zsfUp>NN?w)9!AD*KGNBdG3MtIou`FcV(Au6=leF7?_uF|y8Y-Ubhd|i)9L=k={#(k zPWMMn=V91%y4yLOhgH+*=5jg@lcv+13OfG2RP%kfoAqW`NNcB;Nosg0x*$|^F095= z3lGy<4gXfwz5U;<+m?*RdkXm*X|4D1;=-`Jnx3{NP74j;xQdIv=TrC_*kFC<@9(Y4 zj|}>7!9Z+z5Hw3qiwx%ATj3u(UcIBJ{L<$S-XxGJ&+GbMx5`z#}a zbWx#cJm61)C4)Wy1ig%uUWppNc_p5-xlN8F=*@Z2WgGY7MTGSFlRz}G31zxTtZQfU zE5rjW?0x0s@opyAlWzQ1mp)&NV#Q}x@f4#NjE$OtB7cD?-t&%EyU&LD z`rbF`<)7^rqio?oI~uh5YaBPng*%9F&l9eZ@qs)KAQGC}PH$chHY&uU|B`6vr1nFp zgNy~j!M)&ZCb%}cWZIe!p8ubJpsOl2g+|Jn!rt2M>yy=77uUCEb=+njvYARWv%(tU{Pl30)A4rjvSB3e+cKC2? z%9EKD?)(Ite}7{b+f1M0s_=h^?TO*o6#QJc+e?=c=e5IePDdWOPqHO$2nbgRrnyWoj)9#(wkY~b;NnZaGcZY zT@^~iw(GTF45RdAR(L3JJ~H?;OT9)91S?oI-3rAC67YGb{8F=LN%YPG8`v@Rbk2cJy#;%AU*$pCHbE z!q!8E{pm|w75TU~F66fK=a^n5vZq6d&{QKXAvrttg z=iA8I^v8zfl!-IeUXKrF()B0ez6#ttUE*0<1Bj3~{hDxfF5G;M`#IrGU^oDv4P|!= zIPSQ2fE!IMijDft`z$SNK=B%|q-K{O8X-5s6Xs+B)N&!fJ%N&G03iQ)h2^u;@SM~y znXt!xg%4Q`mXro#Pd&&$>mFbq&)km>WglL4`2;wXeL10WtOUfC4tj`wAATVJ23E-H zAi;HFpj%dzC14pCJrD1e=lOn6eTqP6#p}pqtyY=MK}+>IqeZAGRF7K3me2C30@O6u ztf`6DB(_XI0YAAMhD`cHF=`YCPN4iBzs$gzaJTV(ddkNek&oMSXe4pNm~HqlTl67X zI2|q2*Zq~@mb-9M2=_3@tzbC(N1Xz`qX?$}hw|Yl2i1>Q4-kd^6Am8%IDgS5P^g=1 zum6DKK12@&jR}PDe4oSLWboa#tce`{5`*uu;RgW@nGb>4ssn9#3UvCwcGj-nqHN(n z`!Lo2GH`I4lYxWVkO$q(ix5w^rN5egX}z#UCf%> zu4A#raOB~@ee@o1ey-*xC|g~Mro9JRUEfBn7?lK$jgHu;cdR0NY5Lj{CMjw4qA$Tu5K)4)+8@0j`KI(p}*d8{e zA+nGzAHdc0J|uk5BWmK%7Q($oxMw-;E>;sEcul>8TfuOnPUGSm(C!MmrZ!VrF_+d# z9P_xel_t)pX#wG8aNM)3rU_O}a|w4MuZdb@^zjFyLXs^jc)r3F@N|nQ)ey8 z&XKTxTAL;R#J|c?PM7LT*?K*3(ZJFzV(wB0v7g`+c@3~qw zhsZ8sWbN;}a5CXe=dGTBva{9y2CY7ki(iqn%u&v3f(;@ z6MUo%rae#-Ji-Rk7ODyU@O5SrQl55TP4F8wm^N@taE}ds*#Z8O1s?SWUTl!HntU|< zaeQUWn89{{gT*wCx}Q)2W-_4q4HP);vN+TvQMY0Haml4~FTYHhBV8uVl`ijU!vsjV zpE&^@^_)2Y`jUhDQYql`uKA%?zLGrWGwji}$uZ@Z;5Ra@f^X5O8 z@dwp)lpiI3!WgSCA?GD8@vQH4P@q07ufSX0I)-=cf6fQ}5tl-qc1gaBop@vKb2c_R zu>q>?q|MJtj8fYFtg2Br1n@ZFX=-t|wG$yO4X z{^3h3ldVMeQ=%G-v9y(CvI-@wzXlN{t&>?QIYu;+*54mO1)j9ZVjxh0Ehe6}j)WzH z>N8{?)HMlpnW@Ae+Qury(A94?>P00+zIr$liG1}RtbojT9IGu)Y`F!Hq4QOi9}hV4 z)tfK&>JP**cfQ*GHsZs;i!6@0^VKlnUgo$JP{@ia(Cj+GJp&xdSEFpk0!#U5#C_CH6a@H?4 zgU>rV%}hzVNZLlm!S zag<*=W&VY5r5s23q!agB!WD8H<&;ib8{zhBWV%xhDRqP`dxl8Azj9o^3wIUaIt;!% z;+t&oT}ZeGIqoioJIun#gbQ=rqYMYfF#7K_!d=O6kGXJ@2`2*w`<0_??)RWs6z_N- zD+M0EQd6l=)cOJ#wg}!;Km`PqYepK8>k(E!P&tSdMu;u{W`%>qmb`_fHN^Fr?;SjOqJXR3JmN~3YB(}_Bh0$Wm0#-OwZ22iG zj1gN}SYfQ#ayKiC6I)iW!eL^|pIPB>vE_ag5cXEW9P~GEs<|KFp8x)Ajy7L1_9dVH zcFscl!}%e2X#~=Txt{?m4)(*MdwU!}5IqMX;NBtJYc5=z<6b4)^Df*5j(dS{kGgQZ z9QS9!-EQI@0TA`|aoiJx`>}~@gQCEZ!O)iFggcjTT06aB(y2rBo4}oH^3kLRzI+gY zuYvduGjXLHcQMDwgd6O32m@am$DK^Lf0#Jtow4@i9CrlaI$gMXIWC`YPq=XRaom^G z&O1#U`7G*N!Ex^p?s^kPc_(lWa@@;=JI}-!ZFz{}{zAA@T{t>ahVG9O?prQg2glt- zxcx5}x*IaraNH8Y?Q-GPa$F^t1xi1egutHqz&oO?-FIGEZ2nt$U<7MnNMefofLk6pZR@t#yJlAg4 z;lk5$J62ni6;JE#Snb%Xcv^tRYR8-S)@`PaE5ud)9RAxrvDzcD;%P}9tNm71Jgv=R zwMS;f(;_`qJ0UBcR_n3aqq5>@*&eGsIxC*m@3Gp6S@E=xkJT1q?_8Ui&ut7Fj5E8D zY!IQPJE3D29s@_{!|j^-Gg4Rkgr(n-8@I{1$&8lkIeOTot5t-X_213 zo=;!zU-_XMkM%am=lN1{v&Viwg?If=LDal9b3fo&`HwXD3mp7ke44568b|wH_rU+ofnVo=zu$p>U>N+*fQL%=Iaua%(4w<# zD_y`r3ml+o4!X_(I*EgR>;O&RpsO9A0uH*;0owZsYs3`}(Ayj|*8%F|pi3Q~zi`mS z4$$v8=qd;37aUaW0JQ+b?*k@(_B%mnv-g)SxX8F6hz%Y|!!5XVPqJvQz7)idA+~(Q zW(An2<=6_^_{FupFeQ;BAxXD`@R@i6*APG2I;bYfwzlpS>poNuGVdc^epwg0 zh=~0y5U#k}ystR$1THncL(&;KYZbQ}Rm?>d15Y~dBbLV*=Rmu0{wU2hELNpGTk;60 z3d3p7mC#}Vtx;b}==9UP^j3;nN{TTNO;PvI7i>%E^+7>sO-bUt8(QO`!vfK(=+a>o z4>4WV`KBVH1A=_3qFbS?UXUlTgZ^NQov#Gd_9&n|3au3AuUnyYK?-A-))n+8pCN>) zX-XAj0p4K3dzAS`Q9_I>-xi1}=a9Lh$`}#GKS8LX+mgy=e8I<4{NqU0?aGsR3`e;k zaI~a= zu<<9WuYN2)g^K=(q(_deqm_Sn9aWB7rS14X7@J-tt2@{&PTQZwRc$^ns0r*==D>^E z_7~;|WjnVf@#|NCf^CsqsoRi9EXQ#aHVf3TDk#nZJyD*CPbXEdB5n|>V}IWCgtok7 z1*)ZPlc=YYdi>XP@6^$UkfN{@SltMv`p{Or@+=<-S19`hte-SjKi7{pz!C@VA#hCF z10D5|Kn>huuCLF>h1w}{EJB%ytZtTLvrCHS$>Q~K!03d4%DwZ%YZGEwprly;>i6Uh zG|kSG*)hK0+n=JzgxEW^bXJjs-AXhlcHyL3{!c<9FL={}P3r93g8}IM^699!L{| zo!Xtyr5I5~PW8`gOCf(H0q^y>1Q1--gn{+x`iiTiqIqid9C4L&XterA_!twdo<~+_ zLCu0-&KD55j6{+G*Nk>5z*kGB#aka0;&2+oJ9wkYvzmBlf9d9%&cH_6w z`|DPBwN8!Z1L@KzqrWQM0Z~uSEu;>B%KQX9Y{?8CuMt1s1xVtX79P|d{a9pWS8#y(XF2DGuuYAeR73rFDRS?biS za^tM20acn-t4&Y?6%&@Bl?zAIHTK~%*eFd=rOCD0*hrva?6QR;0%|;nA1{+iHUBbI zDzVxltzlbCjnd?R=8wo~XOC1*kih9uF~7jqBUKWhN18$(b>j56Bu?K7Vs%z2m*kue zYRco9R9GS9%Z*Z%1RW&g84x?O5${fy0%#DLIyOQL>I|yAXy-I_)>LSKc1|$Can}4< zX7equU8xms%eQHgzrqKGfY{zi`a*kBS(U0xtyv|KS&3x~R>{ydsuFDZQ{D2XIOI=; zWep`P`7jPMb}>efbwAKF&a5fCf9vqJn|MyJu~(%AGUGr1`ZuUq0F=xqB``{~37QF?FPEc!MX!ydy5y3|CiE3t5 zE^Qv<8U8no%R@8Zf1p&QO0upYvU8@IU?QoLOp$RCiCzV536qKjCeME`$GM(LPIrAj z#r6F-*Y`25@42q;A3u;L{~}5VOKZxv)%7Ik(W_wWegS?pK4InpU0sem&w1eSHdir0W{+KNSnfW)n?r;8*>9mK~(>(~)mtOA3A4}z)PHF;6a8<6)4nDugY7y9rn6~4L%dwk*R-cj-S|8S9~i^yk90E=MH2K8*)J61 zF}8uAy3x{G|L!mGL#_LT1u&$VXnL6%2O^Fy-=-h=D`u0x4%*8Mx0O-@9QkEd`^@F` zVb9ZHk4vUpS`O0AW)OFKaV2;*R+Q%kA)Fqev*JZ!*CBH5vT4-s>au+HF{@ZcD8s)g z_%|(i8VqTVS6Pb?F|oy3ii9fSi!irQ@#-{$ITfQ%mBuG?!G@WV+z;|L%bLn6Y26sg z)6e=oexq+4-DMU+C(4@EK=m@r@xTCp%{2xX%~I2(2&lQ2FaPN+nP!ZtKz7TOkrFOGA_>QpZ~%-BW31Dd;Zbp zB%8T7*IS&_>twgKnKaGDXSQy{dcHG|-`8{|HoikQi+4YUb}EB8A$-qmDu!6ntxiR6 zM95C^BnFUFUkAPk)_hqWM={+$h@3N$O~6P12P0O2cK?~}&m&jjTvRc*n7f=HgwuEh zSW7V)$9EsV!&)Tu_(%j<+ByH4yH!jaHi^!bAY9#y8KAOg@yV6qqBAQ;gifn02%TD) z8#-Ch#Y*4e0!?Y-O@`Hw$2#Y$$|FOCH_fO#Iy9m()znA#quQyx7~!(^3^P>O-{i)< zb?P2nx-W-@xN#f0&iA2F{lNW>`LA+J)13orGwgxw1!`${uxRm7;X!fHwD91F&?(`; zg3yWK!Q4<8%+BLYc<{*3kvCO@2agVo4G*T8-gWJ7D7(e<9t;oq7I(#}{1*S1(Cg*# zft77so{^6m-C`RIqY4Hqhr!N(!75;|@4;Z@++g|IK`JvD^Rl^@JH}_4y|$9QG}gbg zWpCJP3%8f-`%FLNUK;-Fs*Y)_U#0ga?4>#Fr8QGmh1bwMB0-JN7p<8tL#Yw^UtHC^ z0w2)`-D|=Z`iMs8A``yQM>ImuI^YX^L?d+Z3}5IY8lg*R_(C7i2wgr3&BD{eB(KuH zxV91xDjb6HO}A9yk_K+z11h#Yh)-;_P(5-_B#ICELyTNP5H0TyC)0LEB#dtZB^Ws% zA`BzyVPKcV7u*1>FuIkDXvRX}% zlA=mLoiQb-R!|E>0*@SZYCeKT zF`$T#8SyNVXz(I5<2eLP!=6wF^&uA&W`az-GU#tQ5=2DcAbNy|$X*nEPhWZsBCpue z1|XuZ*czhTX1EB<$Ez_=ZWsm2sc#HTEj74a-RE|{_A%k0l zJD`yw`d-l~Ha9~SEgost`?DQNKSs_|IW%wOU@iv@eWXNv>!Xl@uHfFuElt(!H1Ia)|XPue?*|{Uz4%Ai`7-R;xht0?LT9I zgQn01^a|R5#%o0-_L`U&N z*LvE;UI(iR$(QiM1`c~*l?xlUFf*YAew+j#`)|@s4O-8nfw~G>QChl;_NdWT?26>p zYW`+)0kwu8=urpsN)AovBY?o~!CK_=fdC^!(bl#axt1vtq3!N;xn#0Tx&O>2SGVNS z-nbfhkISX~@^rbhXPzndlWcPLak*;bOB9$Xg)kiI^%Y9GcU7ODxo5XW>FF~`c9KVkFZbv)Y=I<5<}Bm~H32MaJ`sFLy_HvfyOjLcPw)B}xRD7Gv^_bkgS1i+otsSN}9uXu3a%&aPIPtHQ_=FEr52;}$=Bp{#8BrrThs+1#9uy&QLGtuu+W9whCIuzDq!}4RpsX_x zYdI7igP!h_D*D8`)}dUvUSe~72b-qEv*WNDsfln&y(_0Lm4VD>P^lOzXDqy>DflES6tDzutqBDlY9vMpQo_fHam3Vfehir)oiS?QA?MA5e+|2 z^+>Z(xez+3M=GX*P2w31tbtBD?+4Gi*bFJt5K=;?P%tsrs6nnkf;~Yqn2dAEvGyOm z;>nv1f2I8t^S6oG(AK3V8oy0+nDN_0XQux)5&ZlA;P;50!%R8M?-6~0`I}y8I)KCr z@yh*sM11~PhtL3zTt=sZwArvl>7PqbQ9pc=qTZxbpSbEiBKWLtZ)Z`{scKhZ zz^}Y5?(HlNouYgphGt_cwqL9iLz9$UdkS8QGGb%Ku;L-8oBCOG$8-&BL_CY#P0u&1 zEkXnIAE2#9B?IfYKQYpQKU(`CuIGoQh1bvxKS7IpN$pfOtA7()X)G!GQlayp5g8YA z6#ES)ag|Ef2yro>qFYps1p_b|4bQSYHNK5CtqHO9OVH<~ARwU^lqI4HF>K$Z?Dj?5 zNtCAKV@3vh^U0vW>)9^DSM0^nsL@89bX+d-(8me^3usSGBUBlz)=p0&1hjP}_)vD` zimM7oOWXUy>*#?ALDOV>h%M(sL|xvHFK-OvxvWJ=j6%Rf| zU9qSrs0B-k1L|%EW*uSF_EOL9pnAS&gE?BR8EJzEf?$CAa^nYiO=H;i{m`hNj8K>y)^0TlSpXZer|QI$PXA>{=6 zEAP^ZN7(@ooKtMM5|pXFD zhB`UjM#~KwEzhu#g>l-5*{~D_s?|8YR=eu~ZbPzGO~s~#O=O{G#^al1p&J|)QvU&6 zu-V%H0zCibGF5VR1<#iPT07~NJi^etqT96k1KjHCkZ2}bf#v$z_;!w`_>jEH!YgqR z33$@S($fH}8)Is1-$jw8N1;(h9T2Nd;p)s<_#$qbL=_quy7Z3mb7=YmZi61duS*P#QUM--FJo|BDI8Nq<LU!QRVs^wG0BIJM?pA`sO`8M`rfw(_N2hR<=q$x-x7tkZv7^Tqf8k|&IpKt(6k z*J5)e!Vql3qWD^h;z4cHHAhhte}qTzCwUa#B(93`DBi)M_*=QSYgSkg(4rK*rR}@I z9W0vj=dsLaGr5F?ac4Y|5N!gjQHtmRl`)GgQPitN0|2dKaXegwA}?7HJxrsVU}}^i zdX2BId}B=oIwwr(i0ug_fsnpajZ#Rj)}CEKR;+mTN%~kM2DJ$#0X1pEI|!~uOF_Ko zV1QTB_kj9&u<>;@%H#QiOhlmKA7b-os23JfSMX@H!j9)K`*^x6V?D4eH?E|X+7_U2 zn_s8yHT)S3ClgTP@h~qpztMp2Iw0Q8DZx7gKd;t|c54qZowzoE ziq{uj01X1_$}|!`L{+8$y(mxZ#9^u2s8J`X?c|mLV=4!IZN-C(brJ49;M^7$1r$D< zZ!d!P#MxbTY2v@%ckqQ-3H{_&6t=ENy>_4hiXAAvuq)SH-du^FYO$ zl*O?h{tQs&iH9gklcQl4nwf)IHGaMFS}X{#K8=d-{D4|_agDl(zEa+WVLuUNxP&wZ z@vHh)an*UZRL90vw`_~fY6$(Hre)Jw$V!QUPMq4~-hlU(!0G;FxEiqdV15UK1!sQj zUrKi_?D>UlF%10K$}h3`Na%OusWNCM|P<=66u=w1E z?b=eY1$V{a?mwJd*SIIxxP7`-dB0Rq`E-pqy$d@UXRCo_rJ?hc&vQXMMQmYPVvP%@ z{s0o{8u!(yA4}TQr=^OiYdAx0jaogq={V){JkU=I-7GiGsGQljL((c$9QjVKfN-(8 zPg2jDA~$YV6Rq3C*12$`I^67#Fz?nG%S_l|4w@xM-BJVc6R8C5PuIb^&_b(Kf1xHN zDSS|Cu;)T`hki>H58Q#PIRh(<^D*;05&L`Fv96M1Oi1gkxT27z{(f!j$sIkiqtxDU9xMLU^0`9UCC{e&K8`;}@ASaKcaZMl&&U zIHoBR)4;bWz;-#WhptfanV0VF+54GvkI~fkt0%nl{RmJ)UuFkO-F}8(>KX`J+bxDD zju`itDLGx)-)BfLbbT-bVW@g%2Ex{~iC2OviI$?y{6g6^k?$|ep)JdcB^FQqgDp$Z znehd1=0kJ55w46IVgv6u@-0eEzsY10DxZGMNt9EL2*l1Q1ic51pw}{z+WdKHX>9sf-f?(_1DPSV39*NlkF7@v zM)rN<@GT_^Ff2Dy^;^W2d*Oh_^>tx?s#_`&SOle=I8Bn}9*NWvy2CUxVD%!&-C;i! zyCV_&528BUI-5R4zxC!Ep{nJ5SvzN%*s91m=w)p>Y7S7%%<*J(`h1y{2!wA7 zz}z$aVtm07>+}YiID4iqp|9Q3Z^6G?@oy>q-G*EEVFKfRLX@!n9N3r_13A9i=&(sv z_Ej~#iB&gEP)wIhcvE8m7)1l#}k^C55f@Q6r3 zFSwxeYWTxfYYRX@)3V-D@FMIV=vF^qtF`83h$*S?j zXEA*q5id`bzkmE5AiI@3vV8fr@{M^V_=R#j)Ubm{@TamLsKrqlk}A-!LJ2Qm1E3!i zAl^lk_?w5#lim0P=sgBtpa(wTpcf5L5B-QB`vcux3%K7X%~RLW&!TrL+%=UE)U+N2 zXPoS>N1<(Ga*28BQ-zF>?k9kr(lQXzE;#-5D6}g~gx$&njw-eQr38RZwAsvbq9Fle zQWteAWrW4X6n(JLRHM|bOyek8fpO8yjk}c^g3~koh78EFisbQJaus$9%%a~e=Gny& zcJUy)m~R&g?BYnfc(7e8w2Pzc;vsfXc-LCzlukVoOa{z zk?@nG9SQS6&m$rE-ZEY!pP%scVWS*&fFR!%emJDy`Pbt!=eeZ{$_Y z1f2wYB~TT#y$$#}L$pR)A)u1~_q+EwGiN3NWAE+f_s<9BoU`A1?X}lhd+oK?M(Q5R zCWc({U@{mahg#bmq$?5AgJ1i@rqxJd^416(KSRPDVEhqN-YwB~$4msr9kQ7umLScf zmJyT0Rm9FXjLnnK9&YjmpU=;s9dGc3d|}>+*nl#kjvJD&3Q19gq=wQPCBQ#;_W&NXc*Q zKyG$KYDT38epLqIke8&$j6-%-9;wMrPkFu!%t;UYnhYGB9{6<`I3_)ioFc-h<8Bi4 z-w4c054=DI;uZ;a$_r)SvFYt3+lkbSO-~6=kO&-?9thtW2*eJ(yG)#+M4%=&elUvU z0H$QDIGIecFU%l*H~N54DV7ke$+npQjyfY+(o~xZU`N)I?Ky|oa|SIB;)dh}#T_;u zNbwQTLVgifevIRWz=uaX-i(KMd@X)Eje8h`zqs*pzQqk%B-+atNWqrXO#ymtU|Rde ziHNY}O(kQRITyf>T|n9AL%*<&InA7N7-%aa%$&2-*JCPfvihR*gp?<#uXgn{Nqv#6 zAWl-P*6o7wO4RbA^<&0khucE5|&m)-Bv)mOVpd5Ze7 z`~5}rW%ql$`m+0dtorIz`Et~k-S0v44N$lHeNcVb{chQVejoP(^xJz7I&Wt^gS7}& zN)eua702L(=VHaoY$(_0WmC+=C0`MG@enh|;*I_~#LRrW(KCmbIT3F>k}GBwm=QV~ z@tZ;V3<>S=KpN0Py(FLhyjUy&wNIBG>#xQl_df3 zalpLeJe~M`_jEqQXu6w31g^aa#154n*b&=zs?nig<16l;SORco1&poPdbD})@ZrPy zfo}igj?ms9{_5WpJ+VaofsSAhWZK^oh|U@XZgXv*@L zc=c+HNC}EQuc#z49}T=JH=bR9CiG)DTtj`9T&Z(Kiy&t~3o+4&R{CBZ3&C-qcK86Y zx^g&?sPbh$=I2+5T{u%25HYLi`;0-=SeN&$O&jmV*R}BNkc|6!q<)C@o>HK6rx8n;d+KG+El&(J_ne+G_qBDNE_2UBvIC75VQjG%hHgDV` zHVpS9Qss6Bt%c&mY??iqz(&7WwBWWJIR@5c8@a2 zboi?tOB^@T3~wVNOk57!&(L?G(n3V3wuAGf_qYBVM>=otb)Gl4>GPjA;CX@X9_73M zqDrwTw*hT}E|CWpf_UR*UKmfHVJOBq>WVK!XeyrP4Qg*IljjXqA?EX*H{dQy1;AwQ zq78q30Fjbuj_6PV66d2gM>%1T#(&6cj13aowD4{0vDwVZuvWQP_sA1dC-KD8*LY%T z8c$4}%@b2+$%7p}#HXK^vWARzgstJRsi_ek-f&(@bm7F5o(%@e{OY{ae>wIXfW@F| z|1o)fivF)1-$<|2e;=zA)yg1SiKA4DaFl8Sj#3?mqg2OC&uaLZ&7Ym~QMhtrGg}fU zeko8lSS1Dm-ow^kzem38F3CB7H9F$}mV*yCfAyQ2kHLAhhjCtQN8dV}pL)LUXQ}z) z>}RE#i=%P%*QZy4=6)Z|Js!=~(A;Cu+zagfL#a$CLCupq&y_s?hQ{S2L z+WWF>?@R9XQXWo@|G%|wmGW_0kla^}kBk@1G$eC>uR|N%-~C`5ei0nNBSW5L`J$Pg zYuxF(Gs^4A_-@bm-jMN4t4mp45wY-Q8)_;2nTMHe5}~ z+ah^^Bkoi*rCukHZd7gGELOhMo*Hm()+_VQt(~?*9lt^=a%C&Z3sDZFYUoKtd8sw9 z1$CH8H3V-v=Xly>iwl`HRaZW~?5LIkS&V&qTKQtDZ4;BqYdD>P%*WX+MSlZ0a|+Lf z2ZYpC7k7%yRA8u~fP%nHKQrv7O3iQ)mpSHdinu1mR$Y~N3ENZjKNkA#J%S^<70_2kA_5Ch0{`bhQKZWLCVBfTMA|X6$7h%FdK=Js3 zhev6v-^Oa!7v9gMJ*1tA{tZlxmtNx|Zo=(ibk9fCx6kCoSrV;K8JsYkYYWUhyFYgzt^ps>MOLep~$*(op59i`7rywJQ4P3Op)K z*cJ%A;bFs!J%@B7mTTP&`%HKl)8nh}M*^5TtiA`&0qZpgQ&r~bQf5{QJgn1vm=V9Y z4D?w=z(JYRvdk{Fs$#u3+J9$(Omf#10B!JTwgDG7wPUit0H_GJCupn75ytVqD}DSo z79gn=hgEMtz>inXn}0;S$dUkGgb5ZepMXjwEULvVx$*Mjv0!|zeu9e}Rfz`(m}%{a zcE@Tp#jorJZ!Bbs)NyX|lTmVL16sLd%|zXH4V&0*)sBbI4pzvyUIyP6*TIX^+=6)d ziJpcqYMSrVq}o3^Rffv`+qCTQ@_cW+d^|uxQ3%<;i0q1g8MhXleGyLBhcSWb^D4so zwZ%h4K<_Vrix#S`p!3hy>fDm)*@peW+`%Rl__Fzq+e(m!aY zM{_)h7l%vlO>56Gcl!H>OaGr~<(IqD-!NSI^U}&c-cC>YmH6gx>G!0S|Hgt8y-OT7 zT>3+4=^uBe{~s834;kP8PD^jN)BkR`^jD{~f3BS#ix5xZw&Bv}rKLaJo&J*H(r-*_ z&)>eI`YX%-(s1doO-sMko&K*-tq$pLVOshYclxJ>OaB+cjc;}C^mh%Hp6$1$Bbnr1 ziM|2%{KfqHeOmp;+vQO(Nqlp-@_xbc-ktB1cVAk0av~EpV0>8{AX7*-mzXFE@`HZ= zyl5Q)!5w((o)^!he8NP``o#y3@5JsZvAPyP*4_97P2xNGhV9N0v5OhIa4wn0Px!95 zighVMLR*ShI)$v|XQY@;mHAT^<2W>#f|QBJWsAsw7-jESfHUC(VJw#d7#`NaOGkP7 zob?vq^%3B2z58wKDN9~+`REMVxdyKAQl#FY)nq(cE+o0~Q)BX-$}>Rk;FLsMgq3iVr5XL6BhyIFl12ONh{dp%_b4^?|v4h>I6gv&Gp+%ez=C4}%$yfR<{U4zW414gsnYNmz7NJ3mKS=36L#p6+Yju( z5i;v#2;tb%%7y9-ix5*eWKxF8knADl1LctMIArusZl{Rm?Z&arTuu|1OyfV68}_+T zE(a6g-%znz8B7ost6jJ8%kzRJ8ipR+>rR876x$41BY zjl&^4M02H#q40OX2F5S8C!TvW%{~U_vA>Mk;AQmYg*b7G?XLDka^FhNYo}!lfK`=S zp*`7tbf5vy$bDRuw;RWN2{jlE7UKUD{D&hEy)-fRx9pT>(HS6$dF_1<+V;M3e6e8U z5JzAotp+%vk4N`r!rkMg-}gtVCeW5$4t4zr)e45y3Wik}Y#oEf`hy2C;>O;?Mn{(Q z7KSHy3uIq8=54c3@Z9kYd0HC|caPTdVkm_IyRBt|eR&E6qP{`@*R+Mk+dQ0#2b5>yERrE`<*$_97PMkCbzI%o-2>D=15k?HNsstH_HTW#Ihi zYsKWQqmP`bc`fjo_>Ovx*V@V_1nZ9XqHb^fm(mABw!s+{lpSuDOB2oCZOs7&{Ikd8 zJvc2+Tfd@>SvGve*MG$ZI3Z&L-Juq@Oi<)P;g9O`It;K4J()w%3qWf$dzqgk92KyX zRI~$VnD`wQ2dVKv#;(Ll1f~0bQs`cgME4U&&Oovvb4~;r<)1KUyz{BiIfg`R|AAMG zx3jo@n+z0+%sJDrawB@7bq&s=!Cni7Xr(}%@)PPuiNi#9@nQOiID>(0qw)fhm7|ljTTzc&|C33t zS)U}qYVNC!V>Y1Y2_KME=?_!X4*+_RR8ImaG6y%Nq`_$%vIK8~q!l(mShTjQ(2+}W z#V(vHw|mlK;VgRIRksqK^m8Hgqc@|heNH7FezjL7`)THB83#7pfi zK4jw$n~RjE8ojk(TLis7Qkl5U*>$Qv zZ!5tRxeB-3asP;G8!2xAN7Ilq|0w8khTQ>R_UA>;eGj?iB^!3qEfeVhr;K=wP1$Gc zEy>#nN1KVIP%=64mfn*fV%SZFSXTn-o|sOWE+w&~JPI0ujyvM0Bd*Ml;z~q6vRtaf z6c83Am`=wqkDTy*u6Y4@;eQ_FK)LNBC>Po?N{^fgkWr}Hql}W2S2-=vIek2Y56~b? z3|n%={D7!hl_tNE=iQ9qQt%-L1Xmsp0@Z<1KNqF_Jd-4mZTAc{93Q;;crWN~5Ea57 z((yPmS(RHqA1%p3?0CEBs zO<*6Z6o#`7!bb@TN%1piADlYdE?);41id4XhDDTbNI zmQ4kJJ2ZGI{Vx$|UDOOteE0%q%C1o+J+YV)mAX27>=lS(3aS0;Z( z`dU}|_jD&cC2r}PG=2U!`+X^R9pbqnH@xm`bpY@eC&~uEtIoF@UUz_#tDbLgqV43r zalRdRflp-sOE^i60IVM(o>wvq2dknCSbgAg`fhJ+0aj>P8hlhneSgQRHQU3UFd3yyjt5Kt?k3;t+!`Wn2nxy^H7O*X%iteRN_6Nyes{Hlt6Km zczK;Yvr+Nw8_*n*Ccq49+i*L1vJ`m#cd{T5M%K0Den||~e1q9iexUL7`Y#4=Im=sr z45lb_1glX${qg@>`B`=*fLf&oeK`?LI{{~6(YpNUUS}zQx713Yi13T(kYTJ`q%O3+ z-Kao=HRK6g5IBngP;r!_oLHq%?Zltu9tJU29!|IZh7#oQ^Taih&e`o5itlICXW;ur zD8-4uynTGq7{m_NCLp4l3?@t7n-RLHF^4r|WYwhG` zoWZ?$JNXsv>wM-@4KXyil5 z$SfI2Bz8d3N)II}Xa7wsHZ79(J*vn*4~?WdC>6PFXe4iZRFQ4T$n-PJL-8XADUpYx zqxi=*Y$7CK_YTe;IV0o3kCzc_;|Hh}*nkT?I%J$g55@sIoyU?1yPKc(JKS2RKS}u;N4UJ9MB?5e=6Wz8SwX1K)(za zNCo^|27HnV7(hVk>ytp)cCGPx5KBE;HCO?If~fzF?E1;+@`7w{wul8k3W}MyaiP26 zJ)BpRy=LD*{^2&>1+S$2l3Lf98w(^2^@>-hVHBzLJE%HW=~ef)E&C~iF~?ikd^S32(j|xZ(3c_LwLCu#4xKKJ zl^GA=MHuVwYd+D!8;Z5ob_ntEMw51&qeIAyvL_4~W2_^1>&y)@&lX0RDyr-WlPTae z<0iO|>B7?t%Mj7R+l!~|xX=hQ-ZZ=M!1&`AUgdBN96wv`#4m2PV<@f?G~~A-^t5Yx)bw(l?omQKXL(cV}L^={r=(9ntPO1 z{qCPQO0;20+`{Sg2hO7E=p&q%vA>Qo{^~Uj57u7-+Ds~9Ze~iHYmR;=d-?+r875j7 zwtR88T?-TcXXB>N@Chi2{#bDs`U@z76Xx(>WUaJ9YWObI<01tXV>ko z&iZ{J3bWnY15(r1X^qzcdp9XswmU9cao9RAKT7(;VGiXt9M|m{cSKJYukrmoUD)bFS zggT4?(4S`=`Xg`oTyZWTqTr`BzJmb=BU{0G+a@G>hmOCE|H2xcLJb^^La7-L5Iw^Y zDK!a}jhkVrH{6$mB}APesg+4;Rc6nVRRb7DGc2dmv>n1EiTeBm%Iau=`s2{2 zL)PARFs|Xuc-ud+7XDXaqB62fd`DV`1rah7t4B*Lc_QWkOcUqIgl>ISwfXxgh>>WS z&sgQeS^8(L^2QUNz@o{Ge>fN)*=KKnWx_nyOi&b^m5$qk(T+;_Mz|4g&vjHs(wE$4~ zagy(81M7oYIE0f;@OJts;-P2Jg=O6jrxZLP#t&UQ3*V?@P}YG{;JmV}>cp!?+iv{lomeoIPzdhbr7oVLCyy3drHS*o9KmX=U#8O@;OGePRHGYgTBaS zw$43cu@ZH|7vsr_#35@2OgVJ%NwkT_K>U%1DNHk%|KqV0@D0J`8%ZwkuSO!j9!}hp$2KkyT@W9v~FhW_~D({s$9O zfH?X+7XLp;r;AVZ&|B<+f7&~0)@hBuKvvy&^Y)6ocN1%6CKMY1_%H((;M=LZI{Kih zyjtwBE=T2fvIn17SHc)Qaha>WWc~tIeso&pw@yK3e08xahth_9CqzZ8ERy+m!LrY( zKbfCZzV~{m^fdy3GqbCC83@r}@l@v}0gt&BZpBvg6LblK${%YZE$SkC@Z`4P!uF%@LN}#+pgC?PR@iP_PH%Uu2 zp%M_EFmfUn;m;P=p^C%WIamX&u$TVZcCte}vZ#O6vNbH|{c!5oG^alHD_rA~in>hD$H|k1S$9 z-pdiQaieC(c$J2D9GK79TgNX+H=3~eWlxUV6VX8O- z-0bx}Y{R?oISHS|!xgLGbGx+&rK4CIJ_{-VpM^;8hR>8E=YQHdQ{`7=-x?r%i!$b z={_xJ6MY}5cuZJtdm|QY&ti@mZw*8ngLp|4KuSuD^=5}@9JF3Wy%mk{0{1SGJ)J*D zX2Bdh3rWtLz-%=-z1DAEKRg&3JQMK^Z^aGC%21w^2oj@6lG~*HI3Po*$Hppehj*XV zvJ3Uk!o-9a9{wdt4$7q)^cxT1qtnPndj26R2~Zl2U5urQujIXGBi$t>=2DhX%fbzX zQsQ_k+n={jEh2aJ0v6t9#UleK#JWGs18|?9#vLEfS)Wsh_0hA32NO>r4E{!~DWD*# zGu~up&IfH(>Ah%FVi72(-6>E!H~wFEC=LIIU2nfAcB=KZ)_5|C3w=zN1k3$+J^&!C zUaZ1y=lk<`cdQGYh82t?QxYv)@22Qu)CfX#WDMMr2a>Cj+K{ld9cUoeTBnum(+sqvnIf~ zl-70^H$gT*wt~%d)6el<9c>C?{jhUyR;$uf_rRjOI8hwa%VOHaJ=O3Qv;GOBw)sWW z;PTrS*)m$H!d%@_mJQTLtnUNVQ@Ol~AkF`(}4*Pv)1srZxSR zOTi~=Mv2|plfLZY9@M+)UWT~knQy+z%Q`q#`S8vLM@1 zDkItS@#_Q65|3ffX%3NC3To$^FVE0@QSsGbU6eqzSnAwv3|zOo0=V|e1wgXYX=T61 zv)|w~5ZU#xMwNmc*!jk%0IxRV3WP_DKY&QP>Ag}fQ7hxd@05QHt?dyGltW8kGx9j~ zE!KJc03Y0NhE2ecIAY)lH4jSqDwp_uPuS}{EW%4$fz7Szo09%+>+SofJZAq*gMwgj zCz1A0MM-;XU#_QxA|kHlf^S4AB`yGX9sE@JTTvnoCdnRkB5~q;nFRe0ZsuwaRGQxZ z;s!sKCcY?R3H%`|pF_smnzi~;W|Zs6`l2InvIkje+vAdx9cC}(Qu8^9fG+)uqhEBE z(F4fC<*oJAy>Lw0pZFOvxZ!W>2Ug(T?*#FC7BZ))Np(KNj99R2T4?= z}`7j7n%(~O_V<{O-B-{1tQUud>4ruY!ptpuzv|7 z;8Yko6hV)))jvT3^g4n^61}YJUq|!jBDLE;eW~=-9{TupbnfO;6iLPqI3yY8@iCXe zs0b*ibjA%AE5fO*-i$!JlUX&Ug?G3*%cS%>HDd+wE`!o9WLS#Qe_MX4t|YMOi!lHer|21)`zbnI ziYIvA@}=N!*9^ zLfurwn+L2dKjlo%MVEQ0**9f9u1n3T%`+~?<{WM_8%wCDJIqp-n!z9rn`UDt;vy6H z1VIXC!Mz=B?#_0uHsg7L>bkvEb?;Y;g+(P*;;*Up54qoL7E1Yt?l%MXu|gE0mX_f4w3Zp#0(k&|dQS;utU-jxLGgTuB`C%BfBM5wGJ=O-Wh=awC zP~%hl2N|OV-uu;c z3qg)?H(@C*&yy2b%2)RNd7ORf{=C+s+@Dujwsz(A&T!igw;tfK1#6Xzb7$p;_<*O)4cvDfz0=pgOX?CN)55I>}-0 zbd-9^lqT}#spe4qqjd9$O%Jt-a^X8sLS8b`w~gZm?3Jtj53RicV6PIZV2v{mTS39c z+3ZkqVGe!-E+qF~H^}|hUN2Bn5(~9Rx4zjxY$tg@p9zby__B$`{n4@T${pUJRm7M< zQja?GJoG!d7E4Nc6KTioVsb9)xIzeLjr^v%mP*LGu3&&vS*A3vy!HxfNL*(%1^Lyr zSI#wA%xB+`#p|q)t{vu0g-jwX0SlzR ztk2-DpZ*E_wNBC_<6y3~`UU7Cu$6wyB~bir$3}Xy+(>t=hirZ!`ZYl>&B*}}^+iS2 zjh!F^@J*6fg(x*2fmFnv^{}4VLtNUdmg-qXJlp8~G~6DM(OTmZqp3t8AwbKa6zWPL z*l;-2DTz3fnk^h3OnZ(`rvyJL_sqC(t-QZ-w%EOFtiF*!`ey!C*U4K!;Y7U%8DOm; zhp}4hm{GPx=2!-c2Q2${%&zNFSA`;tROujrOv|y_K3jCnu&>I*vP9BzIRV$hygY)w zK=&9x`DP2Ji+}QVUZ{Lv7tVm|(V7}qp^sUfk2h>*PTB;QOSI&ffIYa1X*jTp@|e|z zO!(KZ!~vL_L0qe-s-{2OG@_bVd@sesFggd!ky29YU0fJuCdAwVl_m=&Z9i7=*_
!JcM$cNYh@(R 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 X^<~XcW=<e8SX3t5 z1adu$M!~mj@l|boVX+~A$|N8Oh!DUBTB`xA&NV90zXb$gzTe*G%rlcPp?>RI>tnHV z&pyw+_t|HkeIEDDgkRNZ*_x&~0g;HNHQ-7AeEhfjKL?OJVAz@g+6%|M_JamT>1#ij zH2vDy-kGy*xMtRs*Lf?hy#D$dD!o@-?VUB}dhfN@d;J$q^j>$v)T__v-@k9Jsyg@N zmeTSCe;F2qYx|rvY#Q*(fAILpSMl@FldtFJBPaispHG~8HJ&d8t{X<_z>HcW=7-EJ)g|dmLsZ+kt z88c-@<`KMV-$lO7o$~q4xMte5Q)g=$i^2mLQx>W>;h&G%oi%$_1>#tCkRj*WlP=%Y zGj2de&Ig%tz7IR)8$IoaQ1yGq$v#D~-L~h@@nVNaq5H}%rq;jw!wuN8H(X=&f^Rhw2 zw(!*9S=t(^+YqmYF9l)(+%_e&PB`%|?u?$1VJeYN(S2qu2-}t@Ypu0(nbP+Q8 zwfe0kch1DHu*>gvs9NF#8Up2mW1OmvQqfqN-!vgu`w$9D2-YpfLvPT0n&uuBpejY# zH@Y>*Aw2k-Wdwb$5;N?WW7|&DO|=rehE>-JO=p4?z9I#0NWnuXcuNZ2>d8u~udRQU z=C=Z2JYu3}rc`_P!34$Hch?72p&u1~k!wWAC|tN4Iox-Ll1mf)kcYXNQZ;wY&+}3x zmYn{l(>kR?|4Jc)60?Eps4OWFfl;Wfc*G{ZyS{F`4uQJsH-}ICp+l<c&k2=T*_6je8Y6eSl zy#|!cYXk>hfk`DYcsE6h^U>Xta=qc~M@f%m`Y({q1tMib3^CDF8tgxkqGU2vRMoT# zJ)k#$L@nY`dAzB4+BlCk-NAWKH!A9fOtPFLN$iYxP;VYsDZsFajej2vJ!=vYg1v48 zrQoMP@-uk(&q0f11+@4P8mWr|k-_Cj44wH%oT2Nf1W6#yPz6ODg`o>m^CU7APY*6fTY=bRLbDsQpXgzb2XgbGzUl z+2S2~NHLYFLS9Ly&yGHf&j`~Q3;Gfu2czJ>^e3Puzf5;pI=^0^g#t! zB}wN*79n|t7z2v}Z9u?7fl&wyfmT~^2MG5?2A{!&qpF>^Jgx~-DO0i}E~BU}BoS5Z z;?z6|fCcOYRZ(%-%S+N z1%I)go|>8|fkDb7IlKV5QaD6nB8#g3M6di7v^rt~cZeb0kw)g^XNgiwy7Pv3W;qSv zs&m&nj9`hQHrohZ?x+sU*-K50GRy;>Sr;2nA+He$8RwE0J8Sg5#$lCxB7;vX#QYAs ze!wVdoCW+i#`96@*RI*XzlICB1;}Z0fqcq{Xo(EI4I!%0XN=equK7NYM7pD+ko<-4 z$4|r9*N2dST!N&3iT1wo6u*1bW?eKIjp3Y9;cT1$r=s^*cfHfKUKiW#nICD|nJF_$ zQuzXu-=T}9Vrq=*Skf4Pk(&S~q}TXb=fL%TVXYt|Dt6d+9il0V%G=i*iTMOHw_qyK z-KzpGAfuHHD=b5Os~Vvv^c(h_bkg8~e3b=bc2QU*pnV3U1|KF3FDO-;HXnB|%F62l{Vv zcVK)w_BA;w`?4PuKK>-?qxBGc)P+KE^FRdYXgHAFWa+Nt9*Na=e!BXahNjln6qB6n z)>!#}{*1E5>4Br8g%@@zUn(}~RR_ocntdXsBrkHo@$l#7$`NK|8KP-D

~09ywg- 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 JJt3C^?RZFZ@ORQA`Yj`H(DZ)cn z$jLq5Dljl7<|pG622%DXi%F5xaY)%DaDA_&Z~r{OzU|)djUy28ZA3I#(B1@OBp}bE zgp2}YqZJ~V4@Gtk8cJVg)&XlY6TqBjrUEeI8>|3p#szZx1y+tktKRhA#qJ?1@aTut z1HJ6a;Gc>-Sr}=8&{VxEc(lmZ5Fv|+9zCbp-U=*ITCUd8fIM7rpn?&q`LV+DIT+AK zIK!nQ4e2D+9#*4&!rclxd+%T=@boQ4T3Q7;LPSPja9(7D2WloVdiy+?(f_NyhJ)n_ z6hYeLKRG^>MofY>4v)+ECl6ypS+fg4a-59p*<}t4jF-gVctHj(z#uxGqlH+7lA`AL zM}kx%7`)xefnz{mR%h>pJhIBGuj7dKy4DFaG#nG02vKq3%{lQslREoa&*w=PIMd4K z1iGP|oSAleeswNY7RwMEF@UvSIw8T@MSEGj!2=3xE?W?catu<`%T%0{CezLtiWC z+|JM}F>cPxjatdGKc@$Kfx4P0b2P`XHjTcwMLkS?^dkS;`5JPXr|#0CFi#QGqQ`@o2?wc`MI z@tH_8aC8;-yH-q!egR5VS&*DRz%_Ar2nCDzo^%Y46%~!Mfc_#{A{e0FUDEL*Z%TFK6n`93!HXThG8-;w!;uCDwIuC`Ty$(Lv<(j z42N8stgW#>#3En(c#&ni4gKku(kvpB0jNBr$`lt{}&`%>U%Vl$x>rJ0>kaQ|$ z5|cbj#r;eE5z(XBdaEzIj-tC4yVN1KKkQ{ba<+sB!LMp5vHMCpDY3Wq4uMP|#!|y% zKr0$|!{kg+rHCmt6#}{n0p0j)kOF#x5YX=)-LHd0{f8)w_hApUYR&E!BT;h%Fknr<}2^w`fq^X5EzGo@}rZ0FQm zk1Jk4Xgt3e!PinU7XeoclFmi&H;@%yj46N6{Ei(n5w-j8+=2K>=zpWmsQ-bM&XPm_f298nXpr6-jb+2BKxqtP0KwSoA05Qa zVrw3u*aX=E-8Zr)6J4ilR&yY9V6s}8c_Afk99IKZdRF9m-}x%5VenT7iqzkrxFyX4lD}>i`Wq`G87wt7FxXMCYXsd= zbKCs+n%ftXJhsDa-NH}@${*DWE&Md0ucZUK{v}e#yR1O}B3q;h0lQsBOR&T~)3NFoaR^zfLm=+dx&(Q8ZJVRUBiCgqKRBqcsqW#?H zJ0tu^0AILg0kP8i^qs*ETL;P!+Kc$vNqfEO6D0U;5Fynv8ShC~q3&5%xn9A}95 zIxY_O|4-z}BhqoaSD(lm7x8UC?W)6<{Q@T+BX+tcT=yxmC}0*jh*QKY3J~IEi1@gKv{G{gu(j)L15g0H6kIFz*1m0}~z9s{!Mc@r0Fy6C82F?_LsuB2< z47^zcUMd1l_dFy6|4jsrF#=c0z;z-p9f9I1O#?mpFALWJUakK};p5`>H-#a_$BlUr z@%_8P0KXevVc*}v(~h!l6*+A=FU__CD>}BGd`1Xo-ywp3ng~vl!7D`Y_Y=X#kOZ+; zir}S*;4T?_j|iTZ2!?AKV+Rr3a}7uz?`uVr5<~&Mu}n*NiwL_=hJ|FUQrQ47LV zaXoqW6sDf??|0dlAg|CWQqr=LUh zXP8${6Ye4L9R0zlB@dfLu*J7sM{8-t%6=&qiPWQ z7~Zed;a{x~nZBmBRh(zTpZt@tqZ1h^jK<^V(ZUY?8k`6=pK5()>>S8{Mhto1hy+*Y zuT;A{I0xFk*9V>-%YsWp;3bxg-rykBe=Mr1?`>N{mY3GHW-)(ajp^vtyC$hI8+OnlyUF3$;ghPttU(^#n^1cGe z(f+sYSH%TMzcNq)40-h*h&oHW#Qp%EkzhPSX~xxn7y@~b-MH^$VLP^c<(8l|-1fCq zn8`Q42>{pS#h&>;vdZD?x4wZm+9Fueplo&GF0nRujxF|MknEI5&mXY=ZcShPEo$%+ zcm0j-;@=b=M=Jjeq}w*1sT>)^FTAAnUqzH~Q8cT0AmVDhs$D z1<1;c>z6~B%;B|xIfx9 zYQ0k+rxl^-V^S$jpq-{-+(vPy>s?Ol7O%sVipV#deIv5RQNmtrSYrf;+k!OkS@Fa| zW#g)~yK-VT%3^+qy`r*>S0#$UsqD8ShaY@a`*^+pYItiR>Bny*+voohk{%n_HWM{R zz>1M{5|ZM8OKc73jO~*_IS4|^MYn)Seaz##!r4>#{yyG06(m@D-MU|Y1(E}vxA7du z^BXKXWn7VF8;6JQm*dxCyx)Xh^C9dhd~d^Z08b2091p`sTONK-#B&v%>3F_@=i7Mh z$MZKlCygil$~4=jc;_?oDvV=1uCJxp?!?oHCks79u@0LUgON|aPByT-0At{HVAbBo zxdU<$#sG%G0{n=f@Io4I)w~&>x8Sj*rOE$kcuBlj0ulcI*MI%xVe{w-)7Xxc3;jcb z_G3T6lm;iGFYC=1zZe*YT+MFrvR3@?2m$XxSpRp%W(^~r|1L#H>`F(hb4QL#w>?*(E+z4cb*Jn6j`$2%s0ST;dZz5S-a2v4A0B zFdw-Tb(t*y`N51Pnsb@WElLr0$nrgT53H%eB=rF#@3sJHZhUl}lado@_h1_|?~ zK4C>VT*2jPRbCo-l8&_~sENY+D?;yot}5ldbCUsrsgU1)Fu%Fdze4nBSL}OOTae%# zCfJDnqWO)Sh1VU{0z?^byDN}M)|pY51WHjOz72INyq>cTeHao z83=gZ{O*S@v2sOpt~J3%blx6i_JqKf`T}$_^hpw53(P16zUJV25WeV4@kJ2!130sO z4#Jio$`?VHpihA>T6T^5YjF>@s()aps;Yice=Ame0v?Iw_ON4`C!AZU!VB5Aa8HHy z*c|rG-jf^#O~rVZXH-K#gdhhaAI1c>P5QLQY=D{KqkT{Go#8(1A&wz<(Ay7SyM}!a zB9UhaNfJN~%~+=cSV~@$;M1F!k57MyF@4$)pH}I_lY=MU8*boc1k|J3MquRvh7^d9 z;|$UFArP0Ni+aj6Nu?eKK17y)CfXhm?J#~~?<3L-{Ry^{aT&Y6o>%nSDC@B_DGPAFjNX_?)ac* zD=M-m_A7*{(oeENe?lPGwKKyOfx%7}C=z{)yJ6{)rMj@e0-LK;?IB(fq-sqdGBHY$ z_pf;LJ$yzFK(yPL> z*diKmg3EFJxFZX3E#XLx^#{D7|TP`ss1~fP_yS!S*iG2MQk^x}X!SGvv zXEL55JjDoRsd)Wtn=lBQ?NzmPHH>P~O`uy~-Ms)uMp%0zAbZ2T$fPH|!>0uVNonrI zJ=l7gtS;{D75Kt2MqW9wNXJ>dfki26)*~`zu+VUP1y80ua8B@~-G5u~q(fPA3LvoA zVAPEh+pDoM>^kT{Nx{}kU-XzAlSZ{Nt#bxuyYaNkB+hS+M=?*$2)ms#O83-5@->`Q z`gy6~7$YEL0iH#87NcjnQ5b&MGW@VDJJ&>3tYnp(kk9bD{M%osGK%kuQ~=dN>18Or z45hD@rLUHyuNI}79Zr6fLw=M$_eR_krT+~E>;kWFLi);VIw8UN^#gDCVe%d6l8TWP zhr11ZO3z0O!%sE*7-`=E8*hbicnFwxp@@gHqX0)P2(4b&M7Y=f7{?nYu_4>vfB9E` zfWA>b#H-y>(3=IPXu`Z&MS(2&pVzZwC(#+6i!k9O+Z5pU8B*;}m8#NtrX;^im82>3 zIR!PPN>zz9yw7gY!c<9`)_qPvUr&_^y!i|TjZ2lJ>G97g=pVCEAiR-L1R;;sw_TJL4Dv}gUOqE z^qEq1rb<=mK2wrkrApEi`J95d^JGxf zrTXX0R4uAKQ<8(Jk_b8EOsRgEDiuVhGmIlGRg$Le&q3Y7RH-T#ov9#qsw6@-I#a4~ zsZv!gK2wqt*QLOA6X&Hfr8GL;ab&QR9z8L7}t;rLAL+LJPs5c! zL_(57!Y`j~!b&W$W;@R|m5}F<@QuggA z*$xTSvrSl8fK=npHkFX@knqE4XNyc;vH9xRrV?@<5i)A$C8RwhoO8Ab zD~plp%V(Rai83D&W}I!pN;gvdvGOdtpeZ7Y+jO=GE4?Ug-PxuR@*fi3akdF7YmiDk z+f+gdM8f>DO<2i`TR*HgTVx)V$lQIl2`d+%xTnrGRa3Vt?w+$vSh)zr%{kjtLM}u? z*V!hlT#Qs1XPZh$he-H;JZISpl`D{H)7hpHG9nU&&pIK+L?ry?StoSLgr#SlkisHL z9C_9WDK8>nPx)D*w22}k5=PEC;bfU`{aGiZ;D{2xbJhtdJ0fAl857d4Ll}F#b~xld zff)~GB_Rh&v1$xbCyif18Uoyq1&0YBg(4}{2m!(r20z7my;bCqKtmcV!m8{UrNISG z!(X^h9qZ=)q9Gn#&Fvi$pH;wHxAfUL6)tSIKN)!br|HYCfn!Y7ST!74HS5+-x4ib? z+SU_CqQ}O@TkmWoT;Jodch;>_8zKR~)xhq6@Ctk16RH~Pf%jTq;n>q#GAq8^s-EbM z9?Q{NL$k->)`-G1XZcv>a60a>N4D&G@n;W<2w8Ww9>*OOq1odZtc5}$5uAY)zq>o8 zhGtLjToUz!%Fm@}Yiz9)Cda_a^Wc@T8rY(z`Bca9d$9QfE2s;&n&{=9BL2zex*`m~ z*eL)rbU5Q%NB~nRP8<%a<75!eoiKyO%OHgvXT+KygM?+#2s&2={m_g>E3L3`C%pNr z{)EK2yqKdu)?MW}CZ6KBwqw;{u#_a z3@?)c!fAsxR;l1W2my@DK%(-b6lorg~hvJ+A$pw3H|?^eLRTas%z#Fm6}t zAgDXfoq}@{VB3Dv6JDNCUAn7&7%t)>v#|9}2aQd@DvJ!l%9O45YX};j2!hjytrw^2 zsN)hrR1B2ZYX%dr}Lq!FyLFiYkp`s3x5xN(9E)sD?HETw#&j3|<7*t%;{)dMQ;Y^pJ< zlTcYf0&)RZnF>HnY3i0hVQfB>?9G@X^=VdZV_6?)~kA?tQDVtJ2>+&baa%ALJlmdB9qm?2lOOon^{S1u8!kmWMu z-_4MbC>x|QjNgjqlvleK%DhPp{zL_cU+U^6Ioy>JLVB1dASOMSX-E*$Q$k1)#VH{q ziHlM~NE5j!A?E^;o)SW`_(!Rw_Y>_QT^zMSNEcYs^kc}7Npt70$0 zeg)d_;qtVFz8t+g*A>O-^Y;z)+N+$g8{Yx@y!UhYb25E34$L>RP_VLzz3pE6Y-jA8 z6d7S57zYJlyUPr$*wRgLk1xK^Qs{r4KD& z7x2>_6hksCj<=`r4StAK>mNn%ifaZt7z0O_iLg$5)U^i>hGSlIovMJYz{fL}60!Pzuw{bC(w2L)q!hKr9 z0)*fIX0=4DpW_CFuvlR?AgBY|$~vHMzKX)z8s6k9po>v;1Ikwc)f@O4j5tuzHwj;b zs3-}q$h`t@q(RUv&$khJ zb=2WJc)ZITv}PhezLx}SPm5gLcrz>z>`?eCLe6Yv`8$p{>=pWYofWrq{x zR?6(kv{n%K3cQ7y596;{Q^FE8WiM#W#J;jQ=m!K%WGA6)O{Bboh?ZqfWWd@w1n4^P z!{Cx(kQ|C2%m*%D2vO<9*}B9UI}lre9HC|(-aMgZZz3hrpl$&qDH+x;5&M}3!l4?I z8C~?1)=UaQl|rmR^L_F|*6)7CvcneY9eT=PBGUY2jZ=iAFBnC}z3!PWvb*cz{Y97o^y z^KmzkJ>46=K2gvoYA_P7?**@6U2*$7n`E61C4Q3qDMak((VXae4*Q4t!x1z?Zv%nA zQ8^OFfqh!TD+uz6^98-(;5vS2K^i@IW_`K1QlcC#EFuUe;R*<@l&C7^WfSE^W@Nd$ zE4-Z@ueX6H55%mcG>c6zdL}1+c|`?FViD6sM$?dyxX%I?2fSy;{*Z=uSVwCX!BI51;?ZSxn&XZWCm*c)s~<#pex>cVu+82{xi% zX?|PrIcB06J}UT|jIm%oGtSon1=?auUS*(lKYJqn z-U0C^Gk)1;#K+F@iC~eqkz6g%_h25v7R#>QzE&rWCwA>r+tf)oBIj_gU9}%pw*4t< z=`e91g+3yFy|Z8Ga=hgWI{;=_bs}nvGgrZ#g70MdAHW4I1uAYbJd$Z#M|>ZyBmSuC zeYG#*^bd2r(N;bQjJ`MB{*lfLQ=RbPgyoQS2cD0*=3U>5~XQWiIUxK@_X#% z534oe^rEo#8oCl133SaNpfFIxjPPt64dp9+q6qgIR9`u7f0Z zHX2&3-IP<;u97jLuqhF(tiY>{Bl?|2#?@L`zE5l66ywu^5&WoHu!BFLAm|c5X?hvt z`0^EArR;zaQ-&1#aOb2_cF+hMjGx3Nj__77^L!XsHHpK;pX2UpbJl~3W*SuF4lSSP z)wZ)1`n0o{0tZhmN%>01?;xQDHp3fUSp?Z7!dLxGWz)=Y%I4O(6PbdhGxI_2 zZvRMSb5w0OB5sv|m$E(DYsXe7Z5q0)3b#TD{KU??l=*$JY1^xJh&jC&*xT>bbha?b z$4!)3=ELyH#iD}K@}JJE&kC+`#{C(mr;Y7(KJBb`1g4Em$KL%Ztxtnmx1ir`mrNTQ znl?6Y$56(O;aj5;NyKf9>0*~MY9j)5#0DCAObBy1~RVb64KF%RCjtAq$av^8oLv& zEZjk&tre(B3irSf)LWEB1r{#lP;l|VQ3~FBN1Iy5v3>Jp9NX>%#vrccuT-l8thZ3B zYZf8K3K=8tI70afr*M`RT;Yr_%kqWYi;V!dlQUfRVyt@6jR0Ynfe70v_?6gCRiv+$ z8rP|k)lMPUytS19SgpZdk5U$87pb}0e}|u0>3t`J_lc+=Kqo(TzLpJ zLQuc3N*aQ^eRF2Sc%`NHBd(?6qE}(WTZVtaioj0I2E$0u7|06RR zAg{HyGSDiofrmPSTiCBQ|MA+Q)J%#~}QQ6ya<~iu#HLl+lCZ=cNy5N8+2ctqw0+>AiiNToa4lQ!#a?68t_BLCt#_QSv`s?A(pZ+S zv>mHouY#l22>fJ!2qV@EP!iT|5MrvOk42CeRrs?3O#(>s0K7d2KsEuuo3$1R5Jw=F|<-h6W*$|7GR#!rItit%G?OMPn+drNLh#m><07WvRM zQs+Z~Q&FIRLesDVLRxqlDa;e4jiXfo;rKafsb1pH)w~sE3Fr!L$4q>q%klkPj37&i zd(7A@5fH8|jz(viYG@+gxm;WvE+Fi|L@kkqW9g$*b(zc2#J(~SoXm|aJD3teI)5b< zB=30`U`4q`%M#ygS#@|7#?*~TTpl-LOI!+0lp9?DMsBb9Cgy@;ni@gZg>`Kc(Xvb4gZOz zVtXJ|*}IX4P-Um{l;Z-bvc@V`iGUzg_WQuGkH?6GGaePMLw(`t&{S2S$C@g)SA$J8 z<0(Wi6wmfDp~1G7Nd*>aFZEa4SCLR%XBn!iPy4;Cn5)&2 zGAN_1P)2tfkxk7?GL)o#MSYOz41JIp{!jElrjMP&E!&V=yqXYHq#|YLdt%lA$LoK9 zR1bQAO&UhiGzAtwE1vVVovYjFB#`wx5dJ7}Fl}+u1Qi%%%MQpCK z0PuyCIH+*;Js}|<3ni{<1;(h%oC;i!REa@_mO&Ah^{c9ZVfNZ{Q={M1&kX6&+GHW0 zQJOEJ;)1gdsJnPDj(B`RL+hn{3r1_Gl#Ir^MTPkp3xm!Aq4Y{XP!sAIo{}^!`~e5+ z#xSj+#6+=tMI}ZxbW;%?T2HJ%tHH|a7t>+bRv?r03pEq9_^4np=tk%;0x$h_7^6SG zZESL-44Rll4gE#>0SWzu%LEqvg~e6e{YiiQg@su3mrG6k-Q>hD8=A*n%u!GUi5 zHJI0^!Cc49#C3IbranYPWCIeUL7m~Rq0X>mO*gyN+h3jGQE?T_jrt7ZES;FlhU$z= z&FpY}GXBc+qW7uJTxO~>Vr4~)3@*0dmhSVC8ViGa&Jh|5vw+6(wUinQf&DZVBcMUl z0>A(}r{=TN6RBSi??S(j$Q__xteC(a{sQ`iu8(F5-g7Fec zAOI8~!bo7wtft0s10|yl#5H9OQ>e?EZ)T6loNFemvH|n9-!fx2*Mdpq5%> zy+0VSB~S>LFQ&+KE{l621t9P1mf{{F$-yVHbg#u7?mTblYw}Y_`HHV}-!=;Pil>!q zMs#cT802Ee6w<-YMA>5`MwC4y86hd)ljs2ZC_j-n3ELoH@1%l}?;zbl0R!`~^xb2m zU%<9mVS+i4{>^<}RuNzDU(0=PrftP4;hzL26+#-&OsN!9Y>`TDMp*)CkxJW;!X)E_ zgnuLH*d{O`Yn_mt^ByxxFr?DNH%lBO;m6F_EYXngue4w|k*|>OFAh&BlN z;*`J*k}`8s0u7Rm=P}y>#IfF>>36I^3r)l1RBM`?20P4=zZ>g^?ZRr?UmWeX{{5!@ z5tg}brEnFD;sDnwZ|tQpraToYzt!D%?>zrafqNI)>Mw`j5s#FV&#Au<0^|I6QQKjoxICn0MqrDm1_@it*_juf5`XM1|~&+j|vJrILwoydY4xqcwhogS*X z4L7O|F5W12SqP`Q=0)TQq~+5q*^{1S^)1S=oyZR-@WexRR&qxF6eKG|vK0Mo_;}=fiiM?t9e$^%g4ruZOwr@}5j)xA zCWKu+)LJ`g#6n(u(#+k`=WmNV2IkIAKadi_Uf+=t!fv0Dvaam+@{|yE{0~KLX2+YY zV9%f55BVm9U0;zh4g3D@DIx6qBPk*5eTm0`HDLE2!Kz=f`^_4N{q)E8>HZ?vlK zuD~J3J&s`1POp%97!%o+_-++@m%vToqIlxCCtL%c8QdMbF`{A%4(=lugN<2Oi^Z|| zr!bYmip#UaoJu2w12y>3kY(4yPoyeW4PSpsY!*_tHb4?TaWr}i2ZxuXL8bLTE{E4Z zu=S(5XwQ&3b<*x|u5C(Z@F+ZMTI;Y&sxGUeE^Chu$Mn}9s#CS9+zK3IpSvx967<#z zy+b|FvlU0B!?(Ocb?s5Rj=-a(>!cbyvZ~J2S*Lcz>P{R)C8Ef>Q|5=ztOLkucJ5Bp zQCU_Za#X|9kBd!0+-qbHPiN&CkuMs8(53;PHW@d2zUoA=ap9jo(9iqv_sT1Bb>;*7X2W;9thkhpXz{FQR)w3K@w zhQiPpX~?6aE_&n~VnUmqOAPz-w(N-0aRrXFbiz;#5GFOfLv|y3G1KV8uI{ulC)`fp z#e%{OdVzobhuHE13zwL2uoo&Z={T*^4dg9h--Lxu*f)QI=1Ti!c{Vr=U3CW8H%ADF z6ZTC7)Nj}~|BOJNM*C*XVEZNPZ~KSV?1$Pg_l47nV&* zy0C0grd30OEt`x?+$ZNx7?&2ohFAl`mGBq&->@IDF4BI;@&?!s8I&C81|b;sCez;s zjy6JgxA=pwMTS4fABV$^^&|rt-&V9=u!!}H&P#hluB1C2QM|ich0yA)->F)_5kOMhq-~zOPAJZO3Il3UZF5IUsIw@yEf0q6X zy=v7-F7+r7VC5r2x;j-V9yvStI z_$Kqz+sv%^tqC|~W3R5Wf+gRx8sC6Ci=VI(oQM_~?gEV5GZNp@!Pqdq6`^iL{cLTr zJD|!+R{|LuF&adJkV$|9>ZWiCS(PWvKwwR1YwA4s!(cxQ=cM2kV%z2~3Tz>z*!*7# zthm$WzkvN!;MH$J8GB=EaUQl_o`WrC%(eiGWipQNRdb9A!F}!crWp z8niaNlOk7P%sP+)khj>(-YD(`YwKVRgzap0a$)ahMr>IZVGe9YfhT5G6D)n1toF7L6n9}W z0^00@>}|(PC{WRenR%ciU_r~f%KVlkF0bilm0Dp! zWr@O2U2W;#M2W&Gb=6=9O8C9qXp>Q5F6xzNBP@LV?Ycv(B^nk!w%a7mL`#H)uUkM; zS@^yqAhOqzX-J=sqdq2mCLnnanB}sTh;g z$9jW2-%SZL=<{$&ph2KJ1#m!9*Bcc2tQBaX(80Dd2xA`oEqGOVN~23$5N4<6V&4yh zc0B?sNIc?EHg(3u+Dkw%Y(QxccagDb?@+br&Yh;KHDnryvd}5UK!}~5 z3#|fDF!saMXR3EcPvhVRi5^aU?NA8(I!YEn_sk_~oU{hWZhpKDPZMtL1A~n@HK8Bsn@QJ6{jdOZ9!vib1FiaDvOVIwacote%uA>ym%s<%s~f+0 zIu7-*S}8xMMq|YE$vP-onNUTJ;KIvsK=ap#X1LBn2)#Z7m#K|W14lDGp;@DG@VFD= znX+k*=!8%??1f!-Yz+Dpe&l4T&*4h9H*Ke{VNYZsvbBS;L4;N}aXvbR1Nyj;_#g zhdWHG*itbztv~JJ0#&H3ale&dBN9960D?WJYO_eNa^HrbZuHZCW`S$Mh7LQozZwl5 z8&=ceyRn@EuHwN{IZH3XNiTs@=}X}kUzMX1+1#}f{i~A3jsFSTw}E3zh}f9o0AVHK z7{rL5gp&&PprCkM1B>G|EW73n`s*+68*(7F-h6-y_bT+`?7bY7MvH7*=U3-~Zd{c= z1!u0m7yOIcU!%{)V%@J37ohH7xhr-;6Q_JTd)VZ=4>`X`vlN5K@(@Q$&;!QRG$6f*lY9zsMhiO)@96js~hx$Y(g zMEi7cU!Rud(+_*}>lb*mSq^$rV9bOt&0?c2bZ+?_z~qc?6^^rIUVtHxLA|XS))#g7 zuM(7y;VB)t{PGHY)HZBD1gD@m#U8}%yRbc;X25XV{z>FVq{>aic}#f`gr;-1pk z6RH=Md#e{#T{-?Bj`PXKG3MIrYVX2U-4QG+aRfcsLhM~Q8@sa0i+u|tGE}cn$~!z- z)up= zH2sv)NKsHNot3`?#t?B?Mi*>Fp3-mRFNKQ)BsAP;4v95(KcZdywTrQ;P@Z2}o@_%T z7|GN-(SozDKB~?Z$m;9U9KsOdYSX5nVkF=sr)3{vd=A6T1c~5PU`{x&Uk&b!SGb`1 z0o7eSAWN8jAT#K0M}?kK+PNebJMZ!1sL*O1=nMByHH7{BcyVHz%-7j%%Q(+^hhqP1 z1{b}I(B&W2p9jm7UDdn}@RKoN71_uPl=8g{Wk%S}=5{7F)eaaxNu(3gM7w@mKPE8# zTcEO{RLx(KXJGs`NMxl;^OqhM2*<@}z&FpE0Zv?PTq?_K$MGfjhe-;1uCg0GffNoR z0xn2Lg8p2u6AN8Obp^&m`<~LO2^g5;{|CL(kGR~S?>c)O?$DhE|49zGgyn$k$DT2e znt6T?8jE&=zYSyCqaK{g(yBDh2G*%&x>fy7#K(B84u5^)$FKrKu@d(jaN{Z6wPf@< z12+|jp1@75#LWjVpedVf9EOWy!K8;@y$x|-H0?UN6#!fw=Q`$Ub?r&Z48Chmo9QV1 z=Mt#hwYcs&aPI=FAlCY?TvI;Jf4M$;j&U^h!m3NP*##JIHF&1tDJsd;Rg5_A!f1j( z**8Y{-$OCM*W%iD9co{j!#_#Y+g>6up+8ukVsw+!73+Gh>n~mJ1b5l(?`dBvz1uQm zs>!9yaiiUxZwwvkLfBODg@=E?@#6_C2VbTC4tfMf)QUZcChy~~SDRCqQ?0iKr`I|# zR|f7`VDnD}KU`A=gy`4LQMW-#u=y5xFIBagf(oss2G3MHMQTZI2-w&IY=HD9tNQQ& zehaI0WC&{f`zaw^s6!M7%_ssPre7)`BHp80>-D7IKEHLho&QxRap%=xR7j5 z(4VnB$5lBMw}x%eDP>_BAOxvm92-?sgC=6UXL@v-$0ck!cSk>kwHo{Q0suiC&e)5N z{CWreghR!U8gZ-zUEqp>r)ogk*h5v>s%)}_f)64(@$HtfV8Xr|{$cSDLiWZ=jl!+v z>N&0!>NzO23q&eTnL2Zc*d}Bx5uIx+NE-6xLR??^CRX9m6M50Aaiy8&Xz(658P9Fi zXBSP0l+Jc&qm-72RzBSOxZt$7uXuKiT5^59*+1xr3IFRoLadl8r;-Y*b+twvT2reA zRxBWkuJxCyYuxkvUsd&*IjXRqCW+4r;`4&|aIvW*zTE?ePwo$czbNFD0Ziu@h#dD| zgobj5?whf~#psUk_5yt3KGo{*Oc-{k0sBgE>r}g{@2gOzwJjgD&Kr+PzXxyF?eLX$ z)V~Mz3vfxM(h}8X4o3y_;mxXsv!iC_#Qrdmo$P^$F05~Gq9kov&6I;M(7w0=1*uyC zD4{)gAKuBg5gfp)C-heXM5T>{Dz zD>#UhgGg8l%8Bv71yHL|wb(_-TpA(68OJ=ZJZM3$NRCr`Uc_vNM%Cc&22>$I{gT^= z@yGrk|DVJ2+bB7CIp=*q`3e&=5TMBxYhlrFjSY`IvV@scU>^865r(*A`f8}U5Q0Dj zg)gS%Hx4aaLq@BHJcUCTkcoga1caJaBBdpE=ppt);N@CW)~1AQ=y9AavH(%H(Rz=a zDmBdK#9?LA6W59c?xTl@TTDp8n!L9<{BkiMUEMzY4gH~7M7LuOi)u~mJfHq*?Aao) z{QdF3OB5Bc!CV(Nro^!mTYsZEyonTtgC=8L7s%$J9n%r9I1IgVKx{^P5EP~AnN!|Y zONMMCpHj6-htjfB)oumt?F6f9Qnl+Sz0Ax6E47b-syx#HACD$htu(qU-G%d~_QeV( zF`wK*zQ_2E*=PtRx)C5troFS1%+2F!-B!cp`L6B?dnRlaT}O?KT9?@Y1gSBD=0ftz zheW68Pq3iAXaSB6f1|fT)lmax?dqDkcIo+3AF9s?e&kp-8tY{BBk;BySEg^C=CF4L zTR-W|#fI0dKSZNk9U>Ga4Eq7q-o-NP7b4dt76I0TiP5hpn}5JFBkcm8#3rNt643%L z1rToYPePs8Yx>LcP$k!?czemqtlW}e`pfJchR9Tv7hy0^GwA)&l(*4Y$?-(zrSL=S zBpi;k5%)^QcLqOp-WP+rxSU5Z8%qN`w)*to6bj4PGGaar{>>TK%CUt4aO0k|OEq*0 zW-tNb_?y_yn&xvI_CZLU;X15tD?rp_`M93h{v;yL2s_~P^r&5Mk+3`63vU{4)&bvv zSi@1Sx8b7Qhc}>t1<*fgyS4SO!uQ+!qn>1!E zBxhA`Y#^_|WqmkJ45z1HnofqP4iV@;pckvc7Jw7)noOt;N3UyaWg^Fb$WfHtFIOX+ zD?EcTHeeyZn78rCNtM|jv1Y$cX1~tN#;mjvPP`Aw-hj~@$n1?zusZn211F;YAg?-w zyr66{<%Qx2Vt;`DCa>P&MzLO;>N6v-U39X4s7Kd-jEeO_de9dGTD`EPhIQM*s`;Wv z(}l;lxqgk+F(@QH`@yXn0RH=PDi7oVGfbhHiwV*_d#=#7aXg0LnX%`_lV|PJd2V9t z^!GshCO7*T+adhg!Vi&S3g0%Ib4zx`IS!y2SFcCg#Ib-ZVzx_(hd+43FBc(1uK#=V zOkr&t;c@Ls4uqed;6U&O+Z`MXZ{vCZD1Ep}E$+6MO zV!^W|yY}e2y1KpLCs<*-;E8Azu>(ay^6c0t?&XHHTCnCRyUAcpW{WvqNEp`*HyJIQ z*1%`&usu|f%kD~Y*w%BA&11}(e5nyTX`tpCES9MTaafNXql_GOS7|@)dhz)Q?n<_r z0sBDjwfZRL=6W4W^*ocQ=8>u9kf{!VO~l}-h-dOt1`3vHf1OqOHS+c7PgJ9ZDlK}~ zdtCpGm$YR*6SF@j1zG06myJ0PxFxXzqlih4>Q*-G@9NgOU_y4i0b4AypICtQH+ckV z(FcO0sk?vKwJUfsZP}Mh=KPpo&IjVHrN_XS9}|ojU(8}7vJh-p${M5;lTHkBdDU&m z@~29LD7OUelj#505AxZzX3I?8oS4audS9bS-H_ zZ)Wv)dH_nt;&-Av;Wny&XcSu^i#_juQfzN_>908=mSn^Z!A&->;~JE|PG2vpB&rc? zLXY6GSpbB}ziegcdVb(k2{uY8+vDnpM@v6ga$B{&b}{nWmVpGmg}&+;3)L%OaP-37 zn2R9v_*BiNR31QBvDB{`pkFme{c0BUEA>*}LWq)%hoMYqGB|=zDpL)r<||Y-trc_Y z`b78P^j#Re(TAeOF7zResvt`csOve35kUQmNB1Vicj?1Mi~l@2F}m+x6nI%Qed&B% zFsm&TMGSIry-tlNc(P_mnLxP?g9cnH_mR;-qkfrm8T%_;XS%{OZ~zxN*M&oS0ED%p zV`=sk5urZ|uCtT3j6#`~ACjV&sl1<8IBh2C=VAS}*CKcDRDWU7{k4JZvXV2EO}fBD zQ1--&{BX5*#kR8Au8weJO=-uHi+Oa=-q;M(Ozd}X9kREUo?JST^+9&5sIgukzFD(G zh)L`GW&NZ+!)oM9dmW|_TsV3_)ghL=87l#AhG$3xtsr}2dLD*n=$Genc0cfb*l|B9 z1!O*&&w#MwTC53(S1C|*N?}27Y}tTTXpZdygT#_yIhCUzS)(sdpJ%wL67lH zu|AXy`qhU4Mt%62vObMM|2|Wll2{3B6}`n1>rN@*=h5oYhl|iCWwo3b(WFH0)}d0$ zrj3%IWj6}yb{)EVmr%hoUIp5OzQ5!G3^w-s)U`_-Q-4@rjy3lI=rKm_(#euS4=J0T zBw5m4Hv=v?`s?BA(p@l@f;LH%OJ3T-J{gz`Nr1NM{upPLve(V_iEWHww#jTCuXpA+ zD-t{^(a45TY@{Ghy+t-s5U%SDWz%!4;N5MfIk<$S!M;nj_98gUSX%ov*;>%6@R3d! zHq5~=Mv{3Q1ZDkDcxJlmbYrZ~1|1R8t@tdtsiZ1_snxVZp%t6OT=(c}~2Y*t#VU^!Y( zBL5xwyK2XsQF5yGq^hRJ&#>XGs@<*Q&|>v2ed)9fzpR_bOcwY{GN` zKzZ16TY4w@vN5h`7vkF+eo;!!*cPB{s>}#g!jw?y2vrUN(+{9$(alszLqXaRLORV0 zf$ap?>ho|{08Wq>)V7UO9V>VjHXegm`xBB$MN!8&OIYQA5`YuW7f_?6ThZ!=D z-B7^#;|zFVuu`!Wg2lCxOo2ML($cPKt6&X)*@~tpn6i{j*9mI?mN7P8*H2E}9~%d@ zppW)}Id$U=Q7e;nfa?ZJsTFppe1oLa{js26p*pdVkW$N4oeL+GQcnF0<-ane@(-g1 zm48aA`(v4y!}v~vo~1xbHo9I9q?I*93kW0;HEgK_75 zf9>5RsOoPZ1VdF+8o!SZRX;T4jo{H-b;_aGjyljD*9tHeM3v03Aldb1okKCHWfOE0u{BO+l%=AKL+KCTj+Vd?qKfZ!@N)2wIzS7s1v1Ckjw8&H1Aml+< z5;|iChO-GTlcK!gCXPdQ=y`q_CN~Uhw_^rR491!#xF~Fw=Rh-0=!ieYpo95|9ASZq zo>w-_A5yJ-vv6^R{-p}nJJpyW-3=fA5PeX80e~|zw?x3lK`9WT*X(}4p&#fSD$Gz* z-nMrJgk))}PspY>q2s7>-}`r*b``!Z4Z`Jl%BCic{nEqA8k~Fzl(f5*H9V862fKjy z=~UKW(=b|dc) zcSTD(AIMUFo5q~#@56CjSG zU4@gU7Sw;u-FUM83TD4*sFdc{E*Ysde6kLPgjp|27P;Htbx-JhVue6rNCdQ>I$fUmdbqzOXVq8 zDl68!3rppxgr%}07?qaFZ6qBWtV#PNT#)R0D#L|eQT5-O=$M63Aq@a#$ST+etEq8R z>mWk|u^{6nGAy!}A~929V7NN5HVyJOSgY@aW^%jfL?Vb(0{aom8 z#i;i)q;^$5DNcn}OJ7$SJ3+)8(TfKU=k%e1BeALB;Q@nRxjOV9i*~g`ZH=rtlO!f=Bja{6Duk-jLF4K}FimxG-W zajy6KqHd)Tn}Tf(r~jS9Dwu_L)P+Muec6Gasq2>B!c83KNq+g`_v7)>lS^?j3$LhzyAm><>-MHI7)J&AQ zEskpRo@12mm~yZ;9R`&T>n}&FaYn5A5#bwgL5L7YV&6n>^qS*O1~vQ{*D`=G!Igc z644-DVx1z))qdv^JBaeP;)9vi06UVp<@q03bSHgaUf^cYP!b0ZT`eK2MQ% z2W2dr+W%?q6=eA}v;egdJ4#eS zP|#iRAATq-0%j(`V;2Z+jH zts7zmwUR(g_Wyq7^VuX|+HZgTw*TY%`X{g1nR%YMKQr?@^UTaM;X*AJD7DuX)U9Mb zLTqwaDmuX|os37bV7$boKPGD+U9z9jhg8?{`9hNm;nKD;HmeQ(wgQrfhh4~M6s;^&+4^&9qVbMN(82yV9BkL@t;>8Xil8gmx5R7+5FLRr_ZQw z>_s6rdZV?Ci5y4^3Z`&QeR((Up-Pz;+^#v5(iW!AQPu7>&;ho{@)-QWJ&C@hc0F3|0*_L zuVVA{D%pIU%g+C1EgJ3EZkJqT)OmxtRA_k}L%$B1%ZY_jJKBt5yV&|E3J0?QGz>_g z+*OAckW+bX*bxe+j}Fv1V%R7IfK-D*kMzEj>~QInVj(^wL`P!^zhRwC`_>2zBZE0? z!LZ@Z%F^bV<72$H>2IC4%_K>WS>GOQ6hVz}Ex%XFYtsVm&SGv;uI!`Y_aH?obF zeqcF`d9&X^l;pQ>itZ&HnX~m#mh4R3d(UyZd@PIROZ!FM+9PLPbZ^xSL_c{*zQOi= zRtR74AxXggkkAP&g3z*hU6_V7R8?Zg+?%&e20{QAEneqMuHhgRE1HX}7BS|_%$%!5 z=LH*$x~VLT%obZVe>RcW86O<>Mn}n)B!QY~&f18x5mo$-Lt8Y{u+-*r6>cJubj;wr z5{I(s{0`N5%B~(I^YgUJI2M@XySYY0X&fD1vCu82ZDScpKR8B=UR4t$2>n7h1guy=&t3Z4*SQbTHeH}!2CqdBa#(?rHFqzwf*R6EyC5J+kY&wMO-UV+s-0ezwr@=WI9W2DMXMQB0u!deNr0GDwidBM^bTY$#NhS zT@?6IL|Jq-;S$WgBK?f>TfpR#dQ)nI4(FrKxervA?b>B}_dQ>KyfSBJ&e0dVSCa7s z=L_+VG=CP2T3fxchpTtqR|&&s$#-Q!zwGDI{<+)jTRJzcB||&9Wgq2JbyycfLp8XS?!p&wR55i=4m;*b`2%|Kjhn0u4;Wt>>o436t1eJaEMh(DZO)o7=8_(Knx=Qh{| z(Lyb`a5~@z^gIm(DCQ*)*Pu$8fQzDz5jJikPmAMjb4Ug1 z;z-HCNv6cWk;IvMHOpoaaWj1Q9-GmyHJW>1PV}Bq|HO6PmBK=Bj4sJ%>@E(c2Ov`7 z^M@S)t-qt-y)t+4M32Ki(LI`zPa{$voMz|TS79j58>l6-Ix?$CEDAK*%C{Tu8cnPQ z9`{ci!!9Np8PYIRb7r<2PnCoEw2a#u>eg|txOk%1$B}$)=N9H|E4YL^7n|4@L9q+duJ=bIilLMVxD^_Zq$j-QE#CgLC?0HWh|0JcFZbUZXhRM#>+$ zaJaYNLWeh$LP~Xop>e52azHLM04A~I|Bho@oz?^G^-HII+*|+OR=c z$tvtuPp5G5@%+bpynO59ox^vM&nn*(mS}6}k~4%gD6Zm#0*)XK=kpa@z^6;*u$?zF zn$vcCI60iihr9GYf8K8GJ0mXP`3dS%F8mKM>zB{>OW^wzck%uH zKhPhCwAW|Y|BCu#>H5fgk^R45z7T$e{pODS9M;aVL&XB+5>DU2A?XY3`Z9vLQ~E$!LuE;bP>0+_5@M%>aZS77nvhw!&!=(Y+W7}L4%Z`E1aw_!9CI$XR*t&ZOp)ZFOnox4xzxG@%0O?;J#ZX80uML1Z`j=?)k%puJs}kHTRrSco#-(=ES9m=#kO{Yk<8e$NWe4u_tuoPJPUZ zKTbN?eO;xjd)cfmG1AS(bcvCE)~8F1bhLu5Fd1{+JG!S;#r#M2wBvQ;SWk;p|FT%% zqq|xO;Et{qYe=iF<#&m+I$LgMfrZOl7k8qCd59&sh{M@XD>|l}+om zQi{RC&m7t9ni!-pj;s)zS)X=9Du};!fyj6|mNNAe6&CG&E2pP*q%6rPJPufUilPcm z-rxC2R%d{itr2W?=~7ElBwb`?W!BvsV-wJ69y`Ap)1xc(?G`JQRf>T+y-xL&mM6_| zQsJbdN)f|Ija#_0+)+LYlkv(sR%2RKZueW6y`p1vu5v6*sq^Dqr8!P29oCpwrDM5` zGjlt-)*T#S$NVBo(@a^a70F>KE_Qwbp+1DDskEv^%bNUic8RQMZD&~%qARc5qb@pj zBfOKGsnCw%EiSGeC12upyVD!IimM^X-29ivWMTS|t0t;4UfZhI0z6*1M*y2RJ%bSP zfX?{|vh^sUI1M4G-+pZBa{pF0KuyGXeARVCTVHh}ziO$iEDO|CxU&=1YfPLYu}wEYuxdQu zMhh(Ip4yRa0~-RJCHnIHGTDN%L}-#Y8Vg6gJ{Vy+w@3rOfpl}=M>6ubmbG~*ze+gj zyglN{$0ZWIZEbdfXXFM~_4Py%uRO?BeHAqhG{?EB*O4!S$~EVB(1!w2m$y(*!l`m>O!`mloLp$AW?*$DLuLKWG!7NO<9 zwS3;s+)G4Gzr1>^IKrv^kTIFy4U_nZmA%IyU3P~Q{=rz`AM9NCEggk7tim5#+`PK* z{fb0IWyW4-IK6X$x24pYrQOnATF|L+K|>1L@CgkNE6XjhvRuy<3aJ=5KPVN))(z_o z?BkB>vVimqUM*~v#;c9kz2VuFg!YCVRbIV`oZ4MLNMnO$i8~>JhJ1&{Nmi3~WE7A( z*X~Im{r9}J4R%yq5JmkX)2-@zg+N1LfS1P3bk{>!g+`)iu7J%J410^4C+uFbj zGF)stPcI$J6&x-lt!ycE&AyLQzZ^@FEI3g%1-OXD>7OqSk{foeRX-$DzIpZ%HU`uz z{lYZ&1;(*W?pWhP;bO7$Q!;i}o4qV?be&Bs}xg(~#cl-Gx_5+ zd)8zS)r=4yNCuUNJ&Cs|urFbKU^H0XTF0da`OsRvp3D`&z$AW4jOveHeuh1P2c=!2 zo9tUd+BKsmB3_xG%}dDR$6r?z%_^z&0(V~?zE zxyZ1erkg7@@`Yz5uH>sLU+A1{ud#D1%{EsWqOf3tD?9^-*LXmx6xg5WJv3XoE%U`G z0E~6=ek*D^0yQZGwXWjYFl^Xoa=T*2FXfKex>p9DcntkR>=EyzY}JoR#l5uIytCzW z8Eq~kGqEtJTe9j5SUYtF}7rwE%Xd>^z4XYxmZY8E+rr^P|WwJCjhRi;sZ@W1V z$`+b8#>|^!8qjg|jcqmwk*M#K#dkzW)d1#q?(*mmZVix|?iL_j15yESeXg4Y%*38c zdj088LSg7o#|c@ox|dYkKXFI-4JBdSol3%UrNOxr_((}O_2-?>AG(&gb3Y6_dd#Vr zk)p3l=WepsH$q!3hmfE|YI{ymAmS(rG{pJY({Kfa6Qw!$P;Xb%HN1$=XS|tRN!X(B ztMUa)!mmnRygBkao>9DxzSqr{`|h1d^z+2Ryn4>a>G`2Bx7M}n3OeQTcw-Yaiwo@K zfy<(-l5qdI$dA#Q7$!|TwqxU3sT{LIEmH9{Bne@+dD2D>#Zm8;H(&;e&Yr#LWZfs@<8>CY+pg#}J*2fLTn zSg`nZSnAT@7R=EOOI(_2!KjdxlVhnJb(TCUZTekfm{qn%8pmKKd5w>^@0Xi1O*={^ zq7&ep1q2>&s7_+=&^0WwV{T)Tj*QbdKjc`zo){{3ivqRmFfo?mnSuE}-{|i%Bh|Gm zo=@XiP|X2KpK(rh`#6#*dWO%Kr)Rt3u=CZvZ3MVAdot{>K3^8tGYI8RgLuS726e~` zSZM4-`9%6~V-vH+;P;I>$hbe3Gu^4fUCVsKZG68)9$_L}%fwx+-Qm&{6J@m z(FoqSPULaw8Km95zgkxk_GB?Qbtkrlr)P&z*M1LHMz!Zt4RExNYR?`G=$HsRf7XDG ziNF)lfR2g4^R))ZL|{$=o`dEj;Q5=Liurh74Dv?T{=;hWwZ>Rqi;tz9;dHbOdYX$M zKyyxE;%#rWkZx{o!CzhTx}*5h8`NYGX!NZIbJD`s|7=sg$AmF=Vy?$rh&cl@ z2-Ch;#NoNzB*?;#Grv2}fNk>Uz3qo$`#B&e#Ic0^CS#>gou&_&J)RR{9Qe{*`(*;e z*ZyMm%X|?e%J#nstxr5ug7ViV|4v8n_ZLhIu9%Pz(E%Q7E2=*!kSio z;Xr+W5OfY#@Z`I!EgU*D4z zBk|A`o4t-Gj(q65jD6jOAn-$kz=D9;B%9wU)+}UsW8|ouxRuz#`QzQ=eZ$YTe#{ znm~U8fxg^ao{V6UQxz*wDKZg(v!&UT}8$+hfSn>X+mQODrOPT6V{XQz8>{{mTB zpLJ3AjOEo^U31PMZAe?Oya88iucbO6)L)r2JQEzm8`&IIR#)LRgeuLRh3; zLO84t4nkN&UqT4g7qs0%YYhe_9T&7P0D_LQ&}dme>%J!Qf)-vt&^8Ng18s2yf)=(Q z-8(XKnoEkG*&Z(mzMu#E!Ifx2%GA7qFbEy3*gr(XY>7CCXq{Pw)CKLVLhAg&P>P(M ziPmUlVJ#yY1rFBvXSg^cJ&)M{hBWm%b>u%LFda#7dA6XDV(Y9XkEw*2w%bRbfgkZ+XjCK@&C4) zXy>YR`8F}5ARaX8^(?f+{chxKYZ>`h>uC&e$|yc(+tSMio2PW$A3 z7}(cbu*p@tRoD)WN%_oq#b@77axr#;BN@fvB4pbq%<7KD%y9pz_VqK9D$8bJ0LYi` z+YL!Xf*0ZI1>y9EHAnB=K^Ti0Fae*M0O1Bqz#bDI+<*!Avk4Gxzy!#lEz%Hfzyy44 z0)!hd0SEPh!235@l?{RuU>rM!hXe9iaHh*m0X_v2degS(+D_l2uH$>apC!`p=I21% zz!(KVkj;ymul==i>>yJprymjz4p|;A@-u17<$v zc1#H-7n6i(K-0rf{Khz*d-PX*y@Z5eH`X1%5_ZE}y3sPPn0cX4?zwBpl|%MZQ#_Te zOQ$&l>kc|A(WBGwC^=G1onDrzpnM9d_5Y*^v>NVlRK~9;e^lE&xOss6X^(_7+{N7qcG`JDeRX zs(M>xl1ZQ~aax6*-eGNq7<7L*kC(f?IE>iFx@%Bkyu%SdV{=LP);Ta|>&jB$s)|31 zoOXz(sgh0i98RMmvC^zsH1Uo;^6`d;$2J#FtSK@+EaEayq!bBNW8Bn{1+BBr5+!fL zy}50*QMpVtt&h8!74Wm*)D<$!cJ~|BcK|N!kHV1b zO0nrY?~K8&dV2|8uW+j#Zlj3KZ@z{3;Zbi~B_G~rymA9yxY&43KCRpa@f2(*zqxYd zWW1^zrb0{7^Q+{1XZa;DxwyY7`YiZa9`GXbMGtaj4CgZC)u#B`-Z;S0>r`8ysFIpXl}?ac-2T=P!^msbz#$No}r__1Ml zS$tpZs(zk=6^CbQwv$hiFA-PEg%S8+$h}?DE!VQlg3qU=B0uuS>E)^M{Uo6`2n(Pu zb`C&tAacKL23O*id7=gDD%M$&3cU~Fs$NQZa@u_fHZ|2NJ)W$9JDM*!Et@Sh^`_KT z*W8&>IOor0@gQyG<#4VE=$Q^7beLU9z{ZJIiISxxc3qM#%ORIq6~)+M6{Bn@w-`>e zdlv?Rg*NMUH^9OY@- z;H~{8&KG)B`j02LO8S+#LgI!qH!~QwdVk1RIDr6#hW-hXGUoH13X2cgkxuRJ`p~_N%uI)T~TKXgO=85%<*xO_A zwKU5$=OtQ(FE>{TO7pp@e+R&|>;dVsz_pCmmtXy$^uhA}*>T?F+VTNyb=(dJKB&Xw zR|f=F*2qYYOys#fE7C|U4lcj+oTbywF#=M49t;X;$BZ79EZBUguVIv&H4i)EpTp{q z2%AVw*J`n`6?CfHEM^v!w&@eP(NxBdB|D<>4jrBw;OQf*YMHXmzf)%$9g7FluNmG7gzG;(!W`C@Zl9 zdXBO&eD}FBC1B6ibOTyZWIW)POw8?u3&W0}mV7dmi`yHVD;o|Pl+V~GmBL8Zkt8Ik zSahg`q%L%(*uK%)FkzNXuu^mjaX30fw<1L{kh&Ea+vriJG4VBg3ai+;eb5&V>J&lM z3aXuA)|d5&5kxkW?w1P5ZrJ@&25WAmFXNI7XySi%Ly0QtiPOG~O|bSIr6QwBx05JV zNR2Ck+YE+eSBbJ+&%E1kLaf+kc?Sxt`%&fHdQ^Esy1d;fm!{2Dv)VUG!|Jb1zqd*Z zbNkQl-^mA(5A%}^JjC~A1z`N0y=hL_$CJ=fi}sDY)KWf$tiU|%;aMU#s(AK)QJv8Y zD8{e;9)A(QX#&vu*?K&i1NrZb*I^cuksX&DkO5vk*p#>b-SPVryxjl!_?^W{p7DD= z<@@i(@2jFCvDp;<4Da*@JWKIE&DU5l;KzX+ESVkd2KwD}O%oznFh+=loMq=(H>(+0jmM zSiDar`$Sr2y^SBNj$vqHr37a5v7|8%%p z_i5T{`IbRLqU0|!$@SMluK)BmNy;$ClHS-gwsMCrxveIseU072rBQ>slSB-eJOHzU z)Q+8-vDD6Ih#YZIKssAsUl!_{?0!4X5wf}`pmdZ;_Ie-)6;r*FMu+B&5eC(oVMYf{ z*5T+0XABI(>BmkHymqkJtUXU)%0T{P36{kxNULZzK{rn+3mP*zUm!p**baZl5N^QY zJ~|S6TP7|Or&EuyP5-g^bqsnVD)jQ2Ufut_$Z*tKmLfY5i z=FyN%)`1b(JG0k&YY+c>&WXrL@o?G|u-0ZLe&U!Z?teCao<1~8|tKYv^xo;ShX8YYLX-1)?9i&IQ{;lJy zg6z6#OOrc=o7UVZ{Zn}UuFjUlM$P{bkBZok4$aOl{Pj=Im%*OSpzd8AGh-K6SW{~< zXg_7fI5NqJNqUasMWHxf@`IYo?Em-ZjSu-xZ2Ie%g@4CfbL`C5fz2{Gx0RgMJ!-=5 z{E0f|Ya~LlE`ve@bp*}oaYoRbfox@Gn%N6`XQ}Q@t9{CDfmg<>KJ&E|wmwVaIznCHh_p{v-<>9kyxskVLb+HfHcWfDDXEXpl8dsNn1 z?2~7C1DoAEF6Lm!n6jA%^1*bLzs#2YC_A?zf6>m{ z$t}4o%_?(wD_5C^dY#@^Y@%hUUes^|zOb=P6dpZ}eYfF-_Fdk=n~}N>VUH3GDK$j~ z58g-CaWsVq-!pzKX=n+gbktImz?iIeR#{Tv$k~#3nd9_bjd8EZ+E7bkyermI8eeYh ziaP9Ebj!c*%av4pc0@1RePo(dXsnG4=18J+lTtIA*qHE)Gu7as^lFEMEv40}vupUa z#*sqfTgHRP;Y?LzRYyehIkSDalfn_QxU%-T67zoD-t0eSw^F`s)V^|G7Oomsp`3iJ zMQntegU1q3NR3v>YQ0wgeiN62eQYCbBz?W57RPZEDFj_4XojNLQ+Oia>W0VI8y4MM zlYPdES}g1>XuYRDiEylRGm2J3fzssm&@V#b7>rufZ@lYAg8vA~=Dv>zc?S-o&W?sL zj-GKqTpndc1OBuThs<%!+o*5q0;+OO*#txm>@8T2dL5*e<>}U>Q0}Ze@=RI0k7u~n za|->aQSPd~g-_zGd~=|j;$%*G(G*vQUzh@1b`h2Up2hiet}neCc_l{+Zl2Jg(Ymy( z7|a!{*%jawBj#g{L~Nky+#Z;x+cEHE0tap6 zc;|EEE(dPV42NQ?+CZ~&Ru6B%$J5htk9czr2R5YGo497rCn!W#f3?>*LaNion(Kek zZBK$Ir{#XQBA)CJI<&6YK_^q@J?{K`l51dCzU^tqG;p3JQD zd3|%?oF&te>7F%S;X~0PvQ%owR3T*5T0i+1jxr>nZd>SUT8PKaIx;fmS;n=%WZdG` zBbxyjSpv&JM=WhuUe2IncDs_K9~IKW&W9!P@5t#)L z<&*O-k+aQ=uB49tll0^MUiu%y=TMRVY5JVA>$?2Y|2^q5F?5}N?|)DFECIVtf4PVy ztoEUgxJCb2DR+pxMuU&xx`cRgKL#ayz1UPYx2&$wlT_)o4aty5NX}z2b?U9s+03r zoyo$dyRTr!GnE%sj&t~#}Lx;4n15^juacC3?&(( zf!M$i>RV)N2DB~WN4_RSnji%|<^l8e`9e59m=SB}N@0b?>d3WY;QEZUGF#}ZWyng_ zKN+$gK$j%D&U1s%N9>AenXX9Navn;}TN$dTSWS%&rNJ^x!UMo@QUq{2l+M{73zZ`P=_Z`M-s<<6o(N+`lRRQU5~z^u4-& zQ}(Mx9@6>qcj&L0AU$8?XY3v`rTfFh*^tDwUahh?x6YTljkB84$*1@VwlKut$?g-{ zC6C!n@uM2Yyf(nV-Axr{55Eah!u zlF#SLwD4!XU~%>kpRt+IltoY#v1?JzHQ6&L|AdZ7AIj}Fs`B;V-I!Y?D?J&Q!U+bN z-8k*8j`mSU3R{~TTBk^OCd3VxBa|{^R>Ja ztM69AL|bz}`gBP@ft z0L`m0i)T{6O_2*?Nz3%i_v5gfUW3CNdyT`CLRa3k>^rU|k!Abx8icGzeFZh;iKZ4U zR=jzvc=bFdt6qrf15&(|vO?wJ@_yc%MZ2>vF|@Xuo`p!qIe6GV@#9FU_u->0FVF1m4b%N#`wkI^2>KnDkpBQIYcg zv8teYuG8IF7T9PX?|rT695TkC6CS?6vnMA{}~Ue@sJj;uG^a5$R_Q2wLz zp&XvHp-KpVif+&+*M(y8#C_-$+3qdklplIR?xWZ6a6)K-K8O%rEZxr^TCNZFn0oy; z+$YB(K0rhQT*T=9(8Ehu*7?~b4E=ltH-alk*Ask24%0;L%WQw5Z$bMLeSaRtvwLG4 z8;Pt{rG_|h=`8tB(vXu6q5J&gDy3NN!4XV-rkN6C&-*o)iKy78i#^)1FSYC#eBZq$zRt4mvhYt@_N$g1gU8Z2-hvOc;$3Rl*IRZB{@oli{cU3B z)o}kI+B;4qP(l}`H)as#B+LTKoQi!m<~+<;%*B|WVPg34xNpMTj+u_Bz}$y1$Ddqd zyh29caAVa*X%($Kxhh&odvkx8#;aV_1bnG05Y+9;nt#P-W2X#i`bsV_a0=`d5ijH( z*?Pc!r1k)ZQC@V#Zjp}ee2r9IP#V>z{TgYBTqAW=zd_P+8g4>yc)mzTw5WyW24pv` z*gz{f2L_9cZ+u2;N$y^*o5lez$=$kIdP7NW1D7Ek$tB@C;#|w$tZUZCfkTu(7-Bsot)8I$tcwkgL>a>mCPHHw(px1dhi_P04i^-b(LUL0XaD8i5Ac~=t>XJg`zDiy zgly3v^+`*7KWd+KoatVNu7Mm%laNmBlj&Z3vT2`f4{9w3lIj*>=57oba)=SBYvg)!f}G1$vaD6YrWC^*4bR;oi!LEa zLgD?8=&+6o3k#aNV!rGNgqSQGOku&{S^d0Ka>NBuF3$l5qT^h@t!?bNQr6;)sd@Fj zf+GO9v&ex5_SH7z`ra90?zr&u?>kx6R#hitH@?|*xT#41`)?NocbPRvu<2aeo%vB%bJ4@dzQ_-wp zJ|iSNh%Yy!d!M;!LaPZI9If$gZ!k5lcysGfTvG4L(JvgCFCw8AR^p(a#py+vGI~uy z`lTe3ME$eV1LIgLC5X)usC7HtO`mJi%!lm_QRr^+Edl-PUi*|Q^>Z`dLO-)&8gzLs z^RU!Ov-Licska{Kg2|J4j0x(XOmLztH}@cgK4iT^6nWDHyhbsCLr!J#aBH z3z~KMOVE7jZoTzDQOEqJ-vOhqx6gkciJoo!P?P;(X{C^U#E6GUE+-r7*(N%cr}Nw< zRqga#Q|aG%=-XpHEnZ4zeR(E{S?_)8SDQ##28+L7V_7QrrGn@1PPSFCvh;vvFI%NW z&8M2sKySkAN5N!$5Yrb$drpu<(e-EOy;J=R@}s&rfBJGF6?oRZSitl@5ZU3tkSDX$XQX zS@U=&B*R|g3oet+3X>kvTD~J+9!FWj7nc^JY(KXa721KC8IdglG{(*lIuYLFW z`-Ci%h8730L^+UO>hIAnfVh15%VfGQkN2)7Lz!Ua-%S?5Wim~g_gX^wL1<=7Da-nM zWvRjTjc3Iln4xlc^jTW0@w`K<*G5X3@=l8mbWR+PHLRAoa%p*1c56@r8+%o*mK1E| zX>IokZ88(IQ&m}38MS%qmO9FgAN($7*qvN zkZ<6X#|7F)%RBGz6{V%+?O|(cGal?*|r#aVfTAapd%|z{5)E*Kt zPrO5<9aAgUo}W;BaQlzN=}$~Gi|&;B6#jy`^3)B5ZUU@je= zz_qBmZ$^SXQ+LnY{36AgjyK%*_ycj3!{wf8DL+QMmX zcHld3GLI2=X;(NIh~S>+3MT>qa0|P_O*V1WUEne*07}tNYiQ0MerAtVd|9pBFJnRs zZ7J$&_gi($n$=N9{Sa%XY6^LzNGIzcG6p)~WMT$4K;tN0XPnHN;GA9HGWGz}#Wl-PuLhhxAp4aN4@Aa3Yl?-YZ?z3GYw5w61Wn5&&oG3MZrq+z+r0Kba_HuMXVa zu5iM*gL}6toF<#$w3VH4LT-`S%EP9b`a-g4ot*70ZerOiYq#I2#@0n_cJLpEc zD%FQ8>0(koLd6J22hyS(A84dWIXaLQ>DZu=Ch6!vTC`)8Mw;EY18EVDKl~I)NnQe) zw@W15!_oc=e={6~5)M?q$}LKso+*b*bMBwYgeJ2^;BcG_Q16~!t77a+&fL{w> zjRvG>fL{QztP31Y)qo}e{8j_fG@w@*0O70xhr5;Ywt{m2fW~_Qhh5sYoA8ZO0*Bq& z_j~bOA2{4y`|cLsWr4#zv~LzQY&<`3xTp3l7GHkgaJu$AC%&Ob6SeOa@%0ZJ?xlSv zi?3VYFq5`33Af)>h^W@&io==}N1rcW<^(8QOk-)s$F$~Ucb7c9_Mlk-9y#+;lxDr?Qo6&guTIVz?#Jx}Tinc+FQOb=W0^9WtPV^h-is)Wyxp*b)X z(<-1fL%X_+X-&~bx+=rN)*St1mq=@p-qIz~nx)_95@}7-f9w)z&C`!|iL@r_d0ir{ znRiwbnD{-;qkypd+h|CL7mV8w~0kTyX@|Lba{>fH{_ezwKlwwc7 zOvX%M?}uX>Y-{-kzwb}saOK)KB+lK(1RaU&PqDKeE&o)?L`NdewVbCwmLUn7DryV1 zy6zoMrxPKn;BQf;vQTkoLdRN z#{t7|schG!CXEiJy1gQ|H)acpD?6z+U_BZKN_0ufjD9@Py~#Q~om8}jB9vEoLyt*g zcbsa`=K-=-Nm@vj{8hE0#nKlZ?T%d5Lw5m=9g5s9b{-m)BJ+CYv#2RT`_h1%P;@ZrW7{+(hCW;EZY!!fzggqpp6Z-i_abD7LfMO{_dTcN#l?^?}+-6w~;Ej_z%&kn58D(HeAPm4D_9)Ns4Kj=SNs zbMM8`E;UWS>amtC+!G39%+sk(rMe97leA1e_S~?0u0I}C~EU@)>>%Q{-bg z*^Jdhpj^_LvHRf@GCN62e%ih>bquX0zH|Fp+Q(xJe7!D6tbt>y$*0_I7CP3#nYtB^ zY2jGlF|oi_6ZbTW+OCp*t$dy?n%Ii3+xRKMcvr;QI95ihk>_iq<``s2NLS-a##*^t zBV(-`Lt4!|xl5$g&Vwj-M>|_FGcG5}KWONV_p<#3X*Tpze8(NQ+FJLdrrK!qyYjg2 z*7|Gf-3_mCw*I&Q_MZDwA-LkMs!U0ERhk$C+ZM zoq6@qjOBeK{N`xJGdQ9dFKh3{RY?w2ql5dSCp;}MHUkogmcO#MB)BV0i@6iDp#R+* z1gmRa1}xe%5bU#x2|1s61$S87oGiwFmiP_l0TzzmI4nIJF;RxF2bhO$ACoqZC^^Lq$L98 zDG7P6mnwN^u4qOR4dpjpYbMpasGLY(g)%`H$BbEmL8d>#AGm=-&vKe)vLB@`6N=F# zL9?JJW4!>Uh-XM1B>tN0tZ2qXM3eW;<7U1>h8}BwwBhU>`g@V@kjSYBo=Et(8~ujk zgyB*}!;k6&kyWSX)g1J@UP<%(38CvZr^~k(vX-0GO?+z|_j{UzxCxQI@WqXNBD?S# z8zZTy8tgc|rZFMn#Pc#5BZ(?;^6DdA+7&_bZ_M;!Y4s!=7kDI6k4U`fNr8L)Vxt=y??)C;XBteX`@2z| z&0|lAm0zhj?Lgx5%>^($b$r7JvWk__Zq^rRP1+f+(Na{Z;cO|-Rs77UDR)NB#L>B~ zqbz^J892=G;acWAiO6&6-;n<0@~sUzd*hFM1TBc95zK0Z^oTM&NwnDyhyfe-&y9^9 ztIn46)?@6H_fqeBhV&xi`4oJUT)2UgDCfLaf!#-JVA8gC0b3}rX&UBQRMU8q-^dt1 z+#;UcH0oA*NF}i6yxfg1+lsbtEY7Pd4i)afL|krdAN}G_St>a_!oc)Kx`lAV)N<^d%lWt6foY6 ztyFi_h|)qj;`kLQ47*7qyqV>f74y#GaxcpCF3I$xdSbbkrC4eu>L51xL+RN?1zXE9 zjSEtX3u>n(8>18LwZ#QBQ<*{PhBWTxk}lZc+o%rKRsE(W6J?ksauZ!7OMcXPx;H^Ul%r8}$U zSFCw2>?$FtlP7@{=N@ZTjeJE=^fTS0=Md^D{Wo$V z6^h7vt^hV+MKT2Nfd*t8hfElF53I;m-P_A^BDb2!WYJ%~MUV{s6RgM!;5Rs@k(o@@ zp3|dzj~o^Yp6aM;&P9^w3_VS_aX?Z$l(X$SlhEq z>!1aGW5Ag`Wku60GRg+tktuhgK(-NDusIT-o!OJrSHPk$#lm?WO#+TRQz+>`SH5LH zG2>ro#V2a)&EVJ@S`E|bX;zu^u*r;Vw*_vDFqZS+Gyb&1?3%78InK1f`Fp%V7OK9T z=q>TdDN7CrRDFBnZDlumtG>JWwi}DQRR?b?yYbe-lr263O=8Y3UWC7^`rcb!Hn}im zr?K6ava{;Du{YjUo>$N9&6I7rqq?396&~cmiZ4{sj2`uC{}#IZM|78!U+NE}jUdaY zH?Yxh!ol;RE?>xbKPir?iRTfSA)_Y5$EmX8Mokf`uk+=@Khi<6ruXwhyX2pt<9cfC zv=pM-i1{;O$}+T1)n4T~=&CxbTocq(!8*W>0J}n_fY9Z8D9E1+nrCKnUR8=FB`RsA zP@!uhu2o+o=@e1%<#ZCq>sqxpecEjsoYjlXw%Xvl2N&a3qxwx7Cn5SzD<(1978F}# z`BS#|L$d2r=+2HmC%*i2!&yp8bKM4UpFLe6Yl z(h>6Ez!=whOv$FLZc6ODni0-)!ob3qedBU}_{D4w0~E!FHKbweG&$4}WF&Og*!*rz z;DmEtAa#GZ_Y;TDwV>zm>_;AO6h_kn~MBz-UH5FeGwLjPncc z(O4a*gZtxzW;h}U;r}E}abyW|eSuDT&PGAXA#i_aj${M<3u~Zv#UqldW{~FuaYjZ; zu?#bYb=0Pm$yP4ZTqfT|4!AvKkDCa^zR=18%H}tPk39q zmvw@h>HJAU=IdX%&-$`$E#uAPXG#n&gmx3!#UiB9xs`=aD>NY4pK$KI84;)VkaBRw zysW2}SGG$gmO7et6x+A@CvGerytQcJ+6#g^7o}c2`+4CtuO5bPxq? z#d%~>e|19?bqDW6PuM{@q9@ep-xv91NRb2Q4&fi-;}G0Sgo4yptpDkfSR z3C!SohYDxV2^R5ofZ3z?G;;h{?k^6};jf)QF*E&KeVEENT#esI!5zILA)4`;6vRJD zxs{rF&Y{{tWxy6|nBi^q!|~!@p#8b9gohKS;jhsCz~Pf5fvINTjnND@F8_uxnT$WN zNfA46ccyzPr;qxrw=-A3vfH+s>Bm|ASe0f7jpXl7mi>Tb$MD(POnjE8Ns$ z@|$nLCs=kYpZQk#W?1&6mVK6G&$jGlE8gdp{f=e-(!x)+{CzEdEdA##_^X!vh-Js{ zQ~Ih(p}oTkJ$0JM4^oE^f+FSl&+EczdI-fBl_p2L!b^Fvi&2%T; zIq}vT$J|~HFFJKRpi%;iD`jAwe;Vd=b=CPC7{++PjmG#eg&04k7&Gmbo2Ou@m!C89 zskG`BtLFp@ez1>Ozde>cT-!HY|BEp^azh@&ldEpmzJ68p7 z`)uNnlUf#^Ir^gyO8q~(Zt%IIHvRgzvuoDB)^a#eg>#-J0k2sYHBn#IN_}gJ%^3`!_r1Gc<;3mNgPsTl!uw~eH zV9&(dLySru>*OJ`R&-Yf@+0ZdYg9-csk;4yi)?MYi3l#CAkoY->}O5bqb58;SR8>}kZE4*X8i zoI}_U{ztK2z1g&Y>p94N)_IR|9{9u#aIciSwyH;(irV1AbH74QdPS zJ#m#PLfHM7Z%F%KT&nsGx6{5`CD_|klD$>A>}ynady6^&SPuR(F$MM}ZacQ9vA8d^ zA5i1$ht<`DyB6~c`w!}7>~e5b-~z-86aIe8i{jyRR?s8k~zHgy5+OC6=^O59T% z>1u{!iMk8-e9S`9d4Tv2fq#T>zjLIjCrRfSa7!IE>SbW7$*&IoM$9{yEtqYy@b7|uAG00P;`~sx5>~~}R`Kx;l^H)o4UhMz z{P;xWiO*7(;l48dcy&#DwYnibUfmY&R#RC!&me3i?t9}a)!g{eYGHg2wKTrFdYSO= z5qAf;Pvfi9KH?lCY|n(lDkFh@p0HaDNN80jU#ZG2?+v1pjNyf`lgZ zDE|K<%=Ux|^%?jt@PCro_c6O1Si-MXFa)ca@oRoa&!sQ^zNH)QL%qBeq-4NJ80hQk)uz z|CiYJ;twWesV9@{>UsRH0$+hy4ZIHjCgOg8*+)7NU|-|5B_B`;$+xTC$senelH1hD z$t~*Cke&7#dFHZhZJ&XGfm{$nDCb>fGBuo==qRFdO zdWu_Rr%+CW&OYq(Q*7#@luC6e@XN4&nc_ggk*IXTZb2B)^DlYpI^x?7!^`i43?m2Z&xmMThZRTrl=squvU1-P41&sMi!PXjiK zc=x4#szUe;!rf1tr%30&Fw0X9sWqwRsdczF5N<2xL(Ip7*@^un>HUD+f{BuET$)WK zr*&7UX*`mdmZ*B9c~mcU9R}h)9^8p(4mAWb6!$4$u;*N8Bsa7I_^s{fX#4EQZs>7;+9vG=K`Nk_=WD%)C1)C zh`YOb4A>I#ej5BU?kcqu`+3aE#Q76u8R1q?hBw_owVJeQ+{4w|?$K&J>1-t22ZY%{ z8lU6egV~4qGw_J}MD-2sgWwJkrWx1~()y8dwgIzshbDKgP#N71sNUV7$GAsyZ&F_1 z<1jz({(~A1>{q~k-TfYQXZPLeZo*Yyhk*YE`?r|I-9J{(c0a6M=>C%WL-#dmC9pTJ z*8zK1-xD+pVId8bE~+R|gR+5!9%%%2H&kZ|8& znt}gF8g003JzG^m&kB{)^E`DzPsVT07FB}(lAgQNxSn6BpY=STCiZMnzrx&(34t?u zwy7}o<2@VI@4>%;*?|8;@QtMR1L-soMx}RGiRlYfxAZKPp6*t?I5nDyorQl$da4=* zemJl*@aF>`nI5Ok#rCBCUR?mJIK5JpruR^nVqb~5D&4EDA~Pq8D^VSjp(I!N5VVVcu@>ImU~O!ufZ!ZY1@y^~*S* z24SC+QK51(-cTolJ2j(Kod#?~#u`;{S{|do%7^ z1A94CR2AFyA;e!ce*wGw+RW*4TB_}^pOGv87@GvP-v@8NEJtIEr4<4*l9H6jz9Gjq4P z5ZE~Eo3L*Ob|>yxnFmxTvxR&1i`9ep9|re$W`%kV`z7G7liu>oQ`K9fwFdvY__t^N zpgttb$AsC7`GPdQ#NSAm1Eldi{w7RI=H03le-xA4$D`bRvQ)1=e4{=#mE9*!orpOL z`1!!D>f=_|;GRsFnSG$mm_@iB!aUZehgyaIZQ{K{*bgwD^r=*z5`G_Pe1rRM*oXQo zR6k<3_35j+_uZ`q_5DVj&==a>7k;wu59-vuM^r&yXg9D6!QYNO9b8r4uhas}gTNMJ z{y>-wz(4E@k3^U+`mRxb#s4k-!+l#-U+%D;*w3wQ#jft>P{DrmlYWWnkC-=s{S8<` z|J^F3e}!^k_w3I%>EEIT^*^9a>i?EHwf}TA3io;anS(K7`nRbYl! zkMIA6`UUZB0)BJV3j&@878QVt)(#2f{RwMl1P8@y88tsQ3XMl{nx5<;LB2 z0CadjqRPe$AHduOY~+CB)w$SL3~;Nfz~4jo`QR1~;M)OP0`6(xFAg|Ptp-+y`G_z( zNaH)gwGDtq4LqQnm;nQsTLylnP90dG@&^8(&K}sJ&KuaIE(AUv*sljRs)~VY)B^ku zV?R!u#o(VE*s5M5>~g}a!|cX10RJ9%+#t7d405V0ULnuMJ#tW`^5H%obI~A=Djj4~ zmkqM337Dz4?*M++Ab48B&BK0@Fw1bSC+<6gveY)r4#Iqj|8wksf@ZK*ufg7n*@xMW zKiTGC{c2M$VQg_N>aw^d)|v2oack5z{5IBgJuw-q-%h}cushUc*s}h+pLN`ec8^+z z-D1yTE!V^vu1US(U`#qH)OySo+}j+xm4mfXe=eU7cDAb1S@)cYiI1;f{nDf!j&D(q zuoL(?{y$^Bjo+;fvvwKIdLxiPTC78su`cPxTA)9sh_%4av9DttF&=X>=2w{8Fn5BR z$@(Ca_=b9nFuzUwSpAN*!gJuB2mT`VOTgb??XUy?F8rSoCjzV`ahCcKe=F;e~8p;~s6yWEuCO8-SLe>x$ZJ2wKm#Yfws$||{1-_WLFA(QN z!mTEadhGYXf13P*`V9a6BP))4(z2Mol{ zNv&Y*(aM@*y1E+wb--@{HUo2~UTZX|1>hdT{RVO0Og*gL1Gj^BRCX-2V=(srr- zY0Qghq?tw?((YCx(x$7CX)US%|2g2!#r<>K*Wtb`tyRq+?47{w0%l+@NMppf5+)Oq(``9xhZZ#o{(eliEak^8!Hmb; z+>N#bcTcywRS36%I}H5MZsd#oTg+n23*C0Bm#|l2zeTv!gxie!Jz($S-;KMGHAZu{ zkJXRermI%`QQ(QLCY9#etp>U()G+Lm@t@*i-HAURy8zf2)(;oDex{0njdy*lX1JJd zTyLnwgnhvUUBq5N*wx^7x?WSC;ogn=JK#TJUUoOZpSP;q?#wOl!PW4{L0(pPC2?hvAQ&!G0OD4)=%fP2a&U{g}c04gV5?-+8uI zi%Lc(&*|_XzTOq^BR2Jm-c6{%Y=Y;22k7lqZ{tpccBf!mnbXw(X#61fhGE#}VJ^Uw zU@ijobL{b$8!~Nba^`vJw#>zv$GA)L7HiaR!Tk>R^Q5&J_xqS#r1>fS2zCSh7Sd_M z4D3Tbn4CUq)X9BztKvQ_>LTo`flUVX%RWu20%PExk9i#YQt;3BS*~8_GhO|mPpeu% zxYgKefPYGu-F;@M{kXrz9Khc~oF7S}m2lBMZ7Q)Z^@PT!^@V0*`u1I;24Du^&Vl9+ z#heQMT>M42FX;P*D#m{?{>j+CBJ2#zEd2N2e;o4!{@-FR2KGE=4gO7-_kn$a*-tuA zOiI5d)u&&D8h||zlhbdvD(Kgu&cR)ReKGd0z~6>F1M@iU-w|dp_6z;isF(UtU&5^d zw+8brxKA*j_nWSo!T$)p6?_}GRQQ2z{iz?OKRm!Gm~)}?CHOA}Hy-W@qbcj|x^Df&r^4UzXx6*gn!<^yWt&}PcTnl7K2+#S}%h8 z1O7Fb_i=wpTAu;`eBg9=i6-?8yvPCUmVw`^#6irZgQzcdpFu5Z;2`=3d_q333kM+s z8MH=S1MFJd;|Vi^Fn7UM%)tclhkzS|{T*Qz<6jE?MPPpf_7e6R#9s|;Gr0FKJAr?W ze>d(%Of#m1a6e+VV%oqbX7yJoS$5?a5>?(I6>2p07;GPQA@=#$W3m0%Mc5Z$Ux;0d zU4nfP_Qlwx*q2~miaiedGVIH-ufYBp_LbN_$G!^tYV2#Uuf@I&dp!08>|bDCk3A9l z2J9QLCt=@&JsJCE>|bKvf_*FYudr{!z8!lC_OG$0Vo$>^!!F0Z1A9954D36x@4~(t zdnWcQ?0c{)uvHGcBqlD$qwG0B<-j;|Cad_I&s72@F=vWO!cNAd*D z)p5i-9y6FY+2nr$=ENMgItkbiOb+g$*twWtIhpEY!kvN{j{7vs>A>@HmZ~!_XW~8! z*x8s7xJP0Na(1Y5ayF__m~)BerLLoMhNv+ZAEuD7=VQj^Oi+Hp7hx_STuDx%x(NGX zOli(=bxF<^btz^X<}$)uj=3TyqJEYWRaatup0kGM_oB)+v_i!V-L33HZOSpUhjL;k z0#5>-3_JyYD)2OHH}LMjdklSD^&C1{r4QYxGKP*)nL`JuK0^nqzC*{Wenai5|IqK$ zz@bSh3;1!sj|V;&csB48fe#^_oS_%1p+mQ++@bfVVMB}6$wNn~Q-d72mYfi2S|R-uvJNvH5+!uit;a@2hZ_IiQ=kbmFcjZr-qEG9P~nsK>%#A+iXY z#e|oD8Q5lm9x#jeY}zA-`gtjT9=s2J8T@kieE0%*Kl}~w#lyap68r>){Z&e7*E0B3 z@T;+3gZ*0U*I{1)eK`1|1>fPWCa8oma8Gx9L?dxZEca8D54N;_<$9d^(Tb#PC@Jq7nP+_P}I z;9h`x5!_7~_K>z=*d}>p*iiZNuz~X0uyEN+_)WrZ5q_I+8D67r;ltN5S`p9{@ivdV^eqze}Rm ziXEH5(VPR(oCDFE1K3^>%{c%+6n+?dG<*#F2>4ihjKW7;^e7n}T_|Isr^(gP$r2Ag z4t_l8CXiQJ_20t77IoP|gPse^9 z{CxNY@C)G=!7ql-g!jN_MYEO~eUW&hLnIH*2e*uRE~lOa)YA`l16(m&30x^$8Qdzk z)zS5`COS^mMmI_Y+>LNI;qTY@yBU9#aJRtS3U?da?Qm6azlXbv^4v{%?x8$?pgbGl z?}fiFx>@e0-5!YUCJ$o&P_$h(MO&nr_!{Cj6aO&rj}ZST@sAPzIPqJEe}ed}_}zxz z?fBh+-#Yjw;h&-mPg90xNwW*?1-KXCcEh~{*8ukl+@Gn_tJLW=>a-W`O}Mx4xeuRj z2Uqpw?VZvV$K0^2?;TFRG zh23|w?=jlz}w*m!(Rq}Is6d#U%_7m zKNNmg%(oI9bCC>>VVxFk6kHtKXt=B4;^D@{%#rai88U&i3HX>8vtAtVN!U(~VGL6~ zXAEOFhA|936@D80bod$YsqilNH2B#u8)OdY(_@&c;pW3Fpxz6q_af?@3Fm>!g3E@> zfy;~8B)*tzSr)TOmg6%&rcMfCqNFfppA^Md#ZQ_WNK=gO5`359y9{m>+-kTraO>bI z;BJJw3H)`;dGec>k#aLHW>gZs1^(8UM7a%qL(JWBJA4)V@8R!)zZ?D@_&>mJgufU5 zKKT3LAAo-lz8by;elvA{m~uWs-5;gyTi~C7-wMACemndQ_&WF};h&smtt;`mt$;F9}^)B#J@uPpNW5!_}7Sko%p{H{|51I z;`c55?gQVZeD9ENBl>%A@6)ay(5@fSt_R>gf%_EhGq{6r&2WE%`#an};J$!64EH76 z5xB45j>5IT{TJMKaL3?|!<~dX1@|LdE8I_T<*^R=GL|*i*m~(c>V#B`N|fEBY;t^5 zlk|;aoefzQ$1^wZ*|-zZ64xd_pv!3fCLeu5MvZO~H~6Q~^|EKQRjwJ+B=3!3T@SQf zT`$*NT`nb8pOD{P-6W3^u0#JAv5aNk$Jm!-%-9oBh1@rmy)@M#@0*dHEnY7 zH4eGt8jD_%QDt{&UH;M;^hLH`_SLXHq_!^h8H zkMaB+IG%NHbjX z@BndNj&GB%#wSWE;fp7HFVPcNlbEnchEJ%MgbAO?M8cCMutqVVm5t}DDWcDSTL3OY zmSeXDejR!_`t9g-IvfL%Mx}=5&A0ZZXqOa04cukYN*9x0+Zk6DA&#MD&!2%xmyP;5x#$ z61M^T<3xvSLf=Z<4y1PCO4&tt4|Xq2Y?3$Oz6F0o+9tNi&!p);iRTrQSd*Q^GgI`5 zlW0#cWzzRDbyAxwLeH3#AqA7_rHHt-aO=TJ@F8R;`X180GijxKjh|M+VTmWCPhy)~ zlE}Jd;wBlI$ofMff4?WPcK}I2X2SWfS&OVsOq5$lb3gJBvJ=~ng? zIovnMx5&?lYb4o0ogG}q9Xt zcX{#&8I#Q4*~qG7o7|dgk$aL`<-X()d4{;>lH25U;yyxJ2w!k*tHfW+eLZr|we?bc z?Fo4o{jcc9(Z9cz`Q|$I{vgrUv0i^&y^KZAx{h@d!fTL^u4|Pq;9IV1k{&7L(i<6+ z(j-@bBU0KV9+`-qn8G=Lo{GK%EJ|Um3cE`9TT)KQ?eI?^+u?SC&!n&)5dNi<-SRTH z7rTALy-nQL=-+@XDK_af^?4aOmAt0bOYBsOOq@y|PHmNGa5KTesTooPw`%GMxdXfp z?m_fT$P=X5irq`-FHdcgHwk}E_$%~pz>B7xkV~emltI%t*QPOtO=JCYnnMz&9g|tp zn8%3sA)yoKzW{+YZpeWiQ`caZc=*nEkcLjRHYR_xn||9Sc;={bY7#~I8oGumVTc+m{z zH@HE_rAR#CiAc(fCYc7Nf{VdC;+7*tNI7!j4ECVR;Q2an4-kG3*@@I5FXDGMxQF<9 z;@={?5801=I^&pp1|BB=uZaH||6!^1(ld3X3`pgf4RR^rk*Vus95_C;NhT1t0DU32 zB=v->PJLe1fNN7J3vxR)cM{%&{u1&ww)?>Ysm!I|KU1ypBV4bUO%gtn^|YC+?ae$P zm(FC}ldumdf?Gqld}h7eLfl65hv2uMKSA8?nIFqu;+khVMYji2rrt&vlOIg7SB1rHOM;bZ=Pk7d*L2L--K+#c00IZ);g($e+j$2 z=%38mB%i~7iF^(J4RVUOpUC4hT$sxu*{*u|EpngBDo?t2rUZ^k5dG#_2em;5u`r3I-vL5{w;x`h00DUXC z5B?kU)1*CrKG&1^^)hrm_y1t@{5Ba6P9i)NS%|Dc)*+S1EyUdhZUi@ByJbG}61WTQ zEquKT?gtMMe+2xB@X7f+Ps8R%u+M@f8MuJ?V*%&Qf_fQ&o`^mle!+t0B?G+xZY|+E z(KjwwBU`~*WDoMvf;M@FxKBviMEEdr1pBX%pOMoGGNi{so}VD+FJwJ>;TpMWA?wkE zM-UzfPFzTy$kc`OHMj&>j-F3^5x5Fjzc54YSlA@@E<7fi7Je*Sh}(*6$9BiUmGUAs zFQdN&w;$X07dqrK!bgy=kk*B}r42lP5%b0(>b!_Gcl2m*BH>Akn2W&~Na`Z4*~Aqf z<;cx^pY2w-+tBY{L_32!ky_*h(!ERE2aBxoSL~Y5zk)x7U9ZL5&n<3~L5s-;j6sH@ zkAxo&PFTzu_+s{0A+yjI5WjFS&t8dJf{hP;`QqoL0NuYhM9Q!!hr1PA@D%tnTv!HU2kD=|{F}jf2PT3uz?txi&=-SCKwn0yg6E#Ib0L+74kK9Cz0?>yCh|@pE;9jdFBaOiC&%AB(D&DBePBRWjf?= zCi}=dA(G&+$P~{BndWiGLXS;~2(Lw|JWcXP_{Tiu@>lSrhdGpZOIEo&o>ea&f|q5V z5KnfiWM{L6j(!)oDVx6;(QD8@$+pX3!rgMpWe9Q&G9kwzPv*2rq?hN6-Zr_`%X+)l zA~%5#dt2oN^f!@a;``<{Nn9>=x#f}u<|3u&zd?S7e3|QzZcEvBxU@;;Esc=$A7c|7>f>68jQ1tVBxEYw48p0tCYkBudgbGKLU=uL3vw%R2R3&i_ha*r zFGDtgJK*1h`vf_NoWlQ);7{;9mhrrG8S@!9d|8_$AQK5EA`6z)Oa8J}DS}%~{F-Gv z%ZA^CY+KeOyWn0XZZEPAZvV26L&nH|&T;=jZax406%U8-4_^sH!MR*_h8Sw{6bBMSm{2eC#OZczB zlY~z#|6YD1+y?#(p2oIEKF{;=%VlW($1)NepU<3cn`BTS^F$%{?chxK zVq_JvzHpONf_D)2P$BbfAA#Jo>9mGJx`?upQsqZbx!l1=D4ik_ExZ1$4wouWi}w`jK|_2AthY*OIUL&VgCT~RSEm@0!?yx;Dp2>qmgL=i`<4( zq2C8yQQ9hFOUuQ9T#uBOvR@b6Rcetxm!6Qnpnp{QyqqN5eFgVcD?;R+73@P;(I#)N zuu0CT=hICgIPJ&yg=le{$9H(u&<_ zBz*NT>9hKf^k2;!gp5O`uCABqt63vJPh0Jfg4J9%(C6;Qh*e# z87-^f*I-u;e+Tl1HCDM7?g{i=$P1)@7u=5=So5)b3LZp0$L34Yom{g?e#BQR<@g!y z^qQ3twwCqcwcK}r7q8{~0!Jc~&{L54=!?KLNcmc>AK2EzeS&<7975XQ!q%}Su#S0j z9rMgOu0!kUW!gIKS>R?8UVtnloPjJOE`J^8)4EeqM*KRs^~B$feg|^rI@WR4u@?&c zLE;|5b{F~!$Zo=Wkb2~8{Com;1pO%af3xn8oFd$YuaNbOL!|$D=J@se?XaHb=HRsT z7Rg`VBt`Id5Pt~%$a*^;<*k=**RyAGJ%7i+oyO*>a@M4f5#?)SBsjL*CKJosWNJCj z(BYPpv-Ss{kE|&_CF=>_j@(6fBk}-tPn5qP+pyh(UJv&sxDR=!oWEhg{pIY7fNw%S zOxmM_zazX~)}D5XoaB=N>iAnl{jt;arxWFLefjB4Xs1Q$S03Xx?~OxFclxhF)bW%0 z=k)s1KkH_bg68emaQYQdktcB|cVcTC?|z+|`*v^XbzTWuBg3V)ghgChd5fHX@a@8X z9Xj;My}NfW%`QCu=-Y=5-n(h{3!^6`AD#ST*z?^NTfT2N9rly_v)9Q#zjgdn?{a6s zfS<4Z)958(r{6pMm)nK}`u-%F?s>l3M~>C@hpZV%BPXsLTYBTI{_z{%yCEdi^2+Jn zy!~~G4{+_5^`}4hZ`A*W;*WkmZ}+et_b0eZQ}*BaiBxDc|4B7euulISjP8{)vNkHS zz%z4ua-UD{I`-@MFJ?ZTA3yKqBmcbdnSJ$Z=I?M_u;hoQUpd(HP~OM$uQ-KeptR zKdpC$TApZW`HAD$u>|92;Sf1?Otrem{{4KVrB7mFpFS$o(4eD;vQbCSuA$*P?Kpk9 zK|5Z3RgYJmmB*HrganmOLc+23<5lh0ZyX5;iHQjbeflUnhC7FzPB(99(XCIP*3Dmi zwU2h-aq*7QVv3wfUZEz^k}bH^LK{w z>1uz0y2M-T^W;w{)Cz@tR=%fjd49HXr5!V-&YV6aY4VI@Bb@ImTs|egD0{iP*tc}4 zw^-4RloS^)30H`nKoG0ZD@@@a52YOqhJ6sLVJi?`ywh?-M%?1Y3WscPO27~t&db0Apv)c!HaZy1QBTN|jX4GHy zr(ccu*dXD`_xK9!vuCC9`2bIjH)n(z3>>MGr;O@?Zs((CCv`{?v{!ues> zOXB0s;ZNhcN~6kgrhF@Xfjqk>CrA69fhXVIu>ikp=PAswPxb`(cEc)jp;SFnWA%C# z76t4jrG9@=aX_^KQSIr6zWdUkp$GgDXDsd5J6HP>nc8AUQ$Q1zZxUb9_$RwnyklWX=a zrao`LKE+euE%tPovt}lf=~9o+?oLWg((B!+JyJ^b{tFf=mAw%dg`U({L;_6639|T8s}Sk zIJGoC;2W-Le;G|U>N2~(*jrLs;LR}{@XZl_ptwYe1KCoLmCg4!_`HYdiyXvf=am*N z&&c-{swC~<63+^6QEskrIqk?BwjJ#4(e|#=7DHw%j4g{@tQTlyr*JTSRHyi0I2a$- zDLxnu#*gk49}EZM$8?GhhJ*1}cZv^&gYjcK#RtQ|_-i`F2gAYm_)hV`a4>#cr}$tv z81Ly69}EZMvpU5G!@>CMPVvETFg~YKd@vl0_jZa8hJ*3Bo#KOG#;Y3q3<2GsJ#2LF zN(Q*u;7nLISYez13}SUl#yUwyVr8eW5v#dW_CbH%!W=EVem^y*I9m&G|HQXx+KsX2 zwC_N9vID*qUME#h-nb{!!gIXs_g|h8ue$BjV@2{j`Pyx$3i}Fkyk(&B@60nWU&j=K zPc?83s1E)5o1@)N&hP}X^Ng%BYxVn;iY5B>I{2NR&RAV%+}C92cCiM!49qkz-tbpt z_-j0e-|W0mlARZaj7G+26mK4n`qB`_RY5RRKQ^V3gp7CKL;&Ms@tI`X7!RDfV zE4=wdes7Q~S?Trqg8}Rdy=8%9buVvl=IG6&dqn!<`HquoY z>HG$!bh2+O*VC1pL-G#rhe8s&>J^3jVW z_Rn6g4L^qcZ3bUu*vCfber_>%n_*vP@V6Q~z#_l6#L9=eBE>BhNslewBb;f@P-n6;%9$Q1k&Z}Pq$|=I z>5PnwbVphulOiJ`(;`D7lOv-d)7|2BxNUBi+v;|@Bi(Md#hv7iaHqLL-O27KcRFuh zJ1jPf%VM=SEs++t#bQaaL|D=+p_XJzlqEe$k{n64Bv+C($(aI{txb%$C)lR_gx(?UZ-lS89I)05e?mTXIQ zC0mo7$&tzKWJ_{Vazt`ka%ggLa#V79ltekAY*DT#Ym_r8GRhrgiAsu!h)RnJjY^J+ zib_wX3)AU_beb}q=18YX=@cs+*Xb&n4!6?THab0$4tLP~PP*R35O9l%w$L=8G*JZ2 z6GdYs(NM`WSQ?E*^U+~eI?G0N$zBn|4Id7U(^izaqQ(EN0`mCm-& z>5+7}gYI|I^)7~hJCfl+gIH+{8;uf4gE(j&Cr#s`iQG{%9|PLTV74)+BN@;RhPRWU z?P7?#9Snau+)8KL==4ZB+(Gv{>3SDKz@5bKU_e?Kj5Y>kBm>gH@N_aXT?|pTli^E; zS?Merofb)lIp{toUFV_;-N|$>Cxn%g!Ny4u$qC`$^l)-&xHv`JE>0f?jFrJ+W6(r0 zU>pn|Cqu`@5OSw6ycp0{2D6Pp9m#-pFua`%Z5Kn_?PmDX;Z{1^MyE&8;SRdrN!Pm= z0`BzmbU)urR7ciQzjkL=l(kG(G?x3n_I1n*DTtj~d;?dU{8iZ~x`Dd>rpBtf2klZM zB>_)hHrM)sI85f~0Toj)s$*F5o9ZjnQ)z$aX&2=nW%vn3t2}X=q1G<7ob>RS`)0#l zBe*{~la6n!2TPZ~DnoL#tG;%>mgCE2DP(5H3ivZdWG!`h^1Upks2UP3@pldv`vTq> zz7lm4sl~4>D$Y3*R!uU;uWa=A?9$?5ZXnw!{+Qg)2oF`vdav9e)~c&cHH8{DjpoAkoBlyUzS!%%@0e+X9(iU)IA!= zpF)~Hbz7Rxcyn(iF(ywDK1M>`wH!#e=mWOn^&d8@frDV1GmvPHbSB*O*&r`V6 zxKGRX6fgDaT~or~5xwyWJbvs8`7?sQ&(!U4@OEA<3%#2!&9H8#{eXmCx$}T|gzb8e z*;F(;D`?*nA|apyR5xZ-pdD0)@}rKqzrB0DLS?7Q>3oiF(`{CvGjZYQk;r!9ws(r_ z4gU=04a7BciaVb;^AWu7GIReg^sr{V{X6@rOw;))13SkD8zI;hD!!_jdTa?1zGZus zd5}={2TbvYO}esCK7xmOKBsgCqWqeV$|pL8o6nIhrITIIhbo6_>lq*BdMIBi9pAnU znzv)!Ir2H&$=2-8_BVWy7vI=z_tUPJ%FxcCsPs0Iz48$}%rZ_)7JNK1J*YF?u zxAGkQ*=(wV@^g~BercSjwhormTz=L5T^*`jHg+-Qv^m?<_rH{<@~gZ%O!g_1`xn#v zhxSlD)uGB!ZSt#;{G;;gZ>p2If7O^$h2i5t; zv%9nWt1%X2&HbRpo%t~PQ)N*3@hsMCqUmNkHCEKP;MwL`c3bGnUu<_Hg{psvHXVvZHO-IqWJs*`=tkX}omEjDS{7Q<{o%_>DE$ zC?749{an{b6|emIO=-;aS7le_WUW`3c6q3nu&2(%o71Z{QtiPS^I2*4Qm#tV^*Lx@ zPOs{y>cbjzFuEPhcFoxNv0?4GJ-)M|Vk%AX)k^Q8y_K(^?+)YFlvepZN%%jt>t0iu z_c+f_dIk+uiWXBkv)?lO zRuab=c+k8ZRb0^4+)m2geC#FMRXZnKVJ4%0~)$>?I9r_h-4ZlcuY7QE7rc%;i^px;hk_ zY0AIs9De=h@S9>vtNaJ^R=P@~;(3;!f*p?PbNFlN!d4|z9%A|XFnE~rQNC0^=XRPs$2sTX&-X;{zw3j^)wlMzzU`%#`>2#t#xF`|KUm449M1}0&LZ}WEe{m= z7ftr9PVuZ(+1N3QW_$C!JhU|PBm6m8MhRGo5GCs9k6bs! zJ%hzc^}mb=u!1rq$EV_Kin}_*;0m<81NLObZo6GU;gHx^alrBFoncodRo8}y+DxeX zTBR?lxTv$T@u?@JL#`%T_&Zk5Gd4Cmmq%F}39G;7M@*T`ugy+LQa05cITlYvwshq9 zMO1zxr2{urOS`Khr`a`h;9Q#B-j1AR*Vut`Yjy`Za++N;+^)HlxmeYUI`Fsfb`}rx z@DNs^^tFdE+&mfF>eZ`rvec8ivKNf{vT(Vl7@@n@)(0Hjj4)N_cXA}G2jQ#|eW|U5GPB^qP}JH=`1ZP5e;Khf*OyZ= zL@kwx*!eCjFoI10*+XJSDJm1L!qUzKhpvkHzd9^Et5~&Cea3W`K5@PLdYbNf8ML?_#1TKcmwy0fdN=%raUMAy57GYSw&TZtiM}5? zYLH&d7*Nfh1BQh1n=i-3nt7i3c@&$gXPqUiC1Fq~Y{q(&3=C)P&>-|YzQdg}% zqrxOAfaG+SD7dJ&h~@!zmY~om&g%ARIi@oEuNT5hTDOxD>GBO+Bw~Kz00RgjE`Kq=G7+bWkxKgI@=#G7Qkq z4Og)I1A3h&y(V{ebu-n;5*a3u^l_xSyF^m|$T*wd(yyoVbB9Yme#pCDT;CR3^Z5ZzaG*r5Gwt0toS|; z-yzbknem{`!9aHj&EecVEb;`>96WbTVM`dl^i*v1pO+b;pX>ORFB!7P16ny~fwMRo z!DOSKyJ6b7tL00dhq}8-HK))4q}iyCIcymeE`tL6W(eE-2Dy94AkOtcaRXcWH}`9> zj0}^J)K8lq$Xgpv>YN$VQ=KogSWlPUzCCDP+IS3YO#5o>_(eBh)BIEH>>a12sVO^ zU?ZfHv+S6QP3g40p#9ZcuC)j4=pS#99Z0_BmwC<{4ps9CzaIoQe8L$UbJ(KJW%?;< zOb^cE^PA}bmxbTA=6eS+`nU9Jj%@7P(B=8ms78mSe^2S3(@XkOzW$W2e_Uis-)6?g zh5S~`7hG4EmwFmw)c;$)xq<}ytwUIA8>_G{Nc_llw! zp5F-=z&SgBaXf%_9uODhxAg5syU}(=yA3|yD(4^X!8yZkhSXT(;>~=w@)dpTn!^@V zes>SKkaOk2xC@#i{I*QJA9@A-otaO*z}MrvKfT2wiTyL$7(OMOu+vMp|=Nn@8ffD!7<)`$AYT~i%wesssT1Qh zbMOG#hjK?UKGc}B?X*Z5a`B&4Td4DvYi0+IYo$4CjAch1=@9+;%h)o9l@0w<2lqnI z#z?2adyx%Vexk*j!{#)4xwSbjb1>h@?rW5}pV(haPnTP0eGB>QW z1wTM09eM6=%ywFvapU@&MTR0nwEG&a0j99l9ywY+8uJc*pQrDTFN`vF2rHk*!^Fk! z96ySDXv|IKu%-KX()}i`OfJS?6!#FvyGidas7Ii;wD9ZUr;zy9Xs1iM$t52$AH8-y z<0f3=v-ViTsp5n>5+}qd`!l?B3ajzey`x{MXwJvdGgNwJb!*hGmc})fGKGF|zSPxQ z|SHwljmYwXsb<>1n$eYvU+@-57RB^`^h6SMRtUE#3Xh z4=TNz`Q)HQPJB+?|6;TU^Nb1)YvQ`EIP&crHm9)+;(p^Y?OvlXvO&8Wb@ky=JK$pS zdy2doLmSTXhq%<=4Jr5gf^?0 zQ2*PbLiu>Ur#%1R1yUOrDE*K3729hUNm$MRiEUxNL5>=}%wcU#ZRyr*Z4A-Rsn^29 z@g3JvB>oNR$?uq4;%5Af3DvkOk1^&IueEb`QQ;zFp5iD&=dkkAo`!g{Z{wcGIG1}$ z3qDVEI8=e&e3;!`_nFo%_x(o|CA&hIEr5$HQr_3pn>W#bFcX?ki4k zAJU@i757@C7XB1He6Lkok(`eVG&Fb$|^|xzp>3LT-{e0nGp)Nc`enb{&emJi? zaeA6?mB#qHvyb$A3SIr}dz0al`yK7?SH)$)h4YPt*)OB;iJ`bL`@ z#`IA0gDQhd>w~z^7BxE#?$=HFF+RfsTyMwl`*?%-yXCSFalfhBk@^$Ykz=o}$ws@c zAnk=*i!S8abYYy$WeKr}8oz@t>LwQjtlW#AM}0%Y5gQ^t2n5onN$VFLw{- zGWt#{QOAGMjQu!wy{*@OFwsg-1jR%cMRa3zAt~*BC+Vr z@D1oLPCr`|_WeK>l5C&@AB`8nVN;DwGh#=o;9ZDKabPUcf@BhQAhC!bn<>Xr$g9Xl z$Ul)Eklycv$RK1ml8DSfJjhC91F{*}jl72(K~5pP-VKq9kWok~l7p;4{)E&ady&tO z<48DbZbOkN2)!xlFLAYpw3~EiO_ci%-m_P)_Mgwns@hlDS1!=@miChiS-%?~1LY#Q zSS}I1iZ6CCtp|_D$@I!z z3jL)4dQj~RG&|${b)GtOpwvL=(g#b>UGgQ_oyziR#_if+D7lFzlvel=!{bzFc2+2D@T&^3_JyNyHbEnKspQ+v;Z_m5G@Nodz6=h@>QSQQw z6}fD1E)3*KqGXhK^D=UM`O3MvcJvpF3Uhr+scc4}hqhXo!3N(Ie8O9mhga(<(dzan zUjFm(K6C-Qv-xAHgGCX$vweY#fcpA?NP=W=eW1$ZW5lR3YM;coOqgxG*`)z*FiKA} zh_X;0njc5fkC3LQzECAmog>$r(KEc_@%x4slniIT^>9)S&+~fx!}CWCA2rJ@zeUe1z4z_pYn@=a5IXEcwO&WqfW_uD1;|mdsNI^ zUvZ$+lb>Elv2sN23QaH62TD$IS+>`&n&4Wk14L$r@*e6rqx*zh=M7BJ_rkl1i?Y2u zX!D1BQuXDKAQx**E9JWfE^o2+LVIC0 zHKS!1$hNa{oSGw%Cf1#&E)m(;TIXFwhyW~>J5Mtb%QcJdG^fY8KdL$vyt_-DP?6OE?U{%V#2)<=U!Rawd&MJ z(N8=Ul@ql0+Wq>|#o*NO{}hAIb>cQR4Zk;9_=cwa{oD^vpH}z5Y9=0O@0gw9)ls)c zd#ov$2FC8z!_6=1SYe?5B|R(#witF5238w(d9(F>;fFiz3m=h~G&c~OZ5({>vWs{= zP*a$r-p6$W?*cG1j;`$W*9nYXEbf@73;T55BA!(^D>qkrA;pnwdPBHlT9suN>F1_q zWsi0wCdHO{a&yPVW#x=JJK4F?jrt#^yZV2aZj|=DhOuMLnY^p|sc%f2Gr=$QLsoX| z|0JE$o9p4T5;W_%Q+HKP62zT5gCNWq{B&M|JCyc_>Z=Zb2vuF5wj_|CjTy;)P}%^%e% zGrg&`f4fSbI7Gc$6|UDwC#^B3yV-aDpg zxvPABX-4hJeunuQ4(Dhmqgek7|DgqJtTpiy7ozrGsdcM65cMpz3JmTkQur~l2VUU; zq!GOZ?8iEkdOq9C`qLEFv{YKPw$+Cm zx?2Cbk##dG&#~0{Sq-9mwy<_~(Lg;f2e{nOE5L1rUU!kmbbfv>E0ay+RN26S^P#8=~?x?;}$Ci+VS(=EpuDg;yYB&||@|udo*n-2n#o z5SjM~sl7tyzsld&*eLWMRp<)WBafgfycgMpUJV9b7ukz$`wNfY5Y^_5VA~rkOT)`v zksH{5a~xgm%lY6f_P?-~rx~32w%!*m@UwTYQ9O9dyL!Ek5u=l_8_B8LmQTuTIg#^e;;VEPTx_Lj1+I#aXvISn@vqv~Dlny?7)X>44 zuXSDFPv7dg!a*&%u5f~(E6n>ZomaRKX~d^_PmbEFGv+&yqwoqhAE&?A|567Y|A8@& zE+<6(iD=^r{QF6xAAc0N22p+C0Qo$$#A2^-#%bNA1$-)!XH@X!JvnNxP62yu^57NT zgseqZcn`7x-Ms%s?aQgUkmqmk3jc^Spl9-1&z6gL-mJzO*l>xiH-f(!WRXT}_%@;} zL{vHXexXc2lx`nvk!^^Y2l)P=R9(j2A9RHqFV}7OE~0#cC>y?sC@&$(Ci4o5e1<5# z8C-Cs!GpP1>AZPAklH77$xwbXlJY2=i?pEgT}Xb<)bJ0!ged=fKa$^!G|I{EtlfvG zy!dXSj2>>}JA!AwBXync8A|V1J*^F_G<5SmA+^uw;W&OLmFMmXZ-}?Z7<7d(d@^8lnv3^3cP8e-Y-?))01?)0er$? z(dGfy6zV#I{v)lzZ|CZI3;5jidOKv!qsWc>i_jo8tvmRsbpe9kq_g*tF(fnJ7K@DoI9H}IxHqYU7dBHhN}r;dEfJr+NHa8!v! z643chk}OA5IqSfGuHZMQm@8VqMXPzvtZdfsn+%BZ-v};PtLvFy>N?%O3%qi@?mrgf zdr_KyTLt?kZqoau5q$V&_9@}B5zPIq?#H}8OYPgLsbqX(qwpwM2idfl#e7ms4`cBPyJpmX9GCvZpH@Zrg_ho+6(r3WEXiUtU=yJ zuLH;aQ7^v(Y}%-oKl48Jsvz3+?tY6zBP!omu-gO71El3!P4Zhrm7xy2@ge$-wygqJ zY|{I&0-RCJUIFY|6xLYeC#8eIJ!1-s9%c-%*Gl1yNIbg#5zbje?fYo~7e1<&ArrJd zX6WFz>={eJ-nucT*ruKQ1tM`+X4I70YAkUyH{04aq-Mp_$?f3E{&F~6uMNXnufkU3= z9AW=cEch&r(gzQUR~<8)PH8!d9dX-Mn{8?dkd*(g3gU6!M|6dH&4)EwzuU4rzf`_zq%aPg5f} zW0!GWgTcLA3hQ3v+`&fS(cSbHx_Lj9c|Vrgmv!sQ)C(Jht;kw*g+uGs;@^9Y}w4^BySk{wVX_DYd8ScSt7o3O67D zbcH98-=Hh(_A2E>H}82;`=@@7Y=>7^`xnL!y29RX=(@tk4PD{OhOThwUgihv75))X zX*D$T*TAF5NqF-TWL`EmLbUEyuWJ?IK+kw?(|-_!p;=xyRS#eLI{y3TjjsOI(%zO!Q0br<+eDE$C$-e0BmSY1)LeK+we_0 z*=gwJeO79})w{iUR*WBod|OY}qAM&ppScj7@8`+i5$*4BaCRSE=X-ndXG3oU<7_(b z05=;t-=dSD5jxLz=Hv-O=i72Jw6DQ~PZ&Diw3DG17(BSe(CfgwNX8)L;roKZw*+Mi zxn>&dqPxH=?7Gib@Q%Us9efq|E~3Vac@LM`@3jHR#75yq$XaxT z>6eoZy%Fp_jI`)B@ad7{`y%;*iLoKtxoqCgrS^GUJc{~auW%P~0KEa+6sM12^L{S1 z&nsp$V;LKTBapDSs4w{IF?yM+z@t~|x{PIi8qyz|81Q;Tog?$W4Ti38@ipX+O(ysr zqTWk62uAUH#Om*${@@HlSLiYH9B_l7E37f}N5If=>?`8>8wSQB%8$YshOY1rh$_!U z&@-Mm%8&!LAw$q*0*ELZg|iIZ1#U9*YVdhP`QHVGCFr`s(G#gFe#U^$Asf(lfjcI# zzYe_)v?l81RG5UQIo1jGOhU)T4tghJgYE|}o^Iwqp4d~?8ZL$3tiN0grr!9h-4 zS9@I_MU?#((2}h0@rwoH5F0)npn8X@k#23mt9;`Qj{AQ&K{ugo|1wQ zD@I*uFYpxla(P-f*PI)!?Dm8}acN0lDjSvzZcW^7#VCg0%!F`7le!JJ9K4DRZVqGbIswJ zmYS0_nVa)A`!|t| zN{y>#UQK3AUX8z|tfrzy`P+!cEj4vDyJ{M0_SQ7k9BB71o5MESHuv9b-+a~P*v;{q z9h*}&yEf0;+*Q6QTU}e{ZOz=8x7EM3Y-`2V%B@vfH*T%ox@BwK)?Hhxwr$*2y=}|3 zx^26*HEi3vt#R9dZOz*bZ)@3>vfZ_P-u8;^mD{VfZ`@wJearT`?Yp)&Y~Q;*eura6 z$`03#ydC}>WjiW%RPLzSv2jQBj>9`zcF4}Ko&9&(cgF6F-P-p;a}6+5eT zZrr(LXWh<*oqKm4*x9_ZW#`GAVYRked+k-V@wJXxSM9voyjp*4MQvs6#@g!Iy4qc} zdutnOn`;l(o~)(qs<|Hk_;}G{yB=$JZ0}=@j~#fd`LV-~&D-MNQnp2Xk6<3r@zsv% zlxkP?yz0#AylQ`SS#?EqWp!0`U3GJ{jW({NEl<|O(m&Ok4{WwQ9RG0H!_^NTcsT44 f$0HSwG(QsmXxXE6kA^*#@|gdz>c>=uzkK{3c#yrD