Compare commits
	
		
			4 Commits
		
	
	
		
			27e99fe4f2
			...
			BasicGraph
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| f0651ef972 | |||
| 405b9468d5 | |||
| 006c902200 | |||
| 2eca761edc | 
							
								
								
									
										17
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								Makefile
									
									
									
									
									
								
							@ -5,7 +5,7 @@ CC = ${HOME}/opt/cross/bin/i686-elf-gcc
 | 
				
			|||||||
CPP = ${HOME}/opt/cross/bin/i686-elf-g++ 
 | 
					CPP = ${HOME}/opt/cross/bin/i686-elf-g++ 
 | 
				
			||||||
CFLAGS =  -ffreestanding -O2 -Wall -Wextra
 | 
					CFLAGS =  -ffreestanding -O2 -Wall -Wextra
 | 
				
			||||||
 | 
					
 | 
				
			||||||
OFILES =  $(BUILD_DIR)/boot.o $(BUILD_DIR)/kterm.o $(BUILD_DIR)/kernel.o  $(BUILD_DIR)/PhysicalMemoryManager.o $(BUILD_DIR)/io.o $(BUILD_DIR)/PageDirectory.o $(BUILD_DIR)/gdtc.o $(BUILD_DIR)/idt.o $(BUILD_DIR)/pic.o $(BUILD_DIR)/string.o
 | 
					OFILES =  $(BUILD_DIR)/boot.o $(BUILD_DIR)/window.o $(BUILD_DIR)/cursor.o $(BUILD_DIR)/kterm.o $(BUILD_DIR)/kernel.o  $(BUILD_DIR)/PhysicalMemoryManager.o $(BUILD_DIR)/io.o  $(BUILD_DIR)/vesa.o $(BUILD_DIR)/PageDirectory.o $(BUILD_DIR)/gdtc.o $(BUILD_DIR)/idt.o $(BUILD_DIR)/pic.o $(BUILD_DIR)/string.o
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SRC_DIR = src
 | 
					SRC_DIR = src
 | 
				
			||||||
BUILD_DIR = build
 | 
					BUILD_DIR = build
 | 
				
			||||||
@ -36,7 +36,9 @@ iso: clean_iso clean build
 | 
				
			|||||||
	grub-mkrescue -o build/barinkOS.iso root
 | 
						grub-mkrescue -o build/barinkOS.iso root
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
test:
 | 
					test:
 | 
				
			||||||
	$(EMULATOR)  -kernel $(BUILD_DIR)/myos.bin -serial stdio -vga std -monitor stdio -display gtk -m 2G -cpu core2duo 
 | 
						$(EMULATOR)  -kernel $(BUILD_DIR)/myos.bin -serial mon:stdio -vga std  -display gtk -m 2G -cpu core2duo # -monitor stdio
 | 
				
			||||||
 | 
					test_iso:
 | 
				
			||||||
 | 
						$(EMULATOR) -cdrom build/barinkOS.iso -serial mon:stdio -vga std -display gtk -m 2G -cpu core2duo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
build_kernel: $(OBJ_LINK_LIST)
 | 
					build_kernel: $(OBJ_LINK_LIST)
 | 
				
			||||||
	$(CC) -T $(SRC_DIR)/kernel//linker.ld -o $(BUILD_DIR)/myos.bin \
 | 
						$(CC) -T $(SRC_DIR)/kernel//linker.ld -o $(BUILD_DIR)/myos.bin \
 | 
				
			||||||
@ -50,7 +52,7 @@ clean:
 | 
				
			|||||||
	rm -f $(BUILD_DIR)/myos.bin $(INTERNAL_OBJS)
 | 
						rm -f $(BUILD_DIR)/myos.bin $(INTERNAL_OBJS)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$(BUILD_DIR)/kernel.o:
 | 
					$(BUILD_DIR)/kernel.o:
 | 
				
			||||||
	$(CPP) -c $(SRC_DIR)/kernel/kernel.cpp -o $(BUILD_DIR)/kernel.o $(CFLAGS) -fno-exceptions -fno-rtti
 | 
						$(CPP) -c $(SRC_DIR)/kernel/kernel.cpp -o $(BUILD_DIR)/kernel.o $(CFLAGS) -fno-exceptions -fno-rtti -fpermissive
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$(BUILD_DIR)/kterm.o:
 | 
					$(BUILD_DIR)/kterm.o:
 | 
				
			||||||
	$(CPP) -c $(SRC_DIR)/kernel/tty/kterm.cpp  -o $(BUILD_DIR)/kterm.o $(CFLAGS) -fno-exceptions -fno-rtti
 | 
						$(CPP) -c $(SRC_DIR)/kernel/tty/kterm.cpp  -o $(BUILD_DIR)/kterm.o $(CFLAGS) -fno-exceptions -fno-rtti
 | 
				
			||||||
