Subversion Repositories Kolibri OS

Rev

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

Rev 7107 Rev 7209
Line 1... Line 1...
1
(*
1
(*
2
    Copyright 2016, 2017 Anton Krotov
2
    Copyright 2016, 2017, 2018 Anton Krotov
Line 3... Line 3...
3
 
3
 
Line 4... Line 4...
4
    This file is part of Compiler.
4
    This file is part of Compiler.
5
 
5
 
Line 117... Line 117...
117
  RELOC = RECORD
117
  RELOC = RECORD
118
    Page, Size: INTEGER;
118
    Page, Size: INTEGER;
119
    reloc: ARRAY 1024 OF sys.CARD16
119
    reloc: ARRAY 1024 OF sys.CARD16
120
  END;
120
  END;
Line 121... Line 121...
121
 
121
 
122
VAR asmlist: UTILS.LIST; start: ASMLINE; dll, con, gui, kos, elf, obj: BOOLEAN;
122
VAR asmlist: UTILS.LIST; start: ASMLINE; dll, con, gui, kos, elf, obj, kem: BOOLEAN;
123
    Lcount, reccount, topstk: INTEGER; recarray: ARRAY 2048 OF INTEGER; current*: ASMLINE;
123
    Lcount, reccount, topstk: INTEGER; recarray: ARRAY 2048 OF INTEGER; current*: ASMLINE;
124
    callstk: ARRAY 1024, 2 OF ASMLINE; OutFile: UTILS.STRING;
124
    callstk: ARRAY 1024, 2 OF ASMLINE; OutFile: UTILS.STRING;
125
    Code: ARRAY 4000000 OF CHAR; ccount: INTEGER; Data: ARRAY 1000000 OF CHAR; dcount: INTEGER;
125
    Code: ARRAY 4000000 OF CHAR; ccount: INTEGER; Data: ARRAY 1000000 OF CHAR; dcount: INTEGER;
126
    Labels: ARRAY 200000 OF INTEGER; rdata: ARRAY 400H OF INTEGER; Header: HEADER; etable: ETABLE;
126
    Labels: ARRAY 200000 OF INTEGER; rdata: ARRAY 400H OF INTEGER; Header: HEADER; etable: ETABLE;
127
    ExecName: UTILS.STRING; LoadAdr: INTEGER; Reloc: ARRAY 200000 OF CHAR; rcount: INTEGER;
127
    ExecName: UTILS.STRING; LoadAdr: INTEGER; Reloc: ARRAY 200000 OF CHAR; rcount: INTEGER;
128
    RtlProc: ARRAY 20 OF INTEGER; OutFilePos: INTEGER; RelocSection: SECTION;
128
    RtlProc: ARRAY 20 OF INTEGER; OutFilePos: INTEGER; RelocSection: SECTION;
129
    fpu*: INTEGER; isfpu: BOOLEAN; maxfpu: INTEGER; fpucmd: ASMLINE;
129
    fpu*: INTEGER; isfpu: BOOLEAN; maxfpu: INTEGER; fpucmd: ASMLINE;
-
 
130
    kosexp: ARRAY 65536 OF RECORD Name: SCAN.NODE; Adr, NameLabel: INTEGER END; kosexpcount: INTEGER;
-
 
131
    maxstrlen*: INTEGER;
-
 
132
 
-
 
133
PROCEDURE set_maxstrlen* (value: INTEGER);
-
 
134
BEGIN
-
 
135
    maxstrlen := value
Line 130... Line 136...
130
    kosexp: ARRAY 65536 OF RECORD Name: SCAN.NODE; Adr, NameLabel: INTEGER END; kosexpcount: INTEGER;
136
END set_maxstrlen;
131
 
137
 
132
PROCEDURE AddRtlProc*(idx, proc: INTEGER);
138
PROCEDURE AddRtlProc*(idx, proc: INTEGER);
133
BEGIN
139
BEGIN
Line 565... Line 571...
565
  Lcount := HALT;
571
  Lcount := HALT;
566
  asmlist := UTILS.CreateList();
572
  asmlist := UTILS.CreateList();
567
  NEW(nov);
573
  NEW(nov);
568
  UTILS.MemErr(nov = NIL);
574
  UTILS.MemErr(nov = NIL);
569
  UTILS.Push(asmlist, nov);
575
  UTILS.Push(asmlist, nov);
570
  current := nov;
576
  current := nov
571
END Init;
577
END Init;
Line 572... Line 578...
572
 
578
 
573
PROCEDURE datastr(str: UTILS.STRING);
579
PROCEDURE datastr(str: UTILS.STRING);
574
VAR i, n: INTEGER;
580
VAR i, n: INTEGER;
Line 1554... Line 1560...
1554
  UTILS.MemErr(OutFilePos = 0);
1560
  UTILS.MemErr(OutFilePos = 0);
Line 1555... Line 1561...
1555
 
1561
 
1556
  IF ~obj THEN
1562
  IF ~obj THEN
1557
    Header.menuet01 := "MENUET01";
1563
    Header.menuet01 := "MENUET01";
1558
    Header.ver := 1;
1564
    Header.ver := 1;
1559
    Header.start := sys.SIZE(KOSHEADER);
1565
    Header.start := sys.SIZE(KOSHEADER) + ORD(kem) * 65536;
1560
    Header.size := Align(size, 4) + datasize;
1566
    Header.size := Align(size, 4) + datasize;
1561
    Header.mem := Header.size + stk + gsize + strsize * 2 + 1000H;
1567
    Header.mem := Header.size + stk + gsize + strsize * 2 + 1000H;
1562
    Header.sp := Header.size + gsize + stk;
1568
    Header.sp := Header.size + gsize + stk;// + ORD(kem) * 65536;
1563
    Header.param := Header.sp;
1569
    Header.param := Header.sp;
Line 1564... Line 1570...
1564
    Header.path := Header.param + strsize;
1570
    Header.path := Header.param + strsize;
Line 1766... Line 1772...
1766
    LoadAdr := 10000000H;
1772
    LoadAdr := 10000000H;
1767
    PackExport(ExecName)
1773
    PackExport(ExecName)
1768
  ELSIF con OR gui THEN
1774
  ELSIF con OR gui THEN
1769
    LoadAdr := 400000H
1775
    LoadAdr := 400000H
1770
  ELSIF kos OR obj THEN
1776
  ELSIF kos OR obj THEN
1771
    LoadAdr := sys.SIZE(KOSHEADER)
1777
    LoadAdr := sys.SIZE(KOSHEADER) + ORD(kem & kos) * 65536
1772
  ELSIF elf THEN
1778
  ELSIF elf THEN
1773
    LoadAdr := 134514420 + 1024;
1779
    LoadAdr := 134514420 + 1024;
1774
    INC(gsize, 1024)
1780
    INC(gsize, 1024)
1775
  END;
1781
  END;
Line 1924... Line 1930...
1924
 
1930
 
1925
PROCEDURE Epilog*(gsize: INTEGER; FName: ARRAY OF CHAR; stk: INTEGER);
1931
PROCEDURE Epilog*(gsize: INTEGER; FName: ARRAY OF CHAR; stk: INTEGER);
1926
VAR i, glob: INTEGER;
1932
VAR i, glob: INTEGER;
1927
BEGIN
1933
BEGIN
-
 
1934
  glob := 0;
-
 
1935
  IF gsize < maxstrlen THEN
-
 
1936
      gsize := maxstrlen
1928
  glob := 0;
1937
  END;
1929
  gsize := Align(gsize, 4) + 4;
1938
  gsize := Align(gsize, 4) + 4;
1930
  COPY(FName, OutFile);
1939
  COPY(FName, OutFile);
1931
  Labels[RTABLE] := -dcount;
1940
  Labels[RTABLE] := -dcount;
1932
  dataint(recarray[0]);
1941
  dataint(recarray[0]);
Line 1983... Line 1992...
1983
    END
1992
    END
1984
  END;
1993
  END;
1985
  FixLabels(FName, stk, gsize, glob)
1994
  FixLabels(FName, stk, gsize, glob)
1986
END Epilog;
1995
END Epilog; 
Line -... Line 1996...
-
 
1996
 
-
 
1997
PROCEDURE setkem*;
-
 
1998
BEGIN            
-
 
1999
    kem := TRUE
-
 
2000
END setkem;
-
 
2001
 
-
 
2002
BEGIN
1987
 
2003
    kem := FALSE
1988
END X86.
2004
END X86.