From bff40544d271c9d45570565d1d0aa1a3714fab2d Mon Sep 17 00:00:00 2001 From: ShiningLea Date: Mon, 14 Oct 2024 08:21:33 +0200 Subject: [PATCH] Demos: Merge HelloWorld into CoolWorld (#1239) * Demos: Merge HelloWorld into CoolWorld Signed-off-by: AnErrupTion * Remove HelloWorld in Mosa.sln Signed-off-by: AnErrupTion * Resolve conflicts Signed-off-by: AnErrupTion * Rename VirtualBox & VMware Workstation demo scripts Signed-off-by: AnErrupTion * Fix demo tests not working for console CoolWorld Signed-off-by: AnErrupTion * Fix mistake Signed-off-by: AnErrupTion * Forgot to update documentation Signed-off-by: AnErrupTion * Fix bug in BootOptions + scripts Signed-off-by: AnErrupTion --------- Signed-off-by: AnErrupTion --- .github/workflows/builds.yml | 104 ++++++++--------- .../Run-BareMetal.Console.CoolWorld.x86.bat | 3 + .../Run-BareMetal.Console.CoolWorld.x86.sh | 3 + ...Run-BareMetal.Graphical.CoolWorld.x86.bat} | 0 ... Run-BareMetal.Graphical.CoolWorld.x86.sh} | 0 .../Console/Run-BareMetal.HelloWorld.x86.bat | 3 - Demos/Console/Run-BareMetal.HelloWorld.x86.sh | 3 - ...are-BareMetal.Graphical.CoolWorld.x86.bat} | 0 ...ware-BareMetal.Graphical.CoolWorld.x86.sh} | 0 ...Box-BareMetal.Graphical.CoolWorld.x86.bat} | 0 ...lBox-BareMetal.Graphical.CoolWorld.x86.sh} | 0 ...> Run-BareMetal.Console.CoolWorld.x86.bat} | 2 +- ...=> Run-BareMetal.Console.CoolWorld.x86.sh} | 2 +- ...Run-BareMetal.Graphical.CoolWorld.x86.bat} | 0 ... Run-BareMetal.Graphical.CoolWorld.x86.sh} | 0 ...are-BareMetal.Graphical.CoolWorld.x86.bat} | 0 ...ware-BareMetal.Graphical.CoolWorld.x86.sh} | 0 ...Box-BareMetal.Graphical.CoolWorld.x86.bat} | 0 ...lBox-BareMetal.Graphical.CoolWorld.x86.sh} | 0 Source/Docs/demos.rst | 14 +-- .../images/mosa-demo-coolworld-console.png | Bin 0 -> 29284 bytes .../images/mosa-demo-coolworld-graphical.png | Bin 0 -> 22352 bytes Source/Docs/images/mosa-demo-coolworld.png | 0 Source/Docs/images/mosa-demo-helloworld.png | Bin 22018 -> 0 bytes Source/Docs/images/mosa-demo-starter.png | Bin 0 -> 14631 bytes Source/Docs/images/mosa-demo-testworld.png | Bin 0 -> 20404 bytes Source/Mosa.BareMetal.CoolWorld/Boot.cs | 15 --- .../Console}/AppManager.cs | 4 +- .../Console/Apps/BootInfo.cs | 50 ++++++++ .../Console}/Apps/Clear.cs | 6 +- .../Console/Apps/Credits.cs | 28 +++++ .../Console}/Apps/Help.cs | 6 +- .../Console/Apps/Mem.cs | 21 ++++ .../Console}/Apps/Reboot.cs | 7 +- .../Console}/Apps/Shell.cs | 16 ++- .../Console/Apps/ShowDisks.cs | 43 +++++++ .../Console/Apps/ShowFS.cs | 63 ++++++++++ .../Console/Apps/ShowISA.cs | 30 +++++ .../Console/Apps/ShowPCI.cs | 34 ++++++ .../Console}/Apps/Shutdown.cs | 5 +- .../Console}/Apps/Time.cs | 7 +- .../Console/ConsoleMode.cs | 61 ++++++++++ .../Console}/IApp.cs | 2 +- .../{ => Graphical}/Apps/Paint.cs | 4 +- .../{ => Graphical}/Apps/Settings.cs | 4 +- .../{ => Graphical}/Components/Button.cs | 2 +- .../{ => Graphical}/Components/Label.cs | 2 +- .../{ => Graphical}/Components/PaintArea.cs | 2 +- .../{ => Graphical}/Components/Taskbar.cs | 6 +- .../Components/TaskbarWindowMenu.cs | 2 +- .../{ => Graphical}/Components/Window.cs | 4 +- .../Graphical/Desktop.cs | 108 +++++++++++++++++ .../{ => Graphical}/Display.cs | 4 +- .../{ => Graphical}/FPSMeter.cs | 2 +- .../{ => Graphical}/MosaLogo.cs | 2 +- .../{ => Graphical}/Mouse.cs | 2 +- .../{ => Graphical}/Utils.cs | 2 +- .../{ => Graphical}/WindowManager.cs | 20 ++-- Source/Mosa.BareMetal.CoolWorld/Program.cs | 109 +++--------------- .../Mosa.BareMetal.HelloWorld.ARM32/Boot.cs | 21 ---- .../Mosa.BareMetal.HelloWorld.ARM32.csproj | 15 --- .../Mosa.BareMetal.HelloWorld.ARM64/Boot.cs | 16 --- .../Mosa.BareMetal.HelloWorld.ARM64.csproj | 14 --- Source/Mosa.BareMetal.HelloWorld.x64/Boot.cs | 16 --- .../Mosa.BareMetal.HelloWorld.x64.csproj | 14 --- Source/Mosa.BareMetal.HelloWorld.x86/Boot.cs | 21 ---- .../Mosa.BareMetal.HelloWorld.x86.csproj | 14 --- .../Apps/BootInfo.cs | 51 -------- .../Mosa.BareMetal.HelloWorld/Apps/Credits.cs | 30 ----- Source/Mosa.BareMetal.HelloWorld/Apps/Mem.cs | 22 ---- .../Apps/ShowDisks.cs | 43 ------- .../Mosa.BareMetal.HelloWorld/Apps/ShowFS.cs | 63 ---------- .../Mosa.BareMetal.HelloWorld/Apps/ShowISA.cs | 31 ----- .../Mosa.BareMetal.HelloWorld/Apps/ShowPCI.cs | 34 ------ .../Mosa.BareMetal.HelloWorld.csproj | 9 -- Source/Mosa.BareMetal.HelloWorld/Program.cs | 68 ----------- Source/Mosa.Kernel.BareMetal/BootOptions.cs | 5 +- Source/Mosa.Linux.sln | 105 ----------------- Source/Mosa.sln | 105 ----------------- 79 files changed, 574 insertions(+), 930 deletions(-) create mode 100755 Demos/Console/Run-BareMetal.Console.CoolWorld.x86.bat create mode 100755 Demos/Console/Run-BareMetal.Console.CoolWorld.x86.sh rename Demos/Console/{Run-BareMetal.CoolWorld.x86.bat => Run-BareMetal.Graphical.CoolWorld.x86.bat} (100%) rename Demos/Console/{Run-BareMetal.CoolWorld.x86.sh => Run-BareMetal.Graphical.CoolWorld.x86.sh} (100%) delete mode 100644 Demos/Console/Run-BareMetal.HelloWorld.x86.bat delete mode 100755 Demos/Console/Run-BareMetal.HelloWorld.x86.sh rename Demos/Console/{Run-VMware-BareMetal.CoolWorld.x86.bat => Run-VMware-BareMetal.Graphical.CoolWorld.x86.bat} (100%) rename Demos/Console/{Run-VMware-BareMetal.CoolWorld.x86.sh => Run-VMware-BareMetal.Graphical.CoolWorld.x86.sh} (100%) rename Demos/Console/{Run-VirtualBox-BareMetal.CoolWorld.x86.bat => Run-VirtualBox-BareMetal.Graphical.CoolWorld.x86.bat} (100%) rename Demos/Console/{Run-VirtualBox-BareMetal.CoolWorld.x86.sh => Run-VirtualBox-BareMetal.Graphical.CoolWorld.x86.sh} (100%) rename Demos/{Run-BareMetal.HelloWorld.x86.bat => Run-BareMetal.Console.CoolWorld.x86.bat} (50%) mode change 100644 => 100755 rename Demos/{Run-BareMetal.HelloWorld.x86.sh => Run-BareMetal.Console.CoolWorld.x86.sh} (50%) rename Demos/{Run-BareMetal.CoolWorld.x86.bat => Run-BareMetal.Graphical.CoolWorld.x86.bat} (100%) rename Demos/{Run-BareMetal.CoolWorld.x86.sh => Run-BareMetal.Graphical.CoolWorld.x86.sh} (100%) rename Demos/{Run-VMware-BareMetal.CoolWorld.x86.bat => Run-VMware-BareMetal.Graphical.CoolWorld.x86.bat} (100%) rename Demos/{Run-VMware-BareMetal.CoolWorld.x86.sh => Run-VMware-BareMetal.Graphical.CoolWorld.x86.sh} (100%) rename Demos/{Run-VirtualBox-BareMetal.CoolWorld.x86.bat => Run-VirtualBox-BareMetal.Graphical.CoolWorld.x86.bat} (100%) rename Demos/{Run-VirtualBox-BareMetal.CoolWorld.x86.sh => Run-VirtualBox-BareMetal.Graphical.CoolWorld.x86.sh} (100%) create mode 100644 Source/Docs/images/mosa-demo-coolworld-console.png create mode 100644 Source/Docs/images/mosa-demo-coolworld-graphical.png delete mode 100644 Source/Docs/images/mosa-demo-coolworld.png delete mode 100644 Source/Docs/images/mosa-demo-helloworld.png delete mode 100644 Source/Mosa.BareMetal.CoolWorld/Boot.cs rename Source/{Mosa.BareMetal.HelloWorld => Mosa.BareMetal.CoolWorld/Console}/AppManager.cs (86%) create mode 100644 Source/Mosa.BareMetal.CoolWorld/Console/Apps/BootInfo.cs rename Source/{Mosa.BareMetal.HelloWorld => Mosa.BareMetal.CoolWorld/Console}/Apps/Clear.cs (73%) create mode 100644 Source/Mosa.BareMetal.CoolWorld/Console/Apps/Credits.cs rename Source/{Mosa.BareMetal.HelloWorld => Mosa.BareMetal.CoolWorld/Console}/Apps/Help.cs (70%) create mode 100644 Source/Mosa.BareMetal.CoolWorld/Console/Apps/Mem.cs rename Source/{Mosa.BareMetal.HelloWorld => Mosa.BareMetal.CoolWorld/Console}/Apps/Reboot.cs (72%) rename Source/{Mosa.BareMetal.HelloWorld => Mosa.BareMetal.CoolWorld/Console}/Apps/Shell.cs (50%) create mode 100644 Source/Mosa.BareMetal.CoolWorld/Console/Apps/ShowDisks.cs create mode 100644 Source/Mosa.BareMetal.CoolWorld/Console/Apps/ShowFS.cs create mode 100644 Source/Mosa.BareMetal.CoolWorld/Console/Apps/ShowISA.cs create mode 100644 Source/Mosa.BareMetal.CoolWorld/Console/Apps/ShowPCI.cs rename Source/{Mosa.BareMetal.HelloWorld => Mosa.BareMetal.CoolWorld/Console}/Apps/Shutdown.cs (81%) rename Source/{Mosa.BareMetal.HelloWorld => Mosa.BareMetal.CoolWorld/Console}/Apps/Time.cs (83%) create mode 100644 Source/Mosa.BareMetal.CoolWorld/Console/ConsoleMode.cs rename Source/{Mosa.BareMetal.HelloWorld => Mosa.BareMetal.CoolWorld/Console}/IApp.cs (78%) rename Source/Mosa.BareMetal.CoolWorld/{ => Graphical}/Apps/Paint.cs (87%) rename Source/Mosa.BareMetal.CoolWorld/{ => Graphical}/Apps/Settings.cs (97%) rename Source/Mosa.BareMetal.CoolWorld/{ => Graphical}/Components/Button.cs (97%) rename Source/Mosa.BareMetal.CoolWorld/{ => Graphical}/Components/Label.cs (90%) rename Source/Mosa.BareMetal.CoolWorld/{ => Graphical}/Components/PaintArea.cs (95%) rename Source/Mosa.BareMetal.CoolWorld/{ => Graphical}/Components/Taskbar.cs (95%) rename Source/Mosa.BareMetal.CoolWorld/{ => Graphical}/Components/TaskbarWindowMenu.cs (96%) rename Source/Mosa.BareMetal.CoolWorld/{ => Graphical}/Components/Window.cs (96%) create mode 100644 Source/Mosa.BareMetal.CoolWorld/Graphical/Desktop.cs rename Source/Mosa.BareMetal.CoolWorld/{ => Graphical}/Display.cs (95%) rename Source/Mosa.BareMetal.CoolWorld/{ => Graphical}/FPSMeter.cs (91%) rename Source/Mosa.BareMetal.CoolWorld/{ => Graphical}/MosaLogo.cs (95%) rename Source/Mosa.BareMetal.CoolWorld/{ => Graphical}/Mouse.cs (99%) rename Source/Mosa.BareMetal.CoolWorld/{ => Graphical}/Utils.cs (96%) rename Source/Mosa.BareMetal.CoolWorld/{ => Graphical}/WindowManager.cs (76%) delete mode 100644 Source/Mosa.BareMetal.HelloWorld.ARM32/Boot.cs delete mode 100644 Source/Mosa.BareMetal.HelloWorld.ARM32/Mosa.BareMetal.HelloWorld.ARM32.csproj delete mode 100644 Source/Mosa.BareMetal.HelloWorld.ARM64/Boot.cs delete mode 100644 Source/Mosa.BareMetal.HelloWorld.ARM64/Mosa.BareMetal.HelloWorld.ARM64.csproj delete mode 100644 Source/Mosa.BareMetal.HelloWorld.x64/Boot.cs delete mode 100644 Source/Mosa.BareMetal.HelloWorld.x64/Mosa.BareMetal.HelloWorld.x64.csproj delete mode 100644 Source/Mosa.BareMetal.HelloWorld.x86/Boot.cs delete mode 100644 Source/Mosa.BareMetal.HelloWorld.x86/Mosa.BareMetal.HelloWorld.x86.csproj delete mode 100644 Source/Mosa.BareMetal.HelloWorld/Apps/BootInfo.cs delete mode 100644 Source/Mosa.BareMetal.HelloWorld/Apps/Credits.cs delete mode 100644 Source/Mosa.BareMetal.HelloWorld/Apps/Mem.cs delete mode 100644 Source/Mosa.BareMetal.HelloWorld/Apps/ShowDisks.cs delete mode 100644 Source/Mosa.BareMetal.HelloWorld/Apps/ShowFS.cs delete mode 100644 Source/Mosa.BareMetal.HelloWorld/Apps/ShowISA.cs delete mode 100644 Source/Mosa.BareMetal.HelloWorld/Apps/ShowPCI.cs delete mode 100644 Source/Mosa.BareMetal.HelloWorld/Mosa.BareMetal.HelloWorld.csproj delete mode 100644 Source/Mosa.BareMetal.HelloWorld/Program.cs diff --git a/.github/workflows/builds.yml b/.github/workflows/builds.yml index 2d5e929e7d..d1475f6595 100644 --- a/.github/workflows/builds.yml +++ b/.github/workflows/builds.yml @@ -299,10 +299,10 @@ jobs: run: bin\Mosa.Tool.Launcher.Console.exe bin\Mosa.BareMetal.Starter.x86.dll -o${{ matrix.optimization }} -check -test -output-counters - name: Demo Test - BareMetal TestWorld run: bin\Mosa.Tool.Launcher.Console.exe bin\Mosa.BareMetal.TestWorld.x86.dll -o${{ matrix.optimization }} -check -test -output-counters - - name: Demo Test - BareMetal HelloWorld - run: bin\Mosa.Tool.Launcher.Console.exe bin\Mosa.BareMetal.HelloWorld.x86.dll -o${{ matrix.optimization }} -check -test -output-counters - - name: Demo Test - BareMetal CoolWorld - run: bin\Mosa.Tool.Launcher.Console.exe bin\Mosa.BareMetal.CoolWorld.x86.dll -o${{ matrix.optimization }} -check -test -vmware-svga -include bin\Include + - name: Demo Test - BareMetal Console CoolWorld + run: bin\Mosa.Tool.Launcher.Console.exe bin\Mosa.BareMetal.CoolWorld.x86.dll -o${{ matrix.optimization }} -check -test -output-counters -bootoptions coolworldui=consolemode,bootoptions=serialdebug + - name: Demo Test - BareMetal Graphical CoolWorld + run: bin\Mosa.Tool.Launcher.Console.exe bin\Mosa.BareMetal.CoolWorld.x86.dll -o${{ matrix.optimization }} -check -test -output-counters -vmware-svga -include bin\Include linux-demo-testing: strategy: @@ -335,10 +335,10 @@ jobs: run: dotnet bin/Mosa.Tool.Launcher.Console.dll bin/Mosa.BareMetal.Starter.x86.dll -o${{ matrix.optimization }} -check -test -output-counters - name: Demo Test - BareMetal TestWorld run: dotnet bin/Mosa.Tool.Launcher.Console.dll bin/Mosa.BareMetal.TestWorld.x86.dll -o${{ matrix.optimization }} -check -test -output-counters - - name: Demo Test - BareMetal HelloWorld - run: dotnet bin/Mosa.Tool.Launcher.Console.dll bin/Mosa.BareMetal.HelloWorld.x86.dll -o${{ matrix.optimization }} -check -test -output-counters - - name: Demo Test - BareMetal CoolWorld - run: dotnet bin/Mosa.Tool.Launcher.Console.dll bin/Mosa.BareMetal.CoolWorld.x86.dll -o${{ matrix.optimization }} -check -test -vmware-svga -include bin/Include + - name: Demo Test - BareMetal Console CoolWorld + run: dotnet bin/Mosa.Tool.Launcher.Console.dll bin/Mosa.BareMetal.CoolWorld.x86.dll -o${{ matrix.optimization }} -check -test -output-counters -bootoptions coolworldui=consolemode,bootoptions=serialdebug + - name: Demo Test - BareMetal Graphical CoolWorld + run: dotnet bin/Mosa.Tool.Launcher.Console.dll bin/Mosa.BareMetal.CoolWorld.x86.dll -o${{ matrix.optimization }} -check -test -output-counters -vmware-svga -include bin/Include macos-demo-testing: strategy: @@ -369,10 +369,10 @@ jobs: run: dotnet bin/Mosa.Tool.Launcher.Console.dll bin/Mosa.BareMetal.Starter.x86.dll -o${{ matrix.optimization }} -check -test -output-counters - name: Demo Test - BareMetal TestWorld run: dotnet bin/Mosa.Tool.Launcher.Console.dll bin/Mosa.BareMetal.TestWorld.x86.dll -o${{ matrix.optimization }} -check -test -output-counters - - name: Demo Test - BareMetal HelloWorld - run: dotnet bin/Mosa.Tool.Launcher.Console.dll bin/Mosa.BareMetal.HelloWorld.x86.dll -o${{ matrix.optimization }} -check -test -output-counters - - name: Demo Test - BareMetal CoolWorld - run: dotnet bin/Mosa.Tool.Launcher.Console.dll bin/Mosa.BareMetal.CoolWorld.x86.dll -o${{ matrix.optimization }} -check -test -vmware-svga -include bin/Include + - name: Demo Test - BareMetal Console CoolWorld + run: dotnet bin/Mosa.Tool.Launcher.Console.dll bin/Mosa.BareMetal.CoolWorld.x86.dll -o${{ matrix.optimization }} -check -test -output-counters -bootoptions coolworldui=consolemode,bootoptions=serialdebug + - name: Demo Test - BareMetal Graphical CoolWorld + run: dotnet bin/Mosa.Tool.Launcher.Console.dll bin/Mosa.BareMetal.CoolWorld.x86.dll -o${{ matrix.optimization }} -check -test -output-counters -vmware-svga -include bin/Include linux-x64-compile-test: name: Linux - X64 Compile Tests @@ -393,26 +393,26 @@ jobs: with: name: linux-build-artifact path: bin - - name: x64 Compile Test - BareMetal HelloWorld - o0 - run: dotnet bin/Mosa.Tool.Launcher.Console.dll bin/Mosa.BareMetal.HelloWorld.x64.dll -x64 -o0 -check -autolaunch-off -output-counters - - name: x64 Compile Test - BareMetal HelloWorld - o1 - run: dotnet bin/Mosa.Tool.Launcher.Console.dll bin/Mosa.BareMetal.HelloWorld.x64.dll -x64 -o1 -check -autolaunch-off -output-counters - - name: x64 Compile Test - BareMetal HelloWorld - o2 - run: dotnet bin/Mosa.Tool.Launcher.Console.dll bin/Mosa.BareMetal.HelloWorld.x64.dll -x64 -o2 -check -autolaunch-off -output-counters - - name: x64 Compile Test - BareMetal HelloWorld - o3 - run: dotnet bin/Mosa.Tool.Launcher.Console.dll bin/Mosa.BareMetal.HelloWorld.x64.dll -x64 -o3 -check -autolaunch-off -output-counters - - name: x64 Compile Test - BareMetal HelloWorld - o4 - run: dotnet bin/Mosa.Tool.Launcher.Console.dll bin/Mosa.BareMetal.HelloWorld.x64.dll -x64 -o4 -check -autolaunch-off -output-counters - - name: x64 Compile Test - BareMetal HelloWorld - o5 - run: dotnet bin/Mosa.Tool.Launcher.Console.dll bin/Mosa.BareMetal.HelloWorld.x64.dll -x64 -o5 -check -autolaunch-off -output-counters - - name: x64 Compile Test - BareMetal HelloWorld - o6 - run: dotnet bin/Mosa.Tool.Launcher.Console.dll bin/Mosa.BareMetal.HelloWorld.x64.dll -x64 -o6 -check -autolaunch-off -output-counters - - name: x64 Compile Test - BareMetal HelloWorld - o7 - run: dotnet bin/Mosa.Tool.Launcher.Console.dll bin/Mosa.BareMetal.HelloWorld.x64.dll -x64 -o7 -check -autolaunch-off -output-counters - - name: x64 Compile Test - BareMetal HelloWorld - o8 - run: dotnet bin/Mosa.Tool.Launcher.Console.dll bin/Mosa.BareMetal.HelloWorld.x64.dll -x64 -o8 -check -autolaunch-off -output-counters - - name: x64 Compile Test - BareMetal HelloWorld - o9 - run: dotnet bin/Mosa.Tool.Launcher.Console.dll bin/Mosa.BareMetal.HelloWorld.x64.dll -x64 -o9 -check -autolaunch-off -output-counters + - name: x64 Compile Test - BareMetal TestWorld - o0 + run: dotnet bin/Mosa.Tool.Launcher.Console.dll bin/Mosa.BareMetal.TestWorld.x64.dll -x64 -o0 -check -autolaunch-off -output-counters + - name: x64 Compile Test - BareMetal TestWorld - o1 + run: dotnet bin/Mosa.Tool.Launcher.Console.dll bin/Mosa.BareMetal.TestWorld.x64.dll -x64 -o1 -check -autolaunch-off -output-counters + - name: x64 Compile Test - BareMetal TestWorld - o2 + run: dotnet bin/Mosa.Tool.Launcher.Console.dll bin/Mosa.BareMetal.TestWorld.x64.dll -x64 -o2 -check -autolaunch-off -output-counters + - name: x64 Compile Test - BareMetal TestWorld - o3 + run: dotnet bin/Mosa.Tool.Launcher.Console.dll bin/Mosa.BareMetal.TestWorld.x64.dll -x64 -o3 -check -autolaunch-off -output-counters + - name: x64 Compile Test - BareMetal TestWorld - o4 + run: dotnet bin/Mosa.Tool.Launcher.Console.dll bin/Mosa.BareMetal.TestWorld.x64.dll -x64 -o4 -check -autolaunch-off -output-counters + - name: x64 Compile Test - BareMetal TestWorld - o5 + run: dotnet bin/Mosa.Tool.Launcher.Console.dll bin/Mosa.BareMetal.TestWorld.x64.dll -x64 -o5 -check -autolaunch-off -output-counters + - name: x64 Compile Test - BareMetal TestWorld - o6 + run: dotnet bin/Mosa.Tool.Launcher.Console.dll bin/Mosa.BareMetal.TestWorld.x64.dll -x64 -o6 -check -autolaunch-off -output-counters + - name: x64 Compile Test - BareMetal TestWorld - o7 + run: dotnet bin/Mosa.Tool.Launcher.Console.dll bin/Mosa.BareMetal.TestWorld.x64.dll -x64 -o7 -check -autolaunch-off -output-counters + - name: x64 Compile Test - BareMetal TestWorld - o8 + run: dotnet bin/Mosa.Tool.Launcher.Console.dll bin/Mosa.BareMetal.TestWorld.x64.dll -x64 -o8 -check -autolaunch-off -output-counters + - name: x64 Compile Test - BareMetal TestWorld - o9 + run: dotnet bin/Mosa.Tool.Launcher.Console.dll bin/Mosa.BareMetal.TestWorld.x64.dll -x64 -o9 -check -autolaunch-off -output-counters linux-arm32-compile-test: name: Linux - ARM32 Compile Tests @@ -433,26 +433,26 @@ jobs: with: name: linux-build-artifact path: bin - - name: ARM32 Compile Test - BareMetal HelloWorld - o0 - run: dotnet bin/Mosa.Tool.Launcher.Console.dll bin/Mosa.BareMetal.HelloWorld.ARM32.dll -arm32 -o0 -check -autolaunch-off -output-counters - - name: ARM32 Compile Test - BareMetal HelloWorld - o1 - run: dotnet bin/Mosa.Tool.Launcher.Console.dll bin/Mosa.BareMetal.HelloWorld.ARM32.dll -arm32 -o1 -check -autolaunch-off -output-counters - - name: ARM32 Compile Test - BareMetal HelloWorld - o2 - run: dotnet bin/Mosa.Tool.Launcher.Console.dll bin/Mosa.BareMetal.HelloWorld.ARM32.dll -arm32 -o2 -check -autolaunch-off -output-counters - - name: ARM32 Compile Test - BareMetal HelloWorld - o3 - run: dotnet bin/Mosa.Tool.Launcher.Console.dll bin/Mosa.BareMetal.HelloWorld.ARM32.dll -arm32 -o3 -check -autolaunch-off -output-counters - - name: ARM32 Compile Test - BareMetal HelloWorld - o4 - run: dotnet bin/Mosa.Tool.Launcher.Console.dll bin/Mosa.BareMetal.HelloWorld.ARM32.dll -arm32 -o4 -check -autolaunch-off -output-counters - - name: ARM32 Compile Test - BareMetal HelloWorld - o5 - run: dotnet bin/Mosa.Tool.Launcher.Console.dll bin/Mosa.BareMetal.HelloWorld.ARM32.dll -arm32 -o5 -check -autolaunch-off -output-counters - - name: ARM32 Compile Test - BareMetal HelloWorld - o6 - run: dotnet bin/Mosa.Tool.Launcher.Console.dll bin/Mosa.BareMetal.HelloWorld.ARM32.dll -arm32 -o6 -check -autolaunch-off -output-counters - - name: ARM32 Compile Test - BareMetal HelloWorld - o7 - run: dotnet bin/Mosa.Tool.Launcher.Console.dll bin/Mosa.BareMetal.HelloWorld.ARM32.dll -arm32 -o7 -check -autolaunch-off -output-counters - - name: ARM32 Compile Test - BareMetal HelloWorld - o8 - run: dotnet bin/Mosa.Tool.Launcher.Console.dll bin/Mosa.BareMetal.HelloWorld.ARM32.dll -arm32 -o8 -check -autolaunch-off -output-counters - - name: ARM32 Compile Test - BareMetal HelloWorld - o9 - run: dotnet bin/Mosa.Tool.Launcher.Console.dll bin/Mosa.BareMetal.HelloWorld.ARM32.dll -arm32 -o9 -check -autolaunch-off -output-counters + - name: ARM32 Compile Test - BareMetal TestWorld - o0 + run: dotnet bin/Mosa.Tool.Launcher.Console.dll bin/Mosa.BareMetal.TestWorld.ARM32.dll -arm32 -o0 -check -autolaunch-off -output-counters + - name: ARM32 Compile Test - BareMetal TestWorld - o1 + run: dotnet bin/Mosa.Tool.Launcher.Console.dll bin/Mosa.BareMetal.TestWorld.ARM32.dll -arm32 -o1 -check -autolaunch-off -output-counters + - name: ARM32 Compile Test - BareMetal TestWorld - o2 + run: dotnet bin/Mosa.Tool.Launcher.Console.dll bin/Mosa.BareMetal.TestWorld.ARM32.dll -arm32 -o2 -check -autolaunch-off -output-counters + - name: ARM32 Compile Test - BareMetal TestWorld - o3 + run: dotnet bin/Mosa.Tool.Launcher.Console.dll bin/Mosa.BareMetal.TestWorld.ARM32.dll -arm32 -o3 -check -autolaunch-off -output-counters + - name: ARM32 Compile Test - BareMetal TestWorld - o4 + run: dotnet bin/Mosa.Tool.Launcher.Console.dll bin/Mosa.BareMetal.TestWorld.ARM32.dll -arm32 -o4 -check -autolaunch-off -output-counters + - name: ARM32 Compile Test - BareMetal TestWorld - o5 + run: dotnet bin/Mosa.Tool.Launcher.Console.dll bin/Mosa.BareMetal.TestWorld.ARM32.dll -arm32 -o5 -check -autolaunch-off -output-counters + - name: ARM32 Compile Test - BareMetal TestWorld - o6 + run: dotnet bin/Mosa.Tool.Launcher.Console.dll bin/Mosa.BareMetal.TestWorld.ARM32.dll -arm32 -o6 -check -autolaunch-off -output-counters + - name: ARM32 Compile Test - BareMetal TestWorld - o7 + run: dotnet bin/Mosa.Tool.Launcher.Console.dll bin/Mosa.BareMetal.TestWorld.ARM32.dll -arm32 -o7 -check -autolaunch-off -output-counters + - name: ARM32 Compile Test - BareMetal TestWorld - o8 + run: dotnet bin/Mosa.Tool.Launcher.Console.dll bin/Mosa.BareMetal.TestWorld.ARM32.dll -arm32 -o8 -check -autolaunch-off -output-counters + - name: ARM32 Compile Test - BareMetal TestWorld - o9 + run: dotnet bin/Mosa.Tool.Launcher.Console.dll bin/Mosa.BareMetal.TestWorld.ARM32.dll -arm32 -o9 -check -autolaunch-off -output-counters merge-artifacts: name: Merge Artifacts diff --git a/Demos/Console/Run-BareMetal.Console.CoolWorld.x86.bat b/Demos/Console/Run-BareMetal.Console.CoolWorld.x86.bat new file mode 100755 index 0000000000..80878929f1 --- /dev/null +++ b/Demos/Console/Run-BareMetal.Console.CoolWorld.x86.bat @@ -0,0 +1,3 @@ +cd %~dp0 +cd ..\bin +Mosa.Tool.Launcher.Console -autostart -oMax -output-asm -output-debug -output-hash -bootoptions coolworldui=consolemode Mosa.BareMetal.CoolWorld.x86.dll diff --git a/Demos/Console/Run-BareMetal.Console.CoolWorld.x86.sh b/Demos/Console/Run-BareMetal.Console.CoolWorld.x86.sh new file mode 100755 index 0000000000..a6cf2e840c --- /dev/null +++ b/Demos/Console/Run-BareMetal.Console.CoolWorld.x86.sh @@ -0,0 +1,3 @@ +#!/bin/bash +cd ../bin +./Mosa.Tool.Launcher.Console -autostart -oMax -output-asm -output-debug -output-hash -bootoptions coolworldui=consolemode Mosa.BareMetal.CoolWorld.x86.dll diff --git a/Demos/Console/Run-BareMetal.CoolWorld.x86.bat b/Demos/Console/Run-BareMetal.Graphical.CoolWorld.x86.bat similarity index 100% rename from Demos/Console/Run-BareMetal.CoolWorld.x86.bat rename to Demos/Console/Run-BareMetal.Graphical.CoolWorld.x86.bat diff --git a/Demos/Console/Run-BareMetal.CoolWorld.x86.sh b/Demos/Console/Run-BareMetal.Graphical.CoolWorld.x86.sh similarity index 100% rename from Demos/Console/Run-BareMetal.CoolWorld.x86.sh rename to Demos/Console/Run-BareMetal.Graphical.CoolWorld.x86.sh diff --git a/Demos/Console/Run-BareMetal.HelloWorld.x86.bat b/Demos/Console/Run-BareMetal.HelloWorld.x86.bat deleted file mode 100644 index 9696bef80a..0000000000 --- a/Demos/Console/Run-BareMetal.HelloWorld.x86.bat +++ /dev/null @@ -1,3 +0,0 @@ -cd %~dp0 -cd ..\bin -Mosa.Tool.Launcher.Console -autostart -oMax -output-asm -output-debug -output-hash Mosa.BareMetal.HelloWorld.x86.dll diff --git a/Demos/Console/Run-BareMetal.HelloWorld.x86.sh b/Demos/Console/Run-BareMetal.HelloWorld.x86.sh deleted file mode 100755 index a9174c2cff..0000000000 --- a/Demos/Console/Run-BareMetal.HelloWorld.x86.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash -cd ../bin -./Mosa.Tool.Launcher.Console -autostart -oMax -output-asm -output-debug -output-hash Mosa.BareMetal.HelloWorld.x86.dll diff --git a/Demos/Console/Run-VMware-BareMetal.CoolWorld.x86.bat b/Demos/Console/Run-VMware-BareMetal.Graphical.CoolWorld.x86.bat similarity index 100% rename from Demos/Console/Run-VMware-BareMetal.CoolWorld.x86.bat rename to Demos/Console/Run-VMware-BareMetal.Graphical.CoolWorld.x86.bat diff --git a/Demos/Console/Run-VMware-BareMetal.CoolWorld.x86.sh b/Demos/Console/Run-VMware-BareMetal.Graphical.CoolWorld.x86.sh similarity index 100% rename from Demos/Console/Run-VMware-BareMetal.CoolWorld.x86.sh rename to Demos/Console/Run-VMware-BareMetal.Graphical.CoolWorld.x86.sh diff --git a/Demos/Console/Run-VirtualBox-BareMetal.CoolWorld.x86.bat b/Demos/Console/Run-VirtualBox-BareMetal.Graphical.CoolWorld.x86.bat similarity index 100% rename from Demos/Console/Run-VirtualBox-BareMetal.CoolWorld.x86.bat rename to Demos/Console/Run-VirtualBox-BareMetal.Graphical.CoolWorld.x86.bat diff --git a/Demos/Console/Run-VirtualBox-BareMetal.CoolWorld.x86.sh b/Demos/Console/Run-VirtualBox-BareMetal.Graphical.CoolWorld.x86.sh similarity index 100% rename from Demos/Console/Run-VirtualBox-BareMetal.CoolWorld.x86.sh rename to Demos/Console/Run-VirtualBox-BareMetal.Graphical.CoolWorld.x86.sh diff --git a/Demos/Run-BareMetal.HelloWorld.x86.bat b/Demos/Run-BareMetal.Console.CoolWorld.x86.bat old mode 100644 new mode 100755 similarity index 50% rename from Demos/Run-BareMetal.HelloWorld.x86.bat rename to Demos/Run-BareMetal.Console.CoolWorld.x86.bat index 9c67f3cefd..c42ee23065 --- a/Demos/Run-BareMetal.HelloWorld.x86.bat +++ b/Demos/Run-BareMetal.Console.CoolWorld.x86.bat @@ -1,3 +1,3 @@ cd %~dp0 cd ..\bin -Mosa.Tool.Launcher -autostart -oMax -output-asm -output-debug -output-hash Mosa.BareMetal.HelloWorld.x86.dll +Mosa.Tool.Launcher -autostart -oMax -output-asm -output-debug -output-hash -bootoptions coolworldui=consolemode Mosa.BareMetal.CoolWorld.x86.dll diff --git a/Demos/Run-BareMetal.HelloWorld.x86.sh b/Demos/Run-BareMetal.Console.CoolWorld.x86.sh similarity index 50% rename from Demos/Run-BareMetal.HelloWorld.x86.sh rename to Demos/Run-BareMetal.Console.CoolWorld.x86.sh index 7512922111..78131f3752 100755 --- a/Demos/Run-BareMetal.HelloWorld.x86.sh +++ b/Demos/Run-BareMetal.Console.CoolWorld.x86.sh @@ -1,3 +1,3 @@ #!/bin/bash cd ../bin -./Mosa.Tool.Launcher -autostart -oMax -output-asm -output-debug -output-hash Mosa.BareMetal.HelloWorld.x86.dll +./Mosa.Tool.Launcher -autostart -oMax -output-asm -output-debug -output-hash -bootoptions coolworldui=consolemode Mosa.BareMetal.CoolWorld.x86.dll diff --git a/Demos/Run-BareMetal.CoolWorld.x86.bat b/Demos/Run-BareMetal.Graphical.CoolWorld.x86.bat similarity index 100% rename from Demos/Run-BareMetal.CoolWorld.x86.bat rename to Demos/Run-BareMetal.Graphical.CoolWorld.x86.bat diff --git a/Demos/Run-BareMetal.CoolWorld.x86.sh b/Demos/Run-BareMetal.Graphical.CoolWorld.x86.sh similarity index 100% rename from Demos/Run-BareMetal.CoolWorld.x86.sh rename to Demos/Run-BareMetal.Graphical.CoolWorld.x86.sh diff --git a/Demos/Run-VMware-BareMetal.CoolWorld.x86.bat b/Demos/Run-VMware-BareMetal.Graphical.CoolWorld.x86.bat similarity index 100% rename from Demos/Run-VMware-BareMetal.CoolWorld.x86.bat rename to Demos/Run-VMware-BareMetal.Graphical.CoolWorld.x86.bat diff --git a/Demos/Run-VMware-BareMetal.CoolWorld.x86.sh b/Demos/Run-VMware-BareMetal.Graphical.CoolWorld.x86.sh similarity index 100% rename from Demos/Run-VMware-BareMetal.CoolWorld.x86.sh rename to Demos/Run-VMware-BareMetal.Graphical.CoolWorld.x86.sh diff --git a/Demos/Run-VirtualBox-BareMetal.CoolWorld.x86.bat b/Demos/Run-VirtualBox-BareMetal.Graphical.CoolWorld.x86.bat similarity index 100% rename from Demos/Run-VirtualBox-BareMetal.CoolWorld.x86.bat rename to Demos/Run-VirtualBox-BareMetal.Graphical.CoolWorld.x86.bat diff --git a/Demos/Run-VirtualBox-BareMetal.CoolWorld.x86.sh b/Demos/Run-VirtualBox-BareMetal.Graphical.CoolWorld.x86.sh similarity index 100% rename from Demos/Run-VirtualBox-BareMetal.CoolWorld.x86.sh rename to Demos/Run-VirtualBox-BareMetal.Graphical.CoolWorld.x86.sh diff --git a/Source/Docs/demos.rst b/Source/Docs/demos.rst index ab56baac4b..53d7dd44e0 100644 --- a/Source/Docs/demos.rst +++ b/Source/Docs/demos.rst @@ -10,17 +10,17 @@ MOSA includes three demos applications to demonstrate various capabilities of th CoolWorld ========= -It uses the GPU and some other features offered by MOSA to make a nice graphical demo. +It's MOSA's flagship demo. It can boot into either console mode (containing a shell with a few basic commands) or +graphical mode (which makes use of the GPU and some other features offered by MOSA). You can boot into console mode by +inserting the `-bootoptions coolworldui=consolemode` command line option when starting the MOSA launcher. -.. image:: images/mosa-demo-coolworld.png +Console mode: -HelloWorld -========== +.. image:: images/mosa-demo-coolworld-console.png -It implements a basic shell with a few basic commands, like boot information, memory usage, and -device information. +Graphical mode: -.. image:: images/mosa-demo-helloworld.png +.. image:: images/mosa-demo-coolworld-graphical.png TestWorld ========= diff --git a/Source/Docs/images/mosa-demo-coolworld-console.png b/Source/Docs/images/mosa-demo-coolworld-console.png new file mode 100644 index 0000000000000000000000000000000000000000..fefcb1eac16664b481315eb8b5baebcba10f7b10 GIT binary patch literal 29284 zcmb@t2~?BU`ZpT2YFnz-s-QBpQc*#OfPl=c3RIayCP^SskTC>=$QU4Ypo$DBA~S?a z%1oHUoPZ)kW*I^tOk#v6VK4~^G9>wSJm>q)|DLg**D)5AcH6o7*_KJ@hn%K)#1uyZW-m@TK*6?Dug;)xIe(J~pNOR6UMm)l1C0WN}H=%d@)qk>lH1$q&I!Z=XUZ zn$+|=US7KxtUybz(R$!I@(&21M1@}}iZXIh8F58Z9j2WsiTejDht%G?jGZxc}MJuS&O@g@Ym6735J zSU5b})C93&q71&! z9C|-Mo8@Vk#5%AW9w4=6Pt&3>ynX{|r{i}9_jwI!rJRmTS7S*~dX*sa;YZ!Y)W5G#@L1c4nZdRs!!?Fx$!w+aSc(tAu&xLVG4X>Eo z@~Nra(Mu5)-HpsPXSZ^aPfrbK)kH`SxB#Oye7>hq8@A&wtp6+DF#Q~tG~o=lPbj4` zDx{Bm(5D-EL`#k8yhiqbq5ZE{3_L=15oA{;Ywoft4#Ueg{I$qYRdS;!Waqgpu-i?m zwl(k91e2&n3v1GBdDqyI%H%}AbeXXFH9`B&!!_isQ~vm+HW-#f^;r#;zDP7i|2s0v zUtm6_M2{p3VKH|}6Z69Ah@s>=er}{$HMD)69N987#oA3(x*H5DZ~kBLHP_u7+2$+u z?)Ip1diij0`6a;%lPSrQrjp7>%mTymF=aJ@If>+KMlUf2oi0)A<$s3}U=(*U=#=NQ zL~J?bpRja_$okW0p}=@5TvhXN{LuJwFC!?OtaH<%A zKPRRq_&OY+fAG{m!AlcDWMRc#RpZX(%6^}9xiUdRmPa=A7s%H8O)?aXR<>^S4YNvY z{V3@wluX3-1-NFJPK>~#-n|bdXOg^BP-{9~%TTu~b;vp%#QZ7?51QHy4B=d>_ta4-tG5*Yj$8`Y|xC_aqtRYOIBJl{OaC}enFY7!JIcy0wZu- zTVCUn@k?Jz{9^3g>UXKt+q82$HI#o3S(gq&u8(;{lAWW(7B!$;IqNm)CNszBRJm*` z@S@hP8fak6IyOI`cNaA@_JX%ZoZI;Km$1Ba`iQWr0hZagv5F$t}-%Ja62@#Fk?{yI71K=BB{lq}X`f5MXiKTu|p{Q3fc% z_+<5`TJaew>3|(nc*|hWZ180SB@FCMPp0cQ!f}IVhYm^;1lMziTbSWi0YwF#{;bih z65Bq1KO?X_!s5o)`OHc$@KVD?T|v>BnEo)xfwAUF1#|G9Y{=lmTs9 zi&@*&uPnQt`j5PN%(Ca=H0g1#Ice4qT}R^T>9_wHUk_|}ZXlt+P-A@*fx#F1U4u}QznMI&oI!CS-5KSGZEr-;F{5WkE{1vtc5l_< zhh;KDX!Ex>Vg~zGZ1P1RIz~)de#CRr9j@H+qMH5@={C3IFh~-`2cVgC($kEdZQUM^7JzXb;(QkaBg$o_7aX$w=&C6=ug%kNY-DDXuE@t z;qBeVO4hG!b0myZVUOL1xhXI@M6M?&{c-IH!&luUf*IxV>u&!5TZHU-Z$tmb=DNAY z!zw5qKG)}Rj)U$QDQZ-?A`xcH`rsB1O?z&%Efr02ixh)qn@FNr#Y3b%isMm2hSbuFu6Ubuuq}#(5`qZryf!11B+B`L%HtaR|bgX^iDG zPHspK_ipO#!?yL!MT_@G!n!BP(AcGhPex{(fw1WLR3V!xRN9W2fKH`c{3JZ@R`0?4k%mtLmUTFQD}d>S}1?67`J?wZn90 z{?MG-9!URcyCfFdk9!n2%)SrZ-lELIgrh1qos7nV@PH%0hTn z*5rVXvVJSKVshTLuCouZ6}TU}kTZ7&wBif1T@;t`BBQGD`;dDYqJ}x~)bbVOt-nMM zaqkaJ>c_D3nTK{d4oysfSxv1vi~5Il5@R}*C7z8`s>oz644!<35b=V_E2s7{G26MS8uy=Pf&074^<8S6yj3s!%SK~CQZM*fVvpFqm(kh>~K}U)$fV9k~ngw}# zL$L!f-ZUZ*(n%EclUd8xZKM7Dh}bnz7`xnzLD+gdcTuNqjw^Iw=D`OpK$a&sh>b~M zm6#5lRs-f{Xmb8ubz|FtMq?LwXWdTpG-fg*CTj*K5q0Cn58g&?%;DN8D=R^arJ;`v zjqNkieIgN-f8DQCy(T8Ck)?kQ=>Lq_dAB_mG{+mj^@?90cdQy0qTl?we;K;d)qYoc zw=7Do{CQQ)q37M#8S{jya+AR_MTc_brQGx#!ykr=&bHhm(^PZHhdx$OKBNi%WKgI3 zf$<<{>C_n^1tY4QRip&IQWwi-OsL~TLApjtE6J^MxAO(#X1DcC1y*4!2jxcAyl+*E z;CbvQdqt#}4yjHeVn@4&mit|tT<}P138^7Yl(CZ7K$8busI#l$1MQs% z@m3>~WhPt+8!{5BV<$P(*Q?PBoaK+TE|W5L;%Te>3WzPM7N7k2-_;=BvwUzupB4Fb zuAQ#{-Mb$iz1=7|!~6nL&X-qcKRlfD+Kp^XjtwuUDC~Q9O`&ppYT_Na6u= zY+ac4R27>$8Wuk7VZM^{vIeu+Tfv$JiK`QP+ zi(HYnxS_l-aWjX?wVMDIApcgB-1(L}&%BUx*y)?74S{{)nu>$jq|%z>hxiXaqOkAY z=p}m9)(Y=Zy;9*kkVF0o*hJw`zdC zo}l;Zp4H#d1oiEE7S=BLxvvd6#52~IRC(-_qm%xnQ_Q30^8di{f<}e#K(OFcOVc~J z_3)U=Nv-3W?Sls&{vNaBU^j(*r!qRXHQvaCgTL?vB=AjRMN2(r z%={#Rdircno{CwBQ%ozPZOIn<$qtu7`9R2+DyP0FUm+uREWun^X6xH4i$wR_8=(OzbQl zE!=3AZ0p`lncIQKCd7QYqFn0}!BK`p|2Zt#Tmw+S_mJ7nM>Y~2*sE9)V)Zj8xd)o6 zuz-!M5WtG@lv05oQC#F-S^K;+o@wPidBKkY(CHFFPoU z9|~Wv%sio{qN?RZjNQa=V5VZwL|yy3itw$2S&*HG-+ss2J3nf*Nc2Ina81t<^1Tvv zS!;W!on^F~VI~gVE(+R874kCL*XNuQd81|mhkz2u-*10c-nkum#mgo9d9A#fWf0;j zYSq^S!4$D>jyJ*b7$_vYWN5oG?`jp|%uQv^yNp_icJrf!@_^$+nHA1*0`+}@_?@LG z@56?m9B(FW6TKWV^^+{hO?yGN({Oi(%)~>>-7@(0v4~5|Bz7#Fu$f`zt4|O&iC$D0 z2d!;V&n)jzjC;CQ+s!yXycxGi#Dn5q5F*|#ZJdL=sh9=4_iP|1k7TJIP zL)r()E#~by+V#VP@1~*q`E5fJXHU|T&T=wiNe+&2pc8ZCNeN67G*r%tW0eyd)b)@M zwOAzDkbFEMoH6^PF5H{H@ilgogY+IU#dMl-QToe70OSKJL*fDceK0d3AonbmMsMtF zO*NX=5Q6X?#1@;}5C`43{D>F@^yBLk$xkv!B-5X!KVz)4;)9zv*q%gYN`lit_l~`1 z!%KU&T8#B39XDHDTew_qp@PXQX$(H6cVlYes$kgS6@$*KrDVqYxcODcW__jlXb&>S>NB(=Z`cz!3PqyFv;db-oy14rpx zv^+8Qnp;s*%DlYto9n`hCG+v)((y*kIh>G0>HP@=@%$-*C2AarWv$iv=s!^Ic@( zNr$0FTKSwIzZHY8A-Cv073JzC93-BMZ}V^&HDC@UK28Lh1vZFv7%&ZJoO5OF2A zrlyg*z8rke&PHx->-gw-5iRdDZTz0eF35qcQ-?`p6o&^m2%kHBjgn)r1?kq=i0Ye~ z`6*S=(UBDf%l9r#!^SGee|=22(GD3A7j&g`A02)%-nXvfWo+uqDter}mWK`NceTfr zG3=hIJmwb|BlJ(g{#8HKPNmP zZp-Hwr@Nvcmi^9Pzrzsc zY&hzEWpWbR-@@CNYN`g;#&-*@iUKsUv1uk7N;o(5p{E94KmwNT37pE+@x-PA=b*fX znTgJ#GCh0P8r0gVisI`&u_Uv7v}NK^J+tVf)*^Y6uNb;&#Y=>hm}BNzgyh)b#pbIh zV@v;Jmz>5zGaZsK8Ab7dBYscB#66MX)gC7>wx`H9bJ64rA61+RnOcU&Qop7 z1+{&U2Qm(DIOjJ*7*Vd!6exU{S5QtF^AGxx%1I6su~IYn_W>vGJ6Z8u8K?GN%9BWP zsUPahX*w?63QU*#h%Dn1Oqcqf&%$E-3A33f?MT}me9vg`c1wxL}9-_ zn;C^TN!%Q}Ge7rwGx+MlHzuY9Y~8ohsG@gS7%Jp}c`sCa+Z|N&I8OR!*4* zDRo0mqs--w=t-P)N>56B&0ROu?(c#Dk4DOA^^NCQLk7s^XLs&4XNR>XT9;rqv=V7tV>D5A&$ihKqt&eN|5R-Ce(vuHnD<3 z>B4&2&z-v`Wm_^eVQ?SD z1d(OCIF?g3eB>S998VM%7)tG(!Elrz498HyUof2eu{dgb&et#=<~(dZds@_*@^Qs( zEsfVY?TOa$YrJm#tmZ^^kZp3oyAcKELq-B!sAMv0XyETT_%TM1%n07gEoIx?TnYM6 ze`rXefk+yX>+-`P(AFl@{Mi}@4>q#^WGI}&?gh=G&IMDWg|;!pWoLAHD96zZp6jK0 z@!HAu%<;I;v2j>pyZS4wxVal+TYdhD8H)TzTwkP~ily_4u_Lc7dno6tf`MeU81fch z>m*127bsXZWR z?PYle6u+qKH2P7>4-tXhWL1<9rFKDWCJ zCtZS!C;7}9^(Q`}#p(qs!$qfhO&CvXh|2i((M61xhvR($h6fUKKg0x&*N%jN*fq=# zpHnvej?VNK5W0OMzidzG9b2%o%KeLa*3aN3NJhbnSAHCi-Okrvc!#aA-<~$q zfEEO8j&9Xm@Hjlz$E|#x^Cu!1vHhy1{wZIHJ~zVJUxwaiF)|HbZ$9&|ywMoZ$lnK9 zo_)TR|K6p16gQl>)P`u)KOL50GFu9}4$VxbI8OzLHE?8`ao1aXw3q2dw&-pm^UdAO zRtFMh=;fQYSHu5ln{@|?3EO|jmE(FE`4p>ZM_1Nm`qD#QPH9Q>&B+5VbK|1xzk0OA z4;|JbUTqFFh7D$765SQqv;xmZSGDYCrnS&l=PKoTUb;P=ZMMi!HBo)M3-aa*U?)oj zJ}Wo%ovuR(>EU*Aj*aoM4EyGWkK@M&wBnE-Ek)*`WSh%X3MS4J?p3d20w*KY#~Sy~ z+iRK>SztB|i#OY@jVQndKgvUJZMbciYWJwt0G(4#xAX4LIzAxZ^KKX9_Wt#_YkhKl zJ=ZK~{&`SKyl7+GQxa-XcC7ozphni~&Ocan(i|a#SIb#GhuV1c#Pi|QRFVHvcN=Z#?K&&>;x*9Q-@-bg zN9&Z!bq+Cwh&NRd)V!k3!7A-z@`x<%gvna}PGT=6e!W>a52xyFm6e}U(T`E_e3uzz zVeHbV5ab+Wjm0YM?ub)wziYWuYcdfp2`lqn3okpkiu%Kwz)F{ynLMLp*YHSRFs)B#j0_;LE?M#Y?LH0LNiP$}+8CwLMa9@UAxRys(%OovJ_P)3f)cx@7|togmw5g4wFI zz^daHeUlo~uS`X|vZ8ZNGZTFKN&MQY1k5wf)jXGrXQE7MF_~Ik#?*=!zudiA&hhZy z2kB=gF^?B-&>Ry!xQ~{YK{_T4++y+upaKlV!AUjh*w$N9m$gs6Ki~MIrEoGRGeLM1)n1L{?S30UzCGA4IZeP>txr#Pp2Av*-5928 z=Z3n{oe7v7*IC}lySXfd-H`tATeSQa%@h&T^Html!EVa>C(bWyQ`jFCm7{LT(^HOC zCpgD-8;QVn-P@(PYRS(_1;n(~)PHph{Gp=3{m#Xs&oHE#ze-dVPIKV?ggW9^N53Yz5w}l1XY(+XG3IP1timvh$jRwxyoe{bsN40G7^AqJy!+Es zO@F*c(b58!HKt{E!j99N(nHkBwo{Z9AIMX-bR2xmQi(#S3{t$W6Aaigkdkc4Z})%J z_!)t#zSM=_Emw#(I(NIHNMKs#Wlx=pbGZuUJ%tAKhpObtS4^VXLPN&7 zbLY306suTEUFs&(%xs^s4b`nz{qrTp#QR&Y zU_hsj!0rO85Ai1hw&K>xGCv5F>J!-bKR%0 z!|h`}+YSyajpO_$+ZrOne^jBo?PhQ+Xh@|m>X+?-Ef zIBn4ez52ISl7}5*uhd^;{9>i=KiuqFX`T4ETldT%$eWPhV*kDW!@+C(1eakYmMA;P z<6(yB<0vY=lK##t>19!u6-5TjdRvdsR6HJr9NfSx9e_rB=$;Inc@_c9qe7 zIiY%xSpFjBDy@Di+rOu17+({;xfPK3creCR3DV)kvZdelI#M|3jS*BHkWDJY`|dKL zm1uE_ZePUB7UG?e#O~CdQU4t6Mw0O@cho2m-LmVW7CGta(=$hOy5^TwCr6B3Nu~vn zXT21O-JpO$PS5H04{&k4__zgDT(u&wd-^}SDznR9}qg(h`Ri5W-e8%xcAsxS1t15@ONt_ z&Ne&jpWWIIX?js4U8!Sfc51D!33Y$r^>*3gsG5e}PtP_cTlSs6B-fO)c5dDOCIygq zqgsBE`1_`dC)3!wKN+2Q^}iqt-{#8#eSNH z>etD8hmH0puW}E#P=iBX*~A;|!}qzwlm8~|$Yh$18zQUl#1K+t!lAOCY(GNR8ngJ& z9jQ|9z3mXEpl1Uve|pqjDy@ckuy^9W^c_%!)#Eg-g>s|O5-}pCo$N;3I{AYR!Ya`q zhpnK9rzIE_rfTf)=f*Hx!xrhEFPd+xi(V%$Ncn@U!d7c{k(i=$%7kc+$ z=bbva2GZ7vpONbs{hJ1P8%M1c-?`;2`JC}Q8Z%>OBwfg)_CcpUmvwLiZ#i~tWm6tfnPMsO0vE0=BRJJ77?4i3zCu8D2WGt zmXl0>wD+f;BMZC)Mf8RY(K**i)}|~?Wh$fL!&`JElgpe_7@qF$q4ymbFfSiOku43P zDK32uOGGz{aq<0%o#plJ3U;X%DPgfUVJqi4=Bmj0*Z`h@GHCyfGj)p8kjUgx3xiTvIPZG08JH@%;wxPT@taL0_{Wl49&GDX28V`}^9^kf%M+4jeK z1E;$CVhi^T4gROCl7JrL*&1G*n=cOXV5PdW>^-H)t3p(;i2Q4)>l|Xe@ABPMaw0)y zcz3CfBjFSVLE2O@A*2W|{F!2g%tGm!2U!!h6Y2?Ylxq}%NZ=EBN3-~bUD10WyohaN zSIJ)b2&-oL5$fK(AflR-SEz}j$*RzFn1t@yKL*jLd1G@_Z1hx#SonA7pzG%WCSG{% zf^2u>m32IlyXHo?@^;1G1Te_8ja&#yUXZJt=JTVODx@Q9!tpCT$BY3PB_7@NKGSM@40vRR1g^i6He&gv97r|_mrhmLpq+P9vF z1#!|!qk=dKi>HmMN2U@!kbS&(zSb8lPmYc}Mw7GZ8A_H5>DJ3nGGUb7mwt&-Ck{Fe zji}pGgOCPL0sCX!XV=VmYkTabzr-Wqxa93OZu_KSd}6xv za_`TkAIiq&PY?f@y18rckXaw(fx(314@q(6ikLnBYKHkJGy{4Ix%I&2nDp~}$CRY< z>KYMhD+>F|9!I->Uzy$3a5%*(y#iqJ}b4*M^sSX&Dez~B;cH+VDCBpau$P`5|xgOkvS>zg+Nf;Hjm&uoX;O4gCd z-X6k#^k=Qa274j5s{r;=HE`oM9^K^6Z?Z@>7TY> ziBL-el*Piif@rcHs4DDc(6@R&#;gzOADMbQT(h-B8R5q#8dkvwkGi+0+BB>K?ZgK` zDN7?1L+4!;jrj(s4vhgm{DM+Wnfj!;rK&A>4&Be7Y?S9nV!_eoszsUKl@}@G#IJO% zGb!h4P(8^%94XcUd+T0N{yw67%raEPy2t2rgKFv(PZ+H#+neB>VLbe zi0!$w_iIW4zc;Sl6+3$!!c8D@l*<##^%wgigPw&V7R5!cGO$r>(~zf}b&OC-aX;78h|ky05;lfxgp_QO(1vDy$k9;c$6?!IZ+8k&aFd8jvXy` zrSY_(a?rIvnQn!=47TUE^J0s!Gbz~Gq>4b=I+;auZg`ieqm>QsbG2{R#qh9MeBk!C z!Hhbd@%8eZb8LK(E#DfY&F&=DnkzeKG<$o^CI@;p{D|y(MQxxSB#A8uE_fWFivG|) z4^$yeK=quC4Zj^|q`yD4d{gck$>6wGf@#BIzDr?SIJa1k*co|(wCR*J;oSf9^9pp%Il9NoLMIIi zwf-G2$$YL&_0UxBg{OX&YD<(rj%*$}UIL9;aaa!#FzYVj(~JET=ls>RwYr|((p{MN zY}o-X2)2p?Fm)VXvIJfla@$zXNv?7yK`-c>6l9G*2R3?_o;|qih-z{GjsJ%*|2O^u zbqwIA8j|z5vhY7c|5);NA|kAb&_K6>RsQ<^JxYf zrRfS_gCB4bY@FUi7*|p|#*I#)Hp2aOEd0M%losz}YD!O@Xa4wM-%t9E!&)bXgP9p+ z=;KxtiD4Q{BIO|NKR!*9u3G?j)U6@+yW0b{=pz?;pHh=o*BYZM<{UrSxI*U;=O>S9 z7)Z-mFPN5`()0M0l#_RsU1DQZ1hvX#lyC$5#)^I!qUhp5iwCqKf3Js~&srwAUhZQ< z!%OO(gIdKGJ+2hel3xM#>;WgPQF6dpPZtivP-D|5C@wIp9=HNX?$gLyZA&CJ756Q-2_9_24=6mj4o|gxZJ3)6| znR;x^{Ywh6Py#IHVt|nuTu3goXVZJ@*4ek~hgm&f|D-Dc{8wk;`Jw{;qa_Pii&j!{ z(vs%n2*`dxI`n`qH;*)WiX7W&^rX*z_m5-=iIvIdc0FxZUUhCK7?`*#v>A15cKP^X z-^pU2rFIR_q`L1_i5bNV+|hCY$ZMWt=$x_Bu)w%}o2sQd#AE@N`Ra|W)Az8yvfxh@ zy*dkJZnsB_*7jVkPP6pX^**YI7aBNmF6AB4!2i=s4tU-?l*hIvlvL_5V8V6d`rJaA zpKBUBCUTiW!mOTf;8#d%$se2tSo~l}xUa^fDNM$F*=j92ot=(1%HT}N`>ai4cc!0G zVKEKNfQ|^TlC=|#PV2G(D%LBW{>BX%%@(nvgm^PKl|gg;JgX2*sf^wJdREMM-X7*z z|DNRkseVt;B-jFhyp&A5@%&L>Rzdgt z2}gHs!n4B(D(>HIHJ;kko6Eotb1SaVjtn0+F@x%anZyn>`jfXt_>VobwId4*72!1t z3JtumEul7>kkX?QWtpJ}3 z^w0k`M?n(#eu?79qsEb>!OzSuSYZRPq&^F^-tF`G+ziCCrZl8?pZAAusio==0HgO3 zxY$sd|4a9R+Mh?=hP!P%qoM<6RRQXR9H%#0B@&jr5CZOzPsh(ro zfp4WP?b<{`Cu*Mc1|%L_J+hCC*v#bpdi1ceOM4O(7*DCQB9Rf^3jP z`YDZt^R!}6-%GDoxWaawZn#)_J<78EH`e~QPQF>ex%lH!>xJ-Tm~v|1^Cno023wfI ziJDbqnKtrkx-Er_C2TF`H8$DR^P5Rii@wCj(pgME8B@VFxNH-lhM`#WgIpLE_+fQ% zoERk0)huPI?6sRi-7xPxR7cm&ZF0veyQZ5b_TZGPD$TtQroU^vt4!2T#8@mEG>|dd z1{#B2x!}M_ypa>5e}2hKsoQU5OfM!nxgGM;4H>RCPu z2I;vV0pq4orSlxB&v)S2(9B~8`_{n}r^RZzi=%R0yAUMTg=Zf&xE4?zb&nVV&~F>x zDA}9rA`^vbtImKT^OLv&dxJi9rN9Zh?A6_-Yxd{trQXd98g+Ibu++wJ?c5w!C+BaQ)jHiMdtUzB6_L*Lu^CFPGI2#9Xxd zH6PkRj?2^>TkJmCatZHo-_5}*IbVBG<8HTuksLJDQW-Ug3tBi~zCFTz#O4%)$?qtX z=d~tB23n__z*vm6k8u0b@;bBoxmgDN?|NQS*Rvy-vIC(gH>QjFXE6d`ric2#=dHGu zIW){4TjiFTG<7{ls`IuWEJcMn&_jGcLjd&kK=)qp|2x!SDzY0hU1jjK?6*(1uJT!C2pA`!L=h-Y z1_&>cB@+AI7q|2e7m5s9R{2NrP{E~aux}4c^_*M^B=?@g@rt!TFbVkyP&uLflb5cB zU%ZI#9%CMQ*jYIT)AKQoT9th_oC(7Q#a_hk)iTLeVcsqS@m%fqsw%0)aylUgv09T< zFu>s9@UngU1R8IFlVA(M8Y*Q;;x(6ng&Ck073$)~n=A(La}UNm8uUEALFKtfO97;g72HKTNmW z7-nIMF##cgSq9Gq_Z129#MpFHyZ(4)=dfo(oTt1lArXco4lXE+5l|}h#S;+WZ$NBt zch0uA5f60yqJsEwT#5CIA#K=7M zU=gsX!|nCJrMT~Cv%5}oIPT1LI7d|Og5;EGN<8NE5hNq^VGC=|itmbx){mgSiJ=s0 z!OvmB?*}csPx4xg6eOz)D8{Z7V`dO3_Bw&dzk(4iwUtol8K-%7ud-0|My5p~?MY;m zR+hn-!f>P)?0eengd6%!Ij7L=TDw90)aw3sC z7UIPNwwR*#5K_IrO%(JSFTo90vyI%LlA`?*yUF#;7(inj>8?91HIvDKd|e*`c2EmH z?q`7VN0KwG3A#_U(xkRC@l5KOBdJ+ekjiORdDrr(%O7fVNeU(aAHqXoF9vF^Ap7+0 z7@L6LugqkC;x-`3VBY`3~^$*k^W!T@O zbJQ#ld}^p5eF{%(-!eIUf6Bfjt#6u*(PDKw_%dTKY^dhO~nujdg95Pp;c-#Q7| z`ARFXNtW@vxqqlRk?&}$Ylhlr4U2_L90A&*B|tKTOE)61UE@28UUm(c`De{?06=)a zrxh(-M?G&HOPBv@1snj3L>T5BLc>w97aOmMN5-dam`4i1u{t<|GnSsqaD)qWuY=Tj zru|?|m3^d86@#$ygrOnTdVpgLdd|VQGGc>K$!GE1^|CyN?R777d6JJ+7I$oLwC~+8 z4JMp}M`{B6;H+e3Ms5bx!7tx~bTs=Mo*aKbP70hXgZRx zLWX}!1lSP%ObbRR3ym&EC&Q>ErtrqA8b}ht>#cT9jx#(Z{+xCVh&*n|gqJ-)eP8z_ z2)H_or%QKhzMgKq2^qvw$w4dmg5RS({7d&d;3V1{yZ7s@HxLHxTsg2SX2P<2GE2Z>TTO)) zm7!YIYRT*XbNBQ1EI z?~{m$t;Rxu-tAaG!@*>V`pG3GLT%4+P|ib<{l8)uYj6(NDWNCP;0oIsob6ET`$YJe{U5Pxwl&+1{j_W7xM5Z1>P_~?n?qI~B89PyzMuq0H=s=QBeX-@r5CmR z2=_xEk9xQS#{UHk0=0SZ(>0Vd9nC(s-@?+F;tq^lQKI9$GXsz;b0Ue zNyUF?{M=_$`Y&F;l1{e!`yFp<7tC7<#*?>!OD*7+Mq0hI3Z51}Kg@6BPL%%v)P`BZ1NRh8Dti2%& zN?S@I>dh`UGm=L)KdxsImW?;IPUaQ&heL~;GMqTHMsoL&c%~(xwF*DzzCFVA#Xh|< zb$%Fe)zdEzAd&|l^ci|5XWbIPOQ-;PN$2|Ou=N66x~6J-q835S|g(uL7Mf>b&*1>jwXj=D2?v(%_W9SxEUe7 z4#uT$&3AsQKL4ExdCR`n?UUB|4>~$S_IbVUdSD@@@DYsCvkc4avB+^yIn-fr+d=nA z(EOzru$Zek*}CesK@2DQ`|-=iBdELyxSMCd)~<1z|1byr}by*$UL`JimC9D zP||#!+Jo}$PX-kOJ{m)AS*CDp8l&4-Fs)M$MLIKO-ABip>Z_cA1$dw&2F?hrRVaWt zQz^m-6opC@2IP$#2NiZjWdo$e@!B%Qa==mum@-MDUE-tJR(=4Xk0x-)aL+)&1mge5 z;WC*CCJU1D$L^h)Rs?d>^bHUrz3*nyJgxxJ@SYfOh4OdyNH4QM^aADw(m($rBrRwU zuQ?Gk$%`yfYW+j<<&wjlgM9y(yrtp`Q$=BP*}a%J^$d=gU!z#Zo7Qjp#K>G9(jPOi4}e+0*l zb^g(ZVFfa^?LTmwHDyIfp2{FbB*phqZTm2^>60Kx`AHT8{4|!9Tg7Gz5Gp5<2>>rF z4v}}xeMG^VcNgSr%8A=K&q~>8DZnjqlUG|ZYI{Qa-<1vN%?uzjgnAP3@!Q^=D47}>rzyVbyjBuB40zCy-_KVtrbBHe85yZ9h~Ge{)w47 z?aGPP^gAeOe#$Fdx$_NHFEqBO8;HTtHqoJ93>{~$g9k|YFZyNiYM0V7+V})kz77-> zsOURqV=E~OlQ*Rx;xiC`(ANz(-Mg~ZTe26B%G_X6)z7nu4meu3R}poUw!~5SU!{F{ zT$5L~ZrXm@W3BdD#Q_jnTM?C^0RjR6S{0}wP=qjq5R?dkgh7lEG64N->i`74s!Rcr z3JOAilp$b{fc+4H5E2nWWC}_o0m5Ji1j2ZCY=7t6bMCpnd+xdX_$M#f@4MeUti9Ir zJZnM8Jr$!~Bt$wh-B)i-sG5^gfxjj2a}HoxhW2k1y+Y=*Evdoxz%*X?L>C9SBI>T^ZSBLKg-;%d`!Ap+f zjPsMqwKV5Xs2PK#nV<+ku^byy%yh}4>M+XR&1ZEW*5mg__4nXfuK99&pB&3ZVuric zggp*yo&z7+kezLi9mUVeQ(YdQr!qh4_J6O4oo=vVCmu@GcG?2XLRsp zKSdu*pm1N@CSmQm8S-x=_Xh2Jb+Qkl*+xFB)#f#Rv!M3LXZjE(GHIPS7Jg9wR75g> z4Wpk!@rBt*DD#_^4P#f+brPDOJk_Oh-M&>p07{HG2{!iSWMGchuJbML_*FK)>bhPA z%aDQ|z7@7d9&TZ7axsNP5cZ2<}*w#ZYmdsR%{m7ZY5g~(y2!8LB?r=xXmYH`@CM={3tH#`Ypz1 zU)jRV;h%i~Q1|@u9lu}9cT?csUiT-6V8=wJptoUe&q3js+slem_RS6V>Ag8dwS2|J zuDt*+`!VPDvc{tAoXG0zpx-Xd?{N+_PcVttp4YrMtgtu<^TzMAzG{d^_on+u>WJt( zD7O7RsZL~SGR1l!E6zPCd&zGuINUcMq;R)&Ov3vdN&)6$}A9Jj`O?ky`YYD-@9+P~Adq`JyX_Z5b1+N^->< zi0V@7hsR0qnG3Edl?qYhUmmEt@Xeqs)NzyUCM0-AFsz_C(S6#?PTyJ(p_GC^(>nfy z;k4=I2dsKoO?p$wxR!9nP54>%8|3T8H};=>TMdxf7$mvHX3^`%eu{HRLP7u1!mMxs z9KY>WM?^?XB9BZei45@_jXUn;I>UnkEy5Hr*2ZhdEHd*-MYd=u39a$4@7LexP)%#sO{KADj^jox`kKwu3a8VovgNA)$n{6aa}k0A4p=1PB%9>PN)nR7 zR}p#5R?y}uJsH1r{5;yi8hhj&5N|0msjLtoRF3c~ipvaX=xc7c7 z?D={Cau1hBifgFUGj9d5W{^<3BPK)qm zB4t1y*Ybn=yyAQ(A-%&|k(=&>V((HDcFGHKgttRY3u--_*uPeFiCo)_gh^BTi{a$Hq{2XiA>(1@9V{eR=z*Pig4rfC24f z+a)#Rgp)1e$lH|fG|55Pn)xo6hn;a=sL)4H0MBt#oEoZHU90#`q1Rh@WhZA&AaXS^ z@mLM*1-!KtRzMbXD2dzT0`K=JHy^#yaq%1bvNy-y+ClR|1M}c3fn9sot}MnJOEtHW z^|xU6D?|*O zeq?v=l*dpBWA$D$wXhz~h=h{`DBTqLPBiriS=TarL6j;mBitb;sI;S( zex!SMcc#&9AXWd}a?LZVcQss(gH_&ZU+6UFy|SMfX!M<;9r^FM-fab%N1$-nFesIz z%a!5jACRO44Wa>=0r=N{lh^<>Gfnp(`qAq5iZk6I_?@s*i5}{!3Iy_r zZi21Iz7yEx3p;go#L@~#P;%-kmz&oTn*_NH_YQbpHIm%6i0~p-mN?|ZM-+~c5;F)V zaDw7_RLw)t^Iuznvopfk*@A75h0CQ=>4rN$M(^>8ej6tHoUQ24{-NDZ9C07#&XQY# zbFo0!0T}T4LszfH?U>-bn`rqI$5UX){HUZT$Bu(6dkng_000%FK10p?xi^HUo&S%f z1X-glUKbArlWg4a0*;}Mpi}%A3&a-c@UAGM?q5Op%XPc8QvD2$JuNG|%gQ-IZmyeZ z@~7Nul~6eFht8eiu8&?@f$)&Oc_%&jDA~Os{$2IPzG&^s+%hEJ>wtQ1Nji4M-VhiS zp6SXkrx};Y6XbHdy3VqHk(V#ZhVVKitF@4|_bx!2#9>w#AhYYe;(slfEEAK>a~h{} z@r!#6LB%TnxaascN*pu~;B$s~s^u%nHA)eoBIsr2j)K1%sNQ$B*ouqmUm>7CZIiBG4C)#^tpt-{bUk3$%5BUfh{%_DLT3IE3-X>u{*93 z((K&NN7X3bjKba)$*O&5>r1sU(Hz9`RthnFu1EI4W#>Q5$?+lm8q0Ftwcu~$N2`4W z2St9B_6z?SM!!U!F1QQqNjg{Itk4pw+}6BaU~1LWGjc(`e!O|~1*71^Xy_F6S%FkfQZ=9s$W?b)O#<#Qdd zWjo30k1JuDhyObsBJU8v6KTcAwii6Vdq2rl#5*}uWFJlQSjCM8on3ud%^FO!@ir+D z=hU0qFCCVZIb{GHSFW`-Ti&C_jYkC?&t!!5KY~|seSzE}Jp(LFHxdqtHaF4F6oRLj z>Xh?9gadquh2%-s8Jz@!cg52-_BcqEdH)GnCGHk?J)8koEvqE4pZih@j#4UZ4PNMU z@U;skKw#CUGY*yYN0Fqu%7EF)wxz)|^zchvFppy8pHfHad=ikPmwuFgDU1T;X)4Yc z(V}81tUxNC?On~F?9s5*;k{3r<8}PTv{6D5z_S43`TEo4l>07KYq#l7jm&t*w?Kl! zfZPK6W82qN1`IVsxb1((yhM|{l%a;W#rnS;ysKf&?0vR}qIFD{=6XX#U(uE^Q^1-C z2+_~hqTl#QzOcUOv|?SN1ZP_Cyy77!-`4ZPg`gzj8Q=P^d=z#f_6#@9QL;3zy3&IHEWLn?tU|gp^ZbE3ZVU8@(4fj>KXVgn`KN`} z=9zN7J+Z=flJEnK-dfb3d3aS{?<2@#G;q?dR{K!?UL|Ipj1YK)P6zYd*B39fM_UuT zv97rIGjsBI~*Y}94S}J6fk!s_VVN$ z?P%Scuac%{T$6%IT<>=vNgDf+3ge^vCR7bVhV`nAL_n+ znpjEd-(s@;0rV;wIznW$P7JS$l`dW1|NbbC0sIJ^k{U z!F~|hZUMrt{}_(`pIIdP71a|H=HQ;BPv0SnsskT}(h3b~^$w;LUS>$X8Ixs+h&wZ8 zF|~L%foQK6afcNlaQAw2Q23g@qn!!9>p$CEZA&1d!m=UkEM*}P?;wp7lp2m2O_6hx7Brg-MakwtbldYCdD`F5u+5DqmI zjW9$Qwwn6d9R66YS!>Enwq5!?4-7iww+p_+lRY0^Or2<>dNDjCbmNh?u7uP{-9|zZ z_B-(<6WH5eJ3aOoy7kw7awkkh{iplM#4NGSB~%fvuJq&^(Cn?7{}lpEeW)(5cea+F zV|+SuoSeKDknR`XlkTGPgE<)?;`U;Y-cbpR_7r!uz-Qwm|E;nqx>ff~r2GhQvOPdFUpkH~r0*^Um-?-BnnRNkcS0oBKcF`)WH9z4Oe%1Ie^fsMGTQ&5 z2kh>WEP3mjUzGU)dTPQs;&B8mc`24H3A+btZ>b+#E0A#u&guZerzD_h)Z5%lzh?<* zgt(>J?)&dtQz(uBVIU_!*sV18tJwjzTI131k!x6t7_D%3*d zC7wXlaONyoc!QtS+qANbZRK4aAMXt3GL1AMj`kvCbw^%+Pd`F+6Mh1zi z+8(I^=KL(tos=;N8w}fNtz&3Df?Rg9m~B&nRKtUn@%wO}wES>1t?c{C=W>TKpe+2p6n!B&1&{5)v$XgTp@9jCc zGF-`f6ly(J#{R|l)X}*=r0u-~3mH7COl=L`$S~RB%6|~Qh5KoQMm9p-TNV_ z$leSb8>Rh;RyLWM18t|1Kpe^bj^DU|JWT?kG!PSt=OaTMymhqZX{a;yp7HYL&=bkm z{CLApim!?eQ8u^dyN3UYEh$&Sehshm7n2F#>rC#m?|ED+q6geVb~_8dshNDBYWMRd^wRc7xae zRV|8_JZaFpk%MtS#@%))GE}JRRQ{Hr>R)HhP+?%jR!%DyBwJ zaq4ld^vH=Ii`7qF-qq(s8ZIjRiYd<-ciRz~CYE{)=9?_M#eO5{@Pjq`d*C9%@kd3g zM0m=g)2c)B4Rk1;S9KU)Ij?3Zs<_#2Yf<&tq3pwWpyBUFwgk-=h+L$Fpj;nG<;Dq0 zjuR+O)#jJaBor4BoSGd%8=mA#TPK`tqnc|J2@9k`P6i{tdqgZ^4Is06h-;+frb4Qy z7-l17<&$Q=+CU{$l|LSGo@nufK#V#!uPkVLa`nf>XJ@|jUVDJUuX|@(@d(!?%WHm? z+7^w2e^9jR+}gm7hc7)b(f_bUteL6ElTN6lZrga8ROy7NFFQd#NNh)9tDxlBgeNlH zZIl1Urbn+Lue>C+;k#LL1~{YYA8ea{HL*q0#7too8wiRO0W~G^Pk6L?=_v%E!EyEv z=3LK?^&X1zYO-@rj|3FnF#f0AHs=J!5=oEpfYq|mVBWN!*Jzg0c2CZ`Hs0LKu(kA_ zA3GiZ7Kpck5<6N)YCh71t$xu}Hr?z+B>KYe<7YB(EIXknjmsY$E2DKI7Pu>Fjbu#F z-YJnPD~LiXf{QhbIU!VtpZHsXMVrIYh#lDNc|PdMKD7L(Cn8+#sxMBIDmLBiT*X_X zN=n@G|2A@qr^LHiFIlVM*nU;DXz^7r_7}VG066op3I|Kc_0UpI?mBU<}d&u#0Sh4MMu zMy8pI0Rb&jAG>y%gWk)e&Ad@A!_%~=neNJWMBRqf?OEK_WJ@*|r0r1raUVdIPxdUN z(~U)|YhUqJ@0QnwKC4VTRU6o$(?-wP;3NyPR&2@q|8Bi+h6IY%6_}%xqetSMZ0!mH?Xt2`gQ*!Ku7NW zZh=p&d-IZxt13t7g%bN6DnnlQ(F(}wBHSIS5jk%5%ME4DoE3p*J*x~60jwXA39D_; zByv(*x)92e+1PTo@*|;b*61e#`PsD1Z3QpPnq-n=#ymyP#@xa%F$A=L``0&Awf~`T zLd58$q?N)DdDB~Z?T+?R)bORb<)Qpva@H|V+zU8>#DO?7<|clD1 z-7563rr$x-Zp2FNY5SDDq>Y(fd4L<=rjbHYYW=P;jND}@g^RZloD5s2>Rn@=J`GDi zwB?UriIupDh}i?WJCqKFt_Eg0`;$R(psM5SOl$%S;UwO@n5c2P6cKuPGv@0}Ma7NR z6+~%wz8z@rG`aO!Iw-uj&_A%W3ineD!S9#RdnotIha)omZO%K#dD6eo*QtVkdq9by zXniIPU$4wK4qK%2(@>5VJ;ys-<5Z$!(FZw z4$Wd<=!WjF--b6?$W_-#7HfA*s>$(oWoe1QVVz(QIrR{053f2jh*uD7Q zug{IzkxXgf+yk}5nMrLE>lTS~fNM zx>iZmOh(i{?n&aFx8e)gDqHIv9qG}9X8m7RX^+WOw-A{oE!0C{DSEP8_j8#>UBV@l zf6hp4d)Tm}KXg2v3AWm6`=)L0NFDU8nc?on6hX>&KReqfh%0HPYdPm51j`oe1Ty1#F_B{f`5Gf*Vn-NVhcIiH-4jC)igKUTGGaVEiT<1GDarz!O# zhOfpU60Oy@a0D|4k?f!0+01dEOZu5gAO2uRWHYX$PHJ$>CE~NVf`vD5G|gC9=qb*Q zUV&wgXDJr9EUAlZadrOrC7~@X&J#Pb?0k^y_?UletR$to{9xIo49rAS>>t&Ojdv%KVvF&+;7hB;z&e5Oiq59{y#m0yGa`X(e$BfFU zP2aOGO)vHsYPWCJl$ee+N>d(Ir^-OW#R<2ymYR}eD?Qm`7hV7_VzI!cWbLzbIV_+J ztgg!~I2YU0RfcUEf^g9NR9z5Z5C4(a{Tau0m1O!*qM~<{bwq{K$37an-x;84t%@%9 zk2#}$k;Zy-dtavkNSaQ1f$DRU>Fwyxw!wT!2TyAiU*hHRwHpOjXXCCttCd`^)iLN; zmD8wc_Bis61k*n}F>G+WGL2fWo95@QRGTT>GZ+0}h_!2TvE}vO?f%F3S9{}b*nRUQ z{fij-p-|ZO`jYmk@Ev!V2C5UduNHEKgV(<7qh4ExuXV9mDIiu=A4t~aS4}t6eCC_X z5W!09GsF4&@jvZ}Pl|-&h!yxmnsZnSOW77k*wtIz-)L6iruE=GDJzdYQ~Zve&fh*o zWb_gc{edz4KSZhT!Az=4Y{Px*9Q>>ExCZ08F)|)aa1aF$XcRNY_7nKT@|(7v@v+&x z`c7nvM1iP~=F$l~$(Wj5w;B_D!-l8VB2y2^UTN@~ zWJ!KTId-?KyLssMCRqYt7|?Nz(LVo{oJs)Mb>6 zenAy1zA{)v%~ii&_T2KMe11~g6ebg)-mh%MuiZT&3Q#CXM%x{v)+rAXY!SgPsfkso zt8gjY#houb?K&MEx|x=1XS;G^rS!b&j33H!%z5@8MRrWCW@I5jPYW;)kG?}PDP{&s z8RAzizm~TT6cg#+tY7$Y%t1p&bh933#w`j;IY84Y?^}7_lB(rB|i~Fe? zf#B#1#uhW%C<}(h4G$*w!;V8U?VRb4I>MQ#@THNoD0n_rmdBkMA3P0WRfxg>ww2eU zAQOxO2u>Mc8!r;sQS+qqEO{7%hD9j+RK6o(zwTG5?XI#Qfo!Ghu4E-YE9sMmq1*hb zy(-4Fze!$@UHqX;iiMxbwgXK6YaZEP{g`4kP)}XqmRYQ>|E{+0j&})MQJt&oaalYc z1WyZBH`r6uBf;!Wn*P7U!PoXeY+7m2Qab_)jIK6de5==_6Fzx%fM55s2T z6~y?yP;}4N`>4{l!;hsCgTlElpS_akgJ*tL3LSh3k_hqgJ9lVD36xG}*=H=9+d953B@#$@62YaZKK z9mAh3&lT31JPKeFTvm`!4cCYj*fC|rL*;i^a<5>d!B09#O?JSIQ*+xvi7WR^k~2$P zJ^xtr-pz(wW@qi-Nmk%~-8bw^gFjcV^I{cb@U^*{d%w*Re+(j@gSs5? z*CaQCb#apjCbuu-i%vzs@z>m{kAZkb+7(VnumQ~tRC$Z;upr-JvbLh^04<>Z5e_Uf zQQ5J8w#>(2p5V=yQ>mU5PJ~|EcG}sjE}TD(70muiJ)9%rzNP9A4cYg|m@!pNu(Ig*hkisFn$-n~ARv6>q%& zn-Yf%RrrF;# z_T!`qBd{O}_^|#i?W=IES^d}qC^iXsEbKA)!qFw|mjRQA!;)Y^oJE>$G?-(;?j-@o z4aQjF^8MA=w>8?cg6_UYVlrqm97n8m@nwny&&cZ9D@F$6wctTRm%1+|#65MF7>oy> zm#JUiufye9v=CEFwbl7O%*hNqXu7s1A^J57uM5Jcv(;j%rJ~ww^v+|Ebury%!)ET4 zp9n?plaZJ=i@QZV>Qj3~VR-|Mzt;AHH+Z?6J#1AeKON;W2pujlFd`r0XDdND%OJyjF z1iyMA>I;VjnI#GpodoBAAd9rZ@lFot?`5`A_tR0En-xm(e8m|p}bOkY77?NDf;MT#8!3kwYsOR~n7KwVh!t5h9W-OUXpuaL2C%-2%5h7a$j2&WsWdM!iCe`yC|;<{q?i520NuN z4I?4n8~u<7rlLJ6a|7`i5UeHmiO>9Knsc$PfFRk0CJ9StyNXG zn88S4c}t%%Tug*ShpGiLNdwGe#Th$H9(~c3(?hy$kjrmxWGDb)q0~MnoudU(L@uV@Q zkQ?1=E{VDXz#o&6{XWXNpVy(%-5$a<9zAVOze#HH2OpNBB7ZY^VOsE$WEc3vOl_b1 ug8p}kimWrh7B(Kb@Be@QB>ukn!Kv20iBDO72cRDWa>mu`bk)fV*Z(K3JpsS~ literal 0 HcmV?d00001 diff --git a/Source/Docs/images/mosa-demo-coolworld-graphical.png b/Source/Docs/images/mosa-demo-coolworld-graphical.png new file mode 100644 index 0000000000000000000000000000000000000000..cba65a3c5849d425cb822d078b5153dd7e21439f GIT binary patch literal 22352 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%0AU}Afnhqex6REjA zryHWfE}AXTZgTd%Iy84sbFT5EMb9W9A!!HX;}>Y4fGeX5rO|#*C+<0gw9#Nrah+vn zVzpCP(IITbW)aNB7Midnd5rAEw!=+#Myk=ggBhO`&%+LxKP#Buir6Y55J%_*SZH77 zmTvMj(g}m{8nuinhMUd{-Bf{ZFUV2bO2vWO6Y{jz+(r0;G1&T!W-mOczEw%D3S#`f z%Ae$F)(D2$eQ+y;O7;KJ3}HJ`eG*y*Y%v4Az$OtL`KN`edyu~?{$F=fQE&Ecd6SUr zFwkgY{i}uoaS?pFaq%1x#k;(=Uj=-K_0|2mcgyCVy4>538RRjRE`LrQAD&OoBg?B? zhn4m7@>dlfh2(SWz$z<{rJ;mhOAFTj`h$1riJ^D?=r5;6l%|_t({leDkl=s5XsCm! zZf&}~LN1^RcP}y~Frbg@ZqN9o%n0@5(S<#-<8M>?jyi5eG@2xjMHFIt4h3**YFGod z9LA8l5EjTx^}0}MaGXPSK*2OCnfx&v(=?o$`F{%sVA;I|g;|#jSxc$Qa}b!GM3U5n zTP!x12_0&EBj3oMKV&Y?xr#qyQ3+~YO~q4HI65qLAl6=F%HqF{t+N?#*5>iNp|<2PhD0Ztski8Y94|NcQskbc;71l zXoJ$w3SQaThe!XB=)XjhZ6BchLYNIX_a{>4F!gy%D5ELNSWZmywApH}+j7KP z#&DCH_a_XTKiII&sttW#Jisv!G?CAPY7r#k^*<)nZ`PphbSk6aS(YzT=8)%+h&Ghg z9Ss}PS~1ELeB17p0O~m#sGLt4{l7%dmPFq_o;SDf0ymPNrUwN!FMdAD=|65wlYH~r zDykE_p4UMG(e4W>r@SH?k5>+PUuJVND!|ukVP#9U;G5c}iM7-@#mCFZQ|(pATWsKO zbIm=${fGW-`ULr>kCvyMKx+>@J(FLBuzF&=tbqG!(5zz0Z(gqGQC-jCXm0A*uI8T# zfIuFMTuS(ueQZ3;LGY;Oa796$({a)0!Pe)uY&Ze8L80L6d*G8q)OR<3>de&6ZY&sb z*XP_oPsU&4W`U+T2ETYzpov7|fi%Es7yHdEfz_{`gNF6alh<)f&`t-sq5w(sSNU|R z&R??(E3fC(#2DA2>!WvNyG&ORBj%UtqvODDIxm^Kml}H0*YQ;h6Yu;P6GKp9i?aYk zraN#um*xjbEnx<{{f}`&DMpTqOaUY2z7|>4$Kuw4yX>nP$ySfmpn?hrCV3swFek`&jo{~A=^_YNJy5UrMhGT(75Nkt1czM7fq}ay(kjVwf68zc8dQOcH0r(X*C1;B_1&R+54g0v zfz28@O$Z|?5ukxx)&*M76n-Tx53W+JuCv>#&m@m(VCsV<_irKfnte8_5QiQQv2w6^ zPIo$s81~rPMNv)%P6wlBB+mzqo+5&cRX#WrW4`2EYy;fr-Pk0=oMK>Rt+Ww|-2dv5 z4GT57pb+&Jzv=c*%;@QZ^$+34rL!jZp4ffa4y(IyqnEg;wc(GG zb8@uss=0=l7OFM(945jR5vJdnxCAO4nLjItx^Tq9vbYFu*Q#+KwhOVk?AzF+N@!F& z?dK&Ucqb>8Xs76!TIr{N9t6uRV=~2Lu|Veh%Oj3vg~ax~mXXtkR+ZA4Er!J6+@?My zlUrQdppQgwZRZx^lWO>0-p=~;p}e&B=g~F;;w??LZ=$L05E=4Cm9H#yT^?F`ijfz~BCt)QoHU zSOVKeS$iW%2SK(sXY2n3Kn?}vBDI9y#+&(72%zoQlzhqEfJsB0`x=&vPdnSGmxxCM z2DamApdO1%npfZO>d7CH`RDxH5TQx;dc|N_hi{nCyrv(uncMm9zFxLc*O7WUJo<*3 z3H4Itbq=mio=x(4MW1|L8+D;yGQFi$FT6thJ2hq+_Ix(NW&wQ-X}F*8uQx+T^Ww0a zipo;&^ok_bWRm}dJVyD_(lh>n$IDrB(N3Wm93OS;6JWnllc=E89o3L|WJxiAGEgC% z1dnT^>Acxv?0F1A)=>`{%r~@9RxarEMh%}Fldv&L6UbGkW4hiYnWotLS!4o`J^}g! zG;6vLSXRe)eWBg7wss|Ygt2I^m_%n7iLBz)xHxqwO(US@{?|MDrz6EqK#ub@;vh0 zphDU~b3+lM+9VLgn>>5Zl+!1Ce5Dx_1$8QJ?s8mSd896R!>ZLb&q%r2^YAJjG(G_{ z6o1#7&9fQDaqGVAJS_JOa_rGbXWga*fUFf6(dbd$W3~UZVZ%{{c2&=AoR5BP8pp2X zpup`a*DnV|s9FmIzV z1I`=SA-uP(?_<;^)}y-eYHQ+%X1{pJ{By(*E8)N+R_k^rKp#TgvS{BqCDc^=!FEJ* zoj+wkEhD(5aajA5CLvKbCBTugRQo9NpM*B%4T9YH>b?dPkeSQ91*c4XuAt&(pclQ; zHLnx}51YRl3^Q@jE*{84tDDOY6KBo2!IFr{DpulNfHkM@d1sC_Vz3&gKuyW@!jsCr zB}Xt!7lLytNDY5p=qHH~BFKQmA;{`bW!ysi+$R<8b|Q1YmsM*o3@bI!thDq90I4p> zV6U+Kxk!Ev_|pn+ztczM#3$wHpk7l4Ab%K>X1RqbLs_33N)=heR%+ay6;^4Wg&EsA zh(R+V%ly6cZv_!llgg^_TLs=NB-$z$fi9d>qlMo3oWoTwHNqnQwl+ooM=xvA&8m@H z-P>$d#+}|s@(4NU7<{393~{0~DWKgr$0mVnF#0#f6#N&)(7;9)zo_fLKJ|d<7McYK zHM(lZT0J(9SLn4OTS}oR8Q7CWnhAc*}htecsc)=L%cp0NEf@0H5qK3OH}AwJ`KcJFK2}BB4cmn<#3o+}*WZ z<9>z9N?a3UJ|WbZ*7O+B?HIC)$JyVzG$1fe-zqK?%|?4B6=akQO%JdlD`L9Y1nPX* zVXQoFPi!Y4ht;IJ>-u!go%yT{+NdyUx7+l@|7zsSqnbR^HlC^T+0Ilc)sBi`nIaXf zf~FM$5<*Ww5K-_03z(EBL=h5VkP!A@7Y~96nScug0|yiVfyA&R4QpF5QP#?m6`?a2 zB7~&@5~>vZ?l)*VozBep{vx~(k`vzhd9M4qe)lsei28-uTQikC1b};)uHLkXXhWloCb!Fk` zzd%t{vWrVQ)y=`ZEreC~y26>h z-fygqb#?CW>7_cdC~iyu9#?r=jQWZ=z#?EKmF+%)X4s7m;u1*Zxc3+u!F)F5YDGgr zu$}N7vUHfTz7?`#hs|R-QXc)*o;?U{|4o|`*gfNgMMyTUhc+z`|%^TVMNH+KUm4r{dXhQnLszr1MGII=!u-%}aG3qHh7j z9wk4vVEvAigvQsTe;EL$Ae2Llmi;cdIF(C8OtoXLV#Y{t$gi<>$M8P&XmUq_McaE? zP#^Cb$eIXSa_(K|9BU`enOW(M8eO9r3HR*4{;1&xV^Fbq2#@Oi=*h?phN0QqVtx?& zykAc`@5I4mU+!}ElG9Ek7d7|g?JHhjz1fHp1}ufD=SsJj#6_Pi|JzdPsrAW@0n^l) zVa1^_ees)O94dALps^cg*E7sK{au{OF}k=3FAjOWF>ouxube3(AJlm6izFo+k>C<# zPmgMyyeFJo3@q{+>P6m=gb_G`Mg27bHlcBRc!Q)sJ+VJMCObd8mjCUB*+y|j&hA+> zD)v-G$=u($mfw@2xzpocua&MyLb>dd0#On<-5TyQ zV!kbTYEf9D#GZ5Lm#g6ash!CBwT#Q9yKH|c<1k@Nktn1590<(h+jT6ZfGE~0aGZj` z6GGb5F!QXMZPho}b_irbI_YpUZlsA2q#b#GEy_O+W+$oi3{q-CZyo04{!4nCM_K;W z45=YFs!6-Fga4pR+ZJKO;H=d`qtpubw`6tGuCAAKDC&YK*>^Ns24;p1D8^!3L#_v9 zb5)N0jzD6)iCT)PSmk389|X*gUqHd%HV)2s&As%Fya(g-GpRO)eVggKZPVMG6CnGU z3iV15^)jOLZxfc9*0S1{<;I##y7~)Y?rS+t-FgzycI7A9l%k;Wy?NYI|Tqnbb1~WBcWE>q;3)%cjx58=6MB#B!pmT1366 z+W_dyjOJhq-l@p1!^SU~^uM6ta-ZJF8!l*txcW4|UEHm_&Mnb2rs~Mjr$h4M&5i$B zWwnr%-mD(|Vc>d>#UZxVeB`dYp|^IWW z-@4YI?7u~N>5;wKy-zOG`!RCp>vc8Kzja=W>Ta1Tyy9%J^yH|vu}^~Y&>lng`6iD- z|BI;cEBTX!T7ir?V=5W^+q62W@4Gc)`)#oHhcoIGQAN&-bRl z|8}rrR)=@QwLo+>wBz;g?zEGVJDR%b#yEcmp3Je%B7X@V23HcBxuIjLw!cq; z9)p;WRm$t}b*A1n0N{5RMa#MTL%|3_i zFxjDq;wC9q7`FV@wDhu~R~okamSirlk8QKJFREyGR!3{%AGAgXb>_E;G)|YgyNCf@ z<9gX%0c~XeRmsNic?G_83x5yDz`k#DnUmzdYvAL|>R5Lba;7@nEu}EfdXKkuVGii- zUFgN5a{sSMskeHsHNHy|-l#_INf=LTX&}5s};=t!&CRF;$Ns zg9$zB#1Bqh5RjCGsU+JXaU2ESgrW}4#(>HC=YgM|nsG|t32QWywQZv%@|`fnu@4Z- zM95y4&r^G<(Pi;z@gJ5>toKw|BJtrZLqEBoIe?R5Q*Ox3JiDX9coT-sKk%W=_!0lX z{4=mUMKn(<43mK|{A5Y@bi3HU-4AZgL|PU`@y!2m_Yo_GP7gEE$hb)<8nVLDM`*bd z2$*ijSneiNE06M-L2jGfL)_@in;fu1&WoYQAg4uuU8IeJD?jiA0^OP^Wf_DLbB4Y2 z;Nh&1zfJ-Kqp6y(>VG1nUYeAc7;9w80b+7z_;ZN*hx-(FZ2G6b=CfTd z^*$>0ppa)edm)qjUy$rCpnohlbRH+qYd7#cF72+kFHN7Oq=PsKtw6w*`beqj{&vP> z!Of|Rv?_qoPDDEYwt^E4qhWR6oD+$Kg1oY z#x+M`XW%71I~eX+%NHWt`j2Ad+zoi}QMW83WfVKW@>st40{NXv*fgVBzY?~8RN21h z+~!G+=jIwB;)~mCR{pe|GdArKj~oGGHXzAp8j|eEtN7$_V78SCRGrrtT#wxXttWg% znTre;!}jh;b<4b1Jq+J3eYpx*{_*iZ@v|Gx--9Ybp&VB~-HkuLxW3nIu=z^!0pzOh M0e>&v$0xt|KO7N!Bme*a diff --git a/Source/Docs/images/mosa-demo-starter.png b/Source/Docs/images/mosa-demo-starter.png index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0f038f9bf3a79c7a4e7f135e49e2e5790b81f2a6 100644 GIT binary patch literal 14631 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 N(^=OujMEo?{a@|7j^zLV literal 0 HcmV?d00001 diff --git a/Source/Docs/images/mosa-demo-testworld.png b/Source/Docs/images/mosa-demo-testworld.png index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..4daeabda09ef09046685e7411c136c20b29bc33c 100644 GIT binary patch literal 20404 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 YSl*-k&0&Gk)Gm-JPgg&ebxsLQ0KTh8-2eap literal 0 HcmV?d00001 diff --git a/Source/Mosa.BareMetal.CoolWorld/Boot.cs b/Source/Mosa.BareMetal.CoolWorld/Boot.cs deleted file mode 100644 index a9be886f3b..0000000000 --- a/Source/Mosa.BareMetal.CoolWorld/Boot.cs +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright (c) MOSA Project. Licensed under the New BSD License. - -using Mosa.Kernel.BareMetal; -using Mosa.Runtime.Plug; - -namespace Mosa.BareMetal.CoolWorld; - -internal class Boot -{ - [Plug("Mosa.Runtime.StartUp::BootOptions")] - public static void SetBootOptions() - { - BootSettings.EnableDebugOutput = true; - } -} diff --git a/Source/Mosa.BareMetal.HelloWorld/AppManager.cs b/Source/Mosa.BareMetal.CoolWorld/Console/AppManager.cs similarity index 86% rename from Source/Mosa.BareMetal.HelloWorld/AppManager.cs rename to Source/Mosa.BareMetal.CoolWorld/Console/AppManager.cs index 54baf279ca..2c8b1828f6 100644 --- a/Source/Mosa.BareMetal.HelloWorld/AppManager.cs +++ b/Source/Mosa.BareMetal.CoolWorld/Console/AppManager.cs @@ -1,8 +1,8 @@ // Copyright (c) MOSA Project. Licensed under the New BSD License. -using Mosa.BareMetal.HelloWorld.Apps; +using Mosa.BareMetal.CoolWorld.Console.Apps; -namespace Mosa.BareMetal.HelloWorld; +namespace Mosa.BareMetal.CoolWorld.Console; public static class AppManager { diff --git a/Source/Mosa.BareMetal.CoolWorld/Console/Apps/BootInfo.cs b/Source/Mosa.BareMetal.CoolWorld/Console/Apps/BootInfo.cs new file mode 100644 index 0000000000..6f03ea0aa7 --- /dev/null +++ b/Source/Mosa.BareMetal.CoolWorld/Console/Apps/BootInfo.cs @@ -0,0 +1,50 @@ +// Copyright (c) MOSA Project. Licensed under the New BSD License. + +using System.Text; +using Mosa.Kernel.BareMetal; +using Mosa.Runtime; + +namespace Mosa.BareMetal.CoolWorld.Console.Apps; + +public class BootInfo : IApp +{ + public string Name => "BootInfo"; + + public string Description => "Shows Multiboot v2 information."; + + public void Execute() + { + System.Console.WriteLine("Command line : " + NullTermString(Multiboot.V2.CommandLine)); + System.Console.WriteLine("Bootloader name : " + NullTermString(Multiboot.V2.BootloaderName)); + System.Console.WriteLine("Memory lower : " + Multiboot.V2.MemoryLower / 1024 + " MiB"); + System.Console.WriteLine("Memory upper : " + Multiboot.V2.MemoryUpper / 1024 + " MiB"); + System.Console.WriteLine("Memory map entries : " + Multiboot.V2.MemoryMapEntries); + System.Console.WriteLine("Framebuffer available : " + !Multiboot.V2.FrameBuffer.IsNull); + + if (!Multiboot.V2.FrameBuffer.IsNull) + { + System.Console.WriteLine("Framebuffer resolution : " + Multiboot.V2.FrameBufferWidth + "x" + Multiboot.V2.FrameBufferHeight); + } + + System.Console.WriteLine("RSDPv1 version : " + !Multiboot.V2.RSDPv1.IsNull); + System.Console.WriteLine("RSDPv2 version : " + !Multiboot.V2.RSDPv2.IsNull); + } + + private readonly StringBuilder Builder = new(); + + private string NullTermString(Pointer pointer) + { + Builder.Clear(); + + var i = 0; + byte b; + + do + { + b = pointer.Load8(i++); + Builder.Append((char)b); + } while (b != 0); + + return Builder.ToString(); + } +} diff --git a/Source/Mosa.BareMetal.HelloWorld/Apps/Clear.cs b/Source/Mosa.BareMetal.CoolWorld/Console/Apps/Clear.cs similarity index 73% rename from Source/Mosa.BareMetal.HelloWorld/Apps/Clear.cs rename to Source/Mosa.BareMetal.CoolWorld/Console/Apps/Clear.cs index aa115fd734..4f9bc83fbb 100644 --- a/Source/Mosa.BareMetal.HelloWorld/Apps/Clear.cs +++ b/Source/Mosa.BareMetal.CoolWorld/Console/Apps/Clear.cs @@ -1,8 +1,6 @@ // Copyright (c) MOSA Project. Licensed under the New BSD License. -using System; - -namespace Mosa.BareMetal.HelloWorld.Apps; +namespace Mosa.BareMetal.CoolWorld.Console.Apps; public class Clear : IApp { @@ -12,6 +10,6 @@ public class Clear : IApp public void Execute() { - Console.Clear(); + System.Console.Clear(); } } diff --git a/Source/Mosa.BareMetal.CoolWorld/Console/Apps/Credits.cs b/Source/Mosa.BareMetal.CoolWorld/Console/Apps/Credits.cs new file mode 100644 index 0000000000..ce8176de00 --- /dev/null +++ b/Source/Mosa.BareMetal.CoolWorld/Console/Apps/Credits.cs @@ -0,0 +1,28 @@ +// Copyright (c) MOSA Project. Licensed under the New BSD License. + +namespace Mosa.BareMetal.CoolWorld.Console.Apps; + +public class Credits : IApp +{ + public string Name => "Credits"; + + public string Description => "Shows everyone who contributed to the project."; + + public void Execute() + { + System.Console.WriteLine("*** MOSA Credits ****"); + System.Console.WriteLine(" Phil Garcia"); + System.Console.WriteLine(" Simon Wollwage"); + System.Console.WriteLine(" Michael Frohlich"); + System.Console.WriteLine(" Stefan Andres Charsley"); + System.Console.WriteLine(" Chin Ki Yuen"); + System.Console.WriteLine(" Patrick Reisert"); + System.Console.WriteLine(" Phillip Webster"); + System.Console.WriteLine(" Kevin Thompson"); + System.Console.WriteLine(" Kai P.Reisert"); + System.Console.WriteLine(" M.de Bruijn"); + System.Console.WriteLine(" Royce Mitchell III"); + System.Console.WriteLine(" Sebastian Loncar"); + System.Console.WriteLine(" AnErrupTion"); + } +} diff --git a/Source/Mosa.BareMetal.HelloWorld/Apps/Help.cs b/Source/Mosa.BareMetal.CoolWorld/Console/Apps/Help.cs similarity index 70% rename from Source/Mosa.BareMetal.HelloWorld/Apps/Help.cs rename to Source/Mosa.BareMetal.CoolWorld/Console/Apps/Help.cs index f8361dc1bb..394b81b849 100644 --- a/Source/Mosa.BareMetal.HelloWorld/Apps/Help.cs +++ b/Source/Mosa.BareMetal.CoolWorld/Console/Apps/Help.cs @@ -1,8 +1,6 @@ // Copyright (c) MOSA Project. Licensed under the New BSD License. -using System; - -namespace Mosa.BareMetal.HelloWorld.Apps; +namespace Mosa.BareMetal.CoolWorld.Console.Apps; public class Help : IApp { @@ -13,6 +11,6 @@ public class Help : IApp public void Execute() { foreach (var app in AppManager.Applications) - Console.WriteLine(app.Name + " - " + app.Description); + System.Console.WriteLine(app.Name + " - " + app.Description); } } diff --git a/Source/Mosa.BareMetal.CoolWorld/Console/Apps/Mem.cs b/Source/Mosa.BareMetal.CoolWorld/Console/Apps/Mem.cs new file mode 100644 index 0000000000..53f4e7148b --- /dev/null +++ b/Source/Mosa.BareMetal.CoolWorld/Console/Apps/Mem.cs @@ -0,0 +1,21 @@ +// Copyright (c) MOSA Project. Licensed under the New BSD License. + +using Mosa.Kernel.BareMetal; + +namespace Mosa.BareMetal.CoolWorld.Console.Apps; + +public class Mem : IApp +{ + public string Name => "Mem"; + + public string Description => "Shows memory information."; + + public void Execute() + { + System.Console.WriteLine("**** Memory ****"); + System.Console.WriteLine(" Total Pages : " + PageFrameAllocator.TotalPages); + System.Console.WriteLine(" Used Pages : " + PageFrameAllocator.UsedPages); + System.Console.WriteLine(" Page Size : " + Page.Size); + System.Console.WriteLine(" Free Memory : " + (PageFrameAllocator.TotalPages - PageFrameAllocator.UsedPages) * Page.Size / (1024 * 1024) + " MB"); + } +} diff --git a/Source/Mosa.BareMetal.HelloWorld/Apps/Reboot.cs b/Source/Mosa.BareMetal.CoolWorld/Console/Apps/Reboot.cs similarity index 72% rename from Source/Mosa.BareMetal.HelloWorld/Apps/Reboot.cs rename to Source/Mosa.BareMetal.CoolWorld/Console/Apps/Reboot.cs index d8f0e811aa..d54898aac9 100644 --- a/Source/Mosa.BareMetal.HelloWorld/Apps/Reboot.cs +++ b/Source/Mosa.BareMetal.CoolWorld/Console/Apps/Reboot.cs @@ -1,10 +1,9 @@ // Copyright (c) MOSA Project. Licensed under the New BSD License. -using System; using Mosa.DeviceSystem.HardwareAbstraction; using Mosa.DeviceSystem.Services; -namespace Mosa.BareMetal.HelloWorld.Apps; +namespace Mosa.BareMetal.CoolWorld.Console.Apps; public class Reboot : IApp { @@ -14,12 +13,12 @@ public class Reboot : IApp public void Execute() { - Console.WriteLine("Rebooting..."); + System.Console.WriteLine("Rebooting..."); var pc = Kernel.BareMetal.Kernel.ServiceManager.GetFirstService(); var success = pc.Reset(); - if (!success) Console.WriteLine("Error while trying to reboot."); + if (!success) System.Console.WriteLine("Error while trying to reboot."); for (; ; ) HAL.Yield(); } diff --git a/Source/Mosa.BareMetal.HelloWorld/Apps/Shell.cs b/Source/Mosa.BareMetal.CoolWorld/Console/Apps/Shell.cs similarity index 50% rename from Source/Mosa.BareMetal.HelloWorld/Apps/Shell.cs rename to Source/Mosa.BareMetal.CoolWorld/Console/Apps/Shell.cs index d21101fe2b..0f93521601 100644 --- a/Source/Mosa.BareMetal.HelloWorld/Apps/Shell.cs +++ b/Source/Mosa.BareMetal.CoolWorld/Console/Apps/Shell.cs @@ -1,8 +1,6 @@ // Copyright (c) MOSA Project. Licensed under the New BSD License. -using System; - -namespace Mosa.BareMetal.HelloWorld.Apps; +namespace Mosa.BareMetal.CoolWorld.Console.Apps; public class Shell : IApp { @@ -12,22 +10,22 @@ public class Shell : IApp public void Execute() { - Console.WriteLine(); - Console.WriteLine("MOSA Shell v2.4"); - Console.WriteLine("Enter \"quit\" to exit the shell."); + System.Console.WriteLine(); + System.Console.WriteLine("MOSA Shell v2.4"); + System.Console.WriteLine("Enter \"quit\" to exit the shell."); while (true) { - Console.Write("> "); + System.Console.Write("> "); - var cmd = Console.ReadLine(); + var cmd = System.Console.ReadLine(); if (cmd == "quit") break; if (!AppManager.Execute(cmd)) { - Console.WriteLine("Unknown command: " + cmd); + System.Console.WriteLine("Unknown command: " + cmd); } } } diff --git a/Source/Mosa.BareMetal.CoolWorld/Console/Apps/ShowDisks.cs b/Source/Mosa.BareMetal.CoolWorld/Console/Apps/ShowDisks.cs new file mode 100644 index 0000000000..3176f261b6 --- /dev/null +++ b/Source/Mosa.BareMetal.CoolWorld/Console/Apps/ShowDisks.cs @@ -0,0 +1,43 @@ +// Copyright (c) MOSA Project. Licensed under the New BSD License. + +using System; +using Mosa.DeviceSystem.Disks; + +namespace Mosa.BareMetal.CoolWorld.Console.Apps; + +public class ShowDisks : IApp +{ + public string Name => "ShowDisks"; + + public string Description => "Shows information about disk controllers and disks."; + + public void Execute() + { + System.Console.Write("> Probing for disk controllers..."); + var diskControllers = ConsoleMode.DeviceService.GetDevices(); + System.Console.WriteLine("[Completed: " + diskControllers.Count + " found]"); + + foreach (var device in diskControllers) + { + System.Console.Write(" "); + ConsoleMode.Bullet(ConsoleColor.Yellow); + System.Console.Write(" "); + ConsoleMode.InBrackets(device.Name, ConsoleColor.White, ConsoleColor.Green); + System.Console.WriteLine(); + } + + System.Console.Write("> Probing for disks..."); + var disks = ConsoleMode.DeviceService.GetDevices(); + System.Console.WriteLine("[Completed: " + disks.Count + " found]"); + + foreach (var disk in disks) + { + System.Console.Write(" "); + ConsoleMode.Bullet(ConsoleColor.Yellow); + System.Console.Write(" "); + ConsoleMode.InBrackets(disk.Name, ConsoleColor.White, ConsoleColor.Green); + System.Console.Write(" " + (disk.DeviceDriver as IDiskDevice).TotalBlocks + " blocks"); + System.Console.WriteLine(); + } + } +} diff --git a/Source/Mosa.BareMetal.CoolWorld/Console/Apps/ShowFS.cs b/Source/Mosa.BareMetal.CoolWorld/Console/Apps/ShowFS.cs new file mode 100644 index 0000000000..791a92dad9 --- /dev/null +++ b/Source/Mosa.BareMetal.CoolWorld/Console/Apps/ShowFS.cs @@ -0,0 +1,63 @@ +// Copyright (c) MOSA Project. Licensed under the New BSD License. + +using System; +using Mosa.DeviceSystem.Disks; +using Mosa.FileSystem.FAT; + +namespace Mosa.BareMetal.CoolWorld.Console.Apps; + +public class ShowFS : IApp +{ + public string Name => "ShowFS"; + + public string Description => "Shows information about partitions and file systems."; + + public void Execute() + { + System.Console.Write("> Finding partitions..."); + var partitions = ConsoleMode.DeviceService.GetDevices(); + System.Console.WriteLine("[Completed: " + partitions.Count + " found]"); + + foreach (var partition in partitions) + { + System.Console.Write(" "); + ConsoleMode.Bullet(ConsoleColor.Yellow); + System.Console.Write(" "); + ConsoleMode.InBrackets(partition.Name, ConsoleColor.White, ConsoleColor.Green); + System.Console.Write(" " + (partition.DeviceDriver as IPartitionDevice).BlockCount + " blocks"); + System.Console.WriteLine(); + } + + System.Console.Write("> Finding file systems..."); + + foreach (var partition in partitions) + { + var fat = new FatFileSystem(partition.DeviceDriver as IPartitionDevice); + if (!fat.IsValid) continue; + + System.Console.WriteLine("Found a FAT file system!"); + + var location = fat.FindEntry("TEST.TXT"); + if (!location.IsValid) continue; + + System.Console.Write("Found test file!"); + + var testStream = new FatFileStream(fat, location); + + System.Console.WriteLine(" - Length: " + (uint)testStream.Length + " bytes"); + System.Console.Write("Reading File: "); + + for (; ; ) + { + var i = testStream.ReadByte(); + + if (i < 0) + break; + + System.Console.Write((char)i); + } + + System.Console.WriteLine(); + } + } +} diff --git a/Source/Mosa.BareMetal.CoolWorld/Console/Apps/ShowISA.cs b/Source/Mosa.BareMetal.CoolWorld/Console/Apps/ShowISA.cs new file mode 100644 index 0000000000..bfbf78839a --- /dev/null +++ b/Source/Mosa.BareMetal.CoolWorld/Console/Apps/ShowISA.cs @@ -0,0 +1,30 @@ +// Copyright (c) MOSA Project. Licensed under the New BSD License. + +using System; +using Mosa.DeviceSystem.Framework; + +namespace Mosa.BareMetal.CoolWorld.Console.Apps; + +public class ShowISA : IApp +{ + public string Name => "ShowISA"; + + public string Description => "Shows information about ISA devices."; + + public void Execute() + { + System.Console.Write("> Probing for ISA devices..."); + + var isaDevices = ConsoleMode.DeviceService.GetAllDevices(DeviceBusType.ISA); + System.Console.WriteLine("[Completed: " + isaDevices.Count + " found]"); + + foreach (var device in isaDevices) + { + System.Console.Write(" "); + ConsoleMode.Bullet(ConsoleColor.Yellow); + System.Console.Write(" "); + ConsoleMode.InBrackets(device.Name, ConsoleColor.White, ConsoleColor.Green); + System.Console.WriteLine(); + } + } +} diff --git a/Source/Mosa.BareMetal.CoolWorld/Console/Apps/ShowPCI.cs b/Source/Mosa.BareMetal.CoolWorld/Console/Apps/ShowPCI.cs new file mode 100644 index 0000000000..af94a22de0 --- /dev/null +++ b/Source/Mosa.BareMetal.CoolWorld/Console/Apps/ShowPCI.cs @@ -0,0 +1,34 @@ +// Copyright (c) MOSA Project. Licensed under the New BSD License. + +using System; +using Mosa.DeviceSystem.Framework; +using Mosa.DeviceSystem.PCI; + +namespace Mosa.BareMetal.CoolWorld.Console.Apps; + +public class ShowPCI : IApp +{ + public string Name => "ShowPCI"; + + public string Description => "Shows information about PCI devices."; + + public void Execute() + { + System.Console.Write("> Probing for PCI devices..."); + var devices = ConsoleMode.DeviceService.GetAllDevices(DeviceBusType.PCI); + System.Console.WriteLine("[Completed: " + devices.Count + " found]"); + + foreach (var device in devices) + { + System.Console.Write(" "); + ConsoleMode.Bullet(ConsoleColor.Yellow); + System.Console.Write(" "); + + var pciDevice = (PCIDeviceConfiguration)device.Configuration; + var name = device.DeviceDriverRegistryEntry == null ? "UnknownPCIDevice" : device.Name; + + ConsoleMode.InBrackets(pciDevice.Name + ": " + name + " " + pciDevice.VendorID.ToString("x") + ":" + pciDevice.DeviceID.ToString("x") + " " + pciDevice.SubSystemID.ToString("x") + ":" + pciDevice.SubSystemVendorID.ToString("x") + " (" + pciDevice.ClassCode.ToString("x") + ":" + pciDevice.SubClassCode.ToString("x") + ":" + pciDevice.ProgIF.ToString("x") + ":" + pciDevice.RevisionID.ToString("x") + ")", ConsoleColor.White, ConsoleColor.Green); + System.Console.WriteLine(); + } + } +} diff --git a/Source/Mosa.BareMetal.HelloWorld/Apps/Shutdown.cs b/Source/Mosa.BareMetal.CoolWorld/Console/Apps/Shutdown.cs similarity index 81% rename from Source/Mosa.BareMetal.HelloWorld/Apps/Shutdown.cs rename to Source/Mosa.BareMetal.CoolWorld/Console/Apps/Shutdown.cs index 0d12503816..dd006bc4d5 100644 --- a/Source/Mosa.BareMetal.HelloWorld/Apps/Shutdown.cs +++ b/Source/Mosa.BareMetal.CoolWorld/Console/Apps/Shutdown.cs @@ -1,10 +1,9 @@ // Copyright (c) MOSA Project. Licensed under the New BSD License. -using System; using Mosa.DeviceSystem.HardwareAbstraction; using Mosa.DeviceSystem.Services; -namespace Mosa.BareMetal.HelloWorld.Apps; +namespace Mosa.BareMetal.CoolWorld.Console.Apps; public class Shutdown : IApp { @@ -14,7 +13,7 @@ public class Shutdown : IApp public void Execute() { - Console.WriteLine("Shutting down..."); + System.Console.WriteLine("Shutting down..."); var pc = Kernel.BareMetal.Kernel.ServiceManager.GetFirstService(); pc.Shutdown(); diff --git a/Source/Mosa.BareMetal.HelloWorld/Apps/Time.cs b/Source/Mosa.BareMetal.CoolWorld/Console/Apps/Time.cs similarity index 83% rename from Source/Mosa.BareMetal.HelloWorld/Apps/Time.cs rename to Source/Mosa.BareMetal.CoolWorld/Console/Apps/Time.cs index 3329bb08f1..95e9e37fe5 100644 --- a/Source/Mosa.BareMetal.HelloWorld/Apps/Time.cs +++ b/Source/Mosa.BareMetal.CoolWorld/Console/Apps/Time.cs @@ -1,9 +1,8 @@ // Copyright (c) MOSA Project. Licensed under the New BSD License. -using System; using Mosa.Kernel.BareMetal; -namespace Mosa.BareMetal.HelloWorld.Apps; +namespace Mosa.BareMetal.CoolWorld.Console.Apps; public class Time : IApp { @@ -15,8 +14,8 @@ public void Execute() { var time = Platform.GetTime(); - Console.WriteLine("DD/MM/YYYY HH:MM:SS"); - Console.WriteLine( + System.Console.WriteLine("DD/MM/YYYY HH:MM:SS"); + System.Console.WriteLine( (time.Day < 10 ? "0" + time.Day : time.Day) + "/" + (time.Month < 10 ? "0" + time.Month : time.Month) diff --git a/Source/Mosa.BareMetal.CoolWorld/Console/ConsoleMode.cs b/Source/Mosa.BareMetal.CoolWorld/Console/ConsoleMode.cs new file mode 100644 index 0000000000..5d0dc72cf5 --- /dev/null +++ b/Source/Mosa.BareMetal.CoolWorld/Console/ConsoleMode.cs @@ -0,0 +1,61 @@ +// Copyright (c) MOSA Project. Licensed under the New BSD License. + +using System; +using Mosa.DeviceSystem.HardwareAbstraction; +using Mosa.DeviceSystem.Services; +using Mosa.Kernel.BareMetal; +using Mosa.Runtime.Plug; + +namespace Mosa.BareMetal.CoolWorld.Console; + +public static class ConsoleMode +{ + public static DeviceService DeviceService { get; private set; } + + public static void Initialize() + { + Debug.WriteLine("ConsoleMode::Initialize()"); + + DeviceService = Kernel.BareMetal.Kernel.ServiceManager.GetFirstService(); + + System.Console.BackgroundColor = ConsoleColor.Black; + System.Console.ForegroundColor = ConsoleColor.White; + System.Console.Clear(); + + AppManager.Execute("ShowISA"); + AppManager.Execute("ShowPCI"); + AppManager.Execute("ShowDisks"); + AppManager.Execute("ShowFS"); + AppManager.Execute("Shell"); + + System.Console.WriteLine("User has decided to exit out of shell."); + System.Console.WriteLine("Shutting down..."); + + var pcService = Kernel.BareMetal.Kernel.ServiceManager.GetFirstService(); + var success = pcService.Shutdown(); + + if (!success) System.Console.WriteLine("Error while trying to shut down."); + + for (; ; ) HAL.Yield(); + } + + public static void InBrackets(string message, ConsoleColor outerColor, ConsoleColor innerColor) + { + var restore = System.Console.ForegroundColor; + System.Console.ForegroundColor = outerColor; + System.Console.Write("["); + System.Console.ForegroundColor = innerColor; + System.Console.Write(message); + System.Console.ForegroundColor = outerColor; + System.Console.Write("]"); + System.Console.ForegroundColor = restore; + } + + public static void Bullet(ConsoleColor color) + { + var restore = System.Console.ForegroundColor; + System.Console.ForegroundColor = color; + System.Console.Write("*"); + System.Console.ForegroundColor = restore; + } +} diff --git a/Source/Mosa.BareMetal.HelloWorld/IApp.cs b/Source/Mosa.BareMetal.CoolWorld/Console/IApp.cs similarity index 78% rename from Source/Mosa.BareMetal.HelloWorld/IApp.cs rename to Source/Mosa.BareMetal.CoolWorld/Console/IApp.cs index 31c6aa98ff..b90b2c8513 100644 --- a/Source/Mosa.BareMetal.HelloWorld/IApp.cs +++ b/Source/Mosa.BareMetal.CoolWorld/Console/IApp.cs @@ -1,6 +1,6 @@ // Copyright (c) MOSA Project. Licensed under the New BSD License. -namespace Mosa.BareMetal.HelloWorld; +namespace Mosa.BareMetal.CoolWorld.Console; public interface IApp { diff --git a/Source/Mosa.BareMetal.CoolWorld/Apps/Paint.cs b/Source/Mosa.BareMetal.CoolWorld/Graphical/Apps/Paint.cs similarity index 87% rename from Source/Mosa.BareMetal.CoolWorld/Apps/Paint.cs rename to Source/Mosa.BareMetal.CoolWorld/Graphical/Apps/Paint.cs index f68956b177..7b4a6e1cd4 100644 --- a/Source/Mosa.BareMetal.CoolWorld/Apps/Paint.cs +++ b/Source/Mosa.BareMetal.CoolWorld/Graphical/Apps/Paint.cs @@ -1,9 +1,9 @@ // Copyright (c) MOSA Project. Licensed under the New BSD License. using System.Drawing; -using Mosa.BareMetal.CoolWorld.Components; +using Mosa.BareMetal.CoolWorld.Graphical.Components; -namespace Mosa.BareMetal.CoolWorld.Apps; +namespace Mosa.BareMetal.CoolWorld.Graphical.Apps; public class Paint : Window { diff --git a/Source/Mosa.BareMetal.CoolWorld/Apps/Settings.cs b/Source/Mosa.BareMetal.CoolWorld/Graphical/Apps/Settings.cs similarity index 97% rename from Source/Mosa.BareMetal.CoolWorld/Apps/Settings.cs rename to Source/Mosa.BareMetal.CoolWorld/Graphical/Apps/Settings.cs index 00db8a1b38..d1044fa771 100644 --- a/Source/Mosa.BareMetal.CoolWorld/Apps/Settings.cs +++ b/Source/Mosa.BareMetal.CoolWorld/Graphical/Apps/Settings.cs @@ -2,9 +2,9 @@ using System.Collections.Generic; using System.Drawing; -using Mosa.BareMetal.CoolWorld.Components; +using Mosa.BareMetal.CoolWorld.Graphical.Components; -namespace Mosa.BareMetal.CoolWorld.Apps; +namespace Mosa.BareMetal.CoolWorld.Graphical.Apps; public class MouseColorBtn : Button { diff --git a/Source/Mosa.BareMetal.CoolWorld/Components/Button.cs b/Source/Mosa.BareMetal.CoolWorld/Graphical/Components/Button.cs similarity index 97% rename from Source/Mosa.BareMetal.CoolWorld/Components/Button.cs rename to Source/Mosa.BareMetal.CoolWorld/Graphical/Components/Button.cs index dcaca88cec..64fb205025 100644 --- a/Source/Mosa.BareMetal.CoolWorld/Components/Button.cs +++ b/Source/Mosa.BareMetal.CoolWorld/Graphical/Components/Button.cs @@ -5,7 +5,7 @@ using Mosa.DeviceSystem.Fonts; using Mosa.DeviceSystem.Mouse; -namespace Mosa.BareMetal.CoolWorld.Components; +namespace Mosa.BareMetal.CoolWorld.Graphical.Components; public class Button { diff --git a/Source/Mosa.BareMetal.CoolWorld/Components/Label.cs b/Source/Mosa.BareMetal.CoolWorld/Graphical/Components/Label.cs similarity index 90% rename from Source/Mosa.BareMetal.CoolWorld/Components/Label.cs rename to Source/Mosa.BareMetal.CoolWorld/Graphical/Components/Label.cs index 58c85e512c..02915ec4be 100644 --- a/Source/Mosa.BareMetal.CoolWorld/Components/Label.cs +++ b/Source/Mosa.BareMetal.CoolWorld/Graphical/Components/Label.cs @@ -3,7 +3,7 @@ using System.Drawing; using Mosa.DeviceSystem.Fonts; -namespace Mosa.BareMetal.CoolWorld.Components; +namespace Mosa.BareMetal.CoolWorld.Graphical.Components; public class Label { diff --git a/Source/Mosa.BareMetal.CoolWorld/Components/PaintArea.cs b/Source/Mosa.BareMetal.CoolWorld/Graphical/Components/PaintArea.cs similarity index 95% rename from Source/Mosa.BareMetal.CoolWorld/Components/PaintArea.cs rename to Source/Mosa.BareMetal.CoolWorld/Graphical/Components/PaintArea.cs index db0e4ba846..7ae2322882 100644 --- a/Source/Mosa.BareMetal.CoolWorld/Components/PaintArea.cs +++ b/Source/Mosa.BareMetal.CoolWorld/Graphical/Components/PaintArea.cs @@ -5,7 +5,7 @@ using Mosa.DeviceSystem.HardwareAbstraction; using Mosa.DeviceSystem.Mouse; -namespace Mosa.BareMetal.CoolWorld.Components; +namespace Mosa.BareMetal.CoolWorld.Graphical.Components; public class PaintArea { diff --git a/Source/Mosa.BareMetal.CoolWorld/Components/Taskbar.cs b/Source/Mosa.BareMetal.CoolWorld/Graphical/Components/Taskbar.cs similarity index 95% rename from Source/Mosa.BareMetal.CoolWorld/Components/Taskbar.cs rename to Source/Mosa.BareMetal.CoolWorld/Graphical/Components/Taskbar.cs index 71468178c7..c9150404f2 100644 --- a/Source/Mosa.BareMetal.CoolWorld/Components/Taskbar.cs +++ b/Source/Mosa.BareMetal.CoolWorld/Graphical/Components/Taskbar.cs @@ -5,7 +5,7 @@ using System.Drawing; using Mosa.DeviceSystem.Mouse; -namespace Mosa.BareMetal.CoolWorld.Components; +namespace Mosa.BareMetal.CoolWorld.Graphical.Components; public class TaskbarButton : Button { @@ -73,9 +73,9 @@ public void Update() } // Check if taskbar buttons holding a window (each) are clicked - for (var i = 0; i < Program.Taskbar.Buttons.Count; i++) + for (var i = 0; i < Desktop.Taskbar.Buttons.Count; i++) { - var button = Program.Taskbar.Buttons[i]; + var button = Desktop.Taskbar.Buttons[i]; if (button.AttachedWindow == null) continue; diff --git a/Source/Mosa.BareMetal.CoolWorld/Components/TaskbarWindowMenu.cs b/Source/Mosa.BareMetal.CoolWorld/Graphical/Components/TaskbarWindowMenu.cs similarity index 96% rename from Source/Mosa.BareMetal.CoolWorld/Components/TaskbarWindowMenu.cs rename to Source/Mosa.BareMetal.CoolWorld/Graphical/Components/TaskbarWindowMenu.cs index 9feecf8189..379753208c 100644 --- a/Source/Mosa.BareMetal.CoolWorld/Components/TaskbarWindowMenu.cs +++ b/Source/Mosa.BareMetal.CoolWorld/Graphical/Components/TaskbarWindowMenu.cs @@ -2,7 +2,7 @@ using System.Drawing; -namespace Mosa.BareMetal.CoolWorld.Components; +namespace Mosa.BareMetal.CoolWorld.Graphical.Components; public class TaskbarWindowMenu { diff --git a/Source/Mosa.BareMetal.CoolWorld/Components/Window.cs b/Source/Mosa.BareMetal.CoolWorld/Graphical/Components/Window.cs similarity index 96% rename from Source/Mosa.BareMetal.CoolWorld/Components/Window.cs rename to Source/Mosa.BareMetal.CoolWorld/Graphical/Components/Window.cs index c5167c23d4..ca18d0280b 100644 --- a/Source/Mosa.BareMetal.CoolWorld/Components/Window.cs +++ b/Source/Mosa.BareMetal.CoolWorld/Graphical/Components/Window.cs @@ -3,7 +3,7 @@ using System.Drawing; using Mosa.DeviceSystem.Mouse; -namespace Mosa.BareMetal.CoolWorld.Components; +namespace Mosa.BareMetal.CoolWorld.Graphical.Components; public class Window { @@ -23,7 +23,7 @@ public class Window public Window(string title, uint x, uint y, uint width, uint height, Color inactiveTitlebarColor, Color activeTitlebarColor, Color bodyColor) { Title = title; - Id = Program.Random.Next(1, int.MaxValue); + Id = Desktop.Random.Next(1, int.MaxValue); X = x; Y = y; diff --git a/Source/Mosa.BareMetal.CoolWorld/Graphical/Desktop.cs b/Source/Mosa.BareMetal.CoolWorld/Graphical/Desktop.cs new file mode 100644 index 0000000000..2aa1e4357b --- /dev/null +++ b/Source/Mosa.BareMetal.CoolWorld/Graphical/Desktop.cs @@ -0,0 +1,108 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.IO; +using Mosa.BareMetal.CoolWorld.Graphical.Apps; +using Mosa.BareMetal.CoolWorld.Graphical.Components; +using Mosa.DeviceDriver.ISA; +using Mosa.DeviceSystem.Fonts; +using Mosa.DeviceSystem.HardwareAbstraction; +using Mosa.DeviceSystem.Services; +using Mosa.Kernel.BareMetal; + +namespace Mosa.BareMetal.CoolWorld.Graphical; + +public static class Desktop +{ + public static DeviceService DeviceService { get; private set; } + + public static PCService PCService { get; private set; } + + public static Random Random { get; private set; } + + public static Taskbar Taskbar { get; private set; } + + public static void Start() + { + Debug.WriteLine("Desktop::Start()"); + + DeviceService = Kernel.BareMetal.Kernel.ServiceManager.GetFirstService(); + PCService = Kernel.BareMetal.Kernel.ServiceManager.GetFirstService(); + Random = new Random(); + + Display.DefaultFont = Utils.Load(File.ReadAllBytes("font.bin")); + + Utils.Fonts = new List + { + Display.DefaultFont, + Utils.Load(File.ReadAllBytes("font2.bin")) + }; + + if (!Display.Initialize()) HAL.Abort("An error occurred when initializing the graphics driver."); + + Utils.Mouse = DeviceService.GetFirstDevice().DeviceDriver as StandardMouse; + + if (Utils.Mouse == null) HAL.Abort("Mouse not found."); + + Utils.BackColor = Color.Indigo; + Utils.Mouse.SetScreenResolution(Display.Width, Display.Height); + + Mouse.Initialize(); + WindowManager.Initialize(); + + Taskbar = new Taskbar(); + Taskbar.Buttons.Add(new TaskbarButton(Taskbar, "Shutdown", Color.Blue, Color.White, Color.Navy, + () => { Environment.Exit(0); return null; })); + Taskbar.Buttons.Add(new TaskbarButton(Taskbar, "Reset", Color.Blue, Color.White, Color.Navy, + () => { PCService.Reset(); return null; })); + Taskbar.Buttons.Add(new TaskbarButton(Taskbar, "Paint", Color.Coral, Color.White, Color.Red, + () => { WindowManager.Open(new Paint(70, 90, 400, 200, Color.MediumPurple, Color.Purple, Color.White)); return null; })); + Taskbar.Buttons.Add(new TaskbarButton(Taskbar, "Settings", Color.Coral, Color.White, Color.Red, + () => { WindowManager.Open(new Settings(70, 90, 400, 200, Color.MediumPurple, Color.Purple, Color.White)); return null; })); + + for (; ; ) + { + // Get current time + var time = Platform.GetTime(); + + // Clear screen + Display.Clear(Utils.BackColor); + + // Draw MOSA logo + Display.DrawMosaLogo(10); + + // Initialize background labels + var labels = new List