Project Index
JACC (just another C compiler) is a mini C compiler targeted for a 8051 microcontroller embedded system.  It supports only part of ANSI (American National Standards Institute) standard C language.  The compiler itself is written in Java so it can be ported into different platform and even compile in the Netscape/Explorer browser.  Following is a snapshot of compiler front-end, a sample C file, and corresponding assembly output
 



Here's a sample C program

// counter and random program

int state, reg;

void delay(int a);
void move();
void random();

int main() {
    int a, b, c, d, e;
    a = 0; state = 0; reg = 45;

    while (1) {
        writePort0(~a++);
        move();
        random();
        delay(1);
    }

    writePort2(85);
    return 0;
}

void delay(int a) {
    int b, c, d, e;

    for (b = 0; b < a; b++) {
        for (c = 0; c < 16; c++) {
            for (d = 0; d < 16; d++) {
                for (e = 0; e < 100; e++) {}
            }
        }
    }
    return;
}

void move() {
    int display;

    if (state <= 7) display = 1 << state;
    if (state > 7) display = 1 << (14-state);
    writePort1(~display);
    state += 1;
    state %= 14;
    return;
}

void random() {
    reg = reg ^ (reg << 2);
    writePort2(reg);
    return;
}



Here's the compiled assembly output

;** memory location of Frame Pointer is 07H **
;
;   static area and stack should lies between 08H
;   and 7FH, otherwise data will be over written
    ORG 0
    MOV SP,#0aH
    MOV 07H,#0aH
    ACALL main
label000:
    NOP
    SJMP label000
main:
    MOV A,#05H  ;  -- beginning of function
    ADD A,SP  ;  -- allocate space for temporary var
    MOV SP,A
    MOV A,#03H
    ADD A,07H
    PUSH A
    MOV A,#00H
    POP 00H
    MOV @R0,A
    MOV A,#08H
    PUSH A
    MOV A,#00H
    POP 00H
    MOV @R0,A
    MOV A,#09H
    PUSH A
    MOV A,#2dH
    POP 00H
    MOV @R0,A
label0:
    MOV A,#01H
    CJNE A,#00H,label2
    LJMP label1
label2:
    MOV A,#03H
    ADD A,07H
    MOV R0,A
    MOV A,@R0
    INC @R0
    CPL A
    PUSH A
    POP A
    MOV P0,A  ; -- writePort0
    PUSH 07H
    MOV 07H,SP
    LCALL move
    MOV SP,07H
    POP 07H
    PUSH 07H
    MOV 07H,SP
    LCALL random
    MOV SP,07H
    POP 07H
    PUSH 07H
    MOV 07H,SP
    MOV A,#01H
    PUSH A
    LCALL delay
    MOV SP,07H
    POP 07H
    LJMP label0
label1:
    CLR C
    MOV A,#55H
    PUSH A
    POP A
    MOV P2,A  ; -- writePort2
    MOV A,#00H
    MOV B,A
    MOV A,#02H
    ADD A,07H
    MOV SP,A
    MOV A,B
    RET
delay:
    MOV A,#04H  ;  -- beginning of function
    ADD A,SP  ;  -- allocate space for temporary var
    MOV SP,A
    MOV A,#04H
    ADD A,07H
    PUSH A
    MOV A,#00H
    POP 00H
    MOV @R0,A
label3:
    MOV A,#04H
    ADD A,07H
    MOV R0,A
    MOV A,@00H
    PUSH A
    MOV A,#01H
    ADD A,07H
    MOV R0,A
    MOV A,@00H
    MOV R0,A
    POP A
    CJNE A,00H,label6
    MOV A,#00H
    LJMP label7
label6:
    JC label8
    MOV A,#00H
    LJMP label7
label8:
    MOV A,#01H
label7:
    CLR C
    CJNE A,#00H,label5
    LJMP label4
label5:
    MOV A,#05H
    ADD A,07H
    PUSH A
    MOV A,#00H
    POP 00H
    MOV @R0,A
label9:
    MOV A,#05H
    ADD A,07H
    MOV R0,A
    MOV A,@00H
    PUSH A
    MOV A,#10H
    MOV R0,A
    POP A
    CJNE A,00H,label12
    MOV A,#00H
    LJMP label13
label12:
    JC label14
    MOV A,#00H
    LJMP label13
label14:
    MOV A,#01H
label13:
    CLR C
    CJNE A,#00H,label11
    LJMP label10
label11:
    MOV A,#06H
    ADD A,07H
    PUSH A
    MOV A,#00H
    POP 00H
    MOV @R0,A
label15:
    MOV A,#06H
    ADD A,07H
    MOV R0,A
    MOV A,@00H
    PUSH A
    MOV A,#10H
    MOV R0,A
    POP A
    CJNE A,00H,label18
    MOV A,#00H
    LJMP label19
label18:
    JC label20
    MOV A,#00H
    LJMP label19
label20:
    MOV A,#01H
label19:
    CLR C
    CJNE A,#00H,label17
    LJMP label16
