Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7448a2eb authored by Jack Palevich's avatar Jack Palevich
Browse files

Converted code constants from decimal to hexidecimal.

parent f0cbc92f
Loading
Loading
Loading
Loading
+137 −124
Original line number Diff line number Diff line
@@ -25,6 +25,15 @@

#define TOKEN_OPERATOR 1
#define TOKEN_NUMBER 2

#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;
@@ -44,8 +53,8 @@ static char* M;
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 @@ static void nextToken() {
            *(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 nextToken() {
    }
}

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,46 +189,46 @@ static void A(e) {
    }
}

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 ();
@@ -230,25 +243,25 @@ static void T (j) {
        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 @@ static void T (j) {
            }
            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) {
    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 @@ static void ab (int j) {
                    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 @@ int main( int argc, char** argv) {
    P = calloc(1, 99999);
    nextChar();
    nextToken();
    ab(0);
    parseDeclarations(0);
#if 1
    fwrite(R, 1, 99999, stdout);
    fwrite(ac, 1, 99999, stdout);