aboutsummaryrefslogtreecommitdiff
path: root/src/pool.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/pool.h')
-rw-r--r--src/pool.h76
1 files changed, 76 insertions, 0 deletions
diff --git a/src/pool.h b/src/pool.h
new file mode 100644
index 0000000..ba7e60f
--- /dev/null
+++ b/src/pool.h
@@ -0,0 +1,76 @@
+#include "addrs.h"
+
+void init_pools(void);
+
+/* if each pool is 16K, that's 512K, not bad. however, overhead. maybe
+ limit this to something like 20 (128K extended = 16, plus the big
+ pool in main bank, plus the potential smaller pools at MEMLO and
+ $d800. */
+#define MAX_POOLS 32
+
+/* with 512K, we get one screen per pool.
+ with 256K, up to 2 screens per pool.
+ with 128K, up to 4.
+ with 64K, we only get 1 large pool.
+ with 48K, we only get 1 pool.
+*/
+// #define MAX_SCREENS 32
+// for now anyway:
+#define MAX_SCREENS 10
+
+/* if a pool is not in use, its screen_count will be this. */
+#define POOL_UNUSED 0xff
+
+/* length of a line in bytes. this will eventually be 80 for
+ xep-80 support. */
+#define LINE_LEN 40
+
+/* 42 bytes per line */
+typedef struct line_s {
+ struct line_s *next;
+ char data[LINE_LEN];
+} line_t;
+
+/* the end marker line is a line_t, but it lives outside of any pool and
+ has a 'next' pointer that points to itself. */
+
+/* sizeof(screen_t) is 33 bytes... */
+typedef struct {
+ char title[25];
+ char status;
+ char pool; /* this could be a pool_t * instead */
+ unsigned int line_count; /* can be above 255 */
+ line_t *line_list; /* head of a linked list */
+ unsigned int scrollback_pos; /* also can be >255 */
+} screen_t;
+
+extern screen_t screens[MAX_SCREENS]; /* array is 1023 bytes */
+
+typedef struct {
+ // I don't think we even need these:
+ // u16 start; /* 0 = not in use */
+ // u16 end;
+ char screen_count; /* maybe set to $ff for "not in use" */
+ /* int line_count; // maybe better to use line count instead of
+ screen count to decide which pool to create
+ new screens in? */
+ char bank; /* probably this is just the PORTB value */
+ line_t *free_list; /* when this is null, the pool has no free lines */
+} pool_t;
+
+/* this array is sizeof(pool) * 9, so 288 bytes */
+/* the code that builds this array (detects extended ram too),
+ will live in the config segment. */
+extern pool_t pools[MAX_POOLS];
+
+/* this function is responsible for counting the lines and arranging
+ them in a linked list. it zeroes the 40 character bytes in each
+ line and sets the other 2 as a pointer to the next. */
+void add_to_pool(char p, u16 start, u16 end);
+
+/* returns the index into pools[] of the pool with the smallest
+ screen_count. */
+char get_smallest_pool(void);
+
+/* add a line to a screen */
+void add_line(char s);