Subversion Repositories Kolibri OS

Rev

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

Rev 8097 Rev 8859
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-2020, Anton Krotov
4
    Copyright (c) 2019-2021, Anton Krotov
5
    All rights reserved.
5
    All rights reserved.
Line 6... Line 6...
6
*)
6
*)
Line 11... Line 11...
11
       UTILS, C := CONSOLE, PROG, RTL := MSP430RTL;
11
       UTILS, C := CONSOLE, PROG, RTL := MSP430RTL;
Line 12... Line 12...
12
 
12
 
Line -... Line 13...
-
 
13
 
-
 
14
CONST
13
 
15
 
14
CONST
16
    chkSTK* = 6;
Line 15... Line 17...
15
 
17
 
Line 16... Line 18...
16
    minRAM* = 128;  maxRAM* = 2048;
18
    minRAM* = 128;  maxRAM* = 2048;
Line 17... Line 19...
17
    minROM* = 2048; maxROM* = 24576;
19
    minROM* = 2048; maxROM* = 24576;
Line 18... Line 20...
18
 
20
 
Line 19... Line 21...
19
    minStackSize = 64;
21
    StkReserve = RTL.StkReserve;
Line 20... Line 22...
20
 
22
 
Line 21... Line 23...
21
    IntVectorSize* = RTL.IntVectorSize;
23
    IntVectorSize* = RTL.IntVectorSize;
22
 
24
 
Line 106... Line 108...
106
 
108
 
Line 107... Line 109...
107
    IV: ARRAY RTL.LenIV OF INTEGER;
109
    IV: ARRAY RTL.LenIV OF INTEGER;
Line 108... Line 110...
108
 
110
 
-
 
111
    IdxWords: RECORD src, dst: INTEGER END;
-
 
112
 
-
 
113
    StkCnt, MaxStkCnt: INTEGER;
-
 
114
 
-
 
115
 
Line 109... Line 116...
109
    IdxWords: RECORD src, dst: INTEGER END;
116
PROCEDURE CheckProcDataSize* (VarSize, RamSize: INTEGER): BOOLEAN;
110
 
117
    RETURN (VarSize + 1) * 2 + StkReserve + RTL.VarSize < RamSize
111
    StkCnt: INTEGER;
118
END CheckProcDataSize;
Line 161... Line 168...
161
    call.label := label;
168
    call.label := label;
162
    LISTS.push(CodeList, call)
169
    LISTS.push(CodeList, call)
163
END EmitCall;
170
END EmitCall;
Line -... Line 171...
-
 
171
 
-
 
172
 
-
 
173
PROCEDURE IncStk;
-
 
174
BEGIN
-
 
175
    INC(StkCnt);
-
 
176
    MaxStkCnt := MAX(StkCnt, MaxStkCnt)
-
 
177
END IncStk;
164
 
178
 
165
 
179
 
166
PROCEDURE bw (b: BOOLEAN): INTEGER;
180
PROCEDURE bw (b: BOOLEAN): INTEGER;
Line 264... Line 278...
264
    |-1: Op1(opPUSH, CG, sINCR)
278
    |-1: Op1(opPUSH, CG, sINCR)
265
    ELSE
279
    ELSE
266
        Op1(opPUSH, PC, sINCR);
280
        Op1(opPUSH, PC, sINCR);
267
        EmitWord(imm)
281
        EmitWord(imm)
268
    END;
282
    END;
269
    INC(StkCnt)
283
    IncStk
270
END PushImm;
284
END PushImm;
Line 271... Line 285...
271
 
285
 
272
 
286
 
Line 387... Line 401...
387
 
401
 
388
 
402
 
389
PROCEDURE Push (reg: INTEGER);
403
PROCEDURE Push (reg: INTEGER);
390
BEGIN
404
BEGIN
391
    Op1(opPUSH, reg, sREG);
405
    Op1(opPUSH, reg, sREG);
Line 392... Line 406...
392
    INC(StkCnt)
406
    IncStk
393
END Push;
407
END Push;
Line 438... Line 452...
438
END Reloc;
452
END Reloc;
Line 439... Line 453...
439
 
453
 
440
 
454
 
-
 
