mescc: Cleanup mini-mes build and test.
[mes.git] / scaffold / cons-mes.c
index aa53eee4194ff5714250f2706515da1d773d28ac..94d21ece09b0713b29a109a3ada13a9bb55fede7 100644 (file)
  * along with Mes.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+#if __GNUC__
+#include "mlibc.c"
+#endif
+#define assert(x) ((x) ? (void)0 : assert_fail (#x))
+
 #define MES_MINI 1
 #define FIXED_PRIMITIVES 0
 
 char arena[2000];
 //char buf0[400];
 
-int g_stdin = 0;
-
-#if __GNUC__
-typedef long size_t;
-void *malloc (size_t i);
-int open (char const *s, int mode);
-int read (int fd, void* buf, size_t n);
-void write (int fd, char const* s, int n);
-
-void
-exit (int code)
-{
-  asm (
-       "movl %0,%%ebx\n\t"
-       "movl $1,%%eax\n\t"
-       "int  $0x80"
-       : // no outputs "=" (r)
-       : "" (code)
-       );
-  // not reached
-  exit (0);
-}
-
-char const*
-getenv (char const* p)
-{
-  return 0;
-}
-
-int
-read (int fd, void* buf, size_t n)
-{
-  int r;
-  //syscall (SYS_write, fd, s, n));
-  asm (
-       "movl %1,%%ebx\n\t"
-       "movl %2,%%ecx\n\t"
-       "movl %3,%%edx\n\t"
-       "movl $0x3,%%eax\n\t"
-       "int  $0x80\n\t"
-       "mov %%eax,%0\n\t"
-       : "=r" (r)
-       : "" (fd), "" (buf), "" (n)
-       : "eax", "ebx", "ecx", "edx"
-       );
-  return r;
-}
-
-int
-open (char const *s, int mode)
-{
-  int r;
-  //syscall (SYS_open, mode));
-  asm (
-       "mov %1,%%ebx\n\t"
-       "mov %2,%%ecx\n\t"
-       "mov $0x5,%%eax\n\t"
-       "int $0x80\n\t"
-       "mov %%eax,%0\n\t"
-       : "=r" (r)
-       : "" (s), "" (mode)
-       : "eax", "ebx", "ecx"
-       );
-  return r;
-}
-
-int
-getchar ()
-{
-  char c;
-  int r = read (g_stdin, &c, 1);
-  if (r < 1) return -1;
-  return c;
-}
-
-void
-write (int fd, char const* s, int n)
-{
-  int r;
-  //syscall (SYS_write, fd, s, n));
-  asm (
-       "mov %0,%%ebx\n\t"
-       "mov %1,%%ecx\n\t"
-       "mov %2,%%edx\n\t"
-
-       "mov $0x4, %%eax\n\t"
-       "int $0x80\n\t"
-       : // no outputs "=" (r)
-       : "" (fd), "" (s), "" (n)
-       : "eax", "ebx", "ecx", "edx"
-       );
-}
-
-int
-putchar (int c)
-{
-  //write (STDOUT, s, strlen (s));
-  //int i = write (STDOUT, s, strlen (s));
-  write (1, (char*)&c, 1);
-  return 0;
-}
-
-void *
-malloc (size_t size)
-{
-  int *n;
-  int len = size + sizeof (size);
-  //n = mmap (0, len, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0 );
-  *n = len;
-  return (void*)(n+1);
-}
-
-void
-free (void *p)
-{
-  int *n = (int*)p-1;
-  //munmap ((void*)p, *n);
-}
-
-#define EOF -1
-#define STDIN 0
-#define STDOUT 1
-#define STDERR 2
-
-size_t
-strlen (char const* s)
-{
-  int i = 0;
-  while (s[i]) i++;
-  return i;
-}
-
-int
-strcmp (char const* a, char const* b)
-{
-  while (*a && *b && *a == *b) {a++;b++;}
-  return *a - *b;
-}
-
-int
-puts (char const* s)
-{
-  //write (STDOUT, s, strlen (s));
-  //int i = write (STDOUT, s, strlen (s));
-  int i = strlen (s);
-  write (1, s, i);
-  return 0;
-}
-
-int
-eputs (char const* s)
-{
-  //write (STDERR, s, strlen (s));
-  //int i = write (STDERR, s, strlen (s));
-  int i = strlen (s);
-  write (2, s, i);
-  return 0;
-}
-
-char const*
-itoa (int x)
-{
-  static char buf[10];
-  char *p = buf+9;
-  *p-- = 0;
-
-  int sign = x < 0;
-  if (sign)
-    x = -x;
-  
-  do
-    {
-      *p-- = '0' + (x % 10);
-      x = x / 10;
-    } while (x);
-
-  if (sign)
-    *p-- = '-';
-
-  return p+1;
-}
-#endif
-
-void
-assert_fail (char* s)
-{
-  eputs ("assert fail:");
-#if __GNUC__
-  eputs (s);
-#endif
-  eputs ("\n");
-#if __GNUC__
-  *((int*)0) = 0;
-#endif
-}
-
-#if __GNUC__
-#define assert(x) ((x) ? (void)0 : assert_fail ("boo:" #x))
-#else
-//#define assert(x) ((x) ? (void)0 : assert_fail ("boo:" #x))
-#define assert(x) ((x) ? (void)0 : assert_fail (0))
-#endif
-
 typedef int SCM;
 
 #if __GNUC__
@@ -273,36 +75,11 @@ typedef int (*f_t) (void);
 struct function {
   int (*function) (void);
   int arity;
+  char *name;
 };
 
 struct scm *g_cells = arena;
 
-//scm *g_news = 0;
-
-// struct scm scm_nil = {SPECIAL, "()"};
-// struct scm scm_f = {SPECIAL, "#f"};
-// struct scm scm_t = {SPECIAL, "#t"};
-// struct scm_dot = {SPECIAL, "."};
-// struct scm_arrow = {SPECIAL, "=>"};
-// struct scm_undefined = {SPECIAL, "*undefined*"};
-// struct scm_unspecified = {SPECIAL, "*unspecified*"};
-// struct scm_closure = {SPECIAL, "*closure*"};
-// struct scm_circular = {SPECIAL, "*circular*"};
-// struct scm_begin = {SPECIAL, "*begin*"};
-
-// struct scm_vm_apply = {SPECIAL, "core:apply"};
-// struct scm_vm_apply2 = {SPECIAL, "*vm-apply2*"};
-
-// struct scm_vm_eval = {SPECIAL, "core:eval"};
-
-// struct scm_vm_begin = {SPECIAL, "*vm-begin*"};
-// //scm scm_vm_begin_read_input_file = {SPECIAL, "*vm-begin-read-input-file*"};
-// struct scm_vm_begin2 = {SPECIAL, "*vm-begin2*"};
-
-// struct scm_vm_return = {SPECIAL, "*vm-return*"};
-
-// //#include "mes.symbols.h"
-
 #define cell_nil 1
 #define cell_f 2
 #define cell_t 3
@@ -336,49 +113,37 @@ SCM tmp_num;
 SCM tmp_num2;
 
 int ARENA_SIZE = 200;
-struct function functions[2];
+struct function g_functions[5];
 int g_function = 0;
 
 
-#if __GNUC__
-//FIXME
 SCM make_cell (SCM type, SCM car, SCM cdr);
-#endif
-struct function fun_make_cell = {&make_cell, 3};
+struct function fun_make_cell = {&make_cell,3,"make-cell"};
 struct scm scm_make_cell = {TFUNCTION,0,0};
    //, "make-cell", 0};
 SCM cell_make_cell;
 
-#if __GNUC__
-//FIXME
 SCM cons (SCM x, SCM y);
-#endif
-struct function fun_cons = {&cons, 2};
+struct function fun_cons = {&cons,2,"cons"};
 struct scm scm_cons = {TFUNCTION,0,0};
   // "cons", 0};
 SCM cell_cons;
 
-#if __GNUC__
-//FIXME
 SCM car (SCM x);
-#endif
-struct function fun_car = {&car, 1};
+struct function fun_car = {&car,1,"car"};
 struct scm scm_car = {TFUNCTION,0,0};
   // "car", 0};
 SCM cell_car;
 
-#if __GNUC__
-//FIXME
 SCM cdr (SCM x);
-#endif
-struct function fun_cdr = {&cdr, 1};
+struct function fun_cdr = {&cdr,1,"cdr"};
 struct scm scm_cdr = {TFUNCTION,0,0};
 // "cdr", 0};
 SCM cell_cdr;
 
 // SCM eq_p (SCM x, SCM y);
