Initial Commit.
git-svn-id: https://spexeah.com:8443/svn/Asuro@1 6dbc8c32-bb84-406f-8558-d1cf31a0ab0c
This commit is contained in:
commit
eaa8b0914d
52
Compile.bat
Normal file
52
Compile.bat
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
@echo off
|
||||||
|
set /a ERRCOUNT=0
|
||||||
|
echo =======================
|
||||||
|
echo == ASURO COMPILATION ==
|
||||||
|
echo =======================
|
||||||
|
echo.
|
||||||
|
echo Compiling ASM Stub...
|
||||||
|
echo.
|
||||||
|
nasm -f elf src\stub.asm -o lib\stub.o
|
||||||
|
if %ERRORLEVEL% GEQ 1 (
|
||||||
|
echo Failed to compile stub!
|
||||||
|
set /a ERRCOUNT=%ERRCOUNT%+1
|
||||||
|
) ELSE (
|
||||||
|
echo Success.
|
||||||
|
)
|
||||||
|
echo.
|
||||||
|
echo =======================
|
||||||
|
echo.
|
||||||
|
echo Compiling FPC Sources...
|
||||||
|
echo.
|
||||||
|
fpc -Aelf -n -O3 -Op3 -Si -Sc -Sg -Xd -CX -XXs -Rintel -Tlinux -FElib\ src\kernel.pas
|
||||||
|
if %ERRORLEVEL% GEQ 1 (
|
||||||
|
echo Failed to compile FPC Sources!
|
||||||
|
set /a ERRCOUNT=%ERRCOUNT%+1
|
||||||
|
) ELSE (
|
||||||
|
echo Success.
|
||||||
|
)
|
||||||
|
echo.
|
||||||
|
echo =======================
|
||||||
|
echo.
|
||||||
|
echo Linking...
|
||||||
|
echo.
|
||||||
|
ld -A elf32-i386 --gc-sections -s -Tlinker.script -o bin\kernel.obj lib\stub.o lib\kernel.o lib\multiboot.o lib\system.o lib\console.o
|
||||||
|
if %ERRORLEVEL% GEQ 1 (
|
||||||
|
echo Failed linking!
|
||||||
|
set /a ERRCOUNT=%ERRCOUNT%+1
|
||||||
|
) ELSE (
|
||||||
|
echo Success.
|
||||||
|
)
|
||||||
|
echo.
|
||||||
|
echo =======================
|
||||||
|
echo.
|
||||||
|
if %ERRCOUNT% GEQ 1 (
|
||||||
|
echo %ERRCOUNT% Errors Occurred, please review.
|
||||||
|
) ELSE (
|
||||||
|
echo No errors.
|
||||||
|
)
|
||||||
|
echo.
|
||||||
|
echo =======================
|
||||||
|
echo.
|
||||||
|
echo Press any key to exit...
|
||||||
|
pause > nul
|
BIN
bin/kernel.obj
Normal file
BIN
bin/kernel.obj
Normal file
Binary file not shown.
BIN
lib/console.o
Normal file
BIN
lib/console.o
Normal file
Binary file not shown.
BIN
lib/console.ppu
Normal file
BIN
lib/console.ppu
Normal file
Binary file not shown.
BIN
lib/kernel.o
Normal file
BIN
lib/kernel.o
Normal file
Binary file not shown.
BIN
lib/kernel.ppu
Normal file
BIN
lib/kernel.ppu
Normal file
Binary file not shown.
BIN
lib/libpconsole.a
Normal file
BIN
lib/libpconsole.a
Normal file
Binary file not shown.
BIN
lib/libpkernel.a
Normal file
BIN
lib/libpkernel.a
Normal file
Binary file not shown.
BIN
lib/libpmultiboot.a
Normal file
BIN
lib/libpmultiboot.a
Normal file
Binary file not shown.
BIN
lib/libpsystem.a
Normal file
BIN
lib/libpsystem.a
Normal file
Binary file not shown.
BIN
lib/multiboot.o
Normal file
BIN
lib/multiboot.o
Normal file
Binary file not shown.
BIN
lib/multiboot.ppu
Normal file
BIN
lib/multiboot.ppu
Normal file
Binary file not shown.
BIN
lib/stub.o
Normal file
BIN
lib/stub.o
Normal file
Binary file not shown.
BIN
lib/system.o
Normal file
BIN
lib/system.o
Normal file
Binary file not shown.
BIN
lib/system.ppu
Normal file
BIN
lib/system.ppu
Normal file
Binary file not shown.
31
linker.script
Normal file
31
linker.script
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
ENTRY(kstart)
|
||||||
|
SECTIONS
|
||||||
|
{
|
||||||
|
.text 0x100000 :
|
||||||
|
{
|
||||||
|
text = .; _text = .; __text = .;
|
||||||
|
*(.text)
|
||||||
|
. = ALIGN(4096);
|
||||||
|
}
|
||||||
|
.data :
|
||||||
|
{
|
||||||
|
data = .; _data = .; __data = .;
|
||||||
|
*(.data)
|
||||||
|
kimage_text = .;
|
||||||
|
LONG(text);
|
||||||
|
kimage_data = .;
|
||||||
|
LONG(data);
|
||||||
|
kimage_bss = .;
|
||||||
|
LONG(bss);
|
||||||
|
kimage_end = .;
|
||||||
|
LONG(end);
|
||||||
|
. = ALIGN(4096);
|
||||||
|
}
|
||||||
|
.bss :
|
||||||
|
{
|
||||||
|
bss = .; _bss = .; __bss = .;
|
||||||
|
*(.bss)
|
||||||
|
. = ALIGN(4096);
|
||||||
|
}
|
||||||
|
end = .; _end = .; __end = .;
|
||||||
|
}
|
147
src/console.pas
Normal file
147
src/console.pas
Normal file
@ -0,0 +1,147 @@
|
|||||||
|
{
|
||||||
|
/////////////////////////////////////////////////////////
|
||||||
|
// //
|
||||||
|
// Freepascal barebone OS //
|
||||||
|
// console.pas //
|
||||||
|
// //
|
||||||
|
/////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// By: De Deyn Kim <kimdedeyn@skynet.be>
|
||||||
|
// License: Public domain
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
unit console;
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
var
|
||||||
|
xpos: Integer = 0;
|
||||||
|
ypos: Integer = 0;
|
||||||
|
|
||||||
|
procedure kclearscreen();
|
||||||
|
procedure kwritechr(c: Char);
|
||||||
|
procedure kwritestr(s: PChar);
|
||||||
|
procedure kwriteint(i: Integer);
|
||||||
|
procedure kwritedword(i: DWORD);
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
var
|
||||||
|
vidmem: PChar = PChar($b8000);
|
||||||
|
|
||||||
|
procedure kclearscreen(); [public, alias: 'kclearscreen'];
|
||||||
|
var
|
||||||
|
i: Integer;
|
||||||
|
begin
|
||||||
|
for i := 0 to 3999 do
|
||||||
|
vidmem[i] := #0;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure kwritechr(c: Char); [public, alias: 'kwritechr'];
|
||||||
|
var
|
||||||
|
offset: Integer;
|
||||||
|
begin
|
||||||
|
if (ypos > 24) then
|
||||||
|
ypos := 0;
|
||||||
|
|
||||||
|
if (xpos > 79) then
|
||||||
|
xpos := 0;
|
||||||
|
|
||||||
|
offset := (xpos shl 1) + (ypos * 160);
|
||||||
|
vidmem[offset] := c;
|
||||||
|
offset += 1;
|
||||||
|
vidmem[offset] := #7;
|
||||||
|
offset += 1;
|
||||||
|
|
||||||
|
xpos := (offset mod 160);
|
||||||
|
ypos := (offset - xpos) div 160;
|
||||||
|
xpos := xpos shr 1;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure kwritestr(s: PChar); [public, alias: 'kwritestr'];
|
||||||
|
var
|
||||||
|
offset, i: Integer;
|
||||||
|
begin
|
||||||
|
if (ypos > 24) then
|
||||||
|
ypos := 0;
|
||||||
|
|
||||||
|
if (xpos > 79) then
|
||||||
|
xpos := 0;
|
||||||
|
|
||||||
|
offset := (xpos shl 1) + (ypos * 160);
|
||||||
|
i := 0;
|
||||||
|
|
||||||
|
while (s[i] <> Char($0)) do
|
||||||
|
begin
|
||||||
|
vidmem[offset] := s[i];
|
||||||
|
offset += 1;
|
||||||
|
vidmem[offset] := #7;
|
||||||
|
offset += 1;
|
||||||
|
i += 1;
|
||||||
|
end;
|
||||||
|
|
||||||
|
xpos := (offset mod 160);
|
||||||
|
ypos := (offset - xpos) div 160;
|
||||||
|
xpos := xpos shr 1;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure kwriteint(i: Integer); [public, alias: 'kwriteint'];
|
||||||
|
var
|
||||||
|
buffer: array [0..11] of Char;
|
||||||
|
str: PChar;
|
||||||
|
digit: DWORD;
|
||||||
|
minus: Boolean;
|
||||||
|
begin
|
||||||
|
str := @buffer[11];
|
||||||
|
str^ := #0;
|
||||||
|
|
||||||
|
if (i < 0) then
|
||||||
|
begin
|
||||||
|
digit := -i;
|
||||||
|
minus := True;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
digit := i;
|
||||||
|
minus := False;
|
||||||
|
end;
|
||||||
|
|
||||||
|
repeat
|
||||||
|
Dec(str);
|
||||||
|
str^ := Char((digit mod 10) + Byte('0'));
|
||||||
|
digit := digit div 10;
|
||||||
|
until (digit = 0);
|
||||||
|
|
||||||
|
if (minus) then
|
||||||
|
begin
|
||||||
|
Dec(str);
|
||||||
|
str^ := '-';
|
||||||
|
end;
|
||||||
|
|
||||||
|
kwritestr(str);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure kwritedword(i: DWORD); [public, alias: 'kwritedword'];
|
||||||
|
var
|
||||||
|
buffer: array [0..11] of Char;
|
||||||
|
str: PChar;
|
||||||
|
digit: DWORD;
|
||||||
|
begin
|
||||||
|
for digit := 0 to 10 do
|
||||||
|
buffer[digit] := '0';
|
||||||
|
|
||||||
|
str := @buffer[11];
|
||||||
|
str^ := #0;
|
||||||
|
|
||||||
|
digit := i;
|
||||||
|
repeat
|
||||||
|
Dec(str);
|
||||||
|
str^ := Char((digit mod 10) + Byte('0'));
|
||||||
|
digit := digit div 10;
|
||||||
|
until (digit = 0);
|
||||||
|
|
||||||
|
kwritestr(@Buffer[0]);
|
||||||
|
end;
|
||||||
|
|
||||||
|
end.
|
70
src/kernel.pas
Normal file
70
src/kernel.pas
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
{
|
||||||
|
/////////////////////////////////////////////////////////
|
||||||
|
// //
|
||||||
|
// Freepascal barebone OS //
|
||||||
|
// kernel.pas //
|
||||||
|
// //
|
||||||
|
/////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// By: De Deyn Kim <kimdedeyn@skynet.be>
|
||||||
|
// License: Public domain
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
unit kernel;
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
uses
|
||||||
|
multiboot,
|
||||||
|
console;
|
||||||
|
|
||||||
|
procedure kmain(mbinfo: Pmultiboot_info_t; mbmagic: DWORD); stdcall;
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
procedure kmain(mbinfo: Pmultiboot_info_t; mbmagic: DWORD); stdcall; [public, alias: 'kmain'];
|
||||||
|
begin
|
||||||
|
kclearscreen();
|
||||||
|
kwritestr('Freepascal barebone OS booted!');
|
||||||
|
xpos := 0;
|
||||||
|
ypos += 1;
|
||||||
|
|
||||||
|
if (mbmagic <> MULTIBOOT_BOOTLOADER_MAGIC) then
|
||||||
|
begin
|
||||||
|
kwritestr('Halting system, a multiboot-compliant boot loader needed!');
|
||||||
|
asm
|
||||||
|
cli
|
||||||
|
hlt
|
||||||
|
end;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
kwritestr('Booted by a multiboot-compliant boot loader!');
|
||||||
|
xpos := 0;
|
||||||
|
ypos += 2;
|
||||||
|
kwritestr('Multiboot information:');
|
||||||
|
xpos := 0;
|
||||||
|
ypos += 2;
|
||||||
|
kwritestr(' Lower memory = ');
|
||||||
|
kwriteint(mbinfo^.mem_lower);
|
||||||
|
kwritestr('KB');
|
||||||
|
xpos := 0;
|
||||||
|
ypos += 1;
|
||||||
|
kwritestr(' Higher memory = ');
|
||||||
|
kwriteint(mbinfo^.mem_upper);
|
||||||
|
kwritestr('KB');
|
||||||
|
xpos := 0;
|
||||||
|
ypos += 1;
|
||||||
|
kwritestr(' Total memory = ');
|
||||||
|
kwriteint(((mbinfo^.mem_upper + 1000) div 1024) +1);
|
||||||
|
kwritestr('MB');
|
||||||
|
end;
|
||||||
|
|
||||||
|
asm
|
||||||
|
@loop:
|
||||||
|
jmp @loop
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
end.
|
55
src/multiboot.pas
Normal file
55
src/multiboot.pas
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
unit multiboot;
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
const
|
||||||
|
KERNEL_STACKSIZE = $4000;
|
||||||
|
|
||||||
|
MULTIBOOT_BOOTLOADER_MAGIC = $2BADB002;
|
||||||
|
|
||||||
|
type
|
||||||
|
Pelf_section_header_table_t = ^elf_section_header_table_t;
|
||||||
|
elf_section_header_table_t = packed record
|
||||||
|
num: DWORD;
|
||||||
|
size: DWORD;
|
||||||
|
addr: DWORD;
|
||||||
|
shndx: DWORD;
|
||||||
|
end;
|
||||||
|
|
||||||
|
Pmultiboot_info_t = ^multiboot_info_t;
|
||||||
|
multiboot_info_t = packed record
|
||||||
|
flags: DWORD;
|
||||||
|
mem_lower: DWORD; { Amount of memory available below 1mb }
|
||||||
|
mem_upper: DWORD; { Amount of memory available above 1mb }
|
||||||
|
boot_device: DWORD;
|
||||||
|
cmdline: DWORD;
|
||||||
|
mods_count: DWORD;
|
||||||
|
mods_addr: DWORD;
|
||||||
|
elf_sec: elf_section_header_table_t;
|
||||||
|
mmap_length: DWORD;
|
||||||
|
mmap_addr: DWORD;
|
||||||
|
end;
|
||||||
|
|
||||||
|
Pmodule_t = ^module_t;
|
||||||
|
module_t = packed record
|
||||||
|
mod_start: DWORD;
|
||||||
|
mod_end: DWORD;
|
||||||
|
name: DWORD;
|
||||||
|
reserved: DWORD;
|
||||||
|
end;
|
||||||
|
|
||||||
|
Pmemory_map_t = ^memory_map_t;
|
||||||
|
memory_map_t = packed record
|
||||||
|
size: DWORD;
|
||||||
|
{ You can declare these two as a single qword if your compiler supports it }
|
||||||
|
base_addr_low: DWORD;
|
||||||
|
base_addr_high: DWORD;
|
||||||
|
{ And again, these can be made into one qword variable. }
|
||||||
|
length_low: DWORD;
|
||||||
|
length_high: DWORD;
|
||||||
|
mtype: DWORD;
|
||||||
|
end;
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
end.
|
79
src/stub.asm
Normal file
79
src/stub.asm
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
;/////////////////////////////////////////////////////////
|
||||||
|
;// //
|
||||||
|
;// Freepascal barebone OS //
|
||||||
|
;// stub.asm //
|
||||||
|
;// //
|
||||||
|
;/////////////////////////////////////////////////////////
|
||||||
|
;//
|
||||||
|
;// By: De Deyn Kim <kimdedeyn@skynet.be>
|
||||||
|
;// License: Public domain
|
||||||
|
;//
|
||||||
|
|
||||||
|
;
|
||||||
|
; Kernel stub
|
||||||
|
;
|
||||||
|
|
||||||
|
;
|
||||||
|
; We are in 32bits protected mode
|
||||||
|
;
|
||||||
|
[bits 32]
|
||||||
|
|
||||||
|
;
|
||||||
|
; Export entrypoint
|
||||||
|
;
|
||||||
|
[global kstart]
|
||||||
|
|
||||||
|
;
|
||||||
|
; Import kernel entrypoint
|
||||||
|
;
|
||||||
|
[extern kmain]
|
||||||
|
|
||||||
|
;
|
||||||
|
; Posible multiboot header flags
|
||||||
|
;
|
||||||
|
MULTIBOOT_MODULE_ALIGN equ 1<<0
|
||||||
|
MULTIBOOT_MEMORY_MAP equ 1<<1
|
||||||
|
MULTIBOOT_GRAPHICS_FIELDS equ 1<<2
|
||||||
|
MULTIBOOT_ADDRESS_FIELDS equ 1<<16
|
||||||
|
|
||||||
|
;
|
||||||
|
; Multiboot header defines
|
||||||
|
;
|
||||||
|
MULTIBOOT_HEADER_MAGIC equ 0x1BADB002
|
||||||
|
MULTIBOOT_HEADER_FLAGS equ MULTIBOOT_MODULE_ALIGN | MULTIBOOT_MEMORY_MAP
|
||||||
|
MULTIBOOT_HEADER_CHECKSUM equ -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)
|
||||||
|
|
||||||
|
;
|
||||||
|
; Kernel stack size
|
||||||
|
;
|
||||||
|
KERNEL_STACKSIZE equ 0x4000
|
||||||
|
|
||||||
|
section .text
|
||||||
|
|
||||||
|
;
|
||||||
|
; Multiboot header
|
||||||
|
;
|
||||||
|
align 4
|
||||||
|
dd MULTIBOOT_HEADER_MAGIC
|
||||||
|
dd MULTIBOOT_HEADER_FLAGS
|
||||||
|
dd MULTIBOOT_HEADER_CHECKSUM
|
||||||
|
|
||||||
|
;
|
||||||
|
; Entrypoint
|
||||||
|
;
|
||||||
|
kstart:
|
||||||
|
mov esp, KERNEL_STACK+KERNEL_STACKSIZE ;Create kernel stack
|
||||||
|
push eax ;Multiboot magic number
|
||||||
|
push ebx ;Multiboot info
|
||||||
|
call kmain ;Call kernel entrypoint
|
||||||
|
cli ;Clear interrupts
|
||||||
|
hlt ;Halt machine
|
||||||
|
|
||||||
|
section .bss
|
||||||
|
|
||||||
|
;
|
||||||
|
; Kernel stack location
|
||||||
|
;
|
||||||
|
align 32
|
||||||
|
KERNEL_STACK:
|
||||||
|
resb KERNEL_STACKSIZE
|
15
src/system.pas
Normal file
15
src/system.pas
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
unit system;
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
type
|
||||||
|
cardinal = 0..$FFFFFFFF;
|
||||||
|
hresult = cardinal;
|
||||||
|
dword = cardinal;
|
||||||
|
integer = longint;
|
||||||
|
|
||||||
|
pchar = ^char;
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
end.
|
Loading…
x
Reference in New Issue
Block a user