holy shit thats a lot of changed to asmrigs
This commit is contained in:
132
asmrigs/as/as.cpp
Normal file
132
asmrigs/as/as.cpp
Normal file
@@ -0,0 +1,132 @@
|
||||
#include "asmrigs/as.h"
|
||||
#include "tier2/tokenizer.h"
|
||||
#include "asmrigs/tokenparser.h"
|
||||
|
||||
struct ObjectHeader_t
|
||||
{
|
||||
uint8_t m_magic[4];
|
||||
uint32_t m_uSymbolCount;
|
||||
uint32_t m_uDatasCount;
|
||||
};
|
||||
|
||||
enum EDataFlags: uint32_t
|
||||
{
|
||||
DATA_TYPE_DECLARE,
|
||||
DATA_TYPE_USED,
|
||||
};
|
||||
|
||||
struct Data_t
|
||||
{
|
||||
uint64_t m_uDataSize;
|
||||
uint64_t m_uDataOffsetSize;
|
||||
};
|
||||
|
||||
struct Symbol_t
|
||||
{
|
||||
uint32_t m_uName;
|
||||
uint32_t m_uData;
|
||||
EDataFlags m_eDataFlags;
|
||||
};
|
||||
|
||||
enum EInstruction: uint8_t
|
||||
{
|
||||
I_NOP = 0,
|
||||
|
||||
I_PUSH = 3,
|
||||
I_POP = 4,
|
||||
|
||||
I_CMP = 5,
|
||||
|
||||
I_JUMP = 6,
|
||||
I_JZ = 7,
|
||||
I_JNZ = 8,
|
||||
I_JG = 9,
|
||||
I_JGE = 10,
|
||||
I_JLE = 11,
|
||||
|
||||
I_LOAD = 12,
|
||||
I_STORE = 13,
|
||||
I_LOADPTR = 14,
|
||||
I_STOREPTR = 15,
|
||||
I_LOADLIT = 16,
|
||||
|
||||
I_JSR = 20,
|
||||
I_RET = 21,
|
||||
};
|
||||
|
||||
CUtlBuffer<uint8_t> Assemble( const char *szAssembly, AsOptions_t stOptions )
|
||||
{
|
||||
CUtlVector<CUtlString> externalFunctions;
|
||||
CUtlVector<CUtlString> publicFunctions;
|
||||
CUtlVector<CUtlString> labels;
|
||||
CUtlVector<Token_t> tokens = Tokenize(szAssembly);
|
||||
Token_t *pTokens = tokens.GetData();
|
||||
for ( int i = 0; i < tokens.GetSize()-2; )
|
||||
{
|
||||
if ( !tokens[i].m_bIsQuoted && tokens[i].m_szValue == "/" )
|
||||
if ( !tokens[i+1].m_bIsQuoted && tokens[i+1].m_szValue == "/" )
|
||||
if ( !tokens[i+2].m_bIsQuoted && tokens[i+2].m_szValue == "/" )
|
||||
{
|
||||
tokens.RemoveAt(i, 3);
|
||||
continue;
|
||||
}
|
||||
i++;
|
||||
};
|
||||
CTokenParser parser;
|
||||
parser.m_pTokens = tokens.GetData();
|
||||
parser.m_pTokensEnd = tokens.GetData()+tokens.GetSize();
|
||||
parser.m_pCurrentToken = tokens.GetData()-1;
|
||||
parser.Continue();
|
||||
|
||||
CUtlVector<uint8_t> commandStream;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
if (parser.IsEOF())
|
||||
break;
|
||||
CUtlString szCommand = parser.PeekToken();
|
||||
parser.Continue();
|
||||
if ( szCommand == "extrn" )
|
||||
{
|
||||
externalFunctions.AppendTail(parser.PeekToken());
|
||||
parser.Continue();
|
||||
continue;
|
||||
}
|
||||
if ( szCommand == "public" )
|
||||
{
|
||||
publicFunctions.AppendTail(parser.PeekToken());
|
||||
parser.Continue();
|
||||
continue;
|
||||
}
|
||||
if ( szCommand == "store" )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ( szCommand == "load" )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ( szCommand == "jsr" )
|
||||
{
|
||||
commandStream.AppendTail(I_JSR);
|
||||
continue;
|
||||
}
|
||||
if ( szCommand == "ret" )
|
||||
{
|
||||
commandStream.AppendTail(I_RET);
|
||||
continue;
|
||||
}
|
||||
if (parser.IsEOF())
|
||||
break;
|
||||
if (!V_strcmp(parser.PeekToken(), ":"))
|
||||
{
|
||||
parser.Continue();
|
||||
labels.AppendTail("");
|
||||
}
|
||||
else
|
||||
{
|
||||
V_printf("%s is not a valid instuction or label\n", szCommand.GetString());
|
||||
}
|
||||
}
|
||||
return {};
|
||||
};
|
||||
Reference in New Issue
Block a user