altos/lisp: Append a CRC to the saved image to validate on restore
[fw/altos] / src / lisp / ao_lisp.h
index 44838a3419b814c81450efe3aae78520a9f12bcf..ea3d2a0905f8d5e8e9deab93523404f3bd0ecb61 100644 (file)
@@ -26,15 +26,21 @@ typedef int16_t             ao_signed_poly;
 #ifdef AO_LISP_SAVE
 
 struct ao_lisp_os_save {
-       ao_poly ao_lisp_atoms;
-       ao_poly ao_lisp_globals;
+       ao_poly         atoms;
+       ao_poly         globals;
+       uint16_t        const_checksum;
+       uint16_t        const_checksum_inv;
 };
 
-#define AO_LISP_POOL   (AO_LISP_POOL_TOTAL - sizeof (struct ao_lisp_os_save))
+#define AO_LISP_POOL_EXTRA     (sizeof(struct ao_lisp_os_save))
+#define AO_LISP_POOL   ((int) (AO_LISP_POOL_TOTAL - AO_LISP_POOL_EXTRA))
 
 int
 ao_lisp_os_save(void);
 
+int
+ao_lisp_os_restore_save(struct ao_lisp_os_save *save, int offset);
+
 int
 ao_lisp_os_restore(void);
 
@@ -67,12 +73,14 @@ extern uint8_t ao_lisp_const[AO_LISP_POOL_CONST];
 #define _ao_lisp_atom_eval     _atom("eval")
 #define _ao_lisp_atom_read     _atom("read")
 #define _ao_lisp_atom_eof      _atom("eof")
+#define _ao_lisp_atom_save     _atom("save")
+#define _ao_lisp_atom_restore  _atom("restore")
 #else
 #include "ao_lisp_const.h"
 #ifndef AO_LISP_POOL
-#define AO_LISP_POOL   16384
+#define AO_LISP_POOL   3072
 #endif
-extern uint8_t         ao_lisp_pool[AO_LISP_POOL];
+extern uint8_t         ao_lisp_pool[AO_LISP_POOL + AO_LISP_POOL_EXTRA];
 #endif
 
 /* Primitive types */