@ -85,3 +87,12 @@ $(BUILD_DIR)/string.o:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
$(BUILD_DIR)/PhysicalMemoryManager.o:
 | 
					$(BUILD_DIR)/PhysicalMemoryManager.o:
 | 
				
			||||||
	$(CPP) -c $(SRC_DIR)/kernel/memory/PhysicalMemoryManager.cpp  -o $(BUILD_DIR)/PhysicalMemoryManager.o $(CFLAGS) -fno-exceptions -fno-rtti
 | 
						$(CPP) -c $(SRC_DIR)/kernel/memory/PhysicalMemoryManager.cpp  -o $(BUILD_DIR)/PhysicalMemoryManager.o $(CFLAGS) -fno-exceptions -fno-rtti
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$(BUILD_DIR)/vesa.o:
 | 
				
			||||||
 | 
						$(CPP) -c $(SRC_DIR)/kernel/drivers/vesa/vesa.cpp  -o $(BUILD_DIR)/vesa.o $(CFLAGS) -fno-exceptions -fno-rtti
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$(BUILD_DIR)/window.o:
 | 
				
			||||||
 | 
						$(CPP) -c $(SRC_DIR)/gui/window.cpp  -o $(BUILD_DIR)/window.o $(CFLAGS) -fno-exceptions -fno-rtti
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$(BUILD_DIR)/cursor.o:
 | 
				
			||||||
 | 
						$(CPP) -c $(SRC_DIR)/gui/cursor.cpp  -o $(BUILD_DIR)/cursor.o $(CFLAGS) -fno-exceptions -fno-rtti
 | 
				
			||||||
 | 
				
			|||||||
@ -6,6 +6,9 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
________________________
 | 
					________________________
 | 
				
			||||||
### Screenshot(s)
 | 
					### Screenshot(s)
 | 
				
			||||||
 | 
					 \
 | 
				
			||||||
 | 
					It may not look like much but I am proud of it! We are in graphics mode.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   \
 | 
					   \
 | 
				
			||||||
