From a350141d45763a888e6a64bd77acdf41a3f8a5e5 Mon Sep 17 00:00:00 2001 From: slendi Date: Thu, 2 Mar 2023 12:07:12 +0200 Subject: [PATCH 01/48] Modify build script for automatic feature detection This commit modified the build script so that it does not require the user to edit it. It automatically detects sudo or doas and whether virrualization is available or not. Signed-off-by: slendi --- build/build-iso.sh | 71 ++++++++++++++++++++++++++-------------------- 1 file changed, 40 insertions(+), 31 deletions(-) diff --git a/build/build-iso.sh b/build/build-iso.sh index e97d8874..7aedcda1 100755 --- a/build/build-iso.sh +++ b/build/build-iso.sh @@ -13,8 +13,17 @@ then exit fi -# Uncomment if you use doas instead of sudo -#alias sudo=doas +[ "$1" = "--headless" ] && QEMU_HEADLESS='-display none' +SUDO='none' +command -v doas && $SUDO=doas +command -v sudo&& $SUDO=sudo +if [ "$SUDO" = "none" ] ; then + echo 'No sudo or doas installed. Cannot proceed.' + exit 1 +fi + +KVM='' +(lsmod | grep -q kvm) && KVM=',accel=kvm' # Set this true if you want to test ISOs in QEMU after building. TESTING=false @@ -28,16 +37,16 @@ TMPMOUNT="$TMPDIR/mnt" QEMU_BIN_PATH=$(dirname "$(which qemu-system-x86_64)") mount_tempdisk() { - sudo modprobe nbd - sudo $QEMU_BIN_PATH/qemu-nbd -c /dev/nbd0 -f raw $TMPDISK - sudo partprobe /dev/nbd0 - sudo mount /dev/nbd0p1 $TMPMOUNT + $SUDO modprobe nbd + $SUDO $QEMU_BIN_PATH/qemu-nbd -c /dev/nbd0 -f raw $TMPDISK + $SUDO partprobe /dev/nbd0 + $SUDO mount /dev/nbd0p1 $TMPMOUNT } umount_tempdisk() { sync - sudo umount $TMPMOUNT - sudo $QEMU_BIN_PATH/qemu-nbd -d /dev/nbd0 + $SUDO umount $TMPMOUNT + $SUDO $QEMU_BIN_PATH/qemu-nbd -d /dev/nbd0 } [ ! -d $TMPMOUNT ] && mkdir -p $TMPMOUNT @@ -50,19 +59,19 @@ set +e echo "Making temp vdisk, running auto-install ..." $QEMU_BIN_PATH/qemu-img create -f raw $TMPDISK 1024M -$QEMU_BIN_PATH/qemu-system-x86_64 -machine q35,accel=kvm -drive format=raw,file=$TMPDISK -m 1G -rtc base=localtime -smp 4 -cdrom AUTO.ISO -device isa-debug-exit +$QEMU_BIN_PATH/qemu-system-x86_64 -machine q35$KVM -drive format=raw,file=$TMPDISK -m 1G -rtc base=localtime -smp 4 -cdrom AUTO.ISO -device isa-debug-exit $QEMU_HEADLESS echo "Copying all src/ code into vdisk Tmp/OSBuild/ ..." rm ../src/Home/Registry.ZC 2> /dev/null rm ../src/Home/MakeHome.ZC 2> /dev/null rm ../src/Boot/Kernel.ZXE 2> /dev/null mount_tempdisk -sudo mkdir $TMPMOUNT/Tmp/OSBuild/ -sudo cp -r ../src/* $TMPMOUNT/Tmp/OSBuild +$SUDO mkdir $TMPMOUNT/Tmp/OSBuild/ +$SUDO cp -r ../src/* $TMPMOUNT/Tmp/OSBuild umount_tempdisk echo "Rebuilding kernel headers, kernel, OS, and building Distro ISO ..." -$QEMU_BIN_PATH/qemu-system-x86_64 -machine q35,accel=kvm -drive format=raw,file=$TMPDISK -m 1G -rtc base=localtime -smp 4 -device isa-debug-exit +$QEMU_BIN_PATH/qemu-system-x86_64 -machine q35$KVM -drive format=raw,file=$TMPDISK -m 1G -rtc base=localtime -smp 4 -device isa-debug-exit $QEMU_HEADLESS LIMINE_BINARY_BRANCH="v4.x-branch-binary" @@ -95,22 +104,22 @@ sed -i "s/\[\]/\[$(grep -o "0x" ./limine/limine-hdd.h | wc -l)\]/g" limine/Limin mount_tempdisk echo "Extracting MyDistro ISO from vdisk ..." cp $TMPMOUNT/Tmp/MyDistro.ISO.C ./ZealOS-MyDistro.iso -sudo rm $TMPMOUNT/Tmp/MyDistro.ISO.C 2> /dev/null +$SUDO rm $TMPMOUNT/Tmp/MyDistro.ISO.C 2> /dev/null echo "Setting up temp ISO directory contents for use with limine xorriso command ..." -sudo cp -rf $TMPMOUNT/* $TMPISODIR -sudo rm $TMPISODIR/Boot/OldMBR.BIN 2> /dev/null -sudo rm $TMPISODIR/Boot/BootMHD2.BIN 2> /dev/null -sudo mkdir -p $TMPISODIR/EFI/BOOT -sudo cp limine/Limine-HDD.HH $TMPISODIR/Boot/Limine-HDD.HH -sudo cp limine/BOOTX64.EFI $TMPISODIR/EFI/BOOT/BOOTX64.EFI -sudo cp limine/limine-cd-efi.bin $TMPISODIR/Boot/Limine-CD-EFI.BIN -sudo cp limine/limine-cd.bin $TMPISODIR/Boot/Limine-CD.BIN -sudo cp limine/limine.sys $TMPISODIR/Boot/Limine.SYS -sudo cp ../zealbooter/zealbooter.elf $TMPISODIR/Boot/ZealBooter.ELF -sudo cp ../zealbooter/Limine.CFG $TMPISODIR/Boot/Limine.CFG +$SUDO cp -rf $TMPMOUNT/* $TMPISODIR +$SUDO rm $TMPISODIR/Boot/OldMBR.BIN 2> /dev/null +$SUDO rm $TMPISODIR/Boot/BootMHD2.BIN 2> /dev/null +$SUDO mkdir -p $TMPISODIR/EFI/BOOT +$SUDO cp limine/Limine-HDD.HH $TMPISODIR/Boot/Limine-HDD.HH +$SUDO cp limine/BOOTX64.EFI $TMPISODIR/EFI/BOOT/BOOTX64.EFI +$SUDO cp limine/limine-cd-efi.bin $TMPISODIR/Boot/Limine-CD-EFI.BIN +$SUDO cp limine/limine-cd.bin $TMPISODIR/Boot/Limine-CD.BIN +$SUDO cp limine/limine.sys $TMPISODIR/Boot/Limine.SYS +$SUDO cp ../zealbooter/zealbooter.elf $TMPISODIR/Boot/ZealBooter.ELF +$SUDO cp ../zealbooter/Limine.CFG $TMPISODIR/Boot/Limine.CFG echo "Copying DVDKernel.ZXE over ISO Boot/Kernel.ZXE ..." -sudo mv $TMPMOUNT/Tmp/DVDKernel.ZXE $TMPISODIR/Boot/Kernel.ZXE -sudo rm $TMPISODIR/Tmp/DVDKernel.ZXE 2> /dev/null +$SUDO mv $TMPMOUNT/Tmp/DVDKernel.ZXE $TMPISODIR/Boot/Kernel.ZXE +$SUDO rm $TMPISODIR/Tmp/DVDKernel.ZXE 2> /dev/null umount_tempdisk xorriso -joliet "on" -rockridge "on" -as mkisofs -b Boot/Limine-CD.BIN \ @@ -131,11 +140,11 @@ if [ "$TESTING" = true ]; then cd .. fi echo "Testing limine-zealbooter-xorriso isohybrid boot in UEFI mode ..." - $QEMU_BIN_PATH/qemu-system-x86_64 -machine q35,accel=kvm -m 1G -rtc base=localtime -bios ovmf/OVMF.fd -smp 4 -cdrom ZealOS-limine.iso + $QEMU_BIN_PATH/qemu-system-x86_64 -machine q35$KVM -m 1G -rtc base=localtime -bios ovmf/OVMF.fd -smp 4 -cdrom ZealOS-limine.iso $QEMU_HEADLESS echo "Testing limine-zealbooter-xorriso isohybrid boot in BIOS mode ..." - $QEMU_BIN_PATH/qemu-system-x86_64 -machine q35,accel=kvm -m 1G -rtc base=localtime -smp 4 -cdrom ZealOS-limine.iso + $QEMU_BIN_PATH/qemu-system-x86_64 -machine q35$KVM -m 1G -rtc base=localtime -smp 4 -cdrom ZealOS-limine.iso $QEMU_HEADLESS echo "Testing native ZealC MyDistro legacy ISO in BIOS mode ..." - $QEMU_BIN_PATH/qemu-system-x86_64 -machine q35,accel=kvm -m 1G -rtc base=localtime -smp 4 -cdrom ZealOS-MyDistro.iso + $QEMU_BIN_PATH/qemu-system-x86_64 -machine q35$KVM -m 1G -rtc base=localtime -smp 4 -cdrom ZealOS-MyDistro.iso $QEMU_HEADLESS fi # comment these 2 lines if you want lingering old Distro ISOs @@ -146,8 +155,8 @@ mv ./ZealOS-MyDistro.iso ./ZealOS-PublicDomain-BIOS-$(date +%Y-%m-%d-%H_%M_%S).i mv ./ZealOS-limine.iso ./ZealOS-BSD2-UEFI-$(date +%Y-%m-%d-%H_%M_%S).iso echo "Deleting temp folder ..." -sudo rm -rf $TMPDIR -sudo rm -rf $TMPISODIR +$SUDO rm -rf $TMPDIR +$SUDO rm -rf $TMPISODIR echo "Finished." echo echo "ISOs built:" From 9a64496c97125e24194894d40602ffec3e321c89 Mon Sep 17 00:00:00 2001 From: slendi Date: Thu, 2 Mar 2023 12:08:43 +0200 Subject: [PATCH 02/48] Add GitHub actions build script This patch adds a way to build on pull requests and pushes ISOs each time. This js really convinient for people that do not wish to go through the build process which may be because they cannkt do it for some reason or another. Signed-off-by: slendi --- .github/workflows/build.yml | 47 +++++++++++++++++++++++++++++++++++++ build/build-iso.sh | 4 ++-- 2 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/build.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 00000000..eeda77ce --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,47 @@ +name: Build Application + +on: + push: + branches-ignore: + - 'stable' + paths-ignore: + - '**.md' + - 'screenshots/**' + - '**/LICENSE' + pull_request: + paths-ignore: + - '**.md' + - 'screenshots/**' + - '**/LICENSE' + workflow_dispatch: + +jobs: + build: + name: Build + runs-on: self-hosted + + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + submodules: 'true' + + - name: Install Dependencies + run: | + sudo apt-get -y update + sudo apt-get -y install build-essential git xorriso qemu-system-x86 + + - name: Build ISOs + run: | + cd build + ./build-iso.sh --headless + cd .. + + - name: Upload artifacts + uses: actions/upload-artifact@v3 + with: + name: ISOs + path: | + build/*.iso + if-no-files-found: error + diff --git a/build/build-iso.sh b/build/build-iso.sh index 7aedcda1..9e477698 100755 --- a/build/build-iso.sh +++ b/build/build-iso.sh @@ -15,8 +15,8 @@ fi [ "$1" = "--headless" ] && QEMU_HEADLESS='-display none' SUDO='none' -command -v doas && $SUDO=doas -command -v sudo&& $SUDO=sudo +command -v doas && SUDO=doas +command -v sudo && SUDO=sudo if [ "$SUDO" = "none" ] ; then echo 'No sudo or doas installed. Cannot proceed.' exit 1 From cd3fd49758c9980141539bf9cfd8a31d4423f032 Mon Sep 17 00:00:00 2001 From: y4my4my4m <8145020+y4my4my4m@users.noreply.github.com> Date: Fri, 25 Aug 2023 14:54:17 +0900 Subject: [PATCH 03/48] init --- src/Home/Yuugure.ZC | 29 +++++++++++++++++++++++++++++ src/HomeKeyPlugIns.ZC | 10 ++++++++++ src/MakeHome.ZC | 1 + 3 files changed, 40 insertions(+) create mode 100755 src/Home/Yuugure.ZC diff --git a/src/Home/Yuugure.ZC b/src/Home/Yuugure.ZC new file mode 100755 index 00000000..e449e4c5 --- /dev/null +++ b/src/Home/Yuugure.ZC @@ -0,0 +1,29 @@ +I64 initialWinBottom = sys_task->win_bottom; +CDoc *initialDisplayDoc = sys_task->display_doc; + +U0 Yuugure() +{ + // Hide SysLog + if (sys_task->win_bottom != 0) { + while(sys_task->win_bottom > -1){ + sys_task->win_bottom--; + Sleep(20); + } + + sys_task->display_doc = NULL; + WinBorder(OFF, sys_task); + } + // Show SysLog + else { + WinBorder(ON, sys_task); + sys_task->display_doc = initialDisplayDoc; + + while(sys_task->win_bottom != initialWinBottom){ + sys_task->win_bottom++; + Sleep(20); + } + + } + + WinZBufUpdate; +} diff --git a/src/HomeKeyPlugIns.ZC b/src/HomeKeyPlugIns.ZC index fdc3bda9..0b949635 100755 --- a/src/HomeKeyPlugIns.ZC +++ b/src/HomeKeyPlugIns.ZC @@ -110,6 +110,16 @@ Bool MyPutKey(I64 ch, I64 sc) } return TRUE; + case SC_F12: + if (!(sc & SCF_SHIFT)) + { + if (sc & SCF_KEY_DESC) + KeyDescSet("Cmd /Yuugure"); + else + Yuugure; + } + return TRUE; + case SC_DELETE: if (sc & SCF_SHIFT) { diff --git a/src/MakeHome.ZC b/src/MakeHome.ZC index 39f77698..9b650e41 100755 --- a/src/MakeHome.ZC +++ b/src/MakeHome.ZC @@ -8,6 +8,7 @@ Cd(__DIR__);; #include "~/HomeWrappers" MapFileLoad("::/Kernel/Kernel"); MapFileLoad("::/Compiler/Compiler"); +#include "~/Yuugure" #include "~/HomeKeyPlugIns" #include "~/HomeSys" Cd("..");; From 524bddec6cd554d703e56d27470ffa867bd5d0f4 Mon Sep 17 00:00:00 2001 From: GutPuncher Date: Mon, 8 Jan 2024 23:40:39 -0500 Subject: [PATCH 04/48] Move DocClear tex.raw_col zeroing out of if cond --- src/Kernel/KGlobals.ZC | 2 +- src/System/DolDoc/DocRecalcLib.ZC | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Kernel/KGlobals.ZC b/src/Kernel/KGlobals.ZC index bc646ec1..e87446d1 100755 --- a/src/Kernel/KGlobals.ZC +++ b/src/Kernel/KGlobals.ZC @@ -14,7 +14,7 @@ U8 *rev_bits_table; //Table with U8 bits reversed CDate local_time_offset; F64 *pow10_I64, sys_os_version = 2.03; -U64 sys_os_version_sub = 108; +U64 sys_os_version_sub = 109; U8 *sys_os_version_str; U8 *sys_os_version_full; U8 *sys_os_version_nice; diff --git a/src/System/DolDoc/DocRecalcLib.ZC b/src/System/DolDoc/DocRecalcLib.ZC index 175da6a2..136ea281 100755 --- a/src/System/DolDoc/DocRecalcLib.ZC +++ b/src/System/DolDoc/DocRecalcLib.ZC @@ -137,11 +137,11 @@ public U0 DocClear(CDoc *doc=NULL, Bool clear_holds=FALSE) {//Clear all doc entries, except +H, hold entries. Bool unlock; + text.raw_col = 0; if (!doc && !(doc = DocPut)) { if (IsRaw) { - text.raw_col = 0; MemSet(text.fb_alias, BLACK32, text.buffer_size); } return; From 828b2493a4127f5cc76bdb08ad0232c29ce9000b Mon Sep 17 00:00:00 2001 From: Michael Mikonos Date: Tue, 30 Jan 2024 20:40:37 +0800 Subject: [PATCH 05/48] for newline, RawPutChar() is called at least once, so convert loop to do-while --- src/Kernel/Display.ZC | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/Kernel/Display.ZC b/src/Kernel/Display.ZC index f8cadcb9..5c0ce6f7 100755 --- a/src/Kernel/Display.ZC +++ b/src/Kernel/Display.ZC @@ -47,9 +47,8 @@ See also $LK,"GrUpdateScreen",A="MN:GrUpdateScreen"$(). } else if (ch == '\n') { - RawPutChar(CH_SPACE); - while (text.raw_col % text.cols) - RawPutChar(CH_SPACE); + do RawPutChar(CH_SPACE); + while (text.raw_col % text.cols); } else if (Bt(char_bmp_displayable, ch)) { From 8e5f169218c2518b6458def89d50e18658383b0c Mon Sep 17 00:00:00 2001 From: Michael Mikonos Date: Tue, 30 Jan 2024 21:48:54 +0800 Subject: [PATCH 06/48] StrScan(): Copy into new buffer with MemCopy() instead of a loop --- src/Kernel/StrScan.ZC | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Kernel/StrScan.ZC b/src/Kernel/StrScan.ZC index 457a04d5..9e634725 100755 --- a/src/Kernel/StrScan.ZC +++ b/src/Kernel/StrScan.ZC @@ -242,7 +242,7 @@ and take address. */ U8 *buf, *ptr, **pptr; Bool left_justify = FALSE; - I64 ch, cur_arg = 0, i, len, *i_ptr, dec_len; + I64 ch, cur_arg = 0, len, *i_ptr, dec_len; F64 *d_ptr; if (!format) @@ -301,9 +301,9 @@ and take address. } } buf = MAlloc(len + 1); - for (i = 0; i < len; i++) - buf[i] = *src++; - buf[i] = 0; + MemCopy(buf, src, len); + buf[len] = 0; + src += len; switch (ch) { case 's': From 362cfb407043cb3716cb99ec6b5ae65aa30f3208 Mon Sep 17 00:00:00 2001 From: mintsuki Date: Sat, 17 Feb 2024 08:42:44 +0100 Subject: [PATCH 07/48] Fix SATA issue described in issue #139. Fixes #139 Co-authored-by: mineo333 --- build/AUTO.ISO | Bin 3543040 -> 3575808 bytes src/Kernel/BlkDev/DiskAHCI.ZC | 1 + src/System/Define.ZC | 2 +- 3 files changed, 2 insertions(+), 1 deletion(-) diff --git a/build/AUTO.ISO b/build/AUTO.ISO index eeb24e6e700e3b6316289897f94ffe3c9cb78b6c..c523bff2fa8a07c5ef9189acfd30b3db651e2926 100755 GIT binary patch delta 203295 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 delta 178510 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 av`&OM_type = FISt_H2D; PCIBts(&cmd_fis->desc, AHCI_CF_DESCf_C); //Set Command bit in H2D FIS. cmd_fis->command = ATA_PACKET; + cmd_fis->lba1 = 8; cmd_table->acmd[0] = ATAPI_READ_CAPACITY >> 8; AHCIPortWait(bd->port_num, tS + 2); diff --git a/src/System/Define.ZC b/src/System/Define.ZC index d9411781..1a7e87c4 100755 --- a/src/System/Define.ZC +++ b/src/System/Define.ZC @@ -15,7 +15,7 @@ U0 LoadDocDefines() //$LK,"DD_BOOT_HIGH_LOC_DVD",A="FF:::/System/Boot/BootDVD.ZC,DD_BOOT_HIGH_LOC_DVD"$ $TR,"LineRep"$ -$ID,2$DefinePrint("DD_ZEALOS_LOC","99,737"); +$ID,2$DefinePrint("DD_ZEALOS_LOC","99,241"); $ID,-2$ DefinePrint("DD_MP_VECT", "%08X", MP_VECT_ADDR); DefinePrint("DD_MP_VECT_END", "%08X", MP_VECT_ADDR + COREAP_16BIT_INIT_END - COREAP_16BIT_INIT - 1); From f50f6b23fbd389dddbcff87161d87ace6181b16e Mon Sep 17 00:00:00 2001 From: GutPuncher Date: Mon, 19 Feb 2024 11:51:00 -0500 Subject: [PATCH 08/48] fix(sata-fix): review + test #147, #139. Fix build script limine git pull divergent branch error message issue. Revert Define.ZC --- build/build-iso.sh | 2 ++ src/System/Define.ZC | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/build/build-iso.sh b/build/build-iso.sh index 3535c830..d72aa87f 100755 --- a/build/build-iso.sh +++ b/build/build-iso.sh @@ -73,6 +73,8 @@ then git fetch git remote set-head origin $LIMINE_BINARY_BRANCH git switch $LIMINE_BINARY_BRANCH + git config --local pull.ff true + git config --local pull.rebase true git pull rm limine diff --git a/src/System/Define.ZC b/src/System/Define.ZC index 1a7e87c4..d9411781 100755 --- a/src/System/Define.ZC +++ b/src/System/Define.ZC @@ -15,7 +15,7 @@ U0 LoadDocDefines() //$LK,"DD_BOOT_HIGH_LOC_DVD",A="FF:::/System/Boot/BootDVD.ZC,DD_BOOT_HIGH_LOC_DVD"$ $TR,"LineRep"$ -$ID,2$DefinePrint("DD_ZEALOS_LOC","99,241"); +$ID,2$DefinePrint("DD_ZEALOS_LOC","99,737"); $ID,-2$ DefinePrint("DD_MP_VECT", "%08X", MP_VECT_ADDR); DefinePrint("DD_MP_VECT_END", "%08X", MP_VECT_ADDR + COREAP_16BIT_INIT_END - COREAP_16BIT_INIT - 1); From 451fddb9eb967c51c53d5f5a2f063e07ad76518e Mon Sep 17 00:00:00 2001 From: Arsenic Blood <127725014+GutPuncher@users.noreply.github.com> Date: Mon, 19 Feb 2024 12:09:32 -0500 Subject: [PATCH 09/48] Increment minor version number for 12b2c37 --- src/Kernel/KGlobals.ZC | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Kernel/KGlobals.ZC b/src/Kernel/KGlobals.ZC index e87446d1..e603223e 100755 --- a/src/Kernel/KGlobals.ZC +++ b/src/Kernel/KGlobals.ZC @@ -14,7 +14,7 @@ U8 *rev_bits_table; //Table with U8 bits reversed CDate local_time_offset; F64 *pow10_I64, sys_os_version = 2.03; -U64 sys_os_version_sub = 109; +U64 sys_os_version_sub = 110; U8 *sys_os_version_str; U8 *sys_os_version_full; U8 *sys_os_version_nice; From d26f67edf1b51ecdb2972853a5bcc82610bef233 Mon Sep 17 00:00:00 2001 From: retu2libc Date: Wed, 21 Feb 2024 01:20:20 -0500 Subject: [PATCH 10/48] Two kings ends game --- src/Demo/Games/Chess.ZC | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/Demo/Games/Chess.ZC b/src/Demo/Games/Chess.ZC index 9d5a5360..6af8908e 100755 --- a/src/Demo/Games/Chess.ZC +++ b/src/Demo/Games/Chess.ZC @@ -584,9 +584,9 @@ Bool MoveDo(GameState *state, I64 piece_num, I64 x2, I64 y2, Bool final) game_over = TRUE; } GameSnapShot; - } + } - return ToBool(score_adjust); + return ToBool(score_adjust); } I64 MoveFind(I64 x, I64 y, Move *mvs, I64 mv_cnt) @@ -664,18 +664,25 @@ I64 MoveCnt(GameState *state) { I64 i, res = 0, mv_cnt; Move mvs[32]; + Bool king_stalemate = TRUE; for (i = 0; i < 32; i++) + { if (state->pieces[i].player == state->cur_player) { mv_cnt = PieceMoves(state, i, mvs); mv_cnt = ChkPieceMoves(state, i, mvs,mv_cnt); res += mv_cnt; } - return res; + if (state->pieces[i].type != P_KING && state->pieces[i].player >= 0) + king_stalemate = FALSE; + } + if (king_stalemate) + return 0; + else + return res; } - U0 DrawIt(CTask *task, CDC *dc) { I64 i, x, y, z, k0, k1; From c3dfe78cebe316d11d93155b61929cdfd48cd0d8 Mon Sep 17 00:00:00 2001 From: GutPuncher Date: Wed, 21 Feb 2024 06:00:06 -0500 Subject: [PATCH 11/48] fix: review+test #148, inc sub-version num, close #42 --- src/Kernel/KGlobals.ZC | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Kernel/KGlobals.ZC b/src/Kernel/KGlobals.ZC index e603223e..8518f8fd 100755 --- a/src/Kernel/KGlobals.ZC +++ b/src/Kernel/KGlobals.ZC @@ -14,7 +14,7 @@ U8 *rev_bits_table; //Table with U8 bits reversed CDate local_time_offset; F64 *pow10_I64, sys_os_version = 2.03; -U64 sys_os_version_sub = 110; +U64 sys_os_version_sub = 111; U8 *sys_os_version_str; U8 *sys_os_version_full; U8 *sys_os_version_nice; From 1fc9a7062c7e66bd0fd7a817a84bcbe2bb1e4940 Mon Sep 17 00:00:00 2001 From: retu2libc Date: Sun, 25 Feb 2024 16:13:41 -0500 Subject: [PATCH 12/48] Drop ethernet frames not destined for us or broadcast --- src/Home/Net/Utilities/NetHandler.ZC | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/Home/Net/Utilities/NetHandler.ZC b/src/Home/Net/Utilities/NetHandler.ZC index fad866ad..f7dc2061 100755 --- a/src/Home/Net/Utilities/NetHandler.ZC +++ b/src/Home/Net/Utilities/NetHandler.ZC @@ -37,6 +37,16 @@ U0 NetQueueEntryHandle(CNetQueueEntry *entry) EthernetFrameParse(ðernet_frame, entry->frame, entry->packet_length); + U8 *mac = EthernetMACGet(); + Bool is_our_mac = !MemCompare(mac, ethernet_frame.destination_address, MAC_ADDRESS_LENGTH); // check the RX packet MAC against local MAC + Bool is_broadcast = !MemCompare(ethernet_globals.ethernet_broadcast, ethernet_frame.destination_address, MAC_ADDRESS_LENGTH); // check the RX packet MAC against broadcast MAC + + if (!is_our_mac && !is_broadcast) + { + NetLog("HANDLE NETQUEUE ENTRY: Not for us, discarding."); + return; + } + switch (ethernet_frame.ethertype) { case ETHERTYPE_ARP: From 7b9eb3b2935f97f4aa79fbd623f32f8365c1bab6 Mon Sep 17 00:00:00 2001 From: Arsenic Blood <127725014+GutPuncher@users.noreply.github.com> Date: Tue, 5 Mar 2024 02:02:33 -0500 Subject: [PATCH 13/48] inc version number for 91fff8c --- src/Kernel/KGlobals.ZC | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Kernel/KGlobals.ZC b/src/Kernel/KGlobals.ZC index 8518f8fd..965137cd 100755 --- a/src/Kernel/KGlobals.ZC +++ b/src/Kernel/KGlobals.ZC @@ -14,7 +14,7 @@ U8 *rev_bits_table; //Table with U8 bits reversed CDate local_time_offset; F64 *pow10_I64, sys_os_version = 2.03; -U64 sys_os_version_sub = 111; +U64 sys_os_version_sub = 112; U8 *sys_os_version_str; U8 *sys_os_version_full; U8 *sys_os_version_nice; From bf1115f2178c4dac04720a47f7306c2b37b830b2 Mon Sep 17 00:00:00 2001 From: GutPuncher Date: Tue, 5 Mar 2024 02:06:04 -0500 Subject: [PATCH 14/48] feat: build scripts updates --- build/git-pr-switch.sh | 2 +- build/sync.sh | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/build/git-pr-switch.sh b/build/git-pr-switch.sh index d5b3585b..44dec00b 100755 --- a/build/git-pr-switch.sh +++ b/build/git-pr-switch.sh @@ -15,7 +15,7 @@ read -p "Enter fork branch name: " FORK_BRANCH echo $FORK_BRANCH FORK_LOCAL=$FORK_BRANCH"-testing" echo "Creating new local branch for testing: "$FORK_LOCAL" ..." -git checkout -b $FORK_LOCAL +git checkout -B $FORK_LOCAL echo "Pulling changes from user's branch into new local branch..." git pull https://github.com/$FORK_USERNAME/ZealOS.git $FORK_BRANCH diff --git a/build/sync.sh b/build/sync.sh index 152cb605..bc10401f 100755 --- a/build/sync.sh +++ b/build/sync.sh @@ -90,6 +90,7 @@ else umount_vdisk [ -f ../src/Tmp/AUTO.ISO.C ] && mv ../src/Tmp/AUTO.ISO.C ./AUTO.ISO echo "Finished." + cd ../ git status ;; vm) From cd019bb3efb83676406c733458f1549843bec1ed Mon Sep 17 00:00:00 2001 From: GutPuncher Date: Tue, 5 Mar 2024 05:12:24 -0500 Subject: [PATCH 15/48] feat: CI build scripts #99 merge and updates --- .github/workflows/build.yml | 21 ++++++++++------- build/build-iso.sh | 45 ++++++++++++++++--------------------- 2 files changed, 32 insertions(+), 34 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index eeda77ce..8bcf1203 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -2,13 +2,15 @@ name: Build Application on: push: - branches-ignore: - - 'stable' + branches: + - 'master' paths-ignore: - '**.md' - 'screenshots/**' - '**/LICENSE' pull_request: + branches: + - 'master' paths-ignore: - '**.md' - 'screenshots/**' @@ -18,7 +20,7 @@ on: jobs: build: name: Build - runs-on: self-hosted + runs-on: ubuntu-latest steps: - name: Checkout @@ -37,11 +39,14 @@ jobs: ./build-iso.sh --headless cd .. - - name: Upload artifacts - uses: actions/upload-artifact@v3 + - name: Releasing latest + if: ${{ success() }} + uses: "GutPuncher/action-automatic-releases@latest" with: - name: ISOs - path: | - build/*.iso + repo_token: "${{ secrets.GITHUB_TOKEN }}" + automatic_release_tag: "latest" + prerelease: false + title: "Pre-Built ISOs [${{ github.sha }}]" + files: ./build/*.iso if-no-files-found: error diff --git a/build/build-iso.sh b/build/build-iso.sh index 8aa755f2..80bf3d97 100755 --- a/build/build-iso.sh +++ b/build/build-iso.sh @@ -14,16 +14,9 @@ then fi [ "$1" = "--headless" ] && QEMU_HEADLESS='-display none' -SUDO='none' -command -v doas && SUDO=doas -command -v sudo && SUDO=sudo -if [ "$SUDO" = "none" ] ; then - echo 'No sudo or doas installed. Cannot proceed.' - exit 1 -fi KVM='' -(lsmod | grep -q kvm) && KVM=',accel=kvm' +(lsmod | grep -q kvm) && KVM=' -accel kvm' # Set this true if you want to test ISOs in QEMU after building. TESTING=false @@ -37,16 +30,16 @@ TMPMOUNT="$TMPDIR/mnt" QEMU_BIN_PATH=$(dirname "$(which qemu-system-x86_64)") mount_tempdisk() { - $SUDO modprobe nbd - $SUDO $QEMU_BIN_PATH/qemu-nbd -c /dev/nbd0 -f raw $TMPDISK - $SUDO partprobe /dev/nbd0 - $SUDO mount /dev/nbd0p1 $TMPMOUNT + sudo modprobe nbd + sudo $QEMU_BIN_PATH/qemu-nbd -c /dev/nbd0 -f raw $TMPDISK + sudo partprobe /dev/nbd0 + sudo mount /dev/nbd0p1 $TMPMOUNT } umount_tempdisk() { sync - $SUDO umount $TMPMOUNT - $SUDO $QEMU_BIN_PATH/qemu-nbd -d /dev/nbd0 + sudo umount $TMPMOUNT + sudo $QEMU_BIN_PATH/qemu-nbd -d /dev/nbd0 } [ ! -d $TMPMOUNT ] && mkdir -p $TMPMOUNT @@ -59,19 +52,19 @@ set +e echo "Making temp vdisk, running auto-install ..." $QEMU_BIN_PATH/qemu-img create -f raw $TMPDISK 1024M -$QEMU_BIN_PATH/qemu-system-x86_64 -machine q35$KVM -drive format=raw,file=$TMPDISK -m 1G -rtc base=localtime -smp 4 -cdrom AUTO.ISO -device isa-debug-exit $QEMU_HEADLESS +$QEMU_BIN_PATH/qemu-system-x86_64 -machine q35 $KVM -drive format=raw,file=$TMPDISK -m 1G -rtc base=localtime -smp 4 -cdrom AUTO.ISO -device isa-debug-exit $QEMU_HEADLESS echo "Copying all src/ code into vdisk Tmp/OSBuild/ ..." rm ../src/Home/Registry.ZC 2> /dev/null rm ../src/Home/MakeHome.ZC 2> /dev/null rm ../src/Boot/Kernel.ZXE 2> /dev/null mount_tempdisk -$SUDO mkdir $TMPMOUNT/Tmp/OSBuild/ -$SUDO cp -r ../src/* $TMPMOUNT/Tmp/OSBuild +sudo mkdir $TMPMOUNT/Tmp/OSBuild/ +sudo cp -r ../src/* $TMPMOUNT/Tmp/OSBuild umount_tempdisk echo "Rebuilding kernel headers, kernel, OS, and building Distro ISO ..." -$QEMU_BIN_PATH/qemu-system-x86_64 -machine q35$KVM -drive format=raw,file=$TMPDISK -m 1G -rtc base=localtime -smp 4 -device isa-debug-exit $QEMU_HEADLESS +$QEMU_BIN_PATH/qemu-system-x86_64 -machine q35 $KVM -drive format=raw,file=$TMPDISK -m 1G -rtc base=localtime -smp 4 -device isa-debug-exit $QEMU_HEADLESS LIMINE_BINARY_BRANCH="v6.x-branch-binary" @@ -105,7 +98,7 @@ sed -i "s/\[\]/\[$(grep -o "0x" ./limine/limine-bios-hdd.h | wc -l)\]/g" limine/ mount_tempdisk echo "Extracting MyDistro ISO from vdisk ..." cp $TMPMOUNT/Tmp/MyDistro.ISO.C ./ZealOS-MyDistro.iso -$SUDO rm $TMPMOUNT/Tmp/MyDistro.ISO.C 2> /dev/null +sudo rm $TMPMOUNT/Tmp/MyDistro.ISO.C 2> /dev/null echo "Setting up temp ISO directory contents for use with limine xorriso command ..." sudo cp -rf $TMPMOUNT/* $TMPISODIR sudo rm $TMPISODIR/Boot/OldMBR.BIN 2> /dev/null @@ -119,8 +112,8 @@ sudo cp limine/limine-bios.sys $TMPISODIR/Boot/Limine-BIOS.SYS sudo cp ../zealbooter/bin/kernel $TMPISODIR/Boot/ZealBooter.ELF sudo cp ../zealbooter/Limine.CFG $TMPISODIR/Boot/Limine.CFG echo "Copying DVDKernel.ZXE over ISO Boot/Kernel.ZXE ..." -$SUDO mv $TMPMOUNT/Tmp/DVDKernel.ZXE $TMPISODIR/Boot/Kernel.ZXE -$SUDO rm $TMPISODIR/Tmp/DVDKernel.ZXE 2> /dev/null +sudo mv $TMPMOUNT/Tmp/DVDKernel.ZXE $TMPISODIR/Boot/Kernel.ZXE +sudo rm $TMPISODIR/Tmp/DVDKernel.ZXE 2> /dev/null umount_tempdisk xorriso -joliet "on" -rockridge "on" -as mkisofs -b Boot/Limine-BIOS-CD.BIN \ @@ -141,11 +134,11 @@ if [ "$TESTING" = true ]; then cd .. fi echo "Testing limine-zealbooter-xorriso isohybrid boot in UEFI mode ..." - $QEMU_BIN_PATH/qemu-system-x86_64 -machine q35$KVM -m 1G -rtc base=localtime -bios ovmf/OVMF.fd -smp 4 -cdrom ZealOS-limine.iso $QEMU_HEADLESS + $QEMU_BIN_PATH/qemu-system-x86_64 -machine q35 $KVM -m 1G -rtc base=localtime -bios ovmf/OVMF.fd -smp 4 -cdrom ZealOS-limine.iso $QEMU_HEADLESS echo "Testing limine-zealbooter-xorriso isohybrid boot in BIOS mode ..." - $QEMU_BIN_PATH/qemu-system-x86_64 -machine q35$KVM -m 1G -rtc base=localtime -smp 4 -cdrom ZealOS-limine.iso $QEMU_HEADLESS + $QEMU_BIN_PATH/qemu-system-x86_64 -machine q35 $KVM -m 1G -rtc base=localtime -smp 4 -cdrom ZealOS-limine.iso $QEMU_HEADLESS echo "Testing native ZealC MyDistro legacy ISO in BIOS mode ..." - $QEMU_BIN_PATH/qemu-system-x86_64 -machine q35$KVM -m 1G -rtc base=localtime -smp 4 -cdrom ZealOS-MyDistro.iso $QEMU_HEADLESS + $QEMU_BIN_PATH/qemu-system-x86_64 -machine q35 $KVM -m 1G -rtc base=localtime -smp 4 -cdrom ZealOS-MyDistro.iso $QEMU_HEADLESS fi # comment these 2 lines if you want lingering old Distro ISOs @@ -156,8 +149,8 @@ mv ./ZealOS-MyDistro.iso ./ZealOS-PublicDomain-BIOS-$(date +%Y-%m-%d-%H_%M_%S).i mv ./ZealOS-limine.iso ./ZealOS-BSD2-UEFI-$(date +%Y-%m-%d-%H_%M_%S).iso echo "Deleting temp folder ..." -$SUDO rm -rf $TMPDIR -$SUDO rm -rf $TMPISODIR +sudo rm -rf $TMPDIR +sudo rm -rf $TMPISODIR echo "Finished." echo echo "ISOs built:" From bb6c4642c208748f3757eeaf4dc349ef8df4070c Mon Sep 17 00:00:00 2001 From: GutPuncher Date: Tue, 5 Mar 2024 05:21:29 -0500 Subject: [PATCH 16/48] feat: CI scripts updates --- .github/workflows/build.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8bcf1203..335d4b2c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -33,7 +33,14 @@ jobs: sudo apt-get -y update sudo apt-get -y install build-essential git xorriso qemu-system-x86 + - name: Enable KVM group perms + run: | + echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules + sudo udevadm control --reload-rules + sudo udevadm trigger --name-match=kvm + - name: Build ISOs + if: ${{ success() }} run: | cd build ./build-iso.sh --headless From f870158a0c5d704d04e3b4591ae30662f1c0c040 Mon Sep 17 00:00:00 2001 From: Arsenic Blood <127725014+GutPuncher@users.noreply.github.com> Date: Wed, 6 Mar 2024 22:52:08 -0500 Subject: [PATCH 17/48] Update build.yml --- .github/workflows/build.yml | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 335d4b2c..838cc814 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,4 +1,4 @@ -name: Build Application +name: Build ZealOS ISOs on: push: @@ -33,21 +33,21 @@ jobs: sudo apt-get -y update sudo apt-get -y install build-essential git xorriso qemu-system-x86 - - name: Enable KVM group perms + - name: Enable KVM Group Perms run: | echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules sudo udevadm control --reload-rules sudo udevadm trigger --name-match=kvm - - name: Build ISOs + - name: Run ISOs Build Script if: ${{ success() }} run: | cd build ./build-iso.sh --headless cd .. - - name: Releasing latest - if: ${{ success() }} + - name: Releasing Latest ISOs + if: ${{ success() && github.event_name = 'push'}} uses: "GutPuncher/action-automatic-releases@latest" with: repo_token: "${{ secrets.GITHUB_TOKEN }}" @@ -55,5 +55,8 @@ jobs: prerelease: false title: "Pre-Built ISOs [${{ github.sha }}]" files: ./build/*.iso - if-no-files-found: error + - name: OK + if: ${{ success() }} + run: | + echo "Build OK" From a308c6955c91c135a08cb8525fa25be3c74d2329 Mon Sep 17 00:00:00 2001 From: Arsenic Blood <127725014+GutPuncher@users.noreply.github.com> Date: Wed, 6 Mar 2024 22:52:53 -0500 Subject: [PATCH 18/48] Update build.yml --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 838cc814..3f539841 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -47,7 +47,7 @@ jobs: cd .. - name: Releasing Latest ISOs - if: ${{ success() && github.event_name = 'push'}} + if: ${{ success() && github.event_name == 'push'}} uses: "GutPuncher/action-automatic-releases@latest" with: repo_token: "${{ secrets.GITHUB_TOKEN }}" From 80ce5320721c745d2e8e261496906031933030ec Mon Sep 17 00:00:00 2001 From: Arsenic Blood <127725014+GutPuncher@users.noreply.github.com> Date: Wed, 6 Mar 2024 22:56:09 -0500 Subject: [PATCH 19/48] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 08c6cae6..d9a27101 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # ZealOS -[![Discord](https://img.shields.io/discord/934200098144022609?color=7289DA&label=Discord&logo=discord&logoColor=white)](https://discord.gg/rK6U3xdr7D) [![](https://img.shields.io/badge/wiki-documentation-forestgreen)](https://zeal-operating-system.github.io/ZealOS-wiki/) +[![Discord](https://img.shields.io/discord/934200098144022609?color=7289DA&label=Discord&logo=discord&logoColor=white)](https://discord.gg/rK6U3xdr7D) [![](https://img.shields.io/badge/wiki-documentation-forestgreen)](https://zeal-operating-system.github.io/ZealOS-wiki/) [![Build ZealOS ISOs](https://github.com/Zeal-Operating-System/ZealOS/actions/workflows/build.yml/badge.svg)](https://github.com/Zeal-Operating-System/ZealOS/actions/workflows/build.yml) The Zeal Operating System is a modernized fork of the 64-bit Temple Operating System. Guiding principles of development include transparency, full user control, and adherence to public-domain/open-source implementations. From 3809e158494049764872a2464e5dd7f942d458f2 Mon Sep 17 00:00:00 2001 From: retu2libc Date: Wed, 6 Mar 2024 02:47:04 -0500 Subject: [PATCH 20/48] On PCNet nics enable FCS check and strip via ASTRP_RCV --- src/Home/Net/Drivers/PCNet.ZC | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/Home/Net/Drivers/PCNet.ZC b/src/Home/Net/Drivers/PCNet.ZC index 7ca8b800..bf84da61 100755 --- a/src/Home/Net/Drivers/PCNet.ZC +++ b/src/Home/Net/Drivers/PCNet.ZC @@ -59,6 +59,7 @@ #define PCNET_INT_TINTM 9 // Transmit Interrupt Mask #define PCNET_INT_RINTM 10 // Receive Interrupt Mask +#define PCNET_FEATURE_ASTRPRCV 10 #define PCNET_FEATURE_APADXMT 11 #define PCNET_BCR_MISC_CONFIG_ASEL 1 @@ -455,7 +456,7 @@ U0 PCNetInterruptCSRSet() U0 PCNetTXAutoPadEnable() {/* AMD PCNet datasheet p.1-958 Setting bit 11 (Auto Pad Transmit) allows - shoft transmit frames to be automatically + short transmit frames to be automatically extended to 64 bytes. */ U32 csr = PCNetCSRRead(PCNET_CSR_FEATURECTRL); @@ -465,6 +466,19 @@ U0 PCNetTXAutoPadEnable() PCNetCSRWrite(PCNET_CSR_FEATURECTRL, csr); } +U0 PCNetRXAutoStripEnable() +{/* AMD PCNet datasheet p.1-958 + Setting bit 10 (Auto Strip Receive) allows + pad and FCS fields to be automatically + stripped. ONLY WORKS ON 802.3!!! */ + + U32 csr = PCNetCSRRead(PCNET_CSR_FEATURECTRL); + + Bts(&csr, PCNET_FEATURE_ASTRPRCV); + + PCNetCSRWrite(PCNET_CSR_FEATURECTRL, csr); +} + U0 PCNetConfigModeExit() {/* AMD PCNet datasheet p.1-954 PCNet controller can be started @@ -749,6 +763,8 @@ U0 PCNetInit() PCNetTXAutoPadEnable; + PCNetRXAutoStripEnable; + PCNetAutoLinkSelect; PCNetEnableFullDuplex; @@ -845,4 +861,4 @@ U0 NetStart() PCNetCSRWrite(PCNET_CSR_CTRLSTATUS, csr); } -PCNetInit; \ No newline at end of file +PCNetInit; From f709dc872ab0c41514ba13c2761a3539ec05c2c8 Mon Sep 17 00:00:00 2001 From: retu2libc Date: Wed, 6 Mar 2024 02:48:46 -0500 Subject: [PATCH 21/48] Deduce when ethertype field is actually data length --- src/Home/Net/Protocols/Ethernet.ZC | 19 +++++++++---------- src/Home/Net/Utilities/Net.HH | 3 +++ 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/Home/Net/Protocols/Ethernet.ZC b/src/Home/Net/Protocols/Ethernet.ZC index 3a4de9f0..611b3b34 100755 --- a/src/Home/Net/Protocols/Ethernet.ZC +++ b/src/Home/Net/Protocols/Ethernet.ZC @@ -27,17 +27,13 @@ U0 EthernetGlobalsInit() } } -//TODO: check length , figure out the length+4 U0 EthernetFrameParse(CEthernetFrame *frame_out, U8 *frame, U16 length) { - //TODO: Check length ! We need to figure out what - //lengths are appropriate - - //Shrine also says MemCopy has a - //high overhead. Almost tempted to say that means that a lot - //of the current system should be done with less extra allocation - //altogether, more passing. - //In practice, MemCopy causes the most slowdown on bare-metal. + // Shrine says MemCopy has a high overhead. + // Almost tempted to say that means that a lot + // of the current system should be done with + // less extra allocation altogether, more passing. + // In practice, MemCopy causes the most slowdown on bare-metal. NetLog("ETHERNET FRAME PARSE: Parsing frame, copying out to frame_out param."); @@ -49,7 +45,10 @@ U0 EthernetFrameParse(CEthernetFrame *frame_out, U8 *frame, U16 length) frame_out->data = frame + ETHERNET_DATA_OFFSET; - frame_out->length = length - ETHERNET_MAC_HEADER_LENGTH - 4; // He has a comment literally just saying "??". + or - 4? + if (frame_out->ethertype <= ETHERNET_v2_MTU) // check if the field is a length or an ethertype + frame_out->length = frame_out->ethertype; + else + frame_out->length = length - ETHERNET_MAC_HEADER_LENGTH - FCS_LENGTH; } U0 EthernetFrameFinish(I64 de_index) diff --git a/src/Home/Net/Utilities/Net.HH b/src/Home/Net/Utilities/Net.HH index 677f37ac..0953fd61 100755 --- a/src/Home/Net/Utilities/Net.HH +++ b/src/Home/Net/Utilities/Net.HH @@ -5,11 +5,14 @@ #define ETHERNET_ETHERTYPE_OFFSET 12 #define ETHERNET_DATA_OFFSET 14 #define MAC_ADDRESS_LENGTH 6 +#define FCS_LENGTH 4 /* Ethernet Frame Size. Linux uses 1544, OSDev and Shrine use 1548. Based on IEEE 802.3as, max frame size was agreed upon as 2000 bytes. */ #define ETHERNET_FRAME_SIZE 2000 +#define ETHERNET_v2_MTU 1500 + #define HTYPE_ETHERNET 1 #define HLEN_ETHERNET 6 #define PLEN_IPV4 4 From 8662e5ca5e703c9528120e7ca03aed3be98e5496 Mon Sep 17 00:00:00 2001 From: GutPuncher Date: Wed, 6 Mar 2024 23:14:57 -0500 Subject: [PATCH 22/48] chore: inc os version patch num --- src/Kernel/KGlobals.ZC | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Kernel/KGlobals.ZC b/src/Kernel/KGlobals.ZC index 965137cd..c794b0eb 100755 --- a/src/Kernel/KGlobals.ZC +++ b/src/Kernel/KGlobals.ZC @@ -14,7 +14,7 @@ U8 *rev_bits_table; //Table with U8 bits reversed CDate local_time_offset; F64 *pow10_I64, sys_os_version = 2.03; -U64 sys_os_version_sub = 112; +U64 sys_os_version_sub = 113; U8 *sys_os_version_str; U8 *sys_os_version_full; U8 *sys_os_version_nice; From 6c976d8b561fe50de34c5453213861b1fdf8584f Mon Sep 17 00:00:00 2001 From: retu2libc Date: Thu, 7 Mar 2024 00:05:39 -0500 Subject: [PATCH 23/48] Offload FCS to driver specific code --- src/Home/Net/Drivers/PCNet.ZC | 8 +++++++- src/Home/Net/Protocols/Ethernet.ZC | 7 +++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/Home/Net/Drivers/PCNet.ZC b/src/Home/Net/Drivers/PCNet.ZC index bf84da61..637956de 100755 --- a/src/Home/Net/Drivers/PCNet.ZC +++ b/src/Home/Net/Drivers/PCNet.ZC @@ -635,7 +635,13 @@ I64 PCNetPacketReceive(U8 **packet_buffer_out, U16 *packet_length_out) NetDebug("PCNET RECEIVE PACKET: de_index incremented = 0x%0X", pcnet.current_rx_de_index); *packet_buffer_out = pcnet.rx_buffer_addr_phys + de_index * ETHERNET_FRAME_SIZE; - *packet_length_out = packet_length; + + // ASTRPRCV causes 802.3 packets to be stripped and FCS to be checked + U16 ethertype = (*packet_buffer_out)[ETHERNET_ETHERTYPE_OFFSET + 1] | (*packet_buffer_out)[ETHERNET_ETHERTYPE_OFFSET] << 8; + if (ethertype < ETHERNET_v2_MTU) + *packet_length_out = ethertype; + else + *packet_length_out = packet_length - FCS_LENGTH; // ethertype ii TODO: Validate FCS return de_index; } diff --git a/src/Home/Net/Protocols/Ethernet.ZC b/src/Home/Net/Protocols/Ethernet.ZC index 611b3b34..cdd54b33 100755 --- a/src/Home/Net/Protocols/Ethernet.ZC +++ b/src/Home/Net/Protocols/Ethernet.ZC @@ -29,6 +29,8 @@ U0 EthernetGlobalsInit() U0 EthernetFrameParse(CEthernetFrame *frame_out, U8 *frame, U16 length) { + // length is assumed to NOT include the FCS. + // Shrine says MemCopy has a high overhead. // Almost tempted to say that means that a lot // of the current system should be done with @@ -45,10 +47,7 @@ U0 EthernetFrameParse(CEthernetFrame *frame_out, U8 *frame, U16 length) frame_out->data = frame + ETHERNET_DATA_OFFSET; - if (frame_out->ethertype <= ETHERNET_v2_MTU) // check if the field is a length or an ethertype - frame_out->length = frame_out->ethertype; - else - frame_out->length = length - ETHERNET_MAC_HEADER_LENGTH - FCS_LENGTH; + frame_out->length = length - ETHERNET_MAC_HEADER_LENGTH; } U0 EthernetFrameFinish(I64 de_index) From 7edf953c2465cb0c7fee16662976e801f58567de Mon Sep 17 00:00:00 2001 From: GutPuncher Date: Thu, 7 Mar 2024 00:22:13 -0500 Subject: [PATCH 24/48] chore: inc os version patch num --- src/Kernel/KGlobals.ZC | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Kernel/KGlobals.ZC b/src/Kernel/KGlobals.ZC index c794b0eb..783ea116 100755 --- a/src/Kernel/KGlobals.ZC +++ b/src/Kernel/KGlobals.ZC @@ -14,7 +14,7 @@ U8 *rev_bits_table; //Table with U8 bits reversed CDate local_time_offset; F64 *pow10_I64, sys_os_version = 2.03; -U64 sys_os_version_sub = 113; +U64 sys_os_version_sub = 114; U8 *sys_os_version_str; U8 *sys_os_version_full; U8 *sys_os_version_nice; From d63cfd809975600aa2af8a2928a9e6530f3c3170 Mon Sep 17 00:00:00 2001 From: GutPuncher Date: Mon, 11 Mar 2024 02:05:24 -0400 Subject: [PATCH 25/48] feat: CI build check for ISOs and fail if missing --- .github/workflows/build.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3f539841..f07d2553 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -40,12 +40,19 @@ jobs: sudo udevadm trigger --name-match=kvm - name: Run ISOs Build Script + timeout-minutes: 10 if: ${{ success() }} run: | cd build ./build-iso.sh --headless cd .. + - name: ISO Check + if: ${{ success() && hashFiles('./build/*.iso') == '' }} + run: | + echo "ISOs not built!" + exit 1 + - name: Releasing Latest ISOs if: ${{ success() && github.event_name == 'push'}} uses: "GutPuncher/action-automatic-releases@latest" From fca34d8b3d34555faaec60fdf31122331585fa34 Mon Sep 17 00:00:00 2001 From: GutPuncher Date: Mon, 11 Mar 2024 02:52:35 -0400 Subject: [PATCH 26/48] feat: revise/refactor #124 , inc patch num --- src/Home/Yuugure.ZC | 29 ----------------------------- src/HomeKeyPlugIns.ZC | 4 ++-- src/Kernel/Job.ZC | 8 ++++++++ src/Kernel/KGlobals.ZC | 2 +- src/Kernel/KernelC.HH | 1 + 5 files changed, 12 insertions(+), 32 deletions(-) delete mode 100755 src/Home/Yuugure.ZC diff --git a/src/Home/Yuugure.ZC b/src/Home/Yuugure.ZC deleted file mode 100755 index e449e4c5..00000000 --- a/src/Home/Yuugure.ZC +++ /dev/null @@ -1,29 +0,0 @@ -I64 initialWinBottom = sys_task->win_bottom; -CDoc *initialDisplayDoc = sys_task->display_doc; - -U0 Yuugure() -{ - // Hide SysLog - if (sys_task->win_bottom != 0) { - while(sys_task->win_bottom > -1){ - sys_task->win_bottom--; - Sleep(20); - } - - sys_task->display_doc = NULL; - WinBorder(OFF, sys_task); - } - // Show SysLog - else { - WinBorder(ON, sys_task); - sys_task->display_doc = initialDisplayDoc; - - while(sys_task->win_bottom != initialWinBottom){ - sys_task->win_bottom++; - Sleep(20); - } - - } - - WinZBufUpdate; -} diff --git a/src/HomeKeyPlugIns.ZC b/src/HomeKeyPlugIns.ZC index 22e3f497..0563468d 100755 --- a/src/HomeKeyPlugIns.ZC +++ b/src/HomeKeyPlugIns.ZC @@ -114,9 +114,9 @@ Bool MyPutKey(I64 ch, I64 sc) if (!(sc & SCF_SHIFT)) { if (sc & SCF_KEY_DESC) - KeyDescSet("Cmd /Yuugure"); + KeyDescSet("Cmd /SysLogToggle"); else - Yuugure; + SysLogToggle; } return TRUE; diff --git a/src/Kernel/Job.ZC b/src/Kernel/Job.ZC index 983a40da..a27489ed 100755 --- a/src/Kernel/Job.ZC +++ b/src/Kernel/Job.ZC @@ -504,6 +504,14 @@ I64 Sys(U8 *format, ...) return res; } +U0 SysLogToggle() +{ + if (Bt(&sys_task->display_flags, DISPLAYf_SHOW)) + LBtr(&sys_task->display_flags, DISPLAYf_SHOW); + else + LBts(&sys_task->display_flags, DISPLAYf_SHOW); +} + U0 SysLog(U8 *format, ...) {//Display text in sys_task. U8 *buf = StrPrintJoin(NULL, format, argc, argv); diff --git a/src/Kernel/KGlobals.ZC b/src/Kernel/KGlobals.ZC index 783ea116..31b9bdac 100755 --- a/src/Kernel/KGlobals.ZC +++ b/src/Kernel/KGlobals.ZC @@ -14,7 +14,7 @@ U8 *rev_bits_table; //Table with U8 bits reversed CDate local_time_offset; F64 *pow10_I64, sys_os_version = 2.03; -U64 sys_os_version_sub = 114; +U64 sys_os_version_sub = 115; U8 *sys_os_version_str; U8 *sys_os_version_full; U8 *sys_os_version_nice; diff --git a/src/Kernel/KernelC.HH b/src/Kernel/KernelC.HH index 3c984c9a..18c28999 100755 --- a/src/Kernel/KernelC.HH +++ b/src/Kernel/KernelC.HH @@ -437,6 +437,7 @@ public extern I64 Scale2Mem(I64 min, I64 max, I64 limit=2*1024*1024*1024); public extern U0 SysErr( U8 *format, ...); public extern U0 SysWarn(U8 *format, ...); public extern U0 SysLog( U8 *format, ...); +public extern U0 SysLogToggle(); public extern I64 ExeCmdLine(CCompCtrl *cc); public extern U0 JobDel(CJob *tmpc); public extern I64 JobsHandler(I64 run_flags, CTask *task=NULL); From 314b4630640b615bc7fc414d5f98f0ff5ac21a27 Mon Sep 17 00:00:00 2001 From: Arsenic Blood <127725014+GutPuncher@users.noreply.github.com> Date: Mon, 11 Mar 2024 02:54:46 -0400 Subject: [PATCH 27/48] Update MakeHome.ZC --- src/MakeHome.ZC | 1 - 1 file changed, 1 deletion(-) diff --git a/src/MakeHome.ZC b/src/MakeHome.ZC index 9b650e41..39f77698 100755 --- a/src/MakeHome.ZC +++ b/src/MakeHome.ZC @@ -8,7 +8,6 @@ Cd(__DIR__);; #include "~/HomeWrappers" MapFileLoad("::/Kernel/Kernel"); MapFileLoad("::/Compiler/Compiler"); -#include "~/Yuugure" #include "~/HomeKeyPlugIns" #include "~/HomeSys" Cd("..");; From cf4d34c8b2d3eec8d18b3c097226c018b73f96a5 Mon Sep 17 00:00:00 2001 From: Arsenic Blood <127725014+GutPuncher@users.noreply.github.com> Date: Mon, 11 Mar 2024 02:59:45 -0400 Subject: [PATCH 28/48] Update Display.ZC --- src/Kernel/Display.ZC | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Kernel/Display.ZC b/src/Kernel/Display.ZC index 5c0ce6f7..ef89e85f 100755 --- a/src/Kernel/Display.ZC +++ b/src/Kernel/Display.ZC @@ -47,7 +47,8 @@ See also $LK,"GrUpdateScreen",A="MN:GrUpdateScreen"$(). } else if (ch == '\n') { - do RawPutChar(CH_SPACE); + do + RawPutChar(CH_SPACE); while (text.raw_col % text.cols); } else if (Bt(char_bmp_displayable, ch)) From d77e52698ff32109591208d05c477039bb12a0b2 Mon Sep 17 00:00:00 2001 From: Arsenic Blood <127725014+GutPuncher@users.noreply.github.com> Date: Mon, 11 Mar 2024 03:02:10 -0400 Subject: [PATCH 29/48] Update KGlobals.ZC --- src/Kernel/KGlobals.ZC | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Kernel/KGlobals.ZC b/src/Kernel/KGlobals.ZC index 31b9bdac..f5f71ef3 100755 --- a/src/Kernel/KGlobals.ZC +++ b/src/Kernel/KGlobals.ZC @@ -14,7 +14,7 @@ U8 *rev_bits_table; //Table with U8 bits reversed CDate local_time_offset; F64 *pow10_I64, sys_os_version = 2.03; -U64 sys_os_version_sub = 115; +U64 sys_os_version_sub = 116; U8 *sys_os_version_str; U8 *sys_os_version_full; U8 *sys_os_version_nice; From 8f9d48bb13eb012462bcae4125f7207add52df97 Mon Sep 17 00:00:00 2001 From: Arsenic Blood <127725014+GutPuncher@users.noreply.github.com> Date: Mon, 11 Mar 2024 03:04:39 -0400 Subject: [PATCH 30/48] Update KGlobals.ZC --- src/Kernel/KGlobals.ZC | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Kernel/KGlobals.ZC b/src/Kernel/KGlobals.ZC index f5f71ef3..4b26ecab 100755 --- a/src/Kernel/KGlobals.ZC +++ b/src/Kernel/KGlobals.ZC @@ -14,7 +14,7 @@ U8 *rev_bits_table; //Table with U8 bits reversed CDate local_time_offset; F64 *pow10_I64, sys_os_version = 2.03; -U64 sys_os_version_sub = 116; +U64 sys_os_version_sub = 117; U8 *sys_os_version_str; U8 *sys_os_version_full; U8 *sys_os_version_nice; From 43a65807eff0966db92444a6f9b2254d4b98a203 Mon Sep 17 00:00:00 2001 From: lachsdachs <118852858+lachsdachs@users.noreply.github.com> Date: Sat, 27 Apr 2024 17:55:56 +0200 Subject: [PATCH 31/48] upd link old one was broken --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d9a27101..ee1c27ff 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ Features in development include: - [32-bit color VBE graphics](https://github.com/TempleProgramming/HolyGL) - Fully-functional AHCI support - Network card drivers and a networking stack - - UEFI booting via [BSD2-licensed Limine bootloader](https://github.com/limine-bootloader/limine) and [Public Domain ZealBooter prekernel](/zealbooter/zealbooter.c) + - UEFI booting via [BSD2-licensed Limine bootloader](https://github.com/limine-bootloader/limine) and [Public Domain ZealBooter prekernel](/zealbooter/src/zealbooter.c) [Changes include](https://zeal-operating-system.github.io/Doc/ChangeLog.DD.html): - 60 FPS From 6789243978b9061f71488400eec8aec98b3c7a22 Mon Sep 17 00:00:00 2001 From: mintsuki Date: Wed, 14 Aug 2024 21:19:14 +0200 Subject: [PATCH 32/48] Update Zealbooter to Limine 8.x and backport template changes --- build/build-iso.sh | 4 +- src/Kernel/KernelA.HH | 2 +- src/Misc/OSInstall.ZC | 14 +++--- src/System/Boot/LimineMHDIns.ZC | 26 +++++------ zealbooter/GNUmakefile | 81 ++++++++++++++++----------------- zealbooter/Limine.CFG | 8 ---- zealbooter/limine.conf | 8 ++++ zealbooter/linker.ld | 30 +++++++----- zealbooter/src/zealbooter.c | 14 +++++- 9 files changed, 100 insertions(+), 87 deletions(-) delete mode 100755 zealbooter/Limine.CFG create mode 100644 zealbooter/limine.conf diff --git a/build/build-iso.sh b/build/build-iso.sh index 80bf3d97..125d3f8e 100755 --- a/build/build-iso.sh +++ b/build/build-iso.sh @@ -66,7 +66,7 @@ umount_tempdisk echo "Rebuilding kernel headers, kernel, OS, and building Distro ISO ..." $QEMU_BIN_PATH/qemu-system-x86_64 -machine q35 $KVM -drive format=raw,file=$TMPDISK -m 1G -rtc base=localtime -smp 4 -device isa-debug-exit $QEMU_HEADLESS -LIMINE_BINARY_BRANCH="v6.x-branch-binary" +LIMINE_BINARY_BRANCH="v8.x-binary" if [ -d "limine" ] then @@ -110,7 +110,7 @@ sudo cp limine/limine-uefi-cd.bin $TMPISODIR/Boot/Limine-UEFI-CD.BIN sudo cp limine/limine-bios-cd.bin $TMPISODIR/Boot/Limine-BIOS-CD.BIN sudo cp limine/limine-bios.sys $TMPISODIR/Boot/Limine-BIOS.SYS sudo cp ../zealbooter/bin/kernel $TMPISODIR/Boot/ZealBooter.ELF -sudo cp ../zealbooter/Limine.CFG $TMPISODIR/Boot/Limine.CFG +sudo cp ../zealbooter/limine.conf $TMPISODIR/Boot/Limine.CONF echo "Copying DVDKernel.ZXE over ISO Boot/Kernel.ZXE ..." sudo mv $TMPMOUNT/Tmp/DVDKernel.ZXE $TMPISODIR/Boot/Kernel.ZXE sudo rm $TMPISODIR/Tmp/DVDKernel.ZXE 2> /dev/null diff --git a/src/Kernel/KernelA.HH b/src/Kernel/KernelA.HH index c29354a6..94aa3200 100755 --- a/src/Kernel/KernelA.HH +++ b/src/Kernel/KernelA.HH @@ -3026,7 +3026,7 @@ class CAtapiModeWriteList #define FILEMASK_AOT "*.ZC*;*.HH*;*.PRJ*" #define FILEMASK_SRC "*.ZC*;*.HH*;*.IN*;*.PRJ*" #define FILEMASK_DD FILEMASK_SRC ";*.DD*" -#define FILEMASK_TXT FILEMASK_DD ";*.TXT*;*.CFG*" +#define FILEMASK_TXT FILEMASK_DD ";*.TXT*;*.CFG*;*.CONF*" #define FILEMASK_GR "*.GR*" #help_index "File/Low Level" diff --git a/src/Misc/OSInstall.ZC b/src/Misc/OSInstall.ZC index a51671c4..4d08768b 100755 --- a/src/Misc/OSInstall.ZC +++ b/src/Misc/OSInstall.ZC @@ -111,7 +111,7 @@ U0 OSMerge(U8 dst_drv, U8 src_drv=':') Del("B:/Misc/Bible.TXT"); // Deleting from B:/ prevents causing hang when merging large .TXT files, Del("B:/Misc/Clementine.TXT"); // they will instead be copied over from boot drive in OSMergeInner - Del("B:/Boot/Limine.CFG"); // Delete to make merge output ignore (copy) this, since it gets regenerated later + Del("B:/Boot/Limine.CONF"); // Delete to make merge output ignore (copy) this, since it gets regenerated later DocMax; @@ -129,7 +129,7 @@ U0 OSMerge(U8 dst_drv, U8 src_drv=':') ExePrint("Del(\"%C:/Boot/Limine-BIOS-CD.BIN\");", dst_drv); ExePrint("Del(\"%C:/Boot/Limine-UEFI-CD.BIN\");", dst_drv); - ExePrint("Del(\"%C:/Boot/Limine.CFG\");", dst_drv); + ExePrint("Del(\"%C:/Boot/Limine.CONF\");", dst_drv); ExePrint("Del(\"%C:/boot.catalog\");", dst_drv); } @@ -208,7 +208,7 @@ U0 OSUpgrade() if (ch == 'Z') { BootMHDIns(drv_let); - "\n(Generating optional UEFI-mode Limine.CFG...)\n"; + "\n(Generating optional UEFI-mode Limine.CONF...)\n"; LimineCFGMake(drv_let); } else @@ -247,7 +247,7 @@ U0 InstallDrive(U8 drv_let) ExePrint("Del(\"%C:/Boot/Limine-BIOS-CD.BIN\");", drv_let); ExePrint("Del(\"%C:/Boot/Limine-UEFI-CD.BIN\");", drv_let); - ExePrint("Del(\"%C:/Boot/Limine.CFG\");", drv_let); + ExePrint("Del(\"%C:/Boot/Limine.CONF\");", drv_let); ExePrint("Del(\"%C:/boot.catalog\");", drv_let); ExePrint("DirMake(\"%C:/Tmp\");", drv_let); @@ -351,7 +351,7 @@ U0 VMInstallWiz() if (ch == 'Z') { BootMHDIns('C'); - "\n(Generating optional UEFI-mode Limine.CFG...)\n"; + "\n(Generating optional UEFI-mode Limine.CONF...)\n"; LimineCFGMake('C'); } else @@ -467,8 +467,8 @@ U0 RegularInstallWiz() if (ch == 'Z') { BootMHDIns(drv_let); - "\n(Generating optional UEFI-mode Limine.CFG...)\n"; - LimineCFGMake(drv_let); // ensures we don't leave the LiveCD's Limine.CFG on the HDD + "\n(Generating optional UEFI-mode Limine.CONF...)\n"; + LimineCFGMake(drv_let); // ensures we don't leave the LiveCD's Limine.CONF on the HDD } else { diff --git a/src/System/Boot/LimineMHDIns.ZC b/src/System/Boot/LimineMHDIns.ZC index c87fbd7e..83d2e12b 100755 --- a/src/System/Boot/LimineMHDIns.ZC +++ b/src/System/Boot/LimineMHDIns.ZC @@ -13,18 +13,18 @@ U8 binary_limine_hdd_bin_data[0]; Bool LimineCFGMake(U8 drv_let) { - U8 *filename_cfg = MStrPrint("%C:/Boot/Limine.CFG", drv_let); + U8 *filename_cfg = MStrPrint("%C:/Boot/Limine.CONF", drv_let); CDoc *doc = DocNew(filename_cfg); CDrive *drive; CBlkDev *bd; I64 i; U8 *filename_sys, *filename_elf, *filename_zxe, *st; - "\nGenerating Limine.CFG ...\n"; + "\nGenerating Limine.CONF ...\n"; DocPrint(doc, - "TIMEOUT=2\n" - "INTERFACE_RESOLUTION=1024x768\n\n"); + "timeout: 2\n" + "interface_resolution: 1024x768\n\n"); "Searching drives for Limine bootloader files ...\n"; for (i = 0, drive = blkdev.drvs; i < DRIVES_NUM; i++, drive++) @@ -39,15 +39,15 @@ Bool LimineCFGMake(U8 drv_let) filename_zxe = MStrPrint("%C:/Boot/Kernel.ZXE", drv_let); if (FileFind(filename_sys) && FileFind(filename_elf) && FileFind(filename_zxe)) { - st = MStrPrint(":ZealOS %C:/\n" - "PROTOCOL=limine\n" - "RESOLUTION=1024x768\n" - "KERNEL_PATH=boot://%d/Boot/ZealBooter.ELF\n" - "MODULE_PATH=boot://%d/Boot/Kernel.ZXE\n" + st = MStrPrint("/ZealOS %C:/\n" + "protocol: limine\n" + "resolution: 1024x768\n" + "kernel_path: boot(%d):/Boot/ZealBooter.ELF\n" + "module_path: boot(%d):/Boot/Kernel.ZXE\n" "\n", drv_let, drive->prt_num + 1, drive->prt_num + 1); DocPrint(doc, st); - "%C:/ drive added as a Limine.CFG menu entry.\n", drv_let; + "%C:/ drive added as a Limine.CONF menu entry.\n", drv_let; } else "%C:/ drive is missing Limine bootloader files.\n", drv_let; @@ -56,9 +56,9 @@ Bool LimineCFGMake(U8 drv_let) DocWrite(doc); DocDel(doc); - "/Boot/Limine.CFG generated.\n"; + "/Boot/Limine.CONF generated.\n"; - "Copying Limine.CFG to all other drives ...\n"; + "Copying Limine.CONF to all other drives ...\n"; for (i = 0, drive = blkdev.drvs; i < DRIVES_NUM; i++, drive++) { if (drive->drive_signature == DRIVE_SIGNATURE_VAL && drive->fs_type == FSt_FAT32 && DriveIsWritable(drive->drv_let)) @@ -66,7 +66,7 @@ Bool LimineCFGMake(U8 drv_let) drv_let = Drive2Letter(drive); if (FileFind(filename_sys) && FileFind(filename_elf) && FileFind(filename_zxe)) { - st = MStrPrint("%C:/Boot/Limine.CFG", drv_let); + st = MStrPrint("%C:/Boot/Limine.CONF", drv_let); Copy(filename_cfg, st); } } diff --git a/zealbooter/GNUmakefile b/zealbooter/GNUmakefile index 33ca7959..079daac8 100644 --- a/zealbooter/GNUmakefile +++ b/zealbooter/GNUmakefile @@ -1,9 +1,9 @@ # Nuke built-in rules and variables. override MAKEFLAGS += -rR -# This is the name that our final kernel executable will have. +# This is the name that our final executable will have. # Change as needed. -override KERNEL := kernel +override OUTPUT := kernel # Convenience macro to reliably declare user overridable variables. define DEFAULT_VAR = @@ -15,34 +15,32 @@ define DEFAULT_VAR = endif endef -# It is suggested to use a custom built cross toolchain to build a kernel. -# We are using the standard "cc" here, it may work by using -# the host system's toolchain, but this is not guaranteed. -override DEFAULT_CC := cc -$(eval $(call DEFAULT_VAR,CC,$(DEFAULT_CC))) +# User controllable C compiler command. +override DEFAULT_KCC := cc +$(eval $(call DEFAULT_VAR,KCC,$(DEFAULT_KCC))) -# Same thing for "ld" (the linker). -override DEFAULT_LD := ld -$(eval $(call DEFAULT_VAR,LD,$(DEFAULT_LD))) +# User controllable linker command. +override DEFAULT_KLD := ld +$(eval $(call DEFAULT_VAR,KLD,$(DEFAULT_KLD))) # User controllable C flags. -override DEFAULT_CFLAGS := -g -O2 -pipe -$(eval $(call DEFAULT_VAR,CFLAGS,$(DEFAULT_CFLAGS))) +override DEFAULT_KCFLAGS := -g -O2 -pipe +$(eval $(call DEFAULT_VAR,KCFLAGS,$(DEFAULT_KCFLAGS))) # User controllable C preprocessor flags. We set none by default. -override DEFAULT_CPPFLAGS := -$(eval $(call DEFAULT_VAR,CPPFLAGS,$(DEFAULT_CPPFLAGS))) +override DEFAULT_KCPPFLAGS := +$(eval $(call DEFAULT_VAR,KCPPFLAGS,$(DEFAULT_KCPPFLAGS))) # User controllable nasm flags. -override DEFAULT_NASMFLAGS := -F dwarf -g -$(eval $(call DEFAULT_VAR,NASMFLAGS,$(DEFAULT_NASMFLAGS))) +override DEFAULT_KNASMFLAGS := -F dwarf -g +$(eval $(call DEFAULT_VAR,KNASMFLAGS,$(DEFAULT_KNASMFLAGS))) # User controllable linker flags. We set none by default. -override DEFAULT_LDFLAGS := -$(eval $(call DEFAULT_VAR,LDFLAGS,$(DEFAULT_LDFLAGS))) +override DEFAULT_KLDFLAGS := +$(eval $(call DEFAULT_VAR,KLDFLAGS,$(DEFAULT_KLDFLAGS))) # Internal C flags that should not be changed by the user. -override CFLAGS += \ +override KCFLAGS += \ -Wall \ -Wextra \ -std=gnu11 \ @@ -50,8 +48,9 @@ override CFLAGS += \ -fno-stack-protector \ -fno-stack-check \ -fno-lto \ - -fno-PIE \ -fno-PIC \ + -ffunction-sections \ + -fdata-sections \ -m64 \ -march=x86-64 \ -mno-80387 \ @@ -62,50 +61,46 @@ override CFLAGS += \ -mcmodel=kernel # Internal C preprocessor flags that should not be changed by the user. -override CPPFLAGS := \ +override KCPPFLAGS := \ -I src \ -I src/lib \ - $(CPPFLAGS) \ + $(KCPPFLAGS) \ -MMD \ -MP +# Internal nasm flags that should not be changed by the user. +override KNASMFLAGS += \ + -Wall \ + -f elf64 + # Internal linker flags that should not be changed by the user. -override LDFLAGS += \ +override KLDFLAGS += \ -m elf_x86_64 \ -nostdlib \ -static \ -z max-page-size=0x1000 \ + -gc-sections \ -T linker.ld -# Check if the linker supports -no-pie and enable it if it does. -ifeq ($(shell $(LD) --help 2>&1 | grep 'no-pie' >/dev/null 2>&1; echo $$?),0) - override LDFLAGS += -no-pie -endif - -# Internal nasm flags that should not be changed by the user. -override NASMFLAGS += \ - -Wall \ - -f elf64 - # Use "find" to glob all *.c, *.S, and *.asm files in the tree and obtain the # object and header dependency file names. -override CFILES := $(shell cd src && find -L . -type f -name '*.c') -override ASFILES := $(shell cd src && find -L . -type f -name '*.S') -override NASMFILES := $(shell cd src && find -L . -type f -name '*.asm') +override CFILES := $(shell cd src && find -L * -type f -name '*.c' | LC_ALL=C sort) +override ASFILES := $(shell cd src && find -L * -type f -name '*.S' | LC_ALL=C sort) +override NASMFILES := $(shell cd src && find -L * -type f -name '*.asm' | LC_ALL=C sort) override OBJ := $(addprefix obj/,$(CFILES:.c=.c.o) $(ASFILES:.S=.S.o) $(NASMFILES:.asm=.asm.o)) override HEADER_DEPS := $(addprefix obj/,$(CFILES:.c=.c.d) $(ASFILES:.S=.S.d)) # Default target. .PHONY: all -all: bin/$(KERNEL) +all: bin/$(OUTPUT) src/limine.h: curl -Lo $@ https://github.com/limine-bootloader/limine/raw/trunk/limine.h || cp ../build/limine/limine.h src/limine.h || echo "ERROR" -# Link rules for the final kernel executable. -bin/$(KERNEL): GNUmakefile linker.ld $(OBJ) +# Link rules for the final executable. +bin/$(OUTPUT): GNUmakefile linker.ld $(OBJ) mkdir -p "$$(dirname $@)" - $(LD) $(OBJ) $(LDFLAGS) -o $@ + $(KLD) $(OBJ) $(KLDFLAGS) -o $@ # Include header dependencies. -include $(HEADER_DEPS) @@ -113,17 +108,17 @@ bin/$(KERNEL): GNUmakefile linker.ld $(OBJ) # Compilation rules for *.c files. obj/%.c.o: src/%.c GNUmakefile src/limine.h mkdir -p "$$(dirname $@)" - $(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $@ + $(KCC) $(KCFLAGS) $(KCPPFLAGS) -c $< -o $@ # Compilation rules for *.S files. obj/%.S.o: src/%.S GNUmakefile src/limine.h mkdir -p "$$(dirname $@)" - $(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $@ + $(KCC) $(KCFLAGS) $(KCPPFLAGS) -c $< -o $@ # Compilation rules for *.asm (nasm) files. obj/%.asm.o: src/%.asm GNUmakefile mkdir -p "$$(dirname $@)" - nasm $(NASMFLAGS) $< -o $@ + nasm $(KNASMFLAGS) $< -o $@ # Remove object files and the final executable. .PHONY: clean diff --git a/zealbooter/Limine.CFG b/zealbooter/Limine.CFG deleted file mode 100755 index f0da0dca..00000000 --- a/zealbooter/Limine.CFG +++ /dev/null @@ -1,8 +0,0 @@ -TIMEOUT=2 -INTERFACE_RESOLUTION=1024x768 - -:ZealOS LiveCD -PROTOCOL=limine -RESOLUTION=1024x768 -KERNEL_PATH=boot:///Boot/ZealBooter.ELF -MODULE_PATH=boot:///Boot/Kernel.ZXE diff --git a/zealbooter/limine.conf b/zealbooter/limine.conf new file mode 100644 index 00000000..7c4e7414 --- /dev/null +++ b/zealbooter/limine.conf @@ -0,0 +1,8 @@ +timeout: 2 +interface_resolution: 1024x768 + +/ZealOS LiveCD + protocol: limine + resolution: 1024x768 + kernel_path: boot():/Boot/ZealBooter.ELF + module_path: boot():/Boot/Kernel.ZXE diff --git a/zealbooter/linker.ld b/zealbooter/linker.ld index 52f96f0d..417faa44 100644 --- a/zealbooter/linker.ld +++ b/zealbooter/linker.ld @@ -1,22 +1,22 @@ /* Tell the linker that we want an x86_64 ELF64 output file */ OUTPUT_FORMAT(elf64-x86-64) -OUTPUT_ARCH(i386:x86-64) -/* We want the symbol _start to be our entry point */ -ENTRY(_start) +/* We want the symbol kmain to be our entry point */ +ENTRY(kmain) /* Define the program headers we want so the bootloader gives us the right */ -/* MMU permissions */ +/* MMU permissions; this also allows us to exert more control over the linking */ +/* process. */ PHDRS { - text PT_LOAD FLAGS((1 << 0) | (1 << 2)) ; /* Execute + Read */ - rodata PT_LOAD FLAGS((1 << 2)) ; /* Read only */ - data PT_LOAD FLAGS((1 << 1) | (1 << 2)) ; /* Write + Read */ + text PT_LOAD; + rodata PT_LOAD; + data PT_LOAD; } SECTIONS { - /* We wanna be placed in the topmost 2GiB of the address space, for optimisations */ + /* We want to be placed in the topmost 2GiB of the address space, for optimisations */ /* and because that is what the Limine spec mandates. */ /* Any address in this region will do, but often 0xffffffff80000000 is chosen as */ /* that is the beginning of the region. */ @@ -27,17 +27,23 @@ SECTIONS } :text /* Move to the next memory page for .rodata */ - . += CONSTANT(MAXPAGESIZE); + . = ALIGN(CONSTANT(MAXPAGESIZE)); .rodata : { *(.rodata .rodata.*) } :rodata /* Move to the next memory page for .data */ - . += CONSTANT(MAXPAGESIZE); + . = ALIGN(CONSTANT(MAXPAGESIZE)); .data : { *(.data .data.*) + + /* Place the sections that contain the Limine requests as part of the .data */ + /* output section. */ + KEEP(*(.requests_start_marker)) + KEEP(*(.requests)) + KEEP(*(.requests_end_marker)) } :data /* NOTE: .bss needs to be the last thing mapped to :data, otherwise lots of */ @@ -49,9 +55,9 @@ SECTIONS *(COMMON) } :data - /* Discard .note.* and .eh_frame since they may cause issues on some hosts. */ + /* Discard .note.* and .eh_frame* since they may cause issues on some hosts. */ /DISCARD/ : { - *(.eh_frame) + *(.eh_frame*) *(.note .note.*) } } diff --git a/zealbooter/src/zealbooter.c b/zealbooter/src/zealbooter.c index 8d70a6d4..300289f0 100644 --- a/zealbooter/src/zealbooter.c +++ b/zealbooter/src/zealbooter.c @@ -4,31 +4,43 @@ #include #include +__attribute__((used, section(".requests_start_marker"))) +static volatile LIMINE_REQUESTS_START_MARKER; + +__attribute__((used, section(".requests_end_marker"))) +static volatile LIMINE_REQUESTS_END_MARKER; + +__attribute__((used, section(".requests"))) static volatile struct limine_module_request module_request = { .id = LIMINE_MODULE_REQUEST, .revision = 0 }; +__attribute__((used, section(".requests"))) static volatile struct limine_hhdm_request hhdm_request = { .id = LIMINE_HHDM_REQUEST, .revision = 0 }; +__attribute__((used, section(".requests"))) static volatile struct limine_memmap_request memmap_request = { .id = LIMINE_MEMMAP_REQUEST, .revision = 0 }; +__attribute__((used, section(".requests"))) static volatile struct limine_framebuffer_request framebuffer_request = { .id = LIMINE_FRAMEBUFFER_REQUEST, .revision = 0 }; +__attribute__((used, section(".requests"))) static volatile struct limine_smbios_request smbios_request = { .id = LIMINE_SMBIOS_REQUEST, .revision = 0 }; +__attribute__((used, section(".requests"))) static volatile struct limine_efi_system_table_request efi_request = { .id = LIMINE_EFI_SYSTEM_TABLE_REQUEST, .revision = 0 @@ -167,7 +179,7 @@ static struct E801 get_E801(void) { return E801; } -void _start(void) { +void kmain(void) { printf("ZealBooter prekernel\n"); printf("____________________\n\n"); From 41e7e302d5e4300059fdfc642c6e71b1761878e9 Mon Sep 17 00:00:00 2001 From: mintsuki Date: Wed, 14 Aug 2024 22:16:39 +0200 Subject: [PATCH 33/48] Use framebuffer pitch instead of width where necessary --- src/Kernel/Display.ZC | 14 ++++++++------ src/Kernel/KMain.ZC | 2 +- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/Kernel/Display.ZC b/src/Kernel/Display.ZC index ef89e85f..a8b43d50 100755 --- a/src/Kernel/Display.ZC +++ b/src/Kernel/Display.ZC @@ -8,7 +8,9 @@ See also $LK,"GrUpdateScreen",A="MN:GrUpdateScreen"$(). */ I64 i, row, col, x, y; U32 *framebuffer; - U64 ch_bitmap; + U64 ch_bitmap, fb_width_from_pitch; + + fb_width_from_pitch = sys_framebuffer_pitch / (sys_framebuffer_bpp / 8); if (!(text.raw_flags & RAWF_SHOW_DOLLAR)) { @@ -60,17 +62,17 @@ See also $LK,"GrUpdateScreen",A="MN:GrUpdateScreen"$(). {//Scroll screen down MemCopy(text.fb_alias, - text.fb_alias + sys_framebuffer_width * FONT_HEIGHT, - (text.screen_size - sys_framebuffer_width * FONT_HEIGHT) * sizeof(U32)); + text.fb_alias + fb_width_from_pitch * FONT_HEIGHT, + (text.screen_size - fb_width_from_pitch * FONT_HEIGHT) * sizeof(U32)); - MemSetU32(text.fb_alias + text.screen_size - sys_framebuffer_width * FONT_HEIGHT, BLACK32, sys_framebuffer_width * FONT_HEIGHT); + MemSetU32(text.fb_alias + text.screen_size - fb_width_from_pitch * FONT_HEIGHT, BLACK32, fb_width_from_pitch * FONT_HEIGHT); text.raw_col -= text.cols ; row = text.rows - 1; } x = col * FONT_WIDTH; y = row * FONT_HEIGHT; ch_bitmap = text.font[ch & 0xFF]; - framebuffer = text.fb_alias + sys_framebuffer_width * y + x; + framebuffer = text.fb_alias + fb_width_from_pitch * y + x; PUSHFD CLI @@ -81,7 +83,7 @@ See also $LK,"GrUpdateScreen",A="MN:GrUpdateScreen"$(). else *framebuffer++ = BLACK32; if (i & (FONT_WIDTH - 1) == FONT_WIDTH - 1) - framebuffer += sys_framebuffer_width - FONT_WIDTH; + framebuffer += fb_width_from_pitch - FONT_WIDTH; ch_bitmap >>= 1; } POPFD diff --git a/src/Kernel/KMain.ZC b/src/Kernel/KMain.ZC index 069734b7..8f363e19 100755 --- a/src/Kernel/KMain.ZC +++ b/src/Kernel/KMain.ZC @@ -91,7 +91,7 @@ U0 SysGrInit() text.cols = sys_framebuffer_width / FONT_WIDTH; text.rows = sys_framebuffer_height / FONT_HEIGHT; - text.screen_size = sys_framebuffer_width * sys_framebuffer_height; + text.screen_size = sys_framebuffer_pitch / (sys_framebuffer_bpp / 8) * sys_framebuffer_height; text.buffer_size = text.screen_size * 4; //buffer for 32-bit, but only 16 colors now. text.raw_screen = CAlloc(text.buffer_size); text.fb_alias = sys_framebuffer_addr; From f2a7f94e69bda78fb4c927eb9db33eb387a3d5da Mon Sep 17 00:00:00 2001 From: Arsenic Blood <127725014+GutPuncher@users.noreply.github.com> Date: Tue, 20 Aug 2024 23:39:12 -0400 Subject: [PATCH 34/48] Update KGlobals.ZC --- src/Kernel/KGlobals.ZC | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Kernel/KGlobals.ZC b/src/Kernel/KGlobals.ZC index 4b26ecab..f6b65671 100755 --- a/src/Kernel/KGlobals.ZC +++ b/src/Kernel/KGlobals.ZC @@ -14,7 +14,7 @@ U8 *rev_bits_table; //Table with U8 bits reversed CDate local_time_offset; F64 *pow10_I64, sys_os_version = 2.03; -U64 sys_os_version_sub = 117; +U64 sys_os_version_sub = 118; U8 *sys_os_version_str; U8 *sys_os_version_full; U8 *sys_os_version_nice; From b7d5f81b35ff27aa99e2f9e77311838f34a2a794 Mon Sep 17 00:00:00 2001 From: GutPuncher Date: Wed, 21 Aug 2024 21:18:27 -0400 Subject: [PATCH 35/48] Add diff vdisk <---> src/ functionality to sync.sh --- build/sync.sh | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/build/sync.sh b/build/sync.sh index bc10401f..2491f1a6 100755 --- a/build/sync.sh +++ b/build/sync.sh @@ -44,9 +44,10 @@ DOCS_DIR= TMPMOUNT=/tmp/zealtmp print_usage() { - echo "Usage: $0 ( repo | vm ) [OPTION]" + echo "Usage: $0 ( repo | vm | diff ) [OPTION]" echo " repo Overwrites src/ with virtual disk contents." echo " vm Overwrites virtual disk with src/ contents." + echo " diff Runs a 'diff' between src/ and virtual disk." echo "Options:" echo " --ignore-dots Ignore dotfiles/dotfolders during synchronize." } @@ -73,6 +74,12 @@ else sudo modprobe nbd [ ! -d $TMPMOUNT ] && mkdir $TMPMOUNT case $1 in + diff) + mount_vdisk + diff -x *.MAP --color=always -r ../src/ $TMPMOUNT/ | less -R -p "diff -x.*|Only in.*" + umount_vdisk + echo "Finished." + ;; repo) echo "Emptying src..." rm -rf ../src/* From 4e77bf1c0aee1bf39c17e52686a60ad6e6a4fcc3 Mon Sep 17 00:00:00 2001 From: GutPuncher Date: Mon, 26 Aug 2024 02:01:43 -0400 Subject: [PATCH 36/48] Add flush command option to sync.sh , to attempt to flush qemu-nbd state and attempt basic repair of filesystem --- build/sync.sh | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/build/sync.sh b/build/sync.sh index 2491f1a6..cad1cbb9 100755 --- a/build/sync.sh +++ b/build/sync.sh @@ -74,6 +74,12 @@ else sudo modprobe nbd [ ! -d $TMPMOUNT ] && mkdir $TMPMOUNT case $1 in + flush) + mount_vdisk + sudo blockdev --flushbufs /dev/nbd0 + sudo dosfsck -w -r -l -v -t /dev/nbd0 + umount_vdisk + ;; diff) mount_vdisk diff -x *.MAP --color=always -r ../src/ $TMPMOUNT/ | less -R -p "diff -x.*|Only in.*" From 16eec2be89f51270e1a567d61bcbda5873f1411a Mon Sep 17 00:00:00 2001 From: GutPuncher Date: Mon, 26 Aug 2024 02:04:18 -0400 Subject: [PATCH 37/48] Increment sys_os_version_sub --- src/Kernel/KGlobals.ZC | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Kernel/KGlobals.ZC b/src/Kernel/KGlobals.ZC index f6b65671..028a5196 100755 --- a/src/Kernel/KGlobals.ZC +++ b/src/Kernel/KGlobals.ZC @@ -14,7 +14,7 @@ U8 *rev_bits_table; //Table with U8 bits reversed CDate local_time_offset; F64 *pow10_I64, sys_os_version = 2.03; -U64 sys_os_version_sub = 118; +U64 sys_os_version_sub = 119; U8 *sys_os_version_str; U8 *sys_os_version_full; U8 *sys_os_version_nice; From 9f363f265d1d859aa6d777c79cffc82195166abe Mon Sep 17 00:00:00 2001 From: GutPuncher Date: Mon, 26 Aug 2024 02:07:47 -0400 Subject: [PATCH 38/48] Lower DOC_SCROLL_SPEED from 8 to 6 --- src/Kernel/KernelA.HH | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Kernel/KernelA.HH b/src/Kernel/KernelA.HH index 94aa3200..d9d731b2 100755 --- a/src/Kernel/KernelA.HH +++ b/src/Kernel/KernelA.HH @@ -1272,7 +1272,7 @@ public class CDocBin #assert !($$ & 7) }; -#define DOC_SCROLL_SPEED 8 +#define DOC_SCROLL_SPEED 6 #define DOCSS_NORMAL 0 #define DOCSS_SINGLE_QUOTE 1 From 05febc98036e287af4e77593d093f946de3e6513 Mon Sep 17 00:00:00 2001 From: GutPuncher Date: Mon, 26 Aug 2024 02:14:30 -0400 Subject: [PATCH 39/48] Hacking graphics code in pursuit of fixing #28 --- src/Demo/Graphics/32BitColor.ZC | 2 +- src/Demo/Graphics/32BitPaint.ZC | 10 +++---- src/System/Gr/GrDC.ZC | 3 ++- src/System/Gr/GrGlobals.ZC | 2 +- src/System/Gr/GrScreen.ZC | 47 +++++++++++++++++++++++++++------ 5 files changed, 48 insertions(+), 16 deletions(-) diff --git a/src/Demo/Graphics/32BitColor.ZC b/src/Demo/Graphics/32BitColor.ZC index 7487cb2c..4c16fbcc 100755 --- a/src/Demo/Graphics/32BitColor.ZC +++ b/src/Demo/Graphics/32BitColor.ZC @@ -4,7 +4,7 @@ I0 DrawPixel(I64 x, I64 y, CBGR24 color) { - text.fb_alias[x + y * GR_WIDTH] = color; + text.fb_alias[x + y * sys_framebuffer_width] = color; } I0 Color32Demo() diff --git a/src/Demo/Graphics/32BitPaint.ZC b/src/Demo/Graphics/32BitPaint.ZC index eaa2b86d..68b92d08 100755 --- a/src/Demo/Graphics/32BitPaint.ZC +++ b/src/Demo/Graphics/32BitPaint.ZC @@ -32,12 +32,12 @@ U0 PaintGlobalsInit() I0 DrawImagePixel(I64 x, I64 y, CBGR24 color) { - paint.fb[x + y * GR_WIDTH] = color; + paint.fb[x + y * sys_framebuffer_width] = color; } I0 DrawScreenPixel(I64 x, I64 y, CBGR24 color) { - text.fb_alias[x + y * GR_WIDTH] = color; + text.fb_alias[x + y * sys_framebuffer_width] = color; } I0 DrawScreenChar(I64 x, I64 y, I64 char) @@ -136,7 +136,7 @@ U0 PaintLoadImage() U32 PaintImagePeek(I64 x, I64 y) { - return paint.fb[x + y * GR_WIDTH]; + return paint.fb[x + y * sys_framebuffer_width]; } I0 Paint32() @@ -176,7 +176,7 @@ I0 Paint32() // draw the image where the brush was last covering it for (i = paint.last_x; i < paint.last_x + paint.last_thick; i++) for (j = paint.last_y; j < paint.last_y + paint.last_thick; j++) - DrawScreenPixel(i, j, paint.fb[i + j * GR_WIDTH]); + DrawScreenPixel(i, j, paint.fb[i + j * sys_framebuffer_width]); // draw the brush on the screen DrawScreenBrush(mouse.pos.x, mouse.pos.y, paint.color, paint.thick); @@ -193,7 +193,7 @@ I0 Paint32() // draw the image where the color strings where covering it for (i = 0; i < 3 * FONT_HEIGHT; i++) for (j = 0; j < 12 * FONT_WIDTH; j++) - DrawScreenPixel(j, i, paint.fb[j + i * GR_WIDTH]); + DrawScreenPixel(j, i, paint.fb[j + i * sys_framebuffer_width]); // draw the color strings on screen DrawScreenStr(0, 0 * FONT_HEIGHT, str_r); diff --git a/src/System/Gr/GrDC.ZC b/src/System/Gr/GrDC.ZC index aa65bc61..e2f9b177 100755 --- a/src/System/Gr/GrDC.ZC +++ b/src/System/Gr/GrDC.ZC @@ -214,7 +214,8 @@ public CDC *DCNew(I64 width, I64 height, CTask *task=NULL, Bool null_bitmap=FALS res->win_task = task; res->mem_task = task; res->width = width; - res->width_internal = (width + 7) & ~7; +// res->width_internal = (width + 7) & ~7; + res->width_internal = width & ~7; res->height = height; if (null_bitmap) res->flags |= DCF_DONT_DRAW; diff --git a/src/System/Gr/GrGlobals.ZC b/src/System/Gr/GrGlobals.ZC index ed308a54..819b8481 100755 --- a/src/System/Gr/GrGlobals.ZC +++ b/src/System/Gr/GrGlobals.ZC @@ -47,7 +47,7 @@ public CBGR24 gr_palette[COLORS_NUM]; //See $LK,"SysGrInit",A="MN:SysGrInit"$() //Allows consts to be used instead of variables. HashPublic("GR_WIDTH", HTT_DEFINE_STR);; -DefinePrint("GR_WIDTH", "%d", sys_framebuffer_width); +DefinePrint("GR_WIDTH", "%d", sys_framebuffer_width & ~7); HashPublic("GR_HEIGHT", HTT_DEFINE_STR);; DefinePrint("GR_HEIGHT", "%d", sys_framebuffer_height); diff --git a/src/System/Gr/GrScreen.ZC b/src/System/Gr/GrScreen.ZC index 1c8e64e6..32a50f9c 100755 --- a/src/System/Gr/GrScreen.ZC +++ b/src/System/Gr/GrScreen.ZC @@ -157,13 +157,15 @@ U0 GrZoomInScreen() src = gr.dc2->body + gr.sx + gr.sy * gr.dc2->width_internal; dst = gr.zoomed_dc->body; - for (i = 0; i < GR_HEIGHT / gr.screen_zoom; i++) +// for (i = 0; i < GR_HEIGHT / gr.screen_zoom; i++) + for (i = 0; i < gr.dc2->height / gr.screen_zoom; i++) { k = gr.screen_zoom; while (k--) { src2 = src; - for (l = 0; l < GR_WIDTH / gr.screen_zoom; l++) +// for (l = 0; l < GR_WIDTH / gr.screen_zoom; l++) + for (l = 0; l < gr.dc2->width_internal / gr.screen_zoom; l++) { for (j = 0; j < gr.screen_zoom - 1; j++) *dst++ = *src2; @@ -171,7 +173,8 @@ U0 GrZoomInScreen() *dst++ = *src2++; } } - src += GR_WIDTH; +// src += GR_WIDTH; + src += gr.dc2->width_internal; } } @@ -367,34 +370,62 @@ U0 GrCalcScreenUpdates() else screen = gr.zoomed_dc->body; +/* for (i = 0; i < diffs_size; i++) { if (screen[i] != last_screen[i]) dst[i] = src[i]; } - MemCopy(gr.screen_cache, screen, diffs_size * 2); +*/ +// MemCopy(gr.screen_cache, screen, diffs_size * 2); } U0 GrUpdateScreen32() { - U64 size, *dst; +// U64 size, *dst; + U64 size; + U32 *dst; U8 *src; + U64 x; + U64 y; + U64 w = sys_framebuffer_pitch / (sys_framebuffer_bpp / 8); + U64 wi; + U64 yi; if (gr.screen_zoom == 1) { src = gr.dc2->body; size = src + gr.dc2->height * gr.dc2->width_internal; + wi = gr.dc2->width_internal; + yi = gr.dc2->height; } else { GrZoomInScreen; src = gr.zoomed_dc->body; size = src + gr.zoomed_dc->height * gr.zoomed_dc->width_internal; + wi = gr.zoomed_dc->width_internal; + yi = gr.zoomed_dc->height; +// SysLog("%d\n", wi); +// SysLog("%d\n\n", yi); } - dst = text.raw_screen; - while (src < size) //draw 2 pixels at a time - *dst++ = gr_palette[*src++ & 0xFF] | gr_palette[*src++ & 0xFF] << 32; +// dst = text.raw_screen; +// while (src < size) // need to do 1 pixel at a time... //draw 2 pixels at a time +// *dst++ = gr_palette[*src++ & 0xFF] | gr_palette[*src++ & 0xFF] << 32; + for (y = 0; y < yi; y++) + { + for (x = 0; x < wi; x++) + { +// dst = text.raw_screen[x + (y * sys_framebuffer_width)]; + dst = text.fb_alias + x + (y * w); +// dst = text.raw_screen + x + (y * w); +// *dst = gr_palette[*src++ & 0xFF]; +// *dst = gr_palette[src[x + (y * sys_framebuffer_width)] & 0xFF]; + *dst = gr_palette[src[x + (y * wi)] & 0xFF]; +// *dst = 0xFFFF0000; + } + } GrCalcScreenUpdates; From f8c984502614dc5e41d5ebf0f886edfba2c05d00 Mon Sep 17 00:00:00 2001 From: GutPuncher Date: Thu, 29 Aug 2024 00:49:38 -0400 Subject: [PATCH 40/48] Cleaning up leftover scraps from graphics code hacking, reimplementing GrCalcScreenUpdates --- src/System/Gr/GrScreen.ZC | 46 +++++++++++++++------------------------ 1 file changed, 18 insertions(+), 28 deletions(-) diff --git a/src/System/Gr/GrScreen.ZC b/src/System/Gr/GrScreen.ZC index 32a50f9c..2d2f9600 100755 --- a/src/System/Gr/GrScreen.ZC +++ b/src/System/Gr/GrScreen.ZC @@ -362,35 +362,36 @@ U0 DCBlotColor8(CDC *dc, CDC *img) U0 GrCalcScreenUpdates() { - U16 *screen, *last_screen = gr.screen_cache; - U64 i, *src = text.raw_screen, *dst = text.fb_alias, diffs_size = GR_WIDTH * GR_HEIGHT / 2; + U8 *screen, *last_screen = gr.screen_cache; + U32 i, *src = text.raw_screen, *dst = text.fb_alias, diffs_size = GR_WIDTH * GR_HEIGHT; + U64 x, y, w = sys_framebuffer_pitch / (sys_framebuffer_bpp / 8); if (gr.screen_zoom == 1) screen = gr.dc2->body; else screen = gr.zoomed_dc->body; -/* - for (i = 0; i < diffs_size; i++) + for (y = 0; y < GR_HEIGHT; y++) { - if (screen[i] != last_screen[i]) - dst[i] = src[i]; + for (x = 0; x < GR_WIDTH; x++) + { + i = x + y * GR_WIDTH; + if (screen[i] != last_screen[i]) + { + dst = text.fb_alias + x + y * w; + src = text.raw_screen + x + y * w; + *dst = *src; + } + } } -*/ -// MemCopy(gr.screen_cache, screen, diffs_size * 2); + MemCopy(gr.screen_cache, screen, diffs_size * 2); } U0 GrUpdateScreen32() { -// U64 size, *dst; - U64 size; + U64 size, x, y, wi, yi, w = sys_framebuffer_pitch / (sys_framebuffer_bpp / 8); U32 *dst; U8 *src; - U64 x; - U64 y; - U64 w = sys_framebuffer_pitch / (sys_framebuffer_bpp / 8); - U64 wi; - U64 yi; if (gr.screen_zoom == 1) { @@ -406,24 +407,13 @@ U0 GrUpdateScreen32() size = src + gr.zoomed_dc->height * gr.zoomed_dc->width_internal; wi = gr.zoomed_dc->width_internal; yi = gr.zoomed_dc->height; -// SysLog("%d\n", wi); -// SysLog("%d\n\n", yi); } -// dst = text.raw_screen; -// while (src < size) // need to do 1 pixel at a time... //draw 2 pixels at a time -// *dst++ = gr_palette[*src++ & 0xFF] | gr_palette[*src++ & 0xFF] << 32; - for (y = 0; y < yi; y++) { for (x = 0; x < wi; x++) { -// dst = text.raw_screen[x + (y * sys_framebuffer_width)]; - dst = text.fb_alias + x + (y * w); -// dst = text.raw_screen + x + (y * w); -// *dst = gr_palette[*src++ & 0xFF]; -// *dst = gr_palette[src[x + (y * sys_framebuffer_width)] & 0xFF]; - *dst = gr_palette[src[x + (y * wi)] & 0xFF]; -// *dst = 0xFFFF0000; + dst = text.raw_screen + x + y * w; + *dst = gr_palette[src[x + y * wi] & 0xFF]; } } From b08c10e3437d10ad58644ea587859484ab1bd066 Mon Sep 17 00:00:00 2001 From: GutPuncher Date: Thu, 29 Aug 2024 01:00:35 -0400 Subject: [PATCH 41/48] Fixing GrCalcScreenUpdates incorrect size passed to MemCopy --- src/System/Gr/GrScreen.ZC | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/System/Gr/GrScreen.ZC b/src/System/Gr/GrScreen.ZC index 2d2f9600..83410c58 100755 --- a/src/System/Gr/GrScreen.ZC +++ b/src/System/Gr/GrScreen.ZC @@ -384,7 +384,7 @@ U0 GrCalcScreenUpdates() } } } - MemCopy(gr.screen_cache, screen, diffs_size * 2); + MemCopy(gr.screen_cache, screen, diffs_size); } U0 GrUpdateScreen32() From 38c41e551ac664dd111a978c62ca98e64c3179ef Mon Sep 17 00:00:00 2001 From: GutPuncher Date: Thu, 29 Aug 2024 01:48:17 -0400 Subject: [PATCH 42/48] Fix zoom handling and update screen calculations - Corrected loop bounds in 'GrZoomInScreen' to use 'GR_HEIGHT' and 'GR_WIDTH' constants instead of dynamic values from 'gr.dc2'. - Updated 'src' offset calculations to use 'GR_WIDTH' instead of 'gr.dc2->width_internal'. - Simplified 'GrUpdateScreen32' to use fixed 'GR_HEIGHT' and 'GR_WIDTH' values for screen updates, removing unnecessary calculations and size adjustments based on 'gr.dc2' and 'gr.zoomed_dc'. --- src/System/Gr/GrScreen.ZC | 25 +++++++------------------ 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/src/System/Gr/GrScreen.ZC b/src/System/Gr/GrScreen.ZC index 83410c58..42446782 100755 --- a/src/System/Gr/GrScreen.ZC +++ b/src/System/Gr/GrScreen.ZC @@ -157,15 +157,13 @@ U0 GrZoomInScreen() src = gr.dc2->body + gr.sx + gr.sy * gr.dc2->width_internal; dst = gr.zoomed_dc->body; -// for (i = 0; i < GR_HEIGHT / gr.screen_zoom; i++) - for (i = 0; i < gr.dc2->height / gr.screen_zoom; i++) + for (i = 0; i < GR_HEIGHT / gr.screen_zoom; i++) { k = gr.screen_zoom; while (k--) { src2 = src; -// for (l = 0; l < GR_WIDTH / gr.screen_zoom; l++) - for (l = 0; l < gr.dc2->width_internal / gr.screen_zoom; l++) + for (l = 0; l < GR_WIDTH / gr.screen_zoom; l++) { for (j = 0; j < gr.screen_zoom - 1; j++) *dst++ = *src2; @@ -173,8 +171,7 @@ U0 GrZoomInScreen() *dst++ = *src2++; } } -// src += GR_WIDTH; - src += gr.dc2->width_internal; + src += GR_WIDTH; } } @@ -389,31 +386,23 @@ U0 GrCalcScreenUpdates() U0 GrUpdateScreen32() { - U64 size, x, y, wi, yi, w = sys_framebuffer_pitch / (sys_framebuffer_bpp / 8); + U64 x, y, wi, yi, w = sys_framebuffer_pitch / (sys_framebuffer_bpp / 8); U32 *dst; U8 *src; if (gr.screen_zoom == 1) - { src = gr.dc2->body; - size = src + gr.dc2->height * gr.dc2->width_internal; - wi = gr.dc2->width_internal; - yi = gr.dc2->height; - } else { GrZoomInScreen; src = gr.zoomed_dc->body; - size = src + gr.zoomed_dc->height * gr.zoomed_dc->width_internal; - wi = gr.zoomed_dc->width_internal; - yi = gr.zoomed_dc->height; } - for (y = 0; y < yi; y++) + for (y = 0; y < GR_HEIGHT; y++) { - for (x = 0; x < wi; x++) + for (x = 0; x < GR_WIDTH; x++) { dst = text.raw_screen + x + y * w; - *dst = gr_palette[src[x + y * wi] & 0xFF]; + *dst = gr_palette[src[x + y * GR_WIDTH] & 0xFF]; } } From 5bd76304ec753660c27adc69083a43fe5e867901 Mon Sep 17 00:00:00 2001 From: mintsuki Date: Mon, 30 Sep 2024 20:07:33 +0200 Subject: [PATCH 43/48] Update Zealbooter build system from Limine template --- zealbooter/GNUmakefile | 39 ++++++++++++++++++--------------------- zealbooter/linker.ld | 23 ++++++++++++++--------- 2 files changed, 32 insertions(+), 30 deletions(-) diff --git a/zealbooter/GNUmakefile b/zealbooter/GNUmakefile index 079daac8..10f5205f 100644 --- a/zealbooter/GNUmakefile +++ b/zealbooter/GNUmakefile @@ -1,43 +1,40 @@ # Nuke built-in rules and variables. -override MAKEFLAGS += -rR +MAKEFLAGS += -rR +.SUFFIXES: # This is the name that our final executable will have. # Change as needed. override OUTPUT := kernel # Convenience macro to reliably declare user overridable variables. -define DEFAULT_VAR = - ifeq ($(origin $1),default) - override $(1) := $(2) - endif - ifeq ($(origin $1),undefined) - override $(1) := $(2) - endif -endef +override USER_VARIABLE = $(if $(filter $(origin $(1)),default undefined),$(eval override $(1) := $(2))) # User controllable C compiler command. -override DEFAULT_KCC := cc -$(eval $(call DEFAULT_VAR,KCC,$(DEFAULT_KCC))) +$(call USER_VARIABLE,KCC,cc) # User controllable linker command. -override DEFAULT_KLD := ld -$(eval $(call DEFAULT_VAR,KLD,$(DEFAULT_KLD))) +$(call USER_VARIABLE,KLD,ld) # User controllable C flags. -override DEFAULT_KCFLAGS := -g -O2 -pipe -$(eval $(call DEFAULT_VAR,KCFLAGS,$(DEFAULT_KCFLAGS))) +$(call USER_VARIABLE,KCFLAGS,-g -O2 -pipe) # User controllable C preprocessor flags. We set none by default. -override DEFAULT_KCPPFLAGS := -$(eval $(call DEFAULT_VAR,KCPPFLAGS,$(DEFAULT_KCPPFLAGS))) +$(call USER_VARIABLE,KCPPFLAGS,) # User controllable nasm flags. -override DEFAULT_KNASMFLAGS := -F dwarf -g -$(eval $(call DEFAULT_VAR,KNASMFLAGS,$(DEFAULT_KNASMFLAGS))) +$(call USER_VARIABLE,KNASMFLAGS,-F dwarf -g) # User controllable linker flags. We set none by default. -override DEFAULT_KLDFLAGS := -$(eval $(call DEFAULT_VAR,KLDFLAGS,$(DEFAULT_KLDFLAGS))) +$(call USER_VARIABLE,KLDFLAGS,) + +# Check if KCC is Clang. +override KCC_IS_CLANG := $(shell ! $(KCC) --version 2>/dev/null | grep 'clang' >/dev/null 2>&1; echo $$?) + +# If the C compiler is Clang, set the target as needed. +ifeq ($(KCC_IS_CLANG),1) + override KCC += \ + -target x86_64-unknown-none +endif # Internal C flags that should not be changed by the user. override KCFLAGS += \ diff --git a/zealbooter/linker.ld b/zealbooter/linker.ld index 417faa44..88ef6241 100644 --- a/zealbooter/linker.ld +++ b/zealbooter/linker.ld @@ -9,9 +9,10 @@ ENTRY(kmain) /* process. */ PHDRS { - text PT_LOAD; - rodata PT_LOAD; - data PT_LOAD; + requests PT_LOAD; + text PT_LOAD; + rodata PT_LOAD; + data PT_LOAD; } SECTIONS @@ -22,6 +23,16 @@ SECTIONS /* that is the beginning of the region. */ . = 0xffffffff80000000; + /* Define a section to contain the Limine requests and assign it to its own PHDR */ + .requests : { + KEEP(*(.requests_start_marker)) + KEEP(*(.requests)) + KEEP(*(.requests_end_marker)) + } :requests + + /* Move to the next memory page for .text */ + . = ALIGN(CONSTANT(MAXPAGESIZE)); + .text : { *(.text .text.*) } :text @@ -38,12 +49,6 @@ SECTIONS .data : { *(.data .data.*) - - /* Place the sections that contain the Limine requests as part of the .data */ - /* output section. */ - KEEP(*(.requests_start_marker)) - KEEP(*(.requests)) - KEEP(*(.requests_end_marker)) } :data /* NOTE: .bss needs to be the last thing mapped to :data, otherwise lots of */ From 2ffd423f7b53dabfa59d8b62dbd7136e544e8af2 Mon Sep 17 00:00:00 2001 From: GutPuncher Date: Mon, 2 Dec 2024 01:02:34 -0500 Subject: [PATCH 44/48] Refactor framebuffer handling and remove redundant variables. (not tested on baremetal) - Removed the 'fb_width_from_pitch' variable and replaced its usage with 'sys_framebuffer_pidth' to standardize the handling of framebuffer width-from-pitch across the codebase. - Updated references to 'fb_width_from_pitch' in display and screen update functions to use 'sys_framebuffer_pidth', ensuring consistent calculations. - Replaced 'sys_framebuffer_pitch / (sys_framebuffer_bpp / 8)' with 'sys_framebuffer_pidth' to avoid redundant calculations and improve code readability. - Fixed framebuffer calculations in 'GrCalcScreenUpdates', 'GrUpdateScreen32', and related functions to use the correct framebuffer width-from-pitch value. - Corrected and simplified screen update logic in 'GrZoomInScreen' and 'GrUpdateScreen'. --- src/Kernel/Display.ZC | 14 ++++++-------- src/Kernel/KMain.ZC | 3 ++- src/Kernel/KernelB.HH | 2 +- src/System/Gr/GrGlobals.ZC | 2 ++ src/System/Gr/GrScreen.ZC | 33 +++++++++++++++++---------------- 5 files changed, 28 insertions(+), 26 deletions(-) diff --git a/src/Kernel/Display.ZC b/src/Kernel/Display.ZC index a8b43d50..97ae3793 100755 --- a/src/Kernel/Display.ZC +++ b/src/Kernel/Display.ZC @@ -8,9 +8,7 @@ See also $LK,"GrUpdateScreen",A="MN:GrUpdateScreen"$(). */ I64 i, row, col, x, y; U32 *framebuffer; - U64 ch_bitmap, fb_width_from_pitch; - - fb_width_from_pitch = sys_framebuffer_pitch / (sys_framebuffer_bpp / 8); + U64 ch_bitmap; if (!(text.raw_flags & RAWF_SHOW_DOLLAR)) { @@ -62,17 +60,17 @@ See also $LK,"GrUpdateScreen",A="MN:GrUpdateScreen"$(). {//Scroll screen down MemCopy(text.fb_alias, - text.fb_alias + fb_width_from_pitch * FONT_HEIGHT, - (text.screen_size - fb_width_from_pitch * FONT_HEIGHT) * sizeof(U32)); + text.fb_alias + sys_framebuffer_pidth * FONT_HEIGHT, + (text.screen_size - sys_framebuffer_pidth * FONT_HEIGHT) * sizeof(U32)); - MemSetU32(text.fb_alias + text.screen_size - fb_width_from_pitch * FONT_HEIGHT, BLACK32, fb_width_from_pitch * FONT_HEIGHT); + MemSetU32(text.fb_alias + text.screen_size - sys_framebuffer_pidth * FONT_HEIGHT, BLACK32, sys_framebuffer_pidth * FONT_HEIGHT); text.raw_col -= text.cols ; row = text.rows - 1; } x = col * FONT_WIDTH; y = row * FONT_HEIGHT; ch_bitmap = text.font[ch & 0xFF]; - framebuffer = text.fb_alias + fb_width_from_pitch * y + x; + framebuffer = text.fb_alias + sys_framebuffer_pidth * y + x; PUSHFD CLI @@ -83,7 +81,7 @@ See also $LK,"GrUpdateScreen",A="MN:GrUpdateScreen"$(). else *framebuffer++ = BLACK32; if (i & (FONT_WIDTH - 1) == FONT_WIDTH - 1) - framebuffer += fb_width_from_pitch - FONT_WIDTH; + framebuffer += sys_framebuffer_pidth - FONT_WIDTH; ch_bitmap >>= 1; } POPFD diff --git a/src/Kernel/KMain.ZC b/src/Kernel/KMain.ZC index 8f363e19..8b1df95d 100755 --- a/src/Kernel/KMain.ZC +++ b/src/Kernel/KMain.ZC @@ -91,7 +91,8 @@ U0 SysGrInit() text.cols = sys_framebuffer_width / FONT_WIDTH; text.rows = sys_framebuffer_height / FONT_HEIGHT; - text.screen_size = sys_framebuffer_pitch / (sys_framebuffer_bpp / 8) * sys_framebuffer_height; + sys_framebuffer_pidth = sys_framebuffer_pitch / (sys_framebuffer_bpp / 8); + text.screen_size = sys_framebuffer_pidth * sys_framebuffer_height; text.buffer_size = text.screen_size * 4; //buffer for 32-bit, but only 16 colors now. text.raw_screen = CAlloc(text.buffer_size); text.fb_alias = sys_framebuffer_addr; diff --git a/src/Kernel/KernelB.HH b/src/Kernel/KernelB.HH index 9890ad90..7ccb0348 100755 --- a/src/Kernel/KernelB.HH +++ b/src/Kernel/KernelB.HH @@ -249,7 +249,7 @@ public _extern SYS_FRAMEBUFFER_WIDTH U64 sys_framebuffer_width; public _extern SYS_FRAMEBUFFER_HEIGHT U64 sys_framebuffer_height; public _extern SYS_FRAMEBUFFER_PITCH U64 sys_framebuffer_pitch; public _extern SYS_FRAMEBUFFER_BPP U8 sys_framebuffer_bpp; - +public U64 sys_framebuffer_pidth; _extern SYS_FRAMEBUFFER_LIST CVideoInfo sys_framebuffer_list[VBE_MODES_NUM]; #help_index "Processor/SMBIOS" diff --git a/src/System/Gr/GrGlobals.ZC b/src/System/Gr/GrGlobals.ZC index 819b8481..0bf9e0d7 100755 --- a/src/System/Gr/GrGlobals.ZC +++ b/src/System/Gr/GrGlobals.ZC @@ -56,3 +56,5 @@ DefinePrint("TEXT_ROWS", "%d", text.rows);; HashPublic("TEXT_ROWS", HTT_DEFINE_STR);; DefinePrint("TEXT_COLS", "%d", text.cols);; HashPublic("TEXT_COLS", HTT_DEFINE_STR);; + +sys_framebuffer_pidth = sys_framebuffer_pitch / (sys_framebuffer_bpp / 8); \ No newline at end of file diff --git a/src/System/Gr/GrScreen.ZC b/src/System/Gr/GrScreen.ZC index 42446782..84335c33 100755 --- a/src/System/Gr/GrScreen.ZC +++ b/src/System/Gr/GrScreen.ZC @@ -142,8 +142,8 @@ public U0 GrScaleZoom(F64 scale) mouse.offset.x = mouse.pos.x - (mouse.pos.x - mouse.offset.x) * s; mouse.offset.y = mouse.pos.y - (mouse.pos.y - mouse.offset.y) * s; mouse.offset.z = mouse.pos.z - (mouse.pos.z - mouse.offset.z) * s; - gr.sx = mouse.pos.x - gr.zoomed_dc->width >> 1 / gr.screen_zoom; - gr.sy = mouse.pos.y - gr.zoomed_dc->height >> 1 / gr.screen_zoom; + gr.sx = mouse.pos.x - GR_WIDTH >> 1 / gr.screen_zoom; + gr.sy = mouse.pos.y - GR_HEIGHT >> 1 / gr.screen_zoom; GrFixZoomScale; } @@ -154,7 +154,7 @@ U0 GrZoomInScreen() GrFixZoomScale; - src = gr.dc2->body + gr.sx + gr.sy * gr.dc2->width_internal; + src = gr.dc2->body + gr.sx + gr.sy * GR_WIDTH; dst = gr.zoomed_dc->body; for (i = 0; i < GR_HEIGHT / gr.screen_zoom; i++) @@ -359,34 +359,35 @@ U0 DCBlotColor8(CDC *dc, CDC *img) U0 GrCalcScreenUpdates() { - U8 *screen, *last_screen = gr.screen_cache; - U32 i, *src = text.raw_screen, *dst = text.fb_alias, diffs_size = GR_WIDTH * GR_HEIGHT; - U64 x, y, w = sys_framebuffer_pitch / (sys_framebuffer_bpp / 8); + U8 *screen, reg RCX *last_screen = gr.screen_cache; + U32 *src = text.raw_screen, *dst = text.fb_alias; + U64 i, j, x, y, yi; if (gr.screen_zoom == 1) screen = gr.dc2->body; else screen = gr.zoomed_dc->body; - for (y = 0; y < GR_HEIGHT; y++) + for (y = yi = 0; y < GR_HEIGHT; yi = ++y * GR_WIDTH) { for (x = 0; x < GR_WIDTH; x++) { - i = x + y * GR_WIDTH; + i = x + yi; + j = x + y * sys_framebuffer_pidth; if (screen[i] != last_screen[i]) { - dst = text.fb_alias + x + y * w; - src = text.raw_screen + x + y * w; + dst = text.fb_alias + j; + src = text.raw_screen + j; *dst = *src; } } } - MemCopy(gr.screen_cache, screen, diffs_size); + MemCopy(gr.screen_cache, screen, GR_WIDTH * GR_HEIGHT); } U0 GrUpdateScreen32() { - U64 x, y, wi, yi, w = sys_framebuffer_pitch / (sys_framebuffer_bpp / 8); + U64 x, y, j, i; U32 *dst; U8 *src; @@ -397,12 +398,12 @@ U0 GrUpdateScreen32() GrZoomInScreen; src = gr.zoomed_dc->body; } - for (y = 0; y < GR_HEIGHT; y++) + for (y = j = i = 0; y < GR_HEIGHT; j = ++y * sys_framebuffer_pidth, i = y * GR_WIDTH) { for (x = 0; x < GR_WIDTH; x++) { - dst = text.raw_screen + x + y * w; - *dst = gr_palette[src[x + y * GR_WIDTH] & 0xFF]; + dst = text.raw_screen + x + j; + *dst = gr_palette[src[x + i] & 0xFF]; } } @@ -430,6 +431,6 @@ U0 GrUpdateScreen() (*gr.fp_final_screen_update)(dc); DCDel(dc); - DCBlotColor4(gr.dc1->body, gr.dc2->body, gr.dc_cache->body, gr.dc2->height * gr.dc2->width_internal >> 3); + DCBlotColor4(gr.dc1->body, gr.dc2->body, gr.dc_cache->body, GR_HEIGHT * GR_WIDTH >> 3); GrUpdateScreen32; } From 742b2fad7293e083258d981f351b2a0f24b33a41 Mon Sep 17 00:00:00 2001 From: Michael Mikonos Date: Thu, 19 Dec 2024 10:30:58 +0800 Subject: [PATCH 45/48] tab case in RawPutChar() can also be converted to do-while --- src/Kernel/Display.ZC | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) mode change 100755 => 100644 src/Kernel/Display.ZC diff --git a/src/Kernel/Display.ZC b/src/Kernel/Display.ZC old mode 100755 new mode 100644 index 97ae3793..9d2a31f9 --- a/src/Kernel/Display.ZC +++ b/src/Kernel/Display.ZC @@ -35,9 +35,9 @@ See also $LK,"GrUpdateScreen",A="MN:GrUpdateScreen"$(). } if (ch == '\t') { - RawPutChar(CH_SPACE); - while (text.raw_col & 3) + do RawPutChar(CH_SPACE); + while (text.raw_col & 3); } else if (ch == CH_BACKSPACE) { From dba0d17880e4535d00c2a8fab55c82cf7daa929d Mon Sep 17 00:00:00 2001 From: Michael Mikonos Date: Thu, 19 Dec 2024 10:31:58 +0800 Subject: [PATCH 46/48] revert permission --- src/Kernel/Display.ZC | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 src/Kernel/Display.ZC diff --git a/src/Kernel/Display.ZC b/src/Kernel/Display.ZC old mode 100644 new mode 100755 From be2fbdc67cbb73b34d97df28d315a1f8ded4d08e Mon Sep 17 00:00:00 2001 From: Gunch <127725014+GutPuncher@users.noreply.github.com> Date: Tue, 31 Dec 2024 17:14:04 -0500 Subject: [PATCH 47/48] Increment sys_os_version_sub Meant to include this in https://github.com/Zeal-Operating-System/ZealOS/pull/166 --- src/Kernel/KGlobals.ZC | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Kernel/KGlobals.ZC b/src/Kernel/KGlobals.ZC index 028a5196..8499b3c2 100755 --- a/src/Kernel/KGlobals.ZC +++ b/src/Kernel/KGlobals.ZC @@ -14,7 +14,7 @@ U8 *rev_bits_table; //Table with U8 bits reversed CDate local_time_offset; F64 *pow10_I64, sys_os_version = 2.03; -U64 sys_os_version_sub = 119; +U64 sys_os_version_sub = 120; U8 *sys_os_version_str; U8 *sys_os_version_full; U8 *sys_os_version_nice; From 8d32ccfa2e853fead77b56985a403df98ec18f8c Mon Sep 17 00:00:00 2001 From: Dmitry Brant Date: Sun, 26 Jan 2025 15:57:39 -0500 Subject: [PATCH 48/48] Add Mandelbrot graphics demo. --- src/Demo/Graphics/Mandel.ZC | 219 ++++++++++++++++++++++++++++++++++++ 1 file changed, 219 insertions(+) create mode 100644 src/Demo/Graphics/Mandel.ZC diff --git a/src/Demo/Graphics/Mandel.ZC b/src/Demo/Graphics/Mandel.ZC new file mode 100644 index 00000000..2220a62c --- /dev/null +++ b/src/Demo/Graphics/Mandel.ZC @@ -0,0 +1,219 @@ +// Mandelbrot set explorer (multi-core). +// +// - Click-and drag to move around. +// - PGUP/PGDN to zoom +// - HOME/END to increase/decrease iterations +// - ESC to exit + +I64 width = GR_WIDTH; +I64 height = GR_HEIGHT; +I64 iterations = 24; +F64 xCenter = -0.5, yCenter = 0.0; +F64 xExtent = 3.0; + + +I64 numCores = mp_count - 1; + +// ------------------- + +CDC* image; +I64 rowsPerCore = height / numCores; +I64 currentSequence; + + +U0 MandelFrame(I64 core) +{ +// CDC* dc = DCAlias(image); + I64 mySequence = currentSequence; + + I64 startX = 0; + I64 maxX = startX + width; + I64 startY = core * rowsPerCore; + I64 maxY = startY + rowsPerCore; + + F64 xmin = xCenter - (xExtent / 2.0); + F64 xmax = xmin + xExtent; + F64 aspect = ToF64(width) / ToF64(height); + F64 ymin = yCenter - (xExtent / aspect / 2.0); + F64 ymax = ymin + (xExtent / aspect); + + F64 x, y, x0, y0, x2, y2; + F64 xscale = (xmax - xmin) / ToF64(width); + F64 yscale = (ymax - ymin) / ToF64(height); + I64 iteration; + I64 px, py; + + for (py = startY; py < maxY; py++) { + y0 = ymin + ToF64(py) * yscale; + if (mySequence != currentSequence) + break; + + for (px = startX; px < maxX; px++) { + x = 0.0; y = 0.0; + x2 = 0.0; y2 = 0.0; + iteration = 0; + x0 = xmin + ToF64(px) * xscale; + + while ((x2 + y2) < 4.0) { + y = (2.0 *x * y) + y0; + x = x2 - y2 + x0; + x2 = x * x; + y2 = y * y; + if (++iteration > iterations) { + break; + } + } + +/* + if (iteration >= iterations) { + dc->color = BLACK; + } else { + dc->color = iteration & 15; + } + GrPlot0(dc, px, py); +*/ + + // Instead of getting a DC handle + // every time, we can just poke + // into the body of the DC. + // (is that ok?) + if (iteration >= iterations) + image->body[py*width+px] = 15; + else + image->body[py*width+px] = iteration % 15; + + + } + } +// DCDel(dc); +} + +U0 DrawIt(CTask *task, CDC *dc) { + image->flags |= DCF_NO_TRANSPARENTS; + GrBlot(dc, 0, 0, image); +} + +U0 Mandel() { + SettingsPush; + AutoComplete; + WinBorder; + WinMax; + + DocClear; + DCFill; + + Fs->win_inhibit = WIG_TASK_DEFAULT-WIF_SELF_FOCUS-WIF_SELF_BORDER; + + I64 msg_code, arg1, arg2; + I64 i, j, lastx, lasty; + F64 aspect; + Bool moving = FALSE; + Bool renderFrame = TRUE; + + + // Make our own palette, if we like. + CBGR48 bgr; + for (i=0; idraw_it = &DrawIt; + + while(TRUE) { + + if (renderFrame) { + renderFrame = FALSE; + + currentSequence++; + for (i=0; i