   }
 }
 
+void pinthex (uint16_t i, pfun_t pfun) {
+  int lead = 0;
+  uint16_t p = 0x1000;
+  for (uint16_t d=p; d>0; d=d/16) {
+    uint16_t j = i/d;
+    if (j!=0 || lead || d==1) { pfun((j<10) ? j+'0' : j+'W'); lead=1;}  
+    i = i - j*d;
+  }
+}
+
 inline void pln (pfun_t pfun) {
   pfun('\n');
 }

    if (SYMBOLTABLESIZE - (newtop - SymbolTable) < BUFFERSIZE) error2(0, PSTR("no room for long symbols"));
    SymbolTop = newtop;
  }
  if (i > 1535) error2(0, PSTR("Too many long symbols"));
  return i + 64000; // First number unused by radix40
}

intptr_t lookupfn (symbol_t name) {
  #if defined(__AVR_ATmega4809__) || defined(__AVR_ATtiny3216__)
  return (intptr_t)lookup_table[name].fptr;
  #else
  return pgm_read_word(&lookup_table[name].fptr);
  #endif
}

uint8_t lookupmin (symbol_t name) {
  #if defined(__AVR_ATmega4809__) || defined(__AVR_ATtiny3216__)
  return lookup_table[name].min;
  #else
  return pgm_read_byte(&lookup_table[name].min);
  #endif
}

uint8_t lookupmax (symbol_t name) {
  #if defined(__AVR_ATmega4809__) || defined(__AVR_ATtiny3216__)
  return lookup_table[name].max;
  #else
  return pgm_read_byte(&lookup_table[name].max);
  #endif
}

char *lookupbuiltin (symbol_t name) {
  char *buffer = SymbolTop;
  #if defined(__AVR_ATmega4809__) || defined(__AVR_ATtiny3216__)
  strcpy(buffer, (char *)(lookup_table[name].string));
  #else
  strcpy_P(buffer, (char *)(pgm_read_word(&lookup_table[name].string)));

    object *cell = myalloc();
    cell->car = NULL;
    uint8_t shift = (sizeof(int)-1)*8;
    cell->chars = (arg->chars)<<shift;
    obj->cdr = cell;
  } else if (type == SYMBOL) {
    char *s = symbolname(arg->name);