455
PROCEDURE CallRTL (proc, params: INTEGER);
-
 
456
BEGIN
441
PROCEDURE CallRTL (proc, params: INTEGER);
457
    IncStk;
442
BEGIN
458
    DEC(StkCnt);
443
    EmitCall(RTL.rtl[proc].label);
459
    EmitCall(RTL.rtl[proc].label);
444
    RTL.Used(proc);
460
    RTL.Used(proc);
445
    IF params > 0 THEN
461
    IF params > 0 THEN
Line 609... Line 625...
609
PROCEDURE LocalSrc (offset: INTEGER): INTEGER;
625
PROCEDURE LocalSrc (offset: INTEGER): INTEGER;
610
    RETURN src_x(LocalOffset(offset), SP)
626
    RETURN src_x(LocalOffset(offset), SP)
611
END LocalSrc;
627
END LocalSrc;
Line 612... Line 628...
612
 
628
 
613
 
629
 
614
PROCEDURE translate;
630
PROCEDURE translate (chk_stk: BOOLEAN);
Line 615... Line 631...
615
VAR
631
VAR
Line 616... Line 632...
616
    cmd, next: COMMAND;
632
    cmd, next: COMMAND;
Line 617... Line 633...
617
 
633
 
Line -... Line 634...
-
 
634
    opcode, param1, param2, L, a, n, c1, c2: INTEGER;
-
 
635
 
618
    opcode, param1, param2, L, a, n, c1, c2: INTEGER;
636
    reg1, reg2: INTEGER;
619
 
637
 
Line 620... Line 638...
620
    reg1, reg2: INTEGER;
638
    cc: INTEGER;
Line 634... Line 652...
634
        CASE opcode OF
652
        CASE opcode OF
635
        |IL.opJMP:
653
        |IL.opJMP:
636
            EmitJmp(opJMP, param1)
654
            EmitJmp(opJMP, param1)
Line 637... Line 655...
637
 
655
 
-
 
656
        |IL.opCALL:
-
 
657
            IncStk;
638
        |IL.opCALL:
658
            DEC(StkCnt);
Line 639... Line 659...
639
            EmitCall(param1)
659
            EmitCall(param1)
-
 
660
 
-
 
661
        |IL.opCALLP:
640
 
662
            IncStk;
641
        |IL.opCALLP:
663
            DEC(StkCnt);
642
            UnOp(reg1);
664
            UnOp(reg1);
643
            Op1(opCALL, reg1, sREG);
665
            Op1(opCALL, reg1, sREG);
Line 650... Line 672...
650
        |IL.opLABEL:
672
        |IL.opLABEL:
651
            EmitLabel(param1)
673
            EmitLabel(param1)
Line 652... Line 674...
652
 
674
 
653
        |IL.opSADR_PARAM:
675
        |IL.opSADR_PARAM:
654
            Op1(opPUSH, PC, sINCR);
676
            Op1(opPUSH, PC, sINCR);
655
            INC(StkCnt);
677
            IncStk;
656
            EmitWord(param2);
678
            EmitWord(param2);
Line 657... Line 679...
657
            Reloc(RDATA)
679
            Reloc(RDATA)
658
 
680
 
Line 659... Line 681...
659
        |IL.opERR:
681
        |IL.opERR:
660
            CallRTL(RTL._error, 2)
682
            CallRTL(RTL._error, 2)
Line 661... Line 683...
661
 
683
 
662
        |IL.opPUSHC:
-
 
663
            PushImm(param2)
684
        |IL.opPUSHC:
-
 
685
            PushImm(param2)
-
 
686
 
-
 
687
        |IL.opONERR:
664
 
688
            DEC(StkCnt);
Line 665... Line 689...
665
        |IL.opONERR:
