   Serial.print(micros() - start);
   Serial.println(F(" uS"));
   return nil;
+}
+
+object *fn_saveimage (object *args, object *env) {
+  object *var = eval(first(args), env);
+  return number(saveimage(var));
+}
+
+object *fn_loadimage (object *args, object *env) {
+  (void) args;
+  (void) env;
+  return number(loadimage());
 }
 
 // Arduino procedures

// Garbage collection

void markobject (object *obj) {
  if (obj == NULL) return;
  
  object* arg = car(obj);

// Constants

#if defined(__AVR_ATmega328P__)
const int workspacesize = 317;
const int EEPROMsize = 1024;
#elif defined(__AVR_ATmega32U4__)
const int workspacesize = 421;
const int EEPROMsize = 1024;
#elif defined(__AVR_ATmega2560__)
const int workspacesize = 1461;
const int EEPROMsize = 4096;
#elif defined(__AVR_ATmega1284P__)
const int workspacesize = 3000;
const int EEPROMsize = 4096;
#else
const int workspacesize = 317;
const int EEPROMsize = 1024;
#endif

const int buflen = 17;  // Length of longest symbol + 1
enum type {NONE, SYMBOL, NUMBER};
enum token { UNUSED, BRA, KET, QUO, DOT};

enum function { SYMBOLS, NIL, TEE, LAMBDA, LET, LETSTAR, CLOSURE, SPECIAL_FORMS, QUOTE, DEFUN, DEFVAR, SETQ, LOOP, PUSH, POP, INCF,
DECF, DOLIST, DOTIMES, FORMILLIS, TAIL_FORMS, PROGN, RETURN, IF, COND, WHEN, UNLESS, AND, OR, FUNCTIONS, NOT, NULLFN, CONS, ATOM, 
LISTP, CONSP, NUMBERP, EQ, CAR, FIRST, CDR, REST, CAAR, CADR, SECOND, CDAR, CDDR, CAAAR, CAADR, CADAR, CADDR, THIRD, CDAAR, CDADR, 
CDDAR, CDDDR, LENGTH, LIST, REVERSE, NTH, ASSOC, MEMBER, APPLY, FUNCALL, APPEND, MAPC, MAPCAR, ADD, SUBTRACT, MULTIPLY, DIVIDE, MOD,
ONEPLUS, ONEMINUS, ABS, RANDOM, MAX, MIN, NUMEQ, LESS, LESSEQ, GREATER, GREATEREQ, NOTEQ, PLUSP, MINUSP, ZEROP, ODDP, EVENP, READ,
EVAL, LOCALS, GLOBALS, MAKUNBOUND, BREAK, PRINT, PRINC, GC, SAVEIMAGE, LOADIMAGE, PINMODE, DIGITALREAD, DIGITALWRITE, ANALOGREAD, 
ANALOGWRITE, DELAY, MILLIS, SHIFTOUT, SHIFTIN, NOTE, ENDFUNCTIONS };

// Typedefs

