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) |