Compare commits
33
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
aac376fa22 | ||
|
|
51a29244ed | ||
|
|
8be364c990 | ||
|
|
0e2c6b2936 | ||
|
|
632c3fa66b | ||
|
|
875e3e4765 | ||
|
|
e28d68128d | ||
|
|
a9969d58f8 | ||
|
|
d7a54d858d | ||
|
|
4e991c3e6f | ||
|
|
a3217de71a | ||
|
|
19b433a19f | ||
|
|
69d1d22a18 | ||
|
|
5c15343ed0 | ||
|
|
3ae349fbc8 | ||
|
|
78c060c114 | ||
|
|
cd925e96c2 | ||
|
|
142dd486dd | ||
|
|
beeeabd441 | ||
|
|
b73c66f6d6 | ||
|
|
a7111d3cac | ||
|
|
d182fd7f46 | ||
|
|
b5582b1284 | ||
|
|
161cea4920 | ||
|
|
6b81c4ece0 | ||
|
|
ee17f69115 | ||
|
|
81c19bff16 | ||
|
|
e7cda58113 | ||
|
|
44f18554e1 | ||
|
|
52b42ec975 | ||
|
|
2815dd9e4d | ||
|
|
d057bfc3ff | ||
|
|
e4621c8aaa |
+52
@@ -0,0 +1,52 @@
|
||||
kind: pipeline
|
||||
type: docker
|
||||
name: build
|
||||
|
||||
steps:
|
||||
- name: build-image
|
||||
image: plugins/docker
|
||||
settings:
|
||||
repo: t3hn3rd/asuro-build
|
||||
tags: latest
|
||||
dockerfile: Dockerfile
|
||||
registry: docker.io
|
||||
username:
|
||||
from_secret: docker_username
|
||||
password:
|
||||
from_secret: docker_password
|
||||
|
||||
- name: compile
|
||||
image: t3hn3rd/asuro-build:latest
|
||||
depends_on:
|
||||
- build-image
|
||||
commands:
|
||||
- git fetch --tags
|
||||
- find . -type f -print0 | xargs -0 dos2unix
|
||||
- chmod +x /drone/src/*.sh
|
||||
- /drone/src/compile.sh
|
||||
|
||||
- name: upload-iso-artifact
|
||||
image: alpine/git
|
||||
depends_on:
|
||||
- compile
|
||||
when:
|
||||
branch:
|
||||
- master
|
||||
environment:
|
||||
GITEA_TOKEN:
|
||||
from_secret: gitea_token
|
||||
commands:
|
||||
- apk add --no-cache curl
|
||||
- chmod +w Asuro.iso
|
||||
- cp Asuro.iso "Asuro-$(git rev-parse --short HEAD).iso"
|
||||
- echo "Uploading Asuro-$(git rev-parse --short HEAD).iso to Gitea Packages..."
|
||||
- |
|
||||
curl -X PUT "https://gitea.spexeah.com/api/packages/Spexeah/generic/asuro-iso/$(git rev-parse --short HEAD)/Asuro.iso" \
|
||||
-H "Authorization: token $GITEA_TOKEN" --upload-file "Asuro-$(git rev-parse --short HEAD).iso"
|
||||
- echo "Updating latest ISO reference..."
|
||||
- |
|
||||
curl -X DELETE https://gitea.spexeah.com/api/packages/Spexeah/generic/asuro-iso/latest/Asuro.iso \
|
||||
-H "Authorization: token $GITEA_TOKEN" || echo "No previous latest version found."
|
||||
- |
|
||||
curl -X PUT https://gitea.spexeah.com/api/packages/Spexeah/generic/asuro-iso/latest/Asuro.iso \
|
||||
-H "Authorization: token $GITEA_TOKEN" --upload-file "Asuro-$(git rev-parse --short HEAD).iso"
|
||||
+1
-2
@@ -10,5 +10,4 @@
|
||||
/*.sh~
|
||||
/*.img
|
||||
src/include/asuro.pas
|
||||
.vscode/launch.json
|
||||
.vscode
|
||||
localenv.json
|
||||
|
||||
@@ -1,73 +0,0 @@
|
||||
stages:
|
||||
- Compile Versions
|
||||
- Compile Sources
|
||||
- Link
|
||||
- Generate Documentation
|
||||
- Deploy
|
||||
|
||||
cache:
|
||||
- key: ${CI_COMMIT_REF_SLUG}
|
||||
paths:
|
||||
- lib/*.o
|
||||
- bin/kernel.bin
|
||||
- doc
|
||||
|
||||
before_script:
|
||||
- chmod +x *.sh
|
||||
|
||||
versions:
|
||||
stage: Compile Versions
|
||||
script:
|
||||
- ./compile_vergen.sh
|
||||
artifacts:
|
||||
paths:
|
||||
- release/*.svg
|
||||
- src/include/asuro.pas
|
||||
|
||||
compile_sources:
|
||||
stage: Compile Sources
|
||||
script:
|
||||
- rm -f lib/*.so
|
||||
- ./compile_sources.sh
|
||||
needs:
|
||||
- versions
|
||||
|
||||
link:
|
||||
stage: Link
|
||||
script:
|
||||
- ./compile_stub.sh
|
||||
- ./compile_link.sh
|
||||
needs:
|
||||
- versions
|
||||
- compile_sources
|
||||
|
||||
isogen:
|
||||
stage: Deploy
|
||||
script:
|
||||
- ./compile_isogen.sh
|
||||
- ./compile_sumgen.sh
|
||||
artifacts:
|
||||
paths:
|
||||
- ./Asuro.iso
|
||||
- ./release/checksum.svg
|
||||
needs:
|
||||
- link
|
||||
|
||||
docgen:
|
||||
stage: Generate Documentation
|
||||
only:
|
||||
- master
|
||||
- develop
|
||||
script:
|
||||
- ./compile_sourcelist.sh
|
||||
- ./compile_docs.sh
|
||||
# Remove comments when we want to use gitlab pages.
|
||||
#- cp doc public
|
||||
allow_failure: true
|
||||
artifacts:
|
||||
paths:
|
||||
- doc
|
||||
#- public/*
|
||||
#- ./sources.list
|
||||
needs:
|
||||
- versions
|
||||
Vendored
+3
-10
@@ -3,18 +3,11 @@
|
||||
{
|
||||
"name":"Run",
|
||||
"request": "launch",
|
||||
"type": "coreclr",
|
||||
"type": "PowerShell",
|
||||
"preLaunchTask": "Build",
|
||||
"program": "VBoxSDL",
|
||||
"args": [
|
||||
"--comment",
|
||||
"Asuro",
|
||||
"--startvm",
|
||||
"7d395c96-891c-4139-b77d-9b6b144b0b93"
|
||||
],
|
||||
"script": "${workspaceFolder}/virtualbox-wrapper.ps1",
|
||||
"args": ["-Command", "up"],
|
||||
"cwd": "${workspaceFolder}",
|
||||
"console": "internalConsole",
|
||||
"internalConsoleOptions": "neverOpen"
|
||||
}
|
||||
]
|
||||
}
|
||||
Vendored
+24
-2
@@ -9,14 +9,18 @@
|
||||
"command": "docker-compose",
|
||||
"args": [
|
||||
"run",
|
||||
"builder"
|
||||
"builder",
|
||||
],
|
||||
"type": "shell",
|
||||
"problemMatcher": [],
|
||||
"group": {
|
||||
"kind": "build",
|
||||
"isDefault": true
|
||||
}
|
||||
},
|
||||
"dependsOn": [
|
||||
"Close VirtualBox",
|
||||
"Clean"
|
||||
]
|
||||
},
|
||||
{
|
||||
"label": "Build (Builder)",
|
||||
@@ -26,6 +30,24 @@
|
||||
"builder"
|
||||
],
|
||||
"type": "shell"
|
||||
},
|
||||
{
|
||||
"label": "Clean",
|
||||
"command": "docker-compose",
|
||||
"args": [
|
||||
"down",
|
||||
"--remove-orphans"
|
||||
],
|
||||
"type": "shell"
|
||||
},
|
||||
{
|
||||
"label": "Close VirtualBox",
|
||||
"command": "./virtualbox-wrapper.ps1",
|
||||
"args": [
|
||||
"-Command",
|
||||
"down"
|
||||
],
|
||||
"type": "shell"
|
||||
}
|
||||
]
|
||||
}
|
||||
+5
-2
@@ -5,9 +5,12 @@ VOLUME ["/code"]
|
||||
ENV DEBIAN_FRONTEND=noninteractive
|
||||
RUN dpkg --add-architecture i386
|
||||
RUN apt-get update && apt-get install -y \
|
||||
curl dos2unix wget git make nasm binutils:i386 xorriso grub-pc-bin && \
|
||||
curl dos2unix wget git make nasm binutils xorriso grub-pc-bin \
|
||||
gcc-multilib g++-multilib && \
|
||||
apt-get clean my room
|
||||
|
||||
RUN git clone --depth=1 --recurse-submodules https://github.com/cimgui/cimgui.git /cimgui
|
||||
|
||||
SHELL ["/bin/bash", "-c"]
|
||||
ARG FPC_VERSION=2.6.4
|
||||
RUN curl -sL https://sourceforge.net/projects/freepascal/files/Linux/$FPC_VERSION/fpc-$FPC_VERSION.i386-linux.tar/download | tar -xf - && \
|
||||
@@ -16,7 +19,7 @@ RUN curl -sL https://sourceforge.net/projects/freepascal/files/Linux/$FPC_VERSIO
|
||||
|
||||
COPY compile.sh /compile.sh
|
||||
ADD https://raw.githubusercontent.com/fsaintjacques/semver-tool/master/src/semver /usr/bin/semver
|
||||
RUN mkdir /code && chmod +x /usr/bin/semver
|
||||
RUN chmod +x /usr/bin/semver
|
||||
WORKDIR /code
|
||||
RUN find . -type f -print0 | xargs -0 dos2unix
|
||||
ENTRYPOINT ["/bin/bash", "-c"]
|
||||
|
||||
+19
-14
@@ -20,26 +20,31 @@ runOrFail() {
|
||||
fi
|
||||
}
|
||||
|
||||
runOrFail $(pwd)/compile_stub.sh "Failed to compile stub!"
|
||||
declare -a run_steps=(
|
||||
"compile_stub.sh" "Failed to compile stub!"
|
||||
"compile_vergen.sh" "Versions failed to compile"
|
||||
"compile_imgui.sh" "Failed to compile ImGui!"
|
||||
"compile_sources.sh" "Failed to compile FPC Sources!"
|
||||
"compile_link.sh" "Failed linking!"
|
||||
"compile_isogen.sh" "Failed to create ISO!"
|
||||
)
|
||||
|
||||
#Generate .pas with versioning headers.
|
||||
runOrFail $(pwd)/compile_vergen.sh "Versions failed to compile"
|
||||
|
||||
#Compile all .pas sources
|
||||
runOrFail $(pwd)/compile_sources.sh "Failed to compile FPC Sources!"
|
||||
|
||||
#Link into a binary.
|
||||
runOrFail $(pwd)/compile_link.sh "Failed linking!"
|
||||
|
||||
#Generate an ISO with GRUB as the Bootloader.
|
||||
runOrFail ./compile_isogen.sh "Failed to create ISO!"
|
||||
for ((i=0; i<${#run_steps[@]}; i+=2))
|
||||
do
|
||||
if [ "$ERRCOUNT" -eq "0" ]
|
||||
then
|
||||
script=$(pwd)/"${run_steps[$i]}"
|
||||
message="${run_steps[$i+1]}"
|
||||
runOrFail "$script" "$message"
|
||||
fi
|
||||
done
|
||||
|
||||
#Call generate final artifacts based on failure or success of the above.
|
||||
if [ "$ERRCOUNT" -ne "0" ]
|
||||
then
|
||||
./compile_finish.sh "failed"
|
||||
. ./compile_finish.sh "failed"
|
||||
else
|
||||
./compile_finish.sh "success"
|
||||
. ./compile_finish.sh "success"
|
||||
fi
|
||||
|
||||
cd ..
|
||||
@@ -0,0 +1,90 @@
|
||||
#!/usr/bin/env bash
|
||||
echo " "
|
||||
echo "======================="
|
||||
echo " "
|
||||
echo "Compiling ImGui (cimgui)..."
|
||||
echo " "
|
||||
|
||||
IMGUI_DIR=/cimgui
|
||||
IMGUI_SRC=$IMGUI_DIR/imgui
|
||||
BRIDGE_SRC=src/driver/video/imgui
|
||||
|
||||
# Flags shared by all C/C++ compilation units:
|
||||
# -m32 -> i386 target
|
||||
# -ffreestanding -> no implicit stdlib inclusion
|
||||
# -fno-builtin -> don't inline memcpy/memset/etc. so our stubs are used
|
||||
# -O2 -> optimise for speed
|
||||
# -ffunction-sections -fdata-sections -> allow --gc-sections in linker
|
||||
C_FLAGS="-m32 -ffreestanding -fno-builtin -O2 -ffunction-sections -fdata-sections"
|
||||
|
||||
# Extra flags for C++ translation units (cimgui/imgui sources):
|
||||
# -fno-exceptions -> no stack-unwinding machinery
|
||||
# -fno-rtti -> no typeinfo / dynamic_cast
|
||||
# -fno-use-cxa-atexit -> don't emit __cxa_atexit calls for static dtors
|
||||
# -fno-threadsafe-statics -> no guard-variable emission for local statics
|
||||
# NOTE: *not* -ffreestanding / -fno-builtin here — imgui includes <cmath> and
|
||||
# other hosted headers that refuse to compile in freestanding mode.
|
||||
# The object files are archived into a static lib and linked freestanding;
|
||||
# any hosted-stdlib calls (malloc/free/sin/cos/…) resolve to crtshim.c.
|
||||
CPP_FLAGS="-m32 -O2 -ffunction-sections -fdata-sections -fno-exceptions -fno-rtti -fno-use-cxa-atexit -fno-threadsafe-statics -fno-stack-protector -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0 -DNDEBUG -DIMGUI_ENABLE_STB_TRUETYPE"
|
||||
|
||||
INCLUDE="-I$IMGUI_DIR -I$IMGUI_SRC"
|
||||
|
||||
echo "Compiling C runtime shim..."
|
||||
gcc $C_FLAGS $INCLUDE \
|
||||
-c $BRIDGE_SRC/crtshim.c \
|
||||
-o lib/imgui_crtshim.o || { echo "Failed: crtshim.c"; exit 1; }
|
||||
|
||||
echo "Compiling render bridge..."
|
||||
# imgbridge is compiled as C++ so it sees cimgui.h function declarations
|
||||
# (C++ mode is required; the .c extension is overridden with -x c++)
|
||||
g++ $CPP_FLAGS $INCLUDE \
|
||||
-x c++ \
|
||||
-DCIMGUI_DEFINE_ENUMS_AND_STRUCTS \
|
||||
-c $BRIDGE_SRC/imgbridge.c \
|
||||
-o lib/imgui_bridge.o || { echo "Failed: imgbridge.c"; exit 1; }
|
||||
|
||||
echo "Compiling cimgui wrapper..."
|
||||
g++ $CPP_FLAGS $INCLUDE \
|
||||
-c $IMGUI_DIR/cimgui.cpp \
|
||||
-o lib/imgui_cimgui.o || { echo "Failed: cimgui.cpp"; exit 1; }
|
||||
|
||||
echo "Compiling imgui core..."
|
||||
g++ $CPP_FLAGS $INCLUDE \
|
||||
-c $IMGUI_SRC/imgui.cpp \
|
||||
-o lib/imgui_core.o || { echo "Failed: imgui.cpp"; exit 1; }
|
||||
|
||||
echo "Compiling imgui draw..."
|
||||
g++ $CPP_FLAGS $INCLUDE \
|
||||
-c $IMGUI_SRC/imgui_draw.cpp \
|
||||
-o lib/imgui_draw.o || { echo "Failed: imgui_draw.cpp"; exit 1; }
|
||||
|
||||
echo "Compiling imgui tables..."
|
||||
g++ $CPP_FLAGS $INCLUDE \
|
||||
-c $IMGUI_SRC/imgui_tables.cpp \
|
||||
-o lib/imgui_tables.o || { echo "Failed: imgui_tables.cpp"; exit 1; }
|
||||
|
||||
echo "Compiling imgui widgets..."
|
||||
g++ $CPP_FLAGS $INCLUDE \
|
||||
-c $IMGUI_SRC/imgui_widgets.cpp \
|
||||
-o lib/imgui_widgets.o || { echo "Failed: imgui_widgets.cpp"; exit 1; }
|
||||
|
||||
echo "Compiling imgui demo..."
|
||||
g++ $CPP_FLAGS $INCLUDE \
|
||||
-c $IMGUI_SRC/imgui_demo.cpp \
|
||||
-o lib/imgui_demo.o || { echo "Failed: imgui_demo.cpp"; exit 1; }
|
||||
|
||||
echo "Archiving cimgui.a..."
|
||||
# NOTE: imgui_bridge.o and imgui_crtshim.o are NOT in the archive because
|
||||
# compile_link.sh already picks them up individually via find lib/ -name "*.o".
|
||||
# Including them here would cause duplicate symbol errors.
|
||||
ar rcs lib/cimgui.a \
|
||||
lib/imgui_cimgui.o \
|
||||
lib/imgui_core.o \
|
||||
lib/imgui_draw.o \
|
||||
lib/imgui_tables.o \
|
||||
lib/imgui_widgets.o \
|
||||
lib/imgui_demo.o || { echo "Failed: ar"; exit 1; }
|
||||
|
||||
echo "ImGui compiled successfully."
|
||||
exit 0
|
||||
+3
-1
@@ -14,4 +14,6 @@ done;
|
||||
objstring=lib/stub.o" "$objstring
|
||||
echo "Object Files: "$objstring
|
||||
echo " "
|
||||
ld -m elf_i386 -s --gc-sections -Tlinker.script -o bin/kernel.bin $objstring
|
||||
LIBGCC=$(gcc -m32 -print-libgcc-file-name)
|
||||
ld -m elf_i386 -s --gc-sections -Tlinker.script -o bin/kernel.bin $objstring \
|
||||
--start-group lib/cimgui.a $LIBGCC --end-group
|
||||
+1
-1
@@ -4,4 +4,4 @@ echo "======================="
|
||||
echo " "
|
||||
echo "Compiling FPC Sources..."
|
||||
echo " "
|
||||
fpc -Aelf -gw -g -gl -n -vlewn -O3 -Op3 -Si -Sc -Sg -Xd -CX -XXs -CfSSE -CfSSE2 -Rintel -Pi386 -Tlinux -FElib/ -Fusrc/* -Fusrc/driver/* -Fusrc/driver/net/* src/kernel.pas
|
||||
fpc -Aelf -gw -g -gl -n -vlewn -O3 -Op3 -Si -Sc -Sg -Xd -CX -XXs -CfSSE -CfSSE2 -Rintel -Pi386 -Tlinux -FElib/ -Fusrc/* -Fusrc/driver/* -Fusrc/driver/net/* -Fusrc/driver/video/* -Fusrc/driver/video/imgui/* src/kernel.pas
|
||||
@@ -1,4 +1,3 @@
|
||||
version: "3.9"
|
||||
services:
|
||||
builder:
|
||||
build: .
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
4023:CIMGUI_API float igGetWindowDpiScale(void);
|
||||
4081:CIMGUI_API const ImVec4_c* igGetStyleColorVec4(ImGuiCol idx);
|
||||
4082:CIMGUI_API ImVec2_c igGetCursorScreenPos(void);
|
||||
4084:CIMGUI_API ImVec2_c igGetContentRegionAvail(void);
|
||||
4085:CIMGUI_API ImVec2_c igGetCursorPos(void);
|
||||
4086:CIMGUI_API float igGetCursorPosX(void);
|
||||
4087:CIMGUI_API float igGetCursorPosY(void);
|
||||
4091:CIMGUI_API ImVec2_c igGetCursorStartPos(void);
|
||||
4350:CIMGUI_API void igBeginDisabled(bool disabled);
|
||||
4372:CIMGUI_API ImVec2_c igGetItemRectMin(void);
|
||||
4373:CIMGUI_API ImVec2_c igGetItemRectMax(void);
|
||||
4374:CIMGUI_API ImVec2_c igGetItemRectSize(void);
|
||||
4377:CIMGUI_API ImDrawList* igGetBackgroundDrawList(ImGuiViewport* viewport);
|
||||
4378:CIMGUI_API ImDrawList* igGetForegroundDrawList_ViewportPtr(ImGuiViewport* viewport);
|
||||
4387:CIMGUI_API ImVec2_c igCalcTextSize(const char* text,const char* text_end,bool hide_text_after_double_hash,float wrap_width);
|
||||
4388:CIMGUI_API ImVec4_c igColorConvertU32ToFloat4(ImU32 in);
|
||||
4405:CIMGUI_API bool igIsMouseDoubleClicked_Nil(ImGuiMouseButton button);
|
||||
5092:CIMGUI_API ImDrawList* igGetForegroundDrawList_WindowPtr(ImGuiWindow* window);
|
||||
5161:CIMGUI_API void igBeginDisabledOverrideReenable(void);
|
||||
5244:CIMGUI_API bool igIsMouseDoubleClicked_ID(ImGuiMouseButton button,ImGuiID owner_id);
|
||||
@@ -34,4 +34,14 @@ SECTIONS
|
||||
}
|
||||
end = .; _end = .; __end = .;
|
||||
kernel_end = .;
|
||||
|
||||
/DISCARD/ : {
|
||||
*(.init_array*)
|
||||
*(.fini_array*)
|
||||
*(.ctors)
|
||||
*(.dtors)
|
||||
*(.eh_frame*)
|
||||
*(.gcc_except_table*)
|
||||
*(.note.GNU-stack)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,8 +13,8 @@ We welcome everyone to give building/breaking/fixing/shooting Asuro a go, feel f
|
||||
I don't think this needs an explaination.
|
||||
* [VSCode (Optional, but highly recommended)](https://code.visualstudio.com/)
|
||||
Visual Studio code is our IDE of choice, and we have a number of recommended plugins.
|
||||
* [C# Plugin by Microsoft](https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.csharp)
|
||||
This plugin gives you the ability to use the 'coreclr' task type, allowing the automatic launching of virtualbox with the resulting image generated during compilation of Asuro.
|
||||
* [PowerShell Plugin by Microsoft](https://marketplace.visualstudio.com/items?itemName=ms-vscode.powershell)
|
||||
This plugin gives you the ability to use the 'PowerShell' task type, allowing the automatic launching of virtualbox with the resulting image generated during compilation of Asuro.
|
||||
* [VirtualBox](https://www.virtualbox.org/)
|
||||
Virtualbox is our Virtualisation environment of choice, don't ask why, it just is.
|
||||
|
||||
@@ -27,7 +27,7 @@ We welcome everyone to give building/breaking/fixing/shooting Asuro a go, feel f
|
||||
3. Install Docker for Windows.
|
||||
4. Install Git for Windows.
|
||||
5. Install VSCode & the listed plugins.
|
||||
6. Install VirtualBox.
|
||||
6. Install VirtualBox (v7+).
|
||||
7. Clone this repository.
|
||||
8. Run the following command in the root of the repo to build the docker image:
|
||||
```powershell
|
||||
@@ -50,32 +50,29 @@ We welcome everyone to give building/breaking/fixing/shooting Asuro a go, feel f
|
||||
```xml
|
||||
<Machine uuid="{7d395c96-891c-4139-b77d-9b6b144b0b93}" name="Asuro" OSType="Linux" snapshotFolder="Snapshots" lastStateChange="2021-06-20T20:33:07Z">
|
||||
```
|
||||
Copy the uuid, in our case `7d395c96-891c-4139-b77d-9b6b144b0b93` and replace the uuid found in `.vscode\launch.json` under `args`, so that it looks something like this:
|
||||
Copy the uuid, in our case `7d395c96-891c-4139-b77d-9b6b144b0b93` & create a `localenv.json` file in the project root with the following content:
|
||||
```json
|
||||
{
|
||||
"configurations": [
|
||||
{
|
||||
"name":"Run",
|
||||
"request": "launch",
|
||||
"type": "coreclr",
|
||||
"preLaunchTask": "Build",
|
||||
"program": "VBoxSDL",
|
||||
"args": [
|
||||
"--comment",
|
||||
"Asuro",
|
||||
"--startvm",
|
||||
"<YOUR UUID HERE>"
|
||||
],
|
||||
"cwd": "${workspaceFolder}",
|
||||
"console": "internalConsole",
|
||||
"internalConsoleOptions": "neverOpen"
|
||||
}
|
||||
]
|
||||
"VirtualBox":{
|
||||
"MachineName":"<YOUR_UUID_OR_MACHINE_NAME>"
|
||||
}
|
||||
}
|
||||
```
|
||||
This will allow VSCode to automatically launch VirtualBox once Asuro has been compiled.
|
||||
|
||||
You can also enable the serial adapter "COM1" in mode "Raw File", give it a path, and provide this path in the `localenv.json` as follows:
|
||||
```json
|
||||
{
|
||||
"VirtualBox" : {
|
||||
"MachineName": "<YOUR_UUID_OR_MACHINE_NAME>",
|
||||
"LogLocation": "Fully\\Qualified\\Path\\To\\Your\\Log\\File"
|
||||
}
|
||||
}
|
||||
```
|
||||
This will allow you to see the console output from Asuro in your host terminal.
|
||||
13. Open your project folder in VSCode, use CTRL+SHIFT+B to build & F5 to build + run in VBox.
|
||||
14. Congratulations! You can now play with Asuro!
|
||||
|
||||
### Gotchas
|
||||
### Notes & Gotchas
|
||||
- The above process has been updated to be compatible with VirtualBox 7+, in which VBoxSDL was removed and vboxmanage should be used in its place. A small wrapper powershell script is used to achieve this.
|
||||
- It was noted that Windows builds above `20H2` seem to have issues installing WSL2. We may have to wait for a patch from Microsoft to fix this. Our devs are currently using build `20H2`.
|
||||
|
||||
+48
-2
@@ -838,6 +838,18 @@ const
|
||||
MAX_WINDOWS = 255; //< Maximum number of Windows open.
|
||||
DefaultWND = 0; //< The Window assigned for output when no Window is specified. (Default).
|
||||
|
||||
type
|
||||
TWNDCaptureCallback = procedure(s: pchar);
|
||||
|
||||
var
|
||||
WND_CaptureActive : boolean = false;
|
||||
WND_CaptureHWND : uint32 = 0;
|
||||
WND_CaptureBuf : array[0..511] of char;
|
||||
WND_CaptureBufIdx : uint32 = 0;
|
||||
WND_CaptureCallback : TWNDCaptureCallback = nil;
|
||||
|
||||
procedure flushCapture;
|
||||
|
||||
implementation
|
||||
|
||||
uses
|
||||
@@ -1776,14 +1788,15 @@ var
|
||||
fb: puint32;
|
||||
|
||||
Begin
|
||||
Ready:= False;
|
||||
fb:= puint32(uint32(multibootinfo^.framebuffer_addr));
|
||||
Console_Properties.Width:= multibootinfo^.framebuffer_width;
|
||||
Console_Properties.Height:= multibootinfo^.framebuffer_height;
|
||||
Console_Properties.BitsPerPixel:= multibootinfo^.framebuffer_bpp;
|
||||
Console_Properties.MAX_CELL_X:= (Console_Properties.Width div 8) - 1;
|
||||
Console_Properties.MAX_CELL_Y:= (Console_Properties.Height div 16) - 1;
|
||||
If Console_Properties.BitsPerPixel <> 16 then while true do begin
|
||||
|
||||
If Console_Properties.BitsPerPixel <> 16 then begin
|
||||
exit;
|
||||
end;
|
||||
kpalloc(uint32(fb));
|
||||
keyboard.hook(@keyhook);
|
||||
@@ -2258,6 +2271,7 @@ var
|
||||
x,y: Byte;
|
||||
|
||||
begin
|
||||
if WND_CaptureActive and (WND = WND_CaptureHWND) then exit;
|
||||
if WindowManager.Windows[WND] <> nil then begin
|
||||
for y:=0 to Console_Properties.MAX_CELL_Y do begin
|
||||
for x:=0 to Console_Properties.MAX_CELL_X do begin
|
||||
@@ -2418,8 +2432,26 @@ begin
|
||||
console.writeintlnexWND(i, Console_Properties.Default_Attribute, WND);
|
||||
end;
|
||||
|
||||
procedure flushCapture;
|
||||
begin
|
||||
if WND_CaptureActive and (WND_CaptureCallback <> nil) and (WND_CaptureBufIdx > 0) then begin
|
||||
WND_CaptureBuf[WND_CaptureBufIdx] := #0;
|
||||
WND_CaptureCallback(@WND_CaptureBuf[0]);
|
||||
WND_CaptureBufIdx := 0;
|
||||
WND_CaptureBuf[0] := #0;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure writecharexWND(character: char; attributes: uint32; WND : uint32);
|
||||
begin
|
||||
if WND_CaptureActive and (WND = WND_CaptureHWND) and (WND_CaptureCallback <> nil) then begin
|
||||
if WND_CaptureBufIdx < 511 then begin
|
||||
WND_CaptureBuf[WND_CaptureBufIdx] := character;
|
||||
inc(WND_CaptureBufIdx);
|
||||
WND_CaptureBuf[WND_CaptureBufIdx] := #0;
|
||||
end;
|
||||
exit;
|
||||
end;
|
||||
if WindowManager.Windows[WND] <> nil then begin
|
||||
WindowManager.Windows[WND]^.Buffer[WindowManager.Windows[WND]^.Cursor.Y][WindowManager.Windows[WND]^.Cursor.X].Character:= character;
|
||||
WindowManager.Windows[WND]^.Buffer[WindowManager.Windows[WND]^.Cursor.Y][WindowManager.Windows[WND]^.Cursor.X].Attributes:= attributes;
|
||||
@@ -2602,6 +2634,13 @@ end;
|
||||
|
||||
procedure backspaceWND(WND : uint32);
|
||||
begin
|
||||
if WND_CaptureActive and (WND = WND_CaptureHWND) then begin
|
||||
if WND_CaptureBufIdx > 0 then begin
|
||||
dec(WND_CaptureBufIdx);
|
||||
WND_CaptureBuf[WND_CaptureBufIdx] := #0;
|
||||
end;
|
||||
exit;
|
||||
end;
|
||||
if WindowManager.Windows[WND] <> nil then begin
|
||||
Dec(WindowManager.Windows[WND]^.Cursor.X);
|
||||
writecharWND(' ', WND);
|
||||
@@ -2658,6 +2697,13 @@ end;
|
||||
|
||||
procedure _safeincrement_y_WND(WND : uint32);
|
||||
begin
|
||||
if WND_CaptureActive and (WND = WND_CaptureHWND) and (WND_CaptureCallback <> nil) then begin
|
||||
WND_CaptureBuf[WND_CaptureBufIdx] := #0;
|
||||
WND_CaptureCallback(@WND_CaptureBuf[0]);
|
||||
WND_CaptureBufIdx := 0;
|
||||
WND_CaptureBuf[0] := #0;
|
||||
exit;
|
||||
end;
|
||||
if WindowManager.Windows[WND] <> nil then begin
|
||||
WindowManager.Windows[WND]^.Cursor.Y:= WindowManager.Windows[WND]^.Cursor.Y+1;
|
||||
if WindowManager.Windows[WND]^.Cursor.Y > WindowManager.Windows[WND]^.WND_H-1 then begin
|
||||
|
||||
+23
@@ -291,6 +291,28 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure enableAVX();
|
||||
begin
|
||||
if CPUID.Capabilities1^.AVX then begin
|
||||
asm
|
||||
PUSH EAX
|
||||
PUSH ECX
|
||||
PUSH EDX
|
||||
XOR ECX, ECX
|
||||
db $0F
|
||||
db $01
|
||||
db $D0
|
||||
OR EAX, 7
|
||||
db $0F
|
||||
db $01
|
||||
db $D1
|
||||
POP EDX
|
||||
POP ECX
|
||||
POP EAX
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure init();
|
||||
begin
|
||||
terminal.registerCommand('CPU', @Terminal_Command_CPU, 'CPU Info.');
|
||||
@@ -300,6 +322,7 @@ begin
|
||||
getCPUCapabilities;
|
||||
getCPUClockSpeed;
|
||||
enableSSE;
|
||||
enableAVX;
|
||||
end;
|
||||
|
||||
end.
|
||||
+38
-33
@@ -49,8 +49,12 @@ type
|
||||
y : sint32;
|
||||
end;
|
||||
|
||||
{ Mouse hook callback: receives absolute position and button states }
|
||||
TMouseHook = procedure(x, y: sint32; lmb, rmb, mmb: boolean);
|
||||
|
||||
procedure init();
|
||||
procedure DrawCursor;
|
||||
procedure setHook(h: TMouseHook);
|
||||
|
||||
implementation
|
||||
|
||||
@@ -67,6 +71,7 @@ var
|
||||
LMouseDownPos : TMousePos;
|
||||
LMouseDown : Boolean;
|
||||
RMouseDown : Boolean;
|
||||
MouseHookCB : TMouseHook = nil;
|
||||
|
||||
procedure DrawCursor;
|
||||
var
|
||||
@@ -174,43 +179,38 @@ begin
|
||||
if Current.y > (Console.getConsoleProperties^.Height-8) then Current.y:= (Console.getConsoleProperties^.Height-8);
|
||||
end;
|
||||
Cycle:= 0;
|
||||
if Packet.LMB_Down then begin
|
||||
if not LMouseDown then begin
|
||||
LMouseDown:= true;
|
||||
LMouseDownPos.x:= Current.x;
|
||||
LMouseDownPos.y:= Current.y;
|
||||
//MouseDownEvent
|
||||
console._mouseDown();
|
||||
end;
|
||||
{ Track button transitions }
|
||||
if Packet.LMB_Down and (not LMouseDown) then begin
|
||||
LMouseDown:= true;
|
||||
LMouseDownPos.x:= Current.x;
|
||||
LMouseDownPos.y:= Current.y;
|
||||
end;
|
||||
if not Packet.LMB_Down then begin
|
||||
if LMouseDown then begin
|
||||
If (Current.x = LMouseDownPos.x) and (Current.y = LMouseDownPos.y) then begin
|
||||
Console._MouseClick(true);
|
||||
end;
|
||||
//MouseUpEvent
|
||||
Console._MouseUp();
|
||||
LMouseDown:= false;
|
||||
end;
|
||||
if (not Packet.LMB_Down) and LMouseDown then
|
||||
LMouseDown:= false;
|
||||
if Packet.RMB_Down and (not RMouseDown) then begin
|
||||
RMouseDown:= true;
|
||||
RMouseDownPos.x:= Current.x;
|
||||
RMouseDownPos.y:= Current.y;
|
||||
end;
|
||||
if Packet.RMB_Down then begin
|
||||
if not RMouseDown then begin
|
||||
RMouseDown:= true;
|
||||
RMouseDownPos.x:= Current.x;
|
||||
RMouseDownPos.y:= Current.y;
|
||||
end;
|
||||
end;
|
||||
|
||||
if not Packet.RMB_Down then begin
|
||||
if RMouseDown then begin
|
||||
if (Current.x = RMouseDownPos.x) and (Current.y = RMouseDownPos.y) then begin
|
||||
Console._MouseClick(false);
|
||||
end;
|
||||
end;
|
||||
if (not Packet.RMB_Down) and RMouseDown then
|
||||
RMouseDown:= false;
|
||||
|
||||
{ Dispatch to hook or console }
|
||||
if MouseHookCB <> nil then
|
||||
MouseHookCB(Current.x, Current.y, Packet.LMB_Down, Packet.RMB_Down, Packet.MMB_Down)
|
||||
else begin
|
||||
if Packet.LMB_Down and (not LMouseDown) then console._mouseDown();
|
||||
if (not Packet.LMB_Down) and LMouseDown then begin
|
||||
if (Current.x = LMouseDownPos.x) and (Current.y = LMouseDownPos.y) then
|
||||
Console._MouseClick(true);
|
||||
Console._MouseUp();
|
||||
end;
|
||||
if (not Packet.RMB_Down) and RMouseDown then begin
|
||||
if (Current.x = RMouseDownPos.x) and (Current.y = RMouseDownPos.y) then
|
||||
Console._MouseClick(false);
|
||||
end;
|
||||
console.setMousePosition(Current.x, Current.y);
|
||||
end;
|
||||
|
||||
console.setMousePosition(Current.x, Current.y);
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
@@ -242,6 +242,11 @@ begin
|
||||
pop_trace;
|
||||
end;
|
||||
|
||||
procedure setHook(h: TMouseHook);
|
||||
begin
|
||||
MouseHookCB := h;
|
||||
end;
|
||||
|
||||
procedure init();
|
||||
var
|
||||
devid : TDeviceIdentifier;
|
||||
|
||||
@@ -92,6 +92,7 @@ var
|
||||
Root : PVFSObject;
|
||||
CurrentDirectory : pchar = nil;
|
||||
PushPopDirectory : PLinkedListBase;
|
||||
MountDepth : uint32 = 0;
|
||||
|
||||
procedure init();
|
||||
Function OpenFile(Filename : pchar; OpenMode : TOpenMode; WriteMode : TWriteMode; Lock : Boolean; Error : PError) : TFileHandle;
|
||||
@@ -104,6 +105,7 @@ function GetDirectories(Handle : uint32; Path : pchar) : PHashMap;
|
||||
function PathValid(Path : pchar) : TIsPathValid;
|
||||
function changeDirectory(Path : pchar) : TIsPathValid;
|
||||
function getWorkingDirectory : pchar;
|
||||
function GetDirectoryListing(Path : pchar) : PHashMap;
|
||||
|
||||
//VFS Functions
|
||||
function newVirtualDirectory(Path : pchar) : TError;
|
||||
@@ -288,6 +290,7 @@ begin
|
||||
NewObj:= PVFSObject(hashmap.get(ht, item));
|
||||
if NewObj = nil then begin
|
||||
GetObjectFromPath:= nil;
|
||||
STRLL_Free(SplitPath);
|
||||
tracer.push_trace('vfs.GetObjectFromPath.shortexit_1');
|
||||
exit;
|
||||
end;
|
||||
@@ -304,6 +307,7 @@ begin
|
||||
end;
|
||||
end;
|
||||
GetObjectFromPath:= Obj;
|
||||
STRLL_Free(SplitPath);
|
||||
tracer.push_trace('vfs.GetObjectFromPath.exit');
|
||||
end;
|
||||
|
||||
@@ -348,7 +352,17 @@ begin
|
||||
GetDirectoryListing:= nil;
|
||||
end;
|
||||
otMOUNT:begin
|
||||
GetDirectoryListing:= GetDirectoryListing(PVFSMount(Obj^.Reference)^.Path);
|
||||
{ Safety: cap mount-follow depth to prevent infinite recursion
|
||||
from circular mounts. Use a simple static counter. }
|
||||
if MountDepth < 16 then begin
|
||||
Inc(MountDepth);
|
||||
GetDirectoryListing:= GetDirectoryListing(PVFSMount(Obj^.Reference)^.Path);
|
||||
Dec(MountDepth);
|
||||
end else
|
||||
GetDirectoryListing:= nil;
|
||||
end;
|
||||
else begin
|
||||
GetDirectoryListing:= nil;
|
||||
end;
|
||||
end;
|
||||
end else begin
|
||||
@@ -420,7 +434,7 @@ begin
|
||||
|
||||
NewObj^.Reference:= void(NewDev);
|
||||
|
||||
hashmap.add(ht, stringCopy(DeviceName), void(NewDev));
|
||||
hashmap.add(ht, stringCopy(DeviceName), void(NewObj));
|
||||
end;
|
||||
|
||||
{ Filesystem Functions }
|
||||
|
||||
@@ -0,0 +1,116 @@
|
||||
// Copyright 2021 Kieron Morris
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
{
|
||||
Driver->Video->Doublebuffer - Implements a very basic double buffer, tested with VESA drivers.
|
||||
|
||||
@author(Kieron Morris <[email protected]>)
|
||||
}
|
||||
unit doublebuffer;
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
lmemorymanager, tracer, videotypes, serial, util;
|
||||
|
||||
//Init the driver, and register with the video interface in a state ready for execution.
|
||||
procedure init(Register : FRegisterDriver);
|
||||
|
||||
implementation
|
||||
|
||||
function allocateBackBuffer(Width : uint32; Height : uint32; BitsPerPixel : uint8) : uint64;
|
||||
begin
|
||||
tracer.push_trace('doublebuffer.allocateBackBuffer.enter');
|
||||
//This doesn't currently work... Needs a rework of lmemorymanager
|
||||
allocateBackBuffer:= uint64(klalloc((Width * Height) * BitsPerPixel));
|
||||
tracer.push_trace('doublebuffer.allocateBackBuffer.exit');
|
||||
end;
|
||||
|
||||
procedure initBackBuffer(VInterface : PVideoInterface; Width : uint32; Height : uint32; BitsPerPixel : uint8);
|
||||
begin
|
||||
tracer.push_trace('doublebuffer.initBackBuffer.enter');
|
||||
if not(VInterface^.BackBuffer.Initialized) then begin
|
||||
VInterface^.BackBuffer.Location:= allocateBackBuffer(Width, Height, BitsPerPixel);
|
||||
if (VInterface^.BackBuffer.Location <> 0) then begin
|
||||
VInterface^.BackBuffer.Width:= Width;
|
||||
VInterface^.BackBuffer.Height:= Height;
|
||||
VInterface^.BackBuffer.BitsPerPixel:= BitsPerPixel;
|
||||
VInterface^.BackBuffer.Initialized:= True;
|
||||
end;
|
||||
end;
|
||||
tracer.push_trace('doublebuffer.initBackBuffer.exit');
|
||||
end;
|
||||
|
||||
procedure Flush(FrontBuffer : PVideoBuffer; BackBuffer : PVideoBuffer);
|
||||
var
|
||||
Back,Front : uint32;
|
||||
Count64 : uint32;
|
||||
|
||||
begin
|
||||
//tracer.push_trace('doublebuffer.Flush.enter');
|
||||
if not(BackBuffer^.Initialized) then exit;
|
||||
if ((FrontBuffer^.Width > BackBuffer^.Width) or (FrontBuffer^.Height > BackBuffer^.Height)) then exit;
|
||||
Back:= BackBuffer^.Location;
|
||||
Front:= FrontBuffer^.Location;
|
||||
{ Number of 64-byte blocks: total_bytes / 64 = (W * H * BPP/8) / 64 }
|
||||
Count64:= ( BackBuffer^.Width * BackBuffer^.Height * BackBuffer^.BitsPerPixel) div 512;
|
||||
if Count64 = 0 then exit;
|
||||
{ Bulk SSE copy: 4 x MOVAPS (64 bytes) per iteration.
|
||||
4x fewer loop iterations than the old per-16-byte function-call loop. }
|
||||
asm
|
||||
PUSH ESI
|
||||
PUSH EDI
|
||||
MOV ESI, Back
|
||||
MOV EDI, Front
|
||||
MOV ECX, Count64
|
||||
@sseloop:
|
||||
MOVAPS XMM0, [ESI]
|
||||
MOVAPS XMM1, [ESI + 16]
|
||||
MOVAPS XMM2, [ESI + 32]
|
||||
MOVAPS XMM3, [ESI + 48]
|
||||
MOVAPS [EDI], XMM0
|
||||
MOVAPS [EDI + 16], XMM1
|
||||
MOVAPS [EDI + 32], XMM2
|
||||
MOVAPS [EDI + 48], XMM3
|
||||
ADD ESI, 64
|
||||
ADD EDI, 64
|
||||
DEC ECX
|
||||
JNZ @sseloop
|
||||
POP EDI
|
||||
POP ESI
|
||||
end;
|
||||
//tracer.push_trace('doublebuffer.Flush.exit');
|
||||
end;
|
||||
|
||||
function enable(VideoInterface : PVideoInterface) : boolean;
|
||||
begin
|
||||
tracer.push_trace('doublebuffer.enable.enter');
|
||||
enable:= false;
|
||||
initBackBuffer(VideoInterface, VideoInterface^.FrontBuffer.Width, VideoInterface^.FrontBuffer.Height, VideoInterface^.FrontBuffer.BitsPerPixel);
|
||||
if VideoInterface^.BackBuffer.Initialized then begin
|
||||
VideoInterface^.DefaultBuffer:= @VideoInterface^.BackBuffer;
|
||||
VideoInterface^.DrawRoutines.Flush:= @Flush;
|
||||
enable:= true;
|
||||
end;
|
||||
tracer.push_trace('doublebuffer.enable.exit');
|
||||
end;
|
||||
|
||||
procedure init(Register : FRegisterDriver);
|
||||
begin
|
||||
tracer.push_trace('doublebuffer.init.enter');
|
||||
Register('BASIC_DOUBLE_BUFFER', @enable);
|
||||
tracer.push_trace('doublebuffer.init.exit');
|
||||
end;
|
||||
|
||||
end.
|
||||
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user