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("%)"); |