Skip to content

Instantly share code, notes, and snippets.

@ErisianArchitect
Created December 17, 2011 08:24
Show Gist options
  • Save ErisianArchitect/1489661 to your computer and use it in GitHub Desktop.
Save ErisianArchitect/1489661 to your computer and use it in GitHub Desktop.
typedef unsigned char byte;
struct OpCode
{
byte Prefix : 4;
byte Code : 4;
};
struct TypeCodes
{
byte T1 : 4;
byte T2 : 4;
};
struct ByteStack
{
unsigned int Capacity;
unsigned int Top;
byte* stack;
};
struct ScriptData
{
unsigned int OpAddr;
ByteStack Stack;
byte* DataSegment;
byte* ByteCode;
byte Result[8];
};
#define ReadBytes(type,data,addr)(*(type*)&data[addr]);addr+=sizeof(type)
#define StretchType(type,data,addr)(*(type*)&data[addr])
typedef char i8;
typedef unsigned char u8;
typedef short i16;
typedef unsigned short u16;
typedef int i32;
typedef unsigned int u32;
typedef long long i64;
typedef unsigned long long u64;
void RunScript(ByteStack & stack, ScriptData & data)
{
while(code.Code != 0x00)
{
OpCode* code = (OpCode*)&data.ByteCode[data.OpAddr];
byte ExtraData;
switch(code.Code)
{
case 0x01:/*MOV*/
{
data.OpAddr++;
switch(code.Prefix)
{
case 0x00://From RESULT to DS
{
ExtraData = data.ByteCode[data.OpAddr];//Get Size Data
data.OpAddr++;
switch(ExtraData)//Check Size
{
case 0x00:/*1 byte*/
*StretchType(byte*,data.ByteCode,data.OpAddr) = data.Result[0];
break;
case 0x01:/*2 bytes*/
*StretchType(unsigned short*,data.ByteCode,data.OpAddr) = StretchType(unsigned short,data.Result,0);
break;
case 0x02:/*4 bytes*/
*StretchType(unsigned int*,data.ByteCode,data.OpAddr) = StretchType(unsigned int,data.Result,0);
break;
case 0x03:/*8 bytes(max)*/
*StretchType(unsigned long int*,data.ByteCode,data.OpAddr) = StretchType(unsigned long int,data.Result,0);
break;
}
data.OpAddr+=4;
}
break;
case 0x01://From DS to DS
{
ExtraData = data.ByteCode[data.OpAddr];//Get Size Data
data.OpAddr++;
switch(ExtraData)//Check Size
{
case 0x00:/*1 byte*/
*StretchType(u8*,data.ByteCode,data.OpAddr) = *StretchType(u8*,data.ByteCode,data.OpAddr + 4);
break;
case 0x01:/*2 bytes*/
*StretchType(u16*,data.ByteCode,data.OpAddr) = *StretchType(u16*,data.ByteCode,data.OpAddr + 4);
break;
case 0x02:/*4 bytes*/
*StretchType(u32*,data.ByteCode,data.OpAddr) = *StretchType(u32*,data.ByteCode,data.OpAddr + 4);
break;
case 0x03:/*8 bytes(max)*/
*StretchType(u64*,data.ByteCode,data.OpAddr) = *StretchType(u64*,data.ByteCode,data.OpAddr + 4);
break;
}
data.OpAddr+=8;
}
break;
case 0x02:/*From Value to DS*/
{
ExtraData = data.ByteCode[data.OpAddr];//Get Size Data
data.OpAddr++;
switch(ExtraData)//Check Size
{
case 0x00:/*1 byte*/
*StretchType(u8*,data.ByteCode,data.OpAddr) = StretchType(u8,data.ByteCode,data.OpAddr + 4);
data.OpAddr+=5;
break;
case 0x01:/*2 bytes*/
*StretchType(u16*,data.ByteCode,data.OpAddr) = *StretchType(u16*,data.ByteCode,data.OpAddr + 4);
data.OpAddr+=6;
break;
case 0x02:/*4 bytes*/
*StretchType(u32*,data.ByteCode,data.OpAddr) = *StretchType(u32*,data.ByteCode,data.OpAddr + 4);
data.OpAddr+=8;
break;
case 0x03:/*8 bytes(max)*/
*StretchType(u64*,data.ByteCode,data.OpAddr) = *StretchType(u64*,data.ByteCode,data.OpAddr + 4);
data.OpAddr+=12;
break;
}
}
break;
case 0x03:/*From pointer to DS*/
{
ExtraData = data.ByteCode[data.OpAddr];//Get Size Data
data.OpAddr++;
switch(ExtraData)//Check Size
{
case 0x00:/*1 byte*/
*StretchType(u8*,data.ByteCode,data.OpAddr) = *StretchType(u8**,data.ByteCode,data.OpAddr + 4);
data.OpAddr+=8;
break;
case 0x01:/*2 bytes*/
*StretchType(u16*,data.ByteCode,data.OpAddr) = *StretchType(u16**,data.ByteCode,data.OpAddr + 4);
data.OpAddr+=8;
break;
case 0x02:/*4 bytes*/
*StretchType(u32*,data.ByteCode,data.OpAddr) = *StretchType(u32**,data.ByteCode,data.OpAddr + 4);
data.OpAddr+=8;
break;
case 0x03:/*8 bytes(max)*/
*StretchType(u64*,data.ByteCode,data.OpAddr) = *StretchType(u64*,data.ByteCode,data.OpAddr + 4);
data.OpAddr+=8;
break;
}
}
break;
case 0x04:
{
}
break;
case 0x05:
{
}
break;
case 0x06:
{
}
break;
case 0x07:
{
}
break;
case 0x08:
{
}
break;
case 0x09:
{
}
break;
case 0x0A:
{
}
break;
}
}
break;
case 0x02:
{
}
break;
case 0x03:
{
}
break;
case 0x04:
{
}
break;
case 0x05:
{
}
break;
case 0x06:
{
}
break;
case 0x07:
{
}
break;
case 0x08:
{
}
break;
case 0x09:
{
}
break;
}
data.OpAddr++;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment