From 86060f45e0f2d5641b9f5c5b4998c52d51dd6b54 Mon Sep 17 00:00:00 2001 From: Vincent St-Amour Date: Wed, 29 Apr 2009 15:07:47 -0400 Subject: [PATCH] Moved some code around. --- bignums.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++ makefile | 5 +++++ picobit-vm.c | 69 ++++++++++-------------------------------------------------- primitives.c | 2 +- 4 files changed, 70 insertions(+), 59 deletions(-) diff --git a/bignums.c b/bignums.c index 1d81be2..caa59f5 100644 --- a/bignums.c +++ b/bignums.c @@ -446,4 +446,57 @@ obj encode_int (int32 n) { return alloc_ram_cell_init (BIGNUM_FIELD0, ENCODE_FIXNUM(0), n >> 8, n); } +#else + +// regular (finite, 24 bits) bignums + +int32 decode_int (obj o) { + uint8 u; + uint8 h; + uint8 l; + + if (o < MIN_FIXNUM_ENCODING) + TYPE_ERROR("decode_int.0", "integer"); + + if (o <= (MIN_FIXNUM_ENCODING + (MAX_FIXNUM - MIN_FIXNUM))) + return DECODE_FIXNUM(o); + + if (IN_RAM(o)) { + if (!RAM_BIGNUM(o)) + TYPE_ERROR("decode_int.1", "integer"); + + u = ram_get_field1 (o); + h = ram_get_field2 (o); + l = ram_get_field3 (o); + } + else if (IN_ROM(o)) { + if (!ROM_BIGNUM(o)) + TYPE_ERROR("decode_int.2", "integer"); + + u = rom_get_field1 (o); + h = rom_get_field2 (o); + l = rom_get_field3 (o); + } + else + TYPE_ERROR("decode_int.3", "integer"); + + if (u >= 128) // negative + return ((int32)((((int16)u - 256) << 8) + h) << 8) + l; + + return ((int32)(((int16)u << 8) + h) << 8) + l; +} + +obj encode_int (int32 n) { + if (n >= MIN_FIXNUM && n <= MAX_FIXNUM) + return ENCODE_FIXNUM(n); + + return alloc_ram_cell_init (BIGNUM_FIELD0, n >> 16, n >> 8, n); +} + #endif + +// useful for some primitives +void decode_2_int_args (void) { + a1 = decode_int (arg1); + a2 = decode_int (arg2); +} diff --git a/makefile b/makefile index 96e5264..e9f22cc 100644 --- a/makefile +++ b/makefile @@ -27,5 +27,10 @@ debug-gc: cc -O -c -g -DDEBUG -DDEBUG_GC dispatch.c make picobit-vm +mcc: picoboard2.c picobit-vm.c gc.c bignums.c debug.c primitives.c dispatch.c + cpp -DPICOBOARD2 picobit-vm.c | /bin/grep -v '^#' > picobit-vm.mcc.c + wine ~/.wine/drive_c/MCC18/bin/mcc18.exe -I=C:/MCC18/h -p=18f4550 picoboard2.c + wine ~/.wine/drive_c/MCC18/bin/mplink.exe -lC:/MCC18/lib -mpicoboard2.map picoboard2.lkr picoboard2.o -o picoboard2.hex + clean: rm -f *.o *~ picobit-vm diff --git a/picobit-vm.c b/picobit-vm.c index 9273b83..b9d1767 100644 --- a/picobit-vm.c +++ b/picobit-vm.c @@ -145,64 +145,6 @@ void set_global (uint8 i, obj o) { /*---------------------------------------------------------------------------*/ -// primitives - -#ifndef INFINITE_PRECISION_BIGNUMS - -// regular (finite, 24 bits) bignums - -int32 decode_int (obj o) { - uint8 u; - uint8 h; - uint8 l; - - if (o < MIN_FIXNUM_ENCODING) - TYPE_ERROR("decode_int.0", "integer"); - - if (o <= (MIN_FIXNUM_ENCODING + (MAX_FIXNUM - MIN_FIXNUM))) - return DECODE_FIXNUM(o); - - if (IN_RAM(o)) { - if (!RAM_BIGNUM(o)) - TYPE_ERROR("decode_int.1", "integer"); - - u = ram_get_field1 (o); - h = ram_get_field2 (o); - l = ram_get_field3 (o); - } - else if (IN_ROM(o)) { - if (!ROM_BIGNUM(o)) - TYPE_ERROR("decode_int.2", "integer"); - - u = rom_get_field1 (o); - h = rom_get_field2 (o); - l = rom_get_field3 (o); - } - else - TYPE_ERROR("decode_int.3", "integer"); - - if (u >= 128) // negative - return ((int32)((((int16)u - 256) << 8) + h) << 8) + l; - - return ((int32)(((int16)u << 8) + h) << 8) + l; -} - -obj encode_int (int32 n) { - if (n >= MIN_FIXNUM && n <= MAX_FIXNUM) - return ENCODE_FIXNUM(n); - - return alloc_ram_cell_init (BIGNUM_FIELD0, n >> 16, n >> 8, n); -} - -#endif - -void decode_2_int_args (void) { - a1 = decode_int (arg1); - a2 = decode_int (arg2); -} - -/*---------------------------------------------------------------------------*/ - #ifdef WORKSTATION int hidden_fgetc (FILE *f) @@ -366,6 +308,17 @@ int read_hex_file (char *filename) /*---------------------------------------------------------------------------*/ +#ifdef PICOBOARD2 +// no separate compilation +#include "debug.c" +#include "gc.c" +#include "bignums.c" +#include "primitives.c" +#include "dispatch.c" +#endif + +/*---------------------------------------------------------------------------*/ + #ifdef WORKSTATION void usage (void) diff --git a/primitives.c b/primitives.c index 69e50e2..f0a853c 100644 --- a/primitives.c +++ b/primitives.c @@ -213,7 +213,7 @@ void prim_gt (void) { arg2 = OBJ_FALSE; } -prim_leq (void) { // TODO these 2 are useful, but they add to the code size, is it worth it ? +void prim_leq (void) { // TODO these 2 are useful, but they add to the code size, is it worth it ? #ifdef INFINITE_PRECISION_BIGNUMS arg1 = encode_bool(cmp (arg1, arg2) <= 0); #else -- 2.11.4.GIT