Merge remote-tracking branch 'refs/remotes/origin/dev'

This commit is contained in:
arookas 2016-03-02 02:55:26 -05:00
commit 33fb3886de
6 changed files with 58 additions and 92 deletions

View file

@ -1,16 +0,0 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
[assembly: AssemblyTitle("SSC")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("SSC")]
[assembly: AssemblyCopyright("Copyright © 2015")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
[assembly: ComVisible(false)]
[assembly: Guid("1e643680-49e4-44b9-be23-6df4ce5017db")]
[assembly: AssemblyVersion("0.1.0.0")]
[assembly: AssemblyFileVersion("0.1.0.0")]

View file

@ -1,6 +1,7 @@
# ssc
![SunScript ST3 syntax preview](http://i.imgur.com/YHChKwd.png)
> Preview of [the standard library](stdlib/talk.sun) in Sublime Text 3 using the included [syntax script](sunscript.sublime-syntax).
## Summary
@ -50,8 +51,8 @@ All dependencies must be placed in the _lib-dir_ folder (see below), unless stat
|[arookas library](https://github.com/arookas/arookas)|Preferably, the library should be built in the same configuration as _ssc_ (e.g. debug, release).|
|[Grammatica 1.6](http://grammatica.percederberg.net/)|Already included in the repository.|
_**Note:** A Java runtime compatible with JDK 1.5 is required for generating the Grammatica parser classes during compilation.
For more information, see Grammatica's official [installation documentation](http://grammatica.percederberg.net/doc/release/install.html)._
> A Java runtime compatible with JDK 1.5 is required for generating the Grammatica parser classes during compilation.
> For more information, see Grammatica's official [installation documentation](http://grammatica.percederberg.net/doc/release/install.html).
### premake

View file

@ -1,15 +0,0 @@
using System.Reflection;
using System.Runtime.InteropServices;
[assembly: AssemblyTitle("sbdump")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("arookas")]
[assembly: AssemblyProduct("sbdump")]
[assembly: AssemblyCopyright("Copyright © 2015 arookas")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
[assembly: ComVisible(false)]
[assembly: Guid("e2610ef0-cb2d-4f90-a18a-a2e7db316202")]
[assembly: AssemblyVersion("0.1.0.0")]
[assembly: AssemblyFileVersion("0.1.0.0")]

View file

@ -9,10 +9,10 @@ namespace arookas {
static CommandLineSettings sSettings;
static aBinaryReader sReader;
static TextWriter sWriter;
static uint sTextOffset, sDataOffset, sDynsymOffset;
static int sDataCount, sDynsymCount, sBssCount;
static uint sTextOffset, sDataOffset, sSymOffset;
static int sDataCount, sSymCount, sVarCount;
const string cTitle = "sbdump v0.1 arookas";
const string cTitle = "sbdump arookas";
static readonly string[] sSymbolTypes = { "builtin", "function", "var", };
static readonly string[] sCommandNames = {
"int", "flt", "str", "adr", "var", "nop", "inc", "dec",
@ -44,11 +44,11 @@ namespace arookas {
if (sSettings.OutputData) {
WriteData();
}
if (sSettings.OutputDynsym) {
WriteDynsym();
if (sSettings.OutputSym) {
WriteSym();
}
if (sSettings.OutputBss) {
WriteBss();
if (sSettings.OutputVars) {
WriteVars();
}
Console.WriteLine("Closing output file...");
}
@ -88,9 +88,9 @@ namespace arookas {
sTextOffset = sReader.Read32();
sDataOffset = sReader.Read32();
sDataCount = sReader.ReadS32();
sDynsymOffset = sReader.Read32();
sDynsymCount = sReader.ReadS32();
sBssCount = sReader.ReadS32();
sSymOffset = sReader.Read32();
sSymCount = sReader.ReadS32();
sVarCount = sReader.ReadS32();
}
static void WriteHeader() {
Console.WriteLine("Outputting header...");
@ -98,17 +98,17 @@ namespace arookas {
sWriter.WriteLine("# .text offset : {0:X8}", sTextOffset);
sWriter.WriteLine("# .data offset : {0:X8}", sDataOffset);
sWriter.WriteLine("# .data count : {0}", sDataCount);
sWriter.WriteLine("# .dynsym offset : {0:X8}", sDynsymOffset);
sWriter.WriteLine("# .dynsym count : {0}", sDynsymCount);
sWriter.WriteLine("# .bss count : {0}", sBssCount);
sWriter.WriteLine("# .sym offset : {0:X8}", sSymOffset);
sWriter.WriteLine("# .sym count : {0}", sSymCount);
sWriter.WriteLine("# var count : {0}", sVarCount);
sWriter.WriteLine();
}
static void WriteText() {
Console.WriteLine("Outputting .text...");
sWriter.WriteLine(".text");
WriteText(0u);
var symbols = new Symbol[sDynsymCount];
for (var i = 0; i < sDynsymCount; ++i) {
var symbols = new Symbol[sSymCount];
for (var i = 0; i < sSymCount; ++i) {
symbols[i] = FetchSymbol(i);
}
foreach (var symbol in symbols.Where(i => i.Type == SymbolType.Function).OrderBy(i => i.Data)) {
@ -120,10 +120,12 @@ namespace arookas {
byte command;
sReader.Keep();
sReader.Goto(sTextOffset + ofs);
var maxofs = 0u;
do {
var pos = sReader.Position - sTextOffset;
command = sReader.Read8();
sWriter.Write(" {0:X8} {1}", pos, sCommandNames[command]);
var nextofs = 0u;
switch (command) {
case 0x00: sWriter.Write(" {0}", sReader.ReadS32()); break;
case 0x01: sWriter.Write(" {0}", sReader.ReadF32()); break;
@ -157,12 +159,14 @@ namespace arookas {
case 0x1D: sWriter.Write(" {0}, {1}", FetchSymbolName(FetchSymbol(sReader.ReadS32())), sReader.ReadS32()); break;
case 0x1E: sWriter.Write(" {0}", sReader.ReadS32()); break;
case 0x1F: sWriter.Write(" {0}", sReader.ReadS32()); break;
case 0x22: WriteJmp(ofs); break;
case 0x23: WriteJmp(ofs); break;
case 0x22: nextofs = WriteJmp(ofs); break;
case 0x23: nextofs = WriteJmp(ofs); break;
}
sWriter.WriteLine();
} while (command != 0x21 && command != 0x27);
if (nextofs > maxofs) {
maxofs = nextofs;
}
} while (!IsReturnCommand(command) || sReader.Position <= sTextOffset + maxofs);
sWriter.WriteLine();
sReader.Back();
}
@ -191,34 +195,34 @@ namespace arookas {
Console.WriteLine("Outputting .data...");
sWriter.WriteLine(".data");
sReader.Goto(sDataOffset);
for (int i = 0; i < sDataCount; ++i) {
for (var i = 0; i < sDataCount; ++i) {
var ofs = sReader.Read32();
var data = FetchDataValue(ofs);
sWriter.WriteLine(" .string \"{0}\"", data);
}
sWriter.WriteLine();
}
static void WriteDynsym() {
Console.WriteLine("Outputting .dynsym...");
sWriter.WriteLine(".dynsym");
sReader.Goto(sDynsymOffset);
for (int i = 0; i < sDynsymCount; ++i) {
static void WriteSym() {
Console.WriteLine("Outputting .sym...");
sWriter.WriteLine(".sym");
sReader.Goto(sSymOffset);
for (var i = 0; i < sSymCount; ++i) {
var symbol = new Symbol(sReader);
var name = FetchSymbolName(symbol);
sWriter.WriteLine(" .{0} {1}", sSymbolTypes[(int)symbol.Type], name);
}
sWriter.WriteLine();
}
static void WriteBss() {
Console.WriteLine("Outputting .bss...");
sWriter.WriteLine(".bss");
for (int i = 0; i < sBssCount; ++i) {
static void WriteVars() {
Console.WriteLine("Outputting variables...");
sWriter.WriteLine("# variables:");
for (var i = 0; i < sVarCount; ++i) {
var symbol = FetchSymbol(j => j.Type == SymbolType.Variable && j.Data == i);
if (symbol != null) {
sWriter.WriteLine(" .var {0}", FetchSymbolName(symbol));
sWriter.WriteLine("# {0}", FetchSymbolName(symbol));
}
else {
sWriter.WriteLine(" .var");
sWriter.WriteLine("# (NULL)");
}
}
sWriter.WriteLine();
@ -233,7 +237,7 @@ namespace arookas {
}
static string FetchDataValue(int i) {
if (i < 0 || i >= sDataCount) {
return "null";
return "(NULL)";
}
return FetchDataValue(FetchData(i));
}
@ -246,7 +250,7 @@ namespace arookas {
}
static Symbol FetchSymbol(int i) {
sReader.Keep();
sReader.Goto(sDynsymOffset + (20 * i));
sReader.Goto(sSymOffset + (20 * i));
var symbol = new Symbol(sReader);
sReader.Back();
return symbol;
@ -257,8 +261,8 @@ namespace arookas {
}
Symbol found = null;
sReader.Keep();
sReader.Goto(sDynsymOffset);
for (int i = 0; i < sDynsymCount; ++i) {
sReader.Goto(sSymOffset);
for (var i = 0; i < sSymCount; ++i) {
var symbol = new Symbol(sReader);
if (predicate(symbol)) {
found = symbol;
@ -270,10 +274,18 @@ namespace arookas {
}
static string FetchSymbolName(Symbol symbol) {
sReader.Keep();
sReader.Goto(sDynsymOffset + (20 * sDynsymCount) + symbol.StringOffset);
sReader.Goto(sSymOffset + (20 * sSymCount) + symbol.StringOffset);
var name = sReader.ReadString<aZSTR>();
sReader.Back();
return name;
}
static bool IsReturnCommand(byte cmd) {
return (
cmd == 0x20 || // ret
cmd == 0x21 || // ret0
cmd == 0x27 // end
);
}
}
}

View file

@ -4,15 +4,15 @@ using System.IO;
namespace arookas {
class CommandLineSettings {
string mInput, mOutput;
bool mOutputHeader, mOutputText, mOutputData, mOutputDynsym, mOutputBss;
bool mOutputHeader, mOutputText, mOutputData, mOutputSym, mOutputVars;
public string Input { get { return mInput; } }
public string Output { get { return mOutput; } }
public bool OutputHeader { get { return mOutputHeader; } }
public bool OutputText { get { return mOutputText; } }
public bool OutputData { get { return mOutputData; } }
public bool OutputDynsym { get { return mOutputDynsym; } }
public bool OutputBss { get { return mOutputBss; } }
public bool OutputSym { get { return mOutputSym; } }
public bool OutputVars { get { return mOutputVars; } }
public CommandLineSettings(aCommandLine cmd) {
if (cmd == null) {
@ -28,10 +28,10 @@ namespace arookas {
case "-t": mOutputText = false; continue;
case "-D": mOutputData = true; continue;
case "-d": mOutputData = false; continue;
case "-S": mOutputDynsym = true; continue;
case "-s": mOutputDynsym = false; continue;
case "-B": mOutputBss = true; continue;
case "-b": mOutputBss = false; continue;
case "-S": mOutputSym = true; continue;
case "-s": mOutputSym = false; continue;
case "-V": mOutputVars = true; continue;
case "-v": mOutputVars = false; continue;
}
}
if (mInput == null) {

View file

@ -1,16 +0,0 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
[assembly: AssemblyTitle("ssc")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("ssc")]
[assembly: AssemblyCopyright("Copyright © 2015 arookas")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
[assembly: ComVisible(false)]
[assembly: Guid("5413c8e1-aefa-43bc-9fe5-c95f221da8c5")]
[assembly: AssemblyVersion("0.1.0.0")]
[assembly: AssemblyFileVersion("0.1.0.0")]