From 00c336c255ca94a1d52d927ad4ea3e105d0fb12c Mon Sep 17 00:00:00 2001 From: TomAwezome Date: Fri, 8 Jul 2022 04:49:34 -0400 Subject: [PATCH 01/53] Implement software loopback for PCNet driver. --- src/Home/Net/Drivers/PCNet.ZC | 14 +++++++++----- src/Home/Net/Protocols/ARP.ZC | 4 +++- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/Home/Net/Drivers/PCNet.ZC b/src/Home/Net/Drivers/PCNet.ZC index 65826a15..3cf9f465 100755 --- a/src/Home/Net/Drivers/PCNet.ZC +++ b/src/Home/Net/Drivers/PCNet.ZC @@ -501,12 +501,21 @@ I64 PCNetTransmitPacketAllocate(U8 **packet_buffer_out, I64 length) return de_index; } +U8 *EthernetMACGet() +{ + return pcnet.mac_address; +} + U0 PCNetTransmitPacketFinish(I64 de_index) {/* Release ownership of the packet to the PCNet card by setting the OWN bit to 1. */ CPCNetDescriptorEntry *entry = &pcnet.tx_de_buffer[de_index * sizeof(CPCNetDescriptorEntry)]; + // check the TX packet MAC against local MAC, if they match: software loopback the TX packet to RX NetQueue + if (!MemCompare(EthernetMACGet(), pcnet.tx_buffer_addr + de_index * ETHERNET_FRAME_SIZE, 6)) + NetQueuePush(pcnet.tx_buffer_addr + de_index * ETHERNET_FRAME_SIZE, U16_MAX - (entry->status1 & 0xFFFF) + 1); + Bts(&entry->status1, PCNET_DESCRIPTORf_OWN); NetLog("PCNET FINISH TX PACKET: TX DE index: %X, OWN bit of entry at entry: %b.", de_index, Bt(&entry->status1, PCNET_DESCRIPTORf_OWN)); @@ -742,11 +751,6 @@ I64 EthernetFrameAllocate(U8 **packet_buffer_out, return de_index; } -U8 *EthernetMACGet() -{ - return pcnet.mac_address; -} - U0 NetStop() { // Halt network activity by setting STOP bit on Status CSR. U32 csr = PCNetCSRRead(PCNET_CSR_CTRLSTATUS); diff --git a/src/Home/Net/Protocols/ARP.ZC b/src/Home/Net/Protocols/ARP.ZC index 1a80cfb7..347b470c 100755 --- a/src/Home/Net/Protocols/ARP.ZC +++ b/src/Home/Net/Protocols/ARP.ZC @@ -127,9 +127,11 @@ CARPHash *ARPCachePut(U32 ip_address, U8 *mac_address) } U0 ARPLocalIPV4Set(U32 ip_address) -{ // takes in little endian IP, stores into globals as Big Endian +{ // takes in little endian IP, stores into arp_globals as Big Endian and into ARP cache as Little Endian arp_globals.local_ipv4 = EndianU32(ip_address); + ARPCachePut(ip_address, EthernetMACGet); + ARPSend(ARP_REPLY, ethernet_globals.ethernet_broadcast, EthernetMACGet, From 24e4ae8f2ebe93d14c66b306bf8e47352926ba2c Mon Sep 17 00:00:00 2001 From: TomAwezome Date: Fri, 8 Jul 2022 18:08:30 -0400 Subject: [PATCH 02/53] Replace magic numbers with defines in Ethernet protocol code. --- src/Home/Net/Protocols/Ethernet.ZC | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Home/Net/Protocols/Ethernet.ZC b/src/Home/Net/Protocols/Ethernet.ZC index 801ac2aa..bcce3903 100755 --- a/src/Home/Net/Protocols/Ethernet.ZC +++ b/src/Home/Net/Protocols/Ethernet.ZC @@ -1,8 +1,8 @@ class CEthernetFrame { - U8 source_address[6]; + U8 source_address[MAC_ADDRESS_LENGTH]; U8 padding[2]; - U8 destination_address[6]; + U8 destination_address[MAC_ADDRESS_LENGTH]; U16 ethertype; U8 *data; @@ -12,15 +12,15 @@ class CEthernetFrame class CEthernetGlobals { - U8 ethernet_null[6]; - U8 ethernet_broadcast[6]; + U8 ethernet_null[MAC_ADDRESS_LENGTH]; + U8 ethernet_broadcast[MAC_ADDRESS_LENGTH]; } ethernet_globals; U0 EthernetGlobalsInit() { I64 i; - for (i = 0; i < 6; i++) + for (i = 0; i < MAC_ADDRESS_LENGTH; i++) { ethernet_globals.ethernet_null[i] = 0; ethernet_globals.ethernet_broadcast[i] = 0xFF; From 514cfe9f880857763c08483afa709cf2e5ff8c3d Mon Sep 17 00:00:00 2001 From: TomAwezome Date: Sun, 10 Jul 2022 01:40:15 -0400 Subject: [PATCH 03/53] Implement initial driver-independent loopback networking. --- src/Home/Net/Drivers/PCNet.ZC | 20 ++++++++++++----- src/Home/Net/Drivers/VirtIONet.ZC | 35 ++++++++++++++++++++---------- src/Home/Net/Protocols/Ethernet.ZC | 10 +++++++++ 3 files changed, 47 insertions(+), 18 deletions(-) diff --git a/src/Home/Net/Drivers/PCNet.ZC b/src/Home/Net/Drivers/PCNet.ZC index 3cf9f465..861a269a 100755 --- a/src/Home/Net/Drivers/PCNet.ZC +++ b/src/Home/Net/Drivers/PCNet.ZC @@ -512,20 +512,28 @@ U0 PCNetTransmitPacketFinish(I64 de_index) CPCNetDescriptorEntry *entry = &pcnet.tx_de_buffer[de_index * sizeof(CPCNetDescriptorEntry)]; - // check the TX packet MAC against local MAC, if they match: software loopback the TX packet to RX NetQueue - if (!MemCompare(EthernetMACGet(), pcnet.tx_buffer_addr + de_index * ETHERNET_FRAME_SIZE, 6)) - NetQueuePush(pcnet.tx_buffer_addr + de_index * ETHERNET_FRAME_SIZE, U16_MAX - (entry->status1 & 0xFFFF) + 1); - Bts(&entry->status1, PCNET_DESCRIPTORf_OWN); NetLog("PCNET FINISH TX PACKET: TX DE index: %X, OWN bit of entry at entry: %b.", de_index, Bt(&entry->status1, PCNET_DESCRIPTORf_OWN)); } -U0 EthernetFrameFinish(I64 de_index) -{//Alias for driver Finish TX function. +U0 NetDriverTransmitPacketFinish(I64 de_index) +{//Alias for driver-specific Finish TX function. PCNetTransmitPacketFinish(de_index); } +I64 NetDriverPacketBufferGet(I64 de_index) +{ + return pcnet.tx_buffer_addr + de_index * ETHERNET_FRAME_SIZE; +} + +I64 NetDriverPacketLengthGet(I64 de_index) +{ + CPCNetDescriptorEntry *entry = &pcnet.tx_de_buffer[de_index * sizeof(CPCNetDescriptorEntry)]; + + return U16_MAX - (entry->status1 & 0xFFFF) + 1; +} + I64 PCNetPacketReceive(U8 **packet_buffer_out, U16 *packet_length_out) {/* Receives the packet at the current RX DE index. Parameters are both pointers, since we modify the value at the packet_buffer_out, diff --git a/src/Home/Net/Drivers/VirtIONet.ZC b/src/Home/Net/Drivers/VirtIONet.ZC index 31541648..a2010aa1 100755 --- a/src/Home/Net/Drivers/VirtIONet.ZC +++ b/src/Home/Net/Drivers/VirtIONet.ZC @@ -167,15 +167,15 @@ I64 EthernetFrameAllocate(U8 **buffer_out, U8 *src_addr, U8 *dst_addr, I64 index; - if (!MemCompare(dst_addr, &VirtioNet.mac, 6)) { - frame = loopback_frame; - loopback_length = length; - index = I64_MAX; - } else { +// if (!MemCompare(dst_addr, &VirtioNet.mac, 6)) { +// frame = loopback_frame; +// loopback_length = length; +// index = I64_MAX; +// } else { index = @virtio_net_alloc_tx_packet(&frame, 14 + length/*, flags*/); if (index < 0) return index; - } +// } MemCopy(frame + 0, dst_addr, 6); MemCopy(frame + 6, src_addr, 6); @@ -186,15 +186,26 @@ I64 EthernetFrameAllocate(U8 **buffer_out, U8 *src_addr, U8 *dst_addr, return index; } -I64 EthernetFrameFinish(I64 index) { - if (index == I64_MAX && loopback_frame && loopback_length) { - NetQueuePush(loopback_frame, loopback_length); - loopback_length = 0; - return 0; - } +//I64 EthernetFrameFinish(I64 index) { +I64 NetDriverTransmitPacketFinish(I64 index) { +// if (index == I64_MAX && loopback_frame && loopback_length) { +// NetQueuePush(loopback_frame, loopback_length); +// loopback_length = 0; +// return 0; +// } return @virtio_net_finish_tx_packet(index); } +I64 NetDriverPacketBufferGet(I64 de_index) +{ + return tx_buffers + de_index * ETHERNET_FRAME_SIZE; +} + +I64 NetDriverPacketLengthGet(I64 de_index) +{ // TODO: ... de_index in Alec's VirtIO-Net driver don't match up to any way to get packet length... + return 0; +} + U8 *EthernetMACGet() { return &VirtioNet.mac; } I64 @virtio_net_init() { diff --git a/src/Home/Net/Protocols/Ethernet.ZC b/src/Home/Net/Protocols/Ethernet.ZC index bcce3903..f2f75652 100755 --- a/src/Home/Net/Protocols/Ethernet.ZC +++ b/src/Home/Net/Protocols/Ethernet.ZC @@ -52,4 +52,14 @@ U0 EthernetFrameParse(CEthernetFrame *frame_out, U8 *frame, U16 length) frame_out->length = length - ETHERNET_MAC_HEADER_LENGTH - 4; // He has a comment literally just saying "??". + or - 4? } +U0 EthernetFrameFinish(I64 de_index) +{//Alias for generic driver Finish TX function. + + // check the TX packet MAC against local MAC, if they match: software loopback the TX packet to RX NetQueue + if (!MemCompare(EthernetMACGet(), NetDriverPacketBufferGet(de_index), MAC_ADDRESS_LENGTH)) + NetQueuePush(NetDriverPacketBufferGet(de_index), NetDriverPacketLengthGet(de_index)); + + NetDriverTransmitPacketFinish(de_index); +} + EthernetGlobalsInit; \ No newline at end of file From 57aaeebde1d8d4f4bf80d98e54f8df62835649d8 Mon Sep 17 00:00:00 2001 From: TomAwezome Date: Fri, 23 Dec 2022 02:22:58 -0500 Subject: [PATCH 04/53] Fix loopback code using deprecated variable. --- src/Home/Net/Drivers/PCNet.ZC | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Home/Net/Drivers/PCNet.ZC b/src/Home/Net/Drivers/PCNet.ZC index 92825272..4f4c2bc1 100644 --- a/src/Home/Net/Drivers/PCNet.ZC +++ b/src/Home/Net/Drivers/PCNet.ZC @@ -585,7 +585,7 @@ U0 NetDriverTransmitPacketFinish(I64 de_index) I64 NetDriverPacketBufferGet(I64 de_index) { - return pcnet.tx_buffer_addr + de_index * ETHERNET_FRAME_SIZE; + return pcnet.tx_buffer_addr_phys + de_index * ETHERNET_FRAME_SIZE; } I64 NetDriverPacketLengthGet(I64 de_index) From a350141d45763a888e6a64bd77acdf41a3f8a5e5 Mon Sep 17 00:00:00 2001 From: slendi Date: Thu, 2 Mar 2023 12:07:12 +0200 Subject: [PATCH 05/53] 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 06/53] 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 07/53] 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 3149a8f2eaac00a02efc546d6d05a174a798e4a2 Mon Sep 17 00:00:00 2001 From: y4my4my4m <8145020+y4my4my4m@users.noreply.github.com> Date: Fri, 25 Aug 2023 15:24:51 +0900 Subject: [PATCH 08/53] desktop ui --- src/Home/Desktop/DesktopIcons.DD | Bin 0 -> 2418 bytes src/Home/Desktop/HomeSys.ZC | 99 +++++++ src/Home/Desktop/Install.ZC | 5 + src/Home/Desktop/WallPaper.ZC | 492 +++++++++++++++++++++++++++++++ 4 files changed, 596 insertions(+) create mode 100755 src/Home/Desktop/DesktopIcons.DD create mode 100755 src/Home/Desktop/HomeSys.ZC create mode 100755 src/Home/Desktop/Install.ZC create mode 100755 src/Home/Desktop/WallPaper.ZC diff --git a/src/Home/Desktop/DesktopIcons.DD b/src/Home/Desktop/DesktopIcons.DD new file mode 100755 index 0000000000000000000000000000000000000000..6cbb4058cc98f593fb8d6717643639ac34edbf06 GIT binary patch literal 2418 zcmcImTWb?R7@ds0BB`ME)361;UDd}C5kiSm}~x!q9ZFpXCe-L)@WY4wjcSY;_+?nR~^eIp+{Fhrgjn zbyLE<9p@7LEbMW!pFuP>sJ|k8?Crz$%+eJ*2nQ7Hz;$m#!6A&Mhus#zJ&gXJx*4LM zWTem^+u6H)5xk65yx=o+-uyRs_N14_#g4*Ip7+w)nGcuGVOW@w)sbuGmWA z7j_JHH4Zx;`4Y-5sj{LM(E&725{l;^kHwq7HlTQVlGyRYBS$=TghUjR+y;2?X+TP0 z4ncA}O%1mu6m@d`ER^7=le+RZfihZ6N)-H9`YKHHKC}JTMV;i UM$R%Ex%>CPQSJfmpNtT{0Yf}rn*aa+ literal 0 HcmV?d00001 diff --git a/src/Home/Desktop/HomeSys.ZC b/src/Home/Desktop/HomeSys.ZC new file mode 100755 index 00000000..3c273095 --- /dev/null +++ b/src/Home/Desktop/HomeSys.ZC @@ -0,0 +1,99 @@ +// HOME VERSION + + +U0 UserStartUp() +{//Run each time a user a spawned + DocTermNew; + Type("::/Doc/Start.DD"); + LBts(&Fs->display_flags, DISPLAYf_SHOW); + Fs->title_src = TTS_LOCKED_CONST; + Fs->title_src = Fs->display_doc->filename.name; + WinToTop; + WinZBufUpdate; + Dir; +} + +U0 ServerStartUp() +{//Run each time a server task is spawned. + DocTermNew; + LBts(&Fs->display_flags, DISPLAYf_SHOW); + Fs->title_src = TTS_LOCKED_CONST; + WinToTop; + WinZBufUpdate; + +} + + +U0 StartUpTasks() +{ + + ////////////////////////// + // SysLog Window Config // + ////////////////////////// + + DocCursor(OFF); + Fs->title_src = TTS_LOCKED_CONST; + Fs->title_src = "SysLog"; + DocClear(Fs->border_doc, TRUE); + + + ///////////////////////// + // Initial Term Config // + ///////////////////////// + + CTask *user = User; + + user->border_src = BDS_CONST; + user->text_attr = DKGRAY << 4 + BLUE; + user->title_src = TTS_LOCKED_CONST; + user->title_src = user->display_doc->filename.name; + DocClear(user->border_doc, TRUE); + + user->win_width = GR_WIDTH / 2; + WinHorz((user->win_width/8) - ((user->win_width/2)/7), + (user->win_width/8) + ((user->win_width/2)/7) - 1, user); + user->win_height = GR_HEIGHT / 2; + WinVert((user->win_height/8) - ((user->win_height/2)/8), + (user->win_height/8) + ((user->win_height/2)/8) - 1, user); + + + I64 initialWinTop = user->win_top; + I64 initialWinLeft = user->win_left; + + user->win_top = (GR_HEIGHT/2)/8; + user->win_bottom = (GR_HEIGHT/2)/8; + user->win_left = (GR_WIDTH/2)/8; + user->win_right = (GR_WIDTH/2)/8; + + while(user->win_left > initialWinLeft){ + user->win_left--; + user->win_right++; + Sleep(2); + } + + while(user->win_top > initialWinTop){ + user->win_top--; + user->win_bottom++; + Sleep(10); + } + + WinToTop(user); + WinZBufUpdate; + + "\n\n Boot Time:$$RED$$%7.3fs$$FG$$\n", tS; + + //XTalk(user, "Cd; #include \"Once\";\n"); + Silent; //no output to screen + //ACInit("/*;!*/Bible.TXT;!*/Clementine.TXT;!*/PCIDevices.DD;!*/HTML/*;!*/ChangeLog.DD"); + Silent(OFF); //no output to screen + //AutoComplete(OFF); + //if (sys_boot_src.u16[0] != BOOT_SRC_RAM) + // PopUp("ExeFile2(\"::/System/ZSplash.ZC\");"); +} + +#include "~/PaletteEditor/Palettes/Tradition" +PaletteSetTradition; + +StartUpTasks; + +"\n\n $$PURPLE$$ZealOS$$FG$$ V%0.2f\t%D %T\n\n", sys_os_version, sys_compile_time, sys_compile_time; diff --git a/src/Home/Desktop/Install.ZC b/src/Home/Desktop/Install.ZC new file mode 100755 index 00000000..8effc1c4 --- /dev/null +++ b/src/Home/Desktop/Install.ZC @@ -0,0 +1,5 @@ +Cd(__DIR__);; + +Copy("HomeSys.ZC", "~/HomeSys.ZC"); +Copy("DesktopIcons.DD", "~/DesktopIcons.DD"); +Copy("WallPaper.ZC", "::/System/WallPaper.ZC"); \ No newline at end of file diff --git a/src/Home/Desktop/WallPaper.ZC b/src/Home/Desktop/WallPaper.ZC new file mode 100755 index 00000000..f0a69ce1 --- /dev/null +++ b/src/Home/Desktop/WallPaper.ZC @@ -0,0 +1,492 @@ +#help_index "Windows" + +class CWallPaperGlobals +{ + I64 last_calc_idle_count, last_swap_counter[MP_PROCESSORS_NUM]; + F64 last_calc_idle_delta_time; + U8 top_line[STR_LEN]; +} *wall = CAlloc(sizeof(CWallPaperGlobals)); +wall->last_calc_idle_delta_time = 1.0; + +class CTaskWallPaperData +{ + I64 alloced_u8s, used_u8s; + U8 caller_stack[4096 - $$]; +}; + +U0 UserTerm() +{ + + CTask *user = User; + + user->border_src = BDS_CONST; + user->text_attr = DKGRAY << 4 + BLUE; + user->title_src = TTS_LOCKED_CONST; + user->title_src = user->display_doc->filename.name; + DocClear(user->border_doc, TRUE); + DocClear; + + user->win_width = GR_WIDTH / 2; + WinHorz((user->win_width/8) - ((user->win_width/2)/6), + (user->win_width/8) + ((user->win_width/2)/6) - 1, user); + + user->win_height = GR_HEIGHT / 2; + WinVert((user->win_height/8) - ((user->win_height/2)/7), + (user->win_height/8) + ((user->win_height/2)/7) - 1, user); + + + I64 initialWinTop = user->win_top; + I64 initialWinLeft = user->win_left; + + user->win_top = (GR_HEIGHT/2)/8; + user->win_bottom = (GR_HEIGHT/2)/8; + user->win_left = (GR_WIDTH/2)/8; + user->win_right = (GR_WIDTH/2)/8; + + while(user->win_left > initialWinLeft){ + user->win_left--; + user->win_right++; + Sleep(2); + } + + while(user->win_top > initialWinTop){ + user->win_top--; + user->win_bottom++; + Sleep(10); + } + + // WinToTop(user); + // WinZBufUpdate; + Dir; +} + +U0 WallPaper(CTask *_task) +{ + I64 i, j, k, l = TEXT_ROWS - 1; + CTask *task; + CTaskWallPaperData *wpd; + CHashTable *old_hash = Fs->hash_table; + CCPU *c; + CDateStruct ds; + U8 *st; + + _task->text_attr = DKGRAY << 4 + LTGRAY; + if (sys_data_bp) + { + TextPrint(Fs, 0, l--, DKGRAY << 4 + YELLOW, + "%010X/%010X %010X/%010X%12td%12td%12td", + sys_data_bp->used_u8s, sys_data_bp->alloced_u8s, + sys_code_bp->used_u8s, sys_code_bp->alloced_u8s, + cmp.compiled_lines, blkdev.read_count, blkdev.write_count); + + TextPrint(Fs, 0, l--, DKGRAY << 4 + LTGRAY, + "______Data_Heap______ ______Code_Heap______ " + "___Lines___ ___Reads___ __Writes___"); + } + else + { + TextPrint(Fs, 0, l--, DKGRAY << 4 + LTGRAY, + "%010X/%010X%12td%12td%12td", + sys_code_bp->used_u8s, sys_code_bp->alloced_u8s, + cmp.compiled_lines, blkdev.read_count, blkdev.write_count); + + TextPrint(Fs, 0, l--, DKGRAY << 4 + LTGRAY, + "____CodeData_Heap____ " + "___Lines___ ___Reads___ ___Writes__"); + } + TextPrint(Fs, 0, l--, DKGRAY << 4 + LTGRAY, "ProgressBars:%016X %016X %016X %016X", + progress1, progress2, progress3, progress4); + + for (i = 0; i < mp_count; i++) + { + c = &cpu_structs[i]; + if (winmgr.t->calc_idle_count != wall->last_calc_idle_count) + { + wall->last_calc_idle_delta_time = winmgr.t->calc_idle_delta_time; + wall->last_swap_counter[i] = winmgr.t->last_swap_counter[i]; + winmgr.t->last_swap_counter[i] = c->swap_counter; + } + + task = c->executive_task; + do + { + wpd = &task->wallpaper_data; + if (!TaskValidate(task)) + break; + if (!(winmgr.updates & 5)) + { + if (c == Gs) + Fs->hash_table = task->hash_table; + else //precaution + Fs->hash_table = old_hash; + + StrPrint(wpd->caller_stack, " %p ", TaskCaller(task, 0)); + for (j = 1; j < 16; j++) + { + if ((k = TaskCaller(task, j)) > 0) + CatPrint(wpd->caller_stack, "? %p ", k); + } + } + TextPrint(Fs, 0, l--, DKGRAY << 4 + YELLOW, wpd->caller_stack); + j = UnusedStack(task); + if (j < 0) + Panic("Stack Overflow", task); + if (!(winmgr.updates & 15)) + { + wpd->alloced_u8s = TaskMemAlloced(task); + wpd->used_u8s = TaskMemUsed(task); + } + TextPrint(Fs, 0, l--, DKGRAY << 4 + LTGRAY, + " %-18ts #%08X %010X %010X/%010X %04X:%02tX:%08X", + task->task_title, task, j, wpd->used_u8s, wpd->alloced_u8s, + task->task_flags, task->display_flags, task->win_inhibit); + if (!TaskValidate(task)) + break; + task = task->next_task; + } + while (task != c->executive_task); + + TextPrint(Fs, 0, l--, DKGRAY << 4 + LTGRAY, "CPU%02X %2tf%% ContextSwaps/s:%9,d", i, + 100.0 * (1.0 - c->idle_factor), ToI64((winmgr.t->last_swap_counter[i] + - wall->last_swap_counter[i]) / wall->last_calc_idle_delta_time)); + } + TextPrint(Fs, 0, l--, DKGRAY << 4 + LTGRAY, + " ___Description____ #__Task__ UnusedStack _UsedMem_/_AllocMem_ ______Flags_____"); + + if (!(winmgr.updates & 15) || !*wall->top_line) + { + Date2Struct(&ds, Now); + i = sys_code_bp->alloced_u8s - sys_code_bp->used_u8s; + if (sys_data_bp) + i += sys_data_bp->alloced_u8s - sys_data_bp->used_u8s; + StrPrint(wall->top_line, + " ð %3tZ %02d/%02d/%02d %02d:%02d:%02d ³ FPS: %2tf ³ Mem: %010X ³ CPU: ", + ds.day_of_week, "ST_DAYS_OF_WEEK", ds.mon, ds.day_of_mon, ds.year % 100, + ds.hour, ds.min, ds.sec, winmgr.fps, i); + } + TextPrint(Fs, 0, 0, DKGRAY << 4 + LTGRAY, wall->top_line); + + if (screencast.record) + TextPrint(Fs, 44 - 4, 0, DKGRAY << 4 + LTGREEN, "*"); + for (i = 0; i < mp_count; i++) + { + c = &cpu_structs[i]; + if (i & 1) + TextPrint(Fs, 60 + i * 2, 0, DKGRAY << 4 + LTGRAY, "%2tf", 100.0 * (1.0 - c->idle_factor)); + else + TextPrint(Fs, 60 + i * 2, 0, DKGRAY << 4 + LTGREEN, "%2tf", 100.0 * (1.0 - c->idle_factor)); + } + + st = ScanCode2KeyName(kbd.last_down_scan_code); + TextPrint(Fs, TEXT_COLS - 25, 0, DKGRAY << 4 + LTGREEN, "%25ts", st); + Free(st); + + Fs->hash_table = old_hash; + wall->last_calc_idle_count = winmgr.t->calc_idle_count; +} + +$SP,"<1>",BI=1$ + + + + + + + + + + + +$SP,"<2>",BI=2,BP="::/Home/DesktopIcons.DD,1"$ + + + + + + + + + +$SP,"<3>",BI=3,BP="::/Home/DesktopIcons.DD,2"$ + + + + + + + + +$SP,"<4>",BI=4,BP="::/Home/DesktopIcons.DD,3"$ + + + + + + + +$SP,"<5>",BI=5$ + + + + + + +$SP,"<6>",BI=6$ + + + + +U0 DrawTermBttn(CDC *dc, CCtrl *c) +{ + Sprite3(dc, c->left-8, c->top-8, 0, $IB,"<1>",BI=1$); +} + +U0 LeftClickTermBttn(CCtrl *, I64, I64, Bool down) +{ + if (down) + User; +} + +CCtrl *TermBttnNew() +{ + I64 min_x, max_x, min_y, max_y; + CCtrl *c = SysCAlloc(sizeof(CCtrl)); + + c->win_task = sys_winmgr_task; + c->flags = CTRLF_SHOW; + c->type = CTRLT_GENERIC; + c->draw_it = &DrawTermBttn; + c->left_click = &LeftClickTermBttn; + + SpriteExtents($IB,"<1>",BI=1$, &min_x, &max_x, &min_y, &max_y); + //min must be zero + c->left = sys_winmgr_task->pix_width - (max_x - min_x + 1); + c->right = c->left + (max_x - min_x + 1) - 1; + c->top = sys_winmgr_task->pix_height - (max_y - min_y + 1); + c->bottom = c->top + (max_y - min_y + 1) - 1; + + QueueInsert(c, sys_winmgr_task->last_ctrl); + TaskDerivedValsUpdate(sys_winmgr_task); + + return c; +} + + +//// HOME +U0 DrawHomeIcon(CDC *dc, CCtrl *c) +{ + + c->top = (sys_task->win_bottom * 8) + 26; + c->bottom = c->top + 60 + 8; + + //dc->color = PURPLE; + //GrRect(dc, c->left, c->top, c->right, c->bottom); + + Sprite3(dc, c->left, c->top, -1, $IB,"<2>",BI=2$); + +} + +U0 LeftClickHomeIcon(CCtrl *, I64, I64, Bool down) +{ + if (down) + Spawn(&UserTerm, , "User Terminal"); +} + +CCtrl *HomeIconNew() +{ + I64 min_x, max_x, min_y, max_y; + CCtrl *c = SysCAlloc(sizeof(CCtrl)); + + c->win_task = sys_winmgr_task; + c->flags = CTRLF_SHOW; + c->type = CTRLT_GENERIC; + c->draw_it = &DrawHomeIcon; + c->left_click = &LeftClickHomeIcon; + + SpriteExtents($IB,"<2>",BI=2$, &min_x, &max_x, &min_y, &max_y); + //min must be zero + c->left = 8; + c->right = c->left + (max_x - min_x + 1) - 1; + c->top = (sys_task->win_bottom*8) + (max_y - min_y + 1); + c->bottom = c->top + max_y + 8; + + QueueInsert(c, sys_winmgr_task->last_ctrl); + TaskDerivedValsUpdate(sys_winmgr_task); + + return c; +} + +//// TELNET +U0 DrawTelnetIcon(CDC *dc, CCtrl *c) +{ + + c->top = (sys_task->win_bottom * 8) + 16*2 + 80; + //dc->color = RED; + //GrRect(dc, c->left, c->top, c->right, c->bottom); + Sprite3(dc, c->left, c->top, -1, $IB,"<3>",BI=3$); +} + +U0 LeftClickTelnetIcon(CCtrl *, I64, I64, Bool down) +{ + if (down) + PopUp("ExeFile2(\"~/Net/Programs/Telnet/Telnet.ZC\");"); +} + +CCtrl *TelnetIconNew() +{ + I64 min_x, max_x, min_y, max_y; + CCtrl *c = SysCAlloc(sizeof(CCtrl)); + + c->win_task = sys_winmgr_task; + c->flags = CTRLF_SHOW; + c->type = CTRLT_GENERIC; + c->draw_it = &DrawTelnetIcon; + c->left_click = &LeftClickTelnetIcon; + + SpriteExtents($IB,"<3>",BI=3$, &min_x, &max_x, &min_y, &max_y); + //min must be zerocp + c->left = 8; + c->right = c->left + (max_x - min_x); + c->top = (sys_task->win_bottom*8) + (max_y - min_y + 1) * 2; + c->bottom = c->top + max_y + 16; + + QueueInsert(c, sys_winmgr_task->last_ctrl); + TaskDerivedValsUpdate(sys_winmgr_task); + + return c; +} + +//// PALETTE EDITOR +U0 DrawPaletteIcon(CDC *dc, CCtrl *c) +{ + + c->top = (sys_task->win_bottom * 8) + 16*3 + 130; + //dc->color = RED; + //GrRect(dc, c->left, c->top, c->right, c->bottom); + Sprite3(dc, c->left, c->top, -1, $IB,"<4>",BI=4$); +} + +U0 LeftClickPaletteIcon(CCtrl *, I64, I64, Bool down) +{ + if (down) + PopUp("ExeFile2(\"~/PaletteEditor/Run.ZC\");"); +} + +CCtrl *PaletteIconNew() +{ + I64 min_x, max_x, min_y, max_y; + CCtrl *c = SysCAlloc(sizeof(CCtrl)); + + c->win_task = sys_winmgr_task; + c->flags = CTRLF_SHOW; + c->type = CTRLT_GENERIC; + c->draw_it = &DrawPaletteIcon; + c->left_click = &LeftClickPaletteIcon; + + SpriteExtents($IB,"<7>",BI=7$, &min_x, &max_x, &min_y, &max_y); + //min must be zerocp + c->left = 8; + c->right = c->left + (max_x - min_x); + c->top = (sys_task->win_bottom*8) + (max_y - min_y + 1) * 3; + c->bottom = c->top + max_y + 16; + + QueueInsert(c, sys_winmgr_task->last_ctrl); + TaskDerivedValsUpdate(sys_winmgr_task); + + return c; +} + + +U0 DrawNetLogBttn(CDC *dc, CCtrl *c) +{ + Sprite3(dc, c->left-8, c->top-8, 0, $IB,"<5>",BI=5$); +} + +U0 LeftClickNetLogBttn(CCtrl *, I64, I64, Bool down) +{ + if(down) + Sys("NetLogToggle;"); +} + +CCtrl *NetLogIconNew() +{ + I64 min_x, max_x, min_y, max_y; + CCtrl *c = SysCAlloc(sizeof(CCtrl)); + + c->win_task = sys_winmgr_task; + c->flags = CTRLF_SHOW; + c->type = CTRLT_GENERIC; + c->draw_it = &DrawNetLogBttn; + c->left_click = &LeftClickNetLogBttn; + + SpriteExtents($IB,"<5>",BI=5$, &min_x, &max_x, &min_y, &max_y); + //min must be zero + c->left = sys_winmgr_task->pix_width - (max_x - min_x + 1); + c->right = c->left + (max_x - min_x + 1) - 1; + c->top = sys_winmgr_task->pix_height - (max_y - min_y + 1) - 40; + c->bottom = c->top + (max_y - min_y + 1) - 1; + + QueueInsert(c, sys_winmgr_task->last_ctrl); + TaskDerivedValsUpdate(sys_winmgr_task); + + return c; +} + +U0 DrawShowStatsBttn(CDC *dc, CCtrl *c) +{ + Sprite3(dc, c->left-8, c->top-8, 0, $IB,"<6>",BI=6$); +} + +U0 LeftClickShowStatsBttn(CCtrl *, I64, I64, Bool down) +{ + if(down) + Sys("WallPaperToggle;"); +} + +CCtrl *ShowStatsIconNew() +{ + I64 min_x, max_x, min_y, max_y; + CCtrl *c = SysCAlloc(sizeof(CCtrl)); + + c->win_task = sys_winmgr_task; + c->flags = CTRLF_SHOW; + c->type = CTRLT_GENERIC; + c->draw_it = &DrawShowStatsBttn; + c->left_click = &LeftClickShowStatsBttn; + + SpriteExtents($IB,"<6>",BI=6$, &min_x, &max_x, &min_y, &max_y); + //min must be zero + c->left = sys_winmgr_task->pix_width - (max_x - min_x + 1); + c->right = c->left + (max_x - min_x + 1) - 1; + c->top = sys_winmgr_task->pix_height - (max_y - min_y + 1) - 80; + c->bottom = c->top + (max_y - min_y + 1) - 1; + + QueueInsert(c, sys_winmgr_task->last_ctrl); + TaskDerivedValsUpdate(sys_winmgr_task); + + return c; +} + + +U0 WallPaperInit(Bool enableTermIcon = TRUE, Bool enableDesktopIcons = TRUE) +{ + if(enableTermIcon) + { + TermBttnNew; + NetLogIconNew; + ShowStatsIconNew; + + } + if(enableDesktopIcons) + { + HomeIconNew; + TelnetIconNew; + PaletteIconNew; + } + gr.fp_wall_paper = &WallPaper; +} + +; N L +TERMINALn 6 5 1  BBS !60&Telnet9 N L +NetLog8 N L +Stats \ No newline at end of file From 1eb2d6c31ace9c3efde9f271c5eedc2c4a461e09 Mon Sep 17 00:00:00 2001 From: sharoy Date: Mon, 23 Oct 2023 14:22:19 -0700 Subject: [PATCH 09/53] An icon for the Usage Monitor --- src/Home/PersonalMenu.DD | Bin 0 -> 65567 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100755 src/Home/PersonalMenu.DD diff --git a/src/Home/PersonalMenu.DD b/src/Home/PersonalMenu.DD new file mode 100755 index 0000000000000000000000000000000000000000..930ffa0cbed988a2e86f9daeb1851782f1823f7b GIT binary patch literal 65567 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 Rjka3vlK=${zTsi={{RN;^_l Date: Mon, 23 Oct 2023 15:00:34 -0700 Subject: [PATCH 10/53] Revert "An icon for the Usage Monitor" This reverts commit 1eb2d6c31ace9c3efde9f271c5eedc2c4a461e09. --- src/Home/PersonalMenu.DD | Bin 65567 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100755 src/Home/PersonalMenu.DD diff --git a/src/Home/PersonalMenu.DD b/src/Home/PersonalMenu.DD deleted file mode 100755 index 930ffa0cbed988a2e86f9daeb1851782f1823f7b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65567 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 Rjka3vlK=${zTsi={{RN;^_l Date: Mon, 23 Oct 2023 15:04:24 -0700 Subject: [PATCH 11/53] Usage Monitor Sprite Added --- src/PersonalMenu.DD | Bin 65015 -> 65567 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/PersonalMenu.DD b/src/PersonalMenu.DD index 5fbfc47cbb5ebcb1ef803dfcef59b42733cc2d4b..930ffa0cbed988a2e86f9daeb1851782f1823f7b 100755 GIT binary patch delta 954 zcmX|7O-NKx6n{7#U;* zCAW<$nWfPpykYx&!{o@~U)^bG01~@}Ft~DtLt!g+shwi^E|)sU3j`|D#nq zLO~wY;}GJP^cpDR(|QAhIWrPa&YO%{G>;gSXr41V(HwRjNAneD9L-Oi$9NqxxtEoq zyPnmdo3j|Y7g#&GgRVHb`!HAV`>q(e*Ify8mzl%peq_cS;UNEOM$sH`N6V0{nFi#F`Q%X*@`U&5IR;*F^VVere8Rf( zM1_1YKl;T31!8JErNds)I?-XmKJjpR)&WIgXePv9kC=MyRKO!<=42UE@oZtm;xj)K zF}{4p4W=;HLk1Lzs$Y3BWQf*{F(s);+vhGwk^`ws2@K1P@M&vnD+@8(gXtZ9fV87$ zQ=4L$2;Z@yBIa0_)~HPZ2irjM7ULhr2Mk8!6$V}Kh6EW&@&z&t$pWHp6Vnn#Q1a2e zL?aPNrbbYh3*j?L4Dl-=T}}ewHxlRpt4Ii`!yd*~X%uRssx5rnZc9qbq|ktAMOq;t zBP~$D_K-j;pkGs`-9Z8s=%F$$P-2;wUZ+)>-WC>-P=N$+Y(I+jhqK4*1=H~MG_y$P ZnY1V7Lo$yf7tvl=Arkrr72YFC{{iyYQ>g#| delta 422 zcmWN~%}Z2a7zJ?7+^_e3j`lT;UvraDM2GT@O?FA=rn3kwbWq%ACosbVT(YC zD0tlHLK_I8kU*ZTh`A6V#OMz&X3?Tepn+m7^xd4Z`kk{jub%u@-ag)#e6NzJy(UE; z!%dpd3tlemr-zGe#gR;--&-PBK7H3c+@ha)gicBs_i&pgjk^fxqY4NOP~wW4m)Q5#q4AzKBxvB!;O4|%4T5Xx z%Qj5jY#{{}7c*rA4jk{`*S9DzF z%uKaFg7foz8m{uf%V`Tq{`cmEiW;6>`l6wh^DDpNsN?jfvVnTu-6%Ooam&`%7<@k3 u4lG>Z^fyz5$Jh521uAEMR6I&01lLx^UD*8WPax31>&Hn2ao#;$Q_lhNNPqbN From 622c12b7acfb5610245a7db061e41436abc83547 Mon Sep 17 00:00:00 2001 From: GutPuncher Date: Mon, 20 Nov 2023 02:32:18 -0500 Subject: [PATCH 12/53] Add helper script for testing remote forks/PRs --- build/git-pr-switch.sh | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100755 build/git-pr-switch.sh diff --git a/build/git-pr-switch.sh b/build/git-pr-switch.sh new file mode 100755 index 00000000..d5b3585b --- /dev/null +++ b/build/git-pr-switch.sh @@ -0,0 +1,22 @@ +#!/bin/sh +# +# Checkout a (PR) fork branch locally for testing. +# +# + +echo +echo "git-pr-switch.sh -- Checkout a (PR) fork branch locally for testing." +echo +echo "Clean up your working directory before running this script." +echo +read -p "Enter fork author username: " FORK_USERNAME +echo $FORK_USERNAME +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 +echo "Pulling changes from user's branch into new local branch..." +git pull https://github.com/$FORK_USERNAME/ZealOS.git $FORK_BRANCH + + From 08c2e68bc758a0702c63cb229a8e255ec500815d Mon Sep 17 00:00:00 2001 From: GutPuncher Date: Mon, 20 Nov 2023 02:50:40 -0500 Subject: [PATCH 13/53] Test and fix #133 --- src/PersonalMenu.DD | Bin 65567 -> 65535 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/PersonalMenu.DD b/src/PersonalMenu.DD index 930ffa0cbed988a2e86f9daeb1851782f1823f7b..68ee8d1cc1a2f2db0d3ed17e792a1b5b9b186e35 100755 GIT binary patch delta 475 zcmX|-y-EW?6h>!vHX%&0jmE-s))rdkAuN3W3lWjC8}*I6U7XEFNh$9Z zruS^I_M1h<7#mZfQhMyYe}yTQ~1><<)J&YTdw)s{rD+a~m37oNc> z+(HX_5^YKs_Te6~$`17f7EI-Q6022XZTOZuM18^me1X%)CG;Fg=mH<0r#iwg!D zX*Y-=L2Yjmns4Z{v3Zv{3&wlxgfkKY&>5W#9TM8movr?!>yREmwhuu(5;_wR#p6p| ju-5RJQ^PaNqW3o>T~q(bT~Y4f5_%HX6und%PhkE41XWs^ delta 476 zcmX|-O-ckY5QQt9j!4v28AgO&2;xo`3T_6(l?NCQ@8Yh#g9qp<2%bV*sHpfm;t%LX z_ljVAUuKwws`vU;C8<{_`SzeZYJ*?x?;W;brxV9tSlR8bEpKgZAK!)j@1`&_PjZvh zjNmDy)Dd=Pm2UOpY^--_E30Y2mnuQHP$_-VR=Ohoh}`BAZMHSa=uJ@YiWGENEJBt_vn$m0m$2Lc1Uihy)vGg-w7ZB(-`7_~hk;BSzc z;lUS_xvZo_C7(fH1zgS9+<`!WLA?`+^GcT^757=V5}|?H{Dt$6f#c From 1c59545866c5f0338f702bfcb05a39512ebaf349 Mon Sep 17 00:00:00 2001 From: Arsenic Blood <127725014+GutPuncher@users.noreply.github.com> Date: Sat, 25 Nov 2023 04:59:11 -0500 Subject: [PATCH 14/53] Remove redundant Ctrl-Alt-N bind Ctrl-Alt-Tab already does what Ctrl-Alt-N does, additionally the Ctrl-Alt-N implementation was just a hack around how Ctrl-Alt-Tab is implemented in the Kernel's scheduler. See Kernel/Sched.ZC --- src/Kernel/KeyDev.ZC | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/Kernel/KeyDev.ZC b/src/Kernel/KeyDev.ZC index a897da1f..e3d88382 100755 --- a/src/Kernel/KeyDev.ZC +++ b/src/Kernel/KeyDev.ZC @@ -177,11 +177,6 @@ U0 CtrlAltM(I64) Mute(!IsMute); } -U0 CtrlAltN(I64) -{ - LBts(sys_ctrl_alt_flags, CTRL_ALT_TAB); -} - U0 CtrlAltT(I64) { User; @@ -235,7 +230,6 @@ U0 KeyDevInit() CtrlAltCBSet('D', &CtrlAltD, "Cmd /Enter Debugger",, TRUE); CtrlAltCBSet('F', &CtrlAltF, "Cmd /Toggle Aux Font"); CtrlAltCBSet('M', &CtrlAltM, "Cmd /Toggle Mute"); - CtrlAltCBSet('N', &CtrlAltN, "Cmd /Next Focus Task",, TRUE); CtrlAltCBSet('T', &CtrlAltT, "Cmd /Terminal Window"); CtrlAltCBSet('V', &CtrlAltV, "Cmd /Video Framebuffer Flush",, TRUE); CtrlAltCBSet('X', &CtrlAltX, "Cmd /Kill Focused Task",, TRUE); From dae64daee17181a855a14d4a143860659909217c Mon Sep 17 00:00:00 2001 From: GutPuncher Date: Sat, 25 Nov 2023 05:19:39 -0500 Subject: [PATCH 15/53] Move wallpapers into dedicated folder --- src/Demo/Graphics/{ => WallPapers}/WallPaperCtrl.ZC | 2 +- src/Demo/Graphics/{ => WallPapers}/WallPaperFish.ZC | Bin .../Graphics/{ => WallPapers}/WallPaperStars.ZC | 0 src/Doc/DemoIndex.DD | 4 ++-- src/Doc/Tips.DD | 2 +- 5 files changed, 4 insertions(+), 4 deletions(-) rename src/Demo/Graphics/{ => WallPapers}/WallPaperCtrl.ZC (98%) rename src/Demo/Graphics/{ => WallPapers}/WallPaperFish.ZC (100%) rename src/Demo/Graphics/{ => WallPapers}/WallPaperStars.ZC (100%) diff --git a/src/Demo/Graphics/WallPaperCtrl.ZC b/src/Demo/Graphics/WallPapers/WallPaperCtrl.ZC similarity index 98% rename from src/Demo/Graphics/WallPaperCtrl.ZC rename to src/Demo/Graphics/WallPapers/WallPaperCtrl.ZC index cfea2ce4..1d34707f 100755 --- a/src/Demo/Graphics/WallPaperCtrl.ZC +++ b/src/Demo/Graphics/WallPapers/WallPaperCtrl.ZC @@ -6,7 +6,7 @@ that you can place ctrls on the wall paper. See $LK,"::/Demo/Graphics/Slider.ZC"$ -and $LK,"::/Demo/Graphics/WallPaperFish.ZC"$ +and $LK,"::/Demo/Graphics/WallPapers/WallPaperFish.ZC"$ before messing with this program. It must be "System Included". diff --git a/src/Demo/Graphics/WallPaperFish.ZC b/src/Demo/Graphics/WallPapers/WallPaperFish.ZC similarity index 100% rename from src/Demo/Graphics/WallPaperFish.ZC rename to src/Demo/Graphics/WallPapers/WallPaperFish.ZC diff --git a/src/Demo/Graphics/WallPaperStars.ZC b/src/Demo/Graphics/WallPapers/WallPaperStars.ZC similarity index 100% rename from src/Demo/Graphics/WallPaperStars.ZC rename to src/Demo/Graphics/WallPapers/WallPaperStars.ZC diff --git a/src/Doc/DemoIndex.DD b/src/Doc/DemoIndex.DD index 8acc915b..1db45a66 100755 --- a/src/Doc/DemoIndex.DD +++ b/src/Doc/DemoIndex.DD @@ -27,7 +27,7 @@ $LK,"::/Demo/RandDemo.ZC"$ $LK,"::/Demo/KeyBitMap.ZC"$ $LK,"::/Demo/Graphics/WinZBuf.ZC"$ $LK,"::/Demo/Graphics/Elephant.ZC"$ -$LK,"::/Demo/Graphics/WallPaperFish.ZC"$ //Press SHIFT-F5 to System Include +$LK,"::/Demo/Graphics/WallPapers/WallPaperFish.ZC"$ //Press SHIFT-F5 to System Include $LK,"::/Demo/Games/Digits.ZC"$ $LK,"::/Demo/Progress.ZC"$ //has some ASM, just ignore $LK,"::/Demo/Graphics/Symmetry.ZC"$ @@ -77,7 +77,7 @@ $LK,"::/Demo/MultiCore/Palindrome.ZC"$ $LK,"::/Demo/MultiCore/MPAdd.ZC"$ $LK,"::/Demo/MultiCore/Lock.ZC"$ $LK,"::/Demo/Graphics/Slider.ZC"$ -$LK,"::/Demo/Graphics/WallPaperCtrl.ZC"$ //Press SHIFT-F5 to System Include +$LK,"::/Demo/Graphics/WallPapers/WallPaperCtrl.ZC"$ //Press SHIFT-F5 to System Include $LK,"::/Demo/Graphics/ScrollBars.ZC"$ $LK,"::/Demo/RegistryDemo.ZC"$ $LK,"::/Demo/Games/FlapBat.ZC"$ diff --git a/src/Doc/Tips.DD b/src/Doc/Tips.DD index eedb39bd..3f1443d1 100755 --- a/src/Doc/Tips.DD +++ b/src/Doc/Tips.DD @@ -107,7 +107,7 @@ $FG,2$Merge("C:/","D:/","+r+d");$FG$ to check your changes. * $LK,"GrFloodFill",A="MN:GrFloodFill"$() is slow. $LK,"GrRect",A="MN:GrRect"$() is fast. -* You can customize the $FG,2$wallpaper$FG$. See $LK,"::/Demo/Graphics/WallPaperFish.ZC"$. +* You can customize the $FG,2$wallpaper$FG$. See $LK,"::/Demo/Graphics/WallPapers/WallPaperFish.ZC"$. * Your RAM disks will not be reformatted when you reboot if the memory location has not changed and it finds the disk intact. From 4ad4f83e1a32233f35d1ac7c3cf2f3bc26d3ce46 Mon Sep 17 00:00:00 2001 From: GutPuncher Date: Sat, 25 Nov 2023 05:36:40 -0500 Subject: [PATCH 16/53] Move DesktopUI to WallPapers folder --- .../Graphics/WallPapers/WallPaperDesktop.ZC} | 16 +++++++++++----- .../WallPaperDesktop}/DesktopIcons.DD | Bin .../WallPapers/WallPaperDesktop}/HomeSys.ZC | 0 .../WallPapers/WallPaperDesktop}/Install.ZC | 0 4 files changed, 11 insertions(+), 5 deletions(-) rename src/{Home/Desktop/WallPaper.ZC => Demo/Graphics/WallPapers/WallPaperDesktop.ZC} (95%) rename src/{Home/Desktop => Demo/Graphics/WallPapers/WallPaperDesktop}/DesktopIcons.DD (100%) rename src/{Home/Desktop => Demo/Graphics/WallPapers/WallPaperDesktop}/HomeSys.ZC (100%) rename src/{Home/Desktop => Demo/Graphics/WallPapers/WallPaperDesktop}/Install.ZC (100%) diff --git a/src/Home/Desktop/WallPaper.ZC b/src/Demo/Graphics/WallPapers/WallPaperDesktop.ZC similarity index 95% rename from src/Home/Desktop/WallPaper.ZC rename to src/Demo/Graphics/WallPapers/WallPaperDesktop.ZC index f0a69ce1..b76488be 100755 --- a/src/Home/Desktop/WallPaper.ZC +++ b/src/Demo/Graphics/WallPapers/WallPaperDesktop.ZC @@ -160,7 +160,7 @@ U0 WallPaper(CTask *_task) if (sys_data_bp) i += sys_data_bp->alloced_u8s - sys_data_bp->used_u8s; StrPrint(wall->top_line, - " ð %3tZ %02d/%02d/%02d %02d:%02d:%02d ³ FPS: %2tf ³ Mem: %010X ³ CPU: ", + " ≡ %3tZ %02d/%02d/%02d %02d:%02d:%02d │ FPS: %2tf │ Mem: %010X │ CPU: ", ds.day_of_week, "ST_DAYS_OF_WEEK", ds.mon, ds.day_of_mon, ds.year % 100, ds.hour, ds.min, ds.sec, winmgr.fps, i); } @@ -197,7 +197,7 @@ $SP,"<1>",BI=1$ -$SP,"<2>",BI=2,BP="::/Home/DesktopIcons.DD,1"$ +$SP,"<2>",BI=2,BP="::/Demo/Graphics/WallPapers/WallPaperDesktop/DesktopIcons.DD,1"$ @@ -207,7 +207,7 @@ $SP,"<2>",BI=2,BP="::/Home/DesktopIcons.DD,1"$ -$SP,"<3>",BI=3,BP="::/Home/DesktopIcons.DD,2"$ +$SP,"<3>",BI=3,BP="::/Demo/Graphics/WallPapers/WallPaperDesktop/DesktopIcons.DD,2"$ @@ -216,7 +216,7 @@ $SP,"<3>",BI=3,BP="::/Home/DesktopIcons.DD,2"$ -$SP,"<4>",BI=4,BP="::/Home/DesktopIcons.DD,3"$ +$SP,"<4>",BI=4,BP="::/Demo/Graphics/WallPapers/WallPaperDesktop/DesktopIcons.DD,3"$ @@ -470,6 +470,12 @@ CCtrl *ShowStatsIconNew() U0 WallPaperInit(Bool enableTermIcon = TRUE, Bool enableDesktopIcons = TRUE) { + if (Fs != sys_task) + { + "Must be System Included with SHIFT-F5.\n" + "(Would crash when code mem was freed.)\n"; + return; + } if(enableTermIcon) { TermBttnNew; @@ -486,7 +492,7 @@ U0 WallPaperInit(Bool enableTermIcon = TRUE, Bool enableDesktopIcons = TRUE) gr.fp_wall_paper = &WallPaper; } -; N L +WallPaperInit;; N L TERMINALn 6 5 1  BBS !60&Telnet9 N L NetLog8 N L Stats \ No newline at end of file diff --git a/src/Home/Desktop/DesktopIcons.DD b/src/Demo/Graphics/WallPapers/WallPaperDesktop/DesktopIcons.DD similarity index 100% rename from src/Home/Desktop/DesktopIcons.DD rename to src/Demo/Graphics/WallPapers/WallPaperDesktop/DesktopIcons.DD diff --git a/src/Home/Desktop/HomeSys.ZC b/src/Demo/Graphics/WallPapers/WallPaperDesktop/HomeSys.ZC similarity index 100% rename from src/Home/Desktop/HomeSys.ZC rename to src/Demo/Graphics/WallPapers/WallPaperDesktop/HomeSys.ZC diff --git a/src/Home/Desktop/Install.ZC b/src/Demo/Graphics/WallPapers/WallPaperDesktop/Install.ZC similarity index 100% rename from src/Home/Desktop/Install.ZC rename to src/Demo/Graphics/WallPapers/WallPaperDesktop/Install.ZC From 42a98fe08f7eb08d20db45efc0cef770eaba19c9 Mon Sep 17 00:00:00 2001 From: GutPuncher Date: Sat, 25 Nov 2023 05:46:20 -0500 Subject: [PATCH 17/53] Fix DesktopUI Install.ZC copy --- src/Demo/Graphics/WallPapers/WallPaperDesktop/Install.ZC | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Demo/Graphics/WallPapers/WallPaperDesktop/Install.ZC b/src/Demo/Graphics/WallPapers/WallPaperDesktop/Install.ZC index 8effc1c4..c2c39c14 100755 --- a/src/Demo/Graphics/WallPapers/WallPaperDesktop/Install.ZC +++ b/src/Demo/Graphics/WallPapers/WallPaperDesktop/Install.ZC @@ -2,4 +2,4 @@ Cd(__DIR__);; Copy("HomeSys.ZC", "~/HomeSys.ZC"); Copy("DesktopIcons.DD", "~/DesktopIcons.DD"); -Copy("WallPaper.ZC", "::/System/WallPaper.ZC"); \ No newline at end of file +Copy("../WallPaperDesktop.ZC", "::/System/WallPaper.ZC"); \ No newline at end of file From f4df9bbe4b8d37b6bc93ee6239611ff79057e037 Mon Sep 17 00:00:00 2001 From: GutPuncher Date: Sat, 25 Nov 2023 16:15:13 -0500 Subject: [PATCH 18/53] CursorRemove GodDoodle --- src/System/God/GodDoodle.ZC | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) mode change 100644 => 100755 src/System/God/GodDoodle.ZC diff --git a/src/System/God/GodDoodle.ZC b/src/System/God/GodDoodle.ZC old mode 100644 new mode 100755 index 2096c11d..3ae237cd --- a/src/System/God/GodDoodle.ZC +++ b/src/System/God/GodDoodle.ZC @@ -129,7 +129,7 @@ public U8 *GodDoodleSprite(U8 *hex = NULL) WinMax; if (!hex) - PopUpOk("The $LK+PU,"Holy Spirit ",A="FI::: /Adam/God / HSNotes.DD "$ can puppet you.\n\n" + PopUpOk("The $LK+PU,"Holy Spirit ",A="FI::: /Adam/God / HSNotes.DD "$ can puppet you.\n\n" "Press $$GREEN$$$$FG$$ until it finishes."); god.doodle_ch = 0; From e0ec7a8271508d1a0aa39a5914905b53869dcd95 Mon Sep 17 00:00:00 2001 From: GutPuncher Date: Sat, 25 Nov 2023 16:16:01 -0500 Subject: [PATCH 19/53] Remove deprecated font bitmaps --- src/Kernel/FontAux.ZC | 24 ++++++++++++------------ src/Kernel/FontStd.ZC | 24 ++++++++++++------------ 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/src/Kernel/FontAux.ZC b/src/Kernel/FontAux.ZC index c85898a9..98b8b40b 100755 --- a/src/Kernel/FontAux.ZC +++ b/src/Kernel/FontAux.ZC @@ -1,18 +1,18 @@ public U64 sys_font_aux[256] = { 0x0000000000000000, 0x0000000000000000, -0x000000FF00000000, -0x000000FF00FF0000, -0x1818181818181818, -0x6C6C6C6C6C6C6C6C, -0x181818F800000000, -0x6C6C6CEC0CFC0000, -0x1818181F00000000, -0x6C6C6C6F607F0000, -0x000000F818181818, -0x000000FC0CEC6C6C, -0x0000001F18181818, -0x0000007F606F6C6C, +0x0000000000000000, +0x0000000000000000, +0x0000000000000000, +0x0000000000000000, +0x0000000000000000, +0x0000000000000000, +0x0000000000000000, +0x0000000000000000, +0x0000000000000000, +0x0000000000000000, +0x0000000000000000, +0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, diff --git a/src/Kernel/FontStd.ZC b/src/Kernel/FontStd.ZC index 895f060a..8da5fe74 100755 --- a/src/Kernel/FontStd.ZC +++ b/src/Kernel/FontStd.ZC @@ -1,18 +1,18 @@ public U64 sys_font_std[256] = { 0x0000000000000000, 0x0000000000000000, -0x000000FF00000000, -0x000000FF00FF0000, -0x1818181818181818, -0x6C6C6C6C6C6C6C6C, -0x181818F800000000, -0x6C6C6CEC0CFC0000, -0x1818181F00000000, -0x6C6C6C6F607F0000, -0x000000F818181818, -0x000000FC0CEC6C6C, -0x0000001F18181818, -0x0000007F606F6C6C, +0x0000000000000000, +0x0000000000000000, +0x0000000000000000, +0x0000000000000000, +0x0000000000000000, +0x0000000000000000, +0x0000000000000000, +0x0000000000000000, +0x0000000000000000, +0x0000000000000000, +0x0000000000000000, +0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, From 4a1877c22e7c4fb855b11ac607771a0ac45ac6b2 Mon Sep 17 00:00:00 2001 From: GutPuncher Date: Sat, 25 Nov 2023 16:45:43 -0500 Subject: [PATCH 20/53] Update Charter --- src/Doc/Charter.DD | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Doc/Charter.DD b/src/Doc/Charter.DD index 25385d24..bdab6fd6 100755 --- a/src/Doc/Charter.DD +++ b/src/Doc/Charter.DD @@ -7,7 +7,7 @@ $FG,5$$WW,1$$TX+CX,"ZealOS Charter"$$FG$ * Low line count and low code complexity is the highest good, so it is easy to learn the whole thing. Users should see the light at the end of the tunnel. -* There is a limit of 100,000 lines of code for all time, not including applications and demos. Currently, there are $TX,"98,661",D="DD_ZEALOS_LOC"$ lines of code. $FG,4$3rd party libraries are banned from being required$FG$ because they circumvent the intent of this limit. The vision is a Commodore 64 ROM -- a fixed core API that is the only dependency of applications. Dependency on components and libraries creates a hell that is no longer blissful. +* There is a limit of 100,000 lines of code for all time, not including applications and demos. Currently, there are $TX,"98,756",D="DD_ZEALOS_LOC"$ lines of code. $FG,4$3rd party libraries are banned from being required$FG$ because they circumvent the intent of this limit. The vision is a Commodore 64 ROM -- a fixed core API that is the only dependency of applications. Dependency on components and libraries creates a hell that is no longer blissful. * The primary metric for resolving all ZealOS code governance issues is how fast the compiler compiles itself and the kernel with $LK,"BootHDIns",A="MN:BootHDIns"$(). The secondary metric is how understandable the code is. The $LK,"ZealC",A="FI:::/Doc/ZealC.DD"$ language should be changed to optimize these metrics, as Terry Davis did when he changed type casting from prefix to $LK+PU,"postfix",A="FF:::/Doc/ZealC.DD,postfix"$. @@ -23,6 +23,8 @@ $FG,5$$WW,1$$TX+CX,"ZealOS Charter"$$FG$ * $FG,4$No GPU$FG$. We want one processing platform, the CPU, for everything. +* $FG,4$No encryption$FG$, $FG,4$No compression$FG$. All formats, files, protocols, and algorithms must operate entirely in unobfuscated plain-text. Decrypting, encrypting, decompressing, and compressing creates redundant overhead that makes programs slow and complicated. Encoding/decoding of unencrypted uncompressed data in binary formats (.ZXE, .BIN, .GR, .GR32, DolDoc sprite binary data, etc.) is permitted. + * Full access to everything. All memory, I/O ports, instructions, and similar things must never be off limits. All functions, variables and class members will be accessible. There are no C++ $FG,2$public$FG$/$FG,2$private$FG$ protections and all functions, even secondary ones in the kernel, can be called. * $FG,2$Single-address-map$FG$ as though paging is not used. Long mode requires paging, however, so the nearest thing is keeping all memory $FG,2$identity-mapped$FG$. From cb0198e864448396ec9fa5fffa96dd452f2d34e7 Mon Sep 17 00:00:00 2001 From: GutPuncher Date: Sun, 26 Nov 2023 00:51:49 -0500 Subject: [PATCH 21/53] Revert "Remove redundant Ctrl-Alt-N bind" This reverts commit 1c59545866c5f0338f702bfcb05a39512ebaf349. --- src/Kernel/KeyDev.ZC | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/Kernel/KeyDev.ZC b/src/Kernel/KeyDev.ZC index e3d88382..a897da1f 100755 --- a/src/Kernel/KeyDev.ZC +++ b/src/Kernel/KeyDev.ZC @@ -177,6 +177,11 @@ U0 CtrlAltM(I64) Mute(!IsMute); } +U0 CtrlAltN(I64) +{ + LBts(sys_ctrl_alt_flags, CTRL_ALT_TAB); +} + U0 CtrlAltT(I64) { User; @@ -230,6 +235,7 @@ U0 KeyDevInit() CtrlAltCBSet('D', &CtrlAltD, "Cmd /Enter Debugger",, TRUE); CtrlAltCBSet('F', &CtrlAltF, "Cmd /Toggle Aux Font"); CtrlAltCBSet('M', &CtrlAltM, "Cmd /Toggle Mute"); + CtrlAltCBSet('N', &CtrlAltN, "Cmd /Next Focus Task",, TRUE); CtrlAltCBSet('T', &CtrlAltT, "Cmd /Terminal Window"); CtrlAltCBSet('V', &CtrlAltV, "Cmd /Video Framebuffer Flush",, TRUE); CtrlAltCBSet('X', &CtrlAltX, "Cmd /Kill Focused Task",, TRUE); From 63ff53a16e55be8d8b70835327f109b6396fd0fc Mon Sep 17 00:00:00 2001 From: GutPuncher Date: Sun, 26 Nov 2023 04:22:29 -0500 Subject: [PATCH 22/53] Remove CtrlAltTab code, replace w/ CtrlAltN, remove CtrlAltESC --- src/Kernel/KernelA.HH | 2 +- src/Kernel/KeyDev.ZC | 2 +- src/Kernel/Sched.ZC | 4 ++-- src/Kernel/SerialDev/Keyboard.ZC | 7 +------ src/System/Training.ZC | 4 ---- 5 files changed, 5 insertions(+), 14 deletions(-) diff --git a/src/Kernel/KernelA.HH b/src/Kernel/KernelA.HH index 73d5de3d..c29354a6 100755 --- a/src/Kernel/KernelA.HH +++ b/src/Kernel/KernelA.HH @@ -780,7 +780,7 @@ class CSema #define CTRL_ALT_DEL 0 #define CTRL_ALT_C 1 #define CTRL_ALT_X 2 -#define CTRL_ALT_TAB 3 +#define CTRL_ALT_N 3 #help_index "Hash" public class CHash diff --git a/src/Kernel/KeyDev.ZC b/src/Kernel/KeyDev.ZC index a897da1f..8006c3e7 100755 --- a/src/Kernel/KeyDev.ZC +++ b/src/Kernel/KeyDev.ZC @@ -179,7 +179,7 @@ U0 CtrlAltM(I64) U0 CtrlAltN(I64) { - LBts(sys_ctrl_alt_flags, CTRL_ALT_TAB); + LBts(sys_ctrl_alt_flags, CTRL_ALT_N); } U0 CtrlAltT(I64) diff --git a/src/Kernel/Sched.ZC b/src/Kernel/Sched.ZC index 9d472dc3..dfd60f29 100755 --- a/src/Kernel/Sched.ZC +++ b/src/Kernel/Sched.ZC @@ -176,7 +176,7 @@ _YIELD:: MOV RSI, U64 CTask.next_task[RSI] RESTORE_RSI_TASK: - TEST U64 [SYS_CTRL_ALT_FLAGS], 1 << CTRL_ALT_DEL|1 << CTRL_ALT_TAB|1 << CTRL_ALT_X|1 << CTRL_ALT_C + TEST U64 [SYS_CTRL_ALT_FLAGS], 1 << CTRL_ALT_DEL | 1 << CTRL_ALT_N | 1 << CTRL_ALT_X | 1 << CTRL_ALT_C JNZ HANDLE_SYSF_KEY_EVENT RESTORE_RSI_TASK2: @@ -230,7 +230,7 @@ HANDLE_SYSF_KEY_EVENT: JE RESTORE_EXECUTIVE_TASK_IF_READY LOCK - BTR U32 [RAX], CTRL_ALT_TAB + BTR U32 [RAX], CTRL_ALT_N JNC @@05 CALL &TaskFocusNext JMP I32 RESTORE_FS_TASK diff --git a/src/Kernel/SerialDev/Keyboard.ZC b/src/Kernel/SerialDev/Keyboard.ZC index d5169719..023e0316 100755 --- a/src/Kernel/SerialDev/Keyboard.ZC +++ b/src/Kernel/SerialDev/Keyboard.ZC @@ -421,12 +421,7 @@ U0 KbdBuildSC(U8 raw_byte, Bool in_irq, U8 *_last_raw_byte, I64 *_last_sc) CtrlAltDel(sc); else { - if (sc & 255 == SC_ESC) - ch = 't'; - else if (sc & 255 == SC_TAB) - ch = 'n'; - else - ch = ScanCode2Char(sc & 255); + ch = ScanCode2Char(sc & 255); if ('a' <= ch <= 'z') { sc &= ~(SCF_NEW_KEY | SCF_NEW_KEY << 32); diff --git a/src/System/Training.ZC b/src/System/Training.ZC index bb58647b..f0f16b6e 100755 --- a/src/System/Training.ZC +++ b/src/System/Training.ZC @@ -51,10 +51,6 @@ U0 KeyMapCtrlAltFamily(Bool no_shift, Bool shift) no_shift_f = 0; if (no_shift) KeyMapKeyPrint(SC_DELETE + SCF_CTRL + SCF_ALT + no_shift_f, &Reboot, "Cmd /Reboot"); - if (no_shift) - KeyMapKeyPrint(SC_ESC + SCF_CTRL + SCF_ALT + no_shift_f, &User, "Cmd /Terminal Window"); - if (no_shift) - KeyMapKeyPrint(SC_TAB + SCF_CTRL + SCF_ALT + no_shift_f, &WinToTop, "Cmd /Next Focus Task"); for (i = 0; i < 26; i++) if (keydev.fp_ctrl_alt_cbs[i]) From 623fe0ea9b49e8b6b6bd011767f2713ff5bb4a04 Mon Sep 17 00:00:00 2001 From: GutPuncher Date: Sun, 26 Nov 2023 04:24:21 -0500 Subject: [PATCH 23/53] Implement Semantic Versioning. --- src/HomeSys.ZC | 2 +- src/Kernel/KGlobals.ZC | 4 ++++ src/Kernel/KMain.ZC | 5 ++++- src/Kernel/KernelC.HH | 4 ++++ src/System/Boot/DiskISORedSea.ZC | 2 +- src/System/Define.ZC | 2 +- src/System/WallPaper.ZC | Bin 7566 -> 7589 bytes 7 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/HomeSys.ZC b/src/HomeSys.ZC index 2820b304..fdeedfc8 100755 --- a/src/HomeSys.ZC +++ b/src/HomeSys.ZC @@ -40,4 +40,4 @@ U0 StartUpTasks() StartUpTasks; -"\nZealOS V%0.2f\t%D %T\n\n", sys_os_version, sys_compile_time, sys_compile_time; +"\n%s\n\n", sys_os_version_nice; \ No newline at end of file diff --git a/src/Kernel/KGlobals.ZC b/src/Kernel/KGlobals.ZC index 34cacbe8..c372e793 100755 --- a/src/Kernel/KGlobals.ZC +++ b/src/Kernel/KGlobals.ZC @@ -14,6 +14,10 @@ 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 = 107; +U8 *sys_os_version_str; +U8 *sys_os_version_full; +U8 *sys_os_version_nice; CAutoCompleteDictGlobals acd; CAutoCompleteGlobals ac; diff --git a/src/Kernel/KMain.ZC b/src/Kernel/KMain.ZC index 31c938c7..069734b7 100755 --- a/src/Kernel/KMain.ZC +++ b/src/Kernel/KMain.ZC @@ -152,7 +152,10 @@ U0 KMain() //Before this point use $LK,"Sound",A="MN:Sound"$() and $LK,"Busy",A="MN:Busy"$() //to debug. After this point, use $LK,"RawPrint",A="MN:RawPrint"$() LBts(&sys_run_level, RLf_RAW); - "\nZealOS V%0.2f\t%D %T\n", sys_os_version, sys_compile_time, sys_compile_time; + sys_os_version_str = MStrPrint("ZealOS V%0.2f.%d", sys_os_version, sys_os_version_sub); + sys_os_version_nice = MStrPrint("%s\t%D %T\n", sys_os_version_str, sys_compile_time, sys_compile_time); + sys_os_version_full = MStrPrint("%s-%d.%d\n", sys_os_version_str, sys_compile_time.date, sys_compile_time.time); + "\n%s\n", sys_os_version_full; "_________________________________\n\n"; "TimerInit;\n"; diff --git a/src/Kernel/KernelC.HH b/src/Kernel/KernelC.HH index 7e7901e3..3c984c9a 100755 --- a/src/Kernel/KernelC.HH +++ b/src/Kernel/KernelC.HH @@ -581,6 +581,10 @@ public extern I64 MessageScan(I64 *_arg1=NULL, I64 *_arg2=NULL, I64 mask=~1, CTa public extern U0 QuickSort( U8 *base, I64 num, I64 width, I64 (*fp_compare)(U8 *e1, U8 *e2)); public extern U0 QuickSortI64(I64 *base, I64 num, I64 (*fp_compare)(I64 e1, I64 e2)); public extern F64 sys_os_version; +public extern U64 sys_os_version_sub; +public extern U8 *sys_os_version_str; +public extern U8 *sys_os_version_full; +public extern U8 *sys_os_version_nice; #help_index "Misc/Progress Bars" public extern U0 ProgressBarsReset(U8 *path=NULL); diff --git a/src/System/Boot/DiskISORedSea.ZC b/src/System/Boot/DiskISORedSea.ZC index cc3a247e..6c6d500a 100755 --- a/src/System/Boot/DiskISORedSea.ZC +++ b/src/System/Boot/DiskISORedSea.ZC @@ -78,7 +78,7 @@ U0 RedSeaISO9660(U8 *iso_filename, U8 drv_let) iso_pri->file_structure_version = 1; StrCopy(iso_pri->publisher_id, "ZealOS RedSea"); - st = MStrPrint("ZealOS V%0.2f %D %T", sys_os_version, Now, Now); + st = MStrPrint("%s %D %T", sys_os_version_str, Now, Now); StrCopy(iso_pri->preparer_id, st); Free(st); diff --git a/src/System/Define.ZC b/src/System/Define.ZC index 707e21d0..901ce1bc 100755 --- a/src/System/Define.ZC +++ b/src/System/Define.ZC @@ -4,7 +4,7 @@ U0 LoadDocDefines() { CZXE *zxe = mem_boot_base - sizeof(CZXE); - DefinePrint("DD_OS_NAME_VERSION", "ZealOS V%0.2f", sys_os_version); + DefinePrint("DD_OS_NAME_VERSION", sys_os_version_str); DefinePrint("DD_ZEALOS_AGE", "%0.1f", (Now - Str2Date("9/1/2019")) / ToF64(1 << 32) / CDATE_YEAR_DAYS); DefinePrint("DD_TEMPLEOS_AGE", "%0.1f", (Str2Date("8/11/2018") - Str2Date("8/1/2003")) / ToF64(1 << 32) / CDATE_YEAR_DAYS); diff --git a/src/System/WallPaper.ZC b/src/System/WallPaper.ZC index 063af42652fa49764520e574179f1cb6f9a26625..b273714eee6bb95392a704dd4fa31e83433c783a 100755 GIT binary patch delta 53 ucmeCPUTVETO;|%uHAP8Bp}4X*KEF7=EVZaOGd~ZVA75OWwAoxZoC^T@;uAdp delta 30 lcmZ2#-DkZ)O;}J#N1?c~I6l8PzAUw Date: Fri, 8 Dec 2023 00:12:15 -0500 Subject: [PATCH 24/53] Fix loopback crashes. --- src/Home/Net/Programs/TCPChatClient.ZC | 4 ++-- src/Home/Net/Programs/TCPChatServer.ZC | 7 +++++-- src/Home/Net/Protocols/Ethernet.ZC | 13 ++++++++---- src/Home/Net/Utilities/NetQueue.ZC | 29 +++++++++++++++++++++++++- src/Kernel/KGlobals.ZC | 2 +- src/System/Define.ZC | 2 +- 6 files changed, 46 insertions(+), 11 deletions(-) diff --git a/src/Home/Net/Programs/TCPChatClient.ZC b/src/Home/Net/Programs/TCPChatClient.ZC index 2d8d6a68..4ae33e9f 100755 --- a/src/Home/Net/Programs/TCPChatClient.ZC +++ b/src/Home/Net/Programs/TCPChatClient.ZC @@ -24,8 +24,8 @@ U0 ChatMessageTask(I64) while (message = StrGet("> ",, SGF_SHIFT_ESC_EXIT)) { DocBottom(chat_display_task->put_doc); - DocPrint(chat_display_task->put_doc, - "$$BG,BLUE$$$$BLACK$$$$FG$$$$BG$$ %s\n", message); +// DocPrint(chat_display_task->put_doc, +// "$$BG,BLUE$$$$BLACK$$$$FG$$$$BG$$ %s\n", message); TCPSocketSendString(tcp, message); diff --git a/src/Home/Net/Programs/TCPChatServer.ZC b/src/Home/Net/Programs/TCPChatServer.ZC index db21e363..f7c2935c 100755 --- a/src/Home/Net/Programs/TCPChatServer.ZC +++ b/src/Home/Net/Programs/TCPChatServer.ZC @@ -37,7 +37,7 @@ U0 ChatServerBroadcast(CTCPSocket *tcp_socket, I64 length) { dest_socket = conn->socket; - if (dest_socket != tcp_socket) +// if (dest_socket != tcp_socket) { addr.address = EndianU32(dest_socket->destination_address(CSocketAddressIPV4).address.address); @@ -51,7 +51,10 @@ U0 ChatServerBroadcast(CTCPSocket *tcp_socket, I64 length) ip_string = NetworkToPresentation(AF_INET, &addr); // TODO: is NetworkToPresentation backwards? or, do socket addrs store BE or LE ? - message_prefix = MStrPrint("$$BG,PURPLE$$$$BLACK$$<%s>$$FG$$$$BG$$ %%0%dts", ip_string, length); + if (dest_socket == tcp_socket) + message_prefix = MStrPrint("$$BG,PURPLE$$$$BLACK$$<%s (you)>$$FG$$$$BG$$ %%0%dts", ip_string, length); + else + message_prefix = MStrPrint("$$BG,PURPLE$$$$BLACK$$<%s>$$FG$$$$BG$$ %%0%dts", ip_string, length); message = MStrPrint(message_prefix, buffer); diff --git a/src/Home/Net/Protocols/Ethernet.ZC b/src/Home/Net/Protocols/Ethernet.ZC index f2f75652..3a4de9f0 100755 --- a/src/Home/Net/Protocols/Ethernet.ZC +++ b/src/Home/Net/Protocols/Ethernet.ZC @@ -54,12 +54,17 @@ U0 EthernetFrameParse(CEthernetFrame *frame_out, U8 *frame, U16 length) U0 EthernetFrameFinish(I64 de_index) {//Alias for generic driver Finish TX function. + U8 *data = NetDriverPacketBufferGet(de_index); + I64 length = NetDriverPacketLengthGet(de_index); + U8 *mac = EthernetMACGet(); + Bool is_loopback = !MemCompare(mac, data, MAC_ADDRESS_LENGTH); // check the TX packet MAC against local MAC - // check the TX packet MAC against local MAC, if they match: software loopback the TX packet to RX NetQueue - if (!MemCompare(EthernetMACGet(), NetDriverPacketBufferGet(de_index), MAC_ADDRESS_LENGTH)) - NetQueuePush(NetDriverPacketBufferGet(de_index), NetDriverPacketLengthGet(de_index)); + // software loopback the TX packet to RX NetQueue if it's loopback + if (is_loopback) + NetQueueLazyPush(data, length); NetDriverTransmitPacketFinish(de_index); + } -EthernetGlobalsInit; \ No newline at end of file +EthernetGlobalsInit; diff --git a/src/Home/Net/Utilities/NetQueue.ZC b/src/Home/Net/Utilities/NetQueue.ZC index 1e709dda..c6eddb41 100755 --- a/src/Home/Net/Utilities/NetQueue.ZC +++ b/src/Home/Net/Utilities/NetQueue.ZC @@ -68,5 +68,32 @@ U0 NetQueuePush(U8 *data, I64 length) MPInt(I_NETHANDLER, INT_DEST_CPU); } +U0 NetQueueLazyPull() +{ + PUSHFD + CLI + + if (net_queue->next != net_queue) + { + NetLog("NETQUEUE LAZY PULL: Generating NetHandler interrupt."); + MPInt(I_NETHANDLER, INT_DEST_CPU); + } + + POPFD +} + +U0 NetQueueLazyPush(U8 *data, I64 length) +{ // Push into NetQueue, don't trigger interrupt in this func. + // Trigger interrupt by Spawn-ing another Task to check queue. + + CNetQueueEntry *entry = CAlloc(sizeof(CNetQueueEntry)); + + entry->packet_length = length; + MemCopy(entry->frame, data, length); + QueueInsert(entry, net_queue->last); + + Spawn(&NetQueueLazyPull,, "NetQueueLazyPull"); +} + +NetQueueInit; -NetQueueInit; \ No newline at end of file diff --git a/src/Kernel/KGlobals.ZC b/src/Kernel/KGlobals.ZC index c372e793..bc646ec1 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 = 107; +U64 sys_os_version_sub = 108; U8 *sys_os_version_str; U8 *sys_os_version_full; U8 *sys_os_version_nice; diff --git a/src/System/Define.ZC b/src/System/Define.ZC index 901ce1bc..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","98,756"); +$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 0cc6d4c112a269c69ece8b7da08dc632ffcc43f1 Mon Sep 17 00:00:00 2001 From: GutPuncher Date: Fri, 8 Dec 2023 00:22:59 -0500 Subject: [PATCH 25/53] Kludge VirtIONet driver loopback packet size. --- src/Home/Net/Drivers/VirtIONet.ZC | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Home/Net/Drivers/VirtIONet.ZC b/src/Home/Net/Drivers/VirtIONet.ZC index a2010aa1..c858eaf9 100755 --- a/src/Home/Net/Drivers/VirtIONet.ZC +++ b/src/Home/Net/Drivers/VirtIONet.ZC @@ -203,7 +203,7 @@ I64 NetDriverPacketBufferGet(I64 de_index) I64 NetDriverPacketLengthGet(I64 de_index) { // TODO: ... de_index in Alec's VirtIO-Net driver don't match up to any way to get packet length... - return 0; + return ETHERNET_FRAME_SIZE; } U8 *EthernetMACGet() { return &VirtioNet.mac; } From 1f4aaa23f990942c7c151c6d37f1dd0dde5cbe01 Mon Sep 17 00:00:00 2001 From: mintsuki Date: Sun, 10 Dec 2023 10:30:30 +0100 Subject: [PATCH 26/53] UEFI-ISO: Use Limine 6.x branch --- build/build-iso.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/build-iso.sh b/build/build-iso.sh index 2868c9db..3535c830 100755 --- a/build/build-iso.sh +++ b/build/build-iso.sh @@ -64,7 +64,7 @@ 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 -LIMINE_BINARY_BRANCH="v5.x-branch-binary" +LIMINE_BINARY_BRANCH="v6.x-branch-binary" if [ -d "limine" ] then From 524bddec6cd554d703e56d27470ffa867bd5d0f4 Mon Sep 17 00:00:00 2001 From: GutPuncher Date: Mon, 8 Jan 2024 23:40:39 -0500 Subject: [PATCH 27/53] 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 28/53] 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 29/53] 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 30/53] 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 31/53] 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 32/53] 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 33/53] 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 34/53] 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 35/53] 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 36/53] 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 37/53] 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 38/53] 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 39/53] 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 40/53] 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 41/53] 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 42/53] 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 43/53] 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 44/53] 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 45/53] 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 46/53] 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 47/53] 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 48/53] 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 49/53] 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 50/53] 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 51/53] 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 52/53] 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 53/53] 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;