label17:
    MOV A,#07H
    ADD A,07H
    PUSH A
    MOV A,#00H
    POP 00H
    MOV @R0,A
label21:
    MOV A,#07H
    ADD A,07H
    MOV R0,A
    MOV A,@00H
    PUSH A
    MOV A,#64H
    MOV R0,A
    POP A
    CJNE A,00H,label24
    MOV A,#00H
    LJMP label25
label24:
    JC label26
    MOV A,#00H
    LJMP label25
label26:
    MOV A,#01H
label25:
    CLR C
    CJNE A,#00H,label23
    LJMP label22
label23:
    MOV A,#07H
    ADD A,07H
    MOV R0,A
    MOV A,@R0
    INC @R0
    LJMP label21
label22:
    CLR C
    MOV A,#06H
    ADD A,07H
    MOV R0,A
    MOV A,@R0
    INC @R0
    LJMP label15
label16:
    CLR C
    MOV A,#05H
    ADD A,07H
    MOV R0,A
    MOV A,@R0
    INC @R0
    LJMP label9
label10:
    CLR C
    MOV A,#04H
    ADD A,07H
    MOV R0,A
    MOV A,@R0
    INC @R0
    LJMP label3
label4:
    CLR C
    MOV A,#03H
    ADD A,07H
    MOV SP,A
    MOV A,#00H
    RET
move:
    MOV A,#01H  ;  -- beginning of function
    ADD A,SP  ;  -- allocate space for temporary var
    MOV SP,A
    MOV R0,#08H
    MOV A,@00H
    PUSH A
    MOV A,#07H
    POP 00H
    CJNE A,00H,label29
    MOV A,#01H
    LJMP label30
label29:
    JC label31
    MOV A,#01H
    LJMP label30
label31:
    MOV A,#00H
label30:
    CLR C
    CJNE A,#00H,label27
    LJMP label28
label27:
    MOV A,#03H
    ADD A,07H
    PUSH A
    MOV A,#01H
    PUSH A
    MOV R0,#08H
    MOV A,@00H
    JZ label32
    MOV R0,A
    POP A
    MOV R1,#FEH
label33:
    RLC A
    ANL A,R1
    DJNZ R0,label33
    LJMP label34
label32:
    POP A
label34:
    CLR C
    POP 00H
    MOV @R0,A
label28:
    CLR C
    MOV R0,#08H
    MOV A,@00H
    PUSH A
    MOV A,#07H
    POP 00H
    CJNE A,00H,label37
    MOV A,#00H
    LJMP label38
label37:
    JC label39
    MOV A,#00H
    LJMP label38
label39:
    MOV A,#01H
label38:
    CLR C
    CJNE A,#00H,label35
    LJMP label36
label35:
    MOV A,#03H
    ADD A,07H
    PUSH A
    MOV A,#01H
    PUSH A
    MOV A,#0eH
    PUSH A
    MOV R0,#08H
    MOV A,@00H
    MOV B,A
    POP A
    SUBB A,B
    JZ label40
    MOV R0,A
    POP A
    MOV R1,#FEH
label41:
    RLC A
    ANL A,R1
    DJNZ R0,label41
    LJMP label42
label40:
    POP A
label42:
    CLR C
    POP 00H
    MOV @R0,A
label36:
    CLR C
    MOV A,#03H
    ADD A,07H
    MOV R0,A
    MOV A,@00H
    CPL A
    PUSH A
    POP A
    MOV P1,A  ; -- writePort1
    MOV A,#08H
    PUSH A
    MOV R0,#08H
    MOV A,@00H
    PUSH A
    MOV A,#01H
    POP B
    ADD A,B
    POP 00H
    MOV @R0,A
    MOV A,#08H
    PUSH A
    MOV R0,#08H
    MOV A,@00H
    PUSH A
    MOV A,#0eH
    MOV B,A
    POP A
    DIV AB
    MOV A,B
    POP 00H
    MOV @R0,A
    MOV A,#02H
    ADD A,07H
    MOV SP,A
    MOV A,#00H
    RET
random:
    MOV A,#09H
    PUSH A
    MOV R0,#09H
    MOV A,@00H
    PUSH A
    MOV R0,#09H
    MOV A,@00H
    PUSH A
    MOV A,#02H
    JZ label43
    MOV R0,A
    POP A
    MOV R1,#FEH
label44:
    RLC A
    ANL A,R1
    DJNZ R0,label44
    LJMP label45
label43:
    POP A
label45:
    CLR C
    POP 00H
    XRL A,00H
    POP 00H
    MOV @R0,A
    MOV R0,#09H
    MOV A,@00H
    PUSH A
    POP A
    MOV P2,A  ; -- writePort2
    MOV A,#02H
    ADD A,07H
    MOV SP,A
    MOV A,#00H
    RET
    END
; +------------------------------------+
; |  this is the end of assembly file  |
; +------------------------------------+


Project Index
Hosted by www.Geocities.ws

1