From 98d796509b13a9670697279074524c4629886d81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alve=20Svar=C3=A9n?= Date: Fri, 17 Sep 2021 13:56:17 +0200 Subject: [PATCH] Remove bad code --- LICENSE | 339 ------------------------------------ README.md | 33 ---- TODO.md | 12 -- bootloader/bios/convert.asm | 41 ----- bootloader/bios/disk.asm | 45 ----- bootloader/bios/print.asm | 51 ------ bootloader/bootloader.asm | 96 ---------- bootloader/equ/ascii.asm | 13 -- bootloader/equ/bios.asm | 7 - bootloader/equ/vga.asm | 4 - bootloader/pm/gdt.asm | 43 ----- bootloader/pm/vga/print.asm | 27 --- drivers/vga.c | 75 -------- drivers/vga.h | 19 -- grub/grub.cfg | 3 - kernel/io.c | 26 --- kernel/io.h | 5 - kernel/kernel.c | 24 --- kernel/kernel_entry.asm | 5 - kernel/memory.c | 9 - kernel/memory.h | 2 - lib/str.c | 28 --- lib/str.h | 2 - lib/strf.c | 15 -- lib/strf.h | 1 - logo.png | Bin 46700 -> 0 bytes preview.png | Bin 3388 -> 0 bytes 27 files changed, 925 deletions(-) delete mode 100644 LICENSE delete mode 100644 README.md delete mode 100644 TODO.md delete mode 100644 bootloader/bios/convert.asm delete mode 100644 bootloader/bios/disk.asm delete mode 100644 bootloader/bios/print.asm delete mode 100644 bootloader/bootloader.asm delete mode 100644 bootloader/equ/ascii.asm delete mode 100644 bootloader/equ/bios.asm delete mode 100644 bootloader/equ/vga.asm delete mode 100644 bootloader/pm/gdt.asm delete mode 100644 bootloader/pm/vga/print.asm delete mode 100644 drivers/vga.c delete mode 100644 drivers/vga.h delete mode 100644 grub/grub.cfg delete mode 100644 kernel/io.c delete mode 100644 kernel/io.h delete mode 100644 kernel/kernel.c delete mode 100644 kernel/kernel_entry.asm delete mode 100644 kernel/memory.c delete mode 100644 kernel/memory.h delete mode 100644 lib/str.c delete mode 100644 lib/str.h delete mode 100644 lib/strf.c delete mode 100644 lib/strf.h delete mode 100644 logo.png delete mode 100644 preview.png diff --git a/LICENSE b/LICENSE deleted file mode 100644 index d159169..0000000 --- a/LICENSE +++ /dev/null @@ -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. - - - Copyright (C) - - 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. - - , 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. diff --git a/README.md b/README.md deleted file mode 100644 index 1f1bee4..0000000 --- a/README.md +++ /dev/null @@ -1,33 +0,0 @@ -

-

A simple & lightweight x86 operating system

