Compare commits

..
Author SHA1 Message Date
Burer bfb69dd67a system/setup: grid layout, fix mouse and font height handling
Test PR / Build (en_US) (pull_request) Successful in 1m54s
Test PR / Build (es_ES) (pull_request) Successful in 1m59s
Test PR / Build (ru_RU) (pull_request) Successful in 2m6s
Layout:
- controls 24 px high and 12 px apart, 8 px to the window border
  (12 at the top); text centred on the capitals of the 8x16 font
- value boxes sunken, the -/+ buttons share one frame with them
- checkboxes: box before the label, spread without per-item widths
- group title drawn over the frame with a filled background
- bevel and checkbox colours derived from the skin, no hardcoded white

Fixes:
- the window re-applied the mouse settings read at start, reverting
  changes made meanwhile; mouse is now read and applied by BOOT only
- font height is clamped to 9..99, a larger ini value showed garbage
  and could fault on div
- a GetButton result of 1 (no button) indexed rows out of bounds
- hidden checkbox buttons flashed an XOR frame when pressed
- skip bg_program when it is empty; drop duplicate LBA/PCI strings

Assisted-by: Claude:claude-opus-5-5
2026-09-29 19:42:20 +03:00
Leency d6010bc759 system/setup: all eight kernel languages again
Test PR / Build (ru_RU) (pull_request) Successful in 1m54s
Test PR / Build (es_ES) (pull_request) Successful in 1m57s
Test PR / Build (en_US) (pull_request) Successful in 2m3s
The language list is the kernel one again: en fi de ru fr et es it.
Russian and Spanish have their texts, the others use English.

Assisted-by: Claude Opus 5 <noreply@anthropic.com>
2026-09-27 19:33:15 +03:00
Leency f022313a49 system/eskin: bring back, outdated
Test PR / Build (en_US) (pull_request) Successful in 1m53s
Test PR / Build (es_ES) (pull_request) Successful in 2m2s
Test PR / Build (ru_RU) (pull_request) Successful in 2m5s
SETUP BOOT applies the style now; eskin stays in the tree unused.

Assisted-by: Claude Opus 5 <noreply@anthropic.com>
2026-09-27 18:37:38 +03:00
Leency e87eaace4c system/setup: keep the speaker setting in [low-level]
Test PR / Build (es_ES) (pull_request) Successful in 1m49s
Test PR / Build (en_US) (pull_request) Successful in 1m54s
Test PR / Build (ru_RU) (pull_request) Successful in 2m1s
Assisted-by: Claude Opus 5 <noreply@anthropic.com>
2026-09-27 18:07:25 +03:00
Leency bcd09d2952 system/setup: keep "speaker" instead of "speaker mute" in system.ini
Test PR / Build (es_ES) (pull_request) Successful in 1m50s
Test PR / Build (ru_RU) (pull_request) Successful in 1m58s
Test PR / Build (en_US) (pull_request) Successful in 2m0s
The checkbox means "speaker on", so system.ini now keeps the same:
speaker=on / speaker=off. The default system.ini is updated.

Assisted-by: Claude Opus 5 <noreply@anthropic.com>
2026-09-27 18:01:41 +03:00
Leency fc9a2a0fc7 system/setup: rework the window, merge eskin into setup
Test PR / Build (en_US) (pull_request) Successful in 2m8s
Test PR / Build (es_ES) (pull_request) Successful in 2m11s
Test PR / Build (ru_RU) (pull_request) Successful in 2m13s
The window:
- 8x16 UTF-8 system font and system colours, values on light boxes
- English, Spanish and Russian texts; the language list is those three
- LBA, PCI and the speaker as @RESHARE checkboxes in an "Access
  settings" group; the speaker box means "speaker on"
- no Apply button: every change is applied and saved to system.ini
  at once; changing the language or the font smoothing repaints

The code:
- settings.inc reads the settings from the kernel and from system.ini,
  applies them and saves them; one table drives system.ini
- SETUP BOOT also applies the [style] section (button style, desktop
  background, skin), which is what eskin did; eskin is removed from
  the tree, AUTORUN.DAT and data/Tupfile.lua
- format meos 01 header, packed size under 2 KB

Assisted-by: Claude Opus 5 <noreply@anthropic.com>
2026-09-27 17:51:46 +03:00
24 changed files with 738 additions and 1871 deletions

No files matched your search