689
            EmitWord(0C232H); (*  BIC   #8, SR; DINT  *)
666
            PushImm(param2);
690
            EmitWord(4303H);  (*  MOV   R3, R3; NOP   *)
Line 667... Line 691...
667
            DEC(StkCnt);
691
            PushImm(param2);
668
            EmitJmp(opJMP, param1)
692
            EmitJmp(opJMP, param1)
669
 
-
 
670
        |IL.opLEAVEC:
693
 
-
 
694
        |IL.opLEAVEC:
-
 
695
            Pop(PC)
-
 
696
 
-
 
697
        |IL.opENTER:
-
 
698
            ASSERT(R.top = -1);
-
 
699
            EmitLabel(param1);
-
 
700
            n := param2 MOD 65536;
-
 
701
            param2 := param2 DIV 65536;
-
 
702
            StkCnt := 0;
-
 
703
            IF chk_stk THEN
-
 
704
                L := NewLabel();
-
 
705
                Op2(opMOV, SP * 256, R4);
-
 
706
                Op2(opSUB, HP * 256, R4);
-
 
707
                Op2(opCMP, imm(StkReserve), R4);
-
 
708
                word := CodeList.last(WORD);
-
 
709
                jcc(jge, L);
-
 
710
                DEC(StkCnt);
-
 
711
                EmitWord(0C232H); (*  BIC   #8, SR; DINT  *)
671
            Pop(PC)
712
                EmitWord(4303H);  (*  MOV   R3, R3; NOP   *)
672
 
713
                PushImm(n);
673
        |IL.opENTER:
714
                EmitJmp(opJMP, cmd.param3);
674
            ASSERT(R.top = -1);
715
                EmitLabel(L)
675
            StkCnt := 0;
716
            END;
676
            EmitLabel(param1);
717
 
677
            IF param2 > 8 THEN
718
            IF param2 > 8 THEN
678
                Op2(opMOV, imm(param2), R4);
719
                Op2(opMOV, imm(param2), R4);
679
                L := NewLabel();
720
                L := NewLabel();
680
                EmitLabel(L);
721
                EmitLabel(L);
681
                Push(CG);
-
 
682
                Op2(opSUB, imm(1), R4);
-
 
683
                jcc(jne, L)
722
                Push(CG);
-
 
723
                Op2(opSUB, imm(1), R4);
-
 
724
                jcc(jne, L)
-
 
725
            ELSE
Line 684... Line 726...
684
            ELSIF param2 > 0 THEN
726
                FOR n := 1 TO param2 DO
685
                WHILE param2 > 0 DO
727
                    Push(CG)
686
                    Push(CG);
728
                END
687
                    DEC(param2)
729
            END;
688
                END
730
            StkCnt := param2;
689
            END
731
            MaxStkCnt := StkCnt
690
 
-
 
691
        |IL.opLEAVE, IL.opLEAVER:
-
 
692
            ASSERT(param2 = 0);
732
 
693
            IF opcode = IL.opLEAVER THEN
733
        |IL.opLEAVE, IL.opLEAVER:
694
                UnOp(reg1);
734
            ASSERT(param2 = 0);
695
                IF reg1 # ACC THEN
735
            IF opcode = IL.opLEAVER THEN
696
                    GetRegA;
736
                UnOp(reg1);
-
 
737
                IF reg1 # ACC THEN
-
 
738
                    mov(ACC, reg1)
-
 
739
                END;
697
                    ASSERT(REG.Exchange(R, reg1, ACC));
740
                drop
698
                    drop
741
            END;
699
                END;
742
            ASSERT(R.top = -1);
700
                drop
743
            ASSERT(StkCnt = param1);
Line 928... Line 971...
928
        |IL.opORD:
971
        |IL.opORD:
929
            UnOp(reg1);
972
            UnOp(reg1);
930
            Test(reg1);
973
            Test(reg1);
931
            setcc(jne, reg1)
974
            setcc(jne, reg1)
Line 932... Line -...
932
 
-
 
933
        |IL.opLOOP:
-
 
934
        |IL.opENDLOOP:
-
 
935
 
975
 
936
        |IL.opGET:
976
        |IL.opGET:
937
            BinOp(reg1, reg2);
977
            BinOp(reg1, reg2);
938
            drop;
978
            drop;
939
            drop;
979
            drop;
Line 1034... Line 1074...
1034
 
1074
 
1035
        |IL.opTYPEGD:
1075
        |IL.opTYPEGD:
1036
            UnOp(reg1);
1076
            UnOp(reg1);
1037
            PushAll(0);
1077
            PushAll(0);
1038
            Op1(opPUSH, reg1, sIDX);
1078
            Op1(opPUSH, reg1, sIDX);
1039
            INC(StkCnt);
1079
            IncStk;
1040
            EmitWord(-2);
1080
            EmitWord(-2);
1041
            PushImm(param2);
1081
            PushImm(param2);
1042
            CallRTL(RTL._guardrec, 2);
1082
            CallRTL(RTL._guardrec, 2);
Line 1142... Line 1182...
1142
            Op2(opCMP, imm(param1), ACC);
1182
            Op2(opCMP, imm(param1), ACC);
1143
            jcc(jg, param2)
1183
            jcc(jg, param2)
Line 1144... Line 1184...
1144
 
1184
 
1145
        |IL.opCASELR:
1185
        |IL.opCASELR:
-
 
1186
            Op2(opCMP, imm(param1), ACC);
-
 
1187
            IF param2 = cmd.param3 THEN
-
 
1188
                jcc(jne, param2)
1146
            Op2(opCMP, imm(param1), ACC);
1189
            ELSE
1147
            jcc(jl, param2);
1190
                jcc(jl, param2);
-
 
1191
                jcc(jg, cmd.param3)
Line 1148... Line 1192...
1148
            jcc(jg, cmd.param3)
1192
            END
1149
 
1193
 
1150
        |IL.opSBOOL:
1194
        |IL.opSBOOL:
1151
            BinOp(reg2, reg1);
1195
            BinOp(reg2, reg1);
Line 1349... Line 1393...
1349
 
1393
 
1350
        |IL.opSAVES:
1394
        |IL.opSAVES:
1351
            UnOp(reg1);
1395
            UnOp(reg1);
1352
            PushAll_1;
1396
            PushAll_1;
1353
            Op1(opPUSH, PC, sINCR);
1397
            Op1(opPUSH, PC, sINCR);
1354
            INC(StkCnt);
1398
            IncStk;
1355
            EmitWord(param2);
1399
            EmitWord(param2);
1356
            Reloc(RDATA);
1400
            Reloc(RDATA);
1357
            Push(reg1);
1401
            Push(reg1);
1358
            drop;
1402
            drop;
Line 1532... Line 1576...
1532
    ASSERT(R.pushed = 0);
1576
    ASSERT(R.pushed = 0);
1533
    ASSERT(R.top = -1)
1577
    ASSERT(R.top = -1)
1534
END translate;
1578
END translate;
Line 1535... Line 1579...
1535
 
1579
 
1536
 
1580
 
1537
PROCEDURE prolog (ramSize: INTEGER);
1581
PROCEDURE prolog;
Line 1538... Line 1582...
1538
VAR
1582
VAR
1539
    i: INTEGER;
1583
    i: INTEGER;
1540
 
1584
 
1541
BEGIN
1585
BEGIN
1542
    RTL.Init(EmitLabel, EmitWord, EmitCall, ramSize);
1586
    RTL.Init(EmitLabel, EmitWord, EmitCall);
Line 1543... Line 1587...
1543
    FOR i := 0 TO LEN(RTL.rtl) - 1 DO
1587
    FOR i := 0 TO LEN(RTL.rtl) - 1 DO
Line 1549... Line 1593...
1549
    Op2(opMOV, incr(PC), SP);
1593
    Op2(opMOV, incr(PC), SP);
1550
    EmitWord(0);
1594
    EmitWord(0);
1551
    Op2(opMOV, incr(PC), HP);
1595
    Op2(opMOV, incr(PC), HP);
1552
    EmitWord(0);
1596
    EmitWord(0);
1553
    Op2(opMOV, imm(5A80H), dst_x(0120H, SR)); (* stop WDT *)
1597
    Op2(opMOV, imm(5A80H), dst_x(0120H, SR)); (* stop WDT *)
1554
    Op2(opMOV, imm(RTL.empty_proc), dst_x(RTL.int, SR));
1598
    Op2(opMOV, imm(RTL.empty_proc), dst_x(0, SP));
1555
    Op2(opMOV, imm(0), dst_x(RTL.trap, SR))
1599
    Op2(opMOV, imm(RTL.empty_proc), dst_x(2, SP));
1556
END prolog;
1600
END prolog;
Line 1557... Line 1601...
1557
 
1601
 
1558
 
1602
 
1559
PROCEDURE epilog;
1603
PROCEDURE epilog;
Line 1560... Line 1604...
1560
VAR
1604
VAR
1561
    L1, i: INTEGER;
1605
    L1, i, n: INTEGER;
Line 1562... Line 1606...
1562
 
1606
 
Line 1573... Line 1617...
1573
        END
1617
        END
1574
    END;
1618
    END;
Line 1575... Line 1619...
1575
 
1619
 
Line 1576... Line 1620...
1576
    EmitLabel(L1);
1620
    EmitLabel(L1);
1577
 
-
 
1578
    MovRR(SP, IR);
1621
 
1579
 
1622
    n := 0;
1580
    FOR i := 0 TO 15 DO
1623
    FOR i := 0 TO 15 DO
-
 
1624
        IF i IN R.regs THEN
1581
        IF i IN R.regs + R.vregs THEN
1625
            Push(i);
1582
            Push(i)
1626
            INC(n)
Line 1583... Line 1627...
1583
        END
1627
        END
1584
    END;
1628
    END;
-
 
1629
 
-
 
1630
    MovRR(SP, R4);
1585
 
1631
    Op2(opADD, imm(n * 2), R4);
1586
    Push(IR);
1632
 
1587
    Op1(opPUSH, IR, sINDIR);
1633
    Push(R4);
Line 1588... Line 1634...
1588
    Op1(opCALL, SR, sIDX);
1634
    Op1(opPUSH, R4, sINDIR);
1589
    EmitWord(RTL.int);
1635
    Op1(opCALL, SR, sIDX); EmitWord(-RTL.VarSize); Reloc(RBSS); (* call int *)
1590
    Op2(opADD, imm(4), SP);
1636
    Op2(opADD, imm(4), SP);
1591
 
1637
 
1592
    FOR i := 15 TO 0 BY -1 DO
1638
    FOR i := 15 TO 0 BY -1 DO
Line 1593... Line 1639...
1593
        IF i IN R.regs + R.vregs THEN
1639
        IF i IN R.regs THEN
Line 1604... Line 1650...
1604
 
1650
 
1605
PROCEDURE CodeGen* (outname: ARRAY OF CHAR; target: INTEGER; options: PROG.OPTIONS);
1651
PROCEDURE CodeGen* (outname: ARRAY OF CHAR; target: INTEGER; options: PROG.OPTIONS);
1606
VAR
1652
VAR
Line 1607... Line 1653...
1607
    i, adr, heap, stack, TextSize, TypesSize, bits, n, val: INTEGER;
1653
    i, adr, heap, stack, TextSize, TypesSize, bits, n, val: INTEGER;
Line 1608... Line 1654...
1608
 
1654
 
Line 1609... Line 1655...
1609
    Code, Data, Bss, Free: RECORD address, size: INTEGER END;
1655
    Code, Data, Bss: RECORD address, size: INTEGER END;
Line 1623... Line 1669...
1623
    IF ODD(rom) THEN DEC(rom) END;
1669
    IF ODD(rom) THEN DEC(rom) END;
Line 1624... Line 1670...
1624
 
1670
 
1625
    ram := MIN(MAX(ram, minRAM), maxRAM);
1671
    ram := MIN(MAX(ram, minRAM), maxRAM);
Line 1626... Line 1672...
1626
    rom := MIN(MAX(rom, minROM), maxROM);
1672
    rom := MIN(MAX(rom, minROM), maxROM);
1627
 
1673
 
1628
    IF IL.codes.bss > ram - minStackSize - RTL.VarSize THEN
1674
    IF IL.codes.bss > ram - StkReserve - RTL.VarSize THEN
Line 1629... Line 1675...
1629
        ERRORS.Error(204)
1675
        ERRORS.Error(204)
1630
    END;
1676
    END;
1631
 
1677
 
1632
    Labels := CHL.CreateIntList();
1678
    Labels := CHL.CreateIntList();
Line 1633... Line -...
1633
    FOR i := 1 TO IL.codes.lcount DO
-
 
1634
        CHL.PushInt(Labels, 0)
-
 
1635
    END;
-
 
1636
 
-
 
1637
    FOR i := 0 TO LEN(mem) - 1 DO
-
 
1638
        mem[i] := 0
1679
    FOR i := 1 TO IL.codes.lcount DO
1639
    END;
1680
        CHL.PushInt(Labels, 0)
1640
 
1681
    END;
Line 1641... Line 1682...
1641
    TypesSize := CHL.Length(IL.codes.types) * 2;
1682
 
1642
    CodeList := LISTS.create(NIL);
1683
    CodeList := LISTS.create(NIL);
1643
    RelList  := LISTS.create(NIL);
1684
    RelList  := LISTS.create(NIL);
Line 1644... Line -...
1644
    REG.Init(R, Push, Pop, mov, xchg, NIL, NIL, {R4, R5, R6, R7}, {});
-
 
1645
 
1685
    REG.Init(R, Push, Pop, mov, xchg, {R4, R5, R6, R7});
1646
    prolog(ram);
-
 
1647
    translate;
1686
 
-
 
1687
    prolog;
-
 
1688
    translate(chkSTK IN options.checking);
-
 
1689
    epilog;
-
 
1690
 
-
 
1691
    TypesSize := CHL.Length(IL.codes.types) * 2;
-
 
1692
    Data.size := CHL.Length(IL.codes.data);
-
 
1693
    IF ODD(Data.size) THEN
-
 
1694
        CHL.PushByte(IL.codes.data, 0);
-
 
1695
        INC(Data.size)
-
 
1696
    END;
1648
    epilog;
1697
    Code.size := Fixup(0, IntVectorSize + TypesSize + Data.size);
1649
 
1698
    Code.address := 10000H - (IntVectorSize + TypesSize + Data.size + Code.size);
Line 1650... Line 1699...
1650
    Code.address := 10000H - rom;
1699
    IF Code.address < 10000H - rom THEN
1651
    Code.size := Fixup(Code.address, IntVectorSize + TypesSize);
1700
        ERRORS.Error(203)
1652
    Data.address := Code.address + Code.size;
1701
    END;
Line 1653... Line -...
1653
    Data.size := CHL.Length(IL.codes.data);
-
 
1654
    Data.size := Data.size + Data.size MOD 2;
-
 
1655
    TextSize  := Code.size + Data.size;
-
 
1656
 
1702
    Code.size := Fixup(Code.address, IntVectorSize + TypesSize + Data.size);
-
 
1703
    Data.address := Code.address + Code.size;
-
 
1704
    TextSize := Code.size + Data.size;
-
 
1705
 
-
 
1706
    IF Code.address + TextSize + MAX(IL.codes.dmin - Data.size, IntVectorSize + TypesSize) > 10000H THEN
-
 
1707
        ERRORS.Error(203)
1657
    IF Code.address + TextSize + MAX(IL.codes.dmin - Data.size, IntVectorSize + TypesSize) > 10000H  THEN
1708
    END;
1658
        ERRORS.Error(203)
1709
 
1659
    END;
1710
    stack := RTL.ram + ram;
1660
 
1711
    Bss.size := IL.codes.bss + IL.codes.bss MOD 2;
1661
    Bss.address := RTL.ram + RTL.VarSize;
1712
    DEC(stack, Bss.size);
Line 1673... Line 1724...
1673
        adr := reloc.WordPtr.offset * 2;
1724
        adr := reloc.WordPtr.offset * 2;
1674
        val := reloc.WordPtr.val;
1725
        val := reloc.WordPtr.val;
1675
        CASE reloc.section OF
1726
        CASE reloc.section OF
1676
        |RCODE: PutWord(LabelOffs(val) * 2, adr)
1727
        |RCODE: PutWord(LabelOffs(val) * 2, adr)
1677
        |RDATA: PutWord(val + Data.address, adr)
1728
        |RDATA: PutWord(val + Data.address, adr)
1678
        |RBSS:  PutWord(val + Bss.address, adr)
1729
        |RBSS:  PutWord((val + Bss.address) MOD 65536, adr)
1679
        END;
1730
        END;
1680
        reloc := reloc.next(RELOC)
1731
        reloc := reloc.next(RELOC)
1681
    END;
1732
    END;
Line 1682... Line 1733...
1682
 
1733
 
Line 1683... Line 1734...
1683
    adr := Data.address;
1734
    adr := Data.address;
1684
 
1735
 
1685
    FOR i := 0 TO CHL.Length(IL.codes.data) - 1 DO
1736
    FOR i := 0 TO Data.size - 1 DO
1686
        mem[adr] := CHL.GetByte(IL.codes.data, i);
1737
        mem[adr] := CHL.GetByte(IL.codes.data, i);
Line 1687... Line -...
1687
        INC(adr)
-
 
1688
    END;
-
 
1689
 
1738
        INC(adr)
1690
    adr := 10000H - IntVectorSize - TypesSize;
1739
    END;
1691
 
1740
 
Line 1692... Line 1741...
1692
    FOR i := TypesSize DIV 2 - 1 TO 0 BY -1 DO
1741
    FOR i := TypesSize DIV 2 - 1 TO 0 BY -1 DO
Line 1703... Line 1752...
1703
            PutWord(bits, adr);
1752
            PutWord(bits, adr);
1704
            bits := LSL(bits, 1)
1753
            bits := LSL(bits, 1)
1705
        END
1754
        END
1706
    END;
1755
    END;
Line 1707... Line -...
1707
 
-
 
1708
    Free.address := Code.address + TextSize;
-
 
1709
    Free.size := rom - (IntVectorSize + TypesSize + TextSize);
-
 
1710
 
-
 
1711
    PutWord(Free.address, adr);
-
 
1712
    PutWord(Free.size, adr);
1756
 
1713
    PutWord(4130H, adr); (* RET *)
1757
    PutWord(4130H, adr); (* RET *)
1714
    PutWord(stack, adr);
1758
    PutWord(stack, adr);
Line 1715... Line 1759...
1715
    PutWord(0001H, adr); (* bsl signature (adr 0FFBEH) *)
1759
    PutWord(0001H, adr); (* bsl signature (adr 0FFBEH) *)
1716
 
1760
 
1717
    FOR i := 0 TO LEN(IV) - 1 DO
1761
    FOR i := 0 TO LEN(IV) - 1 DO
Line -... Line 1762...
-
 
1762
        PutWord(LabelOffs(IV[i]) * 2, adr)
1718
        PutWord(LabelOffs(IV[i]) * 2, adr)
1763
    END;
Line 1719... Line 1764...
1719
    END;
1764
 
1720
 
1765
    INC(TextSize, IntVectorSize + TypesSize + Code.address MOD 16);
1721
    WR.Create(outname);
1766
    INC(Bss.size, StkReserve + RTL.VarSize);
1722
 
-
 
1723
    HEX.Data(mem, Code.address, TextSize);
1767
 
Line 1724... Line -...
1724
    HEX.Data(mem, 10000H - IntVectorSize - TypesSize, IntVectorSize + TypesSize);
-
 
1725
    HEX.End;
1768
    WR.Create(outname);
1726
 
-
 
1727
    WR.Close;
-
 
1728
 
1769
    HEX.Data(mem, Code.address - Code.address MOD 16, TextSize);
1729
    INC(TextSize, IntVectorSize + TypesSize);
-
 
1730
    INC(Bss.size, minStackSize + RTL.VarSize);
-
 
1731
 
-
 
1732
    C.StringLn("--------------------------------------------");
-
 
1733
    C.String(  "  rom:  "); C.Int(TextSize); C.String(" of "); C.Int(rom); C.String("  ("); C.Int(TextSize * 100 DIV rom); C.StringLn("%)");
1770
    HEX.End;
1734
    IF Free.size > 0 THEN
1771
    WR.Close;
1735
        C.String(  "        "); C.Int(Free.size); C.String(" bytes free (0");
-
 
1736
            C.Hex(Free.address, 4); C.String("H..0"); C.Hex(Free.address + Free.size - 1, 4); C.StringLn("H)")
1772
 
Line 1737... Line 1773...
1737
    END;
1773
    C.Dashes;
1738
    C.Ln;
1774
    C.String("  rom:  "); C.Int(TextSize); C.String(" of "); C.Int(rom); C.String("  ("); C.Int(TextSize * 100 DIV rom); C.StringLn("%)");