From 072975465989e484f79184da9cb3bcc666c44609 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Fri, 9 Jul 2004 22:00:00 -0400 Subject: [PATCH] Import backup from 2004-07-09 --- .bochsrc | 6 +- Makefile | 136 ++---- boot/Makefile | 32 -- boot/bootdef.inc | 26 -- boot/stage1.asm | 235 ---------- boot/stage2.asm | 978 --------------------------------------- grub.flp | Bin 0 -> 1474560 bytes hos.flp | Bin 0 -> 1474560 bytes include/Makefile | 2 + include/kernel.h | 17 + include/module.h | 16 + include/multiboot.h | 144 ++++++ kernel/Makefile | 77 +-- kernel/asmfuncs.asm | 510 -------------------- kernel/asmfuncs.h | 36 -- kernel/block/fdc.cpp | 9 - kernel/block/fdc.h | 23 - kernel/block/loop.cpp | 22 - kernel/block/loop.h | 22 - kernel/block/rd.cpp | 7 - kernel/block/rd.h | 12 - kernel/boot.asm | 196 ++++++++ kernel/char/keyboard.cpp | 252 ---------- kernel/char/keyboard.h | 53 --- kernel/char/mouse.cpp | 76 --- kernel/char/mouse.h | 17 - kernel/fs/Mount.cpp | 28 -- kernel/fs/Mount.h | 28 -- kernel/fs/devfs.cpp | 25 - kernel/fs/devfs.h | 17 - kernel/fs/vfat.cpp | 113 ----- kernel/fs/vfat.h | 134 ------ kernel/fs/vfs.cpp | 55 --- kernel/fs/vfs.h | 19 - kernel/functions.h | 94 ---- kernel/gdt.inc | 2 +- kernel/hos_defines.cpp | 27 -- kernel/hos_defines.h | 48 -- kernel/idt.inc | 35 +- kernel/kernel.asm | 102 ---- kernel/kernel.c | 25 + kernel/kernel.cpp | 129 ------ kernel/kio.cpp | 227 --------- kernel/kio.h | 29 -- kernel/lang/LinkedList.h | 210 --------- kernel/lang/cstring.cpp | 91 ---- kernel/lang/cstring.h | 19 - kernel/lang/string.cpp | 279 ----------- kernel/lang/string.h | 145 ------ kernel/link.ld | 4 +- kernel/link.ms | 22 - kernel/lst/LDout.doc | 422 ----------------- kernel/lst/asmfuncs.lst | 510 -------------------- kernel/lst/kernel.lst | 492 -------------------- kernel/mm/mm.cpp | 132 ------ kernel/mm/mm.h | 28 -- kernel/mm/vmm.cpp | 380 --------------- kernel/mm/vmm.h | 56 --- kernel/search.bat | 1 - kernel/search.sh | 2 - kernel/sys/cmos.cpp | 42 -- kernel/sys/cmos.h | 18 - kernel/sys/io.cpp | 8 - kernel/sys/io.h | 40 -- kernel/sys/pic.cpp | 30 -- kernel/sys/pic.h | 65 --- kernel/sys/rtc.cpp | 83 ---- kernel/sys/rtc.h | 28 -- kernel/video/stdfont.cpp | 551 ---------------------- kernel/video/stdfont.h | 27 -- kernel/video/video.cpp | 265 ----------- kernel/video/video.h | 72 --- menu.lst | 9 + readme.txt | 74 --- rmmod/Makefile | 0 rmmod/rmmod.asm | 0 76 files changed, 470 insertions(+), 7676 deletions(-) delete mode 100644 boot/Makefile delete mode 100644 boot/bootdef.inc delete mode 100644 boot/stage1.asm delete mode 100644 boot/stage2.asm create mode 100644 grub.flp create mode 100644 hos.flp create mode 100644 include/Makefile create mode 100644 include/kernel.h create mode 100644 include/module.h create mode 100644 include/multiboot.h delete mode 100644 kernel/asmfuncs.asm delete mode 100644 kernel/asmfuncs.h delete mode 100644 kernel/block/fdc.cpp delete mode 100644 kernel/block/fdc.h delete mode 100644 kernel/block/loop.cpp delete mode 100644 kernel/block/loop.h delete mode 100644 kernel/block/rd.cpp delete mode 100644 kernel/block/rd.h create mode 100644 kernel/boot.asm delete mode 100644 kernel/char/keyboard.cpp delete mode 100644 kernel/char/keyboard.h delete mode 100644 kernel/char/mouse.cpp delete mode 100644 kernel/char/mouse.h delete mode 100644 kernel/fs/Mount.cpp delete mode 100644 kernel/fs/Mount.h delete mode 100644 kernel/fs/devfs.cpp delete mode 100644 kernel/fs/devfs.h delete mode 100644 kernel/fs/vfat.cpp delete mode 100644 kernel/fs/vfat.h delete mode 100644 kernel/fs/vfs.cpp delete mode 100644 kernel/fs/vfs.h delete mode 100644 kernel/functions.h delete mode 100644 kernel/hos_defines.cpp delete mode 100644 kernel/hos_defines.h delete mode 100644 kernel/kernel.asm create mode 100644 kernel/kernel.c delete mode 100644 kernel/kernel.cpp delete mode 100644 kernel/kio.cpp delete mode 100644 kernel/kio.h delete mode 100644 kernel/lang/LinkedList.h delete mode 100644 kernel/lang/cstring.cpp delete mode 100644 kernel/lang/cstring.h delete mode 100644 kernel/lang/string.cpp delete mode 100644 kernel/lang/string.h delete mode 100644 kernel/link.ms delete mode 100644 kernel/lst/LDout.doc delete mode 100644 kernel/lst/asmfuncs.lst delete mode 100644 kernel/lst/kernel.lst delete mode 100644 kernel/mm/mm.cpp delete mode 100644 kernel/mm/mm.h delete mode 100644 kernel/mm/vmm.cpp delete mode 100644 kernel/mm/vmm.h delete mode 100755 kernel/search.bat delete mode 100644 kernel/search.sh delete mode 100644 kernel/sys/cmos.cpp delete mode 100644 kernel/sys/cmos.h delete mode 100644 kernel/sys/io.cpp delete mode 100644 kernel/sys/io.h delete mode 100644 kernel/sys/pic.cpp delete mode 100644 kernel/sys/pic.h delete mode 100644 kernel/sys/rtc.cpp delete mode 100644 kernel/sys/rtc.h delete mode 100644 kernel/video/stdfont.cpp delete mode 100644 kernel/video/stdfont.h delete mode 100644 kernel/video/video.cpp delete mode 100644 kernel/video/video.h create mode 100644 menu.lst delete mode 100644 readme.txt create mode 100644 rmmod/Makefile create mode 100644 rmmod/rmmod.asm diff --git a/.bochsrc b/.bochsrc index ed05042..8a4ad77 100644 --- a/.bochsrc +++ b/.bochsrc @@ -5,9 +5,9 @@ megs: 32 romimage: file=/usr/share/bochs/BIOS-bochs-latest, address=0xf0000 vgaromimage: /usr/share/bochs/VGABIOS-lgpl-latest boot: floppy -floppya: 1_44="/dev/fd0", status=inserted +floppya: 1_44="hos.flp", status=inserted # no floppyb -ata0: enabled=0 +ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14 ata1: enabled=0 ata2: enabled=0 ata3: enabled=0 @@ -32,7 +32,7 @@ newharddrivesupport: enabled=1 log: - logprefix: %t%e%d debugger_log: - -panic: action=fatal +panic: action=ask error: action=report info: action=report debug: action=ignore diff --git a/Makefile b/Makefile index 61b3495..0f036b7 100644 --- a/Makefile +++ b/Makefile @@ -1,117 +1,47 @@ -##################################################################### -# Author: Josh Holtrop / Benjamen R. Meyer # -# Date: 02/15/04 Modified: 06/07/04 # -# Purpose: To build Josh Holtrop's OS (HOS) using GNU make # -# Note: This makefile is for use on Linux & other Unix-like systems # -##################################################################### +# Makefile for HOS +# Josh Holtrop +# Created: 07/09/04 -############## -# Variables: # -############## +FLOPPY=/dev/fd0 +FLOPPY_MOUNT=./mnt_flp +FLOPPY_IMAGE=hos.flp +GRUB_IMAGE=grub.flp -# Information for creating a floppy image -# Note: FLOPPY_FS and FLOPPY_FAT_SIZE are related fields. -# FLOPPY_FAT_SIZE should be either 12 or 16, -# depending on if FLOPPY_FS is FAT12 or FAT16, respectively. -MKDOSFS_PROG=mkdosfs -FLOPPY_IMAGE=floppy.img -FLOPPY_BLOCK_COUNT=1440 -FLOPPY_FS=FAT12 -FLOPPY_FAT_SIZE=12 -FLOPPY_MOUNT=./floppy_image - -# Floppy images are good for programs like VMware and Bochs Pentium Emulator. ;-) - -# Program for copying -COPY_BIN=cp - -########################################## -# Build the IPL (Boot Loader) and Kernel # -########################################## all: - # A word of warning to users :-> And a little helpful information ;-) - @echo "Installation must be done as root." - @echo "Type 'make install' to install to a floppy in drive '/dev/fd0'" - @echo "Type 'make install_img' to create a floppy image and install to it." - - make -C boot make -C kernel +# make -C rmmod -################################################# -# Clean up the source directory of any binaries # -################################################# clean: - make -C boot clean make -C kernel clean +# make -C rmmod clean + - rm *~ - -########################################### -# The following is for the floppy drive # -# Note: This must be done on *nix as root # -########################################### - -########################## -# Make install to floppy # -########################## -install: Install_IPL File_Copy - -############################################ -# Write the Stage 1 IPL to the boot sector # -############################################ -Install_IPL: - $(MKDOSFS_PROG) /dev/fd0 - dd if=boot/stage1.bin of=/dev/fd0 - -################################# -# Copy the files onto the drive # -################################# -File_Copy: - - mkdir floppy_mount - @echo "Mounting floppy to ./floppy_mount..." - mount /dev/fd0 ./floppy_mount - - @echo "Copying stage 2 bootloader to the floppy..." - $(COPY_BIN) boot/stage2.bin ./floppy_mount - - @echo "Copying kernel to the floppy..." - $(COPY_BIN) kernel/kernel.bin ./floppy_mount - - @echo "Unmounting floppy..." - umount ./floppy_mount - - rm -rf floppy_mount - - -############################################ -# The following is for the floppy image. # -# Note: This must be done on *nix as root. # -############################################ - -###################################### -# Create and Format the floppy image # -###################################### -install_img: - $(MKDOSFS_PROG) -C -F $(FLOPPY_FAT_SIZE) -r 112 $(FLOPPY_IMAGE) $(FLOPPY_BLOCK_COUNT) - -############################################ -# Write the Stage 1 IPL to the boot sector # -############################################ - @echo "Writing boot sector to image..." - dd if=boot/stage1.bin of=$(FLOPPY_IMAGE) seek=0 - -################################# -# Copy the files onto the image # -################################# +grub: - mkdir $(FLOPPY_MOUNT) - @echo "Mounting floppy image..." - mount $(FLOPPY_IMAGE) $(FLOPPY_MOUNT) -o loop + mke2fs $(FLOPPY) + mount -t ext2 $(FLOPPY) $(FLOPPY_MOUNT) + grub-install --root-directory=$(FLOPPY_MOUNT) fd0 + umount $(FLOPPY_MOUNT) + - rmdir $(FLOPPY_MOUNT) - @echo "Copying stage 2 bootloader to the floppy image..." - $(COPY_BIN) boot/stage2.bin $(FLOPPY_MOUNT) - @echo "Copying kernel to the floppy image..." - $(COPY_BIN) kernel/kernel.bin $(FLOPPY_MOUNT) +grub_image: + dd if=$(FLOPPY) of=$(GRUB_IMAGE) - @echo "Unmounting floppy image..." - mount $(FLOPPY_IMAGE) $(FLOPPY_MOUNT) -o loop +install: + - mkdir $(FLOPPY_MOUNT) + mount -t ext2 $(FLOPPY) $(FLOPPY_MOUNT) + cp kernel/kernel.bin $(FLOPPY_MOUNT) + cp menu.lst $(FLOPPY_MOUNT)/boot/grub + umount $(FLOPPY_MOUNT) + - rmdir $(FLOPPY_MOUNT) +install_img: + - mkdir $(FLOPPY_MOUNT) + cp grub.flp $(FLOPPY_IMAGE) + mount -t ext2 -o loop $(FLOPPY_IMAGE) $(FLOPPY_MOUNT) + cp kernel/kernel.bin $(FLOPPY_MOUNT) + cp menu.lst $(FLOPPY_MOUNT)/boot/grub + umount $(FLOPPY_MOUNT) + - rmdir $(FLOPPY_MOUNT) diff --git a/boot/Makefile b/boot/Makefile deleted file mode 100644 index 83a6ac0..0000000 --- a/boot/Makefile +++ /dev/null @@ -1,32 +0,0 @@ -##################################################################### -# Author: Josh Holtrop / Benjamen R. Meyer # -# Date: 02/15/04 # -# Purpose: To build Josh Holtrop's OS (HOS) using GNU make # -# Note: This makefile is for use on Linux & other Unix-like systems # -##################################################################### - -# Assembler information: -NASM_BIN=nasm - -################# -# Build the IPL # -################# -all: stage1 stage2 - -################ -# IPL: Stage 1 # -################ -stage1: stage1.asm - $(NASM_BIN) stage1.asm -o stage1.bin - -################ -# IPL: Stage 2 # -################ -stage2: stage2.asm - $(NASM_BIN) stage2.asm -o stage2.bin - -######### -# Clean # -######### -clean: - - rm *.bin *~ diff --git a/boot/bootdef.inc b/boot/bootdef.inc deleted file mode 100644 index 7f4e30d..0000000 --- a/boot/bootdef.inc +++ /dev/null @@ -1,26 +0,0 @@ - -%define VERSION "0.03" ;HOS bootloader version - -%define BOOT_FAT_SEG 0x07E0 ;right after boot sector -%define BOOT_ROOT_SEG 0x0900 ;right after FAT -%define BOOT_KERNEL_SEG 0x0AC0 ;right after ROOT_DIR -%define BOOT_STAGE2_SEG 0x0B00 ;right after KERNEL_SEG -%define BOOT_STAGE2_ADD 0xB000 ;address of stage2 to jump to, org at -%define BOOT_KERNEL_ADD 0x106000 ;final pmode kernel destination - physical -%define BOOT_RD_ADD 0x200000 ;2mb for ram disk - -%define BOOT_DATA_SEG 0x9000 ;data gathered by stage2 loader goes here - -%define BOOT_HASRD 0x0000 ;1 -%define BOOT_VESA 0x0002 ;2 - 0 for console, otherwise VESA mode -%define BOOT_VESA_OEM 0x0004 ;258 - null-terminated OEM identification string -%define BOOT_VESA_VBE 0x0106 ;512 - copy of VESA VBEInfoBlock -%define BOOT_VESA_INFO 0x0306 ;256 - copy of VESA ModeInfoBlock for selected mode -%define BOOT_MEMENTRIES 0x040A ;4 - dword = number of memmap entries -%define BOOT_MEMMAP 0x2000 ;? - memory map information - - - -%define BOOT_DRIVE 0x7C24 ;1 - boot drive - - diff --git a/boot/stage1.asm b/boot/stage1.asm deleted file mode 100644 index 730e81e..0000000 --- a/boot/stage1.asm +++ /dev/null @@ -1,235 +0,0 @@ - -;stage1.asm -;This is the stage1 section of the HOS bootloader -;It is 512 bytes to be put on the first sector of a floppy -;Author: Josh Holtrop -;Date: 03/11/04 -;Modified: 05/21/04 - -%include "bootdef.inc" - -[bits 16] - -org 0x7c00 - - jmp short start - -; -------------------------------------------------- -; data portion of the "DOS BOOT RECORD" -; ---------------------------------------------------------------------- -brINT13Flag DB 90H ; 0002h - 0EH for INT13 AH=42 READ -brOEM DB 'MSDOS5.0' ; 0003h - OEM ID - Windows 95B -brBPS DW 512 ; 000Bh - Bytes per sector -brSPC DB 1 ; 000Dh - Sector per cluster -brSc_b4_fat DW 1 ; 000Eh - Reserved sectors -brFATs DB 2 ; 0010h - FAT copies -brRootEntries DW 0E0H ; 0011h - Root directory entries -brSectorCount DW 2880 ; 0013h - Sectors in volume, < 32MB -brMedia DB 240 ; 0015h - Media descriptor -brSPF DW 9 ; 0016h - Sectors per FAT -brSc_p_trk DW 18 ; 0018h - Sectors per head/track -brHPC DW 2 ; 001Ah - Heads per cylinder -brSc_b4_prt DD 0 ; 001Ch - Hidden sectors -brSectors DD 0 ; 0020h - Total number of sectors -brDrive DB 0 ; 0024h - Physical drive no. - DB 0 ; 0025h - Reserved (FAT32) - DB 29H ; 0026h - Extended boot record sig (FAT32) -brSerialNum DD 404418EAH ; 0027h - Volume serial number -brLabel DB 'Holtrops OS' ; 002Bh - Volume label -brFSID DB 'FAT12 ' ; 0036h - File System ID -;------------------------------------------------------------------------ - -start: - jmp 0:jmphere ;ensure that cs=0 and ip=0x7c00... -jmphere: - ;dl=drive number, save it! - xor ax, ax - mov ds, ax - mov [brDrive], dl - cli - mov ss, ax - mov sp, 0x7Bfe ;right under boot sector - sti - - mov ax, 0xb800 - mov ds, ax - mov es, ax - - xor di, di - mov ax, 0x0700 - mov cx, 2000 -cls: - stosw - loop cls - -enable_a20: - in al, 0x64 - test al, 2 - jnz enable_a20 - mov al, 0xD1 - out 0x64, al -ea20_2: in al, 0x64 - and ax, byte 2 - jnz ea20_2 - mov al, 0xDF - out 0x60, al - -unreal: - xor ax, ax - mov es, ax - mov ds, ax - - lgdt [gdtr] ;load gdt - cli - push es - push ds ;save segment values - mov ebx, cr0 - inc bl - mov cr0, ebx ;pmode! - mov ax, KERNEL_DATA - mov es, ax - mov ds, ax ;load segment limits - dec bl - mov cr0, ebx ;back to real mode! - pop ds - pop es ;segments back, with 4gb limits! - sti - -;now lets read in the FAT and root directory so we can search for the stage2 file... - mov ax, 0x0209 ;FAT1 - mov cx, 0x0002 - xor dh, dh - mov dl, [brDrive] - mov bx, BOOT_FAT_SEG - mov es, bx - xor bx, bx - int 0x13 - - mov ax, 0x020E ;root directory - mov cx, 0x0002 ;cyl/sect - mov dh, 0x01 ;head - mov dl, [brDrive] ;drive - mov bx, BOOT_ROOT_SEG - mov es, bx - xor bx, bx - int 0x13 - -;k now read root directory - mov bx, BOOT_ROOT_SEG - mov ds, bx - xor si, si ;k now ds:si points to beginning of root directory - mov es, si - mov cx, 224 ;max root entries -loop_compare: - mov di, stage2 - push cx - push si ;save pointer to root dir entry - mov cx, 11 -loop_name: - cmpsb - loopz loop_name - jnz goon ;cx didn't get to zero, bad file - pop si - pop cx - jmp found_file ;good file, ds:si points to start of root directory entry -goon: - pop si - pop cx - add si, 32 - loop loop_compare - -error: - jmp $ ;halt! no kernel file found! - -found_file: ;ds:si points to root dir entry - xor ax, ax - mov gs, ax - mov ax, BOOT_STAGE2_SEG - mov es, ax - - mov ax, [ds:si+26] - mov bx, BOOT_FAT_SEG - mov ds, bx ;ds points to beginning of FAT - xor di, di - -readstage2_loop: - cmp ax, 0xff7 - jg readstage2_done - inc di - push ax - call getCHSfromCluster - mov ax, 0x0201 - mov dl, [gs:BOOT_DRIVE] - xor bx, bx - int 0x13 - mov bx, es - add bx, 0x0020 - mov es, bx - pop ax ;current logical cluster # - - mov cx, ax ;cx=logical cluster - mov dx, 3 - mul dx - shr ax, 1 ;ax=logical cluster * 3 / 2 - mov si, ax - test cl, 1 ;is bit0 set? - jnz odd_cluster -even_cluster: - lodsw - and ax, 0x0fff - jmp got_cluster -odd_cluster: - lodsw - shr ax, 4 -got_cluster: - jmp readstage2_loop - -readstage2_done: - - jmp 0:BOOT_STAGE2_ADD - -;------------------------------------------------------ -getCHSfromCluster: - ;input: ax=lba of sector on floppy (0-2879) - add ax, 31 ;convert logical cluster# to lba# - xor dx, dx ;lba->chs - mov bx, 18 - div bx - inc dx - mov cl, dl ;sector# (1-18) - xor dx, dx - mov bx, 2 - div bx - mov ch, al ;cylinder# (0-79) - mov dh, dl ;head# (0-1) - ret - - -;------------------------------------------------------- -gdtr: - dw gdt_end-gdt-1 - dd gdt -gdt: - dd 0 - dd 0 - -KERNEL_DATA equ $-gdt - db 0xff ;segment 16 = 4gb data - db 0xff - db 0x00 - db 0x00 - db 0x00 - db 0x92 - db 0xcf ;cf - db 0x00 - -gdt_end: - - - -stage2: db "STAGE2 BIN" - -times 510-($-$$) db 0 - -db 0x55, 0xaa - diff --git a/boot/stage2.asm b/boot/stage2.asm deleted file mode 100644 index 9ebfb79..0000000 --- a/boot/stage2.asm +++ /dev/null @@ -1,978 +0,0 @@ - -;stage2.asm -;This is the stage2 section of the HOS bootloader -;It is to be copied into the normal FAT12 filesystem to be loaded by stage1 -;Author: Josh Holtrop -;Date: 03/11/04 -;Modified: 05/21/04 - -%include "bootdef.inc" - -%define VESA_MODEINFO_SEG 0x0120 -%define VESA_MODELIST_SEG 0x0140 -%define GOOD_MODELIST_SEG 0x0160 - -[bits 16] - -org BOOT_STAGE2_ADD - - -;k now read root directory - mov bx, BOOT_ROOT_SEG - mov ds, bx - xor si, si ;k now ds:si points to beginning of root directory - mov es, si - mov cx, 224 ;max root entries -loop_compare: - mov di, kernel - push cx - push si ;save pointer to root dir entry - mov cx, 11 -loop_name: - cmpsb - loopz loop_name - jnz goon ;cx didn't get to zero, bad file - pop si - pop cx - jmp found_file ;good file, ds:si points to start of root directory entry -goon: - pop si - add si, 32 - pop cx - loop loop_compare - -error: - jmp $ ;halt! no kernel file found! - -found_file: ;ds:si points to root dir entry of kernel file - xor ax, ax - mov gs, ax - mov ax, [ds:si+26] - mov bx, BOOT_FAT_SEG - mov ds, bx ;ds points to beginning of FAT - mov edi, BOOT_KERNEL_ADD - -readkernel_loop: - cmp ax, 0xff7 - jg readkernel_done - push ax - call getCHSfromCluster - mov ax, 0x0201 - mov dl, [gs:BOOT_DRIVE] - mov bx, BOOT_KERNEL_SEG - mov es, bx - xor bx, bx - int 0x13 - mov cx, 256 - xor ax, ax - mov es, ax - mov esi, BOOT_KERNEL_SEG*16 -copykernel_loop: - mov ax, [es:esi] - mov [es:edi], ax - inc esi - inc esi - inc edi - inc edi - loop copykernel_loop - - pop ax ;current logical cluster # - - mov cx, ax ;cx=logical cluster - mov dx, 3 - mul dx - shr ax, 1 ;ax=logical cluster * 3 / 2 - mov si, ax - test cl, 1 ;is bit0 set? - jnz odd_cluster -even_cluster: - lodsw - and ax, 0x0fff - jmp got_cluster -odd_cluster: - lodsw - shr ax, 4 -got_cluster: - jmp readkernel_loop - -;------------------------------------------------------ -readkernel_done: ;-------------put more real mode init stuff here! - ;----ask to load RD from floppy - mov ax, 0xb800 - mov es, ax - xor ax, ax - mov ds, ax - xor di, di - mov cx, 2000 - mov ax, 0x0700 -cls_loop: - stosw - loop cls_loop - - mov dx, 0x3d4 ;move cursor off screen... - mov al, 0x0e - out dx, al - inc dx - mov al, 0xff - out dx, al - dec dx - mov al, 0x0f - out dx, al - inc dx - out dx, al - - xor di, di - mov si, txt_welcome - mov ah, 0x1f - call puts - - mov di, 160 - mov si, txt_rd1 - mov ah, 7 - call puts - - mov si, txt_rd2 - mov di, 160*2 - call puts - - mov di, 160*3 - mov si, txt_input - call puts - -get_rd: - xor ax, ax - int 0x16 - cmp al, '1' - jz got_rd - cmp al, '2' - jnz get_rd -got_rd: - stosb - sub al, '1' - push ds - mov bx, BOOT_DATA_SEG ;segment for data to send kernel - mov ds, bx - mov [ds:BOOT_HASRD], al - pop ds ;ds=0 - cmp al, 0 ;dont load rd - jnz yes_rd - jmp no_rd -yes_rd: - mov cx, 80 - mov edi, 0xb8000+160*4 -filler_loop: ;draw a red bar - mov word [ds:edi], 0x0400+177 - inc edi - inc edi - loop filler_loop - - mov cx, 80 ;80 cylinders to read - xor si, si ;start at cylinder 0 - mov edi, BOOT_RD_ADD ;ram disk address -read_cylinder: - push cx - - mov bx, 0x0100 ;read sectors from head 0 - mov es, bx - xor bx, bx ;es:bx = data buffer for read - mov ax, 0x0212 ;ah = int 0x13 function 2, al = number of sectors to read - mov cx, si ;what cyl. we are on is now in cx - mov ch, cl ;ch = cyl. number - mov cl, 1 ;cl = sector number 1-63 - xor dx, dx ;dh = head number - mov dl, [gs:BOOT_DRIVE] ;dl = drive number - int 0x13 - - mov bx, 0x0100 ;now read sectors from head 1 - mov es, bx - mov bx, 9216 ;es:bx = data buffer for read - mov ax, 0x0212 ;ah = int 0x13 function 2, al = number of sectors to read - mov cx, si ;what cyl. we are on is now in cx - mov ch, cl ;ch = cyl. number - mov cl, 1 ;cl = sector number 1-63 - mov dh, 1 ;dh = head number - mov dl, [gs:BOOT_DRIVE] ;dl = drive number - int 0x13 - - mov ebx, 0xb8000 - add bx, si - shl bl, 1 - mov word [ds:ebx+160*4], 0x0200+219 - - push si - mov esi, 0x1000 - mov cx, 0x2400 -copydisk_loop: - mov ax, [ds:esi] - inc esi - inc esi - mov [ds:edi], ax - inc edi - inc edi - loop copydisk_loop - - pop si ;what cylinder# we are on... - inc si - pop cx - loop read_cylinder - -;------------------------------------------------------ -no_rd: - mov ax, BOOT_DATA_SEG - mov es, ax - mov di, BOOT_MEMMAP ;store memmap info in es:di for kernel - xor edx, edx - mov ax, 0x0100 - mov ds, ax - xor ebx, ebx -getmemmap_loop: - push es - push di - push edx - mov ax, 0x0100 ;get memory map - mov es, ax - xor di, di - mov eax, 0x0000E820 - mov ecx, 0x00000014 - ;mov ebx, 0x00000000 - mov edx, 0x534D4150 ;'SMAP' - int 0x15 - jc getmemmap_carry - cmp eax, 0x534D4150 ;eax should be 'SMAP' on return... - jnz getmemmap_error - cmp ebx, 0 - jz getmemmap_done - - pop edx ;now, copy memmap entry to es:di on the stack - pop di - pop es - xor si, si - mov cx, 20 -getmemmap_copymem_loop: - lodsb - stosb - loop getmemmap_copymem_loop - inc edx - jmp getmemmap_loop - -getmemmap_error: - mov ax, 0xb800 - mov es, ax - mov di, 160*24 - xor ax, ax - mov ds, ax - mov si, txt_memerror - mov ah, 0x04 - call puts - hlt - jmp $ - -getmemmap_carry: - dec edx -getmemmap_done: - pop edx - pop di - pop es - - xor si, si - mov cx, 20 -getmemmap_done_copymem_loop: - lodsb - stosb - loop getmemmap_done_copymem_loop - inc edx - - mov di, BOOT_MEMENTRIES - mov [es:di], edx ;save # of memmap entries for kernel - - ;on to vesa info... - xor ax, ax - mov gs, ax - mov ds, ax - mov ax, 0xb800 - mov es, ax - mov di, 160 - mov cx, 2000-80 - mov ax, 0x0700 -cls_vesa_loop: - stosw - loop cls_vesa_loop - mov si, txt_vesa - mov di, 160*1 - mov ah, 7 - call puts - - push di - mov ax, 0x0100 - mov es, ax - xor di, di - mov dword [es:di], "2EBV" - mov ax, 0x4F00 - - int 0x10 - pop di - cmp ax, 0x004F - jz vesa_good - mov si, txt_novesa - mov ax, 0xb800 - mov es, ax - mov ah, 7 - call puts - mov ax, BOOT_DATA_SEG - mov ds, ax - mov word [ds:BOOT_VESA], 0 - jmp vesa_done -vesa_good: - mov ax, 0xb800 - mov es, ax - mov ax, 0x0100 - mov ds, ax - xor si, si - mov bx, [4] - mov al, bh - call puthex - mov al, '.' - stosb - mov al, 7 - stosb - mov al, bl - call puthex - add di, 4 - cmp bh, 2 - jge vesa_good2 - xor ax, ax - mov ds, ax - mov si, txt_vesaold - mov ah, 7 - call puts - mov ax, BOOT_DATA_SEG - mov ds, ax - mov word [ds:BOOT_VESA], 0 - jmp vesa_done -vesa_good2: - mov ebx, [6] ;something like 0x00000E60 - mov edx, [14] - mov si, bx - shr ebx, 16 - mov ds, bx ;ds:si points to null-terminated OEM identification string - mov ah, 2 - push si - call puts - pop si - mov ax, BOOT_DATA_SEG - mov es, ax - mov di, BOOT_VESA_OEM -vesa_copyoem: - lodsb - stosb - or al, al - jnz vesa_copyoem - mov ax, 0x0100 - mov ds, ax - xor si, si - mov di, BOOT_VESA_VBE - mov cx, 512 -vesa_copyvbe: - lodsb - stosb - loop vesa_copyvbe - - mov si, dx - shr edx, 16 - mov ds, dx ;ds:si points to video mode list - mov ax, VESA_MODELIST_SEG - mov es, ax - xor di, di -vesa_copymodes: - lodsw - stosw - cmp ax, 0xffff - jnz vesa_copymodes - - mov ax, GOOD_MODELIST_SEG - mov es, ax - xor di, di - mov cx, 256 - mov ax, 0xffff -clear_good_mode_list_loop: - stosw - loop clear_good_mode_list_loop - - mov ax, VESA_MODELIST_SEG - mov ds, ax - xor si, si ;ds:si points to video mode list where we can edit it :) - mov ax, GOOD_MODELIST_SEG - mov es, ax - xor di, di - xor dx, dx ;dx=what good mode # we are on -vesa_readmodeinfo_loop: - lodsw - cmp ax, 0xffff - jz vesa_endofmodes - push ax ;save mode# - call checkmode - cmp ax, 0 - jz vesa_readmodeinfo_good - pop ax - jmp vesa_readmodeinfo_loop -vesa_readmodeinfo_good: - pop ax ;restore mode# - stosw - call vesa_showmodeinfo - inc dx - jmp vesa_readmodeinfo_loop - -vesa_endofmodes: ;here we have a list of good modes at GOOD_MODELIST_SEG:0 - xor ax, ax - mov ds, ax - mov si, txt_consolemode - mov ax, 0xb800 - mov es, ax - mov di, 160*2 - mov ah, 7 - call puts - mov di, 160*3 - mov cx, dx - mov al, 'b' -vesa_displaylabels: - stosb - push ax - mov al, 7 - stosb - mov al, '.' - stosb - mov al, 7 - stosb - pop ax - inc al - add di, 160-4 - loop vesa_displaylabels ;done drawing screen of VESA choices, now ask for one - ;valid options are 'a' through (al-1) - mov bl, al - xor ax, ax - mov ds, ax - mov di, 160*24 - mov si, txt_input - mov ah, 14 - call puts -vesa_getchoice: - xor ax, ax - int 0x16 - cmp al, 'a' - jl vesa_getchoice - cmp al, bl - jge vesa_getchoice - stosb - push ax - mov al, 14 - stosb - pop ax - xor ah, ah - sub ax, 'a' - cmp ax, 0 - jz vesa_consolemode_only - mov cx, ax ;cx holds good mode# (1=first good vesa mode) - dec cx - mov ax, GOOD_MODELIST_SEG - mov ds, ax - shl cx, 1 - mov si, cx ;ds:si points to word containing selected mode# - lodsw - mov cx, ax - mov dx, ax ;cx and dx hold mode# - - mov ax, VESA_MODEINFO_SEG - mov es, ax - xor di, di - mov ax, 0x4F01 - int 0x10 - call checkvesa - - mov ax, VESA_MODEINFO_SEG - mov ds, ax - xor si, si - mov ax, BOOT_DATA_SEG - mov es, ax - mov di, BOOT_VESA_INFO - mov cx, 256 -vesa_copymodeinfo_loop: - lodsb - stosb - loop vesa_copymodeinfo_loop ;store ModeInfoBlock for current - - mov [es:BOOT_VESA], dx ;store mode# for kernel - -; mov ax, 0xb800 -; mov es, ax -; xor di, di -; mov al, dh -; call puthex2 -; mov al, dl -; call puthex2 - - mov bx, dx - or bx, 0x4000 ;set "use LFB" bit of mode# - mov ax, 0x4F02 - int 0x10 ;switch to graphics mode!!! - call checkvesa - - jmp vesa_done - -vesa_consolemode_only: - mov ax, BOOT_DATA_SEG - mov es, ax - mov word [es:BOOT_VESA], 0 - - jmp vesa_done - -;------------------------------------------------------ -vesa_showmodeinfo: - pusha - push es - push ds - mov ax, VESA_MODEINFO_SEG - mov ds, ax - xor si, si - mov ax, 0xb800 - mov es, ax - - mov cx, dx - - mov ax, 160 - mul dx ;ax=160*mod# - add ax, 160*3+6 ;offset first line of modes and room on left for label - mov di, ax - - mov ax, [ds:18] - call console_putDec - add di, 10 - mov al, 'x' - call console_putChar - inc di - inc di - mov ax, [ds:20] - call console_putDec - add di, 10 - mov al, 'x' - call console_putChar - inc di - inc di - xor ah, ah - mov al, [ds:25] - call console_putDec - add di, 8 - mov al, [ds:0] - test al, 0x80 - jz vesa_showmodeinfo_done - mov al, 'L' - call console_putChar - mov al, 'F' - call console_putChar - mov al, 'B' - call console_putChar - inc di - inc di - mov ebx, [ds:40] - mov eax, ebx - shr eax, 24 - call puthex2 - mov eax, ebx - shr eax, 16 - call puthex2 - mov al, bh - call puthex2 - mov al, bl - call puthex2 -vesa_showmodeinfo_done: - pop ds - pop es - popa - ret - -;------------------------------------------------------ -checkmode: - push bx - push cx - push dx - push es - push ds - push di - push si - mov cx, ax ;cx=modenumber - mov ax, VESA_MODEINFO_SEG - mov es, ax - xor di, di - mov ax, 0x4F01 - int 0x10 - call checkvesa - xor di, di ;es:di -> ModeInfoBlock struc - mov ax, [es:di] ;ModeAttributes - test al, 1 ;mode supported - jz vesa_modenogood - test al, 8 ;color mode - jz vesa_modenogood - test al, 0x10 ;graphics mode - jz vesa_modenogood - test al, 0x80 ;Linear Frame Buffer supported - jz vesa_modenogood - mov al, [es:di+25] ;BitsPerPixel - cmp al, 16 - jz vesa_bppok - cmp al, 24 - jz vesa_bppok - cmp al, 32 - jnz vesa_modenogood -vesa_bppok: - mov ax, [es:di+18] ;XResolution - mov bx, [es:di+20] ;YResolution - cmp ax, 640 ;640x480 - jnz res_goon1 - cmp bx, 480 - jnz vesa_modenogood - jmp vesa_modegood -res_goon1: - cmp ax, 800 - jnz res_goon2 - cmp bx, 600 - jnz vesa_modenogood - jmp vesa_modegood -res_goon2: - cmp ax, 1024 - jnz res_goon3 - cmp bx, 768 - jnz vesa_modenogood - jmp vesa_modegood -res_goon3: - cmp ax, 1280 - jnz res_goon4 - cmp bx, 1024 - jz vesa_modegood - cmp bx, 960 - jz vesa_modegood - jmp vesa_modenogood -res_goon4: - cmp ax, 1600 - jnz vesa_modenogood - cmp bx, 1200 - jnz vesa_modenogood -vesa_modegood: - pop si - pop di - pop ds - pop es - pop dx - pop cx - pop bx - xor ax, ax - ret -vesa_modenogood: - pop si - pop di - pop ds - pop es - pop dx - pop cx - pop bx - mov ax, 0xffff - ret - -;------------------------------------------------------ -vesa_done: - -; xor ax, ax ;wait for keypress... -; int 0x16 - - jmp go_pm - -;------------------------------------------------------ -puts: - lodsb - or al, al - jz puts_done - stosb - mov al, ah - stosb - jmp puts -puts_done: - ret - -;------------------------------------------------------ -checkvesa: - cmp ax, 0x004F - jnz vesaerror - ret -vesaerror: - mov ax, 0xb800 - mov es, ax - xor ax, ax - mov ds, ax - mov si, txt_vesaerror - mov di, 160*24 - mov ah, 4 - call puts - cli - hlt - -;-------Function console_putDec -;input: -; AX = number to display -;output: -; number written in decimal to es:di -console_putDec: - pusha - xor dx, dx - xor bh, bh ;no characters written yet - mov cx, 10000 - div cx ;ax=quotiont, dx=remainder - add ax, '0' - cmp ax, '0' - je .goon1 - call console_putChar - mov bh, 1 - -.goon1: - mov ax, dx ;load remainder to ax - xor dx, dx - mov cx, 1000 - div cx ;ax=quotiont, dx=remainder - add ax, '0' - cmp ax, '0' - je .goon11 - call console_putChar - mov bh, 1 - jmp .goon2 -.goon11: - cmp bh, 0 - je .goon2 - call console_putChar - -.goon2: - mov ax, dx ;load remainder to ax - xor dx, dx - mov cx, 100 - div cx ;ax=quotiont, dx=remainder - add ax, '0' - cmp ax, '0' - je .goon21 - call console_putChar - mov bh, 1 - jmp .goon3 -.goon21: - cmp bh, 0 - je .goon3 - call console_putChar - -.goon3: - mov ax, dx ;load remainder to ax - xor dx, dx - mov cx, 10 - div cx ;ax=quotiont, dx=remainder - add ax, '0' - cmp ax, '0' - je .goon31 - call console_putChar - mov bh, 1 - jmp .goon4 -.goon31: - cmp bh, 0 - je .goon4 - call console_putChar -.goon4: ;here dx contains last remainder - mov ax, dx - add ax, '0' - call console_putChar - - popa - ret - -;------------------------------------------------------ -console_putChar: - stosb - mov al, 7 - stosb - ret - -;------------------------------------------------------ -puthex: - ;es:di points to video memory - ;al holds hex value - - push ax - mov ah, al - shr ax, 4 - and al, 0x0F - add al, '0' - cmp al, '9' - jle puthex_goon1 - add al, 'A'-'9'-1 -puthex_goon1: - cmp al, '0' - jz puthex_skipzero - stosb - mov al, 7 - stosb -puthex_skipzero: - pop ax - push ax - and al, 0x0F - add al, '0' - cmp al, '9' - jle puthex_goon2 - add al, 'A'-'9'-1 -puthex_goon2: - stosb - mov al, 7 - stosb - pop ax - ret - -;------------------------------------------------------ -puthex2: - ;es:di points to video memory, always displays 2 characters! - ;al holds hex value - - push ax - mov ah, al - shr ax, 4 - and al, 0x0F - add al, '0' - cmp al, '9' - jle puthex2_goon1 - add al, 'A'-'9'-1 -puthex2_goon1: - stosb - mov al, 7 - stosb - pop ax - push ax - and al, 0x0F - add al, '0' - cmp al, '9' - jle puthex2_goon2 - add al, 'A'-'9'-1 -puthex2_goon2: - stosb - mov al, 7 - stosb - pop ax - ret - -;------------------------------------------------------ -txt_welcome: db " HOS bootloader v", VERSION, "! ", 0 -txt_rd1: db "1. Do not load an initial ram disk", 0 -txt_rd2: db "2. Load initial ram disk from boot media", 0 -txt_input: db "Enter your selection: ", 0 -txt_vesa: db "VESA version: ", 0 -txt_vesaerror: db "VESA function call error! Halting system!", 0 -txt_novesa: db "VESA not found. Starting in console mode...", 0 -txt_vesaold: db "VESA version 2.0 required. Starting in console mode...", 0 -txt_consolemode: db "a. Console mode only.", 0 -txt_memerror: db "Extended Memory Map information unavailable! Halting system...", 0 - -;------------------------------------------------------ -getCHSfromCluster: - ;input: ax=lba of sector on floppy (0-2879) - add ax, 31 ;convert logical cluster# to lba# - xor dx, dx ;lba->chs - mov bx, 18 - div bx - inc dx - mov cl, dl ;sector# (1-18) - xor dx, dx - mov bx, 2 - div bx - mov ch, al ;cylinder# (0-79) - mov dh, dl ;head# (0-1) - ret - - -;------------------------------------------------------- -gdtr: - dw gdt_end-gdt-1 - dd gdt -gdt: - dd 0 - dd 0 - -KERNEL_CODE equ $-gdt - db 0xff ;limit 7:0 - db 0xff ;limit 15:8 - db 0x00 ;base 7:0 - db 0x00 ;base 15:8 - db 0x00 ;base 23:16 - db 0x9a ;access - db 0xcf ;flags / limit 19:16 - db 0x00 ;base 31:24 - -KERNEL_DATA equ $-gdt - db 0xff ;segment 16 = 4gb data - db 0xff - db 0x00 - db 0x00 - db 0x00 - db 0x92 - db 0xcf - db 0x00 - -gdt_end: - - -;------------------------------------------------------- -gdtr32: - dw gdt_end32-gdt32-1 - dd gdt32 -gdt32: - dd 0 - dd 0 - - ;a base of 0x4000_0000, when added to 0xC000_0000 will produce 0x0000_0000 physical before paging in effect -KERNEL_CODE32 equ $-gdt32 - db 0xff ;limit 7:0 - db 0xff ;limit 15:8 - db 0x00 ;base 7:0 - db 0x00 ;base 15:8 - db 0x00 ;base 23:16 - db 0x9a ;access - db 0xcf ;flags / limit 19:16 - db 0x40 ;base 31:24 - -KERNEL_DATA32 equ $-gdt32 - db 0xff ;segment 16 = 4gb data - db 0xff - db 0x00 - db 0x00 - db 0x00 - db 0x92 - db 0xcf - db 0x40 - -gdt_end32: - -;------------------------------------------------------ -go_pm: - xor ax, ax - mov ds, ax - lgdt [gdtr] - cli - mov eax, cr0 - inc eax - mov cr0, eax - - jmp KERNEL_CODE:pmode - -bits 32 -pmode: - lgdt [gdtr32] - jmp KERNEL_CODE32:pmode_offsetted+0xC0000000 - -pmode_offsetted: - mov ax, KERNEL_DATA32 - mov es, ax - mov ds, ax - mov fs, ax - mov gs, ax - jmp KERNEL_CODE:BOOT_KERNEL_ADD+0xC0000000 - -kernel: db "KERNEL BIN", 0 - - diff --git a/grub.flp b/grub.flp new file mode 100644 index 0000000000000000000000000000000000000000..4a5b01223bf82a3d6131e858f336f3abe004dfe1 GIT binary patch literal 1474560 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 zPy`eKML-cy1QY>9KoL*`6ahs*5l{pa0YyL&Py`eKML-cy1QY>9KoL*`6ahs*5l{pa z0YyL&Py`eKML-cy1QY>9KoL*`6ahs*5l{pa0YyL&Py`eKML-cy1QY>9KoL*`6ahs* z5l{pa0YyL&Py`eKML-cy1QY>9KoL*`6ahs*5l{pa0YyL&Py`eKML-cy1QY>9KoL*` z6ahs*5l{pa0YyL&Py`eKML-cy1QY>9KoL*`6ahs*5l{pa0YyL&Py`eKML-cy1QY>9 zKoL*`6ahs*5l{pa0YyL&Py`eKML-cy1QY>9KoL*`6ahs*5l{pa0YyL&Py`eKML-cy z1QY>9KoL*`6ahs*5l{pa0YyL&Py`eKML-cy1QY>9KoL*`6ahs*5l{pa0YyL&Py`eK zML-cy1QY>9KoL*`6ahs*5l{pa0YyL&Py`eKML-cy1QY>9KoL*`6ahs*5l{pa0YyL& zPy`eKML-cy1QY>9KoL*`6ahs*5l{pa0YyL&Py`eKML-cy1QY>9KoL*`6ahs*5l{pa z0YyL&Py`eKML-cy1QY>9KoL*`6ahs*5l{pa0YyL&Py`eKML-cy1QY>9KoL*`6ahs* z5l{pa0YyL&Py`eKML-cy1QY>9KoL*`6ahs*5l{pa0YyL&Py`eKML-cy1QY>9KoL*` z6ahs*5l{pa0YyL&Py`eKML-cy1QY>9KoL*`6ahs*5l{pa0YyL&Py`eKML-cy1QY>9 zKoL*`6ahs*5l{pa0YyL&Py`eKML-cy1QY>9KoL*`6ahs*5l{pa0YyL&Py`eKML-cy z1QY>9KoL*`6ahs*5l{pa0YyL&Py`eKML-cy1QY>9KoL*`6ahs*5l{pa0YyL&Py`eK zML-cy1QY>9KoL*`6ahs*5l{pa0YyL&Py`eKML-cy1QY>9KoL*`6ahs*5l{pa0YyL& zPy`eKML-cy1QY>9KoL*`6ahs*5l{pa0YyL&Py`eKML-cy1QY>9KoL*`6ahs*5l{pa z0YyL&Py`eKML-cy1QY>9KoL*`6ahs*5l{pa0YyL&Py`eKML-cy1QY>9KoL*`6ahs* z5l{pa0YyL&Py`eKML-cy1QY>9KoL*`6ahs*5l{pa0YyL&Py`eKML-cy1QY>9KoL*` z6ahs*5l{pa0YyL&Py`eKML-cy1QY>9KoL*`6ahs*5l{pa0YyL&Py`eKML-cy1QY>9 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

yg=>rD-{&C>12fUQ|NLsb{ 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 z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ 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%0A7uJZJY#kIoM%o)A*3gnv0C{7^{v%Oexs zzrWJbUKNNm9?==7RrS4_UB~?Gl2qNno9$9_pWZn!RkK^!@m;+s-rw+r_U(TE= zzTH~qRkn#LeA{ndYOfvRmcx2f>R@W`0>46^#RdN2QuY+C5~+@+^AO>~=cWEY^GITT z*q$9Ye=v2wM%NE2JY;vWQ+46OQEq6dYUFwOeE&u<-}8DrM5ng<$ge48-HULAw`nhX zu%wvfb#azk7gSLm8(2{1C!2rHLH3m$L@Bj{9G#?RE6x`EeBDahZ7PGQ-GBS6e=am? zEY!Npw*2h&oPAJRyLi=_1yNUcrgU1=+m%V@GSSv_XTGVasn&J&8>ba50%c1 z@|!YIF4LOrX|tDnwlB)IM=kawYBW3Q%teKs%{|$zJxvz(nSK^&-siZcmcDkAb0=>; z(-tGwSvz7GWSu$t8Tl#i5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5J2GnrojIOAWRnb literal 0 HcmV?d00001 diff --git a/hos.flp b/hos.flp new file mode 100644 index 0000000000000000000000000000000000000000..dcdeeb87a52811e7750acff39300740a81bee222 GIT binary patch literal 1474560 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 z1QY>9KoL*`6ahs*5l{pa0YyL&Py`eKML-cy1QY>9KoL*`6ahs*5l{pa0YyL&Py`eK zML-cy1QY>9KoL*`6ahs*5l{pa0YyL&Py`eKML-cy1QY>9KoL*`6ahs*5l{pa0YyL& zPy`eKML-cy1QY>9KoL*`6ahs*5l{pa0YyL&Py`eKML-cy1QY>9KoL*`6ahs*5l{pa z0YyL&Py`eKML-cy1QY>9KoL*`6ahs*5l{pa0YyL&Py`eKML-cy1QY>9KoL*`6ahs* z5l{pa0YyL&Py`eKML-cy1QY>9KoL*`6ahs*5l{pa0YyL&Py`eKML-cy1QY>9KoL*` z6ahs*5l{pa0YyL&Py`eKML-cy1QY>9KoL*`6ahs*5l{pa0YyL&Py`eKML-cy1QY>9 zKoL*`6ahs*5l{pa0YyL&Py`eKML-cy1QY>9KoL*`6ahs*5l{pa0YyL&Py`eKML-cy z1QY>9KoL*`6ahs*5l{pa0YyL&Py`eKML-cy1QY>9KoL*`6ahs*5l{pa0YyL&Py`eK zML-cy1QY>9KoL*`6ahs*5l{pa0YyL&Py`eKML-cy1QY>9KoL*`6ahs*5l{pa0YyL& zPy`eKML-cy1QY>9KoL*`6ahs*5l{pa0YyL&Py`eKML-cy1QY>9KoL*`6ahs*5l{pa z0YyL&Py`eKML-cy1QY>9KoL*`6ahs*5l{pa0YyL&Py`eKML-cy1QY>9KoL*`6ahs* z5l{pa0YyL&Py`eKML-cy1QY>9KoL*`6ahs*5l{pa0YyL&Py`eKML-cy1QY>9KoL*` z6ahs*5l{pa0YyL&Py`eKML-cy1QY>9KoL*`6ahs*5l{pa0YyL&Py`eKML-cy1QY>9 zKoL*`6ahs*5l{pa0YyL&Py`eKML-cy1QY>9KoL*`6ahs*5l{pa0YyL&Py`eKML-cy z1QY>9KoL*`6ahs*5l{pa0YyL&Py`eKML-cy1QY>9KoL*`6ahs*5l{pa0YyL&Py`eK zML-cy1QY>9KoL*`6ahs*5l{pa0YyL&Py`eKML-cy1QY>9KoL*`6ahs*5l{pa0YyL& zPy`eKML-cy1QY>9KoL*`6ahs*5l{pa0YyL&Py`eKML-cy1QY>9KoL*`6ahs*5l{pa z0YyL&Py`eKML-cy1QY>9KoL*`6ahs*5l{pa0YyL&Py`eKML-cy1QY>9KoL*`6ahs* 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%0Au{O0UBCb)@xciTkUVnRYa% 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 z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** 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 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 p009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1pYe({$K0qZ^r-t literal 0 HcmV?d00001 diff --git a/include/Makefile b/include/Makefile new file mode 100644 index 0000000..8ea665b --- /dev/null +++ b/include/Makefile @@ -0,0 +1,2 @@ +clean: + - rm *~ diff --git a/include/kernel.h b/include/kernel.h new file mode 100644 index 0000000..c90ad52 --- /dev/null +++ b/include/kernel.h @@ -0,0 +1,17 @@ + +#ifndef __HOS_KERNEL_H__ +#define __HOS_KERNEL_H__ __HOS_KERNEL_H__ + +#include "multiboot.h" + +#define LINK_ADDRESS 0xC0000000 + +/* returns true to callee if we should jump to a real mode module */ +int k_mbsave(mb_info_t *mbinfo, unsigned int mb_magic); + +void k_init(); + +void isr(); + +#endif + diff --git a/include/module.h b/include/module.h new file mode 100644 index 0000000..2420b71 --- /dev/null +++ b/include/module.h @@ -0,0 +1,16 @@ + +#ifndef __HOS_MODULE_H__ +#define __HOS_MODULE_H__ __HOS_MODULE_H__ + +#define MOD_REAL_MODE 1 +#define MOD_KERNEL 2 + +typedef struct { + unsigned int mod_magic; // "HOSM" = 0x484F534D + unsigned int mod_type; // module type + void (*init) (); // address of void initialization function + unsigned int reserved; +} hos_module_header_t; + +#endif + diff --git a/include/multiboot.h b/include/multiboot.h new file mode 100644 index 0000000..04f4473 --- /dev/null +++ b/include/multiboot.h @@ -0,0 +1,144 @@ + +#ifndef __HOS_MULTIBOOT_H__ +#define __HOS_MULTIBOOT_H__ __HOS_MULTIBOOT_H__ + +/* The magic number for the Multiboot header. */ +#define MULTIBOOT_HEADER_MAGIC 0x1BADB002 + +#define MB_HEADER_ALIGN_MODULES 0x01 +#define MB_HEADER_MEM_INFO 0x02 +#define MB_HEADER_VIDEO_INFO 0x04 +#define MB_HEADER_KLUDGE_OFFSETS 0x10000 + + +/* The magic number passed by a Multiboot-compliant boot loader. */ +#define MULTIBOOT_BOOTLOADER_MAGIC 0x2BADB002 + +#define MB_BOOTLOADER_MEM_INFO 0x01 +#define MB_BOOTLOADER_BOOT_DEVICE 0x02 +#define MB_BOOTLOADER_COMMAND_LINE 0x04 +#define MB_BOOTLOADER_MODS 0x08 +#define MB_BOOTLOADER_AOUT 0x10 +#define MB_BOOTLOADER_ELF 0x20 +#define MB_BOOTLOADER_MMAP 0x40 +#define MB_BOOTLOADER_DRIVES 0x80 +#define MB_BOOTLOADER_CONFIG 0x0100 +#define MB_BOOTLOADER_APM 0x0200 +#define MB_BOOTLOADER_GRAPHICS 0x0400 + + +#define MB_DRIVE_MODE_CHS 0 +#define MB_DRIVE_MODE_LBA 1 + + +/* The Multiboot header. */ +typedef struct +{ + unsigned int magic; + unsigned int flags; + unsigned int checksum; + unsigned int header_addr; + unsigned int load_addr; + unsigned int load_end_addr; + unsigned int bss_end_addr; + unsigned int entry_addr; +} mb_header_t; + +/* The symbol table for a.out. */ +typedef struct +{ + unsigned int tabsize; + unsigned int strsize; + unsigned int addr; + unsigned int reserved; +} mb_aout_symbol_table_t; + +/* The section header table for ELF. */ +typedef struct +{ + unsigned int num; + unsigned int size; + unsigned int addr; + unsigned int shndx; +} mb_elf_section_header_table_t; + +/* The Multiboot information. */ +typedef struct +{ + unsigned int flags; + unsigned int mem_lower; + unsigned int mem_upper; + unsigned int boot_device; + unsigned int cmdline; + unsigned int mods_count; + unsigned int mods_addr; + union + { + mb_aout_symbol_table_t aout_sym; + mb_elf_section_header_table_t elf_sec; + }; + unsigned int mmap_length; + unsigned int mmap_addr; + unsigned int drives_length; + unsigned int drives_addr; + unsigned int config_table; + unsigned int bootloader_name; + unsigned int apm_table; + + unsigned int vbe_control_info; + unsigned int vbe_mode_info; + unsigned short vbe_mode; + unsigned short vbe_interface_seg; + unsigned short vbe_interface_off; + unsigned short vbe_interface_len; +} mb_info_t; + +/* The module structure. */ +typedef struct +{ + unsigned int mod_start; + unsigned int mod_end; + unsigned int string; + unsigned int reserved; +} mb_module_t; + +/* The memory map. Be careful that the offset 0 is base_addr_low, not size. */ +typedef struct +{ + unsigned int size; //offset -4 + unsigned int base_addr_low; //offset 0 + unsigned int base_addr_high; + unsigned int length_low; + unsigned int length_high; + unsigned int type; +} mb_mmap_t; + +/* The drive structure */ +typedef struct +{ + unsigned int size; + unsigned char drive_number; + unsigned char drive_mode; + unsigned char drive_cylinders; + unsigned char drive_heads; + unsigned char drive_sectors; + unsigned short drive_ports[1]; +} mb_drive_t; + +/* APM table structure */ +typedef struct +{ + unsigned short version; + unsigned short cseg; + unsigned int offset; + unsigned short cseg_16; + unsigned short dseg; + unsigned short flags; + unsigned short cseg_len; + unsigned short cseg_16_len; + unsigned short dseg_len; +} mb_apm_t; + + +#endif + diff --git a/kernel/Makefile b/kernel/Makefile index c560925..8cea585 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -1,76 +1,33 @@ -##################################################################### -# Author: Josh Holtrop / Benjamen R. Meyer # -# Date: 02/15/04 Modified: 06/16/04 # -# Purpose: To build Josh Holtrop's OS (HOS) using GNU make # -# Note: This makefile is for use on Linux & other Unix-like systems # -##################################################################### +# Makefile for HOS +# Josh Holtrop +# Created: 07/08/04 +# Modified: 07/09/04 -############## -# Variables: # -############## +# Assembler Information: +NASM=nasm +NASM_FLAGS=-f aout -# Format of kernel object files: -# Do not change unless you know what you are doing -KERNEL_FORMAT=aout - -# Assembler information: -NASM_BIN=nasm -NASM_FLAGS=-f $(KERNEL_FORMAT) - -# C++ Compile Information: -CPP=g++ -CPP_FLAGS=-fleading-underscore -fno-builtin -nostdlib -nostdinc++ -nostartfiles -fno-rtti -fno-exceptions -nodefaultlibs -I. -Wall +# C Information: +CC=gcc +CC_FLAGS=-fleading-underscore -fno-builtin -nostdlib -nostartfiles -nodefaultlibs -I. -I../include -Wall # Linker Information: LD=ld LD_FLAGS=-nodefaultlibs -nostdlib --no-demangle -T link.ld +all: Asm_Kernel C_Kernel + $(LD) $(LD_FLAGS) -Map boot.map boot.o kernel.o -o kernel.bin -############################### -# Linking the kernel together # -############################### -all: Asm_Kernel Asm_Functions C_Kernel - $(LD) $(LD_FLAGS) -o kernel.bin -Map ./lst/LDout.doc ks.o kernel.o asmfuncs.o fdc.o keyboard.o kio.o mm.o mouse.o stdfont.o video.o vmm.o rtc.o pic.o io.o cstring.o string.o cmos.o hos_defines.o vfs.o devfs.o Mount.o +Asm_Kernel: + $(NASM) $(NASM_FLAGS) -l boot.lst boot.asm -o boot.o -########################## -# Assembly Kernel Loader # -########################## -Asm_Kernel: kernel.asm - $(NASM_BIN) $(NASM_FLAGS) -o ks.o -l ./lst/kernel.lst kernel.asm - -################################# -# Assembly Functions for Kernel # -################################# -Asm_Functions: asmfuncs.asm - $(NASM_BIN) $(NASM_FLAGS) -o asmfuncs.o -l ./lst/asmfuncs.lst asmfuncs.asm - -############ -# C Kernel # -############ C_Kernel: - $(CPP) $(CPP_FLAGS) -c kernel.cpp -o kernel.o - $(CPP) $(CPP_FLAGS) -c kio.cpp -o kio.o - $(CPP) $(CPP_FLAGS) -c sys/rtc.cpp -o rtc.o - $(CPP) $(CPP_FLAGS) -c sys/pic.cpp -o pic.o - $(CPP) $(CPP_FLAGS) -c sys/io.cpp -o io.o - $(CPP) $(CPP_FLAGS) -c sys/cmos.cpp -o cmos.o - $(CPP) $(CPP_FLAGS) -c lang/cstring.cpp -o cstring.o - $(CPP) $(CPP_FLAGS) -c lang/string.cpp -o string.o - $(CPP) $(CPP_FLAGS) -c video/stdfont.cpp -o stdfont.o - $(CPP) $(CPP_FLAGS) -c video/video.cpp -o video.o - $(CPP) $(CPP_FLAGS) -c block/fdc.cpp -o fdc.o - $(CPP) $(CPP_FLAGS) -c char/keyboard.cpp -o keyboard.o - $(CPP) $(CPP_FLAGS) -c char/mouse.cpp -o mouse.o - $(CPP) $(CPP_FLAGS) -c mm/mm.cpp -o mm.o - $(CPP) $(CPP_FLAGS) -c mm/vmm.cpp -o vmm.o - $(CPP) $(CPP_FLAGS) -c hos_defines.cpp -o hos_defines.o - $(CPP) $(CPP_FLAGS) -c fs/vfs.cpp -o vfs.o - $(CPP) $(CPP_FLAGS) -c fs/devfs.cpp -o devfs.o - $(CPP) $(CPP_FLAGS) -c fs/Mount.cpp -o Mount.o + $(CC) $(CC_FLAGS) -c kernel.c -o kernel.o ################################################# # Clean up the source directory of any binaries # ################################################# clean: - - rm *.s *.o *.bin *~ block/*~ char/*~ fs/*~ lang/*~ mm/*~ sys/*~ video/*~ + - rm *.s *.S *.o *.bin *~ *.map *.lst + diff --git a/kernel/asmfuncs.asm b/kernel/asmfuncs.asm deleted file mode 100644 index b9adf6f..0000000 --- a/kernel/asmfuncs.asm +++ /dev/null @@ -1,510 +0,0 @@ -; asmfuncs.asm -; Josh Holtrop -; Created: 10/23/03 -; Modified: 02/26/04 - -[extern _putc] -[extern _console_memory] -[extern _cursorPosition] -[extern _video_drawConsole] -[extern _videoMode] - -%macro jzfar 1 - jnz %%skip - jmp %1 -%%skip: - -%endmacro - -;stores the parameter to the CR0 register -;extern dword write_cr0(dword cr0); -[global _write_cr0] -_write_cr0: - push ebp - mov ebp, esp - mov eax, [ebp+8] - mov cr0, eax - pop ebp - ret - -;returns the value in the CR0 register -;extern dword read_cr0(); -[global _read_cr0] -_read_cr0: - mov eax, cr0; - ret - -;stores the parameter to the CR3 register -;extern dword write_cr3(dword cr3); -[global _write_cr3] -_write_cr3: - push ebp - mov ebp, esp - mov eax, [ebp+8] - mov cr3, eax - pop ebp - ret - - -;returns the value in the CR2 register -;extern dword read_cr2(); -[global _read_cr2] -_read_cr2: - mov eax, cr2; - ret - - - -;returns the value in the CR3 register -;extern dword read_cr3(); -[global _read_cr3] -_read_cr3: - mov eax, cr3; - ret - - -;compares one string to another -;returns 0 if the strings are different -;extern dword strcmp(char *str1, char *str2); -[global _strcmp] -_strcmp: - push ebp - mov ebp, esp - push esi - push edi - - mov esi, [ebp+8] - mov edi, [ebp+12] -strcmp_loop1: - lodsb - mov ah, [edi] - inc edi - cmp ah, al - jnz strcmp_ne - or al, al - jz strcmp_e - jmp strcmp_loop1 -strcmp_e: - mov eax, 1 - jmp short strcmp_done -strcmp_ne: - xor eax, eax -strcmp_done: - - pop edi - pop esi - pop ebp - ret - -;copies a string from the source to the destination parameter -;extern void strcpy(char *dest, char *src); -[global _strcpy] -_strcpy: - push ebp - mov ebp, esp - push esi - push edi - mov edi, [ebp+8] - mov esi, [ebp+12] -strcpyloop: - lodsb - stosb - or al, al - jnz strcpyloop - pop edi - pop esi - pop ebp - ret - -;copies memory of n bytes from src to destination -;void memcpy(void *dest, void *src, dword n); -[global _memcpy] -_memcpy: - push ebp - mov ebp, esp - push esi - push edi - push ecx - mov edi, [ebp+8] - mov esi, [ebp+12] - mov ecx, [ebp+16] - - cld - rep movsb - - pop ecx - pop edi - pop esi - pop ebp - ret - - -;copies memory of n dwords (n*4 bytes) from src to destination -;void memcpyd(void *dest, void *src, dword n); -[global _memcpyd] -_memcpyd: - push ebp - mov ebp, esp - push esi - push edi - push ecx - mov edi, [ebp+8] - mov esi, [ebp+12] - mov ecx, [ebp+16] - - cld - rep movsd - - pop ecx - pop edi - pop esi - pop ebp - ret - - -;sets num bytes at buffer to the value of c -;void *memset(void *buffer, int c, int num); -[global _memset] -_memset: - push ebp - mov ebp, esp - push edi - push ecx - mov edi, [ebp+8] - push edi ;save for return address - mov eax, [ebp+12] - mov ecx, [ebp+16] - - rep stosb - - pop eax - pop ecx - pop edi - pop ebp - ret - - -;sets num words at buffer to the value of c -;void *memsetw(void *buffer, int c, int num); -[global _memsetw] -_memsetw: - push ebp - mov ebp, esp - push edi - push ecx - mov edi, [ebp+8] - push edi ;save for return address - mov eax, [ebp+12] - mov ecx, [ebp+16] - - rep stosw - - pop eax - pop ecx - pop edi - pop ebp - ret - - -;sets num dwords at buffer to the value of c -;void *memsetd(void *buffer, int c, int num); -[global _memsetd] -_memsetd: - push ebp - mov ebp, esp - push edi - push ecx - mov edi, [ebp+8] - push edi ;save for return address - mov eax, [ebp+12] - mov ecx, [ebp+16] - - rep stosd - - pop eax - pop ecx - pop edi - pop ebp - ret - - -;returns the number of characters in a string -;extern dword strlen(char *str); -[global _strlen] -_strlen: - push ebp - mov ebp, esp - push esi - push ebx - mov esi, [ebp+8] - xor ebx, ebx -strlenloop: - lodsb - or al, al - jz strlendone - inc ebx - jmp strlenloop -strlendone: - mov eax, ebx - pop ebx - pop esi - pop ebp - ret - -;this function invalidates the page directory/table entry that -; would be used to access the memory address given in the parameter -;extern void invlpg_(dword addr); -[global _invlpg_] -_invlpg_: - mov eax, [esp+4] - invlpg [eax] - ret - - -; -;void writeCursorPosition(word pos) -; -[global _writeCursorPosition] -_writeCursorPosition: - push ebp - mov ebp, esp - - push eax - push ebx - push edx - - mov eax, [ebp+8] ;cursor position in ax - - mov bl, al - mov dx, 0x03D4 - mov al, 0x0E - out dx, al - - inc dx - mov al, ah - out dx, al - - dec dx - mov al, 0x0F - out dx, al - - inc dx - mov al, bl - out dx, al - - pop edx - pop ebx - pop eax - pop ebp - - ret - - -; -;word getCursorPosition() -; -[global _getCursorPosition] -_getCursorPosition: - push ebx - push edx - - xor eax, eax - mov dx, 0x03D4 - mov al, 0x0E - out dx, al - - inc dx - in al, dx - mov bl, al - - dec dx - mov al, 0x0F - out dx, al - - inc dx - in al, dx - mov ah, bl - - pop edx - pop ebx - - ret - - -; -;int puts(char *str) -; -[global _puts] -_puts: - push ebp - mov ebp, esp - push esi - push eax - mov esi, [ebp+8] ;esi = to string -puts_loop: - lodsb - cmp al, 0 - jz puts_done - push eax - call _putc - add esp, 4 - jmp puts_loop - -puts_done: - pop eax - pop esi - pop ebp - ret - - - - -[global _putDecu] -_putDecu: - push ebp - mov ebp, esp - sub esp, 24 - mov DWORD [ebp-4], 1 - mov BYTE [ebp-5], 0 -L2: - mov edx, DWORD [ebp+8] - mov eax, -858993459 - mul edx - mov eax, edx - shr eax, 3 - cmp eax, DWORD [ebp-4] - jae L4 - jmp L3 -L4: - mov eax, DWORD [ebp-4] - mov edx, eax - sal edx, 2 - add edx, eax - lea eax, [edx+edx] - mov DWORD [ebp-4], eax - jmp L2 -L3: - nop -L5: - cmp DWORD [ebp-4], 1 - ja L7 - jmp L6 -L7: - mov edx, DWORD [ebp+8] - mov eax, edx - mov edx, 0 - div DWORD [ebp-4] - mov DWORD [ebp-12], eax - mov al, BYTE [ebp-12] - mov BYTE [ebp-5], al - mov eax, 0 - mov al, BYTE [ebp-5] - imul eax, DWORD [ebp-4] - sub DWORD [ebp+8], eax - mov edx, DWORD [ebp-4] - mov eax, -858993459 - mul edx - mov eax, edx - shr eax, 3 - mov DWORD [ebp-4], eax - lea eax, [ebp-5] - add BYTE [eax], 48 - sub esp, 12 - mov eax, 0 - mov al, BYTE [ebp-5] - push eax - call _putc - add esp, 16 - jmp L5 -L6: - sub esp, 12 - mov al, BYTE [ebp+8] - add eax, 48 - and eax, 255 - push eax - call _putc - add esp, 16 - leave - ret - - - - -[global _putDec] -_putDec: - push ebp - mov ebp, esp - sub esp, 24 - cmp DWORD [ebp+8], 0 - jns L9 - sub esp, 12 - push 45 - call _putc - add esp, 16 - neg DWORD [ebp+8] -L9: - mov DWORD [ebp-4], 1 - mov BYTE [ebp-5], 0 -L10: - mov eax, DWORD [ebp+8] - cmp eax, DWORD [ebp-4] - jae L12 - jmp L11 -L12: - mov eax, DWORD [ebp-4] - mov edx, eax - sal edx, 2 - add edx, eax - lea eax, [edx+edx] - mov DWORD [ebp-4], eax - jmp L10 -L11: - mov edx, DWORD [ebp-4] - mov eax, -858993459 - mul edx - mov eax, edx - shr eax, 3 - mov DWORD [ebp-4], eax -L13: - cmp DWORD [ebp-4], 1 - ja L15 - jmp L14 -L15: - mov edx, DWORD [ebp+8] - mov eax, edx - mov edx, 0 - div DWORD [ebp-4] - mov DWORD [ebp-12], eax - mov al, BYTE [ebp-12] - mov BYTE [ebp-5], al - mov eax, 0 - mov al, BYTE [ebp-5] - imul eax, DWORD [ebp-4] - sub DWORD [ebp+8], eax - mov edx, DWORD [ebp-4] - mov eax, -858993459 - mul edx - mov eax, edx - shr eax, 3 - mov DWORD [ebp-4], eax - lea eax, [ebp-5] - add BYTE [eax], 48 - sub esp, 12 - mov eax, 0 - mov al, BYTE [ebp-5] - push eax - call _putc - add esp, 16 - jmp L13 -L14: - sub esp, 12 - mov al, BYTE [ebp+8] - add eax, 48 - and eax, 255 - push eax - call _putc - add esp, 16 - leave - ret - - diff --git a/kernel/asmfuncs.h b/kernel/asmfuncs.h deleted file mode 100644 index cc36e4f..0000000 --- a/kernel/asmfuncs.h +++ /dev/null @@ -1,36 +0,0 @@ -// asmfuncs.h -// Author: Josh Holtrop -// Created: 02/26/04 -// Modified: 05/21/04 - -#ifndef __HOS_ASMFUNCS__ -#define __HOS_ASMFUNCS__ __HOS_ASMFUNCS__ - -#include "hos_defines.h" - -extern "C" { - - dword write_cr0(dword cr0); - dword read_cr0(); - dword write_cr3(dword cr3); - dword read_cr2(); - dword read_cr3(); - void writeCursorPosition(dword pos); - dword getCursorPosition(); - int puts(char *str); - int putDec(int number); - int putDecu(dword number); - void strcpy(char *dest, const char *src); - void memcpy(void *dest, const void *src, dword n); - void memcpyd(void *dest, const void *src, dword n); - void *memset(void *buffer, int c, int num); - void *memsetw(void *buffer, int c, int num); - void *memsetd(void *buffer, int c, int num); - dword strlen(const char *str); - void invlpg_(dword addr); - -} - -#endif - - diff --git a/kernel/block/fdc.cpp b/kernel/block/fdc.cpp deleted file mode 100644 index 6fd6c8d..0000000 --- a/kernel/block/fdc.cpp +++ /dev/null @@ -1,9 +0,0 @@ -//fdc.c -//Author: Josh Holtrop -//Created: 10/30/03 -//Modified: 02/26/04 - -#include "fdc.h" - - - diff --git a/kernel/block/fdc.h b/kernel/block/fdc.h deleted file mode 100644 index a941f68..0000000 --- a/kernel/block/fdc.h +++ /dev/null @@ -1,23 +0,0 @@ -//fdc.h -//Author: Josh Holtrop -//Date: 10/30/03 -//Modified: 02/26/04 - -#ifndef __HOS_FDC__ -#define __HOS_FDC__ __HOS_FDC__ - -#include "sys/io.h" - -#define FDC_DOR 0x3f2 -#define FDC_MSR 0x3f4 - -//inline void fdc_sendDOR(byte dor); - -static inline void fdc_sendDOR(byte dor) -{ - outportb(FDC_DOR, dor); -} - -#endif - - diff --git a/kernel/block/loop.cpp b/kernel/block/loop.cpp deleted file mode 100644 index 6c824da..0000000 --- a/kernel/block/loop.cpp +++ /dev/null @@ -1,22 +0,0 @@ -// loop.c -// Author: Josh Holtrop -// Date: 03/16/04 -// Provides a loop-back device for mounting files on existing volumes as new volumes - -#include "hos_defines.h" -#include "loop.h" -#include "fs/vfs.h" - -int loop_readSector(LoopDevice *ld, dword sector, byte *buffer) -{ - return vfs_readFileBlock(ld->vol, ld->filePath, sector * LOOP_SECTOR_SIZE, buffer, LOOP_SECTOR_SIZE); -} - - -int loop_writeSector(LoopDevice *ld, dword sector, byte *buffer) -{ - return vfs_writeFileBlock(ld->vol, ld->filePath, sector * LOOP_SECTOR_SIZE, buffer, LOOP_SECTOR_SIZE); -} - - - diff --git a/kernel/block/loop.h b/kernel/block/loop.h deleted file mode 100644 index e10776c..0000000 --- a/kernel/block/loop.h +++ /dev/null @@ -1,22 +0,0 @@ -// loop.h -// Author: Josh Holtrop -// Date: 03/16/04 -// Provides a loop-back device for mounting files on existing volumes as new volumes - -#ifndef __HOS_LOOP__ -#define __HOS_LOOP__ __HOS_LOOP__ - -#include "hos_includes.h" - -typedef struct -{ - Volume *vol; - char filePath[256]; -} LoopDevice; - -int loop_readSector(LoopDevice *ld, dword sector, byte *buffer); -int loop_writeSector(LoopDevice *ld, dword sector, byte *buffer); - -#endif - - diff --git a/kernel/block/rd.cpp b/kernel/block/rd.cpp deleted file mode 100644 index 38c3a1d..0000000 --- a/kernel/block/rd.cpp +++ /dev/null @@ -1,7 +0,0 @@ -// rd.c -// Author: Josh Holtrop -// Date: 03/11/04 - -#include "rd.h" - - diff --git a/kernel/block/rd.h b/kernel/block/rd.h deleted file mode 100644 index 0ebb136..0000000 --- a/kernel/block/rd.h +++ /dev/null @@ -1,12 +0,0 @@ -// rd.h -// Author: Josh Holtrop -// Date: 03/11/04 - -#ifndef __HOS_RD__ -#define __HOS_RD__ __HOS_RD__ - - - -#endif - - diff --git a/kernel/boot.asm b/kernel/boot.asm new file mode 100644 index 0000000..3f5071d --- /dev/null +++ b/kernel/boot.asm @@ -0,0 +1,196 @@ +;boot.asm +;Author: Josh Holtrop +;Date: 07/08/04 +;Modified: 07/08/04 + + +%define MULTIBOOT_MAGIC 0x1BADB002 +%define MULTIBOOT_FLAGS 0x00010003 + +%define VIRT_OFFSET 0xC0000000 ;3gb virtual address +%define PHYS_START 0x00100000 ;1mb physical address +%define VIRT_STACK_TOP 0xCFFFFFFC ;3gb+256mb virtual address +%define GDT_P PHYS_START ;1mb physical - Global Descriptor Table space +%define GDT_V GDT_P+VIRT_OFFSET +%define IDT_P PHYS_START+0x2000 ;1mb+8kb - Interrupt Descriptor Table space +%define IDT_V IDT_P+VIRT_OFFSET +%define PDBR_P PHYS_START+0x4000 ;1mb+16kb - Page Directory Base Register (first PD) +%define PDBR_V PDBR_P+VIRT_OFFSET +%define LOPT_P PHYS_START+0x5000 ;1mb+20kb - LOw Page Table for mapping first 4mb +%define LOPT_V LOPT_P+VIRT_OFFSET +%define PT_STACK_P PHYS_START+0x6000 ;1mb+24kb - page table for initial kernel stack pages (under 0xD0000000) +%define PT_STACK_V PT_STACK_P+VIRT_OFFSET +%define STACK_P PHYS_START+0x7000 ;1mb+28kb - initial 4kb kernel stack page +%define STACK_V STACK_P+VIRT_OFFSET +%define KERNEL_P PHYS_START+0x8000 ;1mb+32kb - the kernel's physical address +%define KERNEL_V KERNEL_P+VIRT_OFFSET ;3gb+1mb+32kb, the virtual address of the kernel + +extern _k_init, _isr, _k_mbsave, _end + +[bits 32] + +[global _start] +_start: + +multiboot_header: + dd MULTIBOOT_MAGIC ;magic + dd MULTIBOOT_FLAGS ;flags + dd -(MULTIBOOT_MAGIC + MULTIBOOT_FLAGS) ;checksum + + dd multiboot_header-VIRT_OFFSET ;header_addr + dd _start-VIRT_OFFSET ;load_addr + dd 0 ;load_end_addr + dd _end-VIRT_OFFSET ;bss_end_addr + dd multiboot_entry-VIRT_OFFSET ;entry_addr + +; dd 1 ;mode_type +; dd 80 ;width +; dd 25 ;height +; dd 0 ;depth + +[global multiboot_entry] +multiboot_entry: +;This is where the kernel begins execution from the bootloader. +;At this point, a temporary gdt is set up to "map" 0xC000_0000 to 0x0. + cli ;should already be off... + lgdt [gdtrbs32-VIRT_OFFSET] + jmp KERNEL_CODE_BS32:segmented_start +segmented_start: + mov ax, KERNEL_DATA_BS32 + mov ss, ax + mov ds, ax + mov es, ax + mov gs, ax + mov fs, ax + mov esp, STACK_V+0x1000 ;ok, now we can access our data + +;aloop: +; inc dword [0xC00B8000] +; jmp aloop + + +;Then the multiboot info structures are saved to local data variables. + add ebx, VIRT_OFFSET + push eax + push ebx ;pointer to multiboot info structure + call _k_mbsave ;save multiboot info structures + add esp, 8 + + cmp eax, 0 + jz pm_return + +;go back to real mode to initialize video mode + mov ebx, pm_return + + + +;Next we enable paging with the first 4mb mapped 1:1 virtual:physical +; and with the 4mb starting at 0xC000_0000 mapped to the first 4mb physical. +pm_return: + xor eax, eax + mov edi, PDBR_V + mov ecx, 1024 ;clear the PDBR + rep stosd + mov edi, PT_STACK_V + mov ecx, 1024 ;clear the PT_STACK + rep stosd + mov [PDBR_V], dword LOPT_P|0x03 ;store the physical address of the LOw Page Table | (read/write, present) + mov [PDBR_V+0xC00], dword LOPT_P|0x03 ;store the physical address of the LOw Page Table | (read/write, present) + mov [PDBR_V+0xCFC], dword PT_STACK_P|0x03 ;store the physical address of the initial stack page page table | (read/write, present) + mov [PT_STACK_V+0xFFC], dword STACK_P|0x03 ;store the physical address of the initial stack page | (read/write, present) + + mov edi, LOPT_V + mov ecx, 1024 + mov eax, 0x03 ;starting physical address = 0x0 | (read/write, present flags) +fill_lopt_loop: ;fill the page table + stosd + add eax, 4096 ;increment next phsyical address by 4kb + loop fill_lopt_loop + + mov eax, PDBR_P + mov cr3, eax ;store the Page Directory Base Address + mov eax, cr0 + or eax, 0x80000000 ;set Page Enable bit + mov cr0, eax ;now paging is active! + + + mov edi, GDT_V + mov esi, gdt + mov ecx, gdt_end-gdt + rep movsb + + mov edi, IDT_V ;destination + mov esi, isr_0 ;address of isr0 + mov edx, isr_1-isr_0 ;distance between isr labels + mov ecx, 50 ;number of isrlabels +fill_idt: + mov ebx, esi + mov ax, si + stosw ;0 offset 15:0 + mov ax, KERNEL_CODE + stosw ;2 selector 15:0 + mov ax, 0x8E00 + stosw ;4 [P][DPL][0][TYPE][0][0][0][0][0][0][0][0] + shr esi, 16 + mov ax, si + stosw ;6 offset 31:16 + mov esi, ebx + add esi, edx + loop fill_idt + mov word [IDT_V+0x30*8+4], 0xEE00 ;interrupt 0x30 has user priviledges + +;Then we can start using our "real" gdt, then unmap the lower 4mb. + lgdt [gdtr] ;load gdt + jmp KERNEL_CODE:newgdtcontinue +newgdtcontinue: + mov ax, KERNEL_DATA + mov es, ax + mov ds, ax + mov gs, ax + mov fs, ax + mov ss, ax + mov esp, VIRT_STACK_TOP ;stack just under 3gb+256mb, moves downward + lidt [idtr] ;load idt + mov [PDBR_V], dword 0 ;unmap 0x0, we are running completely paged at 0xC000_0000 + + call _k_init ;C kernel initialization + +idle_loop: +; sti + hlt + jmp idle_loop + +;------------------------------------------------------- +gdtrbs32: + dw gdt_endbs32-gdtbs32-1 + dd gdtbs32-VIRT_OFFSET +gdtbs32: ;null descriptor + dd 0 + dd 0 + + ;a base of 0x4000_0000, when added to 0xC000_0000 will produce 0x0000_0000 physical before paging in effect +KERNEL_CODE_BS32 equ $-gdtbs32 + db 0xff ;limit 7:0 + db 0xff ;limit 15:8 + db 0x00 ;base 7:0 + db 0x00 ;base 15:8 + db 0x00 ;base 23:16 + db 0x9a ;access + db 0xcf ;flags / limit 19:16 + db 0x40 ;base 31:24 + +KERNEL_DATA_BS32 equ $-gdtbs32 + db 0xff ;limit 7:0 + db 0xff ;limit 15:8 + db 0x00 ;base 7:0 + db 0x00 ;base 15:8 + db 0x00 ;base 23:16 + db 0x92 ;access + db 0xcf ;flags / limit 19:16 + db 0x40 ;base 31:24 + +gdt_endbs32: + +%include "gdt.inc" +%include "idt.inc" + diff --git a/kernel/char/keyboard.cpp b/kernel/char/keyboard.cpp deleted file mode 100644 index eea52c5..0000000 --- a/kernel/char/keyboard.cpp +++ /dev/null @@ -1,252 +0,0 @@ -// keyboard.c -// Author: Josh Holtrop -// Created: 04/17/03 -// Modified: 03/02/04 - -#include "hos_defines.h" -#include "keyboard.h" -#include "sys/io.h" -#include "sys/pic.h" -#include "functions.h" -#include "kio.h" - -#define KBD_BUFFER_LENGTH 64 - -extern "C" { - -byte kbdFlags = 0; //holds current keyboard flags - caps/num/scroll/shift/ctrl/alt -byte kbdAscii = 0; //holds ASCII value of a key pressed -byte kbdScan = 0; //holds the keyboard scan code of a key pressed - -dword kbdBuffer[KBD_BUFFER_LENGTH]; //a buffer for all keypresses -int kbdBufferStart = 0; //position of next key in buffer -int kbdBufferLen = 0; //number of keys left in the buffer -byte kbdExt = 0; //# of extended key codes left to input -byte kbdExt2 = 0; //# of 2nd-set-extended key codes left to input -byte ackReason = 0; //used to record the reason why we would get an acknowledge byte (0xFA) - - -//these arrays convert a keyboard scan code to an ASCII character value - //nul esc bksp tab lctl lsft rsft lalt caps F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 numScrlNumPad------- unknown---- F11 F12 unknown.... -const byte SCAN2ASCII[129] = "\000\0331234567890-=\010\011qwertyuiop[]\n\001asdfghjkl;'`\001\\zxcvbnm,./\001*\001 \001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001-\001\001\001+\001\001\001\001\001\002\002\002\001\001\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002"; -const byte SCAN2ASCIISHIFT[129] = "\000\033!@#$%^&*()_+\010\011QWERTYUIOP{}\n\001ASDFGHJKL:\"~\001|ZXCVBNM<>?\001*\001 \001\001\001\001\001\001\001\001\001\001\001\001\001789-456+1230.\002\002\002\001\001\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002"; - -//====FUNCTIONS: -// The Keyboard Interrupt Service Routine -void isr_keyboard() -{ - kbdScan = inportb(0x60); - //printf("\nKEYBOARD INTERRUPT: 0x%x", kbdScan); - byte inState = inportb(0x61); - outportb(0x61, inState|0x80); - outportb(0x61, inState); - - //printf("IRQ 1: %x\n", kbdScan); - - if (kbdScan == 0xFA) //250 //ACKnowledge - { - //printf("KBD_ACK 0x%x!\n", ackReason); - if (ackReason == 0xED) //reset LEDs - { - outportb(0x60, (kbdFlags & 0x07)); - } - ackReason = 0; - } - if (kbdScan == 224) //extended key - { - kbdExt = 1; - pic_eoi(); - return; - } - if (kbdScan == 225) //2nd-set-extended key - { - kbdExt2 = 2; - pic_eoi(); - return; - } - -//====handle control keys:: - kbdAscii = 2; - switch (kbdScan) //control keys - { - case KBD_SCAN_LSHIFT: - kbdFlags |= KBD_SHIFT; - kbdAscii = 1; - break; - case KBD_SCAN_RSHIFT: - kbdFlags |= KBD_SHIFT; - kbdAscii = 1; - break; - case KBD_SCAN_LCTRL: - kbdFlags |= KBD_CTRL; - kbdAscii = 1; - break; - case KBD_SCAN_LALT: - kbdFlags |= KBD_ALT; - kbdAscii = 1; - break; - - case KBD_SCAN_LSHIFT + KBD_SCAN_RELEASED: - kbdFlags &= (KBD_SHIFT ^ 0xFF); - kbdAscii = 1; - break; - case KBD_SCAN_RSHIFT + KBD_SCAN_RELEASED: - kbdFlags &= (KBD_SHIFT ^ 0xFF); - kbdAscii = 1; - break; - case KBD_SCAN_LCTRL + KBD_SCAN_RELEASED: - kbdFlags &= (KBD_CTRL ^ 0xFF); - kbdAscii = 1; - break; - case KBD_SCAN_LALT + KBD_SCAN_RELEASED: - kbdFlags &= (KBD_ALT ^ 0xFF); - kbdAscii = 1; - break; - - case KBD_SCAN_CAPS+KBD_SCAN_RELEASED: - kbdFlags ^= KBD_CAPS; - kbdAscii = 1; - kbd_resetLEDs(); //update LEDs - break; - case KBD_SCAN_SCROLL+KBD_SCAN_RELEASED: - kbdFlags ^= KBD_SCROLL; - kbdAscii = 1; - kbd_resetLEDs(); //update LEDs - break; - case KBD_SCAN_NUM+KBD_SCAN_RELEASED: - kbdFlags ^= KBD_NUM; - kbdAscii = 1; - kbd_resetLEDs(); //update LEDs - break; - } - if (kbdAscii == 1) - { - if (kbdExt > 0) - kbdExt--; - pic_eoi(); - return; - } -//====determine ASCII value of key:: - if (kbdExt > 0) //extended key, kbdScan holds extended key - { - kbdExt--; - kbdAscii = 1; - switch (kbdScan) - { - case KBD_SCANE_ENTER: - kbdAscii = '\n'; break; - case 53: // '/' character (divide on numpad) - kbdAscii = '/'; break; - } - } - else if (kbdExt2 > 0) //extended key 2 - { - kbdExt2--; -// if (kbdScan == 69) // (pause|break) -// kbdAscii = 2; //flag ascii value of 1 means control character (pausebreak) -// else - kbdAscii = 2; //flag ascii value of 2 means ignore key (or unknown value) - } - else //not an extended key - { - // if letter key - if (((kbdScan >= 16) && (kbdScan <= 25)) || ((kbdScan >= 30) && (kbdScan <= 38)) || ((kbdScan >= 44) && (kbdScan <= 50))) - { - // if caps and shift are different (either one pressed, not both) - if (((kbdFlags & KBD_SHIFT) != 0) & ((kbdFlags & KBD_CAPS) != 0)) - kbdAscii = SCAN2ASCII[kbdScan & 0x7F]; - else if (((kbdFlags & KBD_SHIFT) == 0) & ((kbdFlags & KBD_CAPS) == 0)) - kbdAscii = SCAN2ASCII[kbdScan & 0x7F]; - else - kbdAscii = SCAN2ASCIISHIFT[kbdScan & 0x7F]; - } - // if numpad key - else if ((kbdScan >= 71) && (kbdScan <= 83)) - { - // if numlock on - if (kbdFlags & KBD_NUM) - kbdAscii = SCAN2ASCIISHIFT[kbdScan & 0x7F]; - else - kbdAscii = SCAN2ASCII[kbdScan & 0x7F]; - } - // other key - else - { - if ((kbdFlags & KBD_SHIFT) != 0) - kbdAscii = SCAN2ASCIISHIFT[kbdScan & 0x7F]; - else - kbdAscii = SCAN2ASCII[kbdScan & 0x7F]; - } - } - -//====do something with key:: -// printf("kbdScan == %d\nkbdAscii == %d\nkbdFlags == %d\n", kbdScan, kbdAscii, kbdFlags); - if ((kbdScan == 83) && (kbdFlags & KBD_CTRL) && (kbdFlags & KBD_ALT)) - { - printf("Initiating reboot."); - restart(); - } - if (kbdAscii == 2) //unknown key / ignore key - { - pic_eoi(); - return; - } - if (kbdScan < KBD_SCAN_RELEASED) //a key was pressed, save it - { - if (kbdBufferLen >= KBD_BUFFER_LENGTH) //no key slots available - { - pic_eoi(); - return; - } - else - { - kbdBuffer[(kbdBufferStart+kbdBufferLen++)%KBD_BUFFER_LENGTH] = (dword) ((kbdFlags << 16) | (kbdScan << 8) | kbdAscii); -// printf("S:%d\tL:%d\tR:%x\n", kbdBufferStart, kbdBufferLen, kbdBuffer[kbdBufferStart]); - } - } - - pic_eoi(); - -} - -//Gets a key from the buffer, returns 0 if no keys available, returns immediately -dword kbdGetKey() -{ - if (kbdBufferLen == 0) //buffer empty - return 0; - dword retVal = kbdBuffer[kbdBufferStart]; - kbdBufferStart++; - kbdBufferLen--; - if (kbdBufferStart >= KBD_BUFFER_LENGTH) - kbdBufferStart = 0; - return retVal; -} - -//Gets a key from the buffer, if no keys available, waits for one to be entered -dword kbdWaitKey() -{ - for (;;) - { - if (kbdBufferLen != 0) //buffer empty - break; - } - dword retVal = kbdBuffer[kbdBufferStart]; - kbdBufferStart++; - kbdBufferLen--; - if (kbdBufferStart >= KBD_BUFFER_LENGTH) - kbdBufferStart = 0; - return retVal; -} - -//Resets the keyboard LEDs to reflect the current state of the num lock, caps lock, and scroll lock bits -void kbd_resetLEDs() -{ - outportb(0x60, 0xED); - ackReason = 0xED; -} - - -} - - - diff --git a/kernel/char/keyboard.h b/kernel/char/keyboard.h deleted file mode 100644 index 0273619..0000000 --- a/kernel/char/keyboard.h +++ /dev/null @@ -1,53 +0,0 @@ -// keyboard.h -// Author: Josh Holtrop -// Created: 04/17/03 -// Modified: 03/02/04 - -#include "hos_defines.h" - -#ifndef __HOS_KEYBOARD__ -#define __HOS_KEYBOARD__ __HOS_KEYBOARD__ - -#define KBD_SCROLL 0x01 -#define KBD_NUM 0x02 -#define KBD_CAPS 0x04 -#define KBD_SHIFT 0x10 -#define KBD_CTRL 0x20 -#define KBD_ALT 0x40 - -#define KBD_SCAN_RELEASED 128 - -#define KBD_SCAN_LCTRL 29 -#define KBD_SCAN_LSHIFT 42 -#define KBD_SCAN_RSHIFT 54 -#define KBD_SCAN_LALT 56 -#define KBD_SCAN_SCROLL 70 -#define KBD_SCAN_CAPS 58 -#define KBD_SCAN_NUM 69 - -#define KBD_SCANE_PRINTSCREEN 55 -#define KBD_SCANE_INS 82 -#define KBD_SCANE_HOME 71 -#define KBD_SCANE_PGUP 73 -#define KBD_SCANE_DEL 83 -#define KBD_SCANE_END 79 -#define KBD_SCANE_PGDN 81 -#define KBD_SCANE_ENTER 28 - -#define KBD_SCANE_NULL 42 - - - -//====PROTOTYPES: - -extern "C" { - -void isr_keyboard(); -void kbd_resetLEDs(); -dword kbdGetKey(); -dword kbdWaitKey(); - -} - -#endif - diff --git a/kernel/char/mouse.cpp b/kernel/char/mouse.cpp deleted file mode 100644 index c9464ce..0000000 --- a/kernel/char/mouse.cpp +++ /dev/null @@ -1,76 +0,0 @@ -// mouse.c -// Author: Josh Holtrop -// Date: 10/03/03 -// Modified: 05/21/04 - -#include "mouse.h" -#include "hos_defines.h" -#include "video/video.h" -#include "sys/io.h" - -#define MOUSE_BUFFER_LENGTH 16 - -extern "C" { - -int mouse_x; -int mouse_y; -int mouse_bytesRead; -byte mouse_inbuffer[MOUSE_BUFFER_LENGTH]; - -//This method initializes the ps/2 mouse -void mouse_init() -{ - outportb(0x64, 0x20); //tell keyboard controller we are going to read keyboard controller command byte - byte temp = inportb(0x60); //read keyboard controller command byte - outportb(0x64, 0x60); //tell keyboard controller we are going to write keyboard controller command byte - outportb(0x60, 0x03 | (temp&0x40)); //write keyboard controller command byte: enable mouse/keyboard ints, include original XLATE bit from temp (bit6) - - outportb(0x64, 0xA8); //enable mouse port - - outportb(0x64, 0xD4); //send command to mouse, not kbd - outportb(0x60, 0xF4); //enable data reporting - - mouse_x = video_getWidth() >> 1; - mouse_y = video_getHeight() >> 1; - - mouse_bytesRead = 0; - - //outportb(0x64, 0xD4); - //outportb(0x60, 0xE7); //scaling 2:1 -} - - -//This method is called when a mouse interrupt occurs -void isr_mouse() -{ - byte inb = inportb(0x60); //read mouse byte - if ((inb == 0xFA) && (mouse_bytesRead < 1)) //ACK - return; - mouse_inbuffer[mouse_bytesRead] = inb; - mouse_bytesRead++; - if (mouse_bytesRead == 3) //complete packet received - { - mouse_bytesRead = 0; - int adjx = (char) mouse_inbuffer[1]; - int adjy = (char) mouse_inbuffer[2]; - mouse_x += adjx; - mouse_y -= adjy; //-= because screen y coordinates are opposite mouse y coordinates - if (mouse_x < 0) - mouse_x = 0; - if (mouse_x >= video_getWidth()) - mouse_x = video_getWidth() - 1; - if (mouse_y < 0) - mouse_y = 0; - if (mouse_y >= video_getHeight()) - mouse_y = video_getHeight() - 1; - if (mouse_inbuffer[0] & 0x01) //left button - video_pset(mouse_x, mouse_y, 0x00FF9900); - else - video_pset(mouse_x, mouse_y, 0x00FFFFFF); - } -} - - - -} - diff --git a/kernel/char/mouse.h b/kernel/char/mouse.h deleted file mode 100644 index 7514b9d..0000000 --- a/kernel/char/mouse.h +++ /dev/null @@ -1,17 +0,0 @@ -// mouse.h -// Author: Josh Holtrop -// Date: 10/03/03 -// Modified: 03/02/04 - -#ifndef __HOS_MOUSE__ -#define __HOS_MOUSE__ __HOS_MOUSE__ - -extern "C" { - -void mouse_init(); -void isr_mouse(); - -} - -#endif - diff --git a/kernel/fs/Mount.cpp b/kernel/fs/Mount.cpp deleted file mode 100644 index c005385..0000000 --- a/kernel/fs/Mount.cpp +++ /dev/null @@ -1,28 +0,0 @@ - -// Mount.cpp -// Author: Josh Holtrop -// Date: 06/16/04 -// Modified: 06/16/04 - -#include "lang/string.h" -#include "Mount.h" - -Mount::Mount() -{ -} - - -Mount::Mount(string dev, string mount) -{ - mountPoint = mount; - device = dev; -} - - -bool Mount::operator==(const Mount & second) const -{ - /* Match *either* device or mountPoint to signal an invalid mount attempt */ - return (device == second.device || mountPoint == second.mountPoint); -} - - diff --git a/kernel/fs/Mount.h b/kernel/fs/Mount.h deleted file mode 100644 index ae754de..0000000 --- a/kernel/fs/Mount.h +++ /dev/null @@ -1,28 +0,0 @@ - -// Mount.h -// Author: Josh Holtrop -// Date: 06/16/04 -// Modified: 06/16/04 - -#ifndef __HOS_MOUNT__ -#define __HOS_MOUNT__ __HOS_MOUNT__ - -#include "hos_defines.h" - -class Mount -{ -public: - string mountPoint; - string device; - dword major; - dword minor; - - Mount(); - Mount(string dev, string mount); - - bool operator==(const Mount & second) const; -}; - - -#endif - diff --git a/kernel/fs/devfs.cpp b/kernel/fs/devfs.cpp deleted file mode 100644 index 6b38d7c..0000000 --- a/kernel/fs/devfs.cpp +++ /dev/null @@ -1,25 +0,0 @@ - -// devfs.cpp -// device filesystem for HOS -// Author: Josh Holtrop -// Date: 06/03/04 -// Modified: 06/16/04 - -#include "devfs.h" -#include "kio.h" -#include "lang/string.h" -#include "vfs.h" - -void devfs_init(string mountPoint) -{ - vfs_mount("devfs ", mountPoint); - vfs_mount("testdev ", "/mnt/win"); - vfs_mount("/dev/hda6", "/scratch"); - vfs_mount("/dev/rd0 ", "/"); - vfs_mount("/dev/sda1", "/mnt/usb"); - vfs_mount("sysfs ", "/sys"); - vfs_mount("sysfs ", "/tmp"); - vfs_mount("otherfs ", "/sys"); -} - - diff --git a/kernel/fs/devfs.h b/kernel/fs/devfs.h deleted file mode 100644 index 3d39043..0000000 --- a/kernel/fs/devfs.h +++ /dev/null @@ -1,17 +0,0 @@ - -// devfs.h -// device filesystem for HOS -// Author: Josh Holtrop -// Date: 06/03/04 -// Modified: 06/08/04 - -#ifndef __HOS_DEVFS__ -#define __HOS_DEVFS__ __HOS_DEVFS__ - -#include "lang/string.h" - -void devfs_init(string mountPoint); - - -#endif - diff --git a/kernel/fs/vfat.cpp b/kernel/fs/vfat.cpp deleted file mode 100644 index 746e61d..0000000 --- a/kernel/fs/vfat.cpp +++ /dev/null @@ -1,113 +0,0 @@ -// vfat.c -// Author: Josh Holtrop -// Date: 03/11/04 -// Modified: 03/22/04 - -#include "vfat.h" -#include "hos_defines.h" -#include "fs/vfs.h" -#include "mm/vmm.h" -#include "lang/cstring.h" - -//From Microsoft's FAT32 File System Specification -DSKSZTOSECPERCLUS DskTableFAT16 [] = -{ - { 8400, 0}, /* disks up to 4.1 MB, the 0 value for SecPerClusVal trips an error */ - { 32680, 2}, /* disks up to 16 MB, 1k cluster */ - { 262144, 4}, /* disks up to 128 MB, 2k cluster */ - { 524288, 8}, /* disks up to 256 MB, 4k cluster */ - { 1048576, 16}, /* disks up to 512 MB, 8k cluster */ - /* The entries after this point are not used unless FAT16 is forced */ -// { 2097152, 32}, /* disks up to 1 GB, 16k cluster */ -// { 4194304, 64}, /* disks up to 2 GB, 32k cluster */ - { 0xFFFFFFFF, 0} /* any disk greater than 2GB, 0 value for SecPerClusVal trips an error */ -}; - -//From Microsoft's FAT32 File System Specification -DSKSZTOSECPERCLUS DskTableFAT32 [] = -{ - { 66600, 0}, /* disks up to 32.5 MB, the 0 value for SecPerClusVal trips an error */ - { 532480, 1}, /* disks up to 260 MB, .5k cluster */ - { 16777216, 8}, /* disks up to 8 GB, 4k cluster */ - { 33554432, 16}, /* disks up to 16 GB, 8k cluster */ - { 67108864, 32}, /* disks up to 32 GB, 16k cluster */ - { 0xFFFFFFFF, 64}/* disks greater than 32GB, 32k cluster */ -}; - -int vfat_identify(vfat_bpb *bpb) -{ - int rootDirSectors = ((bpb->rootEntries * 32) + (bpb->bytesPerSector - 1)) / bpb->bytesPerSector; - int totalSectors = bpb->totalSectors16 ? bpb->totalSectors16 : bpb->totalSectors32; - int fatSectors = bpb->sectorsPerFAT16 ? bpb->sectorsPerFAT16 : bpb->sectorsPerFAT32; - int dataSectors = totalSectors - (bpb->reservedSectors + bpb->numFATs * fatSectors + rootDirSectors); - int clusters = dataSectors / bpb->sectorsPerCluster; - if (clusters < 4085) - return 12; - if (clusters < 65525) - return 16; - return 32; -} - - -int vfat_format(Volume *vol) -{ - -} - -FILE *vfat_open(char *fileName, dword attributes, Volume *vol) -{ - while (*fileName == '/') - ++fileName; - if (strlen(fileName) < 1) - return 0; - vfat_bpb *bpb = vfat_getBootSector(vol); - if (!bpb) return 0; - byte *fat = vfat_loadFAT(vol, bpb); - if (!fat) - { - free(bpb); - return 0; - } - int segs = string_split(fileName); //number of sections of path (1=file is in root directory) - int me = vfat_identify(bpb); - if (me != 32) - { - if (segs == 1) //we are looking for the file in the root directory - { - vfat_getEntryInRoot(vol, bpb, fileName, 0); - } - } - else - { - } -} - -byte *vfat_loadFAT(Volume *vol, vfat_bpb *bpb) -{ - int fatSize = bpb->sectorsPerFAT16 ? bpb->sectorsPerFAT16 : bpb->sectorsPerFAT32; - byte *fat = malloc(fatSize << 9); //512 bytes per sector - if (!fat) return 0; - if (vfs_readSectorn(vol, bpb->reservedSectors, fat, fatSize)) - { - free(fat); - return 0; - } - return fat; -} - -vfat_bpb *vfat_getBootSector(Volume *vol) -{ - vfat_bpb *bs; - if (!(bs = malloc(512))) - return 0; - vfs_readSector(vol, 0, bs); - return bs; -} - -int vfat_close(FILE *fp) -{ - return free(fp); -} - - - diff --git a/kernel/fs/vfat.h b/kernel/fs/vfat.h deleted file mode 100644 index 0180505..0000000 --- a/kernel/fs/vfat.h +++ /dev/null @@ -1,134 +0,0 @@ -// vfat.h -// Author: Josh Holtrop -// Date: 03/11/04 -// Modified: 03/22/04 - -#ifndef __HOS_VFAT__ -#define __HOS_VFAT__ __HOS_VFAT__ - -#include "hos_defines.h" -#include "fs/vfs.h" - -#define VFAT_FAT12_EOCL 0x0FF8 // end-of-cluster chain reached if FatValue >= EOCL -#define VFAT_FAT16_EOCL 0xFFF8 -#define VFAT_FAT32_EOCL 0x0FFFFFF8 - -#define VFAT_FAT12_EOC 0x0FFF // end-of-cluster chain value -#define VFAT_FAT16_EOC 0xFFFF -#define VFAT_FAT32_EOC 0x0FFFFFFF - -#define VFAT_FAT12_BAD 0x0FF7 // bad cluster mark -#define VFAT_FAT16_BAD 0xFFF7 -#define VFAT_FAT32_BAD 0x0FFFFFF7 - -#define VFAT_DIRENTRY_FREE 0xE5 -#define VFAT_DIRENTRY_FREE_LAST 0x00 - -typedef struct -{ - byte jmpBoot[3]; // {0xEB, 0x??, 0x90} or {0xE9, 0x??, 0x??} - char OEMName[8]; // any 8-char string (def. "MSWIN4.1") - word bytesPerSector; // 512 (default), 1024, 2048, 4096 - byte sectorsPerCluster; // 1 (default), 2, 4, 8, 16, 32, 64, 128 - word reservedSectors; // 1 (fat12/16), 32 (fat32) - byte numFATs; // 2 - word rootEntries; // number of 32-byte root directory entries (224 for 1440k floppy) - 0 for fat32 - word totalSectors16; // total number of sectors in volume (2880 for floppy) - 0 for fat32 - byte media; // >= 0xF0 valid, 0xF8 (default non-removable), 0xF0 (default removable), must match lsb of FAT[0] - word sectorsPerFAT16; // number of sectors in FAT (9 for floppy) - word sectorsPerTrack; // (18 for floppy) - word numHeads; // number of heads (2 for floppy) - dword hiddenSectors; // 0 - dword totalSectors32; // 0, non-zero for fat32 volumes - - /* FAT32 specific members */ - dword sectorsPerFAT32; // number of sectors in a fat for fat32 volumes - word extFlags; // bits 0-3 active fat, bit 7 {0 = mirror all FATs, 1 = only use 1 FAT} - word fsVersion; // fat32 version (0:0) - dword rootCluster; // first cluster of root directory (default 2) - word fsInfo; // sector number of FSINFO block (default 1) - word bootCopy; // sector of backup boot record (default 6) -} __attribute__ ((packed)) vfat_bpb; - -typedef struct -{ - dword leadSignature; // 0x41615252 - byte reserved1[480]; - dword structSignature; // 0x61417272 - dword lastFree; // last known free cluster (0xFFFFFFFF == unknown) - dword nextFree; // start looking for free clusters here (0xFFFFFFFF == unknown) - byte reserved2[12]; - dword trailSignature; // 0xAA550000 -} __attribute__ ((packed)) vfat_fsinfo; - -typedef struct -{ - char fileName[8]; // file name, 8 char. max, pad w/ spaces - char fileExt[3]; // file extension, 3 char. max, pad w/ spaces - byte attributes; // file attributes, read-only, etc. - byte reserved; // 0 - byte timeTenths; // 0-199 - word time; // time of creation - word date; // date of creation - word adate; // last accessed date - word clusterHigh; // 0 for fat12/16 - word wtime; // last write time - word wdate; // last write date - word clusterLow; // LSW of first cluster of file data - dword fileSize; -} __attribute__ ((packed)) vfat_dirEntry; - -typedef struct -{ - byte order; - word name0_4[5]; // filename - first 5 characters (unicode) - byte attributes; // must be VFAT_LONG_NAME - byte type; // 0 = part of long name - byte checksum; // checksum of short entry at end of long entry set - word name5_10[6]; // filename - next 6 characters (unicode) - word clusterLow; // 0 - word name11_12[2]; // filename - next 2 characters -} __attribute__ ((packed)) vfat_lfnEntry; - -#define VFAT_READ_ONLY 0x01 -#define VFAT_HIDDEN 0x02 -#define VFAT_SYSTEM 0x04 -#define VFAT_VOLUME 0x08 -#define VFAT_DIRECTORY 0x10 -#define VFAT_ARCHIVE 0x20 - -#define VFAT_LONG_NAME 0x0F // VFAT_READ_ONLY | VFAT_HIDDEN | VFAT_SYSTEM | VFAT_VOLUME -#define VFAT_ATTR_MASK 0x3F // VFAT_READ_ONLY | VFAT_HIDDEN | VFAT_SYSTEM | VFAT_VOLUME | VFAT_DIRECTORY | VFAT_ARCHIVE - -#define VFAT_ORDER_MASK 0x40 - -/* - * Illegal file name characters: - * Values less than 0x20 except for 0x05. 0x05 signifies that the actual filename character is 0xE5 - * 0x22 ("), 0x2A (*) - * 0x2E (.), 0x2F (/), 0x3A (:) - * 0x3C (<), 0x3E (>), 0x3F (?), 0x5C (\), 0x7C (|) - * The following are illegal in 8.3 but legal in LFN: - * 0x2B (+), 0x2C (,), 0x3B (;), 0x3D (=), 0x5B ([), 0x5D (]) - */ - -//From Microsoft's FAT32 File System Specification -typedef struct -{ - dword diskSize; - byte sectorsPerCluster; -} DSKSZTOSECPERCLUS; - -// sector[510] == 0x55 -// sector[511] == 0xAA - -int vfat_identify(vfat_bpb *bpb); -int vfat_format(Volume *vol); -FILE *vfat_open(char *fileName, dword attributes, Volume *vol); -vfat_bpb *vfat_getBootSector(Volume *vol); -int vfat_close(FILE *fp); -byte *vfat_loadFAT(Volume *vol, vfat_bpb *bpb) - -#endif - - diff --git a/kernel/fs/vfs.cpp b/kernel/fs/vfs.cpp deleted file mode 100644 index a4ef2d4..0000000 --- a/kernel/fs/vfs.cpp +++ /dev/null @@ -1,55 +0,0 @@ - -// vfs.cpp -// Author: Josh Holtrop -// Date: 03/11/04 -// Modified: 04/16/04 - -#include "hos_defines.h" -#include "vfs.h" -//#include "fs/vfat.h" -//#include "block/rd.h" -//#include "block/loop.h" -#include "lang/LinkedList.h" -#include "lang/string.h" -#include "devfs.h" -#include "kio.h" -#include "Mount.h" - -LinkedList *mounts; - -void vfs_init() -{ - - mounts = new LinkedList; - -} - - -void list() -{ - LinkedList::iterator it = mounts->begin(); - while (it != mounts->end()) - { - printf("%s\t%s\n", (*it).device.data(), (*it).mountPoint.data()); - ++it; - } -} - - -int vfs_mount(string device, string mountPoint) -{ - Mount mount(device, mountPoint); - LinkedList::iterator it = mounts->begin(); - int i = 0; - while (it != mounts->end() && (*it).mountPoint <= mount.mountPoint) - { - if (*it == mount) - return 1; //device already mounted or mount point already taken - i++; - ++it; - } - mounts->insert(i, mount); - return 0; -} - - diff --git a/kernel/fs/vfs.h b/kernel/fs/vfs.h deleted file mode 100644 index 60a1adc..0000000 --- a/kernel/fs/vfs.h +++ /dev/null @@ -1,19 +0,0 @@ - -// vfs.h -// Author: Josh Holtrop -// Date: 03/11/04 -// Modified: 06/16/04 - -#ifndef __HOS_VFS__ -#define __HOS_VFS__ __HOS_VFS__ - -#include "hos_defines.h" -#include "lang/string.h" - -void vfs_init(); -int vfs_mount(string device, string mountPoint); -void list(); - -#endif - - diff --git a/kernel/functions.h b/kernel/functions.h deleted file mode 100644 index 568912e..0000000 --- a/kernel/functions.h +++ /dev/null @@ -1,94 +0,0 @@ -//functions.h -//05/07/03 Josh Holtrop -//for HOS -//Modified: 02/26/04 - -#ifndef __HOS_FUNCTIONS__ -#define __HOS_FUNCTIONS__ __HOS_FUNCTIONS__ - -#include "hos_defines.h" -#include "sys/io.h" - -extern dword _code; -extern dword _bss; -extern dword _end; - -//Enables (SeTs) Interrupt Flag on the processor -static inline void enable_ints() -{ - asm("sti"); -} - -//Disables (CLears) Interrupt Flag on the processor -static inline void disable_ints() -{ - asm("cli"); -} - -//Restarts the computer -static inline void restart() -{ - enable_ints(); - byte temp; - do - { - temp = inportb(0x64); - if (temp & 1) - inportb(0x60); - } while(temp & 2); - - - outportb (0x64, 0xfe); - for (;;) {} -} - -//Halts (freezes) the computer -static inline void halt() -{ - asm("cli"); - asm("hlt"); - while (1); -} - -//Initializes 8253 Programmable Interrupt Timer -static inline void timer_init() -{ - //set timer : 2e9c = 100hz - outportb(0x43, 0x34); - outportb(0x40, 0x9c); //lsb - outportb(0x40, 0x2e); //msb -} - -//Returns the size of the kernel (code & data) -// - this does include the bss section -// - this should be 4kb aligned per the linker script -// - this is the amount of RAM the kernel code, data, & bss take -static inline dword kernel_size_used() -{ - return (dword)(&_end)-(dword)(&_code); -} - -//Returns the size of the kernel (code & data) -// - this does not include the bss section -// - this should be 4kb aligned per the linker script -// - this should be the size of kernel.bin -static inline dword kernel_size() -{ - return (dword)(&_bss)-(dword)(&_code); -} - -//converts a binary-coded-decimal byte to its decimal equivalent -static inline byte bcd2byte(byte bcd) -{ - return (10 * ((bcd & 0xF0) >> 4)) + (bcd & 0x0F); -} - -//converts a binary-coded-decimal byte to its decimal equivalent -static inline byte byte2bcd(byte bite) -{ - return ((bite / 10) << 4) | (bite % 10); -} - -#endif - - diff --git a/kernel/gdt.inc b/kernel/gdt.inc index c63db67..67d676e 100644 --- a/kernel/gdt.inc +++ b/kernel/gdt.inc @@ -37,7 +37,7 @@ USER_DATA equ $-gdt db 0xF2 ;access ([P][DPL][1][Executable][Direction/Conforming][Writable/Readable][A]) db 0xCF ;flags ([G][D/B][0][0]) / limit 19:16 db 0x00 ;base 31:24 -gVESA_CODE equ $-gdt +VESA_CODE equ $-gdt dw 0xffff ;limit 15:0 dw 0x0000 ;base 15:0 db 0x00 ;base 23:16 diff --git a/kernel/hos_defines.cpp b/kernel/hos_defines.cpp deleted file mode 100644 index 7e08e5d..0000000 --- a/kernel/hos_defines.cpp +++ /dev/null @@ -1,27 +0,0 @@ - -#include "mm/vmm.h" - -//overload the operator "new" -void * operator new (dword size) -{ - return malloc(size); -} - -//overload the operator "new[]" -void * operator new[] (dword size) -{ - return malloc(size); -} - -//overload the operator "delete" -void operator delete (void *p) -{ - free(p); -} - -//overload the operator "delete[]" -void operator delete[] (void *p) -{ - free(p); -} - diff --git a/kernel/hos_defines.h b/kernel/hos_defines.h deleted file mode 100644 index edfff34..0000000 --- a/kernel/hos_defines.h +++ /dev/null @@ -1,48 +0,0 @@ -//hos_defines.h -//03/17/03 Josh Holtrop -//Modified: 03/02/04 - -#ifndef __HOS_HOS_DEFINES__ -#define __HOS_HOS_DEFINES__ __HOS_HOS_DEFINES__ - -#define FREERAM_START 0x368000 // 0x368000 is first available byte (this is right after the initrd @ 2mb, 1440kb. -#define MAX_RAM 0x40000000 //1gb maximum RAM supported - -#define PID_KERNEL 0x02 //kernel's PID -#define PID_VMM 0x03 -#define PID_USER 0x10000 //user processes' start PID - - -//these defines are the memory locations of values saved by the stage 2 bootloader -#define BOOT_MEMMAP_ENTRIES 0xC009040A -#define BOOT_FIRST_MEMMAP 0xC0092000 -#define BOOT_VIDEO_MODE 0xC0090002 -#define BOOT_VIDEO_MODE_INFO_BLOCK 0xC0090306 -#define BOOT_HASRD 0xC0090000 - -#define NULL 0 - -typedef unsigned char byte; -typedef unsigned short word; -typedef unsigned int dword; - -typedef struct { - dword lowdword; - dword highdword; -} __attribute__((packed)) qword; - -//overload the operator "new" -void * operator new (dword size); - -//overload the operator "new[]" -void * operator new[] (dword size); - -//overload the operator "delete" -void operator delete (void *p); - -//overload the operator "delete[]" -void operator delete[] (void *p); - -#endif - - diff --git a/kernel/idt.inc b/kernel/idt.inc index ddabf24..9d75ba9 100644 --- a/kernel/idt.inc +++ b/kernel/idt.inc @@ -1,7 +1,7 @@ ;idt.inc ;Author: Josh Holtrop ;Date: 10/30/03 -;Modified: 03/02/04 +;Modified: 07/06/04 idtr: dw 50*8-1 ;size of idt @@ -67,49 +67,24 @@ isr_label 48 isr_label 49 isr_main: - cmp eax, 0x30 - jz isr_syscall - pusha push ds push es - push eax - + push eax ;interrupt number call _isr - add esp, 4 pop es pop ds popa - pop eax + pop eax ;original saved eax iret -isr_syscall: - pop eax ;syscall function number - pusha - push ds - push es - -sc1: - cmp eax, 1 ;syscall 1 - putc - jnz sc2 - push ebx - call _putc - add esp, 4 - jmp scdone -sc2: - -scdone: - pop es - pop ds - popa - iret - - + + diff --git a/kernel/kernel.asm b/kernel/kernel.asm deleted file mode 100644 index d30ad58..0000000 --- a/kernel/kernel.asm +++ /dev/null @@ -1,102 +0,0 @@ -;kernel.asm -;Author: Josh Holtrop -;Date: 10/30/03 -;Modified: 10/30/03 - -%define GDT_P 0x100000; ;1mb physical - Global Descriptor Table space -%define GDT_V GDT_P+0xC0000000 -%define IDT_P 0x102000 ;1mb+8kb - Interrupt Descriptor Table space -%define IDT_V IDT_P+0xC0000000 -%define PDBR_P 0x104000 ;1mb+16kb - Page Directory Base Register (first PD) -%define PDBR_V PDBR_P+0xC0000000 -%define LOPT_P 0x105000 ;1mb+20kb - LOw Page Table for mapping first 4mb -%define LOPT_V LOPT_P+0xC0000000 -%define KERNEL_P 0x106000 ;1mb+24kb - the kernel's physical address -%define KERNEL_V KERNEL_P+0xC0000000 ;3gb+1mb+24kb, the virtual address of the kernel - -[global _start] -[extern _isr] -[extern _k_init] -[extern _putc] - -bits 32 - -;This is where the kernel begins execution -;At this point, the temporary gdt is set up to "map" 0xC000_0000 to 0x0. -;We must enable paging with the first 4mb mapped 1:1 virtual:physical -; and with the 4mb starting at 0xC000_0000 mapped to the first 4mb physical. -;Then we can start using our "real" gdt, then unmap the lower 4mb. -_start: - cli ;if they weren't already off - - xor eax, eax - mov edi, PDBR_V - mov ecx, 1024 ;clear the PDBR - rep stosd - mov [PDBR_V], dword LOPT_P|0x03 ;store the physical address of the LOw Page Table (read/write, present) - mov [PDBR_V+0xC00], dword LOPT_P|0x03 ;store the physical address of the LOw Page Table (read/write, present) - - mov edi, LOPT_V - mov ecx, 1024 - mov eax, 0x03 ;starting physical address = 0x0 (read/write, present flags) -fill_lopt_loop: ;fill the page table - stosd - add eax, 4096 ;increment next phsyical address by 4kb - loop fill_lopt_loop - - mov eax, PDBR_P - mov cr3, eax ;store the Page Directory Base Address - mov eax, cr0 - or eax, 0x80000000 ;set page enable bit - mov cr0, eax ;now paging is active! - - - mov edi, GDT_V - mov esi, gdt - mov ecx, gdt_end-gdt -copy_gdt: - lodsb - stosb - loop copy_gdt - - mov edi, IDT_V ;destination - mov esi, isr_0 ;address of isr0 - mov edx, isr_1-isr_0 ;distance between isr labels - mov ecx, 50 ;number of isrlabels -fill_idt: - mov ebx, esi - mov ax, si - stosw ;0 offset 15:0 - mov ax, KERNEL_CODE - stosw ;2 selector 15:0 - mov ax, 0x8E00 - stosw ;4 [P][DPL][0][TYPE][0][0][0][0][0][0][0][0] - shr esi, 16 - mov ax, si - stosw ;6 offset 31:16 - mov esi, ebx - add esi, edx - loop fill_idt - mov word [IDT_V+0x30*8+4], 0xEE00 ;interrupt 0x30 has user priviledges - - lgdt [gdtr] ;load gdt - jmp KERNEL_CODE:newgdtcontinue -newgdtcontinue: - mov ax, KERNEL_DATA - mov es, ax - mov ds, ax - mov gs, ax - mov fs, ax - mov ss, ax - mov esp, 0xc0200000 ;stack just under 3gb+2mb, moves downward - lidt [idtr] ;load idt - - call _k_init -haltit: - hlt ;halt processor when k_init is done - jmp haltit ;shouldn't get here... - -%include "gdt.inc" -%include "idt.inc" - - diff --git a/kernel/kernel.c b/kernel/kernel.c new file mode 100644 index 0000000..d736d9c --- /dev/null +++ b/kernel/kernel.c @@ -0,0 +1,25 @@ + +#include "kernel.h" +#include "multiboot.h" +#include "module.h" + + + +int k_mbsave(mb_info_t *mbinfo, unsigned int mb_magic) +{ + return 0; +} + +void k_init() +{ + for (;;) + { + (*(char*)0xC00B8000)++; + } +} + +void isr() +{ + for (;;) ; +} + diff --git a/kernel/kernel.cpp b/kernel/kernel.cpp deleted file mode 100644 index ad48196..0000000 --- a/kernel/kernel.cpp +++ /dev/null @@ -1,129 +0,0 @@ -// kernel.c -// Author: Josh Holtrop -// Date: 08/13/03 -// Holtrop's Operating System - Version 0.13 -// Modified: 03/08/04 - -#include "hos_defines.h" //#DEFINE's for kernel - -#include "functions.h" //general functions -#include "asmfuncs.h" //assembly functions -#include "kio.h" //kernel input/output functions -#include "mm/mm.h" //physical memory management functions -#include "mm/vmm.h" //virtual memory management & paging functions -#include "char/keyboard.h" //generic keyboard driver & functions -#include "char/mouse.h" //generic ps/2 mouse driver & functions -#include "block/fdc.h" //Floppy Disk Controller functions -#include "sys/cmos.h" //CMOS interface functions -#include "sys/io.h" //port i/o functions -#include "sys/pic.h" //Programmable Interrupt Controller functions -#include "sys/rtc.h" //Real Time Clock functions -#include "video/video.h" //video functions -#include "fs/vfs.h" //Virtual File System layer -#include "fs/devfs.h" //Device filesystem - -extern "C" { - -void isr(dword num); -void k_init(); - -dword timer = 0; - -//Main kernel initialization method -void k_init() -{ - // ===== Initialization - fdc_sendDOR(0x0C); //turn off floppy motor!! - mm_init(); - vmm_init(); - video_init(); - kio_init(); - kio_console_cls(); - pic_remap(0x20, 0x28); - timer_init(); - mouse_init(); - pic_mask1(0); //unmask IRQ's 0-7 - pic_mask2(0); //unmask IRQ's 8-15 - enable_ints(); - kbd_resetLEDs(); //after enabling interrupts!! - if (video_Mode()) - { - int w = video_getWidth(), h = video_getHeight(); - int p = w * h - 1; - for (; p >= 0; p--) - video_pseti(p, 0x00000075); - int x = w >> 1, y = h >> 1, sz = h >> 1; - for (p = 0; p <= sz; p += 24) - { - video_line(x + p, y, x, y + sz - p, 0x0000FF00); - video_line(x + p, y, x, y - sz + p, 0x0000FF00); - video_line(x - p, y, x, y + sz - p, 0x0000FF00); - video_line(x - p, y, x, y - sz + p, 0x0000FF00); - } - kio_drawConsole(); - } - - printf("HOS 0.14 - Kernel File Size: %uKb Mem Used: %uKb\n", kernel_size()>>10, kernel_size_used()>>10); - printf("Memory available to OS: %u MB (%u bytes)\n", mm_getTotalMegs(), mm_getTotalMem()); - printf("Free memory: %u bytes (%u pages)\n", mm_freemem(), mm_freemem()>>12); - printf("Built on %s at %s\n", __DATE__, __TIME__); - printf("%b/%b/%b %b:%b:%b\n", rtc_readMonth(), rtc_readDay(), rtc_readYear(), rtc_readHour(), rtc_readMinute(), rtc_readSecond()); - - vfs_init(); - devfs_init("/dev"); - list(); - - printf("Done.\n"); - - dword key = 0; - for (;;) - { - key = kbdWaitKey(); - if ((key & 0xFF) > 2) //key is not a control key - putc(key); - } -} - -// main Interrupt Service Routine - handles all interrupts unless caught by kernel.asm -void isr(dword num) -{ - switch(num) - { - case 14: - printf("Page fault, CR2 = 0x%x\n", read_cr2()); - { - enable_ints(); - for (;;) ; //infinetly loop so that my KVM will still work :) 06/10/04 - } -// halt(); - break; - case 0x20: // IRQ0 - timer interrupt - timer++; - (*(byte *)(0xc00b8000))++; - if (!(timer % 100)) - { - dword curPos = kio_getCursorPosition(); - kio_writeCursorPosition(72); - printf("%b:%b:%b\n", rtc_readHour(), rtc_readMinute(), rtc_readSecond()); - kio_writeCursorPosition(curPos); - } - pic_eoi(); - break; - case 0x21: // IRQ1 - keyboard interrupt - isr_keyboard(); //isr_keybard() takes care of calling eoi() - break; - case 0x2C: // IRQ12 - PS/2 mouse - isr_mouse(); - pic_eoi2(); - break; - default: - printf("Interrupt %d (0x%x) Unhandled!!\n", num, num); - halt(); - break; - } -} - -} - - - diff --git a/kernel/kio.cpp b/kernel/kio.cpp deleted file mode 100644 index 266baeb..0000000 --- a/kernel/kio.cpp +++ /dev/null @@ -1,227 +0,0 @@ -// kio.c -// Author: Josh Holtrop -// Created: 12/25/03 -// Modified: 04/06/04 - -#include "hos_defines.h" -#include "kio.h" -#include "asmfuncs.h" -#include "video/video.h" - -dword graphical; -dword cursorPosition; //Caches the current cursor position -word console_memory[2000]; //holds a copy of the console's memory - -// This is the main output routine, it uses a format string and a variable -// number of arguments to print formatted text -extern "C" { - -void kio_init() -{ - graphical = video_Mode(); - cursorPosition = 0; - writeCursorPosition(0); -} - -void printf(char *fmt, ...) -{ - dword *params = ((dword *)(&fmt)) + 1; //points to the first paramater - int i; - int special = 0; - for (i = 0; ; i++) - { - if (special) - { - special = 0; - switch (fmt[i]) - { - case 0: - return; - case '%': - putc('%'); - break; - case 's': case 'S': - puts((char *)*params); - params++; - break; - case 'c': case 'C': - putc(*params); - params++; - break; - case 'd': case 'D': case 'i': case 'I': - putDec(*params); - params++; - break; - case 'u': case 'U': - putDecu(*params); - params++; - break; - case 'x': case 'X': - putHex(*params); - params++; - break; - case 'b': case 'B': - kio_putBCD(*params); - params++; - break; - } - } - else - { - switch (fmt[i]) - { - case '%': - special = 1; - break; - case 0: - return; - default: - putc(fmt[i]); - } - } - } -} - - -// This function draws a single character -void putc(dword chr) -{ - char charac = (char)chr; - word *vidmem = (word *)0xC00B8000; - if (charac == '\n') - { - if (cursorPosition % 80) - cursorPosition = cursorPosition + 80 - (cursorPosition % 80); - else - cursorPosition += 80; - } - else if (charac == '\t') - { - if (cursorPosition % 8) - cursorPosition = cursorPosition + 8 - (cursorPosition % 8); - else - cursorPosition += 8; - } - else - { - if (graphical) - { - console_memory[cursorPosition] = charac | 0x0700; - kio_drawConsoleChar(cursorPosition); - } - else - { - console_memory[cursorPosition] = charac | 0x0700; - vidmem[cursorPosition] = charac | 0x0700; - } - cursorPosition++; - } - if (cursorPosition >= 2000) - { - kio_console_scroll(); - cursorPosition = 2000-80; - } - if (!graphical) - writeCursorPosition(cursorPosition); -} - - -// This function displays a number in hexadecimal -void putHex(dword number) -{ - int hitNum = 0; - int i; - for (i = 7; i >= 0; i--) - { - dword val = (number >> (i*4)) & 0xF; - if ((val != 0) || (i == 0)) - hitNum = 1; - if (hitNum) - { - val = val + '0'; - if (val > '9') - val = val + ('A' - '9' - 1); - putc(val); - } - } -} - - -void kio_putBCD(dword bcd) -{ - putc(((bcd & 0xF0) >> 4) + '0'); - putc((bcd & 0xF) + '0'); -} - - -void kio_console_scroll() -{ - memcpyd(console_memory, console_memory + 80, 960); - memsetw(console_memory + 1920, 0x0720, 80); - if (graphical) - kio_drawConsole(); - else - memcpyd((void *)0xC00B8000, console_memory, 1000); -} - - -void kio_console_cls() -{ - memsetw(console_memory, 0x0720, 2000); - if (graphical) - kio_drawConsole(); - else - memcpyd((void *)0xC00B8000, console_memory, 1000); - writeCursorPosition(0); -} - - -// This function draws a simple "console" window in graphical mode to display text -void kio_drawConsole() -{ - video_rectf(8, 8, 491, 261, 0); - video_rect(7, 7, 492, 262, 0x00777777); - int x, y; - x = 250, y = 135; - int s = 100, p = 0; - for (p = 0; p <= s; p += 16) - { - video_line(x + p, y, x, y + s - p, 0x00008800); - video_line(x + p, y, x, y - s + p, 0x00008800); - video_line(x - p, y, x, y + s - p, 0x00008800); - video_line(x - p, y, x, y - s + p, 0x00008800); - } - - for (x = 0; x < 80; x++) - { - for (y = 0; y < 25; y++) - { - video_renderChar(x*6+10, y*10+10, console_memory[y*80+x], 0, 0x00FFFFFF, 0, 0); - } - } -} - - -// This function draws a "console" character to the graphical video screen -void kio_drawConsoleChar(dword position) -{ - int x = position % 80; - int y = position / 80; - video_renderChar(x*6+10, y*10+10, console_memory[y*80+x], 0, 0x00FFFFFF, 1, 0); -} - - -dword kio_getCursorPosition() -{ - return cursorPosition; -} - -void kio_writeCursorPosition(dword position) -{ - cursorPosition = position; - if (!graphical) - writeCursorPosition(position); -} - - -} diff --git a/kernel/kio.h b/kernel/kio.h deleted file mode 100644 index 5af2c92..0000000 --- a/kernel/kio.h +++ /dev/null @@ -1,29 +0,0 @@ -// kio.h -// Author: Josh Holtrop -// Created: 12/25/03 -// Modified: 05/21/04 - -#ifndef __HOS_KIO__ -#define __HOS_KIO__ __HOS_KIO__ - -#include "hos_defines.h" - -extern "C" { - - void kio_init(); - void printf(char *fmt, ...); - void putc(dword chr); - void putHex(dword number); - void kio_drawConsole(); - void kio_drawConsoleChar(dword position); - void kio_console_scroll(); - void kio_console_cls(); - void kio_putBCD(dword bcd); - dword kio_getCursorPosition(); - void kio_writeCursorPosition(dword position); - -} - -#endif - - diff --git a/kernel/lang/LinkedList.h b/kernel/lang/LinkedList.h deleted file mode 100644 index b8f6bd2..0000000 --- a/kernel/lang/LinkedList.h +++ /dev/null @@ -1,210 +0,0 @@ - -// LinkedList.h -// implements a LinkedList container for HOS -// Author: Josh Holtrop -// Date: 05/22/04 -// Modified: 06/09/04 - -#ifndef __HOS_LINKEDLIST__ -#define __HOS_LINKEDLIST__ __HOS_LINKEDLIST__ - -template -class LinkedList -{ -private: - class LinkedNode - { - public: - LinkedNode() - { - prev = next = 0; - } - LinkedNode(Element dataElement) - { - data = dataElement; - prev = next = 0; - } - Element data; - LinkedNode *next; - LinkedNode *prev; - }; - - LinkedNode *firstNode; - LinkedNode *lastNode; - int count; - -public: - class iterator - { - private: - LinkedNode *theNode; - public: - iterator(LinkedNode & node) - { - theNode = &node; - } - iterator(LinkedNode *node) - { - theNode = node; - } - Element & operator*() - { - return theNode->data; - } - void operator++() //prefix - { - theNode = theNode->next; - } - void operator++(int dum) //postfix - { - theNode = theNode->next; - } - bool operator==(const iterator & second) const - { return theNode == second.theNode; } - bool operator!=(const iterator & second) const - { return theNode != second.theNode; } - }; - - class reverse_iterator - { - private: - LinkedNode *theNode; - public: - reverse_iterator(LinkedNode & node) - { - theNode = &node; - } - reverse_iterator(LinkedNode *node) - { - theNode = node; - } - Element & operator*() - { - return theNode->data; - } - void operator++() //prefix - { - theNode = theNode->prev; - } - void operator++(int dum) //postfix - { - theNode = theNode->prev; - } - bool operator==(const reverse_iterator & second) const - { return theNode == second.theNode; } - bool operator!=(const reverse_iterator & second) const - { return theNode != second.theNode; } - }; - - /* Basic constructor */ - LinkedList(); - - /* How many elements in the list */ - int size() { return count; } - - /* Return some iterators for traversing the list */ - iterator begin() { return iterator(firstNode->next); } - iterator end() { return iterator(lastNode->next); } - reverse_iterator rbegin() { return reverse_iterator(lastNode); } - reverse_iterator rend() { return reverse_iterator(firstNode); } - - /* Insert an element, its position will be index */ - LinkedList & insert(int index, Element e); - - /* Append an element to the end of the list */ - LinkedList & push_back(Element e); - - /* Remove an element at position index */ - LinkedList & remove(int index); - - /* Pop an element from the end of the list */ - LinkedList & pop_back(); - - /* Direct access to an element in the list */ - Element & operator[](int index); -}; - -template -LinkedList::LinkedList() -{ - firstNode = lastNode = new LinkedNode(); //head node - count = 0; -} - -template -LinkedList & LinkedList::insert(int index, Element e) -{ - if (index == count) - push_back(e); - else if (index >= 0 && index < count) - { - LinkedNode *nptr = firstNode; - for (int i = 0; i <= index; i++) - nptr = nptr->next; - LinkedNode *newptr = new LinkedNode(e); - newptr->next = nptr; - newptr->prev = nptr->prev; - newptr->prev->next = newptr; - nptr->prev = newptr; - count++; - } - return *this; -} - -template -LinkedList & LinkedList::push_back(Element e) -{ - lastNode->next = new LinkedNode(e); - lastNode->next->prev = lastNode; - lastNode = lastNode->next; - count++; - return *this; -} - -template -LinkedList & LinkedList::remove(int index) -{ - if (index == count-1) - pop_back(); - else if (index >= 0 && index < count) - { - LinkedNode *nptr = firstNode; - for (int i = 0; i <= index; i++) - nptr = nptr->next; - nptr->prev->next = nptr->next; - nptr->next->prev = nptr->prev; - delete nptr; - count--; - } - return *this; -} - -template -LinkedList & LinkedList::pop_back() -{ - if (count) - { - lastNode = lastNode->prev; - delete lastNode->next; - lastNode->next = 0; - count--; - } - return *this; -} - -template -Element & LinkedList::operator[](int index) -{ - if (index >= 0 && index < count) - { - LinkedNode *nptr = firstNode; - for (int i = 0; i <= index; i++) - nptr = nptr->next; - return nptr->data; - } - return firstNode->data; -} - - -#endif - diff --git a/kernel/lang/cstring.cpp b/kernel/lang/cstring.cpp deleted file mode 100644 index b9f5872..0000000 --- a/kernel/lang/cstring.cpp +++ /dev/null @@ -1,91 +0,0 @@ -// cstring.c -// Author: Josh Holtrop -// Created: 02/26/04 -// Modified: 06/01/04 -// Implements c string functions - -#include "string.h" -#include "asmfuncs.h" - -char *strcat(char *dest, const char *src) -{ - strcpy(dest+strlen(dest), src); - return dest; -} - - -//Splits a string into multiple strings by turning all characters -// equal to delim into null values (string termination character) -//Returns the number of strings after the split, 1 if no delim chars -int string_split(char *str, char delim) -{ - if (strlen(str) < 1) - return 0; //empty string - int count = 1; - for (; *str; str++) - { - if (*str == delim) - { - count++; - *str = 0; - } - } - return count; -} - - -//Advances a char pointer to the byte after the current string's -// null-terminating character -//Useful after calling string_split() -//Returns a pointer to the following string -char *string_advance(char *str) -{ - for (; *str; str++); - return str+1; -} - - -void rtrim(char *str) -{ - str += strlen(str); //now points to the null character at the end of the string - str--; - for (;;) - { - if ((*str == ' ') || (*str == '\t') || (*str == '\n')) - *str-- = 0; - else - break; - } -} - - -char *ucase(char *str) -{ - char *ret = str; - for (;;) - { - if (*str == 0) - break; - if ((*str >= 'a') && (*str <= 'z')) - *str = (*str) - 32; - str++; - } - return ret; -} - - -char *lcase(char *str) -{ - char *ret = str; - for (;;) - { - if (*str == 0) - break; - if ((*str >= 'A') && (*str <= 'Z')) - *str = (*str) + 32; - str++; - } - return ret; -} - - diff --git a/kernel/lang/cstring.h b/kernel/lang/cstring.h deleted file mode 100644 index 4b39abb..0000000 --- a/kernel/lang/cstring.h +++ /dev/null @@ -1,19 +0,0 @@ -// cstring.h -// Author: Josh Holtrop -// Created: 02/26/04 -// Modified: 06/01/04 -// Implements c string functions - -#ifndef __HOS_CSTRING__ -#define __HOS_CSTRING__ __HOS_CSTRING__ - -char *strcat(char *dest, const char *src); -int string_split(char *str, char delim); -char *string_advance(char *str); -void rtrim(char *str); -char *ucase(char *str); -char *lcase(char *str); - -#endif - - diff --git a/kernel/lang/string.cpp b/kernel/lang/string.cpp deleted file mode 100644 index e7ccfbd..0000000 --- a/kernel/lang/string.cpp +++ /dev/null @@ -1,279 +0,0 @@ - -// string.cpp -// implements c++ string object for HOS -// Author: Josh Holtrop -// Date: 06/01/04 -// Modified: 06/07/04 - -#include "string.h" //string class declaration -#include "asmfuncs.h" //memcpy(void *dest, void *src, int n), strlen(char *str) - -string::string() -{ - myLength = 0; - myChars = new char; //myChars must be a valid pointer at all times - *myChars = 0; -} - -string::~string() -{ - delete[] myChars; -} - -string::string(const string & orig) -{ - myLength = orig.myLength; - myChars = new char[myLength + 1]; - memcpy(myChars, orig.myChars, myLength + 1); -} - -string::string(const char *cstring) -{ - myLength = strlen(cstring); - myChars = new char[myLength + 1]; - memcpy(myChars, cstring, myLength + 1); -} - -string & string::operator=(const string & orig) -{ - if (this != &orig) - { - delete[] myChars; - myLength = orig.myLength; - myChars = new char[myLength + 1]; - memcpy(myChars, orig.myChars, myLength + 1); - } - return *this; -} - -string & string::operator=(const char *cstring) -{ - if (myChars != cstring) - { - delete[] myChars; - myLength = strlen(cstring); - myChars = new char[myLength + 1]; - memcpy(myChars, cstring, myLength + 1); - } - return *this; -} - -char * string::data() const { return myChars; } - -int string::size() const { return myLength; } - -string & string::operator+=(const string & str) -{ - char *newStr = new char[myLength + str.myLength + 1]; - memcpy(newStr, myChars, myLength); - memcpy(newStr + myLength, str.myChars, str.myLength + 1); - delete[] myChars; - myChars = newStr; - myLength += str.myLength; - return *this; -} - -string & string::operator+=(const char *cstring) -{ - char *newStr = new char[myLength + strlen(cstring) + 1]; - memcpy(newStr, myChars, myLength); - memcpy(newStr + myLength, cstring, strlen(cstring) + 1); - delete[] myChars; - myChars = newStr; - myLength += strlen(cstring); - return *this; -} - -string & string::operator-=(const string & str) -{ - char *newStr = new char[myLength + str.myLength + 1]; - memcpy(newStr, str.myChars, str.myLength); - memcpy(newStr + str.myLength, myChars, myLength + 1); - delete[] myChars; - myChars = newStr; - myLength += str.myLength; - return *this; -} - -string & string::operator-=(const char *cstring) -{ - char *newStr = new char[myLength + strlen(cstring) + 1]; - memcpy(newStr, cstring, strlen(cstring)); - memcpy(newStr + strlen(cstring), myChars, myLength + 1); - delete[] myChars; - myChars = newStr; - myLength += strlen(cstring); - return *this; -} - -string & string::operator+=(char chr) -{ - myLength++; - char *newStr = new char[myLength + 1]; - memcpy(newStr, myChars, myLength); - newStr[myLength - 1] = chr; - newStr[myLength] = 0; - delete[] myChars; - myChars = newStr; - return *this; -} - -string & string::operator-=(char chr) -{ - myLength++; - char *newStr = new char[myLength + 1]; - memcpy(newStr + 1, myChars, myLength); - *newStr = chr; - delete[] myChars; - myChars = newStr; - return *this; -} - - - -string::string(const string & str1, const string & str2) -{ - myLength = str1.myLength + str2.myLength; - myChars = new char[myLength + 1]; - memcpy(myChars, str1.myChars, str1.myLength); - memcpy(myChars + str1.myLength, str2.myChars, str2.myLength + 1); -} - -string::string(const string & str1, const char *cstring) -{ - myLength = str1.myLength + strlen(cstring); - myChars = new char[myLength + 1]; - memcpy(myChars, str1.myChars, str1.myLength); - memcpy(myChars + str1.myLength, cstring, strlen(cstring) + 1); -} - -string::string(const char *cstring, const string & str) -{ - myLength = str.myLength + strlen(cstring); - myChars = new char[myLength + 1]; - memcpy(myChars, cstring, strlen(cstring)); - memcpy(myChars + strlen(cstring), str.myChars, str.myLength + 1); -} - -string::string(const string & str1, char chr) -{ - myLength = str1.myLength + 1; - myChars = new char[myLength + 1]; - memcpy(myChars, str1.myChars, myLength); - myChars[myLength - 1] = chr; - myChars[myLength] = 0; -} - -string::string(char chr, const string & str1) -{ - myLength = str1.myLength + 1; - myChars = new char[myLength + 1]; - memcpy(myChars + 1, str1.myChars, myLength + 1); - *myChars = chr; -} - -const char & string::operator[](unsigned int index) const -{ - if (index < myLength) - return myChars[index]; - return *myChars; //if index is invalid, return a pointer to the trailing 0 -} - -char & string::operator[](unsigned int index) -{ - if (index < myLength) - return myChars[index]; - return *myChars; //if index is invalid, return a pointer to the trailing 0 -} - - - -bool string::operator==(const string & second) const -{ - if (myLength != second.myLength) - return false; - for (unsigned int i = 0; i < myLength; i++) - { - if (myChars[i] != second.myChars[i]) - return false; - } - return true; -} - -bool string::operator==(const char *cstring) const -{ - if (myLength != strlen(cstring)) - return false; - for (unsigned int i = 0; i < myLength; i++) - { - if (myChars[i] != cstring[i]) - return false; - } - return true; -} - -bool string::operator!=(const string & second) const -{ return !operator==(second); } - -bool string::operator!=(const char *cstring) const -{ return !operator==(cstring); } - -bool string::operator<(const string & second) const -{ - char *c1 = myChars, *c2 = second.myChars; - while (*c1 == *c2 && *c1) - { - c1++; - c2++; - } - return *c1 < *c2; -} - -bool string::operator>(const string & second) const -{ - char *c1 = myChars, *c2 = second.myChars; - while (*c1 == *c2 && *c1) - { - c1++; - c2++; - } - return *c1 > *c2; -} - -bool string::operator<(const char *cstring) const -{ - char *c1 = myChars; - while (*c1 == *cstring && *c1) - { - c1++; - cstring++; - } - return *c1 < *cstring; -} - -bool string::operator>(const char *cstring) const -{ - char *c1 = myChars; - while (*c1 == *cstring && *c1) - { - c1++; - cstring++; - } - return *c1 > *cstring; -} - -bool string::operator<=(const string & second) const -{ return !operator>(second); } - -bool string::operator>=(const string & second) const -{ return !operator<(second); } - -bool string::operator<=(const char *cstring) const -{ return operator<(cstring) || operator==(cstring); } - -bool string::operator>=(const char *cstring) const -{ return operator>(cstring) || operator==(cstring); } - - - - diff --git a/kernel/lang/string.h b/kernel/lang/string.h deleted file mode 100644 index 431d128..0000000 --- a/kernel/lang/string.h +++ /dev/null @@ -1,145 +0,0 @@ - -// string.h -// implements c++ string object for HOS -// Author: Josh Holtrop -// Date: 06/01/04 -// Modified: 06/09/04 - - -#ifndef __HOS_STRING__ -#define __HOS_STRING__ __HOS_STRING__ - -class string -{ -private: - /* myChars is a pointer to a character array - * It will always be a valid pointer, not null. - * The constructor is responsible for initializing - * it to point to a 1-char array with myChars[0] == 0 */ - char * myChars; - - /* myLength holds how many characters are in the - * string, not including the trailing null value - * (ASCII 0 character) */ - unsigned int myLength; -public: - /* Basic constructors */ - string(); - ~string(); - - /* Copy constructor */ - string(const string & orig); - - /* Construct strings from c-style strings: - * Allows declarations like string s = "data"; */ - string(const char *cstring); - - /* Assignment operators */ - string & operator=(const string & orig); - string & operator=(const char *cstring); - - /* Boolean comparison operators */ - bool operator==(const string & second) const; - bool operator==(const char *cstring) const; - bool operator!=(const string & second) const; - bool operator!=(const char *cstring) const; - bool operator<(const string & second) const; - bool operator>(const string & second) const; - bool operator<(const char *cstring) const; - bool operator>(const char *cstring) const; - bool operator<=(const string & second) const; - bool operator>=(const string & second) const; - bool operator<=(const char *cstring) const; - bool operator>=(const char *cstring) const; - - /* Construct strings made up of combinations of other - * strings, c-style strings, and characters */ - string(const string & str1, const string & str2); - string(const string & str1, const char *cstring); - string(const char *cstring, const string & str); - string(const string & str1, char chr); - string(char chr, const string & str1); - - /* Append and prepend operators */ - string & operator+=(const string & str); - string & operator+=(const char *cstring); - string & operator-=(const string & str); - string & operator-=(const char *cstring); - string & operator+=(char chr); - string & operator-=(char chr); - - /* Direct character-access operators */ - const char & operator[](unsigned int index) const; - char & operator[](unsigned int index); - - /* Returns handle to actual character-array for programs - * that need raw data instead of a string object */ - char * data() const; - - /* Returns the size of the string. This is myLength - * and is the number of characters in the string - * not counting the trailing null (ASCII 0) character */ - int size() const; -}; - - -static inline bool operator==(char *cstring, const string & str) -{ return str == cstring; } - -static inline bool operator!=(char *cstring, const string & str) -{ return str != cstring; } - -static inline bool operator<(const char *cstring, const string & str) -{ return str > cstring; } - -static inline bool operator>(const char *cstring, const string & str) -{ return str < cstring; } - -static inline bool operator<=(const char *cstring, const string & str) -{ return str >= cstring; } - -static inline bool operator>=(const char *cstring, const string & str) -{ return str <= cstring; } - - - -static inline string & operator+=(const char *cstring, string & str) -{ return str -= cstring; } - -static inline string & operator-=(const char *cstring, string & str) -{ return str += cstring; } - -static inline string & operator+=(char chr, string & str) -{ return str -= chr; } - -static inline string & operator-=(char chr, string & str) -{ return str += chr; } - - - -static inline string operator+(const string & str1, const string & str2) -{ return string(str1, str2); } - -static inline string operator+(const string & str1, const char *cstring) -{ return string(str1, cstring); } - -static inline string operator-(const string & str1, const string & str2) -{ return string(str2, str1); } - -static inline string operator-(const string & str1, const char *cstring) -{ return string(cstring, str1); } - -static inline string operator+(const string & str1, char chr) -{ return string(str1, chr); } - -static inline string operator-(const string & str1, char chr) -{ return string(chr, str1); } - -static inline string operator+(char chr, const string & str1) -{ return string(chr, str1); } - -static inline string operator-(char chr, const string & str1) -{ return string(str1, chr); } - -#endif - diff --git a/kernel/link.ld b/kernel/link.ld index 5c3a6cb..61febd2 100644 --- a/kernel/link.ld +++ b/kernel/link.ld @@ -2,7 +2,7 @@ OUTPUT_FORMAT("binary") ENTRY(_start) SECTIONS { - .text 0xC0106000 : { + .text 0xC0108000 : { code = .; _code = .; __code = .; *(.text) . = ALIGN(4096); @@ -10,7 +10,7 @@ SECTIONS .data : { data = .; _data = .; __data = .; *(.data) - . = ALIGN(4096); +/* . = ALIGN(4096); */ } .rodata : { rodata = .; _rodata = .; __rodata = .; diff --git a/kernel/link.ms b/kernel/link.ms deleted file mode 100644 index ede8f6b..0000000 --- a/kernel/link.ms +++ /dev/null @@ -1,22 +0,0 @@ -OUTPUT_FORMAT("pe-i386") -ENTRY(_start) -SECTIONS -{ - .text 0xC0106000 : { - code = .; _code = .; __code = .; - *(.text) - . = ALIGN(4096); - } - .data : { - data = .; _data = .; __data = .; - *(.data) - . = ALIGN(4096); - } - .bss : - { - bss = .; _bss = .; __bss = .; - *(.bss) - . = ALIGN(4096); - } - end = .; _end = .; __end = .; -} diff --git a/kernel/lst/LDout.doc b/kernel/lst/LDout.doc deleted file mode 100644 index d8f76be..0000000 --- a/kernel/lst/LDout.doc +++ /dev/null @@ -1,422 +0,0 @@ - -Memory Configuration - -Name Origin Length Attributes -*default* 0x0000000000000000 0xffffffffffffffff - -Linker script and memory map - - -.text 0x00000000c0106000 0x5000 - 0x00000000c0106000 code = . - 0x00000000c0106000 _code = . - 0x00000000c0106000 __code = . - *(.text) - .text 0x00000000c0106000 0x384 ks.o - 0x00000000c0106000 _start - .text 0x00000000c0106384 0x55b kernel.o - 0x00000000c0106384 _k_init - 0x00000000c0106694 _isr - *fill* 0x00000000c01068df 0x1 00 - .text 0x00000000c01068e0 0x308 asmfuncs.o - 0x00000000c01068fe _read_cr3 - 0x00000000c0106902 _strcmp - 0x00000000c0106a11 _puts - 0x00000000c0106998 _memsetd - 0x00000000c01069c6 _invlpg_ - 0x00000000c0106a30 _putDecu - 0x00000000c0106954 _memcpyd - 0x00000000c010693d _memcpy - 0x00000000c010696b _memset - 0x00000000c01068fa _read_cr2 - 0x00000000c01069ce _writeCursorPosition - 0x00000000c0106981 _memsetw - 0x00000000c0106af8 _putDec - 0x00000000c0106928 _strcpy - 0x00000000c01069ae _strlen - 0x00000000c01069f4 _getCursorPosition - 0x00000000c01068e0 _write_cr0 - 0x00000000c01068ef _write_cr3 - 0x00000000c01068eb _read_cr0 - .text 0x00000000c0106be8 0x69a keyboard.o - 0x00000000c010711c _kbdGetKey - 0x00000000c01071b2 _kbd_resetLEDs - 0x00000000c0106be8 _isr_keyboard - 0x00000000c010716e _kbdWaitKey - *fill* 0x00000000c0107282 0x2 00 - .text 0x00000000c0107284 0x665 kio.o - 0x00000000c0107834 _kio_drawConsoleChar - 0x00000000c01073ee _putc - 0x00000000c010763a _kio_console_cls - 0x00000000c010752a _putHex - 0x00000000c01078c2 _kio_writeCursorPosition - 0x00000000c01075d6 _kio_console_scroll - 0x00000000c0107694 _kio_drawConsole - 0x00000000c01078b8 _kio_getCursorPosition - 0x00000000c0107284 _kio_init - 0x00000000c01072ae _printf - 0x00000000c010759e _kio_putBCD - *fill* 0x00000000c01078e9 0x3 00 - .text 0x00000000c01078ec 0x350 mm.o - 0x00000000c01078ec __Z7mm_initv - 0x00000000c0107ace __Z8mm_pfreej - 0x00000000c0107a90 __Z9mm_pfreenjj - 0x00000000c0107c28 __Z14mm_getTotalMemv - 0x00000000c0107b18 __Z9mm_pallocv - 0x00000000c0107bc0 __Z10mm_freememv - 0x00000000c0107c32 __Z15mm_getTotalMegsv - .text 0x00000000c0107c3c 0x201 mouse.o - 0x00000000c0107c3c _mouse_init - 0x00000000c0107ce6 _isr_mouse - *fill* 0x00000000c0107e3d 0x3 00 - .text 0x00000000c0107e40 0x8f stdfont.o - 0x00000000c0107ea0 __Z17stdfont_getBitmapj - 0x00000000c0107e40 __Z20stdfont_getFontWidthj - 0x00000000c0107e70 __Z21stdfont_getFontHeightj - *fill* 0x00000000c0107ecf 0x1 00 - .text 0x00000000c0107ed0 0x669 video.o - 0x00000000c01083b0 __Z13video_psetp32ij - 0x00000000c01081c4 __Z10video_vertiiij - 0x00000000c01083cc __Z15video_psetpnullij - 0x00000000c01080a8 __Z11video_horiziiij - 0x00000000c01083e2 __Z15video_getHeightv - 0x00000000c0108402 __Z20video_getPhysBasePtrv - 0x00000000c0107ed0 __Z10video_initv - 0x00000000c010827c __Z10video_rectiiiij - 0x00000000c0108416 __Z10video_lineiiiij - 0x00000000c01083d2 __Z14video_getWidthv - 0x00000000c01083f2 __Z21video_getBitsPerPixelv - 0x00000000c01081a8 __Z11video_psetiij - 0x00000000c010831c __Z13video_psetp16ij - 0x00000000c01082d4 __Z11video_rectfiiiij - 0x00000000c0108150 __Z10video_psetiij - 0x00000000c0108362 __Z13video_psetp24ij - 0x00000000c0107fc2 __Z16video_renderChariiiijij - 0x00000000c010840c __Z10video_Modev - *fill* 0x00000000c0108539 0x3 00 - .text 0x00000000c010853c 0x8b8 vmm.o - 0x00000000c0108ae2 __Z21vmm_addHeapEntryBlockv - 0x00000000c0108ba4 __Z20vmm_getLastHeapEntryv - 0x00000000c0108904 __Z21vmm_coalesceHeapEntryP9HeapEntry - 0x00000000c0108d12 __Z7reallocPvj - 0x00000000c0108cd6 __Z22vmm_getHeapEntryByBasej - 0x00000000c0108856 __Z16vmm_getFreeChunkj - 0x00000000c0108c8c __Z4freePv - 0x00000000c01089ce __Z12vmm_moreCorej - 0x00000000c01087e2 __Z6mallocj - 0x00000000c0108c54 __Z19vmm_heapEntriesLeftv - 0x00000000c010853c __Z8vmm_initv - 0x00000000c0108da6 __Z6callocjj - 0x00000000c0108bd4 __Z25vmm_getFirstHoleHeapEntryj - 0x00000000c01085e4 __Z12vmm_heb_initP14HeapEntryBlock - 0x00000000c0108ac6 __Z17vmm_nextHeapEntryv - 0x00000000c0108660 __Z8vmm_map1jj - 0x00000000c0108738 __Z8vmm_mapnjjj - 0x00000000c01087b4 __Z10vmm_unmapnjj - 0x00000000c0108772 __Z10vmm_unmap1j - 0x00000000c0108c1a __Z27vmm_getFirstUnusedHeapEntryv - .text 0x00000000c0108df4 0x269 rtc.o - 0x00000000c0108e1e __Z13rtc_readMonthv - 0x00000000c0108ff4 __Z11rtc_setHourh - 0x00000000c0108df4 __Z11rtc_readDayv - 0x00000000c0108f24 __Z12rtc_setMonthh - 0x00000000c0108fc0 __Z13rtc_setMinuteh - 0x00000000c0108ef0 __Z10rtc_setDayh - 0x00000000c0108ec6 __Z12rtc_readHourv - 0x00000000c0108e48 __Z12rtc_readYearv - 0x00000000c0108e72 __Z14rtc_readSecondv - 0x00000000c0108f58 __Z11rtc_setYearh - 0x00000000c0108e9c __Z14rtc_readMinutev - 0x00000000c0108f8c __Z13rtc_setSecondh - *fill* 0x00000000c010905d 0x3 00 - .text 0x00000000c0109060 0x121 pic.o - 0x00000000c0109060 __Z9pic_remapii - *fill* 0x00000000c0109181 0x3 00 - .text 0x00000000c0109184 0x15d cstring.o - 0x00000000c01091ac __Z12string_splitPcc - 0x00000000c0109184 __Z6strcatPcPKc - 0x00000000c010920a __Z14string_advancePc - 0x00000000c0109266 __Z5ucasePc - 0x00000000c0109224 __Z5rtrimPc - 0x00000000c01092a4 __Z5lcasePc - *fill* 0x00000000c01092e1 0x3 00 - .text 0x00000000c01092e4 0xed9 string.o - 0x00000000c01099f2 __ZN6stringC1ERKS_S1_ - 0x00000000c01097c6 __ZN6stringmIEPKc - 0x00000000c0109474 __ZN6stringC1EPKc - 0x00000000c0109d6c __ZN6stringC2EcRKS_ - 0x00000000c0109aec __ZN6stringC1ERKS_PKc - 0x00000000c0109384 __ZN6stringC2ERKS_ - 0x00000000c01094c8 __ZN6stringaSERKS_ - 0x00000000c0109420 __ZN6stringC2EPKc - 0x00000000c010a132 __ZNK6stringleEPKc - 0x00000000c010a0ee __ZNK6stringleERKS_ - 0x00000000c01092e4 __ZN6stringC2Ev - 0x00000000c0109668 __ZN6stringpLEPKc - 0x00000000c010997c __ZN6stringC2ERKS_S1_ - 0x00000000c0109e5a __ZN6stringixEj - 0x00000000c0109c84 __ZN6stringC2ERKS_c - 0x00000000c01095b0 __ZNK6string4dataEv - 0x00000000c0109cf8 __ZN6stringC1ERKS_c - 0x00000000c0109dcc __ZN6stringC1EcRKS_ - 0x00000000c010a096 __ZNK6stringgtEPKc - 0x00000000c0109e2c __ZNK6stringixEj - 0x00000000c0109364 __ZN6stringD1Ev - 0x00000000c0109ff2 __ZNK6stringgtERKS_ - 0x00000000c0109b70 __ZN6stringC2EPKcRKS_ - 0x00000000c0109724 __ZN6stringmIERKS_ - 0x00000000c0109ef0 __ZNK6stringeqEPKc - 0x00000000c0109344 __ZN6stringD2Ev - 0x00000000c0109f62 __ZNK6stringneERKS_ - 0x00000000c01095ba __ZNK6string4sizeEv - 0x00000000c010a178 __ZNK6stringgeEPKc - 0x00000000c0109a68 __ZN6stringC2ERKS_PKc - 0x00000000c010a110 __ZNK6stringgeERKS_ - 0x00000000c010990c __ZN6stringmIEc - 0x00000000c01093d2 __ZN6stringC1ERKS_ - 0x00000000c0109fa6 __ZNK6stringltERKS_ - 0x00000000c0109f84 __ZNK6stringneEPKc - 0x00000000c0109bfa __ZN6stringC1EPKcRKS_ - 0x00000000c0109e88 __ZNK6stringeqERKS_ - 0x00000000c010a03e __ZNK6stringltEPKc - 0x00000000c0109888 __ZN6stringpLEc - 0x00000000c01095c6 __ZN6stringpLERKS_ - 0x00000000c0109538 __ZN6stringaSEPKc - 0x00000000c0109314 __ZN6stringC1Ev - *fill* 0x00000000c010a1bd 0x3 00 - .text 0x00000000c010a1c0 0xe5 cmos.o - 0x00000000c010a218 __Z11cmos_gethd0v - 0x00000000c010a1c0 __Z11cmos_getfd0v - 0x00000000c010a1ec __Z11cmos_getfd1v - 0x00000000c010a244 __Z11cmos_gethd1v - *fill* 0x00000000c010a2a5 0x3 00 - .text 0x00000000c010a2a8 0x58 hos_defines.o - 0x00000000c010a2d4 __ZdlPv - 0x00000000c010a2be __Znaj - 0x00000000c010a2a8 __Znwj - 0x00000000c010a2ea __ZdaPv - .text 0x00000000c010a300 0x24d vfs.o - 0x00000000c010a32e __Z4listv - 0x00000000c010a3d0 __Z9vfs_mount6stringS_ - 0x00000000c010a300 __Z8vfs_initv - *fill* 0x00000000c010a54d 0x3 00 - .text 0x00000000c010a550 0x2b7 devfs.o - 0x00000000c010a550 __Z10devfs_init6string - *fill* 0x00000000c010a807 0x1 00 - .text 0x00000000c010a808 0x145 Mount.o - 0x00000000c010a858 __ZN5MountC2E6stringS0_ - 0x00000000c010a8ac __ZN5MountC1E6stringS0_ - 0x00000000c010a900 __ZNK5MounteqERKS_ - 0x00000000c010a830 __ZN5MountC1Ev - 0x00000000c010a808 __ZN5MountC2Ev - 0x00000000c010b000 . = ALIGN (0x1000) - *fill* 0x00000000c010a94d 0x80b2310000006b3 00 - -.gnu.linkonce.t._ZN10LinkedListI5MountEC1Ev - 0x00000000c010b000 0x43 - .gnu.linkonce.t._ZN10LinkedListI5MountEC1Ev - 0x00000000c010b000 0x43 vfs.o - 0x00000000c010b000 __ZN10LinkedListI5MountEC1Ev - -.gnu.linkonce.t._ZN10LinkedListI5MountE5beginEv - 0x00000000c010b044 0x27 - .gnu.linkonce.t._ZN10LinkedListI5MountE5beginEv - 0x00000000c010b044 0x27 vfs.o - 0x00000000c010b044 __ZN10LinkedListI5MountE5beginEv - -.gnu.linkonce.t._ZN10LinkedListI5MountE3endEv - 0x00000000c010b06c 0x28 - .gnu.linkonce.t._ZN10LinkedListI5MountE3endEv - 0x00000000c010b06c 0x28 vfs.o - 0x00000000c010b06c __ZN10LinkedListI5MountE3endEv - -.gnu.linkonce.t._ZNK10LinkedListI5MountE8iteratorneERKS2_ - 0x00000000c010b094 0x17 - .gnu.linkonce.t._ZNK10LinkedListI5MountE8iteratorneERKS2_ - 0x00000000c010b094 0x17 vfs.o - 0x00000000c010b094 __ZNK10LinkedListI5MountE8iteratorneERKS2_ - -.gnu.linkonce.t._ZN10LinkedListI5MountE8iteratordeEv - 0x00000000c010b0ac 0xa - .gnu.linkonce.t._ZN10LinkedListI5MountE8iteratordeEv - 0x00000000c010b0ac 0xa vfs.o - 0x00000000c010b0ac __ZN10LinkedListI5MountE8iteratordeEv - -.gnu.linkonce.t._ZN10LinkedListI5MountE8iteratorppEv - 0x00000000c010b0b6 0x12 - .gnu.linkonce.t._ZN10LinkedListI5MountE8iteratorppEv - 0x00000000c010b0b6 0x12 vfs.o - 0x00000000c010b0b6 __ZN10LinkedListI5MountE8iteratorppEv - -.gnu.linkonce.t._ZN10LinkedListI5MountE6insertEiS0_ - 0x00000000c010b0c8 0x101 - .gnu.linkonce.t._ZN10LinkedListI5MountE6insertEiS0_ - 0x00000000c010b0c8 0x101 vfs.o - 0x00000000c010b0c8 __ZN10LinkedListI5MountE6insertEiS0_ - -.gnu.linkonce.t._ZN10LinkedListI5MountE10LinkedNodeC1Ev - 0x00000000c010b1ca 0x2a - .gnu.linkonce.t._ZN10LinkedListI5MountE10LinkedNodeC1Ev - 0x00000000c010b1ca 0x2a vfs.o - 0x00000000c010b1ca __ZN10LinkedListI5MountE10LinkedNodeC1Ev - -.gnu.linkonce.t._ZN10LinkedListI5MountE8iteratorC1EPNS1_10LinkedNodeE - 0x00000000c010b1f4 0xd - .gnu.linkonce.t._ZN10LinkedListI5MountE8iteratorC1EPNS1_10LinkedNodeE - 0x00000000c010b1f4 0xd vfs.o - 0x00000000c010b1f4 __ZN10LinkedListI5MountE8iteratorC1EPNS1_10LinkedNodeE - -.gnu.linkonce.t._ZN10LinkedListI5MountE9push_backES0_ - 0x00000000c010b202 0x82 - .gnu.linkonce.t._ZN10LinkedListI5MountE9push_backES0_ - 0x00000000c010b202 0x82 vfs.o - 0x00000000c010b202 __ZN10LinkedListI5MountE9push_backES0_ - -.gnu.linkonce.t._ZN10LinkedListI5MountE10LinkedNodeC1ES0_ - 0x00000000c010b284 0x40 - .gnu.linkonce.t._ZN10LinkedListI5MountE10LinkedNodeC1ES0_ - 0x00000000c010b284 0x40 vfs.o - 0x00000000c010b284 __ZN10LinkedListI5MountE10LinkedNodeC1ES0_ - -.gnu.linkonce.t._ZN5MountaSERKS_ - 0x00000000c010b2c4 0x4d - .gnu.linkonce.t._ZN5MountaSERKS_ - 0x00000000c010b2c4 0x4d vfs.o - 0x00000000c010b2c4 __ZN5MountaSERKS_ - -.gnu.linkonce.t._ZN5MountC1ERKS_ - 0x00000000c010b312 0x4a - .gnu.linkonce.t._ZN5MountC1ERKS_ - 0x00000000c010b312 0x4a vfs.o - 0x00000000c010b312 __ZN5MountC1ERKS_ - -.gnu.linkonce.t._ZN5MountD1Ev - 0x00000000c010b35c 0x28 - .gnu.linkonce.t._ZN5MountD1Ev - 0x00000000c010b35c 0x28 vfs.o - 0x00000000c010b35c __ZN5MountD1Ev - -.data 0x00000000c010b388 0xc78 - 0x00000000c010b388 data = . - 0x00000000c010b388 _data = . - 0x00000000c010b388 __data = . - *(.data) - .data 0x00000000c010b388 0x18 stdfont.o - 0x00000000c010b388 _fonts - .data 0x00000000c010b3a0 0x10 video.o - 0x00000000c010b3a0 _vid_ptr16 - 0x00000000c010b3ac _video_psetp - 0x00000000c010b3a8 _vid_ptr32 - 0x00000000c010b3a4 _vid_ptr24 - .data 0x00000000c010b3b0 0x4 vmm.o - 0x00000000c010b3b0 _firstHeapEntry - 0x00000000c010c000 . = ALIGN (0x1000) - *fill* 0x00000000c010b3b4 0x8116e3800000c4c 00 - -.rodata 0x00000000c010c000 0x2000 - 0x00000000c010c000 rodata = . - 0x00000000c010c000 _rodata = . - 0x00000000c010c000 __rodata = . - *(.rodata) - .rodata 0x00000000c010c000 0x141 kernel.o - *fill* 0x00000000c010c141 0x1f 00 - .rodata 0x00000000c010c160 0x141 keyboard.o - *fill* 0x00000000c010c2a1 0x3 00 - .rodata 0x00000000c010c2a4 0x1e4 kio.o - *fill* 0x00000000c010c488 0x18 00 - .rodata 0x00000000c010c4a0 0x1200 stdfont.o - .rodata 0x00000000c010d6a0 0x7 vfs.o - .rodata 0x00000000c010d6a7 0x6d devfs.o - 0x00000000c010e000 . = ALIGN (0x1000) - *fill* 0x00000000c010d714 0x8116e9c000008ec 00 - -.bss 0x00000000c010e000 0x22000 - 0x00000000c010e000 bss = . - 0x00000000c010e000 _bss = . - 0x00000000c010e000 __bss = . - *(.bss) - .bss 0x00000000c010e000 0x4 kernel.o - 0x00000000c010e000 _timer - *fill* 0x00000000c010e004 0x4 00 - *fill* 0x00000000c010e008 0x18 00 - .bss 0x00000000c010e020 0x12b keyboard.o - 0x00000000c010e040 _kbdBuffer - 0x00000000c010e148 _kbdExt - 0x00000000c010e021 _kbdAscii - 0x00000000c010e149 _kbdExt2 - 0x00000000c010e14a _ackReason - 0x00000000c010e140 _kbdBufferStart - 0x00000000c010e022 _kbdScan - 0x00000000c010e144 _kbdBufferLen - 0x00000000c010e020 _kbdFlags - *fill* 0x00000000c010e14b 0x15 00 - .bss 0x00000000c010e160 0xfc0 kio.o - 0x00000000c010e180 _console_memory - 0x00000000c010e160 _graphical - 0x00000000c010e164 _cursorPosition - .bss 0x00000000c010f120 0x20020 mm.o - 0x00000000c010f124 _mm_megabytes - 0x00000000c010f140 _page_bitmap - 0x00000000c010f120 _mm_totalmem - .bss 0x00000000c012f140 0x1c mouse.o - 0x00000000c012f144 _mouse_y - 0x00000000c012f148 _mouse_bytesRead - 0x00000000c012f140 _mouse_x - 0x00000000c012f14c _mouse_inbuffer - *fill* 0x00000000c012f15c 0x4 00 - .bss 0x00000000c012f160 0x104 video.o - 0x00000000c012f160 _video_mode - 0x00000000c012f260 _videoMode - .bss 0x00000000c012f264 0x4 vfs.o - 0x00000000c012f264 _mounts - 0x00000000c0130000 . = ALIGN (0x1000) - *fill* 0x00000000c012f268 0x8116ff000000d98 00 - 0x00000000c0130000 end = . - 0x00000000c0130000 _end = . - 0x00000000c0130000 __end = . -LOAD ks.o -LOAD kernel.o -LOAD asmfuncs.o -LOAD fdc.o -LOAD keyboard.o -LOAD kio.o -LOAD mm.o -LOAD mouse.o -LOAD stdfont.o -LOAD video.o -LOAD vmm.o -LOAD rtc.o -LOAD pic.o -LOAD io.o -LOAD cstring.o -LOAD string.o -LOAD cmos.o -LOAD hos_defines.o -LOAD vfs.o -LOAD devfs.o -LOAD Mount.o -OUTPUT(kernel.bin binary) - -.note.GNU-stack - 0x0000000000000000 0x0 - -.comment 0x0000000000000000 0x3c9 - .comment 0x0000000000000000 0x33 kernel.o - .comment 0x0000000000000033 0x33 fdc.o - .comment 0x0000000000000066 0x33 keyboard.o - .comment 0x0000000000000099 0x33 kio.o - .comment 0x00000000000000cc 0x33 mm.o - .comment 0x00000000000000ff 0x33 mouse.o - .comment 0x0000000000000132 0x33 stdfont.o - .comment 0x0000000000000165 0x33 video.o - .comment 0x0000000000000198 0x33 vmm.o - .comment 0x00000000000001cb 0x33 rtc.o - .comment 0x00000000000001fe 0x33 pic.o - .comment 0x0000000000000231 0x33 io.o - .comment 0x0000000000000264 0x33 cstring.o - .comment 0x0000000000000297 0x33 string.o - .comment 0x00000000000002ca 0x33 cmos.o - .comment 0x00000000000002fd 0x33 hos_defines.o - .comment 0x0000000000000330 0x33 vfs.o - .comment 0x0000000000000363 0x33 devfs.o - .comment 0x0000000000000396 0x33 Mount.o diff --git a/kernel/lst/asmfuncs.lst b/kernel/lst/asmfuncs.lst deleted file mode 100644 index 057c0a2..0000000 --- a/kernel/lst/asmfuncs.lst +++ /dev/null @@ -1,510 +0,0 @@ - 1 ; asmfuncs.asm - 2 ; Josh Holtrop - 3 ; Created: 10/23/03 - 4 ; Modified: 02/26/04 - 5 - 6 [extern _putc] - 7 [extern _console_memory] - 8 [extern _cursorPosition] - 9 [extern _video_drawConsole] - 10 [extern _videoMode] - 11 - 12 %macro jzfar 1 - 13 jnz %%skip - 14 jmp %1 - 15 %%skip: - 16 - 17 %endmacro - 18 - 19 ;stores the parameter to the CR0 register - 20 ;extern dword write_cr0(dword cr0); - 21 [global _write_cr0] - 22 _write_cr0: - 23 00000000 55 push ebp - 24 00000001 89E5 mov ebp, esp - 25 00000003 8B4508 mov eax, [ebp+8] - 26 00000006 0F22C0 mov cr0, eax - 27 00000009 5D pop ebp - 28 0000000A C3 ret - 29 - 30 ;returns the value in the CR0 register - 31 ;extern dword read_cr0(); - 32 [global _read_cr0] - 33 _read_cr0: - 34 0000000B 0F20C0 mov eax, cr0; - 35 0000000E C3 ret - 36 - 37 ;stores the parameter to the CR3 register - 38 ;extern dword write_cr3(dword cr3); - 39 [global _write_cr3] - 40 _write_cr3: - 41 0000000F 55 push ebp - 42 00000010 89E5 mov ebp, esp - 43 00000012 8B4508 mov eax, [ebp+8] - 44 00000015 0F22D8 mov cr3, eax - 45 00000018 5D pop ebp - 46 00000019 C3 ret - 47 - 48 - 49 ;returns the value in the CR2 register - 50 ;extern dword read_cr2(); - 51 [global _read_cr2] - 52 _read_cr2: - 53 0000001A 0F20D0 mov eax, cr2; - 54 0000001D C3 ret - 55 - 56 - 57 - 58 ;returns the value in the CR3 register - 59 ;extern dword read_cr3(); - 60 [global _read_cr3] - 61 _read_cr3: - 62 0000001E 0F20D8 mov eax, cr3; - 63 00000021 C3 ret - 64 - 65 - 66 ;compares one string to another - 67 ;returns 0 if the strings are different - 68 ;extern dword strcmp(char *str1, char *str2); - 69 [global _strcmp] - 70 _strcmp: - 71 00000022 55 push ebp - 72 00000023 89E5 mov ebp, esp - 73 00000025 56 push esi - 74 00000026 57 push edi - 75 - 76 00000027 8B7508 mov esi, [ebp+8] - 77 0000002A 8B7D0C mov edi, [ebp+12] - 78 strcmp_loop1: - 79 0000002D AC lodsb - 80 0000002E 8A27 mov ah, [edi] - 81 00000030 47 inc edi - 82 00000031 38C4 cmp ah, al - 83 00000033 750D jnz strcmp_ne - 84 00000035 08C0 or al, al - 85 00000037 7402 jz strcmp_e - 86 00000039 EBF2 jmp strcmp_loop1 - 87 strcmp_e: - 88 0000003B B801000000 mov eax, 1 - 89 00000040 EB02 jmp short strcmp_done - 90 strcmp_ne: - 91 00000042 31C0 xor eax, eax - 92 strcmp_done: - 93 - 94 00000044 5F pop edi - 95 00000045 5E pop esi - 96 00000046 5D pop ebp - 97 00000047 C3 ret - 98 - 99 ;copies a string from the source to the destination parameter - 100 ;extern void strcpy(char *dest, char *src); - 101 [global _strcpy] - 102 _strcpy: - 103 00000048 55 push ebp - 104 00000049 89E5 mov ebp, esp - 105 0000004B 56 push esi - 106 0000004C 57 push edi - 107 0000004D 8B7D08 mov edi, [ebp+8] - 108 00000050 8B750C mov esi, [ebp+12] - 109 strcpyloop: - 110 00000053 AC lodsb - 111 00000054 AA stosb - 112 00000055 08C0 or al, al - 113 00000057 75FA jnz strcpyloop - 114 00000059 5F pop edi - 115 0000005A 5E pop esi - 116 0000005B 5D pop ebp - 117 0000005C C3 ret - 118 - 119 ;copies memory of n bytes from src to destination - 120 ;void memcpy(void *dest, void *src, dword n); - 121 [global _memcpy] - 122 _memcpy: - 123 0000005D 55 push ebp - 124 0000005E 89E5 mov ebp, esp - 125 00000060 56 push esi - 126 00000061 57 push edi - 127 00000062 51 push ecx - 128 00000063 8B7D08 mov edi, [ebp+8] - 129 00000066 8B750C mov esi, [ebp+12] - 130 00000069 8B4D10 mov ecx, [ebp+16] - 131 - 132 0000006C FC cld - 133 0000006D F3A4 rep movsb - 134 - 135 0000006F 59 pop ecx - 136 00000070 5F pop edi - 137 00000071 5E pop esi - 138 00000072 5D pop ebp - 139 00000073 C3 ret - 140 - 141 - 142 ;copies memory of n dwords (n*4 bytes) from src to destination - 143 ;void memcpyd(void *dest, void *src, dword n); - 144 [global _memcpyd] - 145 _memcpyd: - 146 00000074 55 push ebp - 147 00000075 89E5 mov ebp, esp - 148 00000077 56 push esi - 149 00000078 57 push edi - 150 00000079 51 push ecx - 151 0000007A 8B7D08 mov edi, [ebp+8] - 152 0000007D 8B750C mov esi, [ebp+12] - 153 00000080 8B4D10 mov ecx, [ebp+16] - 154 - 155 00000083 FC cld - 156 00000084 F3A5 rep movsd - 157 - 158 00000086 59 pop ecx - 159 00000087 5F pop edi - 160 00000088 5E pop esi - 161 00000089 5D pop ebp - 162 0000008A C3 ret - 163 - 164 - 165 ;sets num bytes at buffer to the value of c - 166 ;void *memset(void *buffer, int c, int num); - 167 [global _memset] - 168 _memset: - 169 0000008B 55 push ebp - 170 0000008C 89E5 mov ebp, esp - 171 0000008E 57 push edi - 172 0000008F 51 push ecx - 173 00000090 8B7D08 mov edi, [ebp+8] - 174 00000093 57 push edi ;save for return address - 175 00000094 8B450C mov eax, [ebp+12] - 176 00000097 8B4D10 mov ecx, [ebp+16] - 177 - 178 0000009A F3AA rep stosb - 179 - 180 0000009C 58 pop eax - 181 0000009D 59 pop ecx - 182 0000009E 5F pop edi - 183 0000009F 5D pop ebp - 184 000000A0 C3 ret - 185 - 186 - 187 ;sets num words at buffer to the value of c - 188 ;void *memsetw(void *buffer, int c, int num); - 189 [global _memsetw] - 190 _memsetw: - 191 000000A1 55 push ebp - 192 000000A2 89E5 mov ebp, esp - 193 000000A4 57 push edi - 194 000000A5 51 push ecx - 195 000000A6 8B7D08 mov edi, [ebp+8] - 196 000000A9 57 push edi ;save for return address - 197 000000AA 8B450C mov eax, [ebp+12] - 198 000000AD 8B4D10 mov ecx, [ebp+16] - 199 - 200 000000B0 F366AB rep stosw - 201 - 202 000000B3 58 pop eax - 203 000000B4 59 pop ecx - 204 000000B5 5F pop edi - 205 000000B6 5D pop ebp - 206 000000B7 C3 ret - 207 - 208 - 209 ;sets num dwords at buffer to the value of c - 210 ;void *memsetd(void *buffer, int c, int num); - 211 [global _memsetd] - 212 _memsetd: - 213 000000B8 55 push ebp - 214 000000B9 89E5 mov ebp, esp - 215 000000BB 57 push edi - 216 000000BC 51 push ecx - 217 000000BD 8B7D08 mov edi, [ebp+8] - 218 000000C0 57 push edi ;save for return address - 219 000000C1 8B450C mov eax, [ebp+12] - 220 000000C4 8B4D10 mov ecx, [ebp+16] - 221 - 222 000000C7 F3AB rep stosd - 223 - 224 000000C9 58 pop eax - 225 000000CA 59 pop ecx - 226 000000CB 5F pop edi - 227 000000CC 5D pop ebp - 228 000000CD C3 ret - 229 - 230 - 231 ;returns the number of characters in a string - 232 ;extern dword strlen(char *str); - 233 [global _strlen] - 234 _strlen: - 235 000000CE 55 push ebp - 236 000000CF 89E5 mov ebp, esp - 237 000000D1 56 push esi - 238 000000D2 53 push ebx - 239 000000D3 8B7508 mov esi, [ebp+8] - 240 000000D6 31DB xor ebx, ebx - 241 strlenloop: - 242 000000D8 AC lodsb - 243 000000D9 08C0 or al, al - 244 000000DB 7403 jz strlendone - 245 000000DD 43 inc ebx - 246 000000DE EBF8 jmp strlenloop - 247 strlendone: - 248 000000E0 89D8 mov eax, ebx - 249 000000E2 5B pop ebx - 250 000000E3 5E pop esi - 251 000000E4 5D pop ebp - 252 000000E5 C3 ret - 253 - 254 ;this function invalidates the page directory/table entry that - 255 ; would be used to access the memory address given in the parameter - 256 ;extern void invlpg_(dword addr); - 257 [global _invlpg_] - 258 _invlpg_: - 259 000000E6 8B442404 mov eax, [esp+4] - 260 000000EA 0F0138 invlpg [eax] - 261 000000ED C3 ret - 262 - 263 - 264 ; - 265 ;void writeCursorPosition(word pos) - 266 ; - 267 [global _writeCursorPosition] - 268 _writeCursorPosition: - 269 000000EE 55 push ebp - 270 000000EF 89E5 mov ebp, esp - 271 - 272 000000F1 50 push eax - 273 000000F2 53 push ebx - 274 000000F3 52 push edx - 275 - 276 000000F4 8B4508 mov eax, [ebp+8] ;cursor position in ax - 277 - 278 000000F7 88C3 mov bl, al - 279 000000F9 66BAD403 mov dx, 0x03D4 - 280 000000FD B00E mov al, 0x0E - 281 000000FF EE out dx, al - 282 - 283 00000100 6642 inc dx - 284 00000102 88E0 mov al, ah - 285 00000104 EE out dx, al - 286 - 287 00000105 664A dec dx - 288 00000107 B00F mov al, 0x0F - 289 00000109 EE out dx, al - 290 - 291 0000010A 6642 inc dx - 292 0000010C 88D8 mov al, bl - 293 0000010E EE out dx, al - 294 - 295 0000010F 5A pop edx - 296 00000110 5B pop ebx - 297 00000111 58 pop eax - 298 00000112 5D pop ebp - 299 - 300 00000113 C3 ret - 301 - 302 - 303 ; - 304 ;word getCursorPosition() - 305 ; - 306 [global _getCursorPosition] - 307 _getCursorPosition: - 308 00000114 53 push ebx - 309 00000115 52 push edx - 310 - 311 00000116 31C0 xor eax, eax - 312 00000118 66BAD403 mov dx, 0x03D4 - 313 0000011C B00E mov al, 0x0E - 314 0000011E EE out dx, al - 315 - 316 0000011F 6642 inc dx - 317 00000121 EC in al, dx - 318 00000122 88C3 mov bl, al - 319 - 320 00000124 664A dec dx - 321 00000126 B00F mov al, 0x0F - 322 00000128 EE out dx, al - 323 - 324 00000129 6642 inc dx - 325 0000012B EC in al, dx - 326 0000012C 88DC mov ah, bl - 327 - 328 0000012E 5A pop edx - 329 0000012F 5B pop ebx - 330 - 331 00000130 C3 ret - 332 - 333 - 334 ; - 335 ;int puts(char *str) - 336 ; - 337 [global _puts] - 338 _puts: - 339 00000131 55 push ebp - 340 00000132 89E5 mov ebp, esp - 341 00000134 56 push esi - 342 00000135 50 push eax - 343 00000136 8B7508 mov esi, [ebp+8] ;esi = to string - 344 puts_loop: - 345 00000139 AC lodsb - 346 0000013A 3C00 cmp al, 0 - 347 0000013C 740E jz puts_done - 348 0000013E 50 push eax - 349 0000013F E8(00000000) call _putc - 350 00000144 81C404000000 add esp, 4 - 351 0000014A EBED jmp puts_loop - 352 - 353 puts_done: - 354 0000014C 58 pop eax - 355 0000014D 5E pop esi - 356 0000014E 5D pop ebp - 357 0000014F C3 ret - 358 - 359 - 360 - 361 - 362 [global _putDecu] - 363 _putDecu: - 364 00000150 55 push ebp - 365 00000151 89E5 mov ebp, esp - 366 00000153 81EC18000000 sub esp, 24 - 367 00000159 C745FC01000000 mov DWORD [ebp-4], 1 - 368 00000160 C645FB00 mov BYTE [ebp-5], 0 - 369 L2: - 370 00000164 8B5508 mov edx, DWORD [ebp+8] - 371 00000167 B8CDCCCCCC mov eax, -858993459 - 372 0000016C F7E2 mul edx - 373 0000016E 89D0 mov eax, edx - 374 00000170 C1E803 shr eax, 3 - 375 00000173 3B45FC cmp eax, DWORD [ebp-4] - 376 00000176 7305 jae L4 - 377 00000178 E912000000 jmp L3 - 378 L4: - 379 0000017D 8B45FC mov eax, DWORD [ebp-4] - 380 00000180 89C2 mov edx, eax - 381 00000182 C1E202 sal edx, 2 - 382 00000185 01C2 add edx, eax - 383 00000187 8D0412 lea eax, [edx+edx] - 384 0000018A 8945FC mov DWORD [ebp-4], eax - 385 0000018D EBD5 jmp L2 - 386 L3: - 387 0000018F 90 nop - 388 L5: - 389 00000190 817DFC01000000 cmp DWORD [ebp-4], 1 - 390 00000197 7705 ja L7 - 391 00000199 E959000000 jmp L6 - 392 L7: - 393 0000019E 8B5508 mov edx, DWORD [ebp+8] - 394 000001A1 89D0 mov eax, edx - 395 000001A3 BA00000000 mov edx, 0 - 396 000001A8 F775FC div DWORD [ebp-4] - 397 000001AB 8945F4 mov DWORD [ebp-12], eax - 398 000001AE 8A45F4 mov al, BYTE [ebp-12] - 399 000001B1 8845FB mov BYTE [ebp-5], al - 400 000001B4 B800000000 mov eax, 0 - 401 000001B9 8A45FB mov al, BYTE [ebp-5] - 402 000001BC 0FAF45FC imul eax, DWORD [ebp-4] - 403 000001C0 294508 sub DWORD [ebp+8], eax - 404 000001C3 8B55FC mov edx, DWORD [ebp-4] - 405 000001C6 B8CDCCCCCC mov eax, -858993459 - 406 000001CB F7E2 mul edx - 407 000001CD 89D0 mov eax, edx - 408 000001CF C1E803 shr eax, 3 - 409 000001D2 8945FC mov DWORD [ebp-4], eax - 410 000001D5 8D45FB lea eax, [ebp-5] - 411 000001D8 800030 add BYTE [eax], 48 - 412 000001DB 81EC0C000000 sub esp, 12 - 413 000001E1 B800000000 mov eax, 0 - 414 000001E6 8A45FB mov al, BYTE [ebp-5] - 415 000001E9 50 push eax - 416 000001EA E8(00000000) call _putc - 417 000001EF 81C410000000 add esp, 16 - 418 000001F5 EB99 jmp L5 - 419 L6: - 420 000001F7 81EC0C000000 sub esp, 12 - 421 000001FD 8A4508 mov al, BYTE [ebp+8] - 422 00000200 0530000000 add eax, 48 - 423 00000205 25FF000000 and eax, 255 - 424 0000020A 50 push eax - 425 0000020B E8(00000000) call _putc - 426 00000210 81C410000000 add esp, 16 - 427 00000216 C9 leave - 428 00000217 C3 ret - 429 - 430 - 431 - 432 - 433 [global _putDec] - 434 _putDec: - 435 00000218 55 push ebp - 436 00000219 89E5 mov ebp, esp - 437 0000021B 81EC18000000 sub esp, 24 - 438 00000221 817D0800000000 cmp DWORD [ebp+8], 0 - 439 00000228 7919 jns L9 - 440 0000022A 81EC0C000000 sub esp, 12 - 441 00000230 682D000000 push 45 - 442 00000235 E8(00000000) call _putc - 443 0000023A 81C410000000 add esp, 16 - 444 00000240 F75D08 neg DWORD [ebp+8] - 445 L9: - 446 00000243 C745FC01000000 mov DWORD [ebp-4], 1 - 447 0000024A C645FB00 mov BYTE [ebp-5], 0 - 448 L10: - 449 0000024E 8B4508 mov eax, DWORD [ebp+8] - 450 00000251 3B45FC cmp eax, DWORD [ebp-4] - 451 00000254 7305 jae L12 - 452 00000256 E912000000 jmp L11 - 453 L12: - 454 0000025B 8B45FC mov eax, DWORD [ebp-4] - 455 0000025E 89C2 mov edx, eax - 456 00000260 C1E202 sal edx, 2 - 457 00000263 01C2 add edx, eax - 458 00000265 8D0412 lea eax, [edx+edx] - 459 00000268 8945FC mov DWORD [ebp-4], eax - 460 0000026B EBE1 jmp L10 - 461 L11: - 462 0000026D 8B55FC mov edx, DWORD [ebp-4] - 463 00000270 B8CDCCCCCC mov eax, -858993459 - 464 00000275 F7E2 mul edx - 465 00000277 89D0 mov eax, edx - 466 00000279 C1E803 shr eax, 3 - 467 0000027C 8945FC mov DWORD [ebp-4], eax - 468 L13: - 469 0000027F 817DFC01000000 cmp DWORD [ebp-4], 1 - 470 00000286 7705 ja L15 - 471 00000288 E959000000 jmp L14 - 472 L15: - 473 0000028D 8B5508 mov edx, DWORD [ebp+8] - 474 00000290 89D0 mov eax, edx - 475 00000292 BA00000000 mov edx, 0 - 476 00000297 F775FC div DWORD [ebp-4] - 477 0000029A 8945F4 mov DWORD [ebp-12], eax - 478 0000029D 8A45F4 mov al, BYTE [ebp-12] - 479 000002A0 8845FB mov BYTE [ebp-5], al - 480 000002A3 B800000000 mov eax, 0 - 481 000002A8 8A45FB mov al, BYTE [ebp-5] - 482 000002AB 0FAF45FC imul eax, DWORD [ebp-4] - 483 000002AF 294508 sub DWORD [ebp+8], eax - 484 000002B2 8B55FC mov edx, DWORD [ebp-4] - 485 000002B5 B8CDCCCCCC mov eax, -858993459 - 486 000002BA F7E2 mul edx - 487 000002BC 89D0 mov eax, edx - 488 000002BE C1E803 shr eax, 3 - 489 000002C1 8945FC mov DWORD [ebp-4], eax - 490 000002C4 8D45FB lea eax, [ebp-5] - 491 000002C7 800030 add BYTE [eax], 48 - 492 000002CA 81EC0C000000 sub esp, 12 - 493 000002D0 B800000000 mov eax, 0 - 494 000002D5 8A45FB mov al, BYTE [ebp-5] - 495 000002D8 50 push eax - 496 000002D9 E8(00000000) call _putc - 497 000002DE 81C410000000 add esp, 16 - 498 000002E4 EB99 jmp L13 - 499 L14: - 500 000002E6 81EC0C000000 sub esp, 12 - 501 000002EC 8A4508 mov al, BYTE [ebp+8] - 502 000002EF 0530000000 add eax, 48 - 503 000002F4 25FF000000 and eax, 255 - 504 000002F9 50 push eax - 505 000002FA E8(00000000) call _putc - 506 000002FF 81C410000000 add esp, 16 - 507 00000305 C9 leave - 508 00000306 C3 ret - 509 - 510 diff --git a/kernel/lst/kernel.lst b/kernel/lst/kernel.lst deleted file mode 100644 index fc1ce68..0000000 --- a/kernel/lst/kernel.lst +++ /dev/null @@ -1,492 +0,0 @@ - 1 ;kernel.asm - 2 ;Author: Josh Holtrop - 3 ;Date: 10/30/03 - 4 ;Modified: 10/30/03 - 5 - 6 %define GDT_P 0x100000; ;1mb physical - Global Descriptor Table space - 7 %define GDT_V GDT_P+0xC0000000 - 8 %define IDT_P 0x102000 ;1mb+8kb - Interrupt Descriptor Table space - 9 %define IDT_V IDT_P+0xC0000000 - 10 %define PDBR_P 0x104000 ;1mb+16kb - Page Directory Base Register (first PD) - 11 %define PDBR_V PDBR_P+0xC0000000 - 12 %define LOPT_P 0x105000 ;1mb+20kb - LOw Page Table for mapping first 4mb - 13 %define LOPT_V LOPT_P+0xC0000000 - 14 %define KERNEL_P 0x106000 ;1mb+24kb - the kernel's physical address - 15 %define KERNEL_V KERNEL_P+0xC0000000 ;3gb+1mb+24kb, the virtual address of the kernel - 16 - 17 [global _start] - 18 [extern _isr] - 19 [extern _k_init] - 20 [extern _putc] - 21 - 22 bits 32 - 23 - 24 ;This is where the kernel begins execution - 25 ;At this point, the temporary gdt is set up to "map" 0xC000_0000 to 0x0. - 26 ;We must enable paging with the first 4mb mapped 1:1 virtual:physical - 27 ; and with the 4mb starting at 0xC000_0000 mapped to the first 4mb physical. - 28 ;Then we can start using our "real" gdt, then unmap the lower 4mb. - 29 _start: - 30 00000000 FA cli ;if they weren't already off - 31 - 32 00000001 31C0 xor eax, eax - 33 00000003 BF004010C0 mov edi, PDBR_V - 34 00000008 B900040000 mov ecx, 1024 ;clear the PDBR - 35 0000000D F3AB rep stosd - 36 0000000F C705004010C0035010- mov [PDBR_V], dword LOPT_P|0x03 ;store the physical address of the LOw Page Table (read/write, present) - 37 00000018 00 - 38 00000019 C705004C10C0035010- mov [PDBR_V+0xC00], dword LOPT_P|0x03 ;store the physical address of the LOw Page Table (read/write, present) - 39 00000022 00 - 40 - 41 00000023 BF005010C0 mov edi, LOPT_V - 42 00000028 B900040000 mov ecx, 1024 - 43 0000002D B803000000 mov eax, 0x03 ;starting physical address = 0x0 (read/write, present flags) - 44 fill_lopt_loop: ;fill the page table - 45 00000032 AB stosd - 46 00000033 0500100000 add eax, 4096 ;increment next phsyical address by 4kb - 47 00000038 E2F8 loop fill_lopt_loop - 48 - 49 0000003A B800401000 mov eax, PDBR_P - 50 0000003F 0F22D8 mov cr3, eax ;store the Page Directory Base Address - 51 00000042 0F20C0 mov eax, cr0 - 52 00000045 0D00000080 or eax, 0x80000000 ;set page enable bit - 53 0000004A 0F22C0 mov cr0, eax ;now paging is active! - 54 - 55 - 56 0000004D BF000010C0 mov edi, GDT_V - 57 00000052 BE[D4000000] mov esi, gdt - 58 00000057 B948000000 mov ecx, gdt_end-gdt - 59 copy_gdt: - 60 0000005C AC lodsb - 61 0000005D AA stosb - 62 0000005E E2FC loop copy_gdt - 63 - 64 00000060 BF002010C0 mov edi, IDT_V ;destination - 65 00000065 BE[22010000] mov esi, isr_0 ;address of isr0 - 66 0000006A BA0B000000 mov edx, isr_1-isr_0 ;distance between isr labels - 67 0000006F B932000000 mov ecx, 50 ;number of isrlabels - 68 fill_idt: - 69 00000074 89F3 mov ebx, esi - 70 00000076 6689F0 mov ax, si - 71 00000079 66AB stosw ;0 offset 15:0 - 72 0000007B 66B80800 mov ax, KERNEL_CODE - 73 0000007F 66AB stosw ;2 selector 15:0 - 74 00000081 66B8008E mov ax, 0x8E00 - 75 00000085 66AB stosw ;4 [P][DPL][0][TYPE][0][0][0][0][0][0][0][0] - 76 00000087 C1EE10 shr esi, 16 - 77 0000008A 6689F0 mov ax, si - 78 0000008D 66AB stosw ;6 offset 31:16 - 79 0000008F 89DE mov esi, ebx - 80 00000091 01D6 add esi, edx - 81 00000093 E2DF loop fill_idt - 82 00000095 66C705842110C000EE mov word [IDT_V+0x30*8+4], 0xEE00 ;interrupt 0x30 has user priviledges - 83 - 84 0000009E 0F0115[CE000000] lgdt [gdtr] ;load gdt - 85 000000A5 EA[AC000000]0800 jmp KERNEL_CODE:newgdtcontinue - 86 newgdtcontinue: - 87 000000AC 66B81000 mov ax, KERNEL_DATA - 88 000000B0 8EC0 mov es, ax - 89 000000B2 8ED8 mov ds, ax - 90 000000B4 8EE8 mov gs, ax - 91 000000B6 8EE0 mov fs, ax - 92 000000B8 8ED0 mov ss, ax - 93 000000BA BC000020C0 mov esp, 0xc0200000 ;stack just under 3gb+2mb, moves downward - 94 000000BF 0F011D[1C010000] lidt [idtr] ;load idt - 95 - 96 000000C6 E8(00000000) call _k_init - 97 haltit: - 98 000000CB F4 hlt ;halt processor when k_init is done - 99 000000CC EBFD jmp haltit ;shouldn't get here... - 100 - 101 %include "gdt.inc" - 102 <1> ;gdt.inc - 103 <1> ;Author: Josh Holtrop - 104 <1> ;Date: 10/30/03 - 105 <1> ;Modified: 03/02/04 - 106 <1> - 107 <1> gdtr: - 108 000000CE 4700 <1> dw gdt_end-gdt-1 - 109 000000D0 000010C0 <1> dd GDT_V - 110 <1> gdt: - 111 000000D4 00000000 <1> dd 0 - 112 000000D8 00000000 <1> dd 0 - 113 <1> KERNEL_CODE equ $-gdt - 114 000000DC FFFF <1> dw 0xffff ;limit 15:0 - 115 000000DE 0000 <1> dw 0x0000 ;base 15:0 - 116 000000E0 00 <1> db 0x00 ;base 23:16 - 117 000000E1 9A <1> db 0x9A ;access ([P][DPL][1][Executable][Direction/Conforming][Writable/Readable][A]) - 118 000000E2 CF <1> db 0xCF ;flags ([G][D/B][0][0]) / limit 19:16 - 119 000000E3 00 <1> db 0x00 ;base 31:24 - 120 <1> KERNEL_DATA equ $-gdt - 121 000000E4 FFFF <1> dw 0xffff ;limit 15:0 - 122 000000E6 0000 <1> dw 0x0000 ;base 15:0 - 123 000000E8 00 <1> db 0x00 ;base 23:16 - 124 000000E9 92 <1> db 0x92 ;access ([P][DPL][1][Executable][Direction/Conforming][Writable/Readable][A]) - 125 000000EA CF <1> db 0xCF ;flags ([G][D/B][0][0]) / limit 19:16 - 126 000000EB 00 <1> db 0x00 ;base 31:24 - 127 <1> USER_CODE equ $-gdt - 128 000000EC FFFF <1> dw 0xffff ;limit 15:0 - 129 000000EE 0000 <1> dw 0x0000 ;base 15:0 - 130 000000F0 00 <1> db 0x00 ;base 23:16 - 131 000000F1 FA <1> db 0xFA ;access ([P][DPL][1][Executable][Direction/Conforming][Writable/Readable][A]) - 132 000000F2 CF <1> db 0xCF ;flags ([G][D/B][0][0]) / limit 19:16 - 133 000000F3 00 <1> db 0x00 ;base 31:24 - 134 <1> USER_DATA equ $-gdt - 135 000000F4 FFFF <1> dw 0xffff ;limit 15:0 - 136 000000F6 0000 <1> dw 0x0000 ;base 15:0 - 137 000000F8 00 <1> db 0x00 ;base 23:16 - 138 000000F9 F2 <1> db 0xF2 ;access ([P][DPL][1][Executable][Direction/Conforming][Writable/Readable][A]) - 139 000000FA CF <1> db 0xCF ;flags ([G][D/B][0][0]) / limit 19:16 - 140 000000FB 00 <1> db 0x00 ;base 31:24 - 141 <1> gVESA_CODE equ $-gdt - 142 000000FC FFFF <1> dw 0xffff ;limit 15:0 - 143 000000FE 0000 <1> dw 0x0000 ;base 15:0 - 144 00000100 00 <1> db 0x00 ;base 23:16 - 145 00000101 9A <1> db 0x9A ;access ([P][DPL][1][Executable][Direction/Conforming][Writable/Readable][A]) - 146 00000102 40 <1> db 0x40 ;flags ([G][D/B][0][0]) / limit 19:16 - 147 00000103 00 <1> db 0x00 ;base 31:24 - 148 <1> VESA_DATA equ $-gdt - 149 00000104 FFFF <1> dw 0xffff ;limit 15:0 - 150 00000106 0000 <1> dw 0x0000 ;base 15:0 - 151 00000108 00 <1> db 0x00 ;base 23:16 - 152 00000109 92 <1> db 0x92 ;access ([P][DPL][1][Executable][Direction/Conforming][Writable/Readable][A]) - 153 0000010A 40 <1> db 0x40 ;flags ([G][D/B][0][0]) / limit 19:16 - 154 0000010B 00 <1> db 0x00 ;base 31:24 - 155 <1> VIDEO_TEXT equ $-gdt - 156 0000010C FF7F <1> dw 0x7FFF ;limit 15:0 - 157 0000010E 0080 <1> dw 0x8000 ;base 15:0 - 158 00000110 0B <1> db 0x0B ;base 23:16 - 159 00000111 92 <1> db 0x92 ;access ([P][DPL][1][Executable][Direction/Conforming][Writable/Readable][A]) - 160 00000112 40 <1> db 0x40 ;flags ([G][D/B][0][0]) / limit 19:16 - 161 00000113 00 <1> db 0x00 ;base 31:24 - 162 <1> VIDEO_GRAPHICS equ $-gdt - 163 00000114 FFFF <1> dw 0xFFFF ;limit 15:0 - 164 00000116 0000 <1> dw 0x0000 ;base 15:0 - 165 00000118 0A <1> db 0x0A ;base 23:16 - 166 00000119 92 <1> db 0x92 ;access ([P][DPL][1][Executable][Direction/Conforming][Writable/Readable][A]) - 167 0000011A 40 <1> db 0x40 ;flags ([G][D/B][0][0]) / limit 19:16 - 168 0000011B 00 <1> db 0x00 ;base 31:24 - 169 <1> gdt_end: - 170 <1> - 171 <1> - 172 <1> - 173 %include "idt.inc" - 174 <1> ;idt.inc - 175 <1> ;Author: Josh Holtrop - 176 <1> ;Date: 10/30/03 - 177 <1> ;Modified: 03/02/04 - 178 <1> - 179 <1> idtr: - 180 0000011C 8F01 <1> dw 50*8-1 ;size of idt - 181 0000011E 002010C0 <1> dd IDT_V ;address of idt - 182 <1> - 183 <1> - 184 <1> %macro isr_label 1 - 185 <1> isr_%1: - 186 <1> push eax - 187 <1> mov eax, %1 - 188 <1> jmp isr_main - 189 <1> %endmacro - 190 <1> - 191 <1> isr_label 0 - 192 <2> isr_%1: - 193 00000122 50 <2> push eax - 194 00000123 B800000000 <2> mov eax, %1 - 195 00000128 E91B020000 <2> jmp isr_main - 196 <1> isr_label 1 - 197 <2> isr_%1: - 198 0000012D 50 <2> push eax - 199 0000012E B801000000 <2> mov eax, %1 - 200 00000133 E910020000 <2> jmp isr_main - 201 <1> isr_label 2 - 202 <2> isr_%1: - 203 00000138 50 <2> push eax - 204 00000139 B802000000 <2> mov eax, %1 - 205 0000013E E905020000 <2> jmp isr_main - 206 <1> isr_label 3 - 207 <2> isr_%1: - 208 00000143 50 <2> push eax - 209 00000144 B803000000 <2> mov eax, %1 - 210 00000149 E9FA010000 <2> jmp isr_main - 211 <1> isr_label 4 - 212 <2> isr_%1: - 213 0000014E 50 <2> push eax - 214 0000014F B804000000 <2> mov eax, %1 - 215 00000154 E9EF010000 <2> jmp isr_main - 216 <1> isr_label 5 - 217 <2> isr_%1: - 218 00000159 50 <2> push eax - 219 0000015A B805000000 <2> mov eax, %1 - 220 0000015F E9E4010000 <2> jmp isr_main - 221 <1> isr_label 6 - 222 <2> isr_%1: - 223 00000164 50 <2> push eax - 224 00000165 B806000000 <2> mov eax, %1 - 225 0000016A E9D9010000 <2> jmp isr_main - 226 <1> isr_label 7 - 227 <2> isr_%1: - 228 0000016F 50 <2> push eax - 229 00000170 B807000000 <2> mov eax, %1 - 230 00000175 E9CE010000 <2> jmp isr_main - 231 <1> isr_label 8 - 232 <2> isr_%1: - 233 0000017A 50 <2> push eax - 234 0000017B B808000000 <2> mov eax, %1 - 235 00000180 E9C3010000 <2> jmp isr_main - 236 <1> isr_label 9 - 237 <2> isr_%1: - 238 00000185 50 <2> push eax - 239 00000186 B809000000 <2> mov eax, %1 - 240 0000018B E9B8010000 <2> jmp isr_main - 241 <1> isr_label 10 - 242 <2> isr_%1: - 243 00000190 50 <2> push eax - 244 00000191 B80A000000 <2> mov eax, %1 - 245 00000196 E9AD010000 <2> jmp isr_main - 246 <1> isr_label 11 - 247 <2> isr_%1: - 248 0000019B 50 <2> push eax - 249 0000019C B80B000000 <2> mov eax, %1 - 250 000001A1 E9A2010000 <2> jmp isr_main - 251 <1> isr_label 12 - 252 <2> isr_%1: - 253 000001A6 50 <2> push eax - 254 000001A7 B80C000000 <2> mov eax, %1 - 255 000001AC E997010000 <2> jmp isr_main - 256 <1> isr_label 13 - 257 <2> isr_%1: - 258 000001B1 50 <2> push eax - 259 000001B2 B80D000000 <2> mov eax, %1 - 260 000001B7 E98C010000 <2> jmp isr_main - 261 <1> isr_label 14 - 262 <2> isr_%1: - 263 000001BC 50 <2> push eax - 264 000001BD B80E000000 <2> mov eax, %1 - 265 000001C2 E981010000 <2> jmp isr_main - 266 <1> isr_label 15 - 267 <2> isr_%1: - 268 000001C7 50 <2> push eax - 269 000001C8 B80F000000 <2> mov eax, %1 - 270 000001CD E976010000 <2> jmp isr_main - 271 <1> isr_label 16 - 272 <2> isr_%1: - 273 000001D2 50 <2> push eax - 274 000001D3 B810000000 <2> mov eax, %1 - 275 000001D8 E96B010000 <2> jmp isr_main - 276 <1> isr_label 17 - 277 <2> isr_%1: - 278 000001DD 50 <2> push eax - 279 000001DE B811000000 <2> mov eax, %1 - 280 000001E3 E960010000 <2> jmp isr_main - 281 <1> isr_label 18 - 282 <2> isr_%1: - 283 000001E8 50 <2> push eax - 284 000001E9 B812000000 <2> mov eax, %1 - 285 000001EE E955010000 <2> jmp isr_main - 286 <1> isr_label 19 - 287 <2> isr_%1: - 288 000001F3 50 <2> push eax - 289 000001F4 B813000000 <2> mov eax, %1 - 290 000001F9 E94A010000 <2> jmp isr_main - 291 <1> isr_label 20 - 292 <2> isr_%1: - 293 000001FE 50 <2> push eax - 294 000001FF B814000000 <2> mov eax, %1 - 295 00000204 E93F010000 <2> jmp isr_main - 296 <1> isr_label 21 - 297 <2> isr_%1: - 298 00000209 50 <2> push eax - 299 0000020A B815000000 <2> mov eax, %1 - 300 0000020F E934010000 <2> jmp isr_main - 301 <1> isr_label 22 - 302 <2> isr_%1: - 303 00000214 50 <2> push eax - 304 00000215 B816000000 <2> mov eax, %1 - 305 0000021A E929010000 <2> jmp isr_main - 306 <1> isr_label 23 - 307 <2> isr_%1: - 308 0000021F 50 <2> push eax - 309 00000220 B817000000 <2> mov eax, %1 - 310 00000225 E91E010000 <2> jmp isr_main - 311 <1> isr_label 24 - 312 <2> isr_%1: - 313 0000022A 50 <2> push eax - 314 0000022B B818000000 <2> mov eax, %1 - 315 00000230 E913010000 <2> jmp isr_main - 316 <1> isr_label 25 - 317 <2> isr_%1: - 318 00000235 50 <2> push eax - 319 00000236 B819000000 <2> mov eax, %1 - 320 0000023B E908010000 <2> jmp isr_main - 321 <1> isr_label 26 - 322 <2> isr_%1: - 323 00000240 50 <2> push eax - 324 00000241 B81A000000 <2> mov eax, %1 - 325 00000246 E9FD000000 <2> jmp isr_main - 326 <1> isr_label 27 - 327 <2> isr_%1: - 328 0000024B 50 <2> push eax - 329 0000024C B81B000000 <2> mov eax, %1 - 330 00000251 E9F2000000 <2> jmp isr_main - 331 <1> isr_label 28 - 332 <2> isr_%1: - 333 00000256 50 <2> push eax - 334 00000257 B81C000000 <2> mov eax, %1 - 335 0000025C E9E7000000 <2> jmp isr_main - 336 <1> isr_label 29 - 337 <2> isr_%1: - 338 00000261 50 <2> push eax - 339 00000262 B81D000000 <2> mov eax, %1 - 340 00000267 E9DC000000 <2> jmp isr_main - 341 <1> isr_label 30 - 342 <2> isr_%1: - 343 0000026C 50 <2> push eax - 344 0000026D B81E000000 <2> mov eax, %1 - 345 00000272 E9D1000000 <2> jmp isr_main - 346 <1> isr_label 31 - 347 <2> isr_%1: - 348 00000277 50 <2> push eax - 349 00000278 B81F000000 <2> mov eax, %1 - 350 0000027D E9C6000000 <2> jmp isr_main - 351 <1> isr_label 32 - 352 <2> isr_%1: - 353 00000282 50 <2> push eax - 354 00000283 B820000000 <2> mov eax, %1 - 355 00000288 E9BB000000 <2> jmp isr_main - 356 <1> isr_label 33 - 357 <2> isr_%1: - 358 0000028D 50 <2> push eax - 359 0000028E B821000000 <2> mov eax, %1 - 360 00000293 E9B0000000 <2> jmp isr_main - 361 <1> isr_label 34 - 362 <2> isr_%1: - 363 00000298 50 <2> push eax - 364 00000299 B822000000 <2> mov eax, %1 - 365 0000029E E9A5000000 <2> jmp isr_main - 366 <1> isr_label 35 - 367 <2> isr_%1: - 368 000002A3 50 <2> push eax - 369 000002A4 B823000000 <2> mov eax, %1 - 370 000002A9 E99A000000 <2> jmp isr_main - 371 <1> isr_label 36 - 372 <2> isr_%1: - 373 000002AE 50 <2> push eax - 374 000002AF B824000000 <2> mov eax, %1 - 375 000002B4 E98F000000 <2> jmp isr_main - 376 <1> isr_label 37 - 377 <2> isr_%1: - 378 000002B9 50 <2> push eax - 379 000002BA B825000000 <2> mov eax, %1 - 380 000002BF E984000000 <2> jmp isr_main - 381 <1> isr_label 38 - 382 <2> isr_%1: - 383 000002C4 50 <2> push eax - 384 000002C5 B826000000 <2> mov eax, %1 - 385 000002CA E979000000 <2> jmp isr_main - 386 <1> isr_label 39 - 387 <2> isr_%1: - 388 000002CF 50 <2> push eax - 389 000002D0 B827000000 <2> mov eax, %1 - 390 000002D5 E96E000000 <2> jmp isr_main - 391 <1> isr_label 40 - 392 <2> isr_%1: - 393 000002DA 50 <2> push eax - 394 000002DB B828000000 <2> mov eax, %1 - 395 000002E0 E963000000 <2> jmp isr_main - 396 <1> isr_label 41 - 397 <2> isr_%1: - 398 000002E5 50 <2> push eax - 399 000002E6 B829000000 <2> mov eax, %1 - 400 000002EB E958000000 <2> jmp isr_main - 401 <1> isr_label 42 - 402 <2> isr_%1: - 403 000002F0 50 <2> push eax - 404 000002F1 B82A000000 <2> mov eax, %1 - 405 000002F6 E94D000000 <2> jmp isr_main - 406 <1> isr_label 43 - 407 <2> isr_%1: - 408 000002FB 50 <2> push eax - 409 000002FC B82B000000 <2> mov eax, %1 - 410 00000301 E942000000 <2> jmp isr_main - 411 <1> isr_label 44 - 412 <2> isr_%1: - 413 00000306 50 <2> push eax - 414 00000307 B82C000000 <2> mov eax, %1 - 415 0000030C E937000000 <2> jmp isr_main - 416 <1> isr_label 45 - 417 <2> isr_%1: - 418 00000311 50 <2> push eax - 419 00000312 B82D000000 <2> mov eax, %1 - 420 00000317 E92C000000 <2> jmp isr_main - 421 <1> isr_label 46 - 422 <2> isr_%1: - 423 0000031C 50 <2> push eax - 424 0000031D B82E000000 <2> mov eax, %1 - 425 00000322 E921000000 <2> jmp isr_main - 426 <1> isr_label 47 - 427 <2> isr_%1: - 428 00000327 50 <2> push eax - 429 00000328 B82F000000 <2> mov eax, %1 - 430 0000032D E916000000 <2> jmp isr_main - 431 <1> isr_label 48 - 432 <2> isr_%1: - 433 00000332 50 <2> push eax - 434 00000333 B830000000 <2> mov eax, %1 - 435 00000338 E90B000000 <2> jmp isr_main - 436 <1> isr_label 49 - 437 <2> isr_%1: - 438 0000033D 50 <2> push eax - 439 0000033E B831000000 <2> mov eax, %1 - 440 00000343 E900000000 <2> jmp isr_main - 441 <1> - 442 <1> isr_main: - 443 00000348 3D30000000 <1> cmp eax, 0x30 - 444 0000034D 7414 <1> jz isr_syscall - 445 <1> - 446 0000034F 60 <1> pusha - 447 00000350 1E <1> push ds - 448 00000351 06 <1> push es - 449 <1> - 450 00000352 50 <1> push eax - 451 <1> - 452 00000353 E8(00000000) <1> call _isr - 453 <1> - 454 00000358 81C404000000 <1> add esp, 4 - 455 <1> - 456 0000035E 07 <1> pop es - 457 0000035F 1F <1> pop ds - 458 00000360 61 <1> popa - 459 00000361 58 <1> pop eax - 460 <1> - 461 00000362 CF <1> iret - 462 <1> - 463 <1> - 464 <1> isr_syscall: - 465 00000363 58 <1> pop eax ;syscall function number - 466 00000364 60 <1> pusha - 467 00000365 1E <1> push ds - 468 00000366 06 <1> push es - 469 <1> - 470 <1> sc1: - 471 00000367 3D01000000 <1> cmp eax, 1 ;syscall 1 - putc - 472 0000036C 7511 <1> jnz sc2 - 473 0000036E 53 <1> push ebx - 474 0000036F E8(00000000) <1> call _putc - 475 00000374 81C404000000 <1> add esp, 4 - 476 0000037A E900000000 <1> jmp scdone - 477 <1> sc2: - 478 <1> - 479 <1> scdone: - 480 0000037F 07 <1> pop es - 481 00000380 1F <1> pop ds - 482 00000381 61 <1> popa - 483 00000382 CF <1> iret - 484 <1> - 485 <1> - 486 <1> - 487 <1> - 488 <1> - 489 <1> - 490 <1> - 491 - 492 diff --git a/kernel/mm/mm.cpp b/kernel/mm/mm.cpp deleted file mode 100644 index 974ec71..0000000 --- a/kernel/mm/mm.cpp +++ /dev/null @@ -1,132 +0,0 @@ -// mm.c -// Author: Josh Holtrop -// Created: 09/01/03 -// Modified: 03/08/04 - -#include "hos_defines.h" -#include "mm.h" - -//The total amount of physical memory available (bytes, 1 bit per page) -#define BITMAP_SIZE 0x20000 -dword mm_totalmem = 0; -dword mm_megabytes = 0; -byte page_bitmap[BITMAP_SIZE]; //used to store a bit for each page that is used, 0 if available - //0x20000*(8 bits/byte)=0x100000 pages in 4gb total - -//This function initializes the memory manager's linked list, filling it with the -// memory areas returned by bios interrupt 0x8E20 -void mm_init() -{ - dword memmap_entries = *(dword *)BOOT_MEMMAP_ENTRIES; - memmap_entry *maps = (memmap_entry *) BOOT_FIRST_MEMMAP; - dword a; - for (a = 0; a < BITMAP_SIZE; a++) - { - page_bitmap[a] = 0xFF; //all pages used - } - for (a = 0; a < memmap_entries; a++) - { - if (maps[a].attributes == 1) // (1) mem free to OS - { - mm_totalmem += maps[a].limit.lowdword; - if ((maps[a].base.lowdword + maps[a].limit.lowdword) >= (FREERAM_START+4096)) //goes past where we start freeram - { - if (maps[a].base.lowdword < FREERAM_START) - { - mm_pfreen(FREERAM_START, (maps[a].limit.lowdword - (FREERAM_START - maps[a].base.lowdword)) >> 12); - } - else - { - mm_pfreen(maps[a].base.lowdword, maps[a].limit.lowdword >> 12); //set the appropriate bits as "free" in the page bitmap - } - } - } - } - if (mm_totalmem % 0x100000) - mm_megabytes = (mm_totalmem >> 20) + 1; - else - mm_megabytes = mm_totalmem >> 20; -} - - -// This function frees a certain number of pages starting at the address -// specified in base for a length of pages pages -void mm_pfreen(dword base, dword pages) -{ - dword a; - dword max = base + (pages << 12); - for (a = base; a < max; a += 4096) - { - mm_pfree(a); - } -} - - -// This function frees a single page -void mm_pfree(dword base) -{ -// dword pageNumber = base >> 12; // >>12 == /4096 - dword byteNumber = base >> 15; //pageNumber >> 3; //pageNumber/8 - dword bitNumber = (base >> 12) % 8; //pageNumber % 8; - page_bitmap[byteNumber] = page_bitmap[byteNumber] & ((0x01 << bitNumber) ^ 0xFF); -} - - -// This function allocates a single page, returning its physical address -void *mm_palloc() -{ - dword bite; - for (bite = 0; bite < BITMAP_SIZE; bite++) - { - if (page_bitmap[bite] != 0xFF) //there is an available page within this 8-page region - { - int bit; - for (bit = 0; bit < 8; bit++) - { - if (!(page_bitmap[bite] & (1 << bit))) //this bite/bit combination is available - { - page_bitmap[bite] = page_bitmap[bite] | (1 << bit); //set page as used - return (void *)((bite << 15) | (bit << 12)); - } - } - } - } - return 0; //no free page -} - - -// This function reports the number of bytes of free physical memory -dword mm_freemem() -{ - dword a; - dword pages = 0; - for (a = 0; a < BITMAP_SIZE; a++) - { - int bit; - for (bit = 0; bit < 8; bit++) - { - if (!(page_bitmap[a] & (1 << bit))) - pages++; - } - } - return pages << 12; -} - - -dword mm_getTotalMem() -{ - return mm_totalmem; -} - - -dword mm_getTotalMegs() -{ - return mm_megabytes; -} - - - - - - - diff --git a/kernel/mm/mm.h b/kernel/mm/mm.h deleted file mode 100644 index 0cdd178..0000000 --- a/kernel/mm/mm.h +++ /dev/null @@ -1,28 +0,0 @@ -// mm.c -// Author: Josh Holtrop -// Created: 09/01/03 -// Modified: 03/08/04 - -#ifndef __HOS_MM__ -#define __HOS_MM__ __HOS_MM__ - -#include "hos_defines.h" - -typedef struct { - qword base; - qword limit; - dword attributes; -} __attribute__((packed)) memmap_entry; - - -void mm_init(); -void mm_pfreen(dword base, dword pages); -void mm_pfree(dword base); -void *mm_palloc(); -dword mm_freemem(); -dword mm_getTotalMem(); -dword mm_getTotalMegs(); - - -#endif - diff --git a/kernel/mm/vmm.cpp b/kernel/mm/vmm.cpp deleted file mode 100644 index 6eeee74..0000000 --- a/kernel/mm/vmm.cpp +++ /dev/null @@ -1,380 +0,0 @@ -// vmm.c -// Author: Josh Holtrop -// Date: 09/30/03 -// Rewritten from scratch: 12/23/03 -// Modified: 03/02/04 - -#include "hos_defines.h" -#include "vmm.h" -#include "asmfuncs.h" -#include "mm/mm.h" - -HeapEntry *firstHeapEntry = (HeapEntry *)0xD0000000; //this is where heap memory starts - -// This is the initialization procedure for the Virtual Memory Manager -// It sets up the final page directory/page table setup and maps video memory, if present -void vmm_init() -{ - unsigned int *pageTables = (unsigned int *)0xC0104000; //this is the location of the page directory - pageTables[0x3FF] = 0x104000|0x03; //the last page directory entry points to the page directory itself - pageTables[0] = 0; - invlpg_(0); - - unsigned int firstHeapEntryBlock = (unsigned int)mm_palloc(); - vmm_map1((unsigned int)firstHeapEntry, firstHeapEntryBlock); - HeapEntryBlock *heb = (HeapEntryBlock *)firstHeapEntry; - vmm_heb_init(heb); - heb->entry[0].base = (unsigned int)firstHeapEntry; //start of kernel's heap memory - heb->entry[0].size = 4096; //the first HeapEntryBlock is 1 page long - heb->entry[0].attributes = VMM_HE_HEB; //this is a HeapEntryBlock - heb->entry[1].base = (unsigned int)firstHeapEntry+4096; //this is the start of the rest of the kernel's heap memory - heb->entry[1].size = 0x10000000-4096; //the rest of the kernel's heap memory: 256mb - 4kb - heb->entry[1].attributes = VMM_HE_HOLE; //this is a hole - an unmapped section of heap memory -} - - -// This function initialzes a Heap Entry Block to unused entries linked together -void vmm_heb_init(HeapEntryBlock *heb) -{ - int a; - for (a = 0; a < 256; a++) - { - heb->entry[a].base = 0; - heb->entry[a].size = 0; - heb->entry[a].attributes = VMM_HE_UNUSED; - heb->entry[a].link = (unsigned int)&(heb->entry[a+1]); - } - heb->entry[255].link = 0; -} - - -// This function maps a virtual address to a physical address using the page directory / page table -void vmm_map1(unsigned int virt, unsigned int physical) -{ - unsigned int pde = virt >> 22; - unsigned int pte = (virt & 0x003FF000) >> 12; - unsigned int *pageTables = (unsigned int *)0xC0104000; //this is the location of the page directory - if (!(pageTables[pde] & 0x01)) //the page directory entry does not exist, we must allocate a page for it - { - unsigned int *newpagetable = (dword *)mm_palloc(); - pageTables[pde] = ((unsigned int)newpagetable) | 0x03; - invlpg_(virt); - unsigned int *newpteptr = (unsigned int *)(0xFFC00000 | (pde << 12)); //points to first unsigned int of newly allocated page table - int a; - for (a = 0; a < 1024; a++) - { - newpteptr[a] = 0; - } - } - unsigned int *pteptr = (unsigned int *)(0xFFC00000 | (pde << 12) | (pte << 2)); - *pteptr = physical | 0x03; - invlpg_(virt); -} - - -// This function maps a variable number of pages in a row -void vmm_mapn(unsigned int virt, unsigned int physical, unsigned int n) -{ - for (; n > 0; n--) - { - vmm_map1(virt, physical); - virt += 4096; - physical += 4096; - } -} - - -// This function removes the virtual address's entry in the page directory / page table -void vmm_unmap1(unsigned int virt) -{ - unsigned int *pteptr = (unsigned int *)(0xFFC00000 | ((virt & 0xFFC00000) >> 10) | ((virt & 0x003FF000) >> 10)); - *pteptr = 0; - invlpg_(virt); -} - - -// This function removes multiple pages' entries -void vmm_unmapn(unsigned int virt, unsigned int n) -{ - for (; n > 0; n--) - { - vmm_unmap1(virt); - virt += 4096; - } -} - - -// Virtual Memory allocator function -void *malloc(unsigned int bytes) -{ - if (bytes % VMM_MALLOC_GRANULARITY) - bytes = bytes + VMM_MALLOC_GRANULARITY - (bytes % VMM_MALLOC_GRANULARITY); - void *attempt = vmm_getFreeChunk(bytes); - if (attempt) - return attempt; - if(vmm_moreCore(bytes)) - return NULL; //we could not get any more heap memory - return vmm_getFreeChunk(bytes); -} - - -// This function returns a pointer if a free chunk of memory exists -void *vmm_getFreeChunk(unsigned int bytes) -{ - HeapEntry *he = firstHeapEntry; - for (;;) - { - if (he->attributes == VMM_HE_FREE) - { - if (he->size > bytes) - { - HeapEntry *nhe = vmm_nextHeapEntry(); - nhe->base = he->base; - nhe->size = bytes; - nhe->attributes = VMM_HE_USED; - he->base += bytes; - he->size -= bytes; - return (void *)(nhe->base); - } - if (he->size == bytes) - { - he->attributes = VMM_HE_USED; - return (void *)(he->base); - } - } - he = (HeapEntry *)he->link; - if (!he) - break; - } - return 0; -} - - -// This function coalesces any two adjacent heap entries into one entry -void vmm_coalesceHeapEntry(HeapEntry *he) -{ - if (!(he->attributes == VMM_HE_FREE || he->attributes == VMM_HE_HOLE)) - return; - if (he->size == 0) - { - he->attributes = VMM_HE_UNUSED; - return; - } - HeapEntry *hec = firstHeapEntry; - for (;;) - { - if (hec->attributes == he->attributes) - { - if ((hec->base + hec->size) == he->base) //hec ends where he begins - { - he->base = hec->base; - he->size += hec->size; - hec->attributes = VMM_HE_UNUSED; - } - if ((he->base + he->size) == hec->base) //he ends where hec begins - { - he->size += hec->size; - hec->attributes = VMM_HE_UNUSED; - } - } - hec = (HeapEntry *)hec->link; - if (!hec) - break; - } -} - - -// This function retrieves more physical memory for the heap -int vmm_moreCore(unsigned int bytes) -{ - unsigned int pages = (bytes >> 12) + 1; - bytes = pages << 12; - HeapEntry *he = vmm_getFirstHoleHeapEntry(bytes); - unsigned int virt = he->base; - for (; pages > 0; pages--) - { - unsigned int phys = (unsigned int)mm_palloc(); - if (!phys) - return 1; - vmm_map1(virt, phys); - virt += 4096; - } - if (he->size == bytes) - { - he->attributes = VMM_HE_FREE; - vmm_coalesceHeapEntry(he); - } - else - { - HeapEntry *nhe = vmm_nextHeapEntry(); - nhe->base = he->base; - nhe->size = bytes; - nhe->attributes = VMM_HE_FREE; - he->base += bytes; - he->size -= bytes; - vmm_coalesceHeapEntry(nhe); - } - return 0; -} - - -// This function returns the next available heap entry, creates more entries if we are running low -HeapEntry *vmm_nextHeapEntry() -{ - if (vmm_heapEntriesLeft() < 10) - vmm_addHeapEntryBlock(); - return vmm_getFirstUnusedHeapEntry(); -} - - -// This function creates a new block (page) of heap entries (256) -void vmm_addHeapEntryBlock() -{ - HeapEntry *he = vmm_getFirstHoleHeapEntry(4096); - HeapEntry *newBlock = vmm_getFirstUnusedHeapEntry(); - unsigned int heb = (unsigned int)mm_palloc(); - vmm_map1(he->base, heb); - vmm_heb_init((HeapEntryBlock *)he->base); - HeapEntry *lhe = vmm_getLastHeapEntry(); - if (he->size == 4096) - { - he->attributes = VMM_HE_HEB; - lhe->link = (unsigned int)he->base; - } - else - { - newBlock->base = he->base; - newBlock->size = 4096; - newBlock->attributes = VMM_HE_HEB; - he->base += 4096; - he->size -= 4096; - lhe->link = (unsigned int)newBlock->base; - } - return; -} - - -// This function returns the last heap entry in the linked list, useful for setting -// its link field to point to the first entry of a newly allocated list -HeapEntry *vmm_getLastHeapEntry() -{ - HeapEntry *he = firstHeapEntry; - for (;;) - { - if (he->link == 0) - return he; - he = (HeapEntry *)he->link; - } -} - - -// This function returns the first heap entry corresponding to a memory "hole" -HeapEntry *vmm_getFirstHoleHeapEntry(unsigned int minBytes) -{ - HeapEntry *he = firstHeapEntry; - for (;;) - { - if ((he->attributes == VMM_HE_HOLE) && (he->size >= minBytes)) - return he; - he = (HeapEntry *)he->link; - if (!he) - break; - } - return 0; -} - - -// This function returns the first heap entry that is not being used -HeapEntry *vmm_getFirstUnusedHeapEntry() -{ - HeapEntry *he = firstHeapEntry; - for (;;) - { - if (he->attributes == VMM_HE_UNUSED) - return he; - he = (HeapEntry *)he->link; - if (!he) - break; - } - return 0; -} - - -// This function returns the number of heap entries available for use -unsigned int vmm_heapEntriesLeft() -{ - HeapEntry *he = firstHeapEntry; - unsigned int entries = 0; - for (;;) - { - if (he->attributes == VMM_HE_UNUSED) - entries++; - he = (HeapEntry *)he->link; - if (!he) - break; - } - return entries; -} - - -// This function "frees" an area of memory previously allocated with malloc() -int free(void *ptr) -{ - HeapEntry *he = vmm_getHeapEntryByBase((unsigned int)ptr); - if (!he) - return 1; //a heap entry starting at the given address was not found - he->attributes = VMM_HE_FREE; - vmm_coalesceHeapEntry(he); - return 0; -} - - -// This function scans the heap entry linked list for an entry that begins at the given address -HeapEntry *vmm_getHeapEntryByBase(unsigned int base) -{ - HeapEntry *he = firstHeapEntry; - for (;;) - { - if (he->base == base) - return he; - he = (HeapEntry *)he->link; - if (!he) - break; - } - return NULL; -} - - -// This function re-allocates memory already allocated, preserving the old contents -// (as long as newSize is greater than oldSize) -void *realloc(void *orig, unsigned int newSize) -{ - void *newMem; - if ((newMem = malloc(newSize))) - { - HeapEntry *he = vmm_getHeapEntryByBase((unsigned int) orig); - if (!he) - return NULL; //old chunk not found / nonexistent - memcpy(newMem, orig, (he->size < newSize ? he->size : newSize)); - free(orig); - return newMem; - } - else - return NULL; //could not get mem for new chunk -} - -// This function allocates and zeros memory for the given number of objects, -// given the size of each object -void *calloc(unsigned int number, unsigned int size) -{ - void *mem = malloc(number * size); - if (!mem) - return NULL; //could not get memory - memset(mem, 0, number * size); - return mem; -} - - - - - diff --git a/kernel/mm/vmm.h b/kernel/mm/vmm.h deleted file mode 100644 index 3cfe3f4..0000000 --- a/kernel/mm/vmm.h +++ /dev/null @@ -1,56 +0,0 @@ -// vmm.h -// Author: Josh Holtrop -// Date: 09/30/03 -// Rewritten from scratch: 12/23/03 -// Modified: 03/02/04 - -#include "hos_defines.h" - -#ifndef __HOS_VMM__ -#define __HOS_VMM__ __HOS_VMM__ - -#define VMM_HE_UNUSED 0 //available entry -#define VMM_HE_FREE 1 //free section of memory -#define VMM_HE_USED 2 //used section of memory -#define VMM_HE_HOLE 3 //a "hole" (unmapped) section of virtual memory -#define VMM_HE_HEB 4 //HeapEntryBlock - -#define VMM_MALLOC_GRANULARITY 4 //granularity for all memory requests - -typedef struct { - unsigned int base; //virtual base address - unsigned int size; //size in bytes - unsigned int attributes; //free/used/hole - unsigned int link; //link to next HeapEntry -} __attribute__((packed)) HeapEntry; - - -typedef struct { - HeapEntry entry[256]; //256 HeapEntry objects = 4kb (1 page) -} __attribute__((packed)) HeapEntryBlock; - - -void vmm_init(); -void *malloc(unsigned int bytes); -int free(void *ptr); -void vmm_map1(unsigned int virt, unsigned int physical); -void vmm_mapn(unsigned int virt, unsigned int physical, unsigned int n); -void vmm_unmap1(unsigned int virt); -void vmm_unmapn(unsigned int virt, unsigned int n); -void vmm_heb_init(HeapEntryBlock *heb); -void *vmm_getFreeChunk(unsigned int bytes); -HeapEntry *vmm_nextHeapEntry(); -unsigned int vmm_heapEntriesLeft(); -HeapEntry *vmm_getLastHeapEntry(); -HeapEntry *vmm_getFirstUnusedHeapEntry(); -HeapEntry *vmm_getFirstHoleHeapEntry(unsigned int minBytes); -void vmm_addHeapEntryBlock(); -int vmm_moreCore(unsigned int bytes); -void vmm_coalesceHeapEntry(HeapEntry *he); -HeapEntry *vmm_getHeapEntryByBase(unsigned int base); -void *realloc(void *orig, unsigned int newSize); -void *calloc(unsigned int number, unsigned int size); - -#endif - - diff --git a/kernel/search.bat b/kernel/search.bat deleted file mode 100755 index e9311bb..0000000 --- a/kernel/search.bat +++ /dev/null @@ -1 +0,0 @@ -grep -R -n -i %1 * diff --git a/kernel/search.sh b/kernel/search.sh deleted file mode 100644 index a7c458a..0000000 --- a/kernel/search.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -grep -R -n -i $1 * \ No newline at end of file diff --git a/kernel/sys/cmos.cpp b/kernel/sys/cmos.cpp deleted file mode 100644 index e789c34..0000000 --- a/kernel/sys/cmos.cpp +++ /dev/null @@ -1,42 +0,0 @@ -// cmos.c -// Author: Josh Holtrop -// Created: 02/26/04 -// Implements various CMOS function calls - -#include "hos_defines.h" -#include "cmos.h" -#include "sys/io.h" - -//Returns the cmos type of floppy disk drive 0 (0 = not present) -unsigned char cmos_getfd0() -{ - outportb(0x70, 0x10); - return (inportb(0x71) >> 4); -} - - -//Returns the cmos type of floppy disk drive 1 (0 = not present) -unsigned char cmos_getfd1() -{ - outportb(0x70, 0x10); - return (inportb(0x71) & 0x0F); -} - - -//Returns the cmos type of hard disk drive 0 (0 = not present) -unsigned char cmos_gethd0() -{ - outportb(0x70, 0x12); - return (inportb(0x71) >> 4); -} - - -//Returns the cmos type of hard disk drive 1 (0 = not present) -unsigned char cmos_gethd1() -{ - outportb(0x70, 0x12); - return (inportb(0x71) & 0x0F); -} - - - diff --git a/kernel/sys/cmos.h b/kernel/sys/cmos.h deleted file mode 100644 index cf5ce52..0000000 --- a/kernel/sys/cmos.h +++ /dev/null @@ -1,18 +0,0 @@ -// cmos.h -// Author: Josh Holtrop -// Created: 02/26/04 -// Implements various CMOS function calls - -#include "hos_defines.h" - -#ifndef __HOS_CMOS__ -#define __HOS_CMOS__ __HOS_CMOS__ - -unsigned char cmos_getfd0(); -unsigned char cmos_getfd1(); -unsigned char cmos_gethd0(); -unsigned char cmos_gethd1(); - -#endif - - diff --git a/kernel/sys/io.cpp b/kernel/sys/io.cpp deleted file mode 100644 index 87a8b16..0000000 --- a/kernel/sys/io.cpp +++ /dev/null @@ -1,8 +0,0 @@ -// io.c -// Author: Josh Holtrop -// Created: 02/26/04 -// Implements basic port input/output functions - -#include "io.h" - - diff --git a/kernel/sys/io.h b/kernel/sys/io.h deleted file mode 100644 index b77bef1..0000000 --- a/kernel/sys/io.h +++ /dev/null @@ -1,40 +0,0 @@ -// io.h -// Author: Josh Holtrop -// Created: 02/26/04 -// Implements basic port input/output functions - -#ifndef __HOS_IO__ -#define __HOS_IO__ __HOS_IO__ - -#include "hos_defines.h" - -//void outportb(unsigned int port, unsigned char value); -//inline void outportw(unsigned int port, unsigned int value); -//inline unsigned char inportb(unsigned short port); - -//Writes a byte out to a port -static inline void outportb(unsigned int port, unsigned char value) // Output a byte to a port -{ - asm volatile ("outb %%al,%%dx"::"d" (port), "a" (value)); -} - -//Writes a word out to a port -static inline void outportw(unsigned int port, unsigned int value) // Output a word to a port -{ - asm volatile ("outw %%ax,%%dx"::"d" (port), "a" (value)); -} - -//Reads a byte from a port -static inline unsigned char inportb(unsigned short port) -{ - unsigned char ret_val; - - asm volatile("inb %w1,%b0" - : "=a"(ret_val) - : "d"(port)); - return ret_val; -} - -#endif - - diff --git a/kernel/sys/pic.cpp b/kernel/sys/pic.cpp deleted file mode 100644 index 310ff60..0000000 --- a/kernel/sys/pic.cpp +++ /dev/null @@ -1,30 +0,0 @@ -// pic.c -// Author: Josh Holtrop -// Created: 02/26/04 - -#include "hos_defines.h" -#include "pic.h" -#include "sys/io.h" - -//Re-maps the Programmable Interrupr Controllers so IRQ0->pic1 base address, IRG8->pic2 base address -void pic_remap(int pic1, int pic2) -{ - byte a1, a2; - - a1 = inportb(PIC1_DATA); //0x21 - a2 = inportb(PIC2_DATA); //0xA1 - - outportb(PIC1_COMMAND, ICW1_INIT+ICW1_ICW4); //0x20, 0x10+0x01 00010001b - outportb(PIC2_COMMAND, ICW1_INIT+ICW1_ICW4); //0xA0, 0x10+0x01 00010001b - outportb(PIC1_DATA, pic1); //0x21, pic1 - outportb(PIC2_DATA, pic2); //0xA1, pic2 - outportb(PIC1_DATA, 4); //0x21, 0x04 00000100b - outportb(PIC2_DATA, 2); //0xA1, 0x02 00000010b - outportb(PIC1_DATA, ICW4_8086); //0x21, 0x01 00000001b - outportb(PIC2_DATA, ICW4_8086); //0xA1, 0x01 00000001b - - outportb(PIC1_DATA, a1); //0x21 - outportb(PIC2_DATA, a2); //0xA1 -} - - diff --git a/kernel/sys/pic.h b/kernel/sys/pic.h deleted file mode 100644 index c363732..0000000 --- a/kernel/sys/pic.h +++ /dev/null @@ -1,65 +0,0 @@ -// pic.h -// Author: Josh Holtrop -// Created: 02/26/04 - -#ifndef __HOS_PIC__ -#define __HOS_PIC__ __HOS_PIC__ - -#include "hos_defines.h" -#include "sys/io.h" - -#define PIC1 0x20 -#define PIC2 0xA0 -#define PIC1_COMMAND PIC1 -#define PIC1_DATA (PIC1+1) -#define PIC2_COMMAND PIC2 -#define PIC2_DATA (PIC2+1) -#define PIC_EOI 0x20 - -#define ICW1_ICW4 0x01 /* ICW4 (not) needed */ -#define ICW1_SINGLE 0x02 /* Single (cascade) mode */ -#define ICW1_INTERVAL4 0x04 /* Call address interval 4 (8) */ -#define ICW1_LEVEL 0x08 /* Level triggered (edge) mode */ -#define ICW1_INIT 0x10 /* Initialization - required! */ - -#define ICW4_8086 0x01 /* 8086/88 (MCS-80/85) mode */ -#define ICW4_AUTO 0x02 /* Auto (normal) EOI */ -#define ICW4_BUF_SLAVE 0x08 /* Buffered mode/slave */ -#define ICW4_BUF_MASTER 0x0C /* Buffered mode/master */ -#define ICW4_SFNM 0x10 /* Special fully nested (not) */ - -void pic_remap(int pic1, int pic2); -//inline void pic_mask1(byte mask); -//inline void pic_mask2(byte mask); -//inline void pic_eoi(); -//inline void pic_eoi2(); - -//Masks interrupts on first Programmable Interrupt Controller -static inline void pic_mask1(byte mask) -{ - outportb(PIC1_DATA, mask); //0x21, maskfield *OCW1* -} - -//Masks interrupts on second Programmable Interrupt Controller -static inline void pic_mask2(byte mask) -{ - outportb(PIC2_DATA, mask); //0xA1, maskfield *OCW1* -} - - -//Signals an End Of Interrupt signal to the first PIC -static inline void pic_eoi() -{ - outportb(0x20, 0x20); -} - -//Signals an End Of Interrupt signal to both the second and first PIC unit -static inline void pic_eoi2() -{ - outportb(0xA0, 0x20); - outportb(0x20, 0x20); -} - -#endif - - diff --git a/kernel/sys/rtc.cpp b/kernel/sys/rtc.cpp deleted file mode 100644 index cbf3947..0000000 --- a/kernel/sys/rtc.cpp +++ /dev/null @@ -1,83 +0,0 @@ -// rtc.c -// Author: Josh Holtrop -// Created: 02/26/04 -// Implements Real-Time Clock function calls -// These functions are for reading and writing various values stored on the CMOS Real Time Clock -// Parameters / return values are in BCD format - -#include "hos_defines.h" -#include "rtc.h" -#include "sys/io.h" - -unsigned char rtc_readDay() -{ - outportb(0x70, 7); - return inportb(0x71); -} - -unsigned char rtc_readMonth() -{ - outportb(0x70, 8); - return inportb(0x71); -} - -unsigned char rtc_readYear() -{ - outportb(0x70, 9); - return inportb(0x71); -} - -unsigned char rtc_readSecond() -{ - outportb(0x70, 0); - return inportb(0x71); -} - -unsigned char rtc_readMinute() -{ - outportb(0x70, 2); - return inportb(0x71); -} - -unsigned char rtc_readHour() -{ - outportb(0x70, 4); - return inportb(0x71); -} - -void rtc_setDay(unsigned char day) -{ - outportb(0x70, 7); - outportb(0x71, day); -} - -void rtc_setMonth(unsigned char month) -{ - outportb(0x70, 8); - outportb(0x71, month); -} - -void rtc_setYear(unsigned char year) -{ - outportb(0x70, 9); - outportb(0x71, year); -} - -void rtc_setSecond(unsigned char second) -{ - outportb(0x70, 0); - outportb(0x71, second); -} - -void rtc_setMinute(unsigned char minute) -{ - outportb(0x70, 2); - outportb(0x71, minute); -} - -void rtc_setHour(unsigned char hour) -{ - outportb(0x70, 4); - outportb(0x71, hour); -} - diff --git a/kernel/sys/rtc.h b/kernel/sys/rtc.h deleted file mode 100644 index 3c589de..0000000 --- a/kernel/sys/rtc.h +++ /dev/null @@ -1,28 +0,0 @@ -// rtc.h -// Author: Josh Holtrop -// Created: 02/26/04 -// Implements Real-Time Clock function calls -// These functions are for reading and writing various values stored on the CMOS Real Time Clock -// Parameters / return values are in BCD format - -#ifndef __HOS_RTC__ -#define __HOS_RTC__ __HOS_RTC__ - -#include "hos_defines.h" - -unsigned char rtc_readDay(); -unsigned char rtc_readMonth(); -unsigned char rtc_readYear(); -unsigned char rtc_readSecond(); -unsigned char rtc_readMinute(); -unsigned char rtc_readHour(); -void rtc_setDay(unsigned char dat); -void rtc_setMonth(unsigned char month); -void rtc_setYear(unsigned char year); -void rtc_setSecond(unsigned char second); -void rtc_setMinute(unsigned char minute); -void rtc_setHour(unsigned char hour); - -#endif - - diff --git a/kernel/video/stdfont.cpp b/kernel/video/stdfont.cpp deleted file mode 100644 index ae0b5ea..0000000 --- a/kernel/video/stdfont.cpp +++ /dev/null @@ -1,551 +0,0 @@ -// stdfont.c -// Author: Josh Holtrop -// Created: 02/26/04 - -#include "stdfont.h" - -const unsigned char stdfont8x5[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x80, 0xC0, 0xE0, 0xF0, 0xE0, 0xC0, 0x80, - 0x00, 0x08, 0x18, 0x38, 0x78, 0x38, 0x18, 0x08, - 0x00, 0x20, 0x70, 0xA8, 0x20, 0xA8, 0x70, 0x20, - 0x00, 0xA0, 0xA0, 0xA0, 0xA0, 0x00, 0xA0, 0xA0, - 0x00, 0x78, 0xA8, 0xA8, 0x78, 0x28, 0x28, 0x68, - 0x00, 0x78, 0x80, 0x70, 0x88, 0x70, 0x08, 0xF0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xF8, - 0x00, 0x20, 0x70, 0xA8, 0x20, 0xA8, 0x70, 0xF8, - 0x00, 0x20, 0x70, 0xA8, 0x20, 0x20, 0x20, 0x20, - 0x00, 0x20, 0x20, 0x20, 0x20, 0xA8, 0x70, 0x20, - 0x00, 0x00, 0x20, 0x10, 0xF8, 0x10, 0x20, 0x00, - 0x00, 0x00, 0x20, 0x40, 0xF8, 0x40, 0x20, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, - 0x00, 0x60, 0x90, 0x60, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x70, 0xF8, 0xF8, 0x00, 0x00, - 0x00, 0x00, 0xF8, 0xF8, 0x70, 0x20, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x20, 0x20, 0x20, 0x00, 0x20, 0x20, - 0x00, 0x50, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x50, 0xF8, 0x50, 0x50, 0x50, 0xF8, 0x50, - 0x00, 0x20, 0x78, 0xA0, 0x70, 0x28, 0xF0, 0x20, - 0x00, 0x00, 0x08, 0x90, 0x20, 0x48, 0x80, 0x00, - 0x00, 0x20, 0x50, 0x50, 0x20, 0x58, 0x90, 0x68, - 0x00, 0x40, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x20, 0x40, 0x40, 0x40, 0x40, 0x40, 0x20, - 0x00, 0x40, 0x20, 0x20, 0x20, 0x20, 0x20, 0x40, - 0x00, 0x00, 0xA8, 0x70, 0xF8, 0x70, 0xA8, 0x00, - 0x00, 0x00, 0x20, 0x20, 0xF8, 0x20, 0x20, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x40, - 0x00, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, - 0x00, 0x00, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00, - 0x00, 0x70, 0x88, 0x88, 0x88, 0x88, 0x88, 0x70, - 0x00, 0x20, 0x60, 0xA0, 0x20, 0x20, 0x20, 0x20, - 0x00, 0x70, 0x88, 0x08, 0x10, 0x20, 0x40, 0xF8, - 0x00, 0x70, 0x88, 0x08, 0x10, 0x08, 0x88, 0x70, - 0x00, 0x30, 0x50, 0x90, 0x90, 0xF8, 0x10, 0x10, - 0x00, 0xF8, 0x80, 0x80, 0xF8, 0x08, 0x88, 0x70, - 0x00, 0x38, 0x40, 0x80, 0xF0, 0x88, 0x88, 0x70, - 0x00, 0xF8, 0x08, 0x10, 0x20, 0x40, 0x40, 0x40, - 0x00, 0x70, 0x88, 0x88, 0x70, 0x88, 0x88, 0x70, - 0x00, 0x70, 0x88, 0x88, 0x78, 0x08, 0x10, 0x60, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, - 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x40, - 0x00, 0x10, 0x20, 0x40, 0x80, 0x40, 0x20, 0x10, - 0x00, 0x00, 0x00, 0xF0, 0x00, 0xF0, 0x00, 0x00, - 0x00, 0x80, 0x40, 0x20, 0x10, 0x20, 0x40, 0x80, - 0x00, 0x70, 0x88, 0x08, 0x10, 0x20, 0x00, 0x20, - 0x00, 0x70, 0x88, 0x88, 0xB8, 0xB0, 0x80, 0x78, - 0x00, 0x70, 0x88, 0x88, 0xF8, 0x88, 0x88, 0x88, - 0x00, 0xF0, 0x88, 0x88, 0xF0, 0x88, 0x88, 0xF0, - 0x00, 0x70, 0x88, 0x80, 0x80, 0x80, 0x88, 0x70, - 0x00, 0xF0, 0x88, 0x88, 0x88, 0x88, 0x88, 0xF0, - 0x00, 0xF8, 0x80, 0x80, 0xF0, 0x80, 0x80, 0xF8, - 0x00, 0xF8, 0x80, 0x80, 0xF0, 0x80, 0x80, 0x80, - 0x00, 0x70, 0x88, 0x80, 0xB8, 0x88, 0x88, 0x70, - 0x00, 0x88, 0x88, 0x88, 0xF8, 0x88, 0x88, 0x88, - 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x90, 0x60, - 0x00, 0x88, 0x90, 0xA0, 0xC0, 0xA0, 0x90, 0x88, - 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xF8, - 0x00, 0x88, 0xD8, 0xA8, 0x88, 0x88, 0x88, 0x88, - 0x00, 0x88, 0xC8, 0xE8, 0xB8, 0x98, 0x88, 0x88, - 0x00, 0x70, 0x88, 0x88, 0x88, 0x88, 0x88, 0x70, - 0x00, 0xF0, 0x88, 0x88, 0xF0, 0x80, 0x80, 0x80, - 0x00, 0x70, 0x88, 0x88, 0x88, 0xA8, 0x98, 0x70, - 0x00, 0xF0, 0x88, 0x88, 0xF0, 0xA0, 0x90, 0x88, - 0x00, 0x70, 0x88, 0x80, 0x70, 0x08, 0x88, 0x70, - 0x00, 0xF8, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x00, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x70, - 0x00, 0x88, 0x88, 0x88, 0x88, 0x88, 0x50, 0x20, - 0x00, 0x88, 0x88, 0x88, 0x88, 0x88, 0xA8, 0x50, - 0x00, 0x88, 0x50, 0x20, 0x20, 0x50, 0x88, 0x88, - 0x00, 0x88, 0x88, 0x50, 0x20, 0x20, 0x20, 0x20, - 0x00, 0xF8, 0x08, 0x10, 0x20, 0x40, 0x80, 0xF8, - 0x00, 0x70, 0x40, 0x40, 0x40, 0x40, 0x40, 0x70, - 0x00, 0x80, 0xC0, 0x60, 0x30, 0x18, 0x08, 0x00, - 0x00, 0xE0, 0x20, 0x20, 0x20, 0x20, 0x20, 0xE0, - 0x00, 0x20, 0x50, 0x88, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, - 0x00, 0x60, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x70, 0x08, 0x78, 0x88, 0x78, - 0x00, 0x80, 0x80, 0xF0, 0x88, 0x88, 0x88, 0xF0, - 0x00, 0x00, 0x00, 0x70, 0x88, 0x80, 0x88, 0x70, - 0x00, 0x08, 0x08, 0x78, 0x88, 0x88, 0x88, 0x78, - 0x00, 0x00, 0x00, 0x70, 0x88, 0xF8, 0x80, 0x78, - 0x00, 0x30, 0x40, 0x40, 0xE0, 0x40, 0x40, 0x40, - 0x00, 0x00, 0x00, 0x78, 0x88, 0x78, 0x08, 0x70, - 0x00, 0x80, 0x80, 0xF0, 0x88, 0x88, 0x88, 0x88, - 0x00, 0x20, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x00, 0x10, 0x00, 0x10, 0x10, 0x10, 0x90, 0x60, - 0x00, 0x80, 0x80, 0x90, 0xA0, 0xC0, 0xA0, 0x90, - 0x00, 0xC0, 0x40, 0x40, 0x40, 0x40, 0x40, 0xE0, - 0x00, 0x00, 0x00, 0xD0, 0xA8, 0xA8, 0xA8, 0xA8, - 0x00, 0x00, 0x00, 0xF0, 0x88, 0x88, 0x88, 0x88, - 0x00, 0x00, 0x00, 0x70, 0x88, 0x88, 0x88, 0x70, - 0x00, 0x00, 0x00, 0xF0, 0x88, 0xF0, 0x80, 0x80, - 0x00, 0x00, 0x00, 0x78, 0x88, 0x78, 0x08, 0x38, - 0x00, 0x00, 0x00, 0x70, 0x48, 0x40, 0x40, 0x40, - 0x00, 0x00, 0x00, 0x78, 0x80, 0x70, 0x08, 0xF0, - 0x00, 0x40, 0x40, 0xE0, 0x40, 0x40, 0x40, 0x20, - 0x00, 0x00, 0x00, 0x88, 0x88, 0x88, 0x88, 0x78, - 0x00, 0x00, 0x00, 0x88, 0x88, 0x88, 0x50, 0x20, - 0x00, 0x00, 0x00, 0x88, 0x88, 0x88, 0xA8, 0x50, - 0x00, 0x00, 0x00, 0x88, 0x50, 0x20, 0x50, 0x88, - 0x00, 0x00, 0x00, 0x88, 0x88, 0x78, 0x08, 0xF0, - 0x00, 0x00, 0x00, 0xF8, 0x10, 0x20, 0x40, 0xF8, - 0x00, 0x30, 0x40, 0x40, 0x80, 0x40, 0x40, 0x30, - 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x00, 0xC0, 0x20, 0x20, 0x10, 0x20, 0x20, 0xC0, - 0x00, 0x00, 0x68, 0x90, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x70, 0x88, 0x88, 0xF8, 0x88, 0x88, 0x88, - 0x00, 0xF8, 0x88, 0x80, 0xF0, 0x88, 0x88, 0xF0, - 0x00, 0xF0, 0x88, 0x88, 0xF0, 0x88, 0x88, 0xF0, - 0x00, 0xF8, 0x48, 0x40, 0x40, 0x40, 0x40, 0xE0, - 0x00, 0xF0, 0x50, 0x50, 0x50, 0x50, 0x78, 0x88, - 0x00, 0xF8, 0x80, 0x80, 0xF0, 0x80, 0x80, 0xF8, - 0x00, 0xA8, 0xA8, 0x70, 0x20, 0x70, 0xA8, 0xA8, - 0x00, 0x70, 0x88, 0x08, 0x30, 0x08, 0x88, 0x70, - 0x00, 0x88, 0x98, 0xA8, 0xA8, 0xA8, 0xC8, 0x88, - 0x00, 0xA8, 0xC8, 0x98, 0xA8, 0xA8, 0xC8, 0x88, - 0x00, 0x88, 0x90, 0xA0, 0xC0, 0xA0, 0x90, 0x88, - 0x00, 0xF8, 0x50, 0x50, 0x50, 0x50, 0x50, 0x90, - 0x00, 0x88, 0xD8, 0xA8, 0x88, 0x88, 0x88, 0x88, - 0x00, 0x88, 0x88, 0x88, 0xF8, 0x88, 0x88, 0x88, - 0x00, 0x70, 0x88, 0x88, 0x88, 0x88, 0x88, 0x70, - 0x00, 0xF8, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x00, 0xF0, 0x88, 0x88, 0xF0, 0x80, 0x80, 0x80, - 0x00, 0x70, 0x88, 0x80, 0x80, 0x80, 0x88, 0x70, - 0x00, 0xF8, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x00, 0x88, 0x88, 0x88, 0x50, 0x20, 0x40, 0x80, - 0x00, 0x70, 0x20, 0xF8, 0xA8, 0xF8, 0x20, 0x70, - 0x00, 0x88, 0x88, 0x50, 0x20, 0x50, 0x88, 0x88, - 0x00, 0x88, 0x88, 0x88, 0x88, 0x88, 0xF8, 0x08, - 0x00, 0x88, 0x88, 0x88, 0xF8, 0x08, 0x08, 0x38, - 0x00, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xF8, - 0x00, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xF8, 0x08, - 0x00, 0xC0, 0x40, 0x40, 0x78, 0x48, 0x48, 0x78, - 0x00, 0x88, 0x88, 0xC8, 0xA8, 0xA8, 0xA8, 0xE8, - 0x00, 0x80, 0x80, 0xF0, 0x88, 0x88, 0x88, 0xF0, - 0x00, 0xF0, 0x88, 0x08, 0x78, 0x08, 0x88, 0xF0, - 0x00, 0x90, 0xA8, 0xA8, 0xE8, 0xA8, 0xA8, 0x90, - 0x00, 0x78, 0x88, 0x88, 0x78, 0x28, 0x48, 0x88, - 0x00, 0x00, 0x70, 0x08, 0x78, 0x88, 0x88, 0x78, - 0x00, 0x00, 0xF8, 0x80, 0xF0, 0x88, 0x88, 0xF0, - 0x00, 0x00, 0xF0, 0x88, 0xF0, 0x88, 0x88, 0xF0, - 0x00, 0x00, 0xF8, 0x48, 0x48, 0x40, 0x40, 0xE0, - 0x00, 0x00, 0x78, 0x50, 0x50, 0x50, 0x70, 0x88, - 0x00, 0x00, 0x70, 0x88, 0xF8, 0x80, 0x88, 0x70, - 0x00, 0x00, 0xA8, 0x70, 0x20, 0x70, 0xA8, 0xA8, - 0x00, 0x00, 0x00, 0xF0, 0x88, 0x30, 0x88, 0x70, - 0x00, 0x00, 0x88, 0x98, 0xA8, 0xC8, 0x88, 0x88, - 0x00, 0x50, 0x20, 0x88, 0x98, 0xA8, 0xC8, 0x88, - 0x00, 0x00, 0x88, 0x90, 0xA0, 0xE0, 0x90, 0x88, - 0x00, 0x00, 0xF8, 0x48, 0x48, 0x48, 0x48, 0xC8, - 0x00, 0x00, 0x88, 0xD8, 0xA8, 0x88, 0x88, 0x88, - 0x00, 0x00, 0x88, 0x88, 0xF8, 0x88, 0x88, 0x88, - 0x00, 0x00, 0x70, 0x88, 0x88, 0x88, 0x88, 0x70, - 0x00, 0x00, 0xF8, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x70, 0x50, 0x70, 0x08, 0x78, 0x88, 0x78, - 0x00, 0x88, 0x00, 0x70, 0x08, 0x78, 0x88, 0x78, - 0x00, 0x88, 0x00, 0x70, 0x88, 0x88, 0x88, 0x70, - 0x00, 0x88, 0x00, 0x88, 0x88, 0x88, 0x88, 0x78, - 0x00, 0x90, 0x00, 0xF0, 0x80, 0xE0, 0x80, 0xF0, - 0x00, 0x00, 0x70, 0x48, 0x70, 0x48, 0x48, 0xF0, - 0x00, 0x88, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x00, 0x88, 0x00, 0x70, 0x88, 0xF8, 0x80, 0x78, - 0x00, 0x70, 0x50, 0x70, 0x88, 0xF8, 0x88, 0x88, - 0x00, 0x88, 0x70, 0x88, 0x88, 0xF8, 0x88, 0x88, - 0x00, 0x88, 0x70, 0x88, 0x88, 0x88, 0x88, 0x70, - 0x00, 0x88, 0x00, 0x88, 0x88, 0x88, 0x88, 0x78, - 0x00, 0x88, 0xF8, 0x80, 0xE0, 0x80, 0x80, 0xF8, - 0x00, 0x40, 0x20, 0x70, 0x88, 0xF8, 0x80, 0x78, - 0x00, 0x10, 0x20, 0x70, 0x88, 0xF8, 0x80, 0x78, - 0x00, 0x20, 0x50, 0x70, 0x88, 0xF8, 0x80, 0x78, - 0x00, 0x40, 0x20, 0x70, 0x08, 0x78, 0x88, 0x78, - 0x00, 0x20, 0x50, 0x00, 0x20, 0x20, 0x20, 0x20, - 0x00, 0x20, 0x10, 0x88, 0x88, 0x88, 0x88, 0x78, - 0x00, 0x00, 0x00, 0x70, 0x80, 0x80, 0x70, 0x20, - 0x00, 0x70, 0x88, 0x40, 0xF0, 0x40, 0x40, 0xF8, - 0x00, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x88, 0x88, 0x88, 0xF0, 0x80, 0x80, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xF0, 0x88, 0x88, 0xF0, 0x80, 0x80, - 0x00, 0x00, 0x70, 0x88, 0x80, 0x80, 0x88, 0x70, - 0x00, 0x00, 0xF8, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x00, 0x00, 0x88, 0x88, 0x50, 0x20, 0x40, 0x80, - 0x00, 0x00, 0x70, 0x20, 0xF8, 0xF8, 0x20, 0x70, - 0x00, 0x00, 0x88, 0x50, 0x20, 0x50, 0x88, 0x88, - 0x00, 0x00, 0x88, 0x88, 0x88, 0x88, 0xF8, 0x08, - 0x00, 0x00, 0x88, 0x88, 0x88, 0xF8, 0x08, 0x38, - 0x00, 0x00, 0xA8, 0xA8, 0xA8, 0xA8, 0xA8, 0xF8, - 0x00, 0x00, 0xA8, 0xA8, 0xA8, 0xA8, 0xF8, 0x08, - 0x00, 0x00, 0xC0, 0x40, 0x70, 0x48, 0x48, 0x70, - 0x00, 0x00, 0x88, 0x88, 0xC8, 0xA8, 0xA8, 0xE8, - 0x00, 0x00, 0x80, 0x80, 0xF0, 0x88, 0x88, 0xF0, - 0x00, 0x00, 0x70, 0x88, 0x38, 0x08, 0x88, 0x70, - 0x00, 0x00, 0x90, 0xA8, 0xA8, 0xE8, 0xA8, 0x90, - 0x00, 0x00, 0x38, 0x48, 0x48, 0x38, 0x28, 0x48, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; - -const unsigned char stdfont10x7[] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x80, 0xE0, 0xF0, 0xFC, 0xF0, 0xE0, 0x80, 0x00, 0x00, - 0x00, 0x02, 0x0E, 0x1E, 0x7E, 0x1E, 0x0E, 0x02, 0x00, 0x00, - 0x00, 0x10, 0x7C, 0x92, 0x10, 0x92, 0x7C, 0x10, 0x00, 0x00, - 0x00, 0x90, 0x90, 0x90, 0x90, 0x00, 0x90, 0x90, 0x00, 0x00, - 0x00, 0x7E, 0x92, 0x92, 0x7E, 0x12, 0x12, 0x72, 0x00, 0x00, - 0x00, 0x7E, 0x80, 0x7C, 0x82, 0x7C, 0x02, 0xFC, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFE, 0x00, 0x00, - 0x00, 0x10, 0x7C, 0x92, 0x10, 0x92, 0x7C, 0xFE, 0x00, 0x00, - 0x00, 0x10, 0x7C, 0x92, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, - 0x00, 0x10, 0x10, 0x10, 0x10, 0x92, 0x7C, 0x10, 0x00, 0x00, - 0x00, 0x00, 0x08, 0x04, 0xFE, 0x04, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x40, 0xFE, 0x40, 0x20, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x70, 0x88, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x10, 0x7C, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xFE, 0xFE, 0x7C, 0x10, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x10, 0x10, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x00, - 0x00, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x44, 0xFE, 0x44, 0x44, 0x44, 0xFE, 0x44, 0x00, 0x00, - 0x00, 0x10, 0x7E, 0x90, 0x7C, 0x12, 0xFC, 0x10, 0x00, 0x00, - 0x00, 0x00, 0x04, 0x88, 0x10, 0x22, 0x40, 0x00, 0x00, 0x00, - 0x00, 0x38, 0x44, 0x44, 0x78, 0x86, 0x84, 0x7A, 0x00, 0x00, - 0x00, 0x40, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x10, 0x20, 0x40, 0x40, 0x40, 0x20, 0x10, 0x00, 0x00, - 0x00, 0x40, 0x20, 0x10, 0x10, 0x10, 0x20, 0x40, 0x00, 0x00, - 0x00, 0x00, 0x10, 0x54, 0x38, 0x54, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x10, 0x10, 0x7C, 0x10, 0x10, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x04, 0x08, 0x10, 0x20, 0x40, 0x00, 0x00, 0x00, - 0x00, 0x7C, 0x82, 0x82, 0x82, 0x82, 0x82, 0x7C, 0x00, 0x00, - 0x00, 0x10, 0x30, 0x50, 0x10, 0x10, 0x10, 0x38, 0x00, 0x00, - 0x00, 0x7C, 0x82, 0x02, 0x7C, 0x80, 0x80, 0xFE, 0x00, 0x00, - 0x00, 0x7C, 0x82, 0x02, 0x0C, 0x02, 0x82, 0x7C, 0x00, 0x00, - 0x00, 0x38, 0x48, 0x88, 0x88, 0xFE, 0x08, 0x08, 0x00, 0x00, - 0x00, 0xFE, 0x80, 0x80, 0xFE, 0x02, 0x82, 0x7C, 0x00, 0x00, - 0x00, 0x3E, 0x40, 0x80, 0xFC, 0x82, 0x82, 0x7C, 0x00, 0x00, - 0x00, 0xFE, 0x02, 0x04, 0x08, 0x10, 0x20, 0x20, 0x00, 0x00, - 0x00, 0x7C, 0x82, 0x82, 0x7C, 0x82, 0x82, 0x7C, 0x00, 0x00, - 0x00, 0x7C, 0x82, 0x82, 0x7E, 0x02, 0x02, 0x7C, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x70, 0x60, 0x00, 0x00, - 0x00, 0x08, 0x10, 0x20, 0x40, 0x20, 0x10, 0x08, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x40, 0x20, 0x10, 0x08, 0x10, 0x20, 0x40, 0x00, 0x00, - 0x00, 0x7C, 0x82, 0x02, 0x0C, 0x10, 0x00, 0x10, 0x00, 0x00, - 0x00, 0x7C, 0x82, 0x82, 0x9A, 0x9C, 0x80, 0x7E, 0x00, 0x00, - 0x00, 0x7C, 0x82, 0x82, 0xFE, 0x82, 0x82, 0x82, 0x00, 0x00, - 0x00, 0xFC, 0x82, 0x82, 0xFC, 0x82, 0x82, 0xFC, 0x00, 0x00, - 0x00, 0x7C, 0x82, 0x80, 0x80, 0x80, 0x82, 0x7C, 0x00, 0x00, - 0x00, 0xFC, 0x82, 0x82, 0x82, 0x82, 0x82, 0xFC, 0x00, 0x00, - 0x00, 0xFE, 0x80, 0x80, 0xFC, 0x80, 0x80, 0xFE, 0x00, 0x00, - 0x00, 0xFE, 0x80, 0x80, 0xFC, 0x80, 0x80, 0x80, 0x00, 0x00, - 0x00, 0x7C, 0x82, 0x80, 0x9E, 0x82, 0x82, 0x7C, 0x00, 0x00, - 0x00, 0x82, 0x82, 0x82, 0xFE, 0x82, 0x82, 0x82, 0x00, 0x00, - 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, - 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x82, 0x7C, 0x00, 0x00, - 0x00, 0x84, 0x88, 0x90, 0xE0, 0x90, 0x88, 0x84, 0x00, 0x00, - 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xFE, 0x00, 0x00, - 0x00, 0x82, 0xEE, 0x92, 0x82, 0x82, 0x82, 0x82, 0x00, 0x00, - 0x00, 0x82, 0xC2, 0xA2, 0x92, 0x8A, 0x86, 0x82, 0x00, 0x00, - 0x00, 0x7C, 0x82, 0x82, 0x82, 0x82, 0x82, 0x7C, 0x00, 0x00, - 0x00, 0xFC, 0x82, 0x82, 0xFC, 0x80, 0x80, 0x80, 0x00, 0x00, - 0x00, 0x7C, 0x82, 0x82, 0x82, 0x92, 0x8A, 0x7C, 0x00, 0x00, - 0x00, 0xFC, 0x82, 0x82, 0xFC, 0x88, 0x84, 0x82, 0x00, 0x00, - 0x00, 0x7C, 0x82, 0x80, 0x7C, 0x02, 0x82, 0x7C, 0x00, 0x00, - 0x00, 0xFE, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, - 0x00, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x7C, 0x00, 0x00, - 0x00, 0x82, 0x82, 0x82, 0x82, 0x44, 0x28, 0x10, 0x00, 0x00, - 0x00, 0x82, 0x82, 0x82, 0x82, 0x92, 0x92, 0x6C, 0x00, 0x00, - 0x00, 0x82, 0x44, 0x28, 0x10, 0x28, 0x44, 0x82, 0x00, 0x00, - 0x00, 0x82, 0x82, 0x44, 0x28, 0x10, 0x10, 0x10, 0x00, 0x00, - 0x00, 0xFE, 0x02, 0x0C, 0x10, 0x60, 0x80, 0xFE, 0x00, 0x00, - 0x00, 0x78, 0x40, 0x40, 0x40, 0x40, 0x40, 0x78, 0x00, 0x00, - 0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x78, 0x08, 0x08, 0x08, 0x08, 0x08, 0x78, 0x00, 0x00, - 0x00, 0x10, 0x28, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, - 0x00, 0x70, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x7C, 0x02, 0x7E, 0x82, 0x7E, 0x00, 0x00, - 0x00, 0x80, 0x80, 0xFC, 0x82, 0x82, 0x82, 0xFC, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x7C, 0x82, 0x80, 0x82, 0x7C, 0x00, 0x00, - 0x00, 0x02, 0x02, 0x7E, 0x82, 0x82, 0x82, 0x7E, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x7C, 0x82, 0xFE, 0x80, 0x7E, 0x00, 0x00, - 0x00, 0x30, 0x40, 0x40, 0xE0, 0x40, 0x40, 0x40, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x7E, 0x82, 0x82, 0x82, 0x7E, 0x02, 0x7C, - 0x00, 0x80, 0x80, 0xF8, 0x84, 0x84, 0x84, 0x84, 0x00, 0x00, - 0x00, 0x40, 0x00, 0xC0, 0x40, 0x40, 0x40, 0xE0, 0x00, 0x00, - 0x00, 0x10, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x90, 0x60, - 0x00, 0x80, 0x80, 0x88, 0xB0, 0xC0, 0xB0, 0x88, 0x00, 0x00, - 0x00, 0xC0, 0x40, 0x40, 0x40, 0x40, 0x40, 0xE0, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xEC, 0x92, 0x92, 0x92, 0x92, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xF8, 0x84, 0x84, 0x84, 0x84, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x7C, 0x82, 0x82, 0x82, 0x7C, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xFC, 0x82, 0x82, 0x82, 0xFC, 0x80, 0x80, - 0x00, 0x00, 0x00, 0x7C, 0x84, 0x84, 0x84, 0x7C, 0x04, 0x3C, - 0x00, 0x00, 0x00, 0xB8, 0x44, 0x40, 0x40, 0x40, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x7C, 0x80, 0x78, 0x04, 0xF8, 0x00, 0x00, - 0x00, 0x40, 0x40, 0xE0, 0x40, 0x40, 0x40, 0x20, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x84, 0x84, 0x84, 0x84, 0x7C, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x82, 0x82, 0x44, 0x28, 0x10, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x82, 0x82, 0x82, 0x92, 0x6C, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x88, 0x50, 0x20, 0x50, 0x88, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x84, 0x84, 0x84, 0x84, 0x7C, 0x04, 0xF8, - 0x00, 0x00, 0x00, 0xF8, 0x10, 0x20, 0x40, 0xF8, 0x00, 0x00, - 0x00, 0x18, 0x20, 0x20, 0x40, 0x20, 0x20, 0x18, 0x00, 0x00, - 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, - 0x00, 0x60, 0x10, 0x10, 0x08, 0x10, 0x10, 0x60, 0x00, 0x00, - 0x00, 0x00, 0x72, 0x8C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x7C, 0x82, 0x82, 0xFE, 0x82, 0x82, 0x82, 0x00, 0x00, - 0x00, 0xFE, 0x82, 0x80, 0xFC, 0x82, 0x82, 0xFC, 0x00, 0x00, - 0x00, 0xFC, 0x82, 0x82, 0xFC, 0x82, 0x82, 0xFC, 0x00, 0x00, - 0x00, 0xFE, 0x62, 0x60, 0x60, 0x60, 0x60, 0xF0, 0x00, 0x00, - 0x00, 0xFC, 0x6C, 0x6C, 0x6C, 0x6C, 0x7E, 0x82, 0x00, 0x00, - 0x00, 0xFE, 0x80, 0x80, 0xFC, 0x80, 0x80, 0xFE, 0x00, 0x00, - 0x00, 0x92, 0x92, 0x7C, 0x10, 0x7C, 0x92, 0x92, 0x00, 0x00, - 0x00, 0x7C, 0x82, 0x02, 0x1C, 0x02, 0x82, 0x7C, 0x00, 0x00, - 0x00, 0x82, 0x8E, 0x92, 0x92, 0x92, 0xE2, 0x82, 0x00, 0x00, - 0x00, 0x92, 0xE2, 0x8E, 0x92, 0x92, 0xE2, 0x82, 0x00, 0x00, - 0x00, 0x82, 0x8C, 0x90, 0xE0, 0x90, 0x8C, 0x82, 0x00, 0x00, - 0x00, 0xFE, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x8C, 0x00, 0x00, - 0x00, 0x82, 0xEE, 0x92, 0x82, 0x82, 0x82, 0x82, 0x00, 0x00, - 0x00, 0x82, 0x82, 0x82, 0xFE, 0x82, 0x82, 0x82, 0x00, 0x00, - 0x00, 0x7C, 0x82, 0x82, 0x82, 0x82, 0x82, 0x7C, 0x00, 0x00, - 0x00, 0xFE, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x00, 0x00, - 0x00, 0xFC, 0x82, 0x82, 0xFC, 0x80, 0x80, 0x80, 0x00, 0x00, - 0x00, 0x7C, 0x82, 0x80, 0x80, 0x80, 0x82, 0x7C, 0x00, 0x00, - 0x00, 0xFE, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, - 0x00, 0x82, 0x82, 0x82, 0x6C, 0x10, 0x60, 0x80, 0x00, 0x00, - 0x00, 0x7C, 0x10, 0xFE, 0x92, 0xFE, 0x10, 0x7C, 0x00, 0x00, - 0x00, 0x82, 0x82, 0x6C, 0x10, 0x6C, 0x82, 0x82, 0x00, 0x00, - 0x00, 0x82, 0x82, 0x82, 0x82, 0x82, 0xFE, 0x02, 0x00, 0x00, - 0x00, 0x82, 0x82, 0x82, 0xFE, 0x02, 0x02, 0x1E, 0x00, 0x00, - 0x00, 0x92, 0x92, 0x92, 0x92, 0x92, 0x92, 0xFE, 0x00, 0x00, - 0x00, 0x92, 0x92, 0x92, 0x92, 0x92, 0xFE, 0x02, 0x00, 0x00, - 0x00, 0xE0, 0x60, 0x60, 0x7E, 0x62, 0x62, 0x7E, 0x00, 0x00, - 0x00, 0x82, 0x82, 0xE2, 0x92, 0x92, 0x92, 0xF2, 0x00, 0x00, - 0x00, 0x80, 0x80, 0xFC, 0x82, 0x82, 0x82, 0xFC, 0x00, 0x00, - 0x00, 0xFC, 0x82, 0x02, 0x7E, 0x02, 0x82, 0xFC, 0x00, 0x00, - 0x00, 0x8C, 0x92, 0x92, 0xF2, 0x92, 0x92, 0x8C, 0x00, 0x00, - 0x00, 0x7E, 0x82, 0x82, 0x7E, 0x12, 0x62, 0x82, 0x00, 0x00, - 0x00, 0x00, 0x7C, 0x02, 0x7E, 0x82, 0x82, 0x7E, 0x00, 0x00, - 0x00, 0x00, 0xFE, 0x80, 0xFC, 0x82, 0x82, 0xFC, 0x00, 0x00, - 0x00, 0x00, 0xFC, 0x82, 0xFC, 0x82, 0x82, 0xFC, 0x00, 0x00, - 0x00, 0x00, 0xFE, 0x62, 0x62, 0x60, 0x60, 0xF0, 0x00, 0x00, - 0x00, 0x00, 0x7E, 0x6C, 0x6C, 0x6C, 0x7C, 0x82, 0x00, 0x00, - 0x00, 0x00, 0x7C, 0x82, 0xFE, 0x80, 0x82, 0x7C, 0x00, 0x00, - 0x00, 0x00, 0x92, 0x7C, 0x10, 0x7C, 0x92, 0x92, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xFC, 0x82, 0x1C, 0x82, 0x7C, 0x00, 0x00, - 0x00, 0x00, 0x82, 0x8E, 0x92, 0xE2, 0x82, 0x82, 0x00, 0x00, - 0x00, 0x6C, 0x10, 0x82, 0x8E, 0x92, 0xE2, 0x82, 0x00, 0x00, - 0x00, 0x00, 0x82, 0x8C, 0x90, 0xF0, 0x8C, 0x82, 0x00, 0x00, - 0x00, 0x00, 0xFE, 0x62, 0x62, 0x62, 0x62, 0xE2, 0x00, 0x00, - 0x00, 0x00, 0x82, 0xEE, 0x92, 0x82, 0x82, 0x82, 0x00, 0x00, - 0x00, 0x00, 0x82, 0x82, 0xFE, 0x82, 0x82, 0x82, 0x00, 0x00, - 0x00, 0x00, 0x7C, 0x82, 0x82, 0x82, 0x82, 0x7C, 0x00, 0x00, - 0x00, 0x00, 0xFE, 0x82, 0x82, 0x82, 0x82, 0x82, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x7C, 0x44, 0x7C, 0x02, 0x7E, 0x82, 0x7E, 0x00, 0x00, - 0x00, 0x44, 0x00, 0x7C, 0x02, 0x7E, 0x82, 0x7E, 0x00, 0x00, - 0x00, 0x44, 0x00, 0x7C, 0x82, 0x82, 0x82, 0x7C, 0x00, 0x00, - 0x00, 0x82, 0x00, 0x82, 0x82, 0x82, 0x82, 0x7E, 0x00, 0x00, - 0x00, 0x8C, 0x00, 0xFC, 0x80, 0xF0, 0x80, 0xFC, 0x00, 0x00, - 0x00, 0x00, 0x7C, 0x62, 0x7C, 0x62, 0x62, 0xFC, 0x00, 0x00, - 0x00, 0x82, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, - 0x00, 0x82, 0x00, 0x7C, 0x82, 0xFE, 0x80, 0x7E, 0x00, 0x00, - 0x00, 0x7C, 0x44, 0x7C, 0x82, 0xFE, 0x82, 0x82, 0x00, 0x00, - 0x00, 0x82, 0x7C, 0x82, 0x82, 0xFE, 0x82, 0x82, 0x00, 0x00, - 0x00, 0x82, 0x7C, 0x82, 0x82, 0x82, 0x82, 0x7C, 0x00, 0x00, - 0x00, 0x82, 0x00, 0x82, 0x82, 0x82, 0x82, 0x7E, 0x00, 0x00, - 0x00, 0x82, 0xFE, 0x80, 0xF0, 0x80, 0x80, 0xFE, 0x00, 0x00, - 0x00, 0x60, 0x10, 0x7C, 0x82, 0xFE, 0x80, 0x7E, 0x00, 0x00, - 0x00, 0x0C, 0x10, 0x7C, 0x82, 0xFE, 0x80, 0x7E, 0x00, 0x00, - 0x00, 0x10, 0x6C, 0x7C, 0x82, 0xFE, 0x80, 0x7E, 0x00, 0x00, - 0x00, 0x60, 0x10, 0x7C, 0x02, 0x7E, 0x82, 0x7E, 0x00, 0x00, - 0x00, 0x10, 0x6C, 0x00, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, - 0x00, 0x10, 0x0C, 0x82, 0x82, 0x82, 0x82, 0x7E, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x7C, 0x80, 0x80, 0x7C, 0x10, 0x00, 0x00, - 0x00, 0x7C, 0x82, 0x60, 0xFC, 0x60, 0x60, 0xFE, 0x00, 0x00, - 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x82, 0x82, 0x82, 0xFC, 0x80, 0x80, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xFC, 0x82, 0x82, 0xFC, 0x80, 0x80, 0x00, 0x00, - 0x00, 0x00, 0x7C, 0x82, 0x80, 0x80, 0x82, 0x7C, 0x00, 0x00, - 0x00, 0x00, 0xFE, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, - 0x00, 0x00, 0x82, 0x82, 0x6C, 0x10, 0x60, 0x80, 0x00, 0x00, - 0x00, 0x00, 0x7C, 0x10, 0xFE, 0xFE, 0x10, 0x7C, 0x00, 0x00, - 0x00, 0x00, 0x82, 0x6C, 0x10, 0x6C, 0x82, 0x82, 0x00, 0x00, - 0x00, 0x00, 0x82, 0x82, 0x82, 0x82, 0xFE, 0x02, 0x00, 0x00, - 0x00, 0x00, 0x82, 0x82, 0x82, 0xFE, 0x02, 0x1E, 0x00, 0x00, - 0x00, 0x00, 0x92, 0x92, 0x92, 0x92, 0x92, 0xFE, 0x00, 0x00, - 0x00, 0x00, 0x92, 0x92, 0x92, 0x92, 0xFE, 0x02, 0x00, 0x00, - 0x00, 0x00, 0xE0, 0x60, 0x7C, 0x62, 0x62, 0x7C, 0x00, 0x00, - 0x00, 0x00, 0x82, 0x82, 0xE2, 0x92, 0x92, 0xF2, 0x00, 0x00, - 0x00, 0x00, 0x80, 0x80, 0xFC, 0x82, 0x82, 0xFC, 0x00, 0x00, - 0x00, 0x00, 0x7C, 0x82, 0x1E, 0x02, 0x82, 0x7C, 0x00, 0x00, - 0x00, 0x00, 0x8C, 0x92, 0x92, 0xF2, 0x92, 0x8C, 0x00, 0x00, - 0x00, 0x00, 0x1E, 0x62, 0x62, 0x1E, 0x12, 0x62, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; - -StdFont fonts[] = { - {stdfont8x5, 8, 5}, - {stdfont10x7, 10, 7} -}; - -//Returns the width of a given, 0 = invalid font -unsigned int stdfont_getFontWidth(unsigned int fontNumber) -{ - if (fontNumber >= STDFONTS) - return 0; - return fonts[fontNumber].charWidth; -} - -//Returns the height of a given, 0 = invalid font -unsigned int stdfont_getFontHeight(unsigned int fontNumber) -{ - if (fontNumber >= STDFONTS) - return 0; - return fonts[fontNumber].charHeight; -} - -//Returns a pointer to the desired font's bitmap representation -unsigned char *stdfont_getBitmap(unsigned int fontNumber) -{ - if (fontNumber >= STDFONTS) - return 0; - return (unsigned char *)fonts[fontNumber].fontPtr; -} - diff --git a/kernel/video/stdfont.h b/kernel/video/stdfont.h deleted file mode 100644 index d15959c..0000000 --- a/kernel/video/stdfont.h +++ /dev/null @@ -1,27 +0,0 @@ -// stdfont.c -// Author: Josh Holtrop -// Created: 02/26/04 -// Standard font server - -#ifndef __HOS_STDFONT__ -#define __HOS_STDFONT__ __HOS_STDFONT__ - -#define STDFONTS 2 - -typedef struct { - const unsigned char *fontPtr; - unsigned int charHeight; - unsigned int charWidth; -} StdFont; - -//Returns the standard font size, 0 = invalid font -unsigned int stdfont_getFontWidth(unsigned int fontNumber); - -//Returns the height of a given, 0 = invalid font -unsigned int stdfont_getFontHeight(unsigned int fontNumber); - -//Returns a pointer to the desired font's bitmap representation -unsigned char *stdfont_getBitmap(unsigned int fontNumber); - -#endif - diff --git a/kernel/video/video.cpp b/kernel/video/video.cpp deleted file mode 100644 index 70e7bb8..0000000 --- a/kernel/video/video.cpp +++ /dev/null @@ -1,265 +0,0 @@ -// video.c -// 08/13/03 Josh Holtrop -// Modified: 03/08/04 - -#include "hos_defines.h" -#include "video.h" -#include "video/stdfont.h" -#include "mm/vmm.h" - -ModeInfoBlock video_mode; -dword videoMode = 0; //what video mode # we are in, 0 for console mode -word *vid_ptr16 = (word *)0xF0000000; -byte *vid_ptr24 = (byte *)0xF0000000; -dword *vid_ptr32 = (dword *)0xF0000000; -void (*video_psetp)(int, dword) = video_psetpnull; //function pointer to set a pixel - -//Initialized the video mode information block video_mode and allocated double-buffer memory for graphics display -void video_init() -{ - videoMode = *(word *)BOOT_VIDEO_MODE; - - if (!videoMode) //we are in console mode - return; - - video_mode = *(ModeInfoBlock *) BOOT_VIDEO_MODE_INFO_BLOCK; - - switch(video_mode.BitsPerPixel) - { - case 16: - video_psetp = &video_psetp16; - break; - case 24: - video_psetp = &video_psetp24; - break; - case 32: - video_psetp = &video_psetp32; - } - - unsigned int vidPages = video_mode.XResolution * video_mode.YResolution * (video_mode.BitsPerPixel >> 3); - if (vidPages % 4096) - vidPages = (vidPages >> 12) + 1; - else - vidPages = (vidPages >> 12); - vmm_mapn(0xF0000000, video_mode.PhysBasePtr, vidPages); - -} - -//Renders a character using stdfont[] as a bitmask -void video_renderChar(int x, int y, int character, int font, dword color, int drawBack, dword backColor) -{ - int charWidth = stdfont_getFontWidth(font); - if (!charWidth) - return; - int charHeight = stdfont_getFontHeight(font); - int charpos = (character & 0xFF) * charHeight; - byte *charBMP = (byte *)stdfont_getBitmap(font); - int row; - int col; - for (row = 0; row < charHeight; row++) - { - for (col = 0; col < charWidth; col++) - { - if ((charBMP[charpos + row] << col) & 0x80) - video_pset(x + col, y + row, color); - else if (drawBack) - video_pset(x + col, y + row, backColor); - } - } -} - -//Draws a horizontal line -void video_horiz(int y, int x1, int x2, dword color) -{ - if (x1 > x2) - { - int tmp = x2; - x2 = x1; - x1 = tmp; //x2 >= x1 now - } - if (x2 < 0) - return; - if (x1 >= video_mode.XResolution) - return; - if (x1 < 0) - x1 = 0; - if (x2 >= video_mode.XResolution) - x2 = video_mode.XResolution - 1; - int pixel = y * video_mode.XResolution + x1; - for (; x1 <= x2; x1++) - { - video_psetp(pixel++, color); - } -} - -//Draws a single pixel -void video_pset(int x, int y, dword color) -{ - if ((x < 0) || (x >= video_mode.XResolution) || (y < 0) || (y >= video_mode.YResolution)) - return; - video_psetp(y * video_mode.XResolution + x, color); -} - -//Draws a pixel at the specified pixel position -//This function is needed because external modules do not have access to the function pointer video_psetp -void video_pseti(int pixel, dword color) -{ - video_psetp(pixel, color); -} - -//Draws a vertical line -void video_vert(int x, int y1, int y2, dword color) -{ - if (y1 > y2) - { - int tmp = y2; - y2 = y1; - y1 = tmp; //y2 >= y1 now - } - if (y2 < 0) - return; - if (y1 >= video_mode.YResolution) - return; - if (y1 < 0) - y1 = 0; - if (y2 >= video_mode.YResolution) - y2 = video_mode.YResolution - 1; - int pixel = y1 * video_mode.XResolution + x; - for (; y1 <= y2; y1++) - { - video_psetp(pixel, color); - pixel += video_mode.XResolution; - } -} - -//Draws a rectangle -void video_rect(int x1, int y1, int x2, int y2, dword color) -{ - video_horiz(y1, x1, x2, color); - video_horiz(y2, x1, x2, color); - video_vert(x1, y1, y2, color); - video_vert(x2, y1, y2, color); -} - -//Draws a filled rectangle -void video_rectf(int x1, int y1, int x2, int y2, dword color) -{ - if (y2 < y1) - { - int tmp = y2; - y2 = y1; - y1 = tmp; - } - for (; y1 <= y2; y1++) - video_horiz(y1, x1, x2, color); -} - -//Draws a pixel at the specified pixel position -void video_psetp16(int pixel, dword color) -{ - vid_ptr16[pixel] = ((color&0xFF)>>3) | ((((color>>8)&0xFF)>>2)<<5) | ((((color>>16)&0xFF)>>3)<<11); -} - -//Draws a pixel at the specified pixel position -void video_psetp24(int pixel, dword color) -{ - vid_ptr24[pixel*3] = color & 0xFF; - vid_ptr24[pixel*3+1] = (color>>8) & 0xFF; - vid_ptr24[pixel*3+2] = (color>>16) & 0xFF; -} - -//Draws a pixel at the specified pixel position -void video_psetp32(int pixel, dword color) -{ - vid_ptr32[pixel] = color; -} - -//Dummy function to not draw anything if there is no graphical mode enabled -void video_psetpnull(int pixel, dword color) {} - - -int video_getWidth() -{ - return video_mode.XResolution; -} - -int video_getHeight() -{ - return video_mode.YResolution; -} - -byte video_getBitsPerPixel() -{ - return video_mode.BitsPerPixel; -} - -dword video_getPhysBasePtr() -{ - return video_mode.PhysBasePtr; -} - -dword video_Mode() -{ - return videoMode; -} - -void video_line(int x0, int y0, int x1, int y1, dword color) -{ - int dy = y1 - y0; - int dx = x1 - x0; - int stepx, stepy; - if (dy < 0) - { - dy = -dy; - stepy = -1; - } - else - { - stepy = 1; - } - if (dx < 0) - { - dx = -dx; - stepx = -1; - } - else - { - stepx = 1; - } - dy <<= 1; // dy is now 2*dy - dx <<= 1; // dx is now 2*dx - video_pset(x0, y0, color); - - if (dx > dy) - { - int fraction = dy - (dx >> 1); // same as 2*dy - dx - while (x0 != x1) - { - if (fraction >= 0) - { - y0 += stepy; - fraction -= dx; // same as fraction -= 2*dx - } - x0 += stepx; - fraction += dy; // same as fraction -= 2*dy - video_pset(x0, y0, color); - } - } - else - { - int fraction = dx - (dy >> 1); - while (y0 != y1) - { - if (fraction >= 0) - { - x0 += stepx; - fraction -= dy; - } - y0 += stepy; - fraction += dx; - video_pset(x0, y0, color); - } - } -} - - diff --git a/kernel/video/video.h b/kernel/video/video.h deleted file mode 100644 index 6c6f1e6..0000000 --- a/kernel/video/video.h +++ /dev/null @@ -1,72 +0,0 @@ -// video.h -// 08/18/03 Josh Holtrop -// Modified: 03/08/04 - -#ifndef __HOS_VIDEO__ -#define __HOS_VIDEO__ __HOS_VIDEO__ - -#include "hos_defines.h" - -void video_init(); -void video_horiz(int y, int x1, int x2, dword color); -void video_vert(int x, int y1, int y2, dword color); -void video_rect(int x1, int y1, int x2, int y2, dword color); -void video_rectf(int x1, int y1, int x2, int y2, dword color); -void video_pset(int x, int y, dword color); -void video_pseti(int pixel, dword color); -void video_psetp16(int pixel, dword color); -void video_psetp24(int pixel, dword color); -void video_psetp32(int pixel, dword color); -void video_psetpnull(int pixel, dword color); -void video_renderChar(int x, int y, int character, int font, dword color, int drawBack, dword backColor); -int video_getWidth(); -int video_getHeight(); -byte video_getBitsPerPixel(); -dword video_getPhysBasePtr(); -dword video_Mode(); -void video_line(int x0, int y0, int x1, int y1, dword color); - - -typedef struct{ - word ModeAttributes; - byte WinAAttributes; - byte WinBAttributes; - word WinGranularity; - word WinSize; - word WinASegment; - word WinBSegment; - dword WinFuncPtr; - word BytesPerScanLine; - - word XResolution; - word YResolution; - byte XCharSize; - byte YCharSize; - byte NumberOfPlanes; - byte BitsPerPixel; - byte NumberOfBanks; - byte MemoryModel; - byte BankSize; - byte NumberOfImagePages; - byte Reserved1; - - byte RedMaskSize; - byte RedFieldPosition; - byte GreenMaskSize; - byte GreenFieldPosition; - byte BlueMaskSize; - byte BlueFieldPosition; - byte RsvdMaskSize; - byte RsvdFieldPosition; - byte DirectColorModeInfo; - - dword PhysBasePtr; - dword OffScreenMemOffset; - word OffScreenMemSize; - byte Reserved[206]; -} ModeInfoBlock; - - -#endif - - diff --git a/menu.lst b/menu.lst new file mode 100644 index 0000000..1198881 --- /dev/null +++ b/menu.lst @@ -0,0 +1,9 @@ + +timeout 10 +default 0 + +title HOS 0.15 +root (fd0) +kernel /kernel.bin + + diff --git a/readme.txt b/readme.txt deleted file mode 100644 index cc9475f..0000000 --- a/readme.txt +++ /dev/null @@ -1,74 +0,0 @@ -HOS - Holtrop's Operating System --------------------------------- -HOS is a 32-bit, protected mode, graphical, multitasking operating system. -It was written by me, Josh Holtrop, with help from a few others along the way. - - -Goals: (A = accomplished, P = in progress, T = todo) ----------------------------------------------------- -(A) Custom bootloader to load kernel from FAT-formatted boot media, options for video mode/ram disk -(A) 32-bit protected mode environment -(A) VESA Support for graphics modes -(A) PS/2 keyboard & mouse drivers -(A) Utilize x86's paging architecture for virtual memory management - -(P) VFS abstraction layer for a single file system -(P) ram disk driver -(P) devfs file system driver - -(T) ext2 file system support -(T) vfat file system support -(T) Multitasking support -(T) Console Manager -(T) HASH command shell -(T) Window Manager -(T) Various other utilities/applications -(T) Hard Drive (ATA) driver -(T) cdrom (ATAPI) driver - - -Change Log ----------- -0.14 -05/21/04 - C++ support in kernel, can use classes & templates -04/04/04 - video_line function for diagonal lines -03/16/04 - new VFS design with support for a loop device -03/01/04 - Thanks to Ben Meyer for helping me get a Makefile working and building on linux to work! - -0.13 -01/26/04 - functions added to read/write CMOS clock date and time -01/19/04 - fixed bug GDTR/IDTR pointing to physical rather than linear table base address -01/07/04 - fixed bug not reading sectors correctly from floppy -12/28/03 - fixed bug not storing eax on interrupt -12/25/03 - fixed bug in mm_palloc() -12/25/03 - incorporated output functions as regular functions rather than as part of a linked library -12/23/03 - re-written physical memory manager using bitmap instead of stack -12/22/03 - kernel relocated to 3gb linear / 1mb+24kb physical to allow for app. address space - -0.12 -12/21/03 - sample bmp loader tested, works (tests loading a kernel of size ~ 932kb -12/20/03 - GDT/IDT now located at 1mb physical, before kernel -10/30/03 - turns floppy motor off -10/30/03 - keyboard LEDs working -10/29/03 - paging functions working -10/15/03 - physical memory management page allocators working - -0.11 -10/09/03 - PS/2 mouse driver - -0.10 -09/11/03 - Rewritten C and assembly kernel with VESA GUI mode support, keyboard driver - -0.05 -05/14/03 - HGUI24/HGUI32 commands finished for testing GUI on both 24bpp and 32bpp graphics cards -05/14/03 - first web release! - -0.04 -03/09/03 - added VM shortcut command -03/09/03 - press up to fill retrieve last inputted command for Nate Scholten -03/08/03 - press clear to clear console input -03/07/03 - added "shortcut" commands PC, IC, ? for Nate Scholten -03/06/03 - added PROMPTC, INPUTC commands - -0.03 -12/30/02 - Command Line Interface working, accepting basic commands diff --git a/rmmod/Makefile b/rmmod/Makefile new file mode 100644 index 0000000..e69de29 diff --git a/rmmod/rmmod.asm b/rmmod/rmmod.asm new file mode 100644 index 0000000..e69de29