diff options
author | Andreas Baumann <mail@andreasbaumann.cc> | 2017-05-01 21:48:43 +0200 |
---|---|---|
committer | Andreas Baumann <mail@andreasbaumann.cc> | 2017-05-01 21:48:43 +0200 |
commit | 8f1806daf788f7ce6aed7f3df173d1142bb5eab2 (patch) | |
tree | bdbfdb020ec7bc97acc5d99488f9d36515eef02d /src | |
parent | a5530f90f06f60794851f24b57cd2ddb05c9a4af (diff) | |
download | abaos-8f1806daf788f7ce6aed7f3df173d1142bb5eab2.tar.gz abaos-8f1806daf788f7ce6aed7f3df173d1142bb5eab2.tar.bz2 |
implemented memmove and vga scrolling
Diffstat (limited to 'src')
-rw-r--r-- | src/kernel.c | 5 | ||||
-rw-r--r-- | src/string.c | 22 | ||||
-rw-r--r-- | src/string.h | 1 | ||||
-rw-r--r-- | src/vga.c | 21 |
4 files changed, 45 insertions, 4 deletions
diff --git a/src/kernel.c b/src/kernel.c index 60d0dd3..ce6bb1a 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -43,4 +43,9 @@ void entry( void ) vga_put_string( &vga, (const char *)msg ); vga_put_newline( &vga ); } + for( int j = 0; j < 50; j++ ) { + vga_put_char( &vga, '-' ); + } + vga_put_char( &vga, '>' ); + vga_put_string( &vga, (const char *)msg ); } diff --git a/src/string.c b/src/string.c index 07042ce..6aa46ef 100644 --- a/src/string.c +++ b/src/string.c @@ -9,6 +9,28 @@ void *memset( void *s, int c, size_t n ) return s; } +void *memmove( void *d, const void *s, size_t n ) +{ + const char *ss = (const char *)s; + char *dd = (char *)d; + + if( dd == ss ) return d; + + if( dd <= ss ) { + while( n-- ) { + *dd++ = *ss++; + } + } else { + dd += n; + ss += n; + while( n-- ) { + *--dd = *--ss; + } + } + + return d; +} + size_t strlen( const char *s ) { size_t len; diff --git a/src/string.h b/src/string.h index b82d1aa..5efd35a 100644 --- a/src/string.h +++ b/src/string.h @@ -4,6 +4,7 @@ #include "sys/types.h" void *memset( void *s, int c, size_t n ); +void *memmove( void *d, const void *s, size_t n ); size_t strlen( const char *s ); #endif /* STRING_H */ @@ -7,6 +7,7 @@ static bool params_ok( vga_t *vga, const int x, const int y ); static int calculate_offset( vga_t *vga ); static uint8_t calculate_color_cell( vga_t *vga ); +static void scroll_screen( vga_t *vga ); void vga_init( vga_t *vga ) { @@ -59,6 +60,20 @@ static int calculate_offset( vga_t *vga ) return offset; } +static void scroll_screen( vga_t *vga ) +{ + volatile uint8_t *VIDEO_MEMORY = (uint8_t *)0xb8000; + + memmove( (void *)VIDEO_MEMORY, (const void *)VIDEO_MEMORY + 2 * vga->res_x, 2 * ( vga->res_y - 1 ) * vga->res_x ); + + for( int i = 2 * ( vga->res_x * ( vga->res_y - 1 ) ); i < 2 * ( vga->res_x * vga->res_y ); i += 2 ) { + *(VIDEO_MEMORY+i) = ' '; + *(VIDEO_MEMORY+i+1) = calculate_color_cell( vga ); + } + + vga->cursor_y = vga->res_y - 1; +} + static uint8_t calculate_color_cell( vga_t *vga ) { uint8_t cell; @@ -101,8 +116,7 @@ void vga_put_char( vga_t *vga, const char c ) vga->cursor_x = 0; vga->cursor_y++; if( vga->cursor_y >= vga->res_y ) { - // TODO: implement scrolling - vga->cursor_y = 0; + scroll_screen( vga ); } } } @@ -119,8 +133,7 @@ void vga_put_newline( vga_t *vga ) vga->cursor_x = 0; vga->cursor_y++; if( vga->cursor_y >= vga->res_y ) { - // TODO: implement scrolling - vga->cursor_y = 0; + scroll_screen( vga ); } } |