diff --git a/build.sh b/build.sh index ccb2357..3f0ac39 100755 --- a/build.sh +++ b/build.sh @@ -1,11 +1,15 @@ -#!/usr/bin/env bash +#!/bin/sh -e echo "Cleaning.." rm -rf bin mkdir bin +echo "Compiling.." +cat src/main.tal src/font.tal > src/parade.tal + echo "Assembling.." -uxnasm parade.tal bin/parade.rom +uxnasm src/parade.tal bin/parade.rom +rm src/parade.tal echo "Installing.." if [ -d "$HOME/roms" ] && [ -e ./bin/parade.rom ] diff --git a/src/newyork12.uf2 b/etc/newyork12.uf2 similarity index 100% rename from src/newyork12.uf2 rename to etc/newyork12.uf2 diff --git a/src/newyork14.uf2 b/etc/newyork14.uf2 similarity index 100% rename from src/newyork14.uf2 rename to etc/newyork14.uf2 diff --git a/src/newyork24.uf3 b/etc/newyork24.uf3 similarity index 100% rename from src/newyork24.uf3 rename to etc/newyork24.uf3 diff --git a/etc/parade.c b/etc/parade.c new file mode 100644 index 0000000..539a759 --- /dev/null +++ b/etc/parade.c @@ -0,0 +1,421 @@ +#include + +#define NAMELEN 16 +#define TEXTLEN 256 +#define BUFLEN 512 + +typedef struct Vessel { + char id, name[NAMELEN], note[TEXTLEN], prog[TEXTLEN]; + struct Vessel *owner, *parent; +} Vessel; + +typedef struct Parade { + int len; + Vessel vessels[256]; +} Parade; + +Vessel *guest; + +/* clang-format off */ + +static char *actions[12] = { + "create", "become", "enter", "leave", + "take", "drop", "warp", "transform", + "note", "program", "use", ""}; + +#pragma mark - Helpers + +static unsigned char chex(char c) { if(c >= 'a' && c <= 'f') return 10 + c - 'a'; if(c >= 'A' && c <= 'F') return 10 + c - 'A'; return (c - '0') & 0xF; } +static unsigned char shex(char *s, int len) { int i, n = 0; for(i = 0; i < len; ++i) n |= (chex(s[i]) << ((len - i - 1) * 4)); return n; } +static int imin(int a, int b) { return a < b ? a : b; } +static int cisp(char c) { return c == ' ' || c == '\t' || c == '\n' || c == '\r'; } +static int slen(char *s) { int n = 0; while(s[n] && s[++n]) ; return n; } +static int cpos(char *s, char c) { int i = 0; while(s[i] && s[i]) if(s[i++] == c) return i - 1; return -1; } +static char * spor(char *s, int c) { int i; for(i = slen(s); i >= 0; --i) if(s[i] == c) return s + i; return s - 1; } +static int scmp(char *a, char *b) { int i = 0; while(a[i] == b[i]) if(!a[i++]) return 1; return 0; } +static char * strm(char *s) { char *end; while(cisp(*s)) s++; if(*s == 0) return s; end = s + slen(s) - 1; while(end > s && cisp(*end)) end--; end[1] = '\0'; return s; } +static int afnd(char *src[], int len, char *val) { int i; for(i = 0; i < len; i++) if(scmp(src[i], val)) return i; return -1; } +static char * sstr(char *src, char *dest, int from, int to) { int i; char *a = (char *)src + from, *b = (char *)dest; for(i = 0; i < to; i++) b[i] = a[i]; dest[to] = '\0'; return dest; } + +/* clang-format on */ + +#pragma mark - Generics + +static int +isvisible(Vessel *g, Vessel *v) +{ + if(g->parent != v->parent) + return 0; + if(g->parent == v) + return 0; + if(g == v) + return 0; + return 1; +} + +static int +isparadox(Vessel *v) +{ + return v->parent == v; +} + +static char +rune(Vessel *v) +{ + if(isparadox(v)) + return '^'; + if(slen(v->note) > 0) + return '*'; + if(slen(v->prog) > 0) + return '+'; + if(v->owner == guest) + return '~'; + return 0; +} + +static Vessel * +addvessel(Parade *p, Vessel *v, char *name) +{ + Vessel *nv = &p->vessels[p->len]; + nv->id = p->len; + nv->owner = v ? v : nv; + nv->parent = v ? v->parent : nv; + sstr(name, nv->name, 0, imin(slen(name), NAMELEN - 1)); + p->len++; + return nv; +} + +static Vessel * +findvisible(Parade *p, Vessel *v, char *name) +{ + int i; + char *n = spor(name, ' ') + 1; + for(i = 0; i < p->len; ++i) { + if(!isvisible(v, &p->vessels[i])) + continue; + if(scmp(p->vessels[i].name, n)) + return &p->vessels[i]; + } + return NULL; +} + +static Vessel * +findinventory(Parade *p, Vessel *v, char *name) +{ + int i; + char *n = spor(name, ' ') + 1; + for(i = 0; i < p->len; ++i) { + if(&p->vessels[i] == v) + continue; + if(p->vessels[i].parent != v) + continue; + if(scmp(p->vessels[i].name, n)) + return &p->vessels[i]; + } + + return NULL; +} + +static Vessel * +findany(Parade *p, char *name) +{ + int i; + char *n = spor(name, ' ') + 1; + for(i = 0; i < p->len; ++i) + if(scmp(p->vessels[i].name, n)) + return &p->vessels[i]; + return NULL; +} + +#pragma mark - Actions + +static void +createvessel(Parade *p, char *val) +{ + Vessel *v; + if(findany(p, val) || slen(val) < 4 || p->len > 255) + printf("You cannot create the %s.\n", val); + else { + v = addvessel(p, guest, spor(val, ' ') + 1); + printf("You created the %s%c.\n", v->name, rune(v)); + } +} + +static void +becomevessel(Parade *p, char *val) +{ + Vessel *v = findany(p, val); + if(!v) + printf("You do not see the %s.\n", val); + else { + guest = v; + printf("You became the %s%c.\n", v->name, rune(v)); + } +} + +static void +entervessel(Parade *p, char *val) +{ + Vessel *v = findvisible(p, guest, val); + if(!v) + printf("You do not see the %s.\n", val); + else { + guest->parent = v; + printf("You entered the %s%c.\n", v->name, rune(v)); + } +} + +static void +leavevessel(void) +{ + Vessel *v = guest->parent; + if(v == v->parent) + printf("You cannot leave the %s%c.\n", v->name, rune(v)); + else { + printf("You left the %s%c.\n", v->name, rune(v)); + guest->parent = v->parent; + } +} + +static void +takevessel(Parade *p, char *val) +{ + Vessel *v = findvisible(p, guest, val); + if(!v) + printf("You do not see the %s.\n", val); + else { + v->parent = guest; + printf("You took the %s%c.\n", v->name, rune(v)); + } +} + +static void +dropvessel(Parade *p, char *val) +{ + Vessel *v = findinventory(p, guest, val); + if(!v) + printf("You do not carry the %s.\n", val); + else { + v->parent = guest->parent->parent; + printf("You dropped the %s%c.\n", v->name, rune(v)); + } +} + +static void +warpvessel(Parade *p, char *val) +{ + Vessel *v = findany(p, val); + if(!v) + printf("You cannot warp to the %s.\n", val); + else { + guest->parent = v; + printf("You warped to the %s%c.\n", v->name, rune(v)); + } +} + +static void +transformvessel(Parade *p, char *val) +{ + char *name = spor(val, ' ') + 1; + if(findany(p, name) || slen(name) < 3) + printf("You cannot transform into the %s.\n", name); + else { + sstr(name, guest->name, 0, imin(slen(name), TEXTLEN - 1)); + printf("You transformed into the %s%c.\n", guest->name, rune(guest)); + } +} + +static void +notevessel(char *val) +{ + Vessel *v = guest->parent; + if(slen(val) < 1) + printf("You remove the note of the %s%c.\n", v->name, rune(v)); + else { + sstr(val, v->note, 0, imin(slen(val), TEXTLEN - 1)); + printf("You added a note to the %s%c.\n", v->name, rune(v)); + } +} + +static void +programvessel(char *val) +{ + Vessel *v = guest->parent; + if(slen(val) < 1) + printf("You remove the program of the %s%c.\n", v->name, rune(v)); + else { + sstr(val, v->prog, 0, imin(slen(val), TEXTLEN - 1)); + printf("You programmed the %s%c.\n", v->name, rune(v)); + } +} + +static void +lookvessel(Parade *p) +{ + int i; + if(isparadox(guest)) + printf("You are the %s%c.\n", guest->name, rune(guest)); + else + printf("You are the %s%c in the %s%c.\n", + guest->name, + rune(guest), + guest->parent->name, + rune(guest->parent)); + if(slen(guest->parent->note) > 2) + printf("%s\n", guest->parent->note); + for(i = 0; i < p->len; ++i) + if(isvisible(guest, &p->vessels[i])) + printf("- %s%c\n", p->vessels[i].name, rune(&p->vessels[i])); +} + +#pragma mark - Parade + +static int usevessel(Parade *p, char *val); + +static void +act(Parade *p, char *cmd, char *val) +{ + /* clang-format off */ + switch(afnd(actions, 12, cmd)) { + case 0x0: createvessel(p, val); break; + case 0x1: becomevessel(p, val); break; + case 0x2: entervessel(p, val); break; + case 0x3: leavevessel(); break; + case 0x4: takevessel(p, val); break; + case 0x5: dropvessel(p, val); break; + case 0x6: warpvessel(p, val); break; + case 0x7: transformvessel(p, val); break; + case 0x8: notevessel(val); break; + case 0x9: programvessel(val); break; + case 0xA: usevessel(p, val); break; + case 0xB: lookvessel(p); break; + default: printf("Unknown action: %s.\n", cmd); break; + } + /* clang-format off */ +} + +static Vessel * +spawn(Parade *p) +{ + addvessel(p, NULL, "library"); + addvessel(p, &p->vessels[0], "ghost"); + return &p->vessels[1]; +} + +static int +parse(Parade *p, char *line, int id) +{ + int split = cpos(line, '|'); + int len = slen(line); + Vessel *nv = &p->vessels[id]; + if(len < 22 || split < 0 || line[0] == ';') + return 0; + nv->id = id; + nv->owner = &p->vessels[shex(line, 2)]; + nv->parent = &p->vessels[shex(line + 2, 2)]; + strm(sstr(line, nv->name, 5, NAMELEN)); + if(split > 23) + sstr(line, nv->note, 21, split - 22); + if(len - split > 3) + sstr(line, nv->prog, split + 2, len - split - 3); + return 1; +} + +static int +save(Parade *p, char *filename) +{ + int i; + FILE *f = fopen(filename, "w"); + for(i = 0; i < p->len; ++i) + fprintf(f, "%02x%02x %-15s %s | %s\n", + p->vessels[i].owner->id, + p->vessels[i].parent->id, + p->vessels[i].name, + p->vessels[i].note, + p->vessels[i].prog); + fclose(f); + return 1; +} + +static int +load(Parade *p, char *filename) +{ + char line[BUFLEN]; + FILE *f = fopen(filename, "r"); + if(f == NULL) + return 1; + p->len = 0; + while(fgets(line, BUFLEN, f)) { + if(parse(p, line, p->len)) + p->len++; + } + return 1; +} + +static int +answer(Parade *p, char *input) +{ + int split = cpos(input, ' '); + char action[NAMELEN], value[TEXTLEN]; + if(cpos(input, '|') >= 0) + return 1; + if(split >= 0) { + sstr(input, action, 0, split); + sstr(input, value, split + 1, imin(slen(input) - split, TEXTLEN - 1)); + } else if(slen(input) < 2) { + action[0] = '\0'; + value[0] = '\0'; + } else if(slen(input) >= 0) { + sstr(input, action, 0, imin(slen(input), NAMELEN - 1)); + value[0] = '\0'; + } + if(scmp(action, "@quit")) + return 0; + if(scmp(action, "@save") && slen(value) > 3) + return save(p, spor(input, ' ') + 1); + if(scmp(action, "@load") && slen(value) > 3) + return load(p, spor(input, ' ') + 1); + act(p, action, value); + return 1; +} + +static int +usevessel(Parade *p, char *val) +{ + Vessel *v = findvisible(p, guest, val); + if(!v) + printf("You do not see %s.\n", val); + else if(slen(v->prog) < 2) + printf("You cannot use %s%c.\n", val, rune(v)); + else + answer(p, v->prog); + return 0; +} + +static int +listen(Parade *p) +{ + char input[TEXTLEN]; + printf("> "); + if(fgets(input, TEXTLEN, stdin)) + return answer(p, strm(input)); + return 0; +} + +int +main(int argc, char **argv) +{ + Parade parade; + parade.len = 0; + guest = spawn(¶de); + if(argc == 2) + load(¶de, argv[1]); + printf("A %s%c appeared in the %s%c.\n", + guest->name, + rune(guest), + guest->parent->name, + rune(guest->parent)); + while(listen(¶de)) + ; + return 0; +} diff --git a/src/font.tal b/src/font.tal new file mode 100644 index 0000000..948a777 --- /dev/null +++ b/src/font.tal @@ -0,0 +1,529 @@ +@newyork14-uf2 + 0000 0000 0000 0000 0009 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0405 0509 070b 0b04 0606 0708 0408 0308 + 0a0a 0a0a 0a0a 0a0a 0a0a 0404 0608 0609 + 0b0c 0a09 0908 080a 0a06 050a 080c 0a09 + 0909 0a09 080b 0c0e 0a0a 0804 0704 0707 + 0508 0907 0908 0508 0a04 0508 040e 0a08 + 0909 0807 060a 0a0c 080a 0705 0305 0801 + 0c0c 0908 0a09 0b08 0808 0808 0807 0808 + 0808 0606 0606 0a08 0808 0808 0a0a 0a0a + 0405 0709 0608 0908 0a0a 0a05 0500 0e0a + 0000 0000 0a00 0000 0000 0007 0600 0e07 + 0905 0000 0000 0009 090a 0a0c 0c0c 100f + 0709 0707 0404 0009 0a0e 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 2020 2020 2020 0000 0000 0000 0000 + 2020 2000 2000 0000 0000 0000 0000 0000 + 0000 5050 5000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0a3f 147e 2800 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 1038 5450 3018 0000 0000 0000 0000 + 1414 1454 3810 0000 0000 0000 0000 0000 + 0000 3f48 4849 3204 0000 c040 8000 0000 + 0912 2222 2100 0000 8040 4040 8000 0000 + 0000 1824 2428 1028 0000 0000 0000 0000 + 4442 4122 1c00 0000 c080 0080 c000 0000 + 0000 4040 4000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0010 2020 4040 4040 0000 0000 0000 0000 + 4040 4020 2010 0000 0000 0000 0000 0000 + 0020 1010 0808 0808 0000 0000 0000 0000 + 0808 0810 1020 0000 0000 0000 0000 0000 + 0000 1054 3854 1000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 1010 10fe 0000 0000 0000 0000 + 1010 1000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 2020 4000 0000 0000 0000 0000 + 0000 0000 0000 007e 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 4000 0000 0000 0000 0000 0000 + 0000 0002 0204 0408 0000 0000 0000 0000 + 0810 1020 2000 0000 0000 0000 0000 0000 + 0000 1e21 4040 4040 0000 0000 8080 8080 + 4040 4021 1e00 0000 8080 8000 0000 0000 + 0000 0818 0808 0808 0000 0000 0000 0000 + 0808 0808 1c00 0000 0000 0000 0000 0000 + 0000 1e21 4000 0102 0000 0000 8080 0000 + 0408 1020 7f00 0000 0000 0080 8000 0000 + 0000 1e21 0101 0206 0000 0000 0000 0000 + 0100 0040 211e 0000 0080 8080 0000 0000 + 0000 0204 0812 2242 0000 0000 0000 0000 + 7f02 0202 0700 0000 8000 0000 0000 0000 + 0000 3f20 2020 3e01 0000 0000 0000 0000 + 0000 0000 0106 3800 8080 8080 0000 0000 + 000c 1020 405e 6140 0000 0000 0000 0080 + 4040 4021 1e00 0000 8080 8000 0000 0000 + 0000 7f40 0101 0202 0000 8080 0000 0000 + 0404 0808 0800 0000 0000 0000 0000 0000 + 0000 1e21 2121 1e21 0000 0000 0000 0000 + 4040 4040 211e 0000 8080 8080 0000 0000 + 0000 1e21 4040 4040 0000 0000 8080 8080 + 211e 0001 021c 0000 8080 8000 0000 0000 + 0000 0000 0000 2000 0000 0000 0000 0000 + 0000 0000 2000 0000 0000 0000 0000 0000 + 0000 0000 0000 2000 0000 0000 0000 0000 + 0000 0000 2020 4000 0000 0000 0000 0000 + 0000 0000 0008 1020 0000 0000 0000 0000 + 4020 1008 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 7e00 0000 0000 0000 0000 + 007e 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0040 2010 0000 0000 0000 0000 + 0810 2040 0000 0000 0000 0000 0000 0000 + 0000 1c22 4141 0204 0000 0000 0000 0000 + 0808 0800 0800 0000 0000 0000 0000 0000 + 0000 0000 001f 204e 0000 0000 0000 8040 + 5252 4d20 1e00 0000 4040 8000 0000 0000 + 0000 0404 0a0a 1111 0000 0000 0000 0000 + 203f 4040 e000 0000 8080 4040 e000 0000 + 0000 fc42 4141 7e41 0000 0000 0000 0000 + 4040 4041 fe00 0000 8080 8000 0000 0000 + 0000 3e43 8180 8080 0000 0000 0000 0000 + 8080 8142 3c00 0000 0000 0000 0000 0000 + 0000 fc42 4141 4141 0000 0000 0000 0000 + 4141 4142 fc00 0000 0000 0000 0000 0000 + 0000 fe42 4040 4878 0000 0000 0000 0000 + 4840 4042 fe00 0000 0000 0000 0000 0000 + 0000 fe42 4240 4878 0000 0000 0000 0000 + 4840 4040 e000 0000 0000 0000 0000 0000 + 0000 3e43 8180 8083 0000 0000 0000 0080 + 8181 8142 3c00 0000 0000 0000 0000 0000 + 0000 e341 4141 417f 0000 8000 0000 0000 + 4141 4141 e300 0000 0000 0000 8000 0000 + 0000 7020 2020 2020 0000 0000 0000 0000 + 2020 2020 7000 0000 0000 0000 0000 0000 + 0000 7020 2020 2020 0000 0000 0000 0000 + 2020 2020 2020 20c0 0000 0000 0000 0000 + 0000 e742 4448 5060 0000 8000 0000 0000 + 5048 4442 e700 0000 0000 0000 8000 0000 + 0000 e040 4040 4040 0000 0000 0000 0000 + 4040 4042 fe00 0000 0000 0000 0000 0000 + 0000 c040 6060 5151 0000 6040 c0c0 4040 + 4a4a 4444 e000 0000 4040 4040 e000 0000 + 0000 e361 5151 4949 0000 8000 0000 0000 + 4545 4343 e100 0000 0000 0000 0000 0000 + 0000 3c42 8181 8181 0000 0000 0000 0000 + 8181 8142 3c00 0000 0000 0000 0000 0000 + 0000 fc42 4141 4142 0000 0000 0000 0000 + 7c40 4040 e000 0000 0000 0000 0000 0000 + 0000 3c42 8181 8181 0000 0000 0000 0000 + 8181 8142 3c08 0600 0000 0000 0000 0000 + 0000 fc42 4141 4142 0000 0000 0000 0000 + 7c44 4241 e300 0000 0000 0000 8000 0000 + 0000 3d43 8180 6018 0000 0000 0000 0000 + 0681 81c2 bc00 0000 0000 0000 0000 0000 + 0000 fe92 1010 1010 0000 0000 0000 0000 + 1010 1010 3800 0000 0000 0000 0000 0000 + 0000 e140 4040 4040 0000 c080 8080 8080 + 4040 4021 1e00 0000 8080 8000 0000 0000 + 0000 e040 4020 2011 0000 e040 4080 8000 + 110a 0a04 0400 0000 0000 0000 0000 0000 + 0000 ee44 4422 2215 0000 3810 1020 2040 + 1515 0808 0800 0000 4040 8080 8000 0000 + 0000 e341 2222 1408 0000 8000 0000 0000 + 1422 2241 e300 0000 0000 0000 8000 0000 + 0000 e341 2222 1414 0000 8000 0000 0000 + 0808 0808 1c00 0000 0000 0000 0000 0000 + 0000 fe82 0408 0810 0000 0000 0000 0000 + 2020 4082 fe00 0000 0000 0000 0000 0000 + 0060 4040 4040 4040 0000 0000 0000 0000 + 4040 4040 4060 0000 0000 0000 0000 0000 + 0000 0040 4020 2010 0000 0000 0000 0000 + 1008 0804 0400 0000 0000 0000 0000 0000 + 0060 2020 2020 2020 0000 0000 0000 0000 + 2020 2020 2060 0000 0000 0000 0000 0000 + 0000 0010 2844 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 fe00 0000 0000 0000 0000 0000 + 0000 0000 4020 1000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0038 448c 0000 0000 0000 0000 + 3444 848c 7200 0000 0000 0000 0000 0000 + 0000 40c0 405c 6241 0000 0000 0000 0000 + 4141 4162 5c00 0000 0000 0000 0000 0000 + 0000 0000 0038 4480 0000 0000 0000 0000 + 8080 8044 3800 0000 0000 0000 0000 0000 + 0000 0602 023a 4682 0000 0000 0000 0000 + 8282 8247 3a00 0000 0000 0000 0000 0000 + 0000 0000 0038 4482 0000 0000 0000 0000 + fe80 8244 3800 0000 0000 0000 0000 0000 + 0000 3040 40e0 4040 0000 0000 0000 0000 + 4040 4040 e000 0000 0000 0000 0000 0000 + 0000 0000 023a 4482 0000 0000 0000 0000 + 8244 7880 7c82 827c 0000 0000 0000 0000 + 0000 40c0 405c 6241 0000 0000 0000 0000 + 4141 4141 e300 0000 0000 0000 8000 0000 + 0000 0040 0040 c040 0000 0000 0000 0000 + 4040 4040 e000 0000 0000 0000 0000 0000 + 0000 0020 0020 6020 0000 0000 0000 0000 + 2020 2020 2020 4080 0000 0000 0000 0000 + 0000 40c0 404c 4850 0000 0000 0000 0000 + 6050 4844 ee00 0000 0000 0000 0000 0000 + 0000 0040 c040 4040 0000 0000 0000 0000 + 4040 4040 e000 0000 0000 0000 0000 0000 + 0000 0000 0058 e542 0000 0000 00c0 2010 + 4242 4242 e700 0000 1010 1010 3800 0000 + 0000 0000 005c e241 0000 0000 0000 0000 + 4141 4141 e300 0000 0000 0000 8000 0000 + 0000 0000 0038 4482 0000 0000 0000 0000 + 8282 8244 3800 0000 0000 0000 0000 0000 + 0000 0000 00dc 6241 0000 0000 0000 0000 + 4141 4162 5c40 40e0 0000 0000 0000 0000 + 0000 0000 003a 4682 0000 0000 0000 0000 + 8282 8246 3a02 0207 0000 0000 0000 0000 + 0000 0000 005c e240 0000 0000 0000 0000 + 4040 4040 e000 0000 0000 0000 0000 0000 + 0000 0000 0078 8480 0000 0000 0000 0000 + 6018 0484 7800 0000 0000 0000 0000 0000 + 0000 0040 40e0 4040 0000 0000 0000 0000 + 4040 4048 3000 0000 0000 0000 0000 0000 + 0000 0000 00c3 4141 0000 0000 0000 0000 + 4141 4123 1d00 0000 0000 0000 8000 0000 + 0000 0000 00e3 4122 0000 0000 0080 0000 + 2214 1408 0800 0000 0000 0000 0000 0000 + 0000 0000 00e0 4444 0000 0000 00e0 4040 + 2a2a 1111 1100 0000 8080 0000 0000 0000 + 0000 0000 00ee 4428 0000 0000 0000 0000 + 1010 2844 ee00 0000 0000 0000 0000 0000 + 0000 0000 00e3 4122 0000 0000 0080 0000 + 2214 1408 0810 3020 0000 0000 0000 0000 + 0000 0000 00fc 8408 0000 0000 0000 0000 + 1020 4084 fc00 0000 0000 0000 0000 0000 + 0000 1020 2020 2020 0000 0000 0000 0000 + 4020 2020 2020 1000 0000 0000 0000 0000 + 0000 4040 4040 4040 0000 0000 0000 0000 + 4040 4040 4040 4000 0000 0000 0000 0000 + 0000 4020 2020 2020 0000 0000 0000 0000 + 1020 2020 2020 4000 0000 0000 0000 0000 + 0000 0032 4c00 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 1100 0404 0a0a 1111 0000 0000 0000 0000 + 203f 4040 f000 0000 8080 4040 e000 0000 + 0e11 110e 0a0a 1111 0000 0000 0000 0000 + 203f 4040 e000 0000 8080 4040 e000 0000 + 0000 3e43 8180 8080 0000 0000 0000 0000 + 8080 8142 3c08 0404 0000 0000 0000 0000 + 1000 fe42 4040 4878 0000 0000 0000 0000 + 4840 4042 fe00 0000 0000 0000 0000 0000 + 2600 e361 5151 4949 0000 8000 0000 0000 + 4545 4343 e100 0000 0000 0000 0000 0000 + 2400 3c42 8181 8181 0000 0000 0000 0000 + 8181 8142 3c00 0000 0000 0000 0000 0000 + 1200 e140 4040 4040 0000 c080 8080 8080 + 4040 4021 1e00 0000 8080 8000 0000 0000 + 0000 0810 0038 448c 0000 0000 0000 0000 + 3444 848c 7200 0000 0000 0000 0000 0000 + 0000 2010 0038 448c 0000 0000 0000 0000 + 3444 848c 7200 0000 0000 0000 0000 0000 + 0010 2844 0038 448c 0000 0000 0000 0000 + 3444 848c 7200 0000 0000 0000 0000 0000 + 0000 0028 0038 448c 0000 0000 0000 0000 + 3444 848c 7200 0000 0000 0000 0000 0000 + 0000 6498 0038 448c 0000 0000 0000 0000 + 3444 848c 7200 0000 0000 0000 0000 0000 + 3048 4830 0038 448c 0000 0000 0000 0000 + 3444 848c 7200 0000 0000 0000 0000 0000 + 0000 0000 0038 4480 0000 0000 0000 0000 + 8080 8044 3810 1020 0000 0000 0000 0000 + 0000 0408 0038 4482 0000 0000 0000 0000 + fe80 8244 3800 0000 0000 0000 0000 0000 + 0000 1008 0038 4482 0000 0000 0000 0000 + fe80 8244 3800 0000 0000 0000 0000 0000 + 0010 2844 0038 4482 0000 0000 0000 0000 + fe80 8244 3800 0000 0000 0000 0000 0000 + 0000 0044 0038 4482 0000 0000 0000 0000 + fe80 8244 3800 0000 0000 0000 0000 0000 + 0000 1020 0020 6020 0000 0000 0000 0000 + 2020 2020 7000 0000 0000 0000 0000 0000 + 0000 4020 0020 6020 0000 0000 0000 0000 + 2020 2020 7000 0000 0000 0000 0000 0000 + 0020 5088 0020 6020 0000 0000 0000 0000 + 2020 2020 7000 0000 0000 0000 0000 0000 + 0000 0050 0020 6020 0000 0000 0000 0000 + 2020 2020 7000 0000 0000 0000 0000 0000 + 0000 324c 005c e241 0000 0000 0000 0000 + 4141 4141 e300 0000 0000 0000 8000 0000 + 0000 0810 0038 4482 0000 0000 0000 0000 + 8282 8244 3800 0000 0000 0000 0000 0000 + 0000 1008 0038 4482 0000 0000 0000 0000 + 8282 8244 3800 0000 0000 0000 0000 0000 + 0010 2844 0038 4482 0000 0000 0000 0000 + 8282 8244 3800 0000 0000 0000 0000 0000 + 0000 0044 0038 4482 0000 0000 0000 0000 + 8282 8244 3800 0000 0000 0000 0000 0000 + 0000 324c 0038 4482 0000 0000 0000 0000 + 8282 8244 3800 0000 0000 0000 0000 0000 + 0000 0408 00c3 4141 0000 0000 0000 0000 + 4141 4123 1d00 0000 0000 0000 8000 0000 + 0000 1008 00c3 4141 0000 0000 0000 0000 + 4141 4123 1d00 0000 0000 0000 8000 0000 + 0008 1422 00c3 4141 0000 0000 0000 0000 + 4141 4123 1d00 0000 0000 0000 8000 0000 + 0000 1200 00c3 4141 0000 0000 0000 0000 + 4141 4123 1d00 0000 0000 0000 8000 0000 + 0000 40e0 4040 4000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 6090 9060 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 1038 5490 0000 0000 0000 0000 + 9090 9054 3810 0000 0000 0000 0000 0000 + 0000 001c 2220 2078 0000 0000 0000 0000 + 2020 2121 7e00 0000 0000 0000 0000 0000 + 0000 0070 88c0 a090 0000 0000 0000 0000 + 4828 1888 7000 0000 0000 0000 0000 0000 + 0000 0000 0000 3c7e 0000 0000 0000 0000 + 7e7e 7e3c 0000 0000 0000 0000 0000 0000 + 0000 003f 4a8a 8a4a 0000 0000 0000 0000 + 3e0a 0a0a 0a00 0000 0000 0000 0000 0000 + 0000 001c 2242 444c 0000 0000 0000 0000 + 4242 4242 cc00 0000 0000 0000 0000 0000 + 0000 0000 001e 215c 0000 0000 0000 0080 + 525c 5221 1e00 0000 8080 8000 0000 0000 + 0000 0000 001e 214c 0000 0000 0000 0080 + 5050 4c21 1e00 0000 8080 8000 0000 0000 + 0000 ef4a 4a4a 0000 0000 8080 8080 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 1020 4000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 5000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0303 0505 0909 0000 f808 0800 20e0 + 1f11 2121 7300 0000 2000 0008 f800 0000 + 0000 1e21 4142 4244 0000 8000 8080 8080 + 4848 5021 5e00 0000 8080 8000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 e341 2277 087f 0000 8000 0000 0000 + 0808 0808 1c00 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0070 8878 8888 0000 0000 0000 0000 + 7400 fc00 0000 0000 0000 0000 0000 0000 + 0000 0070 8888 8888 0000 0000 0000 0000 + 7000 f800 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 001c 2342 0000 0000 00e0 1008 + 1f22 4247 3800 0000 f800 0810 e000 0000 + 0000 0000 0034 488c 0000 0000 0000 0000 + 94a4 a448 b000 0000 0000 0000 0000 0000 + 0000 0800 0808 0810 0000 0000 0000 0000 + 2041 4122 1c00 0000 0000 0000 0000 0000 + 0000 2000 2020 2020 0000 0000 0000 0000 + 2020 2020 2000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0912 0000 0000 0000 0000 + 2448 2412 0900 0000 0000 0000 0000 0000 + 0000 0000 0000 4824 0000 0000 0000 0000 + 1209 1224 4800 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 2400 0000 0000 0000 8000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0400 0404 0a0a 1111 0000 0000 0000 0000 + 203f 4040 e000 0000 8080 4040 e000 0000 + 1300 0404 0a0a 1111 0000 0000 0000 0000 + 203f 4040 e000 0000 8080 4040 e000 0000 + 2600 1e21 4080 8080 0000 0000 8040 4040 + 8080 4021 1e00 0000 4040 8000 0000 0000 + 0000 1e21 4080 8080 0000 fe82 8080 88f8 + 8080 4021 1e00 0000 8880 8082 fe00 0000 + 0000 0000 001c 2241 0000 0000 0070 8804 + 4141 4122 1c00 0000 fc00 0488 7000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 7c00 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + ff00 0000 0000 0000 0000 0000 0000 0000 + 0000 0024 4848 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0024 2448 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0020 4040 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0020 2040 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0008 1422 0000 0000 0000 0000 + 4141 2214 0800 0000 0000 0000 0000 0000 + 0000 2200 00e3 4122 0000 0000 0080 0000 + 2214 1408 0810 3020 0000 0000 0000 0000 + 0007 0407 0404 0404 00f8 08f8 0808 0808 + 0404 3c7c 7830 0000 0808 78f8 f060 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 + 0000 0000 0000 0000 0000 0000 0000 0000 diff --git a/src/main.tal b/src/main.tal new file mode 100644 index 0000000..d433f3e --- /dev/null +++ b/src/main.tal @@ -0,0 +1,120 @@ +( Parade ) + +%+ { ADD } %- { SUB } +%< { LTH } %> { GTH } %= { EQU } %! { NEQ } +%++ { ADD2 } %-- { SUB2 } +%<< { LTH2 } %>> { GTH2 } %== { EQU2 } %!! { NEQ2 } + +%RTN { JMP2r } +%TOS { #00 SWP } +%BRK? { #01 JCN BRK } +%SWP? { #01 JCN SWP } + +%DEBUG { ;print-hex JSR2 #0a .Console/write DEO } +%DEBUG2 { SWP ;print-hex JSR2 ;print-hex JSR2 #0a .Console/write DEO } + +( devices ) + +|00 @System &vector $2 &pad $6 &r $2 &g $2 &b $2 +|10 @Console &vector $2 &read $1 &pad $5 &write $1 +|20 @Screen &vector $2 &width $2 &height $2 &pad $2 &x $2 &y $2 &addr $2 &pixel $1 &sprite $1 +|80 @Controller &vector $2 &button $1 &key $1 +|a0 @File &vector $2 &success $2 &offset $2 &pad $2 &name $2 &length $2 &load $2 &save $2 + +( variables ) + +|0000 + +( program ) + +|0100 + + ( vectors ) + ;on-button .Controller/vector DEO2 + + ( colors ) + #f0f7 .System/r DEO2 + #f03c .System/g DEO2 + #f039 .System/b DEO2 + + ( draw label ) + #0020 #0048 ;body #01 ;draw-uf2 JSR2 + +BRK + +@on-button ( -> ) + + .Controller/key DEI BRK? + + .Controller/key DEI DEBUG + +BRK + +@draw-uf2 ( x* y* text* color -- ) + + STH + SWP2 .Screen/y DEO2 + SWP2 DUP2 .Screen/x DEO2 SWP2 + &loop + LDAk + DUP #0a ! ,&no-linebreak JCN + ( move down ) STH OVR2 .Screen/x DEO2 STHr + ( incr y ) .Screen/y DEI2 #0010 ++ .Screen/y DEO2 + POP ,&continue JMP &no-linebreak + STHkr ,&sprite JSR + &continue + ( incr addr ) #0001 ++ + LDAk ,&loop JCN + POP2 POP2 POPr + RTN + + &sprite ( char color -- ) + STH + ( get addr ) STHk TOS #50 SFT2 ;newyork14-uf2 #0100 ++ ++ .Screen/addr DEO2 + ( get width ) STHkr TOS ;newyork14-uf2 ++ LDA TOS + SWPr + ( left-top ) STHkr .Screen/sprite DEO + .Screen/y DEI2 #0008 ++ .Screen/y DEO2 + .Screen/addr DEI2 #0010 ++ .Screen/addr DEO2 + ( left-bottom ) STHkr .Screen/sprite DEO + .Screen/x DEI2 #0008 ++ .Screen/x DEO2 + .Screen/y DEI2 #0008 -- .Screen/y DEO2 + DUP #0a < ,&thin JCN + .Screen/addr DEI2 #0008 -- .Screen/addr DEO2 + ( right-top ) STHkr .Screen/sprite DEO + .Screen/addr DEI2 #0010 ++ .Screen/addr DEO2 + .Screen/y DEI2 #0008 ++ .Screen/y DEO2 + ( right-bottom ) STHkr .Screen/sprite DEO + .Screen/y DEI2 #0008 -- .Screen/y DEO2 &thin + SWPr + ( use width ) .Screen/x DEI2 ++ #0008 -- .Screen/x DEO2 + POPr POPr + RTN + +RTN + +@print-hex ( value -- ) + + STHk #04 SFT ,&parse JSR .Console/write DEO + STHr #0f AND ,&parse JSR .Console/write DEO + RTN + &parse ( value -- char ) + DUP #09 GTH ,&above JCN #30 ADD RTN &above #09 SUB #60 ADD RTN + +RTN + +@body + 4927 6c6c 206d 616b 6520 6120 736f 756e + 6420 7468 6174 2773 2073 6f20 616c 6f6e + 6520 0a74 6861 7420 6e6f 206f 6e65 2063 + 616e 206d 6973 7320 6974 2c20 7468 6174 + 2077 686f 6576 6572 200a 6865 6172 7320 + 6974 2077 696c 6c20 7765 6570 2069 6e20 + 7468 6569 7220 736f 756c 732c 200a 616e + 6420 6865 6172 7468 7320 7769 6c6c 2073 + 6565 6d20 7761 726d 6572 2c20 0a61 6e64 + 2062 6569 6e67 2069 6e73 6964 6520 7769 + 6c6c 2073 6565 6d20 6265 7474 6572 200a + 746f 2061 6c6c 2077 686f 2068 6561 7220 + 6974 2069 6e20 7468 6520 6469 7374 616e + 7420 746f 776e 732e 20 $1