Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
triazo
/
kernel
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
3
Merge Requests
0
Wiki
Settings
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
2f5dabe8
authored
Sep 13, 2015
by
triazo
Browse files
Options
_('Browse Files')
Download
Email Patches
Plain Diff
Move terminal functions to library
parent
20eb3a51
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
111 additions
and
86 deletions
src/kern.c
src/term.c
src/term.h
src/kern.c
View file @
2f5dabe8
...
@@ -2,7 +2,6 @@
...
@@ -2,7 +2,6 @@
#include <stdbool.h>
/* C doesn't have booleans by default. */
#include <stdbool.h>
/* C doesn't have booleans by default. */
#endif
#endif
#include <stddef.h>
#include <stddef.h>
#include <stdint.h>
/* Check if the compiler thinks we are targeting the wrong operating system. */
/* Check if the compiler thinks we are targeting the wrong operating system. */
#if defined(__linux__)
#if defined(__linux__)
...
@@ -15,102 +14,20 @@
...
@@ -15,102 +14,20 @@
#endif
#endif
#include "serial.h"
#include "serial.h"
#include "term.h"
/* Hardware text mode color constants. */
enum
vga_color
{
COLOR_BLACK
=
0
,
COLOR_BLUE
=
1
,
COLOR_GREEN
=
2
,
COLOR_CYAN
=
3
,
COLOR_RED
=
4
,
COLOR_MAGENTA
=
5
,
COLOR_BROWN
=
6
,
COLOR_LIGHT_GREY
=
7
,
COLOR_DARK_GREY
=
8
,
COLOR_LIGHT_BLUE
=
9
,
COLOR_LIGHT_GREEN
=
10
,
COLOR_LIGHT_CYAN
=
11
,
COLOR_LIGHT_RED
=
12
,
COLOR_LIGHT_MAGENTA
=
13
,
COLOR_LIGHT_BROWN
=
14
,
COLOR_WHITE
=
15
,
};
uint8_t
make_color
(
enum
vga_color
fg
,
enum
vga_color
bg
)
{
return
fg
|
bg
<<
4
;
}
uint16_t
make_vgaentry
(
char
c
,
uint8_t
color
)
{
uint16_t
c16
=
c
;
uint16_t
color16
=
color
;
return
c16
|
color16
<<
8
;
}
size_t
strlen
(
const
char
*
str
)
{
size_t
ret
=
0
;
while
(
str
[
ret
]
!=
0
)
ret
++
;
return
ret
;
}
static
const
size_t
VGA_WIDTH
=
80
;
static
const
size_t
VGA_HEIGHT
=
25
;
size_t
terminal_row
;
size_t
terminal_column
;
uint8_t
terminal_color
;
uint16_t
*
terminal_buffer
;
void
terminal_initialize
()
{
terminal_row
=
0
;
terminal_column
=
0
;
terminal_color
=
make_color
(
COLOR_LIGHT_GREY
,
COLOR_BLACK
);
terminal_buffer
=
(
uint16_t
*
)
0xB8000
;
for
(
size_t
y
=
0
;
y
<
VGA_HEIGHT
;
y
++
)
{
for
(
size_t
x
=
0
;
x
<
VGA_WIDTH
;
x
++
)
{
const
size_t
index
=
y
*
VGA_WIDTH
+
x
;
terminal_buffer
[
index
]
=
make_vgaentry
(
' '
,
terminal_color
);
}
}
}
void
terminal_setcolor
(
uint8_t
color
)
{
terminal_color
=
color
;
}
void
terminal_putentryat
(
char
c
,
uint8_t
color
,
size_t
x
,
size_t
y
)
{
const
size_t
index
=
y
*
VGA_WIDTH
+
x
;
terminal_buffer
[
index
]
=
make_vgaentry
(
c
,
color
);
}
void
terminal_putchar
(
char
c
)
{
terminal_putentryat
(
c
,
terminal_color
,
terminal_column
,
terminal_row
);
if
(
++
terminal_column
==
VGA_WIDTH
)
{
terminal_column
=
0
;
if
(
++
terminal_row
==
VGA_HEIGHT
)
{
terminal_row
=
0
;
}
}
}
void
terminal_writestring
(
const
char
*
data
)
{
size_t
datalen
=
strlen
(
data
);
for
(
size_t
i
=
0
;
i
<
datalen
;
i
++
)
terminal_putchar
(
data
[
i
]);
}
#if defined(__cplusplus)
#if defined(__cplusplus)
extern
"C"
/* Use C linkage for kernel_main. */
extern
"C"
/* Use C linkage for kernel_main. */
#endif
#endif
void
kernel_main
()
{
void
kernel_main
()
{
/* Initialize terminal
interface
*/
/* Initialize terminal
and serial interfaces
*/
terminal_initialize
();
terminal_initialize
();
serial_init
();
/* Since there is no support for newlines in terminal_putchar
/* Since there is no support for newlines in terminal_putchar
* yet, '\n' will produce some VGA specific character instead.
* yet, '\n' will produce some VGA specific character instead.
* This is normal.
* This is normal.
*/
*/
serial_init
();
serial_writestring
(
"First Serial Test!
\n
"
);
serial_writestring
(
"First Serial Test!
\n
"
);
terminal_writestring
(
"Hello, kernel World!
\n
"
);
terminal_writestring
(
"Hello, kernel World!
\n
"
);
serial_writestring
(
"Second Serial Test
\n
"
);
serial_writestring
(
"Second Serial Test
\n
"
);
...
...
src/term.c
0 → 100644
View file @
2f5dabe8
/*
term.c contains functions for working with/writing to the terminal
It was taken from the simple kernel from the osdev wiki
*/
#include "term.h"
uint8_t
make_color
(
enum
vga_color
fg
,
enum
vga_color
bg
)
{
return
fg
|
bg
<<
4
;
}
uint16_t
make_vgaentry
(
char
c
,
uint8_t
color
)
{
uint16_t
c16
=
c
;
uint16_t
color16
=
color
;
return
c16
|
color16
<<
8
;
}
size_t
strlen
(
const
char
*
str
)
{
size_t
ret
=
0
;
while
(
str
[
ret
]
!=
0
)
ret
++
;
return
ret
;
}
static
const
size_t
VGA_WIDTH
=
80
;
static
const
size_t
VGA_HEIGHT
=
25
;
size_t
terminal_row
;
size_t
terminal_column
;
uint8_t
terminal_color
;
uint16_t
*
terminal_buffer
;
void
terminal_initialize
()
{
terminal_row
=
0
;
terminal_column
=
0
;
terminal_color
=
make_color
(
COLOR_LIGHT_GREY
,
COLOR_BLACK
);
terminal_buffer
=
(
uint16_t
*
)
0xB8000
;
for
(
size_t
y
=
0
;
y
<
VGA_HEIGHT
;
y
++
)
{
for
(
size_t
x
=
0
;
x
<
VGA_WIDTH
;
x
++
)
{
const
size_t
index
=
y
*
VGA_WIDTH
+
x
;
terminal_buffer
[
index
]
=
make_vgaentry
(
' '
,
terminal_color
);
}
}
}
void
terminal_setcolor
(
uint8_t
color
)
{
terminal_color
=
color
;
}
void
terminal_putentryat
(
char
c
,
uint8_t
color
,
size_t
x
,
size_t
y
)
{
const
size_t
index
=
y
*
VGA_WIDTH
+
x
;
terminal_buffer
[
index
]
=
make_vgaentry
(
c
,
color
);
}
void
terminal_putchar
(
char
c
)
{
terminal_putentryat
(
c
,
terminal_color
,
terminal_column
,
terminal_row
);
if
(
++
terminal_column
==
VGA_WIDTH
)
{
terminal_column
=
0
;
if
(
++
terminal_row
==
VGA_HEIGHT
)
{
terminal_row
=
0
;
}
}
}
void
terminal_writestring
(
const
char
*
data
)
{
size_t
datalen
=
strlen
(
data
);
for
(
size_t
i
=
0
;
i
<
datalen
;
i
++
)
terminal_putchar
(
data
[
i
]);
}
src/term.h
0 → 100644
View file @
2f5dabe8
/*
term.h contains headers and definitions for terminal handling
*/
#pragma once
#include <stdint.h>
#include <stddef.h>
/* Hardware text mode color constants. */
enum
vga_color
{
COLOR_BLACK
=
0
,
COLOR_BLUE
=
1
,
COLOR_GREEN
=
2
,
COLOR_CYAN
=
3
,
COLOR_RED
=
4
,
COLOR_MAGENTA
=
5
,
COLOR_BROWN
=
6
,
COLOR_LIGHT_GREY
=
7
,
COLOR_DARK_GREY
=
8
,
COLOR_LIGHT_BLUE
=
9
,
COLOR_LIGHT_GREEN
=
10
,
COLOR_LIGHT_CYAN
=
11
,
COLOR_LIGHT_RED
=
12
,
COLOR_LIGHT_MAGENTA
=
13
,
COLOR_LIGHT_BROWN
=
14
,
COLOR_WHITE
=
15
,
};
uint8_t
make_color
(
enum
vga_color
fg
,
enum
vga_color
bg
);
uint16_t
make_vgaentry
(
char
c
,
uint8_t
color
);
size_t
strlen
(
const
char
*
str
);
void
terminal_initialize
();
void
terminal_setcolor
(
uint8_t
color
);
void
terminal_putentryat
(
char
c
,
uint8_t
color
,
size_t
x
,
size_t
y
);
void
terminal_putchar
(
char
c
);
void
terminal_writestring
(
const
char
*
data
);
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment