From 4e5c38d0ff2a4948c16546e3462273626601455f Mon Sep 17 00:00:00 2001 From: Tiberiu Chibici Date: Tue, 14 Sep 2021 18:34:14 +0300 Subject: [PATCH] CTAOS v3 --- .gitignore | 486 ------------------ SysBoot/makeall.bat | 16 + .../stage1/BOOTLOAD.BIN | Bin {stage1 => SysBoot/stage1}/bootload.asm | 0 SysBoot/stage1/make.bat | 23 + SysBoot/stage2/MAKE.BAT | 24 + SysBoot/stage2/STAGE2.CTA | Bin 0 -> 1630 bytes SysBoot/stage2/a20.inc | 55 ++ SysBoot/stage2/bootinfo.inc | 40 ++ {stage2 => SysBoot/stage2}/common.inc | 0 {stage2 => SysBoot/stage2}/fat12.inc | 99 ++-- {stage2 => SysBoot/stage2}/floppy16.inc | 4 + {stage2 => SysBoot/stage2}/gdt.inc | 0 SysBoot/stage2/memory.inc | 175 +++++++ SysBoot/stage2/stage2.asm | 172 +++++++ {stage2 => SysBoot/stage2}/stdio.inc | 135 +++-- {kernel => SysCore}/compile.bat | 17 +- SysCore/debug/BIOS-bochs-latest | Bin 0 -> 131072 bytes SysCore/debug/OSDev.log | 292 +++++++++++ SysCore/debug/VGABIOS-lgpl-latest | Bin 0 -> 40448 bytes SysCore/debug/bochs_config.bxrc | 14 + SysCore/debug/ctaos.img | Bin 0 -> 1474560 bytes SysCore/hal/cmos/cmos.c | 92 ++++ SysCore/hal/cmos/cmos.h | 10 + SysCore/hal/cmos/compile.bat | 18 + SysCore/hal/compile.bat | 43 ++ SysCore/hal/cpu/compile.bat | 18 + SysCore/hal/cpu/cpu.c | 35 ++ SysCore/hal/cpu/cpu.h | 29 ++ SysCore/hal/gdt/compile.bat | 19 + SysCore/hal/gdt/gdt.asm | 20 + {kernel/kernel => SysCore/hal/gdt}/gdt.c | 51 +- SysCore/hal/gdt/gdt.h | 39 ++ SysCore/hal/hal.c | 184 +++++++ SysCore/hal/idt/compile.bat | 19 + SysCore/hal/idt/idt.asm | 9 + {kernel/kernel => SysCore/hal/idt}/idt.c | 43 +- SysCore/hal/idt/idt.h | 32 ++ SysCore/hal/irq/compile.bat | 19 + SysCore/hal/irq/irq.asm | 159 ++++++ SysCore/hal/irq/irq.c | 79 +++ SysCore/hal/irq/irq.h | 29 ++ SysCore/hal/isrs/BSOD.c | 79 +++ SysCore/hal/isrs/compile.bat | 20 + SysCore/hal/isrs/isrs.asm | 217 ++++++++ SysCore/hal/isrs/isrs.c | 70 +++ SysCore/hal/isrs/isrs.h | 40 ++ SysCore/hal/keyboard/compile.bat | 18 + {kernel => SysCore/hal}/keyboard/key_list.txt | 0 SysCore/hal/keyboard/keyboard.h | 133 +++++ {kernel => SysCore/hal}/keyboard/keyus.c | 217 ++++++-- SysCore/hal/keyboard/keyus.h | 28 + SysCore/hal/makeall.bat | 109 ++++ SysCore/hal/pic/compile.bat | 18 + SysCore/hal/pic/pic.c | 23 + SysCore/hal/pic/pic.h | 6 + SysCore/hal/pit/compile.bat | 18 + SysCore/hal/pit/pit.c | 56 ++ SysCore/hal/pit/pit.h | 17 + SysCore/include/_null.h | 30 ++ SysCore/include/bootinfo.h | 39 ++ SysCore/include/cctype | 9 + SysCore/include/conio.h | 30 ++ SysCore/include/crtdefs.h | 50 ++ SysCore/include/cstdarg | 7 + SysCore/include/cstdint | 9 + SysCore/include/cstring | 9 + SysCore/include/ctype.h | 55 ++ SysCore/include/hal.h | 180 +++++++ SysCore/include/regs.h | 100 ++++ SysCore/include/size_t.h | 23 + SysCore/include/stdarg.h | 46 ++ SysCore/include/stdint.h | 163 ++++++ SysCore/include/string.h | 46 ++ SysCore/include/sys/declarat.h | 21 + SysCore/include/system.h | 40 ++ SysCore/include/time.h | 25 + SysCore/include/va_list.h | 52 ++ SysCore/lib/compile.bat | 40 ++ kernel/include/conio.h => SysCore/lib/conio.c | 132 ++++- SysCore/lib/string.c | 23 + SysCore/lib/system.c | 44 ++ SysCore/lib/time.c | 80 +++ SysCore/loader.asm | 26 + SysCore/main.c | 71 +++ SysCore/makeall.bat | 59 +++ SysCore/makeallh.bat | 66 +++ SysCore/memory/compile.bat | 28 + SysCore/memory/mmngr_cr.asm | 29 ++ SysCore/memory/mmngr_ph.c | 204 ++++++++ SysCore/memory/mmngr_ph.h | 33 ++ SysCore/memory/pde.c | 26 + SysCore/memory/pde.h | 27 + SysCore/memory/pte.c | 26 + SysCore/memory/pte.h | 27 + SysCore/objects/BSOD.O | Bin 0 -> 3398 bytes SysCore/objects/CMOS.O | Bin 0 -> 1429 bytes SysCore/objects/CONIO.O | Bin 0 -> 4377 bytes SysCore/objects/CPU.O | Bin 0 -> 774 bytes SysCore/objects/GDT.O | Bin 0 -> 828 bytes SysCore/objects/GDT_ASM.O | Bin 0 -> 146 bytes SysCore/objects/HAL.O | Bin 0 -> 2247 bytes SysCore/objects/IDT.O | Bin 0 -> 785 bytes SysCore/objects/IDT_ASM.O | Bin 0 -> 96 bytes SysCore/objects/IRQ.O | Bin 0 -> 1889 bytes SysCore/objects/IRQ_ASM.O | Bin 0 -> 663 bytes SysCore/objects/ISRS.O | Bin 0 -> 2803 bytes SysCore/objects/ISRS_ASM.O | Bin 0 -> 1181 bytes SysCore/objects/KERNEL.BIN | Bin 0 -> 20480 bytes SysCore/objects/KEYUS.O | Bin 0 -> 5096 bytes SysCore/objects/LOADER.O | Bin 0 -> 152 bytes SysCore/objects/MAIN.O | Bin 0 -> 8176 bytes SysCore/objects/MMNGR_CR.O | Bin 0 -> 158 bytes SysCore/objects/MMNGR_PH.O | Bin 0 -> 2818 bytes SysCore/objects/PIC.O | Bin 0 -> 465 bytes SysCore/objects/PIT.O | Bin 0 -> 1215 bytes SysCore/objects/STRING.O | Bin 0 -> 484 bytes SysCore/objects/SYSTEM.O | Bin 0 -> 751 bytes SysCore/objects/TIME.O | Bin 0 -> 1212 bytes SysCore/objects/compile.bat | 16 + SysCore/objects/link.ld | 50 ++ SysCore/shell/apps.h | 196 +++++++ {kernel => SysCore}/shell/shell.c | 14 +- buildOS.bat | 40 ++ kernel/clock/cmos.h | 25 - kernel/clock/pictimer.c | 76 --- kernel/clock/time.c | 143 ------ kernel/console.o | Bin 2605 -> 0 bytes kernel/include/sys/declarat.h | 40 -- kernel/include/system.h | 85 --- kernel/kernel.bin | Bin 16384 -> 0 bytes kernel/kernel/epilogue.c | 8 - kernel/kernel/irq.c | 125 ----- kernel/kernel/isrs.c | 162 ------ kernel/kernel/memory.c | 4 - kernel/kernel/prologue.c | 61 --- kernel/keyboard/keyb.c | 60 --- kernel/keyboard/keyus.h | 137 ----- kernel/link.ld | 25 - kernel/loader.asm | 478 ----------------- kernel/loader.o | Bin 2348 -> 0 bytes kernel/main.c | 18 - kernel/main.o | Bin 20986 -> 0 bytes kernel/shell/apps.h | 122 ----- scripts/format | 3 + scripts/stage1d | 2 + stage1/MAKE.PIF | Bin 967 -> 0 bytes stage1/make.bat | 18 - stage2/MAKE.BAT | 15 - stage2/a20.inc | 103 ---- stage2/stage2.asm | 158 ------ stage2/stage2.cta | Bin 1012 -> 0 bytes 152 files changed, 5042 insertions(+), 2585 deletions(-) delete mode 100644 .gitignore create mode 100644 SysBoot/makeall.bat rename stage1/bootload.bin => SysBoot/stage1/BOOTLOAD.BIN (100%) rename {stage1 => SysBoot/stage1}/bootload.asm (100%) create mode 100644 SysBoot/stage1/make.bat create mode 100644 SysBoot/stage2/MAKE.BAT create mode 100644 SysBoot/stage2/STAGE2.CTA create mode 100644 SysBoot/stage2/a20.inc create mode 100644 SysBoot/stage2/bootinfo.inc rename {stage2 => SysBoot/stage2}/common.inc (100%) rename {stage2 => SysBoot/stage2}/fat12.inc (72%) rename {stage2 => SysBoot/stage2}/floppy16.inc (99%) rename {stage2 => SysBoot/stage2}/gdt.inc (100%) create mode 100644 SysBoot/stage2/memory.inc create mode 100644 SysBoot/stage2/stage2.asm rename {stage2 => SysBoot/stage2}/stdio.inc (61%) rename {kernel => SysCore}/compile.bat (56%) create mode 100644 SysCore/debug/BIOS-bochs-latest create mode 100644 SysCore/debug/OSDev.log create mode 100644 SysCore/debug/VGABIOS-lgpl-latest create mode 100644 SysCore/debug/bochs_config.bxrc create mode 100644 SysCore/debug/ctaos.img create mode 100644 SysCore/hal/cmos/cmos.c create mode 100644 SysCore/hal/cmos/cmos.h create mode 100644 SysCore/hal/cmos/compile.bat create mode 100644 SysCore/hal/compile.bat create mode 100644 SysCore/hal/cpu/compile.bat create mode 100644 SysCore/hal/cpu/cpu.c create mode 100644 SysCore/hal/cpu/cpu.h create mode 100644 SysCore/hal/gdt/compile.bat create mode 100644 SysCore/hal/gdt/gdt.asm rename {kernel/kernel => SysCore/hal/gdt}/gdt.c (59%) create mode 100644 SysCore/hal/gdt/gdt.h create mode 100644 SysCore/hal/hal.c create mode 100644 SysCore/hal/idt/compile.bat create mode 100644 SysCore/hal/idt/idt.asm rename {kernel/kernel => SysCore/hal/idt}/idt.c (63%) create mode 100644 SysCore/hal/idt/idt.h create mode 100644 SysCore/hal/irq/compile.bat create mode 100644 SysCore/hal/irq/irq.asm create mode 100644 SysCore/hal/irq/irq.c create mode 100644 SysCore/hal/irq/irq.h create mode 100644 SysCore/hal/isrs/BSOD.c create mode 100644 SysCore/hal/isrs/compile.bat create mode 100644 SysCore/hal/isrs/isrs.asm create mode 100644 SysCore/hal/isrs/isrs.c create mode 100644 SysCore/hal/isrs/isrs.h create mode 100644 SysCore/hal/keyboard/compile.bat rename {kernel => SysCore/hal}/keyboard/key_list.txt (100%) create mode 100644 SysCore/hal/keyboard/keyboard.h rename {kernel => SysCore/hal}/keyboard/keyus.c (51%) create mode 100644 SysCore/hal/keyboard/keyus.h create mode 100644 SysCore/hal/makeall.bat create mode 100644 SysCore/hal/pic/compile.bat create mode 100644 SysCore/hal/pic/pic.c create mode 100644 SysCore/hal/pic/pic.h create mode 100644 SysCore/hal/pit/compile.bat create mode 100644 SysCore/hal/pit/pit.c create mode 100644 SysCore/hal/pit/pit.h create mode 100644 SysCore/include/_null.h create mode 100644 SysCore/include/bootinfo.h create mode 100644 SysCore/include/cctype create mode 100644 SysCore/include/conio.h create mode 100644 SysCore/include/crtdefs.h create mode 100644 SysCore/include/cstdarg create mode 100644 SysCore/include/cstdint create mode 100644 SysCore/include/cstring create mode 100644 SysCore/include/ctype.h create mode 100644 SysCore/include/hal.h create mode 100644 SysCore/include/regs.h create mode 100644 SysCore/include/size_t.h create mode 100644 SysCore/include/stdarg.h create mode 100644 SysCore/include/stdint.h create mode 100644 SysCore/include/string.h create mode 100644 SysCore/include/sys/declarat.h create mode 100644 SysCore/include/system.h create mode 100644 SysCore/include/time.h create mode 100644 SysCore/include/va_list.h create mode 100644 SysCore/lib/compile.bat rename kernel/include/conio.h => SysCore/lib/conio.c (51%) create mode 100644 SysCore/lib/string.c create mode 100644 SysCore/lib/system.c create mode 100644 SysCore/lib/time.c create mode 100644 SysCore/loader.asm create mode 100644 SysCore/main.c create mode 100644 SysCore/makeall.bat create mode 100644 SysCore/makeallh.bat create mode 100644 SysCore/memory/compile.bat create mode 100644 SysCore/memory/mmngr_cr.asm create mode 100644 SysCore/memory/mmngr_ph.c create mode 100644 SysCore/memory/mmngr_ph.h create mode 100644 SysCore/memory/pde.c create mode 100644 SysCore/memory/pde.h create mode 100644 SysCore/memory/pte.c create mode 100644 SysCore/memory/pte.h create mode 100644 SysCore/objects/BSOD.O create mode 100644 SysCore/objects/CMOS.O create mode 100644 SysCore/objects/CONIO.O create mode 100644 SysCore/objects/CPU.O create mode 100644 SysCore/objects/GDT.O create mode 100644 SysCore/objects/GDT_ASM.O create mode 100644 SysCore/objects/HAL.O create mode 100644 SysCore/objects/IDT.O create mode 100644 SysCore/objects/IDT_ASM.O create mode 100644 SysCore/objects/IRQ.O create mode 100644 SysCore/objects/IRQ_ASM.O create mode 100644 SysCore/objects/ISRS.O create mode 100644 SysCore/objects/ISRS_ASM.O create mode 100644 SysCore/objects/KERNEL.BIN create mode 100644 SysCore/objects/KEYUS.O create mode 100644 SysCore/objects/LOADER.O create mode 100644 SysCore/objects/MAIN.O create mode 100644 SysCore/objects/MMNGR_CR.O create mode 100644 SysCore/objects/MMNGR_PH.O create mode 100644 SysCore/objects/PIC.O create mode 100644 SysCore/objects/PIT.O create mode 100644 SysCore/objects/STRING.O create mode 100644 SysCore/objects/SYSTEM.O create mode 100644 SysCore/objects/TIME.O create mode 100644 SysCore/objects/compile.bat create mode 100644 SysCore/objects/link.ld create mode 100644 SysCore/shell/apps.h rename {kernel => SysCore}/shell/shell.c (80%) create mode 100644 buildOS.bat delete mode 100644 kernel/clock/cmos.h delete mode 100644 kernel/clock/pictimer.c delete mode 100644 kernel/clock/time.c delete mode 100644 kernel/console.o delete mode 100644 kernel/include/sys/declarat.h delete mode 100644 kernel/include/system.h delete mode 100644 kernel/kernel.bin delete mode 100644 kernel/kernel/epilogue.c delete mode 100644 kernel/kernel/irq.c delete mode 100644 kernel/kernel/isrs.c delete mode 100644 kernel/kernel/memory.c delete mode 100644 kernel/kernel/prologue.c delete mode 100644 kernel/keyboard/keyb.c delete mode 100644 kernel/keyboard/keyus.h delete mode 100644 kernel/link.ld delete mode 100644 kernel/loader.asm delete mode 100644 kernel/loader.o delete mode 100644 kernel/main.c delete mode 100644 kernel/main.o delete mode 100644 kernel/shell/apps.h create mode 100644 scripts/format create mode 100644 scripts/stage1d delete mode 100644 stage1/MAKE.PIF delete mode 100644 stage1/make.bat delete mode 100644 stage2/MAKE.BAT delete mode 100644 stage2/a20.inc delete mode 100644 stage2/stage2.asm delete mode 100644 stage2/stage2.cta diff --git a/.gitignore b/.gitignore deleted file mode 100644 index c13f0bc..0000000 --- a/.gitignore +++ /dev/null @@ -1,486 +0,0 @@ -# ---> C++ -# Prerequisites -*.d - -# Compiled Object files -*.slo -*.lo -#*.o -*.obj - -# Precompiled Headers -*.gch -*.pch - -# Compiled Dynamic libraries -*.so -*.dylib -*.dll - -# Fortran module files -*.mod -*.smod - -# Compiled Static libraries -*.lai -*.la -*.a -*.lib - -# Executables -*.exe -*.out -*.app - -# ---> Eclipse -.metadata -bin/ -tmp/ -*.tmp -*.bak -*.swp -*~.nib -local.properties -.settings/ -.loadpath -.recommenders - -# External tool builders -.externalToolBuilders/ - -# Locally stored "Eclipse launch configurations" -*.launch - -# PyDev specific (Python IDE for Eclipse) -*.pydevproject - -# CDT-specific (C/C++ Development Tooling) -.cproject - -# CDT- autotools -.autotools - -# Java annotation processor (APT) -.factorypath - -# PDT-specific (PHP Development Tools) -.buildpath - -# sbteclipse plugin -.target - -# Tern plugin -.tern-project - -# TeXlipse plugin -.texlipse - -# STS (Spring Tool Suite) -.springBeans - -# Code Recommenders -.recommenders/ - -# Annotation Processing -.apt_generated/ -.apt_generated_test/ - -# Scala IDE specific (Scala & Java development for Eclipse) -.cache-main -.scala_dependencies -.worksheet - -# Uncomment this line if you wish to ignore the project description file. -# Typically, this file would be tracked if it contains build/dependency configurations: -#.project - -# ---> VisualStudio -## Ignore Visual Studio temporary files, build results, and -## files generated by popular Visual Studio add-ons. -## -## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore - -# User-specific files -*.rsuser -*.suo -*.user -*.userosscache -*.sln.docstates - -# User-specific files (MonoDevelop/Xamarin Studio) -*.userprefs - -# Mono auto generated files -mono_crash.* - -# Build results -[Dd]ebug/ -[Dd]ebugPublic/ -[Rr]elease/ -[Rr]eleases/ -x64/ -x86/ -[Ww][Ii][Nn]32/ -[Aa][Rr][Mm]/ -[Aa][Rr][Mm]64/ -bld/ -[Bb]in/ -[Oo]bj/ -[Ll]og/ -[Ll]ogs/ - -# Visual Studio 2015/2017 cache/options directory -.vs/ -# Uncomment if you have tasks that create the project's static files in wwwroot -#wwwroot/ - -# Visual Studio 2017 auto generated files -Generated\ Files/ - -# MSTest test Results -[Tt]est[Rr]esult*/ -[Bb]uild[Ll]og.* - -# NUnit -*.VisualState.xml -TestResult.xml -nunit-*.xml - -# Build Results of an ATL Project -[Dd]ebugPS/ -[Rr]eleasePS/ -dlldata.c - -# Benchmark Results -BenchmarkDotNet.Artifacts/ - -# .NET Core -project.lock.json -project.fragment.lock.json -artifacts/ - -# ASP.NET Scaffolding -ScaffoldingReadMe.txt - -# StyleCop -StyleCopReport.xml - -# Files built by Visual Studio -*_i.c -*_p.c -*_h.h -*.ilk -*.meta -*.obj -*.iobj -*.pch -*.pdb -*.ipdb -*.pgc -*.pgd -*.rsp -*.sbr -*.tlb -*.tli -*.tlh -*.tmp -*.tmp_proj -*_wpftmp.csproj -*.log -*.tlog -*.vspscc -*.vssscc -.builds -*.pidb -*.svclog -*.scc - -# Chutzpah Test files -_Chutzpah* - -# Visual C++ cache files -ipch/ -*.aps -*.ncb -*.opendb -*.opensdf -*.sdf -*.cachefile -*.VC.db -*.VC.VC.opendb - -# Visual Studio profiler -*.psess -*.vsp -*.vspx -*.sap - -# Visual Studio Trace Files -*.e2e - -# TFS 2012 Local Workspace -$tf/ - -# Guidance Automation Toolkit -*.gpState - -# ReSharper is a .NET coding add-in -_ReSharper*/ -*.[Rr]e[Ss]harper -*.DotSettings.user - -# TeamCity is a build add-in -_TeamCity* - -# DotCover is a Code Coverage Tool -*.dotCover - -# AxoCover is a Code Coverage Tool -.axoCover/* -!.axoCover/settings.json - -# Coverlet is a free, cross platform Code Coverage Tool -coverage*.json -coverage*.xml -coverage*.info - -# Visual Studio code coverage results -*.coverage -*.coveragexml - -# NCrunch -_NCrunch_* -.*crunch*.local.xml -nCrunchTemp_* - -# MightyMoose -*.mm.* -AutoTest.Net/ - -# Web workbench (sass) -.sass-cache/ - -# Installshield output folder -[Ee]xpress/ - -# DocProject is a documentation generator add-in -DocProject/buildhelp/ -DocProject/Help/*.HxT -DocProject/Help/*.HxC -DocProject/Help/*.hhc -DocProject/Help/*.hhk -DocProject/Help/*.hhp -DocProject/Help/Html2 -DocProject/Help/html - -# Click-Once directory -publish/ - -# Publish Web Output -*.[Pp]ublish.xml -*.azurePubxml -# Note: Comment the next line if you want to checkin your web deploy settings, -# but database connection strings (with potential passwords) will be unencrypted -*.pubxml -*.publishproj - -# Microsoft Azure Web App publish settings. Comment the next line if you want to -# checkin your Azure Web App publish settings, but sensitive information contained -# in these scripts will be unencrypted -PublishScripts/ - -# NuGet Packages -*.nupkg -# NuGet Symbol Packages -*.snupkg -# The packages folder can be ignored because of Package Restore -**/[Pp]ackages/* -# except build/, which is used as an MSBuild target. -!**/[Pp]ackages/build/ -# Uncomment if necessary however generally it will be regenerated when needed -#!**/[Pp]ackages/repositories.config -# NuGet v3's project.json files produces more ignorable files -*.nuget.props -*.nuget.targets - -# Nuget personal access tokens and Credentials -nuget.config - -# Microsoft Azure Build Output -csx/ -*.build.csdef - -# Microsoft Azure Emulator -ecf/ -rcf/ - -# Windows Store app package directories and files -AppPackages/ -BundleArtifacts/ -Package.StoreAssociation.xml -_pkginfo.txt -*.appx -*.appxbundle -*.appxupload - -# Visual Studio cache files -# files ending in .cache can be ignored -*.[Cc]ache -# but keep track of directories ending in .cache -!?*.[Cc]ache/ - -# Others -ClientBin/ -~$* -*~ -*.dbmdl -*.dbproj.schemaview -*.jfm -*.pfx -*.publishsettings -orleans.codegen.cs - -# Including strong name files can present a security risk -# (https://github.com/github/gitignore/pull/2483#issue-259490424) -#*.snk - -# Since there are multiple workflows, uncomment next line to ignore bower_components -# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) -#bower_components/ - -# RIA/Silverlight projects -Generated_Code/ - -# Backup & report files from converting an old project file -# to a newer Visual Studio version. Backup files are not needed, -# because we have git ;-) -_UpgradeReport_Files/ -Backup*/ -UpgradeLog*.XML -UpgradeLog*.htm -ServiceFabricBackup/ -*.rptproj.bak - -# SQL Server files -*.mdf -*.ldf -*.ndf - -# Business Intelligence projects -*.rdl.data -*.bim.layout -*.bim_*.settings -*.rptproj.rsuser -*- [Bb]ackup.rdl -*- [Bb]ackup ([0-9]).rdl -*- [Bb]ackup ([0-9][0-9]).rdl - -# Microsoft Fakes -FakesAssemblies/ - -# GhostDoc plugin setting file -*.GhostDoc.xml - -# Node.js Tools for Visual Studio -.ntvs_analysis.dat -node_modules/ - -# Visual Studio 6 build log -*.plg - -# Visual Studio 6 workspace options file -*.opt - -# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) -*.vbw - -# Visual Studio LightSwitch build output -**/*.HTMLClient/GeneratedArtifacts -**/*.DesktopClient/GeneratedArtifacts -**/*.DesktopClient/ModelManifest.xml -**/*.Server/GeneratedArtifacts -**/*.Server/ModelManifest.xml -_Pvt_Extensions - -# Paket dependency manager -.paket/paket.exe -paket-files/ - -# FAKE - F# Make -.fake/ - -# CodeRush personal settings -.cr/personal - -# Python Tools for Visual Studio (PTVS) -__pycache__/ -*.pyc - -# Cake - Uncomment if you are using it -# tools/** -# !tools/packages.config - -# Tabs Studio -*.tss - -# Telerik's JustMock configuration file -*.jmconfig - -# BizTalk build output -*.btp.cs -*.btm.cs -*.odx.cs -*.xsd.cs - -# OpenCover UI analysis results -OpenCover/ - -# Azure Stream Analytics local run output -ASALocalRun/ - -# MSBuild Binary and Structured Log -*.binlog - -# NVidia Nsight GPU debugger configuration file -*.nvuser - -# MFractors (Xamarin productivity tool) working folder -.mfractor/ - -# Local History for Visual Studio -.localhistory/ - -# BeatPulse healthcheck temp database -healthchecksdb - -# Backup folder for Package Reference Convert tool in Visual Studio 2017 -MigrationBackup/ - -# Ionide (cross platform F# VS Code tools) working folder -.ionide/ - -# Fody - auto-generated XML schema -FodyWeavers.xsd - -# VS Code files for those working on multiple tools -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json -*.code-workspace - -# Local History for Visual Studio Code -.history/ - -# Windows Installer files from build outputs -*.cab -*.msi -*.msix -*.msm -*.msp - -# JetBrains Rider -.idea/ -*.sln.iml - diff --git a/SysBoot/makeall.bat b/SysBoot/makeall.bat new file mode 100644 index 0000000..0d28bf6 --- /dev/null +++ b/SysBoot/makeall.bat @@ -0,0 +1,16 @@ +@echo off +set nasm_path=C:\nasm +set djgpp_path=C:\DJGPP\bin + +@echo ***************** CTA Bootloader ***************** +@echo. + +:Stage1 + cd stage1 + call make.bat + cd.. + +:Stage2 + cd stage2 + call make.bat + cd.. \ No newline at end of file diff --git a/stage1/bootload.bin b/SysBoot/stage1/BOOTLOAD.BIN similarity index 100% rename from stage1/bootload.bin rename to SysBoot/stage1/BOOTLOAD.BIN diff --git a/stage1/bootload.asm b/SysBoot/stage1/bootload.asm similarity index 100% rename from stage1/bootload.asm rename to SysBoot/stage1/bootload.asm diff --git a/SysBoot/stage1/make.bat b/SysBoot/stage1/make.bat new file mode 100644 index 0000000..aa718bf --- /dev/null +++ b/SysBoot/stage1/make.bat @@ -0,0 +1,23 @@ +@echo off +set nasm_path=C:\nasm +set djgpp_path=C:\DJGPP\bin + +goto build + +:error + @echo. + @echo There have been build errors. Building halted. + @pause + exit + +:build + @echo Compiling stage 1... + del bootload.bin + %nasm_path%\nasm.exe -f bin bootload.asm -o bootload.bin + +:check + if not exist bootload.bin goto error + +:copy + @echo Writing stage 1 to floppy boot sector... + debug bootload.bin <..\..\scripts\stage1d >nul \ No newline at end of file diff --git a/SysBoot/stage2/MAKE.BAT b/SysBoot/stage2/MAKE.BAT new file mode 100644 index 0000000..fc0dc23 --- /dev/null +++ b/SysBoot/stage2/MAKE.BAT @@ -0,0 +1,24 @@ +@echo off +set nasm_path=C:\nasm +set djgpp_path=C:\DJGPP\bin + +goto build + +:error + @echo. + @echo There have been build errors. Building halted. + @pause + exit + +:build + + @echo Compiling stage 2... + del stage2.cta + %nasm_path%\nasm.exe -f bin stage2.asm -o stage2.cta + +:test + if not exist stage2.cta goto error + +:copy + @echo Copying stage 2 to floppy... + copy stage2.cta A:\stage2.cta >nul \ No newline at end of file diff --git a/SysBoot/stage2/STAGE2.CTA b/SysBoot/stage2/STAGE2.CTA new file mode 100644 index 0000000000000000000000000000000000000000..7931fd055f05c05ec4d885ede38b1d5d1e256295 GIT binary patch literal 1630 zcmb_cUu;uV82|1qJ^i<~%W&N=ft{E*HHL<3bPvQuiW$VPxvqskSqx>Y2WDU;?d`*S zFzv%kZX6-R&x4kcJI4SzJ`c$h;ldA2MR0ExVr6V#15@h4XN} z@0{=V`~Kd0vajm#|17H+{9hYo(J*4mRAwJ)Cl&uFfOIpa==9eN*cE$R2a%1@Iv4{O zH$!f-Y>H0piPyxk95e!my6mEs*6G#nDI35)0Z|JG^5_5n42XJw+@gCROyzg{--|x( zx-i2{M+;`LD*oGL8D zCvJ5IB?4Vl-A9UWJJ;|N+M0?x))CXE zQQWbCh8`egLJw|loBF#p!Y8?e^8rfO)={Ei10@`DD6>6WA;_8St-khSk@-w56}nw1 zwD0bW;zz=aa65$|SD!|?h7|gA;3~@1D@cdN(eQo5+3uq=cX-1%oz4Z#KwF6f`6)!2 z92`eyWZobws2?+1o5w3{_Sw>C0-VLRQ42_a9NoNlLbUl}(-`iqwjcMUG)*~1r9y-m z(&jy)-q0E~En@tjos?`Owhm4JvYYKJaDCsA7bV9kYBzY18q)?>k)d5(-YU06HE6^~ zT+|Ut$$Y;oEKs{NDNW6-aC0o&6gZR46(bKJ*$Jsm2J#fEWcq7jTmT5K~@em zdEReo#`xXCE+Bp)EC{P)%}71G zda0(K^tBjC?@YwVw2IS9`li@)Es$7&%`|d@{$-EJNrki#59A&#K6C&9 File to load ; parm/ EBX:BP => Buffer to load file to ; ret/ AX => -1 on error, 0 on success -; ret/ CX => number of sectors read ;******************************************* LoadFile: - xor ecx, ecx ; size of file in sectors + xor ecx, ecx ; size of file in sectors push ecx .FIND_FILE: - push bx ; BX=>BP points to buffer to write to; store it for later + push bx ; BX=>BP points to buffer to write to; store it for later push bp - call FindFile ; find our file. ES:SI contains our filename - cmp ax, -1 - jne .LOAD_IMAGE_PRE - pop bp - pop bx - pop ecx - mov ax, -1 + call FindFile ; find our file. ES:SI contains our filename + cmp ax, -1 + jne .LOAD_IMAGE_PRE + pop bp + pop bx + pop ecx + mov ax, -1 ret .LOAD_IMAGE_PRE: - sub edi, ROOT_OFFSET - sub eax, ROOT_OFFSET + sub edi, ROOT_OFFSET + sub eax, ROOT_OFFSET ; get starting cluster - push word ROOT_SEG ;root segment loc - pop es - mov dx, WORD [es:di + 0x001A]; DI points to file entry in root directory table. Refrence the table... - mov WORD [cluster], dx ; file's first cluster - pop bx ; get location to write to so we dont screw up the stack - pop es - push bx ; store location for later again + push word ROOT_SEG ;root segment loc + pop es + mov dx, WORD [es:di + 0x001A] ; DI points to file entry in root directory table. Refrence the table... + mov WORD [cluster], dx ; file's first cluster + pop bx ; get location to write to so we dont screw up the stack + pop es + push bx ; store location for later again push es call LoadFAT @@ -183,56 +182,60 @@ LoadFile: ; load the cluster - mov ax, WORD [cluster] ; cluster to read - pop es ; bx:bp=es:bx - pop bx + mov ax, WORD [cluster] ; cluster to read + pop es ; bx:bp=es:bx + pop bx call ClusterLBA - xor cx, cx + xor cx, cx mov cl, BYTE [bpbSectorsPerCluster] + call ReadSectors - pop ecx - inc ecx ; add one more sector to counter + + pop ecx + inc ecx push ecx + push bx push es - mov ax, FAT_SEG ;start reading from fat - mov es, ax - xor bx, bx + + mov ax, FAT_SEG ;start reading from fat + mov es, ax + xor bx, bx ; get next cluster - mov ax, WORD [cluster] ; identify current cluster - mov cx, ax ; copy current cluster - mov dx, ax - shr dx, 0x0001 ; divide by two - add cx, dx ; sum for (3/2) + mov ax, WORD [cluster] ; identify current cluster + mov cx, ax ; copy current cluster + mov dx, ax ; copy current cluster + shr dx, 0x0001 ; divide by two + add cx, dx ; sum for (3/2) - mov bx, 0 ;location of fat in memory - add bx, cx - mov dx, WORD [es:bx] - test ax, 0x0001 ; test for odd or even cluster - jnz .ODD_CLUSTER + mov bx, 0 ;location of fat in memory + add bx, cx + mov dx, WORD [es:bx] + test ax, 0x0001 ; test for odd or even cluster + jnz .ODD_CLUSTER .EVEN_CLUSTER: - and dx, 0000111111111111b ; take low 12 bits - jmp .DONE + and dx, 0000111111111111b ; take low 12 bits + jmp .DONE .ODD_CLUSTER: - shr dx, 0x0004 ; take high 12 bits + shr dx, 0x0004 ; take high 12 bits .DONE: - mov WORD [cluster], dx - cmp dx, 0x0ff0 ; test for end of file marker - jb .LOAD_IMAGE + mov WORD [cluster], dx + cmp dx, 0x0ff0 ; test for end of file marker + jb .LOAD_IMAGE .SUCCESS: - pop es - pop bx - pop ecx - xor ax, ax + pop es + pop bx + pop ecx + xor ax, ax ret %endif ;__FAT12_INC_67343546FDCC56AAB872_INCLUDED__ diff --git a/stage2/floppy16.inc b/SysBoot/stage2/floppy16.inc similarity index 99% rename from stage2/floppy16.inc rename to SysBoot/stage2/floppy16.inc index 5893a6a..48779ca 100644 --- a/stage2/floppy16.inc +++ b/SysBoot/stage2/floppy16.inc @@ -114,4 +114,8 @@ ReadSectors: loop .MAIN ; read next sector ret + + + + %endif ;__FLOPPY16_INC_67343546FDCC56AAB872_INCLUDED__ diff --git a/stage2/gdt.inc b/SysBoot/stage2/gdt.inc similarity index 100% rename from stage2/gdt.inc rename to SysBoot/stage2/gdt.inc diff --git a/SysBoot/stage2/memory.inc b/SysBoot/stage2/memory.inc new file mode 100644 index 0000000..a78605c --- /dev/null +++ b/SysBoot/stage2/memory.inc @@ -0,0 +1,175 @@ + +;************************************************* +; Memory.inc +; -Basic memory routines +; +; OS Development Series +;************************************************* + +%ifndef __MEMORY_INC_67343546FDCC56AAB872_INCLUDED__ +%define __MEMORY_INC_67343546FDCC56AAB872_INCLUDED__ + +bits 16 + +;-------------------------------------------- +; Memory map entry structure +;-------------------------------------------- + +struc MemoryMapEntry + .baseAddress resq 1 + .length resq 1 + .type resd 1 + .acpi_null resd 1 +endstruc + +;--------------------------------------------- +; Get memory map from bios +; /in es:di->destination buffer for entries +; /ret bp=entry count +;--------------------------------------------- + +BiosGetMemoryMap: + pushad + xor ebx, ebx + xor bp, bp ; number of entries stored here + mov edx, 'PAMS' ; 'SMAP' + mov eax, 0xe820 + mov ecx, 24 ; memory map entry struct is 24 bytes + int 0x15 ; get first entry + jc .error + cmp eax, 'PAMS' ; bios returns SMAP in eax + jne .error + test ebx, ebx ; if ebx=0 then list is one entry long; bail out + je .error + jmp .start +.next_entry: + mov edx, 'PAMS' ; some bios's trash this register + mov ecx, 24 ; entry is 24 bytes + mov eax, 0xe820 + int 0x15 ; get next entry +.start: + jcxz .skip_entry ; if actual returned bytes is 0, skip entry +.notext: + mov ecx, [es:di + MemoryMapEntry.length] ; get length (low dword) + test ecx, ecx ; if length is 0 skip it + jne short .good_entry + mov ecx, [es:di + MemoryMapEntry.length + 4]; get length (upper dword) + jecxz .skip_entry ; if length is 0 skip it +.good_entry: + inc bp ; increment entry count + add di, 24 ; point di to next entry in buffer +.skip_entry: + cmp ebx, 0 ; if ebx return is 0, list is done + jne .next_entry ; get next entry + jmp .done +.error: + stc +.done: + popad + ret + +;--------------------------------------------- +; Get memory size for >64M configuations (32 bit) +; ret\ ax=KB between 1MB and 16MB +; ret\ bx=number of 64K blocks above 16MB +; ret\ bx=0 and ax= -1 on error +;--------------------------------------------- + +BiosGetMemorySize64MB_32Bit: + push ecx + push edx + xor ecx, ecx + xor edx, edx + mov ax, 0xe881 + int 0x15 + jc .error + cmp ah, 0x86 ;unsupported function + je .error + cmp ah, 0x80 ;invalid command + je .error + jcxz .use_ax ;bios may have stored it in ax,bx or cx,dx. test if cx is 0 + mov ax, cx ;its not, so it should contain mem size; store it + mov bx, dx + +.use_ax: + pop edx ;mem size is in ax and bx already, return it + pop ecx + ret + +.error: + mov ax, -1 + mov bx, 0 + pop edx + pop ecx + ret + +;--------------------------------------------- +; Get memory size for >64M configuations +; ret\ ax=KB between 1MB and 16MB +; ret\ bx=number of 64K blocks above 16MB +; ret\ bx=0 and ax= -1 on error +;--------------------------------------------- + +BiosGetMemorySize64MB: + push ecx + push edx + xor ecx, ecx + xor edx, edx + mov ax, 0xe801 + int 0x15 + jc .error + cmp ah, 0x86 ;unsupported function + je .error + cmp ah, 0x80 ;invalid command + je .error + jcxz .use_ax ;bios may have stored it in ax,bx or cx,dx. test if cx is 0 + mov ax, cx ;its not, so it should contain mem size; store it + mov bx, dx + +.use_ax: + pop edx ;mem size is in ax and bx already, return it + pop ecx + ret + +.error: + mov si, msgNotSupported + call Puts16 + mov ax, -1 + mov bx, 0 + pop edx + pop ecx + ret + +;--------------------------------------------- +; Get amount of contiguous KB from addr 0 +; ret\ ax=KB size from address 0 +;--------------------------------------------- + +BiosGetMemorySize: + int 0x12 + ret + +;--------------------------------------------- +; Get contiguous exetended memory size +; ret\ ax=KB size above 1MB; ax= -1 on error +;--------------------------------------------- + +BiosGetExtendedMemorySize: + mov ax, 0x88 + int 0x15 + jc .error + test ax, ax ; if size=0 + je .error + cmp ah, 0x86 ;unsupported function + je .error + cmp ah, 0x80 ;invalid command + je .error + ret +.error: + mov ax, -1 + ret + + +msgNotSupported db 0x0A, 0x0D, "BiosGetMemorySize64MB: function not supported.",0x0A, 0x0D, 0x00 + +%endif diff --git a/SysBoot/stage2/stage2.asm b/SysBoot/stage2/stage2.asm new file mode 100644 index 0000000..6c52bca --- /dev/null +++ b/SysBoot/stage2/stage2.asm @@ -0,0 +1,172 @@ + +;******************************************************* +; +; Stage2.asm +; Stage2 Bootloader +; +; OS Development Series +;******************************************************* + +bits 16 + +org 0x500 + +jmp main ; go to start + +;******************************************************* +; Preprocessor directives +;******************************************************* + +%include "stdio.inc" ; basic i/o routines +%include "gdt.inc" ; Gdt routines +%include "a20.inc" ; A20 enabling +%include "fat12.inc" ; FAT12 driver. Kinda :) +%include "common.inc" +;%include "bootinfo.inc" +%include "memory.inc" + +;******************************************************* +; Data Section +;******************************************************* + +msgFailure db 0x0D, 0x0A, "FATAL ERROR: Kernel file KERNEL.CTA missing or corrupt. Press Any Key to Reboot.", 0x0D, 0x0A, 0x0A, 0x00 + +boot_info: + multiboot_info_flags dd 0 + multiboot_info_memoryLo dd 0 + multiboot_info_memoryHi dd 0 + multiboot_info_bootDevice dd 0 + multiboot_info_cmdLine dd 0 + multiboot_info_mods_count dd 0 + multiboot_info_mods_addr dd 0 + multiboot_info_syms0 dd 0 + multiboot_info_syms1 dd 0 + multiboot_info_syms2 dd 0 + multiboot_info_mmap_length dd 0 + multiboot_info_mmap_addr dd 0 + multiboot_info_drives_length dd 0 + multiboot_info_drives_addr dd 0 + multiboot_info_config_table dd 0 + multiboot_info_bootloader_name dd 0 + multiboot_info_apm_table dd 0 + multiboot_info_vbe_control_info dd 0 + multiboot_info_vbe_mode_info dw 0 + multiboot_info_vbe_interface_seg dw 0 + multiboot_info_vbe_interface_off dw 0 + multiboot_info_vbe_interface_len dw 0 + +main: + + ;-------------------------------; + ; Setup segments and stack ; + ;-------------------------------; + + cli ; clear interrupts + xor ax, ax ; null segments + mov ds, ax + mov es, ax + mov ax, 0x0000 ; stack begins at 0x9000-0xffff + mov ss, ax + mov sp, 0xFFFF + sti ; enable interrupts + + mov [multiboot_info_bootDevice], dl + + call _EnableA20 + call InstallGDT + sti + + xor eax, eax + xor ebx, ebx + call BiosGetMemorySize64MB + + mov word [multiboot_info_memoryHi], bx + mov word [multiboot_info_memoryLo], ax + + mov eax, 0x0 + mov ds, ax + mov di, 0x1000 + call BiosGetMemoryMap + mov dword [multiboot_info_mmap_addr], 0x1000 + xor eax, eax + mov ax, bp + mov dword [multiboot_info_mmap_length], eax + + + call LoadRoot + mov ebx, 0 + mov ebp, IMAGE_RMODE_BASE + mov esi, ImageName + call LoadFile ; load our file + mov dword [ImageSize], ecx + cmp ax, 0 + je EnterStage3 + mov si, msgFailure + call Puts16 + mov ah, 0 + int 0x16 ; await keypress + int 0x19 ; warm boot computer + + ;-------------------------------; + ; Go into pmode ; + ;-------------------------------; + +EnterStage3: + + cli ; clear interrupts + mov eax, cr0 ; set bit 0 in cr0--enter pmode + or eax, 1 + mov cr0, eax + + jmp CODE_DESC:Stage3 ; far jump to fix CS. Remember that the code selector is 0x8! + + ; Note: Do NOT re-enable interrupts! Doing so will triple fault! + ; We will fix this in Stage 3. + +;****************************************************** +; ENTRY POINT FOR STAGE 3 +;****************************************************** + +bits 32 + +BadImage db "FATAL ERROR: Kernel file KERNEL.CTA missing or corrupt. Press Any Key to Reboot.", 0 + +Stage3: + + ;-------------------------------; + ; Set registers ; + ;-------------------------------; + + mov ax, DATA_DESC ; set data segments to data selector (0x10) + mov ds, ax + mov ss, ax + mov es, ax + mov esp, 90000h ; stack begins from 90000h + + +CopyImage: + mov eax, dword [ImageSize] + movzx ebx, word [bpbBytesPerSector] + mul ebx + mov ebx, 4 + div ebx + cld + mov esi, IMAGE_RMODE_BASE + mov edi, IMAGE_PMODE_BASE + mov ecx, eax + rep movsd ; copy image to its protected mode address + + mov eax, 0x2badb002 ; multiboot specs say eax should be this + mov ebx, 0 + +;edx=8 + + push dword boot_info + push dword [ImageSize] + + jmp CODE_DESC:IMAGE_PMODE_BASE ; Execute Kernel + add esp, 4 + + cli + hlt + \ No newline at end of file diff --git a/stage2/stdio.inc b/SysBoot/stage2/stdio.inc similarity index 61% rename from stage2/stdio.inc rename to SysBoot/stage2/stdio.inc index b1aa7d4..d5e7eef 100644 --- a/stage2/stdio.inc +++ b/SysBoot/stage2/stdio.inc @@ -21,6 +21,7 @@ ; -Prints a null terminated string ; DS=>SI: 0 terminated string ;************************************************; +tmpStr db " ", 0x0D, 0x0A, 0x00 bits 16 @@ -38,6 +39,44 @@ Puts16Done: ret ; we are done, so return +PutINT: + pusha ; save registers + + mov cx, 0 + .init: + mov bx, cx + add bx, tmpStr + mov [bx], byte ' ' + inc cx + + cmp cx, 31 + jne .init + + + mov cx, 31 ; initialize counter + + .loop: + mov dx, 0 + mov bx, 0x0A + div bx ; ax = ax/10, dx = ax%10 + mov bx, cx + add bx, tmpStr + add dl, '0' + mov [bx], dl + + sub cx, 1 + + cmp ax, 0 ; when done, ax = 0; + je .done + + jmp .loop + + .done: + mov si, tmpStr + call Puts16 + popa + ret + ;========================================================== ; ; 32 Bit Protected Mode Routines @@ -48,7 +87,7 @@ bits 32 %define VIDMEM 0xB8000 ; video memory %define COLS 80 ; width and height of screen %define LINES 25 -%define CHAR_ATTRIB 63 ; character attribute (White text on light blue background) +%define CHAR_ATTRIB 14 ; character attribute (White text on black background) _CurX db 0 ; current x/y location _CurY db 0 @@ -61,85 +100,53 @@ _CurY db 0 Putch32: - pusha ; save registers - mov edi, VIDMEM ; get pointer to video memory - - ;-------------------------------; - ; Get current position ; - ;-------------------------------; + pusha + mov edi, VIDMEM xor eax, eax ; clear eax - ;-------------------------------- - ; Remember: currentPos = x + y * COLS! x and y are in _CurX and _CurY. - ; Because there are two bytes per character, COLS=number of characters in a line. - ; We have to multiply this by 2 to get number of bytes per line. This is the screen width, - ; so multiply screen with * _CurY to get current line - ;-------------------------------- + ; y * screen width - mov ecx, COLS*2 ; Mode 7 has 2 bytes per char, so its COLS*2 bytes per line - mov al, byte [_CurY] ; get y pos - mul ecx ; multiply y*COLS - push eax ; save eax--the multiplication + mov ecx, COLS*2 ; Mode 7 has 2 bytes per char, so its COLS*2 bytes per line + mov al, byte [_CurY] ; get y pos + mul ecx ; multiply y*COLS + push eax ; save eax--the multiplication - ;-------------------------------- - ; Now y * screen width is in eax. Now, just add _CurX. But, again remember that _CurX is relative - ; to the current character count, not byte count. Because there are two bytes per character, we - ; have to multiply _CurX by 2 first, then add it to our screen width * y. - ;-------------------------------- + ; now add _CurX * 2 - mov al, byte [_CurX] ; multiply _CurX by 2 because it is 2 bytes per char - mov cl, 2 - mul cl - pop ecx ; pop y*COLS result - add eax, ecx + mov al, byte [_CurX] ; multiply _CurX by 2 because it is 2 bytes per char + mov cl, 2 + mul cl + pop ecx ; pop y*COLS result + add eax, ecx - ;------------------------------- - ; Now eax contains the offset address to draw the character at, so just add it to the base address - ; of video memory (Stored in edi) - ;------------------------------- + ; add the position to draw to the base of vid memory - xor ecx, ecx - add edi, eax ; add it to the base address + xor ecx, ecx + add edi, eax ; add it to the base address - ;-------------------------------; - ; Watch for new line ; - ;-------------------------------; + ; watch for new line cmp bl, 0x0A ; is it a newline character? je .Row ; yep--go to next row - ;-------------------------------; - ; Print a character ; - ;-------------------------------; + ; print the character mov dl, bl ; Get character mov dh, CHAR_ATTRIB ; the character attribute mov word [edi], dx ; write to video display - ;-------------------------------; - ; Update next position ; - ;-------------------------------; + ; go to next location inc byte [_CurX] ; go to next character -; cmp byte [_CurX], COLS ; are we at the end of the line? -; je .Row ; yep-go to next row jmp .done ; nope, bail out - ;-------------------------------; - ; Go to next row ; - ;-------------------------------; - .Row: mov byte [_CurX], 0 ; go back to col 0 inc byte [_CurY] ; go to next row - ;-------------------------------; - ; Restore registers & return ; - ;-------------------------------; - .done: - popa ; restore registers and return + popa ret ;**************************************************; @@ -150,11 +157,7 @@ Putch32: Puts32: - ;-------------------------------; - ; Store registers ; - ;-------------------------------; - - pusha ; save registers + pusha push ebx ; copy the string address pop edi @@ -187,9 +190,6 @@ Puts32: ; Update hardware cursor ; ;-------------------------------; - ; Its more efficiant to update the cursor after displaying - ; the complete string because direct VGA is slow - mov bh, byte [_CurY] ; get current position mov bl, byte [_CurX] call MovCur ; update cursor @@ -203,20 +203,20 @@ Puts32: ; parm/ bh = Y pos ; parm/ bl = x pos ;**************************************************; + + bits 32 MovCur: - pusha ; save registers (aren't you getting tired of this comment?) + pusha ;-------------------------------; ; Get current position ; ;-------------------------------; - ; Here, _CurX and _CurY are relitave to the current position on screen, not in memory. - ; That is, we don't need to worry about the byte alignment we do when displaying characters, - ; so just follow the forumla: location = _CurX + _CurY * COLS + ; location = _CurX + _CurY * COLS xor eax, eax mov ecx, COLS @@ -270,7 +270,6 @@ ClrScr32: mov ah, CHAR_ATTRIB mov al, ' ' rep stosw - mov byte [_CurX], 0 mov byte [_CurY], 0 popa @@ -287,12 +286,10 @@ bits 32 GotoXY: pusha - mov [_CurX], al ; just set the current position + mov [_CurX], al mov [_CurY], ah popa ret - - %endif ;__STDIO_INC_67343546FDCC56AAB872_INCLUDED__ diff --git a/kernel/compile.bat b/SysCore/compile.bat similarity index 56% rename from kernel/compile.bat rename to SysCore/compile.bat index dcc17a1..4c16378 100644 --- a/kernel/compile.bat +++ b/SysCore/compile.bat @@ -6,18 +6,15 @@ rem NASM and DJGPP executable paths: set nasm_path=C:\nasm set djgpp_path=C:\DJGPP\bin -@echo on rem Compile loader -%nasm_path%\nasm.exe -f aout -o %loader_name%.o %loader_name%.asm +@echo on +%nasm_path%\nasm.exe -f aout -o ./objects/%loader_name%.o %loader_name%.asm +@echo off +@echo. rem Compile main Kernel -%djgpp_path%\gcc.exe -Wall -O -fstrength-reduce -fomit-frame-pointer -finline-functions -nostdinc -fno-builtin -I./include -c -o main.o main.c +@echo on +%djgpp_path%\gcc.exe -Wall -O -fstrength-reduce -fomit-frame-pointer -nostdinc -fno-builtin -I./include -c -o ./objects/main.o main.c +@echo off rem OTHER GCC/NASM SOURCES GO HERE -@echo on -%djgpp_path%\ld -T link.ld -o kernel.bin %loader_name%.o main.o -@echo . -@echo Done! - @pause -copy KERNEL.BIN C:\SHARE -copy KERNEL.BIN A:\KERNEL.CTA \ No newline at end of file diff --git a/SysCore/debug/BIOS-bochs-latest b/SysCore/debug/BIOS-bochs-latest new file mode 100644 index 0000000000000000000000000000000000000000..5e94170b38809d3ee4e020410e582db5e83a4b0b GIT binary patch literal 131072 zcmeFZd3;nw);C_gB7X-$flgv> z+ID!JS)SP*M%>16HipN+hB%NArUQry$RL7C1jO5RfDkYVAxXdAQ+02r6VRFGeSe?d zUl&bx)j6k5opb8csZ&+=c6#-0YaC-c9>T|{E0^Bd)i6GZ?Pdfr3(#x9NkbWHORs+E zxU0$a{7cl-{^eC@nzNS zb1Jc5q{^4RKhmSy>|JP8`YAhEG{~~cnB)oREW1)Ho*Lb#J<_2fS?w>qnwK^eq*s%M zrjp4_I#86j34)bOVeVGx(5QV2Yh9a!KAr} zT1r1e!RI{W%}epL#nc+#L&IqIu>`U%t*0wn+un;-%iaeV*3g0p0K-gS61<$=#>(Jatg#+fF@ra}Pqa zvTDnZ_2F>XTd>cYyKi)^NrI^gOaVRf?6q@4V*o7Mbs57grA?jTaA~#syl5XhjVi`} zlVZPc>fi0RBr$J6iZ?gKdxNLiDCHhX4@<{Orm~_W*CtQ3u4EF8Pu-|5%9_{5PVQW% zms-39{<0(M)4aLtT|@a7)U$NJNe(ltS--MfVTyIOeC;3{Ga=^ zL+`28!>`lO3%PSyItU;F8k2ln&s=if;B+A12O(X+FgExldC${EP)Y6-Z#v;`C(e2Q zY&ouK47<|!1RnuydUbFq;ft9XKX~-;G#C-G%EIgKNI$u23FtRTO$}0w=Syo{Zex~G z_taY_*A&Hio@&%dHQwCDvg+r9=y>uM&mZyZHF7WK@q&UYj}}(x6HA&m(S&tC$~5{i z&C)>WUQ=DB84TI01V*F{C2orTSK!Ye@~;9gL$z+&EL7Z=qT{ijtMgU9<&_1mI*GLJ zNcv2igwKVw6t6rDgSK$k!pjmS%DVREz1F%IT6yT7rF147_D!3mG!x%DItetswAxZS z9@XZ(aKuq4c&Cj4zw{$@xee3^R-iAK4e?PrR0B)Yt&R!g^bN&&+Dz_mytxfKoYbtK z5gOmbHO@Br)|mawZemit$yd-&XCR913|*VR#}LrR#xOe+-lLnw>3yS2&=~VSWIlUAV_1xYRnwfXBMwo`~Sm z>Kv($cf&my!DZAr(w^vsTOPs9sB>gI*$wwp1UIkFF=Kf*+=>Wpah+q{Q{8YYBe>;t zj>RiDjv{z9hCry9wm(AhOr2x-N`=JKMN<7&ol3H~6m9Dq&oDt13y%|wK>pWoglZE} zl@qOw6Z*=3!yyC@1A?xpsY1^^wvLkk&y@JT@Uqw4>Rs0^HSl$u)=R1GzWl0IG^A-Y z!zi8bvYIbVaGLlUXN6Nx1R7S7#to|`Yd)z71`R8JWAm?_o(ys@V{{58p)tk-HRwZX?w|i$Hf%RM03LK!CWg;RBLtTf5XKG;>kHmR7xO+xcz(qr}GsEQMDg zNrGZeMV>2RMV?+H&#Q_&Bv+R_R3mv3xI72k4VL(wBoC=b!5%hJ<5G`!w~NT~(@!E& z_|`RqQfOWyf@Y+K3rriXGFY%^x^!G>g546qs6?5x(!xe5xBkLT8avlHsYYt@Qniy; zU0C7WJ6s4_?*9QZ!N$GAvv-h4v=n`Ld@|J;Q(x|v#1NG*K&%=r7L!6Hl;sDptN`Db zoW$hWDDSTop61(4coa(Y|f_zANHCCHGF34r1 z#9LQ0`Qzs=N&8xkS7gU?gLT;p`7|by<(-&`FcA`Q*R(LRybwaSmUoW(j0=1j9^Z7M zr}YN`M?CZ0H$31-wOW4M1Uv?#!ZF$iIL+!^{a^6Wc9zkuIKA4!d) zF6~T$nWaxK>|`FfKUQkEE_NccJK*`VqFYrMcv5i3OceYd!apjqbUuuILa;w7z8QMY zmlogjSkHcYjcg2^DiBiwi=r8xAPq{Dic*czbEzipB=0JtbVX`}lh=HS(6nJcIF=xq zY-@*e*KTX2VyEkzYs1y@k|K+DP^uSAy=Y3I&Nc1MWOqoqog$1hjlxanGrs@fA%PZQ zGj(<#(j9Vw3E1w{oaK=sz(Yd`0>f^aO;Q`WtOIqU(q$N3ru68N+rc%h&(rR+(s3>e zL=xfz%i55ODf_Sd4GmVTj8NB8ALnU}D_Y>owMsduFo4e2Gh;)o3%tXmhEMPDy=RWv_lV^;(wURmR;4-f%BH_2861{4SR_<@)iZ3R=raP!1>Ux#Vn=y zN&Y(0+m|v3A7X1bJPqs_LWiZi7OTn@N@{%DP6OdNTkZQ*8VbJq?7n9#p068y(^FsN z`0_j~>QaF$uK{7AZEPn>ilCGpzZwg@GFg-l2sqV`=`@s7YeY(Yo8v%Ep^UaCpA%)ww z8(zc_1VM@+(sV0dC-~-8SL10*aW}Pml3rag#{@WJ3K+2+qAt_i7qL3*NF$*hOqH@m zB7Ksw#_Sw~?vyD2o^o#tM|!m)SHOs6hZ+~TFMA8*9Ytsy$R48$WRGQAY%pjbd*a1F z_U(;Q{z#XUJ#Nc(-|2u%0i7<8sWaDQ!c(d{>oR#lsg6b784Q=a@d^c{kvt@kDoeXu zOD>0ZsyJo9qV^Zahp=8@vGugYN_h=@;ENJ{=AT(1%Z4x8@#&4@aSAz-lq*w0fs7?r z-jF8)R}!BmdvoOrRXkFhI0xt7)=B^*R=EuqXl5hIaP!_1W!@&ZkJrN462mWf+(DFs zh7{$b6RvZf&e)>Z=G;b|+a}d|-qVX%x$lDIomvFJ3+mcUafR@@(C3>9l=#Lc`6R>` zL{aY~2`4#_z2=lD9;Yl)!EqYC66wH&DoPHhE6Y0wA_xKA+~Yi@z_jLpR)NF9&_tnw z1#;`5)&Mv8wlZYe!Q zW-c(LH$!ObXUO*6WbZRZso>M#k5N(b*}PAsR%I;2x`444OT%y)C`w^3__5N2x3ynT z?X|7_98S}wNqan}8l{h0zIYS6sHy053#B(z^x>Nohuy4c=wVo@m;5z6pG;R^(oOX; z?+fquNXpGsGRL`o99VLw6#jiDdWjN}Ne!MBiq z!@4u&C73!lZCEE;SCQVYKoC@VKMg66$Cmyl>gaq&Bfis*$P0ulJ1*lSYbQWVo~b}q zp|%qiWb&N~q=;zn$K>Gz!5I&fP;BU37;U)IR!X=tNX+9GwskaEwpYVK18c&DZLPjp zlR5$Qd}-L$ZrQ%!9L_?{D`FQ7@a&z$XV@0X2dn5KSPd;VL4!Wf!2N~rzvFc=6yO*v zB^{`XNu@G23d+8Mb_f!75eLu>HuC8FRSJ=iR(=ReU0uvP)JRvgHy8MydD04Vm5qQY zJ?rHDMZNGjY?Gy|FCPQb4(L(>dyU3a59*@rox`LDSnr0;#oNv^%LJ#+ce0j%U2R6J%n;|h?G!nZz zc&5{^i#n7J3=Poev`LNUcf#%wJBj_+Wp)2!#r_A!v)+N;Oryf8YeUC3Tkxb0(zbO7 zK87BA%+dQg;?o;^q`s7|y-KN@s$C$riS1epx#;N5vVF4;PRVBjwn3lNv>H5L#(i|k zG%p4x-8>BN`550yBXHbv%CKP%#pd%ghdYQTC(E`)C2OiVfvYjSL{Gk|{%~*h5rJQpM zeUMZuyQJbG)n5*WcTlhX1=QVv^SgMrIO#*`?SF`Oi%Kmj3zbUz7gC#PkEP6qy5Ji# z2;Ax4s{>H*_ND3;DpHRdx_Y$y@lZ<5H!0LH&paPN=bpVO!XCwpYwu439|}~8X6dL> zrJH7Oqni2zu32zsB<}3)(xdG>9ah##ZCxtVprWc!k$cIqy+#U1b(Zb5Agief52?92 z#PZsER?BNG1LD81Y+rb(=Ij8e4LO3;7{4$6gr}N$j_A085?3&of{xYwg{Q&l%O%CI zp`d*QRsqWIj0i21sUJ8?dv^6apZqyJOgn-Z+@LT2eB=XeUkyq;I(UF z{5OHw)ZD#N-5P^;-Cmbx8s+KO-tVG(!BW~EZcKTkuN-%oZ0BC&`T+xuXlzgke;B*$ z7z0$ocO1h8M!&_0_TZk(KU4T;KQPQT@xyIkZU~11*;c638&ESe%!GzIAO_)rpe}nb zmR35qiyDvj&@1+Hj&T&i!nagpr~2->WlhZPTS&xr`jW&xN2m1O|$RXSf z(mKSxeXhDJJ+tDoS10&qSs056--XH9nuIH=0FFhnbe2Gt(GbXjCRwpMG_kyscL-*wjE^;q7>bTFT^QH9h-L1pzU(MGEQl5;R6%3>6V|gd{lq-hy zaY>naT)nxZTx?+EnlA_V9-18X{V+LTPr~ro&CDv{)OfxLMz%t?tmKrybkSOxgLAOF z3Z-y5tt5DrbCtK$#9+NNnq-d=9qnV-vSQ9aWCIEHMbFNiPM3$(FOA4 zLu>Tdq#PL4Hu(_tQfmxSL8AvZg3<@xf`gL_4q1NuUzDm99P%0GN(Xeg4FSE)cefF9 zG)vbD9QDlR!uf$t?1N+7mwj1@fh-*0uI>}aN_-v^z4*K`B3|*SMIa1#K(`26<9A`o z3K(R2%-?y5w#&Ov3S`C%31r6V1DSEgicACaY7As1K%Y!pIv>S4T+=JkXAEN4!lOH? z(ackelS_U&XP{HpEB^q@ea>5ORBCjMrjU8YBM)&&S^emY;qC$H`vX~nQ{kl$UJvjf z(yA}R{b<2az1hl77_9Cl%k~FjT0W_O())3DdDXhUcLYDV7Uz@)T24TyihKKx`hb!e z-R*Q_Lk8l+vnx1gGq#)5sp8*#LN*@XjU#0M7q zIi2#nJp#o@zMz~Z4Wh(#of+Fk>gLO+ZW7RqWqTZfzwH9kx+Gs{2#4j$mT;KgD_C9; zcV*(*j9-|^@1Frh1#&Q+gNFLxT+&L{09G}RESj`oN>bLuYx ziJULRB=t>$`n1Zcsu!c;OD!WA{Q~jp8|K!+=4%P=!pn*g z)JbKq&(g(4sf-3OdIW9g5ywJ^`?{TXlI7@>8Q}}Vpxn!294at*alg*TL+Kr>vko&? z-#d_L&`GtJ-@Z&!0EbDK)%c68#;oq-;}gg^jLanGFf5vLIDtNT(TAB;%sZS|@zCKU zd|Q+y{3D;g1pOm!rSBiTu2H&Lft?%fmRg0uaOg;v2m?7^@4`l0CES3P{3@Z5t`b0t zk-~At51@)6h99f0viKL#;GAug_@qTr!q4@3>a~4gWBQSbf#}=!fO*s<>M;{5T4PPC zwF1$bf)m#4%oroI!xA_EA&YV?qzyPb3uHn)1g}75FP6T)?Bx1ny5|@#g!@Rj=Wrz8 zK*tJBx|>KcI>J(x8{J0Lsl+;JiTCo! z#rKN*{tq`BU-PrCx(y%l4P)ztD!vmv(Xb0^I5J4=L|d_mwBjzY@jRcX>IBb*;nX?( z3bykcIW>l+``SeHc#PY>F4ugJq|T+gZ)_|1tygdb+6cM9<>f@&Xg!C3^Z$*E*kV8H zokpVgR#`BflRMWu?%E_>+Cit;mR)`L$vv$Mc&KaUhAaFmTlPAv-n<5{J(d4&#)C|{ zq6}5rxF~Jk{u<{bxh8880+XUl&1rhxBVe7}vi6r?QU_}z=;xZ33cV?StE9zfEnmb( za5hd8rmrkNJan3-eFJd|KCEy~Q9%S?+3X6EQji=1=kB~R}=Ai0;Z7YsIQ_B}aF zlyxX)vSc&C6ZEKLsTBh%*(^EHXby)l7J^QxQ7aH82^?<+QngAg!JpG2dla-vjasUt zdd6FVl($5cT0$C5i?vJ8Dm7}Uk{U!ykn)zOQcFn0Y2hk@R;ejEa#EvcsS1y3w4T@` zqNOSUw*7)DZy6(6s=}ix^fWEXo}1r0D=uM0MIzJVoCg26PwJ-YTFtFyoe6NA8R{_B z0(7f6QcvX0d+CM#j0rqFdl?QRzvKV(jAQsj0H8V?-c8TbQ1J)PGHc%GaWwQa>k}5kw>FNQJ1-lI zgd6pO1Ce$E68cWptzxT~RX>bDuhncd)5kswUOC2lvT`Ey2182xqWpQ8?6m|-$|!2e zO!M-biv)wkY%$ZJ^-{JJ-^29mS@s%X7i^r6H>V)N#L_2<$-pQkri7Sb%o=Gl-RQ{4 zj(B_=i)uASw8|=Qr1icrVZd}{oV|d13G7T%~ zVxAeBJtr?+HE0axBF)I_bdjxeVfq(cv>I9s%rwl})kPL{F}_C^3HtBp<6o)Ks&Cb! z4^vkk_878+a4=Yqd?tMYeCDBq)CC(RP}x9cvf(3(KC)-*; zvXmRdxFz&j{Bq)t5=w~Gl2r-ui(gxu(tADLOJ&IL~YcLYxVzY{oJ5jeZ2z*t58mB8b#6?i-sc>KR3@c92bfyXNX z=kyfV_^$#N>#rKL&OCLXB z;_Y|bIcf5ehaXwG%*C?iWY5UAAu&LDkWab6-25DybKYDV73MKVX10?)@|olD)laQm zvU-_q?UE-SU-77|c-bRGD_7fwuS#H<&Y9V4^|D7FU%A3IeCZTh+B3t`COwnD94p-` zmI7jXWR-j5no$XC^^&I+t$F;1%cgOP$i&%bM*33EiwxT5uFJER`vUKU{ zF8=vNOI8<=xT{w__3+~>*Gw3n!15n+7cE`6c7@Hge95D>;gBMKf^GG(HSVXDMQi2E z&T|U$Aj4v5mS_!=Aj?=tek?jrJ{W$sm~y@8%xFl!dK zSDy1aBWcTXW?v5+Wr8SqAORl;+sfi)t6j@it{n=_*gW%p^eC}f*1k0hXco{cpjkk( zfMx;B0-6Oh3uqS5ETCCHvw&s+%>tSQGz(}J&@7-?K(l~m0nGxM1vCq27SJr9SwORZ zW&zCtnguiqXco{cpjkk(fMx;B0-6Oh3uqS5ETCCHvw&s+%>tSQGz(}J&@7-?K(l~m z0nGxM1vCq27SJr9SwORZW&zCtnguiqXco{cpjkk(fMx;B0-6Oh3uqS5ETCCHvw&s+ z%>tSQGz(}J&@7-?K(l~m0nGxM1vCq27SJr9SwORZW&zCtnguiqXco{cpjkk(fMx;B z0-6Oh3uqS5ETCCHvw&s+%>tSQGz(}J&@7-?K(l~m0nGxM1vCq27SJr9SwORZW&zCt znguiqXco{cpjkk(fMx;B0-6Oh3uqS5ETCCHvw&s+%>tSQGz(}J&@7-?K(l~m0nGxM z1vCq27SJr9SwORZW&zCtnguiqXco{cpjkk(fMx;B0-6Oh3uqS5ETCCHvw&s+%>tSQ zGz(}J&@7-?K(l~m0nGxM1vCq27SJr9SwORZW&zCtnguiqXco{cpjkk(fMx;B0-6Oh z3uqSj|IY#i(pS!VWAFFQPAJ=7Wc50XFI9UTu~J>7!_-8x5{J}(Y+*=syjq}v%z5RzQ5Zy*0943k5 z&|BP)1rY0wn`7>{d7-}c4nxcxeemrX9u70+syS_S#UFRogsgYCrpDCXF*@ds8+&5! zaJ39~Nwq{&dxtA*slB6D%pJXmmn$51EhAT1b**&e^uX>t9F|XARhe7|Ti=EKWy{st z^dl{odT>rZa))=Jo&>(bdy}i>lFBS~?y};?*F3&*#S~lmxbYM3w58fobCwh>n_?TE zmY#N7+C=-U~H^;k$H%jZDed(;^;)cJdBx=Oi9ltq0Hhf%tGIcJ#D?$+S|&kcDAp(Wp&KBJ8qZ@9#fqGkb!`Lu8 zd+g>JH=Ax|H{010sduL)q_R{ydvf?a!+Q;9!|iPOh*=}dBiIN#n|jNXTSPy%j2t#n zlopR#KdP&5QF>_fbE5~1rt%NRJUHftF>H*TJu`Ox*a2hNSUY=UT=qD_I5y7Cif_B` zwtly<+wAP&w5&9J8cVaY73s6nlhRqbojo-^Z+zl-Hr~$0OvsoZIFFn7gNdSa+wFJV zE=paWx88Z{on19ivP~BMb%Rf3^H?E!46qDVz!tH`QJTi?V~g1nDE)xl&z7(!QM!xG zXAiUGDB0Nq>=E`9N}23Iwv??vDT^&&%h*bkve`q-#a5w|!xpkf+0!Up@89%0r?a(; z*%+HKX$BFXG;{JyR!XI@caOcBVEA{>#CzBpj-7S;ECSdV%ey0w6;WyQ?9sCchJSO? z=P)$Q+U}Nmw3HP#MUYeUWSApe^%U4SD)#Kko_dR!?0xDxKFo}6lD`yp~lD)_n zBI8`|ea40dd9{xzZ7P{y`;vQXPTyf>N(^7|*T({_NAdC9j?lW&a4~^d~T< z{Bc-n@as|Og~|b{m{B-Hg+vtUP~eSc&GNswL~?Y7`toLf3FqXbmXubzW7DgN!t3aq z0c=^dyWX#3N}H~@T8UuF*>r)tD#+Od!+KC5!Y-`_U2v=bN;rOTU+s&BXsyV9I|=%v zpM2jc7^9MEDy=TEK;N`8PQStEluvd_4Foqv!S#UGDsVmEH-bJR!5z=FeFNHx_VTa0 z6o*Bt5*WfO6oj5-)kXcn#R-sUhBI8;87?-$h@QQs(6~^d-^Ktl%1;4+kubp~rn2hi zWvpIkmgpZV(6a@)Q`&R5{&2nS(BXO~IvMR~&&i2N6C|UFBw~9Zf;^<{Ux;v9Fp;S; z1UtW1h64iqeKP!xNE8`7d)qPa=_m6^Qg5Njx4u>W*%iV&+NDC+rQKWDDUZ5RG%#Fj zhPsMv+Q}Nbp-V!vd1i~g6JQ?Lh0J4)HqUK@=DqpWx65y}M)&#CR^alT{xn6FR&QaO zZ~bMt5O7mIH-2M>XK!r8bfJEgjxaoe1UUu_4T~Ma5-!I7vGV-{s&Iti${$BmZT!tu zqzdULg>L@kMrV4pQ?6=}J_51ixGWVmUsj>7tI$TNu*vJV>@95et#6c%wX7N8bu@Yl zn@GCPTO>!TRM;lWM7BE!2pKM9>uU2#OL4MF(I~&APzWxf*YxW2lVp=;S}ZR<7jFA+ zlGx95@AoS*ZqZhyJAiZ_ju|T-fu2SBkOgiG8<00ob;K6e zM->0YR~Rc5w#vV1mmJNQ*^YMl;FBmWBhGyz%;48y25qXAe=dF@a>C^3h^aHoc@X<%^3IXUPss5f{ETeGtv zOSl;SH_LmdM;L*cKT{M(U-R9?XpE2(>o-DANC}kNnZ4Uyj%%ib>r@?8V?#F7ZtyM%vcnAJ( zq|sTy8{JHe9&slrj*~@Xp`@yBKFRmTVKNnCT#S6`g|L>Xk!uiFtIMUDTb=T6C=~M0 zWhwKt(?X}i>^8Pt4s}GLpFbR?2#^S^{3YPNuLW)VOHq2W1uHnMfW5lb?oa&8M&zSa z@?S>CpCxkQZ}Bfi>nBhZ#9gfq_}@YvLA)R4&3bg57vVMbdR>DLrm_h=%O)e3i`EoO zgycz)=I5J*DDEi9u|K5d@kB1~GoU?5xfhff1x4}xFAPq38$th|NLbxWc2N7UDt)}g zp`<}2_0hvRkv=GIT1wp1_Pv$%Pej_^{e3c0s+FqBXagn88t<=%j7bFjvm)al&h1U5 zmLw!bjWlDT#s@cvR(w9X-_Ts;BXHo`?~y+R3|`Ym$v;$S|5l`ZCAG(JU)RQcNq=fj zk}L*gMjPb+67tWE=9;c>ofqLc@%y+A0kb5PYXWh73tUfuYpV`@eXD35%ekqRw<~=# zQt;rKA42r_&XF65KHeg3YWqy3{nkkPP1OFoG#`cbPf&Z(+yzRm`Dw^FPk{>m=iJmj zoJt?FB7KbcJ{iY@bu4jPqG+7bjT?IAW8Ha4)%f#E-=lE`xcM2lT~@dScso_LRSLJQ z5pJ8lkDG(^CvIx{raZ_R#0%z67 zN^E?vMFAq%A*HL@rogjQc-1cyNLmE)Q(b=5lb_^Q6#+xZNb1YxE zY84JKusd9`8awvK*F4FxbH>hHN!v~~ds)%im8)r2itNg>_dG@E^Rs5j%P%4O@Ru{n z5-D;v{?;k?I){}5W^(#Vp%g(zL#bHAC#)3Iu!)xMuB=YvhXO`9~^Z&-IGMbs;|B>0WC}!c}^W>yl?+Hz$H(6q%0vSq>NY2?V zk7+`p8KFOZkp`cVQ{z-e=jzxrzQH7W01`0-@~UugySy(1b8OW`nC+9lxF|XH&6-6f z4ulNy`OETWml4OBtA;6K-j@fE7|23#_!vztc_&CLrGM4QyDwKb4pur2W|UjXUeTfb zpD)Y*E!vxv_W$J5QPu8NA?^9J>I%nu!FEP+Ryy8GI}?#qjN(4|CK8pS?9Qqi&KDAH&@i&l$gg&Q0s@jf=3Gyxc)Kt}~)V`*v z7#bWJG*-tfr4NSrSHAd~6&|||z{kSS$`19pa#J1WEgM@gdfY`rGch|9lj#8G@WP@#@rRyuhs#Kw`YLs#%dNFDgiQ_MVW>UXUCoyoE;Z z5WXMnoL0h=odNB0&=fg-=QJZLPO3T!7L;ox5DV;Ed)ob&(#1FAsG^no39yE>o9}aa zr<=Ts5`62A$rpn@*NGx0SsU2!+Jx|0n)77#qw?M$m=j#k3*&zVOH0Q1Zrv=g!2m>jMEIPII*fq(ZSJ#c=i{i!DLiG2rbtj&5VWLTdIDk z;BEpglvwpcrJ6+T)+!YpD*SwgqV4?v#=<%c7ZqStHXvlL6A{Qb1+p&!p*VXhphnPb zQ=!;`{wL}g=W=pr@55C{K~`(l)9@1NPQ*!LC>gNS4i$DY!3aVLn6k0OW=%*)8J_>s zPN&?_pg<_(5}-i^c=opWw}Q$J{%eU>h2yG!n*#XuYh@QtQI?mnTj`P=IvX9(o4u8X`| zAeUViIZGfHUl%!BAhWNFbPD8%>muh0Wc+oJ^8~U10sC4D-6xPA3M8!sm5yi&&KLLr zNLR46x)%SCz_*?O9xXAPm<{b2CdpJM-S%+S00atMN=5>p8G496MVH>tQpD$q%C z7g1;)wKrZ%6U8W$Ml>-!Xzbnjm_dW?W5}}KRyw`~7DGw~5D@@t1TEOVI$eYlI*J_t zh{TYDqTP2KW!{_~=gLJmVKj;LpNK2!D?Y8bIx@W5z~sN3rbEbkPy1Y#i}fKx@Pp1O zS&1rrF%S9H_nL@OD2s@)VQ+f}joL6BAGHSoj`cU{oc>e+SRw!hr+s783>FBnM#E?7u?* z4sZajFZ`1PV2jFPim3kwCwL4jG6dik9IzNHejorZZ~*c`zg++d3BV@;0v&x{4Zfb} z*^6UHEE$L8it=v}{!mQSRg_=us6@3Z{3;>V1QtfAytM~b39{du<=Ey9x>oU)H+RI) z(mRx(mEg$zXKP5m^<}J3UNGTkJ)!*t)S$J)Zggh)Q%0HsX~ zk-QrXA(B5tx8WqeB#7Ec@mE;I%bPkPeJtaEi%_hoBcs4lHb+-kez7CtElXLhj+SX| znV!pl8L}fn(26Vn#hjD#-C7Qc?)=J`9-Ye^pmeUYlpSHbbCmWmE+Hi%wVbF?h>Vn9 z-o^nJ1b`yS77jQM9U40_Qrsge%P(|fgxoeiEOcG@XF;mi&@!UOR8Av$e52iY8Y~;_ zF|XS$g|{2a`w6>;^M1naoA_!8WArrBSBS{MOg%BL1A~mFt&TaXe}*3?i$i7lRQ~7LR)fOaDc@)I>>Yr>lT@`E(S+<* zN8T-XEW?PJNI1F}jD*kfPdj{@AMDJR9Y6<9109V#38WFoQ9yn{NU8jDfZ8EaKY$Jj z&>4Ujs0;w@5TH{4#RAlL+9|&wK=lB<4A5r){e(cn8KukApQ(Qy^1&sgxnDt?%TW?sGk7!4;3Za@HMJjkbS4sN22%GN@xxz@9qprMiVCp zPF_o(49(e7;1J&axri>ndVxLF1FNJFdj$4O53G_$ye6>qJ+Mk5Q7*6z9pUZY z^q^2uiT6K6su12TgW_xt3MHBNgP^Df#VPzj4g@l?1doo+s$VG!(TkW7NdkCSj+qQ+ zdf-c%ktzrDzKjU^56o1x&mz2~DJgBElX9SJJtkf5}JWvyMeDP%&e&!`V+jXo%e(Y08aXa+lXSiKN-XBdc9cF|3pF(Up)q%}xaXkEs z>Y-^If`>KYaY(`;qdCMz5W9d35D*Q8=na(+N0A*F8>o6zU=L zZX!0JA=Kw#naU&v?&t8y1$v$#afv7NG-h0TJTxHGZww9_e%U!jXDR(TK8yBHDKo5) zKr{yPoq@-7d0thKGIlmhxCHXY?$c4p=Qn-9XIsx1qa^gJ1-9pmQ8M~@gyme}dGNoe zEP1Fv@lBFvFZR7{83s#PiH`QCSd6-hq6F-7pM%|Z1?)qF6v4Lj^Y01RTOtAb^;k7v z&x9o?VE4leN5H;{2>bTuPWgVYG^P%zC_jgANGri_0nFmSZc&_~B}MTPpl>F0bQBMD z_!-7i#uPkv?G#ir>qEj4y*1jYAwbDmg4wkyi6 zMzn+4}*;BG?O;wb3iD65x)0%omC1Z2HmTw6BV$RYKjHg7&X5AJx;{>@I(Y zJn%T5S?UV&E7)w-XSn~R+3oag{x#|usDDBAv@;cZ)2b87cXr^`8|K?;sVM)dBQ&fM zpX5oj@BieZ`kR5mLZ%P(CIq72S1|Nf6#b4NCBnq%|K;dx8dK>umsqdYC}79P8>2)EE|6mhTHl!p8?SV z5Tz2))?2uE4$+Gcj=G-$g3l-fW!T(<$=kUUUHBV-KMj0rh%0@TlomZf>218n)Z!Vu zzk09>opj1?6ZzJgd4D7P<1hny@C<*WQhK3-BFf#JJc1`6=(x}_NG@?>6mZVHy!fJ|17?due{s=oK=YmwwDG{klN$Pc7QhOD;d7#5ZJ=S5q{#r`s z@ioC3_Us*x12f2iV~nf#qGOD?O*|?`jv#yxiVi4XFZC4ShXO<<^t);6hp}}Ltm;Qf zkEdulTzdjHjugZR9QK1a+C+ZhxPotN1s$!Gjw{z}1j9Ts&;d&nPT2;Y7PvM#-NVxh ze3v(fV18WI;-Z7{aQXOo2*vk_3Psz;pg@ti~k#mP!L-}+VXY6}h?aF#N@($Rvi(KxffIZ7WtTgQc>9aT0773!^m zXkw&sITacL4B-HrBdMxoQoo8p)2r174Aqm(V;mc8*A~UD&5+|7yZ%m)!>&;{#jaj~ z!^1mWMp9Ojg@mebT=FwL&R8lPm!Ke?Tx+FF6MztoZ&5}GVa7jC99TVyHdvi`l60Q{ z{r#|r0(kNZmZKGR_AxRfo$v6CP#i^ZoV7#`T;?%8a7lPFs_ao6PI0C&-Rj6m_b;W7 zftVT+<uHq(gCjO$W!#5lD_(H)-uQ>^l~sG>{Z`L9vE z(vcwS#!c`a1j18|WHfFUQvEqW*W5L;5*%g)Plq@U3BIt3@QYbgSLX>Gz?kT~SH%uE z8u1!B=!>VzU3g8%N`8d%NOv5LBnWa9m(Skyw|X5Ty|Yal!mPD8Zo>s;iYZ}utKvR$ zrOQy#t}8NLdMaeNi!Hn&LQ#09f{YU?rsP+1F#qYW5ESsIviGKd;UjIT%2=?#}d_v zevS~`0_gWn^j(7dx)c2sfxF&BFCx_ca-y$Cn;sMW==(h<`m!UDA){RRdJ}#A5%leK ze9uI0em^qNL+?jTbl>~endl|&_nhc02tVkc$3*{9K(9N|{{dXrL?4W9XsBtT|A8>y zHPK%Z$nT%%hYo(%MBfff&x!sDVE=leKX>roo9Oe1uKPqkfw>*LGdsvc^i>@|$;cGt z5$`cI@L-ExnBxBvWS)B>AwDgVcb-3s? z_#?e|Ugy-TSzgB}EHlH@mBSz?R1PHfM|5=BJ>RS*5L#l9Kc$Yx{)1d2R4MVP;M?BYcX21@*7L@XeuBLq3jYI&B`GMZ=uz<{!_UK#DvH21Bb`VDjnzXkPqD- z8sI7X>JhcpZnewZYOUN1gV7uYg%+1__5eq?EUbe%@&#lP=a4UxkV?Mnbu^0-b`Y0E z>2hcQ$8#>gaw`Cb=9I(SH`qIS!0En~E(;|rG3Rj7X>vJT=T5b|=6h$~aJs*D{UopB zj+d$x3N@wi&hGaetrlXK40s^M0h>3GCC|u?fSByz;N15h-k$H0%`Mmq&IjZ;!Qj1Xq7@;=HrbctwmfkP7L?SYd7i4x*iEeoptEp9KHFe1#49^799TdZupbJr1a%-nUn{dTt!Ev7ir)PUQOvPvZXP0N4I+ z*e+8lnOW&LnK1=ft+>#pn$bO`(s2TAHN4XC2_nbfDxD(y5+1$M+^TF_vB&-dkJ<{~ z|I}Ofxo`au`N6%CgXD$kUPryR@DxpmyuFqea>J2cE{R=FrK5=o6<<`GrXx5y-or}6 z->{%^BS!+k-?%s+=fFTl-}(>asiJU19!~|yAxnkd;OtY#A$tqIAvsRe`dr6~CSYUP z9lnRdZwwcI6E2pkzWS#)ttq3tMUhXSqQ{dTZXT2GuLTiz3u4JVrn~g#qNH!=A$>U- zbLrQK!V$TM3SwehBmE$f(v269&Ug#Y?#2nz3$=nWS}cB6dQ5(E4?ioViT2f=qEyjF z-L%nj2xDvUJky7YroVmrdZeJq) z@bi!CoV2ubmOINfZ_eDA^XAy{ow?aF9W%2t=gpimn;tWc>T5S|PjztGq?z&_OCc+X4>BxYlc_`Wr@! z7P%l&oY+XTXv&v21aQ1lje*)avI0{Gf#C|x#WpHkrjKvwqj_uZ3P+1?b5l#cJSQOH zg_tBf9D>heKoKug@oT z1YjfX(c~689k5ou(9|-e{8WqYjWaEg{iwi#gbLGQ*y?u`Ueg3Go5E{Wgcpu+uER~_ z#of8}XRCKsmQQY_8HagUJ_V&6OxF?=)u{@CpYURtE(&s^e~;+>y)Kk z*A5e%9EE+m&bP=Tb}L6F7&kz}IDZDzx*Ja%VG#X{9%3a(=Pq?RV_3xz4S~Pj6&c_a zd#^XZ^8t+-;QC9^11xqEG{6~nC>Sd)9VOsGSB!VOQnj|?-JLjO&;r}L6)%KzRg+sY zDp2jEVEe#`PX7Wiz1~E4!!ds!9D3rgvL1`EGVgv&h|p+4Wf<4cyIv~B%`v_CQ|Jou z!-5MH`E1}>Gisw|8->5baem6)#T+ip30M!k@A)MdH+ z1g6=im}bXXWCzL2AA9i?B0BxLrknHLd@7F7jPP;7z>EKNNfp;hhok+o?)-i-+s=2(5f~V~?m-z?;@8 zP2&YE(2AmW5IS^2XaL=;o#6L031KQv;h#87P^RpM6v`0p=c*HOmjGbl?P6LOL(=5<%C5Sy?J`Btm_n3W7R(I7VUWer=WxN z*R!`3?}8`c4Sg=dRHDGS20$^-DRQL{jNknv;lX>0CsohiH?Wl6hzsUE!K*mm@8o;> z+jr&Um`fnP3YdZrjV*j~S~bKP?C($egHAb>ptSsg413qUR1HlASt_Oru9{_B46|5V z3}bsoPl16UH9JQW6&q*ejGCIBAP_Yi64mKH1YIXTM0n-zv`y|q0@0E6Pk0q4x;LbD zRyb}5-mmj7SG3F|F>ve>8W91F6Cipsda9$nC=uWMT;>X1;lNFp=)n$_sf#lf)5{-M z5RYs4SCNg>7J^TV7O1xnC=|1`1ad_L`G7@w^%Hq_L0%W2?-%5qcOeKi`0nn43{nOC zFW}K7nes(mOzt5>=x&vCxgb@owos6(!s7nkaf2CI5xG4cSqbxN<-c*~p9Hrr@`pYT zA((+I4skpBvSgQmZ90*s&u*FFmpGcI>uMhQKJRKgoqWi^b>sQAqK04oIUP6_%Ou2Tea0vNpP zmE!+}Li(iunEk&}0EYx1$^RP#uv-AE{>=*D&je6~@Na>|-rPyUjiZorsh!Z6!`|8n z8Te~q9|B7cnxDrdo7pa275gJ$L-6uwYs`Zt*s)HgHC$C?RJYFPEwhp+cB#7syM>$` z&Vi!Xff?pbaAWN zgp=WYK7!c#3^ z0M~Kp&FSIxORp33_)FEGOzkAfK6$K>8vh5bmVp3IFL=7<(+iFJ59H)r7c|KMb*F-Pxh|4AUpK96lbhMhrJ>_9Vq{u-S1uzW7qL)PSkBWd8j556quW%HR85u$2YB zWx*y^A1*Z_gs8VV{Tt+@K#ggiV@nJQ4+e$Et1vE6fsE ze=RGC;dgAp#mQCQ9u-^R&*79f@s8>)GCU(RTA_f`$UosL!`RY~0IBHj}uxP|#|p&{>-Z=tTmTSENzpQyQ59AXq=`DeZ9 zWpnw9{-}_m{Tu?xZ(Feu zcFLW-yA-sPy?~QWY#k=3S~ubKL7eOh;tWZ*U1#On_q%n_QjH32*Q(7dfF^p!`) zHtr_%n*H$NeP1?GYzS6huqpw@ZB9}uqk7297&4^t)FyhG{-dlRF_ul`!_m}s+ zeDCk>{qwz{V~_y(>;3*q&?ji^GK%|lF1}3_pPoIC_Xz@yi4~Y`>hxS-yRWywyA1N} z7HsTjh>aGHkNIWvx+c2UC%GNpQbBMsvO0BMwOO%x?{~P>6G@;uRe^A(@4jB6)k>pJ z;rfvrg1hSX%gUce!jGYVXRtyquTSzfLDYSgC}T*u=(I%zMjOJR=wu?Dg!?_psn@8~3A<%hi-)>$vws>R%v=0Rtcq0fO(mx?T@Nq z=2&nS))CwYBAvqh9sN3$pC>$>@;!e=Bjg~oJEurFmFjB5Y1}Fz4(`Kn5_A)GO8CMr zleP2PV!W!@p87nZko=3G84AH~~N<b^AVYb3 zv$rtGx85Z0c?*lQR0uc0hVWL0wd7NVG$&k)A4o#{RMJ?Z-0&Cblp3j>ifq;>9|49p z=DqS{)+qlS!05cyDE|QvB%#C-#|I?GFS}@P4nvR^08zI6-~Bc!PtPvRs&otu7GPsD zh^MIoaH)BflA!5ES4};BYjwKbRYgBd>PkPte|5Fy%#u`V#a>tZ{-Pu*PO2|zMRlgT zDR>iBE?e-J(eKQx%F8E%4)7M7`HQ z21~&F6G7HTAtOdaLX14W7X6?``~7|mGAF7joRv3LA{_g4 zwW1?CI=GJD4!;@cjpK;nKi;%#^e~>iuKv@%)PoY95jp;s$^ z&QR6yt}dMaA@IKNM^yyzvwZaX8C|9%n12Dt_9=h{7clR-mcpCT3Z z3y#p!!JudXWfRaqZ3sW6CNp^xeOHr9x^7L#K7LkGm4t7lNk3}BO-BQk^1IcE_#Ftf z%TO;I5vY~m8~g>&NdG!8QHNia8{dGN@u%0Q6NUMXtE56q7mG)_%hR33pCT-x;b-KZ z3Amrxgb&jlrEh(`ybf?2;3|FP_3W#K(fgc2T*PK^=4@bH@(FXOfP}BUBhrL0+96 zu+wB2;K0MoA30_Kk4!J~@<1L8Z3tiR(oi2_ZN-}vx}q&(hFD5%S3~DQ6A*#J#kMNH zviMZ|i7!4QX$vuu&X4cOY7H#=GUrsyx|D^yn z2>>1nYfp`XO_9gb0ZD4ycn5xKi+>Xd<)uG zoHQrXAxF?)Ab;=`cH+^AaK4;n01^p9Qq@mkH`+Eh{|Jfk6Di2Mv2b=~G`iy`Bkc@f zBhZ;qFMeVGH|F^LK>msmZGDr2&3a6M2-gO^;EGi?g`S&CAw&Ofd7^FVZnO>lN*@^= z1L=+J6tto3RR?wbBV?;0F|hIjYB|9SBItzPK}F-A9KyrgRK}8%9K0K+=u}Cg$~65} z?BTBB-qz7dSu{6yJIz>naKh2t^#g}rbKp{#sO}Brycbikc?O8k*(WIClKUy%{tXad za2NMv@mhpM>36djg85B~kU%u{4}etIx)(imh4%@r;w0}XlIWK~i3}(BEDxCx>#xwM zW4cNi)92obj42<*#_t%#H2R5^2%ixOpX-d`_i>4g+bI?qw|hwO?&F4IEHUG5BV6hl zVEsQ=K!Z5Qi~&}+&g5#Ce8}T^(X^wH^I$WMdLk>K0WJ;|p_*Z$ALrmuyn2D%KX-a( z)eI#ltifcC4c$!v?)0=|w)Qq9z|CAdVPWOMvkM0=9=tfFkUj@5zN0W(DN!wMk#o`J zMPpa8qF;=?nH80ewX&iYLz^QJC*pA3(P}C6FmQoiQO-{s%!J2@3-ESfw6@ncZ+q6c2|XtQH3Dpwh+0mjV5vd|Wh>oid#Jdjc$oaNCs{S99;#rEW~XCGck zzg+kDidF6++rw^`YuRd>%e{Pgg7Pp4&5S?2ikU&bt(06f?W6pvWlKa%Y5yHDwn1AW z+WabH4>4YTjvDB2%zcsj`ctSP)*#a0N1Zsqf-a8Zqd2}r9O;Lg;34>tu&~)i4Hhds zWKa)0M2Y!4M%3}+-0I^qBnRtaJu-^*oNmHie5Fg+4`1mfY&EK?m~RtGC_Xrfmq8KJ zj2J^=rhXAE=Fff-llu8W2?@?9uKe$=MBaLJZ#IWS53rECm@nb#-Kop4@eMt|B3u>q^3P5`#P+Z!= zDfqsL)}&xLHar~@?P}O?MtEHSB^;*R3>>ZHWGj{JM}!N$f~M`MyRSvR&Cwp>Oyj7Y z<@Ja4X>$IIqn8qzys;;`n4@!fYiz1}qVMPE5xg~=z9)JTN5=tumESNfA|c2o_$C!p zA*@74MC5~mQ6M6EQ;~?&uo`+9M4>@s1xV7<3hxs(_!~H6S68W5ukGq}qKoc|hTw}dtkhW4-GUZE!Xz&BvZVT!o>EuezullG9m54c zyT#r25cG&1N{a%HoJIBg=~=<+2~iKl3(3Hnd{!z+9rV@S>Sfdm_rUj*DCJ+r?VWg5 z+8lG#aug;dNn3c_5uB& zEwEb|MHta4YquZ6#Km2sjmQxc9h1V8ic;W&sZS9Th{w_zuGM;Q?o(JKpoNdC zVG$pb$bJ?6fR&Xt^^wP!dWYx+LG)QT%o>gnI*!g*tWOYrPYGtuhmemtx^d=Am?H8F zjPo3fbvw24rAoX9aV0@c>_F25n%Q7i9fx74Dtgq(h>EHl1c^}2SdTl_8%f_Cv7Rbq zf>gMefV(M_E#I9PN=x*6TSkcpOq3*q4&>1z0`hbRzjF}H=T8Q~xOBDcFf0NsL(vao zk`M)h!I;eA?TKl#SvS4o>4qgFu-!Xl436I0IAtSkD^T z$s-EjkQ`kOiS;}MTZ?FbKtb4kRh#!bBnMVRX^oWS z)g-{t4z%Ddm*HsXmpB70C2M08F05){YvH6^zmw~W0fP9;4%3{9D}%#)ufrZsrR|`1 z{P!fm0=SlB*Bdg4youPRx*tVJQ9>L5)BB?AdSkh#Qix=qEUg8Sz-SP~=!F9X_N)?! z^n#mYxY^?w&~S|wuZuc71@UAcOu^-oU%op z&TLZ;kzeDDV_2a%#+9PwAE-6Q0!#;H(JG1!vzDZ*QA3<)!b}**oR(JNCwK`wc5v6tPR4`T%OI6*xjG@c07If^b-k!pfdO49k@t! zLya`H$D1YLorSF@wW)W=7-aJFziJ#oaW+KjkavRDSy0TP^2qaSk?KSpFY#oLcn1aX zE~s%$4UfY&m)g{m8?~EDUFxMZ%Yu1-wnvK6FVK-W?_IPv%3^D#aAJ{7x@T!3>|h{t zdXHiNqlElFTnxlE^ezU%k_5%T_SeG2z$Ow{7*>E7#L*h-EdaHFsJk?HMXT6QRIIx+ zI2}a|9~ovQhJg;HgF>?pFLgsy>+IA%MeBod^)ghF8ace$< z)*dQ1*zjPRDrBM);endW|Lo^no1SI<4jI@Qo>FVbQ5&>w)@yf&&|{G34#&Z_>)KSi z%-{g6vFUYO0T@=_coQdmg9~s~jts5xBX<_Js}F9_c=3L6Uk?Pm$8A@AF1RWw7`-p@dAP`n!i2awyG8{=wL}NRQ?!+L`W>FAy zYKje|nPN{Qkb9<)s|NZK%tA1339=0E5pH{8yGAowuF2u|rDWR^7RI;y+tgQN*n44N zqsfwWn|eQmRoXrbZ)Z071A!w0abPL5f3k_lHg%p1{M&ll-!Ol|${eij;(`yC%hp_N zYc}IJX!Cm8eyoEAZq03q`diBY8|+vh;BTP;GzRSr35r0P2zsGS4r_XlzibcDhDtsF z`J=Pm*l=q z0yYu=ea}5t`d8}ydD6d>{Qk0L_k8Jh>EUV8Zzn%-`gFXh>ZXT}(q+Iz3c$U5^d=p2 z0fA@&@d5qp^Cqpg?SuBN)%W9#XesM4qwND+DM1_rVotFSpOm;#_&%^6`(_Wr;YxF7 z$ZXz4DlPxGHCGvX=|pV#zD>QGvZ%Bj2;tWZ-_-L!@X|gn&j$P%?qm+YX>NUGJVF5daUxj$))462=FiBh{}U zKj_gq&YWk4k?JP|(=y^Ch>>bDfv{ApMdX=Xr1}aczCkADxm~1M8;X!;cadsM2*OKc zS?(c_Eant{**;=jj5<`xOX7H#ec7iva2Ec&^@A>pSAiRUHYyJ5cqf^EA z7``puRzCTqsn*N1!SrqF;gsZkK`*%Ins=%e{Hz|lPIxMWch%bMr)g8`!_)+^>?&L`|4Q}_5K>o%D@`XwS{Lj zv}&5{TX?dsS@Qft6>~JLsq`?}e{Z)`-X`ccQn91VP3C#AKc=Cc%oxu_K+Bqq)Q8QU zq!`cOm;e=K$qeM;tu~QB^Z_>5dg?}r>4=Itb;()3+4E(8n)RDK{{Egf@Hir8g8fa* z63m|0`+HvKUFkM^cJ=qvgecwnDw&EZ^;u2n-X=k<1k#l57bFPNrohmC?pjS7I#IP4 z=ielso~T~@`Nmay)ah$CD*K#4UH3_liw+Y+5c5$fV?*`q<~1RxbiMa%9oX#Y*FSLE z^NS2Ms}j$+tw9^o5#ukQlYoCQ>BsHi^)?LlxRFU$kYTj$nKgmyonHco8^{1Yu!e7U zo|YGo0a&#rc)9Z{%|zS@HGd7xCc~Zwj0w;|2~G0}m@;^$dU5l{RXfyTDu;Hh6Ghv8 zzr5DTD`)CFoB_sR=q}wR$l=voUp+grUQoOS79L=$0R+|*Y~}tyn?u2-{VAP~8t&3M z-^=Lg;R?3d(+IuV>^U6e`6KDoDaJA;_iy0AB3@wLsJ&>ieI564td=HtK7e%UO!3oU zdG1e}CFjZm6Wp`xK*9zuQI;OjJppv!Yb+NKXD4`QC7sSC=qT$0C~4wNFgB*>ZY?7 z5{#)qI{PQ#z3|^2*wNIVHaUgf3QteYG6Cj{e`_$38pOtE#nm~T&R#K_{A~m zoYb+WqhpiijE;SFQ?lmlQ>RiEm9`^c&BdCtPn|?zcxx?GbDmGgyJ^nJ3=7wsX=Kn9 z+6!cF?OYuMX_~X3SnF*^deEHTrP%Ip&3OyMpxaRw)->neg<#b*=Z6S%mgc;I6WEW)HLTCLJ(@2^E3j3B8G`69wgedlA+oDXZ7^I=_c&OsvXK_7Du0_Pn@4?0ZT#F{gD zJM|#Isozt@KwZ+D=TmMZt>X=zk5OzMlyEDR$Bk3M^ESaqn>Kq+3eu*{o-I9V(;@2e z0&V2HhuDCU1k~lP&r+A?t^3)E+7(0B)oA~Qt{V!7{O$hzYK4THr7l0TE^6gPD{EF< zw9x2u3wMp@=OR>u+#Uc%Rknl^`b7*oB+H8;meyt zp4SZivY`!$nqqbb@d4?=ZyG#r7~F%Ylg6MOOzIA#3m7(dn2>Ng#Z2YUKX9mK#>5p8 zDub&yShHtxQ!to}6cF+P4%f_iyjjj_5e;B5asV@_ZwSJ+ap2Ibx z7Ar%-u}(o1dyvC5(-ezB!nNxkB^18iHWYFvp2WFkBjOeUqZzz~c#1j?x?f5H<7y1^P3foQ)GThV%(G}?#!Onc4krcAxT)p zqy1ZLTk4c{f>qzz zm9|4FJQ;w*(?NE=`cL?z6-wYdjlCdZO3nTwb~wq`AwSp)rTxxg7iv!Xol~V_yShj^ zcBv}*COYTJpV2yM6SB;h}ydYnD%n4Wf` zn0~K~sk5nxVno(@dP%pbXO+Dg35X~2{%zC7Ham&V4N7d(g!d*_d^$F$Q zf{|DC6!|)ej1@&}5mzr(3FnoF#`8}im0qsl6fH0neJ>b$fQ&5-mg})kQc-!1x;q&2 zQwQoxCbL5EZl{>~Y_ig}Cm8)jicXf+L!&>!(QSL7yh4|dvs#du5Nl=x->6=^edDUv z)W<0%B|W@F7{Br0C^*QdmWR%5@A`wB+k$f^>C;q=K_Ao@G!~4EX)5y}Rw+mz$)oqo zk!}OA(LRIc8H3J7Qz7(2*~m(M?AiwSXoLp9*<~FSI;=z*4+Eru4c(B9S+Yb*yB=&i zG`OLQ-CAu!7hAU-p~uR3mzR!=11}vO*Nyu;uneW~UMMp}K)miok>kDROE`EEw@dg+ z%6?2ckKkV`(fe91309J5v+Ae$@K1^*`c&J8E{+yt*-ZJ$<9scmKW!7=@6o@@VMN-joLj{9XTf z>^P;%#qDumd7|tG4J=MATDO7abVQoE(#1!p=~x#n3AhP%F9`-f%rpcuWGO-1Un6W@ zFn(i7h07Z_6V&B~;Rrr&)k2ZA)7H57O2>=|j~;v+!I6yB09;9kiOVGPm|Il61xNE> zm?xf3==sbr-VEi*6hmjxu^Y^$T&R4XfU8YzEUi;^oaMuelgjtJGf*EcAGB|b_>(&W z*-sBC9i4k>6?4f!F4S_5)RveLv=2}!wGQ~q*WC`t_61yM7)V52j zAolSwvF)NaKj_@@U#K2Bf%r<(*~#Ty0CZ#+t0FZg!$77T1K6=zp!ywDW!x{KD>qmM zMmrKRfatz)XA-W|cjAk=^kAAbbdWLFGj!6;=JRX=H+0goA7_R97l%aXA?F6uY~&DA z4E{|$-%R;@7)ayIq--Kx;A{%GC>St}0-|~d7)=4uJp{xt4*EGmXLYEDpx)7v z(B4S*&xzpDbe6kX>mLq?)ktYDMkjtYf#?PX8i~n^X2FH#Z(&vi>!$91qAx8gMf(8C zo;%1B>_(mBr6*`*b30q9K>m(EH#P3E@{M2x=$T*@%%`Zy1#|N4pC}i{dsrmiX{92dPEU&h( z0(E>9q?1$t-(%hIA-|wU2)(OyJ*>LKVhGjU1OKK^q>B9#r zs=k!jWs@6ztc@KH5MOtv+9p^*2pv2_3&2$x!)9JxmuLwC(iIRGL8i{pn~vfVl|wH!-(^pN!ARWyDsKnnC!9!Qad6@4`8J8&>dj>+HRTC2FG5|uCW(_emzmy$UNiddvr2o=DH0d8E{d^0C zWX%BbbKd0pb}5$(p+=hz)416(Q7eI|#uVox@{q9__U$5HXJA0QjnLs?2JY{!vFgC~ z?%nEwfxR|{K2o1cNJz#>G|s0<#(f!-ao31%;w6@kn}mKE#cbR(g5z z_y2C@{W7Mv!UmXk)}1J*&XCFE(V2HFdBT`?SZLf>8CNo|LBiTQLnfD+8 zLzwp+@&}mruQHU`HS3>X*Ei83#5Hv?pgX&6kl+Bjt_Vbv$qJ=Ez^=EEKftc@1EFE; zI*GtKyI#U6baow1z973kPhQC(7$L{1i@)y9uBH8ZCBM$D`Gn*<*mZU=lb+ah0fHsF z78G=2*N-)JeFa@yva5}wNOnzTw`A9G?3V00lHHPBhq7C;YYe+3yZZ7etM2T&z2Izi zt(UMcc70O9!q~M^!ot|qDPdvknk`{r>^fJ%B)j4&(+R%JH^ePyF)LJO@WwW{HJa3d z#nBI`=V$})C)g0~g5E7LNq(%SoG)LE!4f|K@)kRxC*=UOFt-Jn9ItC4` zKS;&6uGf46QtD|1MAxO%FUX@ysr$(jCZ$}Var0$dDWz_eaYLlk9D;P0QWFUnBBheZ zACOW*WhhIjEvF!*=4n#uTRSJ~E~Q!t9FRH(WF(#zlW5yXeqG!&aMU&p-}B@Pikm5v zZ$RAqMEwE`$Q>o1bVl?Gb`)y;z`Q1cl78B zhPob1D22?Yc|o1v19nRx^ESJska?BeQpjv#w-hqJW49DCkF&eGkjbK=bkhm0ldv!$ zGfBe2gv?JQEKJD6Nm!VW>CEFi!i3Cm3Hw1prc|RzYCdQZ6cA`+H78=`Onf!AyfXq3 zbV(xFH85)_yMpG)*lEBD8T|~Q9~hp&4KVt_WC+vp7~63+*ASeR@U*Tjmzsdi`Ph!r zG>%@Rf?zrh?VtT|VgB!&`^C#iT|6(>#o%=nTYRuaq0@puX^^3Z-o4~|4ufR!L7u(B z-Txv9(l%TMd0rLnxCPx{e?+|Qut$V@Phoe#9XS3ZmGOigY?_O zNdMe3A3S{TFShZ2nNMXull{zNPmeh#?!I5K6+mgZ9+p{gCH79gw~FY1W?9eIM(IE< z&m%6)3Bs{7GO!_1YwsuX$ksw6D*;$F?e_~UK}R+vkPA#5(%3xRbzx+?ve8GdfCV$J z(BRib!j^n&Y6OhTcVRi&hv#GO`wEWOe&t&HN{TNR+IfX*Fxpy?TXeJ=`*s$K03S}X zssEKl{ef2f%<{;t21Seq0c5M#$b+IjM9I9k;L(Kv7Rw$!!19qiX(}#85g5t=ZZZwV z^5G;c$(#UoUNa6rHSD}>tN|zLg@Wn2K&pwe*|Z^H#@f(eS^x`JgQwM^-i)XJijeUJ z=rK187psxLNSjt&Zk$I}+ZUtIr+D?EWdJVq@v18+4pp#v+Xa*QkT|sOD0kVq-1mX3 zr+$;B&XicO2Y5Qw?{|*Dmr%k8bs)-IM8OpfK-Or9k_qBHN0KMD;mc+@pM7KrN(dm4 zk{%4h%ANX8QV`Kp=fKnO0U}Z-E<{9LT;^xR5{ikZj(W~R7dV<~6fRSJ1>Gk=6VkgP z^h_~UVbC4ZGOkZwf737=$g9Em&&{~R@UqxsctyNB*dg!l4#~Xb)`buu^sXDfh2Sqc zsy<1JD%1}NyFs|(m|i;<>-$rWq!PLca( ze8H_Qrwj2L``Z#I zFc^etOH2sXUQ2LAVCyTst_ZCgTUUsakrYZT6zI90^ayp+ZJ;~EsqDd?sSz|%XWd53 z7)N@Wn!)aP?gO*f{UctAx(aUEJc!j$;*BNT;M4LxV^kLs;t17p+j?6ZgbblQb1O(F zZ&fpDkM#eD)*q;geMEjne&kjl&o&#OEW{=mVr*Sh9$MX{r~?r71&XTW><`WPUhag0 zfh(+D`9@yPTL-+Awsu$YeSV~`~##P_hiyIkIqc4J=d1<@sgh_b1D;!{CDyskeYM1Zxu5R|`BX@p6WCI;5j&ahH2<1f7KFP>*MnVQHi*@I=L6 zN(`wNc%s560jI&0fp;PdfMIswPnx8++?<6-<}ag*^y;hR=I3HG!21A10_L@HwsZoZ zqk3`I##N`)RT(f6hVpP~Y*KXuikp}LL5Kg;(zj?gIp#+i7VWO+y0$dFqHEr=0ojp>Lr3J#f5Bt@ zh=v>0^I(c_UaI#0d1m_LJ+3$!U;+bX$Z@QUqwY^c{ ziX?;&{k@{2r8G|2=8ex#>)yRp+4fnycc8LOjZag5|LQ`rtvezrXSdtuuiB2+6ZSNm z`c2KD>cll-MiqW)4rF-GMR~)6>nI>i{otE-6L!;!3-zLQimCQ$Q|(k!?KD&EbW`mN zQ|(Ms?KP%ao2hn|sdl!hw%Sx5-&%6)uFCC=s>x}3DavbnNmRBZ#W^D?c9m2nK41ct z2Tip#xqSnKWu69#hQt*4v6sKY}Ca3_nV z`k1Y45qOKZ=0L5}RJ+VnyTMeu(NtT5i-olq*&A!Iqv-prZZ5~4FWgtYSa*Q&95g_! zsWTbejlZdjG+;5HE`irKG?A4-j z=yk%IRh4LiZ#I0>7*hY++NlB&qnAbQ_3ru9I}+~rWzpNb#>P*L-XZW=$QRN0X@oa& zo7dF%sYyq;DekpYQ7?=po9}JcnYKN?#!8b`#WGY%SqRVd3_wNG{@WFm_)yV#-7DI}jkP0E2-te8Iq+6wtf}!gP4ab(`e?kWQF7Mn z8g4)z02J?U;Gcz(`N!RkwVs*-^tuSWGQyo-_w4$sFHXHNN_|gxNnFr~7m&NgsejGZ zlQ&g1ReTnQuK$;qw&UVJlQO=sUJy0Zzx$P~m+n5tpnP*wX_z`aE@N=~s1c!Ys$w?z9X{ zl5bxh1%YEaIm7$)tqYqn@?Fln;$=l5!{sQk7v+fzXHHSxlI22q5^u`(!|N47r1Wz| zb$;!6l$=qnbY*QPo*c&ONyvBYnFwbrevQua@M~};xf~tJR#Bz6vtCp;`u+Z|z2Bxw zK>myB3IH;_*K2^17u7o%Fcs$zjNasw7}ub`7+&(fT(JrD^ZS+8gzzS%3~-q?S9mQc zv98F?hI*rSP)ZzPn^WRl=9h%B1#yJ(RQoRFsWZFq(oBYeDsm0`om5aoJ=b!on3?J|gsPS3%I`p}+%sQNe??VN(#bdPC3S;e$@I>Z-Wy+1 zSCTiCt1}7JiPx)x+E8VFqE#j_P?;ZbWd@)!F)s2mI7bxH_bMr>9u`(bnmHgb?IXk?8pp5M1Wb;k2_JNjM7U)JRlvaBz|TD(DJ z=#!~QX*1@yE_TCLp=@n8f1zycGXEoWUB#q9uE7mL#1TFrwwAms1YcCIcxo4?ls`{) z+;lT2H$-WOH&XA~3T&2ogJ+llz2E4XyzSF?rE0G-{*dyz5ULqa#((8b*Fa^hPk?2< z1R`a=GDCrgHn{2n zl(k1Al+|x^nLp30+{P@J(%*Hy`mQ(3s#f2Ii^(EfZ(a6x?# zUt#JKrQ^iwB`>!(DK{xMqZKA9Xojl2;}20ATxO7{K*|2p0ui2b4D)9&@jt72N7?3y zcN^DvI;jOFAO-0Et&k}|ekGXd6QQO0L`xO1&hw@KGY?UlMS4{SNFSj5O9FHsqHdOO zBf*KdIO)g~e^R7#4%7%}B~W~@S{Z_aiCqF>4_5CALBSNg1yqhxGbIK|cpKzJ@`YpCw>u$L~nu_G?5o@czU<{DGg?k(Bkt7ozn-x4+AsRjXKI~;X$ zmDjj=wUVVQKGS49M&I@(ZiNa_bpRS+G&K^n5w}TZlSoRNlP(MuLPQI(u43FEw07v< zBoUq6ek7;;$ddLWx$Q>~6d&*)0PK(;Lu4$Y5EeuWB*9oUI^aQo2|O5@zMnYuP@37; z`Vfu1`io)mu`v7&{rMLC$7t|h*!obDRXm2A zyZ`z9fIP8V@b_W)jeA09elYLaH;kVreR49h{@IhCr#$N#n6dY>s>h;Dw^lw-Zko}Q zKE2)uIA(&=>38t8*2a^W97Rx+6^N4Al$|&pt5W0N9{>LOaYnKCQ%65%#QpEgF-FZe z+WE8hoj)>0RqfqyuwqAi&B5{Sk3ZyXP4bV(Y3f$eq_m>6_zQ%%oOr4n0{^b9}Cua1Bnpxn{AsdR2_uV5sVsHDY|DHv)@w%A#FqH6LL) zWc3swu&@>3`L$4Q_T&4g_^na=A;M`&>N1&VT`2A5>+gubh*Q(JaZ1`&yo$0|bgbQO zyrt%&>csO!bri(5D;qC=q!y*Q7FN$1nkt0z-0LytJyp{bp2B-&^{n$LczpG}@!A}w zLagnKc3QT5W_l|MJ$pf9)hyFmzi>uYEr_YQ7izKzbDRp1wQyTYKf|_#S8iJt;hBl` zh?)aGNHc62e+Unox-)2itcqIOWUM+DKS#fIzyC$uZ9LCdEZpfY)Mc}KiEy88t;=J# zBHZg=s4HQ2DJ)O4*Ue`4wZc8Gy>2GEZJ6t{*WJMGo3J0VC04v%Vd(nmIrP}NW0<;# zx>keUj?-s$KC7PH|GKqupSOq-z%7qq9k*?qGD%HahK%eaYkj>1S&4I%$aGS*fGLYfGJN`+1sQl1 zt0>o5P+X+tFLR=hWX3^Rl$6>X_9ADDm|k4$EGW9&qLdadwTwa`fOJk#Sx#X=o@EKb z^s0?UUCJ+x5%Y@~oU^3Rt_6*Y5e~aEE3d$Dr`_qaXXUy|OMyBocX{FHi<2#Rr3Gbn z%M{D_7*SB<9DjKrVzMQ)@Y80e60Kr{QdnG4vOF1dLgZu%Ra}BB&gCWc?ntuqx+Yte zl@>Vd7JF%FacTEh$(CGaX`zKGUTV+DTi!i91Pg`#Ye>E?lVr~OGA`z2W%kkn1+^^6 zDa~1Gcj76tV!UcrtXN8Oif#|oGB?k@)D>(_jYgq#8v~?HS80*MqU03dDKtr9PL~`^ zNR%BTYlVI@q1k zOKwhKq2!Ti3(?vW%g0&L3hg-#J1RkaSjU>1htAjwO1**{LvMU8(-@1xnd5Xh&Z^husf&JZn@iD zT6}ek=p~t}=*}V>HwY#tahR-)BdB69nMKPi*)nZzs+EU;JD23;7B5|j(V!@AX)$<9 z*o$(ObaxdLekW{!L*|7dcCd<-i|k!x)j{%*iTnWU(p`Qdh{EQF-&G zTbA1M3S3Je=biRk$WOd48lq%50E6Ur6x?mMjB>?@n{x`J{sf>lGB}I1v>K*ya^JrRBTr_st4b#$e{ZW=IcWGW$3EJB3Ot#EKaMpqwZ(uS6YG6U1j1e(nX^sP$ zgRnRXbIR;gt5N7Qcq{crjf-V@VuXb=8H>=Ftfz)TX3QL$UcB_OnK$tl6v*urE#o09 zvoT_gok`Mq^r(q0%dF|kopuMhCgsyZ_&h!QyKtlQVAV!(C8N^-Qv`yMc9Tjp`_5doCWT5o z^BRk@V5yyC4xXgH9Nos@g7*&B(h@4Dra1=#NY_CfMwOHBEQDS=3ga#$!1&3@mgx%? z++eXyn=|*u^lP9|&zl2^vg8hodoyOHFPJCwZ_?{r5Zo-mlXX<0o*J=P3pB64y8c<&-R4Qc&!$l;jr3Z&3+<0}3NF zHv(Kf!GhS@?v^^rcD2b^2?=Je^1;MyG;gm6SsED5RRoaZ+k7F~Wu(Iv3gY{q<3x zj{kQ;KwRNideotKzLoXEWacbQ{c4y*5 z6s~%lYpP8!)t+any~|Yl7%rI9K5A-66jh1m8vm{OaWw#Nu4t0>3CE95UNmJ zyb0&F>QWfj6vj3F(54|<%Olh~4s0zqs(A;teHM%8qx@I*KcL07a_kAXJ94}(jos-m zIl3ukYkP#6abRn^QJr^Ss~Vxs!mm-C1`Pcf!TdV?=j-;c_kDx=t)q4O*uCH2wx6n-%E_k-HT$D2qS0OPmip)c^-inWvR^H4 zR=b+jag)@QSE*}nQ~zw;B6hk(i|RU{PMXm9E*;PP5BpQwChl%Mr5<_jUE}Wmu%i8^ z7ss>X?f>*5_LZ-X0{>en;934wwCEBB=hXiZ+Qe)cH`KDMoDu*3NS)5aC$lTMFm6|L z#XCpP;ps!F&yn-g2&Z-@^>zJD>eNNM8*o4DPzN2qzAAAzj3RVC=>1YA*+ohI|DoCs z=w}^i_0PBF)emU39J3@Dol}lwcP3_UUU25!a~xw*T3oTz*M9q`$!vsP;ypj*(;&n^ zkZ4KQmgPAkI@FKes(+z1Z($#Oe*oS4qWrrk;MuzE--WslZyyEz!zqxKzV+*f&)HmV z;?{pg)JLDx{jN6nKi7TE)3|g6HDc5oznub$5-@%+BJ*F7+3??BTlaY|EBWvq3xqU9|ig-&_{tj3iMIn-%9~$2IlF( z0uy@89Z&8jE4nhA!xJMby4E>=T+yXE6R>jdhI63$r?ecH5b#WX+4F3Jy6q!E_i`EiH8@9+O{3ancFyVb8gzIxRv{~>?VasR49pU<~qa=eJ2yn?@zS4<|r zig*cF0kaP&DKN$0_aARUe7{IhrcYN=gum(WS6_X+$sZRLx3ampxjaQtl$3;330Gf! zwbfd3s^#9?dvkMdZ*6=$Gv)a4l+4E~TH1Z>EfvBTJH~dq6~{v~KgUl<5DEB$AH_2J%=idvwlCXCu^Ss3efT6P zekBQCBw&*bem_U281!c?FSlBSRTLH$vcIse#;v$M0U2?GBT;D!a06n~0>Agi?t2<4xZ0`$yx|)Fic*@}+KYmu26G|xG z(0|#K3zd(vM+xAjoGG6Ks_%*&M~)n6EJyvDo4cBuMVF$iP?Rn-C+LRuY%fGR6t)ZB zlKk@gB|iDhKE>hhDN_X67|EIisE5CDk!VISQJz+%u)I)d6{kR+C5lh%IO+54-?2mN zXl*<49=?+cckI|vIGOXy20mope7Jl#`zc*{b4$r^s^?~j7s2@JqWpl~Dv)}=?g(N^rHW8qep;Rs*nu!4T zwo?rlAJIvO!=N}JWPFM6mnn>&JD!NQuCQ7sQu|RdDhEEOKRV=opO5+~2*6bW9OXef z|I(V*C5BtAEmrGr;tT#q9)Ls{RgM0L5IcOLqH7b(+T7?ajd;f>DnHx2DKUG)o|*&R zNNv)3@w1q;CMt4i{mthUZEd|%N#kkqZ>O4~8=djKoiGpR>Yu*#G^W_QPi87G{Hjb< zQtL&6D2;+0GhbwhNvSI|y*s=^-Sy%KwrKPJ7PMak7em-`zAFUNoln>2M(C S{{hE|TU*4bz)7^O2mcpn#^cif literal 0 HcmV?d00001 diff --git a/SysCore/debug/OSDev.log b/SysCore/debug/OSDev.log new file mode 100644 index 0000000..ae243d1 --- /dev/null +++ b/SysCore/debug/OSDev.log @@ -0,0 +1,292 @@ +00000000000i[ ] Bochs x86 Emulator 2.4.5 +00000000000i[ ] Build from CVS snapshot, on April 25, 2010 +00000000000i[ ] System configuration +00000000000i[ ] processors: 1 (cores=1, HT threads=1) +00000000000i[ ] A20 line support: yes +00000000000i[ ] CPU configuration +00000000000i[ ] level: 6 +00000000000i[ ] SMP support: no +00000000000i[ ] APIC support: yes +00000000000i[ ] FPU support: yes +00000000000i[ ] MMX support: yes +00000000000i[ ] 3dnow! support: no +00000000000i[ ] SEP support: yes +00000000000i[ ] SSE support: sse2 +00000000000i[ ] XSAVE support: no +00000000000i[ ] AES support: no +00000000000i[ ] MOVBE support: no +00000000000i[ ] x86-64 support: yes +00000000000i[ ] 1G paging support: no +00000000000i[ ] MWAIT support: no +00000000000i[ ] VMX support: no +00000000000i[ ] Optimization configuration +00000000000i[ ] RepeatSpeedups support: yes +00000000000i[ ] Trace cache support: yes +00000000000i[ ] Fast function calls: yes +00000000000i[ ] Devices configuration +00000000000i[ ] ACPI support: yes +00000000000i[ ] NE2000 support: yes +00000000000i[ ] PCI support: yes, enabled=yes +00000000000i[ ] SB16 support: yes +00000000000i[ ] USB support: yes +00000000000i[ ] VGA extension support: vbe cirrus +00000000000i[MEM0 ] allocated memory at 027B0020. after alignment, vector=027B1000 +00000000000i[MEM0 ] 32.00MB +00000000000i[MEM0 ] mem block size = 0x00100000, blocks=32 +00000000000i[MEM0 ] rom at 0xe0000/131072 ('BIOS-bochs-latest') +00000000000i[MEM0 ] rom at 0xc0000/40448 ('VGABIOS-lgpl-latest') +00000000000i[CMOS ] Using local time for initial clock +00000000000i[CMOS ] Setting initial clock to: Sat Jul 03 09:26:48 2010 (time0=1278138408) +00000000000i[DMA ] channel 4 used by cascade +00000000000i[DMA ] channel 2 used by Floppy Drive +00000000000i[FDD ] fd0: 'ctaos.img' ro=0, h=2,t=80,spt=18 +00000000000i[PCI ] 440FX Host bridge present at device 0, function 0 +00000000000i[PCI ] PIIX3 PCI-to-ISA bridge present at device 1, function 0 +00000000000i[MEM0 ] Register memory access handlers: 0x000a0000 - 0x000bffff +00000000000i[WGUI ] Desktop Window dimensions: 1366 x 768 +00000000000i[WGUI ] Number of Mouse Buttons = 5 +00000000000i[WGUI ] IME disabled +00000000000i[MEM0 ] Register memory access handlers: 0xe0000000 - 0xe0ffffff +00000000000i[CLVGA] VBE Bochs Display Extension Enabled +00000000000i[CLVGA] interval=50000 +00000000000i[ ] init_dev of 'unmapped' plugin device by virtual method +00000000000i[ ] init_dev of 'biosdev' plugin device by virtual method +00000000000i[ ] init_dev of 'speaker' plugin device by virtual method +00000000000i[ ] init_dev of 'extfpuirq' plugin device by virtual method +00000000000i[ ] init_dev of 'gameport' plugin device by virtual method +00000000000i[ ] init_dev of 'pci_ide' plugin device by virtual method +00000000000i[PCI ] PIIX3 PCI IDE controller present at device 1, function 1 +00000000000i[ ] init_dev of 'acpi' plugin device by virtual method +00000000000i[PCI ] ACPI Controller present at device 1, function 3 +00000000000i[ ] init_dev of 'ioapic' plugin device by virtual method +00000000000i[IOAP ] initializing I/O APIC +00000000000i[MEM0 ] Register memory access handlers: 0xfec00000 - 0xfec00fff +00000000000i[ ] init_dev of 'keyboard' plugin device by virtual method +00000000000i[KBD ] will paste characters every 1000 keyboard ticks +00000000000i[ ] init_dev of 'harddrv' plugin device by virtual method +00000000000i[HD ] Using boot sequence floppy, none, none +00000000000i[HD ] Floppy boot signature check is enabled +00000000000i[ ] init_dev of 'serial' plugin device by virtual method +00000000000i[SER ] com1 at 0x03f8 irq 4 +00000000000i[ ] init_dev of 'parallel' plugin device by virtual method +00000000000i[PAR ] parallel port 1 at 0x0378 irq 7 +00000000000i[ ] register state of 'unmapped' plugin device by virtual method +00000000000i[ ] register state of 'biosdev' plugin device by virtual method +00000000000i[ ] register state of 'speaker' plugin device by virtual method +00000000000i[ ] register state of 'extfpuirq' plugin device by virtual method +00000000000i[ ] register state of 'gameport' plugin device by virtual method +00000000000i[ ] register state of 'pci_ide' plugin device by virtual method +00000000000i[ ] register state of 'acpi' plugin device by virtual method +00000000000i[ ] register state of 'ioapic' plugin device by virtual method +00000000000i[ ] register state of 'keyboard' plugin device by virtual method +00000000000i[ ] register state of 'harddrv' plugin device by virtual method +00000000000i[ ] register state of 'serial' plugin device by virtual method +00000000000i[ ] register state of 'parallel' plugin device by virtual method +00000000000i[SYS ] bx_pc_system_c::Reset(HARDWARE) called +00000000000i[CPU0 ] cpu hardware reset +00000000000i[APIC0] allocate APIC id=0 (MMIO enabled) to 0xfee00000 +00000000000i[CPU0 ] CPUID[0x00000000]: 00000003 756e6547 6c65746e 49656e69 +00000000000i[CPU0 ] CPUID[0x00000001]: 00000f20 00000800 00002000 078bfbff +00000000000i[CPU0 ] CPUID[0x00000002]: 00410601 00000000 00000000 00000000 +00000000000i[CPU0 ] CPUID[0x00000003]: 00000000 00000000 00000000 00000000 +00000000000i[CPU0 ] CPUID[0x00000004]: 00000000 00000000 00000000 00000000 +00000000000i[CPU0 ] CPUID[0x80000000]: 80000008 00000000 00000000 00000000 +00000000000i[CPU0 ] CPUID[0x80000001]: 00000000 00000000 00000101 2a100800 +00000000000i[CPU0 ] CPUID[0x80000002]: 20202020 20202020 20202020 6e492020 +00000000000i[CPU0 ] CPUID[0x80000003]: 286c6574 50202952 69746e65 52286d75 +00000000000i[CPU0 ] CPUID[0x80000004]: 20342029 20555043 20202020 00202020 +00000000000i[CPU0 ] CPUID[0x80000006]: 00000000 42004200 02008140 00000000 +00000000000i[CPU0 ] CPUID[0x80000007]: 00000000 00000000 00000000 00000000 +00000000000i[CPU0 ] CPUID[0x80000008]: 00003020 00000000 00000000 00000000 +00000000000i[ ] reset of 'unmapped' plugin device by virtual method +00000000000i[ ] reset of 'biosdev' plugin device by virtual method +00000000000i[ ] reset of 'speaker' plugin device by virtual method +00000000000i[ ] reset of 'extfpuirq' plugin device by virtual method +00000000000i[ ] reset of 'gameport' plugin device by virtual method +00000000000i[ ] reset of 'pci_ide' plugin device by virtual method +00000000000i[ ] reset of 'acpi' plugin device by virtual method +00000000000i[ ] reset of 'ioapic' plugin device by virtual method +00000000000i[ ] reset of 'keyboard' plugin device by virtual method +00000000000i[ ] reset of 'harddrv' plugin device by virtual method +00000000000i[ ] reset of 'serial' plugin device by virtual method +00000000000i[ ] reset of 'parallel' plugin device by virtual method +00000003305i[BIOS ] $Revision: 1.247 $ $Date: 2010/04/04 19:33:50 $ +00000200000i[WGUI ] dimension update x=720 y=400 fontheight=16 fontwidth=9 bpp=8 +00000318042i[KBD ] reset-disable command received +00000444800i[VBIOS] VGABios $Id: vgabios.c,v 1.69 2009/04/07 18:18:20 vruppert Exp $ +00000444871i[CLVGA] VBE known Display Interface b0c0 +00000444903i[CLVGA] VBE known Display Interface b0c5 +00000447828i[VBIOS] VBE Bios $Id: vbe.c,v 1.62 2009/01/25 15:46:25 vruppert Exp $ +00000760517i[BIOS ] Starting rombios32 +00000761014i[BIOS ] Shutdown flag 0 +00000761695i[BIOS ] ram_size=0x02000000 +00000762173i[BIOS ] ram_end=32MB +00000802745i[BIOS ] Found 1 cpu(s) +00000822014i[BIOS ] bios_table_addr: 0x000fbc18 end=0x000fcc00 +00000822117i[PCI ] 440FX PMC write to PAM register 59 (TLB Flush) +00001149814i[PCI ] 440FX PMC write to PAM register 59 (TLB Flush) +00001477742i[P2I ] PCI IRQ routing: PIRQA# set to 0x0b +00001477763i[P2I ] PCI IRQ routing: PIRQB# set to 0x09 +00001477784i[P2I ] PCI IRQ routing: PIRQC# set to 0x0b +00001477805i[P2I ] PCI IRQ routing: PIRQD# set to 0x09 +00001477815i[P2I ] write: ELCR2 = 0x0a +00001478700i[BIOS ] PIIX3/PIIX4 init: elcr=00 0a +00001486658i[BIOS ] PCI: bus=0 devfn=0x00: vendor_id=0x8086 device_id=0x1237 class=0x0600 +00001489220i[BIOS ] PCI: bus=0 devfn=0x08: vendor_id=0x8086 device_id=0x7000 class=0x0601 +00001491621i[BIOS ] PCI: bus=0 devfn=0x09: vendor_id=0x8086 device_id=0x7010 class=0x0101 +00001491851i[PIDE ] new BM-DMA address: 0xc000 +00001492555i[BIOS ] region 4: 0x0000c000 +00001494865i[BIOS ] PCI: bus=0 devfn=0x0b: vendor_id=0x8086 device_id=0x7113 class=0x0680 +00001495103i[ACPI ] new irq line = 11 +00001495117i[ACPI ] new irq line = 9 +00001495147i[ACPI ] new PM base address: 0xb000 +00001495161i[ACPI ] new SM base address: 0xb100 +00001495189i[PCI ] setting SMRAM control register to 0x4a +00001659283i[CPU0 ] Enter to System Management Mode +00001659293i[CPU0 ] RSM: Resuming from System Management Mode +00001823313i[PCI ] setting SMRAM control register to 0x0a +00001832484i[BIOS ] MP table addr=0x000fbcf0 MPC table addr=0x000fbc20 size=0xd0 +00001834543i[BIOS ] SMBIOS table addr=0x000fbd00 +00001836931i[BIOS ] ACPI tables: RSDP addr=0x000fbe20 ACPI DATA addr=0x01ff0000 size=0x988 +00001840169i[BIOS ] Firmware waking vector 0x1ff00cc +00001851282i[PCI ] 440FX PMC write to PAM register 59 (TLB Flush) +00001852126i[BIOS ] bios_table_cur_addr: 0x000fbe44 +00014041543i[BIOS ] Booting from 0000:7c00 +00019105039i[KBD ] setting typematic info +00019105052i[KBD ] setting delay to 500 mS (unused) +00019105052i[KBD ] setting repeat rate to 10.9 cps (unused) +00019105085i[KBD ] Switched to scancode set 2 +00019105160i[KBD ] keyboard: scan convert turned off +00019184168e[CPU0 ] interrupt(): gate.type(1) != {5,6,7,14,15} +00019184168e[CPU0 ] interrupt(): gate descriptor is not valid sys seg (vector=0x0d) +00019184168e[CPU0 ] interrupt(): gate.type(1) != {5,6,7,14,15} +00019184168i[CPU0 ] CPU is in protected mode (active) +00019184168i[CPU0 ] CS.d_b = 32 bit +00019184168i[CPU0 ] SS.d_b = 32 bit +00019184168i[CPU0 ] EFER = 0x00000000 +00019184168i[CPU0 ] | RAX=00000000000011a5 RBX=0000000000001116 +00019184168i[CPU0 ] | RCX=000000000010a977 RDX=0000000000000eea +00019184168i[CPU0 ] | RSP=000000000008ffc8 RBP=0000000000003000 +00019184168i[CPU0 ] | RSI=00000000000000ff RDI=0000000000105001 +00019184168i[CPU0 ] | R8=0000000000000000 R9=0000000000000000 +00019184168i[CPU0 ] | R10=0000000000000000 R11=0000000000000000 +00019184168i[CPU0 ] | R12=0000000000000000 R13=0000000000000000 +00019184168i[CPU0 ] | R14=0000000000000000 R15=0000000000000000 +00019184168i[CPU0 ] | IOPL=0 id vip vif ac vm RF nt of df IF tf sf zf AF PF cf +00019184168i[CPU0 ] | SEG selector base limit G D +00019184168i[CPU0 ] | SEG sltr(index|ti|rpl) base limit G D +00019184168i[CPU0 ] | CS:0008( 0001| 0| 0) 00000000 ffffffff 1 1 +00019184168i[CPU0 ] | DS:0010( 0002| 0| 0) 00000000 ffffffff 1 1 +00019184168i[CPU0 ] | SS:0010( 0002| 0| 0) 00000000 ffffffff 1 1 +00019184168i[CPU0 ] | ES:0010( 0002| 0| 0) 00000000 ffffffff 1 1 +00019184168i[CPU0 ] | FS:0010( 0002| 0| 0) 00000000 ffffffff 1 1 +00019184168i[CPU0 ] | GS:0010( 0002| 0| 0) 00000000 ffffffff 1 1 +00019184168i[CPU0 ] | MSR_FS_BASE:0000000000000000 +00019184168i[CPU0 ] | MSR_GS_BASE:0000000000000000 +00019184168i[CPU0 ] | RIP=00000000001030d7 (00000000001030d7) +00019184168i[CPU0 ] | CR0=0x60000011 CR2=0x0000000000000000 +00019184168i[CPU0 ] | CR3=0x00000000 CR4=0x00000000 +00019184168i[CPU0 ] 0x00000000001030d7>> jnz .-25 (0x001030c0) : 75E7 +00019184168e[CPU0 ] exception(): 3rd (13) exception with no resolution, shutdown status is 00h, resetting +00019184168i[SYS ] bx_pc_system_c::Reset(HARDWARE) called +00019184168i[CPU0 ] cpu hardware reset +00019184168i[APIC0] allocate APIC id=0 (MMIO enabled) to 0xfee00000 +00019184168i[CPU0 ] CPUID[0x00000000]: 00000003 756e6547 6c65746e 49656e69 +00019184168i[CPU0 ] CPUID[0x00000001]: 00000f20 00000800 00002000 078bfbff +00019184168i[CPU0 ] CPUID[0x00000002]: 00410601 00000000 00000000 00000000 +00019184168i[CPU0 ] CPUID[0x00000003]: 00000000 00000000 00000000 00000000 +00019184168i[CPU0 ] CPUID[0x00000004]: 00000000 00000000 00000000 00000000 +00019184168i[CPU0 ] CPUID[0x80000000]: 80000008 00000000 00000000 00000000 +00019184168i[CPU0 ] CPUID[0x80000001]: 00000000 00000000 00000101 2a100800 +00019184168i[CPU0 ] CPUID[0x80000002]: 20202020 20202020 20202020 6e492020 +00019184168i[CPU0 ] CPUID[0x80000003]: 286c6574 50202952 69746e65 52286d75 +00019184168i[CPU0 ] CPUID[0x80000004]: 20342029 20555043 20202020 00202020 +00019184168i[CPU0 ] CPUID[0x80000006]: 00000000 42004200 02008140 00000000 +00019184168i[CPU0 ] CPUID[0x80000007]: 00000000 00000000 00000000 00000000 +00019184168i[CPU0 ] CPUID[0x80000008]: 00003020 00000000 00000000 00000000 +00019184168i[ ] reset of 'unmapped' plugin device by virtual method +00019184168i[ ] reset of 'biosdev' plugin device by virtual method +00019184168i[ ] reset of 'speaker' plugin device by virtual method +00019184168i[ ] reset of 'extfpuirq' plugin device by virtual method +00019184168i[ ] reset of 'gameport' plugin device by virtual method +00019184168i[ ] reset of 'pci_ide' plugin device by virtual method +00019184168i[ ] reset of 'acpi' plugin device by virtual method +00019184168i[ ] reset of 'ioapic' plugin device by virtual method +00019184168i[ ] reset of 'keyboard' plugin device by virtual method +00019184168i[ ] reset of 'harddrv' plugin device by virtual method +00019184168i[ ] reset of 'serial' plugin device by virtual method +00019184168i[ ] reset of 'parallel' plugin device by virtual method +00019187474i[BIOS ] $Revision: 1.247 $ $Date: 2010/04/04 19:33:50 $ +00019502059i[KBD ] reset-disable command received +00019628817i[VBIOS] VGABios $Id: vgabios.c,v 1.69 2009/04/07 18:18:20 vruppert Exp $ +00019628888i[CLVGA] VBE known Display Interface b0c0 +00019628920i[CLVGA] VBE known Display Interface b0c5 +00019631845i[VBIOS] VBE Bios $Id: vbe.c,v 1.62 2009/01/25 15:46:25 vruppert Exp $ +00019944534i[BIOS ] Starting rombios32 +00019945031i[BIOS ] Shutdown flag 0 +00019945712i[BIOS ] ram_size=0x02000000 +00019946190i[BIOS ] ram_end=32MB +00019986786i[BIOS ] Found 1 cpu(s) +00020006055i[BIOS ] bios_table_addr: 0x000fbc18 end=0x000fcc00 +00020006158i[PCI ] 440FX PMC write to PAM register 59 (TLB Flush) +00020333855i[PCI ] 440FX PMC write to PAM register 59 (TLB Flush) +00020661783i[P2I ] PCI IRQ routing: PIRQA# set to 0x0b +00020661804i[P2I ] PCI IRQ routing: PIRQB# set to 0x09 +00020661825i[P2I ] PCI IRQ routing: PIRQC# set to 0x0b +00020661846i[P2I ] PCI IRQ routing: PIRQD# set to 0x09 +00020661856i[P2I ] write: ELCR2 = 0x0a +00020662741i[BIOS ] PIIX3/PIIX4 init: elcr=00 0a +00020670699i[BIOS ] PCI: bus=0 devfn=0x00: vendor_id=0x8086 device_id=0x1237 class=0x0600 +00020673261i[BIOS ] PCI: bus=0 devfn=0x08: vendor_id=0x8086 device_id=0x7000 class=0x0601 +00020675662i[BIOS ] PCI: bus=0 devfn=0x09: vendor_id=0x8086 device_id=0x7010 class=0x0101 +00020676596i[BIOS ] region 4: 0x0000c000 +00020678906i[BIOS ] PCI: bus=0 devfn=0x0b: vendor_id=0x8086 device_id=0x7113 class=0x0680 +00020679144i[ACPI ] new irq line = 11 +00020679158i[ACPI ] new irq line = 9 +00020679230i[PCI ] setting SMRAM control register to 0x4a +00020843324i[CPU0 ] Enter to System Management Mode +00020843334i[CPU0 ] RSM: Resuming from System Management Mode +00021007354i[PCI ] setting SMRAM control register to 0x0a +00021016525i[BIOS ] MP table addr=0x000fbcf0 MPC table addr=0x000fbc20 size=0xd0 +00021018584i[BIOS ] SMBIOS table addr=0x000fbd00 +00021020972i[BIOS ] ACPI tables: RSDP addr=0x000fbe20 ACPI DATA addr=0x01ff0000 size=0x988 +00021024210i[BIOS ] Firmware waking vector 0x1ff00cc +00021035323i[PCI ] 440FX PMC write to PAM register 59 (TLB Flush) +00021036167i[BIOS ] bios_table_cur_addr: 0x000fbe44 +00033225716i[BIOS ] Booting from 0000:7c00 +00038289036i[KBD ] setting typematic info +00038289049i[KBD ] setting delay to 500 mS (unused) +00038289049i[KBD ] setting repeat rate to 10.9 cps (unused) +00038289082i[KBD ] Switched to scancode set 2 +00038289157i[KBD ] keyboard: scan convert turned off +00220440000p[WGUI ] >>PANIC<< POWER button turned off. +00220440000i[CPU0 ] CPU is in protected mode (active) +00220440000i[CPU0 ] CS.d_b = 32 bit +00220440000i[CPU0 ] SS.d_b = 32 bit +00220440000i[CPU0 ] EFER = 0x00000000 +00220440000i[CPU0 ] | RAX=0000000000000700 RBX=000000000008ffa0 +00220440000i[CPU0 ] | RCX=00000000000b8000 RDX=00000000000bf01c +00220440000i[CPU0 ] | RSP=000000000008ff20 RBP=0000000000003000 +00220440000i[CPU0 ] | RSI=0000000000008000 RDI=0000000000000028 +00220440000i[CPU0 ] | R8=0000000000000000 R9=0000000000000000 +00220440000i[CPU0 ] | R10=0000000000000000 R11=0000000000000000 +00220440000i[CPU0 ] | R12=0000000000000000 R13=0000000000000000 +00220440000i[CPU0 ] | R14=0000000000000000 R15=0000000000000000 +00220440000i[CPU0 ] | IOPL=0 id vip vif ac vm rf nt of df if tf sf zf af pf cf +00220440000i[CPU0 ] | SEG selector base limit G D +00220440000i[CPU0 ] | SEG sltr(index|ti|rpl) base limit G D +00220440000i[CPU0 ] | CS:0008( 0001| 0| 0) 00000000 ffffffff 1 1 +00220440000i[CPU0 ] | DS:0010( 0002| 0| 0) 00000000 ffffffff 1 1 +00220440000i[CPU0 ] | SS:0010( 0002| 0| 0) 00000000 ffffffff 1 1 +00220440000i[CPU0 ] | ES:0010( 0002| 0| 0) 00000000 ffffffff 1 1 +00220440000i[CPU0 ] | FS:0010( 0002| 0| 0) 00000000 ffffffff 1 1 +00220440000i[CPU0 ] | GS:0010( 0002| 0| 0) 00000000 ffffffff 1 1 +00220440000i[CPU0 ] | MSR_FS_BASE:0000000000000000 +00220440000i[CPU0 ] | MSR_GS_BASE:0000000000000000 +00220440000i[CPU0 ] | RIP=0000000000102a49 (0000000000102a49) +00220440000i[CPU0 ] | CR0=0x60000011 CR2=0x0000000000000000 +00220440000i[CPU0 ] | CR3=0x00000000 CR4=0x00000000 +00220440000i[CPU0 ] 0x0000000000102a49>> jmp .-2 (0x00102a49) : EBFE +00220440000i[CMOS ] Last time is 1278138462 (Sat Jul 03 09:27:42 2010) +00220440000i[ ] restoring default signal behavior +00220440000i[CTRL ] quit_sim called with exit code 1 diff --git a/SysCore/debug/VGABIOS-lgpl-latest b/SysCore/debug/VGABIOS-lgpl-latest new file mode 100644 index 0000000000000000000000000000000000000000..a6c56a569ef143742fc019b059f1602564f9463b GIT binary patch literal 40448 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 c=cw2Zq1Wn-fxFiPSpn#O@Tw{P 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 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk w1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBoL|GmKf3kFKQm;e9( literal 0 HcmV?d00001 diff --git a/SysCore/hal/cmos/cmos.c b/SysCore/hal/cmos/cmos.c new file mode 100644 index 0000000..4a05ac8 --- /dev/null +++ b/SysCore/hal/cmos/cmos.c @@ -0,0 +1,92 @@ +#include +#include +#include "cmos.h" + +volatile byte i86_cmos_data[128]; + +void i86_cmos_write () +{ + byte i; + for (i = 0; i < 128; i++) { + //asm volatile ("cli"); + outportb(0x70, i); + iowait(); + outportb(0x71, i86_cmos_data[i]); + //asm volatile ("sti"); + } +} + +void i86_cmos_read () +{ + byte i; + for (i = 0; i < 128; i++) { + //asm volatile ("cli"); + outportb(0x70, i); + iowait(); + i86_cmos_data[i] = inportb(0x71); + //asm volatile ("sti"); + } +} + +void i86_cmos_read_clock(TIME* tim) +{ + i86_cmos_read(); + + if ((i86_cmos_data[0x0b]&4)==0) // BCD = true; + { + tim->seconds = (i86_cmos_data[0x00]%16) + 10*(i86_cmos_data[0x00]/16); + tim->minutes = (i86_cmos_data[0x02]%16) + 10*(i86_cmos_data[0x02]/16); + if ((i86_cmos_data[0x0b]&2)==0) { // AM/PM + if (i86_cmos_data[0x04]&80) { // pm + tim->hours = ((i86_cmos_data[0x04]-0x80)%16) + 10*((i86_cmos_data[0x04]-0x80)/16); + tim->am_pm = 1; + } + else { // am + tim->hours = (i86_cmos_data[0x04]%16) + 10*(i86_cmos_data[0x04]/16); + tim->am_pm = 0; + } + } + else { // 24 hours + tim->hours = (i86_cmos_data[0x04]%16) + 10*(i86_cmos_data[0x04]/16); + if (tim->hours > 12) { + tim->am_pm = 1; + tim->hours -= 12; + } + else tim->am_pm = 0; + } + + tim->weekday = (i86_cmos_data[0x06]%16) + 10*(i86_cmos_data[0x06]/16); + tim->day = (i86_cmos_data[0x07]%16) + 10*(i86_cmos_data[0x07]/16); + tim->month = (i86_cmos_data[0x08]%16) + 10*(i86_cmos_data[0x08]/16); + tim->year = (i86_cmos_data[0x09]%16) + 10*(i86_cmos_data[0x09]/16); + tim->century = (i86_cmos_data[0x32]%16) + 10*(i86_cmos_data[0x32]/16); + } + + else {//BCD = false; + tim->seconds = i86_cmos_data[0x00]; + tim->minutes = i86_cmos_data[0x02]; + if ((i86_cmos_data[0x0b]&2)==0) { // AM/PM + if (i86_cmos_data[0x04]&80) { // pm + tim->hours = i86_cmos_data[0x04]-0x80; + tim->am_pm = 1; + } + else { // am + tim->hours = i86_cmos_data[0x04]; + tim->am_pm = 0; + } + } + else { // 24 hours + tim->hours = i86_cmos_data[0x02]; + if (tim->hours > 12) { + tim->am_pm = 1; + tim->hours -= 12; + } + else tim->am_pm = 0; + } + tim->weekday = i86_cmos_data[0x06]; + tim->day = i86_cmos_data[0x07]; + tim->month = i86_cmos_data[0x08]; + tim->year = i86_cmos_data[0x09]; + tim->century = i86_cmos_data[0x32]; + } +} diff --git a/SysCore/hal/cmos/cmos.h b/SysCore/hal/cmos/cmos.h new file mode 100644 index 0000000..afc2a1b --- /dev/null +++ b/SysCore/hal/cmos/cmos.h @@ -0,0 +1,10 @@ +#ifndef __CMOS_H +#define __CMOS_H + +extern volatile byte i86_cmos_data[128]; + +extern void i86_cmos_write (); +extern void i86_cmos_read (); +extern void i86_cmos_read_clock (TIME *tim); + +#endif \ No newline at end of file diff --git a/SysCore/hal/cmos/compile.bat b/SysCore/hal/cmos/compile.bat new file mode 100644 index 0000000..661bb3d --- /dev/null +++ b/SysCore/hal/cmos/compile.bat @@ -0,0 +1,18 @@ +@echo off +rem The name of the loader assembly file (without extension, must be .asm): +set loader_name=loader + +rem NASM and DJGPP executable paths: +set nasm_path=C:\nasm +set djgpp_path=C:\DJGPP\bin +set objpath=../../objects +set incpath=../../include + +@echo on +%djgpp_path%\gcc.exe -Wall -O -fstrength-reduce -fomit-frame-pointer -nostdinc -fno-builtin -I%incpath% -c -o %objpath%/cmos.o cmos.c + +@echo off +@echo . +@echo Done! + +@pause diff --git a/SysCore/hal/compile.bat b/SysCore/hal/compile.bat new file mode 100644 index 0000000..657741e --- /dev/null +++ b/SysCore/hal/compile.bat @@ -0,0 +1,43 @@ +@echo off + +set loader_name=loader +set nasm_path=C:\nasm +set djgpp_path=C:\DJGPP\bin + + +@echo ***************** CTA KERNEL ***************** + +:KernelEntry + @echo. + @echo Building Kernel entry... + @echo * Compiling kernel loader... + %nasm_path%\nasm.exe -f aout -o ./objects/%loader_name%.o %loader_name%.asm + + @echo * Compiling kernel main... + %djgpp_path%\gcc.exe -Wall -O -fstrength-reduce -fomit-frame-pointer -nostdinc -fno-builtin -I./include -c -o ./objects/main.o main.c + + +:KernelSTDLIB + cd lib + call compile.bat + cd.. + +:KernelMemoryManager + cd memory + call compile.bat + cd.. + + +rem here go other sources: + +rem here go other sources ^ + +:Finish + cd objects + @echo Linking... + %djgpp_path%\ld -T link.ld + @echo. + + echo Copying to floppy drive... + copy KERNEL.BIN A:\KERNEL.CTA + cd.. \ No newline at end of file diff --git a/SysCore/hal/cpu/compile.bat b/SysCore/hal/cpu/compile.bat new file mode 100644 index 0000000..ee6f8eb --- /dev/null +++ b/SysCore/hal/cpu/compile.bat @@ -0,0 +1,18 @@ +@echo off +rem The name of the loader assembly file (without extension, must be .asm): +set loader_name=loader + +rem NASM and DJGPP executable paths: +set nasm_path=C:\nasm +set djgpp_path=C:\DJGPP\bin +set objpath=../../objects +set incpath=../../include + +@echo on +%djgpp_path%\gcc.exe -Wall -O -fstrength-reduce -fomit-frame-pointer -nostdinc -fno-builtin -I%incpath% -c -o %objpath%/cpu.o cpu.c + +@echo off +@echo . +@echo Done! + +@pause diff --git a/SysCore/hal/cpu/cpu.c b/SysCore/hal/cpu/cpu.c new file mode 100644 index 0000000..aa12acf --- /dev/null +++ b/SysCore/hal/cpu/cpu.c @@ -0,0 +1,35 @@ +#include +#include "cpu.h" +#include "../gdt/gdt.h" +#include "../idt/idt.h" +#define cpuid(in, a, b, c, d) __asm__("cpuid": "=a" (a), "=b" (b), "=c" (c), "=d" (d) : "a" (in)); + + + +// initializes cpu resources +void i86_cpu_initialize() +{ + // initialize processor tables + i86_gdt_install(); + i86_idt_install(); +} + +void i86_cpu_shutdown() +{ + +} + +char* i86_cpu_get_vender() +{ + static char vender[13]; + dword unused, arr[3]; + int i; + + cpuid(0, unused, arr[0], arr[2], arr[1]); + + for (i=0; i<12; i++) + vender[i] = (arr[i/4]>>(i%4*8)) && 0xFF; + + vender[12] = 0; + return vender; +} \ No newline at end of file diff --git a/SysCore/hal/cpu/cpu.h b/SysCore/hal/cpu/cpu.h new file mode 100644 index 0000000..8caf72c --- /dev/null +++ b/SysCore/hal/cpu/cpu.h @@ -0,0 +1,29 @@ +#ifndef _CPU_H_INCLUDED +#define _CPU_H_INCLUDED +//**************************************************************************** +//** +//** cpu.h +//** +//** This is the processor interface. Everything outside of this module +//** must use this interface when working on processor data. +//** +//** A processor is a module that manages the very basic data structures +//** and data within the system. The processor interface provides the interface +//** for managing processors, processor cores, accessing processor structures, +//** and more +//** +//**************************************************************************** + +#include +#include + +//! initialize the processors +extern void i86_cpu_initialize (); + +//! shutdown the processors +extern void i86_cpu_shutdown (); + +//! get cpu vender +extern char* i86_cpu_get_vender (); + +#endif diff --git a/SysCore/hal/gdt/compile.bat b/SysCore/hal/gdt/compile.bat new file mode 100644 index 0000000..fe3a0e1 --- /dev/null +++ b/SysCore/hal/gdt/compile.bat @@ -0,0 +1,19 @@ +@echo off +rem The name of the loader assembly file (without extension, must be .asm): +set loader_name=loader + +rem NASM and DJGPP executable paths: +set nasm_path=C:\nasm +set djgpp_path=C:\DJGPP\bin +set objpath=../../objects +set incpath=../../include + +@echo on +%nasm_path%\nasm.exe -f aout -o %objpath%/gdt_asm.o gdt.asm +%djgpp_path%\gcc.exe -Wall -O -fstrength-reduce -fomit-frame-pointer -nostdinc -fno-builtin -I%incpath% -c -o %objpath%/gdt.o gdt.c + +@echo off +@echo . +@echo Done! + +@pause diff --git a/SysCore/hal/gdt/gdt.asm b/SysCore/hal/gdt/gdt.asm new file mode 100644 index 0000000..5b75ce9 --- /dev/null +++ b/SysCore/hal/gdt/gdt.asm @@ -0,0 +1,20 @@ +bits 32 +; !!! GDT !!! +; This will set up our new segment registers. We need to do +; something special in order to set CS. We do what is called a +; far jump. A jump that includes a segment as well as an offset. +; This is declared in C as 'extern void gdt_flush();' + +global _i86_gdt_flush ; Allows the C code to link to this +extern _gp ; Says that '_gp' is in another file +_i86_gdt_flush: + lgdt [_gp] ; Load the GDT with our '_gp' which is a special pointer + mov ax, 0x10 ; 0x10 is the offset in the GDT to our data segment + mov ds, ax + mov es, ax + mov fs, ax + mov gs, ax + mov ss, ax + jmp 0x08:flush2 ; 0x08 is the offset to our code segment: Far jump! +flush2: + ret ; Returns back to the C code! diff --git a/kernel/kernel/gdt.c b/SysCore/hal/gdt/gdt.c similarity index 59% rename from kernel/kernel/gdt.c rename to SysCore/hal/gdt/gdt.c index 12638ec..b773104 100644 --- a/kernel/kernel/gdt.c +++ b/SysCore/hal/gdt/gdt.c @@ -1,36 +1,17 @@ -#include - -/* Defines a GDT entry. We say packed, because it prevents the -* compiler from doing things that it thinks is best: Prevent -* compiler "optimization" by packing */ -struct gdt_entry -{ - unsigned short limit_low; - unsigned short base_low; - unsigned char base_middle; - unsigned char access; - unsigned char granularity; - unsigned char base_high; -} __attribute__((packed)); - -/* Special pointer which includes the limit: The max bytes -* taken up by the GDT, minus 1. Again, this NEEDS to be packed */ -struct gdt_ptr -{ - unsigned short limit; - unsigned int base; -} __attribute__((packed)); +/****************************************************************** + * gdt.c - GLOBAL DESCRIPTOR TABLE * + * Contains function prototypes for setting up the GDT * + ******************************************************************/ +#define MAX_DESCRIPTORS 3 +#include "gdt.h" /* Our GDT, with 3 entries, and finally our special GDT pointer */ struct gdt_entry gdt[3]; struct gdt_ptr gp; -/* This will be a function in start.asm. We use this to properly -* reload the new segment registers */ -extern void gdt_flush(); /* Setup a descriptor in the Global Descriptor Table */ -void gdt_set_gate(int num, unsigned long base, unsigned long limit, unsigned char access, unsigned char gran) +void i86_gdt_set_gate(int num, unsigned long base, unsigned long limit, unsigned char access, unsigned char gran) { /* Setup the descriptor base address */ gdt[num].base_low = (base & 0xFFFF); @@ -46,33 +27,39 @@ void gdt_set_gate(int num, unsigned long base, unsigned long limit, unsigned cha gdt[num].access = access; } +struct gdt_entry* i86_gdt_get_gate(int num) +{ + if (num>MAX_DESCRIPTORS) return 0; + return &gdt[num]; +} + /* Should be called by main. This will setup the special GDT * pointer, set up the first 3 entries in our GDT, and then * finally call gdt_flush() in our assembler file in order * to tell the processor where the new GDT is and update the * new segment registers */ -void gdt_install() +void i86_gdt_install() { /* Setup the GDT pointer and limit */ gp.limit = (sizeof(struct gdt_entry) * 3) - 1; - gp.base = &gdt; + gp.base = (unsigned int)&gdt; /* Our NULL descriptor */ - gdt_set_gate(0, 0, 0, 0, 0); + i86_gdt_set_gate(0, 0, 0, 0, 0); /* The second entry is our Code Segment. The base address * is 0, the limit is 4GBytes, it uses 4KByte granularity, * uses 32-bit opcodes, and is a Code Segment descriptor. * Please check the table above in the tutorial in order * to see exactly what each value means */ - gdt_set_gate(1, 0, 0xFFFFFFFF, 0x9A, 0xCF); + i86_gdt_set_gate(1, 0, 0xFFFFFFFF, 0x9A, 0xCF); /* The third entry is our Data Segment. It's EXACTLY the * same as our code segment, but the descriptor type in * this entry's access byte says it's a Data Segment */ - gdt_set_gate(2, 0, 0xFFFFFFFF, 0x92, 0xCF); + i86_gdt_set_gate(2, 0, 0xFFFFFFFF, 0x92, 0xCF); /* Flush out the old GDT and install the new changes! */ - gdt_flush(); + i86_gdt_flush(); } \ No newline at end of file diff --git a/SysCore/hal/gdt/gdt.h b/SysCore/hal/gdt/gdt.h new file mode 100644 index 0000000..d593f99 --- /dev/null +++ b/SysCore/hal/gdt/gdt.h @@ -0,0 +1,39 @@ +/****************************************************************** + * gdt.h - GLOBAL DESCRIPTOR TABLE * + * Contains structures and function declarations for GDT * + ******************************************************************/ + +#ifndef __GDT_H +#define __GDT_H + +/* Defines a GDT entry. We say packed, because it prevents the +* compiler from doing things that it thinks is best: Prevent +* compiler "optimization" by packing */ +struct gdt_entry +{ + unsigned short limit_low; + unsigned short base_low; + unsigned char base_middle; + unsigned char access; + unsigned char granularity; + unsigned char base_high; +} __attribute__((packed)); + +/* Special pointer which includes the limit: The max bytes +* taken up by the GDT, minus 1. Again, this NEEDS to be packed */ +struct gdt_ptr +{ + unsigned short limit; + unsigned int base; +} __attribute__((packed)); + + +/* This will be a function in start.asm. We use this to properly +* reload the new segment registers */ +extern void i86_gdt_flush(); +extern void i86_gdt_set_gate(int num, unsigned long base, unsigned long limit, unsigned char access, unsigned char gran); +extern struct gdt_entry* i86_gdt_get_gate(int num); + +extern void i86_gdt_install(); + +#endif \ No newline at end of file diff --git a/SysCore/hal/hal.c b/SysCore/hal/hal.c new file mode 100644 index 0000000..ffcccfa --- /dev/null +++ b/SysCore/hal/hal.c @@ -0,0 +1,184 @@ +#include +#include +#include +#include "cpu/cpu.h" +#include "gdt/gdt.h" +#include "idt/idt.h" +#include "pic/pic.h" +#include "pit/pit.h" +#include "cmos/cmos.h" +#include "irq/irq.h" +#include "isrs/isrs.h" +#include "keyboard/keyus.h" + +// initialize hardware devices +void i86_hal_initialize () { + + // initialize motherboard controllers and system timer + i86_cpu_initialize (); // (install GDT, IDT) + i86_isrs_install(); // (install ISR handler) + i86_irq_install(); // (install IRQ handler) + + // install PIT and system clock; pit at 100 Hz + i86_kb_install_partone(); + i86_cmos_read_clock((TIME*)&_internal_clock); + i86_pit_install (100); + i86_kb_install_parttwo(); + + // enable interrupts + i86_start_interrupts(); + +} + +// shutdown hardware devices +int i86_hal_shutdown () { + + i86_cpu_shutdown (); + return 0; +} + +void reboot() +{ + unsigned char good = 0x02; + while ((good & 0x02) != 0) + good = inportb(0x64); + outportb(0x64, 0xFE); + __asm__ __volatile__ ("hlt"); +} + +//! notifies hal interrupt is done +/*inline void interruptdone (unsigned int intno) { + + //! insure its a valid hardware irq + if (intno > 16) + return; + + //! test if we need to send end-of-interrupt to second pic + if (intno >= 8) + i86_pic_send_command (0x20, 0xA1); + + //! always send end-of-interrupt to primary pic + i86_pic_send_command (0x20, 0x21); +} +*/ + +//! output sound to speaker +void sound (unsigned frequency) { + + //! sets frequency for speaker. frequency of 0 disables speaker + outportb (0x61, 3 | (byte)(frequency<<2) ); +} + + + + +//! sets new interrupt vector +/*void _cdecl setvect (int intno, void (_cdecl far &vect) ( ) ) { + + //! install interrupt handler! This overwrites prev interrupt descriptor + i86_install_ir (intno, I86_IDT_DESC_PRESENT | I86_IDT_DESC_BIT32, + 0x8, vect); +} + + +//! returns current interrupt vector +void (_cdecl far * _cdecl getvect (int intno)) ( ) { + + //! get the descriptor from the idt + idt_descriptor* desc = i86_get_ir (intno); + if (!desc) + return 0; + + //! get address of interrupt handler + uint32_t addr = desc->baseLo | (desc->baseHi << 16); + + //! return interrupt handler + I86_IRQ_HANDLER irq = (I86_IRQ_HANDLER)addr; + return irq; +} + +*/ +//! returns cpu vender +const char* get_cpu_vender () { + + return i86_cpu_get_vender(); +} + + +/*************************************************************************************** + * Keyboard Routines * + ***************************************************************************************/ +char getch() +{ + kb_key alpha = getkey(); + return alpha.character; +} + +char scancode_to_ascii(byte scancode, byte status) +{ + if ((status&1) || (status&2)) return kbdus_map_shift[scancode]; + else return kbdus_map[scancode]; +} + +byte get_key_status (byte scancode) +{ + if (scancode&0xF0) return kb_lights_status&0x0F; + else if (scancode&0x80) return kb_modifier_status&0x7F; + + return i86_kb_get_key(scancode); +} + +/*************************************** + * Set repeat rate/delay * + *************************************** + Values for inter-character delay (bits 4-0) + (characters per second; default is 10.9) + | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 + ----+----+----+----+----+----+----+----+---- + 0 |30.0|26.7|24.0|21.8|20.0|18.5|17.1|16.0 + 8 |15.0|13.3|12.0|10.9|10.0|9.2 |8.6 |8.0 + 16 |7.5 |6.7 |6.0 |5.5 |5.0 |4.6 |4.3 |4.0 + 24 |3.7 |3.3 |3.0 |2.7 |2.5 |2.3 |2.1 |2.0 + + Values for delay: + (miliseconds; default is 500) + 0 | 1 | 2 | 3 + -----+-----+-----+----- + 250 | 500 | 750 | 1000 + + ***************************************/ +void kb_set_repeat(float rate, int delay){ + float rates[] = {30.0, 26.7, 24.0, 21.8, 20.0, 18.5, 17.1, 16.0, 15.0, 13.3, 12.0, + 10.9, 10.0, 9.2, 8.6, 8.0, 7.5, 6.7, 6.0, 5.5, 5.0, 4.6, 4.3, 4.0, + 3.7, 3.3, 3.0, 2.7, 2.5, 2.3, 2.1, 2.0} ; + + + byte r,d; + + for (r = 0; rate != rates[r] && r < 32; r++) + if (rate==32) return; + + switch(delay) { + case 250: d = 0; break; + case 500: d = 1; break; + case 750: d = 2; break; + case 1000: d = 3; break; + default: return; + } + + i86_kb_set_repeat(r,d); +} + + +/*************************************** + * Set keyboard LEDs * + *************************************** + +-----------+-------+-------+--------+ + | Bits 7-3 | Bit 2 | Bit 1 | Bit 0 | + | 0 | Caps | Num | Scroll | + |(reserved) | lock | lock | lock | + +-----------+-------+-------+--------+ + ***************************************/ +void kb_set_LEDs(byte status) { + i86_kb_set_LEDs(status); +} diff --git a/SysCore/hal/idt/compile.bat b/SysCore/hal/idt/compile.bat new file mode 100644 index 0000000..7127f06 --- /dev/null +++ b/SysCore/hal/idt/compile.bat @@ -0,0 +1,19 @@ +@echo off +rem The name of the loader assembly file (without extension, must be .asm): +set loader_name=loader + +rem NASM and DJGPP executable paths: +set nasm_path=C:\nasm +set djgpp_path=C:\DJGPP\bin +set objpath=../../objects +set incpath=../../include + +@echo on +%nasm_path%\nasm.exe -f aout -o %objpath%/idt_asm.o idt.asm +%djgpp_path%\gcc.exe -Wall -O -fstrength-reduce -fomit-frame-pointer -nostdinc -fno-builtin -I%incpath% -c -o %objpath%/idt.o idt.c + +@echo off +@echo . +@echo Done! + +@pause diff --git a/SysCore/hal/idt/idt.asm b/SysCore/hal/idt/idt.asm new file mode 100644 index 0000000..cf7a29a --- /dev/null +++ b/SysCore/hal/idt/idt.asm @@ -0,0 +1,9 @@ +bits 32 + +; !!! IDT !!! +; Loads the IDT defined in '_idtp' +global _i86_idt_load +extern _idtp +_i86_idt_load: + lidt [_idtp] + ret diff --git a/kernel/kernel/idt.c b/SysCore/hal/idt/idt.c similarity index 63% rename from kernel/kernel/idt.c rename to SysCore/hal/idt/idt.c index e719dec..8126fc0 100644 --- a/kernel/kernel/idt.c +++ b/SysCore/hal/idt/idt.c @@ -1,20 +1,9 @@ +/****************************************************************** + * idt.h - INTERRUPT DESCRIPTOR TABLE * + * Contains structures and function declarations for IDT * + ******************************************************************/ #include - -/* Defines an IDT entry */ -struct idt_entry -{ - unsigned short base_lo; - unsigned short sel; - unsigned char always0; - unsigned char flags; - unsigned short base_hi; -} __attribute__((packed)); - -struct idt_ptr -{ - unsigned short limit; - unsigned int base; -} __attribute__((packed)); +#include "idt.h" /* Declare an IDT of 256 entries. Although we will only use the * first 32 entries in this tutorial, the rest exists as a bit @@ -25,12 +14,9 @@ struct idt_ptr struct idt_entry idt[256]; struct idt_ptr idtp; -/* This exists in 'start.asm', and is used to load our IDT */ -extern void idt_load(); - /* Use this function to set an entry in the IDT. Alot simpler * than twiddling with the GDT ;) */ -void idt_set_gate(unsigned char num, unsigned long base, unsigned short sel, unsigned char flags) +void i86_idt_set_gate(unsigned char num, unsigned long base, unsigned short sel, unsigned char flags) { /* The interrupt routine's base address */ idt[num].base_lo = (base & 0xFFFF); @@ -43,20 +29,21 @@ void idt_set_gate(unsigned char num, unsigned long base, unsigned short sel, uns idt[num].flags = flags; } +struct idt_entry* i86_idt_get_gate(unsigned char num) +{ + return &idt[num]; +} + /* Installs the IDT */ -void idt_install() +void i86_idt_install() { /* Sets the special IDT pointer up, just like in 'gdt.c' */ idtp.limit = (sizeof (struct idt_entry) * 256) - 1; - idtp.base = &idt; + idtp.base = (unsigned int)&idt; /* Clear out the entire IDT, initializing it to zeros */ - memset(&idt, 0, sizeof(struct idt_entry) * 256); - - /* Add any new ISRs to the IDT here using idt_set_gate */ - - + memset (&idt, 0, sizeof(struct idt_entry) * 256); /* Points the processor's internal register to the new IDT */ - idt_load(); + i86_idt_load(); } diff --git a/SysCore/hal/idt/idt.h b/SysCore/hal/idt/idt.h new file mode 100644 index 0000000..3604635 --- /dev/null +++ b/SysCore/hal/idt/idt.h @@ -0,0 +1,32 @@ +/****************************************************************** + * idt.h - INTERRUPT DESCRIPTOR TABLE * + * Contains structures and function declarations for IDT * + ******************************************************************/ + +#ifndef __IDT_H +#define __IDT_H + +/* Defines an IDT entry */ +struct idt_entry +{ + unsigned short base_lo; + unsigned short sel; + unsigned char always0; + unsigned char flags; + unsigned short base_hi; +} __attribute__((packed)); + +struct idt_ptr +{ + unsigned short limit; + unsigned int base; +} __attribute__((packed)); + + +/* This exists in 'start.asm', and is used to load our IDT */ +extern void i86_idt_load(); +extern void i86_idt_set_gate(unsigned char num, unsigned long base, unsigned short sel, unsigned char flags); +extern struct idt_entry* i86_idt_get_gate(unsigned char num); +extern void i86_idt_install(); + +#endif \ No newline at end of file diff --git a/SysCore/hal/irq/compile.bat b/SysCore/hal/irq/compile.bat new file mode 100644 index 0000000..eb0b6d1 --- /dev/null +++ b/SysCore/hal/irq/compile.bat @@ -0,0 +1,19 @@ +@echo off +rem The name of the loader assembly file (without extension, must be .asm): +set loader_name=loader + +rem NASM and DJGPP executable paths: +set nasm_path=C:\nasm +set djgpp_path=C:\DJGPP\bin +set objpath=../../objects +set incpath=../../include + +@echo on +%nasm_path%\nasm.exe -f aout -o %objpath%/irq_asm.o irq.asm +%djgpp_path%\gcc.exe -Wall -O -fstrength-reduce -fomit-frame-pointer -nostdinc -fno-builtin -I%incpath% -c -o %objpath%/irq.o irq.c + +@echo off +@echo . +@echo Done! + +@pause diff --git a/SysCore/hal/irq/irq.asm b/SysCore/hal/irq/irq.asm new file mode 100644 index 0000000..286f7de --- /dev/null +++ b/SysCore/hal/irq/irq.asm @@ -0,0 +1,159 @@ +bits 32 + +; !!! IRQ !!! +global _i86_irq0 +global _i86_irq1 +global _i86_irq2 +global _i86_irq3 +global _i86_irq4 +global _i86_irq5 +global _i86_irq6 +global _i86_irq7 +global _i86_irq8 +global _i86_irq9 +global _i86_irq10 +global _i86_irq11 +global _i86_irq12 +global _i86_irq13 +global _i86_irq14 +global _i86_irq15 + +; 32: IRQ0 +_i86_irq0: + cli + push byte 0 + push byte 32; Note that these don't push an error code on the stack: + ; We need to push a dummy error code + jmp irq_common_stub + +; 33: IRQ1 +_i86_irq1: + cli + push byte 0 + push byte 33 + jmp irq_common_stub + +; 34: IRQ2 +_i86_irq2: + cli + push byte 0 + push byte 34 + jmp irq_common_stub + +; 35: IRQ3 +_i86_irq3: + cli + push byte 0 + push byte 35 + jmp irq_common_stub + +; 36: IRQ4 +_i86_irq4: + cli + push byte 0 + push byte 36 + jmp irq_common_stub + +; 37: IRQ5 +_i86_irq5: + cli + push byte 0 + push byte 37 + jmp irq_common_stub + +; 38: IRQ6 +_i86_irq6: + cli + push byte 0 + push byte 38 + jmp irq_common_stub + +; 39: IRQ7 +_i86_irq7: + cli + push byte 0 + push byte 39 + jmp irq_common_stub + +; 40: IRQ8 +_i86_irq8: + cli + push byte 0 + push byte 40 + jmp irq_common_stub +; 41: IRQ9 +_i86_irq9: + cli + push byte 0 + push byte 41 + jmp irq_common_stub + +; 42: IRQ10 +_i86_irq10: + cli + push byte 0 + push byte 42 + jmp irq_common_stub + +; 43: IRQ11 +_i86_irq11: + cli + push byte 0 + push byte 43 + jmp irq_common_stub + +; 44: IRQ12 +_i86_irq12: + cli + push byte 0 + push byte 44 + jmp irq_common_stub + +; 45: IRQ13 +_i86_irq13: + cli + push byte 0 + push byte 45 + jmp irq_common_stub + +; 46: IRQ14 +_i86_irq14: + cli + push byte 0 + push byte 46 + jmp irq_common_stub + +; 47: IRQ15 +_i86_irq15: + cli + push byte 0 + push byte 47 + jmp irq_common_stub + +extern _i86_irq_handler + +; This is a stub that we have created for IRQ based ISRs. This calls +; '_i86_irq_handler' in our C code. We need to create this in an 'irq.c' +irq_common_stub: + pusha + push ds + push es + push fs + push gs + mov ax, 0x10 + mov ds, ax + mov es, ax + mov fs, ax + mov gs, ax + mov eax, esp + push eax + mov eax, _i86_irq_handler + call eax + pop eax + pop gs + pop fs + pop es + pop ds + popa + add esp, 8 + iret diff --git a/SysCore/hal/irq/irq.c b/SysCore/hal/irq/irq.c new file mode 100644 index 0000000..edfe3d8 --- /dev/null +++ b/SysCore/hal/irq/irq.c @@ -0,0 +1,79 @@ +#include +#include "../idt/idt.h" +#include "../pic/pic.h" +#include "irq.h" +/* This array is actually an array of function pointers. We use +* this to handle custom IRQ handlers for a given IRQ */ +void *irq_routines[16] = +{ + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 +}; + +/* This installs a custom IRQ handler for the given IRQ */ +void i86_irq_install_handler (int irq, void (*handler)(ISR_stack_regs *r)) +{ + irq_routines[irq] = handler; +} + +void i86_irq_uninstall_handler (int irq) +{ + irq_routines[irq] = 0; +} + + + +/* We first remap the interrupt controllers, and then we install +* the appropriate ISRs to the correct entries in the IDT. This +* is just like installing the exception handlers */ +void i86_irq_install() +{ + i86_pic_remap(32,40); + + i86_idt_set_gate(32, (unsigned)i86_irq0, 0x08, 0x8E); + i86_idt_set_gate(33, (unsigned)i86_irq1, 0x08, 0x8E); + i86_idt_set_gate(34, (unsigned)i86_irq2, 0x08, 0x8E); + i86_idt_set_gate(35, (unsigned)i86_irq3, 0x08, 0x8E); + i86_idt_set_gate(36, (unsigned)i86_irq4, 0x08, 0x8E); + i86_idt_set_gate(37, (unsigned)i86_irq5, 0x08, 0x8E); + i86_idt_set_gate(38, (unsigned)i86_irq6, 0x08, 0x8E); + i86_idt_set_gate(39, (unsigned)i86_irq7, 0x08, 0x8E); + i86_idt_set_gate(40, (unsigned)i86_irq8, 0x08, 0x8E); + i86_idt_set_gate(41, (unsigned)i86_irq9, 0x08, 0x8E); + i86_idt_set_gate(42, (unsigned)i86_irq10, 0x08, 0x8E); + i86_idt_set_gate(43, (unsigned)i86_irq11, 0x08, 0x8E); + i86_idt_set_gate(44, (unsigned)i86_irq12, 0x08, 0x8E); + i86_idt_set_gate(45, (unsigned)i86_irq13, 0x08, 0x8E); + i86_idt_set_gate(46, (unsigned)i86_irq14, 0x08, 0x8E); + i86_idt_set_gate(47, (unsigned)i86_irq15, 0x08, 0x8E); +} + +/* Each of the IRQ ISRs point to this function, rather than +* the 'fault_handler' in 'isrs.c'. The IRQ Controllers need +* to be told when you are done servicing them, so you need +* to send them an "End of Interrupt" command (0x20). There +* are two 8259 chips: The first exists at 0x20, the second +* exists at 0xA0. If the second controller (an IRQ from 8 to +* 15) gets an interrupt, you need to acknowledge the +* interrupt at BOTH controllers, otherwise, you only send +* an EOI command to the first controller. If you don't send +* an EOI, you won't raise any more IRQs */ +void i86_irq_handler (ISR_stack_regs *r) +{ + /* This is a blank function pointer */ + void (*handler)(ISR_stack_regs *r); + + /* Find out if we have a custom handler to run for this + * IRQ, and then finally, run it */ + handler = irq_routines[r->int_no - 32]; + if (handler) handler(r); + + /* If the IDT entry that was invoked was greater than 40 + * (meaning IRQ8 - 15), then we need to send an EOI to + * the slave controller */ + if (r->int_no >=40) outportb(0x0A, 0x20); + + /* In either case, we need to send an EOI to the master + * interrupt controller too */ + outportb(0x20, 0x20); +} diff --git a/SysCore/hal/irq/irq.h b/SysCore/hal/irq/irq.h new file mode 100644 index 0000000..a2bb50c --- /dev/null +++ b/SysCore/hal/irq/irq.h @@ -0,0 +1,29 @@ +#ifndef __IRQ_H +#define __IRQ_H + +/* These are own ISRs that point to our special IRQ handler +* instead of the regular 'fault_handler' function */ + +extern void i86_irq0(); +extern void i86_irq1(); +extern void i86_irq2(); +extern void i86_irq3(); +extern void i86_irq4(); +extern void i86_irq5(); +extern void i86_irq6(); +extern void i86_irq7(); +extern void i86_irq8(); +extern void i86_irq9(); +extern void i86_irq10(); +extern void i86_irq11(); +extern void i86_irq12(); +extern void i86_irq13(); +extern void i86_irq14(); +extern void i86_irq15(); + +extern void i86_irq_install_handler (int irq, void (*handler)(ISR_stack_regs *r)); +extern void i86_irq_uninstall_handler (int irq); +extern void i86_irq_install(); +extern void i86_irq_handler (ISR_stack_regs *r); + +#endif \ No newline at end of file diff --git a/SysCore/hal/isrs/BSOD.c b/SysCore/hal/isrs/BSOD.c new file mode 100644 index 0000000..b3a2638 --- /dev/null +++ b/SysCore/hal/isrs/BSOD.c @@ -0,0 +1,79 @@ +#include +#include + +char *exception_messages[] = { + "Division By Zero Exception", + "Debug Exception", + "Non Maskable Interrupt Exception", + "Breakpoint Exception", + "Into Detected Overflow Exception", + "Out of Bounds Exception", + "Invalid Opcode Exception", + "No Coprocessor", + "Double Fault Exception", + "Coprocessor Segment Overrun Exception", + "Bad TSS Exception", + "Segment Not Present Exception", + "Stack Fault Exception", + "General Protection Fault Exception", + "Page Fault Exception", + "Unknown Interrupt Exception", + "Coprocessor Fault Exception", + "Alignment Check Exception", + "Machine Check Exception", + "Reserved Exception", + "Reserved Exception", + "Reserved Exception", + "Reserved Exception", + "Reserved Exception", + "Reserved Exception", + "Reserved Exception", + "Reserved Exception", + "Reserved Exception", + "Reserved Exception", + "Reserved Exception", + "Reserved Exception" +}; + + +void _STOP_ERROR_SCREEN (ISR_stack_regs *r) +{ + set_default_colors (0x01, 0x0F); clrscr(); + puts (" Blue Screen Of Death\n"); + int i; for (i = 79; i>=0; i--) putc('='); + puts_pos_font (15, 2, "A fatal error has occured, CTA OS has been halted.", 0x01, 0x0C); + puts_pos_font (10, 4, "gs", 0x01, 0x0B); put_hex_pos(15, 4, r->gs); + puts_pos_font (10, 5, "fs", 0x01, 0x0B); put_hex_pos(15, 5, r->fs); + puts_pos_font (10, 6, "es", 0x01, 0x0B); put_hex_pos(15, 6, r->es); + puts_pos_font (10, 7, "ds", 0x01, 0x0B); put_hex_pos(15, 7, r->ds); + + puts_pos_font (40, 4, "edi", 0x01, 0x0B); put_hex_pos(45, 4, r->edi); + puts_pos_font (40, 5, "esi", 0x01, 0x0B); put_hex_pos(45, 5, r->esi); + puts_pos_font (40, 6, "ebp", 0x01, 0x0B); put_hex_pos(45, 6, r->ebp); + puts_pos_font (40, 7, "esp", 0x01, 0x0B); put_hex_pos(45, 7, r->esp); + + puts_pos_font (10, 9, "eax", 0x01, 0x0B); put_hex_pos(15, 9, r->eax); + puts_pos_font (10, 10, "ebx", 0x01, 0x0B); put_hex_pos(15, 10, r->ebx); + puts_pos_font (40, 9, "ecx", 0x01, 0x0B); put_hex_pos(45, 9, r->ecx); + puts_pos_font (40, 10, "edx", 0x01, 0x0B); put_hex_pos(45, 10, r->edx); + + puts_pos_font (10, 12, "int_no", 0x01, 0x0B); put_hex_pos(17, 12, r->int_no); + puts_pos_font (10, 14, "Error code:", 0x01, 0x0B); put_hex_pos(24, 14, r->err_code); + puts_pos_font (10, 15, "Error msg: ", 0x01, 0x0B); puts_pos(24, 15, exception_messages[r->int_no]); + + puts_pos_font (10, 17, "eip", 0x01, 0x0B); put_hex_pos(17, 17, r->eip); + puts_pos_font (10, 18, "cs", 0x01, 0x0B); put_hex_pos(17, 18, r->cs); + puts_pos_font (10, 19, "eflags", 0x01, 0x0B); put_hex_pos(17, 19, r->eflags); + puts_pos_font (10, 20, "useresp", 0x01, 0x0B); put_hex_pos(17, 20, r->useresp); + puts_pos_font (10, 21, "ss", 0x01, 0x0B); put_hex_pos(17, 21, r->ss); + + puts_pos_font (29, 24, "!!! System Halted !!!", 0x01, 0x0C); +} + +/*void _STOP_ERROR_SCREEN (ISR_stack_regs *r) +{ + puts_pos_font (30, 24, "Stop error 0x", 0x01, 0x0B); put_hex_pos(37, 24, r->int_no); + puts_pos(50, 24, exception_messages[r->int_no]); + + puts_pos_font (5, 24, "!!! System Halted !!!", 0x01, 0x0C); +}*/ \ No newline at end of file diff --git a/SysCore/hal/isrs/compile.bat b/SysCore/hal/isrs/compile.bat new file mode 100644 index 0000000..fba4632 --- /dev/null +++ b/SysCore/hal/isrs/compile.bat @@ -0,0 +1,20 @@ +@echo off +rem The name of the loader assembly file (without extension, must be .asm): +set loader_name=loader + +rem NASM and DJGPP executable paths: +set nasm_path=C:\nasm +set djgpp_path=C:\DJGPP\bin +set objpath=../../objects +set incpath=../../include + +@echo on +%nasm_path%\nasm.exe -f aout -o %objpath%/isrs_asm.o isrs.asm +%djgpp_path%\gcc.exe -Wall -O -fstrength-reduce -fomit-frame-pointer -nostdinc -fno-builtin -I%incpath% -c -o %objpath%/isrs.o isrs.c +%djgpp_path%\gcc.exe -Wall -O -fstrength-reduce -fomit-frame-pointer -nostdinc -fno-builtin -I%incpath% -c -o %objpath%/BSOD.o BSOD.c + +@echo off +@echo . +@echo Done! + +@pause diff --git a/SysCore/hal/isrs/isrs.asm b/SysCore/hal/isrs/isrs.asm new file mode 100644 index 0000000..ce19ae0 --- /dev/null +++ b/SysCore/hal/isrs/isrs.asm @@ -0,0 +1,217 @@ +bits 32 + +; !!! ISRs !!! +global _i86_isr0 +global _i86_isr1 +global _i86_isr2 +global _i86_isr3 +global _i86_isr4 +global _i86_isr5 +global _i86_isr6 +global _i86_isr7 +global _i86_isr8 +global _i86_isr9 +global _i86_isr10 +global _i86_isr11 +global _i86_isr12 +global _i86_isr13 +global _i86_isr14 +global _i86_isr15 +global _i86_isr16 +global _i86_isr17 +global _i86_isr18 +global _i86_isr19 +global _i86_isr20 +global _i86_isr21 +global _i86_isr22 +global _i86_isr23 +global _i86_isr24 +global _i86_isr25 +global _i86_isr26 +global _i86_isr27 +global _i86_isr28 +global _i86_isr29 +global _i86_isr30 +global _i86_isr31 + +_i86_isr0: + cli + push byte 0; A normal ISR stub that pops a dummy error code to keep a + ; uniform stack frame + push byte 0 + jmp isr_common_stub +_i86_isr1: + cli + push byte 0 + push byte 1 + jmp isr_common_stub +_i86_isr2: + cli + push byte 0 + push byte 2 + jmp isr_common_stub +_i86_isr3: + cli + push byte 0 + push byte 3 + jmp isr_common_stub +_i86_isr4: + cli + push byte 0 + push byte 4 + jmp isr_common_stub +_i86_isr5: + cli + push byte 0 + push byte 5 + jmp isr_common_stub +_i86_isr6: + cli + push byte 0 + push byte 6 + jmp isr_common_stub +_i86_isr7: + cli + push byte 0 + push byte 7 + jmp isr_common_stub +_i86_isr8: + cli + push byte 8 + jmp isr_common_stub +_i86_isr9: + cli + push byte 0 + push byte 9 + jmp isr_common_stub +_i86_isr10: + cli + push byte 10 + jmp isr_common_stub +_i86_isr11: + cli + push byte 11 + jmp isr_common_stub +_i86_isr12: + cli + push byte 12 + jmp isr_common_stub +_i86_isr13: + cli + push byte 13 + jmp isr_common_stub +_i86_isr14: + cli + push byte 14 + jmp isr_common_stub +_i86_isr15: + cli + push byte 0 + push byte 15 + jmp isr_common_stub +_i86_isr16: + cli + push byte 0 + push byte 16 + jmp isr_common_stub +_i86_isr17: + cli + push byte 0 + push byte 17 + jmp isr_common_stub +_i86_isr18: + cli + push byte 0 + push byte 18 + jmp isr_common_stub +_i86_isr19: + cli + push byte 0 + push byte 19 + jmp isr_common_stub +_i86_isr20: + cli + push byte 0 + push byte 20 + jmp isr_common_stub +_i86_isr21: + cli + push byte 0 + push byte 21 + jmp isr_common_stub +_i86_isr22: + cli + push byte 0 + push byte 22 + jmp isr_common_stub +_i86_isr23: + cli + push byte 0 + push byte 23 + jmp isr_common_stub +_i86_isr24: + cli + push byte 0 + push byte 24 + jmp isr_common_stub +_i86_isr25: + cli + push byte 0 + push byte 25 + jmp isr_common_stub +_i86_isr26: + cli + push byte 0 + push byte 26 + jmp isr_common_stub +_i86_isr27: + cli + push byte 0 + push byte 27 + jmp isr_common_stub +_i86_isr28: + cli + push byte 0 + push byte 28 + jmp isr_common_stub +_i86_isr29: + cli + push byte 0 + push byte 29 + jmp isr_common_stub +_i86_isr30: + cli + push byte 0 + push byte 30 + jmp isr_common_stub +_i86_isr31: + cli + push byte 0 + push byte 31 + jmp isr_common_stub + +extern _i86_fault_handler + +isr_common_stub: + pusha + push ds + push es + push fs + push gs + mov ax, 0x10 ; Load the Kernel Data Segment descriptor! + mov ds, ax + mov es, ax + mov fs, ax + mov gs, ax + mov eax, esp ; Push us the stack + push eax + mov eax, _i86_fault_handler + call eax ; A special call, preserves the 'eip' register + pop eax + pop gs + pop fs + pop es + pop ds + popa + add esp, 8 ; Cleans up the pushed error code and pushed ISR number + iret ; pops 5 things at once: CS, EIP, EFLAGS, SS, and ESP! diff --git a/SysCore/hal/isrs/isrs.c b/SysCore/hal/isrs/isrs.c new file mode 100644 index 0000000..9e0e756 --- /dev/null +++ b/SysCore/hal/isrs/isrs.c @@ -0,0 +1,70 @@ +#include +#include "isrs.h" +#include "../idt/idt.h" + +extern void _STOP_ERROR_SCREEN(ISR_stack_regs *); +/* This is a very repetitive function... it's not hard, it's +* just annoying. As you can see, we set the first 32 entries +* in the IDT to the first 32 ISRs. We can't use a for loop +* for this, because there is no way to get the function names +* that correspond to that given entry. We set the access +* flags to 0x8E. This means that the entry is present, is +* running in ring 0 (kernel level), and has the lower 5 bits +* set to the required '14', which is represented by 'E' in +* hex. */ +void i86_isrs_install() +{ + i86_idt_set_gate(0, (unsigned)i86_isr0, 0x08, 0x8E); + i86_idt_set_gate(1, (unsigned)i86_isr1, 0x08, 0x8E); + i86_idt_set_gate(2, (unsigned)i86_isr2, 0x08, 0x8E); + i86_idt_set_gate(3, (unsigned)i86_isr3, 0x08, 0x8E); + i86_idt_set_gate(4, (unsigned)i86_isr4, 0x08, 0x8E); + i86_idt_set_gate(5, (unsigned)i86_isr5, 0x08, 0x8E); + i86_idt_set_gate(6, (unsigned)i86_isr6, 0x08, 0x8E); + i86_idt_set_gate(7, (unsigned)i86_isr7, 0x08, 0x8E); + i86_idt_set_gate(8, (unsigned)i86_isr8, 0x08, 0x8E); + i86_idt_set_gate(9, (unsigned)i86_isr9, 0x08, 0x8E); + i86_idt_set_gate(10, (unsigned)i86_isr10, 0x08, 0x8E); + i86_idt_set_gate(11, (unsigned)i86_isr11, 0x08, 0x8E); + i86_idt_set_gate(12, (unsigned)i86_isr12, 0x08, 0x8E); + i86_idt_set_gate(13, (unsigned)i86_isr13, 0x08, 0x8E); + i86_idt_set_gate(14, (unsigned)i86_isr14, 0x08, 0x8E); + i86_idt_set_gate(15, (unsigned)i86_isr15, 0x08, 0x8E); + i86_idt_set_gate(16, (unsigned)i86_isr16, 0x08, 0x8E); + i86_idt_set_gate(17, (unsigned)i86_isr17, 0x08, 0x8E); + i86_idt_set_gate(18, (unsigned)i86_isr18, 0x08, 0x8E); + i86_idt_set_gate(19, (unsigned)i86_isr19, 0x08, 0x8E); + i86_idt_set_gate(20, (unsigned)i86_isr20, 0x08, 0x8E); + i86_idt_set_gate(21, (unsigned)i86_isr21, 0x08, 0x8E); + i86_idt_set_gate(22, (unsigned)i86_isr22, 0x08, 0x8E); + i86_idt_set_gate(23, (unsigned)i86_isr23, 0x08, 0x8E); + i86_idt_set_gate(24, (unsigned)i86_isr24, 0x08, 0x8E); + i86_idt_set_gate(25, (unsigned)i86_isr25, 0x08, 0x8E); + i86_idt_set_gate(26, (unsigned)i86_isr26, 0x08, 0x8E); + i86_idt_set_gate(27, (unsigned)i86_isr27, 0x08, 0x8E); + i86_idt_set_gate(28, (unsigned)i86_isr28, 0x08, 0x8E); + i86_idt_set_gate(29, (unsigned)i86_isr29, 0x08, 0x8E); + i86_idt_set_gate(30, (unsigned)i86_isr30, 0x08, 0x8E); + i86_idt_set_gate(31, (unsigned)i86_isr31, 0x08, 0x8E); +} + + + +/* All of our Exception handling Interrupt Service Routines will +* point to this function. This will tell us what exception has +* happened! Right now, we simply halt the system by hitting an +* endless loop. All ISRs disable interrupts while they are being +* serviced as a 'locking' mechanism to prevent an IRQ from +* happening and messing up kernel data structures */ +void i86_fault_handler(ISR_stack_regs *r) +{ + /* Is this a fault whose number is from 0 to 31? */ + if (r->int_no < 32) + { + _STOP_ERROR_SCREEN(r); + /* Display the description for the Exception that occurred.*/ + + /* Put on the BSOD screen*/ + for (;;); + } +} diff --git a/SysCore/hal/isrs/isrs.h b/SysCore/hal/isrs/isrs.h new file mode 100644 index 0000000..64b6312 --- /dev/null +++ b/SysCore/hal/isrs/isrs.h @@ -0,0 +1,40 @@ +#ifndef __ISRS_H +#define __ISRS_H + +extern void i86_isr0(); +extern void i86_isr1(); +extern void i86_isr2(); +extern void i86_isr3(); +extern void i86_isr4(); +extern void i86_isr5(); +extern void i86_isr6(); +extern void i86_isr7(); +extern void i86_isr8(); +extern void i86_isr9(); +extern void i86_isr10(); +extern void i86_isr11(); +extern void i86_isr12(); +extern void i86_isr13(); +extern void i86_isr14(); +extern void i86_isr15(); +extern void i86_isr16(); +extern void i86_isr17(); +extern void i86_isr18(); +extern void i86_isr19(); +extern void i86_isr20(); +extern void i86_isr21(); +extern void i86_isr22(); +extern void i86_isr23(); +extern void i86_isr24(); +extern void i86_isr25(); +extern void i86_isr26(); +extern void i86_isr27(); +extern void i86_isr28(); +extern void i86_isr29(); +extern void i86_isr30(); +extern void i86_isr31(); + +extern void i86_isrs_install(); +extern void i86_fault_handler(ISR_stack_regs *r); + +#endif \ No newline at end of file diff --git a/SysCore/hal/keyboard/compile.bat b/SysCore/hal/keyboard/compile.bat new file mode 100644 index 0000000..41d9f5d --- /dev/null +++ b/SysCore/hal/keyboard/compile.bat @@ -0,0 +1,18 @@ +@echo off +rem The name of the loader assembly file (without extension, must be .asm): +set loader_name=loader + +rem NASM and DJGPP executable paths: +set nasm_path=C:\nasm +set djgpp_path=C:\DJGPP\bin +set objpath=../../objects +set incpath=../../include + +@echo on +%djgpp_path%\gcc.exe -Wall -O -fstrength-reduce -fomit-frame-pointer -nostdinc -fno-builtin -I%incpath% -c -o %objpath%/keyus.o keyus.c + +@echo off +@echo . +@echo Done! + +@pause diff --git a/kernel/keyboard/key_list.txt b/SysCore/hal/keyboard/key_list.txt similarity index 100% rename from kernel/keyboard/key_list.txt rename to SysCore/hal/keyboard/key_list.txt diff --git a/SysCore/hal/keyboard/keyboard.h b/SysCore/hal/keyboard/keyboard.h new file mode 100644 index 0000000..465d7f6 --- /dev/null +++ b/SysCore/hal/keyboard/keyboard.h @@ -0,0 +1,133 @@ + +#define KB_KEY_LSHIFT 0x81 // 1000 0001 +#define KB_KEY_RSHIFT 0X82 // 1000 0010 +#define KB_KEY_LALT 0X84 // 1000 0100 +#define KB_KEY_RALT 0x88 // 1000 1000 +#define KB_KEY_LCTRL 0x90 // 1001 0000 +#define KB_KEY_RCTRL 0xA0 // 1010 0000 +#define KB_KEY_FSHIFT 0xC0 // 1100 0000 +extern volatile byte kb_modifier_status; + +#define KB_PREFIX_GRAY 0x01 // Gray +#define KB_PREFIX_BREAK 0x02 // Break code +#define KB_PREFIX_PAUSE 0x04 // Pause/break key +#define KB_PREFIX_PAUSE1 0x08 // Recieved first byte from pause/break +extern volatile byte kb_prefix; + +#define KB_KEY_SCROLL 0xF1 // 1111 0001 +#define KB_KEY_NUM 0xF2 // 1111 0010 +#define KB_KEY_CAPS 0xF4 // 1111 0100 +extern volatile byte kb_lights_status; + +extern byte kb_scancode_set; +#define KB_KEY_PAUSE 0x00 +#define KB_KEY_F9 0x01 +#define KB_KEY_F7 0x02 +#define KB_KEY_F5 0X03 +#define KB_KEY_F3 0x04 +#define KB_KEY_F1 0x05 +#define KB_KEY_F2 0x06 +#define KB_KEY_F12 0x07 +#define KB_KEY_PRINTSCRN 0x08 +#define KB_KEY_F10 0x09 +#define KB_KEY_F8 0x0A +#define KB_KEY_F6 0x0B +#define KB_KEY_F4 0x0C +#define KB_KEY_TAB 0x0D +#define KB_KEY_TILDA 0x0E +#define KB_KEY_Q 0x15 +#define KB_KEY_1 0x16 +#define KB_KEY_Z 0x1A +#define KB_KEY_S 0x1B +#define KB_KEY_A 0x1C +#define KB_KEY_W 0x1D +#define KB_KEY_2 0x1E +#define KB_KEY_LWIN 0x1F +#define KB_KEY_C 0x21 +#define KB_KEY_X 0x22 +#define KB_KEY_D 0x23 +#define KB_KEY_E 0x24 +#define KB_KEY_4 0x25 +#define KB_KEY_3 0x26 +#define KB_KEY_RWIN 0x27 +#define KB_KEY_SPACE 0x29 +#define KB_KEY_V 0x2A +#define KB_KEY_F 0x2B +#define KB_KEY_T 0x2C +#define KB_KEY_R 0x2D +#define KB_KEY_5 0x2E +#define KB_KEY_MENU 0x2F +#define KB_KEY_N 0x31 +#define KB_KEY_B 0x32 +#define KB_KEY_H 0x33 +#define KB_KEY_G 0x34 +#define KB_KEY_Y 0x35 +#define KB_KEY_6 0x36 +#define KB_KEY_M 0x3A +#define KB_KEY_J 0x3B +#define KB_KEY_U 0x3C +#define KB_KEY_7 0x3D +#define KB_KEY_8 0x3E +#define KB_KEY_COMMA 0x41 +#define KB_KEY_K 0x42 +#define KB_KEY_I 0x43 +#define KB_KEY_O 0x44 +#define KB_KEY_0 0x45 +#define KB_KEY_9 0x46 +#define KB_KEY_PERIOD 0x49 +#define KB_KEY_SLASH 0x4A +#define KB_KEY_L 0x4B +#define KB_KEY_SEMICOLON 0x4C +#define KB_KEY_P 0x4D +#define KB_KEY_DASH 0x4E +#define KB_KEY_APOSTROPHE 0x52 +#define KB_KEY_LBRACKET 0x54 +#define KB_KEY_EQUAL 0x55 +#define KB_KEY_NUMPAD_ENTER 0x59 +#define KB_KEY_ENTER 0x5A +#define KB_KEY_RBRACKET 0x5B +#define KB_KEY_BACKSLASH 0x5D +#define KB_KEY_END 0x5E +#define KB_KEY_LEFT 0x5F +#define KB_KEY_HOME 0x60 +#define KB_KEY_INSERT 0x61 +#define KB_KEY_DELETE 0x62 +#define KB_KEY_DOWN 0x63 +#define KB_KEY_RIGHT 0x64 +#define KB_KEY_UP 0x65 +#define KB_KEY_BACKSPACE 0x66 +#define KB_KEY_PGDOWN 0x67 +#define KB_KEY_PGUP 0x68 +#define KB_KEY_NUMPAD_1 0x69 +#define KB_KEY_NUMPAD_SLASH 0x6A +#define KB_KEY_NUMPAD_4 0x6B +#define KB_KEY_NUMPAD_7 0x6C +#define KB_KEY_NUMPAD_0 0x70 +#define KB_KEY_NUMPAD_COLON 0x71 +#define KB_KEY_NUMPAD_2 0x72 +#define KB_KEY_NUMPAD_5 0x73 +#define KB_KEY_NUMPAD_6 0x74 +#define KB_KEY_NUMPAD_8 0x75 +#define KB_KEY_ESC 0x76 +#define KB_KEY_F11 0x78 +#define KB_KEY_NUMPAD_PLUS 0x79 +#define KB_KEY_NUMPAD_3 0x7A +#define KB_KEY_NUMPAD_MINUS 0x7B +#define KB_KEY_NUMPAD_ASTERISK 0x7C +#define KB_KEY_NUMPAD_9 0x7D + + +typedef struct { + byte status; + byte lights; + byte scancode; + byte character; +} kb_key; + + +extern char getch(); +extern kb_key get_key(); +extern scancode_to_ascii(byte scancode); +extern byte get_key_status(byte scancode); +extern void kb_set_repeat(float rate, int delay); +extern void kb_set_LEDs(byte status); \ No newline at end of file diff --git a/kernel/keyboard/keyus.c b/SysCore/hal/keyboard/keyus.c similarity index 51% rename from kernel/keyboard/keyus.c rename to SysCore/hal/keyboard/keyus.c index 392a4ff..e5313e7 100644 --- a/kernel/keyboard/keyus.c +++ b/SysCore/hal/keyboard/keyus.c @@ -1,31 +1,42 @@ +#include +#include #include "keyus.h" +#include "../irq/irq.h" -// kb_key_return 4-byte structure -typedef struct { - byte status; - byte lights; - byte scancode; - byte character; -} kb_key; +extern void reboot(); -byte kb_array[16]; -volatile static byte kb_newdata; +const char kbdus_map[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '\t', '`', 0, + 0, 0, 0, 0, 0, 'q', '1', 0, 0, 0, 'z', 's', 'a', 'w', '2', 0, + 0, 'c', 'x', 'd', 'e', '4', '3', 0, 0, ' ', 'v', 'f', 't', 'r', '5', 0, + 0, 'n', 'b', 'h', 'g', 'y', '6', 0, 0, 0, 'm', 'j', 'u', '7', '8', 0, + 0, ',', 'k', 'i', 'o', '0', '9', 0, 0, '.', '/', 'l', ';', 'p', '-', 0, + 0, 0, '\'', 0, '[', '=', 0, 0, 0, '\n', '\n', ']', 0, '\\', 0, 0, + 0, 0, 0x7F, 0, 0, 0, '\b', 0, 0, '1', '/', '4', '7', 0, 0, 0, + '0', '.', '2', '5', '6', '8', 0, 0, 0, '+', '3', '-', '*', '9', 0, 0 + }; -/*********DEBUG**************/ -void kb_print_binary(int x, int y, byte what) -{ - char arr[9]; int i; - for (i = 7; i>=0; i--, what/=2) - arr[i] = (what%2) + '0'; - - arr[8] = 0; - - puts_pos(x,y,arr); +const char kbdus_map_shift[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '\t', '~', 0, + 0, 0, 0, 0, 0, 'Q', '!', 0, 0, 0, 'Z', 'S', 'A', 'W', '@', 0, + 0, 'C', 'X', 'D', 'E', '$', '#', 0, 0, ' ', 'V', 'F', 'T', 'R', '%', 0, + 0, 'N', 'B', 'H', 'G', 'Y', '^', 0, 0, 0, 'M', 'J', 'U', '&', '*', 0, + 0, '<', 'K', 'I', 'O', ')', '(', 0, 0, '>', '?', 'L', ':', 'P', '_', 0, + 0, 0, '\"', 0, '{', '+', 0, 0, 0, '\n', '\n', '}', 0, '|', 0, 0, + 0, 0, 0x7F, 0, 0, 0, '\b', 0, 0, '1', '/', '4', '7', 0, 0, 0, + '0', '.', '2', '5', '6', '8', 0, 0, 0, '+', '3', '-', '*', '9', 0, 0 + }; -} -/*********DEBUG**************/ -void kb_set_key(byte scancode, byte val) +volatile byte kb_array[16]; +volatile byte kb_newdata; +volatile byte kb_modifier_status; +volatile byte kb_prefix; +volatile byte kb_lights_status; +byte kb_scancode_set; + + +void i86_kb_set_key(byte scancode, byte val) { byte pos = scancode/8; byte offset = scancode%8; @@ -37,7 +48,7 @@ void kb_set_key(byte scancode, byte val) else kb_array[pos] &= 0xFF - (1<3 || delay>31) return; + + byte out = rate<<5 | delay; + while ((inportb(0x64)&2) != 0); + outportb(0x60, 0xF3); + while ((inportb(0x64)&2) != 0); + outportb(0x60, out); +} + + +/*************************************** + * Set keyboard LEDs * + *************************************** + +-----------+-------+-------+--------+ + | Bits 7-3 | Bit 2 | Bit 1 | Bit 0 | + | 0 | Caps | Num | Scroll | + |(reserved) | lock | lock | lock | + +-----------+-------+-------+--------+ + ***************************************/ +void i86_kb_set_LEDs(byte status) +{ + while ((inportb (0x64)&2)!=0); + outportb (0x60, 0xED); + + while ((inportb (0x64)&2)!=0); + outportb (0x60, status); +} + +/*************************************** + * Set scancode set * + *************************************** + 0 Get current scancode set + 1 Set to scancode set 1 + 2 Set to scancode set 2 + 3 Set to scancode set 3 + ***************************************/ +void i86_kb_set_scancodeset(byte set) +{ + if (set>3) return; + + while ((inportb (0x64)&2)!=0); + outportb (0x60, 0xF0); + + while ((inportb (0x64)&2)!=0); + outportb (0x60, set); + + kb_scancode_set = set; +} + +byte i86_kb_get_scancodeset() { + return kb_scancode_set; +} + +void i86_kb_waitin() +{ + int fail_safe=200000; + while ((inportb(0x64)&2)!=0 && fail_safe>0) fail_safe--; +} + +void i86_kb_waitout() +{ + int fail_safe=200000; + while ((inportb(0x64)&1)==0 && fail_safe>0) fail_safe--; +} + + +void i86_kb_install_partone() +{ + i86_irq_install_handler(1, i86_kb_handler);// instali handler + i86_kb_waitin(); outportb(0x60, 0xFF); // Reset kb + + // Initialize variables + kb_newdata = 0; + kb_modifier_status = 0; + kb_prefix = 0; + kb_lights_status = 0; + kb_scancode_set = 0; + +} + + +int i86_kb_install_parttwo() +{ + int ret = 0; + + // Wait for BAT test results + byte temp; + do temp = inportb(0x60); + while (temp!=0xAA && temp!=0xFC); + + if (temp == 0xFC) ret = -1; + + // Set new repeat rate + i86_kb_set_repeat(1, 11); + + // Set scancode set 2 + i86_kb_set_scancodeset(2); // Set new scancode set + + i86_kb_waitin(); + outportb(0x64, 0x20); // Get "Command byte" + + do { temp = inportb(0x60); + } while (temp==0xFA || temp==0xAA); + + temp &= 0xFF - (1<<6); // Set bit6 to 0: disable conversion + i86_kb_waitin(); outportb(0x64, 0x60); // Function to write cmd byte + i86_kb_waitin(); outportb(0x60, temp); // Send it + memset((void*)kb_array, 0, 16); + + return ret; + +} diff --git a/SysCore/hal/keyboard/keyus.h b/SysCore/hal/keyboard/keyus.h new file mode 100644 index 0000000..6b608c7 --- /dev/null +++ b/SysCore/hal/keyboard/keyus.h @@ -0,0 +1,28 @@ +#ifndef __KEYUS_H +#define __KEYUS_H + +extern const char kbdus_map[0x80]; +extern const char kbdus_map_shift[0x80]; + +extern volatile byte kb_modifier_status; +extern volatile byte kb_prefix; +extern volatile byte kb_lights_status; +extern byte kb_scancode_set; + +extern void i86_kb_set_key(byte scancode, byte val); +extern void i86_kb_set_LEDs(byte status); +extern void i86_kb_set_repeat(byte rate, byte delay); +extern void i86_kb_set_scancodeset(byte set); +extern byte i86_kb_get_key(byte scancode); +extern void i86_kb_handler(ISR_stack_regs *r); +extern kb_key getkey(); +extern void i86_kb_set_repeat(byte rate, byte delay); +extern void i86_kb_set_LEDs(byte status); +extern void i86_kb_set_scancodeset(byte set); +extern byte i86_kb_get_scancodeset(); +extern void i86_kb_waitin(); +extern void i86_kb_waitout(); +extern void i86_kb_install_partone(); +extern int i86_kb_install_parttwo(); + +#endif \ No newline at end of file diff --git a/SysCore/hal/makeall.bat b/SysCore/hal/makeall.bat new file mode 100644 index 0000000..f34925b --- /dev/null +++ b/SysCore/hal/makeall.bat @@ -0,0 +1,109 @@ +@echo off +set nasm_path=C:\nasm +set djgpp_path=C:\DJGPP\bin + +@echo Building Hardware Abstraction Layer... +set objpath=..\objects +set incpath=../include +del %objpath%\hal.o +%djgpp_path%\gcc.exe -Wall -O -fstrength-reduce -fomit-frame-pointer -nostdinc -fno-builtin -I%incpath% -c -o %objpath%/hal.o hal.c +if not exist %objpath%\hal.o goto error + +set objpath=..\..\objects +set incpath=../../include + +goto cmos + +:error + @echo. + @echo There have been build errors. Building halted. + @pause + exit + +:cmos + cd cmos + @echo * Compiling CMOS... + del %objpath%\cmos.o + %djgpp_path%\gcc.exe -Wall -O -fstrength-reduce -fomit-frame-pointer -nostdinc -fno-builtin -I%incpath% -c -o %objpath%/cmos.o cmos.c + if not exist %objpath%\cmos.o goto error + cd.. + +:cpu + cd cpu + @echo * Compiling Central Processing Unit... + del %objpath%\cpu.o + %djgpp_path%\gcc.exe -Wall -O -fstrength-reduce -fomit-frame-pointer -nostdinc -fno-builtin -I%incpath% -c -o %objpath%/cpu.o cpu.c + if not exist %objpath%\cpu.o goto error + + cd.. + +:gdt + cd gdt + @echo * Compiling Global Descriptor Table... + del %objpath%\gdt.o + del %objpath%\gdt_asm.o + %nasm_path%\nasm.exe -f aout -o %objpath%/gdt_asm.o gdt.asm + %djgpp_path%\gcc.exe -Wall -O -fstrength-reduce -fomit-frame-pointer -nostdinc -fno-builtin -I%incpath% -c -o %objpath%/gdt.o gdt.c + if not exist %objpath%\gdt.o goto error + if not exist %objpath%\gdt_asm.o goto error + cd.. + +:idt + cd idt + @echo * Compiling Interrupt Descriptor Table... + del %objpath%\idt.o + del %objpath%\idt_asm.o + %nasm_path%\nasm.exe -f aout -o %objpath%/idt_asm.o idt.asm + %djgpp_path%\gcc.exe -Wall -O -fstrength-reduce -fomit-frame-pointer -nostdinc -fno-builtin -I%incpath% -c -o %objpath%/idt.o idt.c + if not exist %objpath%\idt.o goto error + if not exist %objpath%\idt_asm.o goto error + cd.. + +:irq + cd irq + @echo * Compiling Interrupt ReQuests... + del %objpath%\irq.o + del %objpath%\irq_asm.o + %nasm_path%\nasm.exe -f aout -o %objpath%/irq_asm.o irq.asm + %djgpp_path%\gcc.exe -Wall -O -fstrength-reduce -fomit-frame-pointer -nostdinc -fno-builtin -I%incpath% -c -o %objpath%/irq.o irq.c + if not exist %objpath%\irq.o goto error + if not exist %objpath%\irq_asm.o goto error + cd.. + +:isrs + cd isrs + @echo * Compiling Interrupt Service Routines... + del %objpath%\isrs_asm.o + del %objpath%\isrs.o + del %objpath%\BSOD.o + %nasm_path%\nasm.exe -f aout -o %objpath%/isrs_asm.o isrs.asm + %djgpp_path%\gcc.exe -Wall -O -fstrength-reduce -fomit-frame-pointer -nostdinc -fno-builtin -I%incpath% -c -o %objpath%/isrs.o isrs.c + %djgpp_path%\gcc.exe -Wall -O -fstrength-reduce -fomit-frame-pointer -nostdinc -fno-builtin -I%incpath% -c -o %objpath%/BSOD.o BSOD.c + if not exist %objpath%\isrs_asm.o goto error + if not exist %objpath%\isrs.o goto error + if not exist %objpath%\BSOD.o goto error + cd.. + +:keyboard + cd keyboard + @echo * Compiling KEYBOARD... + del %objpath%\keyus.o + %djgpp_path%\gcc.exe -Wall -O -fstrength-reduce -fomit-frame-pointer -nostdinc -fno-builtin -I%incpath% -c -o %objpath%/keyus.o keyus.c + if not exist %objpath%\keyus.o goto error + cd.. + +:pic + cd pic + @echo * Compiling Programmable Interrupt Controller... + del %objpath%\pic.o + %djgpp_path%\gcc.exe -Wall -O -fstrength-reduce -fomit-frame-pointer -nostdinc -fno-builtin -I%incpath% -c -o %objpath%/pic.o pic.c + if not exist %objpath%\pic.o goto error + cd.. + +:pit + cd pit + @echo * Compiling Programmable Interval Timer... + del %objpath%\pit.o + %djgpp_path%\gcc.exe -Wall -O -fstrength-reduce -fomit-frame-pointer -nostdinc -fno-builtin -I%incpath% -c -o %objpath%/pit.o pit.c + if not exist %objpath%\pit.o goto error + cd.. \ No newline at end of file diff --git a/SysCore/hal/pic/compile.bat b/SysCore/hal/pic/compile.bat new file mode 100644 index 0000000..b2579f0 --- /dev/null +++ b/SysCore/hal/pic/compile.bat @@ -0,0 +1,18 @@ +@echo off +rem The name of the loader assembly file (without extension, must be .asm): +set loader_name=loader + +rem NASM and DJGPP executable paths: +set nasm_path=C:\nasm +set djgpp_path=C:\DJGPP\bin +set objpath=../../objects +set incpath=../../include + +@echo on +%djgpp_path%\gcc.exe -Wall -O -fstrength-reduce -fomit-frame-pointer -nostdinc -fno-builtin -I%incpath% -c -o %objpath%/pic.o pic.c + +@echo off +@echo . +@echo Done! + +@pause diff --git a/SysCore/hal/pic/pic.c b/SysCore/hal/pic/pic.c new file mode 100644 index 0000000..e283009 --- /dev/null +++ b/SysCore/hal/pic/pic.c @@ -0,0 +1,23 @@ +#include +#include "pic.h" + +void i86_pic_remap(int pic1, int pic2) +{ + // Send ICW1 + outportb(0x20, 0x11); + outportb(0xA0, 0x11); + + // send ICW2 + outportb(0x21, pic1); // remap pics + outportb(0xA1, pic2); + + // send ICW3 + outportb(0x21, 4); + outportb(0xA1, 2); + + // Send ICW4 + outportb(0x21, 0x01); + outportb(0xA1, 0x01); + + outportb(0x21, 0x00); +} diff --git a/SysCore/hal/pic/pic.h b/SysCore/hal/pic/pic.h new file mode 100644 index 0000000..72285d8 --- /dev/null +++ b/SysCore/hal/pic/pic.h @@ -0,0 +1,6 @@ +#ifndef _PIC_H +#define _PIC_H + +extern void i86_pic_remap(int pic1, int pic2); + +#endif \ No newline at end of file diff --git a/SysCore/hal/pit/compile.bat b/SysCore/hal/pit/compile.bat new file mode 100644 index 0000000..fb9bf7d --- /dev/null +++ b/SysCore/hal/pit/compile.bat @@ -0,0 +1,18 @@ +@echo off +rem The name of the loader assembly file (without extension, must be .asm): +set loader_name=loader + +rem NASM and DJGPP executable paths: +set nasm_path=C:\nasm +set djgpp_path=C:\DJGPP\bin +set objpath=../../objects +set incpath=../../include + +@echo on +%djgpp_path%\gcc.exe -Wall -O -fstrength-reduce -fomit-frame-pointer -nostdinc -fno-builtin -I%incpath% -c -o %objpath%/pit.o pit.c + +@echo off +@echo . +@echo Done! + +@pause diff --git a/SysCore/hal/pit/pit.c b/SysCore/hal/pit/pit.c new file mode 100644 index 0000000..5e24e22 --- /dev/null +++ b/SysCore/hal/pit/pit.c @@ -0,0 +1,56 @@ +#include +#include +#include "../irq/irq.h" +#include "pit.h" + +volatile unsigned int _pit_ticks = 0; +volatile unsigned int _pit_frequency = 0; +unsigned char _pit_init = 0; +volatile TIME _internal_clock; + + +void i86_pit_set_frequency(int frequency) +{ + int divisor = 1193180/frequency; // Calculate the divisor + outportb(0x43, 0x36); // Set our command byte 0x36 + outportb(0x40, divisor&0xFF); // Set low byte + outportb(0x40, divisor>>8); // Set high byte + _pit_frequency = frequency; +} + +void i86_pit_handler(ISR_stack_regs *r) +{ + _pit_ticks++; // count tick + if (_pit_ticks % _pit_frequency == 0) + _CLOCK_INC((TIME*)&_internal_clock); // update internal clock +} + +unsigned int i86_pit_set_tick_count(unsigned int i) +{ + unsigned int r = _pit_ticks; + _pit_ticks = i; + return r; +} + +unsigned int i86_pit_get_tick_count() +{ + return _pit_ticks; +} +unsigned int i86_pit_get_frequency() +{ + return _pit_frequency; +} + +void i86_pit_install(int freq) +{ + i86_irq_install_handler(0, i86_pit_handler); + i86_pit_set_frequency(freq); + _pit_ticks = 0; + _pit_init = 1; + +} + +unsigned char i86_pit_is_initialized() +{ + return _pit_init; +} diff --git a/SysCore/hal/pit/pit.h b/SysCore/hal/pit/pit.h new file mode 100644 index 0000000..93c3d28 --- /dev/null +++ b/SysCore/hal/pit/pit.h @@ -0,0 +1,17 @@ +#ifndef __PIT_H +#define __PIT_H + +#include +extern volatile unsigned int _pit_ticks; +extern volatile unsigned int _pit_frequency; +extern volatile TIME _internal_clock; + +extern void i86_pit_handler(ISR_stack_regs *r); +extern void i86_pit_set_frequency(int frequency); +extern unsigned int i86_pit_set_tick_count(unsigned int i); +extern unsigned int i86_pit_get_tick_count(); +extern unsigned int i86_pit_get_frequency(); +extern void i86_pit_install(int freq); +extern unsigned char i86_pit_is_initialized(); + +#endif \ No newline at end of file diff --git a/SysCore/include/_null.h b/SysCore/include/_null.h new file mode 100644 index 0000000..8d731bf --- /dev/null +++ b/SysCore/include/_null.h @@ -0,0 +1,30 @@ + +#ifndef __NULL_H +#define __NULL_H + +/****************************** + * _null.h * + * - NULL declaration * + ******************************/ + +#if defined (_MSC_VER) && (_MSC_VER >= 1020) +# pragma once +#endif + +#ifdef NULL +#undef NULL +#endif + +#ifdef __cplusplus +extern "C" +{ +/* standard NULL declaration */ +#define NULL 0 +} +#else +/* standard NULL declaration */ +#define NULL (void*)0 +#endif + + +#endif diff --git a/SysCore/include/bootinfo.h b/SysCore/include/bootinfo.h new file mode 100644 index 0000000..5b0599c --- /dev/null +++ b/SysCore/include/bootinfo.h @@ -0,0 +1,39 @@ +#ifndef _BOOTINFO_H +#define _BOOTINFO_H +//**************************************************************************** +//** bootinfo.h +//**************************************************************************** + +#include + +//! multiboot info structure passed from boot loader + +typedef struct { + + uint32_t m_flags; + uint32_t m_memoryLo; + uint32_t m_memoryHi; + uint32_t m_bootDevice; + uint32_t m_cmdLine; + uint32_t m_modsCount; + uint32_t m_modsAddr; + uint32_t m_syms0; + uint32_t m_syms1; + uint32_t m_syms2; + uint32_t m_mmap_length; + uint32_t m_mmap_addr; + uint32_t m_drives_length; + uint32_t m_drives_addr; + uint32_t m_config_table; + uint32_t m_bootloader_name; + uint32_t m_apm_table; + uint32_t m_vbe_control_info; + uint32_t m_vbe_mode_info; + uint16_t m_vbe_mode; + uint32_t m_vbe_interface_addr; + uint16_t m_vbe_interface_len; +} multiboot_info ; + + +#endif + diff --git a/SysCore/include/cctype b/SysCore/include/cctype new file mode 100644 index 0000000..7ce3762 --- /dev/null +++ b/SysCore/include/cctype @@ -0,0 +1,9 @@ +// cerrno standard header + +#ifndef _CSTDCTYPE_ +#define _CSTDCTYPE_ +#include + +#endif /* _CSTDCTYPE_ */ + + diff --git a/SysCore/include/conio.h b/SysCore/include/conio.h new file mode 100644 index 0000000..ecae7b6 --- /dev/null +++ b/SysCore/include/conio.h @@ -0,0 +1,30 @@ +#ifndef __CONIO_H +#define __CONIO_H +#define _ATTRIB 0x0F + +extern byte default_background, default_foreground; +extern char hex[16]; + +extern void itoa (int value, char *string, unsigned int radix); +extern int printf(const char* str, ...); +extern int abs(int x); +extern void graphics_init(); +extern void text_mode_cursor(int x, int y); +extern void set_default_colors(byte back, byte fore); +extern void clrscr(); +extern void scroll(int n); +extern void prev_line(); +extern void next_line(); +extern void putc_pos_font(int x, int y, char c, byte back, byte fore); +extern void putc_pos(int x, int y, char c); +extern void putc_font(char c, byte back, byte fore); +extern void putc(char c); +extern void puts_pos_font(int x, int y, const char *str, byte back, byte fore); +extern void puts_pos(int x, int y, const char *str); +extern void puts(const char *str); +extern void puts_font(const char *str, byte back, byte fore); +extern void put_hex(unsigned int alpha); +extern void put_hex_pos(int x, int y, unsigned int alpha); +extern void put_bin (int x, int y, byte xz); + +#endif \ No newline at end of file diff --git a/SysCore/include/crtdefs.h b/SysCore/include/crtdefs.h new file mode 100644 index 0000000..42c63aa --- /dev/null +++ b/SysCore/include/crtdefs.h @@ -0,0 +1,50 @@ +#ifndef _CRTDEFS_H +#define _CRTDEFS_H + +/****************************** + * crtdefs.h * + * - basic definitions * + ******************************/ + +#if !defined (CRT_EXPORTS) && !defined (CRT_IMPORTS) +#define CRT_EXPORTS +#endif + +#undef far +#undef near +#undef pascal + +#define far +#define near + +#ifdef _WIN32 +#if (!defined(_MAC)) && ((_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED)) +#define pascal __stdcall +#else +#define pascal +#endif +#endif + +#ifdef _MAC +#ifndef _CRTLIB +#define _CRTLIB __cdecl +#endif +#ifdef _68K_ +#ifndef __pascal +#define __pascal +#endif +#endif +#elif defined( _WIN32) +#if (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED) +#ifndef _CRTLIB +#define _CRTLIB __stdcall +#endif +#else +#ifndef _CRTLIB +#define _CRTLIB +#endif +#endif +#endif + + +#endif diff --git a/SysCore/include/cstdarg b/SysCore/include/cstdarg new file mode 100644 index 0000000..37ccae7 --- /dev/null +++ b/SysCore/include/cstdarg @@ -0,0 +1,7 @@ +// cerrno standard header + +#ifndef _CSTDARG_ +#define _CSTDARG_ +#include + +#endif /* _CSTDARG_ */ diff --git a/SysCore/include/cstdint b/SysCore/include/cstdint new file mode 100644 index 0000000..7629317 --- /dev/null +++ b/SysCore/include/cstdint @@ -0,0 +1,9 @@ +// cerrno standard header + +#ifndef _CSTDINT_ +#define _CSTDINT_ +#include + +#endif /* _CSTDINT_ */ + + diff --git a/SysCore/include/cstring b/SysCore/include/cstring new file mode 100644 index 0000000..beb9135 --- /dev/null +++ b/SysCore/include/cstring @@ -0,0 +1,9 @@ +// cstring standard header + +#ifndef _CSTDSTRING_ +#define _CSTDSTRING_ +#include + +#endif /* _CSTDINT_ */ + + diff --git a/SysCore/include/ctype.h b/SysCore/include/ctype.h new file mode 100644 index 0000000..23beb48 --- /dev/null +++ b/SysCore/include/ctype.h @@ -0,0 +1,55 @@ +#ifndef __CTYPE_H +#define __CTYPE_H + +/****************************** + * ctype.h * + * - character macros * + ******************************/ + +#ifdef _MSC_VER +// Get rid of conversion warnings +#pragma warning (disable:4244) +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif + +extern char _ctype[]; + +/* Constants */ + +#define CT_UP 0x01 /* upper case */ +#define CT_LOW 0x02 /* lower case */ +#define CT_DIG 0x04 /* digit */ +#define CT_CTL 0x08 /* control */ +#define CT_PUN 0x10 /* punctuation */ +#define CT_WHT 0x20 /* white space (space/cr/lf/tab) */ +#define CT_HEX 0x40 /* hex digit */ +#define CT_SP 0x80 /* hard space (0x20) */ + +/* Basic macros */ + +#define isalnum(c) ((_ctype + 1)[(unsigned)(c)] & (CT_UP | CT_LOW | CT_DIG)) +#define isalpha(c) ((_ctype + 1)[(unsigned)(c)] & (CT_UP | CT_LOW)) +#define iscntrl(c) ((_ctype + 1)[(unsigned)(c)] & (CT_CTL)) +#define isdigit(c) ((_ctype + 1)[(unsigned)(c)] & (CT_DIG)) +#define isgraph(c) ((_ctype + 1)[(unsigned)(c)] & (CT_PUN | CT_UP | CT_LOW | CT_DIG)) +#define islower(c) ((_ctype + 1)[(unsigned)(c)] & (CT_LOW)) +#define isprint(c) ((_ctype + 1)[(unsigned)(c)] & (CT_PUN | CT_UP | CT_LOW | CT_DIG | CT_SP)) +#define ispunct(c) ((_ctype + 1)[(unsigned)(c)] & (CT_PUN)) +#define isspace(c) ((_ctype + 1)[(unsigned)(c)] & (CT_WHT)) +#define isupper(c) ((_ctype + 1)[(unsigned)(c)] & (CT_UP)) +#define isxdigit(c) ((_ctype + 1)[(unsigned)(c)] & (CT_DIG | CT_HEX)) +#define isascii(c) ((unsigned)(c) <= 0x7F) +#define toascii(c) ((unsigned)(c) & 0x7F) +#define tolower(c) (isupper(c) ? c + 'a' - 'A' : c) +#define toupper(c) (islower(c) ? c + 'A' - 'a' : c) + +#ifdef __cplusplus +} +#endif + + +#endif diff --git a/SysCore/include/hal.h b/SysCore/include/hal.h new file mode 100644 index 0000000..60ac986 --- /dev/null +++ b/SysCore/include/hal.h @@ -0,0 +1,180 @@ +#ifndef _HAL_H +#define _HAL_H + +#include +#include +#define far +#define near + +#define i86_start_interrupts() __asm__ __volatile__ ("sti"); +#define i86_clear_interrupts() __asm__ __volatile__ ("cli"); + +extern volatile TIME _internal_clock; + +// initialize hardware abstraction layer +extern void i86_hal_initialize (); + +// shutdown hardware abstraction layer +extern int i86_hal_shutdown (); + +//! notifies hal interrupt is done +//extern void interruptdone (unsigned int intno); + +//! output sound to speaker +extern void sound (unsigned frequency); + +//! read byte from device using port mapped io +//extern unsigned char inportb (unsigned short _port); + +//! write byte to device through port mapped io +//extern void outportb (unsigned short _port, unsigned char _data); + +//! sets new interrupt vector +//extern void setvect (int intno, void ( far &vect) ( ) ); + +//! returns current interrupt vector +//extern void ( far * getvect (int intno)) ( ); + +//! returns cpu vender +extern const char* get_cpu_vender (); + +extern void reboot(); + + +/********************************************************************** + * KEYBOARD STUFF * + **********************************************************************/ +#define KB_KEY_LSHIFT 0x81 // 1000 0001 +#define KB_KEY_RSHIFT 0X82 // 1000 0010 +#define KB_KEY_LALT 0X84 // 1000 0100 +#define KB_KEY_RALT 0x88 // 1000 1000 +#define KB_KEY_LCTRL 0x90 // 1001 0000 +#define KB_KEY_RCTRL 0xA0 // 1010 0000 +#define KB_KEY_FSHIFT 0xC0 // 1100 0000 +extern volatile byte kb_modifier_status; + +#define KB_PREFIX_GRAY 0x01 // Gray +#define KB_PREFIX_BREAK 0x02 // Break code +#define KB_PREFIX_PAUSE 0x04 // Pause/break key +#define KB_PREFIX_PAUSE1 0x08 // Recieved first byte from pause/break +extern volatile byte kb_prefix; + +#define KB_KEY_SCROLL 0xF1 // 1111 0001 +#define KB_KEY_NUM 0xF2 // 1111 0010 +#define KB_KEY_CAPS 0xF4 // 1111 0100 +extern volatile byte kb_lights_status; + +extern byte kb_scancode_set; +#define KB_KEY_PAUSE 0x00 +#define KB_KEY_F9 0x01 +#define KB_KEY_F7 0x02 +#define KB_KEY_F5 0X03 +#define KB_KEY_F3 0x04 +#define KB_KEY_F1 0x05 +#define KB_KEY_F2 0x06 +#define KB_KEY_F12 0x07 +#define KB_KEY_PRINTSCRN 0x08 +#define KB_KEY_F10 0x09 +#define KB_KEY_F8 0x0A +#define KB_KEY_F6 0x0B +#define KB_KEY_F4 0x0C +#define KB_KEY_TAB 0x0D +#define KB_KEY_TILDA 0x0E +#define KB_KEY_Q 0x15 +#define KB_KEY_1 0x16 +#define KB_KEY_Z 0x1A +#define KB_KEY_S 0x1B +#define KB_KEY_A 0x1C +#define KB_KEY_W 0x1D +#define KB_KEY_2 0x1E +#define KB_KEY_LWIN 0x1F +#define KB_KEY_C 0x21 +#define KB_KEY_X 0x22 +#define KB_KEY_D 0x23 +#define KB_KEY_E 0x24 +#define KB_KEY_4 0x25 +#define KB_KEY_3 0x26 +#define KB_KEY_RWIN 0x27 +#define KB_KEY_SPACE 0x29 +#define KB_KEY_V 0x2A +#define KB_KEY_F 0x2B +#define KB_KEY_T 0x2C +#define KB_KEY_R 0x2D +#define KB_KEY_5 0x2E +#define KB_KEY_MENU 0x2F +#define KB_KEY_N 0x31 +#define KB_KEY_B 0x32 +#define KB_KEY_H 0x33 +#define KB_KEY_G 0x34 +#define KB_KEY_Y 0x35 +#define KB_KEY_6 0x36 +#define KB_KEY_M 0x3A +#define KB_KEY_J 0x3B +#define KB_KEY_U 0x3C +#define KB_KEY_7 0x3D +#define KB_KEY_8 0x3E +#define KB_KEY_COMMA 0x41 +#define KB_KEY_K 0x42 +#define KB_KEY_I 0x43 +#define KB_KEY_O 0x44 +#define KB_KEY_0 0x45 +#define KB_KEY_9 0x46 +#define KB_KEY_PERIOD 0x49 +#define KB_KEY_SLASH 0x4A +#define KB_KEY_L 0x4B +#define KB_KEY_SEMICOLON 0x4C +#define KB_KEY_P 0x4D +#define KB_KEY_DASH 0x4E +#define KB_KEY_APOSTROPHE 0x52 +#define KB_KEY_LBRACKET 0x54 +#define KB_KEY_EQUAL 0x55 +#define KB_KEY_NUMPAD_ENTER 0x59 +#define KB_KEY_ENTER 0x5A +#define KB_KEY_RBRACKET 0x5B +#define KB_KEY_BACKSLASH 0x5D +#define KB_KEY_END 0x5E +#define KB_KEY_LEFT 0x5F +#define KB_KEY_HOME 0x60 +#define KB_KEY_INSERT 0x61 +#define KB_KEY_DELETE 0x62 +#define KB_KEY_DOWN 0x63 +#define KB_KEY_RIGHT 0x64 +#define KB_KEY_UP 0x65 +#define KB_KEY_BACKSPACE 0x66 +#define KB_KEY_PGDOWN 0x67 +#define KB_KEY_PGUP 0x68 +#define KB_KEY_NUMPAD_1 0x69 +#define KB_KEY_NUMPAD_SLASH 0x6A +#define KB_KEY_NUMPAD_4 0x6B +#define KB_KEY_NUMPAD_7 0x6C +#define KB_KEY_NUMPAD_0 0x70 +#define KB_KEY_NUMPAD_COLON 0x71 +#define KB_KEY_NUMPAD_2 0x72 +#define KB_KEY_NUMPAD_5 0x73 +#define KB_KEY_NUMPAD_6 0x74 +#define KB_KEY_NUMPAD_8 0x75 +#define KB_KEY_ESC 0x76 +#define KB_KEY_F11 0x78 +#define KB_KEY_NUMPAD_PLUS 0x79 +#define KB_KEY_NUMPAD_3 0x7A +#define KB_KEY_NUMPAD_MINUS 0x7B +#define KB_KEY_NUMPAD_ASTERISK 0x7C +#define KB_KEY_NUMPAD_9 0x7D + + +typedef struct { + byte status; + byte lights; + byte scancode; + byte character; +} kb_key; + + +extern char getch(); +extern kb_key getkey(); +extern char scancode_to_ascii(byte scancode, byte status); +extern byte get_key_status(byte scancode); +extern void kb_set_repeat(float rate, int delay); +extern void kb_set_LEDs(byte status); + +#endif \ No newline at end of file diff --git a/SysCore/include/regs.h b/SysCore/include/regs.h new file mode 100644 index 0000000..492ee1f --- /dev/null +++ b/SysCore/include/regs.h @@ -0,0 +1,100 @@ +#ifndef _REGS_H_INCLUDED +#define _REGS_H_INCLUDED +//**************************************************************************** +//** +//** regs.h +//** +//** processor register structures and declarations. This interface abstracts +//** register names behind a common, portable interface +//** +//**************************************************************************** + +//============================================================================ +// INTERFACE REQUIRED HEADERS +//============================================================================ + +#include + +//============================================================================ +// INTERFACE DEFINITIONS / ENUMERATIONS / SIMPLE TYPEDEFS +//============================================================================ +//============================================================================ +// INTERFACE CLASS PROTOTYPES / EXTERNAL CLASS REFERENCES +//============================================================================ +//============================================================================ +// INTERFACE STRUCTURES / UTILITY CLASSES +//============================================================================ + +//! 32 bit registers +typedef struct { + uint32_t eax, ebx, ecx, edx, esi, edi, ebp, esp, eflags; + uint8_t cflag; +} _R32BIT; + +//! 16 bit registers +typedef struct { + uint16_t ax, bx, cx, dx, si, di, bp, sp, es, cs, ss, ds, flags; + uint8_t cflag; +} _R16BIT ; + +//! 16 bit registers expressed in 32 bit registers +typedef struct { + uint16_t ax, axh, bx, bxh, cx, cxh, dx, dxh; + uint16_t si, di, bp, sp, es, cs, ss, ds, flags; + uint8_t cflags; +} _R16BIT32 ; + +//! 8 bit registers +typedef struct { + uint8_t al, ah, bl, bh, cl, ch, dl, dh; +} _R8BIT; + +//! 8 bit registers expressed in 32 bit registers +typedef struct { + uint8_t al, ah; uint16_t axh; + uint8_t bl, bh; uint16_t bxh; + uint8_t cl, ch; uint16_t cxh; + uint8_t dl, dh; uint16_t dxh; +} _R8BIT32; + +//! 8 and 16 bit registers union +typedef union { + _R16BIT x; + _R8BIT h; +}_INTR16; + +//! 32 bit, 16 bit and 8 bit registers union +typedef union { + _R32BIT x; + _R16BIT32 l; + _R8BIT32 h; +} _INTR32; + +/* This defines what the stack looks like after an ISR was running */ +typedef struct +{ + unsigned int gs, fs, es, ds; /* pushed the segs last */ + unsigned int edi, esi, ebp, esp, ebx, edx, ecx, eax; /* pushed by 'pusha' */ + unsigned int int_no, err_code; /* our 'push byte #' and ecodes do this */ + unsigned int eip, cs, eflags, useresp, ss; /* pushed by the processor automatically */ +} ISR_stack_regs; + + +//============================================================================ +// INTERFACE DATA DECLARATIONS +//============================================================================ +//============================================================================ +// INTERFACE FUNCTION PROTOTYPES +//============================================================================ +//============================================================================ +// INTERFACE OBJECT CLASS DEFINITIONS +//============================================================================ +//============================================================================ +// INTERFACE TRAILING HEADERS +//============================================================================ +//**************************************************************************** +//** +//** END regs.h +//** +//**************************************************************************** +#endif diff --git a/SysCore/include/size_t.h b/SysCore/include/size_t.h new file mode 100644 index 0000000..7e4b1cc --- /dev/null +++ b/SysCore/include/size_t.h @@ -0,0 +1,23 @@ +#ifndef __SIZE_T_H +#define __SIZE_T_H + +/************************************ + * size_t.h * + * - Standard C/C++ size_t type * + ************************************/ + +#ifdef __cplusplus +extern "C" +{ +#endif + +/* standard size_t type */ +typedef unsigned size_t; + +#ifdef __cplusplus +} +#endif + + + +#endif diff --git a/SysCore/include/stdarg.h b/SysCore/include/stdarg.h new file mode 100644 index 0000000..257f25b --- /dev/null +++ b/SysCore/include/stdarg.h @@ -0,0 +1,46 @@ +#ifndef __STDARG_H +#define __STDARG_H + + +/****************************** + * [filename] * + * - [description] * + ******************************/ + +// INTERFACE REQUIRED HEADERS +#include + + +// INTERFACE DEFINITIONS / ENUMERATIONS / SIMPLE TYPEDEFS +#ifdef __cplusplus +extern "C" +{ +#endif + +/* width of stack == width of int */ +#define STACKITEM int + +/* round up width of objects pushed on stack. The expression before the +& ensures that we get 0 for objects of size 0. */ +#define VA_SIZE(TYPE) \ + ((sizeof(TYPE) + sizeof(STACKITEM) - 1) \ + & ~(sizeof(STACKITEM) - 1)) + +/* &(LASTARG) points to the LEFTMOST argument of the function call +(before the ...) */ +#define va_start(AP, LASTARG) \ + (AP=((va_list)&(LASTARG) + VA_SIZE(LASTARG))) + +/* nothing for va_end */ +#define va_end(AP) + +#define va_arg(AP, TYPE) \ + (AP += VA_SIZE(TYPE), *((TYPE *)(AP - VA_SIZE(TYPE)))) + +#ifdef __cplusplus +} +#endif + + + +#endif diff --git a/SysCore/include/stdint.h b/SysCore/include/stdint.h new file mode 100644 index 0000000..3338763 --- /dev/null +++ b/SysCore/include/stdint.h @@ -0,0 +1,163 @@ + +#ifndef _STDINT_H +#define _STDINT_H + +#define __need_wint_t +#define __need_wchar_t + + +/*************************************** + * stdint.h * + * - Standard C++ integral types * + ***************************************/ + +/* 7.18.1.1 Exact-width integer types */ +typedef signed char int8_t; +typedef unsigned char uint8_t; +typedef short int16_t; +typedef unsigned short uint16_t; +typedef int int32_t; +typedef unsigned uint32_t; +typedef long long int64_t; +typedef unsigned long long uint64_t; + +/* 7.18.1.2 Minimum-width integer types */ +typedef signed char int_least8_t; +typedef unsigned char uint_least8_t; +typedef short int_least16_t; +typedef unsigned short uint_least16_t; +typedef int int_least32_t; +typedef unsigned uint_least32_t; +typedef long long int_least64_t; +typedef unsigned long long uint_least64_t; + +/* 7.18.1.3 Fastest minimum-width integer types + * Not actually guaranteed to be fastest for all purposes + * Here we use the exact-width types for 8 and 16-bit ints. + */ +typedef char int_fast8_t; +typedef unsigned char uint_fast8_t; +typedef short int_fast16_t; +typedef unsigned short uint_fast16_t; +typedef int int_fast32_t; +typedef unsigned int uint_fast32_t; +typedef long long int_fast64_t; +typedef unsigned long long uint_fast64_t; + +/* 7.18.1.4 Integer types capable of holding object pointers */ +typedef int intptr_t; +typedef unsigned uintptr_t; + +/* 7.18.1.5 Greatest-width integer types */ +typedef long long intmax_t; +typedef unsigned long long uintmax_t; + +/* 7.18.2 Limits of specified-width integer types */ +#if !defined ( __cplusplus) || defined (__STDC_LIMIT_MACROS) + +/* 7.18.2.1 Limits of exact-width integer types */ +#define INT8_MIN (-128) +#define INT16_MIN (-32768) +#define INT32_MIN (-2147483647 - 1) +#define INT64_MIN (-9223372036854775807LL - 1) + +#define INT8_MAX 127 +#define INT16_MAX 32767 +#define INT32_MAX 2147483647 +#define INT64_MAX 9223372036854775807LL + +#define UINT8_MAX 0xff /* 255U */ +#define UINT16_MAX 0xffff /* 65535U */ +#define UINT32_MAX 0xffffffff /* 4294967295U */ +#define UINT64_MAX 0xffffffffffffffffULL /* 18446744073709551615ULL */ + +/* 7.18.2.2 Limits of minimum-width integer types */ +#define INT_LEAST8_MIN INT8_MIN +#define INT_LEAST16_MIN INT16_MIN +#define INT_LEAST32_MIN INT32_MIN +#define INT_LEAST64_MIN INT64_MIN + +#define INT_LEAST8_MAX INT8_MAX +#define INT_LEAST16_MAX INT16_MAX +#define INT_LEAST32_MAX INT32_MAX +#define INT_LEAST64_MAX INT64_MAX + +#define UINT_LEAST8_MAX UINT8_MAX +#define UINT_LEAST16_MAX UINT16_MAX +#define UINT_LEAST32_MAX UINT32_MAX +#define UINT_LEAST64_MAX UINT64_MAX + +/* 7.18.2.3 Limits of fastest minimum-width integer types */ +#define INT_FAST8_MIN INT8_MIN +#define INT_FAST16_MIN INT16_MIN +#define INT_FAST32_MIN INT32_MIN +#define INT_FAST64_MIN INT64_MIN + +#define INT_FAST8_MAX INT8_MAX +#define INT_FAST16_MAX INT16_MAX +#define INT_FAST32_MAX INT32_MAX +#define INT_FAST64_MAX INT64_MAX + +#define UINT_FAST8_MAX UINT8_MAX +#define UINT_FAST16_MAX UINT16_MAX +#define UINT_FAST32_MAX UINT32_MAX +#define UINT_FAST64_MAX UINT64_MAX + +/* 7.18.2.4 Limits of integer types capable of holding + object pointers */ +#define INTPTR_MIN INT32_MIN +#define INTPTR_MAX INT32_MAX +#define UINTPTR_MAX UINT32_MAX + +/* 7.18.2.5 Limits of greatest-width integer types */ +#define INTMAX_MIN INT64_MIN +#define INTMAX_MAX INT64_MAX +#define UINTMAX_MAX UINT64_MAX + +/* 7.18.3 Limits of other integer types */ +#define PTRDIFF_MIN INT32_MIN +#define PTRDIFF_MAX INT32_MAX + +#define SIG_ATOMIC_MIN INT32_MIN +#define SIG_ATOMIC_MAX INT32_MAX + +#define SIZE_MAX UINT32_MAX + +#ifndef WCHAR_MIN /* also in wchar.h */ +#define WCHAR_MIN 0 +#define WCHAR_MAX ((wchar_t)-1) /* UINT16_MAX */ +#endif + +/* + * wint_t is unsigned short for compatibility with MS runtime + */ +#define WINT_MIN 0 +#define WINT_MAX ((wint_t)-1) /* UINT16_MAX */ + +#endif /* !defined ( __cplusplus) || defined __STDC_LIMIT_MACROS */ + + +/* 7.18.4 Macros for integer constants */ +#if !defined ( __cplusplus) || defined (__STDC_CONSTANT_MACROS) + +/* 7.18.4.1 Macros for minimum-width integer constants */ + +#define INT8_C(val) ((int8_t) + (val)) +#define UINT8_C(val) ((uint8_t) + (val##U)) +#define INT16_C(val) ((int16_t) + (val)) +#define UINT16_C(val) ((uint16_t) + (val##U)) + +#define INT32_C(val) val##L +#define UINT32_C(val) val##UL +#define INT64_C(val) val##LL +#define UINT64_C(val) val##ULL + +/* 7.18.4.2 Macros for greatest-width integer constants */ +#define INTMAX_C(val) INT64_C(val) +#define UINTMAX_C(val) UINT64_C(val) + +#endif /* !defined ( __cplusplus) || defined __STDC_CONSTANT_MACROS */ + + + +#endif diff --git a/SysCore/include/string.h b/SysCore/include/string.h new file mode 100644 index 0000000..54a553f --- /dev/null +++ b/SysCore/include/string.h @@ -0,0 +1,46 @@ +#ifndef _STRING_H +#define _STRING_H +//**************************************************************************** +//** +//** [string.h] +//** - Standard C String routines +//** +//**************************************************************************** +//============================================================================ +// INTERFACE REQUIRED HEADERS +//============================================================================ + +#include + +//============================================================================ +// INTERFACE DEFINITIONS / ENUMERATIONS / SIMPLE TYPEDEFS +//============================================================================ +//============================================================================ +// INTERFACE CLASS PROTOTYPES / EXTERNAL CLASS REFERENCES +//============================================================================ +//============================================================================ +// INTERFACE STRUCTURES / UTILITY CLASSES +//============================================================================ +//============================================================================ +// INTERFACE DATA DECLARATIONS +//============================================================================ +//============================================================================ +// INTERFACE FUNCTION PROTOTYPES +//============================================================================ + +extern size_t strlen (const char *str); +extern int strcmp(const char *pStr1, const char *pStr2); + +//============================================================================ +// INTERFACE OBJECT CLASS DEFINITIONS +//============================================================================ +//============================================================================ +// INTERFACE TRAILING HEADERS +//============================================================================ +//**************************************************************************** +//** +//** END [string.h] +//** +//**************************************************************************** + +#endif diff --git a/SysCore/include/sys/declarat.h b/SysCore/include/sys/declarat.h new file mode 100644 index 0000000..8b9c97f --- /dev/null +++ b/SysCore/include/sys/declarat.h @@ -0,0 +1,21 @@ +#ifndef __DECLARAT_H +#define __DECLARAT_H + +// Data type declarations +typedef unsigned char byte; +typedef unsigned short word; +typedef unsigned int dword; + +// Functions +void system_init(); + +void isrs_install(); + +void irq_install_handler(int irq, void (*handler)(ISR_stack_regs *r)); +void irq_uninstall_handler(int irq); +void irq_install(); +void kb_handler(ISR_stack_regs *r); +void reboot(); +void kb_waitin(); + +#endif \ No newline at end of file diff --git a/SysCore/include/system.h b/SysCore/include/system.h new file mode 100644 index 0000000..106fdf6 --- /dev/null +++ b/SysCore/include/system.h @@ -0,0 +1,40 @@ +/******************************************************************* + * system.c - Basic system functions and variables declaration * + *******************************************************************/ +#ifndef __SYSTEM_H +#define __SYSTEM_H +#include + +#define true 1 +#define false 0 + +// Data type declarations +typedef unsigned char byte; +typedef unsigned short word; +typedef unsigned int dword; + +extern byte *TextVideoRam; +extern volatile int cursor_x, cursor_y; +extern int current_mode_width; +extern int current_mode_height; + +extern void *memcpy(void *dest, const void *src, int count); +extern void *memset(void *dest, char val, int count); +extern unsigned short *memsetw(unsigned short *dest, unsigned short val, int count); + +extern byte inportb (word _port); +extern byte inb (word _port); + +static inline void outportb (word _port, byte _data) { + __asm__ __volatile__ ("outb %1, %0" : : "dN" (_port), "a" (_data)); +} +static inline void outb (word _port, byte _data) { + __asm__ __volatile__ ("outb %1, %0" : : "dN" (_port), "a" (_data)); +} + +static inline void iowait() { + asm volatile ("outb %al, $0x80"); +} + + +#endif \ No newline at end of file diff --git a/SysCore/include/time.h b/SysCore/include/time.h new file mode 100644 index 0000000..33eecaa --- /dev/null +++ b/SysCore/include/time.h @@ -0,0 +1,25 @@ +#ifndef __TIME_C +#define __TIME_C + +extern const char* clock_months[13]; +extern const char* clock_weekdays[8]; +extern byte clock_months_len[13]; + +typedef struct { + byte seconds; + byte minutes; + byte hours; + byte weekday; + byte day; + byte month; + byte year; + byte century; + byte am_pm; + +} TIME; + +extern void _CLOCK_INC(TIME *tim); + +//extern char* asctime (TIME time); + +#endif \ No newline at end of file diff --git a/SysCore/include/va_list.h b/SysCore/include/va_list.h new file mode 100644 index 0000000..2eaabc8 --- /dev/null +++ b/SysCore/include/va_list.h @@ -0,0 +1,52 @@ +#ifndef __VA_LIST_H +#define __VA_LIST_H +//**************************************************************************** +//** +//** va_list.h +//** - varable length parameter definition +//** +//**************************************************************************** +//============================================================================ +// INTERFACE REQUIRED HEADERS +//============================================================================ +//============================================================================ +// INTERFACE DEFINITIONS / ENUMERATIONS / SIMPLE TYPEDEFS +//============================================================================ + +#ifdef __cplusplus +extern "C" +{ +#endif + +/* va list parameter list */ +typedef unsigned char *va_list; + +#ifdef __cplusplus +} +#endif + +//============================================================================ +// INTERFACE CLASS PROTOTYPES / EXTERNAL CLASS REFERENCES +//============================================================================ +//============================================================================ +// INTERFACE STRUCTURES / UTILITY CLASSES +//============================================================================ +//============================================================================ +// INTERFACE DATA DECLARATIONS +//============================================================================ +//============================================================================ +// INTERFACE FUNCTION PROTOTYPES +//============================================================================ +//============================================================================ +// INTERFACE OBJECT CLASS DEFINITIONS +//============================================================================ +//============================================================================ +// INTERFACE TRAILING HEADERS +//============================================================================ +//**************************************************************************** +//** +//** END va_list.h +//** +//**************************************************************************** + +#endif diff --git a/SysCore/lib/compile.bat b/SysCore/lib/compile.bat new file mode 100644 index 0000000..91ab1d4 --- /dev/null +++ b/SysCore/lib/compile.bat @@ -0,0 +1,40 @@ +@echo off + +rem NASM and DJGPP executable paths: +set nasm_path=C:\nasm +set djgpp_path=C:\DJGPP\bin +set objpath=..\objects +set incpath=../include + +@echo Building Kernel Standard Libraries... + +del %objpath%\system.o +del %objpath%\string.o +del %objpath%\conio.o +del %objpath%\time.o + +goto build +:error + @echo. + @echo There have been build errors. Building halted. + @pause + exit + +:build + @echo * Compiling SYSTEM.C ... + %djgpp_path%\gcc.exe -Wall -O -fstrength-reduce -fomit-frame-pointer -nostdinc -fno-builtin -I%incpath% -c -o %objpath%/system.o system.c + + @echo * Compiling STRING.C ... + %djgpp_path%\gcc.exe -Wall -O -fstrength-reduce -fomit-frame-pointer -nostdinc -fno-builtin -I%incpath% -c -o %objpath%/string.o string.c + + @echo * Compiling CONIO.C ... + %djgpp_path%\gcc.exe -Wall -O -fstrength-reduce -fomit-frame-pointer -nostdinc -fno-builtin -I%incpath% -c -o %objpath%/conio.o conio.c + + @echo * Compiling TIME.C ... + %djgpp_path%\gcc.exe -Wall -O -fstrength-reduce -fomit-frame-pointer -nostdinc -fno-builtin -I%incpath% -c -o %objpath%/time.o time.c + +:check + if not exist %objpath%\system.o goto error + if not exist %objpath%\string.o goto error + if not exist %objpath%\conio.o goto error + if not exist %objpath%\time.o goto error diff --git a/kernel/include/conio.h b/SysCore/lib/conio.c similarity index 51% rename from kernel/include/conio.h rename to SysCore/lib/conio.c index b2718b1..0864238 100644 --- a/kernel/include/conio.h +++ b/SysCore/lib/conio.c @@ -1,12 +1,32 @@ +#include +#include +#include #include - -#ifndef __CONIO_H -#define __CONIO_H -#define _ATTRIB 0x0F +#include byte default_background, default_foreground; char hex[] = "0123456789ABCDEF"; +const static char base_chars[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + +int abs(int x) +{ + return (x>0) ? (x) : (x*-1); +} + +void graphics_init() +{ + // Detect if color/monochrome screen + char c = (*(volatile unsigned short*)0x410)&0x30; + if (c==0x30) TextVideoRam = (byte *)0xb0000; + else TextVideoRam = (byte *)0xb8000; + + // Reset cursor, use 80x25 text video mode + current_mode_width = 80; + current_mode_height = 25; + cursor_x = cursor_y = 0; + +} // Change cursor position @@ -101,12 +121,55 @@ void putc(char c) if (cursor_x >= current_mode_width) next_line(); if (c == '\n') {next_line(); return;}; + if (c == '\r') {cursor_x = 0; return; }; TextVideoRam[2*(cursor_y*current_mode_width+cursor_x)] = c; cursor_x++; } +// Unsigned INT to ASCII +void uitoa (unsigned int value, char *string, int radix) +{ + if (radix == 1 || radix>36) return; + + // Calculate how much space needed for number + int len, temp = abs(value); + for (len = 0; temp > 0; len++) temp/=radix; + if (len == 0) len = 1; + + string[len] = 0; + for (len--; len >=0; len-- ) { + string[len] = base_chars[value%radix]; + value/=radix; + } +} + +// Signed INT to ASCII +void itoa (int value, char *string, unsigned int radix) +{ + if (radix < 2 || radix>36) return; + + // Calculate how much space needed for number + int len, temp = abs(value); + for (len = 0; temp > 0; len++) temp/=radix; + if (len == 0) len = 1; + + //Add a space for '-' + if (value<0) { + len++; string[0] = '-'; + value = abs(value); + } + + string[len] = 0; + for (len--; len >0; len-- ) { + string[len] = base_chars[value%radix]; + value/=radix; + } +} + + + // Put string on screen in specified position; can use different font colors -void puts_pos_font(int x, int y, char *str, byte back, byte fore) +void puts_pos_font(int x, int y, const char *str, byte back, byte fore) { int i; for (i = 0; str[i] != 0; i++) @@ -115,20 +178,20 @@ void puts_pos_font(int x, int y, char *str, byte back, byte fore) } // Put string on screen in specified position; use default font colors -void puts_pos(int x, int y, char *str) +void puts_pos(int x, int y, const char *str) { int i; for (i = 0; str[i] != 0; i++) putc_pos(x+i, y, str[i]); } -void puts(char *str) +void puts(const char *str) { int i; for (i = 0; str[i] != 0; i++) putc(str[i]); } -void puts_font(char *str, byte back, byte fore) +void puts_font(const char *str, byte back, byte fore) { int i; for (i = 0; str[i] != 0; i++) @@ -167,6 +230,55 @@ void put_bin (int x, int y, byte xz) } puts_pos (x, y, arr); } + + +int printf(const char* str, ...) +{ + if (!str) return 0; - -#endif \ No newline at end of file + va_list args; + va_start (args, str); + size_t i, len = strlen(str); + for (i = 0; i < len; i++) + switch (str[i]) { + case '%': + switch (str[i+1]) { + // Character + case 'c': {char c = va_arg (args, char); + putc(c); i++; break;} + // String + case 's': {int* c = (int*) va_arg (args, char*); + puts((const char*)c); i++; break;} + // Integers + case 'd': + case 'i': {int c = va_arg(args, int); + char temp[32]; + itoa(c, temp, 10); + puts(temp); + i++; break;} + // Integers - hex + case 'X': + case 'x': {int c = va_arg(args, int); + char temp[32]; + uitoa(c, temp, 16); + puts(temp); + i++; break;} + + // Integers - unsigned + case 'u': { int c = va_arg(args, unsigned int); + char temp[32]; + uitoa(c, temp, 10); + puts(temp); + i++; break; + } + + default: va_end(args); return 1; + }; + break; + default: putc(str[i]); break; + } + + va_end(args); + return i; +} + diff --git a/SysCore/lib/string.c b/SysCore/lib/string.c new file mode 100644 index 0000000..937ec2c --- /dev/null +++ b/SysCore/lib/string.c @@ -0,0 +1,23 @@ +#include + +size_t strlen (const char *str) +{ + size_t i; + for (i = 0; *str!=0; str++) i++; + return i; +} + +int strcmp(const char *pStr1, const char *pStr2) +{ + char c1, c2; + int v; + + do { + c1 = *pStr1++; + c2 = *pStr2++; + /* the casts are necessary when pStr1 is shorter & char is signed */ + v = (unsigned int)c1 - (unsigned int)c2; + } while ((v == 0) && (c1 != '\0')); + + return v; +} diff --git a/SysCore/lib/system.c b/SysCore/lib/system.c new file mode 100644 index 0000000..7b13fee --- /dev/null +++ b/SysCore/lib/system.c @@ -0,0 +1,44 @@ +/****************************************************************** + * system.c - Basic system functions * + ******************************************************************/ + +#include + +byte *TextVideoRam; +volatile int cursor_x, cursor_y; +int current_mode_width; +int current_mode_height; + +void *memcpy(void *dest, const void *src, int count) +{ + const char *sp = (const char *)src; + char *dp = (char *)dest; + for(; count != 0; count--) *dp++ = *sp++; + return dest; +} + +void *memset(void *dest, char val, int count) +{ + char *temp = (char *)dest; + for( ; count != 0; count--) *temp++ = val; + return dest; +} + +unsigned short *memsetw(unsigned short *dest, unsigned short val, int count) +{ + unsigned short *temp = (unsigned short *)dest; + for( ; count != 0; count--) *temp++ = val; + return dest; +} + + +byte inportb (word _port) { + byte rv; + __asm__ __volatile__ ("inb %1, %0" : "=a" (rv) : "dN" (_port)); + return rv; +} +byte inb (word _port) { + byte rv; + __asm__ __volatile__ ("inb %1, %0" : "=a" (rv) : "dN" (_port)); + return rv; +} \ No newline at end of file diff --git a/SysCore/lib/time.c b/SysCore/lib/time.c new file mode 100644 index 0000000..d88c147 --- /dev/null +++ b/SysCore/lib/time.c @@ -0,0 +1,80 @@ +#include +#include + +const char* clock_months[] = {0, + "January", "February", "March", "April", "May", "June", + "July", "August", "September", "October", "November", "December"}; +const char* clock_weekdays[] = {0, + "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}; + +byte clock_months_len[] = { + 0, + 31, // January + 28, // February + 31, // March + 30, // April + 31, // May + 30, // June + 31, // July + 31, // August + 30, // September + 31, // October + 30, // November + 31 // December +}; + +void _CLOCK_INC(TIME *tim) +{ + // New minute + if (++tim->seconds > 59) { + tim->seconds = 0; + // New hour + if (++tim->minutes > 59) { + tim->minutes = 0; + tim->hours++; + if (tim->hours == 12 && tim->am_pm == 1) { // 11:59pm -> 0:00am + tim->hours = 0; tim->am_pm = 0; + // New day + tim->weekday = 1+(tim->weekday%7); + // Leap years + if ((tim->day==28) && (tim->month==2)) { tim->day++; return; } + // New month + if (++tim->day > clock_months_len[tim->month]) { + tim->day = 1; + // New year + if (++tim->month>12) { + tim->month = 1; + // New century + if (++tim->year > 99) { tim->year = 0; tim->century++;} + } + } + } + else if (tim->hours == 12 && tim->am_pm == 0) tim->am_pm = 1; // 11:59am -> 12:00pm + else if (tim->hours == 13 && tim->am_pm == 1) tim->hours = 1; // 12:59pm -> 1:59pm + } + } +} + + +/* ASCTIME Formats: **************************************************************** +* 1 W = weekday, M = month, D = day, H = Hour, M = Minute, S = Second, Y = year) * +* A = AM/PM * +* 2 Use capital letter for one letter/digit; else, use lower * +* * +* Example: asctime (time, "Today is: %W3 %D2 %m") * +* Result: Today is: Mon 22 June * +************************************************************************************/ + +/*char* asctime (TIME time, char* format) +{ + char str[100]; + int l = strlen(format), i; + byte special = 0; + + for (i=0; i +#include +#include +#include +#include +#include +#include "memory/mmngr_ph.h" +#include "shell/shell.c" + +//! format of a memory region +typedef struct { + + uint32_t startLo; + uint32_t startHi; + uint32_t sizeLo; + uint32_t sizeHi; + uint32_t type; + uint32_t acpi_3_0; +} memory_region ; + +//! different memory regions (in memory_region.type) +char* strMemoryTypes[] = { + "", + "Available", //memory_region.type==0 + "Reserved", //memory_region.type==1 + "ACPI Reclaim", //memory_region.type==2 + "ACPI NVS Memory" //memory_region.type==3 +}; + +extern dword _code; +extern dword _data; +extern dword _bss; +extern dword _end; + +void k_init(multiboot_info* bootinfo) +{ + // Start by zero-ing the bss + memset(&_bss, 0, &_end - &_bss); + + // Initialize HAL + i86_hal_initialize(); + + // Initialize Graphics + graphics_init(); + + // cleanup the console screen + set_default_colors (0x07, 0x04); + clrscr(); + + + // Start memory manager + uint32_t memSize = 1024 + bootinfo->m_memoryLo + bootinfo->m_memoryHi*64; + memory_region* memMap = (memory_region*)0x1000; + pmmngr_init (memSize, (uint32_t)&_end); + + unsigned int i; + + for (i=0; (memMap[i].sizeHi != 0 || memMap[i].sizeLo != 0) && i<3; ++i) + if (memMap[i].type==1) pmmngr_init_region (memMap[i].startLo, memMap[i].sizeLo); + +} + +void k_main(uint32_t kernel_size, multiboot_info* bootinfo) +{ + k_init(bootinfo); + apps_osver(); + + shell(); + + for(;;); +} \ No newline at end of file diff --git a/SysCore/makeall.bat b/SysCore/makeall.bat new file mode 100644 index 0000000..92e0b25 --- /dev/null +++ b/SysCore/makeall.bat @@ -0,0 +1,59 @@ +@echo off + +set loader_name=loader +set nasm_path=C:\nasm +set djgpp_path=C:\DJGPP\bin + + +@echo ***************** CTA KERNEL ***************** + +goto KernelEntry + +:error + @echo. + @echo There have been build errors. Building halted. + @pause + exit + +:KernelEntry + del objects\%loader_name%.o + del objects\main.o + + @echo. + @echo Building Kernel entry... + @echo * Compiling kernel loader... + %nasm_path%\nasm.exe -f aout -o ./objects/%loader_name%.o %loader_name%.asm + + @echo * Compiling kernel main... + %djgpp_path%\gcc.exe -Wall -O -fstrength-reduce -fomit-frame-pointer -nostdinc -fno-builtin -I./include -c -o ./objects/main.o main.c + if not exist objects\%loader_name%.o goto error + if not exist objects\main.o goto error + + @echo. + +:KernelSTDLIB + cd lib + rem call compile.bat + cd.. + +:KernelMemoryManager + cd memory + call compile.bat + cd.. + +rem here go other sources: + +rem here go other sources ^ + +:Finish + cd objects + @echo Linking... + del kernel.bin + %djgpp_path%\ld -T link.ld + if not exist kernel.bin goto error + + @echo. + + echo Copying to floppy drive... + copy KERNEL.BIN A:\KERNEL.CTA >nul + cd.. \ No newline at end of file diff --git a/SysCore/makeallh.bat b/SysCore/makeallh.bat new file mode 100644 index 0000000..f00da90 --- /dev/null +++ b/SysCore/makeallh.bat @@ -0,0 +1,66 @@ +@echo off + +set loader_name=loader +set nasm_path=C:\nasm +set djgpp_path=C:\DJGPP\bin + + +@echo ***************** CTA KERNEL ***************** + +goto KernelEntry + +:error + @echo. + @echo There have been build errors. Building halted. + @pause + exit + +:KernelEntry + del objects\%loader_name%.o + del objects\main.o + + @echo. + @echo Building Kernel entry... + @echo * Compiling kernel loader... + %nasm_path%\nasm.exe -f aout -o ./objects/%loader_name%.o %loader_name%.asm + + @echo * Compiling kernel main... + %djgpp_path%\gcc.exe -Wall -O -fstrength-reduce -fomit-frame-pointer -nostdinc -fno-builtin -I./include -c -o ./objects/main.o main.c + if not exist objects\%loader_name%.o goto error + if not exist objects\main.o goto error + + @echo. + +:KernelSTDLIB + cd lib + call compile.bat + @echo. + cd.. + +:KernelMemoryManager + cd memory + call compile.bat + @echo. + cd.. + +:KernelHAL + cd hal + call makeall.bat + cd.. + +rem here go other sources: + +rem here go other sources ^ + +:Finish + cd objects + @echo Linking... + del kernel.bin + %djgpp_path%\ld -T link.ld + if not exist kernel.bin goto error + + @echo. + + echo Copying to floppy drive... + copy KERNEL.BIN A:\KERNEL.CTA >nul + cd.. \ No newline at end of file diff --git a/SysCore/memory/compile.bat b/SysCore/memory/compile.bat new file mode 100644 index 0000000..606c418 --- /dev/null +++ b/SysCore/memory/compile.bat @@ -0,0 +1,28 @@ +@echo off + +rem NASM and DJGPP executable paths: +set nasm_path=C:\nasm +set djgpp_path=C:\DJGPP\bin +set objpath=..\objects +set incpath=../include +goto build + +:error + @echo. + @echo There have been build errors. Building halted. + @pause + exit + +:build + @echo Building Memory Manager... + + del %objpath%\mmngr_cr.o + del %objpath%\mmngr_ph.o + + @echo * Compiling Physical Memory Manager... + %nasm_path%\nasm.exe -f aout -o %objpath%/mmngr_cr.o mmngr_cr.asm + %djgpp_path%\gcc.exe -Wall -O -fstrength-reduce -fomit-frame-pointer -nostdinc -fno-builtin -I%incpath% -c -o %objpath%/mmngr_ph.o mmngr_ph.c + +:check + if not exist %objpath%\mmngr_cr.o goto error + if not exist %objpath%\mmngr_ph.o goto error diff --git a/SysCore/memory/mmngr_cr.asm b/SysCore/memory/mmngr_cr.asm new file mode 100644 index 0000000..58375db --- /dev/null +++ b/SysCore/memory/mmngr_cr.asm @@ -0,0 +1,29 @@ +bits 32 + +global _read_cr0 +_read_cr0: + mov eax, cr0 + retn + +global _write_cr0 +_write_cr0: + push ebp + mov ebp, esp + mov eax, [ebp+8] + mov cr0, eax + pop ebp + retn + +global _read_cr3 +_read_cr3: + mov eax, cr3 + retn + +global _write_cr3 +_write_cr3: + push ebp + mov ebp, esp + mov eax, [ebp+8] + mov cr3, eax + pop ebp + retn diff --git a/SysCore/memory/mmngr_ph.c b/SysCore/memory/mmngr_ph.c new file mode 100644 index 0000000..907f1a6 --- /dev/null +++ b/SysCore/memory/mmngr_ph.c @@ -0,0 +1,204 @@ +/****************************************************** + * Physical Memory Manager * + ******************************************************/ +#include +#include +#include "mmngr_ph.h" + +#define PMMNGR_BLOCK_SIZE 4096 // block size (4k) +#define PMMNGR_BLOCK_ALIGN PMMNGR_BLOCK_SIZE // block alignment + +struct memory_stack_entry{ + word low; + byte high; +} __attribute__ ((__packed__)); +typedef struct memory_stack_entry mstack; + +static uint32_t _mmngr_memory_size=0; // size of physical memory +static uint32_t _mmngr_used_blocks=0; // number of blocks currently in use +static uint32_t _mmngr_max_blocks=0; // maximum number of available memory blocks +static uint32_t _mmngr_index = 0; + +static mstack* _mmngr_memory_stack= 0; // memory stack + +inline mstack mstack_pop () +{ + mstack temp; + temp.low = _mmngr_memory_stack[--_mmngr_index].low; + temp.high = _mmngr_memory_stack[_mmngr_index].high; + _mmngr_used_blocks++; + + _mmngr_memory_stack[_mmngr_index].low = 0xFFFF; + _mmngr_memory_stack[_mmngr_index].high = 0xFF; + + return temp; +} + + +inline void mstack_push (const mstack *block) +{ + if (block->low == 0 && block-> high == 0) return; + + _mmngr_memory_stack[_mmngr_index].low = block->low; + _mmngr_memory_stack[_mmngr_index].high = block->high; + + _mmngr_index++; + _mmngr_used_blocks--; +} + + +inline byte mstack_test (const mstack *block) +{ + uint32_t i; + for (i = 0; i < _mmngr_index; i++) + if (_mmngr_memory_stack[i].low == block->low && _mmngr_memory_stack[i].high == block->high) return 1; + + return 0; +} + +byte pmmngr_test_block (uint32_t block) +{ + mstack temp; + temp.low = block & 0xFFFF; + temp.high = (block>>16) & 0xFF; + + return mstack_test(&temp); +} + +void pmmngr_free_block(void* address) +{ + // Calculate block + mstack block; + uint32_t temp = (uint32_t)address / PMMNGR_BLOCK_SIZE; + block.low = temp & 0xFFFF; + block.high = (temp>>16) & 0xFF; + + // Push it + mstack_push (&block); +} + + +void* pmmngr_alloc_block() +{ + if (_mmngr_index == 0) return 0;// Out of memory + // pop a block + mstack block = mstack_pop(); + + // Calculate and return address; + void* address; + uint32_t temp = block.low | (block.high<<16); + address = (void *)(temp * PMMNGR_BLOCK_SIZE); + + return address; +} + + +void pmmngr_init (size_t memSize, uint32_t stack) { + + _mmngr_memory_size = memSize; + _mmngr_memory_stack = (mstack*) stack; + _mmngr_max_blocks = (_mmngr_memory_size*1024) / PMMNGR_BLOCK_SIZE; + _mmngr_used_blocks = _mmngr_max_blocks; + _mmngr_index = 0; + + // By default, all of memory is in use +} + +void pmmngr_init_region (physical_addr base, size_t size) { + + mstack block; + + + unsigned int count = size / PMMNGR_BLOCK_SIZE; + unsigned int start = base / PMMNGR_BLOCK_SIZE; + + for (; count!=0; count--) { + block.low = (start + count) & 0xFFFF; + block.high = ((start + count) << 16) & 0xFF; + mstack_push(&block); + + } + +} + +void pmmngr_deinit_region (physical_addr base, size_t size) { + unsigned int start = base / PMMNGR_BLOCK_SIZE; + unsigned int count = size / PMMNGR_BLOCK_SIZE; + int temp; + + unsigned int i; + unsigned int j; + + // Find free blocks in the area and zero them + for (i = 0; i < _mmngr_index; i++) { + temp = (_mmngr_memory_stack[i].high << 16) | _mmngr_memory_stack[i].low; + if (temp >=start && temp < start+count) + { _mmngr_memory_stack[i].high = 0; + _mmngr_memory_stack[i].low = 0; + } + } + + // Eliminate zero blocks + for (i = 0; i<_mmngr_index; i++) + if (_mmngr_memory_stack[i].high == 0 && _mmngr_memory_stack[i].low == 0) + { + // Find next non-zero + for (j = i; _mmngr_memory_stack[j].high == 0 && _mmngr_memory_stack[j].low == 0; j++) + if (j == _mmngr_index-1) { + j = 0; break; } + + if (j == 0) { + _mmngr_index = i; + break; + } + + _mmngr_memory_stack[i].high = _mmngr_memory_stack[j].high; + _mmngr_memory_stack[i].low = _mmngr_memory_stack[j].low; + _mmngr_memory_stack[j].high = 0; + _mmngr_memory_stack[j].low = 0; + + } +} + + +size_t pmmngr_get_memory_size () { + return _mmngr_memory_size; +} + +uint32_t pmmngr_get_block_count () { + return _mmngr_max_blocks; +} + +uint32_t pmmngr_get_use_block_count () { + return _mmngr_used_blocks; +} + +uint32_t pmmngr_get_free_block_count () { + return _mmngr_index; +} + +uint32_t pmmngr_get_block_size () { + return PMMNGR_BLOCK_SIZE; +} + +void pmmngr_paging_enable (byte b) { + uint32_t temp; + + temp = read_cr0(); + // Enable + if (b) temp |= 0x80000000; + else temp &= ~0x80000000; + + write_cr0(temp); +} + + +byte pmmngr_is_paging () { + uint32_t temp = read_cr0(); + return ((temp&0x80000000)>0); +} + +mstack* pmmngr_get_stack_addr() +{ + return _mmngr_memory_stack; +} \ No newline at end of file diff --git a/SysCore/memory/mmngr_ph.h b/SysCore/memory/mmngr_ph.h new file mode 100644 index 0000000..6d61f49 --- /dev/null +++ b/SysCore/memory/mmngr_ph.h @@ -0,0 +1,33 @@ + +#ifndef _MMNGR_PHYS_H +#define _MMNGR_PHYS_H + +#include +#include + + +#define pmmngr_load_PDBR(addr) write_cr3(addr) +#define pmmngr_get_PDBR() read_cr3() + +// physical address +typedef unsigned physical_addr; + +extern uint32_t read_cr0(); +extern uint32_t read_cr3(); +extern void write_cr0(uint32_t data); +extern void write_cr3(uint32_t data); +extern void pmmngr_free_block(void* address); // releases a memory block +extern void* pmmngr_alloc_block (); // allocates a single memory block +extern void pmmngr_init (size_t memSize, uint32_t stack); // initialize the physical memory manager +extern void pmmngr_init_region (physical_addr base, size_t size); // enables a physical memory region for use +extern void pmmngr_deinit_region (physical_addr base, size_t size); // disables a physical memory region as in use (unuseable) +extern size_t pmmngr_get_memory_size (); // returns amount of physical memory the manager is set to use +extern uint32_t pmmngr_get_use_block_count (); // returns number of blocks currently in use +extern uint32_t pmmngr_get_free_block_count (); // returns number of blocks not in use +extern uint32_t pmmngr_get_block_count (); // returns number of memory blocks +extern uint32_t pmmngr_get_block_size (); // returns default memory block size in bytes +extern void pmmngr_paging_enable (byte b); // enable or disable paging +extern byte pmmngr_is_paging (); // test if paging is enabled + +extern byte pmmngr_test_block (uint32_t block); +#endif diff --git a/SysCore/memory/pde.c b/SysCore/memory/pde.c new file mode 100644 index 0000000..ddb6aac --- /dev/null +++ b/SysCore/memory/pde.c @@ -0,0 +1,26 @@ +#include + +void pt_entry_add_attrib (pt_entry* entry, unsigned mask) { + *entry |= mask; +} + + void pt_entry_del_attrib (pt_entry* entry, unsigned mask) { + *entry &= ~mask; +} + + void pt_entry_set_frame (pt_entry* entry, unsigned address) { + *entry &= ~_I86_PTE_FRAME; + *entry |= address & _I86_PTE_FRAME; + } + + unsigned pt_entry_get_frame (pt_entry entry) { + return entry&_I86_PTE_FRAME; +} + + unsigned char pt_entry_is_present (pt_entry entry) { + return ( (entry & _I86_PTE_PRESENT) > 0 ); + } + + unsigned char pt_entry_is_writable (pt_entry entry) { + return ( (entry & _I86_PTE_WRITABLE) > 0 ); +} \ No newline at end of file diff --git a/SysCore/memory/pde.h b/SysCore/memory/pde.h new file mode 100644 index 0000000..24434ad --- /dev/null +++ b/SysCore/memory/pde.h @@ -0,0 +1,27 @@ +#ifndef __PAGE_DIRECTORY_ENTRY_ +#define __PAGE_DIRECTORY_ENTRY_ + +enum __PAGE_FLAGS { + _I86_PTE_PRESENT = 1, + _I86_PTE_WRITABLE = 2, + _I86_PTE_USER = 4, + _I86_PTE_WRITETHROUGH = 8, + _I86_PTE_NOT_CACHEABLE = 0x10, + _I86_PTE_ACCESSED = 0x20, + _I86_PTE_DIRTY = 0x40, + _I86_PTE_PAT = 0x80, + _I86_PTE_CPU_GLOBAL = 0x100, + _I86_PTE_LV4_GLOBAL = 0x200, + _I86_PTE_FRAME = 0x7FFFF000 + }; + +typedef unsigned pt_entry; + +extern void pt_entry_add_attrib (pt_entry* entry, unsigned mask); +extern void pt_entry_del_attrib (pt_entry* entry, unsigned mask); +extern void pt_entry_set_frame (pt_entry* entry, unsigned address); +extern unsigned pt_entry_get_frame (pt_entry entry); + +extern unsigned char pt_entry_is_present (pt_entry entry); +extern unsigned char pt_entry_is_writable (pt_entry entry); +#endif \ No newline at end of file diff --git a/SysCore/memory/pte.c b/SysCore/memory/pte.c new file mode 100644 index 0000000..4f7bad8 --- /dev/null +++ b/SysCore/memory/pte.c @@ -0,0 +1,26 @@ +#include + +void pt_entry_add_attrib (pt_entry* entry, unsigned mask) { + *entry |= mask; +} + + void pt_entry_del_attrib (pt_entry* entry, unsigned mask) { + *entry &= ~mask; +} + + void pt_entry_set_frame (pt_entry* entry, unsigned address) { + *entry &= ~_I86_PTE_FRAME; + *entry |= address & _I86_PTE_FRAME; + } + + unsigned pt_entry_get_frame (pt_entry entry) { + return entry&_I86_PTE_FRAME; +} + + unsigned char pt_entry_is_present (pt_entry entry) { + return ( (entry & _I86_PTE_PRESENT) > 0 ); + } + + unsigned char pt_entry_is_writable (pt_entry entry) { + return ( (entry & _I86_PTE_WRITABLE) > 0 ); +} \ No newline at end of file diff --git a/SysCore/memory/pte.h b/SysCore/memory/pte.h new file mode 100644 index 0000000..a09cc8a --- /dev/null +++ b/SysCore/memory/pte.h @@ -0,0 +1,27 @@ +#ifndef __PAGE_TABLE_ENTRY_ +#define __PAGE_TABLE_ENTRY_ + +enum __PAGE_FLAGS { + _I86_PTE_PRESENT = 1, + _I86_PTE_WRITABLE = 2, + _I86_PTE_USER = 4, + _I86_PTE_WRITETHROUGH = 8, + _I86_PTE_NOT_CACHEABLE = 0x10, + _I86_PTE_ACCESSED = 0x20, + _I86_PTE_DIRTY = 0x40, + _I86_PTE_PAT = 0x80, + _I86_PTE_CPU_GLOBAL = 0x100, + _I86_PTE_LV4_GLOBAL = 0x200, + _I86_PTE_FRAME = 0x7FFFF000 + }; + +typedef unsigned pt_entry; + +extern void pt_entry_add_attrib (pt_entry* entry, unsigned mask); +extern void pt_entry_del_attrib (pt_entry* entry, unsigned mask); +extern void pt_entry_set_frame (pt_entry* entry, unsigned address); +extern unsigned pt_entry_get_frame (pt_entry entry); + +extern unsigned char pt_entry_is_present (pt_entry entry); +extern unsigned char pt_entry_is_writable (pt_entry entry); +#endif \ No newline at end of file diff --git a/SysCore/objects/BSOD.O b/SysCore/objects/BSOD.O new file mode 100644 index 0000000000000000000000000000000000000000..328c9710e1a836e2be7b682c11d5dd379eb652e3 GIT binary patch literal 3398 zcmb7{U2GIp6vywjON*trU1*agR=JoyETr9_HiQ&N`mrq#p}Xl8;|F1#&ffj%c4sp) zTZ&>N6var0MPouV8WR#@jQU^*qP%D%D&axm$D>4j@oFIWf>A-%|DEZaodGp*k~8~1 z=l`2~&z+ghOm~LDOl{AvU~ILc!lAe==50s2yHpEfryx(Xy7@SMI3k|aY|Sk>`-9kr z!A!Ne#WnaDLd2&n%dPzT{-EM?V|G?lXzEVX4lm6~M>b*Z|J+8(HNn%mDMW=Qb37q5 zyU@mlc@E8%xiC$`6ynk7s%2+qpdwQG5L zzh#SA&bK@Ba+KIZ>4nSfNA2G3Qlu1;?e%(Hwqo~rxL2JAdHrU+el`iUaIOPjX{-Dh zl?PRJyuZrPPn>_6ld+HmJMdVw^Fg)%82B@Td zmH|4x1kHt!M&zLYHLIu=P%|F29BD-E2~brX*MDZFK*n+gD6}?NQz6t6!cAP*1yk#pJsl)q}qJE&R1OEI4;8f<)OwE^LK>BK1*ne|)d?!> zQ3<3`dF{G?sb46n3)Cf)om*o&(y08>rP`GpDqK)M-KD$b8Heh9Z11Ou;#|=x8WldW zpFb*0gOAPYqH3eU5@NcR_vOdt*aW~`nl+N_fPTDgcrs_L=gGbRi^YE(@_7nWt1 zEMe4COXFIt?4Q|(@U+OQ$E!2DS*!TQ8quC(+kCl z;J4N%u@G|(7odSIE-p^s6<9b61<|sMu`Wa(ViJ)>973ExoJCwjTt+O% zJMvz{;QtKVk8IoM=pc`6o7laM55x!J_p92k2zAePvTN9{bkq&(@%m#eEEHnwPN%jS zD&nXZls)N$y^9%jDL`JxuP4g`$^xpxm|fle?MR1i65hjzDQiEhnY!YIi&}maEj4 zo~yb^^^oGEdP&7d^^w{@N`3jb<830fh13wK1gY($c9Kewnj-ZusXe3~CzT~tAXO$+ zC1sPECl${X%L19&Zq^yghep!LL|k_(?%w}pjz1#S9NLBF&A1;4e3h$n&>T8|z4{h! zZ2m8DTyiiC&r|-dadjP=L+XCGeN*0#2sMP7k1=%()uuAHqOOs*HL;9dHZ9%s3SctT zn(hA=!L9h0?v67=$9N;FuV8O;8FgK}t%>CzGnw>MGL;#doJ>w;(xa1OV-qYRytjO2 t7B5h|mMoUBgq_KXoO*?3bfavTsHx5}Rl~~U4E$%J(o8|jt4hOTe*<=30vG@Q literal 0 HcmV?d00001 diff --git a/SysCore/objects/CMOS.O b/SysCore/objects/CMOS.O new file mode 100644 index 0000000000000000000000000000000000000000..7118849ef4dfc26fb7d77506c524b4cc306cc2f5 GIT binary patch literal 1429 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 EUm{zv2LJ#7 literal 0 HcmV?d00001 diff --git a/SysCore/objects/CPU.O b/SysCore/objects/CPU.O new file mode 100644 index 0000000000000000000000000000000000000000..b140ffbd8a5c978cee16a55cd22acf1724f43479 GIT binary patch literal 774 zcmeZaWMKe-DnP{Tz=JhiGL~!vqSR_ zp3-Z_Sb0Diz*?J+2t>!lA8vlb^J4n{|Nmc10us$fcn(iM0q)MuRtg&KexaHQCVD1% zMj-79K+F!rYzzT#Rv4U>3S{vCu?RyJkmLum^wKhOK;j_q?>_@WI%9G{sa`Tf0EvXe z4+8@;P>h)YIc`8f!^~I&BtbEP0LbwI3@)G=gdB{894BCt8F^t+a2h#2K(1hB6oktm zGhp!vvIb-y1A`I}gLnuLGaxS!MZ^opg8_)HXc!krGcn`<$@sF=yp+@;JxfbVhWJbi zvv^<-#TRFkmZapD=OIMWQ%j&K5n`EnnI)NtIhj?d5V7=>lK9NL;*!Li9Ed C)qke| literal 0 HcmV?d00001 diff --git a/SysCore/objects/GDT.O b/SysCore/objects/GDT.O new file mode 100644 index 0000000000000000000000000000000000000000..41e6f7ec3e556adbecf8332201526ab6e75afc45 GIT binary patch literal 828 zcmeZaWMKe-D~t>b0$>&kqh3jBMG2SZ`5`i>6-~g1= zODZnLrv@a~0K|I9`MJ5Nd2p*mfMP9BJAq6HU}9hh4-4)NQ4#3&Q4#5`QIXi80F+7V z^tr&)dG6plfzHnzF&9`4zLe*~=M@6Ce;fK!O2VV;`Kj!B=4U}gCYL)>i zV2zH8KMXXCWe3Rg=3mV9?7b{kK?WXfe#4V?oD~!%;ta=Gg@80jI13J6l>Yz!KjS=5 zEMpc(;y+M|@kIhqu=$7vM0^rVoau!JSX|_V1DNJHJOK%~J3Ct`Xt?`@YATrMndlh- zb%Eo88%VP;fI=9;$^o+Yz+#{vg0L#!vU`9mejpZM&`ZnANd>Y%;NO1+hIGdCloGvU zhyavCj$=>|Gcz6mlAxGH0Oa@u20Ks literal 0 HcmV?d00001 diff --git a/SysCore/objects/GDT_ASM.O b/SysCore/objects/GDT_ASM.O new file mode 100644 index 0000000000000000000000000000000000000000..957aa74b862b390d79e55c52ba5ed4d01fe01b0a GIT binary patch literal 146 zcmZQ)Okq%9KmZjeQvgcyGm3&(X*&cM`fl_c=zGxjqVK{h8K4jc!{G@NCNM+P@rVIw y79av*21bY&Pz3`6E0iq`q(O2ZopL}NpI*QapJ`zhpPo_@pO#ZvoWTGljTiuG?iKz3 literal 0 HcmV?d00001 diff --git a/SysCore/objects/HAL.O b/SysCore/objects/HAL.O new file mode 100644 index 0000000000000000000000000000000000000000..982a2890b5d17174222210b326ebcec31c8a3a94 GIT binary patch literal 2247 zcmZ{kQEXFH7{^c7vdpEpArlb>D^hSqZFD6@NhGb?flFqn50Du5g5k;Z!3QO>AX^k8#Kef950jagS#lR$BEe9}=Ks5=_wF{8lYHm= zzu)(r?|k>P_a5^27>)f{x-I4Ngt+=1x3rjMni%^6GT{~eqgVp4kRo$gpa;$o${R9_ z2PV`4dCH6Fsg#;_j_v?ERy(tn#u$1z-52zIv)EL)>RpoOPQkg`7i{rz|DH8uoyt?{ zoLd)`w|+?wshtCr*|oK`!hGl48-ruZ7~?^)j<$|ftEiBRm|MoGf8sp;$XK<4`^be%f5~IEmYCUG zYBHNj-okQ=b;`hC<<=@aUc1?9)fRQ<={et)<_gPx+(G+Acx>Xz-771+b%u0dvCZ5z ze)**BjhcR>9<7`awF>ioZ0(%t3lbivd;n};==Q>VH`T2STe*}-N$)6?L9zKlQ|_XLFtRPk31*t>1;EI_53rrk8{#Doe7YOJye&Ue0`LV5#58K!^f=bPet+0@rhQWj$? z(Q{{SL>aprjmJO7Is+?4uV0(Mnuleek711<9>N-khQph&=OJhYTZzQuzeKPfR)Wn$ z!r?QKb7v=^^O5VOq`! z!RWndW=~_@VyOd|AA@x;2{ZlCn;HF5LhbM{w$+LrhI-tJz6rI>QX15DE1HMuwA9B? zJ1q4X)J{vyLebeB>_@18rGAFmWvMdM6PEfFYPY49pn_1%%!Jxwv45cUTIxO&U3v!# z#kHggMPn6j-moVjCqpp-T(b|FUMXxuP4~Bjh}Tm@jBaLqxW6k1B4<5jEB7~r?(2VZ zT;CJw!t2>&Z+BM7&~s@;xO5Di$JoQLjj(mH3*K{eBn0o(I`T5Sm#{_bl7>|t!@rn2 z1Yvd<_K`!RtU9FYoPFXD%6SWRv5x2)WUzsx8^~w_DK?Pvb>tE} zsTc3-^F2LbCK)j~9n%$6;<_XoF->FA$dF{HTsqX>XE;t)&8RYGbSV;UMKZX|a|n|k z%jBfvYFbgVxR4iLknny;Mk2=*{X}}5XladWa#DL=rJ_pCkWz96d0HH09U$`SI-rs@ zV0QsGsSPK%;q(EL(iJVPsac2BHr84em8n+(?tY2Y_e;dxFICcvtO1AzPbNhzE&Fag vKohkDDI;gOp2nksa5bC8mBf;IY^2sjN;mLM$ch_gG;VKqZoyrSpU~NVN2wH! literal 0 HcmV?d00001 diff --git a/SysCore/objects/IDT.O b/SysCore/objects/IDT.O new file mode 100644 index 0000000000000000000000000000000000000000..2b639a531c1479c0ebdf1e1b0be4deac2c07e01b GIT binary patch literal 785 zcmaJ*NOqH^MSvpihu0!r)LbhK|nMy<9}sx%Id)=E{Ss;qPC0x%EcXfI)Etmmkiu;Zj^B+Ld|1d7x_=81}= zShiz=aeN0vZNWBtr4VcW>HEq2=SkfSznF{=y_Vm9 zi(V5EZzGb1p+iSJ6i-030&D=0hm{JjpD5gQfiFG@4*bV8UC&G&1{99%Fh@zG28d>F cZF08;v)0yqbE>reD0av5b;p@noO9ivAMV?2pa1{> literal 0 HcmV?d00001 diff --git a/SysCore/objects/IDT_ASM.O b/SysCore/objects/IDT_ASM.O new file mode 100644 index 0000000000000000000000000000000000000000..02122a5f225e39ea1e6e6c80171b6e142da4b62f GIT binary patch literal 96 zcmZQ)Okv<)KmZ9S6DG#bC<_uf%nT9dVFA*N5HGn}nfNx@i4SJ>n{R(Rv)SzI1(%1g z`sya6os-9#^s0dL`Kz;oB1XS&GvgNHL8k69&eVItrw42KGy{9>h2$*-B4tTEk*a0U<4 zc!S^(I_eAt=$Qt=qcrFY9;5yS!5}S{9rxHle}Zz}V<+8k29MKs4T4>C#Th(7A2$e| zq?R+N(oBP3Hy!7;t@wb~$nfx>(lK)JN~aQ5!)gzEvRj}v@wNv^MH&a%4$V*E(EGSg zLEpmNZRmG!XQ5jH+R5D`bkBg;JJdv0(7guQ#ob$UAAxprw}I{(khn97?l;h0XicPy zt{L`5D|anG;{Ft%ecT1n^#bkZZV=shpf>JC(MuoCm!6oVRb zM=}p3^Heg=CG%1;ZzS_xGM^;#MKa$d^Gh;+BvbpZiQm4BJ-liO(<+%jo#}>=o*3xY z;YHFD>6{r!CiSUEI+irDZ~|m@X3k8cjhr2uOUuFP4EB}vQ;Lf-iKw16QjrYK6{=Fq y)N_WZPex1w&uK_KNWDm5q&}p6q*F)(NT-psf6HcPHG37!UPiOm(d>n^KJpjxVMufU literal 0 HcmV?d00001 diff --git a/SysCore/objects/IRQ_ASM.O b/SysCore/objects/IRQ_ASM.O new file mode 100644 index 0000000000000000000000000000000000000000..17d82dc1575bf3c078ba3b7ec6da000d276005a6 GIT binary patch literal 663 zcmYk(zb`{k6bJCr1Qn4y18eKI*6-VDRl>?zn=m}36>aprC=y0uk;tXm1BSm_r@M(gb*uN`O>E~6&0yQH7GU2k@|+!t)%0LiWmG9uS~aK2sIsbgRZg{_GXFxt6cfgnFvo;JCPPy3wqLFKo_lb3v_-$J COp@jR literal 0 HcmV?d00001 diff --git a/SysCore/objects/ISRS.O b/SysCore/objects/ISRS.O new file mode 100644 index 0000000000000000000000000000000000000000..49d9b472bc40d29dd9914668806f1a720c2cb0a6 GIT binary patch literal 2803 zcmZ|QNlX(_7zglI!HS9qh`0iE1r!@*z%?;0h{VJNizaGJCKbwJ3K}}b^`KT06BqQL zaXFZ{9E`>bYB;G;E=J=?<4xo3i_1;o$>R6E*M6^^H@u|N|NQ1(KBk>^wg&QrT%|!F z!j$p@VK;WnrK~ou#|iNaK@~ zyvM^i6o4UmMJPwd!98y=4+eaS`EcA@91op7#UQkLixXh2Pq6^1y~T-8=2M&msg&nr zCc{sp4Q*yk-ygBG7+8Cc%pbg1+x zmP3KJI0HuhnP)u{zM5!HKCf8?YnD3jp4?yEw9p2d=%oNOf13e6nq4Qh1(*swYZ&1wu!9`Q!&{-woXhX zWW8*sFv-6j6iK!LOw-72usy^izi~nFgl!1Zbh1}$A2F4aeP;WPX$Bdv{lzqsEX6h{ zAjB-P5=`pcLYQWgRkJlh-0VcN;QGsqu$-%i$DLEfwK0`dwsm%5J$A;-vh z>WY+~x)%A~WtQs5Z&qe0Y02#3vy#1rWWO1zBfoE%rQ~R47oU}!G325l*A2OA$Rk4r z4S8wEJ3~Gh^39MRhKv|OZ*W@GnNH67td*1-GS84YLslBH(U5J1>@h_CI%JmmfBFoO zzZRLLI_C@-FywZQJj6YxXVnU)GkPTMI^EH}j(DtJk^B}pJ$(r`8jlOdY1_4<)oG4I zc0`=Erbu)1c5c1no}X6tFTo@VQ5ww`9|X||qb>uI*0X6tDUdRl`e{sZtN B;G+Nl literal 0 HcmV?d00001 diff --git a/SysCore/objects/ISRS_ASM.O b/SysCore/objects/ISRS_ASM.O new file mode 100644 index 0000000000000000000000000000000000000000..6fd98da05cecb9aaa67c625fea43039958f11ae5 GIT binary patch literal 1181 zcmYk)Pe@cz6bA4+rjCtM&&vPRn7hbL_l`~mg18aF7D9_8kmrn(=HQGpDn!wu7C{jM zL4*qtU8yZwNhm}_M4O~GArUTGbT+MAh#NiU`EgGV?tDM)%$@JO`))jzH)Ap5uLZac zGY17zFm#1yMKQVrRZ%l^f|5`*RY5hh&+BDHE&YSy^e0js{ld&i`W`7kU!$z2k5MM+ zeUzu@U6iNkZIq@E&@$9OZ=f^u5;{vyp>y;AYNQg>M0u#0?m#Ux47JiA)JAK>z2Qkc8sy0{-)+RO@Oyy_gLuI$}_xbMdhJ1CnJrb-3EAfu(lTWh6 z--dX{_)1pu$1#m*Vb{nkU!6R}($EDXBrMNqN>vzLM8L=M1mPH)0;dT+z>A30b~dXa~`k8aM#Ji@8o zOgNF9pPmcvWlQ<#yXE7lsoC;XFYD#J(q7$OJzg2FYhJxx*S+k2CE8-O#%hn%BCAbS ztE_feEwkF@w9RRo(>AAVPTQQeIc;;==CsXeTUy)F*6@ag<1@wLOevh5o6nget7Qo~ literal 0 HcmV?d00001 diff --git a/SysCore/objects/KERNEL.BIN b/SysCore/objects/KERNEL.BIN new file mode 100644 index 0000000000000000000000000000000000000000..4d61829d51f2dcb8561b8670fb7058cffb819b30 GIT binary patch literal 20480 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 literal 0 HcmV?d00001 diff --git a/SysCore/objects/KEYUS.O b/SysCore/objects/KEYUS.O new file mode 100644 index 0000000000000000000000000000000000000000..068c97430af23b75988cd6a72394e6abd5302620 GIT binary patch literal 5096 zcmbuDeRNZ29mk)%wDgtRLZ&z=YauWOrF0M&cG*^>43t_?I%tJ8Nt?7u-%^qr!zMy! zQkQmcj(a<29=GEZwga3U?J-#EriW5`1|B`anVz$%bCfY_$}OWF2E(>%{66mRU(=xVe=Z>BVV_s-*;EFDEI&f)D z=YFGs$;PKXh{EhG%!EmOrunBdfIt1S``?-W3gyiIDVLRketfdfg*SPxXQ4J`^U1qK zQ=x_0-F22Th^!xo=$7(OJ)NpqrBRP0Z>r%wD7tWF=Z?U5#xoU0!`o?mJlb;?Z#pNV z@{OKc)k76}3OI-M77%7s}^#^&7Gs8 zR)j$`*VW>Qt%LX zY`G4?JSk|zE;SpZt_A3i?c*K46gh-)b%T_JZheif)ZC|{25sE@BIX7#E%*D zemrU&yMZFq-5WTkQSZMoBWz=eUMTYtidHBru3%^1s~R8E`lJ*u#U#2TQ{uK>I@>Hm z=(#boPtp{AKd9-313sv>cL zK`0i2sP&vEeQXjdDO_)}3V9-Xd=;+Up~%A2A}^*C`9n&OSY2@il=!lJn&RM0a#$jY zoe&pMbjEYkJ8paAqL@#7xl74UFV7QG%8)Z-qe`(*w7z&qQNyf|hf+iS9UFVLpSW<7YU{pTW00=39Yw>#R7H z=x@ha9n)*j?ul`7z1Em!LTkqv&QMCi&B}^!t+Fg!rz{Rzltp2ya(CFKd@fwC%nLUt zbHjEeE9_9x!%d1d?2NDP=hb~H-kZbQBL{DZ-Fuh1dr5W*Id)Y$r|NxX@mlQ1!m^u# zdSA90@N`5M7}1EKn}d12>^K(6n)1LctuHN7fKYfW7piZJ!}2otCmoqq(b;=H+9$m> z{~E>`_Sqe#wfLvx+l{hk9b@hF&ZZ~UW4x`|_rM0mid$Un(l6m3jMc3VcC3PaFWdbP znyjqH*&ej)AWpoK?_X_t090DCX5D(Yv6X9At$EmvfQYTSZh&`q%9>XCNdF~frQ6qqAH?YWM?62Bx)z} zfkc!8qj+=pLd5q86gPAmO{8s0$?a%VDDDh>nxpNuu8poh3R?Gz=2)Mu`4FG);DM z@ZJ%%GonCKSK zG!er)S6l@>Q3g>CQ672ub}+{=EQ?bEebqUkr{WS)~3}z}H2`4QCz6zZ2lm zd3&3r-w5zPfldCbD5A^9_`%cgeB!y!?Q(h$iWLg~lAp-F7YhHDpHTRV{~FGO@&bCPkza#yBgN*I=zS3`39lh28&eei1Xm9&v$Q$dybd`o#MXHm z4-h+G<8jox-N`m~j9XkA)>~TYE%3JRHRo*ecx-~&9e(wm^Mmn3)`9S&O}l&c+6Xl=E0*gUfAcav$d?rwLG?zFYrTOA&? W)((%O(X~$uxjcJuX+*5J&3^zMxbe*Z literal 0 HcmV?d00001 diff --git a/SysCore/objects/LOADER.O b/SysCore/objects/LOADER.O new file mode 100644 index 0000000000000000000000000000000000000000..61dae5b94a1790460bd9fdc3763edb600bb6eaa0 GIT binary patch literal 152 zcmZQ)Okq%9fC3=H0LtWm(l0@@Ez^dz+NFYNI|LZ|ZuA}Kd(ijd#pD0~|Nr_jK@y^l zmjy^OLf8yEK$;cG76Q^BIS^kQ%9aJv3P2p69iN++na5CEl2}v%BukUPgkDl&3IhQA C5*(ud literal 0 HcmV?d00001 diff --git a/SysCore/objects/MAIN.O b/SysCore/objects/MAIN.O new file mode 100644 index 0000000000000000000000000000000000000000..d9c212a063d2fe2cf819fd0652b8fc6d505f555f GIT binary patch literal 8176 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 Ly&7 zus}&o51duCNuI%yL+TYPu%z_gS|s0f-;W#8aWcSbSarL$vf_B^=q$8g zaOS|q7~b?hbu)I);li`;d9D1P@D zTheawK)0nZsPTKFK}%?FQE3iQ#P1BfbApU}B7R>Ic$U!i?Qx9W6&im+JMfo>1bRk6 z$Iy9<9YKm6SfxS}KaPw%1{ejME1=u0&XvxcCCT` zob-|4N3E97D()HXCH)^Qxo>ih2i$V`9j7vANlMg_dwyWKZX{GKui`p&n7J1?b@ literal 0 HcmV?d00001 diff --git a/SysCore/objects/STRING.O b/SysCore/objects/STRING.O new file mode 100644 index 0000000000000000000000000000000000000000..e669893fcb77f455980d5b0fd08fb37caa1f1ec5 GIT binary patch literal 484 zcmeZaWMKdS4n_tB9x#iQQLiMmq6Ex_5Dq|U3lbm1Q~+YVl*E!m5C;!%0Ltkl6&K@C z0+wn3sY}k!%}vdNTP*?<`vR6lBA6H$xRKL1(NKN5$E4`n13ISn3Lv-QkIt6rEjC-;tx-lFu~o~*-Amf-7i#A!9>qQ&j_Si zFD)}C6~q97fBzX6(iw|OiZb)k^^zfCAQCxTfWgJU%xH^{gtCys1n5+t8Vn^U;lYec o4N_QuVu+bh5W}E&pc8Xa^T6UDYnT{7BFVW03}QeYLW+yZ`_I literal 0 HcmV?d00001 diff --git a/SysCore/objects/SYSTEM.O b/SysCore/objects/SYSTEM.O new file mode 100644 index 0000000000000000000000000000000000000000..e6e8ce578b956bee6ac7b60a971c873a0527f32d GIT binary patch literal 751 zcmeZaWMKdS3q}S85ipCDQLiMmq6Ex_5CuSL3lbm1Q~+YVl*E!m5C;!%0Ltkl6&K@C z0+wn3sY}k!%}vdNTMcrL3ea6BfQf-2EV$c6g{M14MWDMxMWppxiNG$9k}e+M4jus~ z%WI`yqvH;P)NpkBs0eh$sPMF&Ea3&K>5u^`xLEol8Y&+GGy^1msf4@pU|OeS^Fb!B z((loSyF*l1-ayF-?#|9u3L5Typ_&RNdM0{CAj|a9GILTv3?TUTpMfErvAD9hBsEtr z86pNEk;4(>4Q9rCgd~)O9EL!z0o7nAK?y%*TxyWQ4iuxzjDi>j#pkBxCKptK#X;6E zF@QvhQ%e|BfjktEa#w^%W?n&lQArZWV^B4jc}YMHLnd4V!~@wX0Ac_E$R`X8LO_fv zB7-5Kh9P2wBH|C^#fJdXV_0TNYJN~+E<=2BX;E>0QG5lQRS9Ml0aH$VZhlH?e0gR{ PNd}r&MrvkyMhOD|SmAX9 literal 0 HcmV?d00001 diff --git a/SysCore/objects/TIME.O b/SysCore/objects/TIME.O new file mode 100644 index 0000000000000000000000000000000000000000..52241f7bacf6fcb6486ded58ed096785be557cec GIT binary patch literal 1212 zcmaKrPfrs;7{+IIx22IPCDz14mBtWL6SEK>B*Uj^V%Ip{rZfN`=|- z)=7A8Pu7wbqkcX+uK9_XR>JGu8F}^ttu7&cp3b!LG_bx3%b@TSc#7AHkLJ@<#K=c58frU!*iQPJpO0exf|@z__OqQF{dAQT6kh z*GutXZ#SawNY~J=bYN>Ag0&VRQ?H7khJgn4^AWTnc!tJA*NC8wqK5LUUpfoqqm!LY_zU6c>mh8@z{Hg^JR&MAq` zs_Ak^z{@bizdV9|LBAo24KV}_LkZ{-l!C59I&>TQH}G}HJd}eTKt-qo)gUsK8oP>L zkWkKNvs3BJeD3~@^rSwi-x6!RfyB;@23c&9D2XA56ql5cBz9BSy(}puDJ^MSQby8E zNfVN0B`ru=l9ZRUCh3u+$CC8TQkkI=ar}pnE$WskOt(TO%!B7qydIS{F$n6%;8_&^ zQl%ASaRU1>cn)#gF{j@LgyMtMBfo_&ybFw oLLs}flD${Bo6C}dRjyh)g-X?Sx9f#6v(GxG)f2{cup8^-FLUn4hyVZp literal 0 HcmV?d00001 diff --git a/SysCore/objects/compile.bat b/SysCore/objects/compile.bat new file mode 100644 index 0000000..c34f0d7 --- /dev/null +++ b/SysCore/objects/compile.bat @@ -0,0 +1,16 @@ +@echo off +rem The name of the loader assembly file (without extension, must be .asm): +set loader_name=loader + +rem NASM and DJGPP executable paths: +set nasm_path=C:\nasm +set djgpp_path=C:\DJGPP\bin + +@echo on +%djgpp_path%\ld -T link.ld +@echo off +@echo. +@echo Done! + +@pause +copy KERNEL.BIN A:\KERNEL.CTA \ No newline at end of file diff --git a/SysCore/objects/link.ld b/SysCore/objects/link.ld new file mode 100644 index 0000000..ab49a73 --- /dev/null +++ b/SysCore/objects/link.ld @@ -0,0 +1,50 @@ +OUTPUT_FORMAT("binary") +ENTRY(start) +INPUT("loader.o", + "main.o", + "BSOD.o", + "cmos.o", + "conio.o", + "cpu.o", + "gdt.o", + "gdt_asm.o", + "hal.o", + "idt.o", + "idt_asm.o", + "irq.o", + "irq_asm.o", + "isrs.o", + "isrs_asm.o", + "mmngr_cr.o", + "mmngr_ph.o", + "keyus.o", + "pic.o", + "pit.o", + "string.o", + "system.o", + "time.o" +) +OUTPUT(kernel.bin) +phys = 0x00100000; +SECTIONS +{ + .text phys : AT(phys) { + __code = .; + *(.text) + *(.rodata) + . = ALIGN(4096); + } + .data : AT(phys + (__data - __code)) + { + __data = .; + *(.data) + . = ALIGN(4096); + } + .bss : AT(phys + (__bss - __code)) + { + __bss = .; + *(.bss) + . = ALIGN(4096); + } + __end = .; +} \ No newline at end of file diff --git a/SysCore/shell/apps.h b/SysCore/shell/apps.h new file mode 100644 index 0000000..33d6de2 --- /dev/null +++ b/SysCore/shell/apps.h @@ -0,0 +1,196 @@ +const char *apps_lst[] = { + "", + "reboot", + "osver", + "time", + "place", + "cls", + "memory", + "help", + "cpu_info", + "mem_alloc", //0 + "mem_free", //1 + "mem_stat", + "mem_test", //2 + }; +int apps_count = 13; + + + +unsigned int atox(const char* str) +{ + unsigned int temp = 0; + int i; unsigned int digit = 0; + + for (i = 0; str[i]!=0; i++) { + + if (str[i] >= '0' && str[i] <= '9') digit = str[i] - '0'; + else if (str[i] >= 'A' && str[i] <= 'F') digit = str[i] - 'A' + 10; + else if (str[i] >= 'a' && str[i] <= 'f') digit = str[i] - 'a' + 10; + else break; + + temp = temp*16 + digit; + } + + return temp; +} + +unsigned int atoui(const char* str) +{ + unsigned int temp = 0; + int i; + + for (i = 0; str[i] >= '0' && str[i] <= '9' ; i++) + temp = temp*10 + (str[i] - '0'); + + return temp; +} + + + +void apps_osver() +{ + printf ("CTA 32bit Operating System v0.1"); + printf ("\n(c) CTA 2010\n"); +} + +void apps_time() +{ + printf ("Today is %s, %u of %s, %u%u.\n", clock_weekdays[_internal_clock.weekday], + (unsigned int) _internal_clock.day, clock_months[_internal_clock.month], + (unsigned int) _internal_clock.century, (unsigned int) _internal_clock.year); + + printf ("Now is %u:%u:%u.\n", (unsigned int) _internal_clock.hours, + (unsigned int) _internal_clock.minutes, (unsigned int) _internal_clock.seconds); +} + +void apps_place() +{ + printf ("On your desk, if you didn't notice... \n"); +} + +void apps_clrscr() +{ + clrscr(); +} + +void apps_memory(const int pn, const char* param[]) +{ + if (pn<3) { + printf ("Correct syntax: memory [start_address] [end_address] (in hex)\n"); + return; + } + + byte *start, *end; + start = (byte *) atox (param[1]); + end = (byte *) atox (param[2]); + byte* count; + + while (start <= end) { + put_hex ((unsigned int) start); puts(": "); + + for (count = start; count < start+16; count++) { + putc(hex[*count/16]); putc(hex[*count%16]); + putc(' '); + } + puts(" "); + for (count = start; count < start+16; count++) { + if (*count < 32) putc('.'); + else putc(*count); + } + + putc('\n'); + start+=16; + } + + +} + +void apps_help(const int pn, const char* param[]) +{ + int i; + puts ("\n"); + if (pn==1) { + puts("[BeTA]\n"); + puts("Available commands:"); + for (i = 1; i < apps_count; i++) { + puts("\n \t "); puts((char*)apps_lst[i]); + } + puts("\n\nUse help [command] for help on individual commands.\n"); + return; + } + + for (i = 0; strcmp(apps_lst[i], param[1])!=0 && i 1 && strcmp(param[1], "times") == 0) + times = atoui(param[2]); + + uint32_t temp; + for (; times > 0; times--) { + temp = (uint32_t) pmmngr_alloc_block(); + if (temp == 0) { + printf ("Out of memory.\n"); + break; + } + else printf ("New block allocated at address 0x%x\n", temp); + } + return; + } + // Free + case 1: + { if (pn <= 1) { + printf ("Parameter missing: [address (hex)]\n"); + return; + } + + uint32_t temp = atox(param[1]); + pmmngr_free_block ((void*)temp); + printf ("Block containing address 0x%x now free.", temp); + return; + } + // Test + case 2: + { if (pn <= 1) { + printf ("Parameter missing: [block number]"); + return ; } + unsigned int temp = atoui(param[1]); + printf (pmmngr_test_block(temp) ? "Block %u is free.\n" : "Block %u is used.\n", temp); + } + } + +} + + +void apps_memory_status() +{ + printf ("Memory available: %u KB \n", pmmngr_get_memory_size ()); + printf ("Total blocks: %u Used: %u Free: %u\n", pmmngr_get_block_count (), pmmngr_get_use_block_count (), pmmngr_get_free_block_count ()); + printf ("Block size: %u bytes\nPaging is ", pmmngr_get_block_size()); + printf ( pmmngr_is_paging() ? "enabled.\n" : "disabled.\n"); +} \ No newline at end of file diff --git a/kernel/shell/shell.c b/SysCore/shell/shell.c similarity index 80% rename from kernel/shell/shell.c rename to SysCore/shell/shell.c index 9f6220d..87bb81a 100644 --- a/kernel/shell/shell.c +++ b/SysCore/shell/shell.c @@ -8,7 +8,7 @@ void get_str(char *str, int len) int i; for (i = 0; inul + if errorlevel 5 goto floppy_yes + + @echo Insert a floppy disk, and press any key to continue. + @pause >nul + goto floppy_no + + +:floppy_yes + @echo Formatting disk... + format A: /q nul + @echo. + +:bootloader + cd SysBoot + @echo. + call makeall.bat + cd.. + +:kernel + cd SysCore + call makeallh.bat + cd.. + +@echo ************************ Done ************************ +@echo. \ No newline at end of file diff --git a/kernel/clock/cmos.h b/kernel/clock/cmos.h deleted file mode 100644 index a8dba18..0000000 --- a/kernel/clock/cmos.h +++ /dev/null @@ -1,25 +0,0 @@ -volatile static byte cmos_data[128]; - -void cmos_write () -{ - byte i; - for (i = 0; i < 128; i++) { - //asm volatile ("cli"); - outportb(0x70, i); - iowait(); - outportb(0x71, cmos_data[i]); - //asm volatile ("sti"); - } -} - -void cmos_read () -{ - byte i; - for (i = 0; i < 128; i++) { - //asm volatile ("cli"); - outportb(0x70, i); - iowait(); - cmos_data[i] = inportb(0x71); - //asm volatile ("sti"); - } -} \ No newline at end of file diff --git a/kernel/clock/pictimer.c b/kernel/clock/pictimer.c deleted file mode 100644 index 9846d4a..0000000 --- a/kernel/clock/pictimer.c +++ /dev/null @@ -1,76 +0,0 @@ -#include -#include "time.c" -int timer_ticks = 0; -int timer_hz; - -void timer_phase(int hz) -{ - int divisor = 1193180/hz; // Calculate the divisor - outportb(0x43, 0x36); // Set our command byte 0x36 - outportb(0x40, divisor&0xFF); // Set low byte - outportb(0x40, divisor>>8); // Set high byte - timer_hz = hz; -} - -void clock_show (int uptime_secs) -{ - int i; - for (i=0;i<80;i++) putc_pos_font (i, 0, ' ', 0x02, 0x0F); - puts_pos_font (64, 0, "Uptime:", 0x02, 0x0E); - - unsigned int uptime; - - uptime = uptime_secs%60; // Seconds - uptime += 100* ((uptime_secs/60)%60); // Minutes - uptime += 10000*(uptime_secs/3600); // Hours - - for (i=79;i>71;i--) { - if (i==77 || i==74) { - if (uptime_secs%2==0) putc_pos_font(i, 0, ':', 0x02, 0x0F); - else putc_pos_font(i, 0, ' ', 0x02, 0x0F); - } - else { - putc_pos_font(i, 0, (uptime%10)+'0', 0x02, 0x0F); - uptime/=10; - } - } - - // PRINT CURRENT TIME - uptime = clock.seconds; // Seconds - uptime += 100* clock.minutes; // Minutes - uptime += 10000*clock.hours; // Hours - - for (i=9;i>1;i--) { - if (i==7 || i==4) { - if (uptime_secs%2==0) putc_pos_font(i, 0, ':', 0x02, 0x0F); - else putc_pos_font(i, 0, ' ', 0x02, 0x0F); - } - else { - putc_pos_font(i,0, (uptime%10)+'0', 0x02, 0x0F); - uptime/=10; - } - } - if (clock.am_pm==0) puts_pos_font(10, 0, "am", 0x02, 0x0F); - else puts_pos_font(10, 0, "pm", 0x02, 0x0F); - - // PRINT DATE - putc_pos_font(32, 0, (clock.day/10)+'0', 0x02, 0x0E); - putc_pos_font(33, 0, (clock.day%10)+'0', 0x02, 0x0E); - puts_pos_font(35, 0, (char*)clock_months[clock.month], 0x02, 0x0F); - putc_pos_font(35+strlen(clock_months[clock.month])+1, 0, (clock.century/10)+'0', 0x02, 0x0E); - putc_pos_font(35+strlen(clock_months[clock.month])+2, 0, (clock.century%10)+'0', 0x02, 0x0E); - putc_pos_font(35+strlen(clock_months[clock.month])+3, 0, (clock.year/10)+'0', 0x02, 0x0E); - putc_pos_font(35+strlen(clock_months[clock.month])+4, 0, (clock.year%10)+'0', 0x02, 0x0E); - -} - - -void timer_handler(regs *r) -{ - timer_ticks++; - - if (timer_ticks % timer_hz == 0) { - clock_show (timer_ticks / timer_hz); - clock_inc(); - } -} \ No newline at end of file diff --git a/kernel/clock/time.c b/kernel/clock/time.c deleted file mode 100644 index 5b0e3a2..0000000 --- a/kernel/clock/time.c +++ /dev/null @@ -1,143 +0,0 @@ -#ifndef __TIME_C -#define __TIME_C - -#include "cmos.h" - -static const char* clock_months[] = {0, - "January", "February", "March", "April", "May", "June", - "July", "August", "September", "October", "November", "December"}; -static const char* clock_weekdays[] = {0, - "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}; - -byte clock_months_len[] = { - 0, - 31, // January - 28, // February - 31, // March - 30, // April - 31, // May - 30, // June - 31, // July - 31, // August - 30, // September - 31, // October - 30, // November - 31 // December -}; - -typedef struct { - byte seconds; - byte minutes; - byte hours; - byte weekday; - byte day; - byte month; - byte year; - byte century; - byte am_pm; - -} TIME; -volatile static TIME clock; - -void RTC_get_time() -{ - cmos_read(); - - if ((cmos_data[0x0b]&4)==0) // BCD = true; - { - clock.seconds = (cmos_data[0x00]%16) + 10*(cmos_data[0x00]/16); - clock.minutes = (cmos_data[0x02]%16) + 10*(cmos_data[0x02]/16); - if ((cmos_data[0x0b]&2)==0) { // AM/PM - if (cmos_data[0x04]&80) { // pm - clock.hours = ((cmos_data[0x04]-0x80)%16) + 10*((cmos_data[0x04]-0x80)/16); - clock.am_pm = 1; - } - else { // am - clock.hours = (cmos_data[0x04]%16) + 10*(cmos_data[0x04]/16); - clock.am_pm = 0; - } - } - else { // 24 hours - clock.hours = (cmos_data[0x04]%16) + 10*(cmos_data[0x04]/16); - if (clock.hours > 12) { - clock.am_pm = 1; - clock.hours -= 12; - } - else clock.am_pm = 0; - } - - clock.weekday = (cmos_data[0x06]%16) + 10*(cmos_data[0x06]/16); - clock.day = (cmos_data[0x07]%16) + 10*(cmos_data[0x07]/16); - clock.month = (cmos_data[0x08]%16) + 10*(cmos_data[0x08]/16); - clock.year = (cmos_data[0x09]%16) + 10*(cmos_data[0x09]/16); - clock.century = (cmos_data[0x32]%16) + 10*(cmos_data[0x32]/16); - } - - else {//BCD = false; - clock.seconds = cmos_data[0x00]; - clock.minutes = cmos_data[0x02]; - if ((cmos_data[0x0b]&2)==0) { // AM/PM - if (cmos_data[0x04]&80) { // pm - clock.hours = cmos_data[0x04]-0x80; - clock.am_pm = 1; - } - else { // am - clock.hours = cmos_data[0x04]; - clock.am_pm = 0; - } - } - else { // 24 hours - clock.hours = cmos_data[0x02]; - if (clock.hours > 12) { - clock.am_pm = 1; - clock.hours -= 12; - } - else clock.am_pm = 0; - } - clock.weekday = cmos_data[0x06]; - clock.day = cmos_data[0x07]; - clock.month = cmos_data[0x08]; - clock.year = cmos_data[0x09]; - clock.century = cmos_data[0x32]; - } - // Leap years - if (clock.year % 4 == 0) clock_months_len[2]=29; - -} - -void clock_inc() -{ - // New minute - if (++clock.seconds > 59) { - clock.seconds = 0; - // New hour - if (++clock.minutes > 59) { - clock.minutes = 0; - clock.hours++; - if (clock.hours == 12 && clock.am_pm == 1) { // 11:59pm -> 0:00am - clock.hours = 0; clock.am_pm = 0; - // New day - clock.weekday = 1+(clock.weekday%7); - // New month - if (++clock.day > clock_months_len[clock.month]) { - clock.day = 1; - // New year - if (++clock.month>12) { - clock.month = 1; - // New century - if (++clock.year > 99) { - clock.year = 0; - clock.century++; - } - } - } - } - else if (clock.hours == 12 && clock.am_pm == 0) // 11:59am -> 12:00pm - clock.am_pm = 1; - else if (clock.hours == 13 && clock.am_pm == 1) // 12:59pm -> 1:59pm - clock.hours = 1; - } - } -} - -#endif \ No newline at end of file diff --git a/kernel/console.o b/kernel/console.o deleted file mode 100644 index 33bd1c53303d04a1a4420d1ca286137933a1653b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2605 zcmaJ@UuauZ96o7o)2>T*GmKDKHv4c3c4C~fldW{n*~yBOlBMk`w%esmZrao&x8&Z? z7PPi>#WY#L2lYjeZO)g8L_tQaP|~J2tcWrgolingbaL@gI z-|z4Fos)agW|IgV=N*L9F(lc%rZ#Fa%%|V%gnS4%$4$u-z_ob1!9KGO@B58rD82oL zaX%ZXo514@=+USa6RF+cE);VD@=-=e=$s4e)Q|g`_Q|hj>k3e`){%)qp`1)?CvUqT zUoNM!PoRf@awj^{M-^wfS8=6H#XbG^xN9CXNjV=#I$cj6`XljI@>sZ6&iu2iq$ zoc?sYn%N{hFjz_4>nZ6Ghw67QeQ3txqXu_-a_LS*nxk<9hGed}1Uz|*F1~{+-vKeT zT-%dNp#mCp;$L~hk$jMbY?4RH&r^`=_!u)uu|$ivq$&o^QI(uwO`Fb+@1M6pW{XHy zQ`INZ5yDZ@v$J_>sf-J9hG`EizP!pC4%1@mDWc87Qqrsf+ZC3CJJx?IXI75OnXhKu zF264yST7Wq)|Q=F0_*4d!u%F*N*~c+DVA#6ihrK&W&L$Ivt;L+oDai&YPqH-S1N)< zYi37b>R!#bn`>&|Ib_R+Sfiv|S2s>XL~&!sYOve2sWwHK`9{thrc1WnNgtqZG}4ol z#^nsFW>(spypEE#trXkQdBoOpNBG505GSI$uruzaszgQJ zj}m@4&NIjvmdMWLG~17)WN@%?BKUUQKwcI(+4-Dp(-Nn%W_iAVF5vtkm4p-rK}$*$LXy36gxAMH|SxT`C{@WdtdABk{7bRf{CWB z+K(!VFaItgw4|gxQ_Jqt*~Aa5F`~&YDmD1od04wT~QY@2anD@HTk&qYCmcp6z%X?5pKu=yA-|41I^W$l)Z@ZFi7^K=kN1$TNa# z7hDGr_kA9S`^JEHj!}W8h20rp_Xf}|7WpiYhoKLIb`FR~SpecWz82b_fp~p)fp~pY z_{MRMT|hjt0>mTl73hFKeL%eCFc9}05!@?+dsA>11oxTXt^n~It3W*O_rh*X*xeR( ze+s*GVON0<75A+c=rJH(Ujq=&(I~XdK)mKw!LJSPTqhmpvMe7qIm&vfFlUxLe*E7Z*)K^ASSr z=qH5^&d^hAWuCM!YE+8`hR4W3usjZB49z4bw=yFyl^DZ}N3f6qDLa+qVQ5xEf$R6cY}78veQ+zT9_P|*DTEEVBQyuI-D@+Y1)lVFU45} z(`#YYz`Q4z-yx~Sm|<#BH5?0@MD4^MrxW3zru+M%L=7b3ar~W8qk2$NN5VmKa0@r6 zg$D-VhCZ|HAu9dn#qHs2=yAl?Of{&5`VtXS4d@X)ZV(~&_XS=Ui0g@1u*8M*xVFLZ g80siXi)iW?VJlUKbwds5_@^brA`+xwwP7Op5AW>+cmMzZ diff --git a/kernel/include/sys/declarat.h b/kernel/include/sys/declarat.h deleted file mode 100644 index 28fa675..0000000 --- a/kernel/include/sys/declarat.h +++ /dev/null @@ -1,40 +0,0 @@ -// Data type declarations -typedef unsigned char byte; -typedef unsigned short word; -typedef unsigned int dword; - -/* This defines what the stack looks like after an ISR was running */ -typedef struct -{ - unsigned int gs, fs, es, ds; /* pushed the segs last */ - unsigned int edi, esi, ebp, esp, ebx, edx, ecx, eax; /* pushed by 'pusha' */ - unsigned int int_no, err_code; /* our 'push byte #' and ecodes do this */ - unsigned int eip, cs, eflags, useresp, ss; /* pushed by the processor automatically */ -} regs; - - -// Functions -void system_init(); -void *memcpy(void *dest, const void *src, int count); -void *memset(void *dest, char val, int count); -unsigned short *memsetw(unsigned short *dest, unsigned short val, int count); -int strlen (const char *str); -byte inportb (word _port); -byte inb (word _port); -void outportb (word _port, byte _data); -void outb (word _port, byte _data) ; - -void gdt_set_gate(int num, unsigned long base, unsigned long limit, unsigned char access, unsigned char gran); -void gdt_install(); - -void idt_set_gate(unsigned char num, unsigned long base, unsigned short sel, unsigned char flags); -void idt_install(); - -void isrs_install(); - -void irq_install_handler(int irq, void (*handler)(regs *r)); -void irq_uninstall_handler(int irq); -void irq_install(); -void kb_handler(regs *r); -void reboot(); -void kb_waitin(); \ No newline at end of file diff --git a/kernel/include/system.h b/kernel/include/system.h deleted file mode 100644 index 9ba8159..0000000 --- a/kernel/include/system.h +++ /dev/null @@ -1,85 +0,0 @@ -#ifndef __SYSTEM_H -#define __SYSTEM_H -#include - -#define true 1 -#define false 0 - -byte *TextVideoRam; -volatile static int cursor_x, cursor_y; -int current_mode_width; -int current_mode_height; - -void *memcpy(void *dest, const void *src, int count) -{ - const char *sp = (const char *)src; - char *dp = (char *)dest; - for(; count != 0; count--) *dp++ = *sp++; - return dest; -} - -void *memset(void *dest, char val, int count) -{ - char *temp = (char *)dest; - for( ; count != 0; count--) *temp++ = val; - return dest; -} - -unsigned short *memsetw(unsigned short *dest, unsigned short val, int count) -{ - unsigned short *temp = (unsigned short *)dest; - for( ; count != 0; count--) *temp++ = val; - return dest; -} - - -// strlen -- Get lenght of str -int strlen (const char *str) -{ - int i; - for (i = 0; *str!=0; str++) i++; - return i; -} - -int strcmp(const char *pStr1, const char *pStr2) -{ - char c1, c2; - int v; - - do { - c1 = *pStr1++; - c2 = *pStr2++; - /* the casts are necessary when pStr1 is shorter & char is signed */ - v = (unsigned int)c1 - (unsigned int)c2; - } while ((v == 0) && (c1 != '\0')); - - return v; -} - - - -byte inportb (word _port) { - byte rv; - __asm__ __volatile__ ("inb %1, %0" : "=a" (rv) : "dN" (_port)); - return rv; -} -byte inb (word _port) { - byte rv; - __asm__ __volatile__ ("inb %1, %0" : "=a" (rv) : "dN" (_port)); - return rv; -} - -static inline void iowait() { - asm volatile ("outb %al, $0x80"); -} - - -void outportb (word _port, byte _data) { - __asm__ __volatile__ ("outb %1, %0" : : "dN" (_port), "a" (_data)); -} -void outb (word _port, byte _data) { - __asm__ __volatile__ ("outb %1, %0" : : "dN" (_port), "a" (_data)); -} - - -#endif \ No newline at end of file diff --git a/kernel/kernel.bin b/kernel/kernel.bin deleted file mode 100644 index a50d6ed3038094d9ad6c727c92bc40a5df9a7c24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 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 n0+%9iDFT-wa47 - -/* These are own ISRs that point to our special IRQ handler -* instead of the regular 'fault_handler' function */ - -extern void irq0(); -extern void irq1(); -extern void irq2(); -extern void irq3(); -extern void irq4(); -extern void irq5(); -extern void irq6(); -extern void irq7(); -extern void irq8(); -extern void irq9(); -extern void irq10(); -extern void irq11(); -extern void irq12(); -extern void irq13(); -extern void irq14(); -extern void irq15(); - -/* This array is actually an array of function pointers. We use -* this to handle custom IRQ handlers for a given IRQ */ -void *irq_routines[16] = -{ - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0 -}; - -/* This installs a custom IRQ handler for the given IRQ */ -void irq_install_handler (int irq, void (*handler)(regs *r)) -{ - irq_routines[irq] = handler; -} - -void irq_uninstall_handler (int irq) -{ - irq_routines[irq] = 0; -} - - -/* Normally, IRQs 0 to 7 are mapped to entries 8 to 15. This -* is a problem in protected mode, because IDT entry 8 is a -* Double Fault! Without remapping, every time IRQ0 fires, -* you get a Double Fault Exception, which is NOT actually -* what's happening. We send commands to the Programmable -* Interrupt Controller (PICs - also called the 8259's) in -* order to make IRQ0 to 15 be remapped to IDT entries 32 to -* 47 */ -void irq_remap(int pic1, int pic2) -{ - // Send ICW1 - outportb(0x20, 0x11); - outportb(0xA0, 0x11); - - // send ICW2 - outportb(0x21, pic1); // remap pics - outportb(0xA1, pic2); - - // send ICW3 - outportb(0x21, 4); - outportb(0xA1, 2); - - // Send ICW4 - outportb(0x21, 0x01); - outportb(0xA1, 0x01); - - outportb(0x21, 0x00); -} - -/* We first remap the interrupt controllers, and then we install -* the appropriate ISRs to the correct entries in the IDT. This -* is just like installing the exception handlers */ -void irq_install() -{ - irq_remap(32,40); - - idt_set_gate(32, (unsigned)irq0, 0x08, 0x8E); - idt_set_gate(33, (unsigned)irq1, 0x08, 0x8E); - idt_set_gate(34, (unsigned)irq2, 0x08, 0x8E); - idt_set_gate(35, (unsigned)irq3, 0x08, 0x8E); - idt_set_gate(36, (unsigned)irq4, 0x08, 0x8E); - idt_set_gate(37, (unsigned)irq5, 0x08, 0x8E); - idt_set_gate(38, (unsigned)irq6, 0x08, 0x8E); - idt_set_gate(39, (unsigned)irq7, 0x08, 0x8E); - idt_set_gate(40, (unsigned)irq8, 0x08, 0x8E); - idt_set_gate(41, (unsigned)irq9, 0x08, 0x8E); - idt_set_gate(42, (unsigned)irq10, 0x08, 0x8E); - idt_set_gate(43, (unsigned)irq11, 0x08, 0x8E); - idt_set_gate(44, (unsigned)irq12, 0x08, 0x8E); - idt_set_gate(45, (unsigned)irq13, 0x08, 0x8E); - idt_set_gate(46, (unsigned)irq14, 0x08, 0x8E); - idt_set_gate(47, (unsigned)irq15, 0x08, 0x8E); -} - -/* Each of the IRQ ISRs point to this function, rather than -* the 'fault_handler' in 'isrs.c'. The IRQ Controllers need -* to be told when you are done servicing them, so you need -* to send them an "End of Interrupt" command (0x20). There -* are two 8259 chips: The first exists at 0x20, the second -* exists at 0xA0. If the second controller (an IRQ from 8 to -* 15) gets an interrupt, you need to acknowledge the -* interrupt at BOTH controllers, otherwise, you only send -* an EOI command to the first controller. If you don't send -* an EOI, you won't raise any more IRQs */ -void irq_handler (regs *r) -{ - /* This is a blank function pointer */ - void (*handler)(regs *r); - - /* Find out if we have a custom handler to run for this - * IRQ, and then finally, run it */ - handler = irq_routines[r->int_no - 32]; - if (handler) handler(r); - - /* If the IDT entry that was invoked was greater than 40 - * (meaning IRQ8 - 15), then we need to send an EOI to - * the slave controller */ - if (r->int_no >=40) outportb(0x0A, 0x20); - - /* In either case, we need to send an EOI to the master - * interrupt controller too */ - outportb(0x20, 0x20); -} diff --git a/kernel/kernel/isrs.c b/kernel/kernel/isrs.c deleted file mode 100644 index fa1ef02..0000000 --- a/kernel/kernel/isrs.c +++ /dev/null @@ -1,162 +0,0 @@ -#include - -extern void isr0(); -extern void isr1(); -extern void isr2(); -extern void isr3(); -extern void isr4(); -extern void isr5(); -extern void isr6(); -extern void isr7(); -extern void isr8(); -extern void isr9(); -extern void isr10(); -extern void isr11(); -extern void isr12(); -extern void isr13(); -extern void isr14(); -extern void isr15(); -extern void isr16(); -extern void isr17(); -extern void isr18(); -extern void isr19(); -extern void isr20(); -extern void isr21(); -extern void isr22(); -extern void isr23(); -extern void isr24(); -extern void isr25(); -extern void isr26(); -extern void isr27(); -extern void isr28(); -extern void isr29(); -extern void isr30(); -extern void isr31(); - -/* This is a very repetitive function... it's not hard, it's -* just annoying. As you can see, we set the first 32 entries -* in the IDT to the first 32 ISRs. We can't use a for loop -* for this, because there is no way to get the function names -* that correspond to that given entry. We set the access -* flags to 0x8E. This means that the entry is present, is -* running in ring 0 (kernel level), and has the lower 5 bits -* set to the required '14', which is represented by 'E' in -* hex. */ -void isrs_install() -{ - idt_set_gate(0, (unsigned)isr0, 0x08, 0x8E); - idt_set_gate(1, (unsigned)isr1, 0x08, 0x8E); - idt_set_gate(2, (unsigned)isr2, 0x08, 0x8E); - idt_set_gate(3, (unsigned)isr3, 0x08, 0x8E); - idt_set_gate(4, (unsigned)isr4, 0x08, 0x8E); - idt_set_gate(5, (unsigned)isr5, 0x08, 0x8E); - idt_set_gate(6, (unsigned)isr6, 0x08, 0x8E); - idt_set_gate(7, (unsigned)isr7, 0x08, 0x8E); - idt_set_gate(8, (unsigned)isr8, 0x08, 0x8E); - idt_set_gate(9, (unsigned)isr9, 0x08, 0x8E); - idt_set_gate(10, (unsigned)isr10, 0x08, 0x8E); - idt_set_gate(11, (unsigned)isr11, 0x08, 0x8E); - idt_set_gate(12, (unsigned)isr12, 0x08, 0x8E); - idt_set_gate(13, (unsigned)isr13, 0x08, 0x8E); - idt_set_gate(14, (unsigned)isr14, 0x08, 0x8E); - idt_set_gate(15, (unsigned)isr15, 0x08, 0x8E); - idt_set_gate(16, (unsigned)isr16, 0x08, 0x8E); - idt_set_gate(17, (unsigned)isr17, 0x08, 0x8E); - idt_set_gate(18, (unsigned)isr18, 0x08, 0x8E); - idt_set_gate(19, (unsigned)isr19, 0x08, 0x8E); - idt_set_gate(20, (unsigned)isr20, 0x08, 0x8E); - idt_set_gate(21, (unsigned)isr21, 0x08, 0x8E); - idt_set_gate(22, (unsigned)isr22, 0x08, 0x8E); - idt_set_gate(23, (unsigned)isr23, 0x08, 0x8E); - idt_set_gate(24, (unsigned)isr24, 0x08, 0x8E); - idt_set_gate(25, (unsigned)isr25, 0x08, 0x8E); - idt_set_gate(26, (unsigned)isr26, 0x08, 0x8E); - idt_set_gate(27, (unsigned)isr27, 0x08, 0x8E); - idt_set_gate(28, (unsigned)isr28, 0x08, 0x8E); - idt_set_gate(29, (unsigned)isr29, 0x08, 0x8E); - idt_set_gate(30, (unsigned)isr30, 0x08, 0x8E); - idt_set_gate(31, (unsigned)isr31, 0x08, 0x8E); -} - - char *exception_messages[] = { - "Division By Zero Exception", - "Debug Exception", - "Non Maskable Interrupt Exception", - "Breakpoint Exception", - "Into Detected Overflow Exception", - "Out of Bounds Exception", - "Invalid Opcode Exception", - "No Coprocessor", - "Double Fault Exception", - "Coprocessor Segment Overrun Exception", - "Bad TSS Exception", - "Segment Not Present Exception", - "Stack Fault Exception", - "General Protection Fault Exception", - "Page Fault Exception", - "Unknown Interrupt Exception", - "Coprocessor Fault Exception", - "Alignment Check Exception", - "Machine Check Exception", - "Reserved Exception", - "Reserved Exception", - "Reserved Exception", - "Reserved Exception", - "Reserved Exception", - "Reserved Exception", - "Reserved Exception", - "Reserved Exception", - "Reserved Exception", - "Reserved Exception", - "Reserved Exception", - "Reserved Exception" -}; - - -/* All of our Exception handling Interrupt Service Routines will -* point to this function. This will tell us what exception has -* happened! Right now, we simply halt the system by hitting an -* endless loop. All ISRs disable interrupts while they are being -* serviced as a 'locking' mechanism to prevent an IRQ from -* happening and messing up kernel data structures */ -void fault_handler(regs *r) -{ - /* Is this a fault whose number is from 0 to 31? */ - if (r->int_no < 32) - { - /* Display the description for the Exception that occurred.*/ - - // Put on the BSOD screen - set_default_colors (0x01, 0x0F); clrscr(); - puts (" Blue Screen Of Death\n"); - int i; for (i = 79; i>=0; i--) putc('='); - puts_pos_font (15, 2, "A fatal error has occured, CTA OS has been halted.", 0x01, 0x0C); - puts_pos_font (10, 4, "gs", 0x01, 0x0B); put_hex_pos(15, 4, r->gs); - puts_pos_font (10, 5, "fs", 0x01, 0x0B); put_hex_pos(15, 5, r->fs); - puts_pos_font (10, 6, "es", 0x01, 0x0B); put_hex_pos(15, 6, r->es); - puts_pos_font (10, 7, "ds", 0x01, 0x0B); put_hex_pos(15, 7, r->ds); - - puts_pos_font (40, 4, "edi", 0x01, 0x0B); put_hex_pos(45, 4, r->edi); - puts_pos_font (40, 5, "esi", 0x01, 0x0B); put_hex_pos(45, 5, r->esi); - puts_pos_font (40, 6, "ebp", 0x01, 0x0B); put_hex_pos(45, 6, r->ebp); - puts_pos_font (40, 7, "esp", 0x01, 0x0B); put_hex_pos(45, 7, r->esp); - - puts_pos_font (10, 9, "eax", 0x01, 0x0B); put_hex_pos(15, 9, r->eax); - puts_pos_font (10, 10, "ebx", 0x01, 0x0B); put_hex_pos(15, 10, r->ebx); - puts_pos_font (40, 9, "ecx", 0x01, 0x0B); put_hex_pos(45, 9, r->ecx); - puts_pos_font (40, 10, "edx", 0x01, 0x0B); put_hex_pos(45, 10, r->edx); - - puts_pos_font (10, 12, "int_no", 0x01, 0x0B); put_hex_pos(17, 12, r->int_no); - puts_pos_font (10, 14, "Error code:", 0x01, 0x0B); put_hex_pos(24, 14, r->err_code); - puts_pos_font (10, 15, "Error msg: ", 0x01, 0x0B); puts_pos(24, 15, exception_messages[r->int_no]); - - puts_pos_font (10, 17, "eip", 0x01, 0x0B); put_hex_pos(17, 17, r->eip); - puts_pos_font (10, 18, "cs", 0x01, 0x0B); put_hex_pos(17, 18, r->cs); - puts_pos_font (10, 19, "eflags", 0x01, 0x0B); put_hex_pos(17, 19, r->eflags); - puts_pos_font (10, 20, "useresp", 0x01, 0x0B); put_hex_pos(17, 20, r->useresp); - puts_pos_font (10, 21, "ss", 0x01, 0x0B); put_hex_pos(17, 21, r->ss); - - puts_pos_font (29, 24, "!!! System Halted !!!", 0x01, 0x0C); - for (;;); - } -} diff --git a/kernel/kernel/memory.c b/kernel/kernel/memory.c deleted file mode 100644 index b5d21e7..0000000 --- a/kernel/kernel/memory.c +++ /dev/null @@ -1,4 +0,0 @@ -extern unsigned long* read_cr0(); -extern unsigned long* read_cr3(); -extern void write_cr0(unsigned long* alpha); -extern void write_cr3(unsigned long* alpha); \ No newline at end of file diff --git a/kernel/kernel/prologue.c b/kernel/kernel/prologue.c deleted file mode 100644 index f0eb980..0000000 --- a/kernel/kernel/prologue.c +++ /dev/null @@ -1,61 +0,0 @@ -#include -#include "gdt.c" -#include "idt.c" -#include "isrs.c" -#include "irq.c" - -void system_init() -{ - // Detect if color/monochrome screen - char c = (*(volatile unsigned short*)0x410)&0x30; - if (c==0x30) TextVideoRam = (byte *)0xb0000; - else TextVideoRam = (byte *)0xb8000; - - // Reset cursor, use 80x25 text video mode - current_mode_width = 80; - current_mode_height = 25; - cursor_x = cursor_y = 0; - - // Install GDT, IDT, ISRs and IRQs; Enable interrupts - gdt_install(); - idt_install(); - isrs_install(); - irq_install(); - RTC_get_time(); - __asm__ __volatile__ ("sti"); - - // Install PIT timer - timer_ticks = 0; - timer_phase (100); - irq_install_handler(0, timer_handler); - - // Install keyboard (part 1): install IRQ1 and start BAT test - kb_modifier_status = 0; - irq_install_handler(1, kb_handler); - kb_waitin(); outportb(0x60, 0xFF); // Reset kb - - - // other drivers come here!!; - - - - // Install keyboard (part 2): BAT test results & set repeat rates - byte temp; - do temp = inportb(0x60); - while (temp!=0xAA && temp!=0xFC); - // KB failed BAT TEST - if (temp == 0xFC) puts_font("\nKeyboard error: failed BAT test.", 0x07, 0x0C); - kb_set_repeat(1, 11); - - // Install keyboard (part 3): set scancode set 2 - kb_set_scancodeset(2); // Set new scancode set - - kb_waitin(); outportb(0x64, 0x20); // Get "Command byte" - do { temp = inportb(0x60); - } while (temp==0xFA || temp==0xAA); - - temp &= 0xFF - (1<<6); // Set bit6 to 0: disable conversion - kb_waitin(); outportb(0x64, 0x60); // Function to write cmd byte - kb_waitin(); outportb(0x60, temp); // Send it - memset(kb_array, 0, 16); -} \ No newline at end of file diff --git a/kernel/keyboard/keyb.c b/kernel/keyboard/keyb.c deleted file mode 100644 index 3ab763c..0000000 --- a/kernel/keyboard/keyb.c +++ /dev/null @@ -1,60 +0,0 @@ - - -void kb_test() -{ - byte temp=0, secs=0; - - puts("\nTHIS WILL TEST FEW COMMANDS OF THE PS/2 KEYBOARD.\n"); - - - puts("\nEcho... "); - while ((inportb(0x64)&2)!=0); - outportb(0x60, 0xEE); -/* while ((inportb(0x64)&1)!=0); - temp = inportb(0x60); - putc_font('[', 0x07, 0x02); - putc_font(hex[temp/16], 0x07, 0x02); - putc_font(hex[temp%16], 0x07, 0x02); - putc_font(']', 0x07, 0x02);*/ - - - puts("\nSet LEDs - SCROLL on... "); - while ((inportb(0x64)&2)!=0); - outportb(0x60, 0xED); -/* while ((inportb(0x64)&2)!=0); - outportb(0x60, 1); - while ((inportb(0x64)&1)!=0); - temp = inportb(0x60);*/ - putc_font('[', 0x07, 0x02); - putc_font(hex[temp/16], 0x07, 0x02); - putc_font(hex[temp%16], 0x07, 0x02); - putc_font(']', 0x07, 0x02); - - - puts("\nGet current scancode set... "); - while ((inportb(0x64)&2)!=0); - outportb(0x60, 0xF0); - while ((inportb(0x64)&2)!=0); - outportb(0x60, 0); - -/* while ((inportb(0x64)&1)!=0); - temp = inportb(0x60); - putc_font('[', 0x07, 0x02); - putc_font(hex[temp/16], 0x07, 0x02); - putc_font(hex[temp%16], 0x07, 0x02); - putc_font(']', 0x07, 0x02);*/ - - - puts("\nTurning on 2 leds (don't know which ones :P)... "); - while ((inportb(0x64)&2)!=0); - outportb(0x60, 0xED); - while ((inportb(0x64)&2)!=0); - outportb(0x60, (byte)1|2); - /* while ((inportb(0x64)&1)!=0); - temp = inportb(0x60); - putc_font('[', 0x07, 0x02); - putc_font(hex[temp/16], 0x07, 0x02); - putc_font(hex[temp%16], 0x07, 0x02); - putc_font(']', 0x07, 0x02);*/ - -} \ No newline at end of file diff --git a/kernel/keyboard/keyus.h b/kernel/keyboard/keyus.h deleted file mode 100644 index 7b26dc4..0000000 --- a/kernel/keyboard/keyus.h +++ /dev/null @@ -1,137 +0,0 @@ -void kb_set_LEDs(byte status); -void kb_set_repeat(byte rate, byte delay); -void kb_set_scancodeset(byte set); - -char kbdus_map[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '\t', '`', 0, - 0, 0, 0, 0, 0, 'q', '1', 0, 0, 0, 'z', 's', 'a', 'w', '2', 0, - 0, 'c', 'x', 'd', 'e', '4', '3', 0, 0, ' ', 'v', 'f', 't', 'r', '5', 0, - 0, 'n', 'b', 'h', 'g', 'y', '6', 0, 0, 0, 'm', 'j', 'u', '7', '8', 0, - 0, ',', 'k', 'i', 'o', '0', '9', 0, 0, '.', '/', 'l', ';', 'p', '-', 0, - 0, 0, '\'', 0, '[', '=', 0, 0, 0, '\n', '\n', ']', 0, '\\', 0, 0, - 0, 0, 0x7F, 0, 0, 0, '\b', 0, 0, '1', '/', '4', '7', 0, 0, 0, - '0', '.', '2', '5', '6', '8', 0, 0, 0, '+', '3', '-', '*', '9', 0, 0 - }; - -char kbdus_map_shift[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, '\t', '~', 0, - 0, 0, 0, 0, 0, 'Q', '!', 0, 0, 0, 'Z', 'S', 'A', 'W', '@', 0, - 0, 'C', 'X', 'D', 'E', '$', '#', 0, 0, ' ', 'V', 'F', 'T', 'R', '%', 0, - 0, 'N', 'B', 'H', 'G', 'Y', '^', 0, 0, 0, 'M', 'J', 'U', '&', '*', 0, - 0, '<', 'K', 'I', 'O', ')', '(', 0, 0, '>', '?', 'L', ':', 'P', '_', 0, - 0, 0, '\"', 0, '{', '+', 0, 0, 0, '\n', '\n', '}', 0, '|', 0, 0, - 0, 0, 0x7F, 0, 0, 0, '\b', 0, 0, '1', '/', '4', '7', 0, 0, 0, - '0', '.', '2', '5', '6', '8', 0, 0, 0, '+', '3', '-', '*', '9', 0, 0 - }; -/* kb_modifier_status: - BIT | Description - ----+----------------------------------- - 0 | Left Shift - 1 | Right Shift - 2 | Left Alt - 3 | Right Alt - 4 | Left CTRL - 5 | Right CTRL - 6 | Fake Shift */ -byte kb_modifier_status; - -/* kb_modifier_status: - BIT | Description - ----+----------------------------------- - 0 | Gray - 1 | Break code - 2 | 0xE1 (pause/break) - 3 | Recieved first byte from pause/break */ -byte kb_prefix; - -/* kb_lights_status - BIT | Description - ----+----------------------------------- - 0 | SCROLLOCK - 1 | NUMLOCK - 2 | CAPSLOCK */ -byte kb_lights_status; -byte kb_scancode_set; - - -/*************************************** - * Set repeat rate/delay * - *************************************** - Values for inter-character delay (bits 4-0) - (characters per second; default is 10.9) - | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 - ----+----+----+----+----+----+----+----+---- - 0 |30.0|26.7|24.0|21.8|20.0|18.5|17.1|16.0 - 8 |15.0|13.3|12.0|10.9|10.0|9.2 |8.6 |8.0 - 16 |7.5 |6.7 |6.0 |5.5 |5.0 |4.6 |4.3 |4.0 - 24 |3.7 |3.3 |3.0 |2.7 |2.5 |2.3 |2.1 |2.0 - - Values for delay: - (miliseconds; default is 500) - 0 | 1 | 2 | 3 - -----+-----+-----+----- - 250 | 500 | 750 | 1000 - - ***************************************/ -void kb_set_repeat(byte rate, byte delay) -{ - if (rate>3 || delay>31) return; - - byte out = rate<<5 | delay; - while ((inportb(0x64)&2) != 0); - outportb(0x60, 0xF3); - while ((inportb(0x64)&2) != 0); - outportb(0x60, out); -} - - -/*************************************** - * Set keyboard LEDs * - *************************************** - +-----------+-------+-------+--------+ - | Bits 7-3 | Bit 2 | Bit 1 | Bit 0 | - | 0 | Caps | Num | Scroll | - |(reserved) | lock | lock | lock | - +-----------+-------+-------+--------+ - ***************************************/ -void kb_set_LEDs(byte status) -{ - while ((inportb (0x64)&2)!=0); - outportb (0x60, 0xED); - - while ((inportb (0x64)&2)!=0); - outportb (0x60, status); -} - -/*************************************** - * Set scancode set * - *************************************** - 0 Get current scancode set - 1 Set to scancode set 1 - 2 Set to scancode set 2 - 3 Set to scancode set 3 - ***************************************/ -void kb_set_scancodeset(byte set) -{ - //If ask for current scancode, tell kb handler what to expect - if (set==0) kb_scancode_set = 4; - - while ((inportb (0x64)&2)!=0); - outportb (0x60, 0xF0); - - while ((inportb (0x64)&2)!=0); - outportb (0x60, set); -} - - -void kb_waitin() -{ - int fail_safe=200000; - while ((inportb(0x64)&2)!=0 && fail_safe>0) fail_safe--; -} - -void kb_waitout() -{ - int fail_safe=200000; - while ((inportb(0x64)&1)==0 && fail_safe>0) fail_safe--; -} \ No newline at end of file diff --git a/kernel/link.ld b/kernel/link.ld deleted file mode 100644 index 1699422..0000000 --- a/kernel/link.ld +++ /dev/null @@ -1,25 +0,0 @@ -OUTPUT_FORMAT("binary") -ENTRY(start) -phys = 0x00100000; -SECTIONS -{ - .text phys : AT(phys) { - code = .; - *(.text) - *(.rodata) - . = ALIGN(4096); - } - .data : AT(phys + (data - code)) - { - data = .; - *(.data) - . = ALIGN(4096); - } - .bss : AT(phys + (bss - code)) - { - bss = .; - *(.bss) - . = ALIGN(4096); - } - end = .; -} \ No newline at end of file diff --git a/kernel/loader.asm b/kernel/loader.asm deleted file mode 100644 index eba57f1..0000000 --- a/kernel/loader.asm +++ /dev/null @@ -1,478 +0,0 @@ -[BITS 32] -global start -start: mov esp, _sys_stack ; This points the stack to our new stack area - jmp stublet - - -; This part MUST be 4byte aligned, so we solve that issue using 'ALIGN 4' -ALIGN 4 -mboot: - ; Multiboot macros to make a few lines later more readable - MULTIBOOT_PAGE_ALIGN equ 1<<0 - MULTIBOOT_MEMORY_INFO equ 1<<1 - MULTIBOOT_AOUT_KLUDGE equ 1<<16 - MULTIBOOT_HEADER_MAGIC equ 0x1BADB002 - MULTIBOOT_HEADER_FLAGS equ MULTIBOOT_PAGE_ALIGN | MULTIBOOT_MEMORY_INFO | MULTIBOOT_AOUT_KLUDGE - MULTIBOOT_CHECKSUM equ -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS) - EXTERN code, bss, end - - ; This is the GRUB Multiboot header. A boot signature - dd MULTIBOOT_HEADER_MAGIC - dd MULTIBOOT_HEADER_FLAGS - dd MULTIBOOT_CHECKSUM - - ; AOUT kludge - must be physical addresses. Make a note of these: - ; The linker script fills in the data for these ones! - dd mboot - dd code - dd bss - dd end - dd start - -; This is an endless loop here. Make a note of this: Later on, we -; will insert an 'extern _main', followed by 'call _main', right -; before the 'jmp $'. -stublet: - extern _main - call _main - jmp $ - - -; !!! GDT !!! -; This will set up our new segment registers. We need to do -; something special in order to set CS. We do what is called a -; far jump. A jump that includes a segment as well as an offset. -; This is declared in C as 'extern void gdt_flush();' - -global _gdt_flush ; Allows the C code to link to this -extern _gp ; Says that '_gp' is in another file -_gdt_flush: - lgdt [_gp] ; Load the GDT with our '_gp' which is a special pointer - mov ax, 0x10 ; 0x10 is the offset in the GDT to our data segment - mov ds, ax - mov es, ax - mov fs, ax - mov gs, ax - mov ss, ax - jmp 0x08:flush2 ; 0x08 is the offset to our code segment: Far jump! -flush2: - ret ; Returns back to the C code! - - -; !!! IDT !!! -; Loads the IDT defined in '_idtp' -global _idt_load -extern _idtp -_idt_load: - lidt [_idtp] - ret - -; !!! ISRs !!! -global _isr0 -global _isr1 -global _isr2 -global _isr3 -global _isr4 -global _isr5 -global _isr6 -global _isr7 -global _isr8 -global _isr9 -global _isr10 -global _isr11 -global _isr12 -global _isr13 -global _isr14 -global _isr15 -global _isr16 -global _isr17 -global _isr18 -global _isr19 -global _isr20 -global _isr21 -global _isr22 -global _isr23 -global _isr24 -global _isr25 -global _isr26 -global _isr27 -global _isr28 -global _isr29 -global _isr30 -global _isr31 - -_isr0: - cli - push byte 0; A normal ISR stub that pops a dummy error code to keep a - ; uniform stack frame - push byte 0 - jmp isr_common_stub -_isr1: - cli - push byte 0 - push byte 1 - jmp isr_common_stub -_isr2: - cli - push byte 0 - push byte 2 - jmp isr_common_stub -_isr3: - cli - push byte 0 - push byte 3 - jmp isr_common_stub -_isr4: - cli - push byte 0 - push byte 4 - jmp isr_common_stub -_isr5: - cli - push byte 0 - push byte 5 - jmp isr_common_stub -_isr6: - cli - push byte 0 - push byte 6 - jmp isr_common_stub -_isr7: - cli - push byte 0 - push byte 7 - jmp isr_common_stub -_isr8: - cli - push byte 8 - jmp isr_common_stub -_isr9: - cli - push byte 0 - push byte 9 - jmp isr_common_stub -_isr10: - cli - push byte 10 - jmp isr_common_stub -_isr11: - cli - push byte 11 - jmp isr_common_stub -_isr12: - cli - push byte 12 - jmp isr_common_stub -_isr13: - cli - push byte 13 - jmp isr_common_stub -_isr14: - cli - push byte 14 - jmp isr_common_stub -_isr15: - cli - push byte 0 - push byte 15 - jmp isr_common_stub -_isr16: - cli - push byte 0 - push byte 16 - jmp isr_common_stub -_isr17: - cli - push byte 0 - push byte 17 - jmp isr_common_stub -_isr18: - cli - push byte 0 - push byte 18 - jmp isr_common_stub -_isr19: - cli - push byte 0 - push byte 19 - jmp isr_common_stub -_isr20: - cli - push byte 0 - push byte 20 - jmp isr_common_stub -_isr21: - cli - push byte 0 - push byte 21 - jmp isr_common_stub -_isr22: - cli - push byte 0 - push byte 22 - jmp isr_common_stub -_isr23: - cli - push byte 0 - push byte 23 - jmp isr_common_stub -_isr24: - cli - push byte 0 - push byte 24 - jmp isr_common_stub -_isr25: - cli - push byte 0 - push byte 25 - jmp isr_common_stub -_isr26: - cli - push byte 0 - push byte 26 - jmp isr_common_stub -_isr27: - cli - push byte 0 - push byte 27 - jmp isr_common_stub -_isr28: - cli - push byte 0 - push byte 28 - jmp isr_common_stub -_isr29: - cli - push byte 0 - push byte 29 - jmp isr_common_stub -_isr30: - cli - push byte 0 - push byte 30 - jmp isr_common_stub -_isr31: - cli - push byte 0 - push byte 31 - jmp isr_common_stub - -extern _fault_handler - -isr_common_stub: - pusha - push ds - push es - push fs - push gs - mov ax, 0x10 ; Load the Kernel Data Segment descriptor! - mov ds, ax - mov es, ax - mov fs, ax - mov gs, ax - mov eax, esp ; Push us the stack - push eax - mov eax, _fault_handler - call eax ; A special call, preserves the 'eip' register - pop eax - pop gs - pop fs - pop es - pop ds - popa - add esp, 8 ; Cleans up the pushed error code and pushed ISR number - iret ; pops 5 things at once: CS, EIP, EFLAGS, SS, and ESP! - - -; !!! IRQ !!! -global _irq0 -global _irq1 -global _irq2 -global _irq3 -global _irq4 -global _irq5 -global _irq6 -global _irq7 -global _irq8 -global _irq9 -global _irq10 -global _irq11 -global _irq12 -global _irq13 -global _irq14 -global _irq15 - -; 32: IRQ0 -_irq0: - cli - push byte 0 - push byte 32; Note that these don't push an error code on the stack: - ; We need to push a dummy error code - jmp irq_common_stub - -; 33: IRQ1 -_irq1: - cli - push byte 0 - push byte 33 - jmp irq_common_stub - -; 34: IRQ2 -_irq2: - cli - push byte 0 - push byte 34 - jmp irq_common_stub - -; 35: IRQ3 -_irq3: - cli - push byte 0 - push byte 35 - jmp irq_common_stub - -; 36: IRQ4 -_irq4: - cli - push byte 0 - push byte 36 - jmp irq_common_stub - -; 37: IRQ5 -_irq5: - cli - push byte 0 - push byte 37 - jmp irq_common_stub - -; 38: IRQ6 -_irq6: - cli - push byte 0 - push byte 38 - jmp irq_common_stub - -; 39: IRQ7 -_irq7: - cli - push byte 0 - push byte 39 - jmp irq_common_stub - -; 40: IRQ8 -_irq8: - cli - push byte 0 - push byte 40 - jmp irq_common_stub -; 41: IRQ9 -_irq9: - cli - push byte 0 - push byte 41 - jmp irq_common_stub - -; 42: IRQ10 -_irq10: - cli - push byte 0 - push byte 42 - jmp irq_common_stub - -; 43: IRQ11 -_irq11: - cli - push byte 0 - push byte 43 - jmp irq_common_stub - -; 44: IRQ12 -_irq12: - cli - push byte 0 - push byte 44 - jmp irq_common_stub - -; 45: IRQ13 -_irq13: - cli - push byte 0 - push byte 45 - jmp irq_common_stub - -; 46: IRQ14 -_irq14: - cli - push byte 0 - push byte 46 - jmp irq_common_stub - -; 47: IRQ15 -_irq15: - cli - push byte 0 - push byte 47 - jmp irq_common_stub - -extern _irq_handler - -; This is a stub that we have created for IRQ based ISRs. This calls -; '_irq_handler' in our C code. We need to create this in an 'irq.c' -irq_common_stub: - pusha - push ds - push es - push fs - push gs - mov ax, 0x10 - mov ds, ax - mov es, ax - mov fs, ax - mov gs, ax - mov eax, esp - push eax - mov eax, _irq_handler - call eax - pop eax - pop gs - pop fs - pop es - pop ds - popa - add esp, 8 - iret - - -[global _read_cr0] -_read_cr0: - mov eax, cr0 - retn - -[global _write_cr0] -_write_cr0: - push ebp - mov ebp, esp - mov eax, [ebp+8] - mov cr0, eax - pop ebp - retn - -[global _read_cr3] -_read_cr3: - mov eax, cr3 - retn - -[global _write_cr3] -_write_cr3: - push ebp - mov ebp, esp - mov eax, [ebp+8] - mov cr3, eax - pop ebp - retn - - - -SECTION .bss - resb 8192 ; This reserves 8KBytes of memory here -_sys_stack: \ No newline at end of file diff --git a/kernel/loader.o b/kernel/loader.o deleted file mode 100644 index 9e620cd8b89ae85c8b39cd8bc6871e17115b8c4f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2348 zcmb7_T})g>6vt=zZo9a}mO`b41>4#$wD(e~L>pb{vfaS46j-BHyezv*3j*uCyTmp= z_^oMcaUV=g>`Uo`p&FA$A8h;z5&NPsG@2$DKT>0f9TWAz7_B_u|ID1;T;r2Bob&(9 znS0L68RkN{FD+(@gnoiTJYTGFP>c9*rb!416NN(2`M2weg-hpY$TLi< z!-e@(9yfIl)vd(@g8+!%Q`@hpAR}Fs+yOFx?_eraHNmX@jh1+9=mD z)ytJk4H6&*>&pUX0yEx&J$9w%0!=MndN6P%jOXc$f^IL3ZZA!4FSokA zY;t?q?Dn$7?d3MNm#uCu+uUBZyS?mid)evs((LwfyW7hh|GSq!aCRDyd{QM?cK8}mWvAIur(5_1;n z!-3HIM`7j6&w(qMPlDGlzXo2<|y>wqI?DVybP`5?&FJ6I)8JG#oe@L1oXAY1g*BcWnGn{Y$AvYL&chEUC&%*E;p9Ym zEaM>P*zO>gPda%qK9tSoMJ&w@3(qFk+2o&iblFU!B{vJ?|sOMc6Y=*(NH|m zZ*_Jh_C>;;=>BkMU%1zbg(A`R|AsrdLXkdCxP5=Py|XV76S@54&{!sqy{Gfm@YrPT zuu$GqomgYpB)S{PIlGiMl&86z)1v%tMEwLV(KcUu43vcrmkY@DlNK7iy_d0mCBBfXD2K=1nktY zY0|N21;?fZ9GmJpHkEg5s_xiS+_9;)V^e9zrpn0TWSyI+ -#include -#include "clock/pictimer.c" -#include "keyboard/keyus.c" -#include "kernel/prologue.c" -#include "kernel/epilogue.c" -#include "shell/shell.c" - -int main() -{ - system_init(); - - shell(); - - // do nothing - for(;;); - return 0; -} \ No newline at end of file diff --git a/kernel/main.o b/kernel/main.o deleted file mode 100644 index c776921d2843056d58c73e8eb98bf7189c0c277e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20986 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 z 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 diff --git a/kernel/shell/apps.h b/kernel/shell/apps.h deleted file mode 100644 index cf2adb5..0000000 --- a/kernel/shell/apps.h +++ /dev/null @@ -1,122 +0,0 @@ -const char *apps_lst[] = { - "", - "reboot", - "osver", - "date", - "place", - "cls", - "memory" - }; -int apps_count = 7; - -void apps_osver() -{ - puts("CTA OS v0.1"); - puts("\n(c) CTA 2010.\n"); -} - -void apps_date() -{ - puts("Today is "); - puts((char*)clock_weekdays[clock.weekday]); - puts(", "); putc((clock.day/10)+'0'); - putc((clock.day%10)+'0'); - puts(" "); puts((char*)clock_months[clock.month]); - puts(" "); putc((clock.century/10)+'0'); - putc((clock.century%10)+'0'); - putc((clock.year/10)+'0'); - putc((clock.year%10)+'0'); - putc('\n'); -} - -void apps_place() -{ - puts("On your desk, if you didn't notice... \n"); -} - -void apps_clrscr() -{ - clrscr(); -} - -void apps_memory(const int pn, const char* param[]) -{ - if (pn<3) { - puts ("Correct syntax: memory [start_address] [end_address] (in hex)\n"); - return; - } - - byte *start, *end; - byte l1 = strlen(param[1]), l2 = strlen(param[2]); - unsigned int a; - int i; byte *count; - - a = 0; - for(i = 0; i < l1; i++) { - switch (param[1][i]) { - case 'a': - case 'A': a = a*16 + 10; break; - case 'b': - case 'B': a = a*16 + 11; break; - case 'c': - case 'C': a = a*16 + 12; break; - case 'd': - case 'D': a = a*16 + 13; break; - case 'e': - case 'E': a = a*16 + 14; break; - case 'f': - case 'F': a = a*16 + 15; break; - - default: if (!(param[1][i]>='0' && param[1][i]<='9')) { - puts ((char*)param[1]); puts(" is not a valid hex address.\n"); - return; - } - a = a*16 + (param[1][i] - '0'); - break; - } - } - start = (byte *)a; - - a = 0; - for(i = 0; i < l2; i++) { - switch (param[2][i]) { - case 'a': - case 'A': a = a*16 + 10; break; - case 'b': - case 'B': a = a*16 + 11; break; - case 'c': - case 'C': a = a*16 + 12; break; - case 'd': - case 'D': a = a*16 + 13; break; - case 'e': - case 'E': a = a*16 + 14; break; - case 'f': - case 'F': a = a*16 + 15; break; - - default: if (!(param[2][i]>='0' && param[2][i]<='9')) { - puts ((char*)param[2]); puts(" is not a valid hex address.\n"); - return; - } - a = a*16 + (param[2][i] - '0'); - break; - } - } - end = (byte *)a; - - while (start <= end) { - put_hex ((unsigned int) start); puts(": "); - - for (count = start; count < start+16; count++) { - putc(hex[*count/16]); putc(hex[*count%16]); - putc(' '); - } - puts(" "); - for (count = start; count < start+16; count++) - putc(*count); - - putc('\n'); - start+=16; - } - - -} \ No newline at end of file diff --git a/scripts/format b/scripts/format new file mode 100644 index 0000000..8d03dab --- /dev/null +++ b/scripts/format @@ -0,0 +1,3 @@ + + +n diff --git a/scripts/stage1d b/scripts/stage1d new file mode 100644 index 0000000..8667502 --- /dev/null +++ b/scripts/stage1d @@ -0,0 +1,2 @@ +w 100 0 0 1 +q diff --git a/stage1/MAKE.PIF b/stage1/MAKE.PIF deleted file mode 100644 index e4ad68871e7d1b760f156ba14d1263d8da361f60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 967 zcmZRm@OAWdWxxp3wGtzw)*9Q}i1RPu|`6Z0~QQ&VDsLmb^*4P!u>^_(0-aOxi% z5{wN0B?A~3*av}Yd_A3m{Db}7LKFf#-CQFW+8G%b3K_#a{apORgB6S|%oL3E3>a9M z<}zk5fC4{-!HD7ie+DpS5@2GGr-2_}wukxpDwqIm|Nmc_X${a_v;jbW`??3|x%l`{ z%Y0xk!GRG2vco}aRt8B1W`+|CFPNDaxZtufP#x?HJPaYJMY)-Ii8*jX&=@|Y$(bpM z3eNd?#rZj@Xp&$qGms1b+GD_^!)U{l&L{@t0}~w-@aMGkS)f@0073} BJ^ugz diff --git a/stage1/make.bat b/stage1/make.bat deleted file mode 100644 index 05cd83b..0000000 --- a/stage1/make.bat +++ /dev/null @@ -1,18 +0,0 @@ -@echo off -set nasm_path=C:\nasm -set djgpp_path=C:\DJGPP\bin -set drive=0 - -@echo on -%nasm_path%\nasm.exe -f bin bootload.asm -o bootload.bin - -@echo. -@echo Press any key to copy to (fd%drive%), or CTRL+C to stop. -@pause >nul - -@echo off -@echo w 100 %drive% 0 1 >f.tmp -@echo q>>f.tmp - -debug bootload.bin nul - -@echo off -copy stage2.cta A:\stage2.cta \ No newline at end of file diff --git a/stage2/a20.inc b/stage2/a20.inc deleted file mode 100644 index f50e445..0000000 --- a/stage2/a20.inc +++ /dev/null @@ -1,103 +0,0 @@ - -;******************************************** -; Enable A20 address line -; -; OS Development Series -;******************************************** - -%ifndef __A20_INC_67343546FDCC56AAB872_INCLUDED__ -%define __A20_INC_67343546FDCC56AAB872_INCLUDED__ - -bits 16 - -;---------------------------------------------- -; Enables a20 line through keyboard controller -;---------------------------------------------- - -EnableA20_KKbrd: - - cli - push ax - mov al, 0xdd ; send enable a20 address line command to controller - out 0x64, al - pop ax - ret - -;-------------------------------------------- -; Enables a20 line through output port -;-------------------------------------------- - -EnableA20_KKbrd_Out: - - cli - pusha - - call wait_input - mov al,0xAD - out 0x64,al ; disable keyboard - call wait_input - - mov al,0xD0 - out 0x64,al ; tell controller to read output port - call wait_output - - in al,0x60 - push eax ; get output port data and store it - call wait_input - - mov al,0xD1 - out 0x64,al ; tell controller to write output port - call wait_input - - pop eax - or al,2 ; set bit 1 (enable a20) - out 0x60,al ; write out data back to the output port - - call wait_input - mov al,0xAE ; enable keyboard - out 0x64,al - - call wait_input - popa - sti - ret - - ; wait for input buffer to be clear - -wait_input: - in al,0x64 - test al,2 - jnz wait_input - ret - - ; wait for output buffer to be clear - -wait_output: - in al,0x64 - test al,1 - jz wait_output - ret - -;-------------------------------------- -; Enables a20 line through bios -;-------------------------------------- - -EnableA20_Bios: - pusha - mov ax, 0x2401 - int 0x15 - popa - ret - -;------------------------------------------------- -; Enables a20 line through system control port A -;------------------------------------------------- - -EnableA20_SysControlA: - push ax - mov al, 2 - out 0x92, al - pop ax - ret - -%endif diff --git a/stage2/stage2.asm b/stage2/stage2.asm deleted file mode 100644 index 1ead0de..0000000 --- a/stage2/stage2.asm +++ /dev/null @@ -1,158 +0,0 @@ - -;******************************************************* -; -; Stage2.asm -; Stage2 Bootloader -; -; OS Development Series -;******************************************************* - -bits 16 - -; Remember the memory map-- 0x500 through 0x7bff is unused above the BIOS data area. -; We are loaded at 0x500 (0x50:0) - -org 0x500 - -jmp main ; go to start - -;******************************************************* -; Preprocessor directives -;******************************************************* - -%include "stdio.inc" ; basic i/o routines -%include "Gdt.inc" ; Gdt routines -%include "A20.inc" ; A20 enabling -%include "Fat12.inc" ; FAT12 driver. Kinda :) -%include "common.inc" - -;******************************************************* -; Data Section -;******************************************************* - -msgFailure db 0x0A, 0x0D, "FATAL ERROR: MISSING OR CORRUPT KERNEL.CTA", 0x0A, 0x0D, "Press any key to reboot...", 0x0D, 0x0A, 0x00 - -;******************************************************* -; STAGE 2 ENTRY POINT -; -; -Store BIOS information -; -Load Kernel -; -Install GDT; go into protected mode (pmode) -; -Jump to Stage 3 -;******************************************************* - -main: - - ;-------------------------------; - ; Setup segments and stack ; - ;-------------------------------; - - cli ; clear interrupts - xor ax, ax ; null segments - mov ds, ax - mov es, ax - mov ax, 0x0 ; stack begins at 0x9000-0xffff - mov ss, ax - mov sp, 0xFFFF - sti ; enable interrupts - - ;-------------------------------; - ; Install our GDT ; - ;-------------------------------; - - call InstallGDT ; install our GDT - - ;-------------------------------; - ; Enable A20 ; - ;-------------------------------; - - call EnableA20_KKbrd_Out - - ;-------------------------------; - ; Initialize filesystem ; - ;-------------------------------; - - call LoadRoot ; Load root directory table - - ;-------------------------------; - ; Load Kernel ; - ;-------------------------------; - - mov ebx, 0 ; BX:BP points to buffer to load to - mov bp, IMAGE_RMODE_BASE - mov si, ImageName ; our file to load - call LoadFile ; load our file - mov dword [ImageSize], ecx ; save size of kernel - cmp ax, 0 ; Test for success - je EnterStage3 ; yep--onto Stage 3! - mov si, msgFailure ; Nope--print error - call Puts16 - mov ah, 0 - int 0x16 ; await keypress - int 0x19 ; warm boot computer - cli ; If we get here, something really went wong - hlt - - ;-------------------------------; - ; Go into pmode ; - ;-------------------------------; - -EnterStage3: - - cli ; clear interrupts - mov eax, cr0 ; set bit 0 in cr0--enter pmode - or eax, 1 - mov cr0, eax - - jmp CODE_DESC:Stage3 ; far jump to fix CS. Remember that the code selector is 0x8! - - ; Note: Do NOT re-enable interrupts! Doing so will triple fault! - ; We will fix this in Stage 3. - -;****************************************************** -; ENTRY POINT FOR STAGE 3 -;****************************************************** - -bits 32 - -Stage3: - - ;-------------------------------; - ; Set registers ; - ;-------------------------------; - - mov ax, DATA_DESC ; set data segments to data selector (0x10) - mov ds, ax - mov ss, ax - mov es, ax - mov esp, 90000h ; stack begins from 90000h - - ;-------------------------------; - ; Copy kernel to 1MB ; - ;-------------------------------; - -CopyImage: - mov eax, dword [ImageSize] - movzx ebx, word [bpbBytesPerSector] - mul ebx - mov ebx, 4 - div ebx - cld - mov esi, IMAGE_RMODE_BASE - mov edi, IMAGE_PMODE_BASE - mov ecx, eax - rep movsd ; copy image to its protected mode address - - ;---------------------------------------; - ; Execute Kernel ; - ;---------------------------------------; - - jmp CODE_DESC:IMAGE_PMODE_BASE; jump to our kernel! Note: This assumes Kernel's entry point is at 1 MB - - ;---------------------------------------; - ; Stop execution ; - ;---------------------------------------; - - cli - hlt - diff --git a/stage2/stage2.cta b/stage2/stage2.cta deleted file mode 100644 index 128a53cdc48346578c488083939ff6dcb7ea94ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1012 zcmXw2Z%7+w7=P|k-#cTIh_bjjy1k4|)(_2k`{0Lxv{Gy-)8NK()YX?=ko4Sdu7jxY5>wI%(Q`^E@uHC+t~tOY>C+pia)XcZiSiOgd%f$ zrsj-yq<;VT7?Hc`EjC$kQTeS#2=x}bEUHPtv*|ZyY7lSJuUM9KsCogDOwVi=$79}(WSOPY3s1)-RBPa$K= zfpSO_?i;;dp!&^}_bRgEuTaXnh~}4&w%P(>a9DqAw}r9@tvi=p!>%L$M4FKuo(5R|L4?u%#@eEY-8Z6N>gQT58%xI3J@ zjbZz*$j9M=WoaRb8WD|H<+E{OD` zHMfAch+eKYuSMr95+?n$5h|!`Mim}WUS5-LZtO4{bYx%VGpTZozf