-24
View File
@@ -54,27 +54,3 @@
src: "{{ stable_artifact_path }}/"
dest: "{{ storage_path }}/../"
mode: preserve
# older builds shrink to compressed images and lose their unpacked tree; the newest few keep both
- name: Looking for zstd on the storage server
ansible.builtin.shell: command -v zstd
register: zstd_present
changed_when: false
failed_when: false
- name: Requiring zstd for compaction
ansible.builtin.assert:
that: zstd_present.rc == 0
fail_msg: >-
zstd is not installed on the storage server, so older builds cannot
be compacted. Install it and re-run this build.
- name: Compacting older builds
ansible.builtin.script:
cmd: >-
../../utils/compact-builds.sh
{{ storage_path | quote }}
{{ compact_keep | default(5) | int }}
{{ compact_max | default(10) | int }}
register: compaction
changed_when: "'compacted 0 of' not in compaction.stdout"
-74
View File
@@ -1,74 +0,0 @@
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0-only
# SPDX-FileCopyrightText: 2026 KolibriOS team
# Shrink older builds on the storage server: compress their images and drop
# their unpacked tree, which is rebuildable from the commit. sha256sums.txt
# keeps naming the bare images, so a compacted build has to be decompressed
# before it can be verified.
#
# Layout: <root>/<version>/<lang>/kolibrios-<descr>-<lang>.{img,iso,raw} -> .zst
# <root>/<version>/<lang>/data/ -> removed
#
# Usage: compact-builds.sh <storage-root> [keep] [max-per-run]
# DRY_RUN=1 walks the same selection and changes nothing
set -euo pipefail
root=${1:?storage root required}
# the build just published is always among these, so an upload in flight is safe
keep=${2:-5}
# a build is hundreds of MiB to re-compress: cap the first pass over the backlog
max=${3:-10}
dry=${DRY_RUN:-0}
verb=compacted
[ "$dry" = 1 ] && verb="would compact"
# --rm drops the source only once the archive is written; the box serves the
# site over NFS, so compaction yields to it
compress_image() {
nice -n 10 ionice -c3 zstd -12 -T1 -q --rm "$1"
}
export -f compress_image
leftovers() {
local build=$1
find "$build" -mindepth 2 -maxdepth 2 \
\( -type d -name data \
-o -type f \( -name '*.img' -o -name '*.iso' -o -name '*.raw' \) \) \
-print -quit
}
compacted=0
pending=0
while IFS= read -r version; do
dir="$root/$version"
[ -n "$(leftovers "$dir")" ] || continue
pending=$((pending + 1))
[ "$compacted" -lt "$max" ] || continue
if [ "$dry" = 1 ]; then
compacted=$((compacted + 1))
echo "$verb $version"
continue
fi
# a build holds nine images: one per core, each zstd kept to one thread so
# the two levels of parallelism do not fight. Archive before dropping the
# tree, so a failure here leaves the build merely uncompacted and the next
# run picks it up again
find "$dir" -mindepth 2 -maxdepth 2 -type f \
\( -name '*.img' -o -name '*.iso' -o -name '*.raw' \) -print0 \
| xargs -0 -r -P "$(nproc)" -I{} bash -c 'compress_image "$@"' _ {}
find "$dir" -mindepth 2 -maxdepth 2 -type d -name data -exec rm -rf {} +
compacted=$((compacted + 1))
echo "$verb $version"
# <tag>-<commit count>-g<sha>: order by the count, never by mtime
done < <(find "$root" -mindepth 1 -maxdepth 1 -type d -name '*-*-g*' -printf '%f\n' \
| sort -t- -k2,2n | head -n "-$keep")
echo "$verb $compacted of $pending older build(s), $((pending - compacted)) left for the next run"
+1 -2
View File
@@ -34,11 +34,10 @@ jobs:
uses: actions/checkout@v4
with:
submodules: true
token: ${{ secrets.BOT_TOKEN }}
- name: Bump ${{ matrix.name }} and open PR
env:
TOKEN: ${{ secrets.BOT_TOKEN }}
TOKEN: ${{ secrets.GITEA_TOKEN }}
API: ${{ github.api_url }}
REPO: ${{ github.repository }}
NAME: ${{ matrix.name }}
-1
View File
@@ -427,7 +427,6 @@ tup.append_table(img_files, {
{"DEFAULT.SKN", VAR_SKINS .. "/../skins/Leency/Shkvorka/Shkvorka.skn"},
{"DISPTEST", VAR_PROGS .. "/testing/disptest/disptest"},
{"END", VAR_PROGS .. "/system/end/light/end"},
{"ESKIN", VAR_PROGS .. "/system/eskin/eskin"},
{"GMON", VAR_PROGS .. "/system/gmon/gmon"},
{"HDD_INFO", VAR_PROGS .. "/system/hdd_info/hdd_info"},
{"KBD", VAR_PROGS .. "/testing/kbd/kbd"},
-1
View File
@@ -10,7 +10,6 @@
/SYS/SETUP BOOT 0 # Load device settings
/SYS/LOADDRV I2CHID 0 # Start I2C touchpad driver
/SYS/@TASKBAR "" 0 # Start taskbar
/SYS/ESKIN "" 0 # Set style
/SYS/@ICON "" 0 # Multithread desktop icons
/SYS/TMPDISK A0 0 # Add virtual RAM disk /tmp0/1
/SYS/@RESHARE "" 0 # Shared resources
+1 -1
View File
@@ -3,7 +3,6 @@ language=en
font file=/sys/Fonts/Tahoma.kf
font smoothing=sbp
font height=9
speaker mute=off
[touchpad]
speed=100
@@ -29,6 +28,7 @@ double_click_delay=64
[low-level]
LBA=off
PCI=on
speaker=on
;timeout in minutes
;program needs a full path
@@ -20,7 +20,6 @@ disptest;
docpack;Документация / Блок документов;asm;http://git.kolibrios.org/KolibriOS/kolibrios/src/branch/main/programs/system/docpack;;http://wiki.kolibrios.org/wiki/Docpack/ru
easyshot;Простой скриншотер;c--;http://git.kolibrios.org/KolibriOS/kolibrios/src/branch/main/programs/cmm/misc/easyshot.c;http://board.kolibrios.org/viewtopic.php?t=3695;
end;Программа завершения работы;asm;http://git.kolibrios.org/KolibriOS/kolibrios/src/branch/main/programs/system/end;http://board.kolibrios.org/viewtopic.php?t=2442;http://wiki.kolibrios.org/wiki/End/ru
eskin;Установщик фона и скина при старте системы;asm;http://git.kolibrios.org/KolibriOS/kolibrios/src/branch/main/programs/system/eskin;http://board.kolibrios.org/viewtopic.php?t=2424;
fb2read;Читалка FB2;oberon07;http://git.kolibrios.org/KolibriOS/kolibrios/src/branch/main/programs/other/fb2reader;http://board.kolibrios.org/viewtopic.php?t=3128;
fspeed;Тестирование скорости диска;asm;http://git.kolibrios.org/KolibriOS/kolibrios/src/branch/main/programs/testing/fspeed;http://board.kolibrios.org/viewtopic.php?t=2660;
gmon;Информация о загрузке системы;asm;http://git.kolibrios.org/KolibriOS/kolibrios/src/branch/main/programs/system/gmon;http://board.kolibrios.org/viewtopic.php?t=470;http://wiki.kolibrios.org/wiki/Gmon/ru
1 Имя программы Описание Lang Gitea Forum Wiki
20 docpack Документация / Блок документов asm http://git.kolibrios.org/KolibriOS/kolibrios/src/branch/main/programs/system/docpack http://wiki.kolibrios.org/wiki/Docpack/ru
21 easyshot Простой скриншотер c-- http://git.kolibrios.org/KolibriOS/kolibrios/src/branch/main/programs/cmm/misc/easyshot.c http://board.kolibrios.org/viewtopic.php?t=3695
22 end Программа завершения работы asm http://git.kolibrios.org/KolibriOS/kolibrios/src/branch/main/programs/system/end http://board.kolibrios.org/viewtopic.php?t=2442 http://wiki.kolibrios.org/wiki/End/ru
eskin Установщик фона и скина при старте системы asm http://git.kolibrios.org/KolibriOS/kolibrios/src/branch/main/programs/system/eskin http://board.kolibrios.org/viewtopic.php?t=2424
23 fb2read Читалка FB2 oberon07 http://git.kolibrios.org/KolibriOS/kolibrios/src/branch/main/programs/other/fb2reader http://board.kolibrios.org/viewtopic.php?t=3128
24 fspeed Тестирование скорости диска asm http://git.kolibrios.org/KolibriOS/kolibrios/src/branch/main/programs/testing/fspeed http://board.kolibrios.org/viewtopic.php?t=2660
25 gmon Информация о загрузке системы asm http://git.kolibrios.org/KolibriOS/kolibrios/src/branch/main/programs/system/gmon http://board.kolibrios.org/viewtopic.php?t=470 http://wiki.kolibrios.org/wiki/Gmon/ru
+14 -100
View File
@@ -130,8 +130,6 @@ RU_STATUS_IDLE = 0000b shl 2
RU_STATUS_SUSPENDED = 0001b shl 2
RU_STATUS_NO_RESOURCES = 0010b shl 2
RU_STATUS_READY = 0100b shl 2
SCB_STATUS_CUS = 11000000b ; CU Status
CU_STATUS_ACTIVE = 10b shl 6
SCB_STATUS_FCP = 1 shl 8 ; Flow Control Pause
SCB_STATUS_SWI = 1 shl 10 ; Software Interrupt
SCB_STATUS_MDI = 1 shl 11 ; MDI read/write complete
@@ -185,8 +183,6 @@ struct txfd
ends
TXFD_STATUS_C = 1 shl 15
TXFD_CMD_IA = 1 shl 0
TXFD_CMD_CFG = 1 shl 1
TXFD_CMD_TX = 1 shl 2
@@ -632,9 +628,6 @@ reset:
mov ax, CU_START or INT_MASK
out dx, ax
call cmd_wait
; cmd_wait only means the SCB accepted the command. The Configure below
; reuses confcmd, so a slow chip would read it instead of our MAC.
call confcmd_wait
;-------------
; Configure CU
@@ -659,7 +652,6 @@ reset:
mov ax, CU_START ; expect Interrupts from now on
out dx, ax
call cmd_wait
call confcmd_wait
; Start media check timer
mov [ebx + device.state], ETH_LINK_DOWN
@@ -686,11 +678,6 @@ init_rx_ring:
;---------------------
; build rxfd structure
cmp [ebx + device.rx_desc], 0 ; the RFD of an earlier reset
je @f
invoke NetFree, [ebx + device.rx_desc]
mov [ebx + device.rx_desc], 0
@@:
invoke NetAlloc, 2000
test eax, eax
jz .out_of_mem
@@ -702,7 +689,6 @@ init_rx_ring:
mov [esi + sizeof.NET_BUFF + rxfd.command], RXFD_CMD_EL or RXFD_CMD_SUSPEND
mov [esi + sizeof.NET_BUFF + rxfd.link], eax
mov [esi + sizeof.NET_BUFF + rxfd.count], 0
mov [esi + sizeof.NET_BUFF + rxfd.rx_buf_addr], 0xffffffff ; simplified mode, no RBD
mov [esi + sizeof.NET_BUFF + rxfd.size], 1528
ret
@@ -723,15 +709,6 @@ init_tx_ring:
invoke GetPhysAddr
mov ecx, TX_RING_SIZE
.next_desc:
; after a reset with frames still unreclaimed: free them, or transmit sees the
; descriptor busy (virt_addr) and reports TX overrun forever
cmp [esi + txfd.virt_addr], 0
je @f
push eax ecx
invoke NetFree, [esi + txfd.virt_addr]
pop ecx eax
mov [esi + txfd.virt_addr], 0
@@:
mov [esi + txfd.status], 0
mov [esi + txfd.command], 0
lea edx, [eax + txfd.buf_addr]
@@ -786,7 +763,7 @@ proc transmit stdcall bufferptr
lea edi, [ebx + device.tx_ring + eax]
; Check if current descriptor is free or still in use
cmp [edi + txfd.virt_addr], 0 ; buffer not reclaimed yet
cmp [edi + txfd.status], 0
jne .overrun
; Fill in status and command values
@@ -809,22 +786,6 @@ proc transmit stdcall bufferptr
mov eax, edi
invoke GetPhysAddr
set_io [ebx + device.io_addr], 0
; CU_START is only valid while the CU is idle or suspended:
; wait for the previous frame to leave (1.2 ms at 10 Mbit)
push eax ecx
set_io [ebx + device.io_addr], REG_SCB_STATUS
mov ecx, 100000
.cu_busy:
in al, dx
and al, SCB_STATUS_CUS
cmp al, CU_STATUS_ACTIVE
jne .cu_free
dec ecx
jnz .cu_busy
DEBUGF 2, "CU still active, starting anyway\n"
.cu_free:
pop ecx eax
set_io [ebx + device.io_addr], REG_SCB_PTR
out dx, eax
@@ -893,7 +854,7 @@ int_handler:
DEBUGF 1,"Status: %x\n", ax
test ax, SCB_STATUS_FR or SCB_STATUS_RNR ; frame received or receiver stopped?
test ax, SCB_STATUS_FR ; did we receive a frame?
jz .no_rx
push ax
@@ -940,7 +901,6 @@ int_handler:
mov [esi + sizeof.NET_BUFF + rxfd.command], RXFD_CMD_EL or RXFD_CMD_SUSPEND
mov [esi + sizeof.NET_BUFF + rxfd.link], eax
mov [esi + sizeof.NET_BUFF + rxfd.count], 0
mov [esi + sizeof.NET_BUFF + rxfd.rx_buf_addr], 0xffffffff ; simplified mode, no RBD
mov [esi + sizeof.NET_BUFF + rxfd.size], 1528
; restart RX
@@ -956,22 +916,11 @@ int_handler:
mov ax, RX_START
out dx, ax
call cmd_wait
.out_of_mem:
; Hand the frame over to the kernel
jmp [EthInput]
.out_of_mem:
; The buffer is still our only RFD: drop the frame and reuse it
mov esi, [esp] ; the buffer
mov ecx, [esi + NET_BUFF.length]
dec [ebx + device.packets_rx] ; counted above, before the allocation
sub dword [ebx + device.bytes_rx], ecx
sbb dword [ebx + device.bytes_rx + 4], 0
inc [ebx + device.packets_rx_drop]
add esp, 12 ; buffer, .rx_loop, ebx
mov esi, [ebx + device.rx_desc]
jmp .not_ok
.not_ok:
; Reset the FD
mov [esi + sizeof.NET_BUFF + rxfd.status], 0
@@ -996,27 +945,6 @@ int_handler:
.no_rx_:
DEBUGF 1, "no more data\n"
; With a single RFD the receiver sits in No Resources/Suspended whenever a
; frame arrived before we re-armed it. Nothing restarts it but us.
set_io [ebx + device.io_addr], 0
set_io [ebx + device.io_addr], REG_SCB_STATUS
in al, dx
and al, SCB_STATUS_RUS
cmp al, RU_STATUS_READY
je .ru_ready
test byte[esp], 1 ; bit 0 of the saved status is reserved,
jnz .ru_ready ; we mark it: one restart per IRQ
or byte[esp], 1
movzx eax, al
DEBUGF 1, "Restarting receiver, RU status %x\n", eax:2
mov esi, [ebx + device.rx_desc]
push ebx
test [esi + sizeof.NET_BUFF + rxfd.status], RXFD_STATUS_C
jnz .rx_loop ; a frame completed meanwhile
add esp, 4
jmp .not_ok ; re-arm the empty RFD
.ru_ready:
pop ax
.no_rx:
@@ -1027,13 +955,13 @@ int_handler:
push eax
.loop_tx:
mov eax, [ebx + device.last_tx]
mov edx, sizeof.txfd
mul edx
mov edi, [ebx + device.last_tx]
mov eax, sizeof.txfd
mul eax
lea edi, [ebx + device.tx_ring + eax]
test [edi + txfd.status], TXFD_STATUS_C ; sent by the device?
jz .tx_done
cmp [edi + txfd.status], 0
je .tx_done
cmp [edi + txfd.virt_addr], 0
je .tx_done
@@ -1042,7 +970,6 @@ int_handler:
push [edi + txfd.virt_addr]
mov [edi + txfd.virt_addr], 0
mov [edi + txfd.status], 0 ; free for transmit again
invoke NetFree
inc [ebx + device.last_tx]
@@ -1053,6 +980,12 @@ int_handler:
pop eax
.no_tx:
test ax, RU_STATUS_NO_RESOURCES
jz .not_out_of_resources
DEBUGF 2, "Out of resources!\n"
.not_out_of_resources:
pop edi esi ebx
xor eax, eax
inc eax
@@ -1146,25 +1079,6 @@ proc check_media_mii stdcall dev:dword
endp
; Wait (up to 1 s) until the device has executed the command in confcmd.
align 4
confcmd_wait:
mov ecx, 1000 ; udelay = Sleep(1), 1 ms
.loop:
test [ebx + device.confcmd.status], TXFD_STATUS_C
jnz .done
call udelay
dec ecx
jnz .loop
movzx eax, [ebx + device.confcmd.command]
DEBUGF 2, "Command 0x%x not completed\n", eax:4
ret
.done:
movzx eax, [ebx + device.confcmd.command]
movzx ecx, [ebx + device.confcmd.status]
DEBUGF 1, "Command 0x%x done, status 0x%x\n", eax:4, ecx:4
ret
align 4
cmd_wait:
File diff suppressed because it is too large. Load diff
+1 -8
View File
@@ -463,7 +463,7 @@ proc kernel_alloc stdcall, size:dword
and eax, -PAGE_SIZE;
mov [size], eax
and eax, eax
jz .err0
jz .err
mov ebx, eax
shr ebx, 12
mov [pages_count], ebx
@@ -509,13 +509,6 @@ proc kernel_alloc stdcall, size:dword
pop ebx
ret
.err:
mov eax, [lin_addr]
test eax, eax
jz .err0
mov ecx, [pages_count]
call release_pages
stdcall free_kernel_space, [lin_addr]
.err0:
xor eax, eax
pop edi
pop ebx
+1 -59
View File
@@ -1397,9 +1397,7 @@ proc create_ring_buffer stdcall, size:dword, flags:dword
mov [page_tabs + edi], eax
mov [page_tabs + edi + edx], eax
invlpg [ebx]
add ebx, [size]
invlpg [ebx] ; the mirror half
sub ebx, [size]
invlpg [ebx+0x10000]
add eax, 0x1000
add ebx, 0x1000
add edi, 4
@@ -1418,62 +1416,6 @@ proc create_ring_buffer stdcall, size:dword, flags:dword
ret
endp
; Same as create_ring_buffer, but from non-contiguous pages.
; Not for DMA. Free with kernel_free.
align 4
proc create_ring_buffer_sparse stdcall, size:dword, flags:dword
locals
buf_ptr dd ?
endl
mov eax, [size]
test eax, eax
jz .fail
add eax, eax
stdcall alloc_kernel_space, eax
test eax, eax
jz .fail
mov [buf_ptr], eax
push ebx esi edi
mov ebx, eax ; page being mapped
mov esi, [size] ; distance to its mirror
mov edi, esi
shr edi, 12 ; pages left
.page:
call alloc_page
test eax, eax
jz .mm_fail
or eax, [flags]
mov edx, ebx
shr edx, 12
mov [page_tabs + edx*4], eax
invlpg [ebx]
lea edx, [ebx + esi]
shr edx, 12
mov [page_tabs + edx*4], eax
invlpg [ebx + esi]
add ebx, PAGE_SIZE
dec edi
jnz .page
mov eax, [buf_ptr]
pop edi esi ebx
ret
.mm_fail:
mov eax, [buf_ptr]
mov ecx, [size]
shr ecx, 11 ; both halves, in pages
call release_pages
stdcall free_kernel_space, [buf_ptr]
pop edi esi ebx
xor eax, eax
.fail:
ret
endp
align 4
proc print_mem
-28
View File
@@ -83,31 +83,6 @@ macro arp_init {
}
;-----------------------------------------------------------------;
; ;
; arp_clear_device: Empty the ARP table and counters of a removed ;
; device. ;
; ;
; IN: edi = device number * 4 ;
; ;
;-----------------------------------------------------------------;
macro arp_clear_device {
xor eax, eax
mov [ARP_entries + edi], eax
mov [ARP_packets_tx + edi], eax
mov [ARP_packets_rx + edi], eax
mov [ARP_conflicts + edi], eax
push edi
imul edi, (ARP_TABLE_SIZE * sizeof.ARP_entry)/4
add edi, ARP_table
mov ecx, (ARP_TABLE_SIZE * sizeof.ARP_entry)/2
rep stosw
pop edi
}
;-----------------------------------------------------------------;
; ;
; arp_decrease_entry_ttls ;
@@ -338,9 +313,6 @@ arp_output_request:
DEBUGF DEBUG_NETWORK_VERBOSE, "ARP_output_request: ip=%u.%u.%u.%u device=0x%x\n",\
[esp]:1, [esp + 1]:1, [esp + 2]:1, [esp + 3]:1, ebx
test ebx, ebx ; device is gone
jz .exit
mov ax, ETHER_PROTO_ARP
mov ecx, sizeof.ARP_header
mov edx, ETH_BROADCAST ; broadcast mac
+1 -40
View File
@@ -105,29 +105,6 @@ macro ipv4_init {
}
;-----------------------------------------------------------------;
; ;
; ipv4_clear_device: Reset the IPv4 settings of a removed device, ;
; so no route points to it anymore. ;
; ;
; IN: edi = device number * 4 ;
; ;
;-----------------------------------------------------------------;
macro ipv4_clear_device {
xor eax, eax
mov [IPv4_address + edi], eax
mov [IPv4_subnet + edi], eax
mov [IPv4_nameserver + edi], eax
mov [IPv4_gateway + edi], eax
mov [IPv4_broadcast + edi], eax
mov [IPv4_packets_tx + edi], eax
mov [IPv4_packets_rx + edi], eax
mov [IPv4_packets_dumped + edi], eax
}
;-----------------------------------------------------------------;
; ;
; Decrease TimeToLive of all fragment slots ;
@@ -780,8 +757,6 @@ ipv4_output_raw:
push esi eax
call ipv4_route
test eax, eax
jz .arp_error
call arp_ip_to_mac
test eax, 0xffff0000 ; error bits
@@ -992,8 +967,6 @@ ipv4_route:
; Check for on-link
xor edi, edi
.loop:
cmp [net_device_list + edi], 0 ; skip slots without a device
je .next
mov ebx, [IPv4_address + edi]
and ebx, [IPv4_subnet + edi]
jz .next
@@ -1010,10 +983,7 @@ ipv4_route:
mov edi, 4 ; skip loopback device
.loop_gw:
cmp [IPv4_gateway + edi], 0
je .next_gw
cmp [net_device_list + edi], 0
jne .found_gw
.next_gw:
add edi, 4
cmp edi, 4*NET_DEVICES_MAX
jb .loop_gw
@@ -1079,23 +1049,14 @@ ipv4_route:
cmp eax, 0xffffffff
je @f
; An interface without an address (DHCP not done yet, or the lease
; dropped when the link went down) can send nothing but broadcasts: with
; address and mask both zero every destination compared as on-link, and
; the stack went asking ARP for internet addresses on behalf of 0.0.0.0.
test edx, edx
jz .fail
; Check if we should route to gateway or not
mov ebx, edx
mov ebx, [IPv4_address + edi]
and ebx, [IPv4_subnet + edi]
mov ecx, eax
and ecx, [IPv4_subnet + edi]
cmp ecx, ebx
je @f
mov eax, [IPv4_gateway + edi]
test eax, eax
jz .fail ; off-link and no gateway
@@:
DEBUGF DEBUG_NETWORK_VERBOSE, "IPv4_route: %u\n", edi
ret
+1 -44
View File
@@ -61,41 +61,6 @@ macro eth_init {
}
;-----------------------------------------------------------------;
; ;
; eth_clear_device: Drop the frames of a removed device that are ;
; still waiting in the input queue, their ;
; NET_BUFF.device will not be valid anymore. ;
; ;
; IN: ebx = device ptr ;
; ;
;-----------------------------------------------------------------;
macro eth_clear_device {
local .loop, .done
spin_lock_irqsave
mov esi, [ETH_frame_head]
.loop:
cmp esi, ETH_frame_head
je .done
mov eax, esi
mov esi, [esi + NET_BUFF.NextPtr]
cmp [eax + NET_BUFF.device], ebx
jne .loop
; unlink it, ETH_frame_head/tail double as the NextPtr/PrevPtr of the list head
mov ecx, [eax + NET_BUFF.PrevPtr]
mov [ecx + NET_BUFF.NextPtr], esi
mov [esi + NET_BUFF.PrevPtr], ecx
dec [ETH_frame_queued]
stdcall net_buff_free, eax
jmp .loop
.done:
spin_unlock_irqrestore
}
align 4
; This function is called by ethernet drivers.
; Push the received ethernet packet onto the ethernet input queue.
@@ -280,9 +245,6 @@ eth_output:
DEBUGF DEBUG_NETWORK_VERBOSE, "ETH_output: size=%u device=%x\n", ecx, ebx
test ebx, ebx
jz .no_device
cmp ecx, [ebx + ETH_DEVICE.mtu]
ja .too_large
@@ -333,16 +295,11 @@ eth_output:
ret
.too_large:
inc [ebx + NET_DEVICE.packets_tx_err]
inc [eax + NET_DEVICE.packets_tx_err]
DEBUGF DEBUG_NETWORK_VERBOSE, "ETH_output: Packet too large!\n"
xor eax, eax
ret
.no_device:
DEBUGF DEBUG_NETWORK_ERROR, "ETH_output: no device!\n"
xor eax, eax
ret
;-----------------------------------------------------------------;
+1 -5
View File
@@ -198,10 +198,6 @@ ends
SOCKET_STRUCT_SIZE = 4096 ; in bytes
if sizeof.STREAM_SOCKET > SOCKET_STRUCT_SIZE
err "STREAM_SOCKET does not fit in SOCKET_STRUCT_SIZE"
end if
SOCKET_QUEUE_SIZE = 10 ; maximum number of incoming packets queued for 1 socket
; the incoming packet queue for sockets is placed in the socket struct itself, at this location from start
SOCKET_QUEUE_LOCATION = (SOCKET_STRUCT_SIZE - SOCKET_QUEUE_SIZE*sizeof.socket_queue_entry - sizeof.queue)
@@ -1651,7 +1647,7 @@ socket_ring_create:
mov esi, eax
push edx
stdcall create_ring_buffer_sparse, SOCKET_BUFFER_SIZE, PG_SWR
stdcall create_ring_buffer, SOCKET_BUFFER_SIZE, PG_SWR
pop edx
test eax, eax
jz .fail
-10
View File
@@ -597,16 +597,6 @@ net_remove_device:
mov dword [edi-4], eax
dec [net_device_count]
;-----------------------------------------------------------------
; Forget everything the protocols still know about this interface.
; Otherwise its IP address keeps matching in ipv4_route, and output
; ends up calling through the now empty net_device_list slot.
sub edi, net_device_list + 4 ; device number * 4
ipv4_clear_device
arp_clear_device
eth_clear_device
call net_send_event
xor eax, eax
+2 -6
View File
@@ -1422,14 +1422,10 @@ endl
test [edx + TCP_header.Flags], TH_ACK
jz .drop
push ebx
lea ecx, [ebx + SOCKET.mutex]
call mutex_unlock
pop eax
mov eax, ebx
mov ebx, ECONNREFUSED
call tcp_drop
jmp .drop_no_socket
jmp .drop
@@:
;-----------------------------------------------------------------------------------
+8 -10
View File
@@ -234,25 +234,23 @@ endl
mov ebx, TCP_max_win
shl ebx, cl
pop ecx
; Clamp to available window first, then subtract what the peer already knows (as in BSD)
cmp ebx, ecx
jbe @f
mov ebx, ecx
@@:
sub ebx, [eax + TCP_SOCKET.RCV_ADV]
add ebx, [eax + TCP_SOCKET.RCV_NXT]
cmp ebx, ecx
jl @f
mov ebx, ecx
@@:
DEBUGF DEBUG_NETWORK_VERBOSE, "TCP_output: we can increase window by %d bytes\n", ebx
mov edi, [eax + TCP_SOCKET.t_maxseg]
shl edi, 1
cmp ebx, edi ; signed: may be negative if window shrank
jge .send
cmp ebx, edi
jae .send
cmp ebx, SOCKET_BUFFER_SIZE/2
jge .send
jae .send
.no_window:
-4
View File
@@ -180,8 +180,6 @@ tcp_connect:
.nomem:
pop edx eax
lea ecx, [eax + SOCKET.mutex]
call mutex_unlock
xor eax, eax
dec eax
mov ebx, ENOMEM
@@ -196,8 +194,6 @@ tcp_connect:
.enoroute:
pop eax
popa
lea ecx, [eax + SOCKET.mutex]
call mutex_unlock
xor eax, eax
dec eax
mov ebx, EADDRNOTAVAIL
+3 -5
View File
@@ -1618,23 +1618,21 @@ endl
; Open a new TCP socket
mcall socket, AF_INET4, SOCK_STREAM, 0
cmp eax, -1
je .error3
test eax, eax
jz .error3
mov [socketnum], eax
DEBUGF 1, "Socket: 0x%x\n", eax
; Connect to the server
mcall connect, [socketnum], [sockaddr], 18
test eax, eax
jnz .error4
jnz .error3
DEBUGF 1, "Socket is now connected.\n"
invoke freeaddrinfo ; Free allocated memory
mov eax, [socketnum]
ret
.error4:
mcall close, [socketnum]
.error3:
DEBUGF 2, "Could not connect to the remote server\n"
invoke freeaddrinfo ; Free allocated memory
@@ -501,8 +501,7 @@ img.decode.jpg:
jnz .no_create_palette
push ecx edi
mov edi, [eax + Image.Palette]
mov eax, 0xFF000000 ; opaque, like the palettes of the other decoders:
; converted to 32 bpp, alpha 0 made the picture invisible
xor eax, eax
mov ecx, 256
@@:
stosd
+256
View File
@@ -0,0 +1,256 @@
; SPDX-License-Identifier: NOASSERTION
;
; System settings: read them from the kernel or from system.ini,
; apply them to the kernel and save them to system.ini.
;---------------------------------------------------------------
; Take the current values from the kernel, the mouse ones at system start only
settings_read_boot:
mcall 18,19,0
mov [mouseSpeed],eax
mcall 18,,2
mov [mouseAccel],eax
mcall 18,,6
mov [mouseDelay],eax
settings_read_system:
mcall 26,5
dec eax ; the kernel counts languages from 1
cmp eax,LANGUAGES
jb @f
xor eax,eax
@@:
mov [language],eax
mcall 26,11
mov [lba],eax
mcall 26,12
mov [pci],eax
mcall 18,8,1
mov [speakerMute],eax
mcall 48,9
mov [fontSmoothing],eax
mcall 48,11
mov [fontHeight],eax
; keep the font height within what the window shows and steps through
font_height_limits:
mov eax,[fontHeight]
cmp eax,FONT_H_MIN
jge @f
mov eax,FONT_H_MIN
@@:
cmp eax,FONT_H_MAX
jle @f
mov eax,FONT_H_MAX
@@:
mov [fontHeight],eax
ret
;---------------------------------------------------------------
; Override the values with the ones stored in system.ini.
; A missing or unknown value keeps the current one.
settings_read_ini:
mov esi,iniSettings
.next:
mov edi,[esi+12]
test edi,edi
jnz .word
mov eax,[esi+8]
invoke ini.get_int, sz_ini, [esi], [esi+4], [eax]
jmp .store
.word:
and [iniWord],0
invoke ini.get_str, sz_ini, [esi], [esi+4], iniWord, 4, 0
mov eax,[iniWord]
or eax,0x20202020 ; lowercase, zeroes become spaces
xor edx,edx
@@:
cmp eax,[edi+4+edx*4]
jz .found
inc edx
cmp edx,[edi]
jb @b
jmp .skip
.found:
mov eax,edx
.store:
mov edx,[esi+8]
mov [edx],eax
.skip:
add esi,16
cmp esi,iniSettings.end
jb .next
jmp font_height_limits
;---------------------------------------------------------------
; Store the values to system.ini (all but the mouse ones).
; Not ebx for the loop: ini_set_str returns with ebx = 13.
settings_save_ini:
mov esi,iniSettings
.next:
mov eax,[esi+8]
mov eax,[eax]
mov edi,[esi+12]
test edi,edi
jnz .word
invoke ini.set_int, sz_ini, [esi], [esi+4], eax
jmp .done
.word:
mov eax,[edi+4+eax*4]
mov [iniWord],eax
xor ecx,ecx ; length of the word
@@:
cmp byte[iniWord+ecx],' '
jz @f
inc ecx
cmp ecx,4
jb @b
@@:
invoke ini.set_str, sz_ini, [esi], [esi+4], iniWord, ecx
.done:
add esi,16
cmp esi,iniSettings.saved
jb .next
ret
;---------------------------------------------------------------
; Pass the values to the kernel, the mouse ones at system start only
settings_apply_boot:
mcall 18,19,1,[mouseSpeed]
mcall 18,,3,[mouseAccel]
mcall 18,,7,[mouseDelay]
settings_apply:
mov ecx,[language]
inc ecx
mcall 21,5
mcall 21,11,[lba]
mcall 21,12,[pci]
mcall 48,10,[fontSmoothing]
mcall 48,12,[fontHeight]
; the speaker can only be toggled
mcall 18,8,1
cmp eax,[speakerMute]
jz @f
mcall 18,,2
@@:
ret
;---------------------------------------------------------------
; Button style, desktop background and skin from the [style] section.
; Used at system start only.
style_apply:
invoke ini.get_int, sz_ini, sz_style, sz_buttonStyle, 0
mcall 48,1,eax
; the background is set by a program: bg_program with bg_param
invoke ini.get_str, sz_ini, sz_style, sz_bgProgram, bgProgram, PATH_MAX, 0
cmp byte[bgProgram],0
jz .skin
invoke ini.get_str, sz_ini, sz_style, sz_bgParam, bgParam, PATH_MAX, 0
cmp byte[bgParam],'\' ; KIV param like '\S__/path/to/img'
jnz @f
mov [fileInfo.path],bgParam+4
call wait_for_file
@@:
mcall 70,runBgProgram
.skin:
invoke ini.get_str, sz_ini, sz_style, sz_skin, skinPath, PATH_MAX, 0
cmp byte[skinPath],0
jz @f
mov [fileInfo.path],skinPath
call wait_for_file
mcall 48,8,skinPath
@@:
ret
; Files on /kolibrios and /usbhd may appear a few seconds after boot:
; try to read the file for up to 5 seconds
wait_for_file:
mov edi,5
@@:
mcall 70,fileInfo
test eax,eax
jz @f
mcall 5,100
dec edi
jnz @b
@@:
ret
;---------------------------------------------------------------
; DATA
; The languages of the kernel
LANGUAGES = 8
FONT_H_MIN = 9
FONT_H_MAX = 99 ; two digits in the window
PATH_MAX = 256
; Every value stored in system.ini: section, key, variable, words.
; Words = 0 for a number, otherwise the list of words for 0, 1, 2...
align 4
iniSettings:
dd sz_system, sz_language, language, wordsLanguage
dd sz_system, sz_fontHeight, fontHeight, 0
dd sz_system, sz_fontSmooth, fontSmoothing, wordsSmoothing
dd sz_lowLevel, sz_lba, lba, wordsOnOff
dd sz_lowLevel, sz_pci, pci, wordsOnOff
dd sz_lowLevel, sz_speaker, speakerMute, wordsSpeaker
.saved: ; the mouse is configured by its own application
dd sz_mouse, sz_speed, mouseSpeed, 0
dd sz_mouse, sz_accel, mouseAccel, 0
dd sz_mouse, sz_dblClick, mouseDelay, 0
.end:
wordsOnOff dd 2, 'off ','on '
wordsSpeaker dd 2, 'on ','off ' ; the ini keeps 'speaker on', not 'mute'
wordsSmoothing dd 3, 'off ','on ','sbp '
wordsLanguage dd LANGUAGES, 'en ','fi ','de ','ru ','fr ','et ','es ','it '
runBgProgram:
dd 7, 0, bgParam, 0, 0
db 0
dd bgProgram
fileInfo:
dd 0, 0, 0, 4, fileBuf
db 0
.path dd ?
sz_ini db "/sys/settings/system.ini",0
sz_system db "system",0
sz_language db "language",0
sz_fontHeight db "font height",0
sz_fontSmooth db "font smoothing",0
sz_speaker db "speaker",0
sz_lowLevel db "low-level",0
sz_lba db "LBA",0
sz_pci db "PCI",0
sz_mouse db "mouse",0
sz_speed db "speed",0
sz_accel db "acceleration",0
sz_dblClick db "double_click_delay",0
sz_style db "style",0
sz_buttonStyle db "buttons_gradient",0
sz_bgProgram db "bg_program",0
sz_bgParam db "bg_param",0
sz_skin db "skin",0
; not stored in the program file
language dd ?
lba dd ?
pci dd ?
speakerMute dd ?
fontSmoothing dd ?
fontHeight dd ?
mouseSpeed dd ?
mouseAccel dd ?
mouseDelay dd ?
iniWord dd ? ; a word of system.ini
fileBuf dd ?
bgProgram rb PATH_MAX
bgParam rb PATH_MAX
skinPath rb PATH_MAX
+342 -476
View File
@@ -1,462 +1,316 @@
; SPDX-License-Identifier: NOASSERTION
;
; System settings.
; SETUP BOOT - apply the settings from system.ini (run from AUTORUN.DAT)
; SETUP - window to change and save them
;
; Texts are UTF-8
; Text encoded with Code Page 866 - Cyrillic
;;;;;;;;;;;;;;;;;;;;;;;
;; SYSTEM SETTINGS ;;
;;;;;;;;;;;;;;;;;;;;;;;
format binary as ""
use32
org 0
db 'MENUET01'
dd 1
dd START
dd IM_END
dd I_END
dd I_END
dd param
dd 0
include '../../macros.inc'
format meos 01
entry START
stack 4096
include '../../proc32.inc'
include '../../macros.inc'
include '../../dll.inc'
;---------------------------------------------------------------
BootSettings:
; Set system language
mov word[param],0
invoke ini.get_str, sz_ini, sz_system, sz_language, param, 2, 0
mov ax, [param]
or ax, 0x2020 ; convert to lowercase
mov ecx,langMarks.size/2
mov edi,langMarks
repnz scasw
jnz @f
neg ecx
add ecx,langMarks.size/2
mcall 21,5
@@:
; Set font smoothing
mov dword[param],0
invoke ini.get_str, sz_ini, sz_system, sz_fontSmooth, param, 4, 0
xor ecx,ecx
mov eax,[param]
or eax,0x20202020
cmp eax,'off '
jz @f
inc ecx
cmp eax,'on '
jz @f
cmp eax,'sbp '
jnz .skipFont
inc ecx
@@:
mcall 48,10
.skipFont:
; Enable/disable system speaker
mov dword[param],0
invoke ini.get_str, sz_ini, sz_system, sz_speaker, param, 4, 0
mov eax,[param]
or eax,0x20202020
cmp eax,'off '
jz @f
cmp eax,'on '
jnz .skipSpeaker
inc [speaker_mute]
@@:
call _speaker_mute
.skipSpeaker:
; Set font size
invoke ini.get_int, sz_ini, sz_system, sz_fontSize, 9
mov ecx,eax
mcall 48,12
; Set mouse speed
invoke ini.get_int, sz_ini, sz_mouse, sz_speed, 1
mov edx,eax
mcall 18,19,1
; Set mouse acceleration
invoke ini.get_int, sz_ini, sz_mouse, sz_acceleration, 1
mov edx,eax
mcall 18,19,3
; Set mouse double click delay
invoke ini.get_int, sz_ini, sz_mouse, sz_double_click_delay, 1
mov edx,eax
mcall 18,19,7
; Enable/disable LBA access for applications
mov dword[param],0
invoke ini.get_str, sz_ini, sz_low_level, sz_lba, param, 4, 0
xor ecx,ecx
mov eax,[param]
or eax,0x20202020
cmp eax,'off '
jz @f
cmp eax,'on '
jnz .skipLBA
inc ecx
@@:
mcall 21,11
.skipLBA:
; Enable/disable PCI access for applications
mov dword[param],0
invoke ini.get_str, sz_ini, sz_low_level, sz_pci, param, 4, 0
xor ecx,ecx
mov eax,[param]
or eax,0x20202020
cmp eax,'off '
jz @f
cmp eax,'on '
jnz close
inc ecx
@@:
mcall 21,12
jmp close
;---------------------------------------------------------------
START:
mcall 68,11
stdcall dll.Load, @IMPORT
push eax
test eax,eax
jnz close
jnz quit
cmp [param],dword 'BOOT'
jz BootSettings
pop eax
GetCommandLine eax
cmp dword[eax],'BOOT'
jnz @f
; get current settings
mcall 26,5
dec eax
mov [syslang],eax
call settings_read_boot
call settings_read_ini
call settings_apply_boot
call style_apply
quit:
mcall -1
mcall 26,11
mov [lba_read],eax
mcall 26,12
mov [pci_acc],eax
mcall 18,8,1
mov [speaker_mute],eax
mcall 48,9
mov [fontSmoothing],eax
mcall 48,11
mov [fontSize],eax
loadtxt:
cmp [syslang],3
jz .ru
cmp [syslang],5
jz .et
mov [text],texteng
jmp draw_window
.et:
mov [text],textet
jmp draw_window
.ru:
mov [text],textrus
draw_window:
mcall 12,1
mov ecx,50*65536+32*(4+stringsAmount)
mcall 0,<50,700>,,0xB4111199,0,title
; Main buttons
mov eax,8
mov ecx,6*65536+26
mov edx,4
mov esi,0x5580c0
mov ebp,stringsAmount
@@:
mcall ,<490,24>
call settings_read_system
; the checkbox image is shared by @RESHARE, 0 if it is not running
mcall 68,22,sz_checkbox,0,0
mov [checkboxImage],eax
;---------------------------------------------------------------
draw_window:
mov eax,[language]
mov eax,[texts+eax*4]
mov [text],eax
mcall 12,1
mcall 48,3,sc,sizeof.system_colors
mov byte[sc.work_text+3],FONT
mov byte[sc.work_button_text+3],FONT
mcall 48,4
lea ecx,[eax+(50 shl 16)+CLIENT_H+4]
mov edx,[sc.work]
or edx,0x34000000
mcall 0,<50,CLIENT_W+9>,,,0,title
; a row: label, value (drawn by draw_values), '-' and '+' buttons
xor ebp,ebp
.row:
imul edi,ebp,ROW_STEP
add edi,TOP ; y of the row
mov ecx,edi
shl ecx,16
add ecx,ROW_H-1 ; the button is 1 pixel bigger than given
lea edx,[FIRST_ROW_BUTTON+ebp*2]
mcall 8,<BUTTON1_X,ROW_H-1>,,,[sc.work_button]
lea edx,[FIRST_ROW_BUTTON+1+ebp*2]
mcall 8,<BUTTON2_X,ROW_H-1>
; the kernel leaves the corners of a button out: one frame for both,
; its right corners stay out
mov edx,[sc.work_button]
shr edx,1
and edx,0x7F7F7F ; the border colour of a button
mov cx,1
mcall 13,<BUTTON1_X,BUTTON2_X+ROW_H-1-BUTTON1_X>
add ecx,(ROW_H-1) shl 16
mcall 13
lea ebx,[edi+TEXT_DY+(LABEL_X shl 16)]
mov ecx,ebp
call get_text
mcall 4,,[sc.work_text]
lea ebx,[edi+TEXT_DY+((BUTTON1_X+8) shl 16)]
lea edx,[glyphs+ebp*4]
mcall 4,,[sc.work_button_text]
lea ebx,[edi+TEXT_DY+((BUTTON2_X+8) shl 16)]
lea edx,[glyphs+2+ebp*4]
mcall 4
inc ebp
cmp ebp,ROWS
jb .row
; group box of the checkboxes: a frame, its title over it on the work colour
mcall 13,<GROUP_X,GROUP_W>,<GROUP_Y,GROUP_H>,[sc.work_graph]
mcall 13,<GROUP_X+1,GROUP_W-2>,<GROUP_Y+1,GROUP_H-2>,[sc.work]
mov ecx,T_GROUP
call get_text
mov ecx,[sc.work_text]
or ecx,0x40000000
mcall 4,<GROUP_TITLE_X,GROUP_TITLE_Y>,,,,[sc.work]
; The checkboxes are spread over the group, the last one ends at its end.
; LBA and PCI are fixed, so the step only depends on the speaker label.
mov ecx,T_SPEAKER
call get_text
mov eax,ITEM_END-ITEM_X-CHECK_SIZE-8
.length:
mov cl,[edx]
inc edx
mcall ,<526,24>
inc edx
mcall ,<562,120>
inc edx
add ecx,32*65536
dec ebp
jnz @b
; APPLY ALL
add ecx,32*65536
mcall ,<514,168>,,3,0x005588dd
; SAVE ALL
add ecx,32*65536
dec edx
mcall
test cl,cl
jz .step
and cl,0xC0
cmp cl,0x80 ; UTF-8 continuation byte
jz .length
sub eax,8
jmp .length
.step:
shr eax,1
mov [checkStep],eax
; a checkbox: the box (drawn by draw_values), then the label, both under
; one button up to the end of the group. The next button covers the rest.
xor ebp,ebp
.check:
mov edi,[checkStep]
imul edi,ebp
add edi,ITEM_X ; x of the box
lea ebx,[edi+CHECK_SIZE+8]
shl ebx,16
add ebx,CHECK_Y+TEXT_DY
call check_label
mcall 4,,[sc.work_text]
mov ebx,edi
shl ebx,16
add ebx,ITEM_END
sub ebx,edi
lea edx,[FIRST_CHECK_BUTTON+BT_HIDE+BT_NOFRAME+ebp]
mcall 8,,<CHECK_Y,ROW_H-1>
inc ebp
cmp ebp,CHECKS
jb .check
mcall 12,2
draw_infotext:
mov eax,[syslang]
mov edi,[text]
lea esi,[eax*8+langs]
add edi,28
movsd
movsd
add edi,LLL-8
;---------------------------------------------------------------
draw_values:
mov edx,languageNames
mov ecx,[language]
call nth_string
mov [valueText],edx
mov eax,[lba_read]
call onoff
mov [edi],ebx
mov eax,[pci_acc]
call onoff
mov [edi+LLL],ebx
mov eax,[speaker_mute]
call onoff
mov [edi+LLL*2],ebx
mov ebx,'SUBP'
mov ecx,'IXEL'
cmp [fontSmoothing],2
jz @f
mov eax,[fontSmoothing]
call onoff
mov ecx,' '
mov edx,sz_subpixel
mov ecx,[fontSmoothing]
cmp ecx,2
jae @f
add ecx,T_OFF
call get_text
@@:
mov [edi+LLL*3],ebx
mov [edi+LLL*3+4],ecx
mov [valueText+4],edx
mov eax,[fontSize]
mov bl, 10
mov eax,[fontHeight]
mov bl,10
div bl
add ax, '00'
mov [edi+LLL*4],ax
; draw text
mcall 13,<342,96>,32*stringsAmount,80111199h
mov eax,4
mov ebx,6*65536+11
mov ecx,1ffffffh
mov edx,[text]
mov esi,LLL
mov ebp,stringsAmount
newline:
mcall
add ebx,32
add edx,esi
dec ebp
jnz newline
add ax,'00'
mov word[heightText],ax
mov [valueText+8],heightText
mov ebp,2
add ebx,32
@@:
mcall
add ebx,32
add edx,esi
dec ebp
jnz @b
; each value in a light box framed on three sides, the button is the fourth,
; the left corners are cut off
xor ebp,ebp
.row:
imul edi,ebp,ROW_STEP
add edi,TOP
mov ecx,edi
shl ecx,16
add ecx,ROW_H
mcall 13,<VALUE_X+1,VALUE_W-1>,,[sc.work_graph]
add ecx,(1 shl 16)-2
mcall 13,<VALUE_X,VALUE_W>
; sunken, the inner lines of a button reversed: three boxes, each 1 pixel
; smaller, leave darker lines left and top and lighter right and bottom
mov edx,[sc.work_light]
mov eax,edx
shr eax,3
and eax,0x1F1F1F
sub edx,eax ; 1/8 darker
mcall 13,<VALUE_X+1,VALUE_W-1>
mov edx,[sc.work_light]
or edx,0x1F1F1F ; lighter
add ecx,(1 shl 16)-1
mcall 13,<VALUE_X+2,VALUE_W-2>
dec ecx
mcall 13,<VALUE_X+2,VALUE_W-3>,,[sc.work_light]
lea ebx,[edi+TEXT_DY+((VALUE_X+VALUE_PAD) shl 16)]
mov edx,[valueText+ebp*4]
mcall 4,,[sc.work_text]
inc ebp
cmp ebp,ROWS
jb .row
; checkboxes: a frame, light inside, the @RESHARE image when set
xor ebp,ebp
.check:
mov ebx,[checkStep]
imul ebx,ebp
add ebx,ITEM_X
shl ebx,16
add ebx,CHECK_SIZE
mcall 13,,<CHECK_BOX_Y,CHECK_SIZE>,[sc.work_graph]
add ebx,(1 shl 16)-2
mcall 13,,<CHECK_BOX_Y+1,CHECK_SIZE-2>,[sc.work_light]
mov eax,[checks+ebp*8]
mov eax,[eax]
xor eax,[checks+ebp*8+4]
jz .next
mov edx,ebx
mov dx,CHECK_BOX_Y+1
mov ebx,[checkboxImage]
test ebx,ebx ; no @RESHARE: the box stays empty
jz .next
mcall 7,,<CHECK_SIZE-2,CHECK_SIZE-2>
.next:
inc ebp
cmp ebp,CHECKS
jb .check
;---------------------------------------------------------------
still:
mcall 10
cmp eax,1
jz draw_window
cmp eax,2
jz key
jz .key
cmp eax,3
jz button
jnz still
jmp still
;---------------------------------------------------------------
key:
mcall 2
jmp still
;---------------------------------------------------------------
button:
mcall 17
shr eax,8
call dword[eax*4+buttonTab-4]
jmp draw_infotext
close:
pop eax
mcall -1
language1:
dec [syslang]
jns @f
mov [syslang],7
jmp @f
language2:
inc [syslang]
cmp [syslang],8
jc @f
mov [syslang],0
@@:
pop eax
jmp loadtxt
LBA1:
btr [lba_read],0
ret
LBA2:
bts [lba_read],0
ret
PCI1:
btr [pci_acc],0
ret
PCI2:
bts [pci_acc],0
ret
SPEAKER1:
btr [speaker_mute],0
ret
SPEAKER2:
bts [speaker_mute],0
ret
font1:
cmp [fontSmoothing],0
jz @f
dec [fontSmoothing]
ret
font2:
cmp [fontSmoothing],2
jz @f
inc [fontSmoothing]
ret
fontSize1:
cmp [fontSize],10
jc @f
dec [fontSize]
@@:
ret
fontSize2:
inc [fontSize]
ret
apply_all:
call _lba_read
call _pci_acc
call _speaker_mute
call fontApply
call fontSizeApply
_syslang:
mov ecx,[syslang]
cmp eax,1
jz quit
sub eax,FIRST_ROW_BUTTON
jb still ; 0: no button after all
cmp eax,FIRST_CHECK_BUTTON-FIRST_ROW_BUTTON
jae .check
; '-' or '+' of a row: step the value within the limits of the row
shr eax,1 ; eax = row, CF = '+'
lea esi,[eax*3]
lea esi,[rows+esi*4]
mov edi,[esi]
mov ecx,[edi]
jc .plus
cmp ecx,[esi+4]
jbe still
dec ecx
jmp .set
.plus:
cmp ecx,[esi+8]
jae still
inc ecx
mcall 21,5
ret
_lba_read:
mcall 21,11,[lba_read]
ret
_pci_acc:
mcall 21,12,[pci_acc]
ret
fontApply:
mcall 48,10,[fontSmoothing]
ret
fontSizeApply:
mcall 48,12,[fontSize]
ret
_speaker_mute:
mcall 18,8,1
cmp [speaker_mute],eax
jz @f
inc ecx
mcall 18
@@:
ret
.set:
mov [edi],ecx
push eax
call apply_and_save
pop eax
cmp eax,1 ; the language and the font smoothing
jbe draw_window ; change all the texts: repaint the window
jmp draw_values
.check:
mov eax,[checks-(FIRST_CHECK_BUTTON-FIRST_ROW_BUTTON)*8+eax*8]
xor dword[eax],1
call apply_and_save
jmp draw_values
.key:
mcall 2
jmp still
;---------------------------------------------------------------
onoff:
cmp [syslang],3
jz .ru
cmp [syslang],5
jz .et
mov ebx,'OFF '
test eax,eax
jz @f
mov ebx,'ON '
ret
.ru:
mov ebx,'НЕТ '
test eax,eax
jz @f
mov ebx,'ДА '
ret
.et:
mov ebx,'V─L.'
test eax,eax
jz @f
mov ebx,'SEES'
; every change takes effect at once and is kept in system.ini
apply_and_save:
call settings_apply
jmp settings_save_ini
; edx = label of the checkbox ebp
check_label:
mov edx,[checkLabels+ebp*4]
test edx,edx
jnz @f
mov ecx,T_SPEAKER
call get_text
@@:
ret
;---------------------------------------------------------------
saveAll:
; system language
mov eax,[syslang]
mov ax, word[eax*2+langMarks]
mov [param],eax
invoke ini.set_str, sz_ini, sz_system, sz_language, param, 2
; font size
invoke ini.set_int, sz_ini, sz_system, sz_fontSize, [fontSize]
; font smoothing
mov dword[param],'off'
cmp [fontSmoothing],0
jz @f
mov dword[param],'on '
cmp [fontSmoothing],1
jz @f
mov dword[param],'sbp'
; edx = string number ecx of the window language
get_text:
mov edx,[text]
; edx = string number ecx of the zero separated list at edx
nth_string:
jecxz .done
@@:
invoke ini.set_str, sz_ini, sz_system, sz_fontSmooth, param, 3
; system speaker
mov dword[param],'off'
cmp [speaker_mute],0
jz @f
mov dword[param],'on '
@@:
invoke ini.set_str, sz_ini, sz_system, sz_speaker, param, 3
; LBA access for applications
mov dword[param],'off'
cmp [lba_read],0
jz @f
mov dword[param],'on '
@@:
invoke ini.set_str, sz_ini, sz_low_level, sz_lba, param, 3
; PCI access for applications
mov dword[param],'off'
cmp [pci_acc],0
jz @f
mov dword[param],'on '
@@:
invoke ini.set_str, sz_ini, sz_low_level, sz_pci, param, 3
inc edx
cmp byte[edx-1],0
jnz @b
loop @b
.done:
ret
;---------------------------------------------------------------
; DATA
align 4
buttonTab: ; button handler pointers: -,+,apply
dd close
dd saveAll
dd apply_all
dd language1
dd language2
dd _syslang
dd LBA1
dd LBA2
dd _lba_read
dd PCI1
dd PCI2
dd _pci_acc
dd SPEAKER1
dd SPEAKER2
dd _speaker_mute
dd font1
dd font2
dd fontApply
dd fontSize1
dd fontSize2
dd fontSizeApply
@IMPORT:
library libini, 'libini.obj'
import libini, \
@@ -465,76 +319,88 @@ import libini, \
ini.set_str, 'ini_set_str',\
ini.set_int, 'ini_set_int'
title db "System settings",0
sz_ini db "/sys/settings/system.ini",0
ROWS = 3
CHECKS = 3
FIRST_ROW_BUTTON = 10 ; row N has '-' = 10+N*2 and '+' = 11+N*2
FIRST_CHECK_BUTTON = 20
FONT = 0xB0 ; text flags: zero terminated, 8x16 UTF-8
sz_system db "system",0
sz_language db "language",0
sz_fontSize db "font height",0
sz_fontSmooth db "font smoothing",0
sz_speaker db "speaker mute",0
sz_mouse db "mouse",0
sz_speed db "speed",0
sz_acceleration db "acceleration",0
sz_double_click_delay db "double_click_delay",0
sz_low_level db "low-level",0
sz_lba db "LBA",0
sz_pci db "PCI",0
LLL = 56
stringsAmount = 6
; layout of the client area: controls ROW_H high, GAP empty pixels apart,
; EDGE to the window border, GAP at the top
LABEL_CHARS = 20 ; the longest label, Spanish
GAP = 12
EDGE = 8
TOP = GAP
ROW_H = 24
ROW_STEP = ROW_H + GAP
TEXT_DY = 5 ; the capitals, rows 2..11 of the font, centred in ROW_H
LABEL_X = EDGE - 1 ; column 0 of a letter is empty: aligned with the group frame
VALUE_X = LABEL_X + LABEL_CHARS*8 + GAP
VALUE_PAD = GAP
VALUE_W = 8*8 + VALUE_PAD*2
BUTTON1_X = VALUE_X + VALUE_W ; right after the value box
BUTTON2_X = BUTTON1_X + ROW_H - 1 ; the buttons share a border
CLIENT_W = BUTTON2_X + ROW_H + EDGE
GROUP_X = EDGE
GROUP_W = CLIENT_W - EDGE*2
GROUP_Y = TOP + ROWS*ROW_STEP + 5 ; GAP to the capitals of the title
GROUP_TITLE_Y = GROUP_Y - 7 ; the frame crosses the capitals
CHECK_Y = GROUP_Y + 1 + GAP ; the row of the checkboxes
GROUP_H = 1 + GAP + ROW_H + GAP + 1
CHECK_SIZE = 15
CHECK_BOX_Y = CHECK_Y + (ROW_H-CHECK_SIZE)/2
ITEM_X = GROUP_X + 1 + GAP
ITEM_END = GROUP_X + GROUP_W - GAP ; the last column of a letter is empty
GROUP_TITLE_X = ITEM_X - 8 - 1 ; a space, then a letter from its column 1
CLIENT_H = GROUP_Y + GROUP_H + EDGE
; variable, min, max of every row
align 4
langs:
db 'ENGLISH FINNISH GERMAN RUSSIAN FRENCH ESTONIANSPANISH ITALIAN '
sz langMarks, 'en','fi','de','ru','fr','et','es','it'
rows:
dd language, 0, LANGUAGES-1
dd fontSmoothing, 0, 2
dd fontHeight, FONT_H_MIN, FONT_H_MAX
textrus:
db 'Язык системы : < > Применить'
db 'Включить LBA : - + Применить'
db 'Доступ к шине PCI : - + Применить'
db 'Выключить SPEAKER : - + Применить'
db 'Сглаживание шрифтов : - + Применить'
db 'Высота шрифтов : - + Применить'
; variable and the value of it that means 'not checked'
checks dd lba,0, pci,0, speakerMute,1
checkLabels dd sz_lba, sz_pci, 0 ; 0: the speaker label of the language
db 'ВНИМАНИЕ: Применить все'
db 'НЕ ЗАБУДЬТЕ СОХРАНИТЬ НАСТРОЙКИ Сохранить все'
glyphs db '<',0,'>',0,'<',0,'>',0,'-',0,'+',0
sz_subpixel db 'Subpixel',0
languageNames db 'English',0,'Finnish',0,'German',0,'Russian',0
db 'French',0,'Estonian',0,'Spanish',0,'Italian',0
texteng:
db 'System language : < > Apply '
db 'Allow LBA access : - + Apply '
db 'Allow PCI access : - + Apply '
db 'Disable SPEAKER : - + Apply '
db 'Font smoothing : - + Apply '
db 'Font height : - + Apply '
title db "System settings",0
sz_checkbox db "CHECKBOX",0
db 'NOTE: Apply all '
db 'SAVE YOUR SETTINGS BEFORE QUITING KOLIBRI Save all '
; Texts of the window languages: zero terminated strings in this order
; (row labels, group title, speaker label, 'off', 'on')
T_GROUP = ROWS
T_SPEAKER = ROWS + 1
T_OFF = ROWS + 2
textet:
db 'S№steemi keel : < > Kinnita '
db 'LBA lugemine lubatud : - + Kinnita '
db 'PCI juurdepффs programm. : - + Kinnita '
db 'Disable SPEAKER : - + Kinnita '
db 'Font smoothing : - + Kinnita '
db 'Font height : - + Kinnita '
; the texts of every kernel language, English where there is no translation
texts dd texteng, texteng, texteng, textrus, texteng, texteng, textspa, texteng
db 'M─RKUS: Kinnita kїik '
db 'SALVESTA SEADED ENNE KOLIBRIST V─LJUMIST Salvesta kїik'
texteng db 'System language',0, 'Font smoothing',0, 'Font height',0
db ' Access settings ',0, 'Speaker',0
db 'Off',0, 'On',0
IM_END:
textspa db 'Idioma del sistema',0, 'Suavizado de fuentes',0, 'Altura de fuente',0
db ' Ajustes de acceso ',0, 'Altavoz',0
db 'No',0, 'Sí',0
text dd ?
textrus db 'Язык системы',0, 'Сглаживание шрифтов',0, 'Высота шрифтов',0
db ' Настройки доступа ',0, 'Динамик',0
db 'Нет',0, 'Да',0
syslang dd ?
lba_read dd ?
pci_acc dd ?
speaker_mute dd ?
fontSmoothing dd ?
fontSize dd ?
;---------------------------------------------------------------
include 'settings.inc'
param:
rb 1024
I_END:
text dd ? ; texts of the window language
checkboxImage dd ?
checkStep dd ? ; x distance of two checkboxes
sc system_colors
valueText rd ROWS ; the strings shown in the value boxes
heightText rb 4