summaryrefslogblamecommitdiffstats
path: root/yotlibc/char_vhl.c
blob: 2cab8db3c17a951aa5d94a8a805f6fe684edbd33 (plain) (tree)




















































































































































                                                                                   
/* char_vhl = char VGA high level function */

#include "yotlibc.h"

extern int char_vga_cursor_x;
extern int char_vga_cursor_y;

void chv_init_cursor(void){
    int curpos = char_vga_get_cursor();
    char_vga_cursor_x = CHAR_VGA_GETX(curpos);
    char_vga_cursor_y = CHAR_VGA_GETY(curpos);
}

void chv_get_cursor(xycoord)
    XYCOORD* xycoord;
{
    chv_init_cursor();
    xycoord->x = char_vga_cursor_x;
    xycoord->y = char_vga_cursor_y;
}

void chv_set_cursor(xycoord)
    XYCOORD* xycoord;
{
    char_vga_cursor_x = xycoord->x;
    char_vga_cursor_y = xycoord->y;
    char_vga_set_cursor(
        CHAR_VGA_POSITION(char_vga_cursor_x, char_vga_cursor_y));
}

void chv_set_cursor_direct(x, y)
    int x;
    int y;
{
    char_vga_cursor_x = x;
    char_vga_cursor_y = y;
    char_vga_set_cursor(
        CHAR_VGA_POSITION(char_vga_cursor_x, char_vga_cursor_y));
}

void chv_sync_cursor(void){
    char_vga_set_cursor(
        CHAR_VGA_POSITION(char_vga_cursor_x, char_vga_cursor_y));
}

void chv_reset_cursor(void){
    chv_set_cursor_direct(0, 0);
}

void chv_movenext_cursor(void){
    if(++char_vga_cursor_x >= CHAR_VGA_SCREENX){
        char_vga_cursor_x -= CHAR_VGA_SCREENX;
        char_vga_cursor_y++;
    }
    if(char_vga_cursor_y >= CHAR_VGA_SCREENY){
        char_vga_cursor_y = CHAR_VGA_SCREENY;
        chv_scroll(1);
    }
}

void chv_moveprev_cursor(void){
    if(--char_vga_cursor_x < 0){
        char_vga_cursor_x += CHAR_VGA_SCREENX;
        char_vga_cursor_y--;
    }
    if(char_vga_cursor_y < 0){
        char_vga_cursor_y = 0;
    }
}

void chv_move_cursor(count)
    int count;
{
    int n;
    n = CHAR_VGA_POSITION(char_vga_cursor_x, char_vga_cursor_y) + count;
    char_vga_cursor_x = CHAR_VGA_GETX(n);
    char_vga_cursor_y = CHAR_VGA_GETY(n);
    if(char_vga_cursor_x > CHAR_VGA_SCREENX){
        char_vga_cursor_x = CHAR_VGA_SCREENX - 1;
    }else if(char_vga_cursor_x < 0){
        char_vga_cursor_x = 0;
    }
    if(char_vga_cursor_y > CHAR_VGA_SCREENY){
        char_vga_cursor_y = CHAR_VGA_SCREENY - 1;
    }else if(char_vga_cursor_y < 0){
        char_vga_cursor_y = 0;
    }
}

void chv_putchar(c)
    int c;
{
    chv_memwrite(
        CHAR_VGA_POSITION(char_vga_cursor_x, char_vga_cursor_y) * 2, c);
    chv_movenext_cursor();
}

void chv_putchar_color(c, color)
    int c;
    int color;
{
    int pos = CHAR_VGA_POSITION(char_vga_cursor_x, char_vga_cursor_y) * 2;
    chv_memwrite(pos++, c);
    chv_memwrite(pos, color);
    chv_movenext_cursor();
}

void chv_backspace(void){
    chv_moveprev_cursor();
    chv_memwrite(
        CHAR_VGA_POSITION(char_vga_cursor_x, char_vga_cursor_y) * 2, ' ');
}

void chv_clear(void){
    int i;
    XYCOORD xycoord;
    chv_memwrite(0, 'A');
    for(i=0; i< CHAR_VGA_MMIOSIZE; ){
        chv_memwrite(i++, ' ');
        chv_memwrite(i++, CHV_COLORPAIR(
            CHV_COLOR_LIGHT_GRAY, CHV_COLOR_BLACK));
    }
}

void chv_scroll(line)
    int line;
{
    int c, i;
    int src, dest;
    if(line > 0){
        src = line * CHAR_VGA_SCREENX * 2;
        for(dest = 0; dest < CHAR_VGA_MMIOSIZE && src < CHAR_VGA_MMIOSIZE; 
            dest++, src++){
            c = chv_memread(src);
            chv_memwrite(dest, c);
        }
        for(; dest < CHAR_VGA_MMIOSIZE; ){
            chv_memwrite(dest++, ' ');
            chv_memwrite(dest++, CHV_COLORPAIR(
                CHV_COLOR_LIGHT_GRAY, CHV_COLOR_BLACK));
        }
        char_vga_cursor_y -= line; 
        if(char_vga_cursor_y < 0){
            char_vga_cursor_y = 0;
            chv_sync_cursor();
        }
    }
}