XTRAN Example — Translate Encore (SEL, Gould) Assembler to C

The following example uses the standard set of XTRAN rules for parsing Encore assembler and translating it to C.

NOTE that the translation shown below was done with default conditions.  XTRAN provides many options for controlling the way it translates.

We have declared to XTRAN the following C structure prior to translation:

    typedef struct
        {
        short off1;
        }
        Str;

Process Flowchart

Here is a flowchart for this process, in which the elements are color coded:

process flowchart

Input to XTRAN:

WRD2    DC      2
OFF1    EQU     4
*
* Show off various addressing modes:
*
START   LW      1,WRD1          LW    1,WRD1
        LW      1,WRD1(4)       LW    1,WRD1(4)
        LW      1,WRD1,2        LW    1,WRD1,2
        LW      1,*WRD1         LW    1,*WRD1
        LW      1,*WRD1(3)      LW    1,*WRD1(3)
        LW      1,*WRD1,2       LW    1,*WRD1,2
        LW      2,OFF1(4)       LW    2,OFF1(4)
        LW      2,OFF1,2        LW    2,OFF1,2
        LW      2,*OFF1(3)      LW    2,*OFF1(3)
        LW      2,*OFF1,2       LW    2,*OFF1,2
*
* Now show off some different instructions:
*
        TRR     1,2             LRR   1,2
        LMW     2,WRD1(3)       LMW   2,WRD1(3)
        LNW     2,WRD1,1        LNW   2,WRD1,1
        LI      1,100           LI    1,100
        LEA     1,WRD1          LEA   1,WRD1
        LA      1,WRD1          LA   1,WRD1
        LABR    5,WRD2          LABR  5,WRD2
        SUABR   5,WRD1          SUABR 5,WRD1
        STWBR   3,WRD2          STWBR 3,WRD2
        STW     4,WRD1(3)       STW   4,WRD1(3)
        ZMW     WRD1            ZMW   WRD1
        ZR      4               ZR    4


Output from XTRAN:

        extern union                            /*unionize r1*/
            {
            long l;
            long *p_l;
            }
            r1;
        extern union                            /*unionize br4*/
            {
            long l;
            Str *p__Str;
            }
            br4;
        extern union                            /*unionize r2*/
            {
            long l;
            Str *p__Str;
            }
            r2;
        extern union                            /*unionize br3*/
            {
            long l;
            Str *p__Str;
            }
            br3;
        extern union                            /*unionize br5*/
            {
            long *p_l;
            long l;
            }
            br5;
        extern long r4;

        long wrd1 = 1;
        long wrd2 = 2;
        typedef struct str
            {
            long off1;
            }
            Str;
start:
/*
 *
 * Show off various addressing modes:
 *
 */
        r1.l = wrd1;                            /*lw    1,wrd1*/
        r1.l = wrd1[br4.l / 4];                 /*lw    1,wrd1(4)*/
        r1.l = wrd1[r2.l / 4];                  /*lw    1,wrd1,2*/
        r1.l = *wrd1;                           /*lw    1,*wrd1*/
        r1.l = *wrd1[br3.l / 4];                /*lw    1,*wrd1(3)*/
        r1.l = *wrd1[r2.l / 4];                 /*lw    1,*wrd1,2*/
        r2.l = br4.p__Str->off1;                /*lw    2,off1(4)*/
        r2.l = r2.p__Str->off1;                 /*lw    2,off1,2*/
        r2.l = *br3.p__Str->off1;               /*lw    2,*off1(3)*/
        r2.l = *r2.p__Str->off1;                /*lw    2,*off1,2*/
/*
 *
 * Now show off some different instructions:
 *
 */
        r2.l = r1.l;                            /*lrr   1,2*/
        r2.l = wrd1[br3.l / 4] & r4;            /*lmw   2,wrd1(3)*/
        r2.l = -wrd1[r1.l / 4];                 /*lnw   2,wrd1,1*/
        r1.l = 100;                             /*li    1,100*/
        r1.p_l = &wrd1;                         /*lea   1,wrd1*/
        r1.p_l = &wrd1;                         /*la    1,wrd1*/
        br5.p_l = &wrd2;                        /*labr  5,wrd2*/
        br5.l -= &wrd1;                         /*suabr 5,wrd1*/
        wrd2 = br3.l;                           /*stwbr 3,wrd2*/
        wrd1[br3.l / 4] = r4;                   /*stw   4,wrd1(3)*/
        wrd1 = 0;                               /*zmw   wrd1*/
        r4 = 0;                                 /*zr    4*/