diff options
Diffstat (limited to 'src/pool.h')
| -rw-r--r-- | src/pool.h | 76 |
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); |
