mirror of https://github.com/E-Almqvist/eOS
parent
040910f679
commit
98d796509b
@ -1,339 +0,0 @@ |
||||
GNU GENERAL PUBLIC LICENSE |
||||
Version 2, June 1991 |
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc., |
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
||||
Everyone is permitted to copy and distribute verbatim copies |
||||
of this license document, but changing it is not allowed. |
||||
|
||||
Preamble |
||||
|
||||
The licenses for most software are designed to take away your |
||||
freedom to share and change it. By contrast, the GNU General Public |
||||
License is intended to guarantee your freedom to share and change free |
||||
software--to make sure the software is free for all its users. This |
||||
General Public License applies to most of the Free Software |
||||
Foundation's software and to any other program whose authors commit to |
||||
using it. (Some other Free Software Foundation software is covered by |
||||
the GNU Lesser General Public License instead.) You can apply it to |
||||
your programs, too. |
||||
|
||||
When we speak of free software, we are referring to freedom, not |
||||
price. Our General Public Licenses are designed to make sure that you |
||||
have the freedom to distribute copies of free software (and charge for |
||||
this service if you wish), that you receive source code or can get it |
||||
if you want it, that you can change the software or use pieces of it |
||||
in new free programs; and that you know you can do these things. |
||||
|
||||
To protect your rights, we need to make restrictions that forbid |
||||
anyone to deny you these rights or to ask you to surrender the rights. |
||||
These restrictions translate to certain responsibilities for you if you |
||||
distribute copies of the software, or if you modify it. |
||||
|
||||
For example, if you distribute copies of such a program, whether |
||||
gratis or for a fee, you must give the recipients all the rights that |
||||
you have. You must make sure that they, too, receive or can get the |
||||
source code. And you must show them these terms so they know their |
||||
rights. |
||||
|
||||
We protect your rights with two steps: (1) copyright the software, and |
||||
(2) offer you this license which gives you legal permission to copy, |
||||
distribute and/or modify the software. |
||||
|
||||
Also, for each author's protection and ours, we want to make certain |
||||
that everyone understands that there is no warranty for this free |
||||
software. If the software is modified by someone else and passed on, we |
||||
want its recipients to know that what they have is not the original, so |
||||
that any problems introduced by others will not reflect on the original |
||||
authors' reputations. |
||||
|
||||
Finally, any free program is threatened constantly by software |
||||
patents. We wish to avoid the danger that redistributors of a free |
||||
program will individually obtain patent licenses, in effect making the |
||||
program proprietary. To prevent this, we have made it clear that any |
||||
patent must be licensed for everyone's free use or not licensed at all. |
||||
|
||||
The precise terms and conditions for copying, distribution and |
||||
modification follow. |
||||
|
||||
GNU GENERAL PUBLIC LICENSE |
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION |
||||
|
||||
0. This License applies to any program or other work which contains |
||||
a notice placed by the copyright holder saying it may be distributed |
||||
under the terms of this General Public License. The "Program", below, |
||||
refers to any such program or work, and a "work based on the Program" |
||||
means either the Program or any derivative work under copyright law: |
||||
that is to say, a work containing the Program or a portion of it, |
||||
either verbatim or with modifications and/or translated into another |
||||
language. (Hereinafter, translation is included without limitation in |
||||
the term "modification".) Each licensee is addressed as "you". |
||||
|
||||
Activities other than copying, distribution and modification are not |
||||
covered by this License; they are outside its scope. The act of |
||||
running the Program is not restricted, and the output from the Program |
||||
is covered only if its contents constitute a work based on the |
||||
Program (independent of having been made by running the Program). |
||||
Whether that is true depends on what the Program does. |
||||
|
||||
1. You may copy and distribute verbatim copies of the Program's |
||||
source code as you receive it, in any medium, provided that you |
||||
conspicuously and appropriately publish on each copy an appropriate |
||||
copyright notice and disclaimer of warranty; keep intact all the |
||||
notices that refer to this License and to the absence of any warranty; |
||||
and give any other recipients of the Program a copy of this License |
||||
along with the Program. |
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and |
||||
you may at your option offer warranty protection in exchange for a fee. |
||||
|
||||
2. You may modify your copy or copies of the Program or any portion |
||||
of it, thus forming a work based on the Program, and copy and |
||||
distribute such modifications or work under the terms of Section 1 |
||||
above, provided that you also meet all of these conditions: |
||||
|
||||
a) You must cause the modified files to carry prominent notices |
||||
stating that you changed the files and the date of any change. |
||||
|
||||
b) You must cause any work that you distribute or publish, that in |
||||
whole or in part contains or is derived from the Program or any |
||||
part thereof, to be licensed as a whole at no charge to all third |
||||
parties under the terms of this License. |
||||
|
||||
c) If the modified program normally reads commands interactively |
||||
when run, you must cause it, when started running for such |
||||
interactive use in the most ordinary way, to print or display an |
||||
announcement including an appropriate copyright notice and a |
||||
notice that there is no warranty (or else, saying that you provide |
||||
a warranty) and that users may redistribute the program under |
||||
these conditions, and telling the user how to view a copy of this |
||||
License. (Exception: if the Program itself is interactive but |
||||
does not normally print such an announcement, your work based on |
||||
the Program is not required to print an announcement.) |
||||
|
||||
These requirements apply to the modified work as a whole. If |
||||
identifiable sections of that work are not derived from the Program, |
||||
and can be reasonably considered independent and separate works in |
||||
themselves, then this License, and its terms, do not apply to those |
||||
sections when you distribute them as separate works. But when you |
||||
distribute the same sections as part of a whole which is a work based |
||||
on the Program, the distribution of the whole must be on the terms of |
||||
this License, whose permissions for other licensees extend to the |
||||
entire whole, and thus to each and every part regardless of who wrote it. |
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest |
||||
your rights to work written entirely by you; rather, the intent is to |
||||
exercise the right to control the distribution of derivative or |
||||
collective works based on the Program. |
||||
|
||||
In addition, mere aggregation of another work not based on the Program |
||||
with the Program (or with a work based on the Program) on a volume of |
||||
a storage or distribution medium does not bring the other work under |
||||
the scope of this License. |
||||
|
||||
3. You may copy and distribute the Program (or a work based on it, |
||||
under Section 2) in object code or executable form under the terms of |
||||
Sections 1 and 2 above provided that you also do one of the following: |
||||
|
||||
a) Accompany it with the complete corresponding machine-readable |
||||
source code, which must be distributed under the terms of Sections |
||||
1 and 2 above on a medium customarily used for software interchange; or, |
||||
|
||||
b) Accompany it with a written offer, valid for at least three |
||||
years, to give any third party, for a charge no more than your |
||||
cost of physically performing source distribution, a complete |
||||
machine-readable copy of the corresponding source code, to be |
||||
distributed under the terms of Sections 1 and 2 above on a medium |
||||
customarily used for software interchange; or, |
||||
|
||||
c) Accompany it with the information you received as to the offer |
||||
to distribute corresponding source code. (This alternative is |
||||
allowed only for noncommercial distribution and only if you |
||||
received the program in object code or executable form with such |
||||
an offer, in accord with Subsection b above.) |
||||
|
||||
The source code for a work means the preferred form of the work for |
||||
making modifications to it. For an executable work, complete source |
||||
code means all the source code for all modules it contains, plus any |
||||
associated interface definition files, plus the scripts used to |
||||
control compilation and installation of the executable. However, as a |
||||
special exception, the source code distributed need not include |
||||
anything that is normally distributed (in either source or binary |
||||
form) with the major components (compiler, kernel, and so on) of the |
||||
operating system on which the executable runs, unless that component |
||||
itself accompanies the executable. |
||||
|
||||
If distribution of executable or object code is made by offering |
||||
access to copy from a designated place, then offering equivalent |
||||
access to copy the source code from the same place counts as |
||||
distribution of the source code, even though third parties are not |
||||
compelled to copy the source along with the object code. |
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program |
||||
except as expressly provided under this License. Any attempt |
||||
otherwise to copy, modify, sublicense or distribute the Program is |
||||
void, and will automatically terminate your rights under this License. |
||||
However, parties who have received copies, or rights, from you under |
||||
this License will not have their licenses terminated so long as such |
||||
parties remain in full compliance. |
||||
|
||||
5. You are not required to accept this License, since you have not |
||||
signed it. However, nothing else grants you permission to modify or |
||||
distribute the Program or its derivative works. These actions are |
||||
prohibited by law if you do not accept this License. Therefore, by |
||||
modifying or distributing the Program (or any work based on the |
||||
Program), you indicate your acceptance of this License to do so, and |
||||
all its terms and conditions for copying, distributing or modifying |
||||
the Program or works based on it. |
||||
|
||||
6. Each time you redistribute the Program (or any work based on the |
||||
Program), the recipient automatically receives a license from the |
||||
original licensor to copy, distribute or modify the Program subject to |
||||
these terms and conditions. You may not impose any further |
||||
restrictions on the recipients' exercise of the rights granted herein. |
||||
You are not responsible for enforcing compliance by third parties to |
||||
this License. |
||||
|
||||
7. If, as a consequence of a court judgment or allegation of patent |
||||
infringement or for any other reason (not limited to patent issues), |
||||
conditions are imposed on you (whether by court order, agreement or |
||||
otherwise) that contradict the conditions of this License, they do not |
||||
excuse you from the conditions of this License. If you cannot |
||||
distribute so as to satisfy simultaneously your obligations under this |
||||
License and any other pertinent obligations, then as a consequence you |
||||
may not distribute the Program at all. For example, if a patent |
||||
license would not permit royalty-free redistribution of the Program by |
||||
all those who receive copies directly or indirectly through you, then |
||||
the only way you could satisfy both it and this License would be to |
||||
refrain entirely from distribution of the Program. |
||||
|
||||
If any portion of this section is held invalid or unenforceable under |
||||
any particular circumstance, the balance of the section is intended to |
||||
apply and the section as a whole is intended to apply in other |
||||
circumstances. |
||||
|
||||
It is not the purpose of this section to induce you to infringe any |
||||
patents or other property right claims or to contest validity of any |
||||
such claims; this section has the sole purpose of protecting the |
||||
integrity of the free software distribution system, which is |
||||
implemented by public license practices. Many people have made |
||||
generous contributions to the wide range of software distributed |
||||
through that system in reliance on consistent application of that |
||||
system; it is up to the author/donor to decide if he or she is willing |
||||
to distribute software through any other system and a licensee cannot |
||||
impose that choice. |
||||
|
||||
This section is intended to make thoroughly clear what is believed to |
||||
be a consequence of the rest of this License. |
||||
|
||||
8. If the distribution and/or use of the Program is restricted in |
||||
certain countries either by patents or by copyrighted interfaces, the |
||||
original copyright holder who places the Program under this License |
||||
may add an explicit geographical distribution limitation excluding |
||||
those countries, so that distribution is permitted only in or among |
||||
countries not thus excluded. In such case, this License incorporates |
||||
the limitation as if written in the body of this License. |
||||
|
||||
9. The Free Software Foundation may publish revised and/or new versions |
||||
of the General Public License from time to time. Such new versions will |
||||
be similar in spirit to the present version, but may differ in detail to |
||||
address new problems or concerns. |
||||
|
||||
Each version is given a distinguishing version number. If the Program |
||||
specifies a version number of this License which applies to it and "any |
||||
later version", you have the option of following the terms and conditions |
||||
either of that version or of any later version published by the Free |
||||
Software Foundation. If the Program does not specify a version number of |
||||
this License, you may choose any version ever published by the Free Software |
||||
Foundation. |
||||
|
||||
10. If you wish to incorporate parts of the Program into other free |
||||
programs whose distribution conditions are different, write to the author |
||||
to ask for permission. For software which is copyrighted by the Free |
||||
Software Foundation, write to the Free Software Foundation; we sometimes |
||||
make exceptions for this. Our decision will be guided by the two goals |
||||
of preserving the free status of all derivatives of our free software and |
||||
of promoting the sharing and reuse of software generally. |
||||
|
||||
NO WARRANTY |
||||
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY |
||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN |
||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES |
||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED |
||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS |
||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE |
||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, |
||||
REPAIR OR CORRECTION. |
||||
|
||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING |
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR |
||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, |
||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING |
||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED |
||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY |
||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER |
||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE |
||||
POSSIBILITY OF SUCH DAMAGES. |
||||
|
||||
END OF TERMS AND CONDITIONS |
||||
|
||||
How to Apply These Terms to Your New Programs |
||||
|
||||
If you develop a new program, and you want it to be of the greatest |
||||
possible use to the public, the best way to achieve this is to make it |
||||
free software which everyone can redistribute and change under these terms. |
||||
|
||||
To do so, attach the following notices to the program. It is safest |
||||
to attach them to the start of each source file to most effectively |
||||
convey the exclusion of warranty; and each file should have at least |
||||
the "copyright" line and a pointer to where the full notice is found. |
||||
|
||||
<one line to give the program's name and a brief idea of what it does.> |
||||
Copyright (C) <year> <name of author> |
||||
|
||||
This program is free software; you can redistribute it and/or modify |
||||
it under the terms of the GNU General Public License as published by |
||||
the Free Software Foundation; either version 2 of the License, or |
||||
(at your option) any later version. |
||||
|
||||
This program is distributed in the hope that it will be useful, |
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
GNU General Public License for more details. |
||||
|
||||
You should have received a copy of the GNU General Public License along |
||||
with this program; if not, write to the Free Software Foundation, Inc., |
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
||||
|
||||
Also add information on how to contact you by electronic and paper mail. |
||||
|
||||
If the program is interactive, make it output a short notice like this |
||||
when it starts in an interactive mode: |
||||
|
||||
Gnomovision version 69, Copyright (C) year name of author |
||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. |
||||
This is free software, and you are welcome to redistribute it |
||||
under certain conditions; type `show c' for details. |
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate |
||||
parts of the General Public License. Of course, the commands you use may |
||||
be called something other than `show w' and `show c'; they could even be |
||||
mouse-clicks or menu items--whatever suits your program. |
||||
|
||||
You should also get your employer (if you work as a programmer) or your |
||||
school, if any, to sign a "copyright disclaimer" for the program, if |
||||
necessary. Here is a sample; alter the names: |
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program |
||||
`Gnomovision' (which makes passes at compilers) written by James Hacker. |
||||
|
||||
<signature of Ty Coon>, 1 April 1989 |
||||
Ty Coon, President of Vice |
||||
|
||||
This General Public License does not permit incorporating your program into |
||||
proprietary programs. If your program is a subroutine library, you may |
||||
consider it more useful to permit linking proprietary applications with the |
||||
library. If this is what you want to do, use the GNU Lesser General |
||||
Public License instead of this License. |
@ -1,33 +0,0 @@ |
||||
<p align="center"><img src="logo.png" width="180px" height="auto"></p> |
||||
<p align="center">A simple & lightweight x86 operating system</p> |
||||
|
||||
## |
||||
### Building & Running |
||||
Use the `Makefile` in order to build the binaries/objects et cetera- with <a href="https://linux.die.net/man/1/make" target="_blank">make</a>. |
||||
<br> |
||||
**To build the OS image run**: `$ make os-image` |
||||
<br> |
||||
**To build the OS image (WITH GRUB) run**: `$ make eOS.iso` |
||||
#### Emulation |
||||
You can launch eOS with a VM like <a href="https://www.qemu.org/documentation/" target="_blank">qemu</a>. Launch *qemu* via *make* by running: `$ make run`. |
||||
|
||||
$ make (option) |
||||
run : Runs the OS with qemu |
||||
drun : Recompiles the OS and runs it with qemu |
||||
clean : Remove all object/binary/image files |
||||
## |
||||
### Planned Features |
||||
Go to [eOS v1.0 Kanban Board](https://github.com/E-Almqvist/eOS/projects/1) to see the current progress & planned features of the project. |
||||
## |
||||
<br> |
||||
<br> |
||||
<br> |
||||
<br> |
||||
|
||||
### Resources |
||||
These are the most common resources I used in order to build eOS. I highly recommend them. |
||||
##### Books |
||||
- [Operating Systems: From 0 to 1](https://tuhdo.github.io/os01/) (Open-Source, unfinished) |
||||
- [Writing a Simple Operating System - from Scratch](https://www.cs.bham.ac.uk/~exr/lectures/opsys/10_11/lectures/os-dev.pdf) |
||||
##### Wikis |
||||
- [OSDev.org](https://wiki.osdev.org/Expanded_Main_Page) |
@ -1,12 +0,0 @@ |
||||
# TO DO |
||||
- Malloc |
||||
- String Library |
||||
|
||||
- Concat |
||||
- Format |
||||
|
||||
- Scrolling |
||||
- Multiboot support (for grub etc) |
||||
- Rendering (VGA) |
||||
- User input (Keyboard) |
||||
- File system? |
@ -1,41 +0,0 @@ |
||||
HEX_OUT: db "0x0000", ASCII_END |
||||
|
||||
; SR to convert hex values into ASCII strings |
||||
; This SR is going to mess up some registers |
||||
; since it fills the register with the desired |
||||
; pointer toward the string. |
||||
|
||||
hex_to_ascii: |
||||
mov cx, 0 ; incrementor |
||||
|
||||
hexloop: |
||||
cmp cx, 4 ; check if we reached the end |
||||
je hexreturn ; if so just return our new ASCII string |
||||
|
||||
mov ax, dx |
||||
|
||||
; mask the hex value in ax so that we get the last "char" |
||||
and ax, 0x000f |
||||
|
||||
; convert ax into ASCII (numeric) |
||||
add al, ASCII_OFFSET_NUM ; add 0x30 |
||||
|
||||
cmp al, 0x39 ; if al (char) > "9" |
||||
jle hexloop2 |
||||
|
||||
add al, 7 ; 7 distance from "A" |
||||
|
||||
hexloop2: |
||||
; Write the char into the HEX_OUT string |
||||
mov bx, HEX_OUT + 5 |
||||
sub bx, cx |
||||
|
||||
mov [bx], al ; write the char into the string |
||||
ror dx, 4 ; "rotate" the string |
||||
|
||||
inc cx ; increment and go onto next char |
||||
jmp hexloop |
||||
|
||||
hexreturn: |
||||
mov bx, HEX_OUT |
||||
ret |
@ -1,45 +0,0 @@ |
||||
disk_read: |
||||
push dx ; store dx on stack so that we can compare later |
||||
|
||||
mov ah, BIOS_DISK_READ ; specify function |
||||
|
||||
mov al, dh ; read dh amount of sectors |
||||
mov ch, 0x00 ; CYLINDER |
||||
mov dh, 0x00 ; HEAD |
||||
mov cl, 0x02 ; SECTOR |
||||
|
||||
int BIOS_DISK_INT ; interrupt |
||||
|
||||
; Error checks |
||||
jc read_error ; carry flag set -> error |
||||
|
||||
pop dx |
||||
cmp dh, al ; if dh != al then error |
||||
jne sector_error |
||||
|
||||
ret |
||||
|
||||
sector_error: |
||||
mov bx, sector_error_string |
||||
call println |
||||
|
||||
read_error: |
||||
; Inform the user |
||||
mov bx, read_error_string |
||||
call println |
||||
|
||||
; Print the error |
||||
mov bx, error_code_string |
||||
call print |
||||
|
||||
mov dh, ah |
||||
call print_hex |
||||
|
||||
mov bx, [ASCII_END] |
||||
call println |
||||
|
||||
jmp $ |
||||
|
||||
read_error_string: db ASCII_CARRIAGE_RETURN, ASCII_LINEBREAK, "ERROR! Disk read failed.", ASCII_END |
||||
error_code_string: db "Error code: ", ASCII_END |
||||
sector_error_string: db "Invalid number of sectors read!", ASCII_END |
@ -1,51 +0,0 @@ |
||||
; Input/Output subroutines |
||||
|
||||
; Subroutine to print a string |
||||
print: |
||||
pusha ; save current state of registers |
||||
|
||||
printLoop: |
||||
; Char check |
||||
mov al, [bx] ; load the char |
||||
cmp al, ASCII_END ; check if end of string |
||||
je printreturn ; if al == ASCII_END then return end | lua is good psuedo-code |
||||
|
||||
|
||||
; BIOS Printing |
||||
mov ah, BIOS_TTY_MODE ; enter teletype mode |
||||
int BIOS_TTY_INT ; interupt and print the char (from line 10) |
||||
|
||||
; Preperation for next iteration |
||||
inc bx ; increment the pointer to get next char |
||||
jmp printLoop ; repeat |
||||
|
||||
printreturn: |
||||
popa ; restore all registers |
||||
ret ; return to previous location |
||||
|
||||
|
||||
newline: db ASCII_CARRIAGE_RETURN, ASCII_LINEBREAK, ASCII_END ; used for printing newlines |
||||
|
||||
; Subroutine to print a string on a new line |
||||
println: |
||||
pusha |
||||
|
||||
; Print the input string |
||||
call print ; this will print whatever is in [bx], so clear it if you dont want to print anything |
||||
|
||||
; Print the newline |
||||
mov bx, newline |
||||
call print |
||||
|
||||
popa |
||||
ret |
||||
|
||||
|
||||
; Subroutine to print a hex value |
||||
print_hex: |
||||
pusha |
||||
call hex_to_ascii |
||||
call print |
||||
popa |
||||
|
||||
ret |
@ -1,96 +0,0 @@ |
||||
[org 0x7c00] ; bootsector |
||||
KERNEL_OFFSET equ 0x1000 |
||||
|
||||
; Save the boot drive index |
||||
mov [BOOT_DRIVE], dl |
||||
|
||||
; Move the stack pointer somewhere safe |
||||
mov bp, 0x9000 ; move it to 0x8000 |
||||
mov sp, bp |
||||
|
||||
; Load kernel into memory |
||||
mov bx, stat_kernel_load |
||||
call println |
||||
call load_kernel |
||||
|
||||
; Switching to PM |
||||
mov bx, stat_pm_init |
||||
call println |
||||
call pm_preinit |
||||
|
||||
jmp $ ; inf loop |
||||
|
||||
%include "bootloader/equ/ascii.asm" |
||||
%include "bootloader/equ/bios.asm" |
||||
|
||||
; BIOS SRs |
||||
%include "bootloader/bios/convert.asm" |
||||
%include "bootloader/bios/print.asm" |
||||
%include "bootloader/bios/disk.asm" |
||||
|
||||
; Protected Mode SRs |
||||
%include "bootloader/equ/vga.asm" |
||||
%include "bootloader/pm/vga/print.asm" |
||||
|
||||
; GDT & switching to PM |
||||
%include "bootloader/pm/gdt.asm" ; GDT defined here |
||||
|
||||
; Switching to PM |
||||
[bits 16] |
||||
pm_preinit: |
||||
cli ; Switch interupts |
||||
|
||||
lgdt [gdt_descriptor] ; Tell the CPU about the GDT |
||||
|
||||
mov eax, cr0 ; Set first bit of the CR0 register |
||||
or eax, 0x1 ; to 1 |
||||
mov cr0, eax ; Update the control register |
||||
|
||||
; Initialize PM |
||||
jmp GDT_CODE_SEG:pm_init |
||||
|
||||
[bits 32] |
||||
; Init registers & stack when in PM |
||||
pm_init: |
||||
mov ax, GDT_DATA_SEG ; Point the segment registers to GDT_DATA_SEG |
||||
; Segment registers |
||||
mov ds, ax |
||||
mov ss, ax |
||||
mov es, ax |
||||
mov fs, ax |
||||
mov gs, ax |
||||
|
||||
mov ebp, 0x900000 ; Update the stack pointer |
||||
mov esp, ebp |
||||
|
||||
call BEGIN_PM |
||||
|
||||
BEGIN_PM: |
||||
; Inform of mode switch |
||||
mov ebx, stat_boot_success |
||||
call vga_print |
||||
|
||||
; Execute kernel code |
||||
call KERNEL_OFFSET |
||||
|
||||
jmp $ |
||||
|
||||
[bits 16] |
||||
|
||||
load_kernel: |
||||
mov bx, KERNEL_OFFSET ; Load kernel at the kernel offset |
||||
mov dh, 9 ; Read 15 sectors |
||||
mov dl, [BOOT_DRIVE] ; Drive index |
||||
call disk_read ; Load the kernel |
||||
|
||||
ret |
||||
|
||||
stat_pm_init: db "Entering 32bit Protected Mode...", ASCII_END |
||||
stat_kernel_load: db "Loading kernel into memory...", ASCII_END |
||||
stat_boot_success: db "Booting complete!", ASCII_END |
||||
|
||||
BOOT_DRIVE: db 0 |
||||
|
||||
; Bootsector |
||||
times 510-($-$$) db 0 |
||||
dw 0xaa55 ; magic BIOS numbers |
@ -1,13 +0,0 @@ |
||||
; ASCII EQUs |
||||
ASCII_END equ 0 |
||||
ASCII_BELL equ 7 |
||||
ASCII_BACKSPACE equ 8 |
||||
ASCII_HORIZONTAL_TAB equ 9 |
||||
ASCII_VERTICAL_TAB equ 11 |
||||
ASCII_LINEBREAK equ 10 |
||||
ASCII_CARRIAGE_RETURN equ 13 |
||||
ASCII_CLEAR equ 12 |
||||
|
||||
; Offsets |
||||
ASCII_OFFSET_NUM equ 0x30 |
||||
ASCII_OFFSET_CHAR equ 0x40 |
@ -1,7 +0,0 @@ |
||||
; EQUs (lazy variables) for BIOS stuff |
||||
BIOS_TTY_INT equ 0x10 |
||||
BIOS_TTY_MODE equ 0x0e |
||||
|
||||
BIOS_DISK_INT equ 0x13 |
||||
BIOS_DISK_READ equ 0x02 |
||||
|
@ -1,4 +0,0 @@ |
||||
; VGA EQUs |
||||
|
||||
VIDEO_MEM equ 0xb8000 |
||||
|
@ -1,43 +0,0 @@ |
||||
; GDT |
||||
|
||||
gdt_start: |
||||
|
||||
gdt_null: ; NULL descriptor |
||||
dd 0x0 ; 4-bytes of |
||||
dd 0x0 ; 0x0 (0) = NULL |
||||
|
||||
gdt_code: ; Code SD |
||||
; Range: 0x0 - 0xfffff |
||||
; Flags1: 1001b (present:2 privilege:descriptor type) |
||||
; Type: 1010b (code:conforming:readable:accessed) |
||||
; Flags2: 1100b (granularity:32bit default:64bit seg:AVL) |
||||
|
||||
dw 0xffff ; Limit (bits 0-15) |
||||
dw 0x0 ; Base (bits 0-15) |
||||
db 0x0 ; Base (bits 16-23) |
||||
db 10011010b ; Flags1 : Type |
||||
db 11001111b ; Flags2 : Limit (16-19) |
||||
db 0x0 ; Base (bits 24-31) |
||||
|
||||
gdt_data: ; Data SD |
||||
; Same flags as gdt_code but different type flags |
||||
; Type: 0010b (code:expand dowm:writable:accessed) |
||||
|
||||
dw 0xffff ; Limit (bits 0-15) |
||||
dw 0x0 ; Base (bits 0-15) |
||||
db 0x0 ; Base (bits 16-23) |
||||
db 10010010b ; Flags1 : Type |
||||
db 11001111b ; Flags2 : Limit (16-19) |
||||
db 0x0 ; Base (bits 24-31) |
||||
|
||||
gdt_end: ; Mark the end so we can get the delta-memory (size of GDT) |
||||
|
||||
; GDT descriptor |
||||
gdt_descriptor: |
||||
dw gdt_end - gdt_start - 1 ; GDT size |
||||
dd gdt_start ; GDT pointer |
||||
|
||||
|
||||
; Lazy constants |
||||
GDT_CODE_SEG equ gdt_code - gdt_start |
||||
GDT_DATA_SEG equ gdt_data - gdt_start |
@ -1,27 +0,0 @@ |
||||
[bits 32] |
||||
|
||||
; VGA base address: 0xb8000 |
||||
; Charpos = 0xb8000 + 2(row*80 + col) |
||||
|
||||
vga_color_buf: db 0x0f ; Buffer to be changed so that we can choose colors! |
||||
|
||||
vga_print: |
||||
pusha |
||||
mov edx, VIDEO_MEM |
||||
|
||||
vga_print_loop: |
||||
mov al, [ebx] ; Pointer to char |
||||
mov ah, [vga_color_buf] ; Color code |
||||
|
||||
cmp al, ASCII_END ; Check if end of string |
||||
je vga_print_return ; If end then return |
||||
|
||||
mov [edx], ax ; Move charpos |
||||
inc ebx ; Increment to next |
||||
add edx, 2 |
||||
|
||||
jmp vga_print_loop ; Loop back until end of string |
||||
|
||||
vga_print_return: |
||||
popa |
||||
ret |
@ -1,75 +0,0 @@ |
||||
// VGA Graphics Library
|
||||
#include "vga.h" |
||||
#include "../kernel/io.h" |
||||
#include "../lib/str.h" |
||||
|
||||
static unsigned int cursor_row = 0; |
||||
static unsigned int cursor_col = 0; |
||||
|
||||
void vga_init() { |
||||
// Disable cursor
|
||||
port_outb(0x3d4, 0x0a); |
||||
port_outb(0x3d5, 0x20); |
||||
|
||||
// Clear screen
|
||||
clear_screen(); |
||||
} |
||||
|
||||
/*
|
||||
VGA & Memory Functions |
||||
*/ |
||||
char* get_memory_charpos(unsigned int col, unsigned int row) {
|
||||
return (char*)(VGA_ADDRESS + 2*((row*80) + col));
|
||||
} |
||||
|
||||
void writechar(char c, unsigned int col, unsigned int row, int attribute_byte) { |
||||
if( !attribute_byte )
|
||||
attribute_byte = 0x0f; |
||||
|
||||
char* mem = get_memory_charpos(col, row); |
||||
*mem = c; // Write the character
|
||||
*(mem+1) = attribute_byte; // Write the attribute_byte
|
||||
|
||||
} |
||||
|
||||
void set_cursor_pos(unsigned int col, unsigned int row) { |
||||
cursor_col = col; |
||||
cursor_row = row; |
||||
} |
||||
|
||||
|
||||
/*
|
||||
Graphics Functions |
||||
*/ |
||||
void clear_screen() { |
||||
for( int c = 0; c < MAX_COLS; c++ ) |
||||
for( int r = 0; r < MAX_ROWS; r++ ) |
||||
writechar(0x20, c, r, 0xf0); |
||||
} |
||||
|
||||
/*
|
||||
General Printing Functions |
||||
*/ |
||||
void print(char* str, int attribute_byte) { |
||||
for( char* c = str; *c != '\0'; c++ )
|
||||
writechar(*c, (unsigned int)(c - str) + cursor_col, cursor_row, attribute_byte); |
||||
} |
||||
|
||||
void println(char* str, int attribute_byte) { |
||||
print(str, attribute_byte); |
||||
cursor_row++; // Increment to next y-pos (newline)
|
||||
} |
||||
|
||||
void printalign(char* str, int attribute_byte, enum align alignment) { |
||||
unsigned int strlenbuf = strlen(str); |
||||
|
||||
if( !alignment || alignment == LEFT ) { |
||||
print(str, attribute_byte); |
||||
} else if ( alignment == RIGHT ) { |
||||
set_cursor_pos(MAX_COLS - strlenbuf, cursor_row); |
||||
} else if ( alignment == MIDDLE ) { |
||||
set_cursor_pos((MAX_COLS/2) - (strlenbuf/2), cursor_row); |
||||
} |
||||
|
||||
print(str, attribute_byte); |
||||
} |
@ -1,19 +0,0 @@ |
||||
#define VGA_ADDRESS (char*)0xb8000 |
||||
#define VGA_ADDRESS_MAX (char*)0xb8fa0 |
||||
|
||||
#define MAX_ROWS 25 |
||||
#define MAX_COLS 80 |
||||
|
||||
static unsigned int cursor_row; |
||||
static unsigned int cursor_col; |
||||
|
||||
enum align {LEFT, RIGHT, MIDDLE}; |
||||
|
||||
char* get_memory_charpos(unsigned int col, unsigned int row); |
||||
void writechar(char c, unsigned int col, unsigned int row, int colorcode); |
||||
void clear_screen(); |
||||
void set_cursor_pos(); |
||||
void print(); |
||||
void println(); |
||||
void printalign(char* str, int attribute_byte, enum align alignment); |
||||
void vga_init(); |
@ -1,3 +0,0 @@ |
||||
menuentry "eOS" { |
||||
multiboot /boot/eOS.bin |
||||
} |
@ -1,26 +0,0 @@ |
||||
// Function to read a byte from port
|
||||
unsigned char port_inb(unsigned short port) { |
||||
unsigned char res; |
||||
__asm__("in %%dx, %%al" : "=a" (res) : "d" (port)); |
||||
|
||||
return res; |
||||
} |
||||
|
||||
// to write a byte to port
|
||||
void port_outb(unsigned short port, unsigned char data) { |
||||
__asm__("out %%al, %%dx" : :"a" (data), "d" (port));
|
||||
} |
||||
|
||||
|
||||
// Read word from port
|
||||
unsigned short port_inw(unsigned short port) { |
||||
unsigned short res; |
||||
__asm__("in %%dx, %%ax" : "=a" (res) : "d" (port)); |
||||
|
||||
return res; |
||||
} |
||||
|
||||
// write word to port
|
||||
void port_outw(unsigned short port, unsigned short data) { |
||||
__asm__("out %%ax, %%dx" : :"a" (data), "d" (port)); |
||||
} |
@ -1,5 +0,0 @@ |
||||
unsigned char port_inb(); |
||||
void port_outb(); |
||||
|
||||
unsigned short port_inw(); |
||||
void port_outw(); |
@ -1,24 +0,0 @@ |
||||
#include "memory.h" |
||||
#include "../drivers/vga.h" |
||||
#include "../lib/str.h" |
||||
#include "../lib/strf.h" |
||||
|
||||
void main() { |
||||
vga_init(); // Initialize the screen first
|
||||
// i.e. clear the screen et cetera.
|
||||
|
||||
char* title = "eOS Version 0.2 2021"; |
||||
set_cursor_pos(0, 2); |
||||
printalign(title, 0xf0, MIDDLE); |
||||
|
||||
char* subtitle = "A x86 operating system, licenced under GPL-2.0"; |
||||
set_cursor_pos(0, 3); |
||||
printalign(subtitle, 0xf8, MIDDLE); |
||||
|
||||
|
||||
char* strbuf = "String concat: "; |
||||
char* str2 = "WORKS! :D"; |
||||
strbuf = strcat(strbuf, str2);
|
||||
set_cursor_pos(0, 0); |
||||
println(strbuf, 0xf0); |
||||
} |
@ -1,5 +0,0 @@ |
||||
[bits 32] |
||||
[extern main] |
||||
|
||||
call main |
||||
jmp $ |
@ -1,9 +0,0 @@ |
||||
#include "memory.h" |
||||
|
||||
char* malloc(unsigned int size) { |
||||
return " "; |
||||
} |
||||
|
||||
void mfree(char* p) { |
||||
|
||||
} |
@ -1,2 +0,0 @@ |
||||
char* malloc(unsigned int size); |
||||
void mfree(char* p); |
@ -1,28 +0,0 @@ |
||||
#include "str.h" |
||||
|
||||
unsigned int strlen(char* str) { |
||||
unsigned int len = 0; |
||||
for( char* c = str; *c != '\0'; c++ ) // search for end-of-string
|
||||
len++; |
||||
|
||||
return len; |
||||
} |
||||
|
||||
char* strcat(char* buf, char* str) { |
||||
unsigned int bufferlen = strlen(buf); |
||||
|
||||
// remove the 0x0 char from the buffer
|
||||
*(buf + bufferlen) = 0x3f; // replace end-of-string
|
||||
// with a placeholder
|
||||
|
||||
// concat the str to buf
|
||||
int cc = 0; |
||||
for( char* c = str; *c != '\0'; c++ ) { |
||||
*(buf + bufferlen + cc) = *c; |
||||
cc++; |
||||
} |
||||
|
||||
*(buf + bufferlen + cc) = '\0'; // add end-of-string
|
||||
|
||||
return buf; |
||||
} |
@ -1,2 +0,0 @@ |
||||
unsigned int strlen(char* str); |
||||
char* strcat(char* buf, char* str); |
@ -1,15 +0,0 @@ |
||||
#include "strf.h" |
||||
|
||||
#define int_offset 48 |
||||
// 0:48 - 9:57
|
||||
|
||||
char* int_to_str(int i, char* strbuf) { |
||||
if( i == 0 ) { |
||||
return (char*)(int_offset); |
||||
} else { |
||||
char cbuf; |
||||
cbuf = (char)((i % 10) + int_offset); |
||||
|
||||
return int_to_str(i / 10, strbuf + cbuf); |
||||
} |
||||
} |
@ -1 +0,0 @@ |
||||
char* int_to_str(int i, char* strbuf); |
Before Width: | Height: | Size: 3.3 KiB |
Loading…
Reference in new issue