From 7e7f467acc0d9b26798d86e6bbd1502020a293f7 Mon Sep 17 00:00:00 2001 From: Norayr Chilingarian Date: Wed, 6 Nov 2013 16:00:20 +0400 Subject: [PATCH] Reals brought back for x86 and other 32bit platforms with gnuc dependency Former-commit-id: bbb031f234c6f0e2b54a9e585a666d53636aa71c --- makefile | 2 +- makefile.gnuc.armv6j | 2 +- makefile.gnuc.armv6j_hardfp | 2 +- makefile.gnuc.armv7a_hardfp | 2 +- makefile.gnuc.x86 | 2 +- makefile.gnuc.x86_64 | 2 +- src/lib/v4/armv6j/Reals.Mod | 109 +++++++++++++++++++++++++++++ src/lib/v4/armv6j_hardfp/Reals.Mod | 109 +++++++++++++++++++++++++++++ src/lib/v4/armv7a_hardfp/Reals.Mod | 109 +++++++++++++++++++++++++++++ src/lib/v4/x86/Reals.Mod | 109 +++++++++++++++++++++++++++++ src/lib/v4/{ => x86_64}/Reals.Mod | 0 11 files changed, 442 insertions(+), 6 deletions(-) create mode 100644 src/lib/v4/armv6j/Reals.Mod create mode 100644 src/lib/v4/armv6j_hardfp/Reals.Mod create mode 100644 src/lib/v4/armv7a_hardfp/Reals.Mod create mode 100644 src/lib/v4/x86/Reals.Mod rename src/lib/v4/{ => x86_64}/Reals.Mod (100%) diff --git a/makefile b/makefile index 69a01dfa..11ac7296 100644 --- a/makefile +++ b/makefile @@ -9,7 +9,7 @@ RELEASE = 1.0 INCLUDEPATH = -Isrc/lib/system/$(CCOMP)/$(TARCH) -SETPATH = CFLAGS=$(INCLUDEPATH) PATH=.:/bin:/usr/bin MODULES=.:src/lib:src/lib/v4:src/lib/system:src/lib/system/$(CCOMP):src/lib/system/$(CCOMP)/$(TARCH):src/lib/ulm:src/lib/ulm/$(CCOMP):src/lib/ulm/$(TARCH):src/lib/ooc2:src/lib/ooc2/$(CCOMP):src/lib/ooc:src/lib/ooc/$(CCOMP):src/lib/pow:src/lib/misc:src/lib/s3:src/voc:src/voc/$(CCOMP):src/voc/$(CCOMP)/$(TARCH):src/tools/ocat:src/tools/browser:src/tools/vocparam:src/tools/vmake:src/tools/coco:src/test +SETPATH = CFLAGS=$(INCLUDEPATH) PATH=.:/bin:/usr/bin MODULES=.:src/lib:src/lib/v4:src/lib/v4/$(TARCH):src/lib/system:src/lib/system/$(CCOMP):src/lib/system/$(CCOMP)/$(TARCH):src/lib/ulm:src/lib/ulm/$(CCOMP):src/lib/ulm/$(TARCH):src/lib/ooc2:src/lib/ooc2/$(CCOMP):src/lib/ooc:src/lib/ooc/$(CCOMP):src/lib/pow:src/lib/misc:src/lib/s3:src/voc:src/voc/$(CCOMP):src/voc/$(CCOMP)/$(TARCH):src/tools/ocat:src/tools/browser:src/tools/vocparam:src/tools/vmake:src/tools/coco:src/test VOC = voc VOCSTATIC0 = $(SETPATH) ./vocstatic.$(TOS).$(CCOMP).$(TARCH) diff --git a/makefile.gnuc.armv6j b/makefile.gnuc.armv6j index 8f0c08c3..cd559b4b 100644 --- a/makefile.gnuc.armv6j +++ b/makefile.gnuc.armv6j @@ -9,7 +9,7 @@ RELEASE = 1.0 INCLUDEPATH = -Isrc/lib/system/$(CCOMP)/$(TARCH) -SETPATH = CFLAGS=$(INCLUDEPATH) PATH=.:/bin:/usr/bin MODULES=.:src/lib:src/lib/v4:src/lib/system:src/lib/system/$(CCOMP):src/lib/system/$(CCOMP)/$(TARCH):src/lib/ulm:src/lib/ulm/$(CCOMP):src/lib/ulm/$(TARCH):src/lib/ooc2:src/lib/ooc2/$(CCOMP):src/lib/ooc:src/lib/ooc/$(CCOMP):src/lib/pow:src/lib/misc:src/lib/s3:src/voc:src/voc/$(CCOMP):src/voc/$(CCOMP)/$(TARCH):src/tools/ocat:src/tools/browser:src/tools/vocparam:src/tools/vmake:src/tools/coco:src/test +SETPATH = CFLAGS=$(INCLUDEPATH) PATH=.:/bin:/usr/bin MODULES=.:src/lib:src/lib/v4:src/lib/v4/$(TARCH):src/lib/system:src/lib/system/$(CCOMP):src/lib/system/$(CCOMP)/$(TARCH):src/lib/ulm:src/lib/ulm/$(CCOMP):src/lib/ulm/$(TARCH):src/lib/ooc2:src/lib/ooc2/$(CCOMP):src/lib/ooc:src/lib/ooc/$(CCOMP):src/lib/pow:src/lib/misc:src/lib/s3:src/voc:src/voc/$(CCOMP):src/voc/$(CCOMP)/$(TARCH):src/tools/ocat:src/tools/browser:src/tools/vocparam:src/tools/vmake:src/tools/coco:src/test VOC = voc VOCSTATIC0 = $(SETPATH) ./vocstatic.$(TOS).$(CCOMP).$(TARCH) diff --git a/makefile.gnuc.armv6j_hardfp b/makefile.gnuc.armv6j_hardfp index 7da3d335..91afc2f1 100644 --- a/makefile.gnuc.armv6j_hardfp +++ b/makefile.gnuc.armv6j_hardfp @@ -9,7 +9,7 @@ RELEASE = 1.0 INCLUDEPATH = -Isrc/lib/system/$(CCOMP)/$(TARCH) -SETPATH = CFLAGS=$(INCLUDEPATH) PATH=.:/bin:/usr/bin MODULES=.:src/lib:src/lib/v4:src/lib/system:src/lib/system/$(CCOMP):src/lib/system/$(CCOMP)/$(TARCH):src/lib/ulm:src/lib/ulm/$(CCOMP):src/lib/ulm/$(TARCH):src/lib/ooc2:src/lib/ooc2/$(CCOMP):src/lib/ooc:src/lib/ooc/$(CCOMP):src/lib/pow:src/lib/misc:src/lib/s3:src/voc:src/voc/$(CCOMP):src/voc/$(CCOMP)/$(TARCH):src/tools/ocat:src/tools/browser:src/tools/vocparam:src/tools/vmake:src/tools/coco:src/test +SETPATH = CFLAGS=$(INCLUDEPATH) PATH=.:/bin:/usr/bin MODULES=.:src/lib:src/lib/v4:src/lib/v4/$(TARCH):src/lib/system:src/lib/system/$(CCOMP):src/lib/system/$(CCOMP)/$(TARCH):src/lib/ulm:src/lib/ulm/$(CCOMP):src/lib/ulm/$(TARCH):src/lib/ooc2:src/lib/ooc2/$(CCOMP):src/lib/ooc:src/lib/ooc/$(CCOMP):src/lib/pow:src/lib/misc:src/lib/s3:src/voc:src/voc/$(CCOMP):src/voc/$(CCOMP)/$(TARCH):src/tools/ocat:src/tools/browser:src/tools/vocparam:src/tools/vmake:src/tools/coco:src/test VOC = voc VOCSTATIC0 = $(SETPATH) ./vocstatic.$(TOS).$(CCOMP).$(TARCH) diff --git a/makefile.gnuc.armv7a_hardfp b/makefile.gnuc.armv7a_hardfp index 6ddb95bc..65e7174d 100644 --- a/makefile.gnuc.armv7a_hardfp +++ b/makefile.gnuc.armv7a_hardfp @@ -9,7 +9,7 @@ RELEASE = 1.0 INCLUDEPATH = -Isrc/lib/system/$(CCOMP)/$(TARCH) -SETPATH = CFLAGS=$(INCLUDEPATH) PATH=.:/bin:/usr/bin MODULES=.:src/lib:src/lib/v4:src/lib/system:src/lib/system/$(CCOMP):src/lib/system/$(CCOMP)/$(TARCH):src/lib/ulm:src/lib/ulm/$(CCOMP):src/lib/ulm/$(TARCH):src/lib/ooc2:src/lib/ooc2/$(CCOMP):src/lib/ooc:src/lib/ooc/$(CCOMP):src/lib/pow:src/lib/misc:src/lib/s3:src/voc:src/voc/$(CCOMP):src/voc/$(CCOMP)/$(TARCH):src/tools/ocat:src/tools/browser:src/tools/vocparam:src/tools/vmake:src/tools/coco:src/test +SETPATH = CFLAGS=$(INCLUDEPATH) PATH=.:/bin:/usr/bin MODULES=.:src/lib:src/lib/v4:src/lib/v4/$(TARCH):src/lib/system:src/lib/system/$(CCOMP):src/lib/system/$(CCOMP)/$(TARCH):src/lib/ulm:src/lib/ulm/$(CCOMP):src/lib/ulm/$(TARCH):src/lib/ooc2:src/lib/ooc2/$(CCOMP):src/lib/ooc:src/lib/ooc/$(CCOMP):src/lib/pow:src/lib/misc:src/lib/s3:src/voc:src/voc/$(CCOMP):src/voc/$(CCOMP)/$(TARCH):src/tools/ocat:src/tools/browser:src/tools/vocparam:src/tools/vmake:src/tools/coco:src/test VOC = voc VOCSTATIC0 = $(SETPATH) ./vocstatic.$(TOS).$(CCOMP).$(TARCH) diff --git a/makefile.gnuc.x86 b/makefile.gnuc.x86 index 18d806bc..c0b84d01 100644 --- a/makefile.gnuc.x86 +++ b/makefile.gnuc.x86 @@ -9,7 +9,7 @@ RELEASE = 1.0 INCLUDEPATH = -Isrc/lib/system/$(CCOMP)/$(TARCH) -SETPATH = CFLAGS=$(INCLUDEPATH) PATH=.:/bin:/usr/bin MODULES=.:src/lib:src/lib/v4:src/lib/system:src/lib/system/$(CCOMP):src/lib/system/$(CCOMP)/$(TARCH):src/lib/ulm:src/lib/ulm/$(CCOMP):src/lib/ulm/$(TARCH):src/lib/ooc2:src/lib/ooc2/$(CCOMP):src/lib/ooc:src/lib/ooc/$(CCOMP):src/lib/pow:src/lib/misc:src/lib/s3:src/voc:src/voc/$(CCOMP):src/voc/$(CCOMP)/$(TARCH):src/tools/ocat:src/tools/browser:src/tools/vocparam:src/tools/vmake:src/tools/coco:src/test +SETPATH = CFLAGS=$(INCLUDEPATH) PATH=.:/bin:/usr/bin MODULES=.:src/lib:src/lib/v4:src/lib/v4/$(TARCH):src/lib/system:src/lib/system/$(CCOMP):src/lib/system/$(CCOMP)/$(TARCH):src/lib/ulm:src/lib/ulm/$(CCOMP):src/lib/ulm/$(TARCH):src/lib/ooc2:src/lib/ooc2/$(CCOMP):src/lib/ooc:src/lib/ooc/$(CCOMP):src/lib/pow:src/lib/misc:src/lib/s3:src/voc:src/voc/$(CCOMP):src/voc/$(CCOMP)/$(TARCH):src/tools/ocat:src/tools/browser:src/tools/vocparam:src/tools/vmake:src/tools/coco:src/test VOC = voc VOCSTATIC0 = $(SETPATH) ./vocstatic.$(TOS).$(CCOMP).$(TARCH) diff --git a/makefile.gnuc.x86_64 b/makefile.gnuc.x86_64 index 69a01dfa..11ac7296 100644 --- a/makefile.gnuc.x86_64 +++ b/makefile.gnuc.x86_64 @@ -9,7 +9,7 @@ RELEASE = 1.0 INCLUDEPATH = -Isrc/lib/system/$(CCOMP)/$(TARCH) -SETPATH = CFLAGS=$(INCLUDEPATH) PATH=.:/bin:/usr/bin MODULES=.:src/lib:src/lib/v4:src/lib/system:src/lib/system/$(CCOMP):src/lib/system/$(CCOMP)/$(TARCH):src/lib/ulm:src/lib/ulm/$(CCOMP):src/lib/ulm/$(TARCH):src/lib/ooc2:src/lib/ooc2/$(CCOMP):src/lib/ooc:src/lib/ooc/$(CCOMP):src/lib/pow:src/lib/misc:src/lib/s3:src/voc:src/voc/$(CCOMP):src/voc/$(CCOMP)/$(TARCH):src/tools/ocat:src/tools/browser:src/tools/vocparam:src/tools/vmake:src/tools/coco:src/test +SETPATH = CFLAGS=$(INCLUDEPATH) PATH=.:/bin:/usr/bin MODULES=.:src/lib:src/lib/v4:src/lib/v4/$(TARCH):src/lib/system:src/lib/system/$(CCOMP):src/lib/system/$(CCOMP)/$(TARCH):src/lib/ulm:src/lib/ulm/$(CCOMP):src/lib/ulm/$(TARCH):src/lib/ooc2:src/lib/ooc2/$(CCOMP):src/lib/ooc:src/lib/ooc/$(CCOMP):src/lib/pow:src/lib/misc:src/lib/s3:src/voc:src/voc/$(CCOMP):src/voc/$(CCOMP)/$(TARCH):src/tools/ocat:src/tools/browser:src/tools/vocparam:src/tools/vmake:src/tools/coco:src/test VOC = voc VOCSTATIC0 = $(SETPATH) ./vocstatic.$(TOS).$(CCOMP).$(TARCH) diff --git a/src/lib/v4/armv6j/Reals.Mod b/src/lib/v4/armv6j/Reals.Mod new file mode 100644 index 00000000..e752c0c9 --- /dev/null +++ b/src/lib/v4/armv6j/Reals.Mod @@ -0,0 +1,109 @@ +MODULE Reals; + (* JT, 5.2.90 / RC 9.12.91 conversion between reals and strings for HP-700, MB 9.12.91, JT for Ofront, 16.3. 95*) + + IMPORT S := SYSTEM; + + + PROCEDURE -ecvt (x: LONGREAL; ndigit, decpt, sign: LONGINT): LONGINT + "ecvt (x, ndigit, decpt, sign)"; + + PROCEDURE Ten*(e: INTEGER): REAL; + VAR r, power: LONGREAL; + BEGIN r := 1.0; + power := 10.0; + WHILE e > 0 DO + IF ODD(e) THEN r := r * power END ; + power := power * power; e := e DIV 2 + END ; + RETURN SHORT(r) + END Ten; + + PROCEDURE TenL*(e: INTEGER): LONGREAL; + VAR r, power: LONGREAL; + BEGIN r := 1.0; + power := 10.0; + LOOP + IF ODD(e) THEN r := r * power END ; + e := e DIV 2; + IF e <= 0 THEN RETURN r END ; + power := power * power + END + END TenL; + + PROCEDURE Expo*(x: REAL): INTEGER; + BEGIN + RETURN SHORT(ASH(S.VAL(LONGINT, x), -23) MOD 256) + END Expo; + + PROCEDURE ExpoL*(x: LONGREAL): INTEGER; + VAR h: LONGINT; + BEGIN + S.GET(S.ADR(x)+4, h); + RETURN SHORT(ASH(h, -20) MOD 2048) + END ExpoL; + + PROCEDURE SetExpo*(e: INTEGER; VAR x: REAL); + CONST expo = {1..8}; + BEGIN + x := S.VAL(REAL, S.VAL(SET, x) - expo + S.VAL(SET, ASH(LONG(e), 23))) + END SetExpo; + + PROCEDURE SetExpoL*(e: INTEGER; VAR x: LONGREAL); + CONST expo = {1..11}; + VAR h: SET; + BEGIN + S.GET(S.ADR(x)+4, h); + h := h - expo + S.VAL(SET, ASH(LONG(e), 20)); + S.PUT(S.ADR(x)+4, h) + END SetExpoL; + + PROCEDURE Convert*(x: REAL; n: INTEGER; VAR d: ARRAY OF CHAR); + VAR i, k: LONGINT; + BEGIN + i := ENTIER(x); k := 0; + WHILE k < n DO + d[k] := CHR(i MOD 10 + 48); i := i DIV 10; INC(k) + END + END Convert; +(* + PROCEDURE ConvertL*(x: LONGREAL; n: INTEGER; VAR d: ARRAY OF CHAR); + VAR i, k: LONGINT; + BEGIN + i := ENTIER(x); k := 0; + WHILE k < n DO + d[k] := CHR(i MOD 10 + 48); i := i DIV 10; INC(k) + END + END ConvertL; + *) + PROCEDURE ConvertL*(x: LONGREAL; n: INTEGER; VAR d: ARRAY OF CHAR); + VAR decpt, sign, i: LONGINT; buf: LONGINT; + BEGIN + (*x := x - 0.5; already rounded in ecvt*) + buf := ecvt(x, n+2, S.ADR(decpt), S.ADR(sign)); + i := 0; + WHILE i < decpt DO S.GET(buf + i, d[n - i -1]); INC(i) END ; (* showdef was crashing here on oocLowLReal.sym because of ecvt *) + i := n - i - 1; + WHILE i >= 0 DO d[i] := "0"; DEC(i) END ; + END ConvertL; + + PROCEDURE Unpack(VAR b, d: ARRAY OF S.BYTE); + VAR i, k: SHORTINT; len: LONGINT; + BEGIN i := 0; len := LEN(b); + WHILE i < len DO + k := SHORT(ORD(S.VAL(CHAR, b[i])) DIV 16); + IF k > 9 THEN d[i*2] := k + 55 ELSE d[i*2] := k + 48 END ; + k := SHORT(ORD(S.VAL(CHAR, b[i])) MOD 16); + IF k > 9 THEN d[i*2+1] := k + 55 ELSE d[i*2+1] := k + 48 END ; + INC(i) + END + END Unpack; + + PROCEDURE ConvertH* (y: REAL; VAR d: ARRAY OF CHAR); + BEGIN Unpack(y, d) + END ConvertH; + + PROCEDURE ConvertHL* (x: LONGREAL; VAR d: ARRAY OF CHAR); + BEGIN Unpack(x, d) + END ConvertHL; + +END Reals. diff --git a/src/lib/v4/armv6j_hardfp/Reals.Mod b/src/lib/v4/armv6j_hardfp/Reals.Mod new file mode 100644 index 00000000..e752c0c9 --- /dev/null +++ b/src/lib/v4/armv6j_hardfp/Reals.Mod @@ -0,0 +1,109 @@ +MODULE Reals; + (* JT, 5.2.90 / RC 9.12.91 conversion between reals and strings for HP-700, MB 9.12.91, JT for Ofront, 16.3. 95*) + + IMPORT S := SYSTEM; + + + PROCEDURE -ecvt (x: LONGREAL; ndigit, decpt, sign: LONGINT): LONGINT + "ecvt (x, ndigit, decpt, sign)"; + + PROCEDURE Ten*(e: INTEGER): REAL; + VAR r, power: LONGREAL; + BEGIN r := 1.0; + power := 10.0; + WHILE e > 0 DO + IF ODD(e) THEN r := r * power END ; + power := power * power; e := e DIV 2 + END ; + RETURN SHORT(r) + END Ten; + + PROCEDURE TenL*(e: INTEGER): LONGREAL; + VAR r, power: LONGREAL; + BEGIN r := 1.0; + power := 10.0; + LOOP + IF ODD(e) THEN r := r * power END ; + e := e DIV 2; + IF e <= 0 THEN RETURN r END ; + power := power * power + END + END TenL; + + PROCEDURE Expo*(x: REAL): INTEGER; + BEGIN + RETURN SHORT(ASH(S.VAL(LONGINT, x), -23) MOD 256) + END Expo; + + PROCEDURE ExpoL*(x: LONGREAL): INTEGER; + VAR h: LONGINT; + BEGIN + S.GET(S.ADR(x)+4, h); + RETURN SHORT(ASH(h, -20) MOD 2048) + END ExpoL; + + PROCEDURE SetExpo*(e: INTEGER; VAR x: REAL); + CONST expo = {1..8}; + BEGIN + x := S.VAL(REAL, S.VAL(SET, x) - expo + S.VAL(SET, ASH(LONG(e), 23))) + END SetExpo; + + PROCEDURE SetExpoL*(e: INTEGER; VAR x: LONGREAL); + CONST expo = {1..11}; + VAR h: SET; + BEGIN + S.GET(S.ADR(x)+4, h); + h := h - expo + S.VAL(SET, ASH(LONG(e), 20)); + S.PUT(S.ADR(x)+4, h) + END SetExpoL; + + PROCEDURE Convert*(x: REAL; n: INTEGER; VAR d: ARRAY OF CHAR); + VAR i, k: LONGINT; + BEGIN + i := ENTIER(x); k := 0; + WHILE k < n DO + d[k] := CHR(i MOD 10 + 48); i := i DIV 10; INC(k) + END + END Convert; +(* + PROCEDURE ConvertL*(x: LONGREAL; n: INTEGER; VAR d: ARRAY OF CHAR); + VAR i, k: LONGINT; + BEGIN + i := ENTIER(x); k := 0; + WHILE k < n DO + d[k] := CHR(i MOD 10 + 48); i := i DIV 10; INC(k) + END + END ConvertL; + *) + PROCEDURE ConvertL*(x: LONGREAL; n: INTEGER; VAR d: ARRAY OF CHAR); + VAR decpt, sign, i: LONGINT; buf: LONGINT; + BEGIN + (*x := x - 0.5; already rounded in ecvt*) + buf := ecvt(x, n+2, S.ADR(decpt), S.ADR(sign)); + i := 0; + WHILE i < decpt DO S.GET(buf + i, d[n - i -1]); INC(i) END ; (* showdef was crashing here on oocLowLReal.sym because of ecvt *) + i := n - i - 1; + WHILE i >= 0 DO d[i] := "0"; DEC(i) END ; + END ConvertL; + + PROCEDURE Unpack(VAR b, d: ARRAY OF S.BYTE); + VAR i, k: SHORTINT; len: LONGINT; + BEGIN i := 0; len := LEN(b); + WHILE i < len DO + k := SHORT(ORD(S.VAL(CHAR, b[i])) DIV 16); + IF k > 9 THEN d[i*2] := k + 55 ELSE d[i*2] := k + 48 END ; + k := SHORT(ORD(S.VAL(CHAR, b[i])) MOD 16); + IF k > 9 THEN d[i*2+1] := k + 55 ELSE d[i*2+1] := k + 48 END ; + INC(i) + END + END Unpack; + + PROCEDURE ConvertH* (y: REAL; VAR d: ARRAY OF CHAR); + BEGIN Unpack(y, d) + END ConvertH; + + PROCEDURE ConvertHL* (x: LONGREAL; VAR d: ARRAY OF CHAR); + BEGIN Unpack(x, d) + END ConvertHL; + +END Reals. diff --git a/src/lib/v4/armv7a_hardfp/Reals.Mod b/src/lib/v4/armv7a_hardfp/Reals.Mod new file mode 100644 index 00000000..e752c0c9 --- /dev/null +++ b/src/lib/v4/armv7a_hardfp/Reals.Mod @@ -0,0 +1,109 @@ +MODULE Reals; + (* JT, 5.2.90 / RC 9.12.91 conversion between reals and strings for HP-700, MB 9.12.91, JT for Ofront, 16.3. 95*) + + IMPORT S := SYSTEM; + + + PROCEDURE -ecvt (x: LONGREAL; ndigit, decpt, sign: LONGINT): LONGINT + "ecvt (x, ndigit, decpt, sign)"; + + PROCEDURE Ten*(e: INTEGER): REAL; + VAR r, power: LONGREAL; + BEGIN r := 1.0; + power := 10.0; + WHILE e > 0 DO + IF ODD(e) THEN r := r * power END ; + power := power * power; e := e DIV 2 + END ; + RETURN SHORT(r) + END Ten; + + PROCEDURE TenL*(e: INTEGER): LONGREAL; + VAR r, power: LONGREAL; + BEGIN r := 1.0; + power := 10.0; + LOOP + IF ODD(e) THEN r := r * power END ; + e := e DIV 2; + IF e <= 0 THEN RETURN r END ; + power := power * power + END + END TenL; + + PROCEDURE Expo*(x: REAL): INTEGER; + BEGIN + RETURN SHORT(ASH(S.VAL(LONGINT, x), -23) MOD 256) + END Expo; + + PROCEDURE ExpoL*(x: LONGREAL): INTEGER; + VAR h: LONGINT; + BEGIN + S.GET(S.ADR(x)+4, h); + RETURN SHORT(ASH(h, -20) MOD 2048) + END ExpoL; + + PROCEDURE SetExpo*(e: INTEGER; VAR x: REAL); + CONST expo = {1..8}; + BEGIN + x := S.VAL(REAL, S.VAL(SET, x) - expo + S.VAL(SET, ASH(LONG(e), 23))) + END SetExpo; + + PROCEDURE SetExpoL*(e: INTEGER; VAR x: LONGREAL); + CONST expo = {1..11}; + VAR h: SET; + BEGIN + S.GET(S.ADR(x)+4, h); + h := h - expo + S.VAL(SET, ASH(LONG(e), 20)); + S.PUT(S.ADR(x)+4, h) + END SetExpoL; + + PROCEDURE Convert*(x: REAL; n: INTEGER; VAR d: ARRAY OF CHAR); + VAR i, k: LONGINT; + BEGIN + i := ENTIER(x); k := 0; + WHILE k < n DO + d[k] := CHR(i MOD 10 + 48); i := i DIV 10; INC(k) + END + END Convert; +(* + PROCEDURE ConvertL*(x: LONGREAL; n: INTEGER; VAR d: ARRAY OF CHAR); + VAR i, k: LONGINT; + BEGIN + i := ENTIER(x); k := 0; + WHILE k < n DO + d[k] := CHR(i MOD 10 + 48); i := i DIV 10; INC(k) + END + END ConvertL; + *) + PROCEDURE ConvertL*(x: LONGREAL; n: INTEGER; VAR d: ARRAY OF CHAR); + VAR decpt, sign, i: LONGINT; buf: LONGINT; + BEGIN + (*x := x - 0.5; already rounded in ecvt*) + buf := ecvt(x, n+2, S.ADR(decpt), S.ADR(sign)); + i := 0; + WHILE i < decpt DO S.GET(buf + i, d[n - i -1]); INC(i) END ; (* showdef was crashing here on oocLowLReal.sym because of ecvt *) + i := n - i - 1; + WHILE i >= 0 DO d[i] := "0"; DEC(i) END ; + END ConvertL; + + PROCEDURE Unpack(VAR b, d: ARRAY OF S.BYTE); + VAR i, k: SHORTINT; len: LONGINT; + BEGIN i := 0; len := LEN(b); + WHILE i < len DO + k := SHORT(ORD(S.VAL(CHAR, b[i])) DIV 16); + IF k > 9 THEN d[i*2] := k + 55 ELSE d[i*2] := k + 48 END ; + k := SHORT(ORD(S.VAL(CHAR, b[i])) MOD 16); + IF k > 9 THEN d[i*2+1] := k + 55 ELSE d[i*2+1] := k + 48 END ; + INC(i) + END + END Unpack; + + PROCEDURE ConvertH* (y: REAL; VAR d: ARRAY OF CHAR); + BEGIN Unpack(y, d) + END ConvertH; + + PROCEDURE ConvertHL* (x: LONGREAL; VAR d: ARRAY OF CHAR); + BEGIN Unpack(x, d) + END ConvertHL; + +END Reals. diff --git a/src/lib/v4/x86/Reals.Mod b/src/lib/v4/x86/Reals.Mod new file mode 100644 index 00000000..e752c0c9 --- /dev/null +++ b/src/lib/v4/x86/Reals.Mod @@ -0,0 +1,109 @@ +MODULE Reals; + (* JT, 5.2.90 / RC 9.12.91 conversion between reals and strings for HP-700, MB 9.12.91, JT for Ofront, 16.3. 95*) + + IMPORT S := SYSTEM; + + + PROCEDURE -ecvt (x: LONGREAL; ndigit, decpt, sign: LONGINT): LONGINT + "ecvt (x, ndigit, decpt, sign)"; + + PROCEDURE Ten*(e: INTEGER): REAL; + VAR r, power: LONGREAL; + BEGIN r := 1.0; + power := 10.0; + WHILE e > 0 DO + IF ODD(e) THEN r := r * power END ; + power := power * power; e := e DIV 2 + END ; + RETURN SHORT(r) + END Ten; + + PROCEDURE TenL*(e: INTEGER): LONGREAL; + VAR r, power: LONGREAL; + BEGIN r := 1.0; + power := 10.0; + LOOP + IF ODD(e) THEN r := r * power END ; + e := e DIV 2; + IF e <= 0 THEN RETURN r END ; + power := power * power + END + END TenL; + + PROCEDURE Expo*(x: REAL): INTEGER; + BEGIN + RETURN SHORT(ASH(S.VAL(LONGINT, x), -23) MOD 256) + END Expo; + + PROCEDURE ExpoL*(x: LONGREAL): INTEGER; + VAR h: LONGINT; + BEGIN + S.GET(S.ADR(x)+4, h); + RETURN SHORT(ASH(h, -20) MOD 2048) + END ExpoL; + + PROCEDURE SetExpo*(e: INTEGER; VAR x: REAL); + CONST expo = {1..8}; + BEGIN + x := S.VAL(REAL, S.VAL(SET, x) - expo + S.VAL(SET, ASH(LONG(e), 23))) + END SetExpo; + + PROCEDURE SetExpoL*(e: INTEGER; VAR x: LONGREAL); + CONST expo = {1..11}; + VAR h: SET; + BEGIN + S.GET(S.ADR(x)+4, h); + h := h - expo + S.VAL(SET, ASH(LONG(e), 20)); + S.PUT(S.ADR(x)+4, h) + END SetExpoL; + + PROCEDURE Convert*(x: REAL; n: INTEGER; VAR d: ARRAY OF CHAR); + VAR i, k: LONGINT; + BEGIN + i := ENTIER(x); k := 0; + WHILE k < n DO + d[k] := CHR(i MOD 10 + 48); i := i DIV 10; INC(k) + END + END Convert; +(* + PROCEDURE ConvertL*(x: LONGREAL; n: INTEGER; VAR d: ARRAY OF CHAR); + VAR i, k: LONGINT; + BEGIN + i := ENTIER(x); k := 0; + WHILE k < n DO + d[k] := CHR(i MOD 10 + 48); i := i DIV 10; INC(k) + END + END ConvertL; + *) + PROCEDURE ConvertL*(x: LONGREAL; n: INTEGER; VAR d: ARRAY OF CHAR); + VAR decpt, sign, i: LONGINT; buf: LONGINT; + BEGIN + (*x := x - 0.5; already rounded in ecvt*) + buf := ecvt(x, n+2, S.ADR(decpt), S.ADR(sign)); + i := 0; + WHILE i < decpt DO S.GET(buf + i, d[n - i -1]); INC(i) END ; (* showdef was crashing here on oocLowLReal.sym because of ecvt *) + i := n - i - 1; + WHILE i >= 0 DO d[i] := "0"; DEC(i) END ; + END ConvertL; + + PROCEDURE Unpack(VAR b, d: ARRAY OF S.BYTE); + VAR i, k: SHORTINT; len: LONGINT; + BEGIN i := 0; len := LEN(b); + WHILE i < len DO + k := SHORT(ORD(S.VAL(CHAR, b[i])) DIV 16); + IF k > 9 THEN d[i*2] := k + 55 ELSE d[i*2] := k + 48 END ; + k := SHORT(ORD(S.VAL(CHAR, b[i])) MOD 16); + IF k > 9 THEN d[i*2+1] := k + 55 ELSE d[i*2+1] := k + 48 END ; + INC(i) + END + END Unpack; + + PROCEDURE ConvertH* (y: REAL; VAR d: ARRAY OF CHAR); + BEGIN Unpack(y, d) + END ConvertH; + + PROCEDURE ConvertHL* (x: LONGREAL; VAR d: ARRAY OF CHAR); + BEGIN Unpack(x, d) + END ConvertHL; + +END Reals. diff --git a/src/lib/v4/Reals.Mod b/src/lib/v4/x86_64/Reals.Mod similarity index 100% rename from src/lib/v4/Reals.Mod rename to src/lib/v4/x86_64/Reals.Mod