Subversion Repositories Kolibri OS

Rev

Rev 7693 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 7693 Rev 7696
Line 1... Line 1...
1
(*
1
(*
2
    BSD 2-Clause License
2
    BSD 2-Clause License
Line 3... Line 3...
3
 
3
 
4
    Copyright (c) 2019, Anton Krotov
4
    Copyright (c) 2019, Anton Krotov
5
    All rights reserved.
5
    All rights reserved.
Line 580... Line 580...
580
    Op2(opXOR, imm(-1), reg);
580
    Op2(opXOR, imm(-1), reg);
581
    Op2(opADD, imm(1), reg)
581
    Op2(opADD, imm(1), reg)
582
END Neg;
582
END Neg;
Line 583... Line 583...
583
 
583
 
584
 
584
 
585
PROCEDURE translate (code: IL.CODES);
585
PROCEDURE translate;
Line 586... Line 586...
586
VAR
586
VAR
Line 587... Line 587...
587
    cmd, next: COMMAND;
587
    cmd, next: COMMAND;
Line 588... Line 588...
588
 
588
 
Line 589... Line 589...
589
    opcode, param1, param2, label, L, a, n, c1, c2: INTEGER;
589
    opcode, param1, param2, label, L, a, n, c1, c2: INTEGER;
590
 
590
 
Line 591... Line 591...
591
    reg1, reg2: INTEGER;
591
    reg1, reg2: INTEGER;
Line 592... Line 592...
592
 
592
 
593
    cc: INTEGER;
593
    cc: INTEGER;
Line 1641... Line 1641...
1641
        WRITER.WriteByte(file, 0AH)
1641
        WRITER.WriteByte(file, 0AH)
1642
    END
1642
    END
1643
END WriteHex;
1643
END WriteHex;
Line 1644... Line 1644...
1644
 
1644
 
1645
 
1645
 
1646
PROCEDURE CodeGen* (code: IL.CODES; outname: ARRAY OF CHAR; target: INTEGER; options: PROG.OPTIONS);
1646
PROCEDURE CodeGen* (outname: ARRAY OF CHAR; target: INTEGER; options: PROG.OPTIONS);
Line 1647... Line 1647...
1647
VAR
1647
VAR
Line 1666... Line 1666...
1666
    IF ODD(rom) THEN DEC(rom) END;
1666
    IF ODD(rom) THEN DEC(rom) END;
Line 1667... Line 1667...
1667
 
1667
 
1668
    ram := MIN(MAX(ram, minRAM), maxRAM);
1668
    ram := MIN(MAX(ram, minRAM), maxRAM);
Line 1669... Line 1669...
1669
    rom := MIN(MAX(rom, minROM), maxROM);
1669
    rom := MIN(MAX(rom, minROM), maxROM);
1670
 
1670
 
1671
    IF code.bss > ram - minStackSize - RTL.VarSize THEN
1671
    IF IL.codes.bss > ram - minStackSize - RTL.VarSize THEN
Line 1672... Line 1672...
1672
        ERRORS.Error(204)
1672
        ERRORS.Error(204)
1673
    END;
1673
    END;
1674
 
1674
 
1675
    Labels := CHL.CreateIntList();
1675
    Labels := CHL.CreateIntList();
Line 1676... Line 1676...
1676
    FOR i := 1 TO code.lcount DO
1676
    FOR i := 1 TO IL.codes.lcount DO
1677
        CHL.PushInt(Labels, 0)
1677
        CHL.PushInt(Labels, 0)
1678
    END;
1678
    END;
Line 1679... Line 1679...
1679
 
1679
 
1680
    FOR i := 0 TO LEN(mem) - 1 DO
1680
    FOR i := 0 TO LEN(mem) - 1 DO
1681
        mem[i] := 0
1681
        mem[i] := 0
1682
    END;
1682
    END;
Line 1683... Line 1683...
1683
 
1683
 
1684
    TypesSize := CHL.Length(code.types) * 2;
1684
    TypesSize := CHL.Length(IL.codes.types) * 2;
1685
    CodeList := LISTS.create(NIL);
1685
    CodeList := LISTS.create(NIL);
Line 1686... Line 1686...
1686
    RelList  := LISTS.create(NIL);
1686
    RelList  := LISTS.create(NIL);
1687
    REG.Init(R, Push, Pop, mov, xchg, NIL, NIL, {R4, R5, R6, R7}, {});
1687
    REG.Init(R, Push, Pop, mov, xchg, NIL, NIL, {R4, R5, R6, R7}, {});
1688
 
1688
 
1689
    prolog(ram);
1689
    prolog(ram);
1690
    translate(code);
1690
    translate;
1691
    epilog;
1691
    epilog;
Line 1692... Line 1692...
1692
 
1692
 
1693
    Code.address := 10000H - rom;
1693
    Code.address := 10000H - rom;
1694
    Code.size := Fixup(Code.address, IntVectorSize + TypesSize);
1694
    Code.size := Fixup(Code.address, IntVectorSize + TypesSize);
Line 1695... Line 1695...
1695
    Data.address := Code.address + Code.size;
1695
    Data.address := Code.address + Code.size;
1696
    Data.size := CHL.Length(code.data);
1696
    Data.size := CHL.Length(IL.codes.data);
1697
    Data.size := Data.size + ORD(ODD(Data.size));
1697
    Data.size := Data.size + ORD(ODD(Data.size));
1698
    TextSize  := Code.size + Data.size;
1698
    TextSize  := Code.size + Data.size;
1699
 
1699
 
1700
    IF Code.address + TextSize + MAX(code.dmin - Data.size, IntVectorSize + TypesSize) > 10000H  THEN
1700
    IF Code.address + TextSize + MAX(IL.codes.dmin - Data.size, IntVectorSize + TypesSize) > 10000H  THEN
1701
        ERRORS.Error(203)
1701
        ERRORS.Error(203)
Line 1722... Line 1722...
1722
        reloc := reloc.next(RELOC)
1722
        reloc := reloc.next(RELOC)
1723
    END;
1723
    END;
Line 1724... Line 1724...
1724
 
1724
 
Line 1725... Line 1725...
1725
    adr := Data.address;
1725
    adr := Data.address;
1726
 
1726
 
1727
    FOR i := 0 TO CHL.Length(code.data) - 1 DO
1727
    FOR i := 0 TO CHL.Length(IL.codes.data) - 1 DO
1728
        mem[adr] := CHL.GetByte(code.data, i);
1728
        mem[adr] := CHL.GetByte(IL.codes.data, i);
Line 1729... Line 1729...
1729
        INC(adr)
1729
        INC(adr)
Line 1730... Line 1730...
1730
    END;
1730
    END;
1731
 
1731
 
1732
    adr := 10000H - IntVectorSize - TypesSize;
1732
    adr := 10000H - IntVectorSize - TypesSize;
Line 1733... Line 1733...
1733
 
1733
 
1734
    FOR i := TypesSize DIV 2 - 1 TO 0 BY -1 DO
1734
    FOR i := TypesSize DIV 2 - 1 TO 0 BY -1 DO
1735
        PutWord(CHL.GetInt(code.types, i), adr)
1735
        PutWord(CHL.GetInt(IL.codes.types, i), adr)