Converted code constants from decimal to hexidecimal.
diff --git a/libacc/acc.c b/libacc/acc.c
index 9d4a237..052c351 100644
--- a/libacc/acc.c
+++ b/libacc/acc.c
@@ -25,7 +25,16 @@
#define TOKEN_OPERATOR 1
#define TOKEN_NUMBER 2
-#define TOKEN_DEFINE 536
+
+#define TOKEN_SYMBOL_BASE 256
+#define TOKEN_INT 256
+#define TOKEN_IF 288
+#define TOKEN_ELSE 312
+#define TOKEN_WHILE 352
+#define TOKEN_BREAK 400
+#define TOKEN_RETURN 448
+#define TOKEN_FOR 504
+#define TOKEN_DEFINE 536
static int currentToken;
static int currentTokenData;
@@ -44,8 +53,8 @@
static char* R;
static FILE* pInput;
-static void ab (int j);
-static void w();
+static void parseDeclarations (int isLocal);
+static void parseExpression();
static void addToSymbolTable(char e) {
*pSymbolTable++ = e;
@@ -111,7 +120,7 @@
*(char*) pSymbolTable = ' ';
currentToken = strstr(R, M - 1) - R;
*(char*) pSymbolTable = 0;
- currentToken = currentToken * 8 + 256;
+ currentToken = currentToken * 8 + TOKEN_SYMBOL_BASE;
if (currentToken > TOKEN_DEFINE) {
currentToken = ((int) P) + currentToken;
if (*(int*) currentToken == 1) {
@@ -160,14 +169,18 @@
}
}
-static void ae( g) {
+/*
+ * Emit 1 to 4 bytes of code. Little-endian, doesn't emit high bytes that
+ * are 0x0 or 0xff
+ */
+static void emitCode(int g) {
while( g && g != -1) {
*(char*) q++=g;
g=g>>8;
}
}
-static void A(e) {
+static void fixupAddress(e) {
int g;
while( e) {
g=*(int*) e;
@@ -176,53 +189,53 @@
}
}
-static int s( g, e) {
- ae(g);
+static int emitCodeWithImmediate( g, e) {
+ emitCode(g);
*(int*) q = e;
e = q;
q = q + 4;
return e;
}
-static int H(e) {
- s(184,e);
+static int emitLoadAccumulatorImmediate(e) {
+ emitCodeWithImmediate(0xb8,e); /* Move immediate a, e */
}
-static int B(e) {
- return s(233,e);
+static int emitBranch(e) {
+ return emitCodeWithImmediate(0xe9,e); /* Jump relative */
}
static int S( j, e) {
- ae(1032325);
- return s(132 + j, e);
+ emitCode(0x0FC085); /* XADD 85 r/m8, r8 exchange and add */
+ return emitCodeWithImmediate(0x84 + j, e); /* TEST */
}
static void Z(e) {
- ae( 49465);
- H(0);
- ae( 15);
- ae( e+144);
- ae( 192);
+ emitCode( 0xC139);
+ emitLoadAccumulatorImmediate(0);
+ emitCode( 0x0F);
+ emitCode( e+0x90);
+ emitCode( 0xC0);
}
static void N( j, e) {
- ae(j + 131);
- s((e < 512) << 7 | 5, e);
+ emitCode(j + 0x83);
+ emitCodeWithImmediate((e < 512) << 7 | 5, e);
}
-static void T (j) {
+static void T (int j) {
int g,e,m,aa;
g=1;
- if( currentToken == 34) {
- H(v);
- while( currentChar!=34) {
+ if( currentToken == '"') {
+ emitLoadAccumulatorImmediate(v);
+ while( currentChar != '"') {
unescapeCurrentChar ();
*(char*) v++=currentChar;
nextChar ();
}
*(char*) v=0;
v= (char*) (((int)v) +4&-4);
- nextChar ();
+ nextChar();
nextToken();
}
else {
@@ -230,25 +243,25 @@
m= currentTokenData;
e=currentToken;
nextToken();
- if( e == 2) {
- H(m);
+ if( e == TOKEN_NUMBER) {
+ emitLoadAccumulatorImmediate(m);
}
else if( aa == 2) {
T(0);
- s(185,0);
- if( e == 33)Z(m);
- else ae( m);
+ emitCodeWithImmediate(0xB9,0);
+ if( e == '!')Z(m);
+ else emitCode( m);
}
- else if( e == 40) {
- w ();
+ else if( e == '(') {
+ parseExpression ();
nextToken();
}
- else if( e == 42) {
+ else if( e == '*') {
nextToken();
e=currentToken;
nextToken();
nextToken();
- if( currentToken == 42) {
+ if( currentToken == '*') {
nextToken();
nextToken();
nextToken();
@@ -257,190 +270,190 @@
}
nextToken();
T(0);
- if( currentToken == 61) {
+ if( currentToken == '=') {
nextToken();
- ae( 80);
- w ();
- ae( 89);
- ae( 392+(e == 256));
+ emitCode( 0x50);
+ parseExpression ();
+ emitCode( 0x59);
+ emitCode( 0x188 + (e == TOKEN_INT));
}
else if( e) {
- if( e == 256)ae( 139);
- else ae( 48655);
+ if( e == TOKEN_INT)emitCode( 0x8B);
+ else emitCode( 0xBE0F);
q++;
}
}
- else if( e == 38) {
+ else if( e == '&') {
N(10,*(int*) currentToken);
nextToken();
}
else {
g=*(int*) e;
if(!g)g=dlsym(0,M);
- if( currentToken == 61&j) {
+ if( currentToken == '=' & j) {
nextToken();
- w ();
+ parseExpression ();
N(6,g);
}
- else if( currentToken!= 40) {
+ else if( currentToken!= '(') {
N(8,g);
if( C == 11) {
N(0,g);
- ae( currentTokenData);
+ emitCode( currentTokenData);
nextToken();
}
}
}
}
- if( currentToken == 40) {
- if( g == 1)ae( 80);
- m= s(60545,0);
+ if( currentToken == '(') {
+ if( g == 1)emitCode( 0x50);
+ m= emitCodeWithImmediate(0xEC81,0);
nextToken();
j=0;
- while( currentToken!= 41) {
- w ();
- s(2393225,j);
- if( currentToken == 44)nextToken();
+ while( currentToken!= ')') {
+ parseExpression ();
+ emitCodeWithImmediate(0x248489,j);
+ if( currentToken == ',')nextToken();
j=j +4;
}
*(int*) m= j;
nextToken();
if(!g) {
e=e +4;
- *(int*) e=s(232,*(int*) e);
+ *(int*) e=emitCodeWithImmediate(0xE8,*(int*) e);
}
else if( g == 1) {
- s(2397439,j);
+ emitCodeWithImmediate(0x2494FF,j);
j=j +4;
}
else {
- s(232,g-q-5);
+ emitCodeWithImmediate(0xE8,g-q-5);
}
- if( j)s(50305,j);
+ if( j)emitCodeWithImmediate(0xC481,j);
}
}
-static void O (j) {
+static void parseBinaryOp (int level) {
int e,g,m;
- if( j--== 1)T(1);
+ if( level--== 1)T(1);
else {
- O (j);
+ parseBinaryOp (level);
m= 0;
- while( j == C) {
+ while( level == C) {
g=currentToken;
e=currentTokenData;
nextToken();
- if( j>8) {
+ if( level>8) {
m= S(e,m);
- O (j);
+ parseBinaryOp (level);
}
else {
- ae( 80);
- O (j);
- ae( 89);
- if( j == 4|j == 5) {
+ emitCode( 0x50);
+ parseBinaryOp (level);
+ emitCode( 0x59);
+ if( level == 4 | level == 5) {
Z(e);
}
else {
- ae( e);
- if( g == 37)ae( 146);
+ emitCode( e);
+ if( g == '%')emitCode( 0x92);
}
}
}
- if( m&&j>8) {
+ if( m&&level>8) {
m= S(e,m);
- H(e^1);
- B(5);
- A(m);
- H(e);
+ emitLoadAccumulatorImmediate(e^1);
+ emitBranch(5);
+ fixupAddress(m);
+ emitLoadAccumulatorImmediate(e);
}
}
}
-static void w() {
- O(11);
+static void parseExpression() {
+ parseBinaryOp(11);
}
static int U() {
- w();
+ parseExpression();
return S(0, 0);
}
-static void I (j) {
+static void parseStatement (int* pBreakTarget) {
int m,g,e;
- if( currentToken == 288) {
+ if( currentToken == TOKEN_IF) {
nextToken();
nextToken();
m= U ();
nextToken();
- I (j);
- if( currentToken == 312) {
+ parseStatement (pBreakTarget);
+ if( currentToken == TOKEN_ELSE) {
nextToken();
- g=B(0);
- A(m);
- I (j);
- A(g);
+ g=emitBranch(0);
+ fixupAddress(m);
+ parseStatement (pBreakTarget);
+ fixupAddress(g);
}
else {
- A(m);
+ fixupAddress(m);
}
}
- else if( currentToken == 352|currentToken == 504) {
- e=currentToken;
+ else if ( currentToken == TOKEN_WHILE || currentToken == TOKEN_FOR) {
+ e = currentToken;
nextToken();
nextToken();
- if( e == 352) {
+ if( e == TOKEN_WHILE) {
g=q;
m= U ();
}
else {
- if( currentToken!= 59)w ();
+ if( currentToken != ';')parseExpression ();
nextToken();
g=q;
m= 0;
- if( currentToken!= 59)m= U ();
+ if( currentToken != ';')m= U ();
nextToken();
- if( currentToken!= 41) {
- e=B(0);
- w ();
- B(g-q-5);
- A(e);
+ if( currentToken!= ')') {
+ e=emitBranch(0);
+ parseExpression ();
+ emitBranch(g-q-5);
+ fixupAddress(e);
g=e +4;
}
}
nextToken();
- I(&m);
- B(g-q-5);
- A(m);
+ parseStatement(&m);
+ emitBranch(g-q-5);
+ fixupAddress(m);
}
- else if( currentToken == 123) {
+ else if( currentToken == '{') {
nextToken();
- ab(1);
- while( currentToken!= 125)I (j);
+ parseDeclarations(1);
+ while( currentToken != '}') parseStatement(pBreakTarget);
nextToken();
}
else {
- if( currentToken == 448) {
+ if( currentToken == TOKEN_RETURN) {
nextToken();
- if( currentToken!= 59)w ();
- K=B(K);
+ if( currentToken != ';') parseExpression();
+ K=emitBranch(K);
}
- else if( currentToken == 400) {
+ else if( currentToken == TOKEN_BREAK) {
nextToken();
- *(int*) j=B(*(int*) j);
+ *pBreakTarget = emitBranch(*pBreakTarget);
}
- else if( currentToken!= 59)w ();
+ else if( currentToken != ';') parseExpression();
nextToken();
}
}
-static void ab (int j) {
+static void parseDeclarations (int isLocal) {
int m;
- while( currentToken == 256 | currentToken != -1 & !j ) {
- if( currentToken == 256) {
+ while( currentToken == TOKEN_INT | currentToken != -1 & !isLocal ) {
+ if( currentToken == TOKEN_INT) {
nextToken();
- while( currentToken!= 59) {
- if( j ) {
+ while( currentToken != ';') {
+ if( isLocal ) {
G=G +4;
*(int*) currentToken=-G;
}
@@ -449,29 +462,29 @@
v=v +4;
}
nextToken();
- if( currentToken == 44)nextToken();
+ if( currentToken == ',')nextToken();
}
nextToken();
}
else {
- A(*(int*)(currentToken +4));
+ fixupAddress(*(int*)(currentToken + 4));
*(int*) currentToken=q;
nextToken();
nextToken();
m= 8;
- while( currentToken!= 41) {
+ while( currentToken != ')') {
*(int*) currentToken=m;
m= m +4;
nextToken();
- if( currentToken == 44)nextToken();
+ if( currentToken == ',')nextToken();
}
nextToken();
K=G=0;
- ae( 15042901);
- m= s(60545,0);
- I(0);
- A(K);
- ae( 50121);
+ emitCode( 0xE58955);
+ m= emitCodeWithImmediate(0xEC81,0);
+ parseStatement(0);
+ fixupAddress(K);
+ emitCode( 0xC3C9);
*(int*) m= G;
}
}
@@ -496,7 +509,7 @@
P = calloc(1, 99999);
nextChar();
nextToken();
- ab(0);
+ parseDeclarations(0);
#if 1
fwrite(R, 1, 99999, stdout);
fwrite(ac, 1, 99999, stdout);