- -## -### Building & Running -Use the `Makefile` in order to build the binaries/objects et cetera- with make. -
-**To build the OS image run**: `$ make os-image` -
-**To build the OS image (WITH GRUB) run**: `$ make eOS.iso` -#### Emulation -You can launch eOS with a VM like qemu. 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. -## -
-
-
-
- -### 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) diff --git a/TODO.md b/TODO.md deleted file mode 100644 index 32bdb54..0000000 --- a/TODO.md +++ /dev/null @@ -1,12 +0,0 @@ -# TO DO - - Malloc - - String Library - - - Concat - - Format - - - Scrolling - - Multiboot support (for grub etc) - - Rendering (VGA) - - User input (Keyboard) - - File system? diff --git a/bootloader/bios/convert.asm b/bootloader/bios/convert.asm deleted file mode 100644 index 50643d0..0000000 --- a/bootloader/bios/convert.asm +++ /dev/null @@ -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 diff --git a/bootloader/bios/disk.asm b/bootloader/bios/disk.asm deleted file mode 100644 index 1dbc359..0000000 --- a/bootloader/bios/disk.asm +++ /dev/null @@ -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 diff --git a/bootloader/bios/print.asm b/bootloader/bios/print.asm deleted file mode 100644 index 24b8435..0000000 --- a/bootloader/bios/print.asm +++ /dev/null @@ -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 diff --git a/bootloader/bootloader.asm b/bootloader/bootloader.asm deleted file mode 100644 index 09432ff..0000000 --- a/bootloader/bootloader.asm +++ /dev/null @@ -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 diff --git a/bootloader/equ/ascii.asm b/bootloader/equ/ascii.asm deleted file mode 100644 index 8ae3828..0000000 --- a/bootloader/equ/ascii.asm +++ /dev/null @@ -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 diff --git a/bootloader/equ/bios.asm b/bootloader/equ/bios.asm deleted file mode 100644 index 3294bde..0000000 --- a/bootloader/equ/bios.asm +++ /dev/null @@ -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 - diff --git a/bootloader/equ/vga.asm b/bootloader/equ/vga.asm deleted file mode 100644 index a3f90d7..0000000 --- a/bootloader/equ/vga.asm +++ /dev/null @@ -1,4 +0,0 @@ -; VGA EQUs - -VIDEO_MEM equ 0xb8000 - diff --git a/bootloader/pm/gdt.asm b/bootloader/pm/gdt.asm deleted file mode 100644 index 4c73f1d..0000000 --- a/bootloader/pm/gdt.asm +++ /dev/null @@ -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 diff --git a/bootloader/pm/vga/print.asm b/bootloader/pm/vga/print.asm deleted file mode 100644 index 6d1031e..0000000 --- a/bootloader/pm/vga/print.asm +++ /dev/null @@ -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 diff --git a/drivers/vga.c b/drivers/vga.c deleted file mode 100644 index 48dfa60..0000000 --- a/drivers/vga.c +++ /dev/null @@ -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); -} diff --git a/drivers/vga.h b/drivers/vga.h deleted file mode 100644 index 04306ae..0000000 --- a/drivers/vga.h +++ /dev/null @@ -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(); diff --git a/grub/grub.cfg b/grub/grub.cfg deleted file mode 100644 index c3ebe15..0000000 --- a/grub/grub.cfg +++ /dev/null @@ -1,3 +0,0 @@ -menuentry "eOS" { - multiboot /boot/eOS.bin -} diff --git a/kernel/io.c b/kernel/io.c deleted file mode 100644 index 951ba67..0000000 --- a/kernel/io.c +++ /dev/null @@ -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)); -} diff --git a/kernel/io.h b/kernel/io.h deleted file mode 100644 index 74b7419..0000000 --- a/kernel/io.h +++ /dev/null @@ -1,5 +0,0 @@ -unsigned char port_inb(); -void port_outb(); - -unsigned short port_inw(); -void port_outw(); diff --git a/kernel/kernel.c b/kernel/kernel.c deleted file mode 100644 index 517032e..0000000 --- a/kernel/kernel.c +++ /dev/null @@ -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); -} diff --git a/kernel/kernel_entry.asm b/kernel/kernel_entry.asm deleted file mode 100644 index 3d2fa88..0000000 --- a/kernel/kernel_entry.asm +++ /dev/null @@ -1,5 +0,0 @@ -[bits 32] -[extern main] - -call main -jmp $ diff --git a/kernel/memory.c b/kernel/memory.c deleted file mode 100644 index 8986d54..0000000 --- a/kernel/memory.c +++ /dev/null @@ -1,9 +0,0 @@ -#include "memory.h" - -char* malloc(unsigned int size) { - return " "; -} - -void mfree(char* p) { - -} diff --git a/kernel/memory.h b/kernel/memory.h deleted file mode 100644 index b2b140d..0000000 --- a/kernel/memory.h +++ /dev/null @@ -1,2 +0,0 @@ -char* malloc(unsigned int size); -void mfree(char* p); diff --git a/lib/str.c b/lib/str.c deleted file mode 100644 index d9345e1..0000000 --- a/lib/str.c +++ /dev/null @@ -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; -} diff --git a/lib/str.h b/lib/str.h deleted file mode 100644 index f50e596..0000000 --- a/lib/str.h +++ /dev/null @@ -1,2 +0,0 @@ -unsigned int strlen(char* str); -char* strcat(char* buf, char* str); diff --git a/lib/strf.c b/lib/strf.c deleted file mode 100644 index 65dddc7..0000000 --- a/lib/strf.c +++ /dev/null @@ -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); - } -} diff --git a/lib/strf.h b/lib/strf.h deleted file mode 100644 index 29649bc..0000000 --- a/lib/strf.h +++ /dev/null @@ -1 +0,0 @@ -char* int_to_str(int i, char* strbuf); diff --git a/logo.png b/logo.png deleted file mode 100644 index d401a9d8734c2cc3e1acf4b47c8fd90132ba9e71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46700 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 LmQuBX`RD%wk(>1S diff --git a/preview.png b/preview.png deleted file mode 100644 index 42cc7ae826d73de1d73b5532ecbeafa1d756d61a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3388 zcmeHKSx}P+68?b|K_m>y075b{I)cjSDso9sK@mk14+4ZsK^+w&B$5LZ7!lnONrq)O zRs(SqcN7K)U?3!55QK0h%Ax^62zL;Y5E4lUxrTY)huy7t*($rLtE;-YzlZLwue*Od z9TI4|!Da&h0H#650?q({{r~{z`3e{}{V`16*b;|qrTGPGIng)n_6S0>;ug>fpopPt% zMxMzuM(quO>e(m9UQam!G?R5ME!%tAFWpSE-r864^KfVmv(o2*m3>uYoDMX_wf!7O z?bX-AZezwId;-NsxfCxfuigk8mfAa-Wnp9~O;KWnYDyyU-1zX6P@(hnbk>z9QhJ}b z*(bZQKQL;wzhz7`-&S6HJL%R_up2XIYwsXQ^hFW*Ya+mI0cV1t%O)G?T2?1aYj! zfL-C=@e=PyH@hsh2npsk6=;7Xu12_=JOuzR_Ni|K%4X!4l_;*Cxs)3pv0rhzXzN9O zBQWlnnbAGzw)q{Igi#v@@mFXAlTz-*-m`14sf+|KU1);Byulfvamw zIvyO5FSA`EXmBRq1DtuJRu_SjcGY6<|FGnC&BBmDjfPu#t}HXBA)O~;C|6ClI|*Cb z${Qf( z>#Jcs;BFTPunRx~z_)bsxoPI;MqFXq4?vi^`@8PSBWI$hsQlFlguy2AoFy42sSPT71dyceyU_9MOc0$x!X# zx0=V)6WMtQ>m`AhC%&xl1BY(o_JM^akIz~k#W{Qr8tOV?8UD)zvRjkEh^gT$ET;&f z@e8Q-IS`QtnXiEavj&>0c}WLC2hkA;2a09q$@%q=)0IkO5JnIUg5_M;2&Ke+jPfZt z@Ezy3O3~!|nDl4J=whWQ(e|DzqSc%z%1Rvp6=|fNlXscZ^M;MWjDeY5!qhT@p&VgW zY6JLzAyfP8{vPV7MtRS$S>cw}$<8A764=8H3wNn&tsSYh?~C3x>{-&d>YgV9BM#RY z*g!O*yKg)WZ}97Rq2AFo4LjI&4LSb=0v|F+iq!%()GmF>s?{zUydk(EYAUX%O<%=) z-}ZG;_k~~<{gPxRFH)r{)>?;^{#25CPwLjg- zkQ)h^!T4!4-9tHwud37`#UI_VdF+#s?hR5^=ZLxVI8lT>MBs>4s>*Sp{7h3zE{S$K z8b=pC-R#|s_We}Jzs{QZm`;;2`Sxmf$^Wpf&Jsx#yd>{)@@66Gp$Hc1SR)ToTvUBh^* zLCFJ+HvL+;s-E#eOUnM2LrxIgF&Q>-3?0eWmE~8ArYE6%EzrmON?2t6EdFhvtDExE zt(0g}wz8)%#N~ntb+zs$%q+jy-Y4droz1+!TgeURZ=D@mW+A|(gJ!Q+efj%2BR-^l zakigsEL=sbiJg_h0&p$xv0#>tO3ul3Qs;ZoSwj_$PPT$;v&|l6mDL8{_<_p^!f_<7 zfnO!cFj7~=&#$zF&7`NzMCFLQGmi?PD=?mIAsTnJu^;NSvXqD7Gp=sg>44U#)oP_u zDY`%=EW!4;d|ks`;%z8)=)^oGzM|47Cd9|*sHb@(Z;bI(b!w6HA~XH6`0pRZ>G2+AY%rtKgm6xC{QB%8 zZY{h4FQfBr)ManR<*_{i6FU~g|KMPwvSKlG-mT{rXvEwPN)BQ5j=@lFJ%rd%Pm1DU z)JesO0ITnaC15v=rYm=t{8{Yw=Wyf~l>d3Xd@0?R()~B*$d`Hfzn_S0O?#}NIZa~cd