-// struct function fun_eq_p = {&eq_p, 2};
-// scm scm_eq_p = {TFUNCTION,0,0};// "eq?", 0};
+// struct function fun_eq_p = {&eq_p,2,"eq?"};
+// scm scm_eq_p = {TFUNCTION,0,0};
 // SCM cell_eq_p;
 
 #define TYPE(x) (g_cells[x].type)
@@ -393,10 +158,10 @@ SCM cell_cdr;
 #endif
 #define CONTINUATION(x) g_cells[x].cdr
 #if __GNUC__
-//#define FUNCTION(x) functions[g_cells[x].function]
+//#define FUNCTION(x) g_functions[g_cells[x].function]
 #endif
 
-#define FUNCTION(x) functions[g_cells[x].cdr]
+#define FUNCTION(x) g_functions[g_cells[x].cdr]
 #define VALUE(x) g_cells[x].cdr
 #define VECTOR(x) g_cells[x].cdr
 
@@ -424,10 +189,7 @@ SCM cell_cdr;
 SCM
 alloc (int n)
 {
-#if __GNUC__
-  //FIXME GNUC
   assert (g_free + n < ARENA_SIZE);
-#endif
   SCM x = g_free;
   g_free += n;
   return x;
@@ -437,10 +199,7 @@ SCM
 make_cell (SCM type, SCM car, SCM cdr)
 {
   SCM x = alloc (1);
-#if __GNUC__
-  //FIXME GNUC
   assert (TYPE (type) == NUMBER);
-#endif
   TYPE (x) = VALUE (type);
   if (VALUE (type) == CHAR || VALUE (type) == NUMBER) {
     if (car) CAR (x) = CAR (car);
@@ -474,11 +233,11 @@ tmp_num2_ (int x)
 SCM
 cons (SCM x, SCM y)
 {
+#if 0
   puts ("cons x=");
-#if __GNUC__
   puts (itoa (x));
-#endif
   puts ("\n");
+#endif
   VALUE (tmp_num) = PAIR;
   return make_cell (tmp_num, x, y);
 }
@@ -486,11 +245,11 @@ cons (SCM x, SCM y)
 SCM
 car (SCM x)
 {
+#if 0
   puts ("car x=");
-#if __GNUC__
   puts (itoa (x));
-#endif
   puts ("\n");
+#endif
 #if MES_MINI
   //Nyacc
   //assert ("!car");
@@ -503,11 +262,11 @@ car (SCM x)
 SCM
 cdr (SCM x)
 {
+#if 0
   puts ("cdr x=");
-#if __GNUC__
   puts (itoa (x));
-#endif
   puts ("\n");
+#endif
 #if MES_MINI
   //Nyacc
   //assert ("!cdr");
@@ -517,19 +276,6 @@ cdr (SCM x)
   return CDR(x);
 }
 
-// SCM
-// eq_p (SCM x, SCM y)
-// {
-//   return (x == y
-//           || ((TYPE (x) == KEYWORD && TYPE (y) == KEYWORD
-//                && STRING (x) == STRING (y)))
-//           || (TYPE (x) == CHAR && TYPE (y) == CHAR
-//               && VALUE (x) == VALUE (y))
-//           || (TYPE (x) == NUMBER && TYPE (y) == NUMBER
-//               && VALUE (x) == VALUE (y)))
-//     ? cell_t : cell_f;
-// }
-
 SCM
 gc_push_frame ()
 {
@@ -568,32 +314,6 @@ assq (SCM x, SCM a)
   return a != cell_nil ? car (a) : cell_f;
 }
 
-#if __GNUC__
-  //FIXME GNUC
-SCM
-assq_ref_env (SCM x, SCM a)
-{
-  x = assq (x, a);
-  if (x == cell_f) return cell_undefined;
-  return cdr (x);
-}
-#endif
-
-#if __GNUC__
-  //FIXME GNUC
-SCM
-assert_defined (SCM x, SCM e)
-{
-  if (e != cell_undefined) return e;
-  // error (cell_symbol_unbound_variable, x);
-  puts ("unbound variable");
-  exit (33);
-  return e;
-}
-#endif
-
-#if 1
-  //FIXME GNUC
 SCM
 push_cc (SCM p1, SCM p2, SCM a, SCM c) ///((internal))
 {
@@ -607,24 +327,11 @@ push_cc (SCM p1, SCM p2, SCM a, SCM c) ///((internal))
   r3 = x;
   return cell_unspecified;
 }
-#endif
 
-#if __GNUC__
 SCM caar (SCM x) {return car (car (x));}
 SCM cadr (SCM x) {return car (cdr (x));}
 SCM cdar (SCM x) {return cdr (car (x));}
 SCM cddr (SCM x) {return cdr (cdr (x));}
-#else
-// Weirdness: wrong function labeling
-// SCM cadr (SCM x) {
-//   x = cdr (x);
-//   return car (x);
-// }
-// SCM cddr (SCM x) {
-//   x = cdr (x);
-//   return cdr (x);
-// }
-#endif
 
 #if __GNUC__
 //FIXME
@@ -635,9 +342,7 @@ SCM gc_pop_frame ();
 SCM
 eval_apply ()
 {
-  puts ("e/a: fixme\n");
  eval_apply:
-  puts ("eval_apply\n");
   // if (g_free + GC_SAFETY > ARENA_SIZE)
   //   gc_pop_frame (gc (gc_push_frame ()));
 
@@ -651,45 +356,18 @@ eval_apply ()
   SCM y = cell_nil;
 
  apply:
-  puts ("apply\n");
   switch (TYPE (car (r1)))
     {
     case TFUNCTION: {
       puts ("apply.function\n");
-      y = 0x22;
       //check_formals (car (r1), MAKE_NUMBER (FUNCTION (car (r1)).arity), cdr (r1));
-#if __GNUC__
-      r1 = call (car (r1), cdr (r1)); /// FIXME: move into eval_apply
-#else
-      //FIXME
-      x = car (r1);
-      y = cdr (r1);
-      r1 = call (x, y);
-#endif
-      puts ("after call\n");
-      y = 0x44;
+      r1 = call (car (r1), cdr (r1));
       goto vm_return;
     }
     }
-// #if __GNUC__
-//   //FIXME
-//   push_cc (car (r1), r1, r0, cell_vm_apply2);
-// #endif
-//   goto eval;
-//  apply2:
-//   //check_apply (r1, car (r2));
-//   r1 = cons (r1, cdr (r2));
-//   goto apply;
-
- eval:
- begin:
- begin2:
  vm_return:
-  // FIXME
-  puts ("vm-return00\n");
   x = r1;
   gc_pop_frame ();
-  puts ("vm-return01\n");
   r1 = x;
   goto eval_apply;
 }
@@ -698,68 +376,29 @@ SCM
 call (SCM fn, SCM x)
 {
   puts ("call\n");
-#if __GNUC__
-  //fn=11
-  //function1
-  puts ("fn=");
-  puts (itoa(fn)); 
-  puts ("\n");
-  puts ("functiono");
-  puts (itoa(g_cells[fn].cdr));
-  puts ("\n");
-#endif
-  if (fn != 11) {
-    puts("FN != 11\n");
-    return 11;
-  }
-  if (g_cells[11].cdr != 1) {
-    puts("fn.cdr != 11\n");
-    return 11;
-  }
-  
   if ((FUNCTION (fn).arity > 0 || FUNCTION (fn).arity == -1)
       && x != cell_nil && TYPE (CAR (x)) == VALUES)
     x = cons (CADAR (x), CDR (x));
-  puts ("00\n");
   if ((FUNCTION (fn).arity > 1 || FUNCTION (fn).arity == -1)
       && x != cell_nil && TYPE (CDR (x)) == PAIR && TYPE (CADR (x)) == VALUES)
     x = cons (CAR (x), cons (CDADAR (x), CDR (x)));
-  //struct function* f = &FUNCTION (fn);
-  puts ("01\n");
-  switch (2)///FIXME FUNCTION (fn).arity)
+  switch (FUNCTION (fn).arity)
     {
     // case 0: return FUNCTION (fn).function0 ();
     // case 1: return FUNCTION (fn).function1 (car (x));
     // case 2: return FUNCTION (fn).function2 (car (x), cadr (x));
     // case 3: return FUNCTION (fn).function3 (car (x), cadr (x), car (cddr (x)));
     // case -1: return FUNCTION (fn).functionn (x);
-    case 0: {puts("02.0\n");return (FUNCTION (fn).function) ();}
-    case 1: {puts("03.1\n");return ((SCM(*)(SCM))(FUNCTION (fn).function)) (car (x));}
-#if 0
-      //__GNUC__
+    case 0: {return (FUNCTION (fn).function) ();}
+    case 1: {return ((SCM(*)(SCM))(FUNCTION (fn).function)) (car (x));}
     case 2: {return ((SCM(*)(SCM,SCM))(FUNCTION (fn).function)) (car (x), cadr (x));}
-#else
-    case 2: {
-      puts ("04.2\n");
-      SCM p1 = car (x);
-      SCM p2 = cdr (x);
-      p2 = car (p2);
-      //return ((SCM(*)(SCM,SCM))(FUNCTION (fn).function)) (p1, p2);
-      int (*functionx) (int,int) = (SCM(*)(SCM,SCM))FUNCTION (fn).function;
-      //return ((SCM(*)(SCM,SCM))(*FUNCTION (fn).function)) (p1, p2);
-      //return ((SCM(*)(SCM,SCM))(*functionx)) (p1, p2);
-      SCM p3;
-      //p3 = 0x44;
-      puts ("05\n");
-      return cons (p1, p2);
-      return (*functionx) (p1, p2);
-    }
+    case 3: {return ((SCM(*)(SCM,SCM,SCM))(FUNCTION (fn).function)) (car (x), cadr (x), car (cddr (x)));}
+#if __GNUC__
+      // FIXME GNUC
+    case -1: {return ((SCM(*)(SCM))(FUNCTION (fn).function)) (x);}
 #endif
-    case 3: {puts("05.3\n");return ((SCM(*)(SCM,SCM,SCM))(FUNCTION (fn).function)) (car (x), cadr (x), car (cddr (x)));}
-      //case -1: {return ((SCM(*)(SCM))(FUNCTION (fn).function)) (x);}
     default: {return ((SCM(*)(SCM))(FUNCTION (fn).function)) (x);}
     }
-
   return cell_unspecified;
 }
 
@@ -841,16 +480,6 @@ make_symbol (SCM s)
   return x ? x : make_symbol_ (s);
 }
 
-SCM
-cstring_to_list (char const* s)
-{
-  SCM p = cell_nil;
-  int i = strlen (s);
-  while (i--)
-    p = cons (MAKE_CHAR (s[i]), p);
-  return p;
-}
-
 SCM
 acons (SCM key, SCM value, SCM alist)
 {
@@ -864,18 +493,6 @@ SCM
 gc_init_cells ()
 {
   return 0;
-//   g_cells = (scm *)malloc (2*ARENA_SIZE*sizeof(scm));
-
-// #if __NYACC__ || FIXME_NYACC
-//   TYPE (0) = TVECTOR;
-// // #else
-// //   TYPE (0) = VECTOR;
-// #endif
-//   LENGTH (0) = 1000;
-//   VECTOR (0) = 0;
-//   g_cells++;
-//   TYPE (0) = CHAR;
-//   VALUE (0) = 'c';
 }
 
 // INIT NEWS
@@ -957,31 +574,10 @@ g_free++;
 
   SCM a = cell_nil;
 
-#if __GNUC__ && 0
-  //#include "mes.symbol-names.i"
-#else
-// g_cells[cell_nil].car = cstring_to_list (scm_nil.name);
-// g_cells[cell_f].car = cstring_to_list (scm_f.name);
-// g_cells[cell_t].car = cstring_to_list (scm_t.name);
-// g_cells[cell_dot].car = cstring_to_list (scm_dot.name);
-// g_cells[cell_arrow].car = cstring_to_list (scm_arrow.name);
-// g_cells[cell_undefined].car = cstring_to_list (scm_undefined.name);
-// g_cells[cell_unspecified].car = cstring_to_list (scm_unspecified.name);
-// g_cells[cell_closure].car = cstring_to_list (scm_closure.name);
-// g_cells[cell_circular].car = cstring_to_list (scm_circular.name);
-// g_cells[cell_begin].car = cstring_to_list (scm_begin.name);
-#endif
-
-  // a = acons (cell_symbol_mes_version, MAKE_STRING (cstring_to_list (VERSION)), a);
-  // a = acons (cell_symbol_mes_prefix, MAKE_STRING (cstring_to_list (PREFIX)), a);
-
   a = acons (cell_symbol_dot, cell_dot, a);
   a = acons (cell_symbol_begin, cell_begin, a);
   a = acons (cell_closure, a, a);
 
-  // a = acons (cell_symbol_call_with_current_continuation, cell_call_with_current_continuation, a);
-  // a = acons (cell_symbol_sc_expand, cell_f, a);
-
   return a;
 }
 
@@ -1018,61 +614,25 @@ mes_builtins (SCM a)
 // #include "posix.environment.i"
 // #include "reader.environment.i"
 #else
-
 scm_make_cell.cdr = g_function;
-functions[g_function++] = fun_make_cell;
+g_functions[g_function++] = fun_make_cell;
 cell_make_cell = g_free++;
-#if __GNUC__
- puts ("WOOOT=");
- puts (itoa (g_free));
- puts ("\n");
-  //FIXME GNUC
  g_cells[cell_make_cell] = scm_make_cell;
-#else
-g_cells[16] = scm_make_cell;
-#endif
  
 scm_cons.cdr = g_function;
-functions[g_function++] = fun_cons;
+g_functions[g_function++] = fun_cons;
 cell_cons = g_free++;
-#if __GNUC__
-  //FIXME GNUC
 g_cells[cell_cons] = scm_cons;
-#else
-g_cells[17] = scm_cons;
-#endif
  
 scm_car.cdr = g_function;
-functions[g_function++] = fun_car;
+g_functions[g_function++] = fun_car;
 cell_car = g_free++;
-#if __GNUC__
-  //FIXME GNUC
 g_cells[cell_car] = scm_car;
-#endif
  
-#if __GNUC__
-  //FIXME GNUC
 scm_cdr.cdr = g_function;
-functions[g_function++] = fun_cdr;
+g_functions[g_function++] = fun_cdr;
 cell_cdr = g_free++;
 g_cells[cell_cdr] = scm_cdr;
-
-// scm_make_cell.string = cstring_to_list (scm_make_cell.name);
-// g_cells[cell_make_cell].string = MAKE_STRING (scm_make_cell.string);
-// a = acons (make_symbol (scm_make_cell.string), cell_make_cell, a);
-
-// scm_cons.string = cstring_to_list (scm_cons.name);
-// g_cells[cell_cons].string = MAKE_STRING (scm_cons.string);
-// a = acons (make_symbol (scm_cons.string), cell_cons, a);
-
-// scm_car.string = cstring_to_list (scm_car.name);
-// g_cells[cell_car].string = MAKE_STRING (scm_car.string);
-// a = acons (make_symbol (scm_car.string), cell_car, a);
-
-// scm_cdr.string = cstring_to_list (scm_cdr.name);
-// g_cells[cell_cdr].string = MAKE_STRING (scm_cdr.string);
-// a = acons (make_symbol (scm_cdr.string), cell_cdr, a);
-#endif
 #endif
   return a;
 }
@@ -1082,19 +642,13 @@ bload_env (SCM a) ///((internal))
 {
   g_stdin = open ("module/mes/read-0.mo", 0);
 #if __GNUC__
+  //FIXME GNUC
   //g_stdin = g_stdin ? g_stdin : fopen (PREFIX "module/mes/read-0.mo", "r");
 #endif
   char *p = (char*)g_cells;
-#if __GNUC__
-  //FIXME GNUC
   assert (getchar () == 'M');
   assert (getchar () == 'E');
   assert (getchar () == 'S');
-#else
-  getchar ();
-  getchar ();
-  getchar ();
-#endif
   g_stack = getchar () << 8;
   g_stack += getchar ();
   int c = getchar ();
@@ -1125,32 +679,7 @@ fill ()
   TYPE (9) = 0x2d2d2d2d;
   CAR (9) = 0x2d2d2d2d;
   CDR (9) = 0x3e3e3e3e;
-#if 0
-  // (A(B))
-  TYPE (10) = PAIR;
-  CAR (10) = 11;
-  CDR (10) = 12;
-
-  TYPE (11) = CHAR;
-  CAR (11) = 0x58585858;
-  CDR (11) = 89;
 
-  TYPE (12) = PAIR;
-  CAR (12) = 13;
-  CDR (12) = 1;
-
-  TYPE (13) = CHAR;
-  CAR (13) = 0x58585858;
-  CDR (13) = 90;
-
-  TYPE (14) = 0x58585858;
-  CAR (14) = 0x58585858;
-  CDR (14) = 0x58585858;
-
-  TYPE (14) = 0x58585858;
-  CAR (14) = 0x58585858;
-  CDR (14) = 0x58585858;
-#else
   // (cons 0 1)
   TYPE (10) = PAIR;
   CAR (10) = 11;
@@ -1180,29 +709,6 @@ fill ()
   CAR (15) = 0x58585858;
   CDR (15) = 1;
 
-  //g_stack@23
-  TYPE (19) = PAIR;
-  CAR (19) = 1;
-  CDR (19) = 1;
-
-  TYPE (20) = PAIR;
-  CAR (20) = 7;
-  CDR (20) = 19;
-
-  TYPE (21) = PAIR;
-  CAR (21) = 7;
-  CDR (21) = 20;
-
-  TYPE (22) = PAIR;
-  CAR (22) = 134;
-  CDR (22) = 21;
-
-  TYPE (23) = PAIR;
-  CAR (23) = 22;
-  CDR (23) = 137;
-
-#endif
-
   return 0;
 }
 
@@ -1236,7 +742,7 @@ display_ (SCM x)
       {
         //puts ("<number>\n");
 #if __GNUC__
-        putchar (48 + VALUE (x));
+        puts (itoa (VALUE (x)));
 #else
         int i;
         i = VALUE (x);
@@ -1269,10 +775,65 @@ display_ (SCM x)
         puts (")");
         break;
       }
+    case SPECIAL:
+      {
+        switch (x)
+          {
+          case 1: {puts ("()"); break;}
+          case 2: {puts ("#f"); break;}
+          case 3: {puts ("#t"); break;}
+          default:
+            {
+#if __GNUC__
+        puts ("<x:");
+        puts (itoa (x));
+        puts (">");
+#else
+        puts ("<x>");
+#endif
+            }
+          }
+        break;
+      }
+    case SYMBOL:
+      {
+        switch (x)
+          {
+          case 11: {puts (" . "); break;}
+          case 12: {puts ("lambda"); break;}
+          case 13: {puts ("begin"); break;}
+          case 14: {puts ("if"); break;}
+          case 15: {puts ("quote"); break;}
+          case 37: {puts ("car"); break;}
+          case 38: {puts ("cdr"); break;}
+          case 39: {puts ("null?"); break;}
+          case 40: {puts ("eq?"); break;}
+          case 41: {puts ("cons"); break;}
+          default:
+            {
+#if __GNUC__
+        puts ("<s:");
+        puts (itoa (x));
+        puts (">");
+#else
+        puts ("<s>");
+#endif
+            }
+          }
+        break;
+      }
     default:
       {
         //puts ("<default>\n");
+#if __GNUC__
+        puts ("<");
+        puts (itoa (TYPE (x)));
+        puts (":");
+        puts (itoa (x));
+        puts (">");
+#else
         puts ("_");
+#endif
         break;
       }
     }
@@ -1283,11 +844,11 @@ SCM
 simple_bload_env (SCM a) ///((internal))
 {
   puts ("reading: ");
-  char *mo = "module/mes/hack-32.mo";
+  char *mo = "module/mes/tiny-0-32.mo";
   puts (mo);
   puts ("\n");
   g_stdin = open (mo, 0);
-  if (g_stdin < 0) {eputs ("no such file: module/mes/read-0-32.mo\n");return 1;} 
+  if (g_stdin < 0) {eputs ("no such file: module/mes/tiny-0-32.mo\n");return 1;}
 
   char *p = (char*)g_cells;
   int c;
@@ -1299,32 +860,17 @@ simple_bload_env (SCM a) ///((internal))
   puts ("\n");
 #endif
 
-#if 0
-  //__GNUC__
   assert (getchar () == 'M');
   assert (getchar () == 'E');
   assert (getchar () == 'S');
   puts (" *GOT MES*\n");
   g_stack = getchar () << 8;
   g_stack += getchar ();
+
+#if __GNUC__
   puts ("stack: ");
   puts (itoa (g_stack));
   puts ("\n");
-#else
-  c = getchar ();
-  putchar (c);
-  if (c != 'M') exit (10);
-  c = getchar ();
-  putchar (c);
-  if (c != 'E') exit (11);
-  c = getchar ();
-  putchar (c);
-  if (c != 'S') exit (12);
-  puts (" *GOT MES*\n");
-
-  // skip stack
-  getchar ();
-  getchar ();
 #endif
 
   c = getchar ();
@@ -1338,12 +884,20 @@ simple_bload_env (SCM a) ///((internal))
   puts ("read done\n");
 
   g_free = (p-(char*)g_cells) / sizeof (struct scm);
-  // gc_peek_frame ();
-  // g_symbols = r1;
+  
+  if (g_free != 15) exit (33);
+  
+#if 0
+  gc_peek_frame ();
+  g_symbols = r1;
+#else
   g_symbols = 1;
+#endif
   g_stdin = STDIN;
   r0 = mes_builtins (r0);
   
+  if (g_free != 19) exit (34);
+  
 #if __GNUC__
   puts ("cells read: ");
   puts (itoa (g_free));
@@ -1380,11 +934,13 @@ simple_bload_env (SCM a) ///((internal))
   return r2;
 }
 
+char string_to_cstring_buf[1024];
 char const*
 string_to_cstring (SCM s)
 {
-  static char buf[1024];
-  char *p = buf;
+  //static char buf[1024];
+  //char *p = buf;
+  char *p = string_to_cstring_buf;
   s = STRING(s);
   while (s != cell_nil)
     {
@@ -1392,7 +948,8 @@ string_to_cstring (SCM s)
       s = cdr (s);
     }
   *p = 0;
-  return buf;
+  //return buf;
+  return string_to_cstring_buf;
 }
 
 SCM
@@ -1423,11 +980,7 @@ stderr_ (SCM x)
 int
 main (int argc, char *argv[])
 {
-  puts ("Hello mini-mes!\n");
-#if __GNUC__
-  //g_debug = getenv ("MES_DEBUG");
-#endif
-  //if (getenv ("MES_ARENA")) ARENA_SIZE = atoi (getenv ("MES_ARENA"));
+  puts ("Hello cons-mes!\n");
   if (argc > 1 && !strcmp (argv[1], "--help")) return eputs ("Usage: mes [--dump|--load] < FILE");
 #if __GNUC__
   if (argc > 1 && !strcmp (argv[1], "--version")) {eputs ("Mes ");return eputs (VERSION);};
@@ -1446,31 +999,15 @@ main (int argc, char *argv[])
   if (argc > 1 && !strcmp (argv[1], "--dump")) return dump ();
 #endif
 
-#if 0
-  //__GNUC__
-  //FIXME
-  push_cc (r2, cell_unspecified, r0, cell_unspecified);
-  for (int x=19; x<26 ;x++)
-    {
-      puts(itoa(x));
-      puts(": type=");
-      puts(itoa(g_cells[x].type));
-      puts(" car=");
-      puts(itoa(g_cells[x].car));
-      puts(" cdr=");
-      puts(itoa(g_cells[x].cdr));
-      puts("\n");
-    }
-#else
-
-  g_stack = 23;
-  g_free = 24;
-  r1 = r2; //10: the-program
-  r2 = cell_unspecified;
+#if __GNUC__
+  puts ("g_free=");
+  puts (itoa(g_free));
+  puts ("\n");
 #endif
 
+  push_cc (r2, cell_unspecified, r0, cell_unspecified);
+
 #if __GNUC__
-  display_ (g_stack);
 
   puts ("g_free=");
   puts (itoa(g_free));
@@ -1497,10 +1034,8 @@ main (int argc, char *argv[])
   puts ("\n");
 #endif
 
-  //r3 = cell_vm_begin;
   r3 = cell_vm_apply;
   r1 = eval_apply ();
-  //stderr_ (r1);
   display_ (r1);
 
   eputs ("\n");
@@ -1519,25 +1054,5 @@ main (int argc, char *argv[])
 }
 
 #if __GNUC__
-void
-_start ()
-{
-  int r;
-  asm (
-       "mov %%ebp,%%eax\n\t"
-       "addl $8,%%eax\n\t"
-       "push %%eax\n\t"
-
-       "mov %%ebp,%%eax\n\t"
-       "addl $4,%%eax\n\t"
-       "movzbl (%%eax),%%eax\n\t"
-       "push %%eax\n\t"
-
-       "call main\n\t"
-       "movl %%eax,%0\n\t"
-       : "=r" (r)
-       : //no inputs "" (&main)
-       );
-  exit (r);
-}
+#include "mstart.c"
 #endif