Renamed ktypes.h to types.h, added missing directories in make prepare, implemented text scrolling and added util module with a few test functions
This commit is contained in:
parent
5c9d280a92
commit
18f8b5c23f
|
@ -1,5 +1,6 @@
|
||||||
{
|
{
|
||||||
"files.associations": {
|
"files.associations": {
|
||||||
"ktypes.h": "c"
|
"ktypes.h": "c",
|
||||||
|
"ports.h": "c"
|
||||||
}
|
}
|
||||||
}
|
}
|
2
Makefile
2
Makefile
|
@ -32,7 +32,7 @@ BUILD_PATHS += $(subst src/,$(OBJDIR),$(dir $(DRIVERS_OBJS)))
|
||||||
|
|
||||||
|
|
||||||
prepare:
|
prepare:
|
||||||
mkdir -p $(BUILD_PATHS)
|
mkdir -p $(BUILD_PATHS) build obj dist
|
||||||
|
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
|
|
|
@ -18,7 +18,7 @@ limitations under the License.
|
||||||
#define TSOS_DRV_PORTS_H
|
#define TSOS_DRV_PORTS_H
|
||||||
|
|
||||||
|
|
||||||
#include "kernel/ktypes.h"
|
#include "kernel/types.h"
|
||||||
|
|
||||||
|
|
||||||
byte readByte(u16 port);
|
byte readByte(u16 port);
|
||||||
|
|
|
@ -18,7 +18,7 @@ limitations under the License.
|
||||||
#ifndef TSOS_DRV_VGA_SCREEN
|
#ifndef TSOS_DRV_VGA_SCREEN
|
||||||
#define TSOS_DRV_VGA_SCREEN
|
#define TSOS_DRV_VGA_SCREEN
|
||||||
|
|
||||||
#include "kernel/ktypes.h"
|
#include "kernel/types.h"
|
||||||
#include "kernel/drivers/ports/ports.h"
|
#include "kernel/drivers/ports/ports.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -19,12 +19,14 @@ limitations under the License.
|
||||||
#ifndef TSOS_KTYPES
|
#ifndef TSOS_KTYPES
|
||||||
#define TSOS_KTYPES
|
#define TSOS_KTYPES
|
||||||
|
|
||||||
|
#define true 1
|
||||||
|
#define false 0
|
||||||
|
|
||||||
typedef unsigned char byte;
|
typedef unsigned char byte;
|
||||||
typedef unsigned short int u16;
|
typedef unsigned short int u16;
|
||||||
typedef short int i16;
|
typedef short int i16;
|
||||||
typedef unsigned int uint;
|
|
||||||
typedef unsigned int u32;
|
typedef unsigned int u32;
|
||||||
typedef int i32;
|
typedef int i32;
|
||||||
|
typedef unsigned char bool;
|
||||||
|
|
||||||
#endif
|
#endif
|
|
@ -0,0 +1,25 @@
|
||||||
|
/*
|
||||||
|
Copyright 2022 Mattia Giambirtone & Contributors
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef TSOS_UTIL_H
|
||||||
|
#define TSOS_UTIL_H
|
||||||
|
|
||||||
|
#include "kernel/types.h"
|
||||||
|
|
||||||
|
void copystr(const char* source, char* dest, i32 n);
|
||||||
|
void itoa(i32 i, char* a);
|
||||||
|
|
||||||
|
#endif
|
|
@ -47,7 +47,7 @@ jmp $ ; Keeps jumping at the current address (loops forever)
|
||||||
|
|
||||||
; Here we define our variables: They need to be defined after the
|
; Here we define our variables: They need to be defined after the
|
||||||
; halting because otherwise they will be executed as code
|
; halting because otherwise they will be executed as code
|
||||||
real_mode_msg: db "TSOS is starting up", 0
|
real_mode_msg: db "TSBL is starting up", 0
|
||||||
protected_mode_msg: db "Switched to protected mode", 0
|
protected_mode_msg: db "Switched to protected mode", 0
|
||||||
loading_kernel_msg: db "Loading kernel into memory", 0
|
loading_kernel_msg: db "Loading kernel into memory", 0
|
||||||
boot_drive: db 0
|
boot_drive: db 0
|
||||||
|
@ -58,7 +58,7 @@ load_kernel: ; Loads the kernel into memory
|
||||||
mov si, loading_kernel_msg
|
mov si, loading_kernel_msg
|
||||||
call bios_println
|
call bios_println
|
||||||
mov bx, kernel_offset
|
mov bx, kernel_offset
|
||||||
mov dh, 3
|
mov dh, 4
|
||||||
mov dl, [boot_drive]
|
mov dl, [boot_drive]
|
||||||
call load_disk
|
call load_disk
|
||||||
ret
|
ret
|
||||||
|
|
|
@ -16,7 +16,8 @@ limitations under the License.
|
||||||
|
|
||||||
// Implementation of a simple text-only VGA driver
|
// Implementation of a simple text-only VGA driver
|
||||||
#include "kernel/drivers/vga/screen.h"
|
#include "kernel/drivers/vga/screen.h"
|
||||||
#include "kernel/ktypes.h"
|
#include "kernel/types.h"
|
||||||
|
#include "kernel/util.h"
|
||||||
|
|
||||||
|
|
||||||
i32 getCursorOffset(void);
|
i32 getCursorOffset(void);
|
||||||
|
@ -82,12 +83,22 @@ i32 putchar(byte ch, i32 col, i32 row, byte attr) {
|
||||||
- '\n' -> Goes to the next line
|
- '\n' -> Goes to the next line
|
||||||
- '\t' -> Prints VGA_TABSIZE spaces
|
- '\t' -> Prints VGA_TABSIZE spaces
|
||||||
- '\r' -> Resets the cursor's column, but not the row
|
- '\r' -> Resets the cursor's column, but not the row
|
||||||
|
Upon error, a negative value is returned; The possible
|
||||||
|
errors are codes are
|
||||||
|
- -1 -> Column out of bounds
|
||||||
|
- -2 -> Row out of bounds
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (!attr) {
|
if (!attr) {
|
||||||
// No color data provided? We supply our own
|
// No color data provided? We supply our own
|
||||||
attr = LIGHT_GREY_ON_BLACK;
|
attr = LIGHT_GREY_ON_BLACK;
|
||||||
}
|
}
|
||||||
|
if (col >= MAX_COLS) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (row >= MAX_ROWS) {
|
||||||
|
return -2;
|
||||||
|
}
|
||||||
i32 offset = (col >= 0 && row >= 0)? getOffset(col, row): getCursorOffset();
|
i32 offset = (col >= 0 && row >= 0)? getOffset(col, row): getCursorOffset();
|
||||||
switch (ch) {
|
switch (ch) {
|
||||||
// Note the difference between a carriage return (which
|
// Note the difference between a carriage return (which
|
||||||
|
@ -112,6 +123,26 @@ i32 putchar(byte ch, i32 col, i32 row, byte attr) {
|
||||||
offset += 2;
|
offset += 2;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
// We check if we reached the end of the screen, in which
|
||||||
|
// case we scroll
|
||||||
|
if (offset >= SCREEN_SIZE * 2) {
|
||||||
|
for (i32 i = 1; i < MAX_ROWS; i ++) {
|
||||||
|
// This loop will take the bytes of row i and copy
|
||||||
|
// them to row i - 1, effectively erasing the first
|
||||||
|
// one and causing the text on the screen to scroll!
|
||||||
|
copystr((char *)(getOffset(0, i) + VMEM_ADDRESS),
|
||||||
|
(char*)(getOffset(0, i - 1) + VMEM_ADDRESS),
|
||||||
|
MAX_COLS * 2);
|
||||||
|
}
|
||||||
|
// We empty the last line
|
||||||
|
char* last = (char*)(getOffset(0, MAX_ROWS - 1) + VMEM_ADDRESS);
|
||||||
|
for (i32 i = 0; i < MAX_COLS * 2; i++) {
|
||||||
|
last[i] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
offset -= 2 * MAX_COLS;
|
||||||
|
}
|
||||||
|
|
||||||
setCursorOffset(offset);
|
setCursorOffset(offset);
|
||||||
return offset;
|
return offset;
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,13 +14,28 @@ See the License for the specific language governing permissions and
|
||||||
limitations under the License.
|
limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// Entry point of the TSOS kernel
|
#include "kernel/types.h"
|
||||||
#include "kernel/ktypes.h"
|
|
||||||
#include "kernel/drivers/vga/screen.h"
|
#include "kernel/drivers/vga/screen.h"
|
||||||
|
#include "kernel/util.h"
|
||||||
|
|
||||||
|
|
||||||
void kmain(void) {
|
void kmain(void) {
|
||||||
|
/*
|
||||||
|
The kernel entry point of TSOS
|
||||||
|
*/
|
||||||
|
|
||||||
// Newline so we skip the log
|
// Newline so we skip the log
|
||||||
// messages from the bootloader
|
// messages from the bootloader
|
||||||
kprint("\nTSOS Kernel is starting up");
|
kprint("\nTSOS Kernel is starting up");
|
||||||
|
// TODO: Sleep
|
||||||
|
clearScreen();
|
||||||
|
char str[255];
|
||||||
|
/* Fill up the screen */
|
||||||
|
for (i32 i = 0; i < 24; i++) {
|
||||||
|
itoa(i, str);
|
||||||
|
kprintAt(str, 0, i);
|
||||||
|
}
|
||||||
|
|
||||||
|
kprintAt("This text forces the kernel to scroll. Row 0 will disappear.", 60, 24);
|
||||||
|
kprint("\nAnd with this text, the kernel will scroll again, and row 1 will disappear too!");
|
||||||
}
|
}
|
|
@ -0,0 +1,74 @@
|
||||||
|
/*
|
||||||
|
Copyright 2022 Mattia Giambirtone & Contributors
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "kernel/types.h"
|
||||||
|
#include "kernel/util.h"
|
||||||
|
|
||||||
|
void copystr(const char* restrict source, char* restrict dest, i32 n) {
|
||||||
|
/*
|
||||||
|
Copies n bytes from source to dest. The two memory locations may
|
||||||
|
not overlap: if they do, the behavior is undefined. This function's
|
||||||
|
behavior is also undefined if:
|
||||||
|
- n is larger than source's or dest's actual size
|
||||||
|
- dest is smaller than source
|
||||||
|
The caller should make sure these conditions are checked for before
|
||||||
|
calling this function
|
||||||
|
*/
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < n; i++) {
|
||||||
|
*(dest + i) = *(source + i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
i32 countDigits(i32 n) {
|
||||||
|
/*
|
||||||
|
Returns the number of digits
|
||||||
|
of n
|
||||||
|
*/
|
||||||
|
i32 result = 0;
|
||||||
|
while (n) {
|
||||||
|
n /= 10;
|
||||||
|
result++;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void itoa(i32 n, char* a) {
|
||||||
|
/*
|
||||||
|
Converts the integer n to
|
||||||
|
a string. The result is written
|
||||||
|
to a, which is assumed to be large
|
||||||
|
enough to accomodate an optional
|
||||||
|
negative sign, the number itself
|
||||||
|
and a null byte at the end (if the
|
||||||
|
buffer is not large enough, the
|
||||||
|
behavior is undefined)
|
||||||
|
*/
|
||||||
|
int i, sign;
|
||||||
|
if ((sign = n) < 0) n = -n;
|
||||||
|
i = countDigits(n);
|
||||||
|
do {
|
||||||
|
a[--i] = n % 10 + '0';
|
||||||
|
} while ((n /= 10) > 0);
|
||||||
|
|
||||||
|
if (sign < 0) a[--i] = '-';
|
||||||
|
a[--i] = '\0';
|
||||||
|
|
||||||
|
/* TODO: implement "reverse" */
|
||||||
|
}
|
Loading…
Reference in New Issue