collapseos/emul/z80/t6a04.h

42 lines
1.2 KiB
C

#include <stdint.h>
#include <stdbool.h>
#define T6A04_ROWSIZE (120/8)
#define T6A04_RAMSIZE 64*T6A04_ROWSIZE
typedef enum {
T6A04_XDEC = 0,
T6A04_XINC = 1,
T6A04_YDEC = 2,
T6A04_YINC = 3
} T6A04_INCMODE;
typedef struct {
// RAM is organized in 64 rows of 120 pixels (there is some offscreen
// memory). Each byte holds 8 pixels. unset means no pixel, set means pixel.
uint8_t ram[T6A04_RAMSIZE];
bool enabled;
// Whether the 8bit mode is enabled.
bool has8bitmode;
// Current "increment mode"
T6A04_INCMODE incmode;
// current Z offset
uint8_t offset;
// Currently active row
uint8_t currow;
// Currently active col (actual meaning depends on whether we're in 8bit
// mode)
uint8_t curcol;
// True when a movement command was just made or if the LCD was just
// initialized. When this is true, a read operation on the data port will be
// invalid (returns zero and doesn't autoinc).
bool just_moved;
} T6A04;
void t6a04_init(T6A04 *lcd);
uint8_t t6a04_cmd_rd(T6A04 *lcd);
void t6a04_cmd_wr(T6A04 *lcd, uint8_t val);
uint8_t t6a04_data_rd(T6A04 *lcd);
void t6a04_data_wr(T6A04 *lcd, uint8_t val);
bool t6a04_pixel(T6A04 *lcd, uint8_t y, uint8_t x);