#ifndef __LCD
#define __LCD

#include <stdint.h>

#define DISPLAY_RS  ((uint16_t) (0x1U << 7))
#define DISPLAY_RW  ((uint16_t) (0x1U << 10))
#define DISPLAY_ENA ((uint16_t) (0x1U << 11))

#define DISPLAY_FRAMES_AVAILABLE 14

#define DISPLAY_POLL_UNTIL_READY do { while (display_read_status() & 0x80) {} } while (0)

#define DISPLAY_SET_INCREMENT do { display_write_instruction_byte(0x06); } while (0)
#define DISPLAY_SET_DECREMENT do { display_write_instruction_byte(0x04); } while (0)

#define DISPLAY_SET_CURSOR(line, position) do { display_write_instruction_byte(0x80 | (line << 6) | position); } while (0)

#define DISPLAY_CLEAR do { display_write_instruction_byte(0x01); } while (0)

struct Display_emu_state {
	size_t cursor_offset:5;
	size_t next:1;
};

void display_init(void);
void display_write_instruction_byte(uint8_t code);
void display_write_data_byte(uint8_t code);
void display_write_data_seq(char *codes);
void display_to_framebuffer(void);
void display_to_direct(void);
void display_load(uint32_t frame_no);

#endif