The first scrolling boot screen. 😲
 | 
					The first scrolling boot screen. 😲
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										
											BIN
										
									
								
								screenshots/BarinkOS_VBE_GRAPHICS.png
									 (Stored with Git LFS)
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								screenshots/BarinkOS_VBE_GRAPHICS.png
									 (Stored with Git LFS)
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										5
									
								
								src/gui/Graphics.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								src/gui/Graphics.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,5 @@
 | 
				
			|||||||
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Graphics {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
							
								
								
									
										7
									
								
								src/gui/Widget.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								src/gui/Widget.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,7 @@
 | 
				
			|||||||
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Widget{
 | 
				
			||||||
 | 
					    virtual void draw();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
							
								
								
									
										17
									
								
								src/gui/cursor.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								src/gui/cursor.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,17 @@
 | 
				
			|||||||
 | 
					#include "cursor.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void Cursor::draw(){
 | 
				
			||||||
 | 
					        for(int i = 0; i <  this->width; i++){
 | 
				
			||||||
 | 
					            for(int j = 0; j <  this->height; j++){
 | 
				
			||||||
 | 
					                if(this->bitmap[j * this->width + i] == 1 ){
 | 
				
			||||||
 | 
					                        putPixel(i + this->x,j + this->y, 0xFF000000);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Cursor::Cursor(int x, int y){
 | 
				
			||||||
 | 
					        this->x = x;
 | 
				
			||||||
 | 
					        this->y = y;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
							
								
								
									
										38
									
								
								src/gui/cursor.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								src/gui/cursor.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,38 @@
 | 
				
			|||||||
 | 
					#pragma once 
 | 
				
			||||||
 | 
					#include "../kernel/drivers/vesa/vesa.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Cursor{
 | 
				
			||||||
 | 
					    public:
 | 
				
			||||||
 | 
					    void draw();
 | 
				
			||||||
 | 
					    Cursor(int x, int y);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private:
 | 
				
			||||||
 | 
					        int x;
 | 
				
			||||||
 | 
					        int y;
 | 
				
			||||||
 | 
					        const int width= 16;
 | 
				
			||||||
 | 
					        const int height= 10;
 | 
				
			||||||
 | 
					        const int bitmap [160] = {
 | 
				
			||||||
 | 
					            0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
							
								
								
									
										33
									
								
								src/gui/window.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								src/gui/window.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,33 @@
 | 
				
			|||||||
 | 
					#include "window.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int Window::getWidth(){
 | 
				
			||||||
 | 
					    return this->rect.width;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int Window::getHeight(){
 | 
				
			||||||
 | 
					    return this->rect.height;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void Window::setWidth(int& width){
 | 
				
			||||||
 | 
					    this->rect.width = width;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					void Window::setHeight(int& height){
 | 
				
			||||||
 | 
					    this->rect.height = height;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int Window::getX(){
 | 
				
			||||||
 | 
					    return this->rect.x;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int Window::getY(){
 | 
				
			||||||
 | 
					    return this->rect.y;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Window::Window (Rect& rect , uint32_t colour){
 | 
				
			||||||
 | 
					    this->rect = rect;
 | 
				
			||||||
 | 
					    this->Background_colour = colour;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void Window::draw(){
 | 
				
			||||||
 | 
					    drawRect(this->getX() , this->getY() , this->getWidth() , this->getHeight() ,this->Background_colour );
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										37
									
								
								src/gui/window.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								src/gui/window.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,37 @@
 | 
				
			|||||||
 | 
					#pragma once
 | 
				
			||||||
 | 
					#include "../kernel/drivers/vesa/vesa.h"
 | 
				
			||||||
 | 
					#include "Widget.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct Rect {
 | 
				
			||||||
 | 
					    int width;
 | 
				
			||||||
 | 
					    int height;
 | 
				
			||||||
 | 
					    int x;
 | 
				
			||||||
 | 
					    int y;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Window : Widget{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					    int getX();
 | 
				
			||||||
 | 
					    int getY();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    int getWidth();
 | 
				
			||||||
 | 
					    int getHeight();
 | 
				
			||||||
 | 
					    void setWidth(int&);
 | 
				
			||||||
 | 
					    void setHeight(int&);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Window (Rect& rect , uint32_t colour);
 | 
				
			||||||
 | 
					    void draw();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					private:
 | 
				
			||||||
 | 
					    Rect rect;
 | 
				
			||||||
 | 
					    uint32_t Background_colour;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
@ -1,18 +1,27 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 * Multiboot 
 | 
					 * Multiboot 
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
.set ALIGN,    1<<0             /* align loaded modules on page boundaries */
 | 
					.set ALIGN,    1<<0             		/* align loaded modules on page boundaries */
 | 
				
			||||||
.set MEMINFO,  1<<1             /* provide memory map */
 | 
					.set MEMINFO,  1<<1             		/* provide memory map */
 | 
				
			||||||
.set FLAGS,    ALIGN | MEMINFO  /* this is the Multiboot 'flag' field */
 | 
					.set VIDEO,	   1<<2						/* provide video mode */
 | 
				
			||||||
.set MAGIC,    0x1BADB002       /* 'magic number' lets bootloader find the header */
 | 
					.set FLAGS,    ALIGN | MEMINFO | VIDEO  /* this is the Multiboot 'flag' field */
 | 
				
			||||||
.set CHECKSUM, -(MAGIC + FLAGS) /* checksum of above, to prove we are multiboot */
 | 
					.set MAGIC,    0x1BADB002       		/* 'magic number' lets bootloader find the header */
 | 
				
			||||||
 | 
					.set CHECKSUM, -(MAGIC + FLAGS) 		/* checksum of above, to prove we are multiboot */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.section .multiboot
 | 
					.section .multiboot
 | 
				
			||||||
.align 4
 | 
					.align 4
 | 
				
			||||||
.long MAGIC
 | 
					.long MAGIC
 | 
				
			||||||
.long FLAGS
 | 
					.long FLAGS
 | 
				
			||||||
.long CHECKSUM
 | 
					.long CHECKSUM
 | 
				
			||||||
 
 | 
					.long 0 # unused
 | 
				
			||||||
 | 
					.long 0 # .
 | 
				
			||||||
 | 
					.long 0 # .
 | 
				
			||||||
 | 
					.long 0 # .
 | 
				
			||||||
 | 
					.long 0 # unused
 | 
				
			||||||
 | 
					.long 0 # set graphics mode
 | 
				
			||||||
 | 
					.long 800 # screen witdh
 | 
				
			||||||
 | 
					.long 600 # screen height
 | 
				
			||||||
 | 
					.long 32 # bpp
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.section .bss
 | 
					.section .bss
 | 
				
			||||||
.align 16
 | 
					.align 16
 | 
				
			||||||
 | 
				
			|||||||
@ -1,76 +1,108 @@
 | 
				
			|||||||
#pragma once 
 | 
					#pragma once 
 | 
				
			||||||
#include "bootloader/multiboot.h"
 | 
					#include "bootloader/multiboot.h"
 | 
				
			||||||
#define CHECK_FLAG(flags, bit) ((flags) & (1 <<(bit)))
 | 
					#define CHECK_FLAG(flags, bit) ((flags) & (1 <<(bit)))
 | 
				
			||||||
 | 
					#include "../gui/window.h"
 | 
				
			||||||
 | 
					#include "../gui/cursor.h"
 | 
				
			||||||
#include "tty/kterm.h"
 | 
					#include "tty/kterm.h"
 | 
				
			||||||
 | 
					#include "drivers/vesa/vesa.h"
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
void CheckMBT ( multiboot_info_t*  mbt  ){
 | 
					void CheckMBT ( multiboot_info_t*  mbt  ){
 | 
				
			||||||
      /* Set MBI to the addresss of the multiboot information structure*/
 | 
					  /* Set MBI to the addresss of the multiboot information structure*/
 | 
				
			||||||
        multiboot_info_t * mbi = (multiboot_info_t *) mbt;
 | 
					  multiboot_info_t * mbi = (multiboot_info_t *) mbt;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /* Print out the flags */
 | 
					  /* Print out the flags */
 | 
				
			||||||
        printf("flags = 0x%x\n", (unsigned) mbi->flags);
 | 
					  printf("flags = 0x%8x\n", (unsigned) mbi->flags);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /* Are mem_* valid? */
 | 
					  /* Are mem_* valid? */
 | 
				
			||||||
        if ( CHECK_FLAG(mbi->flags,0)){
 | 
					  if ( CHECK_FLAG(mbi->flags,0)){
 | 
				
			||||||
            printf("mem_lower = %uKB, mem_upper = %uKB\n");
 | 
					      printf("mem_lower = %uKB, mem_upper = %uKB\n");
 | 
				
			||||||
        }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /* is boot device valid ? */
 | 
					  /* is boot device valid ? */
 | 
				
			||||||
        if (CHECK_FLAG (mbi->flags, 1)){
 | 
					  if (CHECK_FLAG (mbi->flags, 1)){
 | 
				
			||||||
            printf("boot_device = 0x0%x\n", (unsigned) mbi->boot_device);
 | 
					      printf("boot_device = 0x0%x\n", (unsigned) mbi->boot_device);
 | 
				
			||||||
        }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /* is the command line passed? */
 | 
					  /* is the command line passed? */
 | 
				
			||||||
        if (CHECK_FLAG ( mbi->flags,2)){
 | 
					  if (CHECK_FLAG ( mbi->flags,2)){
 | 
				
			||||||
            printf("cmdline = %s\n", (char *) mbi->cmdline);
 | 
					      printf("cmdline = %s\n", (char *) mbi->cmdline);
 | 
				
			||||||
        }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /* Are mods_* valid? */
 | 
					  /* Are mods_* valid? */
 | 
				
			||||||
        if(CHECK_FLAG ( mbi->flags, 3)){
 | 
					  if(CHECK_FLAG ( mbi->flags, 3)){
 | 
				
			||||||
            multiboot_module_t *mod;
 | 
					      multiboot_module_t *mod;
 | 
				
			||||||
            uint32_t i;
 | 
					      uint32_t i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            printf("mods count = %d, mods_addr = 0x%x\n", (int) mbi->mods_count, (int) mbi->mods_addr);
 | 
					      printf("mods count = %d, mods_addr = 0x%x\n", (int) mbi->mods_count, (int) mbi->mods_addr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            for(i = 0, mod = (multiboot_module_t *) mbi->mods_addr; i < mbi->mods_count; i++ , mod++){
 | 
					      for(i = 0, mod = (multiboot_module_t *) mbi->mods_addr; i < mbi->mods_count; i++ , mod++){
 | 
				
			||||||
                printf(" mod start = 0x%x, mod_end = 0x%x, cmdline = %s\n", (unsigned) mod->mod_start, (unsigned) mod->mod_end, (char*) mod->cmdline);
 | 
					          printf(" mod start = 0x%x, mod_end = 0x%x, cmdline = %s\n", (unsigned) mod->mod_start, (unsigned) mod->mod_end, (char*) mod->cmdline);
 | 
				
			||||||
            }
 | 
					      }
 | 
				
			||||||
        }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /* Bits 4 and 5 are mutually exclusive! */
 | 
					  /* Bits 4 and 5 are mutually exclusive! */
 | 
				
			||||||
        if (CHECK_FLAG (mbi->flags, 4) && CHECK_FLAG(mbi->flags, 5)){
 | 
					  if (CHECK_FLAG (mbi->flags, 4) && CHECK_FLAG(mbi->flags, 5)){
 | 
				
			||||||
            printf("Both bits 4 and 5 are set.\n");
 | 
					      printf("Both bits 4 and 5 are set.\n");
 | 
				
			||||||
            return;
 | 
					      return;
 | 
				
			||||||
        }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /* Is the symbol table of a.out valid? */
 | 
					  /* Is the symbol table of a.out valid? */
 | 
				
			||||||
        if (CHECK_FLAG(mbi->flags, 4)){
 | 
					  if (CHECK_FLAG(mbi->flags, 4)){
 | 
				
			||||||
            multiboot_aout_symbol_table_t *multiboot_aout_sym = &(mbi->u.aout_sym);
 | 
					      multiboot_aout_symbol_table_t *multiboot_aout_sym = &(mbi->u.aout_sym);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            printf( "multiboot_aout_symbol_table: tabsize = 0x%0x, strsize = 0x%x, addr = 0x%x\n", 
 | 
					      printf( "multiboot_aout_symbol_table: tabsize = 0x%0x, strsize = 0x%x, addr = 0x%x\n", 
 | 
				
			||||||
            (unsigned) multiboot_aout_sym->tabsize,
 | 
					      (unsigned) multiboot_aout_sym->tabsize,
 | 
				
			||||||
            (unsigned) multiboot_aout_sym->strsize,
 | 
					      (unsigned) multiboot_aout_sym->strsize,
 | 
				
			||||||
            (unsigned) multiboot_aout_sym->addr);
 | 
					      (unsigned) multiboot_aout_sym->addr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /* Is the section header table of ELF valid? */
 | 
					  /* Is the section header table of ELF valid? */
 | 
				
			||||||
        if (CHECK_FLAG(mbi->flags, 5)){
 | 
					  if (CHECK_FLAG(mbi->flags, 5)){
 | 
				
			||||||
            multiboot_elf_section_header_table_t *multiboot_elf_sec = &(mbi->u.elf_sec);
 | 
					      multiboot_elf_section_header_table_t *multiboot_elf_sec = &(mbi->u.elf_sec);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            printf("multiboot_elf_sec: num = %u, size = 0x%x, addr = 0x%x, shnd = 0x%x\n",
 | 
					      printf("multiboot_elf_sec: num = %u, size = 0x%x, addr = 0x%x, shnd = 0x%x\n",
 | 
				
			||||||
            (unsigned) multiboot_elf_sec->num, (unsigned) multiboot_elf_sec->size,
 | 
					      (unsigned) multiboot_elf_sec->num, (unsigned) multiboot_elf_sec->size,
 | 
				
			||||||
            (unsigned) multiboot_elf_sec->addr, (unsigned)  multiboot_elf_sec->shndx);
 | 
					      (unsigned) multiboot_elf_sec->addr, (unsigned)  multiboot_elf_sec->shndx);
 | 
				
			||||||
            
 | 
					      
 | 
				
			||||||
        }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /* Draw diagonal blue line */
 | 
					  /* Draw diagonal blue line */
 | 
				
			||||||
        if (CHECK_FLAG (mbt->flags, 12)){
 | 
					  if (CHECK_FLAG (mbt->flags, 11)){
 | 
				
			||||||
            printf("Can draw!");
 | 
					    printf("Can draw!");
 | 
				
			||||||
        } 
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Init vesa driver
 | 
				
			||||||
 | 
					    initVBEDevice(mbt); 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Fill screen with blue
 | 
				
			||||||
 | 
					                                                // colours AARRGGBB
 | 
				
			||||||
 | 
					    drawRect(0, 0 , VbeModeInfo->width,VbeModeInfo->height, 0xFF0000FF);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Create two windows
 | 
				
			||||||
 | 
					    Rect rect_window1 {};
 | 
				
			||||||
 | 
					    Rect rect_window2 {};
 | 
				
			||||||
 | 
					    rect_window1.height =200;
 | 
				
			||||||
 | 
					    rect_window1.width = 300;
 | 
				
			||||||
 | 
					    rect_window1.x = 50;
 | 
				
			||||||
 | 
					    rect_window1.y = 50;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    rect_window2.height =200;
 | 
				
			||||||
 | 
					    rect_window2.width = 300;
 | 
				
			||||||
 | 
					    rect_window2.x = 300;
 | 
				
			||||||
 | 
					    rect_window2.y = 200;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Window window_1 ( rect_window1, 0xFF00F0FF);
 | 
				
			||||||
 | 
					    Window window_2 (rect_window2, 0xFFAACCDD);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    window_1.draw();
 | 
				
			||||||
 | 
					    window_2.draw();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Cursor cursor (70,100);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    cursor.draw();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
							
								
								
									
										136
									
								
								src/kernel/drivers/vesa/vesa.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										136
									
								
								src/kernel/drivers/vesa/vesa.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,136 @@
 | 
				
			|||||||
 | 
					#include "vesa.h"
 | 
				
			||||||
 | 
					VbeInfoBlock* vbeInfo;
 | 
				
			||||||
 | 
					vbe_mode_info_structure* VbeModeInfo;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void initVBEDevice(multiboot_info_t* mbt){
 | 
				
			||||||
 | 
					    print_serial("initVBEDevice");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    vbeInfo = (VbeInfoBlock*) mbt->vbe_control_info;
 | 
				
			||||||
 | 
					    printf_serial("Signature: %s, V0x%x\n", vbeInfo->VbeSignature, vbeInfo->VbeVersion);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    VbeModeInfo = (vbe_mode_info_structure*) mbt->vbe_mode_info;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    printf_serial("VESA video mode info: Width: %d Height: %d BPP: %d\n", VbeModeInfo->width, VbeModeInfo->height , VbeModeInfo->bpp);
 | 
				
			||||||
 | 
					    printf_serial("VideoMemory Location: 0x%x \n", VbeModeInfo->framebuffer );
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void putPixel( int x, int y , uint32_t colour){
 | 
				
			||||||
 | 
					   // printf_serial("putPixel x: %d, y: %d\n", x, y);
 | 
				
			||||||
 | 
					                    ///fb + mbt->framebuffer_pitch * y + 4 * x ,NOTE: this calculation is very important 
 | 
				
			||||||
 | 
					    *(uint32_t*) (  VbeModeInfo->framebuffer + VbeModeInfo->pitch * y + 4  * x ) = colour;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					void drawLine(int x1, int y1, int x2, int y2, uint32_t colour ){
 | 
				
			||||||
 | 
					    print_serial("drawline\n");
 | 
				
			||||||
 | 
					    // See Bresenham's line algorithm
 | 
				
			||||||
 | 
					    int deltaX = x2 - x1;
 | 
				
			||||||
 | 
					    int deltaY = y2 - y1;
 | 
				
			||||||
 | 
					    int D = 2 * deltaY - deltaX;
 | 
				
			||||||
 | 
					    int y = y1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for ( int x = x1; x < x2; x++){
 | 
				
			||||||
 | 
					      putPixel(x,y, colour);
 | 
				
			||||||
 | 
					      if( D > 0){
 | 
				
			||||||
 | 
					        y +=1;
 | 
				
			||||||
 | 
					        D = D - 2 * deltaX;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      D = D + 2 * deltaY;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					void drawRect ( int x, int y, int width, int height, uint32_t colour ){
 | 
				
			||||||
 | 
					    print_serial("drawRect\n");
 | 
				
			||||||
 | 
					    for ( int i = x; i < x + width; i ++)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      for(int j = y; j < y + height; j++){
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        putPixel(i,j, colour);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void blueDiagnalLineTest(multiboot_info_t* mbt){
 | 
				
			||||||
 | 
					    multiboot_uint32_t color;
 | 
				
			||||||
 | 
					    unsigned i;
 | 
				
			||||||
 | 
					    void *fb = (void *) (unsigned long) mbt->framebuffer_addr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					     switch (mbt->framebuffer_type)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					        case MULTIBOOT_FRAMEBUFFER_TYPE_INDEXED:
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            unsigned best_distance, distance;
 | 
				
			||||||
 | 
					            struct multiboot_color *palette;
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            palette = (struct multiboot_color *) mbt->framebuffer_palette_addr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            color = 0;
 | 
				
			||||||
 | 
					            best_distance = 4*256*256;
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            for (i = 0; i < mbt->framebuffer_palette_num_colors; i++)
 | 
				
			||||||
 | 
					              {
 | 
				
			||||||
 | 
					                distance = (0xff - palette[i].blue) * (0xff - palette[i].blue)
 | 
				
			||||||
 | 
					                  + palette[i].red * palette[i].red
 | 
				
			||||||
 | 
					                  + palette[i].green * palette[i].green;
 | 
				
			||||||
 | 
					                if (distance < best_distance)
 | 
				
			||||||
 | 
					                  {
 | 
				
			||||||
 | 
					                    color = i;
 | 
				
			||||||
 | 
					                    best_distance = distance;
 | 
				
			||||||
 | 
					                  }
 | 
				
			||||||
 | 
					              }
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					          break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        case MULTIBOOT_FRAMEBUFFER_TYPE_RGB:
 | 
				
			||||||
 | 
					          color = ((1 << mbt->framebuffer_blue_mask_size) - 1) 
 | 
				
			||||||
 | 
					            << mbt->framebuffer_blue_field_position;
 | 
				
			||||||
 | 
					          break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        case MULTIBOOT_FRAMEBUFFER_TYPE_EGA_TEXT:
 | 
				
			||||||
 | 
					          color = '\\' | 0x0100;
 | 
				
			||||||
 | 
					          break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        default:
 | 
				
			||||||
 | 
					          color = 0xffffffff;
 | 
				
			||||||
 | 
					          break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      for (i = 0; i < mbt->framebuffer_width
 | 
				
			||||||
 | 
					             && i < mbt->framebuffer_height; i++)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          switch (mbt->framebuffer_bpp)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					            case 8:
 | 
				
			||||||
 | 
					              {
 | 
				
			||||||
 | 
					                multiboot_uint8_t *pixel = (multiboot_uint8_t*)fb + mbt->framebuffer_pitch * i + i;
 | 
				
			||||||
 | 
					                *pixel = color;
 | 
				
			||||||
 | 
					              }
 | 
				
			||||||
 | 
					              break;
 | 
				
			||||||
 | 
					            case 15:
 | 
				
			||||||
 | 
					            case 16:
 | 
				
			||||||
 | 
					              {
 | 
				
			||||||
 | 
					                multiboot_uint16_t *pixel
 | 
				
			||||||
 | 
					                  = (multiboot_uint16_t*)fb + mbt->framebuffer_pitch * i + 2 * i;
 | 
				
			||||||
 | 
					                *pixel = color;
 | 
				
			||||||
 | 
					              }
 | 
				
			||||||
 | 
					              break;
 | 
				
			||||||
 | 
					            case 24:
 | 
				
			||||||
 | 
					              {
 | 
				
			||||||
 | 
					                multiboot_uint32_t *pixel
 | 
				
			||||||
 | 
					                  = (multiboot_uint32_t*)fb + mbt->framebuffer_pitch * i + 3 * i;
 | 
				
			||||||
 | 
					                *pixel = (color & 0xffffff) | (*pixel & 0xff000000);
 | 
				
			||||||
 | 
					              }
 | 
				
			||||||
 | 
					              break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            case 32:
 | 
				
			||||||
 | 
					              {
 | 
				
			||||||
 | 
					                multiboot_uint32_t *pixel
 | 
				
			||||||
 | 
					                  = (multiboot_uint32_t*)fb + mbt->framebuffer_pitch * i + 4 * i;
 | 
				
			||||||
 | 
					                *pixel = color;
 | 
				
			||||||
 | 
					              }
 | 
				
			||||||
 | 
					              break;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										66
									
								
								src/kernel/drivers/vesa/vesa.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										66
									
								
								src/kernel/drivers/vesa/vesa.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,66 @@
 | 
				
			|||||||
 | 
					#pragma once 
 | 
				
			||||||
 | 
					#include <stdint.h>
 | 
				
			||||||
 | 
					#include "../../bootloader/multiboot.h"
 | 
				
			||||||
 | 
					#include "../../serial.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct vbe_mode_info_structure{
 | 
				
			||||||
 | 
					        uint16_t attributes;
 | 
				
			||||||
 | 
					        uint8_t window_a;
 | 
				
			||||||
 | 
					        uint8_t window_b;
 | 
				
			||||||
 | 
					        uint16_t granularity;
 | 
				
			||||||
 | 
					        uint16_t window_size;
 | 
				
			||||||
 | 
					        uint16_t segment_a;
 | 
				
			||||||
 | 
					        uint16_t segment_b;
 | 
				
			||||||
 | 
					        uint32_t win_func_ptr;
 | 
				
			||||||
 | 
					        uint16_t pitch;
 | 
				
			||||||
 | 
					        uint16_t width;
 | 
				
			||||||
 | 
					        uint16_t height;
 | 
				
			||||||
 | 
					        uint8_t w_char;
 | 
				
			||||||
 | 
					        uint8_t y_char;
 | 
				
			||||||
 | 
					        uint8_t planes;
 | 
				
			||||||
 | 
					        uint8_t bpp;
 | 
				
			||||||
 | 
					        uint8_t banks;
 | 
				
			||||||
 | 
					        uint8_t memory_model;
 | 
				
			||||||
 | 
					        uint8_t bank_size;
 | 
				
			||||||
 | 
					        uint8_t image_pages;
 | 
				
			||||||
 | 
					        uint8_t reserved0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        uint8_t red_mask;
 | 
				
			||||||
 | 
					        uint8_t red_position;
 | 
				
			||||||
 | 
					        uint8_t green_mask;
 | 
				
			||||||
 | 
					        uint8_t green_position;
 | 
				
			||||||
 | 
					        uint8_t blue_mask;
 | 
				
			||||||
 | 
					        uint8_t blue_position;
 | 
				
			||||||
 | 
					        uint8_t reserved_mask;
 | 
				
			||||||
 | 
					        uint8_t reserved_position;
 | 
				
			||||||
 | 
					        uint8_t direct_color_attributes;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        uint32_t framebuffer;
 | 
				
			||||||
 | 
					        uint32_t off_screen_mem_off;
 | 
				
			||||||
 | 
					        uint16_t off_screen_mem_size;
 | 
				
			||||||
 | 
					        uint8_t reserved1[206];
 | 
				
			||||||
 | 
					      }__attribute__((packed));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct VbeInfoBlock {
 | 
				
			||||||
 | 
					        char VbeSignature[4];
 | 
				
			||||||
 | 
					        uint16_t VbeVersion;
 | 
				
			||||||
 | 
					        uint16_t OemStringPtr;
 | 
				
			||||||
 | 
					        uint8_t Capabilities;
 | 
				
			||||||
 | 
					        uint16_t VideoModePtr;
 | 
				
			||||||
 | 
					        uint16_t TotalMemory;
 | 
				
			||||||
 | 
					      }__attribute__((packed));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern VbeInfoBlock* vbeInfo;
 | 
				
			||||||
 | 
					extern vbe_mode_info_structure* VbeModeInfo;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void initVBEDevice(multiboot_info_t* mbt);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void blueDiagnalLineTest(multiboot_info_t* mbt);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Primitive drawing functions  
 | 
				
			||||||
 | 
					void putPixel( int x, int y , uint32_t colour);
 | 
				
			||||||
 | 
					void drawLine(int x1, int y1, int x2, int y2, uint32_t colour );
 | 
				
			||||||
 | 
					void drawRect ( int x, int y, int width, int height, uint32_t colour );
 | 
				
			||||||
@ -48,12 +48,13 @@ void initGDT(){
 | 
				
			|||||||
      gdtDescriptor.limit = ((sizeof(SegmentDescriptor ) * 5 ) - 1);
 | 
					      gdtDescriptor.limit = ((sizeof(SegmentDescriptor ) * 5 ) - 1);
 | 
				
			||||||
      gdtDescriptor.base = (unsigned int) &GlobalDescriptorTable;
 | 
					      gdtDescriptor.base = (unsigned int) &GlobalDescriptorTable;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      printf("Hello GDT!\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      LoadGlobalDescriptorTable();
 | 
					      LoadGlobalDescriptorTable();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      while (true)
 | 
					//      while (true)
 | 
				
			||||||
         asm volatile("hlt");
 | 
					//         asm volatile("hlt");
 | 
				
			||||||
      
 | 
					      
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,12 +1,18 @@
 | 
				
			|||||||
#include "kernel.h"
 | 
					#include "kernel.h"
 | 
				
			||||||
#define GB4 524288
 | 
					#define GB4 524288
 | 
				
			||||||
#define GB2 262144
 | 
					#define GB2 262144
 | 
				
			||||||
 | 
					extern "C" void kernel_main (void);
 | 
				
			||||||
 | 
					extern "C" void putPixel(int pos_x, int pos_y, unsigned char VGA_COLOR , unsigned char addr , unsigned char pixelWidth, unsigned pitch );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    extern "C" void early_main(unsigned long magic, unsigned long addr){
 | 
					    extern "C" void early_main(unsigned long magic, unsigned long addr){
 | 
				
			||||||
        /** initialize terminal interface */ 
 | 
					        /** initialize terminal interface */ 
 | 
				
			||||||
        kterm_init();
 | 
					       // kterm_init();
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
 | 
					        printf("Magic flag 0x%8x\n", magic);
 | 
				
			||||||
 | 
					        printf("Magic must be 0x%8x\n", MULTIBOOT_BOOTLOADER_MAGIC);
 | 
				
			||||||
        if (magic != MULTIBOOT_BOOTLOADER_MAGIC){
 | 
					        if (magic != MULTIBOOT_BOOTLOADER_MAGIC){
 | 
				
			||||||
            printf("Invalid magic number: 0x%x\n",  magic);
 | 
					            printf("Invalid magic number: 0x%8x\n",  magic);
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -28,6 +34,9 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        initGDT();
 | 
					        initGDT();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      kernel_main();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
       
 | 
					       
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -36,6 +45,7 @@
 | 
				
			|||||||
        printf("call to init serial\n");
 | 
					        printf("call to init serial\n");
 | 
				
			||||||
        init_serial();
 | 
					        init_serial();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        while (true){
 | 
					        while (true){
 | 
				
			||||||
            //Read time indefinetely 
 | 
					            //Read time indefinetely 
 | 
				
			||||||
            read_rtc();
 | 
					            read_rtc();
 | 
				
			||||||
 | 
				
			|||||||
@ -1,9 +1,10 @@
 | 
				
			|||||||
#pragma once
 | 
					#pragma once
 | 
				
			||||||
 | 
					 | 
				
			||||||
#include "tty/kterm.h"
 | 
					#include "tty/kterm.h"
 | 
				
			||||||
#include "io.h"
 | 
					#include "io.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define PORT 0x3f8 
 | 
					#define PORT 0x3f8 
 | 
				
			||||||
static int init_serial() {
 | 
					
 | 
				
			||||||
 | 
					inline static int init_serial() {
 | 
				
			||||||
   outb(PORT + 1, 0x00);    // Disable all interrupts
 | 
					   outb(PORT + 1, 0x00);    // Disable all interrupts
 | 
				
			||||||
   outb(PORT + 3, 0x80);    // Enable DLAB (set baud rate divisor)
 | 
					   outb(PORT + 3, 0x80);    // Enable DLAB (set baud rate divisor)
 | 
				
			||||||
   outb(PORT + 0, 0x03);    // Set divisor to 3 (lo byte) 38400 baud
 | 
					   outb(PORT + 0, 0x03);    // Set divisor to 3 (lo byte) 38400 baud
 | 
				
			||||||
@ -25,33 +26,95 @@ static int init_serial() {
 | 
				
			|||||||
   return 0;
 | 
					   return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int is_transmit_empty() {
 | 
					inline int is_transmit_empty() {
 | 
				
			||||||
   return inb(PORT + 5) & 0x20;
 | 
					   return inb(PORT + 5) & 0x20;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
void write_serial(char a) {
 | 
					inline void write_serial(char a) {
 | 
				
			||||||
   while (is_transmit_empty() == 0);
 | 
					   while (is_transmit_empty() == 0);
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
   outb(PORT,a);
 | 
					   outb(PORT,a);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int serial_received() {
 | 
					inline int serial_received() {
 | 
				
			||||||
   return inb(PORT + 5) & 1;
 | 
					   return inb(PORT + 5) & 1;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
char read_serial() {
 | 
					inline char read_serial() {
 | 
				
			||||||
   while (serial_received() == 0);
 | 
					   while (serial_received() == 0);
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
   return inb(PORT);
 | 
					   return inb(PORT);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void print_serial(const char* string ){
 | 
					inline void print_serial(const char* string ){
 | 
				
			||||||
    for(size_t i = 0; i < strlen(string); i ++){
 | 
					    for(size_t i = 0; i < strlen(string); i ++){
 | 
				
			||||||
        write_serial(string[i]);
 | 
					        write_serial(string[i]);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void test_serial(){
 | 
					
 | 
				
			||||||
 | 
					inline void printf_serial ( const char *format, ...) {
 | 
				
			||||||
 | 
					   
 | 
				
			||||||
 | 
					    char **arg = (char **)&format;
 | 
				
			||||||
 | 
					    int c;
 | 
				
			||||||
 | 
					    char buf[20];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    arg++;
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    while ((c = *format++) != 0){
 | 
				
			||||||
 | 
					        if( c != '%')
 | 
				
			||||||
 | 
					            write_serial(c);
 | 
				
			||||||
 | 
					        else{
 | 
				
			||||||
 | 
					            char *p, *p2;
 | 
				
			||||||
 | 
					            int pad0 = 0, pad = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            c = *format++;
 | 
				
			||||||
 | 
					            if(c =='0'){
 | 
				
			||||||
 | 
					                pad0 = 1;
 | 
				
			||||||
 | 
					                c = *format++;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if ( c >= '0' && c <= '9'){
 | 
				
			||||||
 | 
					                pad = c - '0';
 | 
				
			||||||
 | 
					                c = *format++;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            switch (c)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					            case 'd':
 | 
				
			||||||
 | 
					             
 | 
				
			||||||
 | 
					            case 'u':
 | 
				
			||||||
 | 
					            case 'x':
 | 
				
			||||||
 | 
					                itoa(buf, c, *((int *) arg++));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                p = buf;
 | 
				
			||||||
 | 
					                goto string;
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            case 's':
 | 
				
			||||||
 | 
					                p = *arg++;
 | 
				
			||||||
 | 
					                if(!p)
 | 
				
			||||||
 | 
					                    p = "(null)";
 | 
				
			||||||
 | 
					                
 | 
				
			||||||
 | 
					                string: 
 | 
				
			||||||
 | 
					                    for (p2 = p; *p2; p2++);
 | 
				
			||||||
 | 
					                    for (; p2 < p + pad; p2++)
 | 
				
			||||||
 | 
					                        write_serial(pad0 ? '0': ' ');
 | 
				
			||||||
 | 
					                    while (*p)
 | 
				
			||||||
 | 
					                        write_serial(*p++);
 | 
				
			||||||
 | 
					                    break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            default:
 | 
				
			||||||
 | 
					                write_serial(*((int *)arg++));
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					inline void test_serial(){
 | 
				
			||||||
        /** Serial test **/
 | 
					        /** Serial test **/
 | 
				
			||||||
        kterm_writestring("Writing to COM1 serial port:");
 | 
					        kterm_writestring("Writing to COM1 serial port:");
 | 
				
			||||||
        init_serial();
 | 
					        init_serial();
 | 
				
			||||||
 | 
				
			|||||||
@ -137,7 +137,7 @@ void kterm_writestring(const char* data ){
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void itoa (char *buf, int base, int d) {
 | 
					void itoa (char *buf, int base, int d) {
 | 
				
			||||||
    char *p = buf;
 | 
					    char *p = buf;
 | 
				
			||||||
    char *p1, *p2;
 | 
					    char *p1, *p2;
 | 
				
			||||||
    unsigned long ud = d;
 | 
					    unsigned long ud = d;
 | 
				
			||||||
@ -174,7 +174,7 @@ static void itoa (char *buf, int base, int d) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void printf ( const char *format, ...) {
 | 
					void printf ( const char *format, ...) {
 | 
				
			||||||
    
 | 
					    return;
 | 
				
			||||||
    char **arg = (char **)&format;
 | 
					    char **arg = (char **)&format;
 | 
				
			||||||
    int c;
 | 
					    int c;
 | 
				
			||||||
    char buf[20];
 | 
					    char buf[20];
 | 
				
			||||||
 | 
				
			|||||||
@ -33,10 +33,9 @@ uint16_t get_cursor_position();
 | 
				
			|||||||
int get_cursor_x (uint16_t cursor_pos);
 | 
					int get_cursor_x (uint16_t cursor_pos);
 | 
				
			||||||
int get_cursor_y (uint16_t cursor_pos);
 | 
					int get_cursor_y (uint16_t cursor_pos);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern "C"  void itoa (char *buf, int base, int d);
 | 
				
			||||||
void printf ( const char *format, ...);
 | 
					void printf ( const char *format, ...);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//static void itoa (char *buf, int base, int d);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define KernelTag "[Kernel]: "
 | 
					#define KernelTag "[Kernel]: "
 | 
				
			||||||
#define AS_KERNEL() (  kterm_setcolor(VGA_COLOR_LIGHT_BLUE),\
 | 
					#define AS_KERNEL() (  kterm_setcolor(VGA_COLOR_LIGHT_BLUE),\
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user