This commit is contained in:
Able 2024-11-11 14:36:11 -06:00
parent 32cd7f8a20
commit 066e7582c9
2 changed files with 71 additions and 2 deletions

11
ext.lisp Normal file
View file

@ -0,0 +1,11 @@
;; start is the intended function to load this ext.lisp file
;; I use `(save-image 'start)`
(defun start () (load-package "ext.lisp"))
;; Quick shorthand
(defun dir () (directory))
(defun file-read (filename) (with-sd-card (str filename) (read str)))
(defun file-append (filename data) (with-sd-card (str filename 2) (print data str)))
(defun file-write (filename data) (with-sd-card (str filename 2) (print data str)))

View file

@ -3,6 +3,62 @@
*/
// Definitions
void SDWriteTwo (File file, uint16_t word) {
file.write(word & 0xFF); file.write((word >> 8) & 0xFF);
}
object *fn_savescreen (object *args, object *env) {
(void) env;
#if defined(sdcardsupport)
object *arg = checkstring(first(args));
sd_begin();
File file;
char buffer[BUFFERSIZE];
file = SD.open(MakeFilename(arg, buffer), FILE_WRITE);
if (!file) error2(PSTR("problem saving to SD card or invalid filename"));
uint16_t width = 320, height = 240;
file.write('B'); file.write('M'); // BMP
SDWriteInt(file, 14+40+width*height*2); // File size in bytes
SDWriteInt(file, 0);
SDWriteInt(file, 14+40); // Offset to image data from start
// Image header: 40 bytes
SDWriteInt(file, 40); // Header size
SDWriteInt(file, width); // Image width
SDWriteInt(file, height); // Image height
SDWriteTwo(file, 1); // Planes
SDWriteTwo(file, 16); // Bits per pixel
SDWriteInt(file, 0); // Compression (none)
SDWriteInt(file, 0); // Image size (0 for uncompressed)
SDWriteInt(file, 0); // Preferred X resolution (ignore)
SDWriteInt(file, 0); // Preferred Y resolution (ignore)
SDWriteInt(file, 0); // Colour map entries (ignore)
SDWriteInt(file, 0); // Important colours (ignore)
// Image data: width * height * 2 bytes
for (int y=height-1; y>=0; y--) {
int line = y/Leading, row = y%Leading;
for (int x=0; x<width; x++) {
int column = x/6, col = x%6;
char c = 0; bool bit;
if (column < Columns) c = ScrollBuf[column][(line+Scroll) % Lines];
if (col>=5 || row>=8) bit = 0;
else bit = font[(c & 0x7f)*5 + col] >> row & 1;
uint16_t rgb;
if (c & 0x80 && row<8) {
if (bit) rgb = COLOR_BLACK; else rgb = COLOR_GREEN;
} else {
if (bit) rgb = COLOR_WHITE; else rgb = COLOR_BLACK;
}
uint16_t data = (rgb & 0xFFC0)>>1 | (rgb & 0x1F); // Convert to 555 format
SDWriteTwo(file, data);
}
}
file.close();
#endif
return nil;
}
object *fn_sym_def (object *args, object *env) {
(void) env;
object *obj = first(args);
@ -26,17 +82,19 @@ object *fn_sym_def (object *args, object *env) {
// Symbol names
const char string_sym_def[] PROGMEM = "symbol-def";
const char stringsavescreen[] PROGMEM = "save-screen";
// Documentation strings
const char doc_sym_def[] PROGMEM = "(symbol-def symbol [str])\n"
"Prints the definition of a symbol (variable or function) defined in ulisp using the pretty printer."
"If str is specified it prints to the specified stream. It returns no value.";
const char docsavescreen[] PROGMEM = "(save-screen filename)\n"
"Saves an image of the text screen as a BMP file on the SD card.";
// Symbol lookup table
const tbl_entry_t lookup_table2[] PROGMEM = {
{ stringsavescreen, fn_savescreen, 0211, docsavescreen },
{ string_sym_def, fn_sym_def, 0212, doc_sym_def }
};