From b66e67e3a5f2680ee0e44228fce0fcaeff87206b Mon Sep 17 00:00:00 2001 From: Uros Majstorovic Date: Thu, 19 Dec 2019 04:48:56 +0100 Subject: eve textbox added; eve cmd result function added --- code/fe310/eos/eve_text.c | 100 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 code/fe310/eos/eve_text.c (limited to 'code/fe310/eos/eve_text.c') diff --git a/code/fe310/eos/eve_text.c b/code/fe310/eos/eve_text.c new file mode 100644 index 0000000..73fcb65 --- /dev/null +++ b/code/fe310/eos/eve_text.c @@ -0,0 +1,100 @@ +#include "eve.h" +#include "eve_text.h" + +static int _line_diff(EVETextBox *box, int line) { + if (line > box->line_idx) { + return line - box->line_idx; + } else { + return box->buf_line_h - box->line_idx + line; + } +} + +static void _line_scroll(EVETextBox *box) { + box->line_idx = (box->line_idx + 1) % box->buf_line_h; + eos_eve_cmd(CMD_MEMSET, "www", EVE_RAM_G + box->buf_addr + box->buf_idx, 0x0, box->w * 2); + eos_eve_cmd_exec(1); + eos_eve_dl_start(box->dl_offset); + eos_eve_text_update(box); + eos_eve_dl_swap(); +} + +void eos_eve_text_init(EVETextBox *box, uint16_t buf_addr, int buf_line_h, int w, int h, int x, int y, uint8_t bitmap_handle) { + box->buf_addr = buf_addr; + box->buf_line_h = buf_line_h; + box->w = w; + box->h = h; + box->x = x; + box->y = y; + box->buf_idx = 0; + box->line_idx = 0; + box->dl_offset = 0; + box->bitmap_handle = bitmap_handle; + + eos_eve_cmd(CMD_MEMSET, "www", EVE_RAM_G + buf_addr, 0x0, w * 2 * buf_line_h); + eos_eve_cmd_exec(1); +} + +void eos_eve_text_update(EVETextBox *box) { + int text_h1; + int text_h2; + + eos_eve_dl_write(BITMAP_HANDLE(box->bitmap_handle)); + eos_eve_dl_write(BITMAP_SOURCE(box->buf_addr + box->line_idx * box->w * 2)); + if (box->line_idx + box->h > box->buf_line_h) { + text_h1 = box->buf_line_h - box->line_idx; + text_h2 = box->h - text_h1; + } else { + text_h1 = box->h; + text_h2 = 0; + } + eos_eve_dl_write(BITMAP_LAYOUT(EVE_TEXTVGA, box->w * 2, text_h1)); + eos_eve_dl_write(BITMAP_SIZE(EVE_NEAREST, EVE_BORDER, EVE_BORDER, box->w * 8, text_h1 * 16)); + + if (text_h2) { + eos_eve_dl_write(BITMAP_HANDLE(box->bitmap_handle+1)); + eos_eve_dl_write(BITMAP_SOURCE(box->buf_addr)); + eos_eve_dl_write(BITMAP_LAYOUT(EVE_TEXTVGA, box->w * 2, text_h2)); + eos_eve_dl_write(BITMAP_SIZE(EVE_NEAREST, EVE_BORDER, EVE_BORDER, box->w * 8, text_h2 * 16)); + } else { + eos_eve_dl_write(NOP()); + eos_eve_dl_write(NOP()); + eos_eve_dl_write(NOP()); + eos_eve_dl_write(NOP()); + } + + eos_eve_dl_write(BEGIN(EVE_BITMAPS)); + eos_eve_dl_write(VERTEX2II(box->x, box->y, 0, 0)); + if (text_h2) { + eos_eve_dl_write(VERTEX2II(box->x, box->y + text_h1 * 16, 1, 0)); + } else { + eos_eve_dl_write(NOP()); + } + eos_eve_dl_write(END()); +} + +void eos_eve_text_draw(EVETextBox *box) { + box->dl_offset = eos_eve_dl_offset(); + eos_eve_text_update(box); +} + +void eos_eve_text_putc(EVETextBox *box, int c) { + int line_c, line_n; + + line_c = box->buf_idx / 2 / box->w; + + eos_eve_write16(EVE_RAM_G + box->buf_addr + box->buf_idx, 0x0A00 | (c & 0xff)); + box->buf_idx = (box->buf_idx + 2) % (box->buf_line_h * box->w * 2); + + line_n = box->buf_idx / 2 / box->w; + if ((line_c != line_n) && (_line_diff(box, line_n) == box->h)) { + _line_scroll(box); + } +} + +void eos_eve_text_newline(EVETextBox *box) { + int line = (box->buf_idx / 2 / box->w + 1) % box->buf_line_h; + box->buf_idx = line * box->w * 2; + if (_line_diff(box, line) == box->h) { + _line_scroll(box); + } +} \ No newline at end of file -- cgit v1.2.3