/*
 * _bgi_mode_set (drv256) — вход в графический режим 320×256×256.
 *
 * Загружает EGA-совместимые цвета 0..15 в палитру 0, чтобы setcolor(RED)
 * и прочие BGI-константы давали ожидаемый цвет.  Заполняет границы
 * экрана в состоянии BGI.  Возвращает предыдущий видеорежим.
 */

#include "../_bgi.h"
#include <gfx.h>

/* 16 EGA-цветов, формат записи палитры (B, G, R, pad). */
static const uint8_t _bgi_ega_pal[16 * 4] = {
      0,   0,   0, 0,   /* 0  BLACK        */
    168,   0,   0, 0,   /* 1  BLUE         */
      0, 168,   0, 0,   /* 2  GREEN        */
    168, 168,   0, 0,   /* 3  CYAN         */
      0,   0, 168, 0,   /* 4  RED          */
    168,   0, 168, 0,   /* 5  MAGENTA      */
      0,  84, 168, 0,   /* 6  BROWN        */
    168, 168, 168, 0,   /* 7  LIGHTGRAY    */
     84,  84,  84, 0,   /* 8  DARKGRAY     */
    255,  84,  84, 0,   /* 9  LIGHTBLUE    */
     84, 255,  84, 0,   /* 10 LIGHTGREEN   */
    255, 255,  84, 0,   /* 11 LIGHTCYAN    */
     84,  84, 255, 0,   /* 12 LIGHTRED     */
    255,  84, 255, 0,   /* 13 LIGHTMAGENTA */
     84, 255, 255, 0,   /* 14 YELLOW       */
    255, 255, 255, 0,   /* 15 WHITE        */
};

uint8_t _bgi_mode_set(void)
{
    uint8_t prev = _videomode_raw_get();
    _videomode_raw_set(GFX_MODE_320x256x256);
    _gfx_bank = 0x50;
    gfx_set_visible_page(0);
    gfx_set_draw_page(0);
    gfx_pal_load(0, 0, 16, _bgi_ega_pal);
    _bgi_maxx     = GFX_WIDTH - 1;
    _bgi_maxy     = GFX_HEIGHT - 1;
    _bgi_maxcolor = 255;
    return prev;
}
