Skip to content

Commit

Permalink
Initial AmigaOS library selection support + simple unit test
Browse files Browse the repository at this point in the history
  • Loading branch information
nemerle committed Mar 8, 2016
1 parent 6418f6a commit 0d35e30
Show file tree
Hide file tree
Showing 5 changed files with 162 additions and 12 deletions.
52 changes: 43 additions & 9 deletions src/Environments/AmigaOS.Design/AmigaOSProperties.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

21 changes: 20 additions & 1 deletion src/Environments/AmigaOS.Design/AmigaOSProperties.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,28 @@ namespace Reko.Environments.AmigaOS.Design
{
public partial class AmigaOSProperties : UserControl
{
public AmigaOSProperties()
private AmigaOSPropertiesInteractor myInteractor;
public AmigaOSProperties(AmigaOSPropertiesInteractor interactor)
{
InitializeComponent();
myInteractor = interactor;
List<int> klist = myInteractor.getAvailableKickstarts();
foreach(int kick_ver in klist)
this.cmbKickstartVersions.Items.Add(String.Format("Kickstart {0}",kick_ver));
this.cmbKickstartVersions.SelectedIndex = 0;
}
private void onSelectedItemChanged(object sender, EventArgs e)
{
ComboBox src_cmb = (ComboBox)sender;
int idx_in_list = src_cmb.SelectedIndex;
if (idx_in_list >= 0)
{
List<int> klist = myInteractor.getAvailableKickstarts();
List<String> libList = myInteractor.GetLibrariesForKickstart(klist.ElementAt(idx_in_list));
this.lstLoadedLibs.Items.Clear();
foreach(String lib in libList)
this.lstLoadedLibs.Items.Add(lib); //$TODO: mark available library definition files ?
}
}
}
}
11 changes: 10 additions & 1 deletion src/Environments/AmigaOS.Design/AmigaOSPropertiesInteractor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ public AmigaOSPropertiesInteractor(AmigaOSPlatform platform)

public Control CreateControl()
{
Control = new AmigaOSProperties();
Control = new AmigaOSProperties(this);
return Control;
}

Expand All @@ -59,5 +59,14 @@ public void Close()
}
}

internal List<int> getAvailableKickstarts()
{
return AmigaOSPlatform.MapKickstartToListOfLibraries.Keys.ToList();
}

internal List<string> GetLibrariesForKickstart(int v)
{
return platform.GetLibrarySetForKickstartVersion(v);
}
}
}
75 changes: 74 additions & 1 deletion src/Environments/AmigaOS/AmigaOSPlatform.cs
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,30 @@ namespace Reko.Environments.AmigaOS
public class AmigaOSPlatform : Platform
{
private RtlInstructionMatcher a6Pattern;
private Dictionary<int, SystemService> funcs;
private Dictionary<int, SystemService> funcs; //$TODO: This should take a type of base pointer the reference is from ?
private static Dictionary<int, List<String>> mapKickstartToListOfLibraries = new Dictionary<int, List<String>>
{
{
33, new List<String>
{
"exec_v33",
"dos_v33"
}
},
{
34, new List<String>
{
"exec_v34",
"dos_v34"
}
}
}; //$TODO: Load available kickstart -> libraries mappings from disk ?

public static Dictionary<int, List<String>> MapKickstartToListOfLibraries {
get {
return mapKickstartToListOfLibraries;
}
}

public AmigaOSPlatform(IServiceProvider services, IProcessorArchitecture arch)
: base(services, arch, "amigaOS")
Expand Down Expand Up @@ -89,7 +112,57 @@ public override SystemService FindService(RtlInstruction rtl, ProcessorState sta
SystemService svc;
return funcs.TryGetValue(offset, out svc) ? svc : null;
}
private String GetLibraryBaseName(String name_with_version)
{
int idx_of_version_str = name_with_version.IndexOf("_v");
if (-1 == idx_of_version_str) // no version, assuming the base name of library is same as name_with_version
return name_with_version;
return name_with_version.Substring(0, idx_of_version_str);
}
/// <summary>
/// Gets the list of libraries for given kickstart version.
/// </summary>
/// <returns>The library list for kickstart version.</returns>
/// <remarks> This will always try to build maximum list of libraries, using older versions where possible </remarks>
/// <param name="ver">Kickstart version</param>
public List<String> GetLibrarySetForKickstartVersion(int ver)
{
//$TODO: needs cleanup ?
var result_list = new List<String>();
var selected_librarties = new Dictionary<String,String>();

var keys = mapKickstartToListOfLibraries.Keys.ToList();
keys.Sort ();

int idx_version_to_select = keys.BinarySearch(ver);
if (idx_version_to_select<0)
{
int next_larger_idx = ~idx_version_to_select;
// if ver > highest available - use highest available
if (next_larger_idx == keys.Count)
idx_version_to_select = keys.Count - 1;
// if ver < lowest available - return empty list
else if (next_larger_idx == 0)
return result_list;
}
for (int ver_idx = idx_version_to_select; ver_idx >= 0; --ver_idx)
{
int try_version = keys.ElementAt(ver_idx);
foreach(String lib in mapKickstartToListOfLibraries[try_version])
{
String base_libname = GetLibraryBaseName(lib);
if (selected_librarties.ContainsKey(base_libname))
continue;
selected_librarties.Add(base_libname, lib);
}
}
return selected_librarties.Values.ToList();
}
public void SetKickstartVersion(int v)
{
List<String> lib_list = GetLibrarySetForKickstartVersion (v);

}
public override string DefaultCallingConvention
{
get { return ""; }
Expand Down
15 changes: 15 additions & 0 deletions src/UnitTests/Environments/AmigaOS/AmigaOSPlatformTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,22 @@ public void AOS_LookupA6Call()
Assert.AreEqual("d0", svc.Signature.Parameters[1].Storage.ToString());
mr.VerifyAll();
}
[Test]
public void AOS_LibrarySelection()
{
mr.ReplayAll();
When_Create_Platform();
var libs_v0 = platform.GetLibrarySetForKickstartVersion(0);
var libs_v33 = platform.GetLibrarySetForKickstartVersion(33);
var libs_v34 = platform.GetLibrarySetForKickstartVersion(34);
var libs_v999 = platform.GetLibrarySetForKickstartVersion(999);

Assert.AreEqual(0, libs_v0.Count);
Assert.IsTrue (libs_v33.Contains ("exec_v33"));
Assert.IsTrue (libs_v34.Contains ("exec_v34"));
Assert.IsTrue (libs_v999.Contains ("exec_v34")); //TODO: should select version from highest availalbe kickstart version
mr.VerifyAll();
}
private void Given_Func(string fileContents)
{
var stm = new MemoryStream(Encoding.ASCII.GetBytes(fileContents));
Expand Down

0 comments on commit 0d35e30

Please sign in to comment.