summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndreas Baumann <mail@andreasbaumann.cc>2017-05-01 21:48:43 +0200
committerAndreas Baumann <mail@andreasbaumann.cc>2017-05-01 21:48:43 +0200
commit8f1806daf788f7ce6aed7f3df173d1142bb5eab2 (patch)
treebdbfdb020ec7bc97acc5d99488f9d36515eef02d /src
parenta5530f90f06f60794851f24b57cd2ddb05c9a4af (diff)
downloadabaos-8f1806daf788f7ce6aed7f3df173d1142bb5eab2.tar.gz
abaos-8f1806daf788f7ce6aed7f3df173d1142bb5eab2.tar.bz2
implemented memmove and vga scrolling
Diffstat (limited to 'src')
-rw-r--r--src/kernel.c5
-rw-r--r--src/string.c22
-rw-r--r--src/string.h1
-rw-r--r--src/vga.c21
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 */
diff --git a/src/vga.c b/src/vga.c
index 524b6d7..a1230e4 100644
--- a/src/vga.c
+++ b/src/vga.c
@@ -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 );
}
}