From 6fb87a797f60e4a08fc0d8b56f9359bce50f307b Mon Sep 17 00:00:00 2001 From: AntKrotov Date: Fri, 12 Feb 2021 00:02:44 +0300 Subject: [PATCH] =?UTF-8?q?RVMxI:=2032=20=D0=B8=2064=20=D0=B1=D0=B8=D1=82?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Compiler | Bin 306008 -> 307864 bytes Compiler.exe | Bin 307712 -> 309760 bytes lib/{RVM32I => RVMxI/32}/FPU.ob07 | 0 lib/{RVM32I => RVMxI/32}/HOST.ob07 | 0 lib/{RVM32I => RVMxI/32}/Out.ob07 | 0 lib/{RVM32I => RVMxI/32}/RTL.ob07 | 0 lib/{RVM32I => RVMxI/32}/Trap.ob07 | 0 lib/RVMxI/64/HOST.ob07 | 192 +++++++++++++ lib/RVMxI/64/Out.ob07 | 288 +++++++++++++++++++ lib/RVMxI/64/RTL.ob07 | 432 +++++++++++++++++++++++++++++ lib/RVMxI/64/Trap.ob07 | 133 +++++++++ self-win64-RVM32I.cmd | 5 + self-win64-RVM64I.cmd | 5 + source/Compiler.ob07 | 1 + source/IL.ob07 | 2 +- source/PARS.ob07 | 6 +- source/{RVM32I.ob07 => RVMxI.ob07} | 235 +++++++++++----- source/STATEMENTS.ob07 | 9 +- source/TARGETS.ob07 | 18 +- source/UTILS.ob07 | 4 +- tools/{RVM32I.ob07 => RVMxI.ob07} | 210 +++++++++----- tools/{RVM32I.txt => RVMxI.txt} | 64 +++-- 22 files changed, 1438 insertions(+), 166 deletions(-) rename lib/{RVM32I => RVMxI/32}/FPU.ob07 (100%) rename lib/{RVM32I => RVMxI/32}/HOST.ob07 (100%) rename lib/{RVM32I => RVMxI/32}/Out.ob07 (100%) rename lib/{RVM32I => RVMxI/32}/RTL.ob07 (100%) rename lib/{RVM32I => RVMxI/32}/Trap.ob07 (100%) create mode 100644 lib/RVMxI/64/HOST.ob07 create mode 100644 lib/RVMxI/64/Out.ob07 create mode 100644 lib/RVMxI/64/RTL.ob07 create mode 100644 lib/RVMxI/64/Trap.ob07 create mode 100644 self-win64-RVM32I.cmd create mode 100644 self-win64-RVM64I.cmd rename source/{RVM32I.ob07 => RVMxI.ob07} (83%) rename tools/{RVM32I.ob07 => RVMxI.ob07} (76%) rename tools/{RVM32I.txt => RVMxI.txt} (83%) diff --git a/Compiler b/Compiler index 86eb7f05dfd57a4176b547370647afd27567265d..93e491996e40b9271a4fdff134b62113dd1ec692 100644 GIT binary patch delta 67361 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 YrpQZ&vHD}oUl2LoDXzuI$S0!xf7cIEp8x;= delta 65985 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 Jzinh$1OSV}NJ9Vs diff --git a/Compiler.exe b/Compiler.exe index 2f3f4aa695e01a547351ea1ee61d36c8081df4c2..f430d5699d31ff3f1eaa50b078922e90d0dc8851 100644 GIT binary patch delta 67233 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 delta 65662 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 D8=zI8 diff --git a/lib/RVM32I/FPU.ob07 b/lib/RVMxI/32/FPU.ob07 similarity index 100% rename from lib/RVM32I/FPU.ob07 rename to lib/RVMxI/32/FPU.ob07 diff --git a/lib/RVM32I/HOST.ob07 b/lib/RVMxI/32/HOST.ob07 similarity index 100% rename from lib/RVM32I/HOST.ob07 rename to lib/RVMxI/32/HOST.ob07 diff --git a/lib/RVM32I/Out.ob07 b/lib/RVMxI/32/Out.ob07 similarity index 100% rename from lib/RVM32I/Out.ob07 rename to lib/RVMxI/32/Out.ob07 diff --git a/lib/RVM32I/RTL.ob07 b/lib/RVMxI/32/RTL.ob07 similarity index 100% rename from lib/RVM32I/RTL.ob07 rename to lib/RVMxI/32/RTL.ob07 diff --git a/lib/RVM32I/Trap.ob07 b/lib/RVMxI/32/Trap.ob07 similarity index 100% rename from lib/RVM32I/Trap.ob07 rename to lib/RVMxI/32/Trap.ob07 diff --git a/lib/RVMxI/64/HOST.ob07 b/lib/RVMxI/64/HOST.ob07 new file mode 100644 index 0000000..6aa7b71 --- /dev/null +++ b/lib/RVMxI/64/HOST.ob07 @@ -0,0 +1,192 @@ +(* + BSD 2-Clause License + + Copyright (c) 2020-2021, Anton Krotov + All rights reserved. +*) + +MODULE HOST; + +IMPORT SYSTEM, Trap; + + +CONST + + slash* = "\"; + eol* = 0DX + 0AX; + + bit_depth* = 64; + maxint* = ROR(-2, 1); + minint* = ROR(1, 1); + + +VAR + + maxreal*: REAL; + + +PROCEDURE syscall0 (fn: INTEGER): INTEGER; +BEGIN + Trap.syscall(SYSTEM.ADR(fn)) + RETURN fn +END syscall0; + + +PROCEDURE syscall1 (fn, p1: INTEGER): INTEGER; +BEGIN + Trap.syscall(SYSTEM.ADR(fn)) + RETURN fn +END syscall1; + + +PROCEDURE syscall2 (fn, p1, p2: INTEGER): INTEGER; +BEGIN + Trap.syscall(SYSTEM.ADR(fn)) + RETURN fn +END syscall2; + + +PROCEDURE syscall3 (fn, p1, p2, p3: INTEGER): INTEGER; +BEGIN + Trap.syscall(SYSTEM.ADR(fn)) + RETURN fn +END syscall3; + + +PROCEDURE syscall4 (fn, p1, p2, p3, p4: INTEGER): INTEGER; +BEGIN + Trap.syscall(SYSTEM.ADR(fn)) + RETURN fn +END syscall4; + + +PROCEDURE ExitProcess* (code: INTEGER); +BEGIN + code := syscall1(0, code) +END ExitProcess; + + +PROCEDURE GetCurrentDirectory* (VAR path: ARRAY OF CHAR); +VAR + a: INTEGER; +BEGIN + a := syscall2(1, LEN(path), SYSTEM.ADR(path[0])) +END GetCurrentDirectory; + + +PROCEDURE GetArg* (n: INTEGER; VAR s: ARRAY OF CHAR); +BEGIN + n := syscall3(2, n, LEN(s), SYSTEM.ADR(s[0])) +END GetArg; + + +PROCEDURE FileRead* (F: INTEGER; VAR Buffer: ARRAY OF CHAR; bytes: INTEGER): INTEGER; + RETURN syscall4(3, F, LEN(Buffer), SYSTEM.ADR(Buffer[0]), bytes) +END FileRead; + + +PROCEDURE FileWrite* (F: INTEGER; Buffer: ARRAY OF BYTE; bytes: INTEGER): INTEGER; + RETURN syscall4(4, F, LEN(Buffer), SYSTEM.ADR(Buffer[0]), bytes) +END FileWrite; + + +PROCEDURE FileCreate* (FName: ARRAY OF CHAR): INTEGER; + RETURN syscall2(5, LEN(FName), SYSTEM.ADR(FName[0])) +END FileCreate; + + +PROCEDURE FileClose* (F: INTEGER); +BEGIN + F := syscall1(6, F) +END FileClose; + + +PROCEDURE FileOpen* (FName: ARRAY OF CHAR): INTEGER; + RETURN syscall2(7, LEN(FName), SYSTEM.ADR(FName[0])) +END FileOpen; + + +PROCEDURE chmod* (FName: ARRAY OF CHAR); +VAR + a: INTEGER; +BEGIN + a := syscall2(12, LEN(FName), SYSTEM.ADR(FName[0])) +END chmod; + + +PROCEDURE OutChar* (c: CHAR); +VAR + a: INTEGER; +BEGIN + a := syscall1(8, ORD(c)) +END OutChar; + + +PROCEDURE GetTickCount* (): INTEGER; + RETURN syscall0(9) +END GetTickCount; + + +PROCEDURE isRelative* (path: ARRAY OF CHAR): BOOLEAN; + RETURN syscall2(11, LEN(path), SYSTEM.ADR(path[0])) # 0 +END isRelative; + + +PROCEDURE UnixTime* (): INTEGER; + RETURN syscall0(10) +END UnixTime; + + +PROCEDURE splitf* (x: REAL; VAR a, b: INTEGER): INTEGER; +VAR + res: INTEGER; + +BEGIN + a := 0; + b := 0; + SYSTEM.GET32(SYSTEM.ADR(x), a); + SYSTEM.GET32(SYSTEM.ADR(x) + 4, b); + SYSTEM.GET(SYSTEM.ADR(x), res) + RETURN res +END splitf; + + +PROCEDURE d2s* (x: REAL): INTEGER; +VAR + h, l, s, e: INTEGER; + +BEGIN + e := splitf(x, l, h); + + s := ASR(h, 31) MOD 2; + e := (h DIV 100000H) MOD 2048; + IF e <= 896 THEN + h := (h MOD 100000H) * 8 + (l DIV 20000000H) MOD 8 + 800000H; + REPEAT + h := h DIV 2; + INC(e) + UNTIL e = 897; + e := 896; + l := (h MOD 8) * 20000000H; + h := h DIV 8 + ELSIF (1151 <= e) & (e < 2047) THEN + e := 1151; + h := 0; + l := 0 + ELSIF e = 2047 THEN + e := 1151; + IF (h MOD 100000H # 0) OR (BITS(l) * {0..31} # {}) THEN + h := 80000H; + l := 0 + END + END; + DEC(e, 896) + + RETURN LSL(s, 31) + LSL(e, 23) + (h MOD 100000H) * 8 + (l DIV 20000000H) MOD 8 +END d2s; + + +BEGIN + maxreal := 1.9; + PACK(maxreal, 1023) +END HOST. \ No newline at end of file diff --git a/lib/RVMxI/64/Out.ob07 b/lib/RVMxI/64/Out.ob07 new file mode 100644 index 0000000..5fbf92c --- /dev/null +++ b/lib/RVMxI/64/Out.ob07 @@ -0,0 +1,288 @@ +(* + BSD 2-Clause License + + Copyright (c) 2016, 2018, 2020-2021 Anton Krotov + All rights reserved. +*) + +MODULE Out; + +IMPORT HOST, SYSTEM; + + +PROCEDURE Char* (c: CHAR); +BEGIN + HOST.OutChar(c) +END Char; + + +PROCEDURE String* (s: ARRAY OF CHAR); +VAR + i, n: INTEGER; + +BEGIN + n := LENGTH(s) - 1; + FOR i := 0 TO n DO + Char(s[i]) + END +END String; + + +PROCEDURE Int* (x, width: INTEGER); +VAR + i, a: INTEGER; + str: ARRAY 21 OF CHAR; + +BEGIN + IF x = ROR(1, 1) THEN + str := "-9223372036854775808"; + DEC(width, 20) + ELSE + i := 0; + IF x < 0 THEN + x := -x; + i := 1; + str[0] := "-" + END; + + a := x; + REPEAT + INC(i); + a := a DIV 10 + UNTIL a = 0; + + str[i] := 0X; + DEC(width, i); + + REPEAT + DEC(i); + str[i] := CHR(x MOD 10 + ORD("0")); + x := x DIV 10 + UNTIL x = 0 + END; + + WHILE width > 0 DO + Char(20X); + DEC(width) + END; + + String(str) +END Int; + + +PROCEDURE IsNan (x: REAL): BOOLEAN; +CONST + INF = LSR(ASR(ROR(1, 1), 10), 1); + NINF = ASR(ASR(ROR(1, 1), 10), 1); + +VAR + a: INTEGER; + +BEGIN + SYSTEM.GET(SYSTEM.ADR(x), a) + RETURN (a > INF) OR (a < 0) & (a > NINF) +END IsNan; + + +PROCEDURE Inf (x: REAL; width: INTEGER); +VAR + s: ARRAY 5 OF CHAR; + +BEGIN + DEC(width, 4); + IF IsNan(x) THEN + s := " Nan" + ELSIF x = SYSTEM.INF() THEN + s := "+Inf" + ELSIF x = -SYSTEM.INF() THEN + s := "-Inf" + END; + + WHILE width > 0 DO + Char(20X); + DEC(width) + END; + + String(s) +END Inf; + + +PROCEDURE Ln*; +BEGIN + Char(0DX); + Char(0AX) +END Ln; + + +PROCEDURE unpk10 (VAR x: REAL; VAR n: INTEGER); +VAR + a, b: REAL; + +BEGIN + ASSERT(x > 0.0); + n := 0; + WHILE x < 1.0 DO + x := x * 10.0; + DEC(n) + END; + + a := 10.0; + b := 1.0; + + WHILE a <= x DO + b := a; + a := a * 10.0; + INC(n) + END; + x := x / b +END unpk10; + + +PROCEDURE _Real (x: REAL; width: INTEGER); +VAR + n, k, p: INTEGER; + +BEGIN + p := MIN(MAX(width - 8, 1), 15); + + width := width - p - 8; + WHILE width > 0 DO + Char(20X); + DEC(width) + END; + + IF x < 0.0 THEN + Char("-"); + x := -x + ELSE + Char(20X) + END; + + unpk10(x, n); + + k := FLOOR(x); + Char(CHR(k + 30H)); + Char("."); + + WHILE p > 0 DO + x := (x - FLT(k)) * 10.0; + k := FLOOR(x); + Char(CHR(k + 30H)); + DEC(p) + END; + + Char("E"); + IF n >= 0 THEN + Char("+") + ELSE + Char("-") + END; + n := ABS(n); + Char(CHR(n DIV 100 + 30H)); n := n MOD 100; + Char(CHR(n DIV 10 + 30H)); + Char(CHR(n MOD 10 + 30H)) +END _Real; + + +PROCEDURE Real* (x: REAL; width: INTEGER); +BEGIN + IF IsNan(x) OR (ABS(x) = SYSTEM.INF()) THEN + Inf(x, width) + ELSIF x = 0.0 THEN + WHILE width > 23 DO + Char(20X); + DEC(width) + END; + DEC(width, 9); + String(" 0.0"); + WHILE width > 0 DO + Char("0"); + DEC(width) + END; + String("E+000") + ELSE + _Real(x, width) + END +END Real; + + +PROCEDURE _FixReal (x: REAL; width, p: INTEGER); +VAR + n, k: INTEGER; + minus: BOOLEAN; + +BEGIN + minus := x < 0.0; + IF minus THEN + x := -x + END; + + unpk10(x, n); + + DEC(width, 3 + MAX(p, 0) + MAX(n, 0)); + WHILE width > 0 DO + Char(20X); + DEC(width) + END; + + IF minus THEN + Char("-") + ELSE + Char(20X) + END; + + IF n < 0 THEN + INC(n); + Char("0"); + Char("."); + WHILE (n < 0) & (p > 0) DO + Char("0"); + INC(n); + DEC(p) + END + ELSE + WHILE n >= 0 DO + k := FLOOR(x); + Char(CHR(k + 30H)); + x := (x - FLT(k)) * 10.0; + DEC(n) + END; + Char(".") + END; + + WHILE p > 0 DO + k := FLOOR(x); + Char(CHR(k + 30H)); + x := (x - FLT(k)) * 10.0; + DEC(p) + END + +END _FixReal; + + +PROCEDURE FixReal* (x: REAL; width, p: INTEGER); +BEGIN + IF IsNan(x) OR (ABS(x) = SYSTEM.INF()) THEN + Inf(x, width) + ELSIF x = 0.0 THEN + DEC(width, 3 + MAX(p, 0)); + WHILE width > 0 DO + Char(20X); + DEC(width) + END; + String(" 0."); + WHILE p > 0 DO + Char("0"); + DEC(p) + END + ELSE + _FixReal(x, width, p) + END +END FixReal; + + +PROCEDURE Open*; +END Open; + + +END Out. \ No newline at end of file diff --git a/lib/RVMxI/64/RTL.ob07 b/lib/RVMxI/64/RTL.ob07 new file mode 100644 index 0000000..2c32d51 --- /dev/null +++ b/lib/RVMxI/64/RTL.ob07 @@ -0,0 +1,432 @@ +(* + BSD 2-Clause License + + Copyright (c) 2019-2021, Anton Krotov + All rights reserved. +*) + +MODULE RTL; + +IMPORT SYSTEM, Trap; + + +CONST + + bit_depth = 64; + maxint = ROR(-2, 1); + minint = ROR(1, 1); + + WORD = bit_depth DIV 8; + MAX_SET = bit_depth - 1; + + +VAR + + Heap, Types, TypesCount: INTEGER; + + +PROCEDURE _error* (modnum, _module, err, line: INTEGER); +BEGIN + Trap.trap(modnum, _module, err, line) +END _error; + + +PROCEDURE syscall1 (fn, p1: INTEGER): INTEGER; +BEGIN + Trap.syscall(SYSTEM.ADR(fn)) + RETURN fn +END syscall1; + + +PROCEDURE syscall2 (fn, p1, p2: INTEGER): INTEGER; +BEGIN + Trap.syscall(SYSTEM.ADR(fn)) + RETURN fn +END syscall2; + + +PROCEDURE syscall3 (fn, p1, p2, p3: INTEGER): INTEGER; +BEGIN + Trap.syscall(SYSTEM.ADR(fn)) + RETURN fn +END syscall3; + + +PROCEDURE _fmul* (b, a: INTEGER): INTEGER; + RETURN syscall2(100, b, a) +END _fmul; + + +PROCEDURE _fdiv* (b, a: INTEGER): INTEGER; + RETURN syscall2(101, b, a) +END _fdiv; + + +PROCEDURE _fdivi* (b, a: INTEGER): INTEGER; + RETURN syscall2(101, a, b) +END _fdivi; + + +PROCEDURE _fadd* (b, a: INTEGER): INTEGER; + RETURN syscall2(102, b, a) +END _fadd; + + +PROCEDURE _fsub* (b, a: INTEGER): INTEGER; + RETURN syscall2(103, b, a) +END _fsub; + + +PROCEDURE _fsubi* (b, a: INTEGER): INTEGER; + RETURN syscall2(103, a, b) +END _fsubi; + + +PROCEDURE _fcmp* (op, b, a: INTEGER): BOOLEAN; + RETURN syscall3(104, op, b, a) # 0 +END _fcmp; + + +PROCEDURE _floor* (x: INTEGER): INTEGER; + RETURN syscall1(105, x) +END _floor; + + +PROCEDURE _flt* (x: INTEGER): INTEGER; + RETURN syscall1(106, x) +END _flt; + + +PROCEDURE _pack* (n: INTEGER; VAR x: SET); +BEGIN + n := LSL((LSR(ORD(x), 52) MOD 2048 + n) MOD 2048, 52); + x := x - {52..62} + BITS(n) +END _pack; + + +PROCEDURE _unpk* (VAR n: INTEGER; VAR x: SET); +BEGIN + n := LSR(ORD(x), 52) MOD 2048 - 1023; + x := x - {62} + {52..61} +END _unpk; + + +PROCEDURE _rot* (VAR A: ARRAY OF INTEGER); +VAR + i, n, k: INTEGER; + +BEGIN + k := LEN(A) - 1; + n := A[0]; + i := 0; + WHILE i < k DO + A[i] := A[i + 1]; + INC(i) + END; + A[k] := n +END _rot; + + +PROCEDURE _set* (b, a: INTEGER): INTEGER; +BEGIN + IF (a <= b) & (a <= MAX_SET) & (b >= 0) THEN + IF b > MAX_SET THEN + b := MAX_SET + END; + IF a < 0 THEN + a := 0 + END; + a := LSR(ASR(minint, b - a), MAX_SET - b) + ELSE + a := 0 + END + + RETURN a +END _set; + + +PROCEDURE _set1* (a: INTEGER): INTEGER; +BEGIN + IF ASR(a, 6) = 0 THEN + a := LSL(1, a) + ELSE + a := 0 + END + RETURN a +END _set1; + + +PROCEDURE _length* (len, str: INTEGER): INTEGER; +VAR + c: CHAR; + res: INTEGER; + +BEGIN + res := 0; + REPEAT + SYSTEM.GET(str, c); + INC(str); + DEC(len); + INC(res) + UNTIL (len = 0) OR (c = 0X); + + RETURN res - ORD(c = 0X) +END _length; + + +PROCEDURE _move* (bytes, dest, source: INTEGER); +VAR + b: BYTE; + i: INTEGER; + +BEGIN + IF (source MOD WORD = 0) & (dest MOD WORD = 0) THEN + WHILE bytes >= WORD DO + SYSTEM.GET(source, i); + SYSTEM.PUT(dest, i); + INC(source, WORD); + INC(dest, WORD); + DEC(bytes, WORD) + END + END; + + WHILE bytes > 0 DO + SYSTEM.GET(source, b); + SYSTEM.PUT8(dest, b); + INC(source); + INC(dest); + DEC(bytes) + END +END _move; + + +PROCEDURE _lengthw* (len, str: INTEGER): INTEGER; +VAR + c: WCHAR; + res: INTEGER; + +BEGIN + res := 0; + REPEAT + SYSTEM.GET(str, c); + INC(str, 2); + DEC(len); + INC(res) + UNTIL (len = 0) OR (c = 0X); + + RETURN res - ORD(c = 0X) +END _lengthw; + + +PROCEDURE strncmp (a, b, n: INTEGER): INTEGER; +VAR + A, B: CHAR; + res: INTEGER; + +BEGIN + res := minint; + WHILE n > 0 DO + SYSTEM.GET(a, A); INC(a); + SYSTEM.GET(b, B); INC(b); + DEC(n); + IF A # B THEN + res := ORD(A) - ORD(B); + n := 0 + ELSIF A = 0X THEN + res := 0; + n := 0 + END + END + RETURN res +END strncmp; + + +PROCEDURE _strcmp* (op, len2, str2, len1, str1: INTEGER): BOOLEAN; +VAR + res: INTEGER; + bRes: BOOLEAN; + c: CHAR; + +BEGIN + res := strncmp(str1, str2, MIN(len1, len2)); + IF res = minint THEN + IF len1 > len2 THEN + SYSTEM.GET(str1 + len2, c); + res := ORD(c) + ELSIF len1 < len2 THEN + SYSTEM.GET(str2 + len1, c); + res := -ORD(c) + ELSE + res := 0 + END + END; + + CASE op OF + |0: bRes := res = 0 + |1: bRes := res # 0 + |2: bRes := res < 0 + |3: bRes := res <= 0 + |4: bRes := res > 0 + |5: bRes := res >= 0 + END + + RETURN bRes +END _strcmp; + + +PROCEDURE strncmpw (a, b, n: INTEGER): INTEGER; +VAR + A, B: WCHAR; + res: INTEGER; + +BEGIN + res := minint; + WHILE n > 0 DO + SYSTEM.GET(a, A); INC(a, 2); + SYSTEM.GET(b, B); INC(b, 2); + DEC(n); + IF A # B THEN + res := ORD(A) - ORD(B); + n := 0 + ELSIF A = 0X THEN + res := 0; + n := 0 + END + END + RETURN res +END strncmpw; + + +PROCEDURE _strcmpw* (op, len2, str2, len1, str1: INTEGER): BOOLEAN; +VAR + res: INTEGER; + bRes: BOOLEAN; + c: WCHAR; + +BEGIN + res := strncmpw(str1, str2, MIN(len1, len2)); + IF res = minint THEN + IF len1 > len2 THEN + SYSTEM.GET(str1 + len2 * 2, c); + res := ORD(c) + ELSIF len1 < len2 THEN + SYSTEM.GET(str2 + len1 * 2, c); + res := -ORD(c) + ELSE + res := 0 + END + END; + + CASE op OF + |0: bRes := res = 0 + |1: bRes := res # 0 + |2: bRes := res < 0 + |3: bRes := res <= 0 + |4: bRes := res > 0 + |5: bRes := res >= 0 + END + + RETURN bRes +END _strcmpw; + + +PROCEDURE _arrcpy* (base_size, len_dst, dst, len_src, src: INTEGER): BOOLEAN; +VAR + res: BOOLEAN; + +BEGIN + IF len_src > len_dst THEN + res := FALSE + ELSE + _move(len_src * base_size, dst, src); + res := TRUE + END + + RETURN res +END _arrcpy; + + +PROCEDURE _strcpy* (chr_size, len_src, src, len_dst, dst: INTEGER); +BEGIN + _move(MIN(len_dst, len_src) * chr_size, dst, src) +END _strcpy; + + +PROCEDURE _new* (t, size: INTEGER; VAR p: INTEGER); +VAR + ptr: INTEGER; + +BEGIN + ptr := Heap; + IF ptr + size < Trap.sp() - 128 THEN + INC(Heap, size); + p := ptr + WORD; + SYSTEM.PUT(ptr, t); + INC(ptr, WORD); + DEC(size, WORD); + WHILE size > 0 DO + SYSTEM.PUT(ptr, 0); + INC(ptr, WORD); + DEC(size, WORD) + END + ELSE + p := 0 + END +END _new; + + +PROCEDURE _guard* (t, p: INTEGER): BOOLEAN; +VAR + _type: INTEGER; + +BEGIN + SYSTEM.GET(p, p); + IF p # 0 THEN + SYSTEM.GET(p - WORD, _type); + WHILE (_type # t) & (_type # 0) DO + SYSTEM.GET(Types + _type * WORD, _type) + END + ELSE + _type := t + END + + RETURN _type = t +END _guard; + + +PROCEDURE _is* (t, p: INTEGER): BOOLEAN; +VAR + _type: INTEGER; + +BEGIN + _type := 0; + IF p # 0 THEN + SYSTEM.GET(p - WORD, _type); + WHILE (_type # t) & (_type # 0) DO + SYSTEM.GET(Types + _type * WORD, _type) + END + END + + RETURN _type = t +END _is; + + +PROCEDURE _guardrec* (t0, t1: INTEGER): BOOLEAN; +BEGIN + WHILE (t1 # t0) & (t1 # 0) DO + SYSTEM.GET(Types + t1 * WORD, t1) + END + + RETURN t1 = t0 +END _guardrec; + + +PROCEDURE _init* (tcount, heap, types: INTEGER); +BEGIN + Heap := heap; + TypesCount := tcount; + Types := types +END _init; + + +END RTL. \ No newline at end of file diff --git a/lib/RVMxI/64/Trap.ob07 b/lib/RVMxI/64/Trap.ob07 new file mode 100644 index 0000000..a1c2fb0 --- /dev/null +++ b/lib/RVMxI/64/Trap.ob07 @@ -0,0 +1,133 @@ +(* + BSD 2-Clause License + + Copyright (c) 2020-2021, Anton Krotov + All rights reserved. +*) + +MODULE Trap; + +IMPORT SYSTEM; + + +CONST + + SP = 4; + + +PROCEDURE [code] sp* (): INTEGER + 22, 0, SP; (* MOV R0, SP *) + + +PROCEDURE [code] syscall* (ptr: INTEGER) + 22, 0, SP, (* MOV R0, SP *) + 27, 0, 8, (* ADD R0, 8 *) + 16, 0, 0, (* LDD R0, R0 *) + 67, 0, 0; (* SYSCALL R0 *) + + +PROCEDURE Char (c: CHAR); +VAR + a: ARRAY 2 OF INTEGER; + +BEGIN + a[0] := 8; + a[1] := ORD(c); + syscall(SYSTEM.ADR(a[0])) +END Char; + + +PROCEDURE String (s: ARRAY OF CHAR); +VAR + i: INTEGER; + +BEGIN + i := 0; + WHILE s[i] # 0X DO + Char(s[i]); + INC(i) + END +END String; + + +PROCEDURE PString (ptr: INTEGER); +VAR + c: CHAR; + +BEGIN + SYSTEM.GET(ptr, c); + WHILE c # 0X DO + Char(c); + INC(ptr); + SYSTEM.GET(ptr, c) + END +END PString; + + +PROCEDURE Ln; +BEGIN + String(0DX + 0AX) +END Ln; + + +PROCEDURE IntToStr (x: INTEGER; VAR str: ARRAY OF CHAR); +VAR + i, a: INTEGER; + +BEGIN + i := 0; + a := x; + REPEAT + INC(i); + a := a DIV 10 + UNTIL a = 0; + + str[i] := 0X; + + REPEAT + DEC(i); + str[i] := CHR(x MOD 10 + ORD("0")); + x := x DIV 10 + UNTIL x = 0 +END IntToStr; + + +PROCEDURE Int (x: INTEGER); +VAR + s: ARRAY 32 OF CHAR; + +BEGIN + IntToStr(x, s); + String(s) +END Int; + + +PROCEDURE trap* (modnum, _module, err, line: INTEGER); +VAR + s: ARRAY 32 OF CHAR; + +BEGIN + CASE err OF + | 1: s := "assertion failure" + | 2: s := "NIL dereference" + | 3: s := "bad divisor" + | 4: s := "NIL procedure call" + | 5: s := "type guard error" + | 6: s := "index out of range" + | 7: s := "invalid CASE" + | 8: s := "array assignment error" + | 9: s := "CHR out of range" + |10: s := "WCHR out of range" + |11: s := "BYTE out of range" + END; + + Ln; + String("error ("); Int(err); String("): "); String(s); Ln; + String("module: "); PString(_module); Ln; + String("line: "); Int(line); Ln; + + SYSTEM.CODE(0, 0, 0) (* STOP *) +END trap; + + +END Trap. \ No newline at end of file diff --git a/self-win64-RVM32I.cmd b/self-win64-RVM32I.cmd new file mode 100644 index 0000000..18e10f0 --- /dev/null +++ b/self-win64-RVM32I.cmd @@ -0,0 +1,5 @@ +Compiler.exe ./tools/RVMxI.ob07 win32con -nochk a -out RVM32I.exe +Compiler.exe source\Compiler.ob07 rvm32i -out Compiler32.bin -lower +RVM32I.exe Compiler32.bin -dis Compiler32.txt +RVM32I.exe Compiler32.bin -run source\Compiler.ob07 rvm32i -out Compiler32.bin -lower +@pause \ No newline at end of file diff --git a/self-win64-RVM64I.cmd b/self-win64-RVM64I.cmd new file mode 100644 index 0000000..bea398f --- /dev/null +++ b/self-win64-RVM64I.cmd @@ -0,0 +1,5 @@ +Compiler.exe ./tools/RVMxI.ob07 win64con -nochk a -out RVM64I.exe +Compiler.exe source\Compiler.ob07 rvm64i -out Compiler64.bin -lower +RVM64I.exe Compiler64.bin -dis Compiler64.txt +RVM64I.exe Compiler64.bin -run source\Compiler.ob07 rvm64i -out Compiler64.bin -lower +@pause \ No newline at end of file diff --git a/source/Compiler.ob07 b/source/Compiler.ob07 index d540b40..8fc4c67 100644 --- a/source/Compiler.ob07 +++ b/source/Compiler.ob07 @@ -311,6 +311,7 @@ BEGIN |TARGETS.cpuMSP430: |TARGETS.cpuTHUMB: |TARGETS.cpuRVM32I: + |TARGETS.cpuRVM64I: END; ST.compile(path, lib_path, modname, outname, target, options); diff --git a/source/IL.ob07 b/source/IL.ob07 index 8758638..5d4c74e 100644 --- a/source/IL.ob07 +++ b/source/IL.ob07 @@ -502,7 +502,7 @@ BEGIN old_opcode := -1 END - ELSIF CPU IN {TARGETS.cpuTHUMB, TARGETS.cpuRVM32I} THEN + ELSIF CPU IN {TARGETS.cpuTHUMB, TARGETS.cpuRVM32I, TARGETS.cpuRVM64I} THEN old_opcode := cur.opcode; param2 := nov.param2; diff --git a/source/PARS.ob07 b/source/PARS.ob07 index da3fd60..447d512 100644 --- a/source/PARS.ob07 +++ b/source/PARS.ob07 @@ -668,7 +668,11 @@ BEGIN ELSE call := PROG.cdecl END - |64: call := PROG.default64 + |64: IF TARGETS.CPU = TARGETS.cpuAMD64 THEN + call := PROG.default64 + ELSE + call := PROG.cdecl + END END END; diff --git a/source/RVM32I.ob07 b/source/RVMxI.ob07 similarity index 83% rename from source/RVM32I.ob07 rename to source/RVMxI.ob07 index 260fc65..c5e0854 100644 --- a/source/RVM32I.ob07 +++ b/source/RVMxI.ob07 @@ -5,11 +5,11 @@ All rights reserved. *) -MODULE RVM32I; +MODULE RVMxI; IMPORT - PROG, WR := WRITER, IL, CHL := CHUNKLISTS, REG, UTILS, STRINGS, ERRORS; + PROG, WR := WRITER, IL, CHL := CHUNKLISTS, REG, UTILS, STRINGS, ERRORS, TARGETS; CONST @@ -31,16 +31,17 @@ CONST opSTOP = 0; opRET = 1; opENTER = 2; opNEG = 3; opNOT = 4; opNOP = 5; opXCHG = 6; opLDB = 7; opLDH = 8; opLDW = 9; opPUSH = 10; opPUSHC = 11; - opPOP = 12; opLABEL = 13; opLEA = 14; opLLA = 15; (* 16, 17, 18 *) + opPOP = 12; opLABEL = 13; opLEA = 14; opLLA = 15; + opLDD = 16; (* 17, 18 *) opJMP = 19; opCALL = 20; opCALLI = 21; opMOV = 22; opMUL = 24; opADD = 26; opSUB = 28; opDIV = 30; opMOD = 32; - opSTB = 34; opSTH = 36; opSTW = 38; (* 40, 42, 44 *) + opSTB = 34; opSTH = 36; opSTW = 38; opSTD = 40; (* 42, 44 *) opAND = 46; opOR = 48; opXOR = 50; opASR = 52; opLSR = 54; opLSL = 56; opROR = 58; (* 60, 62 *) opCMP = 64; opMOVC = 23; opMULC = 25; opADDC = 27; opSUBC = 29; opDIVC = 31; opMODC = 33; - opSTBC = 35; opSTHC = 37; opSTWC = 39; (* 41, 43, 45 *) + opSTBC = 35; opSTHC = 37; opSTWC = 39; opSTDC = 41; (* 43, 45 *) opANDC = 47; opORC = 49; opXORC = 51; opASRC = 53; opLSRC = 55; opLSLC = 57; opRORC = 59; (* 61, 63 *) opCMPC = 65; @@ -49,12 +50,12 @@ CONST opJEQ = 70; opJNE = 71; opJLT = 72; opJGE = 73; opJGT = 74; opJLE = 75; opSEQ = 76; opSNE = 77; opSLT = 78; opSGE = 79; opSGT = 80; opSLE = 81; - inf = 7F800000H; - VAR - R: REG.REGS; count: INTEGER; + R: REG.REGS; count, szWord: INTEGER; + + ldr, str: PROCEDURE (r1, r2: INTEGER); PROCEDURE OutByte (n: BYTE); @@ -66,8 +67,13 @@ END OutByte; PROCEDURE OutInt (n: INTEGER); BEGIN - WR.Write32LE(n); - INC(count, 4) + IF szWord = 8 THEN + WR.Write64LE(n); + INC(count, 8) + ELSE (* szWord = 4 *) + WR.Write32LE(n); + INC(count, 4) + END END OutInt; @@ -175,6 +181,12 @@ BEGIN END sub; +PROCEDURE ldr64 (r1, r2: INTEGER); +BEGIN + Emit(opLDD, r2 * 256 + r1, 0) +END ldr64; + + PROCEDURE ldr32 (r1, r2: INTEGER); BEGIN Emit(opLDW, r2 * 256 + r1, 0) @@ -193,6 +205,12 @@ BEGIN END ldr8; +PROCEDURE str64 (r1, r2: INTEGER); +BEGIN + Emit(opSTD, r1 * 256 + r2, 0) +END str64; + + PROCEDURE str32 (r1, r2: INTEGER); BEGIN Emit(opSTW, r1 * 256 + r2, 0) @@ -239,7 +257,7 @@ END jnz; PROCEDURE CallRTL (proc, par: INTEGER); BEGIN Emit(opCALL, IL.codes.rtl[proc], 0); - addrc(SP, par * 4) + addrc(SP, par * szWord) END CallRTL; @@ -282,14 +300,24 @@ BEGIN END shift; -PROCEDURE translate; +PROCEDURE translate (szWord: INTEGER); VAR cmd, next: IL.COMMAND; - opcode, param1, param2: INTEGER; - r1, r2, r3: INTEGER; - label: INTEGER; + + opcode, param1, param2, r1, r2, r3, + a, b, label, opLD, opST, opSTC: INTEGER; BEGIN + IF szWord = 8 THEN + opLD := opLDD; + opST := opSTD; + opSTC := opSTDC + ELSE + opLD := opLDW; + opST := opSTW; + opSTC := opSTWC + END; + cmd := IL.codes.commands.first(IL.COMMAND); WHILE cmd # NIL DO @@ -320,7 +348,7 @@ BEGIN |IL.opCLEANUP: IF param2 # 0 THEN - addrc(SP, param2 * 4) + addrc(SP, param2 * szWord) END |IL.opNOP, IL.opAND, IL.opOR: @@ -332,24 +360,30 @@ BEGIN GlobalAdr(GetAnyReg(), param2) |IL.opLADR: + param2 := param2 * szWord; next := cmd.next(IL.COMMAND); - IF (next.opcode = IL.opSAVE) OR (next.opcode = IL.opSAVE32) OR (next.opcode = IL.opSAVEF) THEN + IF ((next.opcode = IL.opSAVE) OR (next.opcode = IL.opSAVEF)) & (szWord = 8) OR (next.opcode = IL.opSAVE64) THEN UnOp(r1); - Emit(opSTW, BP * 256 + r1, param2 * 4); + Emit(opSTD, BP * 256 + r1, param2); + drop; + cmd := next + ELSIF ((next.opcode = IL.opSAVE) OR (next.opcode = IL.opSAVEF)) & (szWord = 4) OR (next.opcode = IL.opSAVE32) THEN + UnOp(r1); + Emit(opSTW, BP * 256 + r1, param2); drop; cmd := next ELSIF next.opcode = IL.opSAVE16 THEN UnOp(r1); - Emit(opSTH, BP * 256 + r1, param2 * 4); + Emit(opSTH, BP * 256 + r1, param2); drop; cmd := next ELSIF next.opcode = IL.opSAVE8 THEN UnOp(r1); - Emit(opSTB, BP * 256 + r1, param2 * 4); + Emit(opSTB, BP * 256 + r1, param2); drop; cmd := next ELSE - Emit(opADDRC, BP * 256 + GetAnyReg(), param2 * 4) + Emit(opADDRC, BP * 256 + GetAnyReg(), param2) END |IL.opPARAM: @@ -415,7 +449,7 @@ BEGIN |IL.opSAVEC: UnOp(r1); - Emit(opSTWC, r1, param2); + Emit(opSTC, r1, param2); drop |IL.opSAVE8C: @@ -428,15 +462,27 @@ BEGIN Emit(opSTHC, r1, param2 MOD 65536); drop - |IL.opSAVE, IL.opSAVE32, IL.opSAVEF: + |IL.opSAVE, IL.opSAVEF: + BinOp(r2, r1); + str(r1, r2); + drop; + drop + + |IL.opSAVE32: BinOp(r2, r1); str32(r1, r2); drop; drop + |IL.opSAVE64: + BinOp(r2, r1); + str64(r1, r2); + drop; + drop + |IL.opSAVEFI: BinOp(r2, r1); - str32(r2, r1); + str(r2, r1); drop; drop @@ -457,25 +503,41 @@ BEGIN GlobalAdr(r1, param2); ldr32(r1, r1) - |IL.opVADR, IL.opLLOAD32: - Emit(opLDW, BP * 256 + GetAnyReg(), param2 * 4) + |IL.opGLOAD64: + r1 := GetAnyReg(); + GlobalAdr(r1, param2); + ldr64(r1, r1) + + |IL.opVADR: + Emit(opLD, BP * 256 + GetAnyReg(), param2 * szWord) + + |IL.opLLOAD32: + Emit(opLDW, BP * 256 + GetAnyReg(), param2 * szWord) + + |IL.opLLOAD64: + Emit(opLDD, BP * 256 + GetAnyReg(), param2 * szWord) |IL.opVLOAD32: r1 := GetAnyReg(); - Emit(opLDW, BP * 256 + r1, param2 * 4); + Emit(opLD, BP * 256 + r1, param2 * szWord); ldr32(r1, r1) + |IL.opVLOAD64: + r1 := GetAnyReg(); + Emit(opLDD, BP * 256 + r1, param2 * szWord); + ldr64(r1, r1) + |IL.opGLOAD16: r1 := GetAnyReg(); GlobalAdr(r1, param2); ldr16(r1, r1) |IL.opLLOAD16: - Emit(opLDH, BP * 256 + GetAnyReg(), param2 * 4) + Emit(opLDH, BP * 256 + GetAnyReg(), param2 * szWord) |IL.opVLOAD16: r1 := GetAnyReg(); - Emit(opLDW, BP * 256 + r1, param2 * 4); + Emit(opLD, BP * 256 + r1, param2 * szWord); ldr16(r1, r1) |IL.opGLOAD8: @@ -484,11 +546,11 @@ BEGIN ldr8(r1, r1) |IL.opLLOAD8: - Emit(opLDB, BP * 256 + GetAnyReg(), param2 * 4) + Emit(opLDB, BP * 256 + GetAnyReg(), param2 * szWord) |IL.opVLOAD8: r1 := GetAnyReg(); - Emit(opLDW, BP * 256 + r1, param2 * 4); + Emit(opLD, BP * 256 + r1, param2 * szWord); ldr8(r1, r1) |IL.opLOAD8: @@ -499,10 +561,18 @@ BEGIN UnOp(r1); ldr16(r1, r1) - |IL.opLOAD32, IL.opLOADF: + |IL.opLOAD32: UnOp(r1); ldr32(r1, r1) + |IL.opLOAD64: + UnOp(r1); + ldr64(r1, r1) + + |IL.opLOADF: + UnOp(r1); + ldr(r1, r1) + |IL.opLOOP, IL.opENDLOOP: |IL.opUMINUS: @@ -523,7 +593,13 @@ BEGIN UnOp(r1); next := cmd.next(IL.COMMAND); CASE next.opcode OF - |IL.opLOAD32, IL.opLOADF: + |IL.opLOADF: + Emit(opLD, r1 * 256 + r1, param2); + cmd := next + |IL.opLOAD64: + Emit(opLDD, r1 * 256 + r1, param2); + cmd := next + |IL.opLOAD32: Emit(opLDW, r1 * 256 + r1, param2); cmd := next |IL.opLOAD16: @@ -702,19 +778,19 @@ BEGIN |IL.opASR2: UnOp(r1); - Emit(opASRC, r1, param2 MOD 32) + Emit(opASRC, r1, param2 MOD (szWord * 8)) |IL.opLSL2: UnOp(r1); - Emit(opLSLC, r1, param2 MOD 32) + Emit(opLSLC, r1, param2 MOD (szWord * 8)) |IL.opROR2: UnOp(r1); - Emit(opRORC, r1, param2 MOD 32) + Emit(opRORC, r1, param2 MOD (szWord * 8)) |IL.opLSR2: UnOp(r1); - Emit(opLSRC, r1, param2 MOD 32) + Emit(opLSRC, r1, param2 MOD (szWord * 8)) |IL.opCHR: UnOp(r1); @@ -795,9 +871,9 @@ BEGIN |IL.opINCC: UnOp(r1); r2 := GetAnyReg(); - ldr32(r2, r1); + ldr(r2, r1); addrc(r2, param2); - str32(r1, r2); + str(r1, r2); drop; drop @@ -830,13 +906,13 @@ BEGIN |IL.opINC, IL.opDEC: BinOp(r2, r1); r3 := GetAnyReg(); - ldr32(r3, r1); + ldr(r3, r1); IF opcode = IL.opINC THEN add(r3, r2) ELSE sub(r3, r2) END; - str32(r1, r3); + str(r1, r3); drop; drop; drop @@ -845,14 +921,14 @@ BEGIN BinOp(r2, r1); Emit(opBIT, r2, r2); r3 := GetAnyReg(); - ldr32(r3, r1); + ldr(r3, r1); IF opcode = IL.opINCL THEN Emit(opOR, r3, r2) ELSE Emit(opNOT, r2, 0); Emit(opAND, r3, r2) END; - str32(r1, r3); + str(r1, r3); drop; drop; drop @@ -860,13 +936,13 @@ BEGIN |IL.opINCLC, IL.opEXCLC: UnOp(r1); r2 := GetAnyReg(); - ldr32(r2, r1); + ldr(r2, r1); IF opcode = IL.opINCLC THEN Emit(opORC, r2, ORD({param2})) ELSE Emit(opANDC, r2, ORD(-{param2})) END; - str32(r1, r2); + str(r1, r2); drop; drop @@ -919,7 +995,7 @@ BEGIN UnOp(r1); r2 := GetAnyReg(); ProcAdr(r2, param2); - str32(r1, r2); + str(r1, r2); drop; drop @@ -928,7 +1004,7 @@ BEGIN |IL.opPUSHT: UnOp(r1); - Emit(opLDW, r1 * 256 + GetAnyReg(), -4) + Emit(opLD, r1 * 256 + GetAnyReg(), -szWord) |IL.opGET, IL.opGETC: IF opcode = IL.opGET THEN @@ -945,6 +1021,7 @@ BEGIN |1: ldr8(r1, r1); str8(r2, r1) |2: ldr16(r1, r1); str16(r2, r1) |4: ldr32(r1, r1); str32(r2, r1) + |8: ldr64(r1, r1); str64(r2, r1) END |IL.opNOT: @@ -1094,8 +1171,8 @@ BEGIN |IL.opNEW: PushAll(1); - INC(param2, 4); - ASSERT(UTILS.Align(param2, 4)); + INC(param2, szWord); + ASSERT(UTILS.Align(param2, szWord)); pushc(param2); pushc(param1); CallRTL(IL._new, 3) @@ -1129,8 +1206,8 @@ BEGIN |IL.opTYPEGD: UnOp(r1); PushAll(0); - subrc(r1, 4); - ldr32(r1, r1); + subrc(r1, szWord); + ldr(r1, r1); push(r1); pushc(param2); CallRTL(IL._guardrec, 2); @@ -1145,7 +1222,11 @@ BEGIN jnz(ACC, param1) |IL.opCONSTF: - movrc(GetAnyReg(), UTILS.d2s(cmd.float)) + IF szWord = 8 THEN + movrc(GetAnyReg(), UTILS.splitf(cmd.float, a, b)) + ELSE (* szWord = 4 *) + movrc(GetAnyReg(), UTILS.d2s(cmd.float)) + END |IL.opMULF: PushAll(2); @@ -1195,14 +1276,21 @@ BEGIN |IL.opUMINF: UnOp(r1); - Emit(opXORC, r1, ORD({31})) + Emit(opRORC, r1, -1); + Emit(opXORC, r1, 1); + Emit(opRORC, r1, 1) |IL.opFABS: UnOp(r1); - Emit(opANDC, r1, ORD({0..30})) + Emit(opLSLC, r1, 1); + Emit(opLSRC, r1, 1) |IL.opINF: - movrc(GetAnyReg(), inf) + r1 := GetAnyReg(); + Emit(opMOVC, r1, 1); + Emit(opRORC, r1, 1); + Emit(opASRC, r1, 7 + 3 * ORD(szWord = 8)); + Emit(opLSRC, r1, 1) |IL.opPUSHF: UnOp(r1); @@ -1227,14 +1315,14 @@ BEGIN |IL.opLADR_SAVE: UnOp(r1); - Emit(opSTW, BP * 256 + r1, param2 * 4); + Emit(opST, BP * 256 + r1, param2 * szWord); drop |IL.opLADR_INCC: r1 := GetAnyReg(); - Emit(opLDW, BP * 256 + r1, param1 * 4); + Emit(opLD, BP * 256 + r1, param1 * szWord); Emit(opADDC, r1, param2); - Emit(opSTW, BP * 256 + r1, param1 * 4); + Emit(opST, BP * 256 + r1, param1 * szWord); drop END; @@ -1259,9 +1347,10 @@ BEGIN END prolog; -PROCEDURE epilog (ram: INTEGER); +PROCEDURE epilog (ram, szWord: INTEGER); VAR - tcount, dcount, i, offTypes, offStrings, szData, szGlobal, szHeapStack: INTEGER; + tcount, dcount, i, offTypes, offStrings, + szData, szGlobal, szHeapStack: INTEGER; BEGIN Emit(opSTOP, 0, 0); @@ -1279,8 +1368,8 @@ BEGIN OutByte(CHL.GetByte(IL.codes.data, i)) END; - IF dcount MOD 4 # 0 THEN - i := 4 - dcount MOD 4; + IF dcount MOD szWord # 0 THEN + i := szWord - dcount MOD szWord; WHILE i > 0 DO OutByte(0); DEC(i) @@ -1288,13 +1377,13 @@ BEGIN END; szData := count - offTypes; - szGlobal := (IL.codes.bss DIV 4 + 1) * 4; + szGlobal := (IL.codes.bss DIV szWord + 1) * szWord; szHeapStack := ram - szData - szGlobal; OutInt(offTypes); OutInt(offStrings); - OutInt(szGlobal DIV 4); - OutInt(szHeapStack DIV 4); + OutInt(szGlobal DIV szWord); + OutInt(szHeapStack DIV szWord); FOR i := 1 TO 8 DO OutInt(0) END @@ -1310,7 +1399,15 @@ VAR szData, szRAM: INTEGER; BEGIN - szData := (CHL.Length(IL.codes.types) + CHL.Length(IL.codes.data) DIV 4 + IL.codes.bss DIV 4 + 2) * 4; + szWord := TARGETS.WordSize; + IF szWord = 8 THEN + ldr := ldr64; + str := str64 + ELSE + ldr := ldr32; + str := str32 + END; + szData := (CHL.Length(IL.codes.types) + CHL.Length(IL.codes.data) DIV szWord + IL.codes.bss DIV szWord + 2) * szWord; szRAM := MIN(MAX(options.ram, minRAM), maxRAM) * 1024; IF szRAM - szData < 1024*1024 THEN @@ -1323,11 +1420,11 @@ BEGIN REG.Init(R, push, pop, mov, xchg, NIL, NIL, GPRs, {}); prolog; - translate; - epilog(szRAM); + translate(szWord); + epilog(szRAM, szWord); WR.Close END CodeGen; -END RVM32I. \ No newline at end of file +END RVMxI. \ No newline at end of file diff --git a/source/STATEMENTS.ob07 b/source/STATEMENTS.ob07 index d54cc6b..58b3b56 100644 --- a/source/STATEMENTS.ob07 +++ b/source/STATEMENTS.ob07 @@ -9,7 +9,7 @@ MODULE STATEMENTS; IMPORT - PARS, PROG, SCAN, ARITH, STRINGS, LISTS, IL, X86, AMD64, MSP430, THUMB, RVM32I, + PARS, PROG, SCAN, ARITH, STRINGS, LISTS, IL, X86, AMD64, MSP430, THUMB, RVMxI, ERRORS, UTILS, AVL := AVLTREES, CONSOLE, C := COLLECTIONS, TARGETS; @@ -3310,7 +3310,7 @@ BEGIN getproc(rtl, "_isrec", IL._isrec); getproc(rtl, "_dllentry", IL._dllentry); getproc(rtl, "_sofinit", IL._sofinit) - ELSIF CPU IN {TARGETS.cpuTHUMB, TARGETS.cpuRVM32I} THEN + ELSIF CPU IN {TARGETS.cpuTHUMB, TARGETS.cpuRVM32I, TARGETS.cpuRVM64I} THEN getproc(rtl, "_fmul", IL._fmul); getproc(rtl, "_fdiv", IL._fdiv); getproc(rtl, "_fdivi", IL._fdivi); @@ -3322,7 +3322,7 @@ BEGIN getproc(rtl, "_flt", IL._flt); getproc(rtl, "_pack", IL._pack); getproc(rtl, "_unpk", IL._unpk); - IF CPU = TARGETS.cpuRVM32I THEN + IF CPU IN {TARGETS.cpuRVM32I, TARGETS.cpuRVM64I} THEN getproc(rtl, "_error", IL._error) END END @@ -3401,7 +3401,8 @@ BEGIN |TARGETS.cpuX86: X86.CodeGen(outname, target, options) |TARGETS.cpuMSP430: MSP430.CodeGen(outname, target, options) |TARGETS.cpuTHUMB: THUMB.CodeGen(outname, target, options) - |TARGETS.cpuRVM32I: RVM32I.CodeGen(outname, target, options) + |TARGETS.cpuRVM32I, + TARGETS.cpuRVM64I: RVMxI.CodeGen(outname, target, options) END END compile; diff --git a/source/TARGETS.ob07 b/source/TARGETS.ob07 index a748f58..0b87e58 100644 --- a/source/TARGETS.ob07 +++ b/source/TARGETS.ob07 @@ -7,6 +7,8 @@ MODULE TARGETS; +IMPORT UTILS; + CONST @@ -25,17 +27,21 @@ CONST Linux64SO* = 12; STM32CM3* = 13; RVM32I* = 14; + RVM64I* = 15; cpuX86* = 0; cpuAMD64* = 1; cpuMSP430* = 2; cpuTHUMB* = 3; - cpuRVM32I* = 4; + cpuRVM32I* = 4; cpuRVM64I* = 5; osNONE* = 0; osWIN32* = 1; osWIN64* = 2; osLINUX32* = 3; osLINUX64* = 4; osKOS* = 5; - noDISPOSE = {MSP430, STM32CM3, RVM32I}; + noDISPOSE = {MSP430, STM32CM3, RVM32I, RVM64I}; noRTL = {MSP430}; + libRVM32I = "RVMxI" + UTILS.slash + "32"; + libRVM64I = "RVMxI" + UTILS.slash + "64"; + TYPE @@ -51,9 +57,9 @@ TYPE VAR - Targets*: ARRAY 15 OF TARGET; + Targets*: ARRAY 16 OF TARGET; - CPUs: ARRAY 5 OF + CPUs: ARRAY 6 OF RECORD BitDepth, InstrSize: INTEGER; LittleEndian: BOOLEAN @@ -126,6 +132,7 @@ BEGIN EnterCPU(cpuMSP430, 16, 2, TRUE); EnterCPU(cpuTHUMB, 32, 2, TRUE); EnterCPU(cpuRVM32I, 32, 4, TRUE); + EnterCPU(cpuRVM64I, 64, 8, TRUE); Enter( MSP430, cpuMSP430, 0, osNONE, "msp430", "MSP430", ".hex"); Enter( Win32C, cpuX86, 8, osWIN32, "win32con", "Windows", ".exe"); @@ -141,5 +148,6 @@ BEGIN Enter( Linux64, cpuAMD64, 8, osLINUX64, "linux64exe", "Linux", ""); Enter( Linux64SO, cpuAMD64, 8, osLINUX64, "linux64so", "Linux", ".so"); Enter( STM32CM3, cpuTHUMB, 4, osNONE, "stm32cm3", "STM32CM3", ".hex"); - Enter( RVM32I, cpuRVM32I, 4, osNONE, "rvm32i", "RVM32I", ".bin"); + Enter( RVM32I, cpuRVM32I, 4, osNONE, "rvm32i", libRVM32I, ".bin"); + Enter( RVM64I, cpuRVM64I, 8, osNONE, "rvm64i", libRVM64I, ".bin"); END TARGETS. \ No newline at end of file diff --git a/source/UTILS.ob07 b/source/UTILS.ob07 index bfca29b..52c1b4e 100644 --- a/source/UTILS.ob07 +++ b/source/UTILS.ob07 @@ -23,8 +23,8 @@ CONST max32* = 2147483647; vMajor* = 1; - vMinor* = 51; - Date* = "2021-02-09"; + vMinor* = 52; + Date* = "2021-02-12"; FILE_EXT* = ".ob07"; RTL_NAME* = "RTL"; diff --git a/tools/RVM32I.ob07 b/tools/RVMxI.ob07 similarity index 76% rename from tools/RVM32I.ob07 rename to tools/RVMxI.ob07 index 6ce1b02..79918a4 100644 --- a/tools/RVM32I.ob07 +++ b/tools/RVMxI.ob07 @@ -6,34 +6,37 @@ *) (* - RVM32I executor and disassembler + RVMxI executor and disassembler - for win32 only + for Windows only Usage: - RVM32I.exe -run [program parameters] - RVM32I.exe -dis + RVMxI.exe -run [program parameters] + RVMxI.exe -dis *) -MODULE RVM32I; +MODULE RVMxI; IMPORT SYSTEM, File, Args, Out, API, HOST; CONST + szWORD = HOST.bit_depth DIV 8; + opSTOP = 0; opRET = 1; opENTER = 2; opNEG = 3; opNOT = 4; opNOP = 5; opXCHG = 6; opLDB = 7; opLDH = 8; opLDW = 9; opPUSH = 10; opPUSHC = 11; - opPOP = 12; opLABEL = 13; opLEA = 14; opLLA = 15; (* 16, 17, 18 *) + opPOP = 12; opLABEL = 13; opLEA = 14; opLLA = 15; + opLDD = 16; (* 17, 18 *) opJMP = 19; opCALL = 20; opCALLI = 21; opMOV = 22; opMUL = 24; opADD = 26; opSUB = 28; opDIV = 30; opMOD = 32; - opSTB = 34; opSTH = 36; opSTW = 38; (* 40, 42, 44 *) + opSTB = 34; opSTH = 36; opSTW = 38; opSTD = 40; (* 42, 44 *) opAND = 46; opOR = 48; opXOR = 50; opASR = 52; opLSR = 54; opLSL = 56; opROR = 58; (* 60, 62 *) opCMP = 64; opMOVC = 23; opMULC = 25; opADDC = 27; opSUBC = 29; opDIVC = 31; opMODC = 33; - opSTBC = 35; opSTHC = 37; opSTWC = 39; (* 41, 43, 45 *) + opSTBC = 35; opSTHC = 37; opSTWC = 39; opSTDC = 41; (* 43, 45 *) opANDC = 47; opORC = 49; opXORC = 51; opASRC = 53; opLSRC = 55; opLSLC = 57; opRORC = 59; (* 61, 63 *) opCMPC = 65; @@ -43,7 +46,7 @@ CONST opSEQ = 76; opSNE = 77; opSLT = 78; opSGE = 79; opSGT = 80; opSLE = 81; - nREG = 8; + nREG = 16; ACC = 0; BP = 3; SP = 4; Types = 0; @@ -80,40 +83,110 @@ VAR PROCEDURE syscall (ptr: INTEGER); VAR - fn, p1, p2, p3, p4, r: INTEGER; + fn, r: INTEGER; proc2: PROCEDURE (a, b: INTEGER): INTEGER; proc3: PROCEDURE (a, b, c: INTEGER): INTEGER; proc4: PROCEDURE (a, b, c, d: INTEGER): INTEGER; + r1, r2: REAL; + + + PROCEDURE GetInt (ptr, n: INTEGER): INTEGER; + BEGIN + SYSTEM.GET(ptr + SYSTEM.SIZE(INTEGER) * n, n) + RETURN n + END GetInt; + + + PROCEDURE GetReal (ptr, n: INTEGER): REAL; + VAR + r: REAL; + + BEGIN + SYSTEM.GET(ptr + SYSTEM.SIZE(INTEGER) * n, r) + RETURN r + END GetReal; + + BEGIN - SYSTEM.GET(ptr, fn); - SYSTEM.GET(ptr + 4, p1); - SYSTEM.GET(ptr + 8, p2); - SYSTEM.GET(ptr + 12, p3); - SYSTEM.GET(ptr + 16, p4); + fn := GetInt(ptr, 0); CASE fn OF - | 0: HOST.ExitProcess(p1) - | 1: SYSTEM.PUT(SYSTEM.ADR(proc2), SYSTEM.ADR(HOST.GetCurrentDirectory)); - r := proc2(p1, p2) - | 2: SYSTEM.PUT(SYSTEM.ADR(proc3), SYSTEM.ADR(HOST.GetArg)); - r := proc3(p1 + 2, p2, p3) - | 3: SYSTEM.PUT(SYSTEM.ADR(proc4), SYSTEM.ADR(HOST.FileRead)); - SYSTEM.PUT(ptr, proc4(p1, p2, p3, p4)) - | 4: SYSTEM.PUT(SYSTEM.ADR(proc4), SYSTEM.ADR(HOST.FileWrite)); - SYSTEM.PUT(ptr, proc4(p1, p2, p3, p4)) - | 5: SYSTEM.PUT(SYSTEM.ADR(proc2), SYSTEM.ADR(HOST.FileCreate)); - SYSTEM.PUT(ptr, proc2(p1, p2)) - | 6: HOST.FileClose(p1) - | 7: SYSTEM.PUT(SYSTEM.ADR(proc2), SYSTEM.ADR(HOST.FileOpen)); - SYSTEM.PUT(ptr, proc2(p1, p2)) - | 8: HOST.OutChar(CHR(p1)) - | 9: SYSTEM.PUT(ptr, HOST.GetTickCount()) - |10: SYSTEM.PUT(ptr, HOST.UnixTime()) - |11: SYSTEM.PUT(SYSTEM.ADR(proc2), SYSTEM.ADR(HOST.isRelative)); - SYSTEM.PUT(ptr, proc2(p1, p2)) - |12: SYSTEM.PUT(SYSTEM.ADR(proc2), SYSTEM.ADR(HOST.chmod)); - r := proc2(p1, p2) + | 0: + HOST.ExitProcess(GetInt(ptr, 1)) + + | 1: + SYSTEM.PUT(SYSTEM.ADR(proc2), SYSTEM.ADR(HOST.GetCurrentDirectory)); + r := proc2(GetInt(ptr, 1), GetInt(ptr, 2)) + + | 2: + SYSTEM.PUT(SYSTEM.ADR(proc3), SYSTEM.ADR(HOST.GetArg)); + r := proc3(GetInt(ptr, 1) + 2, GetInt(ptr, 2), GetInt(ptr, 3)) + + | 3: + SYSTEM.PUT(SYSTEM.ADR(proc4), SYSTEM.ADR(HOST.FileRead)); + SYSTEM.PUT(ptr, proc4(GetInt(ptr, 1), GetInt(ptr, 2), GetInt(ptr, 3), GetInt(ptr, 4))) + + | 4: + SYSTEM.PUT(SYSTEM.ADR(proc4), SYSTEM.ADR(HOST.FileWrite)); + SYSTEM.PUT(ptr, proc4(GetInt(ptr, 1), GetInt(ptr, 2), GetInt(ptr, 3), GetInt(ptr, 4))) + + | 5: + SYSTEM.PUT(SYSTEM.ADR(proc2), SYSTEM.ADR(HOST.FileCreate)); + SYSTEM.PUT(ptr, proc2(GetInt(ptr, 1), GetInt(ptr, 2))) + + | 6: + HOST.FileClose(GetInt(ptr, 1)) + + | 7: + SYSTEM.PUT(SYSTEM.ADR(proc2), SYSTEM.ADR(HOST.FileOpen)); + SYSTEM.PUT(ptr, proc2(GetInt(ptr, 1), GetInt(ptr, 2))) + + | 8: + HOST.OutChar(CHR(GetInt(ptr, 1))) + + | 9: + SYSTEM.PUT(ptr, HOST.GetTickCount()) + + |10: + SYSTEM.PUT(ptr, HOST.UnixTime()) + + |11: + SYSTEM.PUT(SYSTEM.ADR(proc2), SYSTEM.ADR(HOST.isRelative)); + SYSTEM.PUT(ptr, proc2(GetInt(ptr, 1), GetInt(ptr, 2))) + + |12: + SYSTEM.PUT(SYSTEM.ADR(proc2), SYSTEM.ADR(HOST.chmod)); + r := proc2(GetInt(ptr, 1), GetInt(ptr, 2)) + + |100..103: + r1 := GetReal(ptr, 1); + r2 := GetReal(ptr, 2); + CASE fn OF + |100: SYSTEM.PUT(ptr, r2 * r1) + |101: SYSTEM.PUT(ptr, r2 / r1) + |102: SYSTEM.PUT(ptr, r2 + r1) + |103: SYSTEM.PUT(ptr, r2 - r1) + END + + |104: + r1 := GetReal(ptr, 2); + r2 := GetReal(ptr, 3); + CASE GetInt(ptr, 1) OF + |0: SYSTEM.PUT(ptr, ORD(r2 = r1)) + |1: SYSTEM.PUT(ptr, ORD(r2 # r1)) + |2: SYSTEM.PUT(ptr, ORD(r2 < r1)) + |3: SYSTEM.PUT(ptr, ORD(r2 <= r1)) + |4: SYSTEM.PUT(ptr, ORD(r2 > r1)) + |5: SYSTEM.PUT(ptr, ORD(r2 >= r1)) + END + + |105: + SYSTEM.PUT(ptr, FLOOR(GetReal(ptr, 1))) + + |106: + SYSTEM.PUT(ptr, FLT(GetInt(ptr, 1))) + END END syscall; @@ -156,24 +229,30 @@ BEGIN WHILE cmd # NIL DO param1 := cmd.param1; param2 := cmd.param2; + CASE cmd.op OF |opSTOP: cmd := last - |opRET: SYSTEM.GET(R[SP], cmd); INC(R[SP], 4) - |opENTER: DEC(R[SP], 4); SYSTEM.PUT32(R[SP], R[BP]); R[BP] := R[SP]; WHILE param1 > 0 DO DEC(R[SP], 4); SYSTEM.PUT32(R[SP], 0); DEC(param1) END - |opPOP: SYSTEM.GET32(R[SP], R[param1]); INC(R[SP], 4) + |opRET: SYSTEM.GET(R[SP], cmd); INC(R[SP], szWORD) + |opENTER: DEC(R[SP], szWORD); SYSTEM.PUT(R[SP], R[BP]); R[BP] := R[SP]; + WHILE param1 > 0 DO DEC(R[SP], szWORD); SYSTEM.PUT(R[SP], 0); DEC(param1) END + |opPOP: SYSTEM.GET(R[SP], R[param1]); INC(R[SP], szWORD) + |opPUSH: DEC(R[SP], szWORD); SYSTEM.PUT(R[SP], R[param1]) + |opPUSHC: DEC(R[SP], szWORD); SYSTEM.PUT(R[SP], param1) + |opCALL: DEC(R[SP], szWORD); SYSTEM.PUT(R[SP], cmd); cmd := Labels[param1] + |opCALLI: DEC(R[SP], szWORD); SYSTEM.PUT(R[SP], cmd); SYSTEM.GET(SYSTEM.ADR(R[param1]), cmd) |opNEG: R[param1] := -R[param1] |opNOT: R[param1] := ORD(-BITS(R[param1])) |opNOP: |opXCHG: i := R[param1]; R[param1] := R[param2]; R[param2] := i |opLDB: i := param1 MOD 256; SYSTEM.GET8(R[param1 DIV 256] + param2, R[i]); R[i] := R[i] MOD 256 |opLDH: i := param1 MOD 256; SYSTEM.GET16(R[param1 DIV 256] + param2, R[i]); R[i] := R[i] MOD 65536 - |opLDW: SYSTEM.GET32(R[param1 DIV 256] + param2, R[param1 MOD 256]) - |opPUSH: DEC(R[SP], 4); SYSTEM.PUT32(R[SP], R[param1]) - |opPUSHC: DEC(R[SP], 4); SYSTEM.PUT32(R[SP], param1) - |opLLA: SYSTEM.GET32(SYSTEM.ADR(Labels[param2]), R[param1]) + |opLDW: SYSTEM.GET32(R[param1 DIV 256] + param2, R[param1 MOD 256]); + $IF (CPU_X8664) + R[param1 MOD 256] := R[param1 MOD 256] MOD 100000000H + $END + |opLDD: SYSTEM.GET(R[param1 DIV 256] + param2, R[param1 MOD 256]) + |opLLA: SYSTEM.GET(SYSTEM.ADR(Labels[param2]), R[param1]) |opJMP: cmd := Labels[param1] - |opCALL: DEC(R[SP], 4); SYSTEM.PUT(R[SP], cmd); cmd := Labels[param1] - |opCALLI: DEC(R[SP], 4); SYSTEM.PUT(R[SP], cmd); SYSTEM.GET(SYSTEM.ADR(R[param1]), cmd) |opMOV: R[param1] := R[param2] |opMOVC: R[param1] := param2 |opMUL: R[param1] := R[param1] * R[param2] @@ -189,9 +268,11 @@ BEGIN |opSTB: SYSTEM.PUT8(R[param1 DIV 256] + param2, R[param1 MOD 256]) |opSTH: SYSTEM.PUT16(R[param1 DIV 256] + param2, R[param1 MOD 256]) |opSTW: SYSTEM.PUT32(R[param1 DIV 256] + param2, R[param1 MOD 256]) + |opSTD: SYSTEM.PUT(R[param1 DIV 256] + param2, R[param1 MOD 256]) |opSTBC: SYSTEM.PUT8(R[param1], param2) |opSTHC: SYSTEM.PUT16(R[param1], param2) |opSTWC: SYSTEM.PUT32(R[param1], param2) + |opSTDC: SYSTEM.PUT(R[param1], param2) |opAND: R[param1] := ORD(BITS(R[param1]) * BITS(R[param2])) |opANDC: R[param1] := ORD(BITS(R[param1]) * BITS(param2)) |opOR: R[param1] := ORD(BITS(R[param1]) + BITS(R[param2])) @@ -275,12 +356,12 @@ VAR PROCEDURE Hex (x: INTEGER); VAR - str: ARRAY 11 OF CHAR; + str: ARRAY 19 OF CHAR; n: INTEGER; BEGIN - n := 10; - str[10] := 0X; + n := szWORD * 2 + 2; + str[n] := 0X; WHILE n > 2 DO str[n - 1] := hexdgt(x MOD 16); x := x DIV 16; @@ -372,6 +453,7 @@ BEGIN |opLDB: String("LDB "); Reg(param1 MOD 256); String(", ["); Reg(param1 DIV 256); String(" + "); Hex(param2); String("]") |opLDH: String("LDH "); Reg(param1 MOD 256); String(", ["); Reg(param1 DIV 256); String(" + "); Hex(param2); String("]") |opLDW: String("LDW "); Reg(param1 MOD 256); String(", ["); Reg(param1 DIV 256); String(" + "); Hex(param2); String("]") + |opLDD: String("LDD "); Reg(param1 MOD 256); String(", ["); Reg(param1 DIV 256); String(" + "); Hex(param2); String("]") |opPUSH: String("PUSH "); Reg(param1) |opPUSHC: String("PUSH "); Hex(param1) |opLLA: String("LLA "); RegL(param1, param2) @@ -393,9 +475,11 @@ BEGIN |opSTB: String("STB ["); Reg(param1 DIV 256); String(" + "); Hex(param2); String("], "); Reg(param1 MOD 256) |opSTH: String("STH ["); Reg(param1 DIV 256); String(" + "); Hex(param2); String("], "); Reg(param1 MOD 256) |opSTW: String("STW ["); Reg(param1 DIV 256); String(" + "); Hex(param2); String("], "); Reg(param1 MOD 256) + |opSTD: String("STD ["); Reg(param1 DIV 256); String(" + "); Hex(param2); String("], "); Reg(param1 MOD 256) |opSTBC: String("STB ["); Reg(param1); String("], "); Hex(param2) |opSTHC: String("STH ["); Reg(param1); String("], "); Hex(param2) |opSTWC: String("STW ["); Reg(param1); String("], "); Hex(param2) + |opSTDC: String("STD ["); Reg(param1); String("], "); Hex(param2) |opAND: String("AND "); Reg2(param1, param2) |opANDC: String("AND "); RegC(param1, param2) |opOR: String("OR "); Reg2(param1, param2) @@ -443,7 +527,7 @@ BEGIN ELSE String(", ") END; - SYSTEM.GET32(ptr, t); INC(ptr, 4); + SYSTEM.GET(ptr, t); INC(ptr, szWORD); Hex(t) END; Ln; @@ -480,9 +564,9 @@ VAR BEGIN op := 0; param1 := 0; param2 := 0; - SYSTEM.GET32(adr, op); - SYSTEM.GET32(adr + 4, param1); - SYSTEM.GET32(adr + 8, param2); + SYSTEM.GET(adr, op); + SYSTEM.GET(adr + szWORD, param1); + SYSTEM.GET(adr + szWORD * 2, param2); NEW(res); res.op := op; res.param1 := param1; @@ -521,11 +605,11 @@ BEGIN offTypes := descr[0]; ASSERT(offTypes < fsize - DescrSize); ASSERT(offTypes > 0); - ASSERT(offTypes MOD 12 = 0); + ASSERT(offTypes MOD (3 * szWORD) = 0); offStrings := descr[1]; ASSERT(offStrings < fsize - DescrSize); ASSERT(offStrings > 0); - ASSERT(offStrings MOD 4 = 0); + ASSERT(offStrings MOD szWORD = 0); ASSERT(offStrings > offTypes); GlobalSize := descr[2]; ASSERT(GlobalSize > 0); @@ -540,21 +624,22 @@ BEGIN ASSERT(Sections[Strings] # 0); SYSTEM.MOVE(file + offStrings, Sections[Strings], fsize - offStrings - DescrSize); - Sections[Global] := API._NEW(GlobalSize * 4); + Sections[Global] := API._NEW(GlobalSize * szWORD); ASSERT(Sections[Global] # 0); - Sections[Heap] := API._NEW(HeapStackSize * 4); + Sections[Heap] := API._NEW(HeapStackSize * szWORD); ASSERT(Sections[Heap] # 0); - Sections[Stack] := Sections[Heap] + HeapStackSize * 4 - 32; + Sections[Stack] := Sections[Heap] + HeapStackSize * szWORD - szWORD*8; - n := offTypes DIV 12; - first := GetCommand(file + offTypes - n * 12); + n := offTypes DIV (3 * szWORD); + + first := GetCommand(file + offTypes - n * (3 * szWORD)); first.prev := NIL; last := first; DEC(n); WHILE n > 0 DO - cmd := GetCommand(file + offTypes - n * 12); + cmd := GetCommand(file + offTypes - n * (3 * szWORD)); IF cmd.op = opLABEL THEN Labels[cmd.param1] := cmd END; @@ -568,7 +653,7 @@ BEGIN IF param = "-dis" THEN Args.GetArg(3, name); IF name # "" THEN - disasm(name, (offStrings - offTypes) DIV 4, fsize - offStrings - DescrSize, GlobalSize, HeapStackSize) + disasm(name, (offStrings - offTypes) DIV szWORD, fsize - offStrings - DescrSize, GlobalSize, HeapStackSize) END ELSIF param = "-run" THEN exec(Labels, first, last, Sections) @@ -580,6 +665,5 @@ END main; BEGIN - ASSERT(API.BIT_DEPTH = 32); main -END RVM32I. \ No newline at end of file +END RVMxI. \ No newline at end of file diff --git a/tools/RVM32I.txt b/tools/RVMxI.txt similarity index 83% rename from tools/RVM32I.txt rename to tools/RVMxI.txt index c3f5a18..5da5a32 100644 --- a/tools/RVM32I.txt +++ b/tools/RVMxI.txt @@ -1,18 +1,20 @@  - Экспериментальная 32-битная виртуальная машина RVM32I + Экспериментальная 32/64-битная виртуальная машина RVMxI --------------------------------------------------------------------------------------------------- Использование - Скомпилировать исполнитель/дизассемблер в \tools\RVM32I.ob07 (для Windows32 Console): + Скомпилировать исполнитель/дизассемблер в \tools\RVMxI.ob07 (для Windows32/64 Console): - Compiler.exe .\tools\RVM32I.ob07 win32con -nochk a + Compiler.exe .\tools\RVMxI.ob07 win32con -nochk a -out RVM32I.exe + Compiler.exe .\tools\RVMxI.ob07 win64con -nochk a -out RVM64I.exe - Будет создан файл "\tools\RVM32I.exe". + Будет создан файл "RVM32I.exe" и/или "RVM64I.exe". - Компилировать программу в байт-код RVM32I: + Компилировать программу в байт-код RVMxI: Compiler.exe program.ob07 rvm32i [-ram size] + Compiler.exe program.ob07 rvm64i [-ram size] -ram size -- установить размер оперативной памяти для программы в килобайтах 32768..262144 (32..256 Мбайт), по умолчанию 32768 (32 Мбайт) @@ -21,19 +23,21 @@ Выпонить программу: RVM32I.exe program.bin -run + RVM64I.exe program.bin -run Дизассемблировать программу: - RVM32I.exe program.bin -dis program.asm + RVM32I.exe program.bin -dis program.txt + RVM64I.exe program.bin -dis program.txt - Будет создан файл "program.asm". + Будет создан файл "program.txt". --------------------------------------------------------------------------------------------------- Архитектура Регистры - Не меньше пяти 32-битных регистров: + Не меньше пяти 32/64-битных регистров: R0, R1, R2 регистры общего назначения BP(R3) указатель кадра стэка @@ -44,7 +48,8 @@ Регистра связи нет (адрес возврата передается через стэк), регистр-счетчик команд (PC) -- скрытый, регистр флагов -- скрытый. - Нет вещественных регистров, операции с плавающей точкой (single) эмулируются. + Нет вещественных регистров, операции с плавающей точкой (single (32-бит) или double (64-бит)) + эмулируются. Формат кадра стэка @@ -52,10 +57,16 @@ меньше <- |лок. переменные|старый BP|адрес возврата|парам1|парам2|...|парамN| -> больше + (* 32 бита *) адрес(парам1) = BP + 8 адрес(парам2) = BP + 12 ... + (* 64 бита *) + адрес(парам1) = BP + 16 + адрес(парам2) = BP + 24 + ... + Параметры передаются через стэк справа налево (как cdecl), результат передается через R0, вызывающая процедура очищает стэк (как cdecl). @@ -78,10 +89,10 @@ Где: - INTEGER = INT32 - i = offTypes DIV 12; - t = (offStrings - offTypes) DIV 4 - s = FILE_SIZE - offStrings - 48 + INTEGER = INT32/INT64 + i = offTypes DIV (3 * sizeof(INTEGER)); + t = (offStrings - offTypes) DIV sizeof(INTEGER) + s = FILE_SIZE - offStrings - 12 * sizeof(INTEGER) --------------------------------------------------------------------------------------------------- Система команд @@ -97,10 +108,13 @@ XCHG Rn, Rm 6 n m temp := Rn; Rn := Rm; Rm := temp LDB Rn, [Rm + imm] 7 m*256 + n imm Rn := UInt8Ptr(Rm + imm)^ LDH Rn, [Rm + imm] 8 m*256 + n imm Rn := UInt16Ptr(Rm + imm)^ - LDW Rn, [Rm + imm] 9 m*256 + n imm Rn := Int32Ptr(Rm + imm)^ - PUSH Rn 10 n 0 DEC(SP, 4); Int32Ptr(SP)^ := Rn - PUSH imm 11 imm 0 DEC(SP, 4); Int32Ptr(SP)^ := imm - POP Rn 12 n 0 Rn := Int32Ptr(SP)^; INC(SP, 4) + LDW Rn, [Rm + imm] 9 m*256 + n imm Rn := UInt32Ptr(Rm + imm)^ +* PUSH Rn 10 n 0 DEC(SP, 4); UInt32Ptr(SP)^ := Rn +* PUSH imm 11 imm 0 DEC(SP, 4); UInt32Ptr(SP)^ := imm +* POP Rn 12 n 0 Rn := UInt32Ptr(SP)^; INC(SP, 4) +** PUSH Rn 10 n 0 DEC(SP, 8); UInt64Ptr(SP)^ := Rn +** PUSH imm 11 imm 0 DEC(SP, 8); UInt64Ptr(SP)^ := imm +** POP Rn 12 n 0 Rn := UInt64Ptr(SP)^; INC(SP, 8) L#hex: 13 hex 0 метка: LEA Rn, TYPES + imm 14 n + 000H imm Rn := imm + address(TYPES) LEA Rn, STRINGS + imm 14 n + 100H imm Rn := imm + address(STRINGS) @@ -108,6 +122,7 @@ LEA Rn, HEAP + imm 14 n + 300H imm Rn := imm + address(HEAP) LEA Rn, STACK + imm 14 n + 400H imm Rn := imm + address(STACK) LLA Rn, L#hex 15 n hex Rn := address(L#hex) +** LDD Rn, [Rm + imm] 16 m*256 + n imm Rn := UInt64Ptr(Rm + imm)^ JMP L#hex 19 hex 0 goto L#hex CALL L#hex 20 hex 0 push PC; goto L#hex @@ -128,8 +143,12 @@ STB [Rn], imm 35 n imm UInt8Ptr(Rn)^ := imm MOD 256 STH [Rn + imm], Rm 36 n*256 + m imm UInt16Ptr(Rn + imm)^ := Rm MOD 65536 STH [Rn], imm 37 n imm UInt16Ptr(Rn)^ := imm MOD 65536 - STW [Rn + imm], Rm 38 n*256 + m imm Int32Ptr(Rn + imm)^ := Rm - STW [Rn], imm 39 n imm Int32Ptr(Rn)^ := imm +* STW [Rn + imm], Rm 38 n*256 + m imm UInt32Ptr(Rn + imm)^ := Rm +* STW [Rn], imm 39 n imm UInt32Ptr(Rn)^ := imm +** STW [Rn + imm], Rm 38 n*256 + m imm UInt32Ptr(Rn + imm)^ := Rm MOD 100000000H +** STW [Rn], imm 39 n imm UInt32Ptr(Rn)^ := imm MOD 100000000H +** STD [Rn + imm], Rm 40 n*256 + m imm UInt64Ptr(Rn + imm)^ := Rm +** STD [Rn], imm 41 n imm UInt64Ptr(Rn)^ := imm AND Rn, Rm 46 n m Rn := ORD(BITS(Rn) * BITS(Rm)) AND Rn, imm 47 n imm Rn := ORD(BITS(Rn) * BITS(imm)) @@ -169,6 +188,9 @@ в командах перехода по условию (JEQ, JNE, JLT, JGE, JGT, JLE, JBT) а также в командах установки регистра по условию (SEQ, SNE, SLT, SGE, SGT, SLE). +* Команда для 32-битной виртуальной машины +** Команда для 64-битной виртуальной машины + --------------------------------------------------------------------------------------------------- Общая структура программы @@ -237,10 +259,10 @@ BYTE 0x4C, 0x00, 0x54, 0x65, 0x73, 0x74, 0x00, 0x00 GLOBAL: - WORDS 0x00000004 (* размер глобальных переменных в словах (слово = 4 байта) *) + WORDS 0x00000004 (* размер глобальных переменных в словах (слово = 4 или 8 байт) *) HEAP: - WORDS 0x007FFFBF (* размер области кучи/стэка в словах (слово = 4 байта) *) + WORDS 0x007FFFBF (* размер области кучи/стэка в словах (слово = 4 или 8 байт) *) STACK: WORDS 8 (* зарезервировано *) ---------------------------------------------------------------------